@zivis/mcp 0.1.0-alpha.9 → 0.1.6

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 (328) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +19 -0
  3. package/dist/api-client.d.ts +1 -31
  4. package/dist/api-client.js +26 -66
  5. package/dist/auth/index.d.ts +1 -22
  6. package/dist/auth/index.js +15 -46
  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 +1 -42
  12. package/dist/auth/oauth.js +22 -64
  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 +12 -47
  17. package/dist/cli.d.ts +1 -18
  18. package/dist/cli.js +30 -908
  19. package/dist/index.d.ts +0 -6
  20. package/dist/index.js +0 -7
  21. package/dist/lib/inspect-cache.d.ts +10 -0
  22. package/dist/lib/inspect-cache.js +75 -0
  23. package/dist/lib/next-steps.d.ts +27 -0
  24. package/dist/lib/next-steps.js +21 -0
  25. package/dist/matcher/ast-eval.d.ts +8 -0
  26. package/dist/matcher/ast-eval.js +95 -0
  27. package/dist/matcher/finding.d.ts +55 -0
  28. package/dist/matcher/finding.js +1 -0
  29. package/dist/matcher/index.d.ts +8 -0
  30. package/dist/matcher/index.js +202 -0
  31. package/dist/matcher/inference-candidates.d.ts +26 -0
  32. package/dist/matcher/inference-candidates.js +81 -0
  33. package/dist/matcher/walker.d.ts +7 -0
  34. package/dist/matcher/walker.js +71 -0
  35. package/dist/pattern-pack/index.d.ts +125 -0
  36. package/dist/pattern-pack/index.js +189 -0
  37. package/dist/pattern-packs/zivis-public-0.2.0/capsules/agents/privilege-separation.yaml +224 -0
  38. package/dist/pattern-packs/zivis-public-0.2.0/capsules/prompting/self-consistency-no-isolation.yaml +237 -0
  39. package/dist/pattern-packs/zivis-public-0.2.0/capsules/retrieval/context-injection-no-validator.yaml +348 -0
  40. package/dist/pattern-packs/zivis-public-0.2.0/capsules/security/late-org-filter.yaml +266 -0
  41. package/dist/pattern-packs/zivis-public-0.2.0/controls/external_validator_on_facts.yaml +37 -0
  42. package/dist/pattern-packs/zivis-public-0.2.0/controls/fact_validator_present.yaml +68 -0
  43. package/dist/pattern-packs/zivis-public-0.2.0/controls/human_approval_gate.yaml +44 -0
  44. package/dist/pattern-packs/zivis-public-0.2.0/controls/langgraph_state_machine_with_per_node_tools.yaml +35 -0
  45. package/dist/pattern-packs/zivis-public-0.2.0/controls/per_sample_retrieval_diversification.yaml +38 -0
  46. package/dist/pattern-packs/zivis-public-0.2.0/controls/prisma_extension_or_middleware_attaching_org_filter.yaml +31 -0
  47. package/dist/pattern-packs/zivis-public-0.2.0/controls/row_level_security_policy.yaml +37 -0
  48. package/dist/pattern-packs/zivis-public-0.2.0/controls/source_attribution_present.yaml +58 -0
  49. package/dist/pattern-packs/zivis-public-0.2.0/manifest.json +167 -0
  50. package/dist/pattern-packs/zivis-public-0.2.0/prompts/agents/privilege-separation/identify.md +54 -0
  51. package/dist/pattern-packs/zivis-public-0.2.0/prompts/prompting/self-consistency-no-isolation/identify.md +60 -0
  52. package/dist/pattern-packs/zivis-public-0.2.0/prompts/retrieval/context-injection-no-validator/identify.md +109 -0
  53. package/dist/pattern-packs/zivis-public-0.2.0/prompts/security/late-org-filter/identify.md +78 -0
  54. package/dist/project-binding.d.ts +2 -19
  55. package/dist/project-binding.js +38 -21
  56. package/dist/prompts/audit-dependencies.d.ts +2 -0
  57. package/dist/prompts/audit-dependencies.js +47 -0
  58. package/dist/prompts/getting-started.d.ts +2 -0
  59. package/dist/prompts/getting-started.js +37 -0
  60. package/dist/prompts/index.d.ts +2 -0
  61. package/dist/prompts/index.js +6 -0
  62. package/dist/resolve-application-id.d.ts +0 -4
  63. package/dist/resolve-application-id.js +0 -5
  64. package/dist/sanitize.d.ts +1 -21
  65. package/dist/sanitize.js +7 -41
  66. package/dist/server.d.ts +1 -13
  67. package/dist/server.js +134 -253
  68. package/dist/tools/artifacts.d.ts +76 -0
  69. package/dist/tools/artifacts.js +178 -0
  70. package/dist/tools/check-project.d.ts +5 -18
  71. package/dist/tools/check-project.js +120 -111
  72. package/dist/tools/check-repo-trust.d.ts +4 -19
  73. package/dist/tools/check-repo-trust.js +56 -47
  74. package/dist/tools/create-diagram.d.ts +0 -5
  75. package/dist/tools/create-diagram.js +0 -10
  76. package/dist/tools/create-document.d.ts +0 -5
  77. package/dist/tools/create-document.js +3 -9
  78. package/dist/tools/create-finding.d.ts +85 -0
  79. package/dist/tools/create-finding.js +136 -0
  80. package/dist/tools/delete-finding.d.ts +19 -0
  81. package/dist/tools/delete-finding.js +36 -0
  82. package/dist/tools/discover-local-infra.d.ts +0 -10
  83. package/dist/tools/discover-local-infra.js +3 -73
  84. package/dist/tools/enterprise/get-org-zat.d.ts +0 -5
  85. package/dist/tools/enterprise/get-org-zat.js +0 -6
  86. package/dist/tools/enterprise/get-threat-model.d.ts +1 -8
  87. package/dist/tools/enterprise/get-threat-model.js +9 -31
  88. package/dist/tools/enterprise/list-attack-scenarios.d.ts +24 -0
  89. package/dist/tools/enterprise/list-attack-scenarios.js +63 -0
  90. package/dist/tools/enterprise/list-threat-models.d.ts +1 -6
  91. package/dist/tools/enterprise/list-threat-models.js +1 -9
  92. package/dist/tools/enterprise/manage-actor.d.ts +2 -7
  93. package/dist/tools/enterprise/manage-actor.js +13 -7
  94. package/dist/tools/enterprise/manage-attack-scenario.d.ts +1 -6
  95. package/dist/tools/enterprise/manage-attack-scenario.js +12 -7
  96. package/dist/tools/enterprise/manage-data-asset.d.ts +2 -7
  97. package/dist/tools/enterprise/manage-data-asset.js +16 -7
  98. package/dist/tools/enterprise/manage-security-control.d.ts +1 -6
  99. package/dist/tools/enterprise/manage-security-control.js +17 -7
  100. package/dist/tools/explain-signal-for-diff.d.ts +34 -0
  101. package/dist/tools/explain-signal-for-diff.js +75 -0
  102. package/dist/tools/generate-diagram.d.ts +0 -6
  103. package/dist/tools/generate-diagram.js +21 -13
  104. package/dist/tools/get-application-overview.d.ts +0 -5
  105. package/dist/tools/get-application-overview.js +0 -6
  106. package/dist/tools/get-application.d.ts +0 -5
  107. package/dist/tools/get-application.js +0 -6
  108. package/dist/tools/get-diagram.d.ts +0 -5
  109. package/dist/tools/get-diagram.js +1 -11
  110. package/dist/tools/get-document.d.ts +0 -5
  111. package/dist/tools/get-document.js +0 -6
  112. package/dist/tools/get-oss-zat.d.ts +0 -5
  113. package/dist/tools/get-oss-zat.js +0 -7
  114. package/dist/tools/get-signal.d.ts +24 -0
  115. package/dist/tools/get-signal.js +75 -0
  116. package/dist/tools/get-started.d.ts +18 -0
  117. package/dist/tools/get-started.js +470 -0
  118. package/dist/tools/get-trust-keys.d.ts +0 -5
  119. package/dist/tools/get-trust-keys.js +0 -6
  120. package/dist/tools/import-openapi-endpoints.d.ts +0 -5
  121. package/dist/tools/import-openapi-endpoints.js +0 -6
  122. package/dist/tools/inspect-zat.d.ts +0 -5
  123. package/dist/tools/inspect-zat.js +0 -19
  124. package/dist/tools/inspect.d.ts +21 -0
  125. package/dist/tools/inspect.js +222 -0
  126. package/dist/tools/list-applications.d.ts +1 -6
  127. package/dist/tools/list-applications.js +0 -6
  128. package/dist/tools/list-diagrams.d.ts +0 -5
  129. package/dist/tools/list-diagrams.js +0 -6
  130. package/dist/tools/list-documents.d.ts +0 -5
  131. package/dist/tools/list-documents.js +0 -6
  132. package/dist/tools/list-endpoints.d.ts +1 -6
  133. package/dist/tools/list-endpoints.js +0 -6
  134. package/dist/tools/list-signals.d.ts +37 -0
  135. package/dist/tools/list-signals.js +83 -0
  136. package/dist/tools/manage-application.d.ts +64 -0
  137. package/dist/tools/manage-application.js +129 -0
  138. package/dist/tools/manage-diagram.d.ts +0 -5
  139. package/dist/tools/manage-diagram.js +0 -16
  140. package/dist/tools/manage-endpoint-lifecycle.d.ts +80 -0
  141. package/dist/tools/manage-endpoint-lifecycle.js +180 -0
  142. package/dist/tools/open-in-ide.d.ts +2 -14
  143. package/dist/tools/open-in-ide.js +0 -13
  144. package/dist/tools/review-change.d.ts +34 -0
  145. package/dist/tools/review-change.js +93 -0
  146. package/dist/tools/security-review.d.ts +0 -16
  147. package/dist/tools/security-review.js +63 -77
  148. package/dist/tools/threat-get-capsule.d.ts +15 -0
  149. package/dist/tools/threat-get-capsule.js +53 -0
  150. package/dist/tools/threat-get-inference-prompt.d.ts +15 -0
  151. package/dist/tools/threat-get-inference-prompt.js +73 -0
  152. package/dist/tools/threat-list-relevant-capsules.d.ts +17 -0
  153. package/dist/tools/threat-list-relevant-capsules.js +158 -0
  154. package/dist/tools/threat-run-matcher.d.ts +17 -0
  155. package/dist/tools/threat-run-matcher.js +145 -0
  156. package/dist/tools/update-document.d.ts +0 -5
  157. package/dist/tools/update-document.js +3 -9
  158. package/dist/tools/update-endpoint.d.ts +1 -6
  159. package/dist/tools/update-endpoint.js +0 -7
  160. package/dist/tools/update-finding.d.ts +61 -0
  161. package/dist/tools/update-finding.js +80 -0
  162. package/dist/tools/update-mermaid-source.d.ts +0 -13
  163. package/dist/tools/update-mermaid-source.js +0 -14
  164. package/dist/tools/verify-trust-mark.d.ts +0 -5
  165. package/dist/tools/verify-trust-mark.js +0 -6
  166. package/dist/types.d.ts +13 -13
  167. package/dist/types.js +22 -28
  168. package/package.json +28 -5
  169. package/dist/api-client.js.map +0 -1
  170. package/dist/auth/index.js.map +0 -1
  171. package/dist/auth/jwt.js.map +0 -1
  172. package/dist/auth/keychain.js.map +0 -1
  173. package/dist/auth/oauth.js.map +0 -1
  174. package/dist/auth/sessions.js.map +0 -1
  175. package/dist/auth/token-refresh.js.map +0 -1
  176. package/dist/cli.js.map +0 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/project-binding.js.map +0 -1
  179. package/dist/resolve-application-id.js.map +0 -1
  180. package/dist/sanitize.js.map +0 -1
  181. package/dist/server.js.map +0 -1
  182. package/dist/tools/check-project.js.map +0 -1
  183. package/dist/tools/check-repo-trust.js.map +0 -1
  184. package/dist/tools/create-diagram.js.map +0 -1
  185. package/dist/tools/create-document.js.map +0 -1
  186. package/dist/tools/discover-local-infra.js.map +0 -1
  187. package/dist/tools/enterprise/capture-evidence.d.ts +0 -54
  188. package/dist/tools/enterprise/capture-evidence.js +0 -72
  189. package/dist/tools/enterprise/capture-evidence.js.map +0 -1
  190. package/dist/tools/enterprise/create-report-ticket.d.ts +0 -34
  191. package/dist/tools/enterprise/create-report-ticket.js +0 -44
  192. package/dist/tools/enterprise/create-report-ticket.js.map +0 -1
  193. package/dist/tools/enterprise/end-pentest-session.d.ts +0 -33
  194. package/dist/tools/enterprise/end-pentest-session.js +0 -42
  195. package/dist/tools/enterprise/end-pentest-session.js.map +0 -1
  196. package/dist/tools/enterprise/generate-report.d.ts +0 -55
  197. package/dist/tools/enterprise/generate-report.js +0 -111
  198. package/dist/tools/enterprise/generate-report.js.map +0 -1
  199. package/dist/tools/enterprise/get-org-zat.js.map +0 -1
  200. package/dist/tools/enterprise/get-report-status.d.ts +0 -27
  201. package/dist/tools/enterprise/get-report-status.js +0 -38
  202. package/dist/tools/enterprise/get-report-status.js.map +0 -1
  203. package/dist/tools/enterprise/get-threat-model.js.map +0 -1
  204. package/dist/tools/enterprise/list-agents.d.ts +0 -42
  205. package/dist/tools/enterprise/list-agents.js +0 -95
  206. package/dist/tools/enterprise/list-agents.js.map +0 -1
  207. package/dist/tools/enterprise/list-report-issues.d.ts +0 -36
  208. package/dist/tools/enterprise/list-report-issues.js +0 -50
  209. package/dist/tools/enterprise/list-report-issues.js.map +0 -1
  210. package/dist/tools/enterprise/list-threat-models.js.map +0 -1
  211. package/dist/tools/enterprise/manage-actor.js.map +0 -1
  212. package/dist/tools/enterprise/manage-attack-scenario.js.map +0 -1
  213. package/dist/tools/enterprise/manage-component.d.ts +0 -58
  214. package/dist/tools/enterprise/manage-component.js +0 -90
  215. package/dist/tools/enterprise/manage-component.js.map +0 -1
  216. package/dist/tools/enterprise/manage-data-asset.js.map +0 -1
  217. package/dist/tools/enterprise/manage-data-flow.d.ts +0 -57
  218. package/dist/tools/enterprise/manage-data-flow.js +0 -98
  219. package/dist/tools/enterprise/manage-data-flow.js.map +0 -1
  220. package/dist/tools/enterprise/manage-finding.d.ts +0 -69
  221. package/dist/tools/enterprise/manage-finding.js +0 -106
  222. package/dist/tools/enterprise/manage-finding.js.map +0 -1
  223. package/dist/tools/enterprise/manage-security-control.js.map +0 -1
  224. package/dist/tools/enterprise/manage-test-case.d.ts +0 -88
  225. package/dist/tools/enterprise/manage-test-case.js +0 -119
  226. package/dist/tools/enterprise/manage-test-case.js.map +0 -1
  227. package/dist/tools/enterprise/promote-finding-to-issue.d.ts +0 -36
  228. package/dist/tools/enterprise/promote-finding-to-issue.js +0 -65
  229. package/dist/tools/enterprise/promote-finding-to-issue.js.map +0 -1
  230. package/dist/tools/enterprise/publish-report-version.d.ts +0 -34
  231. package/dist/tools/enterprise/publish-report-version.js +0 -75
  232. package/dist/tools/enterprise/publish-report-version.js.map +0 -1
  233. package/dist/tools/enterprise/publish-test-to-library.d.ts +0 -31
  234. package/dist/tools/enterprise/publish-test-to-library.js +0 -40
  235. package/dist/tools/enterprise/publish-test-to-library.js.map +0 -1
  236. package/dist/tools/enterprise/record-test-result.d.ts +0 -67
  237. package/dist/tools/enterprise/record-test-result.js +0 -75
  238. package/dist/tools/enterprise/record-test-result.js.map +0 -1
  239. package/dist/tools/enterprise/start-pentest-session.d.ts +0 -35
  240. package/dist/tools/enterprise/start-pentest-session.js +0 -50
  241. package/dist/tools/enterprise/start-pentest-session.js.map +0 -1
  242. package/dist/tools/enterprise/sync-report-section.d.ts +0 -41
  243. package/dist/tools/enterprise/sync-report-section.js +0 -79
  244. package/dist/tools/enterprise/sync-report-section.js.map +0 -1
  245. package/dist/tools/enterprise/update-report-issue.d.ts +0 -55
  246. package/dist/tools/enterprise/update-report-issue.js +0 -69
  247. package/dist/tools/enterprise/update-report-issue.js.map +0 -1
  248. package/dist/tools/generate-diagram.js.map +0 -1
  249. package/dist/tools/get-agent-test-results.d.ts +0 -41
  250. package/dist/tools/get-agent-test-results.js +0 -86
  251. package/dist/tools/get-agent-test-results.js.map +0 -1
  252. package/dist/tools/get-application-overview.js.map +0 -1
  253. package/dist/tools/get-application.js.map +0 -1
  254. package/dist/tools/get-artifact-content.d.ts +0 -29
  255. package/dist/tools/get-artifact-content.js +0 -86
  256. package/dist/tools/get-artifact-content.js.map +0 -1
  257. package/dist/tools/get-diagram.js.map +0 -1
  258. package/dist/tools/get-document.js.map +0 -1
  259. package/dist/tools/get-finding-details.d.ts +0 -28
  260. package/dist/tools/get-finding-details.js +0 -43
  261. package/dist/tools/get-finding-details.js.map +0 -1
  262. package/dist/tools/get-findings.d.ts +0 -57
  263. package/dist/tools/get-findings.js +0 -103
  264. package/dist/tools/get-findings.js.map +0 -1
  265. package/dist/tools/get-oss-zat.js.map +0 -1
  266. package/dist/tools/get-recon-scan.d.ts +0 -27
  267. package/dist/tools/get-recon-scan.js +0 -46
  268. package/dist/tools/get-recon-scan.js.map +0 -1
  269. package/dist/tools/get-scan-output.d.ts +0 -27
  270. package/dist/tools/get-scan-output.js +0 -64
  271. package/dist/tools/get-scan-output.js.map +0 -1
  272. package/dist/tools/get-scenario-details.d.ts +0 -27
  273. package/dist/tools/get-scenario-details.js +0 -46
  274. package/dist/tools/get-scenario-details.js.map +0 -1
  275. package/dist/tools/get-test-case-results.d.ts +0 -37
  276. package/dist/tools/get-test-case-results.js +0 -66
  277. package/dist/tools/get-test-case-results.js.map +0 -1
  278. package/dist/tools/get-test-details.d.ts +0 -29
  279. package/dist/tools/get-test-details.js +0 -49
  280. package/dist/tools/get-test-details.js.map +0 -1
  281. package/dist/tools/get-trust-keys.js.map +0 -1
  282. package/dist/tools/import-openapi-endpoints.js.map +0 -1
  283. package/dist/tools/inspect-zat.js.map +0 -1
  284. package/dist/tools/list-agent-test-cases.d.ts +0 -41
  285. package/dist/tools/list-agent-test-cases.js +0 -73
  286. package/dist/tools/list-agent-test-cases.js.map +0 -1
  287. package/dist/tools/list-applications.js.map +0 -1
  288. package/dist/tools/list-diagrams.js.map +0 -1
  289. package/dist/tools/list-documents.js.map +0 -1
  290. package/dist/tools/list-endpoints.js.map +0 -1
  291. package/dist/tools/list-recon-scans.d.ts +0 -36
  292. package/dist/tools/list-recon-scans.js +0 -74
  293. package/dist/tools/list-recon-scans.js.map +0 -1
  294. package/dist/tools/list-scan-artifacts.d.ts +0 -41
  295. package/dist/tools/list-scan-artifacts.js +0 -63
  296. package/dist/tools/list-scan-artifacts.js.map +0 -1
  297. package/dist/tools/list-scans.d.ts +0 -44
  298. package/dist/tools/list-scans.js +0 -91
  299. package/dist/tools/list-scans.js.map +0 -1
  300. package/dist/tools/list-test-library.d.ts +0 -44
  301. package/dist/tools/list-test-library.js +0 -83
  302. package/dist/tools/list-test-library.js.map +0 -1
  303. package/dist/tools/list-test-scenarios.d.ts +0 -31
  304. package/dist/tools/list-test-scenarios.js +0 -66
  305. package/dist/tools/list-test-scenarios.js.map +0 -1
  306. package/dist/tools/local-scan.d.ts +0 -40
  307. package/dist/tools/local-scan.js +0 -261
  308. package/dist/tools/local-scan.js.map +0 -1
  309. package/dist/tools/manage-diagram.js.map +0 -1
  310. package/dist/tools/open-in-ide.js.map +0 -1
  311. package/dist/tools/run-test-scenario.d.ts +0 -37
  312. package/dist/tools/run-test-scenario.js +0 -70
  313. package/dist/tools/run-test-scenario.js.map +0 -1
  314. package/dist/tools/scan-pr.d.ts +0 -27
  315. package/dist/tools/scan-pr.js +0 -51
  316. package/dist/tools/scan-pr.js.map +0 -1
  317. package/dist/tools/security-review.js.map +0 -1
  318. package/dist/tools/setup-red-team-target.d.ts +0 -79
  319. package/dist/tools/setup-red-team-target.js +0 -430
  320. package/dist/tools/setup-red-team-target.js.map +0 -1
  321. package/dist/tools/triage-finding.d.ts +0 -47
  322. package/dist/tools/triage-finding.js +0 -116
  323. package/dist/tools/triage-finding.js.map +0 -1
  324. package/dist/tools/update-document.js.map +0 -1
  325. package/dist/tools/update-endpoint.js.map +0 -1
  326. package/dist/tools/update-mermaid-source.js.map +0 -1
  327. package/dist/tools/verify-trust-mark.js.map +0 -1
  328. package/dist/types.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ import { z } from "zod";
2
+ import { requireApplicationId } from "../resolve-application-id.js";
3
+ import { sanitizeResponse } from "../sanitize.js";
4
+ export const MANAGE_APPLICATION_NAME = "zivis_manage_application";
5
+ export const MANAGE_APPLICATION_DESCRIPTION = `Create, update, or delete a target application.
6
+
7
+ Actions:
8
+ - create: requires at least name, base_url, auth_type
9
+ - update: patch an existing application (requires application_id)
10
+ - delete: remove an application (requires application_id)`;
11
+ export const MANAGE_APPLICATION_SCHEMA = {
12
+ action: z.enum(["create", "update", "delete"]).describe("CRUD action"),
13
+ application_id: z
14
+ .string()
15
+ .optional()
16
+ .describe("Required for update/delete. Optional for create."),
17
+ name: z.string().optional().describe("Application name"),
18
+ description: z.string().optional().describe("Application description"),
19
+ base_url: z.string().optional().describe("Base URL, e.g. https://api.example.com"),
20
+ api_url: z.string().optional().describe("Explicit API URL"),
21
+ auth_type: z
22
+ .enum(["none", "oauth_pkce", "static_token", "client_credentials", "bearer_refresh"])
23
+ .optional()
24
+ .describe("Application auth type (required for create)"),
25
+ has_rag: z.boolean().optional().describe("LLM capability flag"),
26
+ has_tools: z.boolean().optional().describe("LLM capability flag"),
27
+ has_memory: z.boolean().optional().describe("LLM capability flag"),
28
+ is_multi_turn: z.boolean().optional().describe("LLM capability flag"),
29
+ system_context: z.string().optional().describe("System context/prompt context"),
30
+ type: z
31
+ .enum(["api", "chat", "sse", "validation", "web"])
32
+ .optional()
33
+ .describe("Application type"),
34
+ use_ephemeral_creds: z
35
+ .boolean()
36
+ .optional()
37
+ .describe("Whether ephemeral credentials are enabled"),
38
+ };
39
+ export function createManageApplicationHandler(apiClient) {
40
+ return async (params) => {
41
+ try {
42
+ const { action } = params;
43
+ let data;
44
+ if (action === "create") {
45
+ if (!params.name || !params.base_url || !params.auth_type) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: "Error: create requires name, base_url, and auth_type",
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ data = await apiClient.post("/api/rt/applications", {
57
+ name: params.name,
58
+ description: params.description,
59
+ baseUrl: params.base_url,
60
+ apiUrl: params.api_url,
61
+ authType: params.auth_type,
62
+ hasRag: params.has_rag,
63
+ hasTools: params.has_tools,
64
+ hasMemory: params.has_memory,
65
+ isMultiTurn: params.is_multi_turn,
66
+ systemContext: params.system_context,
67
+ type: params.type,
68
+ useEphemeralCreds: params.use_ephemeral_creds,
69
+ });
70
+ }
71
+ else {
72
+ const req = requireApplicationId(params.application_id);
73
+ if (!req.ok) {
74
+ return {
75
+ content: [{ type: "text", text: `Error: ${req.message}` }],
76
+ isError: true,
77
+ };
78
+ }
79
+ if (action === "delete") {
80
+ data = await apiClient.del(`/api/rt/applications/${req.id}`);
81
+ }
82
+ else {
83
+ const body = {};
84
+ if (params.name !== undefined)
85
+ body.name = params.name;
86
+ if (params.description !== undefined)
87
+ body.description = params.description;
88
+ if (params.base_url !== undefined)
89
+ body.baseUrl = params.base_url;
90
+ if (params.api_url !== undefined)
91
+ body.apiUrl = params.api_url;
92
+ if (params.auth_type !== undefined)
93
+ body.authType = params.auth_type;
94
+ if (params.has_rag !== undefined)
95
+ body.hasRag = params.has_rag;
96
+ if (params.has_tools !== undefined)
97
+ body.hasTools = params.has_tools;
98
+ if (params.has_memory !== undefined)
99
+ body.hasMemory = params.has_memory;
100
+ if (params.is_multi_turn !== undefined)
101
+ body.isMultiTurn = params.is_multi_turn;
102
+ if (params.system_context !== undefined)
103
+ body.systemContext = params.system_context;
104
+ if (params.type !== undefined)
105
+ body.type = params.type;
106
+ if (params.use_ephemeral_creds !== undefined) {
107
+ body.useEphemeralCreds = params.use_ephemeral_creds;
108
+ }
109
+ data = await apiClient.patch(`/api/rt/applications/${req.id}`, body);
110
+ }
111
+ }
112
+ const sanitized = sanitizeResponse({
113
+ action,
114
+ application_id: params.application_id,
115
+ result: data,
116
+ });
117
+ return {
118
+ content: [{ type: "text", text: JSON.stringify(sanitized, null, 2) }],
119
+ };
120
+ }
121
+ catch (err) {
122
+ const message = err instanceof Error ? err.message : "Failed to manage application";
123
+ return {
124
+ content: [{ type: "text", text: `Error: ${message}` }],
125
+ isError: true,
126
+ };
127
+ }
128
+ };
129
+ }
@@ -1,8 +1,3 @@
1
- /**
2
- * zivis_manage_diagram — Update, delete, or modify diagram content
3
- *
4
- * Maps to: PATCH/DELETE /api/diagrams/:id and sub-resource endpoints
5
- */
6
1
  import { z } from "zod";
7
2
  import type { ApiClient } from "../api-client.js";
8
3
  export declare const MANAGE_DIAGRAM_NAME = "zivis_manage_diagram";
@@ -1,8 +1,3 @@
1
- /**
2
- * zivis_manage_diagram — Update, delete, or modify diagram content
3
- *
4
- * Maps to: PATCH/DELETE /api/diagrams/:id and sub-resource endpoints
5
- */
6
1
  import { z } from "zod";
7
2
  import { sanitizeResponse } from "../sanitize.js";
8
3
  export const MANAGE_DIAGRAM_NAME = "zivis_manage_diagram";
@@ -45,14 +40,12 @@ export const MANAGE_DIAGRAM_SCHEMA = {
45
40
  "unlink_threat_model",
46
41
  ])
47
42
  .describe("Action to perform"),
48
- // Metadata fields
49
43
  name: z.string().optional().describe("Diagram name (update_metadata)"),
50
44
  description: z.string().optional().describe("Diagram description (update_metadata)"),
51
45
  diagram_type: z
52
46
  .enum(["architecture", "data_flow", "attack_chain", "sequence", "trust_boundary", "network", "deployment", "custom"])
53
47
  .optional()
54
48
  .describe("Diagram type (update_metadata)"),
55
- // Node fields
56
49
  node_id: z.string().optional().describe("Node UUID (required for update_node, delete_node)"),
57
50
  node_name: z.string().optional().describe("Node name (required for add_node, optional for update_node)"),
58
51
  node_description: z.string().optional().describe("Node description"),
@@ -66,7 +59,6 @@ export const MANAGE_DIAGRAM_SCHEMA = {
66
59
  step_order: z.number().optional().describe("Step order (attack chain diagrams)"),
67
60
  boundary_id: z.string().optional().describe("Boundary UUID to assign node to, or boundary to update/delete"),
68
61
  metadata: z.record(z.string(), z.unknown()).optional().describe("Custom metadata JSON"),
69
- // Connection fields
70
62
  connection_id: z.string().optional().describe("Connection UUID (required for update_connection, delete_connection)"),
71
63
  source_node_id: z.string().optional().describe("Source node UUID (required for add_connection)"),
72
64
  target_node_id: z.string().optional().describe("Target node UUID (required for add_connection)"),
@@ -74,7 +66,6 @@ export const MANAGE_DIAGRAM_SCHEMA = {
74
66
  connection_description: z.string().optional().describe("Connection description"),
75
67
  connection_tags: z.array(z.string()).optional().describe("Connection tags"),
76
68
  bidirectional: z.boolean().optional().describe("Whether connection goes both ways"),
77
- // Boundary fields
78
69
  boundary_label: z.string().optional().describe("Boundary label (required for add_boundary)"),
79
70
  boundary_description: z.string().optional().describe("Boundary description"),
80
71
  boundary_color: z.string().optional().describe("Boundary hex color"),
@@ -82,7 +73,6 @@ export const MANAGE_DIAGRAM_SCHEMA = {
82
73
  boundary_position_y: z.number().optional().describe("Boundary Y position"),
83
74
  boundary_width: z.number().optional().describe("Boundary width"),
84
75
  boundary_height: z.number().optional().describe("Boundary height"),
85
- // Link fields
86
76
  threat_model_id: z.string().optional().describe("Threat model UUID (link/unlink)"),
87
77
  };
88
78
  function errorResult(message) {
@@ -102,7 +92,6 @@ export function createManageDiagramHandler(apiClient) {
102
92
  const { diagram_id, action } = params;
103
93
  const base = `/api/diagrams/${diagram_id}`;
104
94
  switch (action) {
105
- // ── Metadata ──
106
95
  case "update_metadata": {
107
96
  const body = {};
108
97
  if (params.name)
@@ -118,7 +107,6 @@ export function createManageDiagramHandler(apiClient) {
118
107
  await apiClient.del(base);
119
108
  return successResult({ action: "deleted", diagram_id });
120
109
  }
121
- // ── Nodes ──
122
110
  case "add_node": {
123
111
  if (!params.node_name)
124
112
  return errorResult("node_name is required for add_node");
@@ -187,7 +175,6 @@ export function createManageDiagramHandler(apiClient) {
187
175
  await apiClient.del(`${base}/nodes/${params.node_id}`);
188
176
  return successResult({ action: "deleted", node_id: params.node_id });
189
177
  }
190
- // ── Connections ──
191
178
  case "add_connection": {
192
179
  if (!params.source_node_id || !params.target_node_id) {
193
180
  return errorResult("source_node_id and target_node_id are required for add_connection");
@@ -236,7 +223,6 @@ export function createManageDiagramHandler(apiClient) {
236
223
  await apiClient.del(`${base}/connections/${params.connection_id}`);
237
224
  return successResult({ action: "deleted", connection_id: params.connection_id });
238
225
  }
239
- // ── Boundaries ──
240
226
  case "add_boundary": {
241
227
  if (!params.boundary_label)
242
228
  return errorResult("boundary_label is required for add_boundary");
@@ -285,7 +271,6 @@ export function createManageDiagramHandler(apiClient) {
285
271
  await apiClient.del(`${base}/boundaries/${params.boundary_id}`);
286
272
  return successResult({ action: "deleted", boundary_id: params.boundary_id });
287
273
  }
288
- // ── Threat Model Links ──
289
274
  case "link_threat_model": {
290
275
  if (!params.threat_model_id)
291
276
  return errorResult("threat_model_id is required for link_threat_model");
@@ -313,4 +298,3 @@ export function createManageDiagramHandler(apiClient) {
313
298
  }
314
299
  };
315
300
  }
316
- //# sourceMappingURL=manage-diagram.js.map
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare const MANAGE_ENDPOINT_LIFECYCLE_NAME = "zivis_manage_endpoint_lifecycle";
4
+ export declare const MANAGE_ENDPOINT_LIFECYCLE_DESCRIPTION = "Manage endpoint lifecycle for an application.\n\nActions:\n- create: create a single endpoint\n- update: patch an endpoint\n- delete: delete a single endpoint\n- bulk_delete: delete endpoints by source (e.g., openapi)\n- import_openapi: import endpoints from an OpenAPI spec";
5
+ export declare const MANAGE_ENDPOINT_LIFECYCLE_SCHEMA: {
6
+ application_id: z.ZodOptional<z.ZodString>;
7
+ action: z.ZodEnum<{
8
+ create: "create";
9
+ update: "update";
10
+ delete: "delete";
11
+ bulk_delete: "bulk_delete";
12
+ import_openapi: "import_openapi";
13
+ }>;
14
+ endpoint_id: z.ZodOptional<z.ZodString>;
15
+ path: z.ZodOptional<z.ZodString>;
16
+ method: z.ZodOptional<z.ZodEnum<{
17
+ POST: "POST";
18
+ GET: "GET";
19
+ PATCH: "PATCH";
20
+ PUT: "PUT";
21
+ DELETE: "DELETE";
22
+ HEAD: "HEAD";
23
+ OPTIONS: "OPTIONS";
24
+ }>>;
25
+ summary: z.ZodOptional<z.ZodString>;
26
+ description: z.ZodOptional<z.ZodString>;
27
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ auth_required: z.ZodOptional<z.ZodBoolean>;
29
+ deprecated: z.ZodOptional<z.ZodBoolean>;
30
+ endpoint_type: z.ZodOptional<z.ZodEnum<{
31
+ api: "api";
32
+ chat: "chat";
33
+ sse: "sse";
34
+ validation: "validation";
35
+ web: "web";
36
+ }>>;
37
+ request_template: z.ZodOptional<z.ZodString>;
38
+ response_path: z.ZodOptional<z.ZodString>;
39
+ streaming_enabled: z.ZodOptional<z.ZodBoolean>;
40
+ source: z.ZodOptional<z.ZodEnum<{
41
+ openapi: "openapi";
42
+ manual: "manual";
43
+ discovery: "discovery";
44
+ }>>;
45
+ spec_url: z.ZodOptional<z.ZodString>;
46
+ spec_content: z.ZodOptional<z.ZodString>;
47
+ replace_existing: z.ZodOptional<z.ZodBoolean>;
48
+ };
49
+ export declare function createManageEndpointLifecycleHandler(apiClient: ApiClient): (params: {
50
+ application_id?: string;
51
+ action: "create" | "update" | "delete" | "bulk_delete" | "import_openapi";
52
+ endpoint_id?: string;
53
+ path?: string;
54
+ method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
55
+ summary?: string;
56
+ description?: string;
57
+ tags?: string[];
58
+ auth_required?: boolean;
59
+ deprecated?: boolean;
60
+ endpoint_type?: "api" | "chat" | "sse" | "validation" | "web";
61
+ request_template?: string;
62
+ response_path?: string;
63
+ streaming_enabled?: boolean;
64
+ source?: "openapi" | "manual" | "discovery";
65
+ spec_url?: string;
66
+ spec_content?: string;
67
+ replace_existing?: boolean;
68
+ }) => Promise<{
69
+ content: {
70
+ type: "text";
71
+ text: string;
72
+ }[];
73
+ isError: boolean;
74
+ } | {
75
+ content: {
76
+ type: "text";
77
+ text: string;
78
+ }[];
79
+ isError?: undefined;
80
+ }>;
@@ -0,0 +1,180 @@
1
+ import { z } from "zod";
2
+ import { requireApplicationId } from "../resolve-application-id.js";
3
+ import { sanitizeResponse } from "../sanitize.js";
4
+ export const MANAGE_ENDPOINT_LIFECYCLE_NAME = "zivis_manage_endpoint_lifecycle";
5
+ export const MANAGE_ENDPOINT_LIFECYCLE_DESCRIPTION = `Manage endpoint lifecycle for an application.
6
+
7
+ Actions:
8
+ - create: create a single endpoint
9
+ - update: patch an endpoint
10
+ - delete: delete a single endpoint
11
+ - bulk_delete: delete endpoints by source (e.g., openapi)
12
+ - import_openapi: import endpoints from an OpenAPI spec`;
13
+ export const MANAGE_ENDPOINT_LIFECYCLE_SCHEMA = {
14
+ application_id: z
15
+ .string()
16
+ .optional()
17
+ .describe("Application UUID. If omitted, uses applicationId from .zivis/project.json when set."),
18
+ action: z
19
+ .enum(["create", "update", "delete", "bulk_delete", "import_openapi"])
20
+ .describe("Endpoint lifecycle action"),
21
+ endpoint_id: z.string().optional().describe("Required for update/delete actions"),
22
+ path: z.string().optional().describe("Endpoint path, e.g. /api/chat"),
23
+ method: z
24
+ .enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"])
25
+ .optional()
26
+ .describe("HTTP method"),
27
+ summary: z.string().optional().describe("Endpoint summary"),
28
+ description: z.string().optional().describe("Endpoint description"),
29
+ tags: z.array(z.string()).optional().describe("Endpoint tags"),
30
+ auth_required: z.boolean().optional().describe("Whether auth is required"),
31
+ deprecated: z.boolean().optional().describe("Whether endpoint is deprecated"),
32
+ endpoint_type: z
33
+ .enum(["api", "chat", "sse", "validation", "web"])
34
+ .optional()
35
+ .describe("Endpoint type"),
36
+ request_template: z
37
+ .string()
38
+ .optional()
39
+ .describe("AI request template, usually includes {{message}}"),
40
+ response_path: z
41
+ .string()
42
+ .optional()
43
+ .describe("JSON path to pull response text"),
44
+ streaming_enabled: z.boolean().optional().describe("Whether streaming is enabled"),
45
+ source: z
46
+ .enum(["openapi", "manual", "discovery"])
47
+ .optional()
48
+ .describe("Source filter for bulk_delete"),
49
+ spec_url: z.string().optional().describe("OpenAPI spec URL for import_openapi"),
50
+ spec_content: z.string().optional().describe("Raw OpenAPI spec content"),
51
+ replace_existing: z
52
+ .boolean()
53
+ .optional()
54
+ .describe("When import_openapi, remove previous openapi endpoints first"),
55
+ };
56
+ export function createManageEndpointLifecycleHandler(apiClient) {
57
+ return async (params) => {
58
+ const req = requireApplicationId(params.application_id);
59
+ if (!req.ok) {
60
+ return {
61
+ content: [{ type: "text", text: `Error: ${req.message}` }],
62
+ isError: true,
63
+ };
64
+ }
65
+ const applicationId = req.id;
66
+ const action = params.action;
67
+ try {
68
+ let data;
69
+ if (action === "create") {
70
+ if (!params.path || !params.method) {
71
+ return {
72
+ content: [
73
+ {
74
+ type: "text",
75
+ text: "Error: create requires path and method",
76
+ },
77
+ ],
78
+ isError: true,
79
+ };
80
+ }
81
+ data = await apiClient.post(`/api/rt/applications/${applicationId}/endpoints`, {
82
+ path: params.path,
83
+ method: params.method,
84
+ summary: params.summary,
85
+ description: params.description,
86
+ tags: params.tags,
87
+ authRequired: params.auth_required,
88
+ deprecated: params.deprecated,
89
+ endpointType: params.endpoint_type,
90
+ requestTemplate: params.request_template,
91
+ responsePath: params.response_path,
92
+ streamingEnabled: params.streaming_enabled,
93
+ });
94
+ }
95
+ else if (action === "update") {
96
+ if (!params.endpoint_id) {
97
+ return {
98
+ content: [
99
+ { type: "text", text: "Error: endpoint_id is required for update" },
100
+ ],
101
+ isError: true,
102
+ };
103
+ }
104
+ const body = {};
105
+ if (params.path !== undefined)
106
+ body.path = params.path;
107
+ if (params.method !== undefined)
108
+ body.method = params.method;
109
+ if (params.summary !== undefined)
110
+ body.summary = params.summary;
111
+ if (params.description !== undefined)
112
+ body.description = params.description;
113
+ if (params.tags !== undefined)
114
+ body.tags = params.tags;
115
+ if (params.auth_required !== undefined)
116
+ body.authRequired = params.auth_required;
117
+ if (params.deprecated !== undefined)
118
+ body.deprecated = params.deprecated;
119
+ if (params.endpoint_type !== undefined)
120
+ body.endpointType = params.endpoint_type;
121
+ if (params.request_template !== undefined)
122
+ body.requestTemplate = params.request_template;
123
+ if (params.response_path !== undefined)
124
+ body.responsePath = params.response_path;
125
+ if (params.streaming_enabled !== undefined) {
126
+ body.streamingEnabled = params.streaming_enabled;
127
+ }
128
+ data = await apiClient.patch(`/api/rt/applications/${applicationId}/endpoints/${params.endpoint_id}`, body);
129
+ }
130
+ else if (action === "delete") {
131
+ if (!params.endpoint_id) {
132
+ return {
133
+ content: [
134
+ { type: "text", text: "Error: endpoint_id is required for delete" },
135
+ ],
136
+ isError: true,
137
+ };
138
+ }
139
+ data = await apiClient.del(`/api/rt/applications/${applicationId}/endpoints/${params.endpoint_id}`);
140
+ }
141
+ else if (action === "bulk_delete") {
142
+ if (!params.source) {
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: "Error: source is required for bulk_delete (openapi/manual/discovery)",
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ data = await apiClient.del(`/api/rt/applications/${applicationId}/endpoints?source=${encodeURIComponent(params.source)}`);
154
+ }
155
+ else {
156
+ data = await apiClient.post(`/api/rt/applications/${applicationId}/endpoints/import-openapi`, {
157
+ specUrl: params.spec_url,
158
+ specContent: params.spec_content,
159
+ replaceExisting: params.replace_existing ?? false,
160
+ });
161
+ }
162
+ const sanitized = sanitizeResponse({
163
+ action,
164
+ application_id: applicationId,
165
+ endpoint_id: params.endpoint_id,
166
+ result: data,
167
+ });
168
+ return {
169
+ content: [{ type: "text", text: JSON.stringify(sanitized, null, 2) }],
170
+ };
171
+ }
172
+ catch (err) {
173
+ const message = err instanceof Error ? err.message : "Failed to manage endpoint lifecycle";
174
+ return {
175
+ content: [{ type: "text", text: `Error: ${message}` }],
176
+ isError: true,
177
+ };
178
+ }
179
+ };
180
+ }
@@ -1,29 +1,17 @@
1
- /**
2
- * zivis_open_in_ide — Build a vscode:// deep link that opens a ZIVIS artifact
3
- * inside the ZIVIS Code IDE extension.
4
- *
5
- * No API call — pure URI construction. The ZIVIS Code extension registers a
6
- * URI handler for `vscode://zivisai.zivis-security/<kind>?id=<uuid>` and opens
7
- * the matching diagram/document panel or reveals the threat model in its tree.
8
- *
9
- * Use this whenever the agent wants to surface a "open this in your IDE" link
10
- * (e.g. after creating a diagram, finishing a security review, or referencing
11
- * a threat model in a remediation suggestion).
12
- */
13
1
  import { z } from "zod";
14
2
  export declare const OPEN_IN_IDE_NAME = "zivis_open_in_ide";
15
3
  export declare const OPEN_IN_IDE_DESCRIPTION = "Build a vscode:// or cursor:// deep link that opens a ZIVIS artifact inside the ZIVIS Code IDE extension.\n\nReturns a URI like `vscode://zivisai.zivis-security/diagram?id=<uuid>` (or `cursor://...` when ide_client is cursor). When opened with the system's URL handler, it launches the matching desktop editor and opens the diagram, document, or threat model.\n\nSupported kinds:\n - diagram \u2014 opens the diagram in a webview panel\n - document \u2014 opens the document in a webview panel\n - threat-model \u2014 reveals the threat model in the ZIVIS sidebar tree\n\nRequires the ZIVIS Code extension (publisher: zivisai, name: zivis-security) to be installed in the user's IDE. If it isn't, the URI will prompt the user to install it.\n\nThis tool does not make any API calls and does not validate that the ID exists \u2014 it's a pure URI builder.";
16
4
  export declare const OPEN_IN_IDE_SCHEMA: {
17
5
  kind: z.ZodEnum<{
18
- diagram: "diagram";
19
6
  document: "document";
7
+ diagram: "diagram";
20
8
  "threat-model": "threat-model";
21
9
  }>;
22
10
  id: z.ZodString;
23
11
  label: z.ZodOptional<z.ZodString>;
24
12
  ide_client: z.ZodOptional<z.ZodEnum<{
25
- vscode: "vscode";
26
13
  cursor: "cursor";
14
+ vscode: "vscode";
27
15
  }>>;
28
16
  };
29
17
  export declare function createOpenInIdeHandler(): (params: {
@@ -1,15 +1,3 @@
1
- /**
2
- * zivis_open_in_ide — Build a vscode:// deep link that opens a ZIVIS artifact
3
- * inside the ZIVIS Code IDE extension.
4
- *
5
- * No API call — pure URI construction. The ZIVIS Code extension registers a
6
- * URI handler for `vscode://zivisai.zivis-security/<kind>?id=<uuid>` and opens
7
- * the matching diagram/document panel or reveals the threat model in its tree.
8
- *
9
- * Use this whenever the agent wants to surface a "open this in your IDE" link
10
- * (e.g. after creating a diagram, finishing a security review, or referencing
11
- * a threat model in a remediation suggestion).
12
- */
13
1
  import { z } from "zod";
14
2
  export const OPEN_IN_IDE_NAME = "zivis_open_in_ide";
15
3
  export const OPEN_IN_IDE_DESCRIPTION = `Build a vscode:// or cursor:// deep link that opens a ZIVIS artifact inside the ZIVIS Code IDE extension.
@@ -58,4 +46,3 @@ export function createOpenInIdeHandler() {
58
46
  };
59
47
  };
60
48
  }
61
- //# sourceMappingURL=open-in-ide.js.map
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare const REVIEW_CHANGE_NAME = "zivis_review_change";
4
+ export declare const REVIEW_CHANGE_DESCRIPTION = "Preview the security-architecture impact of a proposed code change BEFORE pushing.\n\nSend a list of files about to change (before/after content). ZIVIS projects the change against the live architecture graph and returns:\n - Which extractor modules would re-run on the diff (e.g. AI Model Inventory, Injection Surfaces)\n - Which existing SIGNALs touch the changed files\n - Glob matches per module so you know what's in scope\n\nUse this BEFORE making non-trivial changes to:\n - LLM call sites (prompts, model bindings)\n - Agent tool registrations\n - Auth / control middleware\n - RAG retrieval paths\n - Any file that already produced a SIGNAL\n\nThe response is metadata-only in v1 (does not yet run the pattern matcher against the proposed diff). It tells you what would be re-evaluated, not the verdict.";
5
+ export declare const REVIEW_CHANGE_SCHEMA: {
6
+ application_id: z.ZodOptional<z.ZodString>;
7
+ changes: z.ZodArray<z.ZodObject<{
8
+ file_path: z.ZodString;
9
+ before_content: z.ZodOptional<z.ZodString>;
10
+ after_content: z.ZodString;
11
+ }, z.core.$strip>>;
12
+ intent: z.ZodOptional<z.ZodString>;
13
+ };
14
+ export declare function createReviewChangeHandler(apiClient: ApiClient): (params: {
15
+ application_id?: string;
16
+ changes: Array<{
17
+ file_path: string;
18
+ before_content?: string;
19
+ after_content: string;
20
+ }>;
21
+ intent?: string;
22
+ }) => Promise<{
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ } | {
29
+ content: {
30
+ type: "text";
31
+ text: string;
32
+ }[];
33
+ isError?: undefined;
34
+ }>;
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ import { requireApplicationId } from "../resolve-application-id.js";
3
+ import { sanitizeResponse } from "../sanitize.js";
4
+ export const REVIEW_CHANGE_NAME = "zivis_review_change";
5
+ export const REVIEW_CHANGE_DESCRIPTION = `Preview the security-architecture impact of a proposed code change BEFORE pushing.
6
+
7
+ Send a list of files about to change (before/after content). ZIVIS projects the change against the live architecture graph and returns:
8
+ - Which extractor modules would re-run on the diff (e.g. AI Model Inventory, Injection Surfaces)
9
+ - Which existing SIGNALs touch the changed files
10
+ - Glob matches per module so you know what's in scope
11
+
12
+ Use this BEFORE making non-trivial changes to:
13
+ - LLM call sites (prompts, model bindings)
14
+ - Agent tool registrations
15
+ - Auth / control middleware
16
+ - RAG retrieval paths
17
+ - Any file that already produced a SIGNAL
18
+
19
+ The response is metadata-only in v1 (does not yet run the pattern matcher against the proposed diff). It tells you what would be re-evaluated, not the verdict.`;
20
+ export const REVIEW_CHANGE_SCHEMA = {
21
+ application_id: z
22
+ .string()
23
+ .optional()
24
+ .describe("Application UUID. If omitted, uses applicationId from .zivis/project.json."),
25
+ changes: z
26
+ .array(z.object({
27
+ file_path: z.string().describe("Repo-relative file path"),
28
+ before_content: z.string().optional().describe("Current file content (optional)"),
29
+ after_content: z.string().describe("Proposed new file content"),
30
+ }))
31
+ .min(1)
32
+ .describe("List of proposed file changes"),
33
+ intent: z
34
+ .string()
35
+ .optional()
36
+ .describe("One-line user-stated purpose of the change — e.g. 'adding a tool to the email-sender agent'"),
37
+ };
38
+ export function createReviewChangeHandler(apiClient) {
39
+ return async (params) => {
40
+ const req = requireApplicationId(params.application_id);
41
+ if (!req.ok) {
42
+ return {
43
+ content: [{ type: "text", text: `Error: ${req.message}` }],
44
+ isError: true,
45
+ };
46
+ }
47
+ const application_id = req.id;
48
+ try {
49
+ const data = await apiClient.post(`/api/apps/${application_id}/review-change`, {
50
+ intent: params.intent,
51
+ changes: params.changes.map((c) => ({
52
+ filePath: c.file_path,
53
+ beforeContent: c.before_content,
54
+ afterContent: c.after_content,
55
+ })),
56
+ });
57
+ const result = {
58
+ application_id: data.applicationId,
59
+ intent: data.intent,
60
+ modules_that_would_run: data.modulesThatWouldRun.map((m) => ({
61
+ module_id: m.moduleId,
62
+ matched_files: m.fileGlobMatches,
63
+ })),
64
+ modules_that_would_skip: data.modulesThatWouldSkip.map((m) => ({
65
+ module_id: m.moduleId,
66
+ reason: m.reason,
67
+ })),
68
+ current_signals_touching_changed_files: data.currentSignalsTouchingChangedFiles.map((s) => ({
69
+ signal_id: s.signalLogicalId,
70
+ title: s.title,
71
+ severity: s.severity,
72
+ evidence_file_paths: s.evidenceFilePaths,
73
+ })),
74
+ warnings: data.warnings,
75
+ };
76
+ return {
77
+ content: [
78
+ {
79
+ type: "text",
80
+ text: JSON.stringify(sanitizeResponse(result), null, 2),
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : "Failed to review change";
87
+ return {
88
+ content: [{ type: "text", text: `Error: ${message}` }],
89
+ isError: true,
90
+ };
91
+ }
92
+ };
93
+ }