actenon-kernel 0.1.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 (269) hide show
  1. actenon/__init__.py +11 -0
  2. actenon/adapters/__init__.py +20 -0
  3. actenon/adapters/_authorization.py +30 -0
  4. actenon/adapters/base.py +104 -0
  5. actenon/adapters/edge.py +129 -0
  6. actenon/adapters/fastapi.py +161 -0
  7. actenon/adapters/langchain.py +111 -0
  8. actenon/adapters/mcp.py +118 -0
  9. actenon/anchors/__init__.py +29 -0
  10. actenon/anchors/local_log.py +224 -0
  11. actenon/anchors/models.py +153 -0
  12. actenon/api/__init__.py +12 -0
  13. actenon/api/intake.py +39 -0
  14. actenon/api/invoice_payment.py +143 -0
  15. actenon/api/refund.py +57 -0
  16. actenon/cli.py +2023 -0
  17. actenon/conformance/__init__.py +5 -0
  18. actenon/conformance/helpers.py +136 -0
  19. actenon/conformance/manifest.py +185 -0
  20. actenon/conformance/test_artifact_shape_conformance.py +53 -0
  21. actenon/conformance/test_canonicalization_strict_conformance.py +288 -0
  22. actenon/conformance/test_countersignature_conformance.py +95 -0
  23. actenon/conformance/test_execution_state_conformance.py +78 -0
  24. actenon/conformance/test_outcome_attestation_conformance.py +109 -0
  25. actenon/conformance/test_replay_conformance.py +38 -0
  26. actenon/conformance/test_transparency_log_conformance.py +130 -0
  27. actenon/conformance/test_trust_artifacts_conformance.py +107 -0
  28. actenon/conformance/test_verifier_sdk_conformance.py +191 -0
  29. actenon/conformance/vectors/canonicalization_strict_v1/cases.json +142 -0
  30. actenon/conformance/vectors/canonicalization_strict_v1/profile.json +24 -0
  31. actenon/conformance/vectors/verifier_sdk_v1/README.md +18 -0
  32. actenon/conformance/vectors/verifier_sdk_v1/action_intent.json +41 -0
  33. actenon/conformance/vectors/verifier_sdk_v1/cases.json +285 -0
  34. actenon/conformance/vectors/verifier_sdk_v1/pccb.json +73 -0
  35. actenon/conformance/version.py +6 -0
  36. actenon/core/__init__.py +48 -0
  37. actenon/core/errors.py +111 -0
  38. actenon/core/json.py +68 -0
  39. actenon/core/kernel.py +195 -0
  40. actenon/core/redaction.py +21 -0
  41. actenon/coverage_matrix.py +903 -0
  42. actenon/credentials/__init__.py +9 -0
  43. actenon/credentials/broker.py +91 -0
  44. actenon/demo/__init__.py +2 -0
  45. actenon/demo/local_proof.py +652 -0
  46. actenon/demo/portable_local_proof.py +135 -0
  47. actenon/escrow/__init__.py +16 -0
  48. actenon/escrow/base.py +31 -0
  49. actenon/escrow/memory.py +65 -0
  50. actenon/escrow/service.py +25 -0
  51. actenon/escrow/sqlite.py +261 -0
  52. actenon/evidence/__init__.py +24 -0
  53. actenon/evidence/query.py +535 -0
  54. actenon/evidence/stores.py +117 -0
  55. actenon/execution/__init__.py +32 -0
  56. actenon/execution/mode_aware.py +404 -0
  57. actenon/execution/protected_executor.py +337 -0
  58. actenon/execution_graph.py +129 -0
  59. actenon/gate.py +620 -0
  60. actenon/idempotency.py +162 -0
  61. actenon/local_runtime.py +3412 -0
  62. actenon/local_runtime_server.py +960 -0
  63. actenon/models/__init__.py +125 -0
  64. actenon/models/contracts.py +866 -0
  65. actenon/models/evidence.py +15 -0
  66. actenon/models/execution.py +89 -0
  67. actenon/models/intent_record.py +334 -0
  68. actenon/models/invoice_payment.py +243 -0
  69. actenon/models/policy_bundle.py +147 -0
  70. actenon/models/runtime.py +73 -0
  71. actenon/models/serialization.py +46 -0
  72. actenon/outcomes.py +234 -0
  73. actenon/policy/__init__.py +65 -0
  74. actenon/policy/engine.py +252 -0
  75. actenon/policy/evidence.py +92 -0
  76. actenon/policy/invoice_payment.py +442 -0
  77. actenon/policy/refund.py +177 -0
  78. actenon/preflight/__init__.py +57 -0
  79. actenon/preflight/engine.py +208 -0
  80. actenon/preflight/evidence.py +135 -0
  81. actenon/preflight/models.py +129 -0
  82. actenon/preflight/policy_packs.py +1050 -0
  83. actenon/proof/__init__.py +131 -0
  84. actenon/proof/audit.py +87 -0
  85. actenon/proof/canonical.py +102 -0
  86. actenon/proof/local.py +19 -0
  87. actenon/proof/refusal_messages.py +40 -0
  88. actenon/proof/service.py +612 -0
  89. actenon/proof/signers/__init__.py +120 -0
  90. actenon/proof/signers/base.py +61 -0
  91. actenon/proof/signers/external_managed.py +252 -0
  92. actenon/proof/signers/hsm.py +63 -0
  93. actenon/proof/signers/kms.py +68 -0
  94. actenon/proof/signers/local.py +124 -0
  95. actenon/proof/signers/proof_seal.py +220 -0
  96. actenon/proof/signers/well_known.py +814 -0
  97. actenon/proof/signing.py +10 -0
  98. actenon/receipts/__init__.py +47 -0
  99. actenon/receipts/attestation.py +499 -0
  100. actenon/receipts/factory.py +211 -0
  101. actenon/receipts/invoice_payment.py +102 -0
  102. actenon/receipts/refund.py +60 -0
  103. actenon/receipts/store.py +110 -0
  104. actenon/receipts/writers.py +152 -0
  105. actenon/reconciliation/__init__.py +19 -0
  106. actenon/reconciliation/base.py +114 -0
  107. actenon/replay/__init__.py +20 -0
  108. actenon/replay/base.py +64 -0
  109. actenon/replay/dbapi.py +442 -0
  110. actenon/replay/postgres.py +55 -0
  111. actenon/replay/service.py +84 -0
  112. actenon/replay/sqlite.py +33 -0
  113. actenon/scanner.py +3264 -0
  114. actenon/ui/__init__.py +2 -0
  115. actenon/ui/trace_viewer/__init__.py +2 -0
  116. actenon/ui/trace_viewer/app.py +110 -0
  117. actenon/ui/trace_viewer/static/app.js +253 -0
  118. actenon/ui/trace_viewer/static/index.html +136 -0
  119. actenon/ui/trace_viewer/static/styles.css +288 -0
  120. actenon/ui/trace_viewer/trace_loader.py +875 -0
  121. actenon/verifier/__init__.py +56 -0
  122. actenon/verifier/countersignature.py +404 -0
  123. actenon/verifier/endpoint.py +271 -0
  124. actenon/verifier/middleware.py +96 -0
  125. actenon/verifier/sdk.py +104 -0
  126. actenon/verifier/transparency.py +778 -0
  127. actenon/verifier/trust_artifacts.py +570 -0
  128. actenon_kernel-0.1.0.dist-info/METADATA +644 -0
  129. actenon_kernel-0.1.0.dist-info/RECORD +269 -0
  130. actenon_kernel-0.1.0.dist-info/WHEEL +5 -0
  131. actenon_kernel-0.1.0.dist-info/entry_points.txt +4 -0
  132. actenon_kernel-0.1.0.dist-info/licenses/LICENSE +201 -0
  133. actenon_kernel-0.1.0.dist-info/top_level.txt +4 -0
  134. conformance/CHANGELOG.md +21 -0
  135. conformance/MATRIX.md +27 -0
  136. conformance/README.md +103 -0
  137. conformance/VERSION +1 -0
  138. conformance/__init__.py +1 -0
  139. conformance/suite.json +108 -0
  140. conformance/vector-lock.json +63 -0
  141. conformance/vectors/cloud_invoice_payment_v1/action_intent.json +74 -0
  142. conformance/vectors/cloud_invoice_payment_v1/issuer_keys.json +57 -0
  143. conformance/vectors/cloud_invoice_payment_v1/mutations/action_hash_changed_pccb.json +78 -0
  144. conformance/vectors/cloud_invoice_payment_v1/mutations/amount_changed_action_intent.json +74 -0
  145. conformance/vectors/cloud_invoice_payment_v1/mutations/audience_changed_pccb.json +78 -0
  146. conformance/vectors/cloud_invoice_payment_v1/mutations/expired_pccb.json +78 -0
  147. conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_hard_revoked_issuer_keys.json +58 -0
  148. conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_wrong_purpose_issuer_keys.json +57 -0
  149. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_artifact_digest_changed.json +55 -0
  150. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issued_at_changed.json +55 -0
  151. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issuer_changed.json +55 -0
  152. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_outcome_artifact_changed.json +55 -0
  153. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_proof_binding_changed.json +55 -0
  154. conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_signature_changed.json +55 -0
  155. conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issued_at_changed.json +56 -0
  156. conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issuer_changed.json +56 -0
  157. conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_signature_changed.json +56 -0
  158. conformance/vectors/cloud_invoice_payment_v1/mutations/signature_changed_pccb.json +78 -0
  159. conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_kid_pccb.json +78 -0
  160. conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_purpose_issuer_keys.json +57 -0
  161. conformance/vectors/cloud_invoice_payment_v1/pccb.json +78 -0
  162. conformance/vectors/cloud_invoice_payment_v1/receipt.json +19 -0
  163. conformance/vectors/cloud_invoice_payment_v1/receipt_attestation.json +55 -0
  164. conformance/vectors/cloud_invoice_payment_v1/refusal.json +20 -0
  165. conformance/vectors/cloud_invoice_payment_v1/refusal_attestation.json +56 -0
  166. conformance/vectors/receipt_countersignature_v1/countersignature.json +28 -0
  167. conformance/vectors/receipt_countersignature_v1/mutations/countersignature_altered_digest.json +28 -0
  168. conformance/vectors/receipt_countersignature_v1/mutations/countersignature_unknown_kid.json +28 -0
  169. conformance/vectors/receipt_countersignature_v1/mutations/trusted_keys_wrong_key.json +50 -0
  170. conformance/vectors/receipt_countersignature_v1/receipt.json +19 -0
  171. conformance/vectors/receipt_countersignature_v1/trusted_keys.json +50 -0
  172. conformance/vectors/transparency_log_v1/checkpoint_new.json +23 -0
  173. conformance/vectors/transparency_log_v1/checkpoint_old.json +23 -0
  174. conformance/vectors/transparency_log_v1/consistency_proof.json +13 -0
  175. conformance/vectors/transparency_log_v1/countersignature.json +27 -0
  176. conformance/vectors/transparency_log_v1/inclusion_proof.json +19 -0
  177. conformance/vectors/transparency_log_v1/leaf_digest.json +5 -0
  178. conformance/vectors/transparency_log_v1/mutations/checkpoint_new_forked.json +23 -0
  179. conformance/vectors/transparency_log_v1/mutations/checkpoint_unknown_kid.json +23 -0
  180. conformance/vectors/transparency_log_v1/mutations/countersignature_orphan.json +27 -0
  181. conformance/vectors/transparency_log_v1/trusted_keys.json +60 -0
  182. conformance/vectors/trust_artifacts_v1/README.md +13 -0
  183. conformance/vectors/trust_artifacts_v1/action_intent.json +74 -0
  184. conformance/vectors/trust_artifacts_v1/approval.json +25 -0
  185. conformance/vectors/trust_artifacts_v1/approval_trusted_keys.json +28 -0
  186. conformance/vectors/trust_artifacts_v1/issuer.json +4 -0
  187. conformance/vectors/trust_artifacts_v1/issuer_status_expired.json +24 -0
  188. conformance/vectors/trust_artifacts_v1/issuer_status_good.json +24 -0
  189. conformance/vectors/trust_artifacts_v1/issuer_status_revoked.json +24 -0
  190. conformance/vectors/trust_artifacts_v1/issuer_status_stale.json +24 -0
  191. conformance/vectors/trust_artifacts_v1/issuer_status_trusted_keys.json +28 -0
  192. conformance/vectors/trust_artifacts_v1/mutations/approval_action_changed.json +25 -0
  193. conformance/vectors/trust_artifacts_v1/mutations/approval_signature_changed.json +25 -0
  194. conformance/vectors/trust_artifacts_v1/mutations/issuer_status_signature_changed.json +24 -0
  195. examples/__init__.py +2 -0
  196. examples/adversarial_rsa_policy_stress_test.py +339 -0
  197. examples/claude_managed_agents_protected_tool/tool.py +456 -0
  198. examples/credential_broker_infra_delete/__init__.py +1 -0
  199. examples/credential_broker_infra_delete/demo.py +171 -0
  200. examples/crewai_protected_tool/tool.py +160 -0
  201. examples/edge_templates/__init__.py +2 -0
  202. examples/edge_templates/_support.py +66 -0
  203. examples/edge_templates/ci_cd.py +14 -0
  204. examples/edge_templates/cloud.py +14 -0
  205. examples/edge_templates/communications.py +14 -0
  206. examples/edge_templates/database.py +14 -0
  207. examples/edge_templates/http_api.py +14 -0
  208. examples/edge_templates/iam.py +14 -0
  209. examples/edge_templates/ot.py +14 -0
  210. examples/edge_templates/storage.py +14 -0
  211. examples/fastapi_protected_route/app.py +114 -0
  212. examples/fastapi_resource_boundary_refund/__init__.py +0 -0
  213. examples/fastapi_resource_boundary_refund/app.py +151 -0
  214. examples/fastapi_resource_boundary_refund/test_resource_boundary_refund.py +92 -0
  215. examples/fastapi_verifier_only_refund/__init__.py +0 -0
  216. examples/fastapi_verifier_only_refund/app.py +122 -0
  217. examples/fastapi_verifier_only_refund/issuer.py +47 -0
  218. examples/fastapi_verifier_only_refund/test_verifier_only_refund.py +58 -0
  219. examples/fastmcp_financial_transfer/__init__.py +1 -0
  220. examples/fastmcp_financial_transfer/mcp_server.py +88 -0
  221. examples/fastmcp_financial_transfer/test_fastmcp_financial_transfer.py +120 -0
  222. examples/financial_agent_protected_transfer/financial_agent.py +182 -0
  223. examples/financial_agent_protected_transfer/test_financial_agent.py +132 -0
  224. examples/hello_protected_endpoint/server.py +113 -0
  225. examples/hello_world_protected_resource_python/__init__.py +1 -0
  226. examples/hello_world_protected_resource_python/protected_resource.py +49 -0
  227. examples/integration_support.py +123 -0
  228. examples/interactive_execution_demo.py +139 -0
  229. examples/invoice_payment_guard_local/__init__.py +1 -0
  230. examples/invoice_payment_guard_local/protected_endpoint.py +376 -0
  231. examples/langchain_protected_tool/tool.py +123 -0
  232. examples/llamaindex_protected_tool/tool.py +142 -0
  233. examples/mcp_protected_tool/__init__.py +2 -0
  234. examples/mcp_protected_tool/demo.py +269 -0
  235. examples/mcp_server_protected_tool/__init__.py +2 -0
  236. examples/mcp_server_protected_tool/demo.py +66 -0
  237. examples/mcp_server_protected_tool/proof_gate.py +463 -0
  238. examples/mcp_server_protected_tool/server.py +208 -0
  239. examples/openai_agents_sdk_protected_tool/app.py +104 -0
  240. examples/protected_clinical_ehr_agent/protected_clinical_ehr_agent.py +274 -0
  241. examples/protected_clinical_ehr_agent/test_protected_clinical_ehr_agent.py +25 -0
  242. examples/protected_iam_control_plane/protected_iam_control_plane.py +273 -0
  243. examples/protected_iam_control_plane/test_protected_iam_control_plane.py +21 -0
  244. examples/protected_langchain_finance_agent/protected_langchain_finance_agent.py +421 -0
  245. examples/protected_langchain_finance_agent/test_protected_langchain_finance_agent.py +27 -0
  246. examples/protected_multi_agent_swarm/protected_multi_agent_swarm.py +233 -0
  247. examples/protected_multi_agent_swarm/test_protected_multi_agent_swarm.py +20 -0
  248. examples/protected_policy_preflight_refund/__init__.py +0 -0
  249. examples/protected_policy_preflight_refund/policy_preflight_refund.py +87 -0
  250. examples/protected_policy_preflight_refund/test_policy_preflight_refund.py +76 -0
  251. examples/quickstart_min.py +16 -0
  252. examples/refund_guard_local/__init__.py +2 -0
  253. examples/refund_guard_local/call_endpoint.py +113 -0
  254. examples/refund_guard_local/protected_endpoint.py +87 -0
  255. examples/refund_guard_local/server.py +560 -0
  256. examples/semantic_kernel_protected_tool/tool.py +141 -0
  257. schemas/__init__.py +1 -0
  258. schemas/action_intent.v1.json +256 -0
  259. schemas/approval_artifact.v1.json +62 -0
  260. schemas/issuer_status.v1.json +53 -0
  261. schemas/pccb.v1.json +336 -0
  262. schemas/receipt.v1.json +343 -0
  263. schemas/receipt_attestation.v2alpha1.json +237 -0
  264. schemas/receipt_countersignature.v1.json +150 -0
  265. schemas/refusal.v1.json +348 -0
  266. schemas/refusal_attestation.v2alpha1.json +237 -0
  267. schemas/transparency_checkpoint.v1.json +51 -0
  268. schemas/transparency_consistency_proof.v1.json +28 -0
  269. schemas/transparency_inclusion_proof.v1.json +42 -0
@@ -0,0 +1,288 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #f4f1e8;
4
+ --panel: #fffaf2;
5
+ --panel-strong: #fffdf8;
6
+ --text: #1e2220;
7
+ --muted: #66706d;
8
+ --line: #d8d1c4;
9
+ --accent: #1c5d63;
10
+ --accent-soft: #d8ecee;
11
+ --success: #1f6d3d;
12
+ --success-soft: #d9efe1;
13
+ --warning: #9b6c16;
14
+ --warning-soft: #f5e8c9;
15
+ --danger: #8a2d2d;
16
+ --danger-soft: #f7dddd;
17
+ --neutral-soft: #ece7de;
18
+ --shadow: 0 14px 28px rgba(30, 34, 32, 0.08);
19
+ --radius: 18px;
20
+ font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Palatino, serif;
21
+ }
22
+
23
+ * {
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ body {
28
+ margin: 0;
29
+ background:
30
+ radial-gradient(circle at top left, rgba(28, 93, 99, 0.08), transparent 28%),
31
+ linear-gradient(180deg, #f6f2e9 0%, #eee7db 100%);
32
+ color: var(--text);
33
+ }
34
+
35
+ .topbar {
36
+ display: flex;
37
+ justify-content: space-between;
38
+ gap: 1rem;
39
+ padding: 1.5rem 1.5rem 1rem;
40
+ align-items: flex-start;
41
+ }
42
+
43
+ .eyebrow {
44
+ margin: 0 0 0.25rem;
45
+ text-transform: uppercase;
46
+ letter-spacing: 0.08em;
47
+ font-size: 0.72rem;
48
+ color: var(--muted);
49
+ }
50
+
51
+ h1,
52
+ h2,
53
+ h3 {
54
+ margin: 0;
55
+ font-family: Georgia, "Times New Roman", serif;
56
+ }
57
+
58
+ .subtitle,
59
+ #scenario-description,
60
+ #what-happened,
61
+ #why-result {
62
+ margin: 0.45rem 0 0;
63
+ line-height: 1.5;
64
+ }
65
+
66
+ .topbar-actions,
67
+ .section-header,
68
+ .badge-row,
69
+ .tab-row {
70
+ display: flex;
71
+ gap: 0.5rem;
72
+ flex-wrap: wrap;
73
+ }
74
+
75
+ .layout {
76
+ display: grid;
77
+ grid-template-columns: minmax(270px, 330px) minmax(0, 1fr);
78
+ gap: 1rem;
79
+ padding: 0 1.5rem 1.5rem;
80
+ }
81
+
82
+ .sidebar,
83
+ .content {
84
+ display: grid;
85
+ gap: 1rem;
86
+ align-content: start;
87
+ }
88
+
89
+ .panel {
90
+ background: rgba(255, 250, 242, 0.94);
91
+ border: 1px solid var(--line);
92
+ border-radius: var(--radius);
93
+ padding: 1rem;
94
+ box-shadow: var(--shadow);
95
+ }
96
+
97
+ .card {
98
+ background: var(--panel-strong);
99
+ border: 1px solid var(--line);
100
+ border-radius: 16px;
101
+ padding: 0.9rem 1rem;
102
+ }
103
+
104
+ .overview-grid,
105
+ .check-grid {
106
+ display: grid;
107
+ gap: 0.9rem;
108
+ }
109
+
110
+ .overview-grid {
111
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
112
+ }
113
+
114
+ .check-grid {
115
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
116
+ }
117
+
118
+ .check-card {
119
+ border: 1px solid var(--line);
120
+ border-radius: 14px;
121
+ background: var(--panel-strong);
122
+ padding: 0.8rem 0.9rem;
123
+ }
124
+
125
+ .check-card dt {
126
+ font-size: 0.78rem;
127
+ text-transform: uppercase;
128
+ letter-spacing: 0.06em;
129
+ color: var(--muted);
130
+ margin-bottom: 0.35rem;
131
+ }
132
+
133
+ .check-card dd {
134
+ margin: 0;
135
+ line-height: 1.45;
136
+ word-break: break-word;
137
+ }
138
+
139
+ .list {
140
+ list-style: none;
141
+ margin: 0;
142
+ padding: 0;
143
+ display: grid;
144
+ gap: 0.55rem;
145
+ }
146
+
147
+ .compact {
148
+ gap: 0.35rem;
149
+ }
150
+
151
+ .list button,
152
+ .tab-row button,
153
+ .button {
154
+ cursor: pointer;
155
+ border: 1px solid var(--line);
156
+ border-radius: 14px;
157
+ background: var(--panel-strong);
158
+ color: var(--text);
159
+ padding: 0.7rem 0.9rem;
160
+ font: inherit;
161
+ text-align: left;
162
+ transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;
163
+ }
164
+
165
+ .list button:hover,
166
+ .tab-row button:hover,
167
+ .button:hover {
168
+ transform: translateY(-1px);
169
+ border-color: var(--accent);
170
+ }
171
+
172
+ .list button.active,
173
+ .tab-row button.active {
174
+ background: var(--accent-soft);
175
+ border-color: var(--accent);
176
+ }
177
+
178
+ .run-item-title,
179
+ .scenario-item-title {
180
+ font-weight: 700;
181
+ }
182
+
183
+ .run-item-meta,
184
+ .scenario-item-meta,
185
+ .path,
186
+ .artifact-meta {
187
+ margin: 0.3rem 0 0;
188
+ color: var(--muted);
189
+ font-size: 0.92rem;
190
+ line-height: 1.45;
191
+ }
192
+
193
+ .badge {
194
+ display: inline-flex;
195
+ align-items: center;
196
+ border-radius: 999px;
197
+ padding: 0.28rem 0.65rem;
198
+ font-size: 0.82rem;
199
+ font-weight: 700;
200
+ border: 1px solid transparent;
201
+ }
202
+
203
+ .badge-success {
204
+ background: var(--success-soft);
205
+ color: var(--success);
206
+ }
207
+
208
+ .badge-warning {
209
+ background: var(--warning-soft);
210
+ color: var(--warning);
211
+ }
212
+
213
+ .badge-danger {
214
+ background: var(--danger-soft);
215
+ color: var(--danger);
216
+ }
217
+
218
+ .badge-neutral {
219
+ background: var(--neutral-soft);
220
+ color: var(--text);
221
+ }
222
+
223
+ .timeline {
224
+ list-style: none;
225
+ margin: 0;
226
+ padding: 0;
227
+ display: grid;
228
+ gap: 0.9rem;
229
+ }
230
+
231
+ .timeline li {
232
+ position: relative;
233
+ padding-left: 1.2rem;
234
+ border-left: 2px solid var(--line);
235
+ }
236
+
237
+ .timeline li::before {
238
+ content: "";
239
+ position: absolute;
240
+ left: -0.42rem;
241
+ top: 0.12rem;
242
+ width: 0.8rem;
243
+ height: 0.8rem;
244
+ border-radius: 50%;
245
+ background: var(--accent);
246
+ box-shadow: 0 0 0 4px rgba(28, 93, 99, 0.12);
247
+ }
248
+
249
+ .timeline-title {
250
+ font-weight: 700;
251
+ }
252
+
253
+ .timeline-detail {
254
+ margin-top: 0.25rem;
255
+ color: var(--muted);
256
+ line-height: 1.45;
257
+ }
258
+
259
+ .json-viewer {
260
+ margin: 0;
261
+ overflow: auto;
262
+ max-height: 40rem;
263
+ background: #1d211f;
264
+ color: #edf4f0;
265
+ border-radius: 16px;
266
+ padding: 1rem;
267
+ font-size: 0.9rem;
268
+ line-height: 1.45;
269
+ }
270
+
271
+ .hidden {
272
+ display: none;
273
+ }
274
+
275
+ .empty-state pre {
276
+ margin: 0.8rem 0 0;
277
+ background: #1d211f;
278
+ color: #edf4f0;
279
+ border-radius: 14px;
280
+ padding: 1rem;
281
+ overflow: auto;
282
+ }
283
+
284
+ @media (max-width: 980px) {
285
+ .layout {
286
+ grid-template-columns: 1fr;
287
+ }
288
+ }