@vigil-guard/vge-cc-guard 0.9.0-beta.1

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 (527) hide show
  1. package/LICENSE.md +37 -0
  2. package/README.md +441 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +61 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/_lib/install-paths.d.ts +16 -0
  8. package/dist/commands/_lib/install-paths.d.ts.map +1 -0
  9. package/dist/commands/_lib/install-paths.js +46 -0
  10. package/dist/commands/_lib/install-paths.js.map +1 -0
  11. package/dist/commands/_lib/parse-install-flags.d.ts +8 -0
  12. package/dist/commands/_lib/parse-install-flags.d.ts.map +1 -0
  13. package/dist/commands/_lib/parse-install-flags.js +15 -0
  14. package/dist/commands/_lib/parse-install-flags.js.map +1 -0
  15. package/dist/commands/config.d.ts +2 -0
  16. package/dist/commands/config.d.ts.map +1 -0
  17. package/dist/commands/config.js +41 -0
  18. package/dist/commands/config.js.map +1 -0
  19. package/dist/commands/daemon.d.ts +2 -0
  20. package/dist/commands/daemon.d.ts.map +1 -0
  21. package/dist/commands/daemon.js +116 -0
  22. package/dist/commands/daemon.js.map +1 -0
  23. package/dist/commands/doctor.d.ts +2 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +53 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/install-wizard.d.ts +2 -0
  28. package/dist/commands/install-wizard.d.ts.map +1 -0
  29. package/dist/commands/install-wizard.js +85 -0
  30. package/dist/commands/install-wizard.js.map +1 -0
  31. package/dist/commands/install.d.ts +15 -0
  32. package/dist/commands/install.d.ts.map +1 -0
  33. package/dist/commands/install.js +136 -0
  34. package/dist/commands/install.js.map +1 -0
  35. package/dist/commands/reset-session.d.ts +2 -0
  36. package/dist/commands/reset-session.d.ts.map +1 -0
  37. package/dist/commands/reset-session.js +113 -0
  38. package/dist/commands/reset-session.js.map +1 -0
  39. package/dist/commands/uninstall.d.ts +2 -0
  40. package/dist/commands/uninstall.d.ts.map +1 -0
  41. package/dist/commands/uninstall.js +277 -0
  42. package/dist/commands/uninstall.js.map +1 -0
  43. package/dist/daemon/active-conversation-decisions.d.ts +9 -0
  44. package/dist/daemon/active-conversation-decisions.d.ts.map +1 -0
  45. package/dist/daemon/active-conversation-decisions.js +58 -0
  46. package/dist/daemon/active-conversation-decisions.js.map +1 -0
  47. package/dist/daemon/allowlist.d.ts +2 -0
  48. package/dist/daemon/allowlist.d.ts.map +1 -0
  49. package/dist/daemon/allowlist.js +118 -0
  50. package/dist/daemon/allowlist.js.map +1 -0
  51. package/dist/daemon/analysis-source.d.ts +17 -0
  52. package/dist/daemon/analysis-source.d.ts.map +1 -0
  53. package/dist/daemon/analysis-source.js +114 -0
  54. package/dist/daemon/analysis-source.js.map +1 -0
  55. package/dist/daemon/ask-dialog.d.ts +23 -0
  56. package/dist/daemon/ask-dialog.d.ts.map +1 -0
  57. package/dist/daemon/ask-dialog.js +114 -0
  58. package/dist/daemon/ask-dialog.js.map +1 -0
  59. package/dist/daemon/attachment-decision-escrow.d.ts +27 -0
  60. package/dist/daemon/attachment-decision-escrow.d.ts.map +1 -0
  61. package/dist/daemon/attachment-decision-escrow.js +34 -0
  62. package/dist/daemon/attachment-decision-escrow.js.map +1 -0
  63. package/dist/daemon/attachment-input-enforcement.d.ts +11 -0
  64. package/dist/daemon/attachment-input-enforcement.d.ts.map +1 -0
  65. package/dist/daemon/attachment-input-enforcement.js +434 -0
  66. package/dist/daemon/attachment-input-enforcement.js.map +1 -0
  67. package/dist/daemon/audit-decisions.d.ts +51 -0
  68. package/dist/daemon/audit-decisions.d.ts.map +1 -0
  69. package/dist/daemon/audit-decisions.js +178 -0
  70. package/dist/daemon/audit-decisions.js.map +1 -0
  71. package/dist/daemon/audit-logger.d.ts +6 -0
  72. package/dist/daemon/audit-logger.d.ts.map +1 -0
  73. package/dist/daemon/audit-logger.js +6 -0
  74. package/dist/daemon/audit-logger.js.map +1 -0
  75. package/dist/daemon/audit-posttool.d.ts +123 -0
  76. package/dist/daemon/audit-posttool.d.ts.map +1 -0
  77. package/dist/daemon/audit-posttool.js +173 -0
  78. package/dist/daemon/audit-posttool.js.map +1 -0
  79. package/dist/daemon/audit-pretool.d.ts +56 -0
  80. package/dist/daemon/audit-pretool.d.ts.map +1 -0
  81. package/dist/daemon/audit-pretool.js +77 -0
  82. package/dist/daemon/audit-pretool.js.map +1 -0
  83. package/dist/daemon/audit-userprompt.d.ts +113 -0
  84. package/dist/daemon/audit-userprompt.d.ts.map +1 -0
  85. package/dist/daemon/audit-userprompt.js +162 -0
  86. package/dist/daemon/audit-userprompt.js.map +1 -0
  87. package/dist/daemon/blocking-decision-triggers.d.ts +5 -0
  88. package/dist/daemon/blocking-decision-triggers.d.ts.map +1 -0
  89. package/dist/daemon/blocking-decision-triggers.js +40 -0
  90. package/dist/daemon/blocking-decision-triggers.js.map +1 -0
  91. package/dist/daemon/cc-contract-auto-probe.d.ts +40 -0
  92. package/dist/daemon/cc-contract-auto-probe.d.ts.map +1 -0
  93. package/dist/daemon/cc-contract-auto-probe.js +101 -0
  94. package/dist/daemon/cc-contract-auto-probe.js.map +1 -0
  95. package/dist/daemon/cc-contract-probe.d.ts +46 -0
  96. package/dist/daemon/cc-contract-probe.d.ts.map +1 -0
  97. package/dist/daemon/cc-contract-probe.js +138 -0
  98. package/dist/daemon/cc-contract-probe.js.map +1 -0
  99. package/dist/daemon/cc-contract-runtime.d.ts +8 -0
  100. package/dist/daemon/cc-contract-runtime.d.ts.map +1 -0
  101. package/dist/daemon/cc-contract-runtime.js +42 -0
  102. package/dist/daemon/cc-contract-runtime.js.map +1 -0
  103. package/dist/daemon/cc-contract-status.d.ts +40 -0
  104. package/dist/daemon/cc-contract-status.d.ts.map +1 -0
  105. package/dist/daemon/cc-contract-status.js +242 -0
  106. package/dist/daemon/cc-contract-status.js.map +1 -0
  107. package/dist/daemon/confidence-router.d.ts +3 -0
  108. package/dist/daemon/confidence-router.d.ts.map +1 -0
  109. package/dist/daemon/confidence-router.js +34 -0
  110. package/dist/daemon/confidence-router.js.map +1 -0
  111. package/dist/daemon/conversation-context.d.ts +28 -0
  112. package/dist/daemon/conversation-context.d.ts.map +1 -0
  113. package/dist/daemon/conversation-context.js +271 -0
  114. package/dist/daemon/conversation-context.js.map +1 -0
  115. package/dist/daemon/conversation-decision-cleanup.d.ts +2 -0
  116. package/dist/daemon/conversation-decision-cleanup.d.ts.map +1 -0
  117. package/dist/daemon/conversation-decision-cleanup.js +22 -0
  118. package/dist/daemon/conversation-decision-cleanup.js.map +1 -0
  119. package/dist/daemon/conversation-decision-escrow.d.ts +20 -0
  120. package/dist/daemon/conversation-decision-escrow.d.ts.map +1 -0
  121. package/dist/daemon/conversation-decision-escrow.js +78 -0
  122. package/dist/daemon/conversation-decision-escrow.js.map +1 -0
  123. package/dist/daemon/conversation-decision-prompt.d.ts +30 -0
  124. package/dist/daemon/conversation-decision-prompt.d.ts.map +1 -0
  125. package/dist/daemon/conversation-decision-prompt.js +250 -0
  126. package/dist/daemon/conversation-decision-prompt.js.map +1 -0
  127. package/dist/daemon/daemon-instance.d.ts +27 -0
  128. package/dist/daemon/daemon-instance.d.ts.map +1 -0
  129. package/dist/daemon/daemon-instance.js +41 -0
  130. package/dist/daemon/daemon-instance.js.map +1 -0
  131. package/dist/daemon/daemon-ipc.d.ts +29 -0
  132. package/dist/daemon/daemon-ipc.d.ts.map +1 -0
  133. package/dist/daemon/daemon-ipc.js +82 -0
  134. package/dist/daemon/daemon-ipc.js.map +1 -0
  135. package/dist/daemon/daemon-supersede.d.ts +3 -0
  136. package/dist/daemon/daemon-supersede.d.ts.map +1 -0
  137. package/dist/daemon/daemon-supersede.js +126 -0
  138. package/dist/daemon/daemon-supersede.js.map +1 -0
  139. package/dist/daemon/debug-logger.d.ts +5 -0
  140. package/dist/daemon/debug-logger.d.ts.map +1 -0
  141. package/dist/daemon/debug-logger.js +247 -0
  142. package/dist/daemon/debug-logger.js.map +1 -0
  143. package/dist/daemon/decision-broker.d.ts +58 -0
  144. package/dist/daemon/decision-broker.d.ts.map +1 -0
  145. package/dist/daemon/decision-broker.js +340 -0
  146. package/dist/daemon/decision-broker.js.map +1 -0
  147. package/dist/daemon/decision-metrics.d.ts +40 -0
  148. package/dist/daemon/decision-metrics.d.ts.map +1 -0
  149. package/dist/daemon/decision-metrics.js +116 -0
  150. package/dist/daemon/decision-metrics.js.map +1 -0
  151. package/dist/daemon/decision-owner.d.ts +10 -0
  152. package/dist/daemon/decision-owner.d.ts.map +1 -0
  153. package/dist/daemon/decision-owner.js +30 -0
  154. package/dist/daemon/decision-owner.js.map +1 -0
  155. package/dist/daemon/decision-routes.d.ts +7 -0
  156. package/dist/daemon/decision-routes.d.ts.map +1 -0
  157. package/dist/daemon/decision-routes.js +104 -0
  158. package/dist/daemon/decision-routes.js.map +1 -0
  159. package/dist/daemon/decision-timeout.d.ts +3 -0
  160. package/dist/daemon/decision-timeout.d.ts.map +1 -0
  161. package/dist/daemon/decision-timeout.js +5 -0
  162. package/dist/daemon/decision-timeout.js.map +1 -0
  163. package/dist/daemon/decision-transition.d.ts +12 -0
  164. package/dist/daemon/decision-transition.d.ts.map +1 -0
  165. package/dist/daemon/decision-transition.js +8 -0
  166. package/dist/daemon/decision-transition.js.map +1 -0
  167. package/dist/daemon/http-server.d.ts +4 -0
  168. package/dist/daemon/http-server.d.ts.map +1 -0
  169. package/dist/daemon/http-server.js +535 -0
  170. package/dist/daemon/http-server.js.map +1 -0
  171. package/dist/daemon/id-validation.d.ts +2 -0
  172. package/dist/daemon/id-validation.d.ts.map +1 -0
  173. package/dist/daemon/id-validation.js +5 -0
  174. package/dist/daemon/id-validation.js.map +1 -0
  175. package/dist/daemon/path-deny.d.ts +14 -0
  176. package/dist/daemon/path-deny.d.ts.map +1 -0
  177. package/dist/daemon/path-deny.js +88 -0
  178. package/dist/daemon/path-deny.js.map +1 -0
  179. package/dist/daemon/posttool-decision-escrow.d.ts +42 -0
  180. package/dist/daemon/posttool-decision-escrow.d.ts.map +1 -0
  181. package/dist/daemon/posttool-decision-escrow.js +349 -0
  182. package/dist/daemon/posttool-decision-escrow.js.map +1 -0
  183. package/dist/daemon/posttool-decision-state.d.ts +65 -0
  184. package/dist/daemon/posttool-decision-state.d.ts.map +1 -0
  185. package/dist/daemon/posttool-decision-state.js +223 -0
  186. package/dist/daemon/posttool-decision-state.js.map +1 -0
  187. package/dist/daemon/posttool-enforcement.d.ts +7 -0
  188. package/dist/daemon/posttool-enforcement.d.ts.map +1 -0
  189. package/dist/daemon/posttool-enforcement.js +511 -0
  190. package/dist/daemon/posttool-enforcement.js.map +1 -0
  191. package/dist/daemon/posttool-render.d.ts +48 -0
  192. package/dist/daemon/posttool-render.d.ts.map +1 -0
  193. package/dist/daemon/posttool-render.js +335 -0
  194. package/dist/daemon/posttool-render.js.map +1 -0
  195. package/dist/daemon/pretool-decision-escrow.d.ts +51 -0
  196. package/dist/daemon/pretool-decision-escrow.d.ts.map +1 -0
  197. package/dist/daemon/pretool-decision-escrow.js +295 -0
  198. package/dist/daemon/pretool-decision-escrow.js.map +1 -0
  199. package/dist/daemon/pretool-url-gate.d.ts +17 -0
  200. package/dist/daemon/pretool-url-gate.d.ts.map +1 -0
  201. package/dist/daemon/pretool-url-gate.js +60 -0
  202. package/dist/daemon/pretool-url-gate.js.map +1 -0
  203. package/dist/daemon/prompt-input-enforcement.d.ts +18 -0
  204. package/dist/daemon/prompt-input-enforcement.d.ts.map +1 -0
  205. package/dist/daemon/prompt-input-enforcement.js +248 -0
  206. package/dist/daemon/prompt-input-enforcement.js.map +1 -0
  207. package/dist/daemon/reply-parser.d.ts +10 -0
  208. package/dist/daemon/reply-parser.d.ts.map +1 -0
  209. package/dist/daemon/reply-parser.js +81 -0
  210. package/dist/daemon/reply-parser.js.map +1 -0
  211. package/dist/daemon/resolve-escalation-route.d.ts +5 -0
  212. package/dist/daemon/resolve-escalation-route.d.ts.map +1 -0
  213. package/dist/daemon/resolve-escalation-route.js +85 -0
  214. package/dist/daemon/resolve-escalation-route.js.map +1 -0
  215. package/dist/daemon/response-cache.d.ts +14 -0
  216. package/dist/daemon/response-cache.d.ts.map +1 -0
  217. package/dist/daemon/response-cache.js +38 -0
  218. package/dist/daemon/response-cache.js.map +1 -0
  219. package/dist/daemon/security-frame.d.ts +14 -0
  220. package/dist/daemon/security-frame.d.ts.map +1 -0
  221. package/dist/daemon/security-frame.js +96 -0
  222. package/dist/daemon/security-frame.js.map +1 -0
  223. package/dist/daemon/session-hook-routes.d.ts +3 -0
  224. package/dist/daemon/session-hook-routes.d.ts.map +1 -0
  225. package/dist/daemon/session-hook-routes.js +66 -0
  226. package/dist/daemon/session-hook-routes.js.map +1 -0
  227. package/dist/daemon/session-state.d.ts +52 -0
  228. package/dist/daemon/session-state.d.ts.map +1 -0
  229. package/dist/daemon/session-state.js +495 -0
  230. package/dist/daemon/session-state.js.map +1 -0
  231. package/dist/daemon/subagent-lifecycle.d.ts +8 -0
  232. package/dist/daemon/subagent-lifecycle.d.ts.map +1 -0
  233. package/dist/daemon/subagent-lifecycle.js +56 -0
  234. package/dist/daemon/subagent-lifecycle.js.map +1 -0
  235. package/dist/daemon/tool-output-redactor.d.ts +13 -0
  236. package/dist/daemon/tool-output-redactor.d.ts.map +1 -0
  237. package/dist/daemon/tool-output-redactor.js +82 -0
  238. package/dist/daemon/tool-output-redactor.js.map +1 -0
  239. package/dist/daemon/tool-policy.d.ts +16 -0
  240. package/dist/daemon/tool-policy.d.ts.map +1 -0
  241. package/dist/daemon/tool-policy.js +60 -0
  242. package/dist/daemon/tool-policy.js.map +1 -0
  243. package/dist/daemon/tool-response-normalizer.d.ts +11 -0
  244. package/dist/daemon/tool-response-normalizer.d.ts.map +1 -0
  245. package/dist/daemon/tool-response-normalizer.js +67 -0
  246. package/dist/daemon/tool-response-normalizer.js.map +1 -0
  247. package/dist/daemon/truncate.d.ts +3 -0
  248. package/dist/daemon/truncate.d.ts.map +1 -0
  249. package/dist/daemon/truncate.js +22 -0
  250. package/dist/daemon/truncate.js.map +1 -0
  251. package/dist/daemon/url-access-baseline.d.ts +46 -0
  252. package/dist/daemon/url-access-baseline.d.ts.map +1 -0
  253. package/dist/daemon/url-access-baseline.js +154 -0
  254. package/dist/daemon/url-access-baseline.js.map +1 -0
  255. package/dist/daemon/url-block-decisions.d.ts +27 -0
  256. package/dist/daemon/url-block-decisions.d.ts.map +1 -0
  257. package/dist/daemon/url-block-decisions.js +100 -0
  258. package/dist/daemon/url-block-decisions.js.map +1 -0
  259. package/dist/daemon/url-extractor.d.ts +7 -0
  260. package/dist/daemon/url-extractor.d.ts.map +1 -0
  261. package/dist/daemon/url-extractor.js +101 -0
  262. package/dist/daemon/url-extractor.js.map +1 -0
  263. package/dist/daemon/userprompt-decision-escrow.d.ts +45 -0
  264. package/dist/daemon/userprompt-decision-escrow.d.ts.map +1 -0
  265. package/dist/daemon/userprompt-decision-escrow.js +248 -0
  266. package/dist/daemon/userprompt-decision-escrow.js.map +1 -0
  267. package/dist/daemon/vge-client.d.ts +64 -0
  268. package/dist/daemon/vge-client.d.ts.map +1 -0
  269. package/dist/daemon/vge-client.js +453 -0
  270. package/dist/daemon/vge-client.js.map +1 -0
  271. package/dist/daemon/vge-connectivity.d.ts +27 -0
  272. package/dist/daemon/vge-connectivity.d.ts.map +1 -0
  273. package/dist/daemon/vge-connectivity.js +214 -0
  274. package/dist/daemon/vge-connectivity.js.map +1 -0
  275. package/dist/daemon/vge-health-route.d.ts +4 -0
  276. package/dist/daemon/vge-health-route.d.ts.map +1 -0
  277. package/dist/daemon/vge-health-route.js +107 -0
  278. package/dist/daemon/vge-health-route.js.map +1 -0
  279. package/dist/daemon/vge-overload-backpressure.d.ts +51 -0
  280. package/dist/daemon/vge-overload-backpressure.d.ts.map +1 -0
  281. package/dist/daemon/vge-overload-backpressure.js +79 -0
  282. package/dist/daemon/vge-overload-backpressure.js.map +1 -0
  283. package/dist/daemon/vge-scan-failure-policy.d.ts +8 -0
  284. package/dist/daemon/vge-scan-failure-policy.d.ts.map +1 -0
  285. package/dist/daemon/vge-scan-failure-policy.js +12 -0
  286. package/dist/daemon/vge-scan-failure-policy.js.map +1 -0
  287. package/dist/shared/audit-writer.d.ts +9 -0
  288. package/dist/shared/audit-writer.d.ts.map +1 -0
  289. package/dist/shared/audit-writer.js +72 -0
  290. package/dist/shared/audit-writer.js.map +1 -0
  291. package/dist/shared/blocking-decision-choices.d.ts +13 -0
  292. package/dist/shared/blocking-decision-choices.d.ts.map +1 -0
  293. package/dist/shared/blocking-decision-choices.js +40 -0
  294. package/dist/shared/blocking-decision-choices.js.map +1 -0
  295. package/dist/shared/blocking-decision-reply.d.ts +13 -0
  296. package/dist/shared/blocking-decision-reply.d.ts.map +1 -0
  297. package/dist/shared/blocking-decision-reply.js +78 -0
  298. package/dist/shared/blocking-decision-reply.js.map +1 -0
  299. package/dist/shared/build-stamp.d.ts +7 -0
  300. package/dist/shared/build-stamp.d.ts.map +1 -0
  301. package/dist/shared/build-stamp.js +23 -0
  302. package/dist/shared/build-stamp.js.map +1 -0
  303. package/dist/shared/config-io.d.ts +41 -0
  304. package/dist/shared/config-io.d.ts.map +1 -0
  305. package/dist/shared/config-io.js +105 -0
  306. package/dist/shared/config-io.js.map +1 -0
  307. package/dist/shared/config-schema.d.ts +467 -0
  308. package/dist/shared/config-schema.d.ts.map +1 -0
  309. package/dist/shared/config-schema.js +281 -0
  310. package/dist/shared/config-schema.js.map +1 -0
  311. package/dist/shared/daemon-token.d.ts +7 -0
  312. package/dist/shared/daemon-token.d.ts.map +1 -0
  313. package/dist/shared/daemon-token.js +45 -0
  314. package/dist/shared/daemon-token.js.map +1 -0
  315. package/dist/shared/detect-os-user.d.ts +8 -0
  316. package/dist/shared/detect-os-user.d.ts.map +1 -0
  317. package/dist/shared/detect-os-user.js +34 -0
  318. package/dist/shared/detect-os-user.js.map +1 -0
  319. package/dist/shared/effective-client-id.d.ts +6 -0
  320. package/dist/shared/effective-client-id.d.ts.map +1 -0
  321. package/dist/shared/effective-client-id.js +22 -0
  322. package/dist/shared/effective-client-id.js.map +1 -0
  323. package/dist/shared/ipc-address.d.ts +10 -0
  324. package/dist/shared/ipc-address.d.ts.map +1 -0
  325. package/dist/shared/ipc-address.js +33 -0
  326. package/dist/shared/ipc-address.js.map +1 -0
  327. package/dist/shared/ipc-protocol.d.ts +60 -0
  328. package/dist/shared/ipc-protocol.d.ts.map +1 -0
  329. package/dist/shared/ipc-protocol.js +2 -0
  330. package/dist/shared/ipc-protocol.js.map +1 -0
  331. package/dist/shared/path-match.d.ts +4 -0
  332. package/dist/shared/path-match.d.ts.map +1 -0
  333. package/dist/shared/path-match.js +15 -0
  334. package/dist/shared/path-match.js.map +1 -0
  335. package/dist/shared/private-file.d.ts +17 -0
  336. package/dist/shared/private-file.d.ts.map +1 -0
  337. package/dist/shared/private-file.js +144 -0
  338. package/dist/shared/private-file.js.map +1 -0
  339. package/dist/shared/runtime-lock.d.ts +30 -0
  340. package/dist/shared/runtime-lock.d.ts.map +1 -0
  341. package/dist/shared/runtime-lock.js +142 -0
  342. package/dist/shared/runtime-lock.js.map +1 -0
  343. package/dist/shared/system-ca.d.ts +2 -0
  344. package/dist/shared/system-ca.d.ts.map +1 -0
  345. package/dist/shared/system-ca.js +31 -0
  346. package/dist/shared/system-ca.js.map +1 -0
  347. package/dist/shared/types.d.ts +172 -0
  348. package/dist/shared/types.d.ts.map +1 -0
  349. package/dist/shared/types.js +2 -0
  350. package/dist/shared/types.js.map +1 -0
  351. package/dist/shared/url-allowlist.d.ts +4 -0
  352. package/dist/shared/url-allowlist.d.ts.map +1 -0
  353. package/dist/shared/url-allowlist.js +33 -0
  354. package/dist/shared/url-allowlist.js.map +1 -0
  355. package/dist/shared/url-patterns.d.ts +12 -0
  356. package/dist/shared/url-patterns.d.ts.map +1 -0
  357. package/dist/shared/url-patterns.js +165 -0
  358. package/dist/shared/url-patterns.js.map +1 -0
  359. package/dist/shared/vge-url.d.ts +16 -0
  360. package/dist/shared/vge-url.d.ts.map +1 -0
  361. package/dist/shared/vge-url.js +75 -0
  362. package/dist/shared/vge-url.js.map +1 -0
  363. package/dist/shared/vge-verification.d.ts +18 -0
  364. package/dist/shared/vge-verification.d.ts.map +1 -0
  365. package/dist/shared/vge-verification.js +24 -0
  366. package/dist/shared/vge-verification.js.map +1 -0
  367. package/dist/shim/daemon-start-lock.d.ts +13 -0
  368. package/dist/shim/daemon-start-lock.d.ts.map +1 -0
  369. package/dist/shim/daemon-start-lock.js +26 -0
  370. package/dist/shim/daemon-start-lock.js.map +1 -0
  371. package/dist/shim/index.d.ts +17 -0
  372. package/dist/shim/index.d.ts.map +1 -0
  373. package/dist/shim/index.js +180 -0
  374. package/dist/shim/index.js.map +1 -0
  375. package/dist/shim/inline-resolver-terminal.d.ts +12 -0
  376. package/dist/shim/inline-resolver-terminal.d.ts.map +1 -0
  377. package/dist/shim/inline-resolver-terminal.js +201 -0
  378. package/dist/shim/inline-resolver-terminal.js.map +1 -0
  379. package/dist/shim/inline-resolver-transport.d.ts +15 -0
  380. package/dist/shim/inline-resolver-transport.d.ts.map +1 -0
  381. package/dist/shim/inline-resolver-transport.js +68 -0
  382. package/dist/shim/inline-resolver-transport.js.map +1 -0
  383. package/dist/shim/inline-resolver.d.ts +18 -0
  384. package/dist/shim/inline-resolver.d.ts.map +1 -0
  385. package/dist/shim/inline-resolver.js +152 -0
  386. package/dist/shim/inline-resolver.js.map +1 -0
  387. package/dist/shim/lazy-start.d.ts +2 -0
  388. package/dist/shim/lazy-start.d.ts.map +1 -0
  389. package/dist/shim/lazy-start.js +68 -0
  390. package/dist/shim/lazy-start.js.map +1 -0
  391. package/dist/tui/App.d.ts +7 -0
  392. package/dist/tui/App.d.ts.map +1 -0
  393. package/dist/tui/App.js +62 -0
  394. package/dist/tui/App.js.map +1 -0
  395. package/dist/tui/components/Banner.d.ts +9 -0
  396. package/dist/tui/components/Banner.d.ts.map +1 -0
  397. package/dist/tui/components/Banner.js +29 -0
  398. package/dist/tui/components/Banner.js.map +1 -0
  399. package/dist/tui/components/BlockingDecisionModal.d.ts +11 -0
  400. package/dist/tui/components/BlockingDecisionModal.d.ts.map +1 -0
  401. package/dist/tui/components/BlockingDecisionModal.js +34 -0
  402. package/dist/tui/components/BlockingDecisionModal.js.map +1 -0
  403. package/dist/tui/components/ScreenChrome.d.ts +20 -0
  404. package/dist/tui/components/ScreenChrome.d.ts.map +1 -0
  405. package/dist/tui/components/ScreenChrome.js +30 -0
  406. package/dist/tui/components/ScreenChrome.js.map +1 -0
  407. package/dist/tui/components/SelectList.d.ts +14 -0
  408. package/dist/tui/components/SelectList.d.ts.map +1 -0
  409. package/dist/tui/components/SelectList.js +22 -0
  410. package/dist/tui/components/SelectList.js.map +1 -0
  411. package/dist/tui/components/TextField.d.ts +11 -0
  412. package/dist/tui/components/TextField.d.ts.map +1 -0
  413. package/dist/tui/components/TextField.js +34 -0
  414. package/dist/tui/components/TextField.js.map +1 -0
  415. package/dist/tui/lib/audit-log.d.ts +19 -0
  416. package/dist/tui/lib/audit-log.d.ts.map +1 -0
  417. package/dist/tui/lib/audit-log.js +49 -0
  418. package/dist/tui/lib/audit-log.js.map +1 -0
  419. package/dist/tui/lib/cc-permissions-audit.d.ts +24 -0
  420. package/dist/tui/lib/cc-permissions-audit.d.ts.map +1 -0
  421. package/dist/tui/lib/cc-permissions-audit.js +40 -0
  422. package/dist/tui/lib/cc-permissions-audit.js.map +1 -0
  423. package/dist/tui/lib/cc-permissions-defaults.d.ts +32 -0
  424. package/dist/tui/lib/cc-permissions-defaults.d.ts.map +1 -0
  425. package/dist/tui/lib/cc-permissions-defaults.js +171 -0
  426. package/dist/tui/lib/cc-permissions-defaults.js.map +1 -0
  427. package/dist/tui/lib/cc-permissions-io.d.ts +33 -0
  428. package/dist/tui/lib/cc-permissions-io.d.ts.map +1 -0
  429. package/dist/tui/lib/cc-permissions-io.js +165 -0
  430. package/dist/tui/lib/cc-permissions-io.js.map +1 -0
  431. package/dist/tui/lib/cc-permissions-ops.d.ts +19 -0
  432. package/dist/tui/lib/cc-permissions-ops.d.ts.map +1 -0
  433. package/dist/tui/lib/cc-permissions-ops.js +75 -0
  434. package/dist/tui/lib/cc-permissions-ops.js.map +1 -0
  435. package/dist/tui/lib/cc-permissions-scope.d.ts +15 -0
  436. package/dist/tui/lib/cc-permissions-scope.d.ts.map +1 -0
  437. package/dist/tui/lib/cc-permissions-scope.js +97 -0
  438. package/dist/tui/lib/cc-permissions-scope.js.map +1 -0
  439. package/dist/tui/lib/config-save.d.ts +14 -0
  440. package/dist/tui/lib/config-save.d.ts.map +1 -0
  441. package/dist/tui/lib/config-save.js +39 -0
  442. package/dist/tui/lib/config-save.js.map +1 -0
  443. package/dist/tui/lib/daemon-client.d.ts +67 -0
  444. package/dist/tui/lib/daemon-client.d.ts.map +1 -0
  445. package/dist/tui/lib/daemon-client.js +213 -0
  446. package/dist/tui/lib/daemon-client.js.map +1 -0
  447. package/dist/tui/lib/decision-stream.d.ts +29 -0
  448. package/dist/tui/lib/decision-stream.d.ts.map +1 -0
  449. package/dist/tui/lib/decision-stream.js +77 -0
  450. package/dist/tui/lib/decision-stream.js.map +1 -0
  451. package/dist/tui/lib/number-validate.d.ts +9 -0
  452. package/dist/tui/lib/number-validate.d.ts.map +1 -0
  453. package/dist/tui/lib/number-validate.js +12 -0
  454. package/dist/tui/lib/number-validate.js.map +1 -0
  455. package/dist/tui/lib/session-files.d.ts +9 -0
  456. package/dist/tui/lib/session-files.d.ts.map +1 -0
  457. package/dist/tui/lib/session-files.js +39 -0
  458. package/dist/tui/lib/session-files.js.map +1 -0
  459. package/dist/tui/lib/stats.d.ts +19 -0
  460. package/dist/tui/lib/stats.d.ts.map +1 -0
  461. package/dist/tui/lib/stats.js +72 -0
  462. package/dist/tui/lib/stats.js.map +1 -0
  463. package/dist/tui/lib/test-connection.d.ts +12 -0
  464. package/dist/tui/lib/test-connection.d.ts.map +1 -0
  465. package/dist/tui/lib/test-connection.js +59 -0
  466. package/dist/tui/lib/test-connection.js.map +1 -0
  467. package/dist/tui/lib/tools-policy-ops.d.ts +9 -0
  468. package/dist/tui/lib/tools-policy-ops.d.ts.map +1 -0
  469. package/dist/tui/lib/tools-policy-ops.js +30 -0
  470. package/dist/tui/lib/tools-policy-ops.js.map +1 -0
  471. package/dist/tui/lib/verified-at.d.ts +37 -0
  472. package/dist/tui/lib/verified-at.d.ts.map +1 -0
  473. package/dist/tui/lib/verified-at.js +47 -0
  474. package/dist/tui/lib/verified-at.js.map +1 -0
  475. package/dist/tui/screens/ApiKeys.d.ts +8 -0
  476. package/dist/tui/screens/ApiKeys.d.ts.map +1 -0
  477. package/dist/tui/screens/ApiKeys.js +250 -0
  478. package/dist/tui/screens/ApiKeys.js.map +1 -0
  479. package/dist/tui/screens/AuditViewer.d.ts +8 -0
  480. package/dist/tui/screens/AuditViewer.d.ts.map +1 -0
  481. package/dist/tui/screens/AuditViewer.js +56 -0
  482. package/dist/tui/screens/AuditViewer.js.map +1 -0
  483. package/dist/tui/screens/ContextIngressPolicy.d.ts +7 -0
  484. package/dist/tui/screens/ContextIngressPolicy.d.ts.map +1 -0
  485. package/dist/tui/screens/ContextIngressPolicy.js +145 -0
  486. package/dist/tui/screens/ContextIngressPolicy.js.map +1 -0
  487. package/dist/tui/screens/LiveEvents.d.ts +7 -0
  488. package/dist/tui/screens/LiveEvents.d.ts.map +1 -0
  489. package/dist/tui/screens/LiveEvents.js +72 -0
  490. package/dist/tui/screens/LiveEvents.js.map +1 -0
  491. package/dist/tui/screens/MainMenu.d.ts +11 -0
  492. package/dist/tui/screens/MainMenu.d.ts.map +1 -0
  493. package/dist/tui/screens/MainMenu.js +35 -0
  494. package/dist/tui/screens/MainMenu.js.map +1 -0
  495. package/dist/tui/screens/NativeCcPermissions.d.ts +7 -0
  496. package/dist/tui/screens/NativeCcPermissions.d.ts.map +1 -0
  497. package/dist/tui/screens/NativeCcPermissions.js +249 -0
  498. package/dist/tui/screens/NativeCcPermissions.js.map +1 -0
  499. package/dist/tui/screens/PendingEscalations.d.ts +7 -0
  500. package/dist/tui/screens/PendingEscalations.d.ts.map +1 -0
  501. package/dist/tui/screens/PendingEscalations.js +83 -0
  502. package/dist/tui/screens/PendingEscalations.js.map +1 -0
  503. package/dist/tui/screens/SecurityBaseline.d.ts +7 -0
  504. package/dist/tui/screens/SecurityBaseline.d.ts.map +1 -0
  505. package/dist/tui/screens/SecurityBaseline.js +272 -0
  506. package/dist/tui/screens/SecurityBaseline.js.map +1 -0
  507. package/dist/tui/screens/Stats.d.ts +7 -0
  508. package/dist/tui/screens/Stats.d.ts.map +1 -0
  509. package/dist/tui/screens/Stats.js +36 -0
  510. package/dist/tui/screens/Stats.js.map +1 -0
  511. package/dist/tui/screens/ToolsPolicy.d.ts +7 -0
  512. package/dist/tui/screens/ToolsPolicy.d.ts.map +1 -0
  513. package/dist/tui/screens/ToolsPolicy.js +87 -0
  514. package/dist/tui/screens/ToolsPolicy.js.map +1 -0
  515. package/dist/tui/screens/ViewConfig.d.ts +9 -0
  516. package/dist/tui/screens/ViewConfig.d.ts.map +1 -0
  517. package/dist/tui/screens/ViewConfig.js +117 -0
  518. package/dist/tui/screens/ViewConfig.js.map +1 -0
  519. package/dist/tui/strings.d.ts +97 -0
  520. package/dist/tui/strings.d.ts.map +1 -0
  521. package/dist/tui/strings.js +104 -0
  522. package/dist/tui/strings.js.map +1 -0
  523. package/dist/tui/types.d.ts +5 -0
  524. package/dist/tui/types.d.ts.map +1 -0
  525. package/dist/tui/types.js +2 -0
  526. package/dist/tui/types.js.map +1 -0
  527. package/package.json +74 -0
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink';
3
+ import { App } from '../tui/App.js';
4
+ function lacksWindowsRawMode(input) {
5
+ return process.platform === 'win32' && typeof input.setRawMode !== 'function';
6
+ }
7
+ export async function runConfig() {
8
+ if (!process.stdin.isTTY) {
9
+ process.stderr.write('vge-cc-guard config: interactive TUI requires a real terminal (TTY).\n' +
10
+ 'For automated configuration, edit ~/.vge-cc-guard/config.json directly.\n');
11
+ process.exit(2);
12
+ }
13
+ if (lacksWindowsRawMode(process.stdin)) {
14
+ process.stderr.write('vge-cc-guard config: Windows interactive TUI requires raw terminal input.\n' +
15
+ 'Run it from Windows Terminal, PowerShell, or cmd.exe.\n');
16
+ process.exit(2);
17
+ }
18
+ // Switch to the terminal's alternate screen buffer so screen transitions
19
+ // (e.g. leaving ViewConfig back to MainMenu) start from a clean canvas
20
+ // instead of leaving the previous, larger render in the scrollback.
21
+ process.stdout.write('\x1b[?1049h\x1b[H');
22
+ const restore = () => {
23
+ process.stdout.write('\x1b[?1049l');
24
+ };
25
+ process.once('exit', restore);
26
+ const onClearScreen = () => {
27
+ // Wipe the alt-buffer (viewport + scrollback) and tell ink to forget its
28
+ // last frame so the next mount paints fresh from the top.
29
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
30
+ instance.clear();
31
+ };
32
+ const instance = render(_jsx(App, { onClearScreen: onClearScreen }));
33
+ try {
34
+ await instance.waitUntilExit();
35
+ }
36
+ finally {
37
+ process.off('exit', restore);
38
+ restore();
39
+ }
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,SAAS,mBAAmB,CAAC,KAA2B;IACtD,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wEAAwE;YACtE,2EAA2E,CAC9E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6EAA6E;YAC3E,yDAAyD,CAC5D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,yEAAyE;IACzE,uEAAuE;IACvE,oEAAoE;IACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9B,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,yEAAyE;QACzE,0DAA0D;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAC,GAAG,IAAC,aAAa,EAAE,aAAa,GAAI,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runDaemonCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BpE"}
@@ -0,0 +1,116 @@
1
+ import { startDaemon } from '../daemon/http-server.js';
2
+ import { post } from '../tui/lib/daemon-client.js';
3
+ const USAGE = 'Usage: vge-cc-guard daemon status|reload|stop|restart';
4
+ export async function runDaemonCommand(args) {
5
+ const subcommand = args[0];
6
+ if (!subcommand) {
7
+ await startDaemon();
8
+ return;
9
+ }
10
+ if (subcommand === 'status') {
11
+ await printStatus();
12
+ return;
13
+ }
14
+ if (subcommand === 'reload') {
15
+ await reloadDaemon();
16
+ return;
17
+ }
18
+ if (subcommand === 'stop') {
19
+ await stopDaemon();
20
+ return;
21
+ }
22
+ if (subcommand === 'restart') {
23
+ await restartDaemon();
24
+ return;
25
+ }
26
+ console.error(USAGE);
27
+ process.exitCode = 1;
28
+ }
29
+ async function printStatus() {
30
+ const status = await readStatus();
31
+ if (!status.ok) {
32
+ console.log('Daemon status: not_running');
33
+ return;
34
+ }
35
+ const stale = status.staleBuild ? ' stale_build' : '';
36
+ console.log(`Daemon status: running pid=${status.pid} configRevision=${status.configRevision} ` +
37
+ `build=${status.binarySha256.slice(0, 12)}${stale}`);
38
+ }
39
+ async function reloadDaemon() {
40
+ try {
41
+ const response = await post('/v1/control/reload-config', {});
42
+ const revision = numberField(response.json, 'configRevision');
43
+ if (response.status >= 200 && response.status < 300 && revision !== null) {
44
+ console.log(`Daemon reloaded config revision ${revision}.`);
45
+ return;
46
+ }
47
+ console.error(`Daemon reload failed: ${errorField(response.json) ?? `HTTP ${response.status}`}`);
48
+ process.exitCode = 1;
49
+ }
50
+ catch (err) {
51
+ console.error(`Daemon reload failed: ${errorMessage(err)}`);
52
+ process.exitCode = 1;
53
+ }
54
+ }
55
+ async function stopDaemon() {
56
+ try {
57
+ const response = await post('/v1/control/stop', {});
58
+ if (response.status >= 200 && response.status < 300) {
59
+ console.log('Daemon stopping.');
60
+ return;
61
+ }
62
+ console.error(`Daemon stop failed: ${errorField(response.json) ?? `HTTP ${response.status}`}`);
63
+ process.exitCode = 1;
64
+ }
65
+ catch {
66
+ console.log('Daemon status: not_running');
67
+ }
68
+ }
69
+ async function restartDaemon() {
70
+ const status = await readStatus();
71
+ if (status.ok && status.pendingDecisionCount > 0) {
72
+ console.error(`Daemon restart refused: ${status.pendingDecisionCount} pending decision(s).`);
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ console.error('Daemon restart is not implemented yet. Use `vge-cc-guard daemon stop`, then start the daemon again.');
77
+ process.exitCode = 1;
78
+ }
79
+ async function readStatus() {
80
+ try {
81
+ const response = await post('/v1/control/status', {});
82
+ if (response.status < 200 || response.status >= 300)
83
+ return { ok: false };
84
+ const json = response.json;
85
+ const build = typeof json['build'] === 'object' && json['build'] !== null
86
+ ? json['build']
87
+ : {};
88
+ return {
89
+ ok: true,
90
+ pid: numberField(json, 'pid') ?? 0,
91
+ configRevision: numberField(json, 'configRevision') ?? 0,
92
+ staleBuild: json['staleBuild'] === true,
93
+ pendingDecisionCount: numberField(json, 'pendingDecisionCount') ?? 0,
94
+ binarySha256: typeof build['binarySha256'] === 'string' ? build['binarySha256'] : 'unknown',
95
+ };
96
+ }
97
+ catch {
98
+ return { ok: false };
99
+ }
100
+ }
101
+ function numberField(json, field) {
102
+ if (typeof json !== 'object' || json === null)
103
+ return null;
104
+ const value = json[field];
105
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
106
+ }
107
+ function errorField(json) {
108
+ if (typeof json !== 'object' || json === null)
109
+ return null;
110
+ const value = json['error'];
111
+ return typeof value === 'string' ? value : null;
112
+ }
113
+ function errorMessage(err) {
114
+ return err instanceof Error ? err.message : String(err);
115
+ }
116
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDoctor(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7D"}
@@ -0,0 +1,53 @@
1
+ import { ccContractNextAction, createCcContractStatus, getCcContractHealth, writeCcContractStatus, } from '../daemon/cc-contract-status.js';
2
+ import { checkVgeConnectivity } from '../daemon/vge-connectivity.js';
3
+ import { readConfigOrDefault } from '../shared/config-io.js';
4
+ export async function runDoctor(args) {
5
+ if (!args.includes('--cc-contract')) {
6
+ const skipVge = args.includes('--no-vge');
7
+ const health = getCcContractHealth();
8
+ console.log(`Claude Code contract state: ${health.state}`);
9
+ console.log(`L0 output replacement: ${health.l0RedactionAvailable ? 'enabled' : 'disabled'}`);
10
+ console.log(`Reason: ${health.reason}`);
11
+ console.log(`Next action: ${ccContractNextAction(health.reason)}`);
12
+ console.log(`Claude Code version: ${health.claudeVersion ?? 'unknown'}`);
13
+ console.log(`Live contract: ${health.liveContract ?? 'unknown'}`);
14
+ console.log(`Checked at: ${health.checkedAt ?? 'never'}`);
15
+ if (skipVge) {
16
+ console.log('VGE connectivity: skipped (--no-vge)');
17
+ return;
18
+ }
19
+ const vgeHealth = await checkVgeConnectivity(readConfigOrDefault());
20
+ console.log(`VGE connectivity: ${vgeHealth.ok ? 'healthy' : 'degraded'}`);
21
+ console.log(`VGE API URL: ${vgeHealth.apiUrl ?? 'unknown'}`);
22
+ console.log(`VGE input key: ${vgeHealth.inputKey}`);
23
+ console.log(`VGE output key: ${vgeHealth.outputKey}`);
24
+ if (!vgeHealth.ok) {
25
+ console.log(`VGE reason: ${vgeHealth.failureReason ?? 'unknown'}`);
26
+ console.log(`VGE next action: ${vgeNextAction(vgeHealth.failureReason)}`);
27
+ }
28
+ return;
29
+ }
30
+ const assumeLivePassed = args.includes('--assume-live-pass');
31
+ if (assumeLivePassed) {
32
+ console.warn('WARNING: --assume-live-pass marks the Claude Code contract healthy without running a live verification. L0 redaction may be enabled based on this manual override.');
33
+ }
34
+ const status = createCcContractStatus({ assumeLivePassed });
35
+ const target = writeCcContractStatus(status);
36
+ console.log(`Claude Code contract status: ${status.status}`);
37
+ console.log(`Claude Code version: ${status.claudeVersion}`);
38
+ console.log(`Live contract: ${status.liveContract ?? 'unknown'}`);
39
+ console.log(`Wrote: ${target}`);
40
+ }
41
+ function vgeNextAction(reason) {
42
+ if (reason === 'config_missing') {
43
+ return 'Set VGE API URL and input key, then run Test Connection from API Keys.';
44
+ }
45
+ if (reason === 'auth_failed') {
46
+ return 'Verify the input and output key roles for the configured VGE endpoint.';
47
+ }
48
+ if (reason === 'tls_error') {
49
+ return 'Verify system CA trust for the daemon process and restart the daemon.';
50
+ }
51
+ return 'Check daemon Runtime VGE status and verify endpoint, CA trust, and key role configuration.';
52
+ }
53
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInstallWizard(initialScope: 'user' | 'project'): Promise<void>;
2
+ //# sourceMappingURL=install-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-wizard.d.ts","sourceRoot":"","sources":["../../src/commands/install-wizard.tsx"],"names":[],"mappings":"AAkIA,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtF"}
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Box, Text, render, useApp, useInput } from 'ink';
4
+ import { runInstallHeadless } from './install.js';
5
+ import { SelectList } from '../tui/components/SelectList.js';
6
+ import { App as ConfigApp } from '../tui/App.js';
7
+ function Wizard({ initialScope, onExit }) {
8
+ const [s, setS] = useState({
9
+ step: 'scope',
10
+ scope: initialScope,
11
+ mode: 'apply',
12
+ result: null,
13
+ error: null,
14
+ });
15
+ useInput((input, key) => {
16
+ if (s.step === 'done') {
17
+ if (key.return)
18
+ onExit(false);
19
+ else if (input === 'y')
20
+ onExit(true);
21
+ else if (input === 'n')
22
+ onExit(false);
23
+ }
24
+ });
25
+ if (s.step === 'scope') {
26
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Install scope" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectList, { items: [
27
+ { key: 'user', label: 'User (~/.claude/settings.json)', description: 'Recommended — applies to all projects' },
28
+ { key: 'project', label: 'Project (./.claude/settings.json)', description: 'Only this project' },
29
+ ], initialIndex: initialScope === 'user' ? 0 : 1, onSelect: (k) => setS({ ...s, scope: k, step: 'mode' }) }) })] }));
30
+ }
31
+ if (s.step === 'mode') {
32
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Install mode" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectList, { items: [
33
+ { key: 'apply', label: 'Apply', description: 'Write hooks to settings.json' },
34
+ { key: 'dry-run', label: 'Dry run', description: 'Preview changes without writing' },
35
+ ], onSelect: (k) => {
36
+ const next = { ...s, mode: k, step: 'running' };
37
+ setS(next);
38
+ setTimeout(() => {
39
+ try {
40
+ const r = runInstallHeadless({ scope: next.scope, mode: next.mode });
41
+ setS({ ...next, step: 'done', result: r });
42
+ }
43
+ catch (e) {
44
+ setS({ ...next, step: 'done', error: e instanceof Error ? e.message : String(e) });
45
+ }
46
+ }, 0);
47
+ } }) })] }));
48
+ }
49
+ if (s.step === 'running') {
50
+ return _jsx(Text, { children: "Installing\u2026" });
51
+ }
52
+ // step === 'done'
53
+ if (s.error) {
54
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "red", children: ["\u2717 Install failed: ", s.error] }), _jsx(Text, { dimColor: true, children: "Enter to exit" })] }));
55
+ }
56
+ const r = s.result;
57
+ if (r.mode === 'dry-run') {
58
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Dry run \u2014 no files written" }), r.added.length === 0 ? (_jsx(Text, { children: "(already installed \u2014 no changes needed)" })) : (r.added.map((ev) => _jsx(Text, { children: ` + ${ev}` }, ev))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Enter to exit" }) })] }));
59
+ }
60
+ if (r.alreadyInstalled) {
61
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: "vge-cc-guard hooks already installed." }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Enter to exit" }) })] }));
62
+ }
63
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "green", children: ["\u2713 Hooks installed to ", r.settingsPath] }), _jsx(Text, { children: "Restart Claude Code to activate." }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Configure API key now? (y / n)" }) })] }));
64
+ }
65
+ export async function runInstallWizard(initialScope) {
66
+ let offerConfig = false;
67
+ await new Promise((resolve) => {
68
+ const Mount = () => {
69
+ const { exit } = useApp();
70
+ return (_jsx(Wizard, { initialScope: initialScope, onExit: (oc) => {
71
+ offerConfig = oc;
72
+ exit();
73
+ } }));
74
+ };
75
+ const inst = render(_jsx(Mount, {}));
76
+ inst.waitUntilExit().then(() => resolve());
77
+ });
78
+ if (offerConfig) {
79
+ await new Promise((resolve) => {
80
+ const inst = render(_jsx(ConfigApp, {}));
81
+ inst.waitUntilExit().then(() => resolve());
82
+ });
83
+ }
84
+ }
85
+ //# sourceMappingURL=install-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-wizard.js","sourceRoot":"","sources":["../../src/commands/install-wizard.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAiBjD,SAAS,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,EAAS;IAC7C,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAQ;QAChC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,GAAG,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;iBACzB,IAAI,KAAK,KAAK,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC;iBAChC,IAAI,KAAK,KAAK,GAAG;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,oCAAqB,EAC/B,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,UAAU,IACT,KAAK,EAAE;4BACL,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gCAAgC,EAAE,WAAW,EAAE,uCAAuC,EAAE;4BAC9G,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,mCAAmC,EAAE,WAAW,EAAE,mBAAmB,EAAE;yBACjG,EACD,YAAY,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAuB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAC7E,GACE,IACF,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,mCAAoB,EAC9B,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,UAAU,IACT,KAAK,EAAE;4BACL,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,8BAA8B,EAAE;4BAC7E,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iCAAiC,EAAE;yBACrF,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,MAAM,IAAI,GAAU,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAwB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;4BAC9E,IAAI,CAAC,IAAI,CAAC,CAAC;4BACX,UAAU,CAAC,GAAG,EAAE;gCACd,IAAI,CAAC;oCACH,MAAM,CAAC,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oCACrE,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gCAC7C,CAAC;gCAAC,OAAO,CAAC,EAAE,CAAC;oCACX,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCACrF,CAAC;4BACH,CAAC,EAAE,CAAC,CAAC,CAAC;wBACR,CAAC,GACD,GACE,IACF,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,KAAC,IAAI,mCAAmB,CAAC;IAClC,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,wCAAoB,CAAC,CAAC,KAAK,IAAQ,EACpD,KAAC,IAAI,IAAC,QAAQ,oCAAqB,IAC/B,CACP,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC;IACpB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,sDAAkC,EAC3C,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,IAAI,+DAA+C,CACrD,CAAC,CAAC,CAAC,CACF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAC,IAAI,cAAW,OAAO,EAAE,EAAE,IAAhB,EAAE,CAAsB,CAAC,CACzD,EACD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,QAAQ,oCAAqB,GAAM,IACxD,CACP,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,wDAA6C,EAClD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,QAAQ,oCAAqB,GAAM,IACxD,CACP,CAAC;IACJ,CAAC;IACD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,2CAAuB,CAAC,CAAC,YAAY,IAAQ,EAChE,KAAC,IAAI,mDAAwC,EAC7C,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,iDAAsC,GACvC,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAgC;IACrE,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,GAAuB,EAAE;YACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;YAC1B,OAAO,CACL,KAAC,MAAM,IACL,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;oBACb,WAAW,GAAG,EAAE,CAAC;oBACjB,IAAI,EAAE,CAAC;gBACT,CAAC,GACD,CACH,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAC,KAAK,KAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type InstallScope } from './_lib/install-paths.js';
2
+ export interface InstallResult {
3
+ scope: InstallScope;
4
+ mode: 'apply' | 'dry-run';
5
+ alreadyInstalled: boolean;
6
+ settingsPath: string;
7
+ added: readonly string[];
8
+ applied: boolean;
9
+ }
10
+ export declare function runInstallHeadless(opts: {
11
+ scope: InstallScope;
12
+ mode: 'apply' | 'dry-run';
13
+ }): InstallResult;
14
+ export declare function runInstall(args: string[]): Promise<void>;
15
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAkEjC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAAG,aAAa,CAqC1G;AAwBD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9D"}
@@ -0,0 +1,136 @@
1
+ import fs from 'fs';
2
+ import * as path from 'path';
3
+ import { DEFAULT_CONFIG } from '../shared/config-schema.js';
4
+ import { chmodPrivateSync, writePrivateFileSync } from '../shared/private-file.js';
5
+ import { parseInstallFlags } from './_lib/parse-install-flags.js';
6
+ import { backupPath, installsDir, metaPath, resolveClaudeDir, resolveSettingsPath, resolveVgeDir, } from './_lib/install-paths.js';
7
+ const HOOK_EVENTS = ['UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'SessionStart', 'SessionEnd', 'SubagentStart', 'SubagentStop'];
8
+ const HOOK_COMMANDS = {
9
+ UserPromptSubmit: 'vge-cc-guard hook userprompt',
10
+ PreToolUse: 'vge-cc-guard hook pretool',
11
+ PostToolUse: 'vge-cc-guard hook posttool',
12
+ SessionStart: 'vge-cc-guard hook sessionstart',
13
+ SessionEnd: 'vge-cc-guard hook sessionend',
14
+ SubagentStart: 'vge-cc-guard hook subagentstart',
15
+ SubagentStop: 'vge-cc-guard hook subagentstop',
16
+ };
17
+ function readSettings(settingsPath) {
18
+ if (!fs.existsSync(settingsPath))
19
+ return {};
20
+ try {
21
+ return JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
22
+ }
23
+ catch {
24
+ throw new Error(`settings.json at ${settingsPath} is not valid JSON — aborting to avoid data loss.`);
25
+ }
26
+ }
27
+ function isHookPresent(settings, event) {
28
+ const hooks = settings['hooks'];
29
+ if (!hooks?.[event])
30
+ return false;
31
+ const entries = hooks[event];
32
+ return entries.some((e) => e.hooks?.some((h) => h.command?.includes('vge-cc-guard hook')));
33
+ }
34
+ function mergeHooks(settings) {
35
+ const merged = { ...settings };
36
+ const existingHooks = settings['hooks'] ?? {};
37
+ const newHooks = { ...existingHooks };
38
+ for (const event of HOOK_EVENTS) {
39
+ if (isHookPresent(settings, event))
40
+ continue;
41
+ const existing = newHooks[event] ?? [];
42
+ newHooks[event] = [
43
+ ...existing,
44
+ { matcher: '*', hooks: [{ type: 'command', command: HOOK_COMMANDS[event] }] },
45
+ ];
46
+ }
47
+ return { ...merged, hooks: newHooks };
48
+ }
49
+ // PR-review S2: crash-safe atomic write — fsync before rename so a power-loss
50
+ // between rename and the next OS flush can't leave a zero-length settings.json.
51
+ function writeAtomic(filePath, content) {
52
+ const tmp = filePath + '.tmp';
53
+ try {
54
+ writePrivateFileSync(tmp, content);
55
+ fs.renameSync(tmp, filePath);
56
+ chmodPrivateSync(filePath);
57
+ }
58
+ catch (error) {
59
+ fs.rmSync(tmp, { force: true });
60
+ throw error;
61
+ }
62
+ }
63
+ function writeDefaultConfig(configPath) {
64
+ if (!fs.existsSync(configPath)) {
65
+ writePrivateFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
66
+ }
67
+ }
68
+ export function runInstallHeadless(opts) {
69
+ const claudeDir = resolveClaudeDir(opts.scope);
70
+ const settingsPath = resolveSettingsPath(opts.scope);
71
+ const vgeDir = resolveVgeDir();
72
+ const current = readSettings(settingsPath);
73
+ const updated = mergeHooks(current);
74
+ const alreadyInstalled = HOOK_EVENTS.every((e) => isHookPresent(current, e));
75
+ const added = HOOK_EVENTS.filter((e) => !isHookPresent(current, e));
76
+ if (opts.mode === 'dry-run') {
77
+ return { scope: opts.scope, mode: 'dry-run', alreadyInstalled, settingsPath, added, applied: false };
78
+ }
79
+ fs.mkdirSync(vgeDir, { recursive: true });
80
+ fs.mkdirSync(path.join(vgeDir, 'sessions'), { recursive: true });
81
+ const configPath = path.join(vgeDir, 'config.json');
82
+ writeDefaultConfig(configPath);
83
+ if (alreadyInstalled) {
84
+ return { scope: opts.scope, mode: 'apply', alreadyInstalled: true, settingsPath, added: [], applied: false };
85
+ }
86
+ fs.mkdirSync(installsDir(), { recursive: true });
87
+ writePrivateFileSync(backupPath(settingsPath), JSON.stringify(current, null, 2));
88
+ const backupMeta = {
89
+ scope: opts.scope,
90
+ settingsPath,
91
+ installedAt: new Date().toISOString(),
92
+ };
93
+ writePrivateFileSync(metaPath(settingsPath), JSON.stringify(backupMeta, null, 2));
94
+ fs.mkdirSync(claudeDir, { recursive: true });
95
+ writeAtomic(settingsPath, JSON.stringify(updated, null, 2));
96
+ return { scope: opts.scope, mode: 'apply', alreadyInstalled: false, settingsPath, added, applied: true };
97
+ }
98
+ function printResult(r) {
99
+ if (r.mode === 'dry-run') {
100
+ console.log('\n[dry-run] Changes that would be applied to settings.json:');
101
+ if (r.added.length === 0)
102
+ console.log(' (already installed — no changes needed)');
103
+ else
104
+ for (const ev of r.added)
105
+ console.log(` + ${ev}: ${HOOK_COMMANDS[ev]}`);
106
+ console.log('\nRun with --apply to apply changes.\n');
107
+ return;
108
+ }
109
+ if (r.alreadyInstalled) {
110
+ console.log('vge-cc-guard hooks already installed. Nothing to do.');
111
+ return;
112
+ }
113
+ if (r.applied) {
114
+ console.log(`vge-cc-guard hooks installed to ${r.settingsPath}`);
115
+ console.log('Restart Claude Code to activate. Run `vge-cc-guard config` to set your API key.');
116
+ console.log('');
117
+ // PR-review W5: Write/Edit ship as gate=block by design (PRD §7.5).
118
+ console.log('NOTE: Write and Edit are gated as `block` by default for safety.');
119
+ console.log(' Run `vge-cc-guard config` (Tools Policy) to flip them per project.');
120
+ }
121
+ }
122
+ export async function runInstall(args) {
123
+ const flags = parseInstallFlags(args);
124
+ if (flags.mode === 'wizard') {
125
+ if (!process.stdin.isTTY) {
126
+ console.log('Use --apply to apply changes or --dry-run to preview.');
127
+ return;
128
+ }
129
+ const { runInstallWizard } = await import('./install-wizard.js');
130
+ await runInstallWizard(flags.scope);
131
+ return;
132
+ }
133
+ const result = runInstallHeadless({ scope: flags.scope, mode: flags.mode });
134
+ printResult(result);
135
+ }
136
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runResetSession(): Promise<void>;
2
+ //# sourceMappingURL=reset-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset-session.d.ts","sourceRoot":"","sources":["../../src/commands/reset-session.ts"],"names":[],"mappings":"AAyGA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BrD"}
@@ -0,0 +1,113 @@
1
+ import * as fs from 'fs';
2
+ import * as http from 'http';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import { getIpcAddress } from '../shared/ipc-address.js';
6
+ import { readDaemonToken, tokenHeader } from '../shared/daemon-token.js';
7
+ import { writePrivateFileSync } from '../shared/private-file.js';
8
+ function resolveVgeDir() {
9
+ return process.env['VGE_CC_GUARD_CONFIG_DIR'] ?? path.join(os.homedir(), '.vge-cc-guard');
10
+ }
11
+ function resolveSessionsDir() {
12
+ return path.join(resolveVgeDir(), 'sessions');
13
+ }
14
+ function resolveSocketPath() {
15
+ return getIpcAddress();
16
+ }
17
+ function loadSessions(sessionsDir) {
18
+ if (!fs.existsSync(sessionsDir))
19
+ return [];
20
+ const files = fs.readdirSync(sessionsDir).filter((f) => f.endsWith('.json'));
21
+ const sessions = [];
22
+ for (const file of files) {
23
+ const filePath = path.join(sessionsDir, file);
24
+ try {
25
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
26
+ sessions.push({
27
+ sessionId: data['sessionId'],
28
+ lastActivity: data['lastActivity'] ?? 0,
29
+ filePath,
30
+ data,
31
+ });
32
+ }
33
+ catch {
34
+ // skip malformed files
35
+ }
36
+ }
37
+ return sessions.sort((a, b) => b.lastActivity - a.lastActivity);
38
+ }
39
+ // PR-review C1: prefer the daemon's control endpoint so that in-memory state
40
+ // (sessionStore) is reset alongside the disk file. Falls back to disk-only
41
+ // mutation when the daemon isn't reachable.
42
+ function tryDaemonReset(sessionId) {
43
+ return new Promise((resolve) => {
44
+ const body = JSON.stringify({ session_id: sessionId });
45
+ const token = readDaemonToken();
46
+ const req = http.request({
47
+ socketPath: resolveSocketPath(),
48
+ path: '/v1/control/reset-session',
49
+ method: 'POST',
50
+ headers: {
51
+ 'Content-Type': 'application/json',
52
+ 'Content-Length': Buffer.byteLength(body),
53
+ ...(token ? tokenHeader(token) : {}),
54
+ },
55
+ timeout: 2_000,
56
+ }, (res) => {
57
+ res.on('data', () => undefined);
58
+ res.on('end', () => {
59
+ if (res.statusCode === 401) {
60
+ resolve('unauthorized');
61
+ return;
62
+ }
63
+ resolve((res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300 ? 'reset' : 'unreachable');
64
+ });
65
+ });
66
+ req.on('error', () => resolve('unreachable'));
67
+ req.on('timeout', () => {
68
+ req.destroy();
69
+ resolve('unreachable');
70
+ });
71
+ req.write(body);
72
+ req.end();
73
+ });
74
+ }
75
+ function resetOnDisk(target) {
76
+ const updated = {
77
+ ...target.data,
78
+ allowlist: [],
79
+ allowlistEscalationIds: {},
80
+ blocklist: [],
81
+ blocklistEscalationIds: {},
82
+ pendingEscalations: [],
83
+ escalationCount: 0,
84
+ urlAllowOnce: [],
85
+ state: 'clean',
86
+ };
87
+ writePrivateFileSync(target.filePath, JSON.stringify(updated, null, 2));
88
+ }
89
+ export async function runResetSession() {
90
+ const sessions = loadSessions(resolveSessionsDir());
91
+ if (sessions.length === 0) {
92
+ console.log('No active sessions found.');
93
+ return;
94
+ }
95
+ const target = sessions[0];
96
+ const daemonReset = await tryDaemonReset(target.sessionId);
97
+ if (daemonReset === 'reset') {
98
+ console.log(`Session reset (via daemon): ${target.sessionId}`);
99
+ console.log('The session will resume in clean state.');
100
+ return;
101
+ }
102
+ if (daemonReset === 'unauthorized') {
103
+ console.log('Session reset failed: daemon rejected the local authorization token.');
104
+ return;
105
+ }
106
+ // Daemon unreachable — disk-only fallback. Will be authoritative iff the
107
+ // daemon never starts back up; otherwise the daemon's next persistSession
108
+ // for this session would overwrite the reset.
109
+ resetOnDisk(target);
110
+ console.log(`Session reset (disk-only — daemon was not reachable): ${target.sessionId}`);
111
+ console.log('Restart Claude Code if the session looks stuck.');
112
+ }
113
+ //# sourceMappingURL=reset-session.js.map