@feltdb/core 0.12.1 → 0.13.0

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 (139) hide show
  1. package/dist/build-identity.json +13 -4
  2. package/dist/cli/commands.js +96 -45
  3. package/dist/cli/workspace-integration.js +8 -0
  4. package/dist/collection.d.ts +41 -4
  5. package/dist/collection.d.ts.map +1 -1
  6. package/dist/collection.js +116 -47
  7. package/dist/composition.d.ts.map +1 -1
  8. package/dist/composition.js +11 -1
  9. package/dist/create/build-identity.json +13 -4
  10. package/dist/create/cli.js +49 -40
  11. package/dist/create/create.js +32 -19
  12. package/dist/create/package-versions.js +1 -1
  13. package/dist/create/server-source/Cargo.lock +18 -3
  14. package/dist/create/server-source/Cargo.toml +4 -2
  15. package/dist/create/server-source/crates/feltdb/Cargo.toml +20 -0
  16. package/dist/create/server-source/crates/feltdb/LICENSE +21 -0
  17. package/dist/create/server-source/crates/feltdb/README.md +75 -0
  18. package/dist/create/server-source/crates/feltdb/src/agent_state.rs +320 -0
  19. package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +1545 -0
  20. package/dist/create/server-source/crates/feltdb/src/authority.rs +145 -15
  21. package/dist/create/server-source/crates/feltdb/src/lib.rs +227 -23
  22. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1 -5
  23. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +204 -1
  24. package/dist/create/server-source/crates/feltdb/src/workload.rs +685 -53
  25. package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +1188 -0
  26. package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +2884 -0
  27. package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +534 -0
  28. package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +23340 -0
  29. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +18 -12
  30. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +17 -5
  31. package/dist/create/server-source/crates/feltdb-client/Cargo.toml +29 -0
  32. package/dist/create/server-source/crates/feltdb-client/LICENSE +21 -0
  33. package/dist/create/server-source/crates/feltdb-client/README.md +70 -0
  34. package/dist/create/server-source/crates/feltdb-client/src/application.rs +527 -0
  35. package/dist/create/server-source/crates/feltdb-client/src/authority.rs +679 -0
  36. package/dist/create/server-source/crates/feltdb-client/src/control.rs +292 -0
  37. package/dist/create/server-source/crates/feltdb-client/src/error.rs +227 -0
  38. package/dist/create/server-source/crates/feltdb-client/src/events.rs +146 -0
  39. package/dist/create/server-source/crates/feltdb-client/src/lib.rs +466 -0
  40. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/README.md +4 -0
  41. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/private-ca.pem +20 -0
  42. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/server-key.pem +28 -0
  43. package/dist/create/server-source/crates/feltdb-client/tests/fixtures/server.pem +20 -0
  44. package/dist/create/server-source/crates/feltdb-client/tests/private_ca.rs +95 -0
  45. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +20 -1
  46. package/dist/create/server-source/crates/feltdb-server/LICENSE +21 -0
  47. package/dist/create/server-source/crates/feltdb-server/README.md +12 -1
  48. package/dist/create/server-source/crates/feltdb-server/src/agent_execution.rs +511 -0
  49. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +28 -0
  50. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +6 -2
  51. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +21 -0
  52. package/dist/create/server-source/crates/feltdb-server/src/main.rs +845 -138
  53. package/dist/create/server-source/crates/feltdb-server/tests/rust_client.rs +683 -0
  54. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +3 -1
  55. package/dist/create/setup-summary.js +40 -0
  56. package/dist/create/template/default-project/README.md +12 -7
  57. package/dist/create/template/default-project/src/pages/Dashboard.tsx +1 -1
  58. package/dist/create/template/dot-feltdb-README.md +3 -3
  59. package/dist/db.d.ts +27 -1
  60. package/dist/db.d.ts.map +1 -1
  61. package/dist/db.js +60 -21
  62. package/dist/development-runtime-bridge.d.ts +20 -0
  63. package/dist/development-runtime-bridge.d.ts.map +1 -1
  64. package/dist/development-runtime-bridge.js +74 -4
  65. package/dist/embedded-transaction.d.ts +75 -8
  66. package/dist/embedded-transaction.d.ts.map +1 -1
  67. package/dist/embedded-transaction.js +124 -18
  68. package/dist/error-codes.d.ts +2 -0
  69. package/dist/error-codes.d.ts.map +1 -1
  70. package/dist/error-codes.js +2 -0
  71. package/dist/feltdb.d.ts +1 -11
  72. package/dist/feltdb.d.ts.map +1 -1
  73. package/dist/file-db.d.ts +6 -0
  74. package/dist/file-db.d.ts.map +1 -1
  75. package/dist/file-db.js +43 -11
  76. package/dist/http-db.d.ts +13 -0
  77. package/dist/http-db.d.ts.map +1 -1
  78. package/dist/http-db.js +33 -4
  79. package/dist/indexeddb-db.d.ts.map +1 -1
  80. package/dist/indexeddb-db.js +65 -41
  81. package/dist/memory-db.d.ts.map +1 -1
  82. package/dist/memory-db.js +29 -8
  83. package/dist/studio/{KeyManagementPanel-DZuSeWBK.js → KeyManagementPanel-skUNnKRw.js} +36 -28
  84. package/dist/studio/app.d.ts +8 -1
  85. package/dist/studio/app.d.ts.map +1 -1
  86. package/dist/studio/components/KeyManagementPanel.d.ts.map +1 -1
  87. package/dist/studio/components/KeyManagementPanel.js +1 -1
  88. package/dist/studio/components/RouteErrorBoundary.d.ts +5 -0
  89. package/dist/studio/components/RouteErrorBoundary.d.ts.map +1 -0
  90. package/dist/studio/components/index.js +2 -2
  91. package/dist/studio/{components-Bivm2lX6.js → components-BSGmHfif.js} +6 -6
  92. package/dist/studio/control-plane/Agents.d.ts.map +1 -1
  93. package/dist/studio/control-plane/Data.d.ts.map +1 -1
  94. package/dist/studio/control-plane/Instance.d.ts +4 -1
  95. package/dist/studio/control-plane/Instance.d.ts.map +1 -1
  96. package/dist/studio/control-plane/Operations.d.ts +4 -1
  97. package/dist/studio/control-plane/Operations.d.ts.map +1 -1
  98. package/dist/studio/control-plane/Overview.d.ts.map +1 -1
  99. package/dist/studio/control-plane/Schema.d.ts.map +1 -1
  100. package/dist/studio/control-plane/context.d.ts +4 -1
  101. package/dist/studio/control-plane/context.d.ts.map +1 -1
  102. package/dist/studio/control-plane/index.js +2 -2
  103. package/dist/studio/control-plane/primitives.d.ts +24 -0
  104. package/dist/studio/control-plane/primitives.d.ts.map +1 -1
  105. package/dist/studio/{control-plane-CLm69XwX.js → control-plane-CaBA7Rgv.js} +1374 -1298
  106. package/dist/studio/index.d.ts +1 -0
  107. package/dist/studio/index.d.ts.map +1 -1
  108. package/dist/studio/index.js +415 -237
  109. package/dist/studio/navigation.d.ts +57 -0
  110. package/dist/studio/navigation.d.ts.map +1 -0
  111. package/dist/studio/studio.css +1 -1
  112. package/dist/studio/utils/control-plane-api.d.ts +2 -0
  113. package/dist/studio/utils/control-plane-api.d.ts.map +1 -1
  114. package/dist/studio/utils/control-plane-api.js +9 -4
  115. package/dist/studio/utils/service-api.d.ts.map +1 -1
  116. package/dist/studio/utils/service-api.js +5 -4
  117. package/dist/studio-app/assets/{feltdb_wasm-DACcD-zs.js → feltdb_wasm-3hDngl1h.js} +1 -1
  118. package/dist/studio-app/assets/feltdb_wasm_bg-CFQT4gCy.wasm +0 -0
  119. package/dist/studio-app/assets/index-Dql1hS5m.js +30 -0
  120. package/dist/studio-app/assets/{index-CiC8VY-a.css → index-vi21oEQa.css} +1 -1
  121. package/dist/studio-app/index.html +2 -2
  122. package/dist/telemetry.d.ts +1 -0
  123. package/dist/telemetry.d.ts.map +1 -1
  124. package/dist/telemetry.js +4 -3
  125. package/dist/transaction-identity.d.ts +62 -0
  126. package/dist/transaction-identity.d.ts.map +1 -0
  127. package/dist/transaction-identity.js +138 -0
  128. package/dist/transaction.d.ts +50 -5
  129. package/dist/transaction.d.ts.map +1 -1
  130. package/dist/transaction.js +28 -0
  131. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  132. package/dist/wasm/package.json +1 -1
  133. package/dist/workspace/local-development-authority.d.ts +19 -0
  134. package/dist/workspace/local-development-authority.d.ts.map +1 -1
  135. package/dist/workspace/local-development-authority.js +335 -15
  136. package/package.json +1 -1
  137. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  138. package/dist/studio-app/assets/feltdb_wasm_bg-BejThWID.wasm +0 -0
  139. package/dist/studio-app/assets/index-CoZaxnlm.js +0 -30
@@ -1 +1 @@
1
- ._panel_1cbba_1{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:2rem}._header_1cbba_8{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1rem;display:flex}._header_1cbba_8 h2{color:var(--text-primary);margin:0;font-size:1.5rem}._createButton_1cbba_23{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:4px;padding:.5rem 1rem;font-weight:600;transition:background-color .2s}._createButton_1cbba_23:hover{background:var(--accent-hover)}._error_1cbba_38{background:var(--error-bg);border:1px solid var(--error-border);color:var(--error-text);border-radius:4px;margin-bottom:1rem;padding:1rem}._createForm_1cbba_47{background:var(--surface-alt);border:1px solid var(--border);border-radius:4px;margin-bottom:2rem;padding:1.5rem}._formGroup_1cbba_55{margin-bottom:1.5rem}._formGroup_1cbba_55 label{color:var(--text-primary);margin-bottom:.5rem;font-weight:600;display:block}._formGroup_1cbba_55 input[type=text]{border:1px solid var(--border);background:var(--input-bg);width:100%;color:var(--text-primary);border-radius:4px;padding:.5rem;font-family:inherit}._scopeList_1cbba_76{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem;display:grid}._scopeCheckbox_1cbba_82{cursor:pointer;color:var(--text-primary);align-items:center;display:flex}._scopeCheckbox_1cbba_82 input{cursor:pointer;margin-right:.5rem}._submitButton_1cbba_94{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:4px;width:100%;padding:.75rem 1.5rem;font-weight:600}._submitButton_1cbba_94:hover{background:var(--accent-hover)}._empty_1cbba_109{text-align:center;color:var(--text-secondary);background:var(--surface-alt);border-radius:4px;padding:2rem}._keysList_1cbba_117{flex-direction:column;gap:1rem;display:flex}._keyCard_1cbba_123{border:1px solid var(--border);background:var(--surface-alt);border-radius:4px;padding:1.5rem;transition:border-color .2s}._keyCard_1cbba_123:hover{border-color:var(--accent)}._keyHeader_1cbba_135{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;display:flex}._keyHeader_1cbba_135 h3{color:var(--text-primary);margin:0 0 .25rem;font-size:1.1rem}._namespace_1cbba_150{color:var(--text-secondary);margin:0;font-size:.85rem}._status_1cbba_156{border-radius:12px;padding:.25rem .75rem;font-size:.85rem;font-weight:600}._status_1cbba_156._active_1cbba_163{background:var(--success-bg);color:var(--success-text)}._status_1cbba_156._expired_1cbba_168{background:var(--warning-bg);color:var(--warning-text)}._keyDetails_1cbba_173{gap:1rem;margin-bottom:1rem;display:grid}._detail_1cbba_179{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}._detail_1cbba_179 strong{color:var(--text-primary)}._detail_1cbba_179 span,._detail_1cbba_179 code{color:var(--text-secondary)}._detail_1cbba_179 code{background:var(--code-bg);border-radius:3px;padding:.25rem .5rem;font-family:monospace;font-size:.9rem}._copyBtn_1cbba_203{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:3px;padding:.25rem .5rem;font-size:.85rem}._copyBtn_1cbba_203:hover{background:var(--accent-hover)}._daysLeft_1cbba_217{color:var(--warning-text);font-size:.85rem;font-weight:600}._scopes_1cbba_223{margin-top:.75rem}._scopeTags_1cbba_227{flex-wrap:wrap;gap:.5rem;margin-top:.5rem;display:flex}._scopeTag_1cbba_227{background:var(--tag-bg);color:var(--tag-text);border-radius:12px;padding:.25rem .75rem;font-family:monospace;font-size:.85rem}._keyActions_1cbba_243{border-top:1px solid var(--border);gap:.5rem;padding-top:1rem;display:flex}._revokeBtn_1cbba_250{background:var(--error-bg);color:var(--error-text);border:1px solid var(--error-border);cursor:pointer;border-radius:4px;padding:.5rem 1rem;font-weight:600;transition:background-color .2s}._revokeBtn_1cbba_250:hover{background:var(--error-hover-bg)}._info_1cbba_265{background:var(--info-bg);color:var(--text-secondary);border-radius:4px;margin-top:2rem;padding:1rem;font-size:.9rem}._info_1cbba_265 p{margin:0}:root{--surface:#fff;--surface-alt:#f5f5f5;--text-primary:#000;--text-secondary:#666;--border:#e0e0e0;--accent:#007bff;--accent-hover:#0056b3;--error-bg:#f8d7da;--error-border:#f5c6cb;--error-text:#721c24;--error-hover-bg:#f5c6cb;--success-bg:#d4edda;--success-text:#155724;--warning-bg:#fff3cd;--warning-text:#856404;--info-bg:#e2e3e5;--input-bg:#fff;--code-bg:#f4f4f4;--tag-bg:#e9ecef;--tag-text:#495057}@media (prefers-color-scheme:dark){:root{--surface:#1e1e1e;--surface-alt:#2d2d2d;--text-primary:#fff;--text-secondary:#b0b0b0;--border:#404040;--accent:#0d6efd;--accent-hover:#0a58ca;--error-bg:#3d1f1f;--error-border:#664141;--error-text:#f8b7bc;--error-hover-bg:#4a2828;--success-bg:#1f3f1f;--success-text:#7ddc7d;--warning-bg:#3f3f1f;--warning-text:#ffdd57;--info-bg:#2d2d3d;--input-bg:#2d2d2d;--code-bg:#2d2d2d;--tag-bg:#3d3d4d;--tag-text:#b0b0b0}}:root{--stack-font-family-sans:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--stack-font-family-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;--stack-text-xs-size:.75rem;--stack-text-xs-line:1rem;--stack-text-sm-size:.8125rem;--stack-text-sm-line:1.25rem;--stack-text-md-size:.875rem;--stack-text-md-line:1.375rem;--stack-text-lg-size:1rem;--stack-text-lg-line:1.5rem;--stack-text-xl-size:1.25rem;--stack-text-xl-line:1.75rem;--stack-text-2xl-size:1.5rem;--stack-text-2xl-line:2rem;--stack-font-weight-regular:400;--stack-font-weight-medium:500;--stack-font-weight-semibold:600;--stack-space-0:0;--stack-space-1:4px;--stack-space-2:8px;--stack-space-3:12px;--stack-space-4:16px;--stack-space-5:20px;--stack-space-6:24px;--stack-space-8:32px;--stack-space-10:40px;--stack-space-12:48px;--stack-size-control-sm:32px;--stack-size-control-md:36px;--stack-size-control-lg:44px;--stack-size-icon-sm:14px;--stack-size-icon-md:16px;--stack-radius-sm:4px;--stack-radius-md:6px;--stack-radius-lg:10px;--stack-radius-pill:999px;--stack-border-width-thin:1px;--stack-border-width-thick:2px;--stack-focus-ring-width:2px;--stack-focus-ring-offset:2px;--stack-z-sticky:10;--stack-z-dropdown:20;--stack-z-overlay:30;--stack-z-toast:40;--stack-motion-duration-fast:.12s;--stack-motion-duration-base:.2s;--stack-motion-ease-standard:cubic-bezier(.2, 0, 0, 1);--stack-color-bg-canvas:#f6f7f9;--stack-color-bg-surface:#fff;--stack-color-bg-raised:#fff;--stack-color-bg-sunken:#eef0f3;--stack-color-bg-overlay:#0f12187a;--stack-color-bg-code:#f0f2f5;--stack-color-text-default:#16181d;--stack-color-text-muted:#4b5260;--stack-color-text-subtle:#5f6673;--stack-color-text-inverse:#fff;--stack-color-text-link:#2a52c9;--stack-color-text-on-accent:#fff;--stack-color-border-default:#d9dde3;--stack-color-border-strong:#7c8492;--stack-color-border-subtle:#e8ebef;--stack-focus-ring-color:#2f5bd8;--stack-color-action-primary-bg:#2f5bd8;--stack-color-action-primary-fg:#fff;--stack-color-action-primary-bg-hover:#2549c4;--stack-color-action-primary-bg-active:#1e3da6;--stack-color-action-secondary-bg:#fff;--stack-color-action-secondary-fg:#16181d;--stack-color-action-secondary-bg-hover:#eef0f3;--stack-color-action-secondary-bg-active:#e2e5ea;--stack-color-action-danger-bg:#c42b2b;--stack-color-action-danger-fg:#fff;--stack-color-action-danger-bg-hover:#a82323;--stack-color-action-danger-bg-active:#8c1d1d;--stack-color-status-positive-fg:#136b3a;--stack-color-status-positive-bg:#e8f5ee;--stack-color-status-positive-border:#9fd3b4;--stack-color-status-positive-glyph:#1a7f45;--stack-color-status-progress-fg:#1f4fb8;--stack-color-status-progress-bg:#eaf0fd;--stack-color-status-progress-border:#b9cbf3;--stack-color-status-progress-glyph:#2f5bd8;--stack-color-status-attention-fg:#734700;--stack-color-status-attention-bg:#fdf3e1;--stack-color-status-attention-border:#ecc77f;--stack-color-status-attention-glyph:#a26400;--stack-color-status-critical-fg:#a32020;--stack-color-status-critical-bg:#fdecec;--stack-color-status-critical-border:#f0b0b0;--stack-color-status-critical-glyph:#c42b2b;--stack-color-status-neutral-fg:#4b5260;--stack-color-status-neutral-bg:#eef0f3;--stack-color-status-neutral-border:#cdd2d9;--stack-color-status-neutral-glyph:#6b7280;--stack-color-status-unknown-fg:#55468a;--stack-color-status-unknown-bg:#f1eef8;--stack-color-status-unknown-border:#cdc4e8;--stack-color-status-unknown-glyph:#7262ad;--stack-color-evidence-verified-fg:#0d5c4a;--stack-color-evidence-verified-bg:#e4f4ef;--stack-color-evidence-verified-border:#93d1c0;--stack-color-evidence-verified-glyph:#11806a;--stack-color-evidence-unverified-fg:#4b5260;--stack-color-evidence-unverified-bg:#eef0f3;--stack-color-evidence-unverified-border:#cdd2d9;--stack-color-evidence-unverified-glyph:#6b7280;--stack-color-notice-info-fg:#1f4fb8;--stack-color-notice-info-bg:#eaf0fd;--stack-color-notice-info-border:#b9cbf3;--stack-shadow-raised:0 1px 2px #1018280f;--stack-shadow-overlay:0 12px 32px #1018282e}@media (prefers-reduced-motion:reduce){:root{--stack-motion-duration-fast:0s;--stack-motion-duration-base:0s}}.stack-visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stack-status{align-items:baseline;gap:var(--stack-space-1);font:inherit;color:inherit;white-space:nowrap;display:inline-flex}.stack-status__glyph{font-size:.85em;line-height:1}.stack-status__detail{color:var(--stack-color-text-muted)}.stack-status__detail:before{content:"· "}.stack-status--positive .stack-status__glyph{color:var(--stack-color-status-positive-glyph)}.stack-status--progress .stack-status__glyph{color:var(--stack-color-status-progress-glyph)}.stack-status--attention .stack-status__glyph{color:var(--stack-color-status-attention-glyph)}.stack-status--critical .stack-status__glyph{color:var(--stack-color-status-critical-glyph)}.stack-status--neutral .stack-status__glyph{color:var(--stack-color-status-neutral-glyph)}.stack-status--unknown .stack-status__glyph{color:var(--stack-color-status-unknown-glyph)}.stack-verification{align-items:baseline;gap:var(--stack-space-1);padding:var(--stack-space-1) var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-evidence-unverified-border);border-radius:var(--stack-radius-md);background:var(--stack-color-evidence-unverified-bg);color:var(--stack-color-evidence-unverified-fg);font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);flex-wrap:wrap;display:inline-flex}.stack-verification--verified{border-color:var(--stack-color-evidence-verified-border);background:var(--stack-color-evidence-verified-bg);color:var(--stack-color-evidence-verified-fg)}.stack-verification--verification_failed{border-color:var(--stack-color-status-critical-border);background:var(--stack-color-status-critical-bg);color:var(--stack-color-status-critical-fg)}.stack-verification__label{font-weight:var(--stack-font-weight-medium)}.stack-verification__evidence{color:inherit;text-decoration:underline}.stack-verification__checks{margin:var(--stack-space-1) 0 0;padding-left:var(--stack-space-5);flex-basis:100%}.stack-freshness{align-items:baseline;gap:var(--stack-space-1);color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);display:inline-flex}.stack-freshness__glyph{font-size:.85em}.stack-freshness--live .stack-freshness__glyph{color:var(--stack-color-status-positive-glyph)}.stack-freshness--cached .stack-freshness__glyph{color:var(--stack-color-status-neutral-glyph)}.stack-freshness--stale{color:var(--stack-color-status-attention-fg)}.stack-freshness--stale .stack-freshness__glyph{color:var(--stack-color-status-attention-glyph)}.stack-freshness--unknown .stack-freshness__glyph{color:var(--stack-color-status-unknown-glyph)}.stack-unavailable,.stack-error,.stack-empty,.stack-loading{border-radius:var(--stack-radius-lg);padding:var(--stack-space-3) var(--stack-space-4);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line)}.stack-unavailable{border:var(--stack-border-width-thin) dashed var(--stack-color-border-strong);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted)}.stack-unavailable__title{color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line);font-weight:var(--stack-font-weight-semibold);margin:0}.stack-unavailable__reason{margin:var(--stack-space-1) 0 0}.stack-error{border:var(--stack-border-width-thin) solid var(--stack-color-status-critical-border);background:var(--stack-color-status-critical-bg);color:var(--stack-color-status-critical-fg)}.stack-error__title{font-weight:var(--stack-font-weight-semibold);margin:0}.stack-error__message,.stack-error__meta{margin:var(--stack-space-1) 0 0}.stack-error__meta code{font-family:var(--stack-font-family-mono);font-size:.92em}.stack-error__actions{gap:var(--stack-space-2);margin-top:var(--stack-space-3);display:flex}.stack-empty{border:var(--stack-border-width-thin) dashed var(--stack-color-border-default);color:var(--stack-color-text-muted);text-align:center;padding:var(--stack-space-6) var(--stack-space-4)}.stack-empty__title{color:var(--stack-color-text-default);font-size:var(--stack-text-lg-size);line-height:var(--stack-text-lg-line);font-weight:var(--stack-font-weight-semibold);margin:0}.stack-empty__body{margin:var(--stack-space-1) 0 0}.stack-empty__action{margin-top:var(--stack-space-3)}.stack-loading{align-items:center;gap:var(--stack-space-2);color:var(--stack-color-text-muted);padding-left:0;display:flex}.stack-loading__indicator{width:var(--stack-size-icon-sm);height:var(--stack-size-icon-sm);border:var(--stack-border-width-thick) solid var(--stack-color-border-default);border-top-color:var(--stack-color-status-progress-glyph);animation:stack-spin calc(var(--stack-motion-duration-base) * 4) linear infinite;border-radius:50%}@keyframes stack-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.stack-loading__indicator,.stack-button__busy{animation:none}}.stack-meta{gap:var(--stack-space-2);grid-template-columns:repeat(auto-fill,minmax(160px,1fr));margin:0;display:grid}.stack-meta__item{min-width:0;padding:var(--stack-space-3);border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-lg);background:var(--stack-color-bg-surface)}.stack-meta__label{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);line-height:var(--stack-text-xs-line);text-transform:uppercase;letter-spacing:.04em;font-weight:var(--stack-font-weight-medium)}.stack-meta__value{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line);overflow-wrap:anywhere}.stack-meta__value--mono{font-family:var(--stack-font-family-mono);font-size:var(--stack-text-sm-size)}.stack-meta__hint{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size)}.stack-identity{align-items:baseline;gap:var(--stack-space-2);min-width:0;display:inline-flex}.stack-identity__kind{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);text-transform:uppercase;letter-spacing:.04em}.stack-identity__name{font-weight:var(--stack-font-weight-semibold);color:inherit}a.stack-identity__name{color:var(--stack-color-text-link)}.stack-identity__id{font-family:var(--stack-font-family-mono);font-size:var(--stack-text-sm-size);padding:0 var(--stack-space-1);border-radius:var(--stack-radius-sm);background:var(--stack-color-bg-code);color:var(--stack-color-text-default)}.stack-page-header{margin:0 0 var(--stack-space-4)}.stack-page-header__eyebrow{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--stack-font-weight-semibold);margin:0}.stack-page-header__title-row{align-items:center;gap:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-page-header__title{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-default);font-size:var(--stack-text-2xl-size);line-height:var(--stack-text-2xl-line);font-weight:var(--stack-font-weight-semibold)}.stack-page-header__actions{gap:var(--stack-space-2);margin-left:auto;display:flex}.stack-page-header__description{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-muted);max-width:72ch}.stack-page-header__meta{margin-top:var(--stack-space-2)}.stack-button{justify-content:center;align-items:center;gap:var(--stack-space-2);min-height:var(--stack-size-control-md);padding:0 var(--stack-space-3);border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-md);background:var(--stack-color-action-secondary-bg);color:var(--stack-color-action-secondary-fg);font:inherit;font-size:var(--stack-text-md-size);font-weight:var(--stack-font-weight-medium);cursor:pointer;transition:background-color var(--stack-motion-duration-fast) var(--stack-motion-ease-standard);display:inline-flex}.stack-button:hover:not(:disabled){background:var(--stack-color-action-secondary-bg-hover)}.stack-button:active:not(:disabled){background:var(--stack-color-action-secondary-bg-active)}.stack-button--primary{background:var(--stack-color-action-primary-bg);color:var(--stack-color-action-primary-fg);border-color:#0000}.stack-button--primary:hover:not(:disabled){background:var(--stack-color-action-primary-bg-hover)}.stack-button--primary:active:not(:disabled){background:var(--stack-color-action-primary-bg-active)}.stack-button--danger{background:var(--stack-color-action-danger-bg);color:var(--stack-color-action-danger-fg);border-color:#0000}.stack-button--danger:hover:not(:disabled){background:var(--stack-color-action-danger-bg-hover)}.stack-button--danger:active:not(:disabled){background:var(--stack-color-action-danger-bg-active)}.stack-button--ghost{background:0 0;border-color:#0000}.stack-button--sm{min-height:var(--stack-size-control-sm);padding:0 var(--stack-space-2);font-size:var(--stack-text-sm-size)}.stack-button--lg{min-height:var(--stack-size-control-lg);padding:0 var(--stack-space-4)}.stack-button:disabled{opacity:.55;cursor:not-allowed}.stack-button[aria-busy=true]{opacity:.8;cursor:progress}.stack-button__busy{width:var(--stack-size-icon-sm);height:var(--stack-size-icon-sm);border:var(--stack-border-width-thick) solid currentColor;animation:stack-spin calc(var(--stack-motion-duration-base) * 4) linear infinite;border-right-color:#0000;border-radius:50%}.stack-button:focus-visible,.stack-identity__name:focus-visible,.stack-verification__evidence:focus-visible{outline:var(--stack-focus-ring-width) solid var(--stack-focus-ring-color);outline-offset:var(--stack-focus-ring-offset)}.stack-breadcrumbs{font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);color:var(--stack-color-text-muted)}.stack-breadcrumbs__list{align-items:baseline;gap:var(--stack-space-1);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.stack-breadcrumbs__item{align-items:baseline;gap:var(--stack-space-1);min-width:0;display:inline-flex}.stack-breadcrumbs__separator{color:var(--stack-color-text-subtle)}.stack-breadcrumbs__link{color:var(--stack-color-text-link);text-decoration:none}.stack-breadcrumbs__link:hover{text-decoration:underline}.stack-breadcrumbs__current{color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-medium);overflow-wrap:anywhere}.stack-tabs{gap:var(--stack-space-1);border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);display:flex;overflow-x:auto}.stack-tabs__tab{align-items:center;gap:var(--stack-space-2);min-height:var(--stack-size-control-md);padding:0 var(--stack-space-3);border:0;border-bottom:var(--stack-border-width-thick) solid transparent;color:var(--stack-color-text-muted);font:inherit;font-size:var(--stack-text-md-size);font-weight:var(--stack-font-weight-medium);white-space:nowrap;cursor:pointer;background:0 0;margin-bottom:-1px;display:inline-flex}.stack-tabs__tab:hover:not(:disabled){color:var(--stack-color-text-default)}.stack-tabs__tab[aria-selected=true]{color:var(--stack-color-text-default);border-bottom-color:var(--stack-color-action-primary-bg)}.stack-tabs__tab:disabled{opacity:.55;cursor:not-allowed}.stack-tabs__badge{padding:0 var(--stack-space-2);border-radius:var(--stack-radius-pill);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size)}.stack-tabpanel{padding-top:var(--stack-space-4)}.stack-table{border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-lg);background:var(--stack-color-bg-surface);overflow-x:auto}.stack-table[aria-busy=true]{box-shadow:inset 0 var(--stack-border-width-thick) 0 var(--stack-color-status-progress-glyph)}.stack-table__table{border-collapse:collapse;width:100%;font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line)}.stack-table__caption{padding:var(--stack-space-3) var(--stack-space-4);text-align:left;color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-semibold)}.stack-table__header{padding:var(--stack-space-2) var(--stack-space-4);text-align:left;white-space:nowrap;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold);letter-spacing:.04em;text-transform:uppercase}.stack-table__sort{align-items:center;gap:var(--stack-space-1);color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer;background:0 0;border:0;padding:0;display:inline-flex}.stack-table__sort-indicator{color:var(--stack-color-text-subtle)}.stack-table__cell{padding:var(--stack-space-2) var(--stack-space-4);vertical-align:top;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-subtle);color:var(--stack-color-text-default)}.stack-table__row:last-child .stack-table__cell{border-bottom:0}.stack-table__cell--end{text-align:right}.stack-table__cell[data-missing=true]{color:var(--stack-color-text-subtle)}.stack-table__row--selectable{cursor:pointer}.stack-table__row--selectable:hover{background:var(--stack-color-bg-sunken)}.stack-table__row--selected{background:var(--stack-color-status-progress-bg)}.stack-filter{margin:0 0 var(--stack-space-3)}.stack-filter__controls{align-items:flex-end;gap:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-filter__field{gap:var(--stack-space-1);flex-direction:column;min-width:0;display:flex}.stack-filter__label{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold)}.stack-filter__control{min-height:var(--stack-size-control-md);max-width:100%;padding:0 var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-border-strong);border-radius:var(--stack-radius-md);background:var(--stack-color-bg-surface);color:var(--stack-color-text-default);font:inherit;font-size:var(--stack-text-md-size)}.stack-filter__actions{gap:var(--stack-space-2);display:flex}.stack-filter__result{margin:var(--stack-space-2) 0 0;min-height:var(--stack-text-sm-line);color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size)}.stack-pagination{justify-content:space-between;align-items:center;gap:var(--stack-space-3);margin-top:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-pagination__summary{color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size);margin:0}.stack-pagination__actions{gap:var(--stack-space-2);margin-left:auto;display:flex}.stack-shell{background:var(--stack-color-bg-canvas);min-height:100vh;color:var(--stack-color-text-default);font-family:var(--stack-font-family-sans);flex-direction:column;display:flex}.stack-shell__skip{left:var(--stack-space-2);z-index:var(--stack-z-toast);padding:var(--stack-space-2) var(--stack-space-3);border-radius:var(--stack-radius-md);background:var(--stack-color-action-primary-bg);color:var(--stack-color-action-primary-fg);position:absolute;top:-100px}.stack-shell__skip:focus{top:var(--stack-space-2)}.stack-shell__bar{align-items:center;gap:var(--stack-space-3);min-height:52px;padding:var(--stack-space-2) var(--stack-space-4);border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-surface);flex-wrap:wrap;display:flex}.stack-shell__product{align-items:center;gap:var(--stack-space-2);color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-semibold);letter-spacing:.02em;text-decoration:none;display:inline-flex}.stack-shell__mark{border-radius:var(--stack-radius-md);background:var(--stack-color-action-primary-bg);width:24px;height:24px;color:var(--stack-color-action-primary-fg);font-size:var(--stack-text-xs-size);place-items:center;display:inline-grid}.stack-shell__context,.stack-shell__search{align-items:center;min-width:0;display:flex}.stack-shell__search{flex:200px;max-width:420px}.stack-shell__end{align-items:center;gap:var(--stack-space-3);flex-wrap:wrap;min-width:0;margin-left:auto;display:flex}.stack-shell__theme{min-height:var(--stack-size-control-sm);padding:0 var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-border-strong);border-radius:var(--stack-radius-md);background:var(--stack-color-bg-surface);color:var(--stack-color-text-default);font:inherit;font-size:var(--stack-text-sm-size)}.stack-shell__account{align-items:center;gap:var(--stack-space-2);min-width:0;display:flex}.stack-shell__body{flex:1;grid-template-columns:220px minmax(0,1fr);min-height:0;display:grid}.stack-shell__nav{padding:var(--stack-space-4) var(--stack-space-3);border-right:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-surface);overflow-y:auto}.stack-shell__nav-group+.stack-shell__nav-group{margin-top:var(--stack-space-4)}.stack-shell__nav-heading{margin:0 0 var(--stack-space-1);padding:0 var(--stack-space-2);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold);letter-spacing:.06em;text-transform:uppercase}.stack-shell__nav-list{margin:0;padding:0;list-style:none}.stack-shell__nav-item{padding:var(--stack-space-2);border-radius:var(--stack-radius-md);color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);text-decoration:none;display:block}.stack-shell__nav-item:hover{background:var(--stack-color-bg-sunken)}.stack-shell__nav-item[aria-current=page]{background:var(--stack-color-status-progress-bg);color:var(--stack-color-status-progress-fg);font-weight:var(--stack-font-weight-semibold)}.stack-shell__main{box-sizing:border-box;width:100%;min-width:0;padding:var(--stack-space-6)}.stack-shell__main:focus{outline:none}@media (width<=767px){.stack-shell__body{grid-template-columns:minmax(0,1fr)}.stack-shell__nav{gap:var(--stack-space-3);padding:var(--stack-space-2) var(--stack-space-3);border-right:0;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);display:flex;overflow-x:auto}.stack-shell__nav-group+.stack-shell__nav-group{margin-top:0}.stack-shell__nav-heading{display:none}.stack-shell__nav-list{gap:var(--stack-space-1);display:flex}.stack-shell__nav-item{white-space:nowrap}.stack-shell__main{padding:var(--stack-space-4)}}.stack-tabs__tab:focus-visible,.stack-table__sort:focus-visible,.stack-table:focus-visible,.stack-table__row--selectable:focus-visible,.stack-filter__control:focus-visible,.stack-shell__theme:focus-visible,.stack-shell__nav-item:focus-visible,.stack-shell__product:focus-visible,.stack-breadcrumbs__link:focus-visible,.stack-shell__skip:focus-visible,.stack-tabpanel:focus-visible{outline:var(--stack-focus-ring-width) solid var(--stack-focus-ring-color);outline-offset:var(--stack-focus-ring-offset)}.application-designer{--ink:#17211b;--muted:#68756d;--line:#dce4de;--paper:#fbfcf9;min-height:100%;color:var(--ink)}.designer-header{justify-content:space-between;align-items:flex-end;gap:24px;padding:8px 4px 22px;display:flex}.designer-header h1{letter-spacing:-.03em;font-family:Georgia,serif;font-size:34px}.designer-header p{color:var(--muted);margin-top:5px}.eyebrow{color:#287052;letter-spacing:.18em;text-transform:uppercase;font-size:10px;font-weight:800}.designer-actions{flex-wrap:wrap;gap:8px;display:flex}.btn-ghost{color:#33443a;border:1px solid var(--line);background:#fff}.designer-actions .btn-primary{background:#1f684c}.cloud-publisher{background:#fff;border:1px solid #cbdad0;border-radius:10px;gap:14px;margin-bottom:12px;padding:18px;display:grid;box-shadow:0 10px 28px #26372d1a}.cloud-publisher-heading{justify-content:space-between;gap:18px;display:flex}.cloud-publisher-heading h2{margin-top:3px;font:600 20px/1.2 Georgia,serif}.cloud-publisher-heading p{color:var(--muted);margin-top:4px;font-size:12px}.cloud-publisher-heading>button{color:#718078;cursor:pointer;background:0 0;border:0;align-self:flex-start;font-size:22px}.cloud-fields{grid-template-columns:1.4fr .7fr 1fr;gap:10px;display:grid}.cloud-fields label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cloud-fields input{color:#20342a;background:#f9fbf9;border:1px solid #cbd8cf;border-radius:6px;outline:0;width:100%;padding:9px 10px;font-size:12px}.cloud-fields input:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.cloud-destructive{color:#8b4d22;align-items:center;gap:7px;font-size:11px;display:flex}.cloud-destructive input{accent-color:#a55d2b}.local-destructive{color:#8b4d22;background:#fff7ed;border:1px solid #f0d7bb;border-radius:7px;align-items:center;gap:7px;margin-bottom:12px;padding:9px 12px;font-size:11px;display:flex}.local-destructive input{accent-color:#a55d2b}.cloud-error{color:#9b2c2c;background:#fff0f0;border:1px solid #f1caca;border-radius:6px;padding:8px 10px;font-size:11px}.cloud-actions{justify-content:flex-end;gap:8px;display:flex}.cloud-actions .btn:disabled{cursor:wait;opacity:.65}.designer-status{color:#286046;background:#eaf5ee;border:1px solid #cce5d5;border-radius:8px;justify-content:space-between;margin-bottom:12px;padding:9px 13px;font-size:12px;display:flex}.designer-status.error{color:#9b2c2c;background:#fff0f0;border-color:#f1caca}.designer-grid{background:var(--paper);border:1px solid var(--line);border-radius:12px;grid-template-columns:190px minmax(420px,1fr) minmax(340px,.8fr);height:calc(100vh - 150px);min-height:620px;display:grid;overflow:hidden;box-shadow:0 12px 40px #26372d14}.model-tree,.model-canvas,.dsl-panel{min-width:0}.model-tree{border-right:1px solid var(--line);background:#f2f5f0;padding:14px;overflow:auto}.panel-title{color:#34463b;letter-spacing:.04em;text-transform:uppercase;border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;min-height:38px;font-size:12px;font-weight:800;display:flex}.panel-title button{color:#286046;cursor:pointer;background:#dce9df;border:0;border-radius:6px;width:25px;height:25px}.model-tree section{margin-top:16px}.model-tree section h3{color:var(--stack-color-text-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 7px 6px;font-size:10px}.tree-item,.tree-empty{border-radius:6px;padding:6px 8px;font-size:12px}.tree-item{color:#27372e;background:#ffffffb3;margin-bottom:3px}.tree-empty{color:#9aa39d;font-style:italic}.collection-editor{background:#fff;border:1px solid #d3ded6;border-radius:7px;gap:7px;margin-top:10px;padding:9px;display:grid}.collection-editor label{color:#65736a;letter-spacing:.06em;text-transform:uppercase;gap:4px;font-size:9px;font-weight:800;display:grid}.collection-editor input{color:#20342a;border:1px solid #cbd8cf;border-radius:5px;outline:0;width:100%;min-width:0;padding:7px 8px;font-size:11px}.collection-editor input:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.collection-editor>div:last-child{justify-content:flex-end;gap:4px;display:flex}.collection-editor button{color:#526158;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:4px 7px;font-size:10px}.collection-editor .collection-save{color:#fff;background:#287052}.model-canvas{background-color:#f8faf6;background-image:radial-gradient(#d8e0da 1px,#0000 1px);background-size:18px 18px;flex-direction:column;padding:14px;display:flex;overflow:hidden}.graph-legend{color:#859189;text-transform:none;letter-spacing:0;font-weight:500}.graph-board{flex:1;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:16px;padding:22px 8px;display:grid;overflow:auto}.model-node{background:#fff;border:1px solid #cfdbd2;border-top:3px solid #327258;border-radius:9px;padding:14px;position:relative;box-shadow:0 5px 14px #273d3014}.model-node.workflow-node{border-top-color:#9b6a2f}.model-node.agent-node{border-top-color:#70539b}.node-kind{color:#849087;letter-spacing:.14em;text-transform:uppercase;font-size:9px;font-weight:800}.model-node h3{margin:3px 0 10px;font-family:Georgia,serif;font-size:18px}.node-field,.node-step{border-top:1px solid #eef1ee;justify-content:space-between;gap:8px;padding:5px 0;font-size:11px;display:flex}.node-field code{color:#527060;font-size:10px}.node-step{color:#59675f;display:block}.node-add{color:#357257;cursor:pointer;background:#f0f7f2;border:1px dashed #b9d2c1;border-radius:5px;margin-top:9px;padding:4px 7px;font-size:10px}.field-editor{background:#f5f8f5;border:1px solid #d7e2da;border-radius:7px;gap:9px;margin-top:10px;padding:11px;display:grid}.field-editor label{color:#65736a;letter-spacing:.06em;text-transform:uppercase;gap:4px;font-size:9px;font-weight:700;display:grid}.field-editor input[type=text],.field-editor input:not([type]),.field-editor select{color:#20342a;background:#fff;border:1px solid #cbd8cf;border-radius:5px;outline:0;width:100%;min-width:0;padding:7px 8px;font:11px/1.2 inherit}.field-editor input:focus,.field-editor select:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.field-editor-row{grid-template-columns:1fr 1fr;gap:7px;display:grid}.field-editor .field-optional{color:#43564a;letter-spacing:0;text-transform:none;align-items:center;gap:6px;font-size:10px;font-weight:500;display:flex}.field-optional input{accent-color:#287052}.field-error{color:#a13d3d;font-size:10px}.field-editor-actions{justify-content:flex-end;gap:6px;display:flex}.field-editor-actions button{color:#526158;cursor:pointer;background:0 0;border:0;border-radius:5px;padding:5px 8px;font-size:10px}.field-editor-actions .field-save{color:#fff;background:#287052}.change-strip{border-top:1px solid var(--line);white-space:nowrap;background:#ffffffeb;align-items:center;gap:12px;min-height:42px;padding:7px 10px;font-size:10px;display:flex;overflow:auto}.change-strip .added{color:#24714f}.change-strip .changed{color:#94611e}.change-strip .removed{color:#a13d3d}.dsl-panel{color:#d9e4dc;background:#17211b;border-left:1px solid #0c1510;flex-direction:column;padding:14px;display:flex}.dsl-panel .panel-title{color:#aebdb3;border-color:#344139}.dsl-panel .panel-title span:last-child{color:#6f8276;text-transform:none;font-weight:500}.dsl-panel textarea{resize:none;color:#d9e4dc;tab-size:2;background:0 0;border:0;outline:0;flex:1;width:100%;padding:15px 2px;font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,monospace}.diagnostics{border-top:1px solid #344139;max-height:120px;padding-top:8px;font:10px/1.5 ui-monospace,monospace;overflow:auto}.diagnostics .error{color:#ff9f9f}.diagnostics .warning{color:#f3d18a}@media (width<=1100px){.designer-grid{grid-template-columns:160px 1fr;height:auto}.dsl-panel{grid-column:1/-1;height:480px}.designer-header{flex-direction:column;align-items:flex-start}.cloud-fields{grid-template-columns:1fr}}.studio-content{min-width:0}.instance-info{border:1px solid var(--stack-color-border-default);color:var(--stack-color-text-muted);border-radius:999px;padding:2px 10px;font-size:12px}.runtime-notice{color:#65551d;background:#fff9df;border:1px solid #d8c98d;border-radius:8px;max-width:1280px;margin:0 auto 20px;padding:12px 16px;font-size:13px;line-height:1.45}.search-input{border:1px solid #ddd;border-radius:4px;width:100%;padding:10px;font-size:14px}.filter-select{cursor:pointer;background:#fff;border:1px solid #ddd;border-radius:4px;padding:8px;font-size:14px}.btn{cursor:pointer;border:none;border-radius:4px;padding:10px 15px;font-size:14px;font-weight:500;transition:all .2s}.btn-primary{color:#fff;background:#0062cc}.btn-primary:hover{background:#0056b3}.overview-dashboard{background:#fff;border-radius:8px;padding:30px;box-shadow:0 1px 3px #0000001a}.dashboard-header{border-bottom:1px solid #e0e0e0;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;display:flex}.dashboard-header h1{margin:0;font-size:28px}.namespace-badge{color:#fff;background:#007bff;border-radius:20px;padding:5px 15px;font-size:12px;font-weight:600}.dashboard-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;display:grid}.stat-card{text-align:center;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;padding:15px}.stat-card label{color:#666;margin-bottom:8px;font-size:12px;font-weight:600;display:block}.stat-card .status-indicator{margin-right:5px;font-size:20px}.stat-card .status-indicator.healthy{color:#28a745}.stat-card .status-indicator.degraded{color:#ffc107}.stat-card .status-indicator.unhealthy{color:#dc3545}.stat-number{color:#007bff;font-size:24px;font-weight:700;display:block}.explorer-placeholder,.capabilities-placeholder,.executions-placeholder,.provenance-placeholder,.peer-placeholder,.empty-message,.placeholder-text{text-align:center;color:#999;background:#f9f9f9;border:2px dashed #ddd;border-radius:6px;margin-top:20px;padding:40px}.placeholder-text{border:none;padding:20px}.peer-list{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:15px;margin-top:20px;display:grid}.peer-item{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;align-items:center;gap:10px;padding:15px;display:flex}.peer-status{font-size:12px}.peer-status.online{color:#28a745}.peer-name{font-weight:500}.health-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin-top:20px;display:grid}.health-item{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;align-items:center;gap:10px;padding:15px;display:flex}.health-item.status-healthy{background:#f8f9fa;border-color:#d4edda}.health-item.status-warning{background:#fffbf0;border-color:#fff3cd}.health-item.status-error{background:#fff5f5;border-color:#f8d7da}.status-icon{font-size:16px;font-weight:700}.health-item.status-healthy .status-icon{color:#28a745}.health-item.status-warning .status-icon{color:#ffc107}.health-item.status-error .status-icon{color:#dc3545}.component-name{font-weight:500}.reference-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.search-box{margin-bottom:20px}.reference-details{margin-top:20px}.detail-row{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:10px 0;display:flex}.detail-row label{color:#666;font-weight:600}.detail-row span{color:#333}.status-materialized{color:#28a745;font-weight:500}.operations-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.filter-controls{margin-bottom:20px}.operations-table{border-collapse:collapse;width:100%;margin-top:20px}.operations-table th{text-align:left;background:#f5f5f5;border-bottom:2px solid #ddd;padding:10px;font-weight:600}.operations-table td{border-bottom:1px solid #f0f0f0;padding:10px}.conflict-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.conflict-summary{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin-top:20px;display:grid}.summary-stat{text-align:center;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;padding:15px}.summary-stat label{color:#666;margin-bottom:8px;font-size:12px;font-weight:600;display:block}.workflow-visualizer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.workflow-controls{margin-bottom:20px}.workflows-list,.workflow-detail{margin-top:20px}.agent-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.agents-grid,.agent-detail{margin-top:20px}.provenance-viewer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.provenance-content{margin-top:20px}.settings-panel{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.settings-tabs{border-bottom:1px solid #e0e0e0;gap:10px;margin:20px 0;display:flex}.tab{cursor:pointer;color:#666;background:0 0;border:none;border-bottom:3px solid #0000;padding:10px 15px;font-weight:500;transition:all .2s}.tab.active{color:#007bff;border-bottom-color:#007bff}.settings-content{margin-top:20px}.keys-list,.connection-info{margin:20px 0}.info-row{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:10px 0;display:flex}.info-row label{color:#666;font-weight:600}.monospace{font-family:Monaco,Courier New,monospace;font-size:12px}.global-search{position:relative}.search-input.global{margin-bottom:10px}.search-results{z-index:1000;background:#fff;border:1px solid #ddd;border-radius:4px;max-height:400px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 2px 8px #0000001a}.results-group{border-bottom:1px solid #f0f0f0;padding:10px}.results-group h4{color:#666;text-transform:uppercase;margin:0 0 8px;font-size:12px;font-weight:600}.results-group .empty-message{color:#999;background:0 0;border:none;padding:5px 0;font-size:12px}.studio-model-page{color:#19251f;max-width:1280px;margin:0 auto}.studio-model-page>header{margin-bottom:22px}.studio-model-page>header h1{margin:4px 0 6px;font-family:Georgia,serif;font-size:36px}.studio-model-page>header p{color:#68776f;margin:0}.eyebrow,.card-kind{color:#217052;letter-spacing:.18em;text-transform:uppercase;font-size:10px;font-weight:800}.model-summary{flex-wrap:wrap;gap:10px;margin:0 0 18px;display:flex}.model-summary>span,.model-summary select{color:#426052;background:#f8fbf9;border:1px solid #d6e1da;border-radius:999px;padding:7px 12px;font-size:12px}.studio-card-grid,.state-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;display:grid}.studio-card{background:#fff;border:1px solid #d7e0da;border-radius:12px;padding:18px;box-shadow:0 6px 22px #1937280d}.studio-card h2{margin:6px 0 14px;font-family:Georgia,serif;font-size:22px}.model-empty{color:#75847c;text-align:center;background:#fafcfb;border:1px dashed #cbd8d0;border-radius:10px;grid-column:1/-1;padding:34px}.model-empty.compact{padding:20px 10px}.state-collection>header{justify-content:space-between;align-items:center;display:flex}.studio-data-bridge{opacity:0;pointer-events:none;border:0;width:1px;height:1px;position:absolute}.state-collection>header h2{margin-bottom:8px}.state-collection>header strong{color:#237154;font:30px Georgia,serif}.state-row{text-align:left;color:#26372f;cursor:pointer;background:0 0;border:0;border-top:1px solid #e8edea;grid-template-columns:1fr auto;gap:8px;width:100%;padding:12px 2px;display:grid}.state-row span:first-child{flex-direction:column;gap:3px;display:flex}.state-row small{color:#859189}.state-row pre{color:#dcebe2;background:#13231b;border-radius:8px;grid-column:1/-1;margin:4px 0 0;padding:12px;overflow:auto}.application-context{background:#d7e0da;border:1px solid #d7e0da;border-radius:12px;grid-template-columns:repeat(5,minmax(120px,1fr));gap:1px;margin-bottom:18px;display:grid;overflow:hidden}.application-context>span{background:#fff;flex-direction:column;gap:4px;min-width:0;padding:13px 15px;display:flex}.application-context small{color:#728078;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:800}.application-context strong,.application-context code{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.data-layout{grid-template-columns:220px minmax(0,1fr);gap:16px;display:grid}.data-layout>aside{flex-direction:column;align-self:start;gap:4px;display:flex}.data-layout>aside .card-kind{margin-bottom:8px}.data-layout>aside button{color:#31483d;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:9px 10px}.data-layout>aside button:hover,.data-layout>aside button.active{color:#176443;background:#e5f3eb;font-weight:700}.data-browser>header{justify-content:space-between;align-items:end;gap:16px;margin-bottom:12px;display:flex}.data-browser h2{margin:4px 0 0;font:28px Georgia,serif}.data-error button,.data-pagination button{background:#fff;border:1px solid #cad7cf;border-radius:7px;min-height:36px;padding:7px 10px}.data-error button{color:#fff;cursor:pointer;background:#1f7152}.data-browser table{border-collapse:collapse}.data-browser th,.data-browser td{overflow-wrap:anywhere;text-align:left;vertical-align:top;border-bottom:1px solid #e5ebe7;max-width:300px;padding:11px 13px}.data-browser th small{color:var(--stack-color-text-muted);margin-top:3px;font-weight:400;display:block}.data-browser tbody tr{cursor:pointer}.data-browser tbody tr:hover{background:#f4faf6}.data-browser details pre,.data-detail pre{white-space:pre-wrap;max-height:220px;overflow:auto}.record-link,.reference-value{color:#176b4b;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-weight:650}.data-null{color:#929e97}.data-boolean{background:#edf1ef;border-radius:999px;padding:2px 6px}.data-boolean.true{color:#176443;background:#dff4e9}.secret-state{color:#6d547c;font-weight:700}.data-pagination{justify-content:flex-end;align-items:center;gap:8px;padding:12px 0;display:flex}.data-pagination span{color:#74817a;margin-right:auto}.data-pagination button:not(:disabled){cursor:pointer}.data-error{color:#793b27;background:#fff1e8;border-radius:8px;justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;padding:11px 13px;display:flex}.data-detail{margin-top:10px}.data-detail>header{justify-content:space-between;display:flex}.data-close{color:#64766c;cursor:pointer;background:0 0;border:0;font-size:26px}.data-detail dl{grid-template-columns:minmax(140px,.3fr) 1fr;gap:0;display:grid}.data-detail dt,.data-detail dd{border-top:1px solid #e8edea;margin:0;padding:10px 5px}.data-detail dt{flex-direction:column;font-weight:700;display:flex}.data-detail dt small{color:#839088;font-size:10px;font-weight:400}.reverse-relationship{background:#f7faf8;border-radius:8px;margin-top:14px;padding:12px}.reverse-relationship h3,.reverse-relationship p{margin:0 0 7px}.reverse-relationship .reference-value{margin-top:7px;display:block}.table-shell{background:#fff;border:1px solid #d7e0da;border-radius:12px;overflow:auto}.table-shell table{width:100%;margin:0}.event-pill{text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:800;display:inline-block}.event-pill.put{color:#176443;background:#dff4e9}.event-pill.delete{color:#963e2c;background:#fbe4df}.reference-query{gap:8px;margin-bottom:18px;display:flex}.reference-query input{border:1px solid #cad7cf;border-radius:8px;flex:1;padding:12px 14px;font-family:monospace}.reference-query button{color:#fff;cursor:pointer;background:#1f7152;border:0;border-radius:8px;padding:0 20px;font-weight:700}.reference-layout{grid-template-columns:minmax(220px,.35fr) 1fr;gap:16px;display:grid}.reference-example{cursor:pointer;background:0 0;border:0;border-top:1px solid #e8edea;justify-content:space-between;width:100%;padding:12px 0;display:flex}.reference-example small{color:#829087}.reference-result pre,.execution-row pre{color:#dcebe2;background:#14231c;border-radius:8px;padding:14px;overflow:auto}.execution-list{gap:10px;margin-bottom:20px;display:grid}.execution-row{background:#fff;border:1px solid #d8e1db;border-radius:10px;grid-template-columns:1fr auto;gap:10px;padding:14px;display:grid}.execution-row>div{flex-direction:column;display:flex}.execution-row small{color:#829087}.execution-row pre{grid-column:1/-1;max-height:180px;margin:0}.execution-empty{margin-top:14px}.provenance-nodes{flex-wrap:wrap;gap:10px;display:flex}.provenance-nodes>div,.provenance-event{border:1px solid #d8e1db;border-radius:8px;flex-direction:column;gap:3px;padding:12px;display:flex}.provenance-nodes small,.provenance-event small{color:#849087}.provenance-event{grid-template-columns:45px 1fr 1fr auto;margin-top:8px;display:grid}.peer-topology{align-items:center;gap:10px;padding:30px 4px;display:flex;overflow:auto}.peer-node{background:#fff;border:1px solid #cad8cf;border-radius:12px;min-width:230px;padding:18px}.peer-node.local{color:#eef7f2;background:#183429}.peer-node span,.peer-node small{opacity:.7;font-size:11px}.peer-node h2{margin:6px 0;font-size:15px}.peer-link{background:#81a893;width:45px;height:2px}.metric-grid{grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:18px;display:grid}.metric-grid article{color:#fff;background:#183429;border-radius:10px;flex-direction:column;padding:18px;display:flex}.metric-grid b{font:32px Georgia,serif}.metric-grid span{opacity:.7;text-transform:uppercase;letter-spacing:.12em;font-size:10px}.health-item{align-items:center;gap:12px;display:flex}.health-item div{flex-direction:column;gap:3px;display:flex}.health-item small{color:#78857e}.health-issue{background:#fff2dc;border-radius:8px;margin:10px 0;padding:12px}.search-result{border-top:1px solid #edf0ee;grid-template-columns:1fr auto;gap:2px 8px;padding:8px 0;display:grid}.search-result span{color:#287254;text-transform:uppercase;font-size:10px}.search-result small{color:#829087;text-overflow:ellipsis;white-space:nowrap;grid-column:1/-1;overflow:hidden}@media (width<=800px){.reference-layout,.data-layout{grid-template-columns:1fr}.application-context{grid-template-columns:1fr 1fr}.data-browser>header{flex-direction:column;align-items:stretch}.metric-grid{grid-template-columns:1fr}.provenance-event{grid-template-columns:35px 1fr}.provenance-event code,.provenance-event small{grid-column:2}}.ask-feltdb{color:#1d3127;background:linear-gradient(135deg,#f7fbf8,#eef7f2);border:1px solid #cbdad1;border-radius:12px;margin:0 0 18px;padding:18px}.ask-feltdb h2{margin:4px 0;font:26px Georgia,serif}.ask-feltdb p{color:#607268;margin:5px 0 12px}.ask-feltdb textarea{box-sizing:border-box;resize:vertical;background:#fff;border:1px solid #b9cfc2;border-radius:8px;width:100%;min-height:76px;margin:8px 0;padding:12px}.ask-feltdb progress{width:100%}.ai-unavailable,.ai-status,.proposal-boundary{font-size:12px}.proposal-review{border-top:1px solid #cbdad1;margin-top:14px;padding-top:14px}.proposal-review h3{margin:0 0 8px}.proposal-review li{margin:4px 0;font-family:monospace}.proposal-review pre{color:#dcebe2;white-space:pre-wrap;background:#14231c;border-radius:8px;max-height:360px;padding:12px;overflow:auto}.proposal-warning{color:#714c08;background:#fff1d7;border-radius:7px;margin:8px 0;padding:10px}.authorization-approval{color:#77301f;background:#fff5f1;border:2px solid #b65439;border-radius:8px;gap:9px;margin:10px 0;padding:12px;display:flex}.proposal-app-preview{background:#fff;border:1px solid #bfd2c6;border-radius:9px;margin:12px 0;padding:12px}.proposal-app-preview nav{border-bottom:1px solid #e1e9e4;flex-wrap:wrap;gap:6px;padding-bottom:10px;display:flex}.proposal-app-preview nav span{color:#1f6549;background:#e5f3eb;border-radius:999px;padding:4px 8px;font-size:11px}.proposal-app-preview section{border-bottom:1px solid #edf1ee;justify-content:space-between;gap:12px;padding:9px 2px;display:flex}.proposal-app-preview small{color:#718079;text-align:right}.proposal-browser>header{margin-bottom:18px}.proposal-browser>header h1{margin:4px 0;font:36px Georgia,serif}.proposal-browser-layout{grid-template-columns:minmax(280px,.7fr) minmax(360px,1.3fr);gap:16px;display:grid}.proposal-list-row{text-align:left;cursor:pointer;background:0 0;border:0;border-top:1px solid #e4ebe7;justify-content:space-between;gap:12px;width:100%;padding:12px 2px;display:flex}.proposal-list-row span{flex-direction:column;gap:3px;display:flex}.proposal-list-row small{color:#7c8982}.proposal-list-row b{color:#267052;text-transform:uppercase;font-size:10px}.proposal-detail pre{color:#dcebe2;white-space:pre-wrap;background:#14231c;border-radius:8px;padding:12px;overflow:auto}.proposal-actions{gap:8px;margin:14px 0;display:flex}.proposal-preview{background:#fffaf0;border:2px solid #c28c28;border-radius:10px;margin-top:14px;padding:16px}.preview-banner{color:#fff;background:#704d0c;margin:-16px -16px 16px;padding:12px 16px}.record-inspector{text-align:left;background:#f7faf8;border-radius:8px;grid-column:1/-1;padding:14px}.record-inspector dl{grid-template-columns:minmax(110px,.35fr) 1fr;gap:7px 12px;display:grid}.record-inspector dt{color:#607268;font-weight:700}.record-inspector dd{overflow-wrap:anywhere;margin:0}.record-inspector pre{max-height:260px}@media (width<=800px){.proposal-browser-layout{grid-template-columns:1fr}}.proposal-workspace{color:#19251f;max-width:1400px;margin:0 auto}.proposal-workspace>header h1{margin:4px 0;font:36px Georgia,serif}.proposal-workspace>header p{color:#68776f;margin:0 0 18px}.proposal-workspace-layout{grid-template-columns:minmax(300px,.7fr) minmax(500px,1.5fr);gap:16px;display:grid}.proposal-workspace-layout>aside{align-self:start}.proposal-workspace-layout>aside>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.proposal-workspace-layout>aside select{background:#fff;border:1px solid #cad7cf;border-radius:7px;padding:7px}.proposal-list-row.active{background:#e8f4ed;border-radius:7px;width:calc(100% + 16px);margin:0 -8px;padding-left:8px;padding-right:8px}.proposal-detail>header{border-bottom:1px solid #e4ebe7;grid-template-columns:1fr auto;gap:20px;padding-bottom:14px;display:grid}.proposal-detail>header h2{margin:8px 0}.proposal-detail>header dl{grid-template-columns:auto 1fr;gap:5px 10px;margin:0;font-size:12px;display:grid}.proposal-detail>header dt{color:#78867e}.proposal-detail>header dd{text-overflow:ellipsis;white-space:nowrap;max-width:220px;margin:0;overflow:hidden}.proposal-status{color:#355247;letter-spacing:.1em;text-transform:uppercase;background:#e7ece9;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:900;display:inline-block}.proposal-status.previewed,.proposal-status.approved{color:#176443;background:#dff4e9}.proposal-status.rejected,.proposal-status.expired{color:#963e2c;background:#fbe4df}.semantic-diff{color:#e3eee8;background:#14231c;border-radius:10px;margin:18px 0;padding:16px}.semantic-diff>h3{margin-top:0;font:18px Georgia,serif}.semantic-section{margin:13px 0}.semantic-section h4{color:#76d2a7;letter-spacing:.13em;text-transform:uppercase;margin:0 0 5px;font-size:10px}.semantic-section div{margin:3px 0;font-family:monospace;font-size:12px}.proposal-detail>.semantic-section{border:1px solid #dce5df;border-radius:8px;padding:12px}.ownership-grid{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:8px;display:grid}.ownership-grid span{border:1px solid #dae4de;border-radius:8px;flex-direction:column;padding:10px;display:flex}.ownership-grid small{color:#64776d;text-transform:capitalize;margin-top:4px}.reconciliation-flow{background:#f4f8f5;border-radius:9px;flex-direction:column;align-items:center;max-width:430px;margin:10px 0;padding:14px;display:flex}.reconciliation-flow span{text-align:center;background:#fff;border:1px solid #cbdad1;border-radius:6px;width:100%;padding:7px}.reconciliation-flow i{color:#398261;padding:3px;font-style:normal}.proposal-readiness,.repository-readiness{background:#f5faf7;border:1px solid #cddbd3;border-radius:9px;margin:15px 0;padding:14px}.proposal-readiness.blocked,.repository-readiness.blocked{background:#fff8eb;border-color:#e2c28e}.proposal-readiness h3,.repository-readiness h3{text-transform:uppercase;letter-spacing:.12em;margin-top:0;font-size:12px}.proposal-readiness dl{grid-template-columns:auto 1fr;gap:4px 10px;display:grid}.proposal-readiness dd{text-overflow:ellipsis;min-width:0;margin:0;overflow:hidden}.proposal-runtime-preview{border:2px solid #b47b1f;border-radius:10px;margin:15px 0;overflow:hidden}.proposal-runtime-preview .preview-banner{margin:0}.preview-comparison{grid-template-columns:1fr auto 1fr;gap:12px;padding:15px;display:grid}.preview-comparison section{flex-direction:column;gap:5px;display:flex}.preview-comparison h4{text-transform:uppercase;margin:0 0 5px}.preview-comparison span{background:#f2f6f3;border-radius:5px;padding:5px 8px}.preview-comparison i{align-self:center;font-style:normal}.proposal-understanding{background:#f4faf6;border:1px solid #bdd5c5;border-radius:10px;margin:18px 0;padding:18px}.proposal-understanding>h3{margin:0}.proposal-understanding>p{color:#66766d}.proposal-understanding article{background:#fff;border:1px solid #d9e4dc;border-radius:8px;margin-top:12px;padding:14px}.proposal-understanding article header{align-items:center;gap:9px;display:flex}.proposal-understanding article header b{color:#177146;margin-left:auto;font-size:18px}.proposal-understanding article header span{color:#456152;text-transform:uppercase;background:#e6f1e9;border-radius:4px;padding:3px 6px;font:10px monospace}.proposal-understanding article>p{margin:8px 0;font-size:18px}.proposal-understanding article>small{color:#68776f;margin-bottom:10px;display:block}.proposal-understanding article>div{color:#3f5549;justify-content:space-between;gap:10px;padding-top:5px;font-size:12px;display:flex}.proposal-understanding article>div code{color:#7a877f}.understanding-unknowns{background:#fff8eb;border-left:3px solid #b47b1f;margin-top:14px;padding:12px}.understanding-unknowns h4{margin:0}.proposal-understanding>footer{color:#6b7971;flex-wrap:wrap;gap:14px;margin-top:14px;font-size:11px;display:flex}.proposal-verification{border:1px solid #cddbd3;border-radius:9px;margin:15px 0;padding:14px}.proposal-verification.converged{border-color:#3a9b72}.proposal-verification.diverged{border-color:#c94b45}.proposal-verification>div{border-top:1px solid #dce5df;grid-template-columns:9rem 1fr;gap:.5rem;padding:.45rem 0;display:grid}.proposal-verification small{color:#68776f;grid-column:2}.proposal-history{padding:0;list-style:none}.proposal-history li{text-transform:capitalize;border-top:1px solid #e5ebe7;grid-template-columns:1fr auto;gap:2px 10px;padding:8px 0;display:grid}.proposal-history small{color:#829087;grid-column:1/-1}.proposal-boundary{background:#edf8f2;border:1px solid #b9d7c7;border-radius:9px;flex-wrap:wrap;align-items:center;gap:10px;margin-top:15px;padding:14px;display:flex}.proposal-boundary code{background:#fff;padding:7px;display:block}.proposal-boundary p{width:100%;margin:0}.proposal-modal{z-index:30;background:#0b191294;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.proposal-modal>section{background:#fff;border-radius:12px;width:min(520px,100%);max-height:80vh;padding:22px;overflow:auto;box-shadow:0 20px 70px #0000004d}.proposal-modal textarea{box-sizing:border-box;width:100%;min-height:90px}.proposal-modal footer{justify-content:flex-end;gap:8px;margin-top:18px;display:flex}.proposal-modal footer button{cursor:pointer;background:#fff;border:1px solid #bfcfc6;border-radius:7px;padding:9px 15px}.proposal-modal footer button:last-child{color:#fff;background:#1f7152}@media (width<=900px){.proposal-workspace-layout,.proposal-detail>header,.preview-comparison{grid-template-columns:1fr}.preview-comparison i{transform:rotate(90deg)}}.cp-page{grid-template-columns:minmax(0,1fr);gap:18px;display:grid}.cp-page code{overflow-wrap:anywhere}.cp-stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.cp-stat{background:#fff;border:1px solid #dce4de;border-radius:8px;padding:10px 12px}.cp-stat small{color:var(--stack-color-text-muted);letter-spacing:.1em;text-transform:uppercase;font-size:9px;font-weight:800;display:block}.cp-stat strong{color:#1d2b23;overflow-wrap:anywhere;margin-top:4px;font:600 19px/1.2 Georgia,serif;display:block}.cp-panels{grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;display:grid}.cp-cards{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;display:grid}.cp-pill{letter-spacing:.06em;text-transform:uppercase;border-radius:999px;padding:2px 8px;font-size:10px;font-weight:700;display:inline-block}.cp-pill-available,.cp-pill-insert,.cp-pill-independent,.cp-pill-added,.cp-pill-running{color:#1f684c;background:#e6f3ec}.cp-pill-partial,.cp-pill-update,.cp-pill-convergent,.cp-pill-changed{color:#8b5a1f;background:#fbf0df}.cp-pill-unsupported,.cp-pill-delete,.cp-pill-conflict,.cp-pill-removed,.cp-pill-failed{color:#9b2c2c;background:#fbe9e9}.cp-unavailable{background:#f7f8f6;border:1px dashed #c6d0c8;border-radius:10px;margin:12px 0;padding:16px 18px}.cp-unavailable h3{color:#33443a;font:600 16px/1.3 Georgia,serif}.cp-unavailable p{color:#5c6a61;max-width:82ch;margin-top:6px}.cp-unavailable-id{color:var(--stack-color-text-muted);margin:6px 0 0;font-size:12px}.cp-notice{color:#8b5a1f;background:#fdf6ea;border:1px solid #eddcbf;border-radius:7px;padding:9px 12px;font-size:12px}.cp-error{color:#9b2c2c;background:#fff0f0;border:1px solid #f1caca;border-radius:7px;align-items:center;gap:10px;padding:9px 12px;font-size:12px;display:flex}.cp-loading,.cp-empty{color:var(--stack-color-text-muted);padding:18px;font-style:italic}.cp-muted{color:var(--stack-color-text-muted);font-size:12px}.cp-attribution{background:#f2f6f3;border-left:3px solid #287052;border-radius:0 7px 7px 0;padding:10px 12px;font-size:13px}.cp-json{color:#22312a;white-space:pre-wrap;overflow-wrap:anywhere;background:#f7f9f7;border:1px solid #e0e7e2;border-radius:7px;max-height:380px;padding:12px;font-size:11px;line-height:1.55;overflow:auto}.cp-raw{margin-top:8px}.cp-raw summary{color:var(--stack-color-text-muted);cursor:pointer;font-size:11px}.cp-path,.cp-identity{font-size:11px}.cp-identity{color:#405146}.cp-tabs{margin:6px 0 12px}.cp-tabpanel{padding-top:0}.cp-filter{flex-wrap:wrap;gap:8px;margin-bottom:10px;display:flex}.cp-filter input,.cp-filter select{color:#20342a;background:#fff;border:1px solid #cbd8cf;border-radius:6px;padding:7px 9px;font-size:12px}.cp-detail{margin-top:16px}.cp-detail-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.cp-detail-header h2{margin:2px 0 4px;font:600 22px/1.2 Georgia,serif}.cp-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.cp-record{grid-template-columns:minmax(140px,220px) 1fr;gap:6px 16px;margin-top:10px;display:grid}.cp-record dt{color:#5c6a61;font-size:12px;font-weight:600}.cp-record dt small{color:#97a19a;font-size:10px;font-weight:500;display:block}.cp-record dd{overflow-wrap:anywhere;font-size:13px}.cp-keys{flex-wrap:wrap;gap:4px;display:flex}.cp-keys code{color:#405146;font-size:10px}.cp-capabilities{flex-wrap:wrap;gap:5px;margin:8px 0;display:flex}.cp-capabilities code{color:#1f684c;background:#eaf3ee;border-radius:5px;padding:2px 7px;font-size:11px}.cp-grant{border-radius:5px;margin:2px 4px 2px 0;padding:2px 8px;font-size:11px;display:inline-block}.cp-grant small{opacity:.8;font-size:9px;display:block}.cp-grant.granted{color:#1f684c;background:#e6f3ec}.cp-grant.denied{color:#8b5a1f;background:#fbf0df}.cp-agent-card{text-align:left;cursor:pointer;width:100%;display:block}.cp-agent-card h3{margin:3px 0 4px;font:600 18px/1.2 Georgia,serif}.cp-connect{gap:12px;margin-top:18px;display:grid}.cp-connect label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cp-connect input[type=text],.cp-connect input:not([type]){color:#20342a;background:#fbfcf9;border:1px solid #cbd8cf;border-radius:6px;padding:8px 10px;font-size:12px}.cp-connect fieldset{border:1px solid #dce4de;border-radius:8px;padding:10px 12px}.cp-connect legend{color:#65736a;letter-spacing:.07em;text-transform:uppercase;padding:0 6px;font-size:9px;font-weight:800}.cp-check{align-items:center;gap:7px;text-transform:none!important;letter-spacing:0!important;flex-direction:row!important;font-size:12px!important;font-weight:500!important;display:flex!important}.cp-connected{color:#1f684c;background:#eaf5ee;border:1px solid #cce5d5;border-radius:7px;padding:10px 12px;font-size:12px}.cp-action-form{gap:10px;margin-top:16px;display:grid}.cp-action-form label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cp-action-form input,.cp-action-form select{color:#20342a;background:#fbfcf9;border:1px solid #cbd8cf;border-radius:6px;padding:8px 10px;font-size:12px}.cp-action-form label small{color:#97a19a;text-transform:none;letter-spacing:0;font-weight:500}.cp-reconcile{gap:14px;display:grid}.cp-parent-choice{background:#f7f9f7;border:1px solid #e0e7e2;border-radius:8px;gap:6px;padding:10px 12px;display:grid}.cp-overrides{gap:8px;display:grid}.cp-overrides label{grid-template-columns:minmax(120px,240px) 1fr;align-items:center;gap:10px;display:grid}.cp-overrides input{border:1px solid #cbd8cf;border-radius:6px;padding:7px 9px;font-size:12px}.cp-committed{border-left:3px solid #287052}.cp-value-old code{color:#9b2c2c}.cp-value-new code{color:#1f684c}.cp-row-conflict{background:#fdf3f3}.cp-note{color:#5c6a61;max-width:52ch;font-size:11px}.data-browser tr.selected{background:#eef5f0}:root{--primary-color:#007bff;--success-color:#28a745;--warning-color:#ffc107;--danger-color:#dc3545;--dark:#1a1a1a;--light:#f5f5f5;--border:#e0e0e0;--text-muted:#999}*{box-sizing:border-box;margin:0;padding:0}html,body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}#root{width:100%;height:100%}body{background:var(--light);color:#333}a{color:var(--primary-color);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin:0;font-weight:600}p{line-height:1.5}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ccc;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#999}*{scrollbar-color:#ccc transparent;scrollbar-width:thin}
1
+ ._panel_1cbba_1{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:2rem}._header_1cbba_8{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;margin-bottom:2rem;padding-bottom:1rem;display:flex}._header_1cbba_8 h2{color:var(--text-primary);margin:0;font-size:1.5rem}._createButton_1cbba_23{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:4px;padding:.5rem 1rem;font-weight:600;transition:background-color .2s}._createButton_1cbba_23:hover{background:var(--accent-hover)}._error_1cbba_38{background:var(--error-bg);border:1px solid var(--error-border);color:var(--error-text);border-radius:4px;margin-bottom:1rem;padding:1rem}._createForm_1cbba_47{background:var(--surface-alt);border:1px solid var(--border);border-radius:4px;margin-bottom:2rem;padding:1.5rem}._formGroup_1cbba_55{margin-bottom:1.5rem}._formGroup_1cbba_55 label{color:var(--text-primary);margin-bottom:.5rem;font-weight:600;display:block}._formGroup_1cbba_55 input[type=text]{border:1px solid var(--border);background:var(--input-bg);width:100%;color:var(--text-primary);border-radius:4px;padding:.5rem;font-family:inherit}._scopeList_1cbba_76{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem;display:grid}._scopeCheckbox_1cbba_82{cursor:pointer;color:var(--text-primary);align-items:center;display:flex}._scopeCheckbox_1cbba_82 input{cursor:pointer;margin-right:.5rem}._submitButton_1cbba_94{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:4px;width:100%;padding:.75rem 1.5rem;font-weight:600}._submitButton_1cbba_94:hover{background:var(--accent-hover)}._empty_1cbba_109{text-align:center;color:var(--text-secondary);background:var(--surface-alt);border-radius:4px;padding:2rem}._keysList_1cbba_117{flex-direction:column;gap:1rem;display:flex}._keyCard_1cbba_123{border:1px solid var(--border);background:var(--surface-alt);border-radius:4px;padding:1.5rem;transition:border-color .2s}._keyCard_1cbba_123:hover{border-color:var(--accent)}._keyHeader_1cbba_135{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;display:flex}._keyHeader_1cbba_135 h3{color:var(--text-primary);margin:0 0 .25rem;font-size:1.1rem}._namespace_1cbba_150{color:var(--text-secondary);margin:0;font-size:.85rem}._status_1cbba_156{border-radius:12px;padding:.25rem .75rem;font-size:.85rem;font-weight:600}._status_1cbba_156._active_1cbba_163{background:var(--success-bg);color:var(--success-text)}._status_1cbba_156._expired_1cbba_168{background:var(--warning-bg);color:var(--warning-text)}._keyDetails_1cbba_173{gap:1rem;margin-bottom:1rem;display:grid}._detail_1cbba_179{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}._detail_1cbba_179 strong{color:var(--text-primary)}._detail_1cbba_179 span,._detail_1cbba_179 code{color:var(--text-secondary)}._detail_1cbba_179 code{background:var(--code-bg);border-radius:3px;padding:.25rem .5rem;font-family:monospace;font-size:.9rem}._copyBtn_1cbba_203{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:3px;padding:.25rem .5rem;font-size:.85rem}._copyBtn_1cbba_203:hover{background:var(--accent-hover)}._daysLeft_1cbba_217{color:var(--warning-text);font-size:.85rem;font-weight:600}._scopes_1cbba_223{margin-top:.75rem}._scopeTags_1cbba_227{flex-wrap:wrap;gap:.5rem;margin-top:.5rem;display:flex}._scopeTag_1cbba_227{background:var(--tag-bg);color:var(--tag-text);border-radius:12px;padding:.25rem .75rem;font-family:monospace;font-size:.85rem}._keyActions_1cbba_243{border-top:1px solid var(--border);gap:.5rem;padding-top:1rem;display:flex}._revokeBtn_1cbba_250{background:var(--error-bg);color:var(--error-text);border:1px solid var(--error-border);cursor:pointer;border-radius:4px;padding:.5rem 1rem;font-weight:600;transition:background-color .2s}._revokeBtn_1cbba_250:hover{background:var(--error-hover-bg)}._info_1cbba_265{background:var(--info-bg);color:var(--text-secondary);border-radius:4px;margin-top:2rem;padding:1rem;font-size:.9rem}._info_1cbba_265 p{margin:0}:root{--surface:#fff;--surface-alt:#f5f5f5;--text-primary:#000;--text-secondary:#666;--border:#e0e0e0;--accent:#007bff;--accent-hover:#0056b3;--error-bg:#f8d7da;--error-border:#f5c6cb;--error-text:#721c24;--error-hover-bg:#f5c6cb;--success-bg:#d4edda;--success-text:#155724;--warning-bg:#fff3cd;--warning-text:#856404;--info-bg:#e2e3e5;--input-bg:#fff;--code-bg:#f4f4f4;--tag-bg:#e9ecef;--tag-text:#495057}@media (prefers-color-scheme:dark){:root{--surface:#1e1e1e;--surface-alt:#2d2d2d;--text-primary:#fff;--text-secondary:#b0b0b0;--border:#404040;--accent:#0d6efd;--accent-hover:#0a58ca;--error-bg:#3d1f1f;--error-border:#664141;--error-text:#f8b7bc;--error-hover-bg:#4a2828;--success-bg:#1f3f1f;--success-text:#7ddc7d;--warning-bg:#3f3f1f;--warning-text:#ffdd57;--info-bg:#2d2d3d;--input-bg:#2d2d2d;--code-bg:#2d2d2d;--tag-bg:#3d3d4d;--tag-text:#b0b0b0}}:root{--stack-font-family-sans:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--stack-font-family-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;--stack-text-xs-size:.75rem;--stack-text-xs-line:1rem;--stack-text-sm-size:.8125rem;--stack-text-sm-line:1.25rem;--stack-text-md-size:.875rem;--stack-text-md-line:1.375rem;--stack-text-lg-size:1rem;--stack-text-lg-line:1.5rem;--stack-text-xl-size:1.25rem;--stack-text-xl-line:1.75rem;--stack-text-2xl-size:1.5rem;--stack-text-2xl-line:2rem;--stack-font-weight-regular:400;--stack-font-weight-medium:500;--stack-font-weight-semibold:600;--stack-space-0:0;--stack-space-1:4px;--stack-space-2:8px;--stack-space-3:12px;--stack-space-4:16px;--stack-space-5:20px;--stack-space-6:24px;--stack-space-8:32px;--stack-space-10:40px;--stack-space-12:48px;--stack-size-control-sm:32px;--stack-size-control-md:36px;--stack-size-control-lg:44px;--stack-size-icon-sm:14px;--stack-size-icon-md:16px;--stack-radius-sm:4px;--stack-radius-md:6px;--stack-radius-lg:10px;--stack-radius-pill:999px;--stack-border-width-thin:1px;--stack-border-width-thick:2px;--stack-focus-ring-width:2px;--stack-focus-ring-offset:2px;--stack-z-sticky:10;--stack-z-dropdown:20;--stack-z-overlay:30;--stack-z-toast:40;--stack-motion-duration-fast:.12s;--stack-motion-duration-base:.2s;--stack-motion-ease-standard:cubic-bezier(.2, 0, 0, 1);--stack-color-bg-canvas:#f6f7f9;--stack-color-bg-surface:#fff;--stack-color-bg-raised:#fff;--stack-color-bg-sunken:#eef0f3;--stack-color-bg-overlay:#0f12187a;--stack-color-bg-code:#f0f2f5;--stack-color-text-default:#16181d;--stack-color-text-muted:#4b5260;--stack-color-text-subtle:#5f6673;--stack-color-text-inverse:#fff;--stack-color-text-link:#2a52c9;--stack-color-text-on-accent:#fff;--stack-color-border-default:#d9dde3;--stack-color-border-strong:#7c8492;--stack-color-border-subtle:#e8ebef;--stack-focus-ring-color:#2f5bd8;--stack-color-action-primary-bg:#2f5bd8;--stack-color-action-primary-fg:#fff;--stack-color-action-primary-bg-hover:#2549c4;--stack-color-action-primary-bg-active:#1e3da6;--stack-color-action-secondary-bg:#fff;--stack-color-action-secondary-fg:#16181d;--stack-color-action-secondary-bg-hover:#eef0f3;--stack-color-action-secondary-bg-active:#e2e5ea;--stack-color-action-danger-bg:#c42b2b;--stack-color-action-danger-fg:#fff;--stack-color-action-danger-bg-hover:#a82323;--stack-color-action-danger-bg-active:#8c1d1d;--stack-color-status-positive-fg:#136b3a;--stack-color-status-positive-bg:#e8f5ee;--stack-color-status-positive-border:#9fd3b4;--stack-color-status-positive-glyph:#1a7f45;--stack-color-status-progress-fg:#1f4fb8;--stack-color-status-progress-bg:#eaf0fd;--stack-color-status-progress-border:#b9cbf3;--stack-color-status-progress-glyph:#2f5bd8;--stack-color-status-attention-fg:#734700;--stack-color-status-attention-bg:#fdf3e1;--stack-color-status-attention-border:#ecc77f;--stack-color-status-attention-glyph:#a26400;--stack-color-status-critical-fg:#a32020;--stack-color-status-critical-bg:#fdecec;--stack-color-status-critical-border:#f0b0b0;--stack-color-status-critical-glyph:#c42b2b;--stack-color-status-neutral-fg:#4b5260;--stack-color-status-neutral-bg:#eef0f3;--stack-color-status-neutral-border:#cdd2d9;--stack-color-status-neutral-glyph:#6b7280;--stack-color-status-unknown-fg:#55468a;--stack-color-status-unknown-bg:#f1eef8;--stack-color-status-unknown-border:#cdc4e8;--stack-color-status-unknown-glyph:#7262ad;--stack-color-evidence-verified-fg:#0d5c4a;--stack-color-evidence-verified-bg:#e4f4ef;--stack-color-evidence-verified-border:#93d1c0;--stack-color-evidence-verified-glyph:#11806a;--stack-color-evidence-unverified-fg:#4b5260;--stack-color-evidence-unverified-bg:#eef0f3;--stack-color-evidence-unverified-border:#cdd2d9;--stack-color-evidence-unverified-glyph:#6b7280;--stack-color-notice-info-fg:#1f4fb8;--stack-color-notice-info-bg:#eaf0fd;--stack-color-notice-info-border:#b9cbf3;--stack-shadow-raised:0 1px 2px #1018280f;--stack-shadow-overlay:0 12px 32px #1018282e}@media (prefers-reduced-motion:reduce){:root{--stack-motion-duration-fast:0s;--stack-motion-duration-base:0s}}.stack-visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stack-status{align-items:baseline;gap:var(--stack-space-1);font:inherit;color:inherit;white-space:nowrap;display:inline-flex}.stack-status__glyph{font-size:.85em;line-height:1}.stack-status__detail{color:var(--stack-color-text-muted)}.stack-status__detail:before{content:"· "}.stack-status--positive .stack-status__glyph{color:var(--stack-color-status-positive-glyph)}.stack-status--progress .stack-status__glyph{color:var(--stack-color-status-progress-glyph)}.stack-status--attention .stack-status__glyph{color:var(--stack-color-status-attention-glyph)}.stack-status--critical .stack-status__glyph{color:var(--stack-color-status-critical-glyph)}.stack-status--neutral .stack-status__glyph{color:var(--stack-color-status-neutral-glyph)}.stack-status--unknown .stack-status__glyph{color:var(--stack-color-status-unknown-glyph)}.stack-verification{align-items:baseline;gap:var(--stack-space-1);padding:var(--stack-space-1) var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-evidence-unverified-border);border-radius:var(--stack-radius-md);background:var(--stack-color-evidence-unverified-bg);color:var(--stack-color-evidence-unverified-fg);font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);flex-wrap:wrap;display:inline-flex}.stack-verification--verified{border-color:var(--stack-color-evidence-verified-border);background:var(--stack-color-evidence-verified-bg);color:var(--stack-color-evidence-verified-fg)}.stack-verification--verification_failed{border-color:var(--stack-color-status-critical-border);background:var(--stack-color-status-critical-bg);color:var(--stack-color-status-critical-fg)}.stack-verification__label{font-weight:var(--stack-font-weight-medium)}.stack-verification__evidence{color:inherit;text-decoration:underline}.stack-verification__checks{margin:var(--stack-space-1) 0 0;padding-left:var(--stack-space-5);flex-basis:100%}.stack-freshness{align-items:baseline;gap:var(--stack-space-1);color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);display:inline-flex}.stack-freshness__glyph{font-size:.85em}.stack-freshness--live .stack-freshness__glyph{color:var(--stack-color-status-positive-glyph)}.stack-freshness--cached .stack-freshness__glyph{color:var(--stack-color-status-neutral-glyph)}.stack-freshness--stale{color:var(--stack-color-status-attention-fg)}.stack-freshness--stale .stack-freshness__glyph{color:var(--stack-color-status-attention-glyph)}.stack-freshness--unknown .stack-freshness__glyph{color:var(--stack-color-status-unknown-glyph)}.stack-unavailable,.stack-error,.stack-empty,.stack-loading{border-radius:var(--stack-radius-lg);padding:var(--stack-space-3) var(--stack-space-4);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line)}.stack-unavailable{border:var(--stack-border-width-thin) dashed var(--stack-color-border-strong);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted)}.stack-unavailable__title{color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line);font-weight:var(--stack-font-weight-semibold);margin:0}.stack-unavailable__reason{margin:var(--stack-space-1) 0 0}.stack-error{border:var(--stack-border-width-thin) solid var(--stack-color-status-critical-border);background:var(--stack-color-status-critical-bg);color:var(--stack-color-status-critical-fg)}.stack-error__title{font-weight:var(--stack-font-weight-semibold);margin:0}.stack-error__message,.stack-error__meta{margin:var(--stack-space-1) 0 0}.stack-error__meta code{font-family:var(--stack-font-family-mono);font-size:.92em}.stack-error__actions{gap:var(--stack-space-2);margin-top:var(--stack-space-3);display:flex}.stack-empty{border:var(--stack-border-width-thin) dashed var(--stack-color-border-default);color:var(--stack-color-text-muted);text-align:center;padding:var(--stack-space-6) var(--stack-space-4)}.stack-empty__title{color:var(--stack-color-text-default);font-size:var(--stack-text-lg-size);line-height:var(--stack-text-lg-line);font-weight:var(--stack-font-weight-semibold);margin:0}.stack-empty__body{margin:var(--stack-space-1) 0 0}.stack-empty__action{margin-top:var(--stack-space-3)}.stack-loading{align-items:center;gap:var(--stack-space-2);color:var(--stack-color-text-muted);padding-left:0;display:flex}.stack-loading__indicator{width:var(--stack-size-icon-sm);height:var(--stack-size-icon-sm);border:var(--stack-border-width-thick) solid var(--stack-color-border-default);border-top-color:var(--stack-color-status-progress-glyph);animation:stack-spin calc(var(--stack-motion-duration-base) * 4) linear infinite;border-radius:50%}@keyframes stack-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.stack-loading__indicator,.stack-button__busy{animation:none}}.stack-meta{gap:var(--stack-space-2);grid-template-columns:repeat(auto-fill,minmax(160px,1fr));margin:0;display:grid}.stack-meta__item{min-width:0;padding:var(--stack-space-3);border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-lg);background:var(--stack-color-bg-surface)}.stack-meta__label{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);line-height:var(--stack-text-xs-line);text-transform:uppercase;letter-spacing:.04em;font-weight:var(--stack-font-weight-medium)}.stack-meta__value{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line);overflow-wrap:anywhere}.stack-meta__value--mono{font-family:var(--stack-font-family-mono);font-size:var(--stack-text-sm-size)}.stack-meta__hint{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size)}.stack-identity{align-items:baseline;gap:var(--stack-space-2);min-width:0;display:inline-flex}.stack-identity__kind{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);text-transform:uppercase;letter-spacing:.04em}.stack-identity__name{font-weight:var(--stack-font-weight-semibold);color:inherit}a.stack-identity__name{color:var(--stack-color-text-link)}.stack-identity__id{font-family:var(--stack-font-family-mono);font-size:var(--stack-text-sm-size);padding:0 var(--stack-space-1);border-radius:var(--stack-radius-sm);background:var(--stack-color-bg-code);color:var(--stack-color-text-default)}.stack-page-header{margin:0 0 var(--stack-space-4)}.stack-page-header__eyebrow{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--stack-font-weight-semibold);margin:0}.stack-page-header__title-row{align-items:center;gap:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-page-header__title{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-default);font-size:var(--stack-text-2xl-size);line-height:var(--stack-text-2xl-line);font-weight:var(--stack-font-weight-semibold)}.stack-page-header__actions{gap:var(--stack-space-2);margin-left:auto;display:flex}.stack-page-header__description{margin:var(--stack-space-1) 0 0;color:var(--stack-color-text-muted);max-width:72ch}.stack-page-header__meta{margin-top:var(--stack-space-2)}.stack-button{justify-content:center;align-items:center;gap:var(--stack-space-2);min-height:var(--stack-size-control-md);padding:0 var(--stack-space-3);border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-md);background:var(--stack-color-action-secondary-bg);color:var(--stack-color-action-secondary-fg);font:inherit;font-size:var(--stack-text-md-size);font-weight:var(--stack-font-weight-medium);cursor:pointer;transition:background-color var(--stack-motion-duration-fast) var(--stack-motion-ease-standard);display:inline-flex}.stack-button:hover:not(:disabled){background:var(--stack-color-action-secondary-bg-hover)}.stack-button:active:not(:disabled){background:var(--stack-color-action-secondary-bg-active)}.stack-button--primary{background:var(--stack-color-action-primary-bg);color:var(--stack-color-action-primary-fg);border-color:#0000}.stack-button--primary:hover:not(:disabled){background:var(--stack-color-action-primary-bg-hover)}.stack-button--primary:active:not(:disabled){background:var(--stack-color-action-primary-bg-active)}.stack-button--danger{background:var(--stack-color-action-danger-bg);color:var(--stack-color-action-danger-fg);border-color:#0000}.stack-button--danger:hover:not(:disabled){background:var(--stack-color-action-danger-bg-hover)}.stack-button--danger:active:not(:disabled){background:var(--stack-color-action-danger-bg-active)}.stack-button--ghost{background:0 0;border-color:#0000}.stack-button--sm{min-height:var(--stack-size-control-sm);padding:0 var(--stack-space-2);font-size:var(--stack-text-sm-size)}.stack-button--lg{min-height:var(--stack-size-control-lg);padding:0 var(--stack-space-4)}.stack-button:disabled{opacity:.55;cursor:not-allowed}.stack-button[aria-busy=true]{opacity:.8;cursor:progress}.stack-button__busy{width:var(--stack-size-icon-sm);height:var(--stack-size-icon-sm);border:var(--stack-border-width-thick) solid currentColor;animation:stack-spin calc(var(--stack-motion-duration-base) * 4) linear infinite;border-right-color:#0000;border-radius:50%}.stack-button:focus-visible,.stack-identity__name:focus-visible,.stack-verification__evidence:focus-visible{outline:var(--stack-focus-ring-width) solid var(--stack-focus-ring-color);outline-offset:var(--stack-focus-ring-offset)}.stack-breadcrumbs{font-size:var(--stack-text-sm-size);line-height:var(--stack-text-sm-line);color:var(--stack-color-text-muted)}.stack-breadcrumbs__list{align-items:baseline;gap:var(--stack-space-1);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.stack-breadcrumbs__item{align-items:baseline;gap:var(--stack-space-1);min-width:0;display:inline-flex}.stack-breadcrumbs__separator{color:var(--stack-color-text-subtle)}.stack-breadcrumbs__link{color:var(--stack-color-text-link);text-decoration:none}.stack-breadcrumbs__link:hover{text-decoration:underline}.stack-breadcrumbs__current{color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-medium);overflow-wrap:anywhere}.stack-tabs{gap:var(--stack-space-1);border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);display:flex;overflow-x:auto}.stack-tabs__tab{align-items:center;gap:var(--stack-space-2);min-height:var(--stack-size-control-md);padding:0 var(--stack-space-3);border:0;border-bottom:var(--stack-border-width-thick) solid transparent;color:var(--stack-color-text-muted);font:inherit;font-size:var(--stack-text-md-size);font-weight:var(--stack-font-weight-medium);white-space:nowrap;cursor:pointer;background:0 0;margin-bottom:-1px;display:inline-flex}.stack-tabs__tab:hover:not(:disabled){color:var(--stack-color-text-default)}.stack-tabs__tab[aria-selected=true]{color:var(--stack-color-text-default);border-bottom-color:var(--stack-color-action-primary-bg)}.stack-tabs__tab:disabled{opacity:.55;cursor:not-allowed}.stack-tabs__badge{padding:0 var(--stack-space-2);border-radius:var(--stack-radius-pill);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size)}.stack-tabpanel{padding-top:var(--stack-space-4)}.stack-table{border:var(--stack-border-width-thin) solid var(--stack-color-border-default);border-radius:var(--stack-radius-lg);background:var(--stack-color-bg-surface);overflow-x:auto}.stack-table[aria-busy=true]{box-shadow:inset 0 var(--stack-border-width-thick) 0 var(--stack-color-status-progress-glyph)}.stack-table__table{border-collapse:collapse;width:100%;font-size:var(--stack-text-md-size);line-height:var(--stack-text-md-line)}.stack-table__caption{padding:var(--stack-space-3) var(--stack-space-4);text-align:left;color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-semibold)}.stack-table__header{padding:var(--stack-space-2) var(--stack-space-4);text-align:left;white-space:nowrap;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-sunken);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold);letter-spacing:.04em;text-transform:uppercase}.stack-table__sort{align-items:center;gap:var(--stack-space-1);color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer;background:0 0;border:0;padding:0;display:inline-flex}.stack-table__sort-indicator{color:var(--stack-color-text-subtle)}.stack-table__cell{padding:var(--stack-space-2) var(--stack-space-4);vertical-align:top;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-subtle);color:var(--stack-color-text-default)}.stack-table__row:last-child .stack-table__cell{border-bottom:0}.stack-table__cell--end{text-align:right}.stack-table__cell[data-missing=true]{color:var(--stack-color-text-subtle)}.stack-table__row--selectable{cursor:pointer}.stack-table__row--selectable:hover{background:var(--stack-color-bg-sunken)}.stack-table__row--selected{background:var(--stack-color-status-progress-bg)}.stack-filter{margin:0 0 var(--stack-space-3)}.stack-filter__controls{align-items:flex-end;gap:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-filter__field{gap:var(--stack-space-1);flex-direction:column;min-width:0;display:flex}.stack-filter__label{color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold)}.stack-filter__control{min-height:var(--stack-size-control-md);max-width:100%;padding:0 var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-border-strong);border-radius:var(--stack-radius-md);background:var(--stack-color-bg-surface);color:var(--stack-color-text-default);font:inherit;font-size:var(--stack-text-md-size)}.stack-filter__actions{gap:var(--stack-space-2);display:flex}.stack-filter__result{margin:var(--stack-space-2) 0 0;min-height:var(--stack-text-sm-line);color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size)}.stack-pagination{justify-content:space-between;align-items:center;gap:var(--stack-space-3);margin-top:var(--stack-space-3);flex-wrap:wrap;display:flex}.stack-pagination__summary{color:var(--stack-color-text-muted);font-size:var(--stack-text-sm-size);margin:0}.stack-pagination__actions{gap:var(--stack-space-2);margin-left:auto;display:flex}.stack-shell{background:var(--stack-color-bg-canvas);min-height:100vh;color:var(--stack-color-text-default);font-family:var(--stack-font-family-sans);flex-direction:column;display:flex}.stack-shell__skip{left:var(--stack-space-2);z-index:var(--stack-z-toast);padding:var(--stack-space-2) var(--stack-space-3);border-radius:var(--stack-radius-md);background:var(--stack-color-action-primary-bg);color:var(--stack-color-action-primary-fg);position:absolute;top:-100px}.stack-shell__skip:focus{top:var(--stack-space-2)}.stack-shell__bar{align-items:center;gap:var(--stack-space-3);min-height:52px;padding:var(--stack-space-2) var(--stack-space-4);border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-surface);flex-wrap:wrap;display:flex}.stack-shell__product{align-items:center;gap:var(--stack-space-2);color:var(--stack-color-text-default);font-weight:var(--stack-font-weight-semibold);letter-spacing:.02em;text-decoration:none;display:inline-flex}.stack-shell__mark{border-radius:var(--stack-radius-md);background:var(--stack-color-action-primary-bg);width:24px;height:24px;color:var(--stack-color-action-primary-fg);font-size:var(--stack-text-xs-size);place-items:center;display:inline-grid}.stack-shell__context,.stack-shell__search{align-items:center;min-width:0;display:flex}.stack-shell__search{flex:200px;max-width:420px}.stack-shell__end{align-items:center;gap:var(--stack-space-3);flex-wrap:wrap;min-width:0;margin-left:auto;display:flex}.stack-shell__theme{min-height:var(--stack-size-control-sm);padding:0 var(--stack-space-2);border:var(--stack-border-width-thin) solid var(--stack-color-border-strong);border-radius:var(--stack-radius-md);background:var(--stack-color-bg-surface);color:var(--stack-color-text-default);font:inherit;font-size:var(--stack-text-sm-size)}.stack-shell__account{align-items:center;gap:var(--stack-space-2);min-width:0;display:flex}.stack-shell__body{flex:1;grid-template-columns:220px minmax(0,1fr);min-height:0;display:grid}.stack-shell__nav{padding:var(--stack-space-4) var(--stack-space-3);border-right:var(--stack-border-width-thin) solid var(--stack-color-border-default);background:var(--stack-color-bg-surface);overflow-y:auto}.stack-shell__nav-group+.stack-shell__nav-group{margin-top:var(--stack-space-4)}.stack-shell__nav-heading{margin:0 0 var(--stack-space-1);padding:0 var(--stack-space-2);color:var(--stack-color-text-muted);font-size:var(--stack-text-xs-size);font-weight:var(--stack-font-weight-semibold);letter-spacing:.06em;text-transform:uppercase}.stack-shell__nav-list{margin:0;padding:0;list-style:none}.stack-shell__nav-item{padding:var(--stack-space-2);border-radius:var(--stack-radius-md);color:var(--stack-color-text-default);font-size:var(--stack-text-md-size);text-decoration:none;display:block}.stack-shell__nav-item:hover{background:var(--stack-color-bg-sunken)}.stack-shell__nav-item[aria-current=page]{background:var(--stack-color-status-progress-bg);color:var(--stack-color-status-progress-fg);font-weight:var(--stack-font-weight-semibold)}.stack-shell__main{box-sizing:border-box;width:100%;min-width:0;padding:var(--stack-space-6)}.stack-shell__main:focus{outline:none}@media (width<=767px){.stack-shell__body{grid-template-columns:minmax(0,1fr)}.stack-shell__nav{gap:var(--stack-space-3);padding:var(--stack-space-2) var(--stack-space-3);border-right:0;border-bottom:var(--stack-border-width-thin) solid var(--stack-color-border-default);display:flex;overflow-x:auto}.stack-shell__nav-group+.stack-shell__nav-group{margin-top:0}.stack-shell__nav-heading{display:none}.stack-shell__nav-list{gap:var(--stack-space-1);display:flex}.stack-shell__nav-item{white-space:nowrap}.stack-shell__main{padding:var(--stack-space-4)}}.stack-tabs__tab:focus-visible,.stack-table__sort:focus-visible,.stack-table:focus-visible,.stack-table__row--selectable:focus-visible,.stack-filter__control:focus-visible,.stack-shell__theme:focus-visible,.stack-shell__nav-item:focus-visible,.stack-shell__product:focus-visible,.stack-breadcrumbs__link:focus-visible,.stack-shell__skip:focus-visible,.stack-tabpanel:focus-visible{outline:var(--stack-focus-ring-width) solid var(--stack-focus-ring-color);outline-offset:var(--stack-focus-ring-offset)}.application-designer{--ink:#17211b;--muted:#68756d;--line:#dce4de;--paper:#fbfcf9;min-height:100%;color:var(--ink)}.designer-header{justify-content:space-between;align-items:flex-end;gap:24px;padding:8px 4px 22px;display:flex}.designer-header h1{letter-spacing:-.03em;font-family:Georgia,serif;font-size:34px}.designer-header p{color:var(--muted);margin-top:5px}.eyebrow{color:#287052;letter-spacing:.18em;text-transform:uppercase;font-size:10px;font-weight:800}.designer-actions{flex-wrap:wrap;gap:8px;display:flex}.btn-ghost{color:#33443a;border:1px solid var(--line);background:#fff}.designer-actions .btn-primary{background:#1f684c}.cloud-publisher{background:#fff;border:1px solid #cbdad0;border-radius:10px;gap:14px;margin-bottom:12px;padding:18px;display:grid;box-shadow:0 10px 28px #26372d1a}.cloud-publisher-heading{justify-content:space-between;gap:18px;display:flex}.cloud-publisher-heading h2{margin-top:3px;font:600 20px/1.2 Georgia,serif}.cloud-publisher-heading p{color:var(--muted);margin-top:4px;font-size:12px}.cloud-publisher-heading>button{color:#718078;cursor:pointer;background:0 0;border:0;align-self:flex-start;font-size:22px}.cloud-fields{grid-template-columns:1.4fr .7fr 1fr;gap:10px;display:grid}.cloud-fields label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cloud-fields input{color:#20342a;background:#f9fbf9;border:1px solid #cbd8cf;border-radius:6px;outline:0;width:100%;padding:9px 10px;font-size:12px}.cloud-fields input:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.cloud-destructive{color:#8b4d22;align-items:center;gap:7px;font-size:11px;display:flex}.cloud-destructive input{accent-color:#a55d2b}.local-destructive{color:#8b4d22;background:#fff7ed;border:1px solid #f0d7bb;border-radius:7px;align-items:center;gap:7px;margin-bottom:12px;padding:9px 12px;font-size:11px;display:flex}.local-destructive input{accent-color:#a55d2b}.cloud-error{color:#9b2c2c;background:#fff0f0;border:1px solid #f1caca;border-radius:6px;padding:8px 10px;font-size:11px}.cloud-actions{justify-content:flex-end;gap:8px;display:flex}.cloud-actions .btn:disabled{cursor:wait;opacity:.65}.designer-status{color:#286046;background:#eaf5ee;border:1px solid #cce5d5;border-radius:8px;justify-content:space-between;margin-bottom:12px;padding:9px 13px;font-size:12px;display:flex}.designer-status.error{color:#9b2c2c;background:#fff0f0;border-color:#f1caca}.designer-grid{background:var(--paper);border:1px solid var(--line);border-radius:12px;grid-template-columns:190px minmax(420px,1fr) minmax(340px,.8fr);height:calc(100vh - 150px);min-height:620px;display:grid;overflow:hidden;box-shadow:0 12px 40px #26372d14}.model-tree,.model-canvas,.dsl-panel{min-width:0}.model-tree{border-right:1px solid var(--line);background:#f2f5f0;padding:14px;overflow:auto}.panel-title{color:#34463b;letter-spacing:.04em;text-transform:uppercase;border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;min-height:38px;font-size:12px;font-weight:800;display:flex}.panel-title button{color:#286046;cursor:pointer;background:#dce9df;border:0;border-radius:6px;width:25px;height:25px}.model-tree section{margin-top:16px}.model-tree section h3{color:var(--stack-color-text-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 7px 6px;font-size:10px}.tree-item,.tree-empty{border-radius:6px;padding:6px 8px;font-size:12px}.tree-item{color:#27372e;background:#ffffffb3;margin-bottom:3px}.tree-empty{color:#9aa39d;font-style:italic}.collection-editor{background:#fff;border:1px solid #d3ded6;border-radius:7px;gap:7px;margin-top:10px;padding:9px;display:grid}.collection-editor label{color:#65736a;letter-spacing:.06em;text-transform:uppercase;gap:4px;font-size:9px;font-weight:800;display:grid}.collection-editor input{color:#20342a;border:1px solid #cbd8cf;border-radius:5px;outline:0;width:100%;min-width:0;padding:7px 8px;font-size:11px}.collection-editor input:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.collection-editor>div:last-child{justify-content:flex-end;gap:4px;display:flex}.collection-editor button{color:#526158;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:4px 7px;font-size:10px}.collection-editor .collection-save{color:#fff;background:#287052}.model-canvas{background-color:#f8faf6;background-image:radial-gradient(#d8e0da 1px,#0000 1px);background-size:18px 18px;flex-direction:column;padding:14px;display:flex;overflow:hidden}.graph-legend{color:#859189;text-transform:none;letter-spacing:0;font-weight:500}.graph-board{flex:1;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:16px;padding:22px 8px;display:grid;overflow:auto}.model-node{background:#fff;border:1px solid #cfdbd2;border-top:3px solid #327258;border-radius:9px;padding:14px;position:relative;box-shadow:0 5px 14px #273d3014}.model-node.workflow-node{border-top-color:#9b6a2f}.model-node.agent-node{border-top-color:#70539b}.node-kind{color:#849087;letter-spacing:.14em;text-transform:uppercase;font-size:9px;font-weight:800}.model-node h3{margin:3px 0 10px;font-family:Georgia,serif;font-size:18px}.node-field,.node-step{border-top:1px solid #eef1ee;justify-content:space-between;gap:8px;padding:5px 0;font-size:11px;display:flex}.node-field code{color:#527060;font-size:10px}.node-step{color:#59675f;display:block}.node-add{color:#357257;cursor:pointer;background:#f0f7f2;border:1px dashed #b9d2c1;border-radius:5px;margin-top:9px;padding:4px 7px;font-size:10px}.field-editor{background:#f5f8f5;border:1px solid #d7e2da;border-radius:7px;gap:9px;margin-top:10px;padding:11px;display:grid}.field-editor label{color:#65736a;letter-spacing:.06em;text-transform:uppercase;gap:4px;font-size:9px;font-weight:700;display:grid}.field-editor input[type=text],.field-editor input:not([type]),.field-editor select{color:#20342a;background:#fff;border:1px solid #cbd8cf;border-radius:5px;outline:0;width:100%;min-width:0;padding:7px 8px;font:11px/1.2 inherit}.field-editor input:focus,.field-editor select:focus{border-color:#398166;box-shadow:0 0 0 2px #39816624}.field-editor-row{grid-template-columns:1fr 1fr;gap:7px;display:grid}.field-editor .field-optional{color:#43564a;letter-spacing:0;text-transform:none;align-items:center;gap:6px;font-size:10px;font-weight:500;display:flex}.field-optional input{accent-color:#287052}.field-error{color:#a13d3d;font-size:10px}.field-editor-actions{justify-content:flex-end;gap:6px;display:flex}.field-editor-actions button{color:#526158;cursor:pointer;background:0 0;border:0;border-radius:5px;padding:5px 8px;font-size:10px}.field-editor-actions .field-save{color:#fff;background:#287052}.change-strip{border-top:1px solid var(--line);white-space:nowrap;background:#ffffffeb;align-items:center;gap:12px;min-height:42px;padding:7px 10px;font-size:10px;display:flex;overflow:auto}.change-strip .added{color:#24714f}.change-strip .changed{color:#94611e}.change-strip .removed{color:#a13d3d}.dsl-panel{color:#d9e4dc;background:#17211b;border-left:1px solid #0c1510;flex-direction:column;padding:14px;display:flex}.dsl-panel .panel-title{color:#aebdb3;border-color:#344139}.dsl-panel .panel-title span:last-child{color:#6f8276;text-transform:none;font-weight:500}.dsl-panel textarea{resize:none;color:#d9e4dc;tab-size:2;background:0 0;border:0;outline:0;flex:1;width:100%;padding:15px 2px;font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,monospace}.diagnostics{border-top:1px solid #344139;max-height:120px;padding-top:8px;font:10px/1.5 ui-monospace,monospace;overflow:auto}.diagnostics .error{color:#ff9f9f}.diagnostics .warning{color:#f3d18a}@media (width<=1100px){.designer-grid{grid-template-columns:160px 1fr;height:auto}.dsl-panel{grid-column:1/-1;height:480px}.designer-header{flex-direction:column;align-items:flex-start}.cloud-fields{grid-template-columns:1fr}}.studio-content{min-width:0}.instance-info{border:1px solid var(--stack-color-border-default);color:var(--stack-color-text-muted);border-radius:999px;padding:2px 10px;font-size:12px}.runtime-notice{color:#65551d;background:#fff9df;border:1px solid #d8c98d;border-radius:8px;max-width:1280px;margin:0 auto 20px;padding:12px 16px;font-size:13px;line-height:1.45}.search-input{border:1px solid #ddd;border-radius:4px;width:100%;padding:10px;font-size:14px}.filter-select{cursor:pointer;background:#fff;border:1px solid #ddd;border-radius:4px;padding:8px;font-size:14px}.btn{cursor:pointer;border:none;border-radius:4px;padding:10px 15px;font-size:14px;font-weight:500;transition:all .2s}.btn-primary{color:#fff;background:#0062cc}.btn-primary:hover{background:#0056b3}.overview-dashboard{background:#fff;border-radius:8px;padding:30px;box-shadow:0 1px 3px #0000001a}.dashboard-header{border-bottom:1px solid #e0e0e0;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;display:flex}.dashboard-header h1{margin:0;font-size:28px}.namespace-badge{color:#fff;background:#007bff;border-radius:20px;padding:5px 15px;font-size:12px;font-weight:600}.dashboard-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;display:grid}.stat-card{text-align:center;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;padding:15px}.stat-card label{color:#666;margin-bottom:8px;font-size:12px;font-weight:600;display:block}.stat-card .status-indicator{margin-right:5px;font-size:20px}.stat-card .status-indicator.healthy{color:#28a745}.stat-card .status-indicator.degraded{color:#ffc107}.stat-card .status-indicator.unhealthy{color:#dc3545}.stat-number{color:#007bff;font-size:24px;font-weight:700;display:block}.explorer-placeholder,.capabilities-placeholder,.executions-placeholder,.provenance-placeholder,.peer-placeholder,.empty-message,.placeholder-text{text-align:center;color:#999;background:#f9f9f9;border:2px dashed #ddd;border-radius:6px;margin-top:20px;padding:40px}.placeholder-text{border:none;padding:20px}.peer-list{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:15px;margin-top:20px;display:grid}.peer-item{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;align-items:center;gap:10px;padding:15px;display:flex}.peer-status{font-size:12px}.peer-status.online{color:#28a745}.peer-name{font-weight:500}.health-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin-top:20px;display:grid}.health-item{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;align-items:center;gap:10px;padding:15px;display:flex}.health-item.status-healthy{background:#f8f9fa;border-color:#d4edda}.health-item.status-warning{background:#fffbf0;border-color:#fff3cd}.health-item.status-error{background:#fff5f5;border-color:#f8d7da}.status-icon{font-size:16px;font-weight:700}.health-item.status-healthy .status-icon{color:#28a745}.health-item.status-warning .status-icon{color:#ffc107}.health-item.status-error .status-icon{color:#dc3545}.component-name{font-weight:500}.reference-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.search-box{margin-bottom:20px}.reference-details{margin-top:20px}.detail-row{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:10px 0;display:flex}.detail-row label{color:#666;font-weight:600}.detail-row span{color:#333}.status-materialized{color:#28a745;font-weight:500}.operations-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.filter-controls{margin-bottom:20px}.operations-table{border-collapse:collapse;width:100%;margin-top:20px}.operations-table th{text-align:left;background:#f5f5f5;border-bottom:2px solid #ddd;padding:10px;font-weight:600}.operations-table td{border-bottom:1px solid #f0f0f0;padding:10px}.conflict-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.conflict-summary{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin-top:20px;display:grid}.summary-stat{text-align:center;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:6px;padding:15px}.summary-stat label{color:#666;margin-bottom:8px;font-size:12px;font-weight:600;display:block}.workflow-visualizer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.workflow-controls{margin-bottom:20px}.workflows-list,.workflow-detail{margin-top:20px}.agent-explorer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.agents-grid,.agent-detail{margin-top:20px}.provenance-viewer{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.provenance-content{margin-top:20px}.settings-panel{background:#fff;border-radius:8px;padding:20px;box-shadow:0 1px 3px #0000001a}.settings-tabs{border-bottom:1px solid #e0e0e0;gap:10px;margin:20px 0;display:flex}.tab{cursor:pointer;color:#666;background:0 0;border:none;border-bottom:3px solid #0000;padding:10px 15px;font-weight:500;transition:all .2s}.tab.active{color:#007bff;border-bottom-color:#007bff}.settings-content{margin-top:20px}.keys-list,.connection-info{margin:20px 0}.info-row{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:10px 0;display:flex}.info-row label{color:#666;font-weight:600}.monospace{font-family:Monaco,Courier New,monospace;font-size:12px}.global-search{position:relative}.search-input.global{margin-bottom:10px}.search-results{z-index:1000;background:#fff;border:1px solid #ddd;border-radius:4px;max-height:400px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 2px 8px #0000001a}.results-group{border-bottom:1px solid #f0f0f0;padding:10px}.results-group h4{color:#666;text-transform:uppercase;margin:0 0 8px;font-size:12px;font-weight:600}.results-group .empty-message{color:#999;background:0 0;border:none;padding:5px 0;font-size:12px}.studio-model-page{color:#19251f;max-width:1280px;margin:0 auto}.studio-model-page>header{margin-bottom:22px}.studio-model-page>header h1{margin:4px 0 6px;font-family:Georgia,serif;font-size:36px}.studio-model-page>header p{color:#68776f;margin:0}.eyebrow,.card-kind{color:#217052;letter-spacing:.18em;text-transform:uppercase;font-size:10px;font-weight:800}.model-summary{flex-wrap:wrap;gap:10px;margin:0 0 18px;display:flex}.model-summary>span,.model-summary select{color:#426052;background:#f8fbf9;border:1px solid #d6e1da;border-radius:999px;padding:7px 12px;font-size:12px}.studio-card-grid,.state-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;display:grid}.studio-card{background:#fff;border:1px solid #d7e0da;border-radius:12px;padding:18px;box-shadow:0 6px 22px #1937280d}.studio-card h2{margin:6px 0 14px;font-family:Georgia,serif;font-size:22px}.model-empty{color:#75847c;text-align:center;background:#fafcfb;border:1px dashed #cbd8d0;border-radius:10px;grid-column:1/-1;padding:34px}.model-empty.compact{padding:20px 10px}.state-collection>header{justify-content:space-between;align-items:center;display:flex}.studio-data-bridge{opacity:0;pointer-events:none;border:0;width:1px;height:1px;position:absolute}.state-collection>header h2{margin-bottom:8px}.state-collection>header strong{color:#237154;font:30px Georgia,serif}.state-row{text-align:left;color:#26372f;cursor:pointer;background:0 0;border:0;border-top:1px solid #e8edea;grid-template-columns:1fr auto;gap:8px;width:100%;padding:12px 2px;display:grid}.state-row span:first-child{flex-direction:column;gap:3px;display:flex}.state-row small{color:#859189}.state-row pre{color:#dcebe2;background:#13231b;border-radius:8px;grid-column:1/-1;margin:4px 0 0;padding:12px;overflow:auto}.application-context{background:#d7e0da;border:1px solid #d7e0da;border-radius:12px;grid-template-columns:repeat(5,minmax(120px,1fr));gap:1px;margin-bottom:18px;display:grid;overflow:hidden}.application-context>span{background:#fff;flex-direction:column;gap:4px;min-width:0;padding:13px 15px;display:flex}.application-context small{color:#728078;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:800}.application-context strong,.application-context code{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.data-layout{grid-template-columns:220px minmax(0,1fr);gap:16px;display:grid}.data-layout>aside{flex-direction:column;align-self:start;gap:4px;display:flex}.data-layout>aside .card-kind{margin-bottom:8px}.data-layout>aside button{color:#31483d;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;padding:9px 10px}.data-layout>aside button:hover,.data-layout>aside button.active{color:#176443;background:#e5f3eb;font-weight:700}.data-browser>header{justify-content:space-between;align-items:end;gap:16px;margin-bottom:12px;display:flex}.data-browser h2{margin:4px 0 0;font:28px Georgia,serif}.data-error button,.data-pagination button{background:#fff;border:1px solid #cad7cf;border-radius:7px;min-height:36px;padding:7px 10px}.data-error button{color:#fff;cursor:pointer;background:#1f7152}.data-browser table{border-collapse:collapse}.data-browser th,.data-browser td{overflow-wrap:anywhere;text-align:left;vertical-align:top;border-bottom:1px solid #e5ebe7;max-width:300px;padding:11px 13px}.data-browser th small{color:var(--stack-color-text-muted);margin-top:3px;font-weight:400;display:block}.data-browser tbody tr{cursor:pointer}.data-browser tbody tr:hover{background:#f4faf6}.data-browser details pre,.data-detail pre{white-space:pre-wrap;max-height:220px;overflow:auto}.record-link,.reference-value{color:#176b4b;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-weight:650}.data-null{color:#929e97}.data-boolean{background:#edf1ef;border-radius:999px;padding:2px 6px}.data-boolean.true{color:#176443;background:#dff4e9}.secret-state{color:#6d547c;font-weight:700}.data-pagination{justify-content:flex-end;align-items:center;gap:8px;padding:12px 0;display:flex}.data-pagination span{color:#74817a;margin-right:auto}.data-pagination button:not(:disabled){cursor:pointer}.data-error{color:#793b27;background:#fff1e8;border-radius:8px;justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;padding:11px 13px;display:flex}.data-detail{margin-top:10px}.data-detail>header{justify-content:space-between;display:flex}.data-close{color:#64766c;cursor:pointer;background:0 0;border:0;font-size:26px}.data-detail dl{grid-template-columns:minmax(140px,.3fr) 1fr;gap:0;display:grid}.data-detail dt,.data-detail dd{border-top:1px solid #e8edea;margin:0;padding:10px 5px}.data-detail dt{flex-direction:column;font-weight:700;display:flex}.data-detail dt small{color:#839088;font-size:10px;font-weight:400}.reverse-relationship{background:#f7faf8;border-radius:8px;margin-top:14px;padding:12px}.reverse-relationship h3,.reverse-relationship p{margin:0 0 7px}.reverse-relationship .reference-value{margin-top:7px;display:block}.table-shell{background:#fff;border:1px solid #d7e0da;border-radius:12px;overflow:auto}.table-shell table{width:100%;margin:0}.event-pill{text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:800;display:inline-block}.event-pill.put{color:#176443;background:#dff4e9}.event-pill.delete{color:#963e2c;background:#fbe4df}.reference-query{gap:8px;margin-bottom:18px;display:flex}.reference-query input{border:1px solid #cad7cf;border-radius:8px;flex:1;padding:12px 14px;font-family:monospace}.reference-query button{color:#fff;cursor:pointer;background:#1f7152;border:0;border-radius:8px;padding:0 20px;font-weight:700}.reference-layout{grid-template-columns:minmax(220px,.35fr) 1fr;gap:16px;display:grid}.reference-example{cursor:pointer;background:0 0;border:0;border-top:1px solid #e8edea;justify-content:space-between;width:100%;padding:12px 0;display:flex}.reference-example small{color:#829087}.reference-result pre,.execution-row pre{color:#dcebe2;background:#14231c;border-radius:8px;padding:14px;overflow:auto}.execution-list{gap:10px;margin-bottom:20px;display:grid}.execution-row{background:#fff;border:1px solid #d8e1db;border-radius:10px;grid-template-columns:1fr auto;gap:10px;padding:14px;display:grid}.execution-row>div{flex-direction:column;display:flex}.execution-row small{color:#829087}.execution-row pre{grid-column:1/-1;max-height:180px;margin:0}.execution-empty{margin-top:14px}.provenance-nodes{flex-wrap:wrap;gap:10px;display:flex}.provenance-nodes>div,.provenance-event{border:1px solid #d8e1db;border-radius:8px;flex-direction:column;gap:3px;padding:12px;display:flex}.provenance-nodes small,.provenance-event small{color:#849087}.provenance-event{grid-template-columns:45px 1fr 1fr auto;margin-top:8px;display:grid}.peer-topology{align-items:center;gap:10px;padding:30px 4px;display:flex;overflow:auto}.peer-node{background:#fff;border:1px solid #cad8cf;border-radius:12px;min-width:230px;padding:18px}.peer-node.local{color:#eef7f2;background:#183429}.peer-node span,.peer-node small{opacity:.7;font-size:11px}.peer-node h2{margin:6px 0;font-size:15px}.peer-link{background:#81a893;width:45px;height:2px}.metric-grid{grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:18px;display:grid}.metric-grid article{color:#fff;background:#183429;border-radius:10px;flex-direction:column;padding:18px;display:flex}.metric-grid b{font:32px Georgia,serif}.metric-grid span{opacity:.7;text-transform:uppercase;letter-spacing:.12em;font-size:10px}.health-item{align-items:center;gap:12px;display:flex}.health-item div{flex-direction:column;gap:3px;display:flex}.health-item small{color:#78857e}.health-issue{background:#fff2dc;border-radius:8px;margin:10px 0;padding:12px}.search-result{border-top:1px solid #edf0ee;grid-template-columns:1fr auto;gap:2px 8px;padding:8px 0;display:grid}.search-result span{color:#287254;text-transform:uppercase;font-size:10px}.search-result small{color:#829087;text-overflow:ellipsis;white-space:nowrap;grid-column:1/-1;overflow:hidden}@media (width<=800px){.reference-layout,.data-layout{grid-template-columns:1fr}.application-context{grid-template-columns:1fr 1fr}.data-browser>header{flex-direction:column;align-items:stretch}.metric-grid{grid-template-columns:1fr}.provenance-event{grid-template-columns:35px 1fr}.provenance-event code,.provenance-event small{grid-column:2}}.ask-feltdb{color:#1d3127;background:linear-gradient(135deg,#f7fbf8,#eef7f2);border:1px solid #cbdad1;border-radius:12px;margin:0 0 18px;padding:18px}.ask-feltdb h2{margin:4px 0;font:26px Georgia,serif}.ask-feltdb p{color:#607268;margin:5px 0 12px}.ask-feltdb textarea{box-sizing:border-box;resize:vertical;background:#fff;border:1px solid #b9cfc2;border-radius:8px;width:100%;min-height:76px;margin:8px 0;padding:12px}.ask-feltdb progress{width:100%}.ai-unavailable,.ai-status,.proposal-boundary{font-size:12px}.proposal-review{border-top:1px solid #cbdad1;margin-top:14px;padding-top:14px}.proposal-review h3{margin:0 0 8px}.proposal-review li{margin:4px 0;font-family:monospace}.proposal-review pre{color:#dcebe2;white-space:pre-wrap;background:#14231c;border-radius:8px;max-height:360px;padding:12px;overflow:auto}.proposal-warning{color:#714c08;background:#fff1d7;border-radius:7px;margin:8px 0;padding:10px}.authorization-approval{color:#77301f;background:#fff5f1;border:2px solid #b65439;border-radius:8px;gap:9px;margin:10px 0;padding:12px;display:flex}.proposal-app-preview{background:#fff;border:1px solid #bfd2c6;border-radius:9px;margin:12px 0;padding:12px}.proposal-app-preview nav{border-bottom:1px solid #e1e9e4;flex-wrap:wrap;gap:6px;padding-bottom:10px;display:flex}.proposal-app-preview nav span{color:#1f6549;background:#e5f3eb;border-radius:999px;padding:4px 8px;font-size:11px}.proposal-app-preview section{border-bottom:1px solid #edf1ee;justify-content:space-between;gap:12px;padding:9px 2px;display:flex}.proposal-app-preview small{color:#718079;text-align:right}.proposal-browser>header{margin-bottom:18px}.proposal-browser>header h1{margin:4px 0;font:36px Georgia,serif}.proposal-browser-layout{grid-template-columns:minmax(280px,.7fr) minmax(360px,1.3fr);gap:16px;display:grid}.proposal-list-row{text-align:left;cursor:pointer;background:0 0;border:0;border-top:1px solid #e4ebe7;justify-content:space-between;gap:12px;width:100%;padding:12px 2px;display:flex}.proposal-list-row span{flex-direction:column;gap:3px;display:flex}.proposal-list-row small{color:#7c8982}.proposal-list-row b{color:#267052;text-transform:uppercase;font-size:10px}.proposal-detail pre{color:#dcebe2;white-space:pre-wrap;background:#14231c;border-radius:8px;padding:12px;overflow:auto}.proposal-actions{gap:8px;margin:14px 0;display:flex}.proposal-preview{background:#fffaf0;border:2px solid #c28c28;border-radius:10px;margin-top:14px;padding:16px}.preview-banner{color:#fff;background:#704d0c;margin:-16px -16px 16px;padding:12px 16px}.record-inspector{text-align:left;background:#f7faf8;border-radius:8px;grid-column:1/-1;padding:14px}.record-inspector dl{grid-template-columns:minmax(110px,.35fr) 1fr;gap:7px 12px;display:grid}.record-inspector dt{color:#607268;font-weight:700}.record-inspector dd{overflow-wrap:anywhere;margin:0}.record-inspector pre{max-height:260px}@media (width<=800px){.proposal-browser-layout{grid-template-columns:1fr}}.proposal-workspace{color:#19251f;max-width:1400px;margin:0 auto}.proposal-workspace>header h1{margin:4px 0;font:36px Georgia,serif}.proposal-workspace>header p{color:#68776f;margin:0 0 18px}.proposal-workspace-layout{grid-template-columns:minmax(300px,.7fr) minmax(500px,1.5fr);gap:16px;display:grid}.proposal-workspace-layout>aside{align-self:start}.proposal-workspace-layout>aside>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.proposal-workspace-layout>aside select{background:#fff;border:1px solid #cad7cf;border-radius:7px;padding:7px}.proposal-list-row.active{background:#e8f4ed;border-radius:7px;width:calc(100% + 16px);margin:0 -8px;padding-left:8px;padding-right:8px}.proposal-detail>header{border-bottom:1px solid #e4ebe7;grid-template-columns:1fr auto;gap:20px;padding-bottom:14px;display:grid}.proposal-detail>header h2{margin:8px 0}.proposal-detail>header dl{grid-template-columns:auto 1fr;gap:5px 10px;margin:0;font-size:12px;display:grid}.proposal-detail>header dt{color:#78867e}.proposal-detail>header dd{text-overflow:ellipsis;white-space:nowrap;max-width:220px;margin:0;overflow:hidden}.proposal-status{color:#355247;letter-spacing:.1em;text-transform:uppercase;background:#e7ece9;border-radius:999px;padding:4px 8px;font-size:10px;font-weight:900;display:inline-block}.proposal-status.previewed,.proposal-status.approved{color:#176443;background:#dff4e9}.proposal-status.rejected,.proposal-status.expired{color:#963e2c;background:#fbe4df}.semantic-diff{color:#e3eee8;background:#14231c;border-radius:10px;margin:18px 0;padding:16px}.semantic-diff>h3{margin-top:0;font:18px Georgia,serif}.semantic-section{margin:13px 0}.semantic-section h4{color:#76d2a7;letter-spacing:.13em;text-transform:uppercase;margin:0 0 5px;font-size:10px}.semantic-section div{margin:3px 0;font-family:monospace;font-size:12px}.proposal-detail>.semantic-section{border:1px solid #dce5df;border-radius:8px;padding:12px}.ownership-grid{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:8px;display:grid}.ownership-grid span{border:1px solid #dae4de;border-radius:8px;flex-direction:column;padding:10px;display:flex}.ownership-grid small{color:#64776d;text-transform:capitalize;margin-top:4px}.reconciliation-flow{background:#f4f8f5;border-radius:9px;flex-direction:column;align-items:center;max-width:430px;margin:10px 0;padding:14px;display:flex}.reconciliation-flow span{text-align:center;background:#fff;border:1px solid #cbdad1;border-radius:6px;width:100%;padding:7px}.reconciliation-flow i{color:#398261;padding:3px;font-style:normal}.proposal-readiness,.repository-readiness{background:#f5faf7;border:1px solid #cddbd3;border-radius:9px;margin:15px 0;padding:14px}.proposal-readiness.blocked,.repository-readiness.blocked{background:#fff8eb;border-color:#e2c28e}.proposal-readiness h3,.repository-readiness h3{text-transform:uppercase;letter-spacing:.12em;margin-top:0;font-size:12px}.proposal-readiness dl{grid-template-columns:auto 1fr;gap:4px 10px;display:grid}.proposal-readiness dd{text-overflow:ellipsis;min-width:0;margin:0;overflow:hidden}.proposal-runtime-preview{border:2px solid #b47b1f;border-radius:10px;margin:15px 0;overflow:hidden}.proposal-runtime-preview .preview-banner{margin:0}.preview-comparison{grid-template-columns:1fr auto 1fr;gap:12px;padding:15px;display:grid}.preview-comparison section{flex-direction:column;gap:5px;display:flex}.preview-comparison h4{text-transform:uppercase;margin:0 0 5px}.preview-comparison span{background:#f2f6f3;border-radius:5px;padding:5px 8px}.preview-comparison i{align-self:center;font-style:normal}.proposal-understanding{background:#f4faf6;border:1px solid #bdd5c5;border-radius:10px;margin:18px 0;padding:18px}.proposal-understanding>h3{margin:0}.proposal-understanding>p{color:#66766d}.proposal-understanding article{background:#fff;border:1px solid #d9e4dc;border-radius:8px;margin-top:12px;padding:14px}.proposal-understanding article header{align-items:center;gap:9px;display:flex}.proposal-understanding article header b{color:#177146;margin-left:auto;font-size:18px}.proposal-understanding article header span{color:#456152;text-transform:uppercase;background:#e6f1e9;border-radius:4px;padding:3px 6px;font:10px monospace}.proposal-understanding article>p{margin:8px 0;font-size:18px}.proposal-understanding article>small{color:#68776f;margin-bottom:10px;display:block}.proposal-understanding article>div{color:#3f5549;justify-content:space-between;gap:10px;padding-top:5px;font-size:12px;display:flex}.proposal-understanding article>div code{color:#7a877f}.understanding-unknowns{background:#fff8eb;border-left:3px solid #b47b1f;margin-top:14px;padding:12px}.understanding-unknowns h4{margin:0}.proposal-understanding>footer{color:#6b7971;flex-wrap:wrap;gap:14px;margin-top:14px;font-size:11px;display:flex}.proposal-verification{border:1px solid #cddbd3;border-radius:9px;margin:15px 0;padding:14px}.proposal-verification.converged{border-color:#3a9b72}.proposal-verification.diverged{border-color:#c94b45}.proposal-verification>div{border-top:1px solid #dce5df;grid-template-columns:9rem 1fr;gap:.5rem;padding:.45rem 0;display:grid}.proposal-verification small{color:#68776f;grid-column:2}.proposal-history{padding:0;list-style:none}.proposal-history li{text-transform:capitalize;border-top:1px solid #e5ebe7;grid-template-columns:1fr auto;gap:2px 10px;padding:8px 0;display:grid}.proposal-history small{color:#829087;grid-column:1/-1}.proposal-boundary{background:#edf8f2;border:1px solid #b9d7c7;border-radius:9px;flex-wrap:wrap;align-items:center;gap:10px;margin-top:15px;padding:14px;display:flex}.proposal-boundary code{background:#fff;padding:7px;display:block}.proposal-boundary p{width:100%;margin:0}.proposal-modal{z-index:30;background:#0b191294;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.proposal-modal>section{background:#fff;border-radius:12px;width:min(520px,100%);max-height:80vh;padding:22px;overflow:auto;box-shadow:0 20px 70px #0000004d}.proposal-modal textarea{box-sizing:border-box;width:100%;min-height:90px}.proposal-modal footer{justify-content:flex-end;gap:8px;margin-top:18px;display:flex}.proposal-modal footer button{cursor:pointer;background:#fff;border:1px solid #bfcfc6;border-radius:7px;padding:9px 15px}.proposal-modal footer button:last-child{color:#fff;background:#1f7152}@media (width<=900px){.proposal-workspace-layout,.proposal-detail>header,.preview-comparison{grid-template-columns:1fr}.preview-comparison i{transform:rotate(90deg)}}.cp-page{grid-template-columns:minmax(0,1fr);gap:18px;display:grid}.cp-page code{overflow-wrap:anywhere}.cp-stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.cp-stat{background:#fff;border:1px solid #dce4de;border-radius:8px;padding:10px 12px}.cp-stat small{color:var(--stack-color-text-muted);letter-spacing:.1em;text-transform:uppercase;font-size:9px;font-weight:800;display:block}.cp-stat strong{color:#1d2b23;overflow-wrap:anywhere;margin-top:4px;font:600 19px/1.2 Georgia,serif;display:block}.cp-panels{grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;display:grid}.cp-cards{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;display:grid}.cp-pill{letter-spacing:.06em;text-transform:uppercase;border-radius:999px;padding:2px 8px;font-size:10px;font-weight:700;display:inline-block}.cp-pill-available,.cp-pill-insert,.cp-pill-independent,.cp-pill-added,.cp-pill-running{color:#1f684c;background:#e6f3ec}.cp-pill-partial,.cp-pill-update,.cp-pill-convergent,.cp-pill-changed{color:#8b5a1f;background:#fbf0df}.cp-pill-unsupported,.cp-pill-delete,.cp-pill-conflict,.cp-pill-removed,.cp-pill-failed{color:#9b2c2c;background:#fbe9e9}.cp-unavailable{background:#f7f8f6;border:1px dashed #c6d0c8;border-radius:10px;margin:12px 0;padding:16px 18px}.cp-unavailable h3{color:#33443a;font:600 16px/1.3 Georgia,serif}.cp-unavailable p{color:#5c6a61;max-width:82ch;margin-top:6px}.cp-unavailable-id{color:var(--stack-color-text-muted);margin:6px 0 0;font-size:12px}.cp-notice{color:#8b5a1f;background:#fdf6ea;border:1px solid #eddcbf;border-radius:7px;padding:9px 12px;font-size:12px}.cp-error{color:#9b2c2c;background:#fff0f0;border:1px solid #f1caca;border-radius:7px;align-items:center;gap:10px;padding:9px 12px;font-size:12px;display:flex}.cp-loading,.cp-empty{color:var(--stack-color-text-muted);padding:18px;font-style:italic}.cp-muted{color:var(--stack-color-text-muted);font-size:12px}.cp-attribution{background:#f2f6f3;border-left:3px solid #287052;border-radius:0 7px 7px 0;padding:10px 12px;font-size:13px}.cp-json{color:#22312a;white-space:pre-wrap;overflow-wrap:anywhere;background:#f7f9f7;border:1px solid #e0e7e2;border-radius:7px;max-height:380px;padding:12px;font-size:11px;line-height:1.55;overflow:auto}.cp-raw{margin-top:8px}.cp-raw summary{color:var(--stack-color-text-muted);cursor:pointer;font-size:11px}.cp-path,.cp-identity{font-size:11px}.cp-identity{color:#405146}.cp-tabs{margin:6px 0 12px}.cp-tabpanel{padding-top:0}.cp-filter{flex-wrap:wrap;gap:8px;margin-bottom:10px;display:flex}.cp-filter input,.cp-filter select{color:#20342a;background:#fff;border:1px solid #cbd8cf;border-radius:6px;padding:7px 9px;font-size:12px}.cp-detail{margin-top:16px}.cp-detail-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.cp-detail-header h2{margin:2px 0 4px;font:600 22px/1.2 Georgia,serif}.cp-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.cp-record{grid-template-columns:minmax(140px,220px) 1fr;gap:6px 16px;margin-top:10px;display:grid}.cp-record dt{color:#5c6a61;font-size:12px;font-weight:600}.cp-record dt small{color:#97a19a;font-size:10px;font-weight:500;display:block}.cp-record dd{overflow-wrap:anywhere;font-size:13px}.cp-keys{flex-wrap:wrap;gap:4px;display:flex}.cp-keys code{color:#405146;font-size:10px}.cp-capabilities{flex-wrap:wrap;gap:5px;margin:8px 0;display:flex}.cp-capabilities code{color:#1f684c;background:#eaf3ee;border-radius:5px;padding:2px 7px;font-size:11px}.cp-grant{border-radius:5px;margin:2px 4px 2px 0;padding:2px 8px;font-size:11px;display:inline-block}.cp-grant small{opacity:.8;font-size:9px;display:block}.cp-grant.granted{color:#1f684c;background:#e6f3ec}.cp-grant.denied{color:#8b5a1f;background:#fbf0df}.cp-agent-card{text-align:left;cursor:pointer;width:100%;display:block}.cp-agent-card h3{margin:3px 0 4px;font:600 18px/1.2 Georgia,serif}.cp-connect{gap:12px;margin-top:18px;display:grid}.cp-connect label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cp-connect input[type=text],.cp-connect input:not([type]){color:#20342a;background:#fbfcf9;border:1px solid #cbd8cf;border-radius:6px;padding:8px 10px;font-size:12px}.cp-connect fieldset{border:1px solid #dce4de;border-radius:8px;padding:10px 12px}.cp-connect legend{color:#65736a;letter-spacing:.07em;text-transform:uppercase;padding:0 6px;font-size:9px;font-weight:800}.cp-check{align-items:center;gap:7px;text-transform:none!important;letter-spacing:0!important;flex-direction:row!important;font-size:12px!important;font-weight:500!important;display:flex!important}.cp-connected{color:#1f684c;background:#eaf5ee;border:1px solid #cce5d5;border-radius:7px;padding:10px 12px;font-size:12px}.cp-action-form{gap:10px;margin-top:16px;display:grid}.cp-action-form label{color:#65736a;letter-spacing:.07em;text-transform:uppercase;gap:5px;font-size:9px;font-weight:800;display:grid}.cp-action-form input,.cp-action-form select{color:#20342a;background:#fbfcf9;border:1px solid #cbd8cf;border-radius:6px;padding:8px 10px;font-size:12px}.cp-action-form label small{color:#97a19a;text-transform:none;letter-spacing:0;font-weight:500}.cp-reconcile{gap:14px;display:grid}.cp-parent-choice{background:#f7f9f7;border:1px solid #e0e7e2;border-radius:8px;gap:6px;padding:10px 12px;display:grid}.cp-overrides{gap:8px;display:grid}.cp-overrides label{grid-template-columns:minmax(120px,240px) 1fr;align-items:center;gap:10px;display:grid}.cp-overrides input{border:1px solid #cbd8cf;border-radius:6px;padding:7px 9px;font-size:12px}.cp-committed{border-left:3px solid #287052}.cp-value-old code{color:#9b2c2c}.cp-value-new code{color:#1f684c}.cp-row-conflict{background:#fdf3f3}.cp-note{color:#5c6a61;max-width:52ch;font-size:11px}.data-browser tr.selected{background:#eef5f0}.nav-unavailable{opacity:.6}.nav-note{font-size:11px;font-weight:400}:root{--primary-color:#007bff;--success-color:#28a745;--warning-color:#ffc107;--danger-color:#dc3545;--dark:#1a1a1a;--light:#f5f5f5;--border:#e0e0e0;--text-muted:#999}*{box-sizing:border-box;margin:0;padding:0}html,body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}#root{width:100%;height:100%}body{background:var(--light);color:#333}a{color:var(--primary-color);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin:0;font-weight:600}p{line-height:1.5}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ccc;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#999}*{scrollbar-color:#ccc transparent;scrollbar-width:thin}
@@ -1,3 +1,3 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-CoZaxnlm.js"></script>
2
- <link rel="stylesheet" crossorigin href="/assets/index-CiC8VY-a.css">
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-Dql1hS5m.js"></script>
2
+ <link rel="stylesheet" crossorigin href="/assets/index-vi21oEQa.css">
3
3
  </head><body><div id="root"></div></body></html>
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Privacy-preserving, anonymous telemetry for adoption analytics.
5
5
  * No source code, project names, filesystem paths, or PII collected.
6
+ * Disabled by default; opt in with FELTDB_TELEMETRY=1.
6
7
  * Fail-open: telemetry failures never affect FeltDB operation.
7
8
  */
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,OAAO,GACP,OAAO,GACP,MAAM,GACN,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AA8CD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA8B;gBAEjC,WAAW,GAAE,MAAgB;IAczC;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IA6BzC;;OAEG;YACW,KAAK;IAqBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;;OAGG;YACW,UAAU;IA6BxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAkBb;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC;AAOD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CAKxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAEjE"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4CH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,OAAO,GACP,OAAO,GACP,MAAM,GACN,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AA8CD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA8B;gBAEjC,WAAW,GAAE,MAAgB;IAczC;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IA6BzC;;OAEG;YACW,KAAK;IAqBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;;OAGG;YACW,UAAU;IA6BxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAkBb;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC;AAOD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CAKxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAEjE"}
package/dist/telemetry.js CHANGED
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Privacy-preserving, anonymous telemetry for adoption analytics.
5
5
  * No source code, project names, filesystem paths, or PII collected.
6
+ * Disabled by default; opt in with FELTDB_TELEMETRY=1.
6
7
  * Fail-open: telemetry failures never affect FeltDB operation.
7
8
  */
8
9
  const isBrowserRuntime = () => typeof window !== 'undefined' && typeof window.document !== 'undefined';
@@ -99,9 +100,9 @@ export class TelemetryClient {
99
100
  constructor(coreVersion = '0.5.7') {
100
101
  this.coreVersion = coreVersion;
101
102
  this.identity = new InstallationIdentity();
102
- // Check if telemetry is disabled
103
- this.enabled = environmentValue('FELTDB_TELEMETRY') !== '0' &&
104
- environmentValue('FELTDB_TELEMETRY') !== 'false';
103
+ // Telemetry is off by default; opt in with FELTDB_TELEMETRY=1 or true
104
+ const optIn = environmentValue('FELTDB_TELEMETRY')?.toLowerCase();
105
+ this.enabled = optIn === '1' || optIn === 'true';
105
106
  // Detect browser environment
106
107
  if (isBrowserRuntime()) {
107
108
  this.runtime = 'browser';
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Transaction identity: what a transaction ID is bound to.
3
+ *
4
+ * A transaction ID names one logical transaction *and* its contents. The
5
+ * embedded runtimes record the ID together with a digest of the request, so a
6
+ * retry can be told apart from a different request that happens to reuse the
7
+ * ID. The design and its compatibility analysis are in
8
+ * `adrs/transaction-identity-and-payload-binding.md`.
9
+ *
10
+ * Everything here is synchronous and dependency-free (SHA-256 is the portable
11
+ * implementation in `stable-hash.ts`), because the digest must
12
+ * be computed before a runtime opens its commit boundary (an IndexedDB
13
+ * transaction cannot be held open across an `await`) and must behave the same
14
+ * in Node and in a browser served from an insecure origin, where
15
+ * `crypto.subtle` is unavailable.
16
+ */
17
+ import type { AtomicTransactionRequest } from './transaction.js';
18
+ /** The construction version this build writes. */
19
+ export declare const TRANSACTION_DIGEST_VERSION = "txd1";
20
+ /** A request that cannot be given an identity because it is not valid. */
21
+ export declare class InvalidTransactionPayload extends Error {
22
+ constructor(message: string);
23
+ }
24
+ /**
25
+ * Serialize `value` as RFC 8785 canonical JSON.
26
+ *
27
+ * Object members are sorted by UTF-16 code unit, numbers use the ECMAScript
28
+ * shortest form (`-0` is `0`), strings use the standard escapes, and there is
29
+ * no insignificant whitespace. Members whose value is `undefined` are omitted,
30
+ * exactly as `JSON.stringify` and a caller who left them out would produce.
31
+ * Array order is preserved.
32
+ *
33
+ * Anything that is not a JSON value is refused rather than coerced: `NaN`,
34
+ * `Infinity`, `undefined` in an array, `BigInt`, symbols, functions, cycles,
35
+ * and non-plain objects such as `Date` or `Map`.
36
+ */
37
+ export declare function canonicalJsonStrict(value: unknown, where?: string): string;
38
+ /**
39
+ * The semantic request: what the runtime acts on, and nothing else.
40
+ *
41
+ * The transaction ID is the key the digest is stored under, so it is not part
42
+ * of it. Operations, preconditions and fences are ordered arrays; reordering
43
+ * them is a different request.
44
+ */
45
+ export declare function semanticRequest(request: AtomicTransactionRequest): Record<string, unknown>;
46
+ /**
47
+ * `txd1:sha256:<hex>` over the canonical form of the semantic request.
48
+ *
49
+ * @throws InvalidTransactionPayload when the request holds a non-JSON value
50
+ */
51
+ export declare function transactionDigest(request: AtomicTransactionRequest): string;
52
+ /** What a stored digest says about a retry's digest. */
53
+ export type DigestComparison = 'match' | 'mismatch' | 'unverifiable';
54
+ /**
55
+ * Compare a recorded digest with a retry's.
56
+ *
57
+ * A digest of a version this build cannot compute, or one that is not a
58
+ * well-formed digest at all, cannot be judged either way, so it is neither a
59
+ * match nor a mismatch: the caller must fail closed.
60
+ */
61
+ export declare function compareDigests(stored: unknown, computed: string): DigestComparison;
62
+ //# sourceMappingURL=transaction-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-identity.d.ts","sourceRoot":"","sources":["../src/transaction-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,kDAAkD;AAClD,eAAO,MAAM,0BAA0B,SAAS,CAAC;AAKjD,0EAA0E;AAC1E,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,MAAM,CAE3E;AA+DD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAG3E;AAED,wDAAwD;AACxD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;AAErE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAKlF"}
@@ -0,0 +1,138 @@
1
+ import { sha256Hex } from './stable-hash.js';
2
+ /** The construction version this build writes. */
3
+ export const TRANSACTION_DIGEST_VERSION = 'txd1';
4
+ /** `txd1:sha256:<64 lowercase hex>` -- the prefix names the whole construction. */
5
+ const DIGEST_FORM = /^(txd\d+):sha256:[0-9a-f]{64}$/;
6
+ /** A request that cannot be given an identity because it is not valid. */
7
+ export class InvalidTransactionPayload extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'InvalidTransactionPayload';
11
+ }
12
+ }
13
+ /* ---------------------------------------------------------------------------
14
+ * Canonical JSON (RFC 8785)
15
+ * ------------------------------------------------------------------------ */
16
+ const LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/;
17
+ function canonicalString(text, where) {
18
+ if (LONE_SURROGATE.test(text))
19
+ throw new InvalidTransactionPayload(`${where} contains a lone surrogate, which has no UTF-8 form`);
20
+ return JSON.stringify(text);
21
+ }
22
+ /**
23
+ * Serialize `value` as RFC 8785 canonical JSON.
24
+ *
25
+ * Object members are sorted by UTF-16 code unit, numbers use the ECMAScript
26
+ * shortest form (`-0` is `0`), strings use the standard escapes, and there is
27
+ * no insignificant whitespace. Members whose value is `undefined` are omitted,
28
+ * exactly as `JSON.stringify` and a caller who left them out would produce.
29
+ * Array order is preserved.
30
+ *
31
+ * Anything that is not a JSON value is refused rather than coerced: `NaN`,
32
+ * `Infinity`, `undefined` in an array, `BigInt`, symbols, functions, cycles,
33
+ * and non-plain objects such as `Date` or `Map`.
34
+ */
35
+ export function canonicalJsonStrict(value, where = 'value') {
36
+ return write(value, where, new Set());
37
+ }
38
+ function write(value, where, active) {
39
+ if (value === null)
40
+ return 'null';
41
+ switch (typeof value) {
42
+ case 'boolean': return value ? 'true' : 'false';
43
+ case 'string': return canonicalString(value, where);
44
+ case 'number':
45
+ if (!Number.isFinite(value))
46
+ throw new InvalidTransactionPayload(`${where} is ${value}, which is not a JSON number`);
47
+ return String(value);
48
+ case 'object': break;
49
+ default:
50
+ throw new InvalidTransactionPayload(`${where} is a ${typeof value}, which is not a JSON value`);
51
+ }
52
+ const object = value;
53
+ if (active.has(object))
54
+ throw new InvalidTransactionPayload(`${where} is part of a cycle`);
55
+ active.add(object);
56
+ try {
57
+ if (Array.isArray(object)) {
58
+ const parts = [];
59
+ for (let index = 0; index < object.length; index += 1) {
60
+ if (!(index in object) || object[index] === undefined) {
61
+ throw new InvalidTransactionPayload(`${where}[${index}] is ${index in object ? 'undefined' : 'a hole'}; arrays hold JSON values only`);
62
+ }
63
+ parts.push(write(object[index], `${where}[${index}]`, active));
64
+ }
65
+ return `[${parts.join(',')}]`;
66
+ }
67
+ const prototype = Object.getPrototypeOf(object);
68
+ if (prototype !== Object.prototype && prototype !== null) {
69
+ throw new InvalidTransactionPayload(`${where} is a ${prototype?.constructor?.name ?? 'non-plain object'}; only plain objects are JSON values`);
70
+ }
71
+ const record = object;
72
+ const members = Object.keys(record).filter(key => record[key] !== undefined).sort();
73
+ return `{${members.map(key => `${canonicalString(key, `${where} key`)}:${write(record[key], `${where}.${key}`, active)}`).join(',')}}`;
74
+ }
75
+ finally {
76
+ active.delete(object);
77
+ }
78
+ }
79
+ /* ---------------------------------------------------------------------------
80
+ * The txd1 digest
81
+ * ------------------------------------------------------------------------ */
82
+ function pick(source, fields, where) {
83
+ const record = source;
84
+ const picked = {};
85
+ for (const field of fields)
86
+ if (record[field] !== undefined)
87
+ picked[field] = record[field];
88
+ // `ifVersion` and `expectedVersion` are one predicate (see
89
+ // `normalisePrecondition`); the digest knows only the wire spelling.
90
+ if (picked.ifVersion !== undefined) {
91
+ if (picked.expectedVersion !== undefined && picked.expectedVersion !== picked.ifVersion) {
92
+ throw new InvalidTransactionPayload(`${where} supplies ifVersion ${String(picked.ifVersion)} and expectedVersion ${String(picked.expectedVersion)}; they are the same predicate`);
93
+ }
94
+ picked.expectedVersion = picked.ifVersion;
95
+ delete picked.ifVersion;
96
+ }
97
+ return picked;
98
+ }
99
+ const OPERATION_FIELDS = ['collection', 'id', 'value', 'requireAbsent', 'ifVersion', 'expectedVersion', 'expectedEpoch', 'expectedLeaseId'];
100
+ const PRECONDITION_FIELDS = ['collection', 'id', 'requireAbsent', 'ifVersion', 'expectedVersion', 'expectedEpoch', 'expectedLeaseId'];
101
+ /**
102
+ * The semantic request: what the runtime acts on, and nothing else.
103
+ *
104
+ * The transaction ID is the key the digest is stored under, so it is not part
105
+ * of it. Operations, preconditions and fences are ordered arrays; reordering
106
+ * them is a different request.
107
+ */
108
+ export function semanticRequest(request) {
109
+ return {
110
+ operations: request.operations.map((operation, index) => pick(operation, OPERATION_FIELDS, `operations[${index}]`)),
111
+ preconditions: (request.preconditions ?? []).map((condition, index) => pick(condition, PRECONDITION_FIELDS, `preconditions[${index}]`)),
112
+ fences: (request.fences ?? []).map(fence => ({ token: fence.token, reads: fence.reads })),
113
+ };
114
+ }
115
+ /**
116
+ * `txd1:sha256:<hex>` over the canonical form of the semantic request.
117
+ *
118
+ * @throws InvalidTransactionPayload when the request holds a non-JSON value
119
+ */
120
+ export function transactionDigest(request) {
121
+ const canonical = canonicalJsonStrict(semanticRequest(request), 'transaction');
122
+ return `${TRANSACTION_DIGEST_VERSION}:sha256:${sha256Hex(canonical)}`;
123
+ }
124
+ /**
125
+ * Compare a recorded digest with a retry's.
126
+ *
127
+ * A digest of a version this build cannot compute, or one that is not a
128
+ * well-formed digest at all, cannot be judged either way, so it is neither a
129
+ * match nor a mismatch: the caller must fail closed.
130
+ */
131
+ export function compareDigests(stored, computed) {
132
+ if (typeof stored !== 'string')
133
+ return 'unverifiable';
134
+ const form = DIGEST_FORM.exec(stored);
135
+ if (!form || form[1] !== TRANSACTION_DIGEST_VERSION)
136
+ return 'unverifiable';
137
+ return stored === computed ? 'match' : 'mismatch';
138
+ }