@zivis/mcp 0.1.8 → 0.1.11

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 (346) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +19 -0
  3. package/dist/api-client.d.ts +2 -24
  4. package/dist/api-client.js +32 -52
  5. package/dist/auth/index.d.ts +1 -22
  6. package/dist/auth/index.js +17 -38
  7. package/dist/auth/jwt.d.ts +0 -16
  8. package/dist/auth/jwt.js +0 -13
  9. package/dist/auth/keychain.d.ts +6 -32
  10. package/dist/auth/keychain.js +83 -114
  11. package/dist/auth/oauth.d.ts +3 -32
  12. package/dist/auth/oauth.js +67 -61
  13. package/dist/auth/sessions.d.ts +5 -25
  14. package/dist/auth/sessions.js +20 -39
  15. package/dist/auth/token-refresh.d.ts +2 -22
  16. package/dist/auth/token-refresh.js +33 -36
  17. package/dist/cli.d.ts +1 -18
  18. package/dist/cli.js +30 -908
  19. package/dist/http-probe/capture.d.ts +51 -0
  20. package/dist/http-probe/capture.js +96 -0
  21. package/dist/http-probe/compare.d.ts +43 -0
  22. package/dist/http-probe/compare.js +117 -0
  23. package/dist/http-probe/index.d.ts +2 -0
  24. package/dist/http-probe/index.js +2 -0
  25. package/dist/index.d.ts +0 -6
  26. package/dist/index.js +0 -7
  27. package/dist/lib/inspect-cache.d.ts +10 -0
  28. package/dist/lib/inspect-cache.js +75 -0
  29. package/dist/lib/next-steps.d.ts +27 -0
  30. package/dist/lib/next-steps.js +21 -0
  31. package/dist/matcher/ast-eval.d.ts +8 -0
  32. package/dist/matcher/ast-eval.js +95 -0
  33. package/dist/matcher/finding.d.ts +55 -0
  34. package/dist/matcher/finding.js +1 -0
  35. package/dist/matcher/index.d.ts +8 -0
  36. package/dist/matcher/index.js +202 -0
  37. package/dist/matcher/inference-candidates.d.ts +26 -0
  38. package/dist/matcher/inference-candidates.js +81 -0
  39. package/dist/matcher/walker.d.ts +7 -0
  40. package/dist/matcher/walker.js +71 -0
  41. package/dist/pattern-pack/index.d.ts +125 -0
  42. package/dist/pattern-pack/index.js +189 -0
  43. package/dist/pattern-packs/zivis-public-0.2.0/capsules/agents/privilege-separation.yaml +224 -0
  44. package/dist/pattern-packs/zivis-public-0.2.0/capsules/prompting/self-consistency-no-isolation.yaml +237 -0
  45. package/dist/pattern-packs/zivis-public-0.2.0/capsules/retrieval/context-injection-no-validator.yaml +348 -0
  46. package/dist/pattern-packs/zivis-public-0.2.0/capsules/security/late-org-filter.yaml +266 -0
  47. package/dist/pattern-packs/zivis-public-0.2.0/controls/external_validator_on_facts.yaml +37 -0
  48. package/dist/pattern-packs/zivis-public-0.2.0/controls/fact_validator_present.yaml +68 -0
  49. package/dist/pattern-packs/zivis-public-0.2.0/controls/human_approval_gate.yaml +44 -0
  50. package/dist/pattern-packs/zivis-public-0.2.0/controls/langgraph_state_machine_with_per_node_tools.yaml +35 -0
  51. package/dist/pattern-packs/zivis-public-0.2.0/controls/per_sample_retrieval_diversification.yaml +38 -0
  52. package/dist/pattern-packs/zivis-public-0.2.0/controls/prisma_extension_or_middleware_attaching_org_filter.yaml +31 -0
  53. package/dist/pattern-packs/zivis-public-0.2.0/controls/row_level_security_policy.yaml +37 -0
  54. package/dist/pattern-packs/zivis-public-0.2.0/controls/source_attribution_present.yaml +58 -0
  55. package/dist/pattern-packs/zivis-public-0.2.0/manifest.json +167 -0
  56. package/dist/pattern-packs/zivis-public-0.2.0/prompts/agents/privilege-separation/identify.md +54 -0
  57. package/dist/pattern-packs/zivis-public-0.2.0/prompts/prompting/self-consistency-no-isolation/identify.md +60 -0
  58. package/dist/pattern-packs/zivis-public-0.2.0/prompts/retrieval/context-injection-no-validator/identify.md +109 -0
  59. package/dist/pattern-packs/zivis-public-0.2.0/prompts/security/late-org-filter/identify.md +78 -0
  60. package/dist/project-binding.d.ts +2 -19
  61. package/dist/project-binding.js +38 -21
  62. package/dist/prompts/audit-dependencies.d.ts +2 -0
  63. package/dist/prompts/audit-dependencies.js +47 -0
  64. package/dist/prompts/getting-started.d.ts +2 -0
  65. package/dist/prompts/getting-started.js +37 -0
  66. package/dist/prompts/index.d.ts +2 -0
  67. package/dist/prompts/index.js +6 -0
  68. package/dist/redact.d.ts +30 -0
  69. package/dist/redact.js +164 -0
  70. package/dist/resolve-application-id.d.ts +0 -4
  71. package/dist/resolve-application-id.js +0 -5
  72. package/dist/sanitize.d.ts +1 -21
  73. package/dist/sanitize.js +7 -41
  74. package/dist/scanners/index.d.ts +3 -0
  75. package/dist/scanners/index.js +2 -0
  76. package/dist/scanners/normalize.d.ts +6 -0
  77. package/dist/scanners/normalize.js +181 -0
  78. package/dist/scanners/run.d.ts +27 -0
  79. package/dist/scanners/run.js +142 -0
  80. package/dist/scanners/types.d.ts +40 -0
  81. package/dist/scanners/types.js +1 -0
  82. package/dist/server.d.ts +1 -13
  83. package/dist/server.js +142 -265
  84. package/dist/tools/artifacts.d.ts +76 -0
  85. package/dist/tools/artifacts.js +178 -0
  86. package/dist/tools/check-project.d.ts +5 -18
  87. package/dist/tools/check-project.js +122 -110
  88. package/dist/tools/check-repo-trust.d.ts +4 -19
  89. package/dist/tools/check-repo-trust.js +56 -47
  90. package/dist/tools/create-diagram.d.ts +0 -5
  91. package/dist/tools/create-diagram.js +0 -10
  92. package/dist/tools/create-document.d.ts +0 -5
  93. package/dist/tools/create-document.js +3 -9
  94. package/dist/tools/create-finding.d.ts +85 -0
  95. package/dist/tools/create-finding.js +136 -0
  96. package/dist/tools/delete-finding.d.ts +19 -0
  97. package/dist/tools/delete-finding.js +36 -0
  98. package/dist/tools/devx-run.d.ts +88 -0
  99. package/dist/tools/devx-run.js +175 -0
  100. package/dist/tools/discover-local-infra.d.ts +0 -10
  101. package/dist/tools/discover-local-infra.js +3 -73
  102. package/dist/tools/enterprise/get-org-zat.d.ts +0 -5
  103. package/dist/tools/enterprise/get-org-zat.js +0 -6
  104. package/dist/tools/explain-signal-for-diff.d.ts +34 -0
  105. package/dist/tools/explain-signal-for-diff.js +75 -0
  106. package/dist/tools/generate-diagram.d.ts +0 -6
  107. package/dist/tools/generate-diagram.js +21 -13
  108. package/dist/tools/get-application-overview.d.ts +0 -5
  109. package/dist/tools/get-application-overview.js +0 -6
  110. package/dist/tools/get-application.d.ts +0 -5
  111. package/dist/tools/get-application.js +0 -6
  112. package/dist/tools/get-diagram.d.ts +0 -5
  113. package/dist/tools/get-diagram.js +1 -11
  114. package/dist/tools/get-document.d.ts +0 -5
  115. package/dist/tools/get-document.js +0 -6
  116. package/dist/tools/get-oss-zat.d.ts +0 -5
  117. package/dist/tools/get-oss-zat.js +0 -7
  118. package/dist/tools/get-signal.d.ts +24 -0
  119. package/dist/tools/get-signal.js +75 -0
  120. package/dist/tools/get-started.d.ts +18 -0
  121. package/dist/tools/get-started.js +470 -0
  122. package/dist/tools/get-trust-keys.d.ts +0 -5
  123. package/dist/tools/get-trust-keys.js +0 -6
  124. package/dist/tools/import-openapi-endpoints.d.ts +0 -5
  125. package/dist/tools/import-openapi-endpoints.js +0 -6
  126. package/dist/tools/inspect-zat.d.ts +0 -5
  127. package/dist/tools/inspect-zat.js +0 -19
  128. package/dist/tools/inspect.d.ts +21 -0
  129. package/dist/tools/inspect.js +222 -0
  130. package/dist/tools/list-applications.d.ts +1 -6
  131. package/dist/tools/list-applications.js +0 -6
  132. package/dist/tools/list-diagrams.d.ts +0 -5
  133. package/dist/tools/list-diagrams.js +0 -6
  134. package/dist/tools/list-documents.d.ts +0 -5
  135. package/dist/tools/list-documents.js +0 -6
  136. package/dist/tools/list-endpoints.d.ts +1 -6
  137. package/dist/tools/list-endpoints.js +0 -6
  138. package/dist/tools/list-signals.d.ts +37 -0
  139. package/dist/tools/list-signals.js +83 -0
  140. package/dist/tools/manage-application.d.ts +64 -0
  141. package/dist/tools/manage-application.js +129 -0
  142. package/dist/tools/manage-diagram.d.ts +0 -5
  143. package/dist/tools/manage-diagram.js +0 -16
  144. package/dist/tools/manage-endpoint-lifecycle.d.ts +80 -0
  145. package/dist/tools/manage-endpoint-lifecycle.js +180 -0
  146. package/dist/tools/open-in-ide.d.ts +2 -14
  147. package/dist/tools/open-in-ide.js +0 -13
  148. package/dist/tools/review-change.d.ts +34 -0
  149. package/dist/tools/review-change.js +93 -0
  150. package/dist/tools/security-memory.d.ts +76 -0
  151. package/dist/tools/security-memory.js +202 -0
  152. package/dist/tools/security-review.d.ts +1 -21
  153. package/dist/tools/security-review.js +8 -108
  154. package/dist/tools/threat-get-capsule.d.ts +15 -0
  155. package/dist/tools/threat-get-capsule.js +53 -0
  156. package/dist/tools/threat-get-inference-prompt.d.ts +15 -0
  157. package/dist/tools/threat-get-inference-prompt.js +73 -0
  158. package/dist/tools/threat-list-relevant-capsules.d.ts +17 -0
  159. package/dist/tools/threat-list-relevant-capsules.js +158 -0
  160. package/dist/tools/threat-run-matcher.d.ts +17 -0
  161. package/dist/tools/threat-run-matcher.js +145 -0
  162. package/dist/tools/update-document.d.ts +0 -5
  163. package/dist/tools/update-document.js +3 -9
  164. package/dist/tools/update-endpoint.d.ts +1 -6
  165. package/dist/tools/update-endpoint.js +0 -7
  166. package/dist/tools/update-finding.d.ts +61 -0
  167. package/dist/tools/update-finding.js +80 -0
  168. package/dist/tools/update-mermaid-source.d.ts +0 -13
  169. package/dist/tools/update-mermaid-source.js +0 -14
  170. package/dist/tools/verify-trust-mark.d.ts +0 -5
  171. package/dist/tools/verify-trust-mark.js +0 -6
  172. package/dist/types.d.ts +14 -14
  173. package/dist/types.js +22 -28
  174. package/package.json +41 -15
  175. package/dist/api-client.js.map +0 -1
  176. package/dist/auth/index.js.map +0 -1
  177. package/dist/auth/jwt.js.map +0 -1
  178. package/dist/auth/keychain.js.map +0 -1
  179. package/dist/auth/oauth.js.map +0 -1
  180. package/dist/auth/sessions.js.map +0 -1
  181. package/dist/auth/token-refresh.js.map +0 -1
  182. package/dist/cli.js.map +0 -1
  183. package/dist/index.js.map +0 -1
  184. package/dist/project-binding.js.map +0 -1
  185. package/dist/resolve-application-id.js.map +0 -1
  186. package/dist/sanitize.js.map +0 -1
  187. package/dist/server.js.map +0 -1
  188. package/dist/tools/check-project.js.map +0 -1
  189. package/dist/tools/check-repo-trust.js.map +0 -1
  190. package/dist/tools/create-diagram.js.map +0 -1
  191. package/dist/tools/create-document.js.map +0 -1
  192. package/dist/tools/discover-local-infra.js.map +0 -1
  193. package/dist/tools/enterprise/capture-evidence.d.ts +0 -54
  194. package/dist/tools/enterprise/capture-evidence.js +0 -72
  195. package/dist/tools/enterprise/capture-evidence.js.map +0 -1
  196. package/dist/tools/enterprise/create-report-ticket.d.ts +0 -34
  197. package/dist/tools/enterprise/create-report-ticket.js +0 -44
  198. package/dist/tools/enterprise/create-report-ticket.js.map +0 -1
  199. package/dist/tools/enterprise/end-pentest-session.d.ts +0 -33
  200. package/dist/tools/enterprise/end-pentest-session.js +0 -42
  201. package/dist/tools/enterprise/end-pentest-session.js.map +0 -1
  202. package/dist/tools/enterprise/generate-report.d.ts +0 -55
  203. package/dist/tools/enterprise/generate-report.js +0 -111
  204. package/dist/tools/enterprise/generate-report.js.map +0 -1
  205. package/dist/tools/enterprise/get-org-zat.js.map +0 -1
  206. package/dist/tools/enterprise/get-report-status.d.ts +0 -27
  207. package/dist/tools/enterprise/get-report-status.js +0 -38
  208. package/dist/tools/enterprise/get-report-status.js.map +0 -1
  209. package/dist/tools/enterprise/get-threat-model.d.ts +0 -29
  210. package/dist/tools/enterprise/get-threat-model.js +0 -83
  211. package/dist/tools/enterprise/get-threat-model.js.map +0 -1
  212. package/dist/tools/enterprise/list-agents.d.ts +0 -42
  213. package/dist/tools/enterprise/list-agents.js +0 -95
  214. package/dist/tools/enterprise/list-agents.js.map +0 -1
  215. package/dist/tools/enterprise/list-report-issues.d.ts +0 -36
  216. package/dist/tools/enterprise/list-report-issues.js +0 -50
  217. package/dist/tools/enterprise/list-report-issues.js.map +0 -1
  218. package/dist/tools/enterprise/list-threat-models.d.ts +0 -36
  219. package/dist/tools/enterprise/list-threat-models.js +0 -82
  220. package/dist/tools/enterprise/list-threat-models.js.map +0 -1
  221. package/dist/tools/enterprise/manage-actor.d.ts +0 -58
  222. package/dist/tools/enterprise/manage-actor.js +0 -99
  223. package/dist/tools/enterprise/manage-actor.js.map +0 -1
  224. package/dist/tools/enterprise/manage-attack-scenario.d.ts +0 -70
  225. package/dist/tools/enterprise/manage-attack-scenario.js +0 -89
  226. package/dist/tools/enterprise/manage-attack-scenario.js.map +0 -1
  227. package/dist/tools/enterprise/manage-component.d.ts +0 -58
  228. package/dist/tools/enterprise/manage-component.js +0 -90
  229. package/dist/tools/enterprise/manage-component.js.map +0 -1
  230. package/dist/tools/enterprise/manage-data-asset.d.ts +0 -53
  231. package/dist/tools/enterprise/manage-data-asset.js +0 -90
  232. package/dist/tools/enterprise/manage-data-asset.js.map +0 -1
  233. package/dist/tools/enterprise/manage-data-flow.d.ts +0 -57
  234. package/dist/tools/enterprise/manage-data-flow.js +0 -98
  235. package/dist/tools/enterprise/manage-data-flow.js.map +0 -1
  236. package/dist/tools/enterprise/manage-finding.d.ts +0 -69
  237. package/dist/tools/enterprise/manage-finding.js +0 -106
  238. package/dist/tools/enterprise/manage-finding.js.map +0 -1
  239. package/dist/tools/enterprise/manage-security-control.d.ts +0 -59
  240. package/dist/tools/enterprise/manage-security-control.js +0 -96
  241. package/dist/tools/enterprise/manage-security-control.js.map +0 -1
  242. package/dist/tools/enterprise/manage-test-case.d.ts +0 -88
  243. package/dist/tools/enterprise/manage-test-case.js +0 -119
  244. package/dist/tools/enterprise/manage-test-case.js.map +0 -1
  245. package/dist/tools/enterprise/promote-finding-to-issue.d.ts +0 -36
  246. package/dist/tools/enterprise/promote-finding-to-issue.js +0 -65
  247. package/dist/tools/enterprise/promote-finding-to-issue.js.map +0 -1
  248. package/dist/tools/enterprise/publish-report-version.d.ts +0 -34
  249. package/dist/tools/enterprise/publish-report-version.js +0 -75
  250. package/dist/tools/enterprise/publish-report-version.js.map +0 -1
  251. package/dist/tools/enterprise/publish-test-to-library.d.ts +0 -31
  252. package/dist/tools/enterprise/publish-test-to-library.js +0 -40
  253. package/dist/tools/enterprise/publish-test-to-library.js.map +0 -1
  254. package/dist/tools/enterprise/record-test-result.d.ts +0 -67
  255. package/dist/tools/enterprise/record-test-result.js +0 -75
  256. package/dist/tools/enterprise/record-test-result.js.map +0 -1
  257. package/dist/tools/enterprise/start-pentest-session.d.ts +0 -35
  258. package/dist/tools/enterprise/start-pentest-session.js +0 -50
  259. package/dist/tools/enterprise/start-pentest-session.js.map +0 -1
  260. package/dist/tools/enterprise/sync-report-section.d.ts +0 -41
  261. package/dist/tools/enterprise/sync-report-section.js +0 -79
  262. package/dist/tools/enterprise/sync-report-section.js.map +0 -1
  263. package/dist/tools/enterprise/update-report-issue.d.ts +0 -55
  264. package/dist/tools/enterprise/update-report-issue.js +0 -69
  265. package/dist/tools/enterprise/update-report-issue.js.map +0 -1
  266. package/dist/tools/generate-diagram.js.map +0 -1
  267. package/dist/tools/get-agent-test-results.d.ts +0 -41
  268. package/dist/tools/get-agent-test-results.js +0 -86
  269. package/dist/tools/get-agent-test-results.js.map +0 -1
  270. package/dist/tools/get-application-overview.js.map +0 -1
  271. package/dist/tools/get-application.js.map +0 -1
  272. package/dist/tools/get-artifact-content.d.ts +0 -29
  273. package/dist/tools/get-artifact-content.js +0 -86
  274. package/dist/tools/get-artifact-content.js.map +0 -1
  275. package/dist/tools/get-diagram.js.map +0 -1
  276. package/dist/tools/get-document.js.map +0 -1
  277. package/dist/tools/get-finding-details.d.ts +0 -28
  278. package/dist/tools/get-finding-details.js +0 -43
  279. package/dist/tools/get-finding-details.js.map +0 -1
  280. package/dist/tools/get-findings.d.ts +0 -57
  281. package/dist/tools/get-findings.js +0 -103
  282. package/dist/tools/get-findings.js.map +0 -1
  283. package/dist/tools/get-oss-zat.js.map +0 -1
  284. package/dist/tools/get-recon-scan.d.ts +0 -27
  285. package/dist/tools/get-recon-scan.js +0 -46
  286. package/dist/tools/get-recon-scan.js.map +0 -1
  287. package/dist/tools/get-scan-output.d.ts +0 -27
  288. package/dist/tools/get-scan-output.js +0 -64
  289. package/dist/tools/get-scan-output.js.map +0 -1
  290. package/dist/tools/get-scenario-details.d.ts +0 -27
  291. package/dist/tools/get-scenario-details.js +0 -46
  292. package/dist/tools/get-scenario-details.js.map +0 -1
  293. package/dist/tools/get-test-case-results.d.ts +0 -37
  294. package/dist/tools/get-test-case-results.js +0 -66
  295. package/dist/tools/get-test-case-results.js.map +0 -1
  296. package/dist/tools/get-test-details.d.ts +0 -29
  297. package/dist/tools/get-test-details.js +0 -49
  298. package/dist/tools/get-test-details.js.map +0 -1
  299. package/dist/tools/get-trust-keys.js.map +0 -1
  300. package/dist/tools/import-openapi-endpoints.js.map +0 -1
  301. package/dist/tools/inspect-zat.js.map +0 -1
  302. package/dist/tools/list-agent-test-cases.d.ts +0 -41
  303. package/dist/tools/list-agent-test-cases.js +0 -73
  304. package/dist/tools/list-agent-test-cases.js.map +0 -1
  305. package/dist/tools/list-applications.js.map +0 -1
  306. package/dist/tools/list-diagrams.js.map +0 -1
  307. package/dist/tools/list-documents.js.map +0 -1
  308. package/dist/tools/list-endpoints.js.map +0 -1
  309. package/dist/tools/list-recon-scans.d.ts +0 -36
  310. package/dist/tools/list-recon-scans.js +0 -74
  311. package/dist/tools/list-recon-scans.js.map +0 -1
  312. package/dist/tools/list-scan-artifacts.d.ts +0 -41
  313. package/dist/tools/list-scan-artifacts.js +0 -63
  314. package/dist/tools/list-scan-artifacts.js.map +0 -1
  315. package/dist/tools/list-scans.d.ts +0 -44
  316. package/dist/tools/list-scans.js +0 -91
  317. package/dist/tools/list-scans.js.map +0 -1
  318. package/dist/tools/list-test-library.d.ts +0 -44
  319. package/dist/tools/list-test-library.js +0 -83
  320. package/dist/tools/list-test-library.js.map +0 -1
  321. package/dist/tools/list-test-scenarios.d.ts +0 -31
  322. package/dist/tools/list-test-scenarios.js +0 -66
  323. package/dist/tools/list-test-scenarios.js.map +0 -1
  324. package/dist/tools/local-scan.d.ts +0 -40
  325. package/dist/tools/local-scan.js +0 -261
  326. package/dist/tools/local-scan.js.map +0 -1
  327. package/dist/tools/manage-diagram.js.map +0 -1
  328. package/dist/tools/open-in-ide.js.map +0 -1
  329. package/dist/tools/run-test-scenario.d.ts +0 -37
  330. package/dist/tools/run-test-scenario.js +0 -70
  331. package/dist/tools/run-test-scenario.js.map +0 -1
  332. package/dist/tools/scan-pr.d.ts +0 -27
  333. package/dist/tools/scan-pr.js +0 -51
  334. package/dist/tools/scan-pr.js.map +0 -1
  335. package/dist/tools/security-review.js.map +0 -1
  336. package/dist/tools/setup-red-team-target.d.ts +0 -79
  337. package/dist/tools/setup-red-team-target.js +0 -430
  338. package/dist/tools/setup-red-team-target.js.map +0 -1
  339. package/dist/tools/triage-finding.d.ts +0 -47
  340. package/dist/tools/triage-finding.js +0 -116
  341. package/dist/tools/triage-finding.js.map +0 -1
  342. package/dist/tools/update-document.js.map +0 -1
  343. package/dist/tools/update-endpoint.js.map +0 -1
  344. package/dist/tools/update-mermaid-source.js.map +0 -1
  345. package/dist/tools/verify-trust-mark.js.map +0 -1
  346. package/dist/types.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ export interface CaptureRequestSpec {
2
+ url: string;
3
+ method?: string;
4
+ headers?: Record<string, string>;
5
+ body?: string | Record<string, unknown> | unknown[];
6
+ label?: string;
7
+ timeoutMs?: number;
8
+ }
9
+ export interface CapturedRequest {
10
+ method: string;
11
+ url: string;
12
+ headers: Record<string, string>;
13
+ body?: string;
14
+ label?: string;
15
+ }
16
+ export interface CapturedResponse {
17
+ status: number;
18
+ status_text?: string;
19
+ headers: Record<string, string>;
20
+ body?: string;
21
+ body_json?: unknown;
22
+ }
23
+ export interface HttpCapture {
24
+ request: CapturedRequest;
25
+ response: CapturedResponse;
26
+ meta: {
27
+ captured_at: string;
28
+ duration_ms: number;
29
+ request_fingerprint: string;
30
+ redacted: boolean;
31
+ error?: string;
32
+ };
33
+ }
34
+ export type FetchLike = (url: string, init: {
35
+ method: string;
36
+ headers: Record<string, string>;
37
+ body?: string;
38
+ signal?: AbortSignal;
39
+ }) => Promise<{
40
+ status: number;
41
+ statusText?: string;
42
+ headers: {
43
+ forEach(cb: (value: string, key: string) => void): void;
44
+ };
45
+ text(): Promise<string>;
46
+ }>;
47
+ export declare function requestFingerprint(req: CapturedRequest): string;
48
+ export declare function captureRequest(spec: CaptureRequestSpec, deps?: {
49
+ fetchImpl?: FetchLike;
50
+ }): Promise<HttpCapture>;
51
+ export declare function redactCapture(capture: HttpCapture): HttpCapture;
@@ -0,0 +1,96 @@
1
+ import * as crypto from "node:crypto";
2
+ import { redactValue } from "../redact.js";
3
+ function normalizeHeaders(headers) {
4
+ const out = {};
5
+ for (const [k, v] of Object.entries(headers ?? {}))
6
+ out[k.toLowerCase()] = String(v);
7
+ return Object.fromEntries(Object.entries(out).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
8
+ }
9
+ function bodyToString(body) {
10
+ if (body === undefined || body === null)
11
+ return undefined;
12
+ if (typeof body === "string")
13
+ return body;
14
+ try {
15
+ return JSON.stringify(body);
16
+ }
17
+ catch {
18
+ return String(body);
19
+ }
20
+ }
21
+ export function requestFingerprint(req) {
22
+ const headerLines = Object.entries(req.headers)
23
+ .map(([k, v]) => `${k}: ${v}`)
24
+ .join("\n");
25
+ const canonical = `${req.method} ${req.url}\n${headerLines}\n\n${req.body ?? ""}`;
26
+ return crypto.createHash("sha256").update(canonical, "utf8").digest("hex");
27
+ }
28
+ function tryJson(text) {
29
+ try {
30
+ return JSON.parse(text);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ export async function captureRequest(spec, deps = {}) {
37
+ const method = (spec.method ?? "GET").toUpperCase();
38
+ const headers = normalizeHeaders(spec.headers);
39
+ const body = bodyToString(spec.body);
40
+ const request = { method, url: spec.url, headers, body, label: spec.label };
41
+ const fingerprint = requestFingerprint(request);
42
+ const fetchImpl = deps.fetchImpl ?? globalThis.fetch;
43
+ const controller = new AbortController();
44
+ const timeout = setTimeout(() => controller.abort(), spec.timeoutMs ?? 30_000);
45
+ const started = Date.now();
46
+ try {
47
+ const res = await fetchImpl(spec.url, { method, headers, body, signal: controller.signal });
48
+ const respHeaders = {};
49
+ res.headers.forEach((value, key) => {
50
+ respHeaders[key.toLowerCase()] = value;
51
+ });
52
+ const text = await res.text();
53
+ const bodyJson = tryJson(text);
54
+ return {
55
+ request,
56
+ response: {
57
+ status: res.status,
58
+ status_text: res.statusText,
59
+ headers: Object.fromEntries(Object.entries(respHeaders).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),
60
+ body: text,
61
+ body_json: bodyJson,
62
+ },
63
+ meta: {
64
+ captured_at: new Date().toISOString(),
65
+ duration_ms: Date.now() - started,
66
+ request_fingerprint: fingerprint,
67
+ redacted: false,
68
+ },
69
+ };
70
+ }
71
+ catch (err) {
72
+ return {
73
+ request,
74
+ response: { status: 0, headers: {} },
75
+ meta: {
76
+ captured_at: new Date().toISOString(),
77
+ duration_ms: Date.now() - started,
78
+ request_fingerprint: fingerprint,
79
+ redacted: false,
80
+ error: err instanceof Error ? err.message : String(err),
81
+ },
82
+ };
83
+ }
84
+ finally {
85
+ clearTimeout(timeout);
86
+ }
87
+ }
88
+ export function redactCapture(capture) {
89
+ const request = redactValue(capture.request).value;
90
+ const response = redactValue(capture.response).value;
91
+ return {
92
+ request,
93
+ response,
94
+ meta: { ...capture.meta, redacted: true },
95
+ };
96
+ }
@@ -0,0 +1,43 @@
1
+ import type { HttpCapture } from "./capture.js";
2
+ export interface StatusComparison {
3
+ a: number;
4
+ b: number;
5
+ changed: boolean;
6
+ }
7
+ export interface JsonPathDiff {
8
+ path: string;
9
+ kind: "added" | "removed" | "changed";
10
+ a?: unknown;
11
+ b?: unknown;
12
+ }
13
+ export interface BodyComparison {
14
+ equal: boolean;
15
+ json_diffs?: JsonPathDiff[];
16
+ opaque_change?: boolean;
17
+ }
18
+ export interface HeaderDiff {
19
+ header: string;
20
+ kind: "added" | "removed" | "changed";
21
+ a?: string;
22
+ b?: string;
23
+ }
24
+ export type AccessSignal = "same_status" | "both_success" | "both_denied" | "access_differential" | "one_error" | "mixed";
25
+ export interface CaptureComparison {
26
+ equal: boolean;
27
+ labels: {
28
+ a?: string;
29
+ b?: string;
30
+ };
31
+ status: StatusComparison;
32
+ headers: HeaderDiff[];
33
+ body: BodyComparison;
34
+ access_signal: AccessSignal;
35
+ summary: string;
36
+ same_request: boolean;
37
+ }
38
+ export interface CompareOptions {
39
+ headerAllowlist?: string[];
40
+ allHeaders?: boolean;
41
+ }
42
+ export declare function diffJson(a: unknown, b: unknown, basePath?: string): JsonPathDiff[];
43
+ export declare function compareCaptures(a: HttpCapture, b: HttpCapture, opts?: CompareOptions): CaptureComparison;
@@ -0,0 +1,117 @@
1
+ const VOLATILE_HEADERS = new Set([
2
+ "date",
3
+ "age",
4
+ "etag",
5
+ "last-modified",
6
+ "expires",
7
+ "set-cookie",
8
+ "x-request-id",
9
+ "x-correlation-id",
10
+ "cf-ray",
11
+ "x-amz-request-id",
12
+ "x-amz-id-2",
13
+ "x-served-by",
14
+ "x-timer",
15
+ "x-runtime",
16
+ "server-timing",
17
+ "content-length",
18
+ ]);
19
+ function isDenied(status) {
20
+ return status === 401 || status === 403;
21
+ }
22
+ function isSuccess(status) {
23
+ return status >= 200 && status < 300;
24
+ }
25
+ function isError(status) {
26
+ return status === 0 || status >= 500;
27
+ }
28
+ function classifyAccess(a, b) {
29
+ if (isError(a) || isError(b))
30
+ return "one_error";
31
+ if (isSuccess(a) && isSuccess(b))
32
+ return "both_success";
33
+ if (isDenied(a) && isDenied(b))
34
+ return "both_denied";
35
+ if ((isSuccess(a) && isDenied(b)) || (isDenied(a) && isSuccess(b)))
36
+ return "access_differential";
37
+ if (a === b)
38
+ return "same_status";
39
+ return "mixed";
40
+ }
41
+ function diffHeaders(a, b, opts) {
42
+ const allow = opts.headerAllowlist ? new Set(opts.headerAllowlist.map((h) => h.toLowerCase())) : null;
43
+ const keep = (h) => (allow ? allow.has(h) : opts.allHeaders ? true : !VOLATILE_HEADERS.has(h));
44
+ const keys = new Set([...Object.keys(a), ...Object.keys(b)].filter(keep));
45
+ const out = [];
46
+ for (const h of [...keys].sort()) {
47
+ const av = a[h];
48
+ const bv = b[h];
49
+ if (av === bv)
50
+ continue;
51
+ if (av === undefined)
52
+ out.push({ header: h, kind: "added", b: bv });
53
+ else if (bv === undefined)
54
+ out.push({ header: h, kind: "removed", a: av });
55
+ else
56
+ out.push({ header: h, kind: "changed", a: av, b: bv });
57
+ }
58
+ return out;
59
+ }
60
+ export function diffJson(a, b, basePath = "$") {
61
+ const diffs = [];
62
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
63
+ if (Array.isArray(a) && Array.isArray(b)) {
64
+ const max = Math.max(a.length, b.length);
65
+ for (let i = 0; i < max; i++) {
66
+ const p = `${basePath}[${i}]`;
67
+ if (i >= a.length)
68
+ diffs.push({ path: p, kind: "added", b: b[i] });
69
+ else if (i >= b.length)
70
+ diffs.push({ path: p, kind: "removed", a: a[i] });
71
+ else
72
+ diffs.push(...diffJson(a[i], b[i], p));
73
+ }
74
+ return diffs;
75
+ }
76
+ if (isObj(a) && isObj(b)) {
77
+ const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
78
+ for (const k of [...keys].sort()) {
79
+ const p = `${basePath}.${k}`;
80
+ if (!(k in a))
81
+ diffs.push({ path: p, kind: "added", b: b[k] });
82
+ else if (!(k in b))
83
+ diffs.push({ path: p, kind: "removed", a: a[k] });
84
+ else
85
+ diffs.push(...diffJson(a[k], b[k], p));
86
+ }
87
+ return diffs;
88
+ }
89
+ if (JSON.stringify(a) !== JSON.stringify(b)) {
90
+ diffs.push({ path: basePath, kind: "changed", a, b });
91
+ }
92
+ return diffs;
93
+ }
94
+ function compareBodies(a, b) {
95
+ const aHasJson = a.body_json !== undefined;
96
+ const bHasJson = b.body_json !== undefined;
97
+ if (aHasJson && bHasJson) {
98
+ const json_diffs = diffJson(a.body_json, b.body_json);
99
+ return { equal: json_diffs.length === 0, json_diffs };
100
+ }
101
+ const equal = (a.body ?? "") === (b.body ?? "");
102
+ return { equal, opaque_change: !equal };
103
+ }
104
+ export function compareCaptures(a, b, opts = {}) {
105
+ const status = { a: a.response.status, b: b.response.status, changed: a.response.status !== b.response.status };
106
+ const headers = diffHeaders(a.response.headers, b.response.headers, opts);
107
+ const body = compareBodies(a.response, b.response);
108
+ const access_signal = classifyAccess(a.response.status, b.response.status);
109
+ const same_request = a.meta.request_fingerprint === b.meta.request_fingerprint;
110
+ const equal = !status.changed && headers.length === 0 && body.equal;
111
+ const la = a.request.label ?? "A";
112
+ const lb = b.request.label ?? "B";
113
+ const summary = equal
114
+ ? `${la} and ${lb} are equivalent (status ${status.a}, no header/body differences).`
115
+ : `${la}=${status.a} vs ${lb}=${status.b}; ${headers.length} header diff(s), body ${body.equal ? "identical" : "differs"}; access_signal=${access_signal}.`;
116
+ return { equal, labels: { a: a.request.label, b: b.request.label }, status, headers, body, access_signal, summary, same_request };
117
+ }
@@ -0,0 +1,2 @@
1
+ export { captureRequest, redactCapture, requestFingerprint, type CaptureRequestSpec, type CapturedRequest, type CapturedResponse, type HttpCapture, type FetchLike, } from "./capture.js";
2
+ export { compareCaptures, diffJson, type CaptureComparison, type CompareOptions, type StatusComparison, type BodyComparison, type HeaderDiff, type JsonPathDiff, type AccessSignal, } from "./compare.js";
@@ -0,0 +1,2 @@
1
+ export { captureRequest, redactCapture, requestFingerprint, } from "./capture.js";
2
+ export { compareCaptures, diffJson, } from "./compare.js";
package/dist/index.d.ts CHANGED
@@ -1,8 +1,2 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * ZIVIS MCP Security Server — Entry Point
4
- *
5
- * CLI tool and MCP server for AI-assisted security finding remediation.
6
- * Connects AI coding assistants to the ZIVIS security platform.
7
- */
8
2
  export {};
package/dist/index.js CHANGED
@@ -1,10 +1,4 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * ZIVIS MCP Security Server — Entry Point
4
- *
5
- * CLI tool and MCP server for AI-assisted security finding remediation.
6
- * Connects AI coding assistants to the ZIVIS security platform.
7
- */
8
2
  import { parseArgs, runCli } from "./cli.js";
9
3
  import { DEFAULT_CONFIG } from "./types.js";
10
4
  const { command, options } = parseArgs(process.argv);
@@ -12,4 +6,3 @@ runCli(command, options, DEFAULT_CONFIG).catch((err) => {
12
6
  console.error("Fatal error:", err instanceof Error ? err.message : err);
13
7
  process.exit(1);
14
8
  });
15
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,10 @@
1
+ export interface LocatedArtifact {
2
+ path: string;
3
+ mtimeMs: number;
4
+ }
5
+ export declare function userCacheRoot(): string;
6
+ export declare function deriveRepoId(cwd: string): Promise<string>;
7
+ export declare function locateLatestArtifact(cwd: string): Promise<LocatedArtifact | undefined>;
8
+ export declare const DEFAULT_INSPECT_CACHE_TTL_MS: number;
9
+ export declare function inspectCacheTtlMs(): number;
10
+ export declare function isFresh(mtimeMs: number, now?: number): boolean;
@@ -0,0 +1,75 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as fssync from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import * as crypto from "node:crypto";
6
+ import { exec } from "node:child_process";
7
+ import { promisify } from "node:util";
8
+ const execAsync = promisify(exec);
9
+ export function userCacheRoot() {
10
+ const home = os.homedir();
11
+ if (process.platform === "darwin") {
12
+ return path.join(home, "Library", "Caches", "zivis");
13
+ }
14
+ if (process.platform === "win32") {
15
+ const localAppData = process.env.LOCALAPPDATA ?? path.join(home, "AppData", "Local");
16
+ return path.join(localAppData, "zivis", "Cache");
17
+ }
18
+ const xdg = process.env.XDG_CACHE_HOME;
19
+ return path.join(xdg ?? path.join(home, ".cache"), "zivis");
20
+ }
21
+ export async function deriveRepoId(cwd) {
22
+ const remote = await tryGit(cwd, "remote get-url origin");
23
+ if (remote) {
24
+ return "remote-" + sha256Short(remote);
25
+ }
26
+ return "path-" + sha256Short(cwd);
27
+ }
28
+ async function tryGit(cwd, args) {
29
+ try {
30
+ const { stdout } = await execAsync(`git ${args}`, { cwd });
31
+ const value = stdout.trim();
32
+ return value || undefined;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ function sha256Short(value) {
39
+ return crypto.createHash("sha256").update(value).digest("hex").slice(0, 16);
40
+ }
41
+ export async function locateLatestArtifact(cwd) {
42
+ const repoId = await deriveRepoId(cwd);
43
+ const runsDir = path.join(userCacheRoot(), "repos", repoId, "inspect", "runs");
44
+ if (!fssync.existsSync(runsDir))
45
+ return undefined;
46
+ const candidates = [];
47
+ for (const entry of await fs.readdir(runsDir)) {
48
+ if (!entry.endsWith(".json"))
49
+ continue;
50
+ const full = path.join(runsDir, entry);
51
+ try {
52
+ const stat = await fs.stat(full);
53
+ candidates.push({ path: full, mtimeMs: stat.mtimeMs });
54
+ }
55
+ catch {
56
+ }
57
+ }
58
+ if (candidates.length === 0)
59
+ return undefined;
60
+ candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
61
+ return candidates[0];
62
+ }
63
+ export const DEFAULT_INSPECT_CACHE_TTL_MS = 15 * 60 * 1000;
64
+ export function inspectCacheTtlMs() {
65
+ const raw = process.env.ZIVIS_INSPECT_CACHE_TTL_MS;
66
+ if (!raw)
67
+ return DEFAULT_INSPECT_CACHE_TTL_MS;
68
+ const parsed = Number.parseInt(raw, 10);
69
+ if (!Number.isFinite(parsed) || parsed <= 0)
70
+ return DEFAULT_INSPECT_CACHE_TTL_MS;
71
+ return parsed;
72
+ }
73
+ export function isFresh(mtimeMs, now = Date.now()) {
74
+ return now - mtimeMs <= inspectCacheTtlMs();
75
+ }
@@ -0,0 +1,27 @@
1
+ export interface NextStep {
2
+ id: string;
3
+ label: string;
4
+ tool: string;
5
+ args_hint?: Record<string, unknown>;
6
+ why: string;
7
+ requires_tier?: "free" | "pro" | "enterprise";
8
+ }
9
+ export interface ZivisToolPayload<T> {
10
+ result: T;
11
+ next_steps?: NextStep[];
12
+ summary?: string;
13
+ }
14
+ export declare function withNextSteps<T>(result: T, nextSteps: NextStep[], summary?: string): {
15
+ content: Array<{
16
+ type: "text";
17
+ text: string;
18
+ }>;
19
+ isError?: boolean;
20
+ };
21
+ export declare function withNextStepsError(message: string, nextSteps: NextStep[], summary?: string): {
22
+ content: Array<{
23
+ type: "text";
24
+ text: string;
25
+ }>;
26
+ isError: true;
27
+ };
@@ -0,0 +1,21 @@
1
+ export function withNextSteps(result, nextSteps, summary) {
2
+ const payload = {
3
+ result,
4
+ next_steps: nextSteps,
5
+ ...(summary ? { summary } : {}),
6
+ };
7
+ return {
8
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
9
+ };
10
+ }
11
+ export function withNextStepsError(message, nextSteps, summary) {
12
+ const payload = {
13
+ result: { error: message },
14
+ next_steps: nextSteps,
15
+ ...(summary ? { summary } : {}),
16
+ };
17
+ return {
18
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
19
+ isError: true,
20
+ };
21
+ }
@@ -0,0 +1,8 @@
1
+ export type AstLanguage = "typescript" | "javascript" | "python" | "go";
2
+ export interface AstMatch {
3
+ file: string;
4
+ start_line: number;
5
+ end_line: number;
6
+ matched_text: string;
7
+ }
8
+ export declare function evaluateAstStrategy(expression: unknown, language: AstLanguage, files: string[], rootDir: string): Promise<AstMatch[]>;
@@ -0,0 +1,95 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as yaml from "js-yaml";
4
+ import * as napi from "@ast-grep/napi";
5
+ let registered = false;
6
+ async function ensureLanguagesRegistered() {
7
+ if (registered)
8
+ return;
9
+ const py = (await import("@ast-grep/lang-python")).default;
10
+ const go = (await import("@ast-grep/lang-go")).default;
11
+ napi.registerDynamicLanguage({ python: py, go: go });
12
+ registered = true;
13
+ }
14
+ export async function evaluateAstStrategy(expression, language, files, rootDir) {
15
+ await ensureLanguagesRegistered();
16
+ const rule = normalizeExpressionToRule(expression);
17
+ if (!rule)
18
+ return [];
19
+ const matches = [];
20
+ const langKey = languageKey(language);
21
+ for (const file of files) {
22
+ let raw;
23
+ try {
24
+ raw = await fs.readFile(file, "utf8");
25
+ }
26
+ catch {
27
+ continue;
28
+ }
29
+ if (!raw)
30
+ continue;
31
+ let root;
32
+ try {
33
+ root = napi.parse(langKey, raw);
34
+ }
35
+ catch {
36
+ continue;
37
+ }
38
+ let foundNodes;
39
+ try {
40
+ foundNodes = root.root().findAll(rule);
41
+ }
42
+ catch {
43
+ continue;
44
+ }
45
+ for (const node of foundNodes) {
46
+ const range = node.range();
47
+ matches.push({
48
+ file: relPosix(rootDir, file),
49
+ start_line: (range.start.line ?? 0) + 1,
50
+ end_line: (range.end.line ?? 0) + 1,
51
+ matched_text: truncate(node.text(), 240),
52
+ });
53
+ }
54
+ }
55
+ return matches;
56
+ }
57
+ function normalizeExpressionToRule(expression) {
58
+ if (typeof expression === "string") {
59
+ try {
60
+ return ensureRuleWrapper(yaml.load(expression));
61
+ }
62
+ catch {
63
+ return undefined;
64
+ }
65
+ }
66
+ if (expression && typeof expression === "object") {
67
+ return ensureRuleWrapper(expression);
68
+ }
69
+ return undefined;
70
+ }
71
+ function ensureRuleWrapper(parsed) {
72
+ if (!parsed || typeof parsed !== "object")
73
+ return parsed;
74
+ const obj = parsed;
75
+ if ("rule" in obj)
76
+ return obj;
77
+ return { rule: obj };
78
+ }
79
+ function languageKey(lang) {
80
+ switch (lang) {
81
+ case "typescript": return "ts";
82
+ case "javascript": return "js";
83
+ case "python": return "python";
84
+ case "go": return "go";
85
+ }
86
+ }
87
+ function relPosix(rootDir, abs) {
88
+ const rel = path.relative(rootDir, abs);
89
+ return rel.split(path.sep).join("/");
90
+ }
91
+ function truncate(s, max) {
92
+ if (s.length <= max)
93
+ return s;
94
+ return s.slice(0, max) + "…";
95
+ }
@@ -0,0 +1,55 @@
1
+ export type Lane = "trusted" | "inferred";
2
+ export interface MatchedEvidence {
3
+ file: string;
4
+ start_line: number;
5
+ end_line?: number;
6
+ matched_text?: string;
7
+ strategy_code: string;
8
+ }
9
+ export interface FiredStrategy {
10
+ code: string;
11
+ language?: string;
12
+ trusted: boolean;
13
+ confidence_weight: number;
14
+ match_count: number;
15
+ }
16
+ export interface InferenceCandidate {
17
+ prompt_ref: string;
18
+ expected_output_schema?: unknown;
19
+ minimum_context_required?: {
20
+ lines?: number;
21
+ symbols?: string[];
22
+ };
23
+ reason: string;
24
+ }
25
+ export interface Finding {
26
+ pattern_id: string;
27
+ pattern_version: string;
28
+ lane: Lane;
29
+ confidence: number;
30
+ fired_strategies: FiredStrategy[];
31
+ evidence: MatchedEvidence[];
32
+ inference_candidate?: InferenceCandidate;
33
+ safe_summary?: string;
34
+ threats?: unknown[];
35
+ repair_contract?: unknown;
36
+ }
37
+ export interface MatcherSummary {
38
+ trusted_count: number;
39
+ inferred_count: number;
40
+ total: number;
41
+ }
42
+ export interface MatcherResult {
43
+ pack: {
44
+ id: string;
45
+ version: string;
46
+ };
47
+ artifact_path: string;
48
+ cwd: string;
49
+ capsules_relevant: number;
50
+ capsules_evaluated: number;
51
+ ast_files_scanned: number;
52
+ duration_ms: number;
53
+ summary: MatcherSummary;
54
+ findings: Finding[];
55
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { MatcherResult } from "./finding.js";
2
+ export type { Finding, FiredStrategy, MatchedEvidence, MatcherResult, Lane } from "./finding.js";
3
+ export interface RunMatcherOpts {
4
+ artifactPath: string;
5
+ cwd: string;
6
+ packId?: string;
7
+ }
8
+ export declare function runMatcher(opts: RunMatcherOpts): Promise<MatcherResult>;