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.
- actenon/__init__.py +11 -0
- actenon/adapters/__init__.py +20 -0
- actenon/adapters/_authorization.py +30 -0
- actenon/adapters/base.py +104 -0
- actenon/adapters/edge.py +129 -0
- actenon/adapters/fastapi.py +161 -0
- actenon/adapters/langchain.py +111 -0
- actenon/adapters/mcp.py +118 -0
- actenon/anchors/__init__.py +29 -0
- actenon/anchors/local_log.py +224 -0
- actenon/anchors/models.py +153 -0
- actenon/api/__init__.py +12 -0
- actenon/api/intake.py +39 -0
- actenon/api/invoice_payment.py +143 -0
- actenon/api/refund.py +57 -0
- actenon/cli.py +2023 -0
- actenon/conformance/__init__.py +5 -0
- actenon/conformance/helpers.py +136 -0
- actenon/conformance/manifest.py +185 -0
- actenon/conformance/test_artifact_shape_conformance.py +53 -0
- actenon/conformance/test_canonicalization_strict_conformance.py +288 -0
- actenon/conformance/test_countersignature_conformance.py +95 -0
- actenon/conformance/test_execution_state_conformance.py +78 -0
- actenon/conformance/test_outcome_attestation_conformance.py +109 -0
- actenon/conformance/test_replay_conformance.py +38 -0
- actenon/conformance/test_transparency_log_conformance.py +130 -0
- actenon/conformance/test_trust_artifacts_conformance.py +107 -0
- actenon/conformance/test_verifier_sdk_conformance.py +191 -0
- actenon/conformance/vectors/canonicalization_strict_v1/cases.json +142 -0
- actenon/conformance/vectors/canonicalization_strict_v1/profile.json +24 -0
- actenon/conformance/vectors/verifier_sdk_v1/README.md +18 -0
- actenon/conformance/vectors/verifier_sdk_v1/action_intent.json +41 -0
- actenon/conformance/vectors/verifier_sdk_v1/cases.json +285 -0
- actenon/conformance/vectors/verifier_sdk_v1/pccb.json +73 -0
- actenon/conformance/version.py +6 -0
- actenon/core/__init__.py +48 -0
- actenon/core/errors.py +111 -0
- actenon/core/json.py +68 -0
- actenon/core/kernel.py +195 -0
- actenon/core/redaction.py +21 -0
- actenon/coverage_matrix.py +903 -0
- actenon/credentials/__init__.py +9 -0
- actenon/credentials/broker.py +91 -0
- actenon/demo/__init__.py +2 -0
- actenon/demo/local_proof.py +652 -0
- actenon/demo/portable_local_proof.py +135 -0
- actenon/escrow/__init__.py +16 -0
- actenon/escrow/base.py +31 -0
- actenon/escrow/memory.py +65 -0
- actenon/escrow/service.py +25 -0
- actenon/escrow/sqlite.py +261 -0
- actenon/evidence/__init__.py +24 -0
- actenon/evidence/query.py +535 -0
- actenon/evidence/stores.py +117 -0
- actenon/execution/__init__.py +32 -0
- actenon/execution/mode_aware.py +404 -0
- actenon/execution/protected_executor.py +337 -0
- actenon/execution_graph.py +129 -0
- actenon/gate.py +620 -0
- actenon/idempotency.py +162 -0
- actenon/local_runtime.py +3412 -0
- actenon/local_runtime_server.py +960 -0
- actenon/models/__init__.py +125 -0
- actenon/models/contracts.py +866 -0
- actenon/models/evidence.py +15 -0
- actenon/models/execution.py +89 -0
- actenon/models/intent_record.py +334 -0
- actenon/models/invoice_payment.py +243 -0
- actenon/models/policy_bundle.py +147 -0
- actenon/models/runtime.py +73 -0
- actenon/models/serialization.py +46 -0
- actenon/outcomes.py +234 -0
- actenon/policy/__init__.py +65 -0
- actenon/policy/engine.py +252 -0
- actenon/policy/evidence.py +92 -0
- actenon/policy/invoice_payment.py +442 -0
- actenon/policy/refund.py +177 -0
- actenon/preflight/__init__.py +57 -0
- actenon/preflight/engine.py +208 -0
- actenon/preflight/evidence.py +135 -0
- actenon/preflight/models.py +129 -0
- actenon/preflight/policy_packs.py +1050 -0
- actenon/proof/__init__.py +131 -0
- actenon/proof/audit.py +87 -0
- actenon/proof/canonical.py +102 -0
- actenon/proof/local.py +19 -0
- actenon/proof/refusal_messages.py +40 -0
- actenon/proof/service.py +612 -0
- actenon/proof/signers/__init__.py +120 -0
- actenon/proof/signers/base.py +61 -0
- actenon/proof/signers/external_managed.py +252 -0
- actenon/proof/signers/hsm.py +63 -0
- actenon/proof/signers/kms.py +68 -0
- actenon/proof/signers/local.py +124 -0
- actenon/proof/signers/proof_seal.py +220 -0
- actenon/proof/signers/well_known.py +814 -0
- actenon/proof/signing.py +10 -0
- actenon/receipts/__init__.py +47 -0
- actenon/receipts/attestation.py +499 -0
- actenon/receipts/factory.py +211 -0
- actenon/receipts/invoice_payment.py +102 -0
- actenon/receipts/refund.py +60 -0
- actenon/receipts/store.py +110 -0
- actenon/receipts/writers.py +152 -0
- actenon/reconciliation/__init__.py +19 -0
- actenon/reconciliation/base.py +114 -0
- actenon/replay/__init__.py +20 -0
- actenon/replay/base.py +64 -0
- actenon/replay/dbapi.py +442 -0
- actenon/replay/postgres.py +55 -0
- actenon/replay/service.py +84 -0
- actenon/replay/sqlite.py +33 -0
- actenon/scanner.py +3264 -0
- actenon/ui/__init__.py +2 -0
- actenon/ui/trace_viewer/__init__.py +2 -0
- actenon/ui/trace_viewer/app.py +110 -0
- actenon/ui/trace_viewer/static/app.js +253 -0
- actenon/ui/trace_viewer/static/index.html +136 -0
- actenon/ui/trace_viewer/static/styles.css +288 -0
- actenon/ui/trace_viewer/trace_loader.py +875 -0
- actenon/verifier/__init__.py +56 -0
- actenon/verifier/countersignature.py +404 -0
- actenon/verifier/endpoint.py +271 -0
- actenon/verifier/middleware.py +96 -0
- actenon/verifier/sdk.py +104 -0
- actenon/verifier/transparency.py +778 -0
- actenon/verifier/trust_artifacts.py +570 -0
- actenon_kernel-0.1.0.dist-info/METADATA +644 -0
- actenon_kernel-0.1.0.dist-info/RECORD +269 -0
- actenon_kernel-0.1.0.dist-info/WHEEL +5 -0
- actenon_kernel-0.1.0.dist-info/entry_points.txt +4 -0
- actenon_kernel-0.1.0.dist-info/licenses/LICENSE +201 -0
- actenon_kernel-0.1.0.dist-info/top_level.txt +4 -0
- conformance/CHANGELOG.md +21 -0
- conformance/MATRIX.md +27 -0
- conformance/README.md +103 -0
- conformance/VERSION +1 -0
- conformance/__init__.py +1 -0
- conformance/suite.json +108 -0
- conformance/vector-lock.json +63 -0
- conformance/vectors/cloud_invoice_payment_v1/action_intent.json +74 -0
- conformance/vectors/cloud_invoice_payment_v1/issuer_keys.json +57 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/action_hash_changed_pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/amount_changed_action_intent.json +74 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/audience_changed_pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/expired_pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_hard_revoked_issuer_keys.json +58 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/outcome_attestation_wrong_purpose_issuer_keys.json +57 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_artifact_digest_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issued_at_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_issuer_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_outcome_artifact_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_proof_binding_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/receipt_attestation_signature_changed.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issued_at_changed.json +56 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_issuer_changed.json +56 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/refusal_attestation_signature_changed.json +56 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/signature_changed_pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_kid_pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/mutations/wrong_purpose_issuer_keys.json +57 -0
- conformance/vectors/cloud_invoice_payment_v1/pccb.json +78 -0
- conformance/vectors/cloud_invoice_payment_v1/receipt.json +19 -0
- conformance/vectors/cloud_invoice_payment_v1/receipt_attestation.json +55 -0
- conformance/vectors/cloud_invoice_payment_v1/refusal.json +20 -0
- conformance/vectors/cloud_invoice_payment_v1/refusal_attestation.json +56 -0
- conformance/vectors/receipt_countersignature_v1/countersignature.json +28 -0
- conformance/vectors/receipt_countersignature_v1/mutations/countersignature_altered_digest.json +28 -0
- conformance/vectors/receipt_countersignature_v1/mutations/countersignature_unknown_kid.json +28 -0
- conformance/vectors/receipt_countersignature_v1/mutations/trusted_keys_wrong_key.json +50 -0
- conformance/vectors/receipt_countersignature_v1/receipt.json +19 -0
- conformance/vectors/receipt_countersignature_v1/trusted_keys.json +50 -0
- conformance/vectors/transparency_log_v1/checkpoint_new.json +23 -0
- conformance/vectors/transparency_log_v1/checkpoint_old.json +23 -0
- conformance/vectors/transparency_log_v1/consistency_proof.json +13 -0
- conformance/vectors/transparency_log_v1/countersignature.json +27 -0
- conformance/vectors/transparency_log_v1/inclusion_proof.json +19 -0
- conformance/vectors/transparency_log_v1/leaf_digest.json +5 -0
- conformance/vectors/transparency_log_v1/mutations/checkpoint_new_forked.json +23 -0
- conformance/vectors/transparency_log_v1/mutations/checkpoint_unknown_kid.json +23 -0
- conformance/vectors/transparency_log_v1/mutations/countersignature_orphan.json +27 -0
- conformance/vectors/transparency_log_v1/trusted_keys.json +60 -0
- conformance/vectors/trust_artifacts_v1/README.md +13 -0
- conformance/vectors/trust_artifacts_v1/action_intent.json +74 -0
- conformance/vectors/trust_artifacts_v1/approval.json +25 -0
- conformance/vectors/trust_artifacts_v1/approval_trusted_keys.json +28 -0
- conformance/vectors/trust_artifacts_v1/issuer.json +4 -0
- conformance/vectors/trust_artifacts_v1/issuer_status_expired.json +24 -0
- conformance/vectors/trust_artifacts_v1/issuer_status_good.json +24 -0
- conformance/vectors/trust_artifacts_v1/issuer_status_revoked.json +24 -0
- conformance/vectors/trust_artifacts_v1/issuer_status_stale.json +24 -0
- conformance/vectors/trust_artifacts_v1/issuer_status_trusted_keys.json +28 -0
- conformance/vectors/trust_artifacts_v1/mutations/approval_action_changed.json +25 -0
- conformance/vectors/trust_artifacts_v1/mutations/approval_signature_changed.json +25 -0
- conformance/vectors/trust_artifacts_v1/mutations/issuer_status_signature_changed.json +24 -0
- examples/__init__.py +2 -0
- examples/adversarial_rsa_policy_stress_test.py +339 -0
- examples/claude_managed_agents_protected_tool/tool.py +456 -0
- examples/credential_broker_infra_delete/__init__.py +1 -0
- examples/credential_broker_infra_delete/demo.py +171 -0
- examples/crewai_protected_tool/tool.py +160 -0
- examples/edge_templates/__init__.py +2 -0
- examples/edge_templates/_support.py +66 -0
- examples/edge_templates/ci_cd.py +14 -0
- examples/edge_templates/cloud.py +14 -0
- examples/edge_templates/communications.py +14 -0
- examples/edge_templates/database.py +14 -0
- examples/edge_templates/http_api.py +14 -0
- examples/edge_templates/iam.py +14 -0
- examples/edge_templates/ot.py +14 -0
- examples/edge_templates/storage.py +14 -0
- examples/fastapi_protected_route/app.py +114 -0
- examples/fastapi_resource_boundary_refund/__init__.py +0 -0
- examples/fastapi_resource_boundary_refund/app.py +151 -0
- examples/fastapi_resource_boundary_refund/test_resource_boundary_refund.py +92 -0
- examples/fastapi_verifier_only_refund/__init__.py +0 -0
- examples/fastapi_verifier_only_refund/app.py +122 -0
- examples/fastapi_verifier_only_refund/issuer.py +47 -0
- examples/fastapi_verifier_only_refund/test_verifier_only_refund.py +58 -0
- examples/fastmcp_financial_transfer/__init__.py +1 -0
- examples/fastmcp_financial_transfer/mcp_server.py +88 -0
- examples/fastmcp_financial_transfer/test_fastmcp_financial_transfer.py +120 -0
- examples/financial_agent_protected_transfer/financial_agent.py +182 -0
- examples/financial_agent_protected_transfer/test_financial_agent.py +132 -0
- examples/hello_protected_endpoint/server.py +113 -0
- examples/hello_world_protected_resource_python/__init__.py +1 -0
- examples/hello_world_protected_resource_python/protected_resource.py +49 -0
- examples/integration_support.py +123 -0
- examples/interactive_execution_demo.py +139 -0
- examples/invoice_payment_guard_local/__init__.py +1 -0
- examples/invoice_payment_guard_local/protected_endpoint.py +376 -0
- examples/langchain_protected_tool/tool.py +123 -0
- examples/llamaindex_protected_tool/tool.py +142 -0
- examples/mcp_protected_tool/__init__.py +2 -0
- examples/mcp_protected_tool/demo.py +269 -0
- examples/mcp_server_protected_tool/__init__.py +2 -0
- examples/mcp_server_protected_tool/demo.py +66 -0
- examples/mcp_server_protected_tool/proof_gate.py +463 -0
- examples/mcp_server_protected_tool/server.py +208 -0
- examples/openai_agents_sdk_protected_tool/app.py +104 -0
- examples/protected_clinical_ehr_agent/protected_clinical_ehr_agent.py +274 -0
- examples/protected_clinical_ehr_agent/test_protected_clinical_ehr_agent.py +25 -0
- examples/protected_iam_control_plane/protected_iam_control_plane.py +273 -0
- examples/protected_iam_control_plane/test_protected_iam_control_plane.py +21 -0
- examples/protected_langchain_finance_agent/protected_langchain_finance_agent.py +421 -0
- examples/protected_langchain_finance_agent/test_protected_langchain_finance_agent.py +27 -0
- examples/protected_multi_agent_swarm/protected_multi_agent_swarm.py +233 -0
- examples/protected_multi_agent_swarm/test_protected_multi_agent_swarm.py +20 -0
- examples/protected_policy_preflight_refund/__init__.py +0 -0
- examples/protected_policy_preflight_refund/policy_preflight_refund.py +87 -0
- examples/protected_policy_preflight_refund/test_policy_preflight_refund.py +76 -0
- examples/quickstart_min.py +16 -0
- examples/refund_guard_local/__init__.py +2 -0
- examples/refund_guard_local/call_endpoint.py +113 -0
- examples/refund_guard_local/protected_endpoint.py +87 -0
- examples/refund_guard_local/server.py +560 -0
- examples/semantic_kernel_protected_tool/tool.py +141 -0
- schemas/__init__.py +1 -0
- schemas/action_intent.v1.json +256 -0
- schemas/approval_artifact.v1.json +62 -0
- schemas/issuer_status.v1.json +53 -0
- schemas/pccb.v1.json +336 -0
- schemas/receipt.v1.json +343 -0
- schemas/receipt_attestation.v2alpha1.json +237 -0
- schemas/receipt_countersignature.v1.json +150 -0
- schemas/refusal.v1.json +348 -0
- schemas/refusal_attestation.v2alpha1.json +237 -0
- schemas/transparency_checkpoint.v1.json +51 -0
- schemas/transparency_consistency_proof.v1.json +28 -0
- 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
|
+
}
|