@ttsc/graph 0.30.4 → 0.31.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 (292) hide show
  1. package/README.md +122 -30
  2. package/lib/CapturedProcessOutput.d.ts +47 -0
  3. package/lib/CapturedProcessOutput.js +3 -0
  4. package/lib/CapturedProcessOutput.js.map +1 -0
  5. package/lib/ILauncherOption.d.ts +22 -0
  6. package/lib/ILauncherOption.js +3 -0
  7. package/lib/ILauncherOption.js.map +1 -0
  8. package/lib/IProjectOptions.d.ts +18 -0
  9. package/lib/IProjectOptions.js +3 -0
  10. package/lib/IProjectOptions.js.map +1 -0
  11. package/lib/ParsedLauncherOptions.d.ts +13 -0
  12. package/lib/ParsedLauncherOptions.js +3 -0
  13. package/lib/ParsedLauncherOptions.js.map +1 -0
  14. package/lib/TtscGraphApplication.d.ts +38 -1
  15. package/lib/TtscGraphApplication.js +26 -1
  16. package/lib/TtscGraphApplication.js.map +1 -1
  17. package/lib/TtscGraphLauncherArguments.d.ts +115 -0
  18. package/lib/TtscGraphLauncherArguments.js +181 -0
  19. package/lib/TtscGraphLauncherArguments.js.map +1 -0
  20. package/lib/TtscGraphViewSnapshot.d.ts +35 -0
  21. package/lib/TtscGraphViewSnapshot.js +48 -0
  22. package/lib/TtscGraphViewSnapshot.js.map +1 -0
  23. package/lib/index.d.ts +9 -24
  24. package/lib/index.js +6 -128
  25. package/lib/index.js.map +1 -1
  26. package/lib/internal/GraphProcessTrace.d.ts +1 -0
  27. package/lib/internal/GraphProcessTrace.js +235 -0
  28. package/lib/internal/GraphProcessTrace.js.map +1 -0
  29. package/lib/launcherArgs.d.ts +75 -16
  30. package/lib/launcherArgs.js +77 -8
  31. package/lib/launcherArgs.js.map +1 -1
  32. package/lib/model/IArtifactDirectory.d.ts +26 -0
  33. package/lib/model/IArtifactDirectory.js +3 -0
  34. package/lib/model/IArtifactDirectory.js.map +1 -0
  35. package/lib/model/IArtifactInputs.d.ts +19 -0
  36. package/lib/model/IArtifactInputs.js +3 -0
  37. package/lib/model/IArtifactInputs.js.map +1 -0
  38. package/lib/model/IPublishedArtifacts.d.ts +76 -0
  39. package/lib/model/IPublishedArtifacts.js +3 -0
  40. package/lib/model/IPublishedArtifacts.js.map +1 -0
  41. package/lib/model/IPublishedArtifactsResident.d.ts +19 -0
  42. package/lib/model/IPublishedArtifactsResident.js +3 -0
  43. package/lib/model/IPublishedArtifactsResident.js.map +1 -0
  44. package/lib/model/ITtscLintDaemonTarget.d.ts +20 -0
  45. package/lib/model/ITtscLintDaemonTarget.js +3 -0
  46. package/lib/model/ITtscLintDaemonTarget.js.map +1 -0
  47. package/lib/model/TtscGraphLinePeer.d.ts +146 -0
  48. package/lib/model/TtscGraphLinePeer.js +213 -0
  49. package/lib/model/TtscGraphLinePeer.js.map +1 -0
  50. package/lib/model/TtscGraphMemory.d.ts +156 -16
  51. package/lib/model/TtscGraphMemory.js +228 -222
  52. package/lib/model/TtscGraphMemory.js.map +1 -1
  53. package/lib/model/TtscGraphNativeArguments.d.ts +40 -0
  54. package/lib/model/TtscGraphNativeArguments.js +64 -0
  55. package/lib/model/TtscGraphNativeArguments.js.map +1 -0
  56. package/lib/model/TtscGraphNodeId.d.ts +55 -3
  57. package/lib/model/TtscGraphNodeId.js +40 -2
  58. package/lib/model/TtscGraphNodeId.js.map +1 -1
  59. package/lib/model/TtscGraphProjection.d.ts +156 -0
  60. package/lib/model/TtscGraphProjection.js +390 -0
  61. package/lib/model/TtscGraphProjection.js.map +1 -0
  62. package/lib/model/TtscGraphProtocol.d.ts +28 -0
  63. package/lib/model/TtscGraphProtocol.js +928 -0
  64. package/lib/model/TtscGraphProtocol.js.map +1 -0
  65. package/lib/model/TtscGraphReadonly.d.ts +15 -0
  66. package/lib/model/TtscGraphReadonly.js +3 -0
  67. package/lib/model/TtscGraphReadonly.js.map +1 -0
  68. package/lib/model/TtscGraphRequestOptions.d.ts +16 -0
  69. package/lib/model/TtscGraphRequestOptions.js +3 -0
  70. package/lib/model/TtscGraphRequestOptions.js.map +1 -0
  71. package/lib/model/TtscGraphSession.d.ts +82 -36
  72. package/lib/model/TtscGraphSession.js +164 -1238
  73. package/lib/model/TtscGraphSession.js.map +1 -1
  74. package/lib/model/TtscGraphSessionOptions.d.ts +20 -0
  75. package/lib/model/TtscGraphSessionOptions.js +3 -0
  76. package/lib/model/TtscGraphSessionOptions.js.map +1 -0
  77. package/lib/model/TtscGraphSessionState.d.ts +187 -0
  78. package/lib/model/TtscGraphSessionState.js +417 -0
  79. package/lib/model/TtscGraphSessionState.js.map +1 -0
  80. package/lib/model/TtscGraphShardStore.d.ts +64 -3
  81. package/lib/model/TtscGraphShardStore.js +85 -15
  82. package/lib/model/TtscGraphShardStore.js.map +1 -1
  83. package/lib/model/TtscGraphSourceReader.d.ts +31 -8
  84. package/lib/model/TtscGraphSourceReader.js +37 -13
  85. package/lib/model/TtscGraphSourceReader.js.map +1 -1
  86. package/lib/model/TtscLintDaemon.d.ts +35 -17
  87. package/lib/model/TtscLintDaemon.js +39 -117
  88. package/lib/model/TtscLintDaemon.js.map +1 -1
  89. package/lib/model/TtscLintDaemonState.d.ts +69 -0
  90. package/lib/model/TtscLintDaemonState.js +166 -0
  91. package/lib/model/TtscLintDaemonState.js.map +1 -0
  92. package/lib/model/copyGraphRecords.d.ts +14 -0
  93. package/lib/model/copyGraphRecords.js +19 -0
  94. package/lib/model/copyGraphRecords.js.map +1 -0
  95. package/lib/model/copyGraphSnapshot.d.ts +17 -0
  96. package/lib/model/copyGraphSnapshot.js +33 -0
  97. package/lib/model/copyGraphSnapshot.js.map +1 -0
  98. package/lib/model/loadGraph.d.ts +19 -10
  99. package/lib/model/loadGraph.js +21 -12
  100. package/lib/model/loadGraph.js.map +1 -1
  101. package/lib/model/publishedArtifacts.d.ts +78 -97
  102. package/lib/model/publishedArtifacts.js +271 -85
  103. package/lib/model/publishedArtifacts.js.map +1 -1
  104. package/lib/nativeExecutable.d.ts +19 -8
  105. package/lib/nativeExecutable.js +75 -15
  106. package/lib/nativeExecutable.js.map +1 -1
  107. package/lib/reduce.d.ts +19 -45
  108. package/lib/reduce.js +19 -3
  109. package/lib/reduce.js.map +1 -1
  110. package/lib/resolveGraphBinary.d.ts +9 -0
  111. package/lib/resolveGraphBinary.js +11 -3
  112. package/lib/resolveGraphBinary.js.map +1 -1
  113. package/lib/runGraph.d.ts +21 -0
  114. package/lib/runGraph.js +83 -0
  115. package/lib/runGraph.js.map +1 -0
  116. package/lib/server/IResolvedGraphHandle.d.ts +22 -0
  117. package/lib/server/IResolvedGraphHandle.js +3 -0
  118. package/lib/server/IResolvedGraphHandle.js.map +1 -0
  119. package/lib/server/createServer.d.ts +14 -10
  120. package/lib/server/createServer.js +42 -39
  121. package/lib/server/createServer.js.map +1 -1
  122. package/lib/server/exportSurface.d.ts +23 -1
  123. package/lib/server/exportSurface.js +23 -1
  124. package/lib/server/exportSurface.js.map +1 -1
  125. package/lib/server/formatGraphFailure.d.ts +20 -0
  126. package/lib/server/formatGraphFailure.js +35 -0
  127. package/lib/server/formatGraphFailure.js.map +1 -0
  128. package/lib/server/pathPolicy.d.ts +70 -5
  129. package/lib/server/pathPolicy.js +66 -4
  130. package/lib/server/pathPolicy.js.map +1 -1
  131. package/lib/server/resolveHandle.d.ts +10 -5
  132. package/lib/server/resolveHandle.js +39 -7
  133. package/lib/server/resolveHandle.js.map +1 -1
  134. package/lib/server/resultAudit.d.ts +17 -14
  135. package/lib/server/resultAudit.js +56 -27
  136. package/lib/server/resultAudit.js.map +1 -1
  137. package/lib/server/resultNext.d.ts +26 -1
  138. package/lib/server/resultNext.js +14 -0
  139. package/lib/server/resultNext.js.map +1 -1
  140. package/lib/server/runDetails.d.ts +72 -15
  141. package/lib/server/runDetails.js +104 -69
  142. package/lib/server/runDetails.js.map +1 -1
  143. package/lib/server/runEntrypoints.d.ts +9 -0
  144. package/lib/server/runEntrypoints.js +9 -0
  145. package/lib/server/runEntrypoints.js.map +1 -1
  146. package/lib/server/runLookup.d.ts +13 -3
  147. package/lib/server/runLookup.js +19 -6
  148. package/lib/server/runLookup.js.map +1 -1
  149. package/lib/server/runOverview.d.ts +13 -4
  150. package/lib/server/runOverview.js +13 -4
  151. package/lib/server/runOverview.js.map +1 -1
  152. package/lib/server/runTour.d.ts +9 -0
  153. package/lib/server/runTour.js +33 -65
  154. package/lib/server/runTour.js.map +1 -1
  155. package/lib/server/runTrace.d.ts +25 -1
  156. package/lib/server/runTrace.js +133 -88
  157. package/lib/server/runTrace.js.map +1 -1
  158. package/lib/server/startServer.d.ts +16 -0
  159. package/lib/server/startServer.js +24 -1
  160. package/lib/server/startServer.js.map +1 -1
  161. package/lib/structures/ITtscGraphApplication.d.ts +95 -41
  162. package/lib/structures/ITtscGraphDecorator.d.ts +18 -0
  163. package/lib/structures/ITtscGraphDetails.d.ts +81 -6
  164. package/lib/structures/ITtscGraphDocTag.d.ts +17 -8
  165. package/lib/structures/ITtscGraphDump.d.ts +106 -8
  166. package/lib/structures/ITtscGraphEdge.d.ts +14 -2
  167. package/lib/structures/ITtscGraphEntrypoints.d.ts +81 -6
  168. package/lib/structures/ITtscGraphEscape.d.ts +24 -2
  169. package/lib/structures/ITtscGraphEvidence.d.ts +9 -0
  170. package/lib/structures/ITtscGraphLookup.d.ts +42 -9
  171. package/lib/structures/ITtscGraphNext.d.ts +12 -1
  172. package/lib/structures/ITtscGraphNode.d.ts +38 -11
  173. package/lib/structures/ITtscGraphOverview.d.ts +81 -6
  174. package/lib/structures/ITtscGraphSnapshot.d.ts +97 -2
  175. package/lib/structures/ITtscGraphSpan.d.ts +9 -0
  176. package/lib/structures/ITtscGraphTour.d.ts +83 -9
  177. package/lib/structures/ITtscGraphTrace.d.ts +99 -14
  178. package/lib/structures/RawDump.d.ts +22 -0
  179. package/lib/structures/RawDump.js +3 -0
  180. package/lib/structures/RawDump.js.map +1 -0
  181. package/lib/structures/RawEdge.d.ts +20 -0
  182. package/lib/structures/RawEdge.js +3 -0
  183. package/lib/structures/RawEdge.js.map +1 -0
  184. package/lib/structures/RawNode.d.ts +26 -0
  185. package/lib/structures/RawNode.js +3 -0
  186. package/lib/structures/RawNode.js.map +1 -0
  187. package/lib/structures/TtscGraphArtifactNodeKind.d.ts +9 -0
  188. package/lib/structures/TtscGraphArtifactNodeKind.js +9 -0
  189. package/lib/structures/TtscGraphArtifactNodeKind.js.map +1 -1
  190. package/lib/structures/TtscGraphDumpEdgeKind.d.ts +15 -1
  191. package/lib/structures/TtscGraphDumpNodeKind.d.ts +9 -0
  192. package/lib/structures/TtscGraphEdgeKind.d.ts +13 -4
  193. package/lib/structures/TtscGraphNodeKind.d.ts +9 -0
  194. package/lib/structures/TtscGraphNodeModifier.d.ts +9 -0
  195. package/lib/structures/ViewerLink.d.ts +20 -0
  196. package/lib/structures/ViewerLink.js +3 -0
  197. package/lib/structures/ViewerLink.js.map +1 -0
  198. package/lib/structures/ViewerNode.d.ts +24 -0
  199. package/lib/structures/ViewerNode.js +3 -0
  200. package/lib/structures/ViewerNode.js.map +1 -0
  201. package/lib/structures/ViewerPayload.d.ts +42 -0
  202. package/lib/structures/ViewerPayload.js +3 -0
  203. package/lib/structures/ViewerPayload.js.map +1 -0
  204. package/lib/view.d.ts +9 -0
  205. package/lib/view.js +203 -91
  206. package/lib/view.js.map +1 -1
  207. package/lib/viewer/viewer.js +1 -1
  208. package/package.json +8 -6
  209. package/src/CapturedProcessOutput.ts +50 -0
  210. package/src/ILauncherOption.ts +24 -0
  211. package/src/IProjectOptions.ts +19 -0
  212. package/src/ParsedLauncherOptions.ts +13 -0
  213. package/src/TtscGraphApplication.ts +38 -1
  214. package/src/TtscGraphLauncherArguments.ts +207 -0
  215. package/src/TtscGraphViewSnapshot.ts +46 -0
  216. package/src/index.ts +9 -160
  217. package/src/internal/GraphProcessTrace.ts +242 -0
  218. package/src/launcherArgs.ts +89 -23
  219. package/src/model/IArtifactDirectory.ts +27 -0
  220. package/src/model/IArtifactInputs.ts +21 -0
  221. package/src/model/IPublishedArtifacts.ts +81 -0
  222. package/src/model/IPublishedArtifactsResident.ts +24 -0
  223. package/src/model/ITtscLintDaemonTarget.ts +22 -0
  224. package/src/model/TtscGraphLinePeer.ts +318 -0
  225. package/src/model/TtscGraphMemory.ts +284 -246
  226. package/src/model/TtscGraphNativeArguments.ts +67 -0
  227. package/src/model/TtscGraphNodeId.ts +57 -3
  228. package/src/model/TtscGraphProjection.ts +473 -0
  229. package/src/model/TtscGraphProtocol.ts +90 -0
  230. package/src/model/TtscGraphReadonly.ts +17 -0
  231. package/src/model/TtscGraphRequestOptions.ts +16 -0
  232. package/src/model/TtscGraphSession.ts +196 -475
  233. package/src/model/TtscGraphSessionOptions.ts +22 -0
  234. package/src/model/TtscGraphSessionState.ts +558 -0
  235. package/src/model/TtscGraphShardStore.ts +99 -23
  236. package/src/model/TtscGraphSourceReader.ts +37 -15
  237. package/src/model/TtscLintDaemon.ts +55 -136
  238. package/src/model/TtscLintDaemonState.ts +174 -0
  239. package/src/model/copyGraphRecords.ts +17 -0
  240. package/src/model/copyGraphSnapshot.ts +30 -0
  241. package/src/model/loadGraph.ts +23 -12
  242. package/src/model/publishedArtifacts.ts +361 -182
  243. package/src/nativeExecutable.ts +93 -26
  244. package/src/reduce.ts +24 -51
  245. package/src/resolveGraphBinary.ts +13 -3
  246. package/src/runGraph.ts +90 -0
  247. package/src/server/IResolvedGraphHandle.ts +24 -0
  248. package/src/server/createServer.ts +16 -22
  249. package/src/server/exportSurface.ts +23 -1
  250. package/src/server/formatGraphFailure.ts +32 -0
  251. package/src/server/pathPolicy.ts +70 -5
  252. package/src/server/resolveHandle.ts +45 -14
  253. package/src/server/resultAudit.ts +58 -27
  254. package/src/server/resultNext.ts +26 -1
  255. package/src/server/runDetails.ts +138 -73
  256. package/src/server/runEntrypoints.ts +13 -1
  257. package/src/server/runLookup.ts +23 -7
  258. package/src/server/runOverview.ts +17 -5
  259. package/src/server/runTour.ts +44 -82
  260. package/src/server/runTrace.ts +175 -102
  261. package/src/server/startServer.ts +29 -1
  262. package/src/structures/ITtscGraphApplication.ts +95 -41
  263. package/src/structures/ITtscGraphDecorator.ts +18 -0
  264. package/src/structures/ITtscGraphDetails.ts +81 -6
  265. package/src/structures/ITtscGraphDocTag.ts +17 -8
  266. package/src/structures/ITtscGraphDump.ts +106 -8
  267. package/src/structures/ITtscGraphEdge.ts +14 -2
  268. package/src/structures/ITtscGraphEntrypoints.ts +81 -6
  269. package/src/structures/ITtscGraphEscape.ts +24 -2
  270. package/src/structures/ITtscGraphEvidence.ts +9 -0
  271. package/src/structures/ITtscGraphLookup.ts +42 -9
  272. package/src/structures/ITtscGraphNext.ts +12 -1
  273. package/src/structures/ITtscGraphNode.ts +38 -11
  274. package/src/structures/ITtscGraphOverview.ts +88 -6
  275. package/src/structures/ITtscGraphSnapshot.ts +117 -2
  276. package/src/structures/ITtscGraphSpan.ts +9 -0
  277. package/src/structures/ITtscGraphTour.ts +83 -9
  278. package/src/structures/ITtscGraphTrace.ts +100 -14
  279. package/src/structures/RawDump.ts +25 -0
  280. package/src/structures/RawEdge.ts +22 -0
  281. package/src/structures/RawNode.ts +31 -0
  282. package/src/structures/TtscGraphArtifactNodeKind.ts +9 -0
  283. package/src/structures/TtscGraphDumpEdgeKind.ts +15 -1
  284. package/src/structures/TtscGraphDumpNodeKind.ts +9 -0
  285. package/src/structures/TtscGraphEdgeKind.ts +13 -4
  286. package/src/structures/TtscGraphNodeKind.ts +9 -0
  287. package/src/structures/TtscGraphNodeModifier.ts +9 -0
  288. package/src/structures/ViewerLink.ts +22 -0
  289. package/src/structures/ViewerNode.ts +28 -0
  290. package/src/structures/ViewerPayload.ts +52 -0
  291. package/src/view.ts +208 -110
  292. package/src/viewer/legend.ts +119 -27
@@ -1,4 +1,18 @@
1
- /** Relationship kinds the native Go dump producer can write. */
1
+ /**
2
+ * Relationship kinds the native Go dump producer can write.
3
+ *
4
+ * Memory-only containment and trace dispatch are absent because the native
5
+ * producer does not emit either relation.
6
+ *
7
+ * @evidence contracts/common.md#principled-implementation Literal variants describe only relationships emitted by the native wire producer.
8
+ * @evidence contracts/common.md#clear-and-simple-design A separate wire union keeps validation independent of memory-derived relation additions.
9
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Memory containment and inferred dispatch cannot be accepted as native compiler output.
10
+ * @evidence contracts/common.md#meaningful-documentation Native prose explains why the wire vocabulary excludes the two later-layer relationships.
11
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
12
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
13
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
15
+ */
2
16
  export type TtscGraphDumpEdgeKind =
3
17
  | "exports"
4
18
  | "calls"
@@ -6,6 +6,15 @@
6
6
  * that the type system holds nothing for — and their ids are the address a
7
7
  * citation writes rather than the `path#name:kind` grammar, which is why an id
8
8
  * is parsed only after its kind says it can be.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation Native declaration and published artifact variants match the wire producer vocabulary before memory refinement.
11
+ * @evidence contracts/common.md#clear-and-simple-design The wire union is separate from memory kinds so module replacement does not weaken native validation.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Artifact addresses are not coerced into TypeScript symbol-id grammar.
13
+ * @evidence contracts/common.md#meaningful-documentation Native documentation explains the artifact distinction and the gate required before parsing identities.
14
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
15
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
16
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
17
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
9
18
  */
10
19
  export type TtscGraphDumpNodeKind =
11
20
  | "module"
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * Structural `exports` edges come from the native declaration pass, while the
5
5
  * TypeScript memory layer synthesizes `contains` ownership. Value and type
6
- * edges (`calls`, `accesses`, `instantiates`, `type_ref`,
7
- * `extends`, `implements`, `overrides`, `renders`) are resolved by the checker
8
- * — `renders` is a JSX component use. Decorators are facts on their target node,
9
- * not edges.
6
+ * edges (`calls`, `accesses`, `instantiates`, `type_ref`, `extends`,
7
+ * `implements`, `overrides`, `renders`) are resolved by the checker — `renders`
8
+ * is a JSX component use. Decorators are facts on their target node, not
9
+ * edges.
10
10
  *
11
11
  * `doc_ref` is a declaration's own documentation naming a symbol through an
12
12
  * inline link. The checker resolves that name and counts it as a use, so it is
@@ -21,6 +21,15 @@
21
21
  * implementation. It carries the implementation's declaration span, and a
22
22
  * traversal that follows what executes emits it in place of the dead end. It is
23
23
  * trace-only and never appears in a native dump.
24
+ *
25
+ * @evidence contracts/common.md#principled-implementation The union distinguishes compiler relationships, memory containment and trace-only dispatch, each with a separate semantic role.
26
+ * @evidence contracts/common.md#clear-and-simple-design One shared relation vocabulary keeps producers and projections aligned without a second generic relation taxonomy.
27
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Documentation links remain compiler uses; dispatch follows actual implementation relations rather than guessing runtime calls.
28
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain structural, documentation and dispatch relationships and their producer boundaries.
29
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
30
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
31
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
32
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
24
33
  */
25
34
  export type TtscGraphEdgeKind =
26
35
  | "contains"
@@ -7,6 +7,15 @@
7
7
  * leaf keeps its real declaration kind and sets `external: true`.
8
8
  *
9
9
  * Used as the `kind` discriminant on {@link ITtscGraphNode}.
10
+ *
11
+ * @evidence contracts/common.md#principled-implementation Literal variants distinguish memory-layer declaration containers, refined members and published artifacts.
12
+ * @evidence contracts/common.md#clear-and-simple-design A single kind union is shared by node records instead of independent untyped classification strings.
13
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Kinds express supported graph semantics, not fixture names or framework-specific categories.
14
+ * @evidence contracts/common.md#meaningful-documentation Native paragraphs explain native-to-memory refinement and external leaves before the tags.
15
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
16
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
17
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
18
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
10
19
  */
11
20
  export type TtscGraphNodeKind =
12
21
  | "file"
@@ -3,6 +3,15 @@
3
3
  * declaration pass records it. Used by projections that reason about visibility
4
4
  * and shape — e.g. a public-API overview filters on `export`, a class outline
5
5
  * separates `static` members.
6
+ *
7
+ * @evidence contracts/common.md#principled-implementation The literal union represents the declaration modifiers the native pass records, without assigning runtime behavior to absent modifiers.
8
+ * @evidence contracts/common.md#clear-and-simple-design Shared modifier values serve node presentation and projection decisions without separate visibility flags for each consumer.
9
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Visibility comes from compiler facts rather than naming conventions for private symbols.
10
+ * @evidence contracts/common.md#meaningful-documentation Native prose explains optional collection and the visibility/shape use cases.
11
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
12
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
13
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
6
15
  */
7
16
  export type TtscGraphNodeModifier =
8
17
  | "export"
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Viewer edge joining two retained display identities.
3
+ *
4
+ * @evidence contracts/common.md#principled-implementation Source and target use the node rewrite policy while kind groups native relationships into supported visual families.
5
+ * @evidence contracts/common.md#clear-and-simple-design The display relation carries only endpoints and color-family category.
6
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Unknown relationship kinds pass through rather than being relabeled as a known family.
7
+ * @evidence contracts/common.md#meaningful-documentation Native members describe rewritten endpoints and display-family kind.
8
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
9
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
10
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
11
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
12
+ */
13
+ export interface ViewerLink {
14
+ /** Retained source viewer node id. */
15
+ source: string;
16
+
17
+ /** Retained target viewer node id. */
18
+ target: string;
19
+
20
+ /** Grouped display family, or an unchanged unknown native kind. */
21
+ kind: string;
22
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Connected viewer node with its degree in the final displayed subgraph.
3
+ *
4
+ * @evidence contracts/common.md#principled-implementation Rewritten identity and file coordinates remain paired; degree counts only final visible incident edges.
5
+ * @evidence contracts/common.md#clear-and-simple-design One compact display record omits native provenance and source spans unnecessary for drawing.
6
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Name is presentation, not a substitute identity that could merge distinct declarations.
7
+ * @evidence contracts/common.md#meaningful-documentation Native members identify display coordinates and final-subgraph degree.
8
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
9
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
10
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
11
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
12
+ */
13
+ export interface ViewerNode {
14
+ /** Identity rewritten with the same path policy as incident edges. */
15
+ id: string;
16
+
17
+ /** Producer declaration display name. */
18
+ name: string;
19
+
20
+ /** Node category used for viewer colors. */
21
+ kind: string;
22
+
23
+ /** Display path after optional legacy rerooting. */
24
+ file: string;
25
+
26
+ /** Incident edge count after final node selection. */
27
+ degree: number;
28
+ }
@@ -0,0 +1,52 @@
1
+ import { ViewerLink } from "./ViewerLink";
2
+ import { ViewerNode } from "./ViewerNode";
3
+
4
+ /**
5
+ * Reduced connected graph and the populations removed by its filters.
6
+ *
7
+ * @evidence contracts/common.md#principled-implementation Final nodes/links describe the drawn subgraph while counters retain raw totals and distinct boundary/cap omissions.
8
+ * @evidence contracts/common.md#clear-and-simple-design One payload carries drawing inputs and explanatory totals without preserving a second full raw graph.
9
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Selection losses are exposed as counters rather than hidden to imply the full project was drawn.
10
+ * @evidence contracts/common.md#meaningful-documentation Native member comments define each count's population and distinguish selected nodes from cap/boundary removals.
11
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources data shape only: it holds no handle, task or retained state.
12
+ * @evidenceExclude contracts/performance.md#efficient-algorithms data shape only: it contains no loop or algorithm.
13
+ * @evidenceExclude contracts/performance.md#reuse-equivalent-work data shape only: it computes nothing another request could share.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation data shape only: it touches no file, path or process.
15
+ */
16
+ export interface ViewerPayload {
17
+ /** Display project label, empty when not supplied. */
18
+ project: string;
19
+
20
+ /** Input/output totals and disjoint removal categories. */
21
+ counts: {
22
+ /** Node count before viewer filtering. */
23
+ rawNodes: number;
24
+
25
+ /** Edge count before viewer filtering. */
26
+ rawEdges: number;
27
+
28
+ /** Connected nodes in the final payload. */
29
+ nodes: number;
30
+
31
+ /** Edges whose rewritten endpoints both survive. */
32
+ links: number;
33
+
34
+ /** External nodes omitted when boundary filtering is enabled. */
35
+ droppedExternal: number;
36
+
37
+ /** Nonexternal ignored nodes omitted when generated filtering is enabled. */
38
+ droppedIgnored: number;
39
+
40
+ /**
41
+ * Boundary-surviving nodes removed by the degree cap, before isolated-node
42
+ * removal.
43
+ */
44
+ droppedByCap: number;
45
+ };
46
+
47
+ /** Connected display nodes. */
48
+ nodes: ViewerNode[];
49
+
50
+ /** Directed display edges between retained nodes. */
51
+ links: ViewerLink[];
52
+ }
package/src/view.ts CHANGED
@@ -1,59 +1,33 @@
1
- import { spawn, spawnSync } from "node:child_process";
2
1
  import fs from "node:fs";
3
2
  import http from "node:http";
3
+ import type { Socket } from "node:net";
4
4
  import path from "node:path";
5
5
 
6
- import {
7
- nonNegativeIntegerOption,
8
- parseLauncherOptions,
9
- positiveIntegerOption,
10
- projectOptions,
11
- } from "./launcherArgs";
12
- import { parseDump } from "./model/loadGraph";
6
+ import { TtscGraphLauncherArguments } from "./TtscGraphLauncherArguments";
7
+ import { TtscGraphViewSnapshot } from "./TtscGraphViewSnapshot";
8
+ import { GraphProcessTrace } from "./internal/GraphProcessTrace";
13
9
  import { publishArtifacts } from "./model/publishedArtifacts";
14
10
  import { captureProcessOutput, ensureExecutable } from "./nativeExecutable";
15
11
  import { reduce } from "./reduce";
16
12
  import { resolveGraphBinary } from "./resolveGraphBinary";
17
13
 
18
- interface ViewOptions {
19
- cwd: string;
20
- tsconfig: string;
21
- port: number;
22
- open: boolean;
23
- maxNodes: number;
24
- }
25
-
26
- function parseViewArgs(argv: readonly string[]): ViewOptions {
27
- const values = parseLauncherOptions(argv, [
28
- { key: "cwd", flags: ["--cwd"], kind: "value" },
29
- { key: "tsconfig", flags: ["--tsconfig", "-p"], kind: "value" },
30
- { key: "port", flags: ["--port"], kind: "value" },
31
- { key: "open", flags: ["--no-open"], kind: "flag" },
32
- { key: "max_nodes", flags: ["--max-nodes"], kind: "value" },
33
- ]);
34
- const project = projectOptions(values);
35
- return {
36
- ...project,
37
- port:
38
- values.has("port") === true
39
- ? nonNegativeIntegerOption(values, "port", 65_535)
40
- : 0,
41
- open: values.get("open") !== true,
42
- maxNodes:
43
- values.has("max_nodes") === true
44
- ? positiveIntegerOption(values, "max_nodes", Number.MAX_SAFE_INTEGER)
45
- : 1200,
46
- };
47
- }
48
-
49
14
  /**
50
15
  * `ttsc-graph view`: build the project's code graph, reduce it, and serve a
51
16
  * self-contained 3D viewer on a localhost port, opening the browser. The native
52
17
  * binary produces the graph (the same `dump` the docs document); everything
53
18
  * else is local and offline. The process stays alive serving until Ctrl+C.
19
+ *
20
+ * @evidence contracts/common.md#principled-implementation Loopback binding must succeed before native preparation starts. Only a version-validated, reduced snapshot and bundled assets become ready; requests during preparation receive 503.
21
+ * @evidence contracts/common.md#clear-and-simple-design CLI parsing, native capture, reduction and loopback serving have explicit boundaries; browser opening is a best-effort convenience.
22
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Native failure remains a nonzero outcome and viewer absence remains an installation error rather than a fallback to fabricated graph data.
23
+ * @evidence contracts/common.md#meaningful-documentation Native prose explains offline operation, native producer responsibility and the process lifetime.
24
+ * @evidence contracts/portability.md#os-neutral-implementation Binary selection and Node paths/fs use native abstractions; browser opening isolates Windows start, macOS open and other-host xdg-open commands.
25
+ * @evidence contracts/performance.md#efficient-algorithms Native capture and reduction process the dump once; JSON and viewer assets are materialized once and reused by HTTP responses.
26
+ * @evidence contracts/performance.md#reuse-equivalent-work All requests to this one-shot viewer share the same reduced graph string and asset buffers; a new source snapshot requires another viewer invocation.
27
+ * @evidence contracts/performance.md#bound-retention-and-release-resources Capture descriptors are disposed in finally. Signal cancellation cancels scheduled preparation or publication, drops the payload and closes owned sockets/server; bind failure releases signal listeners without starting native work. Synchronous native preparation cannot be interrupted by a queued JavaScript signal handler.
54
28
  */
55
29
  export function runView(argv: readonly string[]): number | void {
56
- const opts = parseViewArgs(argv);
30
+ const opts = TtscGraphLauncherArguments.view(argv);
57
31
 
58
32
  // Anchor binary resolution at the project selected by `--cwd`, so `view` from
59
33
  // an unrelated directory still finds the `ttsc` installed under the target.
@@ -68,6 +42,173 @@ export function runView(argv: readonly string[]): number | void {
68
42
  }
69
43
  ensureExecutable(binary);
70
44
 
45
+ let prepared: Exclude<ReturnType<typeof prepareView>, number> | undefined;
46
+ let state: "binding" | "preparing" | "ready" | "closing" | "closed" =
47
+ "binding";
48
+ let pending: NodeJS.Immediate | undefined;
49
+ let closeRequested = false;
50
+ let endpoint = `127.0.0.1:${opts.port}`;
51
+ const connections = new Set<Socket>();
52
+ const server = http.createServer((req, res) => {
53
+ if (state !== "ready" || prepared === undefined) {
54
+ res.writeHead(503, {
55
+ "content-type": "text/plain; charset=utf-8",
56
+ connection: "close",
57
+ });
58
+ res.end("The graph viewer is not ready.\n");
59
+ return;
60
+ }
61
+ const url = (req.url ?? "/").split("?")[0];
62
+ if (url === "/graph.json") {
63
+ res.writeHead(200, { "content-type": "application/json" });
64
+ res.end(prepared.graphJson);
65
+ } else if (url === "/viewer.js") {
66
+ res.writeHead(200, {
67
+ "content-type": "application/javascript; charset=utf-8",
68
+ });
69
+ res.end(prepared.viewerJs);
70
+ } else {
71
+ res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
72
+ res.end(prepared.indexHtml);
73
+ }
74
+ });
75
+ const releaseSignals = (): void => {
76
+ process.removeListener("SIGINT", interrupt);
77
+ process.removeListener("SIGTERM", terminate);
78
+ };
79
+ const reportCloseFailure = (error: Error): void => {
80
+ process.exitCode = 1;
81
+ process.stderr.write(
82
+ `@ttsc/graph: could not close the 3D viewer at ${endpoint} (${error.message}).\n`,
83
+ );
84
+ };
85
+ const stop = (): void => {
86
+ if (state === "closed") return;
87
+ state = "closing";
88
+ if (pending !== undefined) {
89
+ clearImmediate(pending);
90
+ pending = undefined;
91
+ }
92
+ prepared = undefined;
93
+ for (const connection of connections) connection.destroy();
94
+ // If cancellation preceded the listening event, that event owns closure.
95
+ if (!server.listening || closeRequested) return;
96
+ closeRequested = true;
97
+ try {
98
+ server.close((error) => {
99
+ if (error) reportCloseFailure(error);
100
+ });
101
+ } catch (error) {
102
+ reportCloseFailure(
103
+ error instanceof Error ? error : new Error(String(error)),
104
+ );
105
+ }
106
+ };
107
+ const interrupt = (): void => {
108
+ process.exitCode = 130;
109
+ stop();
110
+ };
111
+ const terminate = (): void => {
112
+ process.exitCode = 143;
113
+ stop();
114
+ };
115
+ server.on("connection", (connection) => {
116
+ connections.add(connection);
117
+ connection.once("close", () => connections.delete(connection));
118
+ if (state === "closing" || state === "closed") connection.destroy();
119
+ });
120
+ server.once("close", () => {
121
+ if (pending !== undefined) {
122
+ clearImmediate(pending);
123
+ pending = undefined;
124
+ }
125
+ state = "closed";
126
+ prepared = undefined;
127
+ releaseSignals();
128
+ });
129
+ server.on("error", (error: NodeJS.ErrnoException) => {
130
+ const detail =
131
+ typeof error.code === "string"
132
+ ? `${error.code}: ${error.message}`
133
+ : error.message;
134
+ process.stderr.write(
135
+ `@ttsc/graph: could not serve the 3D viewer at ${endpoint} (${detail}).\n`,
136
+ );
137
+ process.exitCode = 1;
138
+ if (!server.listening && !closeRequested) {
139
+ state = "closed";
140
+ if (pending !== undefined) {
141
+ clearImmediate(pending);
142
+ pending = undefined;
143
+ }
144
+ prepared = undefined;
145
+ releaseSignals();
146
+ } else stop();
147
+ });
148
+ process.on("SIGINT", interrupt);
149
+ process.on("SIGTERM", terminate);
150
+ try {
151
+ server.listen(opts.port, "127.0.0.1", () => {
152
+ if (state === "closing") {
153
+ stop();
154
+ return;
155
+ }
156
+ if (state !== "binding") return;
157
+ const address = server.address();
158
+ const port =
159
+ typeof address === "object" && address ? address.port : opts.port;
160
+ endpoint = `127.0.0.1:${port}`;
161
+ state = "preparing";
162
+ pending = setImmediate(() => {
163
+ pending = undefined;
164
+ if (state !== "preparing") return;
165
+ try {
166
+ const result = prepareView(opts, binary);
167
+ if (typeof result === "number") {
168
+ process.exitCode = result;
169
+ stop();
170
+ return;
171
+ }
172
+ // Yield after synchronous native preparation so queued cancellation
173
+ // and transport events are handled before publishing readiness.
174
+ pending = setImmediate(() => {
175
+ pending = undefined;
176
+ if (state !== "preparing") return;
177
+ prepared = result;
178
+ state = "ready";
179
+ const counts = result.payload.counts;
180
+ const url = `http://${endpoint}/`;
181
+ process.stderr.write(
182
+ `@ttsc/graph: ${counts.nodes.toLocaleString()} nodes / ${counts.links.toLocaleString()} edges` +
183
+ ` (from ${counts.rawNodes.toLocaleString()} / ${counts.rawEdges.toLocaleString()})\n`,
184
+ );
185
+ process.stderr.write(
186
+ `@ttsc/graph: serving the 3D viewer at ${url}\n`,
187
+ );
188
+ process.stderr.write("@ttsc/graph: press Ctrl+C to stop.\n");
189
+ if (opts.open) openBrowser(url);
190
+ });
191
+ } catch (error) {
192
+ process.stderr.write(
193
+ `@ttsc/graph: could not prepare the 3D viewer (${String(error)}).\n`,
194
+ );
195
+ process.exitCode = 1;
196
+ stop();
197
+ }
198
+ });
199
+ });
200
+ } catch (error) {
201
+ state = "closed";
202
+ releaseSignals();
203
+ throw error;
204
+ }
205
+ }
206
+
207
+ /** Prepare one validated native snapshot and its bundled viewer assets. */
208
+ function prepareView(
209
+ opts: ReturnType<typeof TtscGraphLauncherArguments.view>,
210
+ binary: string,
211
+ ) {
71
212
  process.stderr.write(
72
213
  `@ttsc/graph: building the graph for ${opts.cwd} (${opts.tsconfig})...\n`,
73
214
  );
@@ -79,13 +220,13 @@ export function runView(argv: readonly string[]): number | void {
79
220
  try {
80
221
  // The same artifacts the dump, the loader, and the resident session ask
81
222
  // for. Without this the viewer draws a different graph from the one every
82
- // other entry point answers with — and it already carries the colours for
223
+ // other entry point answers with, and it already carries the colours for
83
224
  // the nodes it would be missing.
84
225
  const artifacts = publishArtifacts({
85
226
  cwd: opts.cwd,
86
227
  tsconfig: opts.tsconfig,
87
228
  });
88
- dump = spawnSync(
229
+ dump = GraphProcessTrace.spawnSync(
89
230
  binary,
90
231
  [
91
232
  "dump",
@@ -110,24 +251,17 @@ export function runView(argv: readonly string[]): number | void {
110
251
  return 1;
111
252
  }
112
253
  if (dump.status !== 0) {
113
- process.stderr.write(dump.stderr || "@ttsc/graph: dump failed\n");
254
+ process.stderr.write(dumpStderr || "@ttsc/graph: dump failed\n");
114
255
  return dump.status ?? 1;
115
256
  }
116
257
 
117
- let raw: ReturnType<typeof parseDump>;
118
- try {
119
- raw = parseDump(dumpStdout);
120
- } catch (error) {
121
- const message = error instanceof Error ? error.message : String(error);
122
- process.stderr.write(
123
- message.startsWith("@ttsc/graph:")
124
- ? `${message}\n`
125
- : `@ttsc/graph: could not validate the graph dump: ${message}\n`,
126
- );
127
- return 1;
258
+ const snapshot = TtscGraphViewSnapshot.decode(dumpStdout);
259
+ if (!snapshot.ok) {
260
+ process.stderr.write(snapshot.diagnostic);
261
+ return snapshot.code;
128
262
  }
129
263
 
130
- const payload = reduce(raw, { maxNodes: opts.maxNodes });
264
+ const payload = reduce(snapshot.raw, { maxNodes: opts.maxNodes });
131
265
  payload.project = path.basename(path.resolve(opts.cwd));
132
266
  const graphJson = JSON.stringify(payload);
133
267
 
@@ -145,70 +279,34 @@ export function runView(argv: readonly string[]): number | void {
145
279
  return 1;
146
280
  }
147
281
 
148
- const server = http.createServer((req, res) => {
149
- const url = (req.url ?? "/").split("?")[0];
150
- if (url === "/graph.json") {
151
- res.writeHead(200, { "content-type": "application/json" });
152
- res.end(graphJson);
153
- } else if (url === "/viewer.js") {
154
- res.writeHead(200, {
155
- "content-type": "application/javascript; charset=utf-8",
156
- });
157
- res.end(viewerJs);
158
- } else {
159
- res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
160
- res.end(indexHtml);
161
- }
162
- });
163
-
164
- let endpoint = `127.0.0.1:${opts.port}`;
165
- let failed = false;
166
- server.on("error", (error: NodeJS.ErrnoException) => {
167
- if (failed) return;
168
- failed = true;
169
- const detail =
170
- typeof error.code === "string"
171
- ? `${error.code}: ${error.message}`
172
- : error.message;
173
- process.stderr.write(
174
- `@ttsc/graph: could not serve the 3D viewer at ${endpoint} (${detail}).\n`,
175
- );
176
- process.exitCode = 1;
177
- if (server.listening) {
178
- server.close();
179
- server.closeAllConnections?.();
180
- }
181
- });
182
- server.listen(opts.port, "127.0.0.1", () => {
183
- if (failed) return;
184
- const address = server.address();
185
- const port =
186
- typeof address === "object" && address ? address.port : opts.port;
187
- endpoint = `127.0.0.1:${port}`;
188
- const url = `http://127.0.0.1:${port}/`;
189
- const counts = payload.counts;
190
- process.stderr.write(
191
- `@ttsc/graph: ${counts.nodes.toLocaleString()} nodes / ${counts.links.toLocaleString()} edges` +
192
- ` (from ${counts.rawNodes.toLocaleString()} / ${counts.rawEdges.toLocaleString()})\n`,
193
- );
194
- process.stderr.write(`@ttsc/graph: serving the 3D viewer at ${url}\n`);
195
- process.stderr.write("@ttsc/graph: press Ctrl+C to stop.\n");
196
- if (opts.open) openBrowser(url);
197
- });
198
- // No return: the listening server keeps the process alive until Ctrl+C.
282
+ return { payload, graphJson, indexHtml, viewerJs };
199
283
  }
200
284
 
201
285
  /** Best-effort open the URL in the default browser; the URL is printed anyway. */
202
286
  function openBrowser(url: string): void {
203
287
  try {
204
288
  if (process.platform === "win32")
205
- spawn("cmd", ["/c", "start", "", url], {
289
+ GraphProcessTrace.spawn("cmd", ["/c", "start", "", url], {
206
290
  stdio: "ignore",
207
291
  detached: true,
208
- }).unref();
292
+ windowsHide: true,
293
+ })
294
+ .on("error", () => undefined)
295
+ .unref();
209
296
  else if (process.platform === "darwin")
210
- spawn("open", [url], { stdio: "ignore", detached: true }).unref();
211
- else spawn("xdg-open", [url], { stdio: "ignore", detached: true }).unref();
297
+ GraphProcessTrace.spawn("open", [url], {
298
+ stdio: "ignore",
299
+ detached: true,
300
+ })
301
+ .on("error", () => undefined)
302
+ .unref();
303
+ else
304
+ GraphProcessTrace.spawn("xdg-open", [url], {
305
+ stdio: "ignore",
306
+ detached: true,
307
+ })
308
+ .on("error", () => undefined)
309
+ .unref();
212
310
  } catch {
213
311
  /* the URL is printed; opening is a convenience */
214
312
  }