@akon-labs/nexus-cli 0.1.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 (1073) hide show
  1. package/CHANGELOG.md +5342 -0
  2. package/LICENSE +22 -0
  3. package/README.md +677 -0
  4. package/dist/bun/cli.d.ts +3 -0
  5. package/dist/bun/cli.d.ts.map +1 -0
  6. package/dist/bun/cli.js +11 -0
  7. package/dist/bun/cli.js.map +1 -0
  8. package/dist/bun/register-bedrock.d.ts +2 -0
  9. package/dist/bun/register-bedrock.d.ts.map +1 -0
  10. package/dist/bun/register-bedrock.js +4 -0
  11. package/dist/bun/register-bedrock.js.map +1 -0
  12. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  13. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  14. package/dist/bun/restore-sandbox-env.js +36 -0
  15. package/dist/bun/restore-sandbox-env.js.map +1 -0
  16. package/dist/cli/args.d.ts +59 -0
  17. package/dist/cli/args.d.ts.map +1 -0
  18. package/dist/cli/args.js +408 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/config-selector.d.ts +16 -0
  21. package/dist/cli/config-selector.d.ts.map +1 -0
  22. package/dist/cli/config-selector.js +31 -0
  23. package/dist/cli/config-selector.js.map +1 -0
  24. package/dist/cli/credential-print.d.ts +23 -0
  25. package/dist/cli/credential-print.d.ts.map +1 -0
  26. package/dist/cli/credential-print.js +118 -0
  27. package/dist/cli/credential-print.js.map +1 -0
  28. package/dist/cli/experimental/auth.d.ts +16 -0
  29. package/dist/cli/experimental/auth.d.ts.map +1 -0
  30. package/dist/cli/experimental/auth.js +13 -0
  31. package/dist/cli/experimental/auth.js.map +1 -0
  32. package/dist/cli/experimental/cli.d.ts +6 -0
  33. package/dist/cli/experimental/cli.d.ts.map +1 -0
  34. package/dist/cli/experimental/cli.js +5 -0
  35. package/dist/cli/experimental/cli.js.map +1 -0
  36. package/dist/cli/experimental/command-options.d.ts +17 -0
  37. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  38. package/dist/cli/experimental/command-options.js +35 -0
  39. package/dist/cli/experimental/command-options.js.map +1 -0
  40. package/dist/cli/experimental/command.d.ts +63 -0
  41. package/dist/cli/experimental/command.d.ts.map +1 -0
  42. package/dist/cli/experimental/command.js +130 -0
  43. package/dist/cli/experimental/command.js.map +1 -0
  44. package/dist/cli/experimental/commands/client.d.ts +13 -0
  45. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  46. package/dist/cli/experimental/commands/client.js +25 -0
  47. package/dist/cli/experimental/commands/client.js.map +1 -0
  48. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  49. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  50. package/dist/cli/experimental/commands/pi.js +28 -0
  51. package/dist/cli/experimental/commands/pi.js.map +1 -0
  52. package/dist/cli/experimental/commands/server.d.ts +13 -0
  53. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  54. package/dist/cli/experimental/commands/server.js +25 -0
  55. package/dist/cli/experimental/commands/server.js.map +1 -0
  56. package/dist/cli/experimental/transport-address.d.ts +10 -0
  57. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  58. package/dist/cli/experimental/transport-address.js +38 -0
  59. package/dist/cli/experimental/transport-address.js.map +1 -0
  60. package/dist/cli/file-processor.d.ts +15 -0
  61. package/dist/cli/file-processor.d.ts.map +1 -0
  62. package/dist/cli/file-processor.js +70 -0
  63. package/dist/cli/file-processor.js.map +1 -0
  64. package/dist/cli/initial-message.d.ts +18 -0
  65. package/dist/cli/initial-message.d.ts.map +1 -0
  66. package/dist/cli/initial-message.js +22 -0
  67. package/dist/cli/initial-message.js.map +1 -0
  68. package/dist/cli/list-models.d.ts +9 -0
  69. package/dist/cli/list-models.d.ts.map +1 -0
  70. package/dist/cli/list-models.js +98 -0
  71. package/dist/cli/list-models.js.map +1 -0
  72. package/dist/cli/project-trust.d.ts +10 -0
  73. package/dist/cli/project-trust.d.ts.map +1 -0
  74. package/dist/cli/project-trust.js +48 -0
  75. package/dist/cli/project-trust.js.map +1 -0
  76. package/dist/cli/require-login.d.ts +30 -0
  77. package/dist/cli/require-login.d.ts.map +1 -0
  78. package/dist/cli/require-login.js +96 -0
  79. package/dist/cli/require-login.js.map +1 -0
  80. package/dist/cli/session-picker.d.ts +10 -0
  81. package/dist/cli/session-picker.d.ts.map +1 -0
  82. package/dist/cli/session-picker.js +36 -0
  83. package/dist/cli/session-picker.js.map +1 -0
  84. package/dist/cli/startup-ui.d.ts +20 -0
  85. package/dist/cli/startup-ui.d.ts.map +1 -0
  86. package/dist/cli/startup-ui.js +185 -0
  87. package/dist/cli/startup-ui.js.map +1 -0
  88. package/dist/cli.d.ts +3 -0
  89. package/dist/cli.d.ts.map +1 -0
  90. package/dist/cli.js +69740 -0
  91. package/dist/cli.js.map +1 -0
  92. package/dist/client/index.d.ts +3 -0
  93. package/dist/client/index.d.ts.map +1 -0
  94. package/dist/client/index.js +425 -0
  95. package/dist/client/index.js.map +1 -0
  96. package/dist/client/remote-session.d.ts +53 -0
  97. package/dist/client/remote-session.d.ts.map +1 -0
  98. package/dist/client/remote-session.js +340 -0
  99. package/dist/client/remote-session.js.map +1 -0
  100. package/dist/client/transcript.d.ts +12 -0
  101. package/dist/client/transcript.d.ts.map +1 -0
  102. package/dist/client/transcript.js +98 -0
  103. package/dist/client/transcript.js.map +1 -0
  104. package/dist/config.d.ts +99 -0
  105. package/dist/config.d.ts.map +1 -0
  106. package/dist/config.js +482 -0
  107. package/dist/config.js.map +1 -0
  108. package/dist/core/agent-session-runtime.d.ts +119 -0
  109. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  110. package/dist/core/agent-session-runtime.js +309 -0
  111. package/dist/core/agent-session-runtime.js.map +1 -0
  112. package/dist/core/agent-session-services.d.ts +86 -0
  113. package/dist/core/agent-session-services.d.ts.map +1 -0
  114. package/dist/core/agent-session-services.js +134 -0
  115. package/dist/core/agent-session-services.js.map +1 -0
  116. package/dist/core/agent-session.d.ts +644 -0
  117. package/dist/core/agent-session.d.ts.map +1 -0
  118. package/dist/core/agent-session.js +2687 -0
  119. package/dist/core/agent-session.js.map +1 -0
  120. package/dist/core/auth-guidance.d.ts +5 -0
  121. package/dist/core/auth-guidance.d.ts.map +1 -0
  122. package/dist/core/auth-guidance.js +39 -0
  123. package/dist/core/auth-guidance.js.map +1 -0
  124. package/dist/core/auth-storage.d.ts +62 -0
  125. package/dist/core/auth-storage.d.ts.map +1 -0
  126. package/dist/core/auth-storage.js +350 -0
  127. package/dist/core/auth-storage.js.map +1 -0
  128. package/dist/core/bash-executor.d.ts +32 -0
  129. package/dist/core/bash-executor.d.ts.map +1 -0
  130. package/dist/core/bash-executor.js +111 -0
  131. package/dist/core/bash-executor.js.map +1 -0
  132. package/dist/core/cache-stats.d.ts +49 -0
  133. package/dist/core/cache-stats.d.ts.map +1 -0
  134. package/dist/core/cache-stats.js +101 -0
  135. package/dist/core/cache-stats.js.map +1 -0
  136. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  137. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  138. package/dist/core/compaction/branch-summarization.js +246 -0
  139. package/dist/core/compaction/branch-summarization.js.map +1 -0
  140. package/dist/core/compaction/compaction.d.ts +137 -0
  141. package/dist/core/compaction/compaction.d.ts.map +1 -0
  142. package/dist/core/compaction/compaction.js +645 -0
  143. package/dist/core/compaction/compaction.js.map +1 -0
  144. package/dist/core/compaction/index.d.ts +7 -0
  145. package/dist/core/compaction/index.d.ts.map +1 -0
  146. package/dist/core/compaction/index.js +7 -0
  147. package/dist/core/compaction/index.js.map +1 -0
  148. package/dist/core/compaction/utils.d.ts +38 -0
  149. package/dist/core/compaction/utils.d.ts.map +1 -0
  150. package/dist/core/compaction/utils.js +142 -0
  151. package/dist/core/compaction/utils.js.map +1 -0
  152. package/dist/core/defaults.d.ts +3 -0
  153. package/dist/core/defaults.d.ts.map +1 -0
  154. package/dist/core/defaults.js +2 -0
  155. package/dist/core/defaults.js.map +1 -0
  156. package/dist/core/diagnostics.d.ts +15 -0
  157. package/dist/core/diagnostics.d.ts.map +1 -0
  158. package/dist/core/diagnostics.js +2 -0
  159. package/dist/core/diagnostics.js.map +1 -0
  160. package/dist/core/event-bus.d.ts +9 -0
  161. package/dist/core/event-bus.d.ts.map +1 -0
  162. package/dist/core/event-bus.js +25 -0
  163. package/dist/core/event-bus.js.map +1 -0
  164. package/dist/core/exec.d.ts +29 -0
  165. package/dist/core/exec.d.ts.map +1 -0
  166. package/dist/core/exec.js +75 -0
  167. package/dist/core/exec.js.map +1 -0
  168. package/dist/core/experimental.d.ts +2 -0
  169. package/dist/core/experimental.d.ts.map +1 -0
  170. package/dist/core/experimental.js +5 -0
  171. package/dist/core/experimental.js.map +1 -0
  172. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  173. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  174. package/dist/core/export-html/ansi-to-html.js +249 -0
  175. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  176. package/dist/core/export-html/index.d.ts +37 -0
  177. package/dist/core/export-html/index.d.ts.map +1 -0
  178. package/dist/core/export-html/index.js +226 -0
  179. package/dist/core/export-html/index.js.map +1 -0
  180. package/dist/core/export-html/template.css +1066 -0
  181. package/dist/core/export-html/template.html +55 -0
  182. package/dist/core/export-html/template.js +1864 -0
  183. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  184. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  185. package/dist/core/export-html/tool-renderer.js +108 -0
  186. package/dist/core/export-html/tool-renderer.js.map +1 -0
  187. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  188. package/dist/core/export-html/vendor/marked.min.js +78 -0
  189. package/dist/core/extensions/index.d.ts +12 -0
  190. package/dist/core/extensions/index.d.ts.map +1 -0
  191. package/dist/core/extensions/index.js +9 -0
  192. package/dist/core/extensions/index.js.map +1 -0
  193. package/dist/core/extensions/loader.d.ts +23 -0
  194. package/dist/core/extensions/loader.d.ts.map +1 -0
  195. package/dist/core/extensions/loader.js +581 -0
  196. package/dist/core/extensions/loader.js.map +1 -0
  197. package/dist/core/extensions/runner.d.ts +173 -0
  198. package/dist/core/extensions/runner.d.ts.map +1 -0
  199. package/dist/core/extensions/runner.js +967 -0
  200. package/dist/core/extensions/runner.js.map +1 -0
  201. package/dist/core/extensions/types.d.ts +1288 -0
  202. package/dist/core/extensions/types.d.ts.map +1 -0
  203. package/dist/core/extensions/types.js +45 -0
  204. package/dist/core/extensions/types.js.map +1 -0
  205. package/dist/core/extensions/wrapper.d.ts +20 -0
  206. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  207. package/dist/core/extensions/wrapper.js +41 -0
  208. package/dist/core/extensions/wrapper.js.map +1 -0
  209. package/dist/core/footer-data-provider.d.ts +64 -0
  210. package/dist/core/footer-data-provider.d.ts.map +1 -0
  211. package/dist/core/footer-data-provider.js +338 -0
  212. package/dist/core/footer-data-provider.js.map +1 -0
  213. package/dist/core/graph-rail-store.d.ts +94 -0
  214. package/dist/core/graph-rail-store.d.ts.map +1 -0
  215. package/dist/core/graph-rail-store.js +86 -0
  216. package/dist/core/graph-rail-store.js.map +1 -0
  217. package/dist/core/http-dispatcher.d.ts +22 -0
  218. package/dist/core/http-dispatcher.d.ts.map +1 -0
  219. package/dist/core/http-dispatcher.js +96 -0
  220. package/dist/core/http-dispatcher.js.map +1 -0
  221. package/dist/core/index.d.ts +13 -0
  222. package/dist/core/index.d.ts.map +1 -0
  223. package/dist/core/index.js +13 -0
  224. package/dist/core/index.js.map +1 -0
  225. package/dist/core/keybindings.d.ts +395 -0
  226. package/dist/core/keybindings.d.ts.map +1 -0
  227. package/dist/core/keybindings.js +297 -0
  228. package/dist/core/keybindings.js.map +1 -0
  229. package/dist/core/messages.d.ts +77 -0
  230. package/dist/core/messages.d.ts.map +1 -0
  231. package/dist/core/messages.js +123 -0
  232. package/dist/core/messages.js.map +1 -0
  233. package/dist/core/model-config.d.ts +566 -0
  234. package/dist/core/model-config.d.ts.map +1 -0
  235. package/dist/core/model-config.js +253 -0
  236. package/dist/core/model-config.js.map +1 -0
  237. package/dist/core/model-registry.d.ts +45 -0
  238. package/dist/core/model-registry.d.ts.map +1 -0
  239. package/dist/core/model-registry.js +107 -0
  240. package/dist/core/model-registry.js.map +1 -0
  241. package/dist/core/model-resolver.d.ts +127 -0
  242. package/dist/core/model-resolver.d.ts.map +1 -0
  243. package/dist/core/model-resolver.js +541 -0
  244. package/dist/core/model-resolver.js.map +1 -0
  245. package/dist/core/model-runtime.d.ts +97 -0
  246. package/dist/core/model-runtime.d.ts.map +1 -0
  247. package/dist/core/model-runtime.js +594 -0
  248. package/dist/core/model-runtime.js.map +1 -0
  249. package/dist/core/models-dev-catalog.d.ts +63 -0
  250. package/dist/core/models-dev-catalog.d.ts.map +1 -0
  251. package/dist/core/models-dev-catalog.js +105 -0
  252. package/dist/core/models-dev-catalog.js.map +1 -0
  253. package/dist/core/models-store.d.ts +22 -0
  254. package/dist/core/models-store.d.ts.map +1 -0
  255. package/dist/core/models-store.js +114 -0
  256. package/dist/core/models-store.js.map +1 -0
  257. package/dist/core/observatory-cache.d.ts +16 -0
  258. package/dist/core/observatory-cache.d.ts.map +1 -0
  259. package/dist/core/observatory-cache.js +55 -0
  260. package/dist/core/observatory-cache.js.map +1 -0
  261. package/dist/core/output-guard.d.ts +7 -0
  262. package/dist/core/output-guard.d.ts.map +1 -0
  263. package/dist/core/output-guard.js +89 -0
  264. package/dist/core/output-guard.js.map +1 -0
  265. package/dist/core/package-manager.d.ts +213 -0
  266. package/dist/core/package-manager.d.ts.map +1 -0
  267. package/dist/core/package-manager.js +2169 -0
  268. package/dist/core/package-manager.js.map +1 -0
  269. package/dist/core/pi-manifest.d.ts +8 -0
  270. package/dist/core/pi-manifest.d.ts.map +1 -0
  271. package/dist/core/pi-manifest.js +25 -0
  272. package/dist/core/pi-manifest.js.map +1 -0
  273. package/dist/core/project-trust.d.ts +15 -0
  274. package/dist/core/project-trust.d.ts.map +1 -0
  275. package/dist/core/project-trust.js +59 -0
  276. package/dist/core/project-trust.js.map +1 -0
  277. package/dist/core/prompt-templates.d.ts +54 -0
  278. package/dist/core/prompt-templates.d.ts.map +1 -0
  279. package/dist/core/prompt-templates.js +236 -0
  280. package/dist/core/prompt-templates.js.map +1 -0
  281. package/dist/core/provider-attribution.d.ts +4 -0
  282. package/dist/core/provider-attribution.d.ts.map +1 -0
  283. package/dist/core/provider-attribution.js +73 -0
  284. package/dist/core/provider-attribution.js.map +1 -0
  285. package/dist/core/provider-composer.d.ts +56 -0
  286. package/dist/core/provider-composer.d.ts.map +1 -0
  287. package/dist/core/provider-composer.js +395 -0
  288. package/dist/core/provider-composer.js.map +1 -0
  289. package/dist/core/radius.d.ts +2 -0
  290. package/dist/core/radius.d.ts.map +1 -0
  291. package/dist/core/radius.js +2 -0
  292. package/dist/core/radius.js.map +1 -0
  293. package/dist/core/remote-catalog-provider.d.ts +5 -0
  294. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  295. package/dist/core/remote-catalog-provider.js +106 -0
  296. package/dist/core/remote-catalog-provider.js.map +1 -0
  297. package/dist/core/resolve-config-value.d.ts +30 -0
  298. package/dist/core/resolve-config-value.d.ts.map +1 -0
  299. package/dist/core/resolve-config-value.js +247 -0
  300. package/dist/core/resolve-config-value.js.map +1 -0
  301. package/dist/core/resource-loader.d.ts +221 -0
  302. package/dist/core/resource-loader.d.ts.map +1 -0
  303. package/dist/core/resource-loader.js +874 -0
  304. package/dist/core/resource-loader.js.map +1 -0
  305. package/dist/core/runtime-credentials.d.ts +15 -0
  306. package/dist/core/runtime-credentials.d.ts.map +1 -0
  307. package/dist/core/runtime-credentials.js +39 -0
  308. package/dist/core/runtime-credentials.js.map +1 -0
  309. package/dist/core/sdk.d.ts +106 -0
  310. package/dist/core/sdk.d.ts.map +1 -0
  311. package/dist/core/sdk.js +267 -0
  312. package/dist/core/sdk.js.map +1 -0
  313. package/dist/core/session-cwd.d.ts +19 -0
  314. package/dist/core/session-cwd.d.ts.map +1 -0
  315. package/dist/core/session-cwd.js +38 -0
  316. package/dist/core/session-cwd.js.map +1 -0
  317. package/dist/core/session-manager.d.ts +356 -0
  318. package/dist/core/session-manager.d.ts.map +1 -0
  319. package/dist/core/session-manager.js +1340 -0
  320. package/dist/core/session-manager.js.map +1 -0
  321. package/dist/core/settings-manager.d.ts +304 -0
  322. package/dist/core/settings-manager.d.ts.map +1 -0
  323. package/dist/core/settings-manager.js +912 -0
  324. package/dist/core/settings-manager.js.map +1 -0
  325. package/dist/core/skills.d.ts +60 -0
  326. package/dist/core/skills.d.ts.map +1 -0
  327. package/dist/core/skills.js +387 -0
  328. package/dist/core/skills.js.map +1 -0
  329. package/dist/core/slash-commands.d.ts +21 -0
  330. package/dist/core/slash-commands.d.ts.map +1 -0
  331. package/dist/core/slash-commands.js +39 -0
  332. package/dist/core/slash-commands.js.map +1 -0
  333. package/dist/core/source-info.d.ts +18 -0
  334. package/dist/core/source-info.d.ts.map +1 -0
  335. package/dist/core/source-info.js +19 -0
  336. package/dist/core/source-info.js.map +1 -0
  337. package/dist/core/system-prompt.d.ts +28 -0
  338. package/dist/core/system-prompt.d.ts.map +1 -0
  339. package/dist/core/system-prompt.js +130 -0
  340. package/dist/core/system-prompt.js.map +1 -0
  341. package/dist/core/telemetry.d.ts +3 -0
  342. package/dist/core/telemetry.d.ts.map +1 -0
  343. package/dist/core/telemetry.js +10 -0
  344. package/dist/core/telemetry.js.map +1 -0
  345. package/dist/core/timings.d.ts +6 -0
  346. package/dist/core/timings.d.ts.map +1 -0
  347. package/dist/core/timings.js +42 -0
  348. package/dist/core/timings.js.map +1 -0
  349. package/dist/core/tools/bash.d.ts +70 -0
  350. package/dist/core/tools/bash.d.ts.map +1 -0
  351. package/dist/core/tools/bash.js +389 -0
  352. package/dist/core/tools/bash.js.map +1 -0
  353. package/dist/core/tools/edit-diff.d.ts +106 -0
  354. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  355. package/dist/core/tools/edit-diff.js +424 -0
  356. package/dist/core/tools/edit-diff.js.map +1 -0
  357. package/dist/core/tools/edit.d.ts +51 -0
  358. package/dist/core/tools/edit.d.ts.map +1 -0
  359. package/dist/core/tools/edit.js +284 -0
  360. package/dist/core/tools/edit.js.map +1 -0
  361. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  362. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  363. package/dist/core/tools/file-mutation-queue.js +52 -0
  364. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  365. package/dist/core/tools/find.d.ts +38 -0
  366. package/dist/core/tools/find.d.ts.map +1 -0
  367. package/dist/core/tools/find.js +298 -0
  368. package/dist/core/tools/find.js.map +1 -0
  369. package/dist/core/tools/grep.d.ts +37 -0
  370. package/dist/core/tools/grep.d.ts.map +1 -0
  371. package/dist/core/tools/grep.js +304 -0
  372. package/dist/core/tools/grep.js.map +1 -0
  373. package/dist/core/tools/index.d.ts +43 -0
  374. package/dist/core/tools/index.d.ts.map +1 -0
  375. package/dist/core/tools/index.js +129 -0
  376. package/dist/core/tools/index.js.map +1 -0
  377. package/dist/core/tools/ls.d.ts +37 -0
  378. package/dist/core/tools/ls.d.ts.map +1 -0
  379. package/dist/core/tools/ls.js +167 -0
  380. package/dist/core/tools/ls.js.map +1 -0
  381. package/dist/core/tools/output-accumulator.d.ts +52 -0
  382. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  383. package/dist/core/tools/output-accumulator.js +185 -0
  384. package/dist/core/tools/output-accumulator.js.map +1 -0
  385. package/dist/core/tools/path-utils.d.ts +10 -0
  386. package/dist/core/tools/path-utils.d.ts.map +1 -0
  387. package/dist/core/tools/path-utils.js +99 -0
  388. package/dist/core/tools/path-utils.js.map +1 -0
  389. package/dist/core/tools/read.d.ts +35 -0
  390. package/dist/core/tools/read.d.ts.map +1 -0
  391. package/dist/core/tools/read.js +284 -0
  392. package/dist/core/tools/read.js.map +1 -0
  393. package/dist/core/tools/render-utils.d.ts +24 -0
  394. package/dist/core/tools/render-utils.d.ts.map +1 -0
  395. package/dist/core/tools/render-utils.js +65 -0
  396. package/dist/core/tools/render-utils.js.map +1 -0
  397. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  398. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  399. package/dist/core/tools/tool-definition-wrapper.js +36 -0
  400. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  401. package/dist/core/tools/truncate.d.ts +70 -0
  402. package/dist/core/tools/truncate.d.ts.map +1 -0
  403. package/dist/core/tools/truncate.js +215 -0
  404. package/dist/core/tools/truncate.js.map +1 -0
  405. package/dist/core/tools/websearch.d.ts +29 -0
  406. package/dist/core/tools/websearch.d.ts.map +1 -0
  407. package/dist/core/tools/websearch.js +145 -0
  408. package/dist/core/tools/websearch.js.map +1 -0
  409. package/dist/core/tools/write.d.ts +26 -0
  410. package/dist/core/tools/write.d.ts.map +1 -0
  411. package/dist/core/tools/write.js +197 -0
  412. package/dist/core/tools/write.js.map +1 -0
  413. package/dist/core/trust-manager.d.ts +36 -0
  414. package/dist/core/trust-manager.d.ts.map +1 -0
  415. package/dist/core/trust-manager.js +202 -0
  416. package/dist/core/trust-manager.js.map +1 -0
  417. package/dist/core/usage-totals.d.ts +19 -0
  418. package/dist/core/usage-totals.d.ts.map +1 -0
  419. package/dist/core/usage-totals.js +52 -0
  420. package/dist/core/usage-totals.js.map +1 -0
  421. package/dist/extensions/gitnexus/augment.d.ts +4 -0
  422. package/dist/extensions/gitnexus/augment.d.ts.map +1 -0
  423. package/dist/extensions/gitnexus/augment.js +60 -0
  424. package/dist/extensions/gitnexus/augment.js.map +1 -0
  425. package/dist/extensions/gitnexus/changes.d.ts +3 -0
  426. package/dist/extensions/gitnexus/changes.d.ts.map +1 -0
  427. package/dist/extensions/gitnexus/changes.js +58 -0
  428. package/dist/extensions/gitnexus/changes.js.map +1 -0
  429. package/dist/extensions/gitnexus/client.d.ts +39 -0
  430. package/dist/extensions/gitnexus/client.d.ts.map +1 -0
  431. package/dist/extensions/gitnexus/client.js +173 -0
  432. package/dist/extensions/gitnexus/client.js.map +1 -0
  433. package/dist/extensions/gitnexus/config.d.ts +25 -0
  434. package/dist/extensions/gitnexus/config.d.ts.map +1 -0
  435. package/dist/extensions/gitnexus/config.js +42 -0
  436. package/dist/extensions/gitnexus/config.js.map +1 -0
  437. package/dist/extensions/gitnexus/device-auth.d.ts +60 -0
  438. package/dist/extensions/gitnexus/device-auth.d.ts.map +1 -0
  439. package/dist/extensions/gitnexus/device-auth.js +130 -0
  440. package/dist/extensions/gitnexus/device-auth.js.map +1 -0
  441. package/dist/extensions/gitnexus/gateway.d.ts +57 -0
  442. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -0
  443. package/dist/extensions/gitnexus/gateway.js +139 -0
  444. package/dist/extensions/gitnexus/gateway.js.map +1 -0
  445. package/dist/extensions/gitnexus/index.d.ts +14 -0
  446. package/dist/extensions/gitnexus/index.d.ts.map +1 -0
  447. package/dist/extensions/gitnexus/index.js +189 -0
  448. package/dist/extensions/gitnexus/index.js.map +1 -0
  449. package/dist/extensions/gitnexus/observatory.d.ts +13 -0
  450. package/dist/extensions/gitnexus/observatory.d.ts.map +1 -0
  451. package/dist/extensions/gitnexus/observatory.js +189 -0
  452. package/dist/extensions/gitnexus/observatory.js.map +1 -0
  453. package/dist/extensions/gitnexus/prompt.d.ts +11 -0
  454. package/dist/extensions/gitnexus/prompt.d.ts.map +1 -0
  455. package/dist/extensions/gitnexus/prompt.js +50 -0
  456. package/dist/extensions/gitnexus/prompt.js.map +1 -0
  457. package/dist/extensions/gitnexus/render.d.ts +61 -0
  458. package/dist/extensions/gitnexus/render.d.ts.map +1 -0
  459. package/dist/extensions/gitnexus/render.js +391 -0
  460. package/dist/extensions/gitnexus/render.js.map +1 -0
  461. package/dist/extensions/gitnexus/resolve.d.ts +22 -0
  462. package/dist/extensions/gitnexus/resolve.d.ts.map +1 -0
  463. package/dist/extensions/gitnexus/resolve.js +54 -0
  464. package/dist/extensions/gitnexus/resolve.js.map +1 -0
  465. package/dist/extensions/gitnexus/skills/gitnexus-debugging/SKILL.md +89 -0
  466. package/dist/extensions/gitnexus/skills/gitnexus-debugging/mcp.json +8 -0
  467. package/dist/extensions/gitnexus/skills/gitnexus-exploring/SKILL.md +78 -0
  468. package/dist/extensions/gitnexus/skills/gitnexus-exploring/mcp.json +8 -0
  469. package/dist/extensions/gitnexus/skills/gitnexus-guide/SKILL.md +64 -0
  470. package/dist/extensions/gitnexus/skills/gitnexus-guide/mcp.json +8 -0
  471. package/dist/extensions/gitnexus/skills/gitnexus-impact-analysis/SKILL.md +97 -0
  472. package/dist/extensions/gitnexus/skills/gitnexus-impact-analysis/mcp.json +8 -0
  473. package/dist/extensions/gitnexus/skills/gitnexus-pr-review/SKILL.md +163 -0
  474. package/dist/extensions/gitnexus/skills/gitnexus-refactoring/SKILL.md +121 -0
  475. package/dist/extensions/gitnexus/skills/gitnexus-refactoring/mcp.json +8 -0
  476. package/dist/extensions/gitnexus/tools.d.ts +15 -0
  477. package/dist/extensions/gitnexus/tools.d.ts.map +1 -0
  478. package/dist/extensions/gitnexus/tools.js +187 -0
  479. package/dist/extensions/gitnexus/tools.js.map +1 -0
  480. package/dist/extensions/index.d.ts +3 -0
  481. package/dist/extensions/index.d.ts.map +1 -0
  482. package/dist/extensions/index.js +10 -0
  483. package/dist/extensions/index.js.map +1 -0
  484. package/dist/extensions/llama/client.d.ts +61 -0
  485. package/dist/extensions/llama/client.d.ts.map +1 -0
  486. package/dist/extensions/llama/client.js +302 -0
  487. package/dist/extensions/llama/client.js.map +1 -0
  488. package/dist/extensions/llama/huggingface.d.ts +23 -0
  489. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  490. package/dist/extensions/llama/huggingface.js +141 -0
  491. package/dist/extensions/llama/huggingface.js.map +1 -0
  492. package/dist/extensions/llama/index.d.ts +3 -0
  493. package/dist/extensions/llama/index.d.ts.map +1 -0
  494. package/dist/extensions/llama/index.js +217 -0
  495. package/dist/extensions/llama/index.js.map +1 -0
  496. package/dist/extensions/llama/provider.d.ts +10 -0
  497. package/dist/extensions/llama/provider.d.ts.map +1 -0
  498. package/dist/extensions/llama/provider.js +121 -0
  499. package/dist/extensions/llama/provider.js.map +1 -0
  500. package/dist/extensions/llama/ui.d.ts +42 -0
  501. package/dist/extensions/llama/ui.d.ts.map +1 -0
  502. package/dist/extensions/llama/ui.js +416 -0
  503. package/dist/extensions/llama/ui.js.map +1 -0
  504. package/dist/extensions/mcp/client.d.ts +86 -0
  505. package/dist/extensions/mcp/client.d.ts.map +1 -0
  506. package/dist/extensions/mcp/client.js +275 -0
  507. package/dist/extensions/mcp/client.js.map +1 -0
  508. package/dist/extensions/mcp/config.d.ts +41 -0
  509. package/dist/extensions/mcp/config.d.ts.map +1 -0
  510. package/dist/extensions/mcp/config.js +85 -0
  511. package/dist/extensions/mcp/config.js.map +1 -0
  512. package/dist/extensions/mcp/index.d.ts +18 -0
  513. package/dist/extensions/mcp/index.d.ts.map +1 -0
  514. package/dist/extensions/mcp/index.js +95 -0
  515. package/dist/extensions/mcp/index.js.map +1 -0
  516. package/dist/index.d.ts +35 -0
  517. package/dist/index.d.ts.map +1 -0
  518. package/dist/index.js +69874 -0
  519. package/dist/index.js.map +1 -0
  520. package/dist/main.d.ts +12 -0
  521. package/dist/main.d.ts.map +1 -0
  522. package/dist/main.js +792 -0
  523. package/dist/main.js.map +1 -0
  524. package/dist/migrations.d.ts +33 -0
  525. package/dist/migrations.d.ts.map +1 -0
  526. package/dist/migrations.js +281 -0
  527. package/dist/migrations.js.map +1 -0
  528. package/dist/modes/index.d.ts +10 -0
  529. package/dist/modes/index.d.ts.map +1 -0
  530. package/dist/modes/index.js +8 -0
  531. package/dist/modes/index.js.map +1 -0
  532. package/dist/modes/interactive/components/assistant-message.d.ts +32 -0
  533. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  534. package/dist/modes/interactive/components/assistant-message.js +177 -0
  535. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  536. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  537. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  538. package/dist/modes/interactive/components/bash-execution.js +175 -0
  539. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  540. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  541. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  542. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  543. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  544. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  545. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  546. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  547. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  548. package/dist/modes/interactive/components/command-palette.d.ts +12 -0
  549. package/dist/modes/interactive/components/command-palette.d.ts.map +1 -0
  550. package/dist/modes/interactive/components/command-palette.js +67 -0
  551. package/dist/modes/interactive/components/command-palette.js.map +1 -0
  552. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  553. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  554. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  555. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  556. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  557. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  558. package/dist/modes/interactive/components/config-selector.js +761 -0
  559. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  560. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  561. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  562. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  563. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  564. package/dist/modes/interactive/components/custom-editor.d.ts +23 -0
  565. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  566. package/dist/modes/interactive/components/custom-editor.js +85 -0
  567. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  568. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  569. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  570. package/dist/modes/interactive/components/custom-entry.js +52 -0
  571. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  572. package/dist/modes/interactive/components/custom-message.d.ts +22 -0
  573. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  574. package/dist/modes/interactive/components/custom-message.js +87 -0
  575. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  576. package/dist/modes/interactive/components/dialog-frame.d.ts +37 -0
  577. package/dist/modes/interactive/components/dialog-frame.d.ts.map +1 -0
  578. package/dist/modes/interactive/components/dialog-frame.js +53 -0
  579. package/dist/modes/interactive/components/dialog-frame.js.map +1 -0
  580. package/dist/modes/interactive/components/diff.d.ts +12 -0
  581. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  582. package/dist/modes/interactive/components/diff.js +133 -0
  583. package/dist/modes/interactive/components/diff.js.map +1 -0
  584. package/dist/modes/interactive/components/dynamic-border.d.ts +19 -0
  585. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  586. package/dist/modes/interactive/components/dynamic-border.js +36 -0
  587. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  588. package/dist/modes/interactive/components/extension-editor.d.ts +21 -0
  589. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  590. package/dist/modes/interactive/components/extension-editor.js +98 -0
  591. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  592. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  593. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/extension-input.js +61 -0
  595. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  596. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  597. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/extension-selector.js +83 -0
  599. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  600. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  601. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  603. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  604. package/dist/modes/interactive/components/footer.d.ts +30 -0
  605. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/footer.js +108 -0
  607. package/dist/modes/interactive/components/footer.js.map +1 -0
  608. package/dist/modes/interactive/components/graph-rail.d.ts +44 -0
  609. package/dist/modes/interactive/components/graph-rail.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/graph-rail.js +332 -0
  611. package/dist/modes/interactive/components/graph-rail.js.map +1 -0
  612. package/dist/modes/interactive/components/index.d.ts +33 -0
  613. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/index.js +34 -0
  615. package/dist/modes/interactive/components/index.js.map +1 -0
  616. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  617. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  619. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  620. package/dist/modes/interactive/components/landing-panel.d.ts +14 -0
  621. package/dist/modes/interactive/components/landing-panel.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/landing-panel.js +141 -0
  623. package/dist/modes/interactive/components/landing-panel.js.map +1 -0
  624. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  625. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/login-dialog.js +188 -0
  627. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  628. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  629. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  631. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  632. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  633. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/mermaid.js +80 -0
  635. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  636. package/dist/modes/interactive/components/message-layout.d.ts +4 -0
  637. package/dist/modes/interactive/components/message-layout.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/message-layout.js +4 -0
  639. package/dist/modes/interactive/components/message-layout.js.map +1 -0
  640. package/dist/modes/interactive/components/model-selector.d.ts +54 -0
  641. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/model-selector.js +325 -0
  643. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  644. package/dist/modes/interactive/components/nexus-logo.d.ts +25 -0
  645. package/dist/modes/interactive/components/nexus-logo.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/nexus-logo.js +115 -0
  647. package/dist/modes/interactive/components/nexus-logo.js.map +1 -0
  648. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  649. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  651. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  652. package/dist/modes/interactive/components/panel.d.ts +7 -0
  653. package/dist/modes/interactive/components/panel.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/panel.js +18 -0
  655. package/dist/modes/interactive/components/panel.js.map +1 -0
  656. package/dist/modes/interactive/components/response-separator.d.ts +13 -0
  657. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/response-separator.js +23 -0
  659. package/dist/modes/interactive/components/response-separator.js.map +1 -0
  660. package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
  661. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/scoped-models-selector.js +328 -0
  663. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  664. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  665. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  667. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  668. package/dist/modes/interactive/components/session-selector.d.ts +99 -0
  669. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/session-selector.js +887 -0
  671. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  672. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  673. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/settings-selector.js +613 -0
  675. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  677. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  679. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  680. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  681. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  683. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  684. package/dist/modes/interactive/components/status-indicator.d.ts +37 -0
  685. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/status-indicator.js +116 -0
  687. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  688. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  689. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/theme-selector.js +50 -0
  691. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  693. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  695. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  696. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  697. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/tool-execution.js +384 -0
  699. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  700. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  701. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  703. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  704. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  705. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/trust-selector.js +91 -0
  707. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  709. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  711. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/user-message.d.ts +17 -0
  713. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/user-message.js +51 -0
  715. package/dist/modes/interactive/components/user-message.js.map +1 -0
  716. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  717. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  719. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  720. package/dist/modes/interactive/external-editor.d.ts +12 -0
  721. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  722. package/dist/modes/interactive/external-editor.js +37 -0
  723. package/dist/modes/interactive/external-editor.js.map +1 -0
  724. package/dist/modes/interactive/interactive-mode.d.ts +436 -0
  725. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  726. package/dist/modes/interactive/interactive-mode.js +5462 -0
  727. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  728. package/dist/modes/interactive/model-search.d.ts +12 -0
  729. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  730. package/dist/modes/interactive/model-search.js +15 -0
  731. package/dist/modes/interactive/model-search.js.map +1 -0
  732. package/dist/modes/interactive/theme/brand.d.ts +38 -0
  733. package/dist/modes/interactive/theme/brand.d.ts.map +1 -0
  734. package/dist/modes/interactive/theme/brand.js +108 -0
  735. package/dist/modes/interactive/theme/brand.js.map +1 -0
  736. package/dist/modes/interactive/theme/catppuccin-mocha.json +66 -0
  737. package/dist/modes/interactive/theme/dark.json +93 -0
  738. package/dist/modes/interactive/theme/dracula.json +66 -0
  739. package/dist/modes/interactive/theme/ember.json +85 -0
  740. package/dist/modes/interactive/theme/gruvbox.json +66 -0
  741. package/dist/modes/interactive/theme/light.json +91 -0
  742. package/dist/modes/interactive/theme/nord.json +66 -0
  743. package/dist/modes/interactive/theme/theme-controller.d.ts +32 -0
  744. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  745. package/dist/modes/interactive/theme/theme-controller.js +111 -0
  746. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  747. package/dist/modes/interactive/theme/theme-schema.json +344 -0
  748. package/dist/modes/interactive/theme/theme.d.ts +129 -0
  749. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  750. package/dist/modes/interactive/theme/theme.js +1101 -0
  751. package/dist/modes/interactive/theme/theme.js.map +1 -0
  752. package/dist/modes/interactive/theme/tokyonight.json +66 -0
  753. package/dist/modes/json-event.d.ts +28 -0
  754. package/dist/modes/json-event.d.ts.map +1 -0
  755. package/dist/modes/json-event.js +12 -0
  756. package/dist/modes/json-event.js.map +1 -0
  757. package/dist/modes/print-mode.d.ts +28 -0
  758. package/dist/modes/print-mode.d.ts.map +1 -0
  759. package/dist/modes/print-mode.js +153 -0
  760. package/dist/modes/print-mode.js.map +1 -0
  761. package/dist/modes/rpc/jsonl.d.ts +17 -0
  762. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  763. package/dist/modes/rpc/jsonl.js +49 -0
  764. package/dist/modes/rpc/jsonl.js.map +1 -0
  765. package/dist/modes/rpc/rpc-client.d.ts +247 -0
  766. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  767. package/dist/modes/rpc/rpc-client.js +488 -0
  768. package/dist/modes/rpc/rpc-client.js.map +1 -0
  769. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  770. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  771. package/dist/modes/rpc/rpc-mode.js +654 -0
  772. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  773. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  774. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  775. package/dist/modes/rpc/rpc-types.js +8 -0
  776. package/dist/modes/rpc/rpc-types.js.map +1 -0
  777. package/dist/package-manager-cli.d.ts +8 -0
  778. package/dist/package-manager-cli.d.ts.map +1 -0
  779. package/dist/package-manager-cli.js +777 -0
  780. package/dist/package-manager-cli.js.map +1 -0
  781. package/dist/rpc-entry.d.ts +3 -0
  782. package/dist/rpc-entry.d.ts.map +1 -0
  783. package/dist/rpc-entry.js +69740 -0
  784. package/dist/rpc-entry.js.map +1 -0
  785. package/dist/utils/abort.d.ts +5 -0
  786. package/dist/utils/abort.d.ts.map +1 -0
  787. package/dist/utils/abort.js +48 -0
  788. package/dist/utils/abort.js.map +1 -0
  789. package/dist/utils/ansi.d.ts +2 -0
  790. package/dist/utils/ansi.d.ts.map +1 -0
  791. package/dist/utils/ansi.js +52 -0
  792. package/dist/utils/ansi.js.map +1 -0
  793. package/dist/utils/child-process.d.ts +18 -0
  794. package/dist/utils/child-process.d.ts.map +1 -0
  795. package/dist/utils/child-process.js +106 -0
  796. package/dist/utils/child-process.js.map +1 -0
  797. package/dist/utils/clipboard-image.d.ts +11 -0
  798. package/dist/utils/clipboard-image.d.ts.map +1 -0
  799. package/dist/utils/clipboard-image.js +245 -0
  800. package/dist/utils/clipboard-image.js.map +1 -0
  801. package/dist/utils/clipboard-native.d.ts +11 -0
  802. package/dist/utils/clipboard-native.d.ts.map +1 -0
  803. package/dist/utils/clipboard-native.js +20 -0
  804. package/dist/utils/clipboard-native.js.map +1 -0
  805. package/dist/utils/clipboard.d.ts +4 -0
  806. package/dist/utils/clipboard.d.ts.map +1 -0
  807. package/dist/utils/clipboard.js +161 -0
  808. package/dist/utils/clipboard.js.map +1 -0
  809. package/dist/utils/deprecation.d.ts +4 -0
  810. package/dist/utils/deprecation.d.ts.map +1 -0
  811. package/dist/utils/deprecation.js +13 -0
  812. package/dist/utils/deprecation.js.map +1 -0
  813. package/dist/utils/exif-orientation.d.ts +5 -0
  814. package/dist/utils/exif-orientation.d.ts.map +1 -0
  815. package/dist/utils/exif-orientation.js +158 -0
  816. package/dist/utils/exif-orientation.js.map +1 -0
  817. package/dist/utils/frontmatter.d.ts +8 -0
  818. package/dist/utils/frontmatter.d.ts.map +1 -0
  819. package/dist/utils/frontmatter.js +26 -0
  820. package/dist/utils/frontmatter.js.map +1 -0
  821. package/dist/utils/fs-watch.d.ts +5 -0
  822. package/dist/utils/fs-watch.d.ts.map +1 -0
  823. package/dist/utils/fs-watch.js +25 -0
  824. package/dist/utils/fs-watch.js.map +1 -0
  825. package/dist/utils/git.d.ts +26 -0
  826. package/dist/utils/git.d.ts.map +1 -0
  827. package/dist/utils/git.js +195 -0
  828. package/dist/utils/git.js.map +1 -0
  829. package/dist/utils/html.d.ts +7 -0
  830. package/dist/utils/html.d.ts.map +1 -0
  831. package/dist/utils/html.js +40 -0
  832. package/dist/utils/html.js.map +1 -0
  833. package/dist/utils/image-convert.d.ts +10 -0
  834. package/dist/utils/image-convert.d.ts.map +1 -0
  835. package/dist/utils/image-convert.js +45 -0
  836. package/dist/utils/image-convert.js.map +1 -0
  837. package/dist/utils/image-process.d.ts +18 -0
  838. package/dist/utils/image-process.d.ts.map +1 -0
  839. package/dist/utils/image-process.js +83 -0
  840. package/dist/utils/image-process.js.map +1 -0
  841. package/dist/utils/image-resize-core.d.ts +30 -0
  842. package/dist/utils/image-resize-core.d.ts.map +1 -0
  843. package/dist/utils/image-resize-core.js +124 -0
  844. package/dist/utils/image-resize-core.js.map +1 -0
  845. package/dist/utils/image-resize-worker.d.ts +2 -0
  846. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  847. package/dist/utils/image-resize-worker.js +31 -0
  848. package/dist/utils/image-resize-worker.js.map +1 -0
  849. package/dist/utils/image-resize.d.ts +16 -0
  850. package/dist/utils/image-resize.d.ts.map +1 -0
  851. package/dist/utils/image-resize.js +97 -0
  852. package/dist/utils/image-resize.js.map +1 -0
  853. package/dist/utils/json.d.ts +3 -0
  854. package/dist/utils/json.d.ts.map +1 -0
  855. package/dist/utils/json.js +7 -0
  856. package/dist/utils/json.js.map +1 -0
  857. package/dist/utils/management-http.d.ts +23 -0
  858. package/dist/utils/management-http.d.ts.map +1 -0
  859. package/dist/utils/management-http.js +50 -0
  860. package/dist/utils/management-http.js.map +1 -0
  861. package/dist/utils/mime.d.ts +3 -0
  862. package/dist/utils/mime.d.ts.map +1 -0
  863. package/dist/utils/mime.js +110 -0
  864. package/dist/utils/mime.js.map +1 -0
  865. package/dist/utils/open-browser.d.ts +9 -0
  866. package/dist/utils/open-browser.d.ts.map +1 -0
  867. package/dist/utils/open-browser.js +22 -0
  868. package/dist/utils/open-browser.js.map +1 -0
  869. package/dist/utils/paths.d.ts +34 -0
  870. package/dist/utils/paths.d.ts.map +1 -0
  871. package/dist/utils/paths.js +114 -0
  872. package/dist/utils/paths.js.map +1 -0
  873. package/dist/utils/photon.d.ts +21 -0
  874. package/dist/utils/photon.d.ts.map +1 -0
  875. package/dist/utils/photon.js +121 -0
  876. package/dist/utils/photon.js.map +1 -0
  877. package/dist/utils/pi-user-agent.d.ts +2 -0
  878. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  879. package/dist/utils/pi-user-agent.js +5 -0
  880. package/dist/utils/pi-user-agent.js.map +1 -0
  881. package/dist/utils/shell.d.ts +31 -0
  882. package/dist/utils/shell.d.ts.map +1 -0
  883. package/dist/utils/shell.js +202 -0
  884. package/dist/utils/shell.js.map +1 -0
  885. package/dist/utils/sleep.d.ts +5 -0
  886. package/dist/utils/sleep.d.ts.map +1 -0
  887. package/dist/utils/sleep.js +17 -0
  888. package/dist/utils/sleep.js.map +1 -0
  889. package/dist/utils/syntax-highlight.d.ts +12 -0
  890. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  891. package/dist/utils/syntax-highlight.js +118 -0
  892. package/dist/utils/syntax-highlight.js.map +1 -0
  893. package/dist/utils/tool-result-images.d.ts +19 -0
  894. package/dist/utils/tool-result-images.d.ts.map +1 -0
  895. package/dist/utils/tool-result-images.js +45 -0
  896. package/dist/utils/tool-result-images.js.map +1 -0
  897. package/dist/utils/tools-manager.d.ts +3 -0
  898. package/dist/utils/tools-manager.d.ts.map +1 -0
  899. package/dist/utils/tools-manager.js +326 -0
  900. package/dist/utils/tools-manager.js.map +1 -0
  901. package/dist/utils/version-check.d.ts +19 -0
  902. package/dist/utils/version-check.d.ts.map +1 -0
  903. package/dist/utils/version-check.js +98 -0
  904. package/dist/utils/version-check.js.map +1 -0
  905. package/dist/utils/windows-self-update.d.ts +3 -0
  906. package/dist/utils/windows-self-update.d.ts.map +1 -0
  907. package/dist/utils/windows-self-update.js +77 -0
  908. package/dist/utils/windows-self-update.js.map +1 -0
  909. package/docs/compaction.md +401 -0
  910. package/docs/containerization.md +111 -0
  911. package/docs/custom-provider.md +774 -0
  912. package/docs/development.md +71 -0
  913. package/docs/docs.json +156 -0
  914. package/docs/environment-variables.md +98 -0
  915. package/docs/extensions.md +2987 -0
  916. package/docs/images/doom-extension.png +0 -0
  917. package/docs/images/exy.png +0 -0
  918. package/docs/images/interactive-mode.png +0 -0
  919. package/docs/images/tree-view.png +0 -0
  920. package/docs/index.md +84 -0
  921. package/docs/json.md +91 -0
  922. package/docs/keybindings.md +226 -0
  923. package/docs/llama-cpp.md +99 -0
  924. package/docs/models.md +565 -0
  925. package/docs/packages.md +228 -0
  926. package/docs/prompt-templates.md +96 -0
  927. package/docs/providers.md +310 -0
  928. package/docs/quickstart.md +167 -0
  929. package/docs/rpc.md +1578 -0
  930. package/docs/sdk.md +1205 -0
  931. package/docs/security.md +59 -0
  932. package/docs/session-format.md +438 -0
  933. package/docs/sessions.md +145 -0
  934. package/docs/settings.md +322 -0
  935. package/docs/shell-aliases.md +13 -0
  936. package/docs/skills.md +231 -0
  937. package/docs/terminal-setup.md +142 -0
  938. package/docs/termux.md +127 -0
  939. package/docs/themes.md +299 -0
  940. package/docs/tmux.md +63 -0
  941. package/docs/tui.md +942 -0
  942. package/docs/usage.md +305 -0
  943. package/docs/windows.md +17 -0
  944. package/examples/README.md +25 -0
  945. package/examples/extensions/README.md +213 -0
  946. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  947. package/examples/extensions/bash-spawn-hook.ts +30 -0
  948. package/examples/extensions/bookmark.ts +50 -0
  949. package/examples/extensions/border-status-editor.ts +150 -0
  950. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  951. package/examples/extensions/claude-rules.ts +86 -0
  952. package/examples/extensions/commands.ts +72 -0
  953. package/examples/extensions/confirm-destructive.ts +59 -0
  954. package/examples/extensions/custom-compaction.ts +117 -0
  955. package/examples/extensions/custom-footer.ts +64 -0
  956. package/examples/extensions/custom-header.ts +73 -0
  957. package/examples/extensions/custom-provider-anthropic/index.ts +611 -0
  958. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  959. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  960. package/examples/extensions/custom-provider-gitlab-duo/index.ts +405 -0
  961. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  962. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  963. package/examples/extensions/dirty-repo-guard.ts +56 -0
  964. package/examples/extensions/doom-overlay/README.md +46 -0
  965. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  966. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  967. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  968. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  969. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  970. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  971. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  972. package/examples/extensions/doom-overlay/index.ts +74 -0
  973. package/examples/extensions/doom-overlay/wad-finder.ts +55 -0
  974. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  975. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  976. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  977. package/examples/extensions/dynamic-resources/index.ts +15 -0
  978. package/examples/extensions/dynamic-tools.ts +74 -0
  979. package/examples/extensions/entry-renderer.ts +41 -0
  980. package/examples/extensions/event-bus.ts +43 -0
  981. package/examples/extensions/file-trigger.ts +41 -0
  982. package/examples/extensions/git-checkpoint.ts +53 -0
  983. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  984. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  985. package/examples/extensions/gondolin/index.ts +531 -0
  986. package/examples/extensions/gondolin/package-lock.json +185 -0
  987. package/examples/extensions/gondolin/package.json +19 -0
  988. package/examples/extensions/handoff.ts +190 -0
  989. package/examples/extensions/hello.ts +26 -0
  990. package/examples/extensions/hidden-thinking-label.ts +53 -0
  991. package/examples/extensions/inline-bash.ts +94 -0
  992. package/examples/extensions/input-transform-streaming.ts +39 -0
  993. package/examples/extensions/input-transform.ts +43 -0
  994. package/examples/extensions/interactive-shell.ts +196 -0
  995. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  996. package/examples/extensions/mac-system-theme.ts +47 -0
  997. package/examples/extensions/message-renderer.ts +59 -0
  998. package/examples/extensions/minimal-mode.ts +426 -0
  999. package/examples/extensions/modal-editor.ts +85 -0
  1000. package/examples/extensions/model-status.ts +31 -0
  1001. package/examples/extensions/notify.ts +55 -0
  1002. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  1003. package/examples/extensions/overlay-test.ts +153 -0
  1004. package/examples/extensions/permission-gate.ts +34 -0
  1005. package/examples/extensions/pirate.ts +47 -0
  1006. package/examples/extensions/plan-mode/README.md +66 -0
  1007. package/examples/extensions/plan-mode/index.ts +390 -0
  1008. package/examples/extensions/plan-mode/utils.ts +168 -0
  1009. package/examples/extensions/preset.ts +436 -0
  1010. package/examples/extensions/project-trust.ts +64 -0
  1011. package/examples/extensions/prompt-customizer.ts +97 -0
  1012. package/examples/extensions/protected-paths.ts +30 -0
  1013. package/examples/extensions/provider-payload.ts +18 -0
  1014. package/examples/extensions/qna.ts +118 -0
  1015. package/examples/extensions/question.ts +286 -0
  1016. package/examples/extensions/questionnaire.ts +448 -0
  1017. package/examples/extensions/rainbow-editor.ts +88 -0
  1018. package/examples/extensions/reload-runtime.ts +37 -0
  1019. package/examples/extensions/rpc-demo.ts +118 -0
  1020. package/examples/extensions/sandbox/index.ts +321 -0
  1021. package/examples/extensions/sandbox/package-lock.json +92 -0
  1022. package/examples/extensions/sandbox/package.json +19 -0
  1023. package/examples/extensions/send-user-message.ts +97 -0
  1024. package/examples/extensions/session-name.ts +27 -0
  1025. package/examples/extensions/shutdown-command.ts +63 -0
  1026. package/examples/extensions/snake.ts +343 -0
  1027. package/examples/extensions/space-invaders.ts +560 -0
  1028. package/examples/extensions/ssh.ts +220 -0
  1029. package/examples/extensions/status-line.ts +32 -0
  1030. package/examples/extensions/structured-output.ts +65 -0
  1031. package/examples/extensions/subagent/README.md +175 -0
  1032. package/examples/extensions/subagent/agents/planner.md +37 -0
  1033. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1034. package/examples/extensions/subagent/agents/scout.md +50 -0
  1035. package/examples/extensions/subagent/agents/worker.md +24 -0
  1036. package/examples/extensions/subagent/agents.ts +126 -0
  1037. package/examples/extensions/subagent/index.ts +1015 -0
  1038. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1039. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1040. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1041. package/examples/extensions/summarize.ts +199 -0
  1042. package/examples/extensions/system-prompt-header.ts +17 -0
  1043. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1044. package/examples/extensions/timed-confirm.ts +70 -0
  1045. package/examples/extensions/titlebar-spinner.ts +58 -0
  1046. package/examples/extensions/todo.ts +297 -0
  1047. package/examples/extensions/tool-override.ts +144 -0
  1048. package/examples/extensions/tools.ts +146 -0
  1049. package/examples/extensions/trigger-compact.ts +50 -0
  1050. package/examples/extensions/truncated-tool.ts +195 -0
  1051. package/examples/extensions/widget-placement.ts +9 -0
  1052. package/examples/extensions/with-deps/index.ts +32 -0
  1053. package/examples/extensions/with-deps/package-lock.json +31 -0
  1054. package/examples/extensions/with-deps/package.json +22 -0
  1055. package/examples/extensions/working-indicator.ts +123 -0
  1056. package/examples/extensions/working-message-test.ts +25 -0
  1057. package/examples/rpc-extension-ui.ts +641 -0
  1058. package/examples/sdk/01-minimal.ts +26 -0
  1059. package/examples/sdk/02-custom-model.ts +49 -0
  1060. package/examples/sdk/03-custom-prompt.ts +75 -0
  1061. package/examples/sdk/04-skills.ts +55 -0
  1062. package/examples/sdk/05-tools.ts +48 -0
  1063. package/examples/sdk/06-extensions.ts +99 -0
  1064. package/examples/sdk/07-context-files.ts +47 -0
  1065. package/examples/sdk/08-prompt-templates.ts +51 -0
  1066. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1067. package/examples/sdk/10-settings.ts +53 -0
  1068. package/examples/sdk/11-sessions.ts +52 -0
  1069. package/examples/sdk/12-full-control.ts +74 -0
  1070. package/examples/sdk/13-session-runtime.ts +67 -0
  1071. package/examples/sdk/README.md +140 -0
  1072. package/npm-shrinkwrap.json +1817 -0
  1073. package/package.json +145 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/gitnexus/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { graphRailStore } from \"../../core/graph-rail-store.ts\";\nimport { openBrowser } from \"../../utils/open-browser.ts\";\nimport { registerAugmentedGrep } from \"./augment.ts\";\nimport { registerChangeTracking } from \"./changes.ts\";\nimport { GitNexusClient, GitNexusClientError } from \"./client.ts\";\nimport { DEFAULT_HUB_URL, resolveGitNexusConfig, saveGitNexusConfig } from \"./config.ts\";\nimport { defaultDeviceName, deviceFingerprint, pollDeviceAuth, startDeviceAuth } from \"./device-auth.ts\";\nimport { readGatewayCache, registerAutoProvider } from \"./gateway.ts\";\nimport { spawnObservatoryFetch } from \"./observatory.ts\";\nimport { buildGitNexusPrompt } from \"./prompt.ts\";\nimport { withGitNexusRenderer } from \"./render.ts\";\nimport {\n\tgitRemoteSlug,\n\ttype IndexedRepo,\n\tmatchCurrentRepo,\n\tparseRepoInventory,\n\ttype RepoInventory,\n} from \"./resolve.ts\";\nimport { createGitNexusTools } from \"./tools.ts\";\n\n/** Resolve workflow skills in source mode and bundled dist/cli.js mode. */\nexport function resolveGitNexusSkillsDir(\n\tmoduleUrl: string = import.meta.url,\n\tpathExists: (path: string) => boolean = existsSync,\n): string | undefined {\n\tconst candidates = [\n\t\tfileURLToPath(new URL(\"./skills/\", moduleUrl)),\n\t\tfileURLToPath(new URL(\"./extensions/gitnexus/skills/\", moduleUrl)),\n\t];\n\treturn candidates.find(pathExists);\n}\n\n/**\n * GitNexus built-in extension: connects nexus-cli to the GitNexus hub.\n *\n * - session_start: resolve config + repo inventory, register the six graph\n * tools and the augmented grep. No token / hub down / repo unindexed all\n * degrade to a plain coding agent (graph is additive, never load-bearing).\n * - before_agent_start: append the GitNexus guidance block (ported from the\n * CLAUDE.md generator) to the system prompt.\n */\nexport default function gitnexusExtension(pi: ExtensionAPI): void {\n\tlet inventory: RepoInventory | undefined;\n\tlet current: IndexedRepo | undefined;\n\tlet activeClient: GitNexusClient | undefined;\n\tlet toolsRegistered = false;\n\tlet startupNotice: string | undefined;\n\tlet loginRequired = false;\n\n\tconst cwd = process.cwd();\n\n\t// Auto mode must also register at factory time: the initial model is\n\t// resolved before session_start fires, and a provider that appears after\n\t// that is invisible to it. Reads the policy cache the startup gate wrote.\n\tregisterAutoProvider(pi, resolveGitNexusConfig(), readGatewayCache());\n\n\t// Built-in tool overrides must happen at factory time (like the bash-spawn-hook\n\t// example) — session_start registrations only add NEW names reliably. The wrapper\n\t// behaves as plain grep until connect() provides a client + current repo.\n\tregisterAugmentedGrep(\n\t\tpi,\n\t\tcwd,\n\t\t() => activeClient,\n\t\t() => current?.name,\n\t);\n\tregisterChangeTracking(pi, cwd);\n\n\tasync function connect(): Promise<void> {\n\t\tinventory = undefined;\n\t\tcurrent = undefined;\n\t\tactiveClient = undefined;\n\t\tstartupNotice = undefined;\n\t\tloginRequired = false;\n\t\tconst config = resolveGitNexusConfig();\n\t\tif (!config) return;\n\t\tconst client = new GitNexusClient(config);\n\t\ttry {\n\t\t\tconst listResult = await client.callTool(\"list_repos\", {});\n\t\t\tinventory = parseRepoInventory(GitNexusClient.text(listResult));\n\t\t} catch (error) {\n\t\t\tconst reason = error instanceof GitNexusClientError ? error.message : String(error);\n\t\t\tif (error instanceof GitNexusClientError && error.kind === \"auth\") {\n\t\t\t\tloginRequired = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartupNotice = `GitNexus unavailable: ${reason}`;\n\t\t\treturn;\n\t\t}\n\n\t\tcurrent = matchCurrentRepo(inventory, gitRemoteSlug(cwd));\n\t\tactiveClient = client;\n\t\tgraphRailStore.setRepoList(inventory.repos.map((repo) => ({ name: repo.name, symbols: repo.symbols })));\n\t\t// Observatory (community map) rides a detached subprocess + temp-file\n\t\t// handoff — in-process hub calls made after startup can starve in some\n\t\t// environments, a fresh process never does. The UI picks the file up\n\t\t// lazily via tryLoadObservatoryCache.\n\t\tif (current) spawnObservatoryFetch(config, current.name);\n\t\tgraphRailStore.setRepo(\n\t\t\tcurrent\n\t\t\t\t? {\n\t\t\t\t\t\tname: current.name,\n\t\t\t\t\t\tsymbols: current.symbols,\n\t\t\t\t\t\trelationships: current.relationships,\n\t\t\t\t\t\tindexedAt: current.indexedAt,\n\t\t\t\t\t\trepoCount: inventory.repos.length,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tname: \"\",\n\t\t\t\t\t\tsymbols: \"0\",\n\t\t\t\t\t\trelationships: \"0\",\n\t\t\t\t\t\tindexedAt: \"\",\n\t\t\t\t\t\trepoCount: inventory.repos.length,\n\t\t\t\t\t},\n\t\t\tcurrent !== undefined,\n\t\t);\n\t\tif (!toolsRegistered) {\n\t\t\tconst ctx = { client, currentRepo: () => current?.name, cwd };\n\t\t\tfor (const tool of createGitNexusTools(ctx)) pi.registerTool(withGitNexusRenderer(tool));\n\t\t\ttoolsRegistered = true;\n\t\t}\n\n\t\tstartupNotice = current\n\t\t\t? `GitNexus: connected — ${current.name} (${current.symbols} symbols, indexed ${current.indexedAt}), ${inventory.repos.length} repos available.`\n\t\t\t: `GitNexus: connected — current directory is not indexed; ${inventory.repos.length} indexed repos remain queryable. Index this repo from the Hub dashboard to unlock local graph context.`;\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tawait connect();\n\t\tif (startupNotice) ctx.ui.notify(startupNotice, inventory ? \"info\" : \"warning\");\n\t});\n\n\t// Bundled GitNexus workflow skills (debugging, exploring, impact-analysis,\n\t// refactoring, pr-review, guide) — same SKILL.md content the Claude plugin\n\t// ships, adapted for hub-based indexing. Loaded on-demand by pi's skill system.\n\t// Skipped entirely when the user already has gitnexus skills (project or\n\t// global) so the startup screen doesn't report shadowed duplicates.\n\tpi.on(\"resources_discover\", (event) => {\n\t\tconst hasOwnGitnexusSkills =\n\t\t\texistsSync(join(event.cwd, \".agents\", \"skills\", \"gitnexus\")) ||\n\t\t\texistsSync(join(homedir(), \".agents\", \"skills\", \"gitnexus-debugging\"));\n\t\tif (hasOwnGitnexusSkills) return;\n\t\tconst skillsDir = resolveGitNexusSkillsDir();\n\t\tif (!skillsDir) return;\n\t\treturn { skillPaths: [skillsDir] };\n\t});\n\n\tpi.on(\"before_agent_start\", (event) => {\n\t\tif (!inventory) return;\n\t\treturn { systemPrompt: `${event.systemPrompt}\\n\\n${buildGitNexusPrompt(inventory, current)}` };\n\t});\n\n\tpi.registerCommand(\"gitnexus-login\", {\n\t\tdescription: \"Sign in to GitNexus (implementation of /login → GitNexus account; accepts a pasted token)\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst hubUrl = process.env.GITNEXUS_HUB_URL ?? DEFAULT_HUB_URL;\n\t\t\tconst pasted = args.trim();\n\n\t\t\t// Pasting a token stays supported for CI and headless installs.\n\t\t\tif (pasted) {\n\t\t\t\tawait new GitNexusClient({ hubUrl, token: pasted }).callTool(\"list_repos\", {});\n\t\t\t\tconst path = saveGitNexusConfig({ hubUrl, token: pasted });\n\t\t\t\tawait connect();\n\t\t\t\tctx.ui.notify(`GitNexus token saved to ${path}. ${startupNotice ?? \"\"}`, \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst deviceName = defaultDeviceName();\n\t\t\t\tconst fingerprint = deviceFingerprint();\n\t\t\t\tconst start = await startDeviceAuth(hubUrl, { deviceName, deviceFingerprint: fingerprint });\n\t\t\t\tconst link = start.verificationUrlComplete ?? start.verificationUrl;\n\t\t\t\t// The link carries the code, so an opened browser needs no typing.\n\t\t\t\t// Print it too: the launcher is best effort and can be headless.\n\t\t\t\tctx.ui.notify(`Code ${start.userCode} — opening ${link}`, \"info\");\n\t\t\t\topenBrowser(link);\n\n\t\t\t\tconst result = await pollDeviceAuth(hubUrl, start);\n\t\t\t\tconst config = {\n\t\t\t\t\thubUrl: result.hubUrl,\n\t\t\t\t\ttoken: result.token,\n\t\t\t\t\tdeviceFingerprint: fingerprint,\n\t\t\t\t\tdeviceName,\n\t\t\t\t};\n\t\t\t\tawait new GitNexusClient(config).callTool(\"list_repos\", {});\n\t\t\t\tconst path = saveGitNexusConfig(config);\n\t\t\t\tawait connect();\n\t\t\t\tctx.ui.notify(`Signed in. Token saved to ${path}. ${startupNotice ?? \"\"}`, \"info\");\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tctx.ui.notify(`GitNexus login failed: ${message}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.registerCommand(\"gitnexus-status\", {\n\t\tdescription: \"Show GitNexus connection status\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!inventory) {\n\t\t\t\tconst message = loginRequired\n\t\t\t\t\t? \"GitNexus session expired. Run /login to sign in again.\"\n\t\t\t\t\t: (startupNotice ?? \"GitNexus: not signed in. Run /login.\");\n\t\t\t\tctx.ui.notify(message, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst repoLine = current ? `current repo: ${current.name}` : \"current repo: not indexed\";\n\t\t\tctx.ui.notify(`GitNexus: connected — ${inventory.repos.length} repos, ${repoLine}`, \"info\");\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { GitNexusClient } from "./client.ts";
2
+ import type { GitNexusConfig } from "./config.ts";
3
+ /** Parse the hub cypher result: `{"markdown": "| a | b |\n| --- |...", "row_count": n}`. */
4
+ export declare function parseCypherRows(text: string): string[][];
5
+ export declare function fetchObservatory(client: GitNexusClient, repo: string): Promise<void>;
6
+ /**
7
+ * Fetch the observatory in a detached child process and hand the result over
8
+ * via a temp file (picked up lazily by the landing panel / rail). In-process
9
+ * hub calls issued after startup can starve behind the session's own HTTP
10
+ * machinery in some environments; a fresh process never does.
11
+ */
12
+ export declare function spawnObservatoryFetch(config: GitNexusConfig, repo: string): void;
13
+ //# sourceMappingURL=observatory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observatory.d.ts","sourceRoot":"","sources":["../../../src/extensions/gitnexus/observatory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkClD,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAiBxD;AAeD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B1F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAmBhF","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { appendFileSync } from \"node:fs\";\nimport { graphRailStore } from \"../../core/graph-rail-store.ts\";\nimport { observatoryCachePath } from \"../../core/observatory-cache.ts\";\nimport { GitNexusClient } from \"./client.ts\";\nimport type { GitNexusConfig } from \"./config.ts\";\n\nfunction trace(message: string): void {\n\tif (!process.env.NEXUS_TRACE) return;\n\ttry {\n\t\tappendFileSync(\"/tmp/nexus-observatory-trace.log\", `${new Date().toISOString()} ${message}\\n`);\n\t} catch {\n\t\t// tracing is best-effort\n\t}\n}\n\n/**\n * Startup graph observatory: fetches the community map of the current repo\n * (community sizes, cross-community call edges, flow count) and feeds the\n * rail store. Fire-and-forget — failures leave the observatory empty and\n * never surface to the user.\n */\n\nconst COMMUNITY_QUERY =\n\t\"MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) \" +\n\t\"RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8\";\n\nconst EDGE_QUERY =\n\t\"MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), \" +\n\t\"(b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), \" +\n\t\"(a)-[r:CodeRelation {type:'CALLS'}]->(b) \" +\n\t\"WHERE ca.heuristicLabel <> cb.heuristicLabel \" +\n\t\"RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight \" +\n\t\"ORDER BY weight DESC LIMIT 16\";\n\nconst FLOW_QUERY = \"MATCH (p:Process) RETURN count(p) AS flows\";\n\nconst TIMEOUT_MS = 20_000;\n\n/** Parse the hub cypher result: `{\"markdown\": \"| a | b |\\n| --- |...\", \"row_count\": n}`. */\nexport function parseCypherRows(text: string): string[][] {\n\tlet markdown: string;\n\ttry {\n\t\tconst parsed = JSON.parse(text.split(\"\\n\\n---\")[0]?.trim() ?? \"\") as { markdown?: string };\n\t\tif (typeof parsed.markdown !== \"string\") return [];\n\t\tmarkdown = parsed.markdown;\n\t} catch {\n\t\treturn [];\n\t}\n\tconst lines = markdown.split(\"\\n\").filter((line) => line.trim().startsWith(\"|\"));\n\t// Drop header + separator rows.\n\treturn lines.slice(2).map((line) =>\n\t\tline\n\t\t\t.split(\"|\")\n\t\t\t.slice(1, -1)\n\t\t\t.map((cell) => cell.trim()),\n\t);\n}\n\nasync function runQuery(client: GitNexusClient, repo: string, query: string, label: string): Promise<string[][]> {\n\tconst start = Date.now();\n\ttrace(`${label}: start`);\n\ttry {\n\t\tconst result = await client.callTool(\"cypher\", { query, repo }, AbortSignal.timeout(TIMEOUT_MS));\n\t\ttrace(`${label}: ok in ${Date.now() - start}ms`);\n\t\treturn parseCypherRows(GitNexusClient.text(result));\n\t} catch (error) {\n\t\ttrace(`${label}: failed in ${Date.now() - start}ms: ${String(error)}`);\n\t\tthrow error;\n\t}\n}\n\nexport async function fetchObservatory(client: GitNexusClient, repo: string): Promise<void> {\n\ttry {\n\t\ttrace(`fetching for ${repo}`);\n\t\t// Sequential on purpose: parallel POSTs against one hub MCP session stall\n\t\t// behind per-session serialization; three sequential cyphers finish in ~2s.\n\t\tconst communityRows = await runQuery(client, repo, COMMUNITY_QUERY, \"communities\");\n\t\tconst edgeRows = await runQuery(client, repo, EDGE_QUERY, \"edges\");\n\t\tconst flowRows = await runQuery(client, repo, FLOW_QUERY, \"flows\");\n\t\ttrace(`rows: communities=${communityRows.length} edges=${edgeRows.length} flows=${flowRows.length}`);\n\t\tconst communities = communityRows\n\t\t\t.filter((row) => row[0])\n\t\t\t.map((row) => ({ name: row[0], members: Number(row[1]) || 0 }));\n\t\tif (communities.length === 0) return;\n\t\tconst known = new Set(communities.map((c) => c.name));\n\t\tconst edges = edgeRows\n\t\t\t.filter((row) => row[0] && row[1] && known.has(row[0]) && known.has(row[1]))\n\t\t\t.map((row) => ({ source: row[0], target: row[1], weight: Number(row[2]) || 0 }));\n\t\tconst flowCount = Number(flowRows[0]?.[0]);\n\t\tgraphRailStore.setObservatory({\n\t\t\tcommunities,\n\t\t\tedges,\n\t\t\t...(Number.isNaN(flowCount) ? {} : { flowCount }),\n\t\t});\n\t} catch (error) {\n\t\t// observatory is cosmetic — startup must never depend on it\n\t\ttrace(`fetch failed: ${String(error)}`);\n\t}\n}\n\n/**\n * Fetch the observatory in a detached child process and hand the result over\n * via a temp file (picked up lazily by the landing panel / rail). In-process\n * hub calls issued after startup can starve behind the session's own HTTP\n * machinery in some environments; a fresh process never does.\n */\nexport function spawnObservatoryFetch(config: GitNexusConfig, repo: string): void {\n\ttry {\n\t\tconst script = buildFetchScript();\n\t\tconst child = spawn(process.execPath, [\"-e\", script], {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\tNEXUS_OBS_HUB_URL: config.hubUrl,\n\t\t\t\tNEXUS_OBS_TOKEN: config.token,\n\t\t\t\tNEXUS_OBS_REPO: repo,\n\t\t\t\tNEXUS_OBS_OUT: observatoryCachePath(repo),\n\t\t\t},\n\t\t});\n\t\tchild.unref();\n\t\ttrace(`spawned observatory fetcher pid=${child.pid ?? \"?\"} for ${repo}`);\n\t} catch (error) {\n\t\ttrace(`spawn failed: ${String(error)}`);\n\t}\n}\n\n/** Self-contained fetch script (plain node, no imports beyond fs). */\nfunction buildFetchScript(): string {\n\treturn `\nconst { writeFileSync } = require(\"node:fs\");\nconst hubUrl = process.env.NEXUS_OBS_HUB_URL;\nconst token = process.env.NEXUS_OBS_TOKEN;\nconst repo = process.env.NEXUS_OBS_REPO;\nconst out = process.env.NEXUS_OBS_OUT;\nlet sessionId;\nasync function post(body) {\n\tconst res = await fetch(hubUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"content-type\": \"application/json\",\n\t\t\taccept: \"application/json, text/event-stream\",\n\t\t\tauthorization: \"Bearer \" + token,\n\t\t\t...(sessionId ? { \"mcp-session-id\": sessionId } : {}),\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal: AbortSignal.timeout(20000),\n\t});\n\tconst sid = res.headers.get(\"mcp-session-id\");\n\tif (sid) sessionId = sid;\n\tconst text = await res.text();\n\tif (res.status === 202) return undefined;\n\tif (!res.ok) throw new Error(\"hub HTTP \" + res.status);\n\tif ((res.headers.get(\"content-type\") || \"\").includes(\"text/event-stream\")) {\n\t\tlet last;\n\t\tfor (const ev of text.split(\"\\\\n\\\\n\")) {\n\t\t\tconst data = ev.split(\"\\\\n\").filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).trim()).join(\"\\\\n\");\n\t\t\tif (!data) continue;\n\t\t\ttry { const p = JSON.parse(data); if (p.id !== undefined && p.id !== null) last = p; } catch {}\n\t\t}\n\t\treturn last;\n\t}\n\treturn text ? JSON.parse(text) : undefined;\n}\nlet nextId = 1;\nasync function call(name, args) {\n\tconst r = await post({ jsonrpc: \"2.0\", id: nextId++, method: \"tools/call\", params: { name, arguments: args } });\n\tif (!r || r.error) throw new Error(r && r.error ? r.error.message : \"empty response\");\n\tconst parts = (r.result && r.result.content) || [];\n\treturn parts.filter((p) => p.type === \"text\").map((p) => p.text).join(\"\\\\n\");\n}\nfunction rows(text) {\n\tlet md;\n\ttry { md = JSON.parse((text.split(\"\\\\n\\\\n---\")[0] || \"\").trim()).markdown; } catch { return []; }\n\tif (typeof md !== \"string\") return [];\n\tconst lines = md.split(\"\\\\n\").filter((l) => l.trim().startsWith(\"|\"));\n\treturn lines.slice(2).map((l) => l.split(\"|\").slice(1, -1).map((c) => c.trim()));\n}\n(async () => {\n\tawait post({ jsonrpc: \"2.0\", id: nextId++, method: \"initialize\", params: { protocolVersion: \"2025-06-18\", capabilities: {}, clientInfo: { name: \"nexus-observatory\", version: \"0.1.0\" } } });\n\tawait post({ jsonrpc: \"2.0\", method: \"notifications/initialized\" });\n\tconst communityRows = rows(await call(\"cypher\", { repo, query: \"MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8\" }));\n\tconst edgeRows = rows(await call(\"cypher\", { repo, query: \"MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), (b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), (a)-[r:CodeRelation {type:'CALLS'}]->(b) WHERE ca.heuristicLabel <> cb.heuristicLabel RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight ORDER BY weight DESC LIMIT 16\" }));\n\tconst flowRows = rows(await call(\"cypher\", { repo, query: \"MATCH (p:Process) RETURN count(p) AS flows\" }));\n\tconst communities = communityRows.filter((r) => r[0]).map((r) => ({ name: r[0], members: Number(r[1]) || 0 }));\n\tif (!communities.length) process.exit(0);\n\tconst known = new Set(communities.map((c) => c.name));\n\tconst edges = edgeRows.filter((r) => r[0] && r[1] && known.has(r[0]) && known.has(r[1])).map((r) => ({ source: r[0], target: r[1], weight: Number(r[2]) || 0 }));\n\tconst flowCount = Number(flowRows[0] && flowRows[0][0]);\n\tconst payload = { communities, edges, ...(Number.isNaN(flowCount) ? {} : { flowCount }), fetchedAt: Date.now() };\n\twriteFileSync(out, JSON.stringify(payload));\n\tprocess.exit(0);\n})().catch(() => process.exit(1));\n`;\n}\n"]}
@@ -0,0 +1,189 @@
1
+ import { spawn } from "node:child_process";
2
+ import { appendFileSync } from "node:fs";
3
+ import { graphRailStore } from "../../core/graph-rail-store.js";
4
+ import { observatoryCachePath } from "../../core/observatory-cache.js";
5
+ import { GitNexusClient } from "./client.js";
6
+ function trace(message) {
7
+ if (!process.env.NEXUS_TRACE)
8
+ return;
9
+ try {
10
+ appendFileSync("/tmp/nexus-observatory-trace.log", `${new Date().toISOString()} ${message}\n`);
11
+ }
12
+ catch {
13
+ // tracing is best-effort
14
+ }
15
+ }
16
+ /**
17
+ * Startup graph observatory: fetches the community map of the current repo
18
+ * (community sizes, cross-community call edges, flow count) and feeds the
19
+ * rail store. Fire-and-forget — failures leave the observatory empty and
20
+ * never surface to the user.
21
+ */
22
+ const COMMUNITY_QUERY = "MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) " +
23
+ "RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8";
24
+ const EDGE_QUERY = "MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), " +
25
+ "(b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), " +
26
+ "(a)-[r:CodeRelation {type:'CALLS'}]->(b) " +
27
+ "WHERE ca.heuristicLabel <> cb.heuristicLabel " +
28
+ "RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight " +
29
+ "ORDER BY weight DESC LIMIT 16";
30
+ const FLOW_QUERY = "MATCH (p:Process) RETURN count(p) AS flows";
31
+ const TIMEOUT_MS = 20_000;
32
+ /** Parse the hub cypher result: `{"markdown": "| a | b |\n| --- |...", "row_count": n}`. */
33
+ export function parseCypherRows(text) {
34
+ let markdown;
35
+ try {
36
+ const parsed = JSON.parse(text.split("\n\n---")[0]?.trim() ?? "");
37
+ if (typeof parsed.markdown !== "string")
38
+ return [];
39
+ markdown = parsed.markdown;
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ const lines = markdown.split("\n").filter((line) => line.trim().startsWith("|"));
45
+ // Drop header + separator rows.
46
+ return lines.slice(2).map((line) => line
47
+ .split("|")
48
+ .slice(1, -1)
49
+ .map((cell) => cell.trim()));
50
+ }
51
+ async function runQuery(client, repo, query, label) {
52
+ const start = Date.now();
53
+ trace(`${label}: start`);
54
+ try {
55
+ const result = await client.callTool("cypher", { query, repo }, AbortSignal.timeout(TIMEOUT_MS));
56
+ trace(`${label}: ok in ${Date.now() - start}ms`);
57
+ return parseCypherRows(GitNexusClient.text(result));
58
+ }
59
+ catch (error) {
60
+ trace(`${label}: failed in ${Date.now() - start}ms: ${String(error)}`);
61
+ throw error;
62
+ }
63
+ }
64
+ export async function fetchObservatory(client, repo) {
65
+ try {
66
+ trace(`fetching for ${repo}`);
67
+ // Sequential on purpose: parallel POSTs against one hub MCP session stall
68
+ // behind per-session serialization; three sequential cyphers finish in ~2s.
69
+ const communityRows = await runQuery(client, repo, COMMUNITY_QUERY, "communities");
70
+ const edgeRows = await runQuery(client, repo, EDGE_QUERY, "edges");
71
+ const flowRows = await runQuery(client, repo, FLOW_QUERY, "flows");
72
+ trace(`rows: communities=${communityRows.length} edges=${edgeRows.length} flows=${flowRows.length}`);
73
+ const communities = communityRows
74
+ .filter((row) => row[0])
75
+ .map((row) => ({ name: row[0], members: Number(row[1]) || 0 }));
76
+ if (communities.length === 0)
77
+ return;
78
+ const known = new Set(communities.map((c) => c.name));
79
+ const edges = edgeRows
80
+ .filter((row) => row[0] && row[1] && known.has(row[0]) && known.has(row[1]))
81
+ .map((row) => ({ source: row[0], target: row[1], weight: Number(row[2]) || 0 }));
82
+ const flowCount = Number(flowRows[0]?.[0]);
83
+ graphRailStore.setObservatory({
84
+ communities,
85
+ edges,
86
+ ...(Number.isNaN(flowCount) ? {} : { flowCount }),
87
+ });
88
+ }
89
+ catch (error) {
90
+ // observatory is cosmetic — startup must never depend on it
91
+ trace(`fetch failed: ${String(error)}`);
92
+ }
93
+ }
94
+ /**
95
+ * Fetch the observatory in a detached child process and hand the result over
96
+ * via a temp file (picked up lazily by the landing panel / rail). In-process
97
+ * hub calls issued after startup can starve behind the session's own HTTP
98
+ * machinery in some environments; a fresh process never does.
99
+ */
100
+ export function spawnObservatoryFetch(config, repo) {
101
+ try {
102
+ const script = buildFetchScript();
103
+ const child = spawn(process.execPath, ["-e", script], {
104
+ detached: true,
105
+ stdio: "ignore",
106
+ env: {
107
+ ...process.env,
108
+ NEXUS_OBS_HUB_URL: config.hubUrl,
109
+ NEXUS_OBS_TOKEN: config.token,
110
+ NEXUS_OBS_REPO: repo,
111
+ NEXUS_OBS_OUT: observatoryCachePath(repo),
112
+ },
113
+ });
114
+ child.unref();
115
+ trace(`spawned observatory fetcher pid=${child.pid ?? "?"} for ${repo}`);
116
+ }
117
+ catch (error) {
118
+ trace(`spawn failed: ${String(error)}`);
119
+ }
120
+ }
121
+ /** Self-contained fetch script (plain node, no imports beyond fs). */
122
+ function buildFetchScript() {
123
+ return `
124
+ const { writeFileSync } = require("node:fs");
125
+ const hubUrl = process.env.NEXUS_OBS_HUB_URL;
126
+ const token = process.env.NEXUS_OBS_TOKEN;
127
+ const repo = process.env.NEXUS_OBS_REPO;
128
+ const out = process.env.NEXUS_OBS_OUT;
129
+ let sessionId;
130
+ async function post(body) {
131
+ const res = await fetch(hubUrl, {
132
+ method: "POST",
133
+ headers: {
134
+ "content-type": "application/json",
135
+ accept: "application/json, text/event-stream",
136
+ authorization: "Bearer " + token,
137
+ ...(sessionId ? { "mcp-session-id": sessionId } : {}),
138
+ },
139
+ body: JSON.stringify(body),
140
+ signal: AbortSignal.timeout(20000),
141
+ });
142
+ const sid = res.headers.get("mcp-session-id");
143
+ if (sid) sessionId = sid;
144
+ const text = await res.text();
145
+ if (res.status === 202) return undefined;
146
+ if (!res.ok) throw new Error("hub HTTP " + res.status);
147
+ if ((res.headers.get("content-type") || "").includes("text/event-stream")) {
148
+ let last;
149
+ for (const ev of text.split("\\n\\n")) {
150
+ const data = ev.split("\\n").filter((l) => l.startsWith("data:")).map((l) => l.slice(5).trim()).join("\\n");
151
+ if (!data) continue;
152
+ try { const p = JSON.parse(data); if (p.id !== undefined && p.id !== null) last = p; } catch {}
153
+ }
154
+ return last;
155
+ }
156
+ return text ? JSON.parse(text) : undefined;
157
+ }
158
+ let nextId = 1;
159
+ async function call(name, args) {
160
+ const r = await post({ jsonrpc: "2.0", id: nextId++, method: "tools/call", params: { name, arguments: args } });
161
+ if (!r || r.error) throw new Error(r && r.error ? r.error.message : "empty response");
162
+ const parts = (r.result && r.result.content) || [];
163
+ return parts.filter((p) => p.type === "text").map((p) => p.text).join("\\n");
164
+ }
165
+ function rows(text) {
166
+ let md;
167
+ try { md = JSON.parse((text.split("\\n\\n---")[0] || "").trim()).markdown; } catch { return []; }
168
+ if (typeof md !== "string") return [];
169
+ const lines = md.split("\\n").filter((l) => l.trim().startsWith("|"));
170
+ return lines.slice(2).map((l) => l.split("|").slice(1, -1).map((c) => c.trim()));
171
+ }
172
+ (async () => {
173
+ await post({ jsonrpc: "2.0", id: nextId++, method: "initialize", params: { protocolVersion: "2025-06-18", capabilities: {}, clientInfo: { name: "nexus-observatory", version: "0.1.0" } } });
174
+ await post({ jsonrpc: "2.0", method: "notifications/initialized" });
175
+ const communityRows = rows(await call("cypher", { repo, query: "MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8" }));
176
+ const edgeRows = rows(await call("cypher", { repo, query: "MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), (b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), (a)-[r:CodeRelation {type:'CALLS'}]->(b) WHERE ca.heuristicLabel <> cb.heuristicLabel RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight ORDER BY weight DESC LIMIT 16" }));
177
+ const flowRows = rows(await call("cypher", { repo, query: "MATCH (p:Process) RETURN count(p) AS flows" }));
178
+ const communities = communityRows.filter((r) => r[0]).map((r) => ({ name: r[0], members: Number(r[1]) || 0 }));
179
+ if (!communities.length) process.exit(0);
180
+ const known = new Set(communities.map((c) => c.name));
181
+ const edges = edgeRows.filter((r) => r[0] && r[1] && known.has(r[0]) && known.has(r[1])).map((r) => ({ source: r[0], target: r[1], weight: Number(r[2]) || 0 }));
182
+ const flowCount = Number(flowRows[0] && flowRows[0][0]);
183
+ const payload = { communities, edges, ...(Number.isNaN(flowCount) ? {} : { flowCount }), fetchedAt: Date.now() };
184
+ writeFileSync(out, JSON.stringify(payload));
185
+ process.exit(0);
186
+ })().catch(() => process.exit(1));
187
+ `;
188
+ }
189
+ //# sourceMappingURL=observatory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observatory.js","sourceRoot":"","sources":["../../../src/extensions/gitnexus/observatory.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { appendFileSync } from \"node:fs\";\nimport { graphRailStore } from \"../../core/graph-rail-store.ts\";\nimport { observatoryCachePath } from \"../../core/observatory-cache.ts\";\nimport { GitNexusClient } from \"./client.ts\";\nimport type { GitNexusConfig } from \"./config.ts\";\n\nfunction trace(message: string): void {\n\tif (!process.env.NEXUS_TRACE) return;\n\ttry {\n\t\tappendFileSync(\"/tmp/nexus-observatory-trace.log\", `${new Date().toISOString()} ${message}\\n`);\n\t} catch {\n\t\t// tracing is best-effort\n\t}\n}\n\n/**\n * Startup graph observatory: fetches the community map of the current repo\n * (community sizes, cross-community call edges, flow count) and feeds the\n * rail store. Fire-and-forget — failures leave the observatory empty and\n * never surface to the user.\n */\n\nconst COMMUNITY_QUERY =\n\t\"MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) \" +\n\t\"RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8\";\n\nconst EDGE_QUERY =\n\t\"MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), \" +\n\t\"(b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), \" +\n\t\"(a)-[r:CodeRelation {type:'CALLS'}]->(b) \" +\n\t\"WHERE ca.heuristicLabel <> cb.heuristicLabel \" +\n\t\"RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight \" +\n\t\"ORDER BY weight DESC LIMIT 16\";\n\nconst FLOW_QUERY = \"MATCH (p:Process) RETURN count(p) AS flows\";\n\nconst TIMEOUT_MS = 20_000;\n\n/** Parse the hub cypher result: `{\"markdown\": \"| a | b |\\n| --- |...\", \"row_count\": n}`. */\nexport function parseCypherRows(text: string): string[][] {\n\tlet markdown: string;\n\ttry {\n\t\tconst parsed = JSON.parse(text.split(\"\\n\\n---\")[0]?.trim() ?? \"\") as { markdown?: string };\n\t\tif (typeof parsed.markdown !== \"string\") return [];\n\t\tmarkdown = parsed.markdown;\n\t} catch {\n\t\treturn [];\n\t}\n\tconst lines = markdown.split(\"\\n\").filter((line) => line.trim().startsWith(\"|\"));\n\t// Drop header + separator rows.\n\treturn lines.slice(2).map((line) =>\n\t\tline\n\t\t\t.split(\"|\")\n\t\t\t.slice(1, -1)\n\t\t\t.map((cell) => cell.trim()),\n\t);\n}\n\nasync function runQuery(client: GitNexusClient, repo: string, query: string, label: string): Promise<string[][]> {\n\tconst start = Date.now();\n\ttrace(`${label}: start`);\n\ttry {\n\t\tconst result = await client.callTool(\"cypher\", { query, repo }, AbortSignal.timeout(TIMEOUT_MS));\n\t\ttrace(`${label}: ok in ${Date.now() - start}ms`);\n\t\treturn parseCypherRows(GitNexusClient.text(result));\n\t} catch (error) {\n\t\ttrace(`${label}: failed in ${Date.now() - start}ms: ${String(error)}`);\n\t\tthrow error;\n\t}\n}\n\nexport async function fetchObservatory(client: GitNexusClient, repo: string): Promise<void> {\n\ttry {\n\t\ttrace(`fetching for ${repo}`);\n\t\t// Sequential on purpose: parallel POSTs against one hub MCP session stall\n\t\t// behind per-session serialization; three sequential cyphers finish in ~2s.\n\t\tconst communityRows = await runQuery(client, repo, COMMUNITY_QUERY, \"communities\");\n\t\tconst edgeRows = await runQuery(client, repo, EDGE_QUERY, \"edges\");\n\t\tconst flowRows = await runQuery(client, repo, FLOW_QUERY, \"flows\");\n\t\ttrace(`rows: communities=${communityRows.length} edges=${edgeRows.length} flows=${flowRows.length}`);\n\t\tconst communities = communityRows\n\t\t\t.filter((row) => row[0])\n\t\t\t.map((row) => ({ name: row[0], members: Number(row[1]) || 0 }));\n\t\tif (communities.length === 0) return;\n\t\tconst known = new Set(communities.map((c) => c.name));\n\t\tconst edges = edgeRows\n\t\t\t.filter((row) => row[0] && row[1] && known.has(row[0]) && known.has(row[1]))\n\t\t\t.map((row) => ({ source: row[0], target: row[1], weight: Number(row[2]) || 0 }));\n\t\tconst flowCount = Number(flowRows[0]?.[0]);\n\t\tgraphRailStore.setObservatory({\n\t\t\tcommunities,\n\t\t\tedges,\n\t\t\t...(Number.isNaN(flowCount) ? {} : { flowCount }),\n\t\t});\n\t} catch (error) {\n\t\t// observatory is cosmetic — startup must never depend on it\n\t\ttrace(`fetch failed: ${String(error)}`);\n\t}\n}\n\n/**\n * Fetch the observatory in a detached child process and hand the result over\n * via a temp file (picked up lazily by the landing panel / rail). In-process\n * hub calls issued after startup can starve behind the session's own HTTP\n * machinery in some environments; a fresh process never does.\n */\nexport function spawnObservatoryFetch(config: GitNexusConfig, repo: string): void {\n\ttry {\n\t\tconst script = buildFetchScript();\n\t\tconst child = spawn(process.execPath, [\"-e\", script], {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\tNEXUS_OBS_HUB_URL: config.hubUrl,\n\t\t\t\tNEXUS_OBS_TOKEN: config.token,\n\t\t\t\tNEXUS_OBS_REPO: repo,\n\t\t\t\tNEXUS_OBS_OUT: observatoryCachePath(repo),\n\t\t\t},\n\t\t});\n\t\tchild.unref();\n\t\ttrace(`spawned observatory fetcher pid=${child.pid ?? \"?\"} for ${repo}`);\n\t} catch (error) {\n\t\ttrace(`spawn failed: ${String(error)}`);\n\t}\n}\n\n/** Self-contained fetch script (plain node, no imports beyond fs). */\nfunction buildFetchScript(): string {\n\treturn `\nconst { writeFileSync } = require(\"node:fs\");\nconst hubUrl = process.env.NEXUS_OBS_HUB_URL;\nconst token = process.env.NEXUS_OBS_TOKEN;\nconst repo = process.env.NEXUS_OBS_REPO;\nconst out = process.env.NEXUS_OBS_OUT;\nlet sessionId;\nasync function post(body) {\n\tconst res = await fetch(hubUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"content-type\": \"application/json\",\n\t\t\taccept: \"application/json, text/event-stream\",\n\t\t\tauthorization: \"Bearer \" + token,\n\t\t\t...(sessionId ? { \"mcp-session-id\": sessionId } : {}),\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal: AbortSignal.timeout(20000),\n\t});\n\tconst sid = res.headers.get(\"mcp-session-id\");\n\tif (sid) sessionId = sid;\n\tconst text = await res.text();\n\tif (res.status === 202) return undefined;\n\tif (!res.ok) throw new Error(\"hub HTTP \" + res.status);\n\tif ((res.headers.get(\"content-type\") || \"\").includes(\"text/event-stream\")) {\n\t\tlet last;\n\t\tfor (const ev of text.split(\"\\\\n\\\\n\")) {\n\t\t\tconst data = ev.split(\"\\\\n\").filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).trim()).join(\"\\\\n\");\n\t\t\tif (!data) continue;\n\t\t\ttry { const p = JSON.parse(data); if (p.id !== undefined && p.id !== null) last = p; } catch {}\n\t\t}\n\t\treturn last;\n\t}\n\treturn text ? JSON.parse(text) : undefined;\n}\nlet nextId = 1;\nasync function call(name, args) {\n\tconst r = await post({ jsonrpc: \"2.0\", id: nextId++, method: \"tools/call\", params: { name, arguments: args } });\n\tif (!r || r.error) throw new Error(r && r.error ? r.error.message : \"empty response\");\n\tconst parts = (r.result && r.result.content) || [];\n\treturn parts.filter((p) => p.type === \"text\").map((p) => p.text).join(\"\\\\n\");\n}\nfunction rows(text) {\n\tlet md;\n\ttry { md = JSON.parse((text.split(\"\\\\n\\\\n---\")[0] || \"\").trim()).markdown; } catch { return []; }\n\tif (typeof md !== \"string\") return [];\n\tconst lines = md.split(\"\\\\n\").filter((l) => l.trim().startsWith(\"|\"));\n\treturn lines.slice(2).map((l) => l.split(\"|\").slice(1, -1).map((c) => c.trim()));\n}\n(async () => {\n\tawait post({ jsonrpc: \"2.0\", id: nextId++, method: \"initialize\", params: { protocolVersion: \"2025-06-18\", capabilities: {}, clientInfo: { name: \"nexus-observatory\", version: \"0.1.0\" } } });\n\tawait post({ jsonrpc: \"2.0\", method: \"notifications/initialized\" });\n\tconst communityRows = rows(await call(\"cypher\", { repo, query: \"MATCH (f)-[:CodeRelation {type:'MEMBER_OF'}]->(c:Community) RETURN c.heuristicLabel AS name, count(f) AS members ORDER BY members DESC LIMIT 8\" }));\n\tconst edgeRows = rows(await call(\"cypher\", { repo, query: \"MATCH (a)-[:CodeRelation {type:'MEMBER_OF'}]->(ca:Community), (b)-[:CodeRelation {type:'MEMBER_OF'}]->(cb:Community), (a)-[r:CodeRelation {type:'CALLS'}]->(b) WHERE ca.heuristicLabel <> cb.heuristicLabel RETURN ca.heuristicLabel AS source, cb.heuristicLabel AS target, count(r) AS weight ORDER BY weight DESC LIMIT 16\" }));\n\tconst flowRows = rows(await call(\"cypher\", { repo, query: \"MATCH (p:Process) RETURN count(p) AS flows\" }));\n\tconst communities = communityRows.filter((r) => r[0]).map((r) => ({ name: r[0], members: Number(r[1]) || 0 }));\n\tif (!communities.length) process.exit(0);\n\tconst known = new Set(communities.map((c) => c.name));\n\tconst edges = edgeRows.filter((r) => r[0] && r[1] && known.has(r[0]) && known.has(r[1])).map((r) => ({ source: r[0], target: r[1], weight: Number(r[2]) || 0 }));\n\tconst flowCount = Number(flowRows[0] && flowRows[0][0]);\n\tconst payload = { communities, edges, ...(Number.isNaN(flowCount) ? {} : { flowCount }), fetchedAt: Date.now() };\n\twriteFileSync(out, JSON.stringify(payload));\n\tprocess.exit(0);\n})().catch(() => process.exit(1));\n`;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { IndexedRepo, RepoInventory } from "./resolve.ts";
2
+ /**
3
+ * The always-on GitNexus guidance appended to the system prompt.
4
+ *
5
+ * Ported from what `gitnexus` writes into CLAUDE.md/AGENTS.md today
6
+ * (gitnexus/src/cli/ai-context.ts generateGitNexusContent) — same rules, made
7
+ * dynamic: live repo inventory, current-repo stats, snapshot caveat. Keep this
8
+ * in sync with the generator until both share a single template.
9
+ */
10
+ export declare function buildGitNexusPrompt(inventory: RepoInventory, current: IndexedRepo | undefined): string;
11
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/extensions/gitnexus/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAqDtG","sourcesContent":["import type { IndexedRepo, RepoInventory } from \"./resolve.ts\";\n\n/**\n * The always-on GitNexus guidance appended to the system prompt.\n *\n * Ported from what `gitnexus` writes into CLAUDE.md/AGENTS.md today\n * (gitnexus/src/cli/ai-context.ts generateGitNexusContent) — same rules, made\n * dynamic: live repo inventory, current-repo stats, snapshot caveat. Keep this\n * in sync with the generator until both share a single template.\n */\nexport function buildGitNexusPrompt(inventory: RepoInventory, current: IndexedRepo | undefined): string {\n\tconst lines: string[] = [];\n\tlines.push(\"# GitNexus — Code Intelligence\");\n\tlines.push(\"\");\n\tif (current) {\n\t\tlines.push(\n\t\t\t`The current repository is indexed by GitNexus as **${current.name}** ` +\n\t\t\t\t`(${current.symbols} symbols, ${current.relationships} relationships, indexed ${current.indexedAt}).`,\n\t\t);\n\t} else {\n\t\tlines.push(\n\t\t\t\"The current working directory is NOT indexed by GitNexus. Graph tools still work for the indexed repositories listed below (pass `repo` explicitly).\",\n\t\t);\n\t}\n\tlines.push(\n\t\t\"The graph is a snapshot from the indexed time — for files changed after that (including your own edits this session), verify with read/grep.\",\n\t);\n\tlines.push(\"\");\n\tconst repoList = inventory.repos.map((r) => (r.name === current?.name ? `${r.name} (current)` : r.name)).join(\", \");\n\tlines.push(`Indexed repositories you can query: ${repoList || \"(none)\"}.`);\n\tif (inventory.groups.length > 0) {\n\t\tlines.push(\n\t\t\t`Multi-repo groups (pass as repo for cross-repo queries): ${inventory.groups.map((g) => g.name).join(\", \")}.`,\n\t\t);\n\t}\n\tlines.push(\n\t\t\"Every gitnexus tool takes an optional `repo` — omit it for the current repo, or pass any name/@group above.\",\n\t);\n\tlines.push(\"\");\n\tlines.push(\"## Always\");\n\tlines.push(\n\t\t\"- Run `gitnexus_impact({target})` BEFORE modifying a function/class/method, and report the blast radius (direct callers, processes, risk) when it is HIGH or CRITICAL.\",\n\t);\n\tlines.push(\n\t\t\"- When exploring unfamiliar code, prefer `gitnexus_query` (execution flows, ranked) over blind grepping.\",\n\t);\n\tlines.push(\"- For full context on one symbol (callers, callees, flows), use `gitnexus_context`.\");\n\tlines.push(\"- Before committing, use `gitnexus_detect_changes` to map your diff to affected flows.\");\n\tlines.push(\"\");\n\tlines.push(\"## Never\");\n\tlines.push(\"- Never ignore a HIGH or CRITICAL risk result from impact analysis.\");\n\tlines.push(\"- Never edit a graph-known symbol without having checked its blast radius first.\");\n\tlines.push(\"\");\n\tlines.push(\"## Impact risk levels\");\n\tlines.push(\"- d=1 WILL BREAK — direct callers/importers: you MUST update these.\");\n\tlines.push(\"- d=2 LIKELY AFFECTED — indirect dependents: should test.\");\n\tlines.push(\"- d=3 MAY NEED TESTING — transitive: test if on a critical path.\");\n\tlines.push(\"\");\n\tlines.push(\"## Before finishing a code change\");\n\tlines.push(\"1. `gitnexus_impact` was run for every modified symbol.\");\n\tlines.push(\"2. No HIGH/CRITICAL warnings were ignored.\");\n\tlines.push(\"3. All d=1 dependents were updated.\");\n\treturn lines.join(\"\\n\");\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The always-on GitNexus guidance appended to the system prompt.
3
+ *
4
+ * Ported from what `gitnexus` writes into CLAUDE.md/AGENTS.md today
5
+ * (gitnexus/src/cli/ai-context.ts generateGitNexusContent) — same rules, made
6
+ * dynamic: live repo inventory, current-repo stats, snapshot caveat. Keep this
7
+ * in sync with the generator until both share a single template.
8
+ */
9
+ export function buildGitNexusPrompt(inventory, current) {
10
+ const lines = [];
11
+ lines.push("# GitNexus — Code Intelligence");
12
+ lines.push("");
13
+ if (current) {
14
+ lines.push(`The current repository is indexed by GitNexus as **${current.name}** ` +
15
+ `(${current.symbols} symbols, ${current.relationships} relationships, indexed ${current.indexedAt}).`);
16
+ }
17
+ else {
18
+ lines.push("The current working directory is NOT indexed by GitNexus. Graph tools still work for the indexed repositories listed below (pass `repo` explicitly).");
19
+ }
20
+ lines.push("The graph is a snapshot from the indexed time — for files changed after that (including your own edits this session), verify with read/grep.");
21
+ lines.push("");
22
+ const repoList = inventory.repos.map((r) => (r.name === current?.name ? `${r.name} (current)` : r.name)).join(", ");
23
+ lines.push(`Indexed repositories you can query: ${repoList || "(none)"}.`);
24
+ if (inventory.groups.length > 0) {
25
+ lines.push(`Multi-repo groups (pass as repo for cross-repo queries): ${inventory.groups.map((g) => g.name).join(", ")}.`);
26
+ }
27
+ lines.push("Every gitnexus tool takes an optional `repo` — omit it for the current repo, or pass any name/@group above.");
28
+ lines.push("");
29
+ lines.push("## Always");
30
+ lines.push("- Run `gitnexus_impact({target})` BEFORE modifying a function/class/method, and report the blast radius (direct callers, processes, risk) when it is HIGH or CRITICAL.");
31
+ lines.push("- When exploring unfamiliar code, prefer `gitnexus_query` (execution flows, ranked) over blind grepping.");
32
+ lines.push("- For full context on one symbol (callers, callees, flows), use `gitnexus_context`.");
33
+ lines.push("- Before committing, use `gitnexus_detect_changes` to map your diff to affected flows.");
34
+ lines.push("");
35
+ lines.push("## Never");
36
+ lines.push("- Never ignore a HIGH or CRITICAL risk result from impact analysis.");
37
+ lines.push("- Never edit a graph-known symbol without having checked its blast radius first.");
38
+ lines.push("");
39
+ lines.push("## Impact risk levels");
40
+ lines.push("- d=1 WILL BREAK — direct callers/importers: you MUST update these.");
41
+ lines.push("- d=2 LIKELY AFFECTED — indirect dependents: should test.");
42
+ lines.push("- d=3 MAY NEED TESTING — transitive: test if on a critical path.");
43
+ lines.push("");
44
+ lines.push("## Before finishing a code change");
45
+ lines.push("1. `gitnexus_impact` was run for every modified symbol.");
46
+ lines.push("2. No HIGH/CRITICAL warnings were ignored.");
47
+ lines.push("3. All d=1 dependents were updated.");
48
+ return lines.join("\n");
49
+ }
50
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/extensions/gitnexus/prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAwB,EAAE,OAAgC,EAAU;IACvG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,kCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CACT,sDAAsD,OAAO,CAAC,IAAI,KAAK;YACtE,IAAI,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,aAAa,2BAA2B,OAAO,CAAC,SAAS,IAAI,CACtG,CAAC;IACH,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CACT,sJAAsJ,CACtJ,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CACT,gJAA8I,CAC9I,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpH,KAAK,CAAC,IAAI,CAAC,uCAAuC,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CACT,4DAA4D,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC7G,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CACT,+GAA6G,CAC7G,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CACT,wKAAwK,CACxK,CAAC;IACF,KAAK,CAAC,IAAI,CACT,0GAA0G,CAC1G,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;IACrG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAC/F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,uEAAqE,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,6DAA2D,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,oEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACxB","sourcesContent":["import type { IndexedRepo, RepoInventory } from \"./resolve.ts\";\n\n/**\n * The always-on GitNexus guidance appended to the system prompt.\n *\n * Ported from what `gitnexus` writes into CLAUDE.md/AGENTS.md today\n * (gitnexus/src/cli/ai-context.ts generateGitNexusContent) — same rules, made\n * dynamic: live repo inventory, current-repo stats, snapshot caveat. Keep this\n * in sync with the generator until both share a single template.\n */\nexport function buildGitNexusPrompt(inventory: RepoInventory, current: IndexedRepo | undefined): string {\n\tconst lines: string[] = [];\n\tlines.push(\"# GitNexus — Code Intelligence\");\n\tlines.push(\"\");\n\tif (current) {\n\t\tlines.push(\n\t\t\t`The current repository is indexed by GitNexus as **${current.name}** ` +\n\t\t\t\t`(${current.symbols} symbols, ${current.relationships} relationships, indexed ${current.indexedAt}).`,\n\t\t);\n\t} else {\n\t\tlines.push(\n\t\t\t\"The current working directory is NOT indexed by GitNexus. Graph tools still work for the indexed repositories listed below (pass `repo` explicitly).\",\n\t\t);\n\t}\n\tlines.push(\n\t\t\"The graph is a snapshot from the indexed time — for files changed after that (including your own edits this session), verify with read/grep.\",\n\t);\n\tlines.push(\"\");\n\tconst repoList = inventory.repos.map((r) => (r.name === current?.name ? `${r.name} (current)` : r.name)).join(\", \");\n\tlines.push(`Indexed repositories you can query: ${repoList || \"(none)\"}.`);\n\tif (inventory.groups.length > 0) {\n\t\tlines.push(\n\t\t\t`Multi-repo groups (pass as repo for cross-repo queries): ${inventory.groups.map((g) => g.name).join(\", \")}.`,\n\t\t);\n\t}\n\tlines.push(\n\t\t\"Every gitnexus tool takes an optional `repo` — omit it for the current repo, or pass any name/@group above.\",\n\t);\n\tlines.push(\"\");\n\tlines.push(\"## Always\");\n\tlines.push(\n\t\t\"- Run `gitnexus_impact({target})` BEFORE modifying a function/class/method, and report the blast radius (direct callers, processes, risk) when it is HIGH or CRITICAL.\",\n\t);\n\tlines.push(\n\t\t\"- When exploring unfamiliar code, prefer `gitnexus_query` (execution flows, ranked) over blind grepping.\",\n\t);\n\tlines.push(\"- For full context on one symbol (callers, callees, flows), use `gitnexus_context`.\");\n\tlines.push(\"- Before committing, use `gitnexus_detect_changes` to map your diff to affected flows.\");\n\tlines.push(\"\");\n\tlines.push(\"## Never\");\n\tlines.push(\"- Never ignore a HIGH or CRITICAL risk result from impact analysis.\");\n\tlines.push(\"- Never edit a graph-known symbol without having checked its blast radius first.\");\n\tlines.push(\"\");\n\tlines.push(\"## Impact risk levels\");\n\tlines.push(\"- d=1 WILL BREAK — direct callers/importers: you MUST update these.\");\n\tlines.push(\"- d=2 LIKELY AFFECTED — indirect dependents: should test.\");\n\tlines.push(\"- d=3 MAY NEED TESTING — transitive: test if on a critical path.\");\n\tlines.push(\"\");\n\tlines.push(\"## Before finishing a code change\");\n\tlines.push(\"1. `gitnexus_impact` was run for every modified symbol.\");\n\tlines.push(\"2. No HIGH/CRITICAL warnings were ignored.\");\n\tlines.push(\"3. All d=1 dependents were updated.\");\n\treturn lines.join(\"\\n\");\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import type { ToolDefinition } from "../../core/extensions/types.ts";
2
+ import type { Theme } from "../../modes/interactive/theme/theme.ts";
3
+ /**
4
+ * Inline rich renderers for gitnexus tool results — the visibility layer.
5
+ * Impact renders as a blast-radius tree, query as flow traces. Falls back to
6
+ * plain text whenever parsing fails (hub output format is JSON-in-text today).
7
+ */
8
+ export interface ImpactNode {
9
+ name: string;
10
+ filePath?: string;
11
+ relationType?: string;
12
+ confidence?: number;
13
+ }
14
+ export interface ImpactData {
15
+ target?: {
16
+ name?: string;
17
+ filePath?: string;
18
+ };
19
+ risk?: string;
20
+ direction?: string;
21
+ byDepth?: Record<string, ImpactNode[]>;
22
+ affected_processes?: Array<{
23
+ name?: string;
24
+ } | string>;
25
+ affected_modules?: Array<{
26
+ name?: string;
27
+ hits?: number;
28
+ impact?: string;
29
+ }>;
30
+ summary?: {
31
+ direct?: number;
32
+ processes_affected?: number;
33
+ modules_affected?: number;
34
+ };
35
+ }
36
+ interface QueryProcess {
37
+ id?: string;
38
+ summary?: string;
39
+ priority?: number;
40
+ step_count?: number;
41
+ }
42
+ interface QuerySymbol {
43
+ name?: string;
44
+ filePath?: string;
45
+ startLine?: number;
46
+ process_id?: string;
47
+ step_index?: number;
48
+ }
49
+ export interface QueryData {
50
+ processes?: QueryProcess[];
51
+ process_symbols?: QuerySymbol[];
52
+ definitions?: QuerySymbol[];
53
+ }
54
+ /** The hub returns JSON, sometimes followed by a "\n\n---\n**Next:** ..." footer. */
55
+ export declare function parseHubJson<T>(text: string): T | undefined;
56
+ export declare function formatImpact(text: string, theme: Theme): string | undefined;
57
+ export declare function formatQuery(text: string, theme: Theme): string | undefined;
58
+ /** Attach an inline rich renderer to a gitnexus ToolDefinition when one exists. */
59
+ export declare function withGitNexusRenderer(definition: ToolDefinition): ToolDefinition;
60
+ export {};
61
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/gitnexus/render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAEpE;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IAC1B,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACvC,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC;IACvD,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACtF;AAED,UAAU,YAAY;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,WAAW;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACzB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQ3D;AAkHD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAqG3E;AA8CD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAoC1E;AA0ED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,CAuB/E","sourcesContent":["import { Text, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { type MermaidArt, render as renderMermaid, type Span } from \"grok-mermaid\";\nimport type { ToolDefinition } from \"../../core/extensions/types.ts\";\nimport { gradientText } from \"../../modes/interactive/theme/brand.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\n/**\n * Inline rich renderers for gitnexus tool results — the visibility layer.\n * Impact renders as a blast-radius tree, query as flow traces. Falls back to\n * plain text whenever parsing fails (hub output format is JSON-in-text today).\n */\n\nexport interface ImpactNode {\n\tname: string;\n\tfilePath?: string;\n\trelationType?: string;\n\tconfidence?: number;\n}\n\nexport interface ImpactData {\n\ttarget?: { name?: string; filePath?: string };\n\trisk?: string;\n\tdirection?: string;\n\tbyDepth?: Record<string, ImpactNode[]>;\n\taffected_processes?: Array<{ name?: string } | string>;\n\taffected_modules?: Array<{ name?: string; hits?: number; impact?: string }>;\n\tsummary?: { direct?: number; processes_affected?: number; modules_affected?: number };\n}\n\ninterface QueryProcess {\n\tid?: string;\n\tsummary?: string;\n\tpriority?: number;\n\tstep_count?: number;\n}\n\ninterface QuerySymbol {\n\tname?: string;\n\tfilePath?: string;\n\tstartLine?: number;\n\tprocess_id?: string;\n\tstep_index?: number;\n}\n\nexport interface QueryData {\n\tprocesses?: QueryProcess[];\n\tprocess_symbols?: QuerySymbol[];\n\tdefinitions?: QuerySymbol[];\n}\n\n/** The hub returns JSON, sometimes followed by a \"\\n\\n---\\n**Next:** ...\" footer. */\nexport function parseHubJson<T>(text: string): T | undefined {\n\tconst jsonPart = text.split(\"\\n\\n---\")[0]?.trim() ?? \"\";\n\tif (!jsonPart.startsWith(\"{\")) return undefined;\n\ttry {\n\t\treturn JSON.parse(jsonPart) as T;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction basename(filePath: string | undefined): string {\n\tif (!filePath) return \"\";\n\treturn filePath.split(\"/\").pop() ?? filePath;\n}\n\nfunction riskColors(theme: Theme, risk: string): { label: string } {\n\tconst upper = risk.toUpperCase();\n\tif (upper === \"HIGH\" || upper === \"CRITICAL\") return { label: theme.bold(theme.fg(\"error\", ` RISK: ${upper} `)) };\n\tif (upper === \"MEDIUM\") return { label: theme.bold(theme.fg(\"warning\", ` RISK: ${upper} `)) };\n\treturn { label: theme.bold(theme.fg(\"success\", ` RISK: ${upper} `)) };\n}\n\n/** Truncate a plain label to a max width with an ellipsis. */\nfunction clipLabel(label: string, max: number): string {\n\tconst chars = [...label];\n\treturn chars.length <= max ? label : `${chars.slice(0, max - 1).join(\"\")}…`;\n}\n\nconst FAN_MAX_NODES = 5;\nconst FAN_LABEL_WIDTH = 20;\n\n/** Fan connector glyph for row i of n. */\nfunction fanGlyph(i: number, n: number): string {\n\tif (n === 1) return \"──\";\n\tif (i === 0) return \"╭─\";\n\tif (i === n - 1) return \"╰─\";\n\treturn \"├─\";\n}\n\n/** Escape a symbol name for a quoted mermaid node label. */\nfunction mermaidLabel(name: string): string {\n\treturn `\"${clipLabel(name, 26).replace(/\"/g, \"'\")}\"`;\n}\n\ntype NodeColor = \"accent\" | \"error\" | \"warning\" | \"muted\";\n\nfunction styleMermaidSpan(span: Span, theme: Theme, nodeColors: Map<string, NodeColor>): string {\n\tswitch (span.cls) {\n\t\tcase \"border\":\n\t\t\treturn theme.fg(\"borderMuted\", span.text);\n\t\tcase \"text\": {\n\t\t\t// Color node labels by their blast-radius tier.\n\t\t\tconst color = nodeColors.get(span.text.trim());\n\t\t\tif (color === \"accent\") return theme.bold(theme.fg(\"accent\", span.text));\n\t\t\tif (color) return theme.fg(color, span.text);\n\t\t\treturn theme.fg(\"text\", span.text);\n\t\t}\n\t\tcase \"edge\":\n\t\t\treturn theme.fg(\"dim\", span.text);\n\t\tcase \"edgeLabel\":\n\t\t\treturn theme.fg(\"muted\", span.text);\n\t\tcase \"title\":\n\t\t\treturn theme.fg(\"accent\", theme.bold(span.text));\n\t\tcase \"none\":\n\t\t\treturn span.text;\n\t}\n}\n\nconst MERMAID_MAX_WIDTH = 106;\nconst MERMAID_DEPTH_CAPS: Record<number, number> = { 1: 6, 2: 4, 3: 2 };\n\n/**\n * Impact as a grok-mermaid flowchart. NOTE: byDepth carries no parent links,\n * so d1→d2→d3 edges are round-robin approximations — depth layering is exact,\n * specific cross-links are positional until the hub exposes parent ids.\n */\nfunction impactMermaid(data: ImpactData, theme: Theme): string[] | undefined {\n\tconst byDepth = data.byDepth ?? {};\n\tconst layers = [1, 2, 3]\n\t\t.map((depth) => ({\n\t\t\tdepth,\n\t\t\tnodes: (byDepth[String(depth)] ?? []).slice(0, MERMAID_DEPTH_CAPS[depth] ?? 3),\n\t\t\ttotal: (byDepth[String(depth)] ?? []).length,\n\t\t}))\n\t\t.filter((layer) => layer.nodes.length > 0);\n\tif (layers.length === 0) return undefined;\n\n\tconst source: string[] = [\"flowchart LR\", ` T[${mermaidLabel(data.target?.name ?? \"?\")}]`];\n\tconst nodeColors = new Map<string, NodeColor>();\n\tnodeColors.set(clipLabel(data.target?.name ?? \"?\", 26).replace(/\"/g, \"'\"), \"accent\");\n\tconst idsByDepth: string[][] = [];\n\tlayers.forEach((layer, layerIndex) => {\n\t\tconst tierColor: NodeColor = layer.depth === 1 ? \"error\" : layer.depth === 2 ? \"warning\" : \"muted\";\n\t\tconst ids: string[] = [];\n\t\tlayer.nodes.forEach((node, i) => {\n\t\t\tconst id = `D${layer.depth}_${i}`;\n\t\t\tids.push(id);\n\t\t\tconst parents = layerIndex === 0 ? [\"T\"] : [idsByDepth[layerIndex - 1][i % idsByDepth[layerIndex - 1].length]];\n\t\t\tsource.push(` ${parents[0]} --> ${id}[${mermaidLabel(node.name)}]`);\n\t\t\tnodeColors.set(clipLabel(node.name, 26).replace(/\"/g, \"'\"), tierColor);\n\t\t});\n\t\tif (layer.total > layer.nodes.length) {\n\t\t\tconst id = `D${layer.depth}_more`;\n\t\t\tconst parent = layerIndex === 0 ? \"T\" : idsByDepth[layerIndex - 1][0];\n\t\t\tconst moreLabel = `+${layer.total - layer.nodes.length} more`;\n\t\t\tsource.push(` ${parent} --> ${id}[\"${moreLabel}\"]`);\n\t\t\tnodeColors.set(moreLabel, \"muted\");\n\t\t\tids.push(id);\n\t\t}\n\t\tidsByDepth.push(ids);\n\t});\n\n\tlet art: MermaidArt | null;\n\ttry {\n\t\tart = renderMermaid(source.join(\"\\n\"));\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!art || art.warnings.length > 0 || art.width > MERMAID_MAX_WIDTH) return undefined;\n\treturn art.styled.map((row) => row.map((span) => styleMermaidSpan(span, theme, nodeColors)).join(\"\"));\n}\n\nexport function formatImpact(text: string, theme: Theme): string | undefined {\n\tconst data = parseHubJson<ImpactData>(text);\n\tif (!data?.target?.name || !data.byDepth) return undefined;\n\n\tconst lines: string[] = [];\n\tconst risk = riskColors(theme, data.risk ?? \"UNKNOWN\");\n\n\tconst mermaidLines = impactMermaid(data, theme);\n\tif (mermaidLines) {\n\t\tlines.push(...mermaidLines);\n\t\tlines.push(\"\");\n\t\tconst depthCounts = [1, 2, 3]\n\t\t\t.map((d) => ({ d, n: data.byDepth?.[String(d)]?.length ?? 0 }))\n\t\t\t.filter((x) => x.n > 0)\n\t\t\t.map(({ d, n }) =>\n\t\t\t\td === 1\n\t\t\t\t\t? theme.bold(theme.fg(\"error\", `d1 · breaks (${n})`))\n\t\t\t\t\t: d === 2\n\t\t\t\t\t\t? theme.fg(\"warning\", `d2 · test (${n})`)\n\t\t\t\t\t\t: theme.fg(\"muted\", `d${d} · transitive (${n})`),\n\t\t\t)\n\t\t\t.join(\" \");\n\t\tlines.push(` ${risk.label} ${depthCounts}`);\n\t\tconst processes = (data.affected_processes ?? [])\n\t\t\t.map((p) => (typeof p === \"string\" ? p : (p.name ?? \"\")))\n\t\t\t.filter(Boolean);\n\t\tif (processes.length > 0) lines.push(theme.fg(\"muted\", `flows affected: ${processes.slice(0, 4).join(\", \")}`));\n\t\tconst modules = (data.affected_modules ?? []).map((m) => m.name).filter(Boolean);\n\t\tif (modules.length > 0) lines.push(theme.fg(\"muted\", `modules: ${modules.slice(0, 5).join(\", \")}`));\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tconst depths = Object.keys(data.byDepth)\n\t\t.map(Number)\n\t\t.filter((d) => !Number.isNaN(d) && (data.byDepth?.[String(d)]?.length ?? 0) > 0)\n\t\t.sort((a, b) => a - b)\n\t\t.slice(0, 3);\n\n\t// Left→right blast-radius graph: target node fans out to d1, d1 to d2, d2 to d3.\n\t// ◉ target ─┬─● caller ╭─○ indirect\n\t// ╰─● caller ──┤\n\tconst columns = depths.map((depth) => {\n\t\tconst nodes = data.byDepth?.[String(depth)] ?? [];\n\t\tconst shown = nodes.slice(0, FAN_MAX_NODES);\n\t\tconst overflow = nodes.length - shown.length;\n\t\tconst color = depth === 1 ? \"error\" : depth === 2 ? \"warning\" : \"muted\";\n\t\tconst bullet = depth === 1 ? \"●\" : depth === 2 ? \"○\" : \"·\";\n\t\tconst cells = shown.map((node) => {\n\t\t\tconst label = clipLabel(node.name, FAN_LABEL_WIDTH);\n\t\t\tconst pad = \" \".repeat(Math.max(0, FAN_LABEL_WIDTH - [...label].length));\n\t\t\treturn `${theme.fg(color as \"error\", bullet)} ${label}${pad}`;\n\t\t});\n\t\tif (overflow > 0)\n\t\t\tcells.push(\n\t\t\t\t`${theme.fg(\"dim\", `… +${overflow} more`)}${\" \".repeat(Math.max(0, FAN_LABEL_WIDTH - 8 - String(overflow).length))}`,\n\t\t\t);\n\t\tconst footer =\n\t\t\tdepth === 1\n\t\t\t\t? theme.bold(theme.fg(\"error\", `d1 · breaks (${nodes.length})`))\n\t\t\t\t: depth === 2\n\t\t\t\t\t? theme.fg(\"warning\", `d2 · test (${nodes.length})`)\n\t\t\t\t\t: theme.fg(\"muted\", `d${depth} · transitive (${nodes.length})`);\n\t\treturn { cells, footer };\n\t});\n\n\tconst rows = Math.max(...columns.map((c) => c.cells.length), 1);\n\tconst targetLabel = `${theme.fg(\"accent\", \"◉\")} ${theme.bold(clipLabel(data.target.name, 24))}`;\n\tconst targetWidth = [...clipLabel(data.target.name, 24)].length + 2;\n\tconst targetMid = Math.floor((rows - 1) / 2);\n\n\tfor (let row = 0; row < rows; row++) {\n\t\tlet line = row === targetMid ? ` ${targetLabel} ` : \" \".repeat(targetWidth + 2);\n\t\tcolumns.forEach((column) => {\n\t\t\tconst cell = column.cells[row];\n\t\t\tif (cell === undefined) {\n\t\t\t\tline += \" \".repeat(2 + 1 + FAN_LABEL_WIDTH + 2);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tline += `${theme.fg(\"dim\", fanGlyph(row, column.cells.length))} ${cell} `;\n\t\t});\n\t\tlines.push(line);\n\t}\n\t// Footer row: risk + per-depth labels.\n\tlet footerLine = ` ${risk.label} `;\n\tfor (const column of columns) {\n\t\tfooterLine += ` ${column.footer}${\" \".repeat(4)}`;\n\t}\n\tlines.push(\"\");\n\tlines.push(footerLine);\n\n\tconst processes = (data.affected_processes ?? [])\n\t\t.map((p) => (typeof p === \"string\" ? p : (p.name ?? \"\")))\n\t\t.filter(Boolean);\n\tif (processes.length > 0) {\n\t\tlines.push(theme.fg(\"muted\", `flows affected: ${processes.slice(0, 4).join(\", \")}`));\n\t}\n\tconst modules = (data.affected_modules ?? []).map((m) => m.name).filter(Boolean);\n\tif (modules.length > 0) {\n\t\tlines.push(theme.fg(\"muted\", `modules: ${modules.slice(0, 5).join(\", \")}`));\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nconst QUERY_MAX_STEPS = 5;\n\n/**\n * Top execution flow as a mermaid step chain: parse ─▶ resolve ─▶ execute.\n * Uses `step_index` ordering from the hub's process_symbols.\n */\nfunction queryMermaid(\n\tdata: QueryData,\n\tsymbolsByProcess: Map<string, QuerySymbol[]>,\n\ttheme: Theme,\n): string[] | undefined {\n\tconst top = data.processes?.[0];\n\tif (!top?.id) return undefined;\n\tconst steps = (symbolsByProcess.get(top.id) ?? [])\n\t\t.slice()\n\t\t.sort((a, b) => (a.step_index ?? 0) - (b.step_index ?? 0))\n\t\t.filter((symbol) => symbol.name);\n\tif (steps.length < 2) return undefined;\n\n\tconst shown = steps.slice(0, QUERY_MAX_STEPS);\n\tconst source: string[] = [\"flowchart LR\"];\n\tconst nodeColors = new Map<string, NodeColor>();\n\tshown.forEach((symbol, i) => {\n\t\tconst label = mermaidLabel(symbol.name ?? \"?\");\n\t\tif (i === 0) source.push(` S0[${label}]`);\n\t\telse source.push(` S${i - 1} --> S${i}[${label}]`);\n\t\tnodeColors.set(clipLabel(symbol.name ?? \"?\", 26).replace(/\"/g, \"'\"), i === 0 ? \"accent\" : \"muted\");\n\t});\n\tif (steps.length > shown.length) {\n\t\tconst moreLabel = `+${steps.length - shown.length} more`;\n\t\tsource.push(` S${shown.length - 1} --> SM[\"${moreLabel}\"]`);\n\t\tnodeColors.set(moreLabel, \"muted\");\n\t}\n\n\tlet art: MermaidArt | null;\n\ttry {\n\t\tart = renderMermaid(source.join(\"\\n\"));\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!art || art.warnings.length > 0 || art.width > MERMAID_MAX_WIDTH) return undefined;\n\treturn art.styled.map((row) => row.map((span) => styleMermaidSpan(span, theme, nodeColors)).join(\"\"));\n}\n\nexport function formatQuery(text: string, theme: Theme): string | undefined {\n\tconst data = parseHubJson<QueryData>(text);\n\tif (!data?.processes) return undefined;\n\tconst lines: string[] = [];\n\tconst symbolsByProcess = new Map<string, QuerySymbol[]>();\n\tfor (const sym of data.process_symbols ?? []) {\n\t\tif (!sym.process_id) continue;\n\t\tconst list = symbolsByProcess.get(sym.process_id) ?? [];\n\t\tlist.push(sym);\n\t\tsymbolsByProcess.set(sym.process_id, list);\n\t}\n\n\t// Draw the top flow as a step chain when the hub gives us ordered steps.\n\tconst chain = queryMermaid(data, symbolsByProcess, theme);\n\tif (chain) {\n\t\tlines.push(...chain);\n\t\tlines.push(\"\");\n\t}\n\n\tconst procs = data.processes.slice(0, 4);\n\tprocs.forEach((proc, i) => {\n\t\tconst marker = i === 0 ? theme.fg(\"accent\", \"◉\") : theme.fg(\"muted\", \"○\");\n\t\tconst summary = proc.summary ?? \"(flow)\";\n\t\tconst steps = proc.step_count ? theme.fg(\"muted\", ` · ${proc.step_count} steps`) : \"\";\n\t\tlines.push(`${marker} ${i === 0 ? theme.bold(summary) : summary}${steps}`);\n\t});\n\tconst shownSymbols = (data.process_symbols ?? []).slice(0, 6);\n\tif (shownSymbols.length > 0) {\n\t\tlines.push(theme.fg(\"muted\", \"symbols:\"));\n\t\tfor (const sym of shownSymbols) {\n\t\t\tconst loc = sym.filePath ? `${basename(sym.filePath)}${sym.startLine ? `:${sym.startLine}` : \"\"}` : \"\";\n\t\t\tlines.push(` ${theme.fg(\"accent\", \"•\")} ${sym.name} ${theme.fg(\"muted\", loc)}`);\n\t\t}\n\t}\n\tif (lines.length === 0) return undefined;\n\treturn lines.join(\"\\n\");\n}\n\n/** ANSI-aware clip to a visible width, appending an ellipsis. */\nfunction clipAnsi(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tlet out = \"\";\n\tlet visible = 0;\n\tfor (let i = 0; i < text.length; i++) {\n\t\tif (text[i] === \"\\x1b\") {\n\t\t\tconst match = text.slice(i).match(/^\\x1b\\[[0-9;]*m/);\n\t\t\tif (match) {\n\t\t\t\tout += match[0];\n\t\t\t\ti += match[0].length - 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (visible >= width - 1) break;\n\t\tout += text[i];\n\t\tvisible++;\n\t}\n\treturn `${out}…\\x1b[0m`;\n}\n\nconst BOX_MAX_INNER = 108;\n\n/**\n * Branded frame around a GitNexus result:\n * ╭─ ⬢ GitNexus · impact ───────────╮\n * │ content │\n * ╰─────────────────────────────────╯\n */\nfunction gitnexusBox(content: string, toolLabel: string, theme: Theme): string {\n\tconst rawLines = content.split(\"\\n\");\n\tconst inner = Math.min(BOX_MAX_INNER, Math.max(24, ...rawLines.map((line) => visibleWidth(line))));\n\tconst border = (s: string) => theme.fg(\"border\", s);\n\tconst title = `${gradientText(\"⬢ GitNexus\")}${theme.fg(\"muted\", ` · ${toolLabel} `)}`;\n\t// Top row totals inner+4 like the side rows: ╭─␣(3) + title + fill + ╮(1).\n\tconst fill = Math.max(0, inner - visibleWidth(title));\n\tconst top = `${border(\"╭─ \")}${title}${border(\"─\".repeat(fill))}${border(\"╮\")}`;\n\tconst lines = [top];\n\tfor (const line of rawLines) {\n\t\tconst clipped = clipAnsi(line, inner);\n\t\tconst pad = \" \".repeat(Math.max(0, inner - visibleWidth(clipped)));\n\t\tlines.push(`${border(\"│\")} ${clipped}${pad} ${border(\"│\")}`);\n\t}\n\tlines.push(border(`╰${\"─\".repeat(inner + 2)}╯`));\n\treturn lines.join(\"\\n\");\n}\n\ntype Formatter = (text: string, theme: Theme) => string | undefined;\n\nconst FORMATTERS: Record<string, Formatter> = {\n\tgitnexus_impact: formatImpact,\n\tgitnexus_query: formatQuery,\n};\n\n/**\n * Collapsed height, matching the clamp ToolExecutionComponent applies to tools\n * that have no renderer of their own. A custom renderer opts out of that\n * fallback entirely, so it has to clamp itself or it dumps its whole result\n * into the transcript.\n */\nconst COLLAPSED_OUTPUT_LINES = 10;\n\n/** Clamp to the collapsed height, leaving a hint about the rest. */\nfunction clampOutput(content: string, expanded: boolean, theme: Theme): string {\n\tif (expanded) return content;\n\tconst lines = content.split(\"\\n\");\n\tif (lines.length <= COLLAPSED_OUTPUT_LINES) return content;\n\tconst hidden = lines.length - COLLAPSED_OUTPUT_LINES;\n\tconst hint = theme.fg(\"dim\", `… ${hidden} more lines (click or ctrl+o)`);\n\treturn [...lines.slice(0, COLLAPSED_OUTPUT_LINES), hint].join(\"\\n\");\n}\n\n/** Attach an inline rich renderer to a gitnexus ToolDefinition when one exists. */\nexport function withGitNexusRenderer(definition: ToolDefinition): ToolDefinition {\n\tconst format = FORMATTERS[definition.name];\n\tif (!format) return definition;\n\treturn {\n\t\t...definition,\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 1, 0);\n\t\t\tconst raw = result.content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t\tconst rich = context.isError ? undefined : format(raw, theme);\n\t\t\tconst toolLabel = definition.name.replace(/^gitnexus_/, \"\");\n\t\t\t// Clamp before boxing, so the hint sits inside the border and the box\n\t\t\t// still closes. Clamping the boxed text would cut off its last row.\n\t\t\ttext.setText(\n\t\t\t\trich\n\t\t\t\t\t? gitnexusBox(clampOutput(rich, options.expanded, theme), toolLabel, theme)\n\t\t\t\t\t: clampOutput(raw, options.expanded, theme),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n"]}