actshield 0.9.0__py3-none-any.whl

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 (366) hide show
  1. actshield/__init__.py +439 -0
  2. actshield/__main__.py +46 -0
  3. actshield/agents/__init__.py +12 -0
  4. actshield/agents/agent.py +200 -0
  5. actshield/agents/identity.py +114 -0
  6. actshield/api/__init__.py +34 -0
  7. actshield/api/models.py +198 -0
  8. actshield/api/server.py +669 -0
  9. actshield/api/service.py +599 -0
  10. actshield/approval/__init__.py +15 -0
  11. actshield/approval/approval.py +164 -0
  12. actshield/cli/__init__.py +8 -0
  13. actshield/cli/graph.py +49 -0
  14. actshield/cli/main.py +802 -0
  15. actshield/cli/shell.py +406 -0
  16. actshield/cli/theme.py +110 -0
  17. actshield/client.py +757 -0
  18. actshield/config.py +88 -0
  19. actshield/context/__init__.py +14 -0
  20. actshield/context/context.py +161 -0
  21. actshield/context/provenance.py +108 -0
  22. actshield/context/taint.py +48 -0
  23. actshield/decisions/decision.py +74 -0
  24. actshield/delegation/__init__.py +11 -0
  25. actshield/delegation/authority.py +63 -0
  26. actshield/delegation/delegation.py +180 -0
  27. actshield/demo.py +139 -0
  28. actshield/doctor.py +94 -0
  29. actshield/drift/__init__.py +27 -0
  30. actshield/drift/drift_engine.py +149 -0
  31. actshield/drift/drift_models.py +63 -0
  32. actshield/evaluation/__init__.py +1 -0
  33. actshield/evaluation/cases/__init__.py +1 -0
  34. actshield/evaluation/eval_suite.py +254 -0
  35. actshield/forensics/__init__.py +53 -0
  36. actshield/forensics/access_graph.py +216 -0
  37. actshield/forensics/authority_graph.py +186 -0
  38. actshield/forensics/delegation_graph.py +119 -0
  39. actshield/forensics/explanation.py +254 -0
  40. actshield/forensics/models.py +488 -0
  41. actshield/forensics/queries.py +367 -0
  42. actshield/forensics/serializers.py +68 -0
  43. actshield/forensics/service.py +310 -0
  44. actshield/forensics/snapshots.py +174 -0
  45. actshield/gates/__init__.py +13 -0
  46. actshield/gates/gate_models.py +46 -0
  47. actshield/gates/security_gate.py +191 -0
  48. actshield/gateway/__init__.py +13 -0
  49. actshield/gateway/http.py +191 -0
  50. actshield/gateway/mcp.py +292 -0
  51. actshield/incidents/__init__.py +25 -0
  52. actshield/incidents/incident.py +94 -0
  53. actshield/incidents/incident_engine.py +163 -0
  54. actshield/incidents/incident_rules.py +116 -0
  55. actshield/incidents/incident_state.py +58 -0
  56. actshield/integrations/__init__.py +24 -0
  57. actshield/integrations/ai_secura.py +169 -0
  58. actshield/integrations/ai_secura_analysis.py +236 -0
  59. actshield/integrations/apiris.py +122 -0
  60. actshield/integrations/few_shot.py +104 -0
  61. actshield/integrations/ollama_adapter.py +538 -0
  62. actshield/integrations/prompts/__init__.py +1 -0
  63. actshield/integrations/prompts/examples/__init__.py +1 -0
  64. actshield/integrations/security_packet.py +82 -0
  65. actshield/llm_config.py +89 -0
  66. actshield/offensive/__init__.py +95 -0
  67. actshield/offensive/adaptive/__init__.py +22 -0
  68. actshield/offensive/adaptive/adaptive_engine.py +165 -0
  69. actshield/offensive/adaptive/attack_selector.py +51 -0
  70. actshield/offensive/adaptive/boundary_search.py +99 -0
  71. actshield/offensive/adaptive/campaign_memory.py +123 -0
  72. actshield/offensive/adaptive/feedback.py +84 -0
  73. actshield/offensive/adaptive/mutation_planner.py +57 -0
  74. actshield/offensive/attack.py +78 -0
  75. actshield/offensive/campaign.py +219 -0
  76. actshield/offensive/corpus.py +155 -0
  77. actshield/offensive/engine.py +466 -0
  78. actshield/offensive/evaluator.py +116 -0
  79. actshield/offensive/evidence.py +63 -0
  80. actshield/offensive/generator.py +128 -0
  81. actshield/offensive/mutation.py +101 -0
  82. actshield/offensive/results.py +77 -0
  83. actshield/offensive/safety.py +80 -0
  84. actshield/offensive/strategies/__init__.py +22 -0
  85. actshield/offensive/strategies/authority_escalation.py +100 -0
  86. actshield/offensive/strategies/base.py +34 -0
  87. actshield/offensive/strategies/context_manipulation.py +100 -0
  88. actshield/offensive/strategies/data_exfiltration.py +100 -0
  89. actshield/offensive/strategies/delegation_attacks.py +100 -0
  90. actshield/offensive/strategies/mcp_attacks.py +100 -0
  91. actshield/offensive/strategies/prompt_injection.py +100 -0
  92. actshield/offensive/strategies/tool_poisoning.py +100 -0
  93. actshield/offensive/target.py +113 -0
  94. actshield/offensive/vulnerable_target.py +121 -0
  95. actshield/persistence/__init__.py +18 -0
  96. actshield/persistence/siem.py +102 -0
  97. actshield/persistence/storage.py +240 -0
  98. actshield/policy/__init__.py +12 -0
  99. actshield/policy/evaluator.py +294 -0
  100. actshield/policy/intent.py +113 -0
  101. actshield/policy/policy.py +48 -0
  102. actshield/posture/__init__.py +26 -0
  103. actshield/posture/posture_engine.py +186 -0
  104. actshield/posture/posture_models.py +152 -0
  105. actshield/posture/posture_rules.py +137 -0
  106. actshield/providers/__init__.py +32 -0
  107. actshield/providers/anthropic_provider.py +146 -0
  108. actshield/providers/base.py +160 -0
  109. actshield/providers/gemini_provider.py +133 -0
  110. actshield/providers/null_provider.py +40 -0
  111. actshield/providers/ollama_provider.py +135 -0
  112. actshield/providers/openai_provider.py +142 -0
  113. actshield/providers/registry.py +244 -0
  114. actshield/py.typed +0 -0
  115. actshield/response/__init__.py +14 -0
  116. actshield/response/response_actions.py +39 -0
  117. actshield/response/response_audit.py +32 -0
  118. actshield/response/response_engine.py +139 -0
  119. actshield/risk/models.py +104 -0
  120. actshield/serve.py +117 -0
  121. actshield/static/404.html +1 -0
  122. actshield/static/__next.__PAGE__.txt +24 -0
  123. actshield/static/__next._full.txt +20 -0
  124. actshield/static/__next._tree.txt +4 -0
  125. actshield/static/_next/static/Yp_swxN-C9UoCRNOwkYnY/_buildManifest.js +11 -0
  126. actshield/static/_next/static/Yp_swxN-C9UoCRNOwkYnY/_clientMiddlewareManifest.js +1 -0
  127. actshield/static/_next/static/Yp_swxN-C9UoCRNOwkYnY/_ssgManifest.js +1 -0
  128. actshield/static/_next/static/chunks/09kny2eqjc2or.js +1 -0
  129. actshield/static/_next/static/chunks/0c1zba1u9whdp.js +1 -0
  130. actshield/static/_next/static/chunks/0cz1d0mv5g_q7.js +1 -0
  131. actshield/static/_next/static/chunks/0dbjjeg01x25o.js +1 -0
  132. actshield/static/_next/static/chunks/0duobs55ne238.js +1 -0
  133. actshield/static/_next/static/chunks/0iaz41l6068e4.js +1 -0
  134. actshield/static/_next/static/chunks/0mjhyv72x2idp.js +1 -0
  135. actshield/static/_next/static/chunks/0nelpqfu_ciq6.js +1 -0
  136. actshield/static/_next/static/chunks/0p1bci9ch797v.js +1 -0
  137. actshield/static/_next/static/chunks/0tld_ygho5tgm.js +1 -0
  138. actshield/static/_next/static/chunks/0w1-y7oni66j9.js +1 -0
  139. actshield/static/_next/static/chunks/10537zyl427zj.js +1 -0
  140. actshield/static/_next/static/chunks/11pc_jkl3aggn.js +1 -0
  141. actshield/static/_next/static/chunks/16k7nw0b3t8ys.js +1 -0
  142. actshield/static/_next/static/chunks/19mx3mg6lkumu.js +1 -0
  143. actshield/static/_next/static/chunks/1_8p47b-kxg2a.js +1 -0
  144. actshield/static/_next/static/chunks/1dszjozwfqegx.js +1 -0
  145. actshield/static/_next/static/chunks/1h43jcb90-m2r.js +22 -0
  146. actshield/static/_next/static/chunks/1ly04cvt_wh_j.js +1 -0
  147. actshield/static/_next/static/chunks/1odxrypuwuwp_.js +1 -0
  148. actshield/static/_next/static/chunks/1oes4c35qz5ku.js +1 -0
  149. actshield/static/_next/static/chunks/1ow883jl4ln-r.js +16 -0
  150. actshield/static/_next/static/chunks/1po7bna1as8tc.js +1 -0
  151. actshield/static/_next/static/chunks/1rsh0og8ifkzx.js +1 -0
  152. actshield/static/_next/static/chunks/1v0lwzv-859z_.js +1 -0
  153. actshield/static/_next/static/chunks/25iat2epwx25a.js +1 -0
  154. actshield/static/_next/static/chunks/25uvt4s2f39a4.js +1 -0
  155. actshield/static/_next/static/chunks/27t_qfc-3_lzs.js +1 -0
  156. actshield/static/_next/static/chunks/28bkmy8mez7gm.js +1 -0
  157. actshield/static/_next/static/chunks/2b6brmw_drw1p.js +1 -0
  158. actshield/static/_next/static/chunks/2fnhtxi4j6vge.js +1 -0
  159. actshield/static/_next/static/chunks/2p087eftxemg4.js +6 -0
  160. actshield/static/_next/static/chunks/2s8pao_z8pgtq.js +1 -0
  161. actshield/static/_next/static/chunks/2yj7ooc2c-zpg.js +1 -0
  162. actshield/static/_next/static/chunks/3-mrrr8udt5tk.js +1 -0
  163. actshield/static/_next/static/chunks/310vm2bl3xxpt.js +31 -0
  164. actshield/static/_next/static/chunks/35mvsv251jx1r.css +3 -0
  165. actshield/static/_next/static/chunks/370vf0oetlsx9.js +1 -0
  166. actshield/static/_next/static/chunks/3e-2m72tyo556.js +1 -0
  167. actshield/static/_next/static/chunks/3fntmmi971322.js +1 -0
  168. actshield/static/_next/static/chunks/3fzw-g0hycl2c.js +1 -0
  169. actshield/static/_next/static/chunks/3lopq3lhmcjxg.js +129 -0
  170. actshield/static/_next/static/chunks/3mpe2jejel0v2.css +1 -0
  171. actshield/static/_next/static/chunks/3t8o4f2lzr2sf.js +1 -0
  172. actshield/static/_next/static/chunks/3y-v1neyllne5.js +1 -0
  173. actshield/static/_next/static/chunks/43oiwy8mx6cs1.js +1 -0
  174. actshield/static/_next/static/chunks/turbopack-23wzuebcy_lxm.js +1 -0
  175. actshield/static/_next/static/media/1bffadaabf893a1e-s.3-6t-g6q0vh0a.woff2 +0 -0
  176. actshield/static/_next/static/media/2bbe8d2671613f1f-s.0k62hbripvv8p.woff2 +0 -0
  177. actshield/static/_next/static/media/2c55a0e60120577a-s.0-dom-5bn10r2.woff2 +0 -0
  178. actshield/static/_next/static/media/5476f68d60460930-s.2uwcyprjm3xu3.woff2 +0 -0
  179. actshield/static/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2 +0 -0
  180. actshield/static/_next/static/media/9c72aa0f40e4eef8-s.1y4-pdgsjb-pw.woff2 +0 -0
  181. actshield/static/_next/static/media/ad66f9afd8947f86-s.3lvt2whj97whp.woff2 +0 -0
  182. actshield/static/_next/static/media/favicon.2vob68tjqpejf.ico +0 -0
  183. actshield/static/_not-found/__next._full.txt +17 -0
  184. actshield/static/_not-found/__next._not-found/__PAGE__.txt +23 -0
  185. actshield/static/_not-found/__next._tree.txt +3 -0
  186. actshield/static/_not-found.html +1 -0
  187. actshield/static/_not-found.txt +17 -0
  188. actshield/static/access/matrix/__next._full.txt +24 -0
  189. actshield/static/access/matrix/__next._tree.txt +4 -0
  190. actshield/static/access/matrix/__next.access/matrix/__PAGE__.txt +30 -0
  191. actshield/static/access/matrix.html +1 -0
  192. actshield/static/access/matrix.txt +24 -0
  193. actshield/static/activity/__next._full.txt +22 -0
  194. actshield/static/activity/__next._tree.txt +4 -0
  195. actshield/static/activity/__next.activity/__PAGE__.txt +27 -0
  196. actshield/static/activity.html +1 -0
  197. actshield/static/activity.txt +22 -0
  198. actshield/static/agents/__next._full.txt +22 -0
  199. actshield/static/agents/__next._tree.txt +4 -0
  200. actshield/static/agents/__next.agents/__PAGE__.txt +27 -0
  201. actshield/static/agents.html +1 -0
  202. actshield/static/agents.txt +22 -0
  203. actshield/static/ai-secura/__next._full.txt +22 -0
  204. actshield/static/ai-secura/__next._tree.txt +4 -0
  205. actshield/static/ai-secura/__next.ai-secura/__PAGE__.txt +27 -0
  206. actshield/static/ai-secura.html +1 -0
  207. actshield/static/ai-secura.txt +22 -0
  208. actshield/static/api/__next._full.txt +22 -0
  209. actshield/static/api/__next._tree.txt +4 -0
  210. actshield/static/api/__next.api/__PAGE__.txt +27 -0
  211. actshield/static/api.html +15 -0
  212. actshield/static/api.txt +22 -0
  213. actshield/static/apiris/__next._full.txt +22 -0
  214. actshield/static/apiris/__next._tree.txt +4 -0
  215. actshield/static/apiris/__next.apiris/__PAGE__.txt +27 -0
  216. actshield/static/apiris.html +1 -0
  217. actshield/static/apiris.txt +22 -0
  218. actshield/static/attack-graph/__next._full.txt +23 -0
  219. actshield/static/attack-graph/__next._tree.txt +5 -0
  220. actshield/static/attack-graph/__next.attack-graph/__PAGE__.txt +28 -0
  221. actshield/static/attack-graph.html +2 -0
  222. actshield/static/attack-graph.txt +23 -0
  223. actshield/static/campaigns/__next._full.txt +22 -0
  224. actshield/static/campaigns/__next._tree.txt +4 -0
  225. actshield/static/campaigns/__next.campaigns/__PAGE__.txt +27 -0
  226. actshield/static/campaigns.html +1 -0
  227. actshield/static/campaigns.txt +22 -0
  228. actshield/static/context/__next._full.txt +22 -0
  229. actshield/static/context/__next._tree.txt +4 -0
  230. actshield/static/context/__next.context/__PAGE__.txt +27 -0
  231. actshield/static/context.html +1 -0
  232. actshield/static/context.txt +22 -0
  233. actshield/static/dashboard/__next._full.txt +22 -0
  234. actshield/static/dashboard/__next._tree.txt +4 -0
  235. actshield/static/dashboard/__next.dashboard/__PAGE__.txt +27 -0
  236. actshield/static/dashboard.html +1 -0
  237. actshield/static/dashboard.txt +22 -0
  238. actshield/static/delegations/__next._full.txt +22 -0
  239. actshield/static/delegations/__next._tree.txt +4 -0
  240. actshield/static/delegations/__next.delegations/__PAGE__.txt +27 -0
  241. actshield/static/delegations.html +1 -0
  242. actshield/static/delegations.txt +22 -0
  243. actshield/static/demo/__next._full.txt +22 -0
  244. actshield/static/demo/__next._tree.txt +4 -0
  245. actshield/static/demo/__next.demo/__PAGE__.txt +27 -0
  246. actshield/static/demo.html +1 -0
  247. actshield/static/demo.txt +22 -0
  248. actshield/static/drift/__next._full.txt +22 -0
  249. actshield/static/drift/__next._tree.txt +4 -0
  250. actshield/static/drift/__next.drift/__PAGE__.txt +27 -0
  251. actshield/static/drift.html +1 -0
  252. actshield/static/drift.txt +22 -0
  253. actshield/static/favicon.ico +0 -0
  254. actshield/static/file.svg +1 -0
  255. actshield/static/forensics/__next._full.txt +22 -0
  256. actshield/static/forensics/__next._tree.txt +4 -0
  257. actshield/static/forensics/__next.forensics/__PAGE__.txt +27 -0
  258. actshield/static/forensics.html +1 -0
  259. actshield/static/forensics.txt +22 -0
  260. actshield/static/globe.svg +1 -0
  261. actshield/static/incidents/__next._full.txt +22 -0
  262. actshield/static/incidents/__next._tree.txt +4 -0
  263. actshield/static/incidents/__next.incidents/__PAGE__.txt +27 -0
  264. actshield/static/incidents.html +1 -0
  265. actshield/static/incidents.txt +22 -0
  266. actshield/static/index.html +3 -0
  267. actshield/static/index.txt +20 -0
  268. actshield/static/logo.png +0 -0
  269. actshield/static/metrics/__next._full.txt +22 -0
  270. actshield/static/metrics/__next._tree.txt +4 -0
  271. actshield/static/metrics/__next.metrics/__PAGE__.txt +27 -0
  272. actshield/static/metrics.html +1 -0
  273. actshield/static/metrics.txt +22 -0
  274. actshield/static/next.svg +1 -0
  275. actshield/static/offensive/__next._full.txt +22 -0
  276. actshield/static/offensive/__next._tree.txt +4 -0
  277. actshield/static/offensive/__next.offensive/__PAGE__.txt +27 -0
  278. actshield/static/offensive.html +1 -0
  279. actshield/static/offensive.txt +22 -0
  280. actshield/static/policies/__next._full.txt +22 -0
  281. actshield/static/policies/__next._tree.txt +4 -0
  282. actshield/static/policies/__next.policies/__PAGE__.txt +27 -0
  283. actshield/static/policies.html +1 -0
  284. actshield/static/policies.txt +22 -0
  285. actshield/static/posture/__next._full.txt +22 -0
  286. actshield/static/posture/__next._tree.txt +4 -0
  287. actshield/static/posture/__next.posture/__PAGE__.txt +27 -0
  288. actshield/static/posture.html +1 -0
  289. actshield/static/posture.txt +22 -0
  290. actshield/static/regressions/__next._full.txt +22 -0
  291. actshield/static/regressions/__next._tree.txt +4 -0
  292. actshield/static/regressions/__next.regressions/__PAGE__.txt +27 -0
  293. actshield/static/regressions.html +1 -0
  294. actshield/static/regressions.txt +22 -0
  295. actshield/static/reports/__next._full.txt +22 -0
  296. actshield/static/reports/__next._tree.txt +4 -0
  297. actshield/static/reports/__next.reports/__PAGE__.txt +27 -0
  298. actshield/static/reports.html +1 -0
  299. actshield/static/reports.txt +22 -0
  300. actshield/static/resources/__next._full.txt +22 -0
  301. actshield/static/resources/__next._tree.txt +4 -0
  302. actshield/static/resources/__next.resources/__PAGE__.txt +27 -0
  303. actshield/static/resources.html +1 -0
  304. actshield/static/resources.txt +22 -0
  305. actshield/static/security-gates/__next._full.txt +22 -0
  306. actshield/static/security-gates/__next._tree.txt +4 -0
  307. actshield/static/security-gates/__next.security-gates/__PAGE__.txt +27 -0
  308. actshield/static/security-gates.html +1 -0
  309. actshield/static/security-gates.txt +22 -0
  310. actshield/static/settings/__next._full.txt +22 -0
  311. actshield/static/settings/__next._tree.txt +4 -0
  312. actshield/static/settings/__next.settings/__PAGE__.txt +27 -0
  313. actshield/static/settings.html +1 -0
  314. actshield/static/settings.txt +22 -0
  315. actshield/static/tasks/__next._full.txt +22 -0
  316. actshield/static/tasks/__next._tree.txt +4 -0
  317. actshield/static/tasks/__next.tasks/__PAGE__.txt +27 -0
  318. actshield/static/tasks.html +1 -0
  319. actshield/static/tasks.txt +22 -0
  320. actshield/static/threats/__next._full.txt +22 -0
  321. actshield/static/threats/__next._tree.txt +4 -0
  322. actshield/static/threats/__next.threats/__PAGE__.txt +27 -0
  323. actshield/static/threats.html +1 -0
  324. actshield/static/threats.txt +22 -0
  325. actshield/static/tools/__next._full.txt +22 -0
  326. actshield/static/tools/__next._tree.txt +4 -0
  327. actshield/static/tools/__next.tools/__PAGE__.txt +27 -0
  328. actshield/static/tools.html +1 -0
  329. actshield/static/tools.txt +22 -0
  330. actshield/static/traces/__next._full.txt +22 -0
  331. actshield/static/traces/__next._tree.txt +4 -0
  332. actshield/static/traces/__next.traces/__PAGE__.txt +27 -0
  333. actshield/static/traces.html +1 -0
  334. actshield/static/traces.txt +22 -0
  335. actshield/static/vercel.svg +1 -0
  336. actshield/static/window.svg +1 -0
  337. actshield/tasks/__init__.py +6 -0
  338. actshield/tasks/task.py +143 -0
  339. actshield/threatmodel/__init__.py +70 -0
  340. actshield/threatmodel/actors.py +210 -0
  341. actshield/threatmodel/analyzer.py +131 -0
  342. actshield/threatmodel/assets.py +167 -0
  343. actshield/threatmodel/boundaries.py +165 -0
  344. actshield/threatmodel/exporters.py +49 -0
  345. actshield/threatmodel/mitigations.py +209 -0
  346. actshield/threatmodel/models.py +80 -0
  347. actshield/threatmodel/report.py +341 -0
  348. actshield/threatmodel/scenarios.py +212 -0
  349. actshield/threatmodel/scoring.py +66 -0
  350. actshield/threatmodel/threats.py +387 -0
  351. actshield/tools/__init__.py +20 -0
  352. actshield/tools/interceptor.py +256 -0
  353. actshield/tools/tool.py +71 -0
  354. actshield/tracing/__init__.py +38 -0
  355. actshield/tracing/correlation.py +173 -0
  356. actshield/tracing/events.py +75 -0
  357. actshield/tracing/tracer.py +305 -0
  358. actshield/watch.py +129 -0
  359. actshield-0.9.0.dist-info/METADATA +57 -0
  360. actshield-0.9.0.dist-info/RECORD +366 -0
  361. actshield-0.9.0.dist-info/WHEEL +5 -0
  362. actshield-0.9.0.dist-info/entry_points.txt +4 -0
  363. actshield-0.9.0.dist-info/top_level.txt +2 -0
  364. agentguard/__init__.py +39 -0
  365. agentguard/__main__.py +8 -0
  366. agentguard/py.typed +1 -0
@@ -0,0 +1,14 @@
1
+ """ActShield Response Orchestration Package (Phase 9)."""
2
+
3
+ from actshield.response.response_actions import ResponseActionRecord, ResponseActionType
4
+ from actshield.response.response_audit import AuthorityChangeEvent
5
+ from actshield.response.response_engine import ResponseEngine
6
+
7
+ __all__ = [
8
+ "ResponseActionRecord",
9
+ "ResponseActionType",
10
+ "AuthorityChangeEvent",
11
+ "ResponseEngine",
12
+ ]
13
+
14
+
@@ -0,0 +1,39 @@
1
+ """Response action models for ActShield Phase 9."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import Enum
6
+ from typing import Any, Dict, List, Optional
7
+ from pydantic import BaseModel, Field
8
+
9
+ from actshield.tracing.correlation import generate_id
10
+
11
+
12
+ class ResponseActionType(str, Enum):
13
+ """Supported containment and response actions (Safe-by-default)."""
14
+ BLOCK_ACTION = "BLOCK_ACTION"
15
+ REQUIRE_HITL = "REQUIRE_HITL"
16
+ QUARANTINE_CONTEXT = "QUARANTINE_CONTEXT"
17
+ REVOKE_DELEGATION = "REVOKE_DELEGATION"
18
+ RESTRICT_AGENT = "RESTRICT_AGENT"
19
+ TRIGGER_SNAPSHOT = "TRIGGER_SNAPSHOT"
20
+ CREATE_REGRESSION = "CREATE_REGRESSION"
21
+ TRIGGER_REPLAY = "TRIGGER_REPLAY"
22
+
23
+
24
+ class ResponseActionRecord(BaseModel):
25
+ """Record of an executed containment or response action."""
26
+ action_id: str = Field(default_factory=lambda: generate_id("act"))
27
+ action_type: ResponseActionType
28
+ target_entity: str = Field(..., description="Agent ID, context ID, or delegation ID")
29
+ reason: str
30
+ status: str = Field(default="EXECUTED")
31
+ details: Dict[str, Any] = Field(default_factory=dict)
32
+ executed_at: str
33
+
34
+ @property
35
+ def target_id(self) -> str:
36
+ return self.target_entity
37
+
38
+
39
+
@@ -0,0 +1,32 @@
1
+ """Auditable records of dynamic authority modifications and containment responses."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timezone
6
+ from typing import Any, Dict, List, Optional
7
+ from pydantic import BaseModel, Field
8
+
9
+ from actshield.tracing.correlation import generate_id
10
+
11
+
12
+ class AuthorityChangeEvent(BaseModel):
13
+ """Auditable delta of an agent's authority modification."""
14
+ change_id: str = Field(default_factory=lambda: generate_id("auth_chg"))
15
+ agent_id: str
16
+ trigger_reason: str
17
+ before_capabilities: List[str]
18
+ after_capabilities: List[str]
19
+ restricted_capabilities: List[str] = Field(default_factory=list)
20
+ timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
21
+ is_reversible: bool = True
22
+ metadata: Dict[str, Any] = Field(default_factory=dict)
23
+
24
+ @property
25
+ def revoked_capabilities(self) -> List[str]:
26
+ return self.restricted_capabilities
27
+
28
+ @property
29
+ def restored_capabilities(self) -> List[str]:
30
+ return self.after_capabilities
31
+
32
+
@@ -0,0 +1,139 @@
1
+ """Response orchestration engine and dynamic authority containment for ActShield Phase 9."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timezone
6
+ from typing import Any, Dict, List, Optional
7
+
8
+ from actshield.response.response_actions import ResponseActionRecord, ResponseActionType
9
+ from actshield.response.response_audit import AuthorityChangeEvent
10
+ from actshield.tracing.correlation import generate_id
11
+
12
+
13
+ class ResponseEngine:
14
+ """Orchestrates safe, non-destructive response actions and dynamic authority containment."""
15
+
16
+ def __init__(self, guard: Optional[Any] = None) -> None:
17
+ self.guard = guard
18
+ self.action_history: List[ResponseActionRecord] = []
19
+ self.authority_audit_log: List[AuthorityChangeEvent] = []
20
+ self.quarantined_contexts: set[str] = set()
21
+ self.restricted_agents: Dict[str, List[str]] = {} # agent_id -> list of restricted capabilities
22
+
23
+ def block_action(self, target: str, reason: str, details: Optional[Dict[str, Any]] = None) -> ResponseActionRecord:
24
+ """Enforce deterministic action block."""
25
+ rec = ResponseActionRecord(
26
+ action_type=ResponseActionType.BLOCK_ACTION,
27
+ target_entity=target,
28
+ reason=reason,
29
+ details=details or {},
30
+ executed_at=datetime.now(timezone.utc).isoformat(),
31
+ )
32
+ self.action_history.append(rec)
33
+ return rec
34
+
35
+ def quarantine_context(self, context_id: str, reason: str = "Tainted context quarantine", actor: str = "system") -> ResponseActionRecord:
36
+ """Isolate a tainted context object from flowing to downstream agents."""
37
+ self.quarantined_contexts.add(context_id)
38
+ rec = ResponseActionRecord(
39
+ action_type=ResponseActionType.QUARANTINE_CONTEXT,
40
+ target_entity=context_id,
41
+ reason=reason,
42
+ details={"status": "QUARANTINED", "actor": actor},
43
+ executed_at=datetime.now(timezone.utc).isoformat(),
44
+ )
45
+ self.action_history.append(rec)
46
+ return rec
47
+
48
+ def restrict_agent_authority(
49
+ self,
50
+ agent_id: str,
51
+ current_capabilities: List[str],
52
+ capabilities_to_restrict: List[str],
53
+ reason: str,
54
+ ) -> AuthorityChangeEvent:
55
+ """
56
+ Dynamically restrict specific capabilities for an agent after a security incident.
57
+ Creates an immutable, auditable before/after authority record.
58
+ """
59
+ after_caps = [c for c in current_capabilities if c not in capabilities_to_restrict]
60
+ self.restricted_agents[agent_id] = capabilities_to_restrict
61
+
62
+ audit_event = AuthorityChangeEvent(
63
+ agent_id=agent_id,
64
+ trigger_reason=reason,
65
+ before_capabilities=current_capabilities,
66
+ after_capabilities=after_caps,
67
+ restricted_capabilities=capabilities_to_restrict,
68
+ )
69
+ self.authority_audit_log.append(audit_event)
70
+
71
+ rec = ResponseActionRecord(
72
+ action_type=ResponseActionType.RESTRICT_AGENT,
73
+ target_entity=agent_id,
74
+ reason=reason,
75
+ details={
76
+ "before": current_capabilities,
77
+ "after": after_caps,
78
+ "restricted": capabilities_to_restrict,
79
+ },
80
+ executed_at=datetime.now(timezone.utc).isoformat(),
81
+ )
82
+ self.action_history.append(rec)
83
+ return audit_event
84
+
85
+ def restrict_authority(
86
+ self,
87
+ agent_id: str,
88
+ restricted_capabilities: List[str],
89
+ actor: str = "system",
90
+ reason: str = "Containment restriction",
91
+ previous_capabilities: Optional[List[str]] = None,
92
+ ) -> AuthorityChangeEvent:
93
+ """Convenience wrapper for restricting authority during incident response."""
94
+ prev = previous_capabilities if previous_capabilities is not None else restricted_capabilities
95
+ return self.restrict_agent_authority(
96
+ agent_id=agent_id,
97
+ current_capabilities=prev,
98
+ capabilities_to_restrict=restricted_capabilities,
99
+ reason=f"[{actor}] {reason}",
100
+ )
101
+
102
+ def restore_agent_authority(self, agent_id: str, restored_capabilities: List[str]) -> AuthorityChangeEvent:
103
+ """Revert temporary capability restrictions after remediation."""
104
+ current_restricted = self.restricted_agents.get(agent_id, [])
105
+ new_restricted = [c for c in current_restricted if c not in restored_capabilities]
106
+ self.restricted_agents[agent_id] = new_restricted
107
+
108
+ audit_event = AuthorityChangeEvent(
109
+ agent_id=agent_id,
110
+ trigger_reason="Remediation verified — authority restored",
111
+ before_capabilities=new_restricted,
112
+ after_capabilities=restored_capabilities,
113
+ restricted_capabilities=[],
114
+ )
115
+ self.authority_audit_log.append(audit_event)
116
+ return audit_event
117
+
118
+ def restore_authority(
119
+ self,
120
+ agent_id: str,
121
+ restored_capabilities: List[str],
122
+ actor: str = "system",
123
+ reason: str = "Authority restored",
124
+ current_capabilities: Optional[List[str]] = None,
125
+ ) -> AuthorityChangeEvent:
126
+ """Convenience wrapper for restoring authority after incident remediation."""
127
+ return self.restore_agent_authority(
128
+ agent_id=agent_id,
129
+ restored_capabilities=restored_capabilities,
130
+ )
131
+
132
+ def list_actions(self) -> List[ResponseActionRecord]:
133
+ return list(self.action_history)
134
+
135
+ def list_authority_changes(self) -> List[AuthorityChangeEvent]:
136
+ return list(self.authority_audit_log)
137
+
138
+
139
+
@@ -0,0 +1,104 @@
1
+ """Risk signals and explainable deterministic risk assessment models."""
2
+
3
+ from enum import Enum
4
+ from typing import Any, Dict, List, Optional
5
+ from pydantic import BaseModel, Field
6
+
7
+ from actshield.tracing.correlation import generate_id
8
+
9
+
10
+ class RiskLevel(str, Enum):
11
+ """Standardized risk severity levels."""
12
+ LOW = "LOW"
13
+ MEDIUM = "MEDIUM"
14
+ HIGH = "HIGH"
15
+ CRITICAL = "CRITICAL"
16
+
17
+
18
+ class RiskSignal(BaseModel):
19
+ """An individual risk indicator emitted by policy, taint tracker, APIRIS, or AI Secura."""
20
+ signal_id: str = Field(default_factory=lambda: generate_id("rsig"))
21
+ source: str = Field(..., description="Component emitting the signal (e.g., 'taint_tracker', 'apiris', 'ai_secura', 'policy')")
22
+ risk_level: RiskLevel = Field(default=RiskLevel.LOW)
23
+ score: float = Field(default=0.0, ge=0.0, le=1.0, description="Normalized risk score from 0.0 (safe) to 1.0 (dangerous)")
24
+ indicator: str = Field(..., description="Short identifier of the risk condition")
25
+ details: Dict[str, Any] = Field(default_factory=dict, description="Contextual details and evidence")
26
+
27
+
28
+ class RiskFactorBreakdown(BaseModel):
29
+ """Explainable deterministic factor breakdown contributing to total risk score."""
30
+ tainted_context_score: float = Field(default=0.0, description="Risk from active tainted/injected context (e.g. +0.25)")
31
+ critical_sink_score: float = Field(default=0.0, description="Risk from target tool/resource sensitivity level (e.g. +0.25)")
32
+ authority_violation_score: float = Field(default=0.0, description="Risk from delegation authority escalation (e.g. +0.25)")
33
+ intent_violation_score: float = Field(default=0.0, description="Risk from divergence from original user intent (e.g. +0.15)")
34
+ untrusted_origin_score: float = Field(default=0.0, description="Risk from external unverified origin (e.g. +0.10)")
35
+ total_score: float = Field(default=0.0, ge=0.0, le=1.0)
36
+ risk_factors: List[str] = Field(default_factory=list)
37
+
38
+ @classmethod
39
+ def compute(
40
+ cls,
41
+ has_tainted_context: bool,
42
+ is_critical_sink: bool,
43
+ has_authority_violation: bool,
44
+ has_intent_violation: bool,
45
+ is_untrusted_origin: bool,
46
+ ) -> "RiskFactorBreakdown":
47
+ factors: List[str] = []
48
+ taint_s = 0.25 if has_tainted_context else 0.0
49
+ if has_tainted_context:
50
+ factors.append("tainted_context")
51
+
52
+ crit_s = 0.25 if is_critical_sink else 0.0
53
+ if is_critical_sink:
54
+ factors.append("critical_resource_sink")
55
+
56
+ auth_s = 0.25 if has_authority_violation else 0.0
57
+ if has_authority_violation:
58
+ factors.append("authority_escalation_violation")
59
+
60
+ intent_s = 0.15 if has_intent_violation else 0.0
61
+ if has_intent_violation:
62
+ factors.append("user_intent_drift_violation")
63
+
64
+ untrusted_s = 0.10 if is_untrusted_origin else 0.0
65
+ if is_untrusted_origin:
66
+ factors.append("external_untrusted_source_origin")
67
+
68
+ total = min(1.0, taint_s + crit_s + auth_s + intent_s + untrusted_s)
69
+
70
+ return cls(
71
+ tainted_context_score=taint_s,
72
+ critical_sink_score=crit_s,
73
+ authority_violation_score=auth_s,
74
+ intent_violation_score=intent_s,
75
+ untrusted_origin_score=untrusted_s,
76
+ total_score=round(total, 2),
77
+ risk_factors=factors,
78
+ )
79
+
80
+
81
+ class RiskAssessment(BaseModel):
82
+ """Aggregated risk assessment for an action or tool invocation."""
83
+ overall_level: RiskLevel = Field(default=RiskLevel.LOW)
84
+ overall_score: float = Field(default=0.0, ge=0.0, le=1.0)
85
+ signals: List[RiskSignal] = Field(default_factory=list)
86
+ breakdown: Optional[RiskFactorBreakdown] = None
87
+
88
+ @classmethod
89
+ def from_signals(cls, signals: List[RiskSignal], breakdown: Optional[RiskFactorBreakdown] = None) -> "RiskAssessment":
90
+ if not signals and not breakdown:
91
+ return cls(overall_level=RiskLevel.LOW, overall_score=0.0, signals=[], breakdown=breakdown)
92
+
93
+ max_score = breakdown.total_score if breakdown else max((s.score for s in signals), default=0.0)
94
+ if max_score >= 0.7:
95
+ level = RiskLevel.CRITICAL
96
+ elif max_score >= 0.45:
97
+ level = RiskLevel.HIGH
98
+ elif max_score >= 0.2:
99
+ level = RiskLevel.MEDIUM
100
+ else:
101
+ level = RiskLevel.LOW
102
+
103
+ return cls(overall_level=level, overall_score=max_score, signals=signals, breakdown=breakdown)
104
+
actshield/serve.py ADDED
@@ -0,0 +1,117 @@
1
+ """
2
+ ActShield Dashboard & Control Plane Server Launcher
3
+ =====================================================
4
+ Starts the unified control plane service (FastAPI API + Embedded Dashboard).
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import os
9
+ import pathlib
10
+ import sys
11
+ import time
12
+ import urllib.request
13
+ import webbrowser
14
+ from typing import Optional
15
+
16
+ from rich.console import Console
17
+ from rich.panel import Panel
18
+ from rich.table import Table
19
+
20
+
21
+ def is_port_open(port: int, host: str = "127.0.0.1", timeout: float = 0.5) -> bool:
22
+ """Check if HTTP service is responding on port."""
23
+ try:
24
+ url = f"http://{host}:{port}/api/v1/health"
25
+ req = urllib.request.Request(url, headers={"User-Agent": "AgentGuardHealth"})
26
+ with urllib.request.urlopen(req, timeout=timeout):
27
+ return True
28
+ except Exception:
29
+ return False
30
+
31
+
32
+ def serve_dashboard(
33
+ port: int = 8000,
34
+ api_port: Optional[int] = None,
35
+ open_browser: bool = True,
36
+ host: str = "127.0.0.1",
37
+ dev_mode: bool = False,
38
+ ) -> None:
39
+ """
40
+ Start the unified ActShield Control Plane server.
41
+ Serves:
42
+ - / → Embedded Dashboard UI
43
+ - /api/v1/* → FastAPI Backend API
44
+ - /docs → OpenAPI Swagger UI
45
+ - /redoc → ReDoc UI
46
+ """
47
+ console = Console()
48
+ repo_root = pathlib.Path(__file__).resolve().parents[2]
49
+ dashboard_dir = repo_root / "dashboard"
50
+ target_port = api_port or port
51
+
52
+ console.print(
53
+ Panel.fit(
54
+ f"[bold cyan]🛡️ ActShield / AgentGuard CONTROL PLANE[/bold cyan]\n"
55
+ f"[dim]Serving unified dashboard and API on [bold]http://{host}:{target_port}[/bold][/dim]",
56
+ border_style="cyan",
57
+ )
58
+ )
59
+
60
+ if dev_mode and dashboard_dir.exists():
61
+ import subprocess
62
+ console.print("[yellow]→ Dev Mode: Starting separate backend and Next.js dev server...[/yellow]")
63
+ api_env = os.environ.copy()
64
+ api_env["PYTHONPATH"] = str(repo_root / "sdk")
65
+ api_proc = subprocess.Popen(
66
+ [sys.executable, "-m", "uvicorn", "actshield.api.server:app", "--host", host, "--port", str(target_port), "--reload"],
67
+ env=api_env,
68
+ cwd=str(repo_root),
69
+ )
70
+ npm_cmd = "npm.cmd" if os.name == "nt" else "npm"
71
+ dash_proc = subprocess.Popen(
72
+ [npm_cmd, "run", "dev", "--", "-p", "3000"],
73
+ cwd=str(dashboard_dir),
74
+ shell=(os.name == "nt"),
75
+ )
76
+ try:
77
+ time.sleep(2)
78
+ if open_browser:
79
+ webbrowser.open("http://localhost:3000")
80
+ while True:
81
+ time.sleep(1)
82
+ if api_proc.poll() is not None or dash_proc.poll() is not None:
83
+ break
84
+ except KeyboardInterrupt:
85
+ pass
86
+ finally:
87
+ api_proc.terminate()
88
+ dash_proc.terminate()
89
+ return
90
+
91
+ # Production Embedded Server Mode (Zero Node.js/npm required)
92
+ table = Table(title="[bold green]✓ ActShield Control Plane Active[/bold green]", expand=False)
93
+ table.add_column("Component", style="bold cyan")
94
+ table.add_column("Endpoint URL", style="bright_white")
95
+ table.add_column("Status", style="bold green")
96
+
97
+ table.add_row("Dashboard UI", f"http://{host}:{target_port}/", "ONLINE")
98
+ table.add_row("API Overview", f"http://{host}:{target_port}/api/v1/overview", "ONLINE")
99
+ table.add_row("Swagger Docs", f"http://{host}:{target_port}/docs", "ONLINE")
100
+ table.add_row("ReDoc", f"http://{host}:{target_port}/redoc", "ONLINE")
101
+
102
+ console.print(table)
103
+ console.print(f"\n[dim]Running on http://{host}:{target_port}. Press [bold red]Ctrl+C[/bold red] to stop.[/dim]\n")
104
+
105
+ if open_browser:
106
+ try:
107
+ webbrowser.open(f"http://{host}:{target_port}")
108
+ except Exception:
109
+ pass
110
+
111
+ import uvicorn
112
+ from actshield.api.server import app
113
+
114
+ uvicorn.run(app, host=host, port=target_port, log_level="warning")
115
+
116
+
117
+
@@ -0,0 +1 @@
1
+ <!DOCTYPE html><html lang="en" class="inter_6750fec-module__y2_5qG__variable h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/35mvsv251jx1r.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/310vm2bl3xxpt.js"/><script src="/_next/static/chunks/19mx3mg6lkumu.js" async=""></script><script src="/_next/static/chunks/27t_qfc-3_lzs.js" async=""></script><script src="/_next/static/chunks/1h43jcb90-m2r.js" async=""></script><script src="/_next/static/chunks/turbopack-23wzuebcy_lxm.js" async=""></script><script src="/_next/static/chunks/3fntmmi971322.js" async=""></script><link rel="preload" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&amp;display=swap" as="style"/><meta name="robots" content="noindex"/><title>ActShield — Security Control Plane for Autonomous AI</title><meta name="description" content="ActShield provides identity, authority containment, context provenance, deterministic policy enforcement, threat modeling, and forensic investigation for autonomous and multi-agent AI systems."/><meta name="keywords" content="AI security,agent security,multi-agent security,MCP security,policy enforcement,LLM security,threat modeling,agentic AI"/><meta name="robots" content="noindex, nofollow"/><link rel="icon" href="/favicon.ico?favicon.2vob68tjqpejf.ico" sizes="256x256" type="image/x-icon"/><meta name="next-size-adjust" content=""/><link rel="preconnect" href="https://fonts.googleapis.com"/><title>404: This page could not be found.</title><link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&amp;display=swap" rel="stylesheet"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="min-h-full antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/310vm2bl3xxpt.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/3fntmmi971322.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/3fntmmi971322.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/3fntmmi971322.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/3fntmmi971322.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/3fntmmi971322.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/3fntmmi971322.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/35mvsv251jx1r.css\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500\u0026display=swap\",\"style\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/35mvsv251jx1r.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3fntmmi971322.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"inter_6750fec-module__y2_5qG__variable h-full\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.googleapis.com\"}],[\"$\",\"link\",null,{\"href\":\"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500\u0026display=swap\",\"rel\":\"stylesheet\"}]]}],[\"$\",\"body\",null,{\"className\":\"min-h-full antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/35mvsv251jx1r.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"Yp_swxN-C9UoCRNOwkYnY\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nd:I[27201,[\"/_next/static/chunks/3fntmmi971322.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"ActShield — Security Control Plane for Autonomous AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"ActShield provides identity, authority containment, context provenance, deterministic policy enforcement, threat modeling, and forensic investigation for autonomous and multi-agent AI systems.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"keywords\",\"content\":\"AI security,agent security,multi-agent security,MCP security,policy enforcement,LLM security,threat modeling,agentic AI\"}],[\"$\",\"meta\",\"3\",{\"name\":\"robots\",\"content\":\"noindex, nofollow\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.2vob68tjqpejf.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Ld\",\"5\",{}]]\n"])</script></body></html>
@@ -0,0 +1,24 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[47257,["/_next/static/chunks/3fntmmi971322.js"],"ClientPageRoot"]
3
+ 3:I[52683,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/28bkmy8mez7gm.js"],"default"]
4
+ 6:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"OutletBoundary"]
5
+ 7:"$Sreact.suspense"
6
+ b:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"ViewportBoundary"]
7
+ c:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"MetadataBoundary"]
8
+ d:I[27201,["/_next/static/chunks/3fntmmi971322.js"],"IconMark"]
9
+ f:I[39756,["/_next/static/chunks/3fntmmi971322.js"],"default"]
10
+ 10:I[37457,["/_next/static/chunks/3fntmmi971322.js"],"default"]
11
+ :HL["/_next/static/chunks/35mvsv251jx1r.css","style"]
12
+ :HL["https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap","style"]
13
+ a:X
14
+ 0:{"buildId":"Yp_swxN-C9UoCRNOwkYnY","data":[{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/28bkmy8mez7gm.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":"$@9","staleTime":"$a","varyParams":null},{"rsc":["$","$1","h",{"children":[null,["$","$Lb",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$Lc",null,{"children":["$","$7",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"ActShield — Security Control Plane for Autonomous AI"}],["$","meta","1",{"name":"description","content":"ActShield provides identity, authority containment, context provenance, deterministic policy enforcement, threat modeling, and forensic investigation for autonomous and multi-agent AI systems."}],["$","meta","2",{"name":"keywords","content":"AI security,agent security,multi-agent security,MCP security,policy enforcement,LLM security,threat modeling,agentic AI"}],["$","meta","3",{"name":"robots","content":"noindex, nofollow"}],["$","link","4",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$Ld","5",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":"$@e","staleTime":"$a","varyParams":null},{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/35mvsv251jx1r.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/3fntmmi971322.js","async":true}]],["$","html",null,{"lang":"en","className":"inter_6750fec-module__y2_5qG__variable h-full","children":[["$","head",null,{"children":[["$","link",null,{"rel":"preconnect","href":"https://fonts.googleapis.com"}],["$","link",null,{"href":"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap","rel":"stylesheet"}]]}],["$","body",null,{"className":"min-h-full antialiased","children":["$","$Lf",null,{"parallelRouterKey":"children","template":["$","$L10",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]]}]]}],"isPartial":"$@11","staleTime":"$a","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@12","rootVaryParams":null,"needsRuntimeRequest":"$@13"}
15
+ 4:{}
16
+ 5:"$0:data:0:rsc:props:children:0:props:serverProvidedParams:params"
17
+ 8:null
18
+ a:300
19
+ 13:true
20
+ a:C
21
+ 12:0
22
+ e:"$undefined"
23
+ 11:"$undefined"
24
+ 9:"$undefined"
@@ -0,0 +1,20 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[39756,["/_next/static/chunks/3fntmmi971322.js"],"default"]
3
+ 3:I[37457,["/_next/static/chunks/3fntmmi971322.js"],"default"]
4
+ 4:I[47257,["/_next/static/chunks/3fntmmi971322.js"],"ClientPageRoot"]
5
+ 5:I[52683,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/28bkmy8mez7gm.js"],"default"]
6
+ 8:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"OutletBoundary"]
7
+ 9:"$Sreact.suspense"
8
+ b:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"ViewportBoundary"]
9
+ d:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"MetadataBoundary"]
10
+ f:I[68027,["/_next/static/chunks/3fntmmi971322.js"],"default",1]
11
+ :HL["/_next/static/chunks/35mvsv251jx1r.css","style"]
12
+ :HL["/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
13
+ :HL["https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap","style"]
14
+ 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/35mvsv251jx1r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/3fntmmi971322.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"inter_6750fec-module__y2_5qG__variable h-full","children":[["$","head",null,{"children":[["$","link",null,{"rel":"preconnect","href":"https://fonts.googleapis.com"}],["$","link",null,{"href":"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap","rel":"stylesheet"}]]}],["$","body",null,{"className":"min-h-full antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":[["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/28bkmy8mez7gm.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/35mvsv251jx1r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"Yp_swxN-C9UoCRNOwkYnY"}
15
+ 6:{}
16
+ 7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
17
+ c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
18
+ 10:I[27201,["/_next/static/chunks/3fntmmi971322.js"],"IconMark"]
19
+ a:null
20
+ e:[["$","title","0",{"children":"ActShield — Security Control Plane for Autonomous AI"}],["$","meta","1",{"name":"description","content":"ActShield provides identity, authority containment, context provenance, deterministic policy enforcement, threat modeling, and forensic investigation for autonomous and multi-agent AI systems."}],["$","meta","2",{"name":"keywords","content":"AI security,agent security,multi-agent security,MCP security,policy enforcement,LLM security,threat modeling,agentic AI"}],["$","meta","3",{"name":"robots","content":"noindex, nofollow"}],["$","link","4",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L10","5",{}]]
@@ -0,0 +1,4 @@
1
+ :HL["/_next/static/chunks/35mvsv251jx1r.css","style"]
2
+ :HL["/_next/static/media/83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3
+ :HL["https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap","style"]
4
+ 0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}},"staleTime":300,"buildId":"Yp_swxN-C9UoCRNOwkYnY"}
@@ -0,0 +1,11 @@
1
+ self.__BUILD_MANIFEST = {
2
+ "__rewrites": {
3
+ "afterFiles": [],
4
+ "beforeFiles": [],
5
+ "fallback": []
6
+ },
7
+ "sortedPages": [
8
+ "/_app",
9
+ "/_error"
10
+ ]
11
+ };self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,63676,e=>{"use strict";var t=e.i(56420);let s={name:"x",size:24,node:[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]};s.node;let a=(0,t.default)(s);e.s(["X",0,a],63676)},96500,e=>{"use strict";var t=e.i(43476),s=e.i(71645),a=e.i(56420);let l={name:"git-branch",size:24,node:[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]]};l.node;let r=(0,a.default)(l);var n=e.i(37757),i=e.i(68442),d=e.i(72854),o=e.i(32471),c=e.i(49744),x=e.i(3469);let m=[{trace_id:"trc_pinj_001",name:"Prompt Injection → Data Exfil Attempt",agent_id:"orchestrator_v2",task_id:"task_002",started_at:"2026-09-19T09:11:00Z",duration_ms:847,decision:"BLOCK",spans:[{span_id:"sp_001",name:"receive_user_message",duration_ms:12,taint:"LOW",decision:"ALLOW"},{span_id:"sp_002",name:"call_external_mcp_tool",duration_ms:234,taint:"CRITICAL",decision:"BLOCK",flags:["PROMPT_INJECTION"]},{span_id:"sp_003",name:"attempt_upload_s3",duration_ms:0,taint:"CRITICAL",decision:"BLOCK",flags:["BLOCKED_BY_POLICY"]}],causal_explanation:"External MCP tool injected malicious instruction. Orchestrator attempted to upload PII to external S3. Both tool call and upload were deterministically blocked."},{trace_id:"trc_auth_esc_001",name:"Authority Escalation Attempt",agent_id:"escalation_agent",task_id:"task_004",started_at:"2026-09-19T10:30:00Z",duration_ms:312,decision:"BLOCK",spans:[{span_id:"sp_011",name:"receive_task",duration_ms:8,taint:"LOW",decision:"ALLOW"},{span_id:"sp_012",name:"delegation_check",duration_ms:45,taint:"LOW",decision:"BLOCK",flags:["AUTHORITY_EXCEEDED"]},{span_id:"sp_013",name:"attempt_send_email",duration_ms:0,taint:"HIGH",decision:"BLOCK",flags:["BLOCKED_BY_POLICY"]}],causal_explanation:"Agent requested email_api and export_pii capabilities beyond its delegated authority. Delegation containment check failed."},{trace_id:"trc_q3_analysis",name:"Q3 Financial Analysis (Clean)",agent_id:"orchestrator_v2",task_id:"task_001",started_at:"2026-09-19T08:00:00Z",duration_ms:3320,decision:"ALLOW",spans:[{span_id:"sp_021",name:"read_file:q3_financials",duration_ms:45,taint:"LOW",decision:"ALLOW"},{span_id:"sp_022",name:"delegate_to:analyst_agent",duration_ms:12,taint:"LOW",decision:"ALLOW"},{span_id:"sp_023",name:"generate_summary",duration_ms:2800,taint:"LOW",decision:"ALLOW"},{span_id:"sp_024",name:"write_report",duration_ms:120,taint:"LOW",decision:"ALLOW"}],causal_explanation:"Clean task execution within delegated authority. All tools permitted. No taint propagation."}];e.s(["default",0,function(){let[e,a]=(0,s.useState)(""),[l,p]=(0,s.useState)("ALL"),[u,b]=(0,s.useState)(null),h=m.filter(e=>"BLOCK"===e.decision).length,g=m.filter(e=>"ALLOW"===e.decision).length,f=m.filter(t=>{let s=t.name.toLowerCase().includes(e.toLowerCase())||t.agent_id.toLowerCase().includes(e.toLowerCase())||t.trace_id.toLowerCase().includes(e.toLowerCase())||t.task_id.toLowerCase().includes(e.toLowerCase()),a="ALL"===l||t.decision===l;return s&&a}),j=[{key:"name",header:"Trace Name & ID",render:e=>(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("div",{className:"w-7 h-7 rounded bg-slate-100 flex items-center justify-center text-slate-600 border border-slate-200",children:(0,t.jsx)(r,{size:13})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-semibold text-xs text-slate-900",children:e.name}),(0,t.jsx)("div",{className:"font-mono text-[10px] text-slate-500",children:e.trace_id})]})]})},{key:"agent_id",header:"Acting Agent",width:"160px",render:e=>(0,t.jsx)("span",{className:"font-mono text-xs text-blue-700 bg-blue-50 px-2 py-0.5 rounded border border-blue-200",children:e.agent_id})},{key:"spans",header:"Spans Timeline",render:e=>(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[e.spans.map(e=>(0,t.jsx)("div",{title:`${e.name} (${e.decision})`,className:`h-2 rounded-xs transition-all ${"BLOCK"===e.decision?"bg-red-500 w-6":"HITL"===e.decision?"bg-amber-500 w-6":"bg-emerald-500 w-4"}`},e.span_id)),(0,t.jsxs)("span",{className:"font-mono text-[10px] text-slate-500 ml-1.5",children:[e.spans.length," spans"]})]})},{key:"duration_ms",header:"Duration",width:"110px",render:e=>(0,t.jsxs)("span",{className:"font-mono text-xs text-slate-600",children:[e.duration_ms," ms"]})},{key:"decision",header:"Verdict",width:"120px",render:e=>(0,t.jsx)(d.StatusBadge,{status:e.decision})}];return(0,t.jsxs)("div",{className:"p-8 space-y-6 max-w-7xl mx-auto",children:[(0,t.jsx)(n.PageHeader,{title:"Execution Traces",subtitle:"End-to-end causal execution traces with span-level decision evidence and taint timelines",badge:"Trace Explorer"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[(0,t.jsx)(i.MetricCard,{label:"Total Traces",value:m.length}),(0,t.jsx)(i.MetricCard,{label:"Blocked Invocations",value:h,status:"BLOCK"}),(0,t.jsx)(i.MetricCard,{label:"Clean Executions",value:g,status:"ALLOW"}),(0,t.jsx)(i.MetricCard,{label:"Mean Latency",value:"1.42 ms"})]}),(0,t.jsxs)("div",{className:"bg-white border border-slate-200 rounded-lg p-5 shadow-xs space-y-4",children:[(0,t.jsx)(o.FilterBar,{searchQuery:e,onSearchChange:a,searchPlaceholder:"Search traces by name, ID, or agent...",filters:[{key:"decision",label:"Verdict",options:[{label:"All Verdicts",value:"ALL"},{label:"Block",value:"BLOCK"},{label:"Allow",value:"ALLOW"},{label:"HITL",value:"HITL"}],value:l,onChange:p}],activeCount:"ALL"!==l||e?1:0,onReset:()=>{a(""),p("ALL")}}),(0,t.jsx)(c.DataTable,{columns:j,data:f,keyField:"trace_id",onRowClick:e=>b(e),emptyMessage:"No traces matched your filter criteria."})]}),(0,t.jsx)(x.DetailDrawer,{isOpen:!!u,onClose:()=>b(null),title:u?u.name:"",subtitle:u?`Trace ID: ${u.trace_id} • Agent: ${u.agent_id}`:"",badge:u?(0,t.jsx)(d.StatusBadge,{status:u.decision}):null,children:u&&(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"p-3.5 bg-slate-50 border border-slate-200 rounded-lg space-y-1.5",children:[(0,t.jsx)("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-slate-500",children:"Causal Explanation"}),(0,t.jsx)("p",{className:"text-xs text-slate-800 leading-relaxed",children:u.causal_explanation})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-slate-500 mb-2",children:"Execution Spans Sequence"}),(0,t.jsx)("div",{className:"space-y-2",children:u.spans.map((e,s)=>(0,t.jsxs)("div",{className:"p-3 bg-white border border-slate-200 rounded-lg flex items-center justify-between text-xs",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsxs)("span",{className:"font-mono text-[10px] text-slate-400",children:["#",s+1]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-mono font-semibold text-slate-900",children:e.name}),(0,t.jsxs)("div",{className:"text-[10px] text-slate-500 font-mono",children:[e.duration_ms," ms • Taint: ",e.taint]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[e.flags?.map(e=>(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-red-50 text-red-700 border border-red-200 font-mono",children:e},e)),(0,t.jsx)(d.StatusBadge,{status:e.decision})]})]},e.span_id))})]})]})})]})}],96500)},49744,e=>{"use strict";var t=e.i(43476),s=e.i(71645),a=e.i(56420);let l={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};l.node;let r=(0,a.default)(l);var n=e.i(67927);let i={name:"inbox",size:24,node:[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]};i.node;let d=(0,a.default)(i);e.s(["DataTable",0,function({columns:e,data:a,keyExtractor:l,keyField:i,onRowClick:o,selectedKey:c,emptyMessage:x="No records found",emptySubtext:m="Try adjusting your filters or search query.",pageSize:p=15,isLoading:u=!1}){let[b,h]=s.default.useState(1),g=Math.max(1,Math.ceil(a.length/p)),f=a.slice((b-1)*p,b*p);return s.default.useEffect(()=>{h(1)},[a.length]),(0,t.jsxs)("div",{className:"bg-white border border-slate-200 rounded-lg shadow-sm overflow-hidden flex flex-col",children:[(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"w-full text-left border-collapse text-xs",children:[(0,t.jsx)("thead",{children:(0,t.jsx)("tr",{className:"bg-slate-50 border-b border-slate-200",children:e.map(e=>(0,t.jsx)("th",{style:{width:e.width},className:`px-3.5 py-2.5 font-semibold text-slate-600 uppercase tracking-wider text-[10px] ${"right"===e.align?"text-right":"center"===e.align?"text-center":"text-left"}`,children:e.header},e.key))})}),(0,t.jsx)("tbody",{className:"divide-y divide-slate-100",children:u?(0,t.jsx)("tr",{children:(0,t.jsxs)("td",{colSpan:e.length,className:"py-12 text-center text-slate-400",children:[(0,t.jsx)("div",{className:"inline-block animate-spin rounded-full h-5 w-5 border-2 border-slate-300 border-t-sky-600 mb-2"}),(0,t.jsx)("div",{className:"text-xs",children:"Loading telemetry records…"})]})}):0===f.length?(0,t.jsx)("tr",{children:(0,t.jsxs)("td",{colSpan:e.length,className:"py-12 text-center",children:[(0,t.jsx)(d,{size:28,className:"mx-auto text-slate-300 mb-2"}),(0,t.jsx)("div",{className:"text-sm font-semibold text-slate-700",children:x}),(0,t.jsx)("div",{className:"text-xs text-slate-400 mt-0.5",children:m})]})}):f.map((s,a)=>{let r=l?l(s,a):i&&s[i]?String(s[i]):String(s.id||s.key||a),n=c===r;return(0,t.jsx)("tr",{onClick:()=>o&&o(s),className:`transition-colors ${n?"bg-sky-50/80 font-medium":"hover:bg-slate-50/80"} ${o?"cursor-pointer":""}`,children:e.map(e=>{let l=s[e.key],r=e.render?e.render(s,a):l;return(0,t.jsx)("td",{className:`px-3.5 py-2.5 text-slate-700 ${e.mono?"font-mono text-[11px]":""} ${"right"===e.align?"text-right":"center"===e.align?"text-center":"text-left"}`,children:r},e.key)})},r)})})]})}),a.length>p&&(0,t.jsxs)("div",{className:"px-4 py-2.5 border-t border-slate-200 bg-slate-50 flex items-center justify-between text-xs text-slate-500",children:[(0,t.jsxs)("div",{children:["Showing ",(0,t.jsx)("span",{className:"font-medium text-slate-800",children:(b-1)*p+1})," to"," ",(0,t.jsx)("span",{className:"font-medium text-slate-800",children:Math.min(b*p,a.length)})," ","of ",(0,t.jsx)("span",{className:"font-medium text-slate-800",children:a.length})," records"]}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("button",{onClick:()=>h(e=>Math.max(1,e-1)),disabled:1===b,className:"p-1 rounded border border-slate-200 bg-white text-slate-600 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-slate-50 transition-colors",children:(0,t.jsx)(r,{size:14})}),(0,t.jsxs)("span",{className:"px-2 font-mono text-[11px]",children:[b," / ",g]}),(0,t.jsx)("button",{onClick:()=>h(e=>Math.min(g,e+1)),disabled:b===g,className:"p-1 rounded border border-slate-200 bg-white text-slate-600 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-slate-50 transition-colors",children:(0,t.jsx)(n.ChevronRight,{size:14})})]})]})]})}],49744)},3469,e=>{"use strict";var t=e.i(43476),s=e.i(63676);e.s(["DetailDrawer",0,function({isOpen:e,onClose:a,title:l,subtitle:r,badge:n,children:i,footer:d,width:o="w-full md:w-[480px]"}){return e?(0,t.jsxs)("div",{className:"fixed inset-y-0 right-0 z-50 flex",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-slate-900/20 backdrop-blur-[1px] transition-opacity",onClick:a}),(0,t.jsxs)("div",{className:`relative ${o} bg-white shadow-2xl border-l border-slate-200 flex flex-col h-full z-10 transition-transform`,children:[(0,t.jsxs)("div",{className:"px-5 py-4 border-b border-slate-200 flex items-start justify-between gap-3 bg-slate-50/50",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-base font-semibold text-slate-900 truncate",children:l}),n]}),r&&(0,t.jsx)("p",{className:"text-xs text-slate-500 font-mono mt-0.5 truncate",children:r})]}),(0,t.jsx)("button",{onClick:a,className:"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-100 transition-colors",children:(0,t.jsx)(s.X,{size:18})})]}),(0,t.jsx)("div",{className:"flex-1 overflow-y-auto p-5 space-y-5 text-sm text-slate-700",children:i}),d&&(0,t.jsx)("div",{className:"px-5 py-3 border-t border-slate-200 bg-slate-50 flex items-center justify-end gap-2",children:d})]})]}):null}])},32471,e=>{"use strict";var t=e.i(43476),s=e.i(66595),a=e.i(95925);e.s(["FilterBar",0,function({searchQuery:e,onSearchChange:l,searchPlaceholder:r="Search records…",dropdowns:n,filters:i,onReset:d,activeCount:o,totalCount:c,actions:x}){let m=i||n;return(0,t.jsxs)("div",{className:"bg-white border border-slate-200 rounded-lg p-3 mb-4 shadow-sm flex flex-col md:flex-row md:items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2.5 flex-1",children:[l&&(0,t.jsxs)("div",{className:"relative flex-1 min-w-[200px] max-w-sm",children:[(0,t.jsx)(s.Search,{size:14,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400"}),(0,t.jsx)("input",{type:"text",value:e??"",onChange:e=>l(e.target.value),placeholder:r,className:"w-full pl-8 pr-3 py-1.5 text-xs bg-slate-50 border border-slate-200 rounded-md text-slate-800 placeholder:text-slate-400 focus:bg-white focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500 transition-all"})]}),m&&m.map(e=>(0,t.jsx)("div",{className:"flex items-center gap-1.5",children:(0,t.jsx)("select",{value:e.value,onChange:t=>e.onChange(t.target.value),className:"text-xs bg-slate-50 border border-slate-200 rounded-md px-2.5 py-1.5 text-slate-700 font-medium focus:bg-white focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500 transition-all cursor-pointer",children:e.options.map(e=>(0,t.jsx)("option",{value:e.value,children:e.label},e.value))})},e.key||e.name||e.label)),d&&(0,t.jsxs)("button",{onClick:d,className:"flex items-center gap-1 text-xs text-slate-500 hover:text-slate-800 px-2 py-1.5 rounded hover:bg-slate-100 transition-colors",title:"Reset Filters",children:[(0,t.jsx)(a.RotateCcw,{size:12}),(0,t.jsx)("span",{children:"Reset"})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 self-end md:self-auto text-xs text-slate-500",children:[void 0!==c&&(0,t.jsx)("span",{className:"font-mono text-slate-600",children:void 0!==o&&o!==c?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("strong",{className:"text-slate-900",children:o})," of ",c]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("strong",{className:"text-slate-900",children:c})," total"]})}),x]})]})}])},68442,e=>{"use strict";var t=e.i(43476);e.s(["MetricCard",0,function({label:e,value:s,subtext:a,trend:l,status:r="neutral",icon:n,badge:i}){return(0,t.jsxs)("div",{className:`bg-white rounded-lg border border-slate-200 p-4 shadow-sm ${{healthy:"border-l-4 border-l-emerald-500",warning:"border-l-4 border-l-amber-500",critical:"border-l-4 border-l-red-500",neutral:"border-l-4 border-l-slate-300"}["ALLOW"===r||"MONITOR"===r||"healthy"===r?"healthy":"HITL"===r||"warning"===r?"warning":"BLOCK"===r||"critical"===r?"critical":"neutral"]} flex flex-col justify-between`,children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 mb-2",children:[(0,t.jsx)("span",{className:"text-[11px] font-medium tracking-wider uppercase text-slate-500",children:e}),n&&(0,t.jsx)(n,{size:16,className:"text-slate-400"}),i&&(0,t.jsx)("span",{className:"text-[10px] font-semibold px-1.5 py-0.5 rounded bg-slate-100 text-slate-700",children:i})]}),(0,t.jsxs)("div",{className:"flex items-baseline justify-between gap-2 mt-1",children:[(0,t.jsx)("div",{className:"text-2xl font-bold tracking-tight text-slate-900 font-mono",children:s}),l&&(0,t.jsx)("span",{className:`text-xs font-medium ${l.isNeutral?"text-slate-500":l.isPositive?"text-emerald-700":"text-red-700"}`,children:l.value})]}),a&&(0,t.jsx)("div",{className:"mt-2 text-xs text-slate-500 truncate",children:a})]})}])},37757,e=>{"use strict";var t=e.i(43476),s=e.i(71645),a=e.i(22016),l=e.i(67927);e.s(["PageHeader",0,function({title:e,description:r,subtitle:n,breadcrumbs:i,actions:d,badge:o}){let c=r||n;return(0,t.jsxs)("div",{className:"mb-6 pb-4 border-b border-slate-200",children:[i&&i.length>0&&(0,t.jsx)("nav",{className:"flex items-center gap-1.5 text-xs text-slate-500 mb-2",children:i.map((e,r)=>{let n=r===i.length-1;return(0,t.jsxs)(s.default.Fragment,{children:[r>0&&(0,t.jsx)(l.ChevronRight,{size:12,className:"text-slate-400"}),e.href&&!n?(0,t.jsx)(a.default,{href:e.href,className:"hover:text-slate-800 transition-colors",children:e.label}):(0,t.jsx)("span",{className:n?"text-slate-900 font-medium":"",children:e.label})]},r)})}),(0,t.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold text-slate-900 tracking-tight",children:e}),o&&(0,t.jsx)("div",{children:o})]}),c&&(0,t.jsx)("p",{className:"mt-1 text-xs text-slate-500 max-w-3xl leading-relaxed",children:c})]}),d&&(0,t.jsx)("div",{className:"flex items-center gap-2 flex-shrink-0",children:d})]})]})}])},72854,e=>{"use strict";var t=e.i(43476);function s({decision:e,status:a}){let l=(e||a||"").toUpperCase();return"BLOCK"===l||"DENY"===l||"BLOCKED"===l?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-red-50 text-red-700 border border-red-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-red-600"}),"BLOCK"]}):"ALLOW"===l||"ALLOWED"===l?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-600"}),"ALLOW"]}):"HITL"===l||"APPROVAL_REQUIRED"===l?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-amber-50 text-amber-700 border border-amber-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-600"}),"HITL"]}):"MONITOR"===l||"AUDIT"===l?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-blue-50 text-blue-700 border border-blue-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-blue-600"}),"MONITOR"]}):(0,t.jsx)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-slate-100 text-slate-700 border border-slate-200",children:e||a||"UNKNOWN"})}e.s(["DecisionBadge",0,s,"SeverityBadge",0,function({severity:e}){let s=(e||"").toUpperCase();return"CRITICAL"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-red-50 text-red-700 border border-red-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-red-600"}),"CRITICAL"]}):"HIGH"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-orange-50 text-orange-700 border border-orange-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-orange-600"}),"HIGH"]}):"MEDIUM"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-amber-50 text-amber-700 border border-amber-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-600"}),"MEDIUM"]}):"LOW"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-blue-50 text-blue-700 border border-blue-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-blue-600"}),"LOW"]}):(0,t.jsx)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-slate-100 text-slate-600 border border-slate-200",children:e||"INFO"})},"StatusBadge",0,s,"TaintBadge",0,function({taint:e}){let s=(e||"").toUpperCase();return"TAINTED"===s||"CRITICAL"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-semibold bg-red-50 text-red-700 border border-red-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-red-600"}),"TAINTED"]}):"CLEAN"===s||"TRUSTED"===s||"NONE"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-emerald-50 text-emerald-700 border border-emerald-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500"}),"CLEAN"]}):(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-amber-50 text-amber-700 border border-amber-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-500"}),e||"UNASSESSED"]})},"TrustBadge",0,function({trust:e}){let s=(e||"").toUpperCase();return"HIGH"===s||"TRUSTED"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-emerald-50 text-emerald-700 border border-emerald-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500"}),e]}):"MEDIUM"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-blue-50 text-blue-700 border border-blue-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-blue-500"}),"MEDIUM"]}):"LOW"===s||"UNTRUSTED"===s?(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-red-50 text-red-700 border border-red-200",children:[(0,t.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-red-500"}),e]}):(0,t.jsx)("span",{className:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded text-[11px] font-medium bg-slate-100 text-slate-700 border border-slate-200",children:e||"UNKNOWN"})}])}]);