okengine 0.9.1 → 0.10.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 (166) hide show
  1. package/AGENTS.md +1 -1
  2. package/manifest.v1.schema.json +9 -1
  3. package/package.json +3 -3
  4. package/site/content/docs/console/runs.mdx +10 -0
  5. package/site/content/docs/console/traces.mdx +4 -0
  6. package/site/content/docs/elements/ai.mdx +54 -32
  7. package/site/content/docs/elements/channel.mdx +97 -9
  8. package/site/content/docs/elements/clock.mdx +1 -0
  9. package/site/content/docs/elements/flow.mdx +42 -8
  10. package/site/content/docs/get-started/basic-usage.mdx +5 -1
  11. package/site/content/docs/get-started/installation.mdx +9 -5
  12. package/site/content/docs/meta.json +2 -0
  13. package/site/content/docs/providers/azure-redis.mdx +85 -0
  14. package/site/content/docs/providers/cockroachdb.mdx +86 -0
  15. package/site/content/docs/providers/digitalocean-caching.mdx +88 -0
  16. package/site/content/docs/providers/dragonfly-cloud.mdx +82 -0
  17. package/site/content/docs/providers/elasticache.mdx +92 -0
  18. package/site/content/docs/providers/index.mdx +101 -0
  19. package/site/content/docs/providers/memorystore.mdx +89 -0
  20. package/site/content/docs/providers/meta.json +20 -0
  21. package/site/content/docs/providers/neon.mdx +115 -0
  22. package/site/content/docs/providers/redis-cloud.mdx +93 -0
  23. package/site/content/docs/providers/supabase.mdx +117 -0
  24. package/site/content/docs/providers/upstash.mdx +91 -0
  25. package/site/content/docs/providers/yugabytedb.mdx +95 -0
  26. package/site/content/docs/recipes/caddy.mdx +128 -0
  27. package/site/content/docs/recipes/cockroachdb.mdx +127 -0
  28. package/site/content/docs/recipes/dragonfly.mdx +125 -0
  29. package/site/content/docs/recipes/index.mdx +146 -0
  30. package/site/content/docs/recipes/llama-cpp.mdx +153 -0
  31. package/site/content/docs/recipes/mailpit.mdx +136 -0
  32. package/site/content/docs/recipes/meilisearch.mdx +139 -0
  33. package/site/content/docs/recipes/meta.json +31 -0
  34. package/site/content/docs/recipes/ollama.mdx +142 -0
  35. package/site/content/docs/recipes/openbao.mdx +141 -0
  36. package/site/content/docs/recipes/pgdog.mdx +137 -0
  37. package/site/content/docs/recipes/postgres.mdx +136 -0
  38. package/site/content/docs/recipes/redis.mdx +130 -0
  39. package/site/content/docs/recipes/rustfs.mdx +148 -0
  40. package/site/content/docs/recipes/sglang.mdx +105 -0
  41. package/site/content/docs/recipes/supabase-docker.mdx +145 -0
  42. package/site/content/docs/recipes/timescale.mdx +129 -0
  43. package/site/content/docs/recipes/traefik.mdx +136 -0
  44. package/site/content/docs/recipes/valkey.mdx +121 -0
  45. package/site/content/docs/recipes/vllm.mdx +106 -0
  46. package/site/content/docs/recipes/yugabytedb.mdx +135 -0
  47. package/site/content/docs/reference/cli.md +42 -6
  48. package/site/content/docs/reference/configuration.mdx +5 -3
  49. package/site/content/docs/reference/environment-variables.mdx +12 -12
  50. package/site/content/docs/reference/fx.mdx +38 -4
  51. package/src/cli/ai-setup/ai-setup.test.ts +32 -12
  52. package/src/cli/ai-setup/apply.ts +65 -23
  53. package/src/cli/ai-setup/catalog.ts +1316 -35
  54. package/src/cli/ai-setup/detect-ollama.ts +47 -0
  55. package/src/cli/ai-setup/index.ts +44 -7
  56. package/src/cli/ai-setup/prompts.ts +430 -486
  57. package/src/cli/ai-setup/recommend.test.ts +150 -50
  58. package/src/cli/ai-setup/recommend.ts +118 -101
  59. package/src/cli/ask-seed.test.ts +68 -0
  60. package/src/cli/ask-seed.ts +79 -0
  61. package/src/cli/db-seed-redact.test.ts +25 -0
  62. package/src/cli/db-seed.ts +36 -7
  63. package/src/cli/db.test.ts +1 -1
  64. package/src/cli/db.ts +2 -2
  65. package/src/cli/dev-controls.test.ts +107 -0
  66. package/src/cli/dev-controls.ts +354 -0
  67. package/src/cli/dev-schema-sync.ts +12 -4
  68. package/src/cli/dev.test.ts +50 -30
  69. package/src/cli/dev.ts +607 -66
  70. package/src/cli/drizzle-env.test.ts +40 -6
  71. package/src/cli/drizzle-env.ts +22 -1
  72. package/src/cli/ensure-drizzle-config.ts +6 -4
  73. package/src/cli/hero-meta.test.ts +13 -1
  74. package/src/cli/hero-meta.ts +28 -6
  75. package/src/cli/index.ts +5 -0
  76. package/src/cli/registry.ts +24 -0
  77. package/src/cli/replay.test.ts +105 -0
  78. package/src/cli/replay.ts +206 -0
  79. package/src/compiler/extract.ts +3 -3
  80. package/src/config/index.ts +3 -3
  81. package/src/console/server/claim.ts +3 -1
  82. package/src/console/ui/dist/assets/{index-ClX0ZCe5.js → index-D-9KFce5.js} +2 -2
  83. package/src/console/ui/dist/assets/panel-overview-CW0CQEc2.js +1 -0
  84. package/src/console/ui/dist/assets/panel-runs-BxuyDI3x.js +1 -0
  85. package/src/console/ui/dist/assets/{panel-signals-Dsxdu_AR.js → panel-signals-BXofbj7v.js} +1 -1
  86. package/src/console/ui/dist/assets/{panel-store-hy7O8HOs.js → panel-store-B8mH-arU.js} +1 -1
  87. package/src/console/ui/dist/assets/{panel-traces-CBiAe5go.js → panel-traces-DSA-ZWnf.js} +1 -1
  88. package/src/console/ui/dist/index.html +1 -1
  89. package/src/console/ui/overview/slo.ts +31 -3
  90. package/src/console/ui/overview/types.ts +6 -0
  91. package/src/console/ui/runs/errors.test.ts +53 -0
  92. package/src/console/ui/runs/errors.ts +88 -0
  93. package/src/console/ui/runs/index.ts +8 -0
  94. package/src/console/ui/runs/search.ts +16 -0
  95. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +72 -1
  96. package/src/docker/ai-model-status.test.ts +101 -0
  97. package/src/docker/ai-model-status.ts +276 -0
  98. package/src/docker/compose-health.test.ts +115 -0
  99. package/src/docker/compose-health.ts +234 -0
  100. package/src/docker/compose.ts +24 -8
  101. package/src/docker/derive.ts +35 -9
  102. package/src/docker/docker.test.ts +304 -12
  103. package/src/docker/helpers.ts +56 -0
  104. package/src/docker/index.ts +52 -0
  105. package/src/docker/ollama-pull.ts +232 -0
  106. package/src/docker/recipes/cockroach.ts +24 -0
  107. package/src/docker/recipes/index.ts +32 -0
  108. package/src/docker/recipes/llama-cpp.ts +273 -0
  109. package/src/docker/recipes/ollama.ts +19 -23
  110. package/src/docker/recipes/pgdog.ts +4 -1
  111. package/src/docker/recipes/postgres.ts +5 -18
  112. package/src/docker/recipes/sglang.ts +55 -0
  113. package/src/docker/recipes/supabase.ts +21 -0
  114. package/src/docker/recipes/timescale.ts +18 -0
  115. package/src/docker/recipes/vllm.ts +44 -0
  116. package/src/docker/recipes/yugabyte.ts +23 -0
  117. package/src/docker/stack-id.test.ts +22 -0
  118. package/src/docker/stack-id.ts +38 -4
  119. package/src/docker/types.ts +15 -0
  120. package/src/drivers/ai-ollama.integration.test.ts +7 -4
  121. package/src/drivers/signal-engine.ts +10 -0
  122. package/src/drivers/signal-postgres.ts +24 -2
  123. package/src/drivers/signal-types.ts +10 -0
  124. package/src/elements/channel/fallback.test.ts +91 -0
  125. package/src/elements/channel/hard-bounce.test.ts +82 -0
  126. package/src/elements/channel/injection.test.ts +153 -0
  127. package/src/elements/channel/locale-ar.test.ts +102 -0
  128. package/src/elements/channel/otp-delivery.ts +5 -2
  129. package/src/elements/channel/receipts-ledger.test.ts +100 -0
  130. package/src/elements/channel/runtime.ts +24 -1
  131. package/src/elements/channel/test-helpers.ts +60 -0
  132. package/src/elements/channel/whatsapp-compliance.test.ts +124 -0
  133. package/src/elements/store/cache.ts +1 -1
  134. package/src/elements/store/emit-drizzle.ts +43 -9
  135. package/src/elements/store/runtime.ts +1 -1
  136. package/src/elements/store/schema-decl.test.ts +2 -0
  137. package/src/elements/store/schema-decl.ts +15 -0
  138. package/src/elements/store/seed.ts +1 -1
  139. package/src/index.ts +1 -0
  140. package/src/kernel/app.ts +117 -10
  141. package/src/kernel/boot-bind/signal.ts +6 -2
  142. package/src/kernel/boot-bind/store.ts +2 -1
  143. package/src/kernel/boot.test.ts +6 -5
  144. package/src/kernel/boot.ts +8 -3
  145. package/src/kernel/compensate.test.ts +131 -0
  146. package/src/kernel/correlation.test.ts +108 -0
  147. package/src/kernel/effect-timing.test.ts +82 -0
  148. package/src/kernel/flow.ts +38 -0
  149. package/src/kernel/fx-runs.test.ts +49 -0
  150. package/src/kernel/fx.test.ts +14 -0
  151. package/src/kernel/fx.ts +111 -1
  152. package/src/manifest/types.ts +8 -2
  153. package/src/runs/collect.ts +3 -0
  154. package/src/runs/export-otlp.ts +64 -0
  155. package/src/runs/index.ts +16 -0
  156. package/src/runs/parquet.ts +9 -0
  157. package/src/runs/types.ts +5 -0
  158. package/src/runs/window.test.ts +68 -0
  159. package/src/runs/window.ts +148 -0
  160. package/src/runtime/boot-warn.test.ts +45 -0
  161. package/src/runtime/boot-warn.ts +17 -0
  162. package/src/runtime/dev-request-log.ts +5 -5
  163. package/src/term.test.ts +95 -10
  164. package/src/term.ts +369 -14
  165. package/src/console/ui/dist/assets/panel-overview-DONDzBd2.js +0 -1
  166. package/src/console/ui/dist/assets/panel-runs-D5zf-D9c.js +0 -1
@@ -0,0 +1 @@
1
+ import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{Q as n,d as r,n as i,nt as a,tt as o,u as s}from"./panel-access-ri1X9Otj.js";import{n as c}from"./panel-diff-CFuWxiXy.js";import{n as l}from"./panel-ai-DLHjRoJk.js";import{c as u,n as d,u as f}from"./panel-architecture-DI3bQF3J.js";import{r as p}from"./panel-channels-BDYWX29p.js";import{n as m}from"./panel-clock-i-JpTjVB.js";import{n as h}from"./panel-gates-CfkBgco7.js";var g=[`!=`,`>=`,`<=`,`=`,`>`,`<`];function _(e){if(!e||!e.trim())return{clauses:[]};let t=e.split(/\s+AND\s+/i).map(e=>e.trim()).filter(Boolean),n=[];for(let e of t){let t=re(e);t&&n.push(t)}return{clauses:n}}function v(e){return e.clauses.map(te).join(` AND `)}function y(e,t){return{clauses:[...e.clauses.filter(e=>e.dimension!==t.dimension),t]}}function b(e,t){return{clauses:e.clauses.filter(e=>e.dimension!==t)}}function x(e,t){for(let n of t.clauses)if(!se(e,n))return!1;return!0}function ee(e,t){return t.clauses.length===0?[...e]:e.filter(e=>x(e,t))}function te(e){let t=oe(e.dimension,e.value);return`${e.dimension} ${e.op} ${t}`}var ne=[`flow`,`unit`,`trigger`,`plane`,`tenant`,`principal`,`cache`,`replica`,`error`,`buildVersion`,`promptVersion`,`duration`];function re(e){let t=null,n=-1;for(let r of g){let i=e.indexOf(` ${r} `);if(i!==-1){t=r,n=i;break}}if(t===null||n<0)return null;let r=e.slice(0,n).trim(),i=e.slice(n+t.length+2).trim();if(!r||!i)return null;let a=ie(r,i);return a===void 0?null:{dimension:r,op:t,value:a}}function ie(e,t){return e===`duration`||e===`duration_ms`?ae(t):t===`true`?!0:t===`false`?!1:t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1):/^-?\d+(\.\d+)?$/.test(t)?Number(t):t}function ae(e){let t=/^(-?\d+(?:\.\d+)?)\s*(ms|s|m)?$/i.exec(e.trim());if(!t)return;let n=Number(t[1]),r=(t[2]??`ms`).toLowerCase();if(r===`ms`)return n;if(r===`s`)return n*1e3;if(r===`m`)return n*6e4}function oe(e,t){if(e===`duration`||e===`duration_ms`){let e=typeof t==`number`?t:Number(t);return Number.isFinite(e)?e>=6e4&&e%6e4==0?`${e/6e4}m`:e>=1e3&&e%1e3==0?`${e/1e3}s`:`${e}ms`:String(t)}return typeof t==`string`&&/\s/.test(t)?`"${t}"`:String(t)}function se(e,t){let n=S(e,t.dimension);if(n==null)return t.op===`!=`;let r=t.value;if(t.op===`=`)return C(n,r);if(t.op===`!=`)return!C(n,r);let i=w(n),a=w(r);return i===void 0||a===void 0?!1:t.op===`>`?i>a:t.op===`<`?i<a:t.op===`>=`?i>=a:t.op===`<=`&&i<=a}function S(e,t){switch(t){case`flow`:return e.flow;case`unit`:return e.unit??null;case`trigger`:return e.trigger;case`plane`:return e.plane;case`tenant`:return e.tenant??null;case`principal`:return e.principal??null;case`cache`:return e.cache;case`replica`:return e.replica??null;case`replicaLagMs`:case`replica_lag_ms`:return e.replicaLagMs??null;case`error`:case`error_code`:return e.error??null;case`buildVersion`:case`build_version`:return e.buildVersion??null;case`promptVersion`:case`prompt_version`:return e.promptVersion??null;case`cost`:return e.cost??null;case`duration`:case`duration_ms`:return e.durationMs;case`gates`:return e.gates.join(`,`);default:return e.dimensions[t]}}function C(e,t){if(typeof e==`number`||typeof t==`number`){let n=w(e),r=w(t);if(n!==void 0&&r!==void 0)return n===r}return String(e)===String(t)}function w(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`boolean`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function T(e,t){let n=new Map;for(let r of e){let e=S(r,t),i=e==null||e===``?`(empty)`:String(e),a=n.get(i)??[];a.push(r),n.set(i,a)}let r=[];for(let[e,t]of n){let n=t.map(e=>e.durationMs).sort((e,t)=>e-t),i=n.reduce((e,t)=>e+t,0),a=t.reduce((e,t)=>e+(t.cost??0),0);r.push({key:e,count:t.length,avgDurationMs:t.length===0?0:i/t.length,p50DurationMs:E(n,.5),p99DurationMs:E(n,.99),sumCost:a})}return r.sort((e,t)=>t.count-e.count||e.key.localeCompare(t.key)),r}function ce(e){let t=new Set([`flow`,`unit`,`trigger`,`plane`,`tenant`,`principal`,`cache`,`replica`,`error`,`buildVersion`,`promptVersion`]);for(let n of e)for(let e of Object.keys(n.dimensions))e!==`duration_ms`&&t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function E(e,t){return e.length===0?0:e.length===1?e[0]:e[Math.min(e.length-1,Math.max(0,Math.ceil(t*e.length)-1))]}function le(e){if(e.length===0)return null;let t=T(e,`flow`)[0];return!t||t.key===`(empty)`?null:{busiestFlow:t.key,runCount:t.count,href:`/flows?flow=${encodeURIComponent(t.key)}`}}var D=6048e5;function ue(e){let{manifest:t,ai:n,runs:r,now:i}=e,a=i-D,o=[];for(let[e,n]of Object.entries(t?.flows??{})){let t=n.cost?.budget;if(t==null||t<=0)continue;let s=de(r.filter(t=>t.flow===e&&t.startedAt>=a&&t.startedAt<=i));o.push(O({id:`flow:${e}`,name:e,kind:`flow`,declaredBudget:t,spent:s,windowMs:D}))}if(n){for(let e of n.prompts){let t=e.budgetMaxCostPerCall;if(t==null||t<=0)continue;let r=n.versions.find(t=>t.prompt===e.name&&t.version===e.version)??n.versions.filter(t=>t.prompt===e.name).sort((e,t)=>t.version-e.version)[0];if(!r||r.sampleCount===0)continue;let i=t*r.sampleCount,a=r.cost.mean*r.sampleCount;o.push(O({id:`ai-prompt:${e.name}@${r.version}`,name:`${e.name}@${r.version}`,kind:`ai-prompt`,declaredBudget:i,spent:a,windowMs:D}))}for(let e of n.agents){let t=e.budgetMaxCostPerRun;if(t==null||t<=0)continue;let r=n.agentRuns.filter(t=>t.agent===e.name);if(r.length===0)continue;let i=t*r.length,a=r.reduce((e,t)=>e+t.cost,0);o.push(O({id:`ai-agent:${e.name}`,name:e.name,kind:`ai-agent`,declaredBudget:i,spent:a,windowMs:D}))}}return o.sort((e,t)=>t.burnRate-e.burnRate||e.name.localeCompare(t.name))}function O(e){let{declaredBudget:t,spent:n,windowMs:r}=e,i=t<=0?0:n/t,a=Math.max(0,1-(t<=0?0:n/t)),o=null;if(n>0&&i>0&&a>0){let e=n/r;e>0&&(o=(t-n)/e)}else i>=1&&a<=0&&(o=0);return{id:e.id,name:e.name,kind:e.kind,declaredBudget:t,spent:n,burnRate:i,remainingFraction:a,timeToExhaustionMs:o,windowMs:r}}function de(e){return e.reduce((e,t)=>e+(t.cost??0),0)}var k=36e5;function A(e,t){let n=t-k,r=e.filter(e=>e.startedAt>=n&&e.startedAt<=t),i=r.length,a=r.filter(e=>!!e.error).length,o=r.map(e=>e.durationMs).sort((e,t)=>e-t),s=r.filter(e=>e.replicaLagMs!=null&&e.replicaLagMs>200||e.cache===`miss`).length;return{latencyP99Ms:j(o,.99),trafficPerMin:i===0?0:i/(k/6e4),errorRate:i===0?0:a/i,saturation:i===0?0:s/i,sampleCount:i,windowMs:k}}function j(e,t){return e.length===0?0:e.length===1?e[0]:e[Math.min(e.length-1,Math.max(0,Math.ceil(t*e.length)-1))]}function M(e){return e.filter(e=>e.dead>0).map(e=>({signal:e.name,dead:e.dead,delivery:e.delivery})).sort((e,t)=>t.dead-e.dead||e.signal.localeCompare(t.signal))}var N=7776e6;function P(e,t){return e.filter(e=>e.kind===`secret`?e.lastReadAt==null||t-e.lastReadAt>=N:!1)}function F(e){return e.filter(e=>e.category===`permission-widening`&&(e.path.startsWith(`/plugins/`)||e.path.startsWith(`/plugins`)||e.summary.toLowerCase().includes(`plugin`))).map(e=>({path:e.path,summary:e.summary,kind:e.kind})).sort((e,t)=>e.path.localeCompare(t.path))}function I(e){return[...R(e.gatesAudit),...z(e.signals),...B(e.crons),...V(e.vaultSecrets,e.now),...H(e.channelOutcomes),...fe(e.architectureGraph),...pe(e.diffChanges),...U(e.aiVersions),...me(e.accessHygiene)].sort(L)}function L(e,t){return t.userHarm===e.userHarm?t.irreversibility===e.irreversibility?t.trend===e.trend?e.id.localeCompare(t.id):t.trend-e.trend:t.irreversibility-e.irreversibility:t.userHarm-e.userHarm}function R(e){return h(e).map(e=>({id:`gates:unguarded`,source:`gates`,title:`Unguarded flows`,detail:e.message,href:`/gates`,userHarm:90,irreversibility:80,trend:e.count}))}function z(e){return M(e).map(e=>({id:`signals:dlq:${e.signal}`,source:`signals`,title:`Dead letters`,detail:`${e.signal}: ${e.dead} dead letter${e.dead===1?``:`s`} (${e.delivery})`,href:`/signals?signal=${encodeURIComponent(e.signal)}`,userHarm:70,irreversibility:40,trend:e.dead}))}function B(e){return m(e).map(e=>({id:`clock:overdue:${e.name}`,source:`clock`,title:`Overdue cron`,detail:`${e.name} is overdue${e.missedRuns>0?` · ${e.missedRuns} missed`:``}`,href:`/clock?cron=${encodeURIComponent(e.name)}`,userHarm:60,irreversibility:30,trend:e.missedRuns}))}function V(e,t){let n=P(e,t);return n.length===0?[]:[{id:`vault:dormant`,source:`vault`,title:`Dormant secrets`,detail:`${n.length} secret${n.length===1?``:`s`} unread for 90+ days (or never): ${n.map(e=>e.name).join(`, `)}`,href:`/vault`,userHarm:50,irreversibility:70,trend:n.length}]}function H(e){return p(e).map(e=>({id:`channels:spam`,source:`channels`,title:`Spam complaints`,detail:`${e.count} delivered-then-complained — burns sender reputation`,href:`/channels`,userHarm:100,irreversibility:95,trend:e.count}))}function fe(e){return e?f(e).map(e=>({id:`architecture:cycle:${e.nodeIds.join(`>`)}`,source:`architecture`,title:e.title,detail:e.detail,href:`/architecture`,userHarm:65,irreversibility:55,trend:e.severity===`critical`?2:1})):[]}function pe(e){return F(e).map(e=>({id:`plugins:widen:${e.path}`,source:`plugins`,title:`Plugin capability widening`,detail:e.summary,href:`/diff?path=${encodeURIComponent(e.path)}`,userHarm:55,irreversibility:90,trend:1}))}function U(e){return l(e).map(e=>({id:`ai:budget:${e.prompt}@${e.version}`,source:`ai`,title:`Model budget overrun`,detail:`${e.prompt}@${e.version}: ${(e.overBudgetRate*100).toFixed(1)}% over budget (p95 $${e.p95Cost.toFixed(3)})`,href:`/ai?prompt=${encodeURIComponent(e.prompt)}&version=${e.version}`,userHarm:45,irreversibility:50,trend:Math.round(e.overBudgetRate*100)}))}function me(e){return i(e).map(t=>({id:`access:hygiene:${t.code}`,source:`access`,title:`Access hygiene`,detail:t.message,href:`/access`,userHarm:40,irreversibility:35,trend:t.code===`unused-keys`?e.unusedKeys.length:t.code===`never-signed-in`?e.neverSignedInOperators.length:e.expiredInvitations.length}))}function W(e){if(!e)return null;let t=/^(\d+(?:\.\d+)?)\s*(ms|s|m)?$/i.exec(e.trim());if(!t)return null;let n=Number(t[1]);if(!Number.isFinite(n)||n<0)return null;let r=(t[2]??`ms`).toLowerCase();return Math.round(r===`s`?n*1e3:r===`m`?n*6e4:n)}var G=36e5,he=2592e6,ge=7776e6,K=36e5;function q(e){let t=e.trim(),n=/^(\d+(?:\.\d+)?)\s*%?$/.exec(t);if(!n)return null;let r=Number(n[1]);return!Number.isFinite(r)||r<0||r>100?null:Math.max(0,1-r/100)}function J(e){if(!e)return[];let t=[];for(let[n,r]of Object.entries(e.flows??{})){let e=r.slo,i=e?.availability;if(!i)continue;let a=q(i);a!=null&&t.push({id:`flow:${n}`,kind:`flow`,name:n,availability:i,tolerableErrorRate:a,flowIds:[n],latencyP95Ms:W(e?.latency?.p95??void 0)})}for(let[n,r]of Object.entries(e.journeys??{})){let e=r.slo?.availability;if(!e)continue;let i=q(e);i!=null&&t.push({id:`journey:${n}`,kind:`journey`,name:n,availability:e,tolerableErrorRate:i,flowIds:Se(r),latencyP95Ms:W(r.slo?.latency?.p95??void 0)})}return t.sort((e,t)=>e.id.localeCompare(t.id))}function _e(e){return J(e.manifest).map(t=>ye(t,e.runs,e.now))}function ve(e){return J(e).length>0}function ye(e,t,n){let r=Y(t,e.flowIds,n-G,n),i=Y(t,e.flowIds,n-he,n),a=r.errorRate,o=e.tolerableErrorRate<=0?a>0?1/0:0:a/e.tolerableErrorRate,s=i.total*e.tolerableErrorRate,c=Math.max(0,s-i.errors),l=s<=0?i.errors>0?0:1:c/s,u=a-e.tolerableErrorRate,d=null;if(u>0&&r.total>0){let e=u*(r.total/G);e>0&&(d=c/e)}let f=xe(t,e.flowIds,e.tolerableErrorRate,n),p=f==null||n-f>=7776e6,m=be(t,e.flowIds,n-G,n),h=e.latencyP95Ms,g=h!=null&&r.total>0&&m>h;return{id:e.id,kind:e.kind,name:e.name,availability:e.availability,tolerableErrorRate:e.tolerableErrorRate,currentErrorRate:a,burnRate:o,remainingBudgetFraction:l,timeToExhaustionMs:d,ceremonial:p,lastBurnAt:f,sampleCount:r.total,errorCount:r.errors,latencyP95Ms:m,latencyP95ThresholdMs:h,latencyBreached:g}}function be(e,t,n,r){let i=new Set(t),a=e.filter(e=>e.startedAt>=n&&e.startedAt<=r&&(i.size===0||i.has(e.flow))).map(e=>e.durationMs).sort((e,t)=>e-t);return a.length===0?0:a.length===1?a[0]:a[Math.min(a.length-1,Math.max(0,Math.ceil(.95*a.length)-1))]}function Y(e,t,n,r){let i=new Set(t),a=0,o=0;for(let t of e)t.startedAt<n||t.startedAt>r||i.size>0&&!i.has(t.flow)||(a+=1,t.error&&(o+=1));return{total:a,errors:o,errorRate:a===0?0:o/a}}function xe(e,t,n,r){if(n<=0)return null;let i=r-ge,a=null;for(let o=i;o<r;o+=K){let i=Math.min(r,o+K),s=Y(e,t,o,i);s.total!==0&&s.errorRate/n>=1&&(a=i)}return a}function Se(e){return(e.flows??[]).map(e=>typeof e==`string`?e:String(e))}function Ce(e){let{hasDeclaredSlos:t,slos:n,costBudgets:r,findings:i}=e,a=n.filter(e=>e.burnRate>=1&&!e.ceremonial).sort((e,t)=>t.burnRate-e.burnRate||(e.timeToExhaustionMs??1/0)-(t.timeToExhaustionMs??1/0));if(a.length>0){let e=a[0],t=X(e.timeToExhaustionMs),n=a.length===1?`one objective is burning fast`:`${a.length} objectives are burning`;return{tone:e.burnRate>=6?`critical`:`warn`,line:`${n} — ${e.name} will exhaust its budget ${t}`}}let o=r.filter(e=>e.burnRate>=1).sort((e,t)=>t.burnRate-e.burnRate||(e.timeToExhaustionMs??1/0)-(t.timeToExhaustionMs??1/0));if(o.length>0){let e=o[0];return{tone:`warn`,line:`cost budget burning — ${e.name} will exhaust ${X(e.timeToExhaustionMs)}`}}if(i.length>0){let e=i[0];return{tone:e.userHarm>=90?`critical`:`warn`,line:`${e.title.toLowerCase()}: ${e.detail}`}}if(!t)return{tone:`empty`,line:`no objectives declared yet — findings and golden signals below; declare a first SLO on your busiest flow`};let s=n.filter(e=>e.ceremonial);return s.length===n.length&&n.length>0?{tone:`ok`,line:`all ${n.length} objective${n.length===1?``:`s`} within budget — ${s.length} marked ceremonial (no burn in 90 days)`}:{tone:`ok`,line:`all objectives within budget — no burning SLOs`}}function X(e){if(e==null)return`if the current burn continues`;if(e<=0)return`now`;let t=e/864e5;if(t>=2)return`in ${Math.round(t)} days`;if(t>=1)return`in 1 day`;let n=e/36e5;if(n>=2)return`in ${Math.round(n)} hours`;if(n>=1)return`in 1 hour`;let r=Math.max(1,Math.round(e/6e4));return`in ${r} minute${r===1?``:`s`}`}function we(e){return Number.isFinite(e)?e>=10?`${e.toFixed(0)}×`:e>=1?`${e.toFixed(1)}×`:`${e.toFixed(2)}×`:`∞×`}function Te(e){return e==null?`—`:e<=0?`exhausted`:X(e).replace(/^in /,``)}function Ee(e){let{manifest:t,runs:n,gates:r,signals:i,clock:a,vault:o,channels:s,ai:l,diff:u,access:f,now:p}=e,m=e.architectureGraph===void 0?t?d(t):null:e.architectureGraph,h=ve(t),g=_e({manifest:t,runs:n,now:p}),_=ue({manifest:t,ai:l,runs:n,now:p}),v=I({gatesAudit:r?.audit??{unguardedFlows:[],orphanPermissions:[],emptyRoles:[],unattachedGates:[]},signals:i,crons:a?.crons??[],vaultSecrets:o?.secrets??[],channelOutcomes:s?.outcomes??[],architectureGraph:m,diffChanges:u?.changes??[],aiVersions:l?.versions??[],accessHygiene:f?.hygiene??{unusedKeys:[],neverSignedInOperators:[],expiredInvitations:[]},now:p}),y=u?(()=>{let e=c(u);return{hasBaseline:e.hasBaseline,severity:e.severity,changeCount:e.changeCount,line:e.line,href:e.href}})():{hasBaseline:!1,severity:null,changeCount:0,line:`Manifest Diff unavailable`,href:`/diff`},b=A(n,p),x=h?null:le(n);return{verdict:Ce({hasDeclaredSlos:h,slos:g,costBudgets:_,findings:v}),slos:g,costBudgets:_,whatChanged:y,findings:v,golden:b,firstSloInvite:x,hasDeclaredSlos:h}}var De=e(a(),1),Z=o();function Q(){let e=n({queryKey:[`console.manifest.get`],queryFn:async()=>{let e=await r.manifestGet();if(e.error)throw Error(e.error.code);return e.data.manifest}}),t=n({queryKey:[`console.runs.list`],queryFn:async()=>{let e=await r.runsList();if(e.error)throw Error(e.error.code);return e.data.runs.map(u)},refetchInterval:1e4}),i=n({queryKey:[`console.gates.list`],queryFn:async()=>{let e=await r.gatesList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:15e3}),a=n({queryKey:[`console.signals.list`],queryFn:async()=>{let e=await r.signalsList();if(e.error)throw Error(e.error.code);return e.data.signals},refetchInterval:1e4}),o=n({queryKey:[`console.clock.list`],queryFn:async()=>{let e=await r.clockList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:1e4}),c=n({queryKey:[`console.vault.list`],queryFn:async()=>{let e=await r.vaultList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:3e4}),l=n({queryKey:[`console.channel.list`],queryFn:async()=>{let e=await r.channelsList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:15e3}),d=n({queryKey:[`console.ai.list`],queryFn:async()=>{let e=await r.aiList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:15e3}),f=n({queryKey:[`console.diff.list`],queryFn:async()=>{let e=await r.diffList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:15e3}),p=n({queryKey:[`console.access.list`],queryFn:async()=>{let e=await r.accessList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:3e4}),m=(0,De.useMemo)(()=>{let n=o.data?.now??Date.now();return Ee({manifest:e.data??null,runs:t.data??[],gates:i.data??null,signals:a.data??[],clock:o.data??null,vault:c.data??null,channels:l.data??null,ai:d.data??null,diff:f.data??null,access:p.data??null,now:n})},[e.data,t.data,i.data,a.data,o.data,c.data,l.data,d.data,f.data,p.data]),h=e.isLoading||t.isLoading||i.isLoading;return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col overflow-y-auto`,children:[(0,Z.jsxs)(`header`,{className:`shrink-0 border-b border-[var(--oke-line)] px-6 py-5`,children:[(0,Z.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Overview`}),(0,Z.jsx)(`h1`,{className:`mt-1 text-xl font-semibold tracking-tight text-[var(--oke-fg)]`,children:`Is the system healthy right now?`}),(0,Z.jsx)(`p`,{role:`status`,"aria-live":`polite`,className:s(`mt-3 text-base leading-snug`,m.verdict.tone===`critical`&&`text-red-700`,m.verdict.tone===`warn`&&`text-amber-800`,m.verdict.tone===`ok`&&`text-[var(--oke-fg)]`,m.verdict.tone===`empty`&&`text-[var(--oke-muted)]`),children:h?`Loading panel projections…`:m.verdict.line})]}),(0,Z.jsxs)(`main`,{id:`overview-main`,className:`flex flex-col gap-8 px-6 py-6`,children:[!h&&!e.data?(0,Z.jsxs)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:[`No Manifest yet — save a Flow under`,` `,(0,Z.jsx)(`code`,{className:`font-mono text-[var(--oke-fg)]`,children:`src/`}),` and the Console will refresh.`]}):null,m.hasDeclaredSlos?(0,Z.jsx)($,{label:`Error budgets`,ariaLabel:`Error budgets`,items:m.slos.map(e=>({id:e.id,title:`${e.kind}:${e.name}`,meta:e.availability,burn:e.burnRate,exhaust:e.timeToExhaustionMs,badge:e.ceremonial?`CEREMONIAL`:null,remaining:e.remainingBudgetFraction}))}):null,(0,Z.jsx)($,{label:`Cost budgets`,ariaLabel:`Cost budgets`,empty:`No cost budgets declared.`,items:m.costBudgets.map(e=>({id:e.id,title:e.name,meta:`$${e.spent.toFixed(2)} / $${e.declaredBudget.toFixed(2)}`,burn:e.burnRate,exhaust:e.timeToExhaustionMs,badge:null,remaining:e.remainingFraction}))}),(0,Z.jsxs)(`section`,{"aria-label":`What changed`,className:`flex flex-col gap-2`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-medium text-[var(--oke-fg)]`,children:`What changed`}),(0,Z.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:(0,Z.jsx)(`a`,{href:m.whatChanged.href,className:`underline decoration-[var(--oke-line)] underline-offset-2 hover:text-[var(--oke-fg)]`,children:m.whatChanged.line})})]}),(0,Z.jsx)(Oe,{view:m}),(0,Z.jsx)(ke,{view:m}),m.firstSloInvite?(0,Z.jsxs)(`section`,{"aria-label":`Declare first SLO`,className:`flex flex-col gap-2 border border-[var(--oke-line)] px-4 py-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-medium text-[var(--oke-fg)]`,children:`Declare a first objective`}),(0,Z.jsxs)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:[`Your busiest flow is`,` `,(0,Z.jsx)(`a`,{href:m.firstSloInvite.href,className:`font-mono text-[var(--oke-fg)] underline decoration-[var(--oke-line)] underline-offset-2`,children:m.firstSloInvite.busiestFlow}),` `,`(`,m.firstSloInvite.runCount.toLocaleString(`en-US`),` runs). Add`,` `,(0,Z.jsx)(`code`,{className:`font-mono text-[13px] text-[var(--oke-fg)]`,children:`slo: { availability: "99.9%" }`}),` `,`on that flow.`]})]}):null]})]})}function $(e){return(0,Z.jsxs)(`section`,{"aria-label":e.ariaLabel,className:`flex flex-col gap-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-medium text-[var(--oke-fg)]`,children:e.label}),e.items.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:e.empty??`None.`}):(0,Z.jsx)(`ul`,{className:`divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]`,children:e.items.map(e=>(0,Z.jsxs)(`li`,{className:`flex min-h-10 flex-wrap items-center justify-between gap-3 py-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,Z.jsx)(`span`,{className:`font-mono text-[13px] text-[var(--oke-fg)]`,children:e.title}),(0,Z.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:e.meta})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-[var(--oke-muted)]`,children:[(0,Z.jsxs)(`span`,{children:[`burn `,(0,Z.jsx)(`span`,{className:`text-[var(--oke-fg)]`,children:we(e.burn)})]}),(0,Z.jsxs)(`span`,{children:[`exhausts`,` `,(0,Z.jsx)(`span`,{className:`text-[var(--oke-fg)]`,children:Te(e.exhaust)})]}),(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`inline-block h-1.5 w-16 overflow-hidden bg-[var(--oke-line)]`,title:`${Math.round(e.remaining*100)}% remaining`,children:(0,Z.jsx)(`span`,{className:`block h-full bg-[var(--oke-fg)]`,style:{width:`${Math.max(0,Math.min(100,e.remaining*100))}%`}})}),e.badge?(0,Z.jsx)(`span`,{role:`status`,className:`text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:e.badge}):null]})]},e.id))})]})}function Oe({view:e}){return(0,Z.jsxs)(`section`,{"aria-label":`Findings`,"aria-live":`polite`,className:`flex flex-col gap-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-medium text-[var(--oke-fg)]`,children:`Findings`}),e.findings.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No findings from other panels.`}):(0,Z.jsx)(`ol`,{className:`divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]`,children:e.findings.map((e,t)=>(0,Z.jsx)(`li`,{className:`py-2 text-sm`,children:(0,Z.jsxs)(`a`,{href:e.href,className:`flex min-h-8 items-start gap-3 hover:text-[var(--oke-fg)]`,children:[(0,Z.jsxs)(`span`,{className:`w-5 shrink-0 text-[var(--oke-muted)]`,children:[t+1,`.`]}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`span`,{className:`text-[var(--oke-fg)]`,children:e.title}),(0,Z.jsxs)(`span`,{className:`text-[var(--oke-muted)]`,children:[` · `,e.detail]}),(0,Z.jsx)(`span`,{className:`ml-2 text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:e.source})]})]})},e.id))})]})}function ke({view:e}){return(0,Z.jsxs)(`section`,{"aria-label":`Golden signals`,className:`flex flex-col gap-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-medium text-[var(--oke-fg)]`,children:`Golden signals`}),(0,Z.jsxs)(`dl`,{className:`grid grid-cols-2 gap-4 sm:grid-cols-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`dt`,{className:`text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:`Latency p99`}),(0,Z.jsxs)(`dd`,{className:`mt-1 text-sm text-[var(--oke-fg)]`,children:[Math.round(e.golden.latencyP99Ms),` ms`]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`dt`,{className:`text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:`Traffic`}),(0,Z.jsxs)(`dd`,{className:`mt-1 text-sm text-[var(--oke-fg)]`,children:[e.golden.trafficPerMin.toFixed(1),` / min`]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`dt`,{className:`text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:`Errors`}),(0,Z.jsxs)(`dd`,{className:`mt-1 text-sm text-[var(--oke-fg)]`,children:[(e.golden.errorRate*100).toFixed(2),`%`]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`dt`,{className:`text-xs uppercase tracking-wider text-[var(--oke-muted)]`,children:`Saturation`}),(0,Z.jsxs)(`dd`,{className:`mt-1 text-sm text-[var(--oke-fg)]`,children:[(e.golden.saturation*100).toFixed(1),`%`]})]})]})]})}var Ae=t({OverviewPanel:()=>Q,default:()=>Q});export{ee as a,v as c,ne as i,y as l,ce as n,_ as o,T as r,b as s,Ae as t};
@@ -0,0 +1 @@
1
+ import{a as e,r as t,t as n}from"./rolldown-runtime-B0Z9INg1.js";import{B as r,C as i,D as a,I as o,J as s,Q as c,R as l,U as u,b as d,d as f,j as p,k as m,nt as h,o as g,q as _,tt as v,u as y,w as b,y as ee}from"./panel-access-ri1X9Otj.js";import{i as x}from"./panel-ai-DLHjRoJk.js";import{c as te,l as S}from"./panel-architecture-DI3bQF3J.js";import{a as C,c as w,i as ne,l as re,n as T,o as E,r as D,s as ie}from"./panel-overview-CW0CQEc2.js";function O(e){let t=new Map,n,r,i=e=>{e.next&&(e.prev?(e.prev.next=e.next,e.next.prev=e.prev,e.next=void 0,r&&(r.next=e,e.prev=r)):(e.next.prev=void 0,n=e.next,e.next=void 0,r&&(e.prev=r,r.next=e)),r=e)};return{get(e){let n=t.get(e);if(n)return i(n),n.value},set(a,o){if(t.size>=e&&n){let e=n;t.delete(e.key),e.next&&(n=e.next,e.next.prev=void 0),e===r&&(r=void 0)}let s=t.get(a);if(s)s.value=o,i(s);else{let e={key:a,value:o,prev:r};r&&(r.next=e),r=e,n||=e,t.set(a,e)}},clear(){t.clear(),n=void 0,r=void 0}}}var k=4,ae=5;function oe(e){let t=e.indexOf(`{`);if(t===-1)return null;let n=e.indexOf(`}`,t);return n===-1||t+1>=e.length?null:[t,n]}function se(e,t,n=new Uint16Array(6)){let r=e.indexOf(`/`,t),i=r===-1?e.length:r,a=e.substring(t,i);if(!a||!a.includes(`$`))return n[0]=0,n[1]=t,n[2]=t,n[3]=i,n[4]=i,n[5]=i,n;if(a===`$`){let r=e.length;return n[0]=2,n[1]=t,n[2]=t,n[3]=r,n[4]=r,n[5]=r,n}if(a.charCodeAt(0)===36)return n[0]=1,n[1]=t,n[2]=t+1,n[3]=i,n[4]=i,n[5]=i,n;let o=oe(a);if(o){let[r,s]=o,c=a.charCodeAt(r+1);if(c===45){if(r+2<a.length&&a.charCodeAt(r+2)===36){let e=r+3,a=s;if(e<a)return n[0]=3,n[1]=t+r,n[2]=t+e,n[3]=t+a,n[4]=t+s+1,n[5]=i,n}}else if(c===36){let a=r+1,o=r+2;return o===s?(n[0]=2,n[1]=t+r,n[2]=t+a,n[3]=t+o,n[4]=t+s+1,n[5]=e.length,n):(n[0]=1,n[1]=t+r,n[2]=t+o,n[3]=t+s,n[4]=t+s+1,n[5]=i,n)}}return n[0]=0,n[1]=t,n[2]=t,n[3]=i,n[4]=i,n[5]=i,n}function A(e,t,n,r,i,a,o){o?.(n);let s=r;{let r=n.fullPath??n.from,o=r.length,c=n.options?.caseSensitive??e,l=n.options?.params?.parse??n.options?.parseParams;for(;s<o;){let e=se(r,s,t),o,u=s,d=e[5];switch(s=d+1,a++,e[0]){case 0:{let t=r.substring(e[2],e[3]);if(c){let e=i.static?.get(t);if(e)o=e;else{i.static??=new Map;let e=M(n.fullPath??n.from);e.parent=i,e.depth=a,o=e,i.static.set(t,e)}}else{let e=t.toLowerCase(),r=i.staticInsensitive?.get(e);if(r)o=r;else{i.staticInsensitive??=new Map;let t=M(n.fullPath??n.from);t.parent=i,t.depth=a,o=t,i.staticInsensitive.set(e,t)}}break}case 1:{let t=r.substring(u,e[1]),s=r.substring(e[4],d),f=c&&!!(t||s),p=t?f?t:t.toLowerCase():void 0,m=s?f?s:s.toLowerCase():void 0,h=!l&&i.dynamic?.find(e=>!e.parse&&e.caseSensitive===f&&e.prefix===p&&e.suffix===m);if(h)o=h;else{let e=le(1,n.fullPath??n.from,f,p,m);o=e,e.depth=a,e.parent=i,i.dynamic??=[],i.dynamic.push(e)}break}case 3:{let t=r.substring(u,e[1]),s=r.substring(e[4],d),f=c&&!!(t||s),p=t?f?t:t.toLowerCase():void 0,m=s?f?s:s.toLowerCase():void 0,h=!l&&i.optional?.find(e=>!e.parse&&e.caseSensitive===f&&e.prefix===p&&e.suffix===m);if(h)o=h;else{let e=le(3,n.fullPath??n.from,f,p,m);o=e,e.parent=i,e.depth=a,i.optional??=[],i.optional.push(e)}break}case 2:{let t=r.substring(u,e[1]),s=r.substring(e[4],d),l=c&&!!(t||s),f=t?l?t:t.toLowerCase():void 0,p=s?l?s:s.toLowerCase():void 0,m=le(2,n.fullPath??n.from,l,f,p);o=m,m.parent=i,m.depth=a,i.wildcard??=[],i.wildcard.push(m)}}i=o}if(l&&n.children&&!n.isRoot&&n.id&&n.id.charCodeAt(n.id.lastIndexOf(`/`)+1)===95){let e=M(n.fullPath??n.from);e.kind=ae,e.parent=i,a++,e.depth=a,i.pathless??=[],i.pathless.push(e),i=e}let u=(n.path||!n.children)&&!n.isRoot;if(u&&r.endsWith(`/`)){let e=M(n.fullPath??n.from);e.kind=k,e.parent=i,a++,e.depth=a,i.index=e,i=e}i.parse=l??null,i.priority=n.options?.params?.priority??0,u&&!i.route&&(i.route=n,i.fullPath=n.fullPath??n.from)}if(n.children)for(let r of n.children)A(e,t,r,s,i,a,o)}function ce(e,t){if(e.parse&&!t.parse)return-1;if(!e.parse&&t.parse)return 1;if(e.parse&&t.parse&&(e.priority||t.priority))return t.priority-e.priority;if(e.prefix&&t.prefix&&e.prefix!==t.prefix){if(e.prefix.startsWith(t.prefix))return-1;if(t.prefix.startsWith(e.prefix))return 1}if(e.suffix&&t.suffix&&e.suffix!==t.suffix){if(e.suffix.endsWith(t.suffix))return-1;if(t.suffix.endsWith(e.suffix))return 1}return e.prefix&&!t.prefix?-1:!e.prefix&&t.prefix?1:e.suffix&&!t.suffix?-1:!e.suffix&&t.suffix?1:e.caseSensitive&&!t.caseSensitive?-1:!e.caseSensitive&&t.caseSensitive?1:0}function j(e){if(e.pathless)for(let t of e.pathless)j(t);if(e.static)for(let t of e.static.values())j(t);if(e.staticInsensitive)for(let t of e.staticInsensitive.values())j(t);if(e.dynamic?.length){e.dynamic.sort(ce);for(let t of e.dynamic)j(t)}if(e.optional?.length){e.optional.sort(ce);for(let t of e.optional)j(t)}if(e.wildcard?.length){e.wildcard.sort(ce);for(let t of e.wildcard)j(t)}}function M(e){return{kind:0,depth:0,pathless:null,index:null,static:null,staticInsensitive:null,dynamic:null,optional:null,wildcard:null,route:null,fullPath:e,parent:null,parse:null,priority:0}}function le(e,t,n,r,i){return{kind:e,depth:0,pathless:null,index:null,static:null,staticInsensitive:null,dynamic:null,optional:null,wildcard:null,route:null,fullPath:t,parent:null,parse:null,priority:0,caseSensitive:n,prefix:r,suffix:i}}function ue(e,t){let n=M(`/`),r=new Uint16Array(6);for(let t of e)A(!1,r,t,1,n,0);j(n),t.masksTree=n,t.flatCache=O(1e3)}function de(e,t){e||=`/`;let n=t.flatCache.get(e);if(n)return n;let r=I(e,t.masksTree);return t.flatCache.set(e,r),r}function fe(e,t,n,r,i){e||=`/`,r||=`/`;let a=t?`case\0${e}`:e,o=i.singleCache.get(a);return o||(o=M(`/`),A(t,new Uint16Array(6),{from:e},1,o,0),i.singleCache.set(a,o)),I(r,o,n)}function N(e,t,n=!1){let r=n?e:`nofuzz\0${e}`,i=t.matchCache.get(r);if(i!==void 0)return i;e||=`/`;let a;try{a=I(e,t.segmentTree,n)}catch(e){if(e instanceof URIError)a=null;else throw e}return a&&(a.branch=L(a.route)),t.matchCache.set(r,a),a}function P(e){return e===`/`?e:e.replace(/\/{1,}$/,``)}function F(e,t=!1,n){let r=M(e.fullPath),i=new Uint16Array(6),a={},o={},s=0;return A(t,i,e,1,r,0,e=>{if(n?.(e,s),e.id in a&&p(),a[e.id]=e,s!==0&&e.path){let t=P(e.fullPath);(!o[t]||e.fullPath.endsWith(`/`))&&(o[t]=e)}s++}),j(r),{processedTree:{segmentTree:r,singleCache:O(1e3),matchCache:O(1e3),flatCache:null,masksTree:null},routesById:a,routesByPath:o}}function I(e,t,n=!1){let r=e.split(`/`),i=z(e,r,t,n);if(!i)return null;let[a]=pe(e,r,i);return{route:i.node.route,rawParams:a}}function pe(e,t,n){let r=R(n.node),i=null,a=Object.create(null),o=n.extract?.part??0,s=n.extract?.node??0,c=n.extract?.path??0,l=n.extract?.segment??0;for(;s<r.length;o++,s++,c++,l++){let u=r[s];if(u.kind===k)break;if(u.kind===ae){l--,o--,c--;continue}let d=t[o],f=c;if(d&&(c+=d.length),u.kind===1){i??=n.node.fullPath.split(`/`);let e=i[l],t=u.prefix?.length??0;if(e.charCodeAt(t)===123){let n=u.suffix?.length??0,r=e.substring(t+2,e.length-n-1),i=d.substring(t,d.length-n);a[r]=decodeURIComponent(i)}else{let t=e.substring(1);a[t]=decodeURIComponent(d)}}else if(u.kind===3){if(n.skipped&1<<s){o--,c=f-1;continue}i??=n.node.fullPath.split(`/`);let e=i[l],t=u.prefix?.length??0,r=u.suffix?.length??0,p=e.substring(t+3,e.length-r-1),m=u.suffix||u.prefix?d.substring(t,d.length-r):d;m&&(a[p]=decodeURIComponent(m))}else if(u.kind===2){let t=u,n=e.substring(f+(t.prefix?.length??0),e.length-(t.suffix?.length??0)),r=decodeURIComponent(n);a[`*`]=r,a._splat=r;break}}return n.rawParams&&Object.assign(a,n.rawParams),[a,{part:o,node:s,path:c,segment:l}]}function L(e){let t=[e];for(;e.parentRoute;)e=e.parentRoute,t.push(e);return t.reverse(),t}function R(e){let t=Array(e.depth+1);do t[e.depth]=e,e=e.parent;while(e);return t}function z(e,t,n,r){if(e===`/`&&n.index)return{node:n.index,skipped:0};let i=!u(t),a=i&&e!==`/`,o=t.length-+!!i,s=[{node:n,index:1,skipped:0,depth:1,statics:0,dynamics:0,optionals:0}],c=null,l=null;for(;s.length;){let n=s.pop(),{node:i,index:u,skipped:d,depth:f,statics:p,dynamics:m,optionals:h}=n,{extract:g,rawParams:_}=n;if(i.kind===2&&i.route&&!U(l,n))continue;if(i.parse){if(!H(e,t,n))continue;_=n.rawParams,g=n.extract}r&&i.route&&i.kind!==k&&U(c,n)&&(c=n);let v=u===o;if(v&&(i.route&&(!a||i.kind===k||i.kind===2)&&U(l,n)&&(l=n),!i.optional&&!i.wildcard&&!i.index&&!i.pathless))continue;let y=v?void 0:t[u],b;if(v&&i.index){let n={node:i.index,index:u,skipped:d,depth:f+1,statics:p,dynamics:m,optionals:h,extract:g,rawParams:_},r=!0;if(i.index.parse&&(H(e,t,n)||(r=!1)),r){if(!m&&!h&&!d&&V(p,o))return n;U(l,n)&&(l=n)}}if(i.wildcard)for(let e=i.wildcard.length-1;e>=0;e--){let n=i.wildcard[e],{prefix:r,suffix:a}=n;if(!(r&&(v||!(n.caseSensitive?y:b??=y.toLowerCase()).startsWith(r)))){if(a){if(v)continue;let e=t.slice(u).join(`/`).slice(-a.length);if((n.caseSensitive?e:e.toLowerCase())!==a)continue}s.push({node:n,index:o,skipped:d,depth:f+1,statics:p,dynamics:m,optionals:h,extract:g,rawParams:_})}}if(i.optional){let e=d|1<<f,t=f+1;for(let n=i.optional.length-1;n>=0;n--){let r=i.optional[n];s.push({node:r,index:u,skipped:e,depth:t,statics:p,dynamics:m,optionals:h,extract:g,rawParams:_})}if(!v)for(let e=i.optional.length-1;e>=0;e--){let n=i.optional[e],{prefix:r,suffix:a}=n;if(r||a){let e=n.caseSensitive?y:b??=y.toLowerCase();if(r&&!e.startsWith(r)||a&&!e.endsWith(a))continue}s.push({node:n,index:u+1,skipped:d,depth:t,statics:p,dynamics:m,optionals:h+B(o,u),extract:g,rawParams:_})}}if(!v&&i.dynamic&&y)for(let e=i.dynamic.length-1;e>=0;e--){let t=i.dynamic[e],{prefix:n,suffix:r}=t;if(n||r){let e=t.caseSensitive?y:b??=y.toLowerCase();if(n&&!e.startsWith(n)||r&&!e.endsWith(r))continue}s.push({node:t,index:u+1,skipped:d,depth:f+1,statics:p,dynamics:m+B(o,u),optionals:h,extract:g,rawParams:_})}if(!v&&i.staticInsensitive){let e=i.staticInsensitive.get(b??=y.toLowerCase());e&&s.push({node:e,index:u+1,skipped:d,depth:f+1,statics:p+B(o,u),dynamics:m,optionals:h,extract:g,rawParams:_})}if(!v&&i.static){let e=i.static.get(y);e&&s.push({node:e,index:u+1,skipped:d,depth:f+1,statics:p+B(o,u),dynamics:m,optionals:h,extract:g,rawParams:_})}if(i.pathless){let e=f+1;for(let t=i.pathless.length-1;t>=0;t--){let n=i.pathless[t];s.push({node:n,index:u,skipped:d,depth:e,statics:p,dynamics:m,optionals:h,extract:g,rawParams:_})}}}if(l)return l;if(r&&c){let n=c.index;for(let e=0;e<c.index;e++)n+=t[e].length;let r=n===e.length?`/`:e.slice(n);return c.rawParams??=Object.create(null),c.rawParams[`**`]=decodeURIComponent(r),c}return null}function B(e,t){return 2**(e-t-1)}function V(e,t){return e===2**(t-1)-1}function H(e,t,n){let r,i;try{[r,i]=pe(e,t,n)}catch{return null}if(n.rawParams=r,n.extract=i,!n.node.parse)return!0;try{if(n.node.parse(r)===!1)return null}catch{}return!0}function U(e,t){return!e||t.statics>e.statics||t.statics===e.statics&&(t.dynamics>e.dynamics||t.dynamics===e.dynamics&&(t.optionals>e.optionals||t.optionals===e.optionals&&((t.node.kind===k)>(e.node.kind===k)||t.node.kind===k==(e.node.kind===k)&&t.depth>e.depth)))}function me(e){return W(e.filter(e=>e!==void 0).join(`/`))}function W(e){return e.replace(/\/{2,}/g,`/`)}function G(e){return e===`/`?e:e.replace(/^\/{1,}/,``)}function K(e){let t=e.length;return t>1&&e[t-1]===`/`?e.replace(/\/{1,}$/,``):e}function he(e){return K(G(e))}function ge(e,t){return e?.endsWith(`/`)&&e!==`/`&&e!==`${t}/`?e.slice(0,-1):e}function _e(e,t,n){return ge(e,n)===ge(t,n)}function q({base:e,to:t,trailingSlash:n=`never`,cache:r}){let i=t.startsWith(`/`),a=!i&&t===`.`,o;if(r){o=i?t:a?e:e+`\0`+t;let n=r.get(o);if(n)return n}let s;if(a)s=e.split(`/`);else if(i)s=t.split(`/`);else{for(s=e.split(`/`);s.length>1&&u(s)===``;)s.pop();let n=t.split(`/`);for(let e=0,t=n.length;e<t;e++){let r=n[e];r===``?e?e===t-1&&s.push(r):s=[r]:r===`..`?s.pop():r===`.`||s.push(r)}}s.length>1&&(u(s)===``?n===`never`&&s.pop():n===`always`&&s.push(``));let c=W(s.join(`/`))||`/`;return o&&r&&r.set(o,c),c}function ve(e){let t=new Map(e.map(e=>[encodeURIComponent(e),e])),n=Array.from(t.keys()).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),r=new RegExp(n,`g`);return e=>e.replace(r,e=>t.get(e)??e)}function J(e,t,n){let r=t[e];return typeof r==`string`?e===`_splat`?/^[a-zA-Z0-9\-._~!/]*$/.test(r)?r:r.split(`/`).map(e=>be(e,n)).join(`/`):be(r,n):r}function ye({path:e,params:t,decoder:n,...r}){let i=!1,a=Object.create(null);if(!e||e===`/`)return{interpolatedPath:`/`,usedParams:a,isMissingParams:i};if(!e.includes(`$`))return{interpolatedPath:e,usedParams:a,isMissingParams:i};let o=e.length,s=0,c,l=``;for(;s<o;){let r=s;c=se(e,r,c);let o=c[5];if(s=o+1,r===o)continue;let u=c[0];if(u===0){l+=`/`+e.substring(r,o);continue}if(u===2){let s=t._splat;a._splat=s,a[`*`]=s;let u=e.substring(r,c[1]),d=e.substring(c[4],o);if(!s){i=!0,(u||d)&&(l+=`/`+u+d);continue}let f=J(`_splat`,t,n);l+=`/`+u+f+d;continue}if(u===1){let s=e.substring(c[2],c[3]);!i&&!(s in t)&&(i=!0),a[s]=t[s];let u=e.substring(r,c[1]),d=e.substring(c[4],o),f=J(s,t,n)??`undefined`;l+=`/`+u+f+d;continue}if(u===3){let i=e.substring(c[2],c[3]),s=t[i];if(s==null)continue;a[i]=s;let u=e.substring(r,c[1]),d=e.substring(c[4],o),f=J(i,t,n)??``;l+=`/`+u+f+d;continue}}return e.endsWith(`/`)&&(l+=`/`),{usedParams:a,interpolatedPath:l||`/`,isMissingParams:i}}function be(e,t){let n=encodeURIComponent(e);return t?.(n)??n}var xe=`Error preloading route! ☝️`,Y=e(h(),1),X=v();function Se({children:e,fallback:t=null}){return Ce()?(0,X.jsx)(Y.Fragment,{children:e}):(0,X.jsx)(Y.Fragment,{children:t})}function Ce(){return Y.useSyncExternalStore(we,()=>!0,()=>!1)}function we(){return()=>{}}var Te=n((e=>{var t=h();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function r(){}var i={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},a=Symbol.for(`react.portal`);function o(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:a,key:r==null?null:``+r,children:e,containerInfo:t,implementation:n}}var s=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function c(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return o(e,t,null,r)},e.flushSync=function(e){var t=s.T,n=i.p;try{if(s.T=null,i.p=2,e)return e()}finally{s.T=t,i.p=n,i.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,i.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&i.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=c(n,t.crossOrigin),a=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?i.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):n===`script`&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`)if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=c(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0})}}else t??i.d.M(e)},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=c(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`)if(t){var n=c(t.as,t.crossOrigin);i.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0})}else i.d.m(e)},e.requestFormReset=function(e){i.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return s.H.useFormState(e,t,n)},e.useFormStatus=function(){return s.H.useHostTransitionStatus()},e.version=`19.2.8`})),Ee=n(((e,t)=>{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=Te()})),De=e(Ee(),1);function Oe(e,t){let n=m(),i=_(t),{activeProps:c,inactiveProps:u,activeOptions:d,to:f,preload:p,preloadDelay:h,preloadIntentProximity:g,hashScrollIntoView:v,replace:y,startTransition:b,resetScroll:ee,viewTransition:x,children:te,target:S,disabled:C,style:w,className:ne,onClick:re,onBlur:T,onFocus:E,onMouseEnter:D,onMouseLeave:ie,onTouchStart:O,ignoreBlocker:k,params:ae,search:oe,hash:se,state:A,mask:ce,reloadDocument:j,unsafeRelative:M,from:le,_fromLocation:ue,...de}=e,fe=Ce(),N=Y.useMemo(()=>e,[n,e.from,e._fromLocation,e.hash,e.to,e.search,e.params,e.state,e.mask,e.unsafeRelative]),P=a(n.stores.location,e=>e,(e,t)=>e.href===t.href),F=Y.useMemo(()=>{let e={_fromLocation:P,...N};return n.buildLocation(e)},[n,P,N]),I=F.maskedLocation?F.maskedLocation.publicHref:F.publicHref,pe=F.maskedLocation?F.maskedLocation.external:F.external,L=Y.useMemo(()=>Fe(I,pe,n.history,C),[C,pe,I,n.history]),R=Y.useMemo(()=>{if(L?.external)return r(L.href,n.protocolAllowlist)?void 0:L.href;if(!Ie(f)&&typeof f==`string`&&f.indexOf(`:`)!==-1)try{return new URL(f),r(f,n.protocolAllowlist)?void 0:f}catch{}},[f,L,n.protocolAllowlist]),z=Y.useMemo(()=>{if(R)return!1;if(d?.exact){if(!_e(P.pathname,F.pathname,n.basepath))return!1}else{let e=ge(P.pathname,n.basepath),t=ge(F.pathname,n.basepath);if(!(e.startsWith(t)&&(e.length===t.length||e[t.length]===`/`)))return!1}return(d?.includeSearch??!0)&&!o(P.search,F.search,{partial:!d?.exact,ignoreUndefined:!d?.explicitUndefined})?!1:!d?.includeHash||fe&&P.hash===F.hash},[d?.exact,d?.explicitUndefined,d?.includeHash,d?.includeSearch,P,R,fe,F.hash,F.pathname,F.search,n.basepath]),B=z?l(c,{})??Ae:ke,V=z?ke:l(u,{})??ke,H=[ne,B.className,V.className].filter(Boolean).join(` `),U=(w||B.style||V.style)&&{...w,...B.style,...V.style},[me,W]=Y.useState(!1),G=Y.useRef(!1),K=e.reloadDocument||R?!1:p??n.options.defaultPreload,he=h??n.options.defaultPreloadDelay??0,q=Y.useCallback(()=>{n.preloadRoute({...N,_builtLocation:F}).catch(e=>{console.warn(e),console.warn(xe)})},[n,N,F]);s(i,Y.useCallback(e=>{e?.isIntersecting&&q()},[q]),Pe,{disabled:!!C||K!==`viewport`}),Y.useEffect(()=>{G.current||!C&&K===`render`&&(q(),G.current=!0)},[C,q,K]);let ve=e=>{let t=e.currentTarget.getAttribute(`target`),r=S===void 0?t:S;if(!C&&!Re(e)&&!e.defaultPrevented&&(!r||r===`_self`)&&e.button===0){e.preventDefault(),(0,De.flushSync)(()=>{W(!0)});let t=n.subscribe(`onResolved`,()=>{t(),W(!1)});n.navigate({...N,replace:y,resetScroll:ee,hashScrollIntoView:v,startTransition:b,viewTransition:x,ignoreBlocker:k})}};if(R)return{...de,ref:i,href:R,...te&&{children:te},...S&&{target:S},...C&&{disabled:C},...w&&{style:w},...ne&&{className:ne},...re&&{onClick:re},...T&&{onBlur:T},...E&&{onFocus:E},...D&&{onMouseEnter:D},...ie&&{onMouseLeave:ie},...O&&{onTouchStart:O}};let J=e=>{if(C||K!==`intent`)return;if(!he){q();return}let t=e.currentTarget;if(Z.has(t))return;let n=setTimeout(()=>{Z.delete(t),q()},he);Z.set(t,n)},ye=e=>{C||K!==`intent`||q()},be=e=>{if(C||!K||!he)return;let t=e.currentTarget,n=Z.get(t);n&&(clearTimeout(n),Z.delete(t))};return{...de,...B,...V,href:L?.href,ref:i,onClick:Q([re,ve]),onBlur:Q([T,be]),onFocus:Q([E,J]),onMouseEnter:Q([D,J]),onMouseLeave:Q([ie,be]),onTouchStart:Q([O,ye]),disabled:!!C,target:S,...U&&{style:U},...H&&{className:H},...C&&je,...z&&Me,...fe&&me&&Ne}}var ke={},Ae={className:`active`},je={role:`link`,"aria-disabled":!0},Me={"data-status":`active`,"aria-current":`page`},Ne={"data-transitioning":`transitioning`},Z=new WeakMap,Pe={rootMargin:`100px`},Q=e=>t=>{for(let n of e)if(n){if(t.defaultPrevented)return;n(t)}};function Fe(e,t,n,r){if(!r)return t?{href:e,external:!0}:{href:n.createHref(e)||`/`,external:!1}}function Ie(e){if(typeof e!=`string`)return!1;let t=e.charCodeAt(0);return t===47?e.charCodeAt(1)!==47:t===46}var Le=Y.forwardRef((e,t)=>{let{_asChild:n,...r}=e,{type:i,...a}=Oe(r,t),o=typeof r.children==`function`?r.children({isActive:a[`data-status`]===`active`}):r.children;if(!n){let{disabled:e,...t}=a;return Y.createElement(`a`,t,o)}return Y.createElement(n,a,o)});function Re(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}var ze=ee({where:d().optional(),group:d().optional(),run:d().optional(),durMin:x().optional(),durMax:x().optional(),since:d().optional()});function Be(e){let t=ze.safeParse(e??{});return t.success?t.data:ze.parse({})}function Ve(e){let t={};return e.where&&(t.where=e.where),e.group&&(t.group=e.group),e.run&&(t.run=e.run),e.durMin!==void 0&&(t.durMin=e.durMin),e.durMax!==void 0&&(t.durMax=e.durMax),e.since&&(t.since=e.since),t}function He(e,t){return{...e,since:t??void 0}}function Ue(e){return E(e.where)}function We(e){return e.durMin===void 0||e.durMax===void 0?null:{minMs:Math.min(e.durMin,e.durMax),maxMs:Math.max(e.durMin,e.durMax)}}function Ge(e,t){let n=w(t);return{...e,where:n||void 0}}function Ke(e,t){return{...e,group:t??void 0}}function qe(e,t){return{...e,run:t}}function Je(e){return{...e,run:void 0}}function Ye(e,t){return t?{...e,durMin:t.minMs,durMax:t.maxMs}:{...e,durMin:void 0,durMax:void 0}}function Xe(e,t){let n=e.filter(t.select),r=e.filter(e=>!t.select(e));if(n.length===0||r.length===0)return[];let i=new Set(t.ignore??[`duration_ms`,`flow`]),a=t.minLift??.15,o=t.limit??10,s=new Set;for(let t of e)for(let e of Object.keys(t.dimensions))i.has(e)||s.add(e);let c=[];for(let e of s){let t=Ze(n,e),i=Ze(r,e),o=new Set([...t.keys(),...i.keys()]);for(let s of o){let o=(t.get(s)??0)/n.length,l=(i.get(s)??0)/r.length,u=o-l;u<a||c.push({dimension:e,value:s,outlierShare:o,baselineShare:l,lift:u,explanation:Qe(e,s,o,l)})}}return c.sort((e,t)=>t.lift-e.lift),c.slice(0,o)}function Ze(e,t){let n=new Map;for(let r of e){let e=r.dimensions[t];if(e==null)continue;let i=String(e);n.set(i,(n.get(i)??0)+1)}return n}function Qe(e,t,n,r){return`${Math.round(n*100)}% ${e}=${t} vs ${Math.round(r*100)}%`}var $e=36e5;function et(e,t,n){let r=t-Math.max(0,n);return e.filter(e=>e.startedAt>=r&&e.startedAt<=t&&e.error!=null&&e.error!==``)}function tt(e,t,n=$e){return D(et(e,t,n),`error`)}function nt(e,t){return t===void 0?[...e]:e.filter(e=>e.startedAt>=t)}function rt(e){if(!e||!e.trim())return;let t=e.trim();if(/^\d+$/.test(t)){let e=Number(t);return Number.isFinite(e)&&e>0?e:void 0}let n=/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i.exec(t);if(!n)return;let r=Number(n[1]);if(!Number.isFinite(r)||r<=0)return;let i=n[2].toLowerCase();return Math.round(r*(i===`ms`?1:i===`s`?1e3:i===`m`?6e4:i===`h`?36e5:864e5))}function it(e,t){return Xe(e.map(S),{select:e=>e.durationMs>=t.minMs&&e.durationMs<=t.maxMs,minLift:.15,ignore:[`duration_ms`,`duration`,`flow`]})}function at(e,t=20){if(e.length===0||t<1)return[];let n=1/0,r=-1/0;for(let t of e)n=Math.min(n,t.durationMs),r=Math.max(r,t.durationMs);if(!Number.isFinite(n)||!Number.isFinite(r))return[];if(n===r)return[{minMs:n,maxMs:r+1,count:e.length}];let i=(r-n)/t,a=[];for(let e=0;e<t;e++){let o=n+e*i,s=e===t-1?r+2**-52:n+(e+1)*i;a.push({minMs:o,maxMs:s,count:0})}for(let r of e){let e=Math.floor((r.durationMs-n)/i);e<0&&(e=0),e>=t&&(e=t-1);let o=a[e];a[e]={...o,count:o.count+1}}return a}function ot(e,t){return e<=t?{minMs:e,maxMs:t}:{minMs:t,maxMs:e}}function $(e){return Number.isFinite(e)?e>=6e4?`${(e/6e4).toFixed(e%6e4==0?0:1)}m`:e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:2)}s`:`${Math.round(e)}ms`:`—`}function st(e,t){let n=new Map(e.map(e=>[e.id,e])),r=n.get(t);if(!r)return t;let i=new Set;for(;r.parentId&&n.has(r.parentId)&&!i.has(r.id);)i.add(r.id),r=n.get(r.parentId);return r.id}function ct(e,t){let n=new Map(e.map(e=>[e.id,e]));if(!n.has(t))return 0;let r=new Map;for(let t of e){if(!t.parentId||!n.has(t.parentId))continue;let e=r.get(t.parentId)??[];e.push(t.id),r.set(t.parentId,e)}let i=0,a=[t],o=new Set;for(;a.length>0;){let e=a.pop();if(!o.has(e)){o.add(e),i+=1;for(let t of r.get(e)??[])a.push(t)}}return i}function lt(e,t){return ct(e,st(e,t))>1}function ut(){let e=b({from:`/runs`}),t=i({from:`/runs`}),n=e=>{t({search:Ve(e),replace:!0})},r=c({queryKey:[`console.runs.list`],queryFn:async()=>{let e=await f.runsList();if(e.error)throw Error(e.error.code);return e.data.runs.map(te)},refetchInterval:5e3}),a=r.data??[],o=Ue(e),s=e.since??`1h`,l=rt(s===``?void 0:s),u=l===void 0?void 0:/^\d+$/.test(s.trim())?l:Date.now()-l,d=(0,Y.useMemo)(()=>nt(a,u),[a,u]),p=(0,Y.useMemo)(()=>C(d,o),[d,o]),m=We(e),h=(0,Y.useMemo)(()=>at(p),[p]),_=Math.max(1,...h.map(e=>e.count)),v=(0,Y.useMemo)(()=>e.group?D(p,e.group):[],[p,e.group]),ee=(0,Y.useMemo)(()=>tt(d,Date.now(),l??36e5),[d,l]),x=(0,Y.useMemo)(()=>m?it(p,m):[],[p,m]),S=(0,Y.useMemo)(()=>T(a),[a]),w=a.find(t=>t.id===e.run);return(0,X.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,X.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4`,children:[(0,X.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Runs`}),(0,X.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Population analysis`}),(0,X.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[p.length,` of `,a.length,` runs · wide events, not log lines`]})]}),(0,X.jsx)(dt,{search:e,dimensions:S,onChange:n}),(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Since`}),(0,X.jsxs)(`select`,{"aria-label":`Lookback window`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:s,onChange:t=>{let r=t.target.value;n(He(e,r===``?``:r))},children:[(0,X.jsx)(`option`,{value:`5m`,children:`Last 5m`}),(0,X.jsx)(`option`,{value:`1h`,children:`Last 1h`}),(0,X.jsx)(`option`,{value:`24h`,children:`Last 24h`}),(0,X.jsx)(`option`,{value:``,children:`All time`})]})]}),(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Group by`}),(0,X.jsxs)(`select`,{"aria-label":`Group by dimension`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:e.group??``,onChange:t=>{let r=t.target.value;n(Ke(e,r||null))},children:[(0,X.jsx)(`option`,{value:``,children:`None`}),S.map(e=>(0,X.jsx)(`option`,{value:e,children:e},e))]})]})]}),(0,X.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]`,children:[(0,X.jsxs)(`div`,{className:`min-h-0 overflow-auto border-r border-[var(--oke-line)] px-6 py-6`,children:[(0,X.jsxs)(`section`,{"aria-label":`Duration distribution`,className:`mb-8`,children:[(0,X.jsx)(`h2`,{className:`mb-2 text-sm font-medium`,children:`Duration distribution`}),(0,X.jsx)(`p`,{className:`mb-3 text-xs text-[var(--oke-muted)]`,children:`Range-select a region to explain outliers against the rest.`}),r.isLoading?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Loading runs…`}):h.length===0?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No runs match the current query.`}):(0,X.jsx)(ft,{buckets:h,maxBucket:_,range:m,onSelect:t=>n(Ye(e,t))}),m?(0,X.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,X.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[`Selected `,$(m.minMs),` – `,$(m.maxMs)]}),(0,X.jsx)(g,{type:`button`,variant:`ghost`,onClick:()=>n(Ye(e,null)),children:`Clear selection`})]}):null]}),m?(0,X.jsxs)(`section`,{"aria-label":`Outlier explanation`,className:`mb-8`,children:[(0,X.jsx)(`h2`,{className:`mb-2 text-sm font-medium`,children:`Outlier explanation`}),x.length===0?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No dimension separates this region strongly enough.`}):(0,X.jsx)(`ol`,{className:`flex list-decimal flex-col gap-1 pl-5 text-sm`,children:x.map(e=>(0,X.jsx)(`li`,{children:e.explanation},`${e.dimension}:${e.value}`))})]}):null,(0,X.jsxs)(`section`,{"aria-label":`Error patterns`,className:`mb-8`,children:[(0,X.jsx)(`h2`,{className:`mb-2 text-sm font-medium`,children:`Error patterns`}),(0,X.jsx)(`p`,{className:`mb-3 text-xs text-[var(--oke-muted)]`,children:`Failed runs in the selected window, grouped by error code.`}),ee.length===0?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No errors in this window.`}):(0,X.jsxs)(`table`,{className:`w-full border-collapse text-left text-sm`,children:[(0,X.jsx)(`thead`,{children:(0,X.jsxs)(`tr`,{className:`border-b border-[var(--oke-line)] text-[var(--oke-muted)]`,children:[(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`Error`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`Count`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 font-medium`,children:`p99`})]})}),(0,X.jsx)(`tbody`,{className:`divide-y divide-[var(--oke-line)]`,children:ee.map(e=>(0,X.jsxs)(`tr`,{children:[(0,X.jsx)(`td`,{className:`py-2 pr-3 font-mono text-xs text-[var(--oke-danger)]`,children:e.key}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:e.count}),(0,X.jsx)(`td`,{className:`py-2`,children:$(e.p99DurationMs)})]},e.key))})]})]}),e.group?(0,X.jsxs)(`section`,{"aria-label":`Group aggregates`,className:`mb-8`,children:[(0,X.jsxs)(`h2`,{className:`mb-2 text-sm font-medium`,children:[`Group by `,e.group]}),(0,X.jsxs)(`table`,{className:`w-full border-collapse text-left text-sm`,children:[(0,X.jsx)(`thead`,{children:(0,X.jsxs)(`tr`,{className:`border-b border-[var(--oke-line)] text-[var(--oke-muted)]`,children:[(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:e.group}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`Count`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`Avg`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`p50`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 pr-3 font-medium`,children:`p99`}),(0,X.jsx)(`th`,{scope:`col`,className:`py-2 font-medium`,children:`Cost`})]})}),(0,X.jsx)(`tbody`,{className:`divide-y divide-[var(--oke-line)]`,children:v.map(e=>(0,X.jsxs)(`tr`,{children:[(0,X.jsx)(`td`,{className:`py-2 pr-3 font-mono text-xs`,children:e.key}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:e.count}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:$(e.avgDurationMs)}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:$(e.p50DurationMs)}),(0,X.jsx)(`td`,{className:`py-2 pr-3`,children:$(e.p99DurationMs)}),(0,X.jsx)(`td`,{className:`py-2`,children:e.sumCost>0?`$${e.sumCost.toFixed(3)}`:`—`})]},e.key))})]})]}):null,(0,X.jsxs)(`section`,{"aria-label":`Run list`,children:[(0,X.jsx)(`h2`,{className:`mb-2 text-sm font-medium`,children:`Runs`}),p.length===0?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No runs yet. Invoke a flow or widen the query.`}):(0,X.jsx)(`ul`,{className:`divide-y divide-[var(--oke-line)]`,children:p.slice(0,200).map(t=>{let r=t.id===e.run;return(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,"aria-pressed":r,className:y(`flex w-full min-h-10 items-center justify-between gap-3 px-2 py-2 text-left text-sm`,r?`bg-[color-mix(in_oklab,var(--oke-fg)_6%,transparent)]`:`hover:bg-[color-mix(in_oklab,var(--oke-fg)_3%,transparent)]`),onClick:()=>n(qe(e,t.id)),children:[(0,X.jsx)(`span`,{className:`font-medium`,children:t.flow}),(0,X.jsxs)(`span`,{className:`flex items-center gap-3 font-mono text-xs text-[var(--oke-muted)]`,children:[(0,X.jsx)(`span`,{children:t.cache}),t.error?(0,X.jsx)(`span`,{role:`status`,className:`text-[var(--oke-danger)]`,children:t.error}):(0,X.jsx)(`span`,{children:$(t.durationMs)})]})]})},t.id)})})]})]}),(0,X.jsx)(`section`,{"aria-label":`Run detail`,className:`min-h-0 overflow-auto px-6 py-6`,"aria-live":`polite`,children:w?(0,X.jsx)(pt,{run:w,allRuns:a,onClose:()=>n(Je(e))}):(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a run to see its flat dimension record.`})})]})]})}function dt({search:e,dimensions:t,onChange:n}){let r=Ue(e),i=[...new Set([...ne,...t])].sort(),[a,o]=(0,Y.useState)(`cache`),[s,c]=(0,Y.useState)(`=`),[l,u]=(0,Y.useState)(`miss`),[d,f]=(0,Y.useState)(e.where??``);return(0,Y.useEffect)(()=>{f(e.where??``)},[e.where]),(0,X.jsxs)(`div`,{className:`flex min-w-[16rem] flex-1 flex-col gap-2`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2`,children:[(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Dimension`}),(0,X.jsx)(`select`,{"aria-label":`Query dimension`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:a,onChange:e=>o(e.target.value),children:i.map(e=>(0,X.jsx)(`option`,{value:e,children:e},e))})]}),(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Op`}),(0,X.jsx)(`select`,{"aria-label":`Query operator`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:s,onChange:e=>c(e.target.value),children:[`=`,`!=`,`>`,`<`,`>=`,`<=`].map(e=>(0,X.jsx)(`option`,{value:e,children:e},e))})]}),(0,X.jsxs)(`label`,{className:`flex min-w-[8rem] flex-1 flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Value`}),(0,X.jsx)(`input`,{"aria-label":`Query value`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:l,onChange:e=>u(e.target.value)})]}),(0,X.jsx)(g,{type:`button`,variant:`ghost`,onClick:()=>{let t=E(`${a} ${s} ${l}`).clauses[0];if(!t)return;let i=Ge(e,re(r,t));f(i.where??``),n(i)},children:`Add`})]}),r.clauses.length>0?(0,X.jsx)(`ul`,{"aria-label":`Active query clauses`,className:`flex flex-wrap gap-2`,children:r.clauses.map(t=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:`min-h-8 border border-[var(--oke-line)] px-2 font-mono text-xs`,onClick:()=>{let i=Ge(e,ie(r,t.dimension));f(i.where??``),n(i)},children:[t.dimension,` `,t.op,` `,String(t.value),` ×`]})},t.dimension))}):null,(0,X.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,X.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Dimension query expression`}),(0,X.jsx)(`input`,{"aria-label":`Dimension query expression`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 font-mono text-sm`,placeholder:`flow = X AND cache = miss AND duration > 1s`,value:d,onChange:e=>f(e.target.value),onBlur:()=>{n(Ge(e,E(d)))},onKeyDown:t=>{t.key===`Enter`&&n(Ge(e,E(d)))}})]})]})}function ft({buckets:e,maxBucket:t,range:n,onSelect:r}){let[i,a]=(0,Y.useState)(null);return(0,X.jsx)(`div`,{role:`group`,"aria-label":`Duration histogram`,className:`flex h-40 items-end gap-px border border-[var(--oke-line)] bg-[color-mix(in_oklab,var(--oke-fg)_3%,transparent)] p-2`,onMouseLeave:()=>a(null),children:e.map((e,o)=>{let s=n!==null&&e.minMs<=n.maxMs&&e.maxMs>=n.minMs,c=Math.max(4,e.count/t*100);return(0,X.jsx)(`button`,{type:`button`,title:`${$(e.minMs)}–${$(e.maxMs)}: ${e.count}`,"aria-label":`Duration ${$(e.minMs)} to ${$(e.maxMs)}, ${e.count} runs`,"aria-pressed":s,className:y(`min-h-2 min-w-2 flex-1`,s?`bg-[var(--oke-accent)]`:`bg-[color-mix(in_oklab,var(--oke-fg)_35%,transparent)]`),style:{height:`${c}%`},onMouseDown:()=>a(e.minMs),onMouseEnter:()=>{i!==null&&r(ot(i,e.maxMs))},onMouseUp:()=>{r(ot(i===null?e.minMs:i,e.maxMs)),a(null)},onClick:()=>{i===null&&r(ot(e.minMs,e.maxMs))}},o)})})}function pt({run:e,allRuns:t,onClose:n}){let r=lt(t,e.id),i=[{label:`flow`,value:e.flow},{label:`unit`,value:e.unit??`—`},{label:`trigger`,value:e.trigger},{label:`plane`,value:e.plane},{label:`tenant`,value:e.tenant??`—`},{label:`principal`,value:e.principal??`—`},{label:`gates`,value:e.gates.length?e.gates.join(`, `):`—`},{label:`cache`,value:e.cache},{label:`replica`,value:e.replica==null?`—`:`${e.replica}${e.replicaLagMs==null?``:` · lag ${e.replicaLagMs}ms`}`},{label:`cost`,value:e.cost==null?`—`:`$${e.cost.toFixed(4)}`},{label:`promptVersion`,value:e.promptVersion==null?`—`:String(e.promptVersion)},{label:`buildVersion`,value:e.buildVersion??`—`},{label:`duration`,value:$(e.durationMs)},{label:`error`,value:e.error??`—`}];return(0,X.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.flow}),(0,X.jsx)(`p`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:e.id})]}),(0,X.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[r?(0,X.jsx)(Le,{to:`/traces`,search:{trace:st(t,e.id),span:e.id},className:`inline-flex min-h-8 items-center border border-[var(--oke-line)] px-3 text-sm`,children:`Open in Traces`}):null,(0,X.jsx)(g,{type:`button`,variant:`ghost`,onClick:n,children:`Close`})]})]}),(0,X.jsx)(`dl`,{className:`grid grid-cols-[minmax(0,8rem)_1fr] gap-x-4 gap-y-2 text-sm`,children:i.map(t=>(0,X.jsxs)(`div`,{className:`contents`,children:[(0,X.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:t.label}),(0,X.jsx)(`dd`,{className:y(`font-mono text-xs`,t.label===`error`&&e.error?`text-[var(--oke-danger)]`:``),children:t.value})]},t.label))}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`Effects`}),e.effects.length===0?(0,X.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`None`}):(0,X.jsx)(`ul`,{className:`divide-y divide-[var(--oke-line)] text-sm`,children:e.effects.map((e,t)=>(0,X.jsxs)(`li`,{className:`flex min-h-8 items-center justify-between gap-3 py-1`,children:[(0,X.jsxs)(`span`,{children:[e.kind,` `,(0,X.jsx)(`span`,{className:`font-mono text-xs`,children:e.resource})]}),(0,X.jsxs)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:[e.duration,`ms · `,e.reversibility]})]},`${e.kind}:${e.resource}:${t}`))})]}),(0,X.jsxs)(`details`,{className:`group`,children:[(0,X.jsxs)(`summary`,{className:`cursor-pointer text-sm font-medium`,children:[`fx.log (`,e.logs.length,`)`]}),e.logs.length===0?(0,X.jsx)(`p`,{className:`mt-2 text-sm text-[var(--oke-muted)]`,children:`No log lines`}):(0,X.jsx)(`ul`,{className:`mt-2 divide-y divide-[var(--oke-line)] font-mono text-xs`,children:e.logs.map((e,t)=>(0,X.jsxs)(`li`,{className:`py-2`,children:[(0,X.jsxs)(`span`,{className:`text-[var(--oke-muted)]`,children:[`[`,e.level,`]`]}),` `,e.message,e.data?(0,X.jsx)(`pre`,{className:`mt-1 whitespace-pre-wrap text-[var(--oke-muted)]`,children:JSON.stringify(e.data,null,2)}):null]},t))})]})]})}var mt=t({default:()=>ut});export{fe as _,Se as a,O as b,ye as c,he as d,G as f,N as g,de as h,Ee as i,me as l,L as m,Be as n,W as o,K as p,Le as r,ve as s,mt as t,q as u,ue as v,F as y};
@@ -1 +1 @@
1
- import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,_ as a,a as o,b as s,d as c,et as l,nt as u,o as d,r as f,tt as p,u as m,v as h,w as g,x as _,y as v}from"./panel-access-ri1X9Otj.js";import{r as y}from"./panel-runs-D5zf-D9c.js";import{i as b}from"./panel-ai-DLHjRoJk.js";import{n as x}from"./panel-channels-BDYWX29p.js";var S=v({q:s().optional(),signal:s().optional(),dlq:s().optional(),paused:_([a(),h(`true`),h(`false`)]).optional().transform(e=>e===void 0?void 0:e===!0||e===`true`),rate:b().min(1).max(1e3).optional(),sub:s().optional()});function C(e){let t=S.safeParse(e);return t.success?t.data:{}}function w(e){let t={};return e.q&&(t.q=e.q),e.signal&&(t.signal=e.signal),e.dlq&&(t.dlq=e.dlq),e.paused===!0&&(t.paused=!0),e.rate!==void 0&&e.rate!==10&&(t.rate=e.rate),e.sub&&(t.sub=e.sub),t}function T(e,t){return{...e,signal:t,dlq:void 0}}function E(e){let{signal:t,dlq:n,...r}=e;return r}function D(e,t){return{...e,dlq:t}}function O(e){let{dlq:t,...n}=e;return n}var k=[`once`,`broadcast`,`live`],A={once:`Once — competing consumers`,broadcast:`Broadcast — every subscriber`,live:`Live — client stream`};function ee(e,t=``){let n=t.trim().toLowerCase(),r=n?e.filter(e=>e.name.toLowerCase().includes(n)||e.delivery.includes(n)||e.producers.some(e=>e.flowId.toLowerCase().includes(n))||e.consumers.some(e=>e.flowId.toLowerCase().includes(n))):e;return k.map(e=>({delivery:e,label:A[e],signals:r.filter(t=>t.delivery===e)})).filter(e=>e.signals.length>0)}function te(e){return e===!0?{durable:!0,statement:`Consumer is durable — replay resumes at the failed journal step and side effects will not repeat.`}:e===!1?{durable:!1,statement:`Consumer is not durable — everything re-runs from the start, including side effects. Declare durable: true on the consumer so replay resumes at the failed journal step.`}:{durable:null,statement:`No consumer declared — replay has no target flow.`}}function ne(e,t={production:!0}){return t.production&&e.consumers.some(e=>e.external)&&e.consumersDurable!==!0?{kind:`typed`,phrase:`REPLAY`,requireReason:!0}:{kind:`undo`,windowMs:f}}function re(e,t={production:!0}){return t.production&&(e.consumers.some(e=>e.external||!e.durable)||e.dead>0)?{kind:`typed`,phrase:`DISCARD`,requireReason:!0}:{kind:`undo`,windowMs:f}}function ie(e){if(!e||typeof e!=`object`||Array.isArray(e))return[];let t=e;if(t.type!==`object`||!t.properties)return[];let n=new Set(Array.isArray(t.required)?t.required.filter(e=>typeof e==`string`):[]);return Object.entries(t.properties).map(([e,t])=>{let r=t??{},i=Array.isArray(r.enum)?r.enum.filter(e=>typeof e==`string`):void 0;return{key:e,type:r.type===`string`||r.type===`number`||r.type===`boolean`||r.type===`integer`?r.type:`unknown`,required:n.has(e),...i&&i.length>0?{enumValues:i}:{}}})}function ae(e,t){let n=e&&typeof e==`object`&&!Array.isArray(e)?e:{},r={};for(let e of t){let t=n[e.key];t==null?r[e.key]=``:typeof t==`boolean`?r[e.key]=t?`true`:`false`:r[e.key]=String(t)}return t.length===0&&(r._raw=JSON.stringify(e??null,null,2)),r}function j(e,t){if(t.length===0)try{return JSON.parse(e._raw??`null`)}catch{return e._raw??null}let n={};for(let r of t){let t=e[r.key]??``;if(!(t===``&&!r.required))if(r.type===`boolean`)n[r.key]=t===`true`;else if(r.type===`number`||r.type===`integer`){let e=Number(t);n[r.key]=Number.isFinite(e)?e:t}else n[r.key]=t}return n}function M(e,t){return{...e,paused:t,autoPausedByScroll:t?e.autoPausedByScroll:!1}}function N(e){return e.paused?e:{...e,paused:!0,autoPausedByScroll:!0}}function P(e){return JSON.stringify(e,null,2)}function F(e=[]){return{paused:!1,autoPausedByScroll:!1,payloads:[...e]}}function I(e){return e.orphaned?{ok:!1,reason:`Orphaned signal — consumer shape unknown; dry-run refused rather than risk a side effect.`}:e.consumers.length===0?{ok:!1,reason:`No Manifest consumer — dry-run refused rather than invoke an unknown handler unsafely.`}:{ok:!0}}var L=e(u(),1),R=p();function z(){let e=g({from:`/signals`}),t=n({from:`/signals`}),a=l(),[s,u]=(0,L.useState)({}),[f,p]=(0,L.useState)(``),[h,_]=(0,L.useState)(``),[v,b]=(0,L.useState)(null),[S,C]=(0,L.useState)(()=>F()),[k,A]=(0,L.useState)(new Set),z=e=>{t({search:w(e),replace:!0})},B=e.rate??10,V=r({queryKey:[`console.signals.list`],queryFn:async()=>{let e=await c.signalsList();if(e.error)throw Error(e.error.code);return e.data.signals},refetchInterval:!e.paused&&5e3}),H=V.data??[],U=(0,L.useMemo)(()=>ee(H,e.q??``),[H,e.q]),W=H.find(t=>t.name===e.signal),G=W?te(W.consumersDurable):null,K=W?.deadLetters.find(t=>t.id===e.dlq),q=W?ie(W.schema):[],J=W?ne(W,{production:!0}):null,Y=W?re(W,{production:!0}):null,X=W?I(W):null;(0,L.useEffect)(()=>{K&&(u(ae(K.payload,q)),p(``),_(``))},[K?.id,W?.name]),(0,L.useEffect)(()=>{if(!(!W||W.delivery!==`live`)){if(e.paused){C(e=>M(e,!0));return}C(e=>({...M(e,!1),payloads:e.payloads.length===0?[...W.recentLive]:e.payloads}))}},[W?.name,W?.recentLive,W?.delivery,e.paused]);let Z=i({mutationFn:async()=>{if(!W)return;if(X&&!X.ok)throw Error(X.reason);let t=k.size>0?[...k]:W.deadLetters.map(e=>e.id),n=await c.signalsDryRunReplay({signal:W.name,messageIds:t,subscriberId:e.sub,ratePerSec:B});if(n.error)throw Error(n.error.code);return n.data},onSuccess:e=>{if(!e)return;let t=e.wouldHaveFired?.length>0?` · ${e.wouldHaveFired.length} external effect(s) stubbed`:``;b(`${e.succeeded} would succeed, ${e.failed} would still fail${t}`)},onError:e=>{b(e instanceof Error?e.message:`Dry-run refused`)}}),Q=i({mutationFn:async()=>{if(!W||!J)return;if(J.kind===`typed`){let e=o({typed:f,reason:h,phrase:J.phrase});if(e)throw Error(e.typed??e.reason??`confirm`)}let t=k.size>0?[...k]:K?[K.id]:W.deadLetters.map(e=>e.id),n=K&&q?{[K.id]:j(s,q)}:void 0,r=await c.signalsReplay({signal:W.name,messageIds:t,subscriberId:e.sub,ratePerSec:B,dryRun:!1,payloads:n,confirmation:J.kind===`typed`?f:void 0,reason:J.kind===`typed`?h:void 0});if(r.error)throw Error(r.error.code);return r.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.signals.list`]}),b(null),A(new Set)}}),$=i({mutationFn:async()=>{if(!W||!Y)return;if(Y.kind===`typed`){let e=o({typed:f,reason:h,phrase:Y.phrase});if(e)throw Error(e.typed??e.reason??`confirm`)}let e=k.size>0?[...k]:K?[K.id]:W.deadLetters.map(e=>e.id),t=await c.signalsDiscard({signal:W.name,messageIds:e,confirmation:Y.kind===`typed`?f:void 0,reason:Y.kind===`typed`?h:void 0});if(t.error)throw Error(t.error.code);return t.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.signals.list`]}),K&&z(O(e)),A(new Set)}});return(0,R.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,R.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4`,children:[(0,R.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,R.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Signals`}),(0,R.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Delivery physics`}),(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`One list — once · broadcast · live`})]}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter`}),(0,R.jsx)(`input`,{"aria-label":`Filter signals`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:e.q??``,onChange:t=>z({...e,q:t.target.value||void 0})})]})]}),(0,R.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 md:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]`,children:[(0,R.jsx)(`section`,{"aria-label":`Signal list`,className:`min-h-0 overflow-auto border-r border-[var(--oke-line)]`,children:V.isLoading?(0,R.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`Loading signals…`}):U.length===0?(0,R.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`No signals declared.`}):U.map(t=>(0,R.jsxs)(`section`,{"aria-label":t.label,className:`border-b border-[var(--oke-line)]`,children:[(0,R.jsx)(`h2`,{className:`sticky top-0 bg-[var(--oke-bg)] px-6 py-2 text-xs font-medium uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:t.label}),(0,R.jsx)(`ul`,{children:t.signals.map(t=>(0,R.jsx)(`li`,{children:(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t.name===e.signal,className:m(`flex w-full min-h-10 flex-col items-start gap-0.5 px-6 py-2 text-left text-sm`,t.name===e.signal?`bg-[var(--oke-line)]/40`:`hover:bg-[var(--oke-line)]/20`),onClick:()=>z(T(e,t.name)),children:[(0,R.jsxs)(`span`,{className:`font-medium`,children:[x(t.name,t.description),t.orphaned?(0,R.jsx)(`span`,{role:`status`,className:`ml-2 text-xs text-[var(--oke-muted)]`,children:`orphaned`}):null]}),t.description?(0,R.jsx)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:t.name}):null,(0,R.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[t.delivery===`once`&&(0,R.jsxs)(R.Fragment,{children:[`pending `,t.pending,` · in-flight `,t.inflight,` · DLQ `,t.dead,t.outboxLagMs!=null&&t.outboxLagMs>0?` · outbox ${t.outboxLagMs}ms`:``]}),t.delivery===`broadcast`&&(0,R.jsxs)(R.Fragment,{children:[t.subscribers.length,` subscribers · lag`,` `,t.subscribers.reduce((e,t)=>e+t.lag,0)]}),t.delivery===`live`&&(0,R.jsxs)(R.Fragment,{children:[t.connections,` connections · `,t.throughputPerSec,`/s`]})]})]})},t.name))})]},t.delivery))}),(0,R.jsx)(`section`,{"aria-label":`Signal detail`,"aria-live":`polite`,className:`min-h-0 overflow-auto px-6 py-4`,children:!W||!G?(0,R.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a signal to inspect delivery, DLQ, and consumers.`}):(0,R.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,R.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-lg font-semibold`,children:x(W.name,W.description)}),W.description?(0,R.jsx)(`p`,{className:`font-mono text-sm text-[var(--oke-muted)]`,children:W.name}):null,(0,R.jsx)(`p`,{role:`status`,className:`mt-2 max-w-prose text-sm leading-relaxed`,"data-durable":String(G.durable),children:G.statement})]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>z(E(e)),children:`Close`})]}),W.delivery===`once`?(0,R.jsxs)(`dl`,{className:`grid grid-cols-2 gap-3 text-sm sm:grid-cols-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Pending`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.pending})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`In-flight`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.inflight})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`DLQ`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.dead})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Retry policy`}),(0,R.jsxs)(`dd`,{className:`text-lg font-medium`,children:[W.retries,` retries`,W.deadLetterEnabled?` → DLQ`:``]})]}),W.outboxLagMs==null?null:(0,R.jsxs)(`div`,{className:`col-span-2`,children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Outbox lag`}),(0,R.jsxs)(`dd`,{className:`font-medium`,children:[W.outboxLagMs,` ms`]})]})]}):null,W.delivery===`broadcast`?(0,R.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,R.jsx)(`h3`,{className:`text-sm font-medium`,children:`Subscribers`}),(0,R.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,R.jsx)(`caption`,{className:`sr-only`,children:`Per-subscriber lag and errors`}),(0,R.jsx)(`thead`,{children:(0,R.jsxs)(`tr`,{className:`text-[var(--oke-muted)]`,children:[(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Subscriber`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Lag`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Errors`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Replay`})]})}),(0,R.jsx)(`tbody`,{children:W.subscribers.map(t=>(0,R.jsxs)(`tr`,{className:`border-t border-[var(--oke-line)]`,children:[(0,R.jsx)(`td`,{className:`py-2 font-mono text-xs`,children:t.id}),(0,R.jsx)(`td`,{className:`py-2`,children:t.lag}),(0,R.jsx)(`td`,{className:`py-2`,children:t.errorCount}),(0,R.jsx)(`td`,{className:`py-2`,children:(0,R.jsx)(d,{type:`button`,variant:`ghost`,"aria-pressed":e.sub===t.id,onClick:()=>z({...e,sub:e.sub===t.id?void 0:t.id}),children:e.sub===t.id?`Targeted`:`Target`})})]},t.id))})]})]}):null,W.delivery===`live`?(0,R.jsxs)(`section`,{"aria-label":`Payload monitor`,className:`flex flex-col gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,R.jsx)(`h3`,{className:`text-sm font-medium`,children:`Payload monitor`}),(0,R.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[W.connections,` connections · `,W.throughputPerSec,`/s`]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{let t=!S.paused;C(e=>M(e,t)),z({...e,paused:t||void 0})},children:S.paused?`Resume`:`Pause`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{let e=new Blob([P(S.payloads)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`${W.name}-live.json`,n.click(),URL.revokeObjectURL(t)},children:`Export`}),S.autoPausedByScroll?(0,R.jsx)(`span`,{role:`status`,className:`text-xs text-[var(--oke-muted)]`,children:`Auto-paused on scroll`}):null]}),(0,R.jsx)(`ul`,{className:`max-h-48 overflow-auto border border-[var(--oke-line)] p-2 font-mono text-xs`,onScroll:()=>{C(t=>{let n=N(t);return n.paused&&!t.paused&&z({...e,paused:!0}),n})},children:(S.payloads.length?S.payloads:W.recentLive).map((e,t)=>(0,R.jsx)(`li`,{className:`border-b border-[var(--oke-line)]/50 py-1`,children:JSON.stringify(e)},t))})]}):null,(0,R.jsxs)(`section`,{"aria-label":`Producers and consumers`,children:[(0,R.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`Causality`}),(0,R.jsxs)(`div`,{className:`grid gap-4 text-sm sm:grid-cols-2`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Producers`}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.producers.length===0?(0,R.jsx)(`li`,{className:`text-[var(--oke-muted)]`,children:`None`}):W.producers.map(e=>(0,R.jsx)(`li`,{children:(0,R.jsx)(y,{to:`/flows`,search:{sel:`flow`,flow:e.flowId},className:`underline-offset-2 hover:underline`,children:e.flowId})},e.flowId))})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Consumers`}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.consumers.length===0?(0,R.jsx)(`li`,{className:`text-[var(--oke-muted)]`,children:`None`}):W.consumers.map(e=>(0,R.jsx)(`li`,{children:(0,R.jsxs)(y,{to:`/flows`,search:{sel:`flow`,flow:e.flowId},className:`underline-offset-2 hover:underline`,children:[e.flowId,e.durable?` · durable`:``]})},e.flowId))})]})]})]}),W.dead>0?(0,R.jsxs)(`section`,{"aria-label":`Dead letters`,className:`flex flex-col gap-3`,children:[(0,R.jsxs)(`h3`,{className:`text-sm font-medium`,children:[`Dead letters (`,W.dead,`)`]}),(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`Bulk repair: dry run first, then replay at a controlled rate — never an unthrottled flood.`}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3`,children:[(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Rate (per second)`}),(0,R.jsx)(`input`,{"aria-label":`Replay rate (per second)`,type:`number`,min:1,max:1e3,className:`min-h-8 w-24 border border-[var(--oke-line)] bg-transparent px-2`,value:B,onChange:t=>z({...e,rate:Number(t.target.value)||10})})]}),(0,R.jsx)(d,{type:`button`,onClick:()=>Z.mutate(),disabled:Z.isPending||X!==null&&!X.ok,title:X&&!X.ok?X.reason:void 0,children:`Dry run`}),X&&!X.ok?(0,R.jsx)(`p`,{role:`status`,className:`basis-full text-xs text-[var(--oke-muted)]`,children:X.reason}):null,(0,R.jsx)(d,{type:`button`,onClick:()=>Q.mutate(),disabled:Q.isPending||!v,children:`Replay`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>$.mutate(),disabled:$.isPending,children:`Discard`})]}),v?(0,R.jsx)(`p`,{role:`status`,className:`text-sm`,children:v}):null,(J?.kind===`typed`||Y?.kind===`typed`)&&(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 border border-[var(--oke-line)] p-3`,children:[(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`This action re-triggers external effects or permanently discards messages. Type the phrase and a reason.`}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Confirmation`,(0,R.jsx)(`input`,{"aria-label":`Confirmation phrase`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:f,onChange:e=>p(e.target.value),placeholder:J?.kind===`typed`?J.phrase:Y?.kind===`typed`?Y.phrase:``})]}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Reason`,(0,R.jsx)(`input`,{"aria-label":`Confirmation reason`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:h,onChange:e=>_(e.target.value)})]})]}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.deadLetters.map(t=>{let n=t.failures[t.failures.length-1];return(0,R.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${t.id}`,checked:k.has(t.id),onChange:e=>{A(n=>{let r=new Set(n);return e.target.checked?r.add(t.id):r.delete(t.id),r})}}),(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t.id===e.dlq,className:`min-h-8 flex-1 text-left text-sm`,onClick:()=>z(D(e,t.id)),children:[(0,R.jsx)(`span`,{className:`font-mono text-xs`,children:t.id}),n?(0,R.jsx)(`span`,{role:`status`,className:`ml-2`,children:n.code}):null]})]},t.id)})})]}):null,K?(0,R.jsxs)(`section`,{"aria-label":`Dead-letter detail`,className:`flex flex-col gap-3 border-t border-[var(--oke-line)] pt-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(`h3`,{className:`text-sm font-medium`,children:[`Dead letter `,K.id]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>z(O(e)),children:`Close letter`})]}),(0,R.jsx)(`p`,{role:`status`,className:`text-sm`,children:G.statement}),(0,R.jsx)(`form`,{"aria-label":`Editable payload`,className:`flex flex-col gap-2`,onSubmit:e=>e.preventDefault(),children:q.length>0?q.map(e=>(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[e.key,e.enumValues?(0,R.jsx)(`select`,{"aria-label":e.key,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:s[e.key]??``,onChange:t=>u(n=>({...n,[e.key]:t.target.value})),children:e.enumValues.map(e=>(0,R.jsx)(`option`,{value:e,children:e},e))}):(0,R.jsx)(`input`,{"aria-label":e.key,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:s[e.key]??``,onChange:t=>u(n=>({...n,[e.key]:t.target.value}))})]},e.key)):(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Payload JSON`,(0,R.jsx)(`textarea`,{"aria-label":`Payload JSON`,className:`min-h-24 border border-[var(--oke-line)] bg-transparent px-2 font-mono text-xs`,value:s._raw??``,onChange:e=>u({_raw:e.target.value}),rows:4})]})}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h4`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Attempt history`}),(0,R.jsx)(`ol`,{className:`list-decimal space-y-1 pl-5 text-sm`,children:K.failures.map(e=>(0,R.jsxs)(`li`,{children:[`Attempt `,e.attempt,`: `,(0,R.jsx)(`strong`,{children:e.code}),` — `,e.message]},`${e.attempt}-${e.code}-${e.at}`))})]}),K.causeRunId?(0,R.jsxs)(`p`,{className:`text-sm`,children:[`Causal chain:`,` `,(0,R.jsx)(y,{to:`/traces`,search:{trace:K.causeRunId},className:`underline-offset-2 hover:underline`,children:K.causeFlow??K.causeRunId})]}):null,(0,R.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,R.jsx)(d,{type:`button`,onClick:()=>{A(new Set([K.id])),Q.mutate()},children:`Replay this message`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{A(new Set([K.id])),$.mutate()},children:`Discard`})]})]}):null]})})]})]})}var B=t({default:()=>z});export{C as n,B as t};
1
+ import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,_ as a,a as o,b as s,d as c,et as l,nt as u,o as d,r as f,tt as p,u as m,v as h,w as g,x as _,y as v}from"./panel-access-ri1X9Otj.js";import{r as y}from"./panel-runs-BxuyDI3x.js";import{i as b}from"./panel-ai-DLHjRoJk.js";import{n as x}from"./panel-channels-BDYWX29p.js";var S=v({q:s().optional(),signal:s().optional(),dlq:s().optional(),paused:_([a(),h(`true`),h(`false`)]).optional().transform(e=>e===void 0?void 0:e===!0||e===`true`),rate:b().min(1).max(1e3).optional(),sub:s().optional()});function C(e){let t=S.safeParse(e);return t.success?t.data:{}}function w(e){let t={};return e.q&&(t.q=e.q),e.signal&&(t.signal=e.signal),e.dlq&&(t.dlq=e.dlq),e.paused===!0&&(t.paused=!0),e.rate!==void 0&&e.rate!==10&&(t.rate=e.rate),e.sub&&(t.sub=e.sub),t}function T(e,t){return{...e,signal:t,dlq:void 0}}function E(e){let{signal:t,dlq:n,...r}=e;return r}function D(e,t){return{...e,dlq:t}}function O(e){let{dlq:t,...n}=e;return n}var k=[`once`,`broadcast`,`live`],A={once:`Once — competing consumers`,broadcast:`Broadcast — every subscriber`,live:`Live — client stream`};function ee(e,t=``){let n=t.trim().toLowerCase(),r=n?e.filter(e=>e.name.toLowerCase().includes(n)||e.delivery.includes(n)||e.producers.some(e=>e.flowId.toLowerCase().includes(n))||e.consumers.some(e=>e.flowId.toLowerCase().includes(n))):e;return k.map(e=>({delivery:e,label:A[e],signals:r.filter(t=>t.delivery===e)})).filter(e=>e.signals.length>0)}function te(e){return e===!0?{durable:!0,statement:`Consumer is durable — replay resumes at the failed journal step and side effects will not repeat.`}:e===!1?{durable:!1,statement:`Consumer is not durable — everything re-runs from the start, including side effects. Declare durable: true on the consumer so replay resumes at the failed journal step.`}:{durable:null,statement:`No consumer declared — replay has no target flow.`}}function ne(e,t={production:!0}){return t.production&&e.consumers.some(e=>e.external)&&e.consumersDurable!==!0?{kind:`typed`,phrase:`REPLAY`,requireReason:!0}:{kind:`undo`,windowMs:f}}function re(e,t={production:!0}){return t.production&&(e.consumers.some(e=>e.external||!e.durable)||e.dead>0)?{kind:`typed`,phrase:`DISCARD`,requireReason:!0}:{kind:`undo`,windowMs:f}}function ie(e){if(!e||typeof e!=`object`||Array.isArray(e))return[];let t=e;if(t.type!==`object`||!t.properties)return[];let n=new Set(Array.isArray(t.required)?t.required.filter(e=>typeof e==`string`):[]);return Object.entries(t.properties).map(([e,t])=>{let r=t??{},i=Array.isArray(r.enum)?r.enum.filter(e=>typeof e==`string`):void 0;return{key:e,type:r.type===`string`||r.type===`number`||r.type===`boolean`||r.type===`integer`?r.type:`unknown`,required:n.has(e),...i&&i.length>0?{enumValues:i}:{}}})}function ae(e,t){let n=e&&typeof e==`object`&&!Array.isArray(e)?e:{},r={};for(let e of t){let t=n[e.key];t==null?r[e.key]=``:typeof t==`boolean`?r[e.key]=t?`true`:`false`:r[e.key]=String(t)}return t.length===0&&(r._raw=JSON.stringify(e??null,null,2)),r}function j(e,t){if(t.length===0)try{return JSON.parse(e._raw??`null`)}catch{return e._raw??null}let n={};for(let r of t){let t=e[r.key]??``;if(!(t===``&&!r.required))if(r.type===`boolean`)n[r.key]=t===`true`;else if(r.type===`number`||r.type===`integer`){let e=Number(t);n[r.key]=Number.isFinite(e)?e:t}else n[r.key]=t}return n}function M(e,t){return{...e,paused:t,autoPausedByScroll:t?e.autoPausedByScroll:!1}}function N(e){return e.paused?e:{...e,paused:!0,autoPausedByScroll:!0}}function P(e){return JSON.stringify(e,null,2)}function F(e=[]){return{paused:!1,autoPausedByScroll:!1,payloads:[...e]}}function I(e){return e.orphaned?{ok:!1,reason:`Orphaned signal — consumer shape unknown; dry-run refused rather than risk a side effect.`}:e.consumers.length===0?{ok:!1,reason:`No Manifest consumer — dry-run refused rather than invoke an unknown handler unsafely.`}:{ok:!0}}var L=e(u(),1),R=p();function z(){let e=g({from:`/signals`}),t=n({from:`/signals`}),a=l(),[s,u]=(0,L.useState)({}),[f,p]=(0,L.useState)(``),[h,_]=(0,L.useState)(``),[v,b]=(0,L.useState)(null),[S,C]=(0,L.useState)(()=>F()),[k,A]=(0,L.useState)(new Set),z=e=>{t({search:w(e),replace:!0})},B=e.rate??10,V=r({queryKey:[`console.signals.list`],queryFn:async()=>{let e=await c.signalsList();if(e.error)throw Error(e.error.code);return e.data.signals},refetchInterval:!e.paused&&5e3}),H=V.data??[],U=(0,L.useMemo)(()=>ee(H,e.q??``),[H,e.q]),W=H.find(t=>t.name===e.signal),G=W?te(W.consumersDurable):null,K=W?.deadLetters.find(t=>t.id===e.dlq),q=W?ie(W.schema):[],J=W?ne(W,{production:!0}):null,Y=W?re(W,{production:!0}):null,X=W?I(W):null;(0,L.useEffect)(()=>{K&&(u(ae(K.payload,q)),p(``),_(``))},[K?.id,W?.name]),(0,L.useEffect)(()=>{if(!(!W||W.delivery!==`live`)){if(e.paused){C(e=>M(e,!0));return}C(e=>({...M(e,!1),payloads:e.payloads.length===0?[...W.recentLive]:e.payloads}))}},[W?.name,W?.recentLive,W?.delivery,e.paused]);let Z=i({mutationFn:async()=>{if(!W)return;if(X&&!X.ok)throw Error(X.reason);let t=k.size>0?[...k]:W.deadLetters.map(e=>e.id),n=await c.signalsDryRunReplay({signal:W.name,messageIds:t,subscriberId:e.sub,ratePerSec:B});if(n.error)throw Error(n.error.code);return n.data},onSuccess:e=>{if(!e)return;let t=e.wouldHaveFired?.length>0?` · ${e.wouldHaveFired.length} external effect(s) stubbed`:``;b(`${e.succeeded} would succeed, ${e.failed} would still fail${t}`)},onError:e=>{b(e instanceof Error?e.message:`Dry-run refused`)}}),Q=i({mutationFn:async()=>{if(!W||!J)return;if(J.kind===`typed`){let e=o({typed:f,reason:h,phrase:J.phrase});if(e)throw Error(e.typed??e.reason??`confirm`)}let t=k.size>0?[...k]:K?[K.id]:W.deadLetters.map(e=>e.id),n=K&&q?{[K.id]:j(s,q)}:void 0,r=await c.signalsReplay({signal:W.name,messageIds:t,subscriberId:e.sub,ratePerSec:B,dryRun:!1,payloads:n,confirmation:J.kind===`typed`?f:void 0,reason:J.kind===`typed`?h:void 0});if(r.error)throw Error(r.error.code);return r.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.signals.list`]}),b(null),A(new Set)}}),$=i({mutationFn:async()=>{if(!W||!Y)return;if(Y.kind===`typed`){let e=o({typed:f,reason:h,phrase:Y.phrase});if(e)throw Error(e.typed??e.reason??`confirm`)}let e=k.size>0?[...k]:K?[K.id]:W.deadLetters.map(e=>e.id),t=await c.signalsDiscard({signal:W.name,messageIds:e,confirmation:Y.kind===`typed`?f:void 0,reason:Y.kind===`typed`?h:void 0});if(t.error)throw Error(t.error.code);return t.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.signals.list`]}),K&&z(O(e)),A(new Set)}});return(0,R.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,R.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4`,children:[(0,R.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,R.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Signals`}),(0,R.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Delivery physics`}),(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`One list — once · broadcast · live`})]}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter`}),(0,R.jsx)(`input`,{"aria-label":`Filter signals`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:e.q??``,onChange:t=>z({...e,q:t.target.value||void 0})})]})]}),(0,R.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 md:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]`,children:[(0,R.jsx)(`section`,{"aria-label":`Signal list`,className:`min-h-0 overflow-auto border-r border-[var(--oke-line)]`,children:V.isLoading?(0,R.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`Loading signals…`}):U.length===0?(0,R.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`No signals declared.`}):U.map(t=>(0,R.jsxs)(`section`,{"aria-label":t.label,className:`border-b border-[var(--oke-line)]`,children:[(0,R.jsx)(`h2`,{className:`sticky top-0 bg-[var(--oke-bg)] px-6 py-2 text-xs font-medium uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:t.label}),(0,R.jsx)(`ul`,{children:t.signals.map(t=>(0,R.jsx)(`li`,{children:(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t.name===e.signal,className:m(`flex w-full min-h-10 flex-col items-start gap-0.5 px-6 py-2 text-left text-sm`,t.name===e.signal?`bg-[var(--oke-line)]/40`:`hover:bg-[var(--oke-line)]/20`),onClick:()=>z(T(e,t.name)),children:[(0,R.jsxs)(`span`,{className:`font-medium`,children:[x(t.name,t.description),t.orphaned?(0,R.jsx)(`span`,{role:`status`,className:`ml-2 text-xs text-[var(--oke-muted)]`,children:`orphaned`}):null]}),t.description?(0,R.jsx)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:t.name}):null,(0,R.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[t.delivery===`once`&&(0,R.jsxs)(R.Fragment,{children:[`pending `,t.pending,` · in-flight `,t.inflight,` · DLQ `,t.dead,t.outboxLagMs!=null&&t.outboxLagMs>0?` · outbox ${t.outboxLagMs}ms`:``]}),t.delivery===`broadcast`&&(0,R.jsxs)(R.Fragment,{children:[t.subscribers.length,` subscribers · lag`,` `,t.subscribers.reduce((e,t)=>e+t.lag,0)]}),t.delivery===`live`&&(0,R.jsxs)(R.Fragment,{children:[t.connections,` connections · `,t.throughputPerSec,`/s`]})]})]})},t.name))})]},t.delivery))}),(0,R.jsx)(`section`,{"aria-label":`Signal detail`,"aria-live":`polite`,className:`min-h-0 overflow-auto px-6 py-4`,children:!W||!G?(0,R.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a signal to inspect delivery, DLQ, and consumers.`}):(0,R.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,R.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-lg font-semibold`,children:x(W.name,W.description)}),W.description?(0,R.jsx)(`p`,{className:`font-mono text-sm text-[var(--oke-muted)]`,children:W.name}):null,(0,R.jsx)(`p`,{role:`status`,className:`mt-2 max-w-prose text-sm leading-relaxed`,"data-durable":String(G.durable),children:G.statement})]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>z(E(e)),children:`Close`})]}),W.delivery===`once`?(0,R.jsxs)(`dl`,{className:`grid grid-cols-2 gap-3 text-sm sm:grid-cols-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Pending`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.pending})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`In-flight`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.inflight})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`DLQ`}),(0,R.jsx)(`dd`,{className:`text-lg font-medium`,children:W.dead})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Retry policy`}),(0,R.jsxs)(`dd`,{className:`text-lg font-medium`,children:[W.retries,` retries`,W.deadLetterEnabled?` → DLQ`:``]})]}),W.outboxLagMs==null?null:(0,R.jsxs)(`div`,{className:`col-span-2`,children:[(0,R.jsx)(`dt`,{className:`text-[var(--oke-muted)]`,children:`Outbox lag`}),(0,R.jsxs)(`dd`,{className:`font-medium`,children:[W.outboxLagMs,` ms`]})]})]}):null,W.delivery===`broadcast`?(0,R.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,R.jsx)(`h3`,{className:`text-sm font-medium`,children:`Subscribers`}),(0,R.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,R.jsx)(`caption`,{className:`sr-only`,children:`Per-subscriber lag and errors`}),(0,R.jsx)(`thead`,{children:(0,R.jsxs)(`tr`,{className:`text-[var(--oke-muted)]`,children:[(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Subscriber`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Lag`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Errors`}),(0,R.jsx)(`th`,{scope:`col`,className:`py-1 font-normal`,children:`Replay`})]})}),(0,R.jsx)(`tbody`,{children:W.subscribers.map(t=>(0,R.jsxs)(`tr`,{className:`border-t border-[var(--oke-line)]`,children:[(0,R.jsx)(`td`,{className:`py-2 font-mono text-xs`,children:t.id}),(0,R.jsx)(`td`,{className:`py-2`,children:t.lag}),(0,R.jsx)(`td`,{className:`py-2`,children:t.errorCount}),(0,R.jsx)(`td`,{className:`py-2`,children:(0,R.jsx)(d,{type:`button`,variant:`ghost`,"aria-pressed":e.sub===t.id,onClick:()=>z({...e,sub:e.sub===t.id?void 0:t.id}),children:e.sub===t.id?`Targeted`:`Target`})})]},t.id))})]})]}):null,W.delivery===`live`?(0,R.jsxs)(`section`,{"aria-label":`Payload monitor`,className:`flex flex-col gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,R.jsx)(`h3`,{className:`text-sm font-medium`,children:`Payload monitor`}),(0,R.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[W.connections,` connections · `,W.throughputPerSec,`/s`]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{let t=!S.paused;C(e=>M(e,t)),z({...e,paused:t||void 0})},children:S.paused?`Resume`:`Pause`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{let e=new Blob([P(S.payloads)],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`${W.name}-live.json`,n.click(),URL.revokeObjectURL(t)},children:`Export`}),S.autoPausedByScroll?(0,R.jsx)(`span`,{role:`status`,className:`text-xs text-[var(--oke-muted)]`,children:`Auto-paused on scroll`}):null]}),(0,R.jsx)(`ul`,{className:`max-h-48 overflow-auto border border-[var(--oke-line)] p-2 font-mono text-xs`,onScroll:()=>{C(t=>{let n=N(t);return n.paused&&!t.paused&&z({...e,paused:!0}),n})},children:(S.payloads.length?S.payloads:W.recentLive).map((e,t)=>(0,R.jsx)(`li`,{className:`border-b border-[var(--oke-line)]/50 py-1`,children:JSON.stringify(e)},t))})]}):null,(0,R.jsxs)(`section`,{"aria-label":`Producers and consumers`,children:[(0,R.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`Causality`}),(0,R.jsxs)(`div`,{className:`grid gap-4 text-sm sm:grid-cols-2`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Producers`}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.producers.length===0?(0,R.jsx)(`li`,{className:`text-[var(--oke-muted)]`,children:`None`}):W.producers.map(e=>(0,R.jsx)(`li`,{children:(0,R.jsx)(y,{to:`/flows`,search:{sel:`flow`,flow:e.flowId},className:`underline-offset-2 hover:underline`,children:e.flowId})},e.flowId))})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Consumers`}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.consumers.length===0?(0,R.jsx)(`li`,{className:`text-[var(--oke-muted)]`,children:`None`}):W.consumers.map(e=>(0,R.jsx)(`li`,{children:(0,R.jsxs)(y,{to:`/flows`,search:{sel:`flow`,flow:e.flowId},className:`underline-offset-2 hover:underline`,children:[e.flowId,e.durable?` · durable`:``]})},e.flowId))})]})]})]}),W.dead>0?(0,R.jsxs)(`section`,{"aria-label":`Dead letters`,className:`flex flex-col gap-3`,children:[(0,R.jsxs)(`h3`,{className:`text-sm font-medium`,children:[`Dead letters (`,W.dead,`)`]}),(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`Bulk repair: dry run first, then replay at a controlled rate — never an unthrottled flood.`}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3`,children:[(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Rate (per second)`}),(0,R.jsx)(`input`,{"aria-label":`Replay rate (per second)`,type:`number`,min:1,max:1e3,className:`min-h-8 w-24 border border-[var(--oke-line)] bg-transparent px-2`,value:B,onChange:t=>z({...e,rate:Number(t.target.value)||10})})]}),(0,R.jsx)(d,{type:`button`,onClick:()=>Z.mutate(),disabled:Z.isPending||X!==null&&!X.ok,title:X&&!X.ok?X.reason:void 0,children:`Dry run`}),X&&!X.ok?(0,R.jsx)(`p`,{role:`status`,className:`basis-full text-xs text-[var(--oke-muted)]`,children:X.reason}):null,(0,R.jsx)(d,{type:`button`,onClick:()=>Q.mutate(),disabled:Q.isPending||!v,children:`Replay`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>$.mutate(),disabled:$.isPending,children:`Discard`})]}),v?(0,R.jsx)(`p`,{role:`status`,className:`text-sm`,children:v}):null,(J?.kind===`typed`||Y?.kind===`typed`)&&(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 border border-[var(--oke-line)] p-3`,children:[(0,R.jsx)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:`This action re-triggers external effects or permanently discards messages. Type the phrase and a reason.`}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Confirmation`,(0,R.jsx)(`input`,{"aria-label":`Confirmation phrase`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:f,onChange:e=>p(e.target.value),placeholder:J?.kind===`typed`?J.phrase:Y?.kind===`typed`?Y.phrase:``})]}),(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Reason`,(0,R.jsx)(`input`,{"aria-label":`Confirmation reason`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:h,onChange:e=>_(e.target.value)})]})]}),(0,R.jsx)(`ul`,{className:`flex flex-col gap-1`,children:W.deadLetters.map(t=>{let n=t.failures[t.failures.length-1];return(0,R.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${t.id}`,checked:k.has(t.id),onChange:e=>{A(n=>{let r=new Set(n);return e.target.checked?r.add(t.id):r.delete(t.id),r})}}),(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t.id===e.dlq,className:`min-h-8 flex-1 text-left text-sm`,onClick:()=>z(D(e,t.id)),children:[(0,R.jsx)(`span`,{className:`font-mono text-xs`,children:t.id}),n?(0,R.jsx)(`span`,{role:`status`,className:`ml-2`,children:n.code}):null]})]},t.id)})})]}):null,K?(0,R.jsxs)(`section`,{"aria-label":`Dead-letter detail`,className:`flex flex-col gap-3 border-t border-[var(--oke-line)] pt-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(`h3`,{className:`text-sm font-medium`,children:[`Dead letter `,K.id]}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>z(O(e)),children:`Close letter`})]}),(0,R.jsx)(`p`,{role:`status`,className:`text-sm`,children:G.statement}),(0,R.jsx)(`form`,{"aria-label":`Editable payload`,className:`flex flex-col gap-2`,onSubmit:e=>e.preventDefault(),children:q.length>0?q.map(e=>(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[e.key,e.enumValues?(0,R.jsx)(`select`,{"aria-label":e.key,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:s[e.key]??``,onChange:t=>u(n=>({...n,[e.key]:t.target.value})),children:e.enumValues.map(e=>(0,R.jsx)(`option`,{value:e,children:e},e))}):(0,R.jsx)(`input`,{"aria-label":e.key,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:s[e.key]??``,onChange:t=>u(n=>({...n,[e.key]:t.target.value}))})]},e.key)):(0,R.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Payload JSON`,(0,R.jsx)(`textarea`,{"aria-label":`Payload JSON`,className:`min-h-24 border border-[var(--oke-line)] bg-transparent px-2 font-mono text-xs`,value:s._raw??``,onChange:e=>u({_raw:e.target.value}),rows:4})]})}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h4`,{className:`mb-1 text-xs uppercase tracking-[0.15em] text-[var(--oke-muted)]`,children:`Attempt history`}),(0,R.jsx)(`ol`,{className:`list-decimal space-y-1 pl-5 text-sm`,children:K.failures.map(e=>(0,R.jsxs)(`li`,{children:[`Attempt `,e.attempt,`: `,(0,R.jsx)(`strong`,{children:e.code}),` — `,e.message]},`${e.attempt}-${e.code}-${e.at}`))})]}),K.causeRunId?(0,R.jsxs)(`p`,{className:`text-sm`,children:[`Causal chain:`,` `,(0,R.jsx)(y,{to:`/traces`,search:{trace:K.causeRunId},className:`underline-offset-2 hover:underline`,children:K.causeFlow??K.causeRunId})]}):null,(0,R.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,R.jsx)(d,{type:`button`,onClick:()=>{A(new Set([K.id])),Q.mutate()},children:`Replay this message`}),(0,R.jsx)(d,{type:`button`,variant:`ghost`,onClick:()=>{A(new Set([K.id])),$.mutate()},children:`Discard`})]})]}):null]})})]})]})}var B=t({default:()=>z});export{C as n,B as t};
@@ -1 +1 @@
1
- import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,a,b as o,d as s,et as c,g as l,nt as u,o as d,r as f,tt as p,u as m,w as h,y as g}from"./panel-access-ri1X9Otj.js";import{r as _}from"./panel-runs-D5zf-D9c.js";import{n as v}from"./panel-channels-BDYWX29p.js";var y=g({q:o().optional(),ref:o().optional(),child:o().optional(),tenant:o().optional(),view:l([`browse`,`cache`,`sql`,`probe`]).optional(),prefix:o().optional()});function b(e){let t=y.safeParse(e);return t.success?t.data:{}}function x(e){let t={};return e.q&&(t.q=e.q),e.ref&&(t.ref=e.ref),e.child&&(t.child=e.child),e.tenant&&(t.tenant=e.tenant),e.view&&e.view!==`browse`&&(t.view=e.view),e.prefix&&(t.prefix=e.prefix),t}function S(e,t){return{...e,ref:t,child:void 0,view:`browse`}}function C(e,t){return{...e,child:t,view:`browse`}}var w=[`sql`,`kv`,`files`,`index`],T={sql:`SQL`,kv:`KV`,files:`Files`,index:`Index`};function E(e,t=``){let n=t.trim().toLowerCase(),r=n?e.filter(e=>e.name.toLowerCase().includes(n)||e.ref.toLowerCase().includes(n)||e.children.some(e=>e.name.toLowerCase().includes(n))):e;return w.map(e=>({facet:e,label:T[e],stores:r.filter(t=>t.facet===e)})).filter(e=>e.stores.length>0)}function D(e={production:!0}){return e.production?{kind:`typed`,phrase:`EDIT`,requireReason:!0}:{kind:`undo`,windowMs:f}}function O(e={production:!0}){return e.production?{kind:`typed`,phrase:`DELETE`,requireReason:!0}:{kind:`undo`,windowMs:f}}function k(e={production:!0}){return e.production?{kind:`typed`,phrase:`PURGE`,requireReason:!0}:{kind:`undo`,windowMs:f}}function A(e){let t=[];for(let n of e.signals)t.push(`Signal \`${n}\` will not be emitted`);for(let n of e.channels)t.push(`Channel \`${n}\` will not fire`);return e.writerFlowIds.length>0&&t.push(`Owning flow(s): ${e.writerFlowIds.map(e=>`\`${e}\``).join(`, `)} — not executed`),{headline:`Direct edit is not a flow execution — the following will NOT happen:`,lines:t,empty:t.length===0}}function j(e){return e.facet===`index`?{ok:!1,reason:`Index facet has no bulk-update preview — similarity probe is read-only.`}:{ok:!0}}function ee(e){let t=e.cache,n=t.invalidatedByWrites,r=t.invalidatingFlowIds,i=n.length===0?`Read key \`${t.producedByRead}\` — no write invalidators declared.`:`Read key \`${t.producedByRead}\` — invalidated by writes to ${n.map(e=>`\`${e}\``).join(`, `)}.`;return{producedByRead:t.producedByRead,invalidatedBy:n,invalidatingFlows:r,summary:i}}var M=e(u(),1),N=p();function P(){let e=h({from:`/store`}),t=n({from:`/store`}),o=c(),[l,u]=(0,M.useState)(``),[d,f]=(0,M.useState)(``),[p,g]=(0,M.useState)(`{}`),[_,y]=(0,M.useState)(`SELECT * FROM "bookings" LIMIT 50`),[b,C]=(0,M.useState)(`0.1,0.2,0.3`),[w,T]=(0,M.useState)(null),P=e=>{t({search:x(e),replace:!0})},I=r({queryKey:[`console.store.list`],queryFn:async()=>{let e=await s.storeList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:1e4}),L=I.data?.tenancyDeclared??!1,te=I.data?.tenants??[],R=I.data?.stores??[],ne=(0,M.useMemo)(()=>E(R,e.q??``),[R,e.q]),z=R.find(t=>t.ref===e.ref),B=z?.children.find(t=>t.name===e.child)??z?.children[0],V=e.view??`browse`,H=D({production:!0}),U=O({production:!0}),W=k({production:!0}),G=z?j(z):null,re=B?A(B.willNotFire):null,ie=B?ee(B):null,K=r({queryKey:[`console.store.query`,e.ref,B?.name,e.tenant,e.prefix,V,b],enabled:!!z&&!!B&&V===`browse`&&(!L||!!e.tenant),queryFn:async()=>{if(!z||!B)return null;let t=z.facet===`index`?b.split(`,`).map(e=>Number(e.trim())).filter(e=>!Number.isNaN(e)):void 0,n=await s.storeQuery({ref:z.ref,child:B.name,tenant:e.tenant,prefix:e.prefix,vector:t,topK:5});if(n.error)throw Error(n.error.code);return n.data}});(0,M.useEffect)(()=>{u(``),f(``),T(null)},[z?.ref,B?.name]);let q=()=>{o.invalidateQueries({queryKey:[`console.store.list`]}),o.invalidateQueries({queryKey:[`console.store.query`]})},J=i({mutationFn:async()=>{if(!z||!B)return;if(G&&!G.ok)throw Error(G.reason);let t={};try{t=JSON.parse(p)}catch{throw Error(`Patch must be valid JSON`)}let n=await s.storePreview({ref:z.ref,child:B.name,tenant:e.tenant,id:String(t.id??`preview`),key:typeof t.key==`string`?t.key:void 0,patch:t});if(n.error)throw Error(n.error.code);let r=n.data;return T(A(r.willNotFire).lines),r}}),Y=i({mutationFn:async()=>{if(!z||!B)return;if(H.kind===`typed`){let e=a({typed:l,reason:d,phrase:H.phrase});if(e)throw Error(e.typed??e.reason)}let t={};try{t=JSON.parse(p)}catch{throw Error(`Patch must be valid JSON`)}let n=await s.storeEdit({ref:z.ref,child:B.name,tenant:e.tenant,id:String(t.id??``),key:typeof t.key==`string`?t.key:void 0,patch:t,confirmation:l,reason:d,commit:!0});if(n.error)throw Error(n.error.code);return n.data},onSuccess:q}),X=i({mutationFn:async t=>{if(!z||!B)return;if(U.kind===`typed`){let e=a({typed:l,reason:d,phrase:U.phrase});if(e)throw Error(e.typed??e.reason)}let n=await s.storeDelete({ref:z.ref,child:B.name,tenant:e.tenant,ids:z.facet===`sql`||z.facet===`index`?t:void 0,keys:z.facet===`kv`||z.facet===`files`?t:void 0,confirmation:l,reason:d});if(n.error)throw Error(n.error.code);return n.data},onSuccess:q}),Z=i({mutationFn:async()=>{if(!B)return;if(W.kind===`typed`){let e=a({typed:l,reason:d,phrase:W.phrase});if(e)throw Error(e.typed??e.reason)}let e=await s.storePurgeCache({resource:B.effectRef,confirmation:l,reason:d});if(e.error)throw Error(e.error.code);return e.data},onSuccess:q}),Q=i({mutationFn:async()=>{if(!z||z.facet!==`sql`)return;let t=await s.storeSql({ref:z.ref,sql:_,tenant:e.tenant,allowWrite:!1});if(t.error)throw Error(t.error.code);return t.data}}),$=i({mutationFn:async t=>{if(!z||!B)return;let n=await s.storeReveal({ref:z.ref,child:B.name,tenant:e.tenant,id:t.id,column:t.column});if(n.error)throw Error(n.error.code);return n.data}});return(0,N.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,N.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-3 border-b border-[var(--oke-line)] px-4 py-3`,children:[(0,N.jsxs)(`div`,{className:`mr-auto`,children:[(0,N.jsx)(`h1`,{className:`text-lg font-medium`,children:`Store`}),(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`One list, grouped by facet — direct edits are not flow executions`})]}),L?(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Tenant`}),(0,N.jsxs)(`select`,{"aria-label":`Tenant`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:e.tenant??``,onChange:t=>P({...e,tenant:t.target.value||void 0}),children:[(0,N.jsx)(`option`,{value:``,children:`Select tenant…`}),te.map(e=>(0,N.jsx)(`option`,{value:e,children:e},e))]})]}):null,(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter`}),(0,N.jsx)(`input`,{"aria-label":`Filter stores`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:e.q??``,onChange:t=>P({...e,q:t.target.value||void 0})})]})]}),(0,N.jsxs)(`div`,{className:`flex min-h-0 flex-1`,children:[(0,N.jsxs)(`section`,{"aria-label":`Store list`,className:`w-72 shrink-0 overflow-y-auto border-r border-[var(--oke-line)]`,children:[I.isLoading?(0,N.jsx)(`p`,{className:`p-3 text-sm text-[var(--oke-muted)]`,children:`Loading…`}):null,ne.map(t=>(0,N.jsxs)(`div`,{className:`border-b border-[var(--oke-line)]`,children:[(0,N.jsx)(`h2`,{className:`px-3 py-2 text-xs tracking-wide text-[var(--oke-muted)]`,children:t.label}),(0,N.jsx)(`ul`,{children:t.stores.map(t=>(0,N.jsx)(`li`,{children:(0,N.jsxs)(`button`,{type:`button`,"aria-pressed":t.ref===e.ref,className:m(`flex min-h-8 w-full flex-col items-start px-3 py-2 text-left text-sm`,t.ref===e.ref?`bg-[var(--oke-line)]/40`:`hover:bg-[var(--oke-line)]/20`),onClick:()=>P(S(e,t.ref)),children:[(0,N.jsx)(`span`,{children:v(t.name,t.description)}),t.description?(0,N.jsx)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:t.name}):null,(0,N.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[t.children.length,` resource(s)`,t.replicaLagMs==null?``:` · lag ${t.replicaLagMs}ms`,t.migrationDrift?.drifted?` · drift`:``,t.warnings.length>0?` · ${t.warnings.length} warn`:``]})]})},t.ref))})]},t.facet))]}),(0,N.jsx)(`section`,{"aria-label":`Store detail`,className:`min-w-0 flex-1 overflow-y-auto p-4`,"aria-live":`polite`,children:z?L&&!e.tenant?(0,N.jsx)(`p`,{role:`status`,className:`text-sm`,children:`Select a tenant in the header before browsing — compliance boundary, not a display filter.`}):(0,N.jsx)(F,{open:z,childName:B?.name,view:V,search:e,setSearch:P,browse:K.data,browseLoading:K.isLoading,cache:ie,willNot:re,willNotPreview:w,patchJson:p,setPatchJson:g,typed:l,setTyped:u,reason:d,setReason:f,sqlText:_,setSqlText:y,probeVector:b,setProbeVector:C,onPreview:()=>J.mutate(),onCommit:()=>Y.mutate(),onDelete:e=>X.mutate(e),onPurge:()=>Z.mutate(),onSql:()=>Q.mutate(),sqlResult:Q.data,onReveal:(e,t)=>$.mutate({id:e,column:t}),revealValue:$.data?.value,error:J.error?.message??Y.error?.message??X.error?.message??Z.error?.message??Q.error?.message??$.error?.message}):(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a store. Tenant selector appears only when tenancy is declared on the Manifest.`})})]})]})}function F(e){let{open:t,childName:n,view:r,search:i,setSearch:a,browse:o,browseLoading:s,cache:c,willNot:l,willNotPreview:u,patchJson:f,setPatchJson:p,typed:h,setTyped:g,reason:y,setReason:b,sqlText:x,setSqlText:S,probeVector:w,setProbeVector:T,onPreview:E,onCommit:D,onDelete:O,onPurge:k,onSql:A,sqlResult:j,onReveal:ee,revealValue:M,error:P}=e,F=t.children.find(e=>e.name===n);return(0,N.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,N.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-2`,children:[(0,N.jsx)(`h2`,{className:`text-base font-medium`,children:v(t.name,t.description)}),(0,N.jsxs)(`span`,{className:`text-sm text-[var(--oke-muted)]`,children:[t.description?`${t.name} · `:``,t.ref]}),t.contentAddressed?(0,N.jsx)(`span`,{role:`status`,className:`text-xs text-[var(--oke-muted)]`,children:`content-addressed keys`}):null]}),(0,N.jsx)(`div`,{className:`flex flex-wrap gap-2`,role:`tablist`,"aria-label":`Views`,children:[[`browse`,`Browse`],[`cache`,`Cache`],...t.facet===`sql`?[[`sql`,`SQL`]]:[],...t.facet===`index`?[[`probe`,`Probe`]]:[]].map(([e,t])=>(0,N.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e,className:m(`min-h-8 px-2 text-sm`,r===e?`text-[var(--oke-fg)] underline`:`text-[var(--oke-muted)]`),onClick:()=>a({...i,view:e}),children:t},e))}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Resource`}),(0,N.jsx)(`select`,{"aria-label":`Store resource`,className:`min-h-8 max-w-xs border border-[var(--oke-line)] bg-transparent px-2`,value:n??``,onChange:e=>a(C(i,e.target.value)),children:t.children.map(e=>(0,N.jsx)(`option`,{value:e.name,children:e.name},e.name))})]}),F?(0,N.jsxs)(`p`,{className:`text-sm`,role:`status`,children:[`Writers:`,` `,F.writers.map(e=>(0,N.jsx)(_,{to:`/flows`,search:{flow:e},className:`mr-2 underline`,children:e},e)),F.writers.length===0?`none`:null,` · `,`Readers: `,F.readers.join(`, `)||`none`,F.piiColumns.length>0?` · PII columns: ${F.piiColumns.join(`, `)}`:``]}):null,t.migrationDrift?(0,N.jsxs)(`p`,{className:`text-sm`,role:`status`,children:[`Migration: declared `,t.migrationDrift.declared.slice(0,12),`…`,t.migrationDrift.applied?` / applied ${t.migrationDrift.applied.slice(0,12)}…`:` / applied (none)`,t.migrationDrift.drifted?` — drifted`:` — in sync`]}):null,t.warnings.length>0?(0,N.jsx)(`ul`,{"aria-label":`Operational warnings`,className:`text-sm`,children:t.warnings.map(e=>(0,N.jsxs)(`li`,{role:`status`,children:[e.key,`: `,e.message]},`${e.key}:${e.code}`))}):null,r===`cache`&&c?(0,N.jsxs)(`section`,{"aria-label":`Cache`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`Cache`}),(0,N.jsx)(`p`,{className:`text-sm`,role:`status`,children:c.summary}),(0,N.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[`Invalidating flows: `,c.invalidatingFlows.join(`, `)||`none`]}),(0,N.jsx)(d,{type:`button`,onClick:k,children:`Purge cache namespace`})]}):null,r===`sql`&&t.facet===`sql`?(0,N.jsxs)(`section`,{"aria-label":`SQL console`,className:`flex flex-col gap-2`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`SQL console (read-only)`}),(0,N.jsx)(`textarea`,{"aria-label":`SQL console`,className:`min-h-24 border border-[var(--oke-line)] bg-transparent p-2 font-mono text-sm`,value:x,onChange:e=>S(e.target.value)}),(0,N.jsx)(d,{type:`button`,onClick:A,children:`Run`}),j?(0,N.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[j.rows.length,` row(s) · routed `,j.routedRole,j.masked?` · PII masked`:``]}):null]}):null,(r===`browse`||r===`probe`)&&(0,N.jsxs)(`section`,{"aria-label":`Browse`,children:[t.facet===`index`?(0,N.jsxs)(`label`,{className:`mb-2 flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{children:`Probe vector`}),(0,N.jsx)(`input`,{"aria-label":`Probe vector`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 font-mono`,value:w,onChange:e=>T(e.target.value)})]}):null,s?(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Loading…`}):null,o?.rows?(0,N.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,N.jsx)(`thead`,{children:(0,N.jsxs)(`tr`,{children:[Object.keys(o.rows[0]??{id:1}).map(e=>(0,N.jsx)(`th`,{scope:`col`,className:`border-b px-2 py-1`,children:v(e,F?.columnDescriptions[e])},e)),(0,N.jsx)(`th`,{scope:`col`,className:`border-b px-2 py-1`,children:`Actions`})]})}),(0,N.jsx)(`tbody`,{children:o.rows.map((e,t)=>(0,N.jsxs)(`tr`,{children:[Object.entries(e).map(([t,n])=>(0,N.jsxs)(`td`,{className:`border-b px-2 py-1 font-mono`,children:[String(n),F?.piiColumns.includes(t)?(0,N.jsx)(`button`,{type:`button`,className:`ml-2 underline`,style:{minHeight:32},onClick:()=>ee(String(e.id??``),t),children:`Reveal`}):null]},t)),(0,N.jsx)(`td`,{className:`border-b px-2 py-1`,children:(0,N.jsx)(d,{type:`button`,onClick:()=>O([String(e.id??``)]),children:`Delete`})})]},t))})]}):null,o?.keys?(0,N.jsx)(`ul`,{"aria-label":`Keys`,className:`text-sm`,children:o.keys.map(e=>(0,N.jsxs)(`li`,{className:`flex min-h-8 items-center gap-2`,children:[(0,N.jsx)(`span`,{className:`font-mono`,children:e.key}),e.value===void 0?null:(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:JSON.stringify(e.value)}),e.warnings?.map(e=>(0,N.jsx)(`span`,{role:`status`,className:`text-xs`,children:e.message},e.code)),(0,N.jsx)(d,{type:`button`,onClick:()=>O([e.key]),children:`Delete`})]},e.key))}):null,o?.hits?(0,N.jsx)(`ul`,{"aria-label":`Similarity hits`,className:`text-sm`,children:o.hits.map(e=>(0,N.jsxs)(`li`,{children:[e.id,` · score `,e.score.toFixed(3)]},e.id))}):null,M===void 0?null:(0,N.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Revealed: `,String(M)]})]}),(0,N.jsxs)(`section`,{"aria-label":`Direct edit`,className:`flex flex-col gap-2 border-t border-[var(--oke-line)] pt-4`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`Direct edit`}),(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Not a flow execution. Before saving, preview names what will not fire.`}),l&&!l.empty?(0,N.jsx)(`ul`,{className:`text-sm`,children:(u??l.lines).map(e=>(0,N.jsx)(`li`,{children:e},e))}):(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No owning-flow emissions declared for this resource.`}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Patch (JSON)`,(0,N.jsx)(`textarea`,{"aria-label":`Edit patch JSON`,className:`min-h-20 border border-[var(--oke-line)] bg-transparent p-2 font-mono text-sm`,value:f,onChange:e=>p(e.target.value)})]}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Type EDIT / DELETE / PURGE`,(0,N.jsx)(`input`,{"aria-label":`Confirmation phrase`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:h,onChange:e=>g(e.target.value)})]}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Reason`,(0,N.jsx)(`input`,{"aria-label":`Confirmation reason`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:y,onChange:e=>b(e.target.value)})]}),(0,N.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,N.jsx)(d,{type:`button`,onClick:E,children:`Preview`}),(0,N.jsx)(d,{type:`button`,onClick:D,children:`Save edit`})]}),P?(0,N.jsx)(`p`,{role:`alert`,className:`text-sm text-red-600`,children:P}):null]})]})}var I=t({default:()=>P});export{b as n,I as t};
1
+ import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,a,b as o,d as s,et as c,g as l,nt as u,o as d,r as f,tt as p,u as m,w as h,y as g}from"./panel-access-ri1X9Otj.js";import{r as _}from"./panel-runs-BxuyDI3x.js";import{n as v}from"./panel-channels-BDYWX29p.js";var y=g({q:o().optional(),ref:o().optional(),child:o().optional(),tenant:o().optional(),view:l([`browse`,`cache`,`sql`,`probe`]).optional(),prefix:o().optional()});function b(e){let t=y.safeParse(e);return t.success?t.data:{}}function x(e){let t={};return e.q&&(t.q=e.q),e.ref&&(t.ref=e.ref),e.child&&(t.child=e.child),e.tenant&&(t.tenant=e.tenant),e.view&&e.view!==`browse`&&(t.view=e.view),e.prefix&&(t.prefix=e.prefix),t}function S(e,t){return{...e,ref:t,child:void 0,view:`browse`}}function C(e,t){return{...e,child:t,view:`browse`}}var w=[`sql`,`kv`,`files`,`index`],T={sql:`SQL`,kv:`KV`,files:`Files`,index:`Index`};function E(e,t=``){let n=t.trim().toLowerCase(),r=n?e.filter(e=>e.name.toLowerCase().includes(n)||e.ref.toLowerCase().includes(n)||e.children.some(e=>e.name.toLowerCase().includes(n))):e;return w.map(e=>({facet:e,label:T[e],stores:r.filter(t=>t.facet===e)})).filter(e=>e.stores.length>0)}function D(e={production:!0}){return e.production?{kind:`typed`,phrase:`EDIT`,requireReason:!0}:{kind:`undo`,windowMs:f}}function O(e={production:!0}){return e.production?{kind:`typed`,phrase:`DELETE`,requireReason:!0}:{kind:`undo`,windowMs:f}}function k(e={production:!0}){return e.production?{kind:`typed`,phrase:`PURGE`,requireReason:!0}:{kind:`undo`,windowMs:f}}function A(e){let t=[];for(let n of e.signals)t.push(`Signal \`${n}\` will not be emitted`);for(let n of e.channels)t.push(`Channel \`${n}\` will not fire`);return e.writerFlowIds.length>0&&t.push(`Owning flow(s): ${e.writerFlowIds.map(e=>`\`${e}\``).join(`, `)} — not executed`),{headline:`Direct edit is not a flow execution — the following will NOT happen:`,lines:t,empty:t.length===0}}function j(e){return e.facet===`index`?{ok:!1,reason:`Index facet has no bulk-update preview — similarity probe is read-only.`}:{ok:!0}}function ee(e){let t=e.cache,n=t.invalidatedByWrites,r=t.invalidatingFlowIds,i=n.length===0?`Read key \`${t.producedByRead}\` — no write invalidators declared.`:`Read key \`${t.producedByRead}\` — invalidated by writes to ${n.map(e=>`\`${e}\``).join(`, `)}.`;return{producedByRead:t.producedByRead,invalidatedBy:n,invalidatingFlows:r,summary:i}}var M=e(u(),1),N=p();function P(){let e=h({from:`/store`}),t=n({from:`/store`}),o=c(),[l,u]=(0,M.useState)(``),[d,f]=(0,M.useState)(``),[p,g]=(0,M.useState)(`{}`),[_,y]=(0,M.useState)(`SELECT * FROM "bookings" LIMIT 50`),[b,C]=(0,M.useState)(`0.1,0.2,0.3`),[w,T]=(0,M.useState)(null),P=e=>{t({search:x(e),replace:!0})},I=r({queryKey:[`console.store.list`],queryFn:async()=>{let e=await s.storeList();if(e.error)throw Error(e.error.code);return e.data},refetchInterval:1e4}),L=I.data?.tenancyDeclared??!1,te=I.data?.tenants??[],R=I.data?.stores??[],ne=(0,M.useMemo)(()=>E(R,e.q??``),[R,e.q]),z=R.find(t=>t.ref===e.ref),B=z?.children.find(t=>t.name===e.child)??z?.children[0],V=e.view??`browse`,H=D({production:!0}),U=O({production:!0}),W=k({production:!0}),G=z?j(z):null,re=B?A(B.willNotFire):null,ie=B?ee(B):null,K=r({queryKey:[`console.store.query`,e.ref,B?.name,e.tenant,e.prefix,V,b],enabled:!!z&&!!B&&V===`browse`&&(!L||!!e.tenant),queryFn:async()=>{if(!z||!B)return null;let t=z.facet===`index`?b.split(`,`).map(e=>Number(e.trim())).filter(e=>!Number.isNaN(e)):void 0,n=await s.storeQuery({ref:z.ref,child:B.name,tenant:e.tenant,prefix:e.prefix,vector:t,topK:5});if(n.error)throw Error(n.error.code);return n.data}});(0,M.useEffect)(()=>{u(``),f(``),T(null)},[z?.ref,B?.name]);let q=()=>{o.invalidateQueries({queryKey:[`console.store.list`]}),o.invalidateQueries({queryKey:[`console.store.query`]})},J=i({mutationFn:async()=>{if(!z||!B)return;if(G&&!G.ok)throw Error(G.reason);let t={};try{t=JSON.parse(p)}catch{throw Error(`Patch must be valid JSON`)}let n=await s.storePreview({ref:z.ref,child:B.name,tenant:e.tenant,id:String(t.id??`preview`),key:typeof t.key==`string`?t.key:void 0,patch:t});if(n.error)throw Error(n.error.code);let r=n.data;return T(A(r.willNotFire).lines),r}}),Y=i({mutationFn:async()=>{if(!z||!B)return;if(H.kind===`typed`){let e=a({typed:l,reason:d,phrase:H.phrase});if(e)throw Error(e.typed??e.reason)}let t={};try{t=JSON.parse(p)}catch{throw Error(`Patch must be valid JSON`)}let n=await s.storeEdit({ref:z.ref,child:B.name,tenant:e.tenant,id:String(t.id??``),key:typeof t.key==`string`?t.key:void 0,patch:t,confirmation:l,reason:d,commit:!0});if(n.error)throw Error(n.error.code);return n.data},onSuccess:q}),X=i({mutationFn:async t=>{if(!z||!B)return;if(U.kind===`typed`){let e=a({typed:l,reason:d,phrase:U.phrase});if(e)throw Error(e.typed??e.reason)}let n=await s.storeDelete({ref:z.ref,child:B.name,tenant:e.tenant,ids:z.facet===`sql`||z.facet===`index`?t:void 0,keys:z.facet===`kv`||z.facet===`files`?t:void 0,confirmation:l,reason:d});if(n.error)throw Error(n.error.code);return n.data},onSuccess:q}),Z=i({mutationFn:async()=>{if(!B)return;if(W.kind===`typed`){let e=a({typed:l,reason:d,phrase:W.phrase});if(e)throw Error(e.typed??e.reason)}let e=await s.storePurgeCache({resource:B.effectRef,confirmation:l,reason:d});if(e.error)throw Error(e.error.code);return e.data},onSuccess:q}),Q=i({mutationFn:async()=>{if(!z||z.facet!==`sql`)return;let t=await s.storeSql({ref:z.ref,sql:_,tenant:e.tenant,allowWrite:!1});if(t.error)throw Error(t.error.code);return t.data}}),$=i({mutationFn:async t=>{if(!z||!B)return;let n=await s.storeReveal({ref:z.ref,child:B.name,tenant:e.tenant,id:t.id,column:t.column});if(n.error)throw Error(n.error.code);return n.data}});return(0,N.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,N.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-3 border-b border-[var(--oke-line)] px-4 py-3`,children:[(0,N.jsxs)(`div`,{className:`mr-auto`,children:[(0,N.jsx)(`h1`,{className:`text-lg font-medium`,children:`Store`}),(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`One list, grouped by facet — direct edits are not flow executions`})]}),L?(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Tenant`}),(0,N.jsxs)(`select`,{"aria-label":`Tenant`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:e.tenant??``,onChange:t=>P({...e,tenant:t.target.value||void 0}),children:[(0,N.jsx)(`option`,{value:``,children:`Select tenant…`}),te.map(e=>(0,N.jsx)(`option`,{value:e,children:e},e))]})]}):null,(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter`}),(0,N.jsx)(`input`,{"aria-label":`Filter stores`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:e.q??``,onChange:t=>P({...e,q:t.target.value||void 0})})]})]}),(0,N.jsxs)(`div`,{className:`flex min-h-0 flex-1`,children:[(0,N.jsxs)(`section`,{"aria-label":`Store list`,className:`w-72 shrink-0 overflow-y-auto border-r border-[var(--oke-line)]`,children:[I.isLoading?(0,N.jsx)(`p`,{className:`p-3 text-sm text-[var(--oke-muted)]`,children:`Loading…`}):null,ne.map(t=>(0,N.jsxs)(`div`,{className:`border-b border-[var(--oke-line)]`,children:[(0,N.jsx)(`h2`,{className:`px-3 py-2 text-xs tracking-wide text-[var(--oke-muted)]`,children:t.label}),(0,N.jsx)(`ul`,{children:t.stores.map(t=>(0,N.jsx)(`li`,{children:(0,N.jsxs)(`button`,{type:`button`,"aria-pressed":t.ref===e.ref,className:m(`flex min-h-8 w-full flex-col items-start px-3 py-2 text-left text-sm`,t.ref===e.ref?`bg-[var(--oke-line)]/40`:`hover:bg-[var(--oke-line)]/20`),onClick:()=>P(S(e,t.ref)),children:[(0,N.jsx)(`span`,{children:v(t.name,t.description)}),t.description?(0,N.jsx)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:t.name}):null,(0,N.jsxs)(`span`,{className:`text-xs text-[var(--oke-muted)]`,children:[t.children.length,` resource(s)`,t.replicaLagMs==null?``:` · lag ${t.replicaLagMs}ms`,t.migrationDrift?.drifted?` · drift`:``,t.warnings.length>0?` · ${t.warnings.length} warn`:``]})]})},t.ref))})]},t.facet))]}),(0,N.jsx)(`section`,{"aria-label":`Store detail`,className:`min-w-0 flex-1 overflow-y-auto p-4`,"aria-live":`polite`,children:z?L&&!e.tenant?(0,N.jsx)(`p`,{role:`status`,className:`text-sm`,children:`Select a tenant in the header before browsing — compliance boundary, not a display filter.`}):(0,N.jsx)(F,{open:z,childName:B?.name,view:V,search:e,setSearch:P,browse:K.data,browseLoading:K.isLoading,cache:ie,willNot:re,willNotPreview:w,patchJson:p,setPatchJson:g,typed:l,setTyped:u,reason:d,setReason:f,sqlText:_,setSqlText:y,probeVector:b,setProbeVector:C,onPreview:()=>J.mutate(),onCommit:()=>Y.mutate(),onDelete:e=>X.mutate(e),onPurge:()=>Z.mutate(),onSql:()=>Q.mutate(),sqlResult:Q.data,onReveal:(e,t)=>$.mutate({id:e,column:t}),revealValue:$.data?.value,error:J.error?.message??Y.error?.message??X.error?.message??Z.error?.message??Q.error?.message??$.error?.message}):(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a store. Tenant selector appears only when tenancy is declared on the Manifest.`})})]})]})}function F(e){let{open:t,childName:n,view:r,search:i,setSearch:a,browse:o,browseLoading:s,cache:c,willNot:l,willNotPreview:u,patchJson:f,setPatchJson:p,typed:h,setTyped:g,reason:y,setReason:b,sqlText:x,setSqlText:S,probeVector:w,setProbeVector:T,onPreview:E,onCommit:D,onDelete:O,onPurge:k,onSql:A,sqlResult:j,onReveal:ee,revealValue:M,error:P}=e,F=t.children.find(e=>e.name===n);return(0,N.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,N.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-2`,children:[(0,N.jsx)(`h2`,{className:`text-base font-medium`,children:v(t.name,t.description)}),(0,N.jsxs)(`span`,{className:`text-sm text-[var(--oke-muted)]`,children:[t.description?`${t.name} · `:``,t.ref]}),t.contentAddressed?(0,N.jsx)(`span`,{role:`status`,className:`text-xs text-[var(--oke-muted)]`,children:`content-addressed keys`}):null]}),(0,N.jsx)(`div`,{className:`flex flex-wrap gap-2`,role:`tablist`,"aria-label":`Views`,children:[[`browse`,`Browse`],[`cache`,`Cache`],...t.facet===`sql`?[[`sql`,`SQL`]]:[],...t.facet===`index`?[[`probe`,`Probe`]]:[]].map(([e,t])=>(0,N.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e,className:m(`min-h-8 px-2 text-sm`,r===e?`text-[var(--oke-fg)] underline`:`text-[var(--oke-muted)]`),onClick:()=>a({...i,view:e}),children:t},e))}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Resource`}),(0,N.jsx)(`select`,{"aria-label":`Store resource`,className:`min-h-8 max-w-xs border border-[var(--oke-line)] bg-transparent px-2`,value:n??``,onChange:e=>a(C(i,e.target.value)),children:t.children.map(e=>(0,N.jsx)(`option`,{value:e.name,children:e.name},e.name))})]}),F?(0,N.jsxs)(`p`,{className:`text-sm`,role:`status`,children:[`Writers:`,` `,F.writers.map(e=>(0,N.jsx)(_,{to:`/flows`,search:{flow:e},className:`mr-2 underline`,children:e},e)),F.writers.length===0?`none`:null,` · `,`Readers: `,F.readers.join(`, `)||`none`,F.piiColumns.length>0?` · PII columns: ${F.piiColumns.join(`, `)}`:``]}):null,t.migrationDrift?(0,N.jsxs)(`p`,{className:`text-sm`,role:`status`,children:[`Migration: declared `,t.migrationDrift.declared.slice(0,12),`…`,t.migrationDrift.applied?` / applied ${t.migrationDrift.applied.slice(0,12)}…`:` / applied (none)`,t.migrationDrift.drifted?` — drifted`:` — in sync`]}):null,t.warnings.length>0?(0,N.jsx)(`ul`,{"aria-label":`Operational warnings`,className:`text-sm`,children:t.warnings.map(e=>(0,N.jsxs)(`li`,{role:`status`,children:[e.key,`: `,e.message]},`${e.key}:${e.code}`))}):null,r===`cache`&&c?(0,N.jsxs)(`section`,{"aria-label":`Cache`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`Cache`}),(0,N.jsx)(`p`,{className:`text-sm`,role:`status`,children:c.summary}),(0,N.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[`Invalidating flows: `,c.invalidatingFlows.join(`, `)||`none`]}),(0,N.jsx)(d,{type:`button`,onClick:k,children:`Purge cache namespace`})]}):null,r===`sql`&&t.facet===`sql`?(0,N.jsxs)(`section`,{"aria-label":`SQL console`,className:`flex flex-col gap-2`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`SQL console (read-only)`}),(0,N.jsx)(`textarea`,{"aria-label":`SQL console`,className:`min-h-24 border border-[var(--oke-line)] bg-transparent p-2 font-mono text-sm`,value:x,onChange:e=>S(e.target.value)}),(0,N.jsx)(d,{type:`button`,onClick:A,children:`Run`}),j?(0,N.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[j.rows.length,` row(s) · routed `,j.routedRole,j.masked?` · PII masked`:``]}):null]}):null,(r===`browse`||r===`probe`)&&(0,N.jsxs)(`section`,{"aria-label":`Browse`,children:[t.facet===`index`?(0,N.jsxs)(`label`,{className:`mb-2 flex flex-col gap-1 text-sm`,children:[(0,N.jsx)(`span`,{children:`Probe vector`}),(0,N.jsx)(`input`,{"aria-label":`Probe vector`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 font-mono`,value:w,onChange:e=>T(e.target.value)})]}):null,s?(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Loading…`}):null,o?.rows?(0,N.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,N.jsx)(`thead`,{children:(0,N.jsxs)(`tr`,{children:[Object.keys(o.rows[0]??{id:1}).map(e=>(0,N.jsx)(`th`,{scope:`col`,className:`border-b px-2 py-1`,children:v(e,F?.columnDescriptions[e])},e)),(0,N.jsx)(`th`,{scope:`col`,className:`border-b px-2 py-1`,children:`Actions`})]})}),(0,N.jsx)(`tbody`,{children:o.rows.map((e,t)=>(0,N.jsxs)(`tr`,{children:[Object.entries(e).map(([t,n])=>(0,N.jsxs)(`td`,{className:`border-b px-2 py-1 font-mono`,children:[String(n),F?.piiColumns.includes(t)?(0,N.jsx)(`button`,{type:`button`,className:`ml-2 underline`,style:{minHeight:32},onClick:()=>ee(String(e.id??``),t),children:`Reveal`}):null]},t)),(0,N.jsx)(`td`,{className:`border-b px-2 py-1`,children:(0,N.jsx)(d,{type:`button`,onClick:()=>O([String(e.id??``)]),children:`Delete`})})]},t))})]}):null,o?.keys?(0,N.jsx)(`ul`,{"aria-label":`Keys`,className:`text-sm`,children:o.keys.map(e=>(0,N.jsxs)(`li`,{className:`flex min-h-8 items-center gap-2`,children:[(0,N.jsx)(`span`,{className:`font-mono`,children:e.key}),e.value===void 0?null:(0,N.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:JSON.stringify(e.value)}),e.warnings?.map(e=>(0,N.jsx)(`span`,{role:`status`,className:`text-xs`,children:e.message},e.code)),(0,N.jsx)(d,{type:`button`,onClick:()=>O([e.key]),children:`Delete`})]},e.key))}):null,o?.hits?(0,N.jsx)(`ul`,{"aria-label":`Similarity hits`,className:`text-sm`,children:o.hits.map(e=>(0,N.jsxs)(`li`,{children:[e.id,` · score `,e.score.toFixed(3)]},e.id))}):null,M===void 0?null:(0,N.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Revealed: `,String(M)]})]}),(0,N.jsxs)(`section`,{"aria-label":`Direct edit`,className:`flex flex-col gap-2 border-t border-[var(--oke-line)] pt-4`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:`Direct edit`}),(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Not a flow execution. Before saving, preview names what will not fire.`}),l&&!l.empty?(0,N.jsx)(`ul`,{className:`text-sm`,children:(u??l.lines).map(e=>(0,N.jsx)(`li`,{children:e},e))}):(0,N.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`No owning-flow emissions declared for this resource.`}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Patch (JSON)`,(0,N.jsx)(`textarea`,{"aria-label":`Edit patch JSON`,className:`min-h-20 border border-[var(--oke-line)] bg-transparent p-2 font-mono text-sm`,value:f,onChange:e=>p(e.target.value)})]}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Type EDIT / DELETE / PURGE`,(0,N.jsx)(`input`,{"aria-label":`Confirmation phrase`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:h,onChange:e=>g(e.target.value)})]}),(0,N.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[`Reason`,(0,N.jsx)(`input`,{"aria-label":`Confirmation reason`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2`,value:y,onChange:e=>b(e.target.value)})]}),(0,N.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,N.jsx)(d,{type:`button`,onClick:E,children:`Preview`}),(0,N.jsx)(d,{type:`button`,onClick:D,children:`Save edit`})]}),P?(0,N.jsx)(`p`,{role:`alert`,className:`text-sm text-red-600`,children:P}):null]})]})}var I=t({default:()=>P});export{b as n,I as t};
@@ -1 +1 @@
1
- import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,b as a,d as o,et as s,l as c,nt as l,o as u,tt as d,u as f,w as p,y as m}from"./panel-access-ri1X9Otj.js";import{r as h}from"./panel-runs-D5zf-D9c.js";import{n as g,t as _}from"./panel-flows-B8TRhcoe.js";var v=e(l(),1);function y(e,t){if(!t)return!0;switch(t.kind){case`wrote`:return e.effects.some(e=>e.kind===`write`&&e.resource===t.resource);case`asked`:return e.effects.some(e=>e.kind===`ask`);case`sent`:return e.effects.some(e=>e.kind===`send`&&(t.resource===void 0||e.resource===t.resource));case`secret`:return e.effects.some(e=>e.kind===`secret`&&(t.resource===void 0||e.resource===t.resource));case`cost`:return(e.cost??0)>t.min}}function b(e,t){return!t||e.some(e=>y(e,t))}function x(e){if(!e?.trim())return null;let t=e.trim();if(t===`asked`)return{kind:`asked`};if(t===`sent`)return{kind:`sent`};if(t.startsWith(`wrote:`))return{kind:`wrote`,resource:t.slice(6)};if(t.startsWith(`sent:`))return{kind:`sent`,resource:t.slice(5)};if(t.startsWith(`secret:`))return{kind:`secret`,resource:t.slice(7)};if(t===`secret`)return{kind:`secret`};if(t.startsWith(`cost:`)){let e=Number(t.slice(5));return Number.isFinite(e)?{kind:`cost`,min:e}:null}return null}function S(e){if(e)switch(e.kind){case`wrote`:return`wrote:${e.resource}`;case`asked`:return`asked`;case`sent`:return e.resource?`sent:${e.resource}`:`sent`;case`secret`:return e.resource?`secret:${e.resource}`:`secret`;case`cost`:return`cost:${e.min}`}}var C=m({trace:a().optional(),span:a().optional(),effect:a().optional(),q:a().optional(),folds:a().optional(),boost:a().optional()});function w(e){let t=C.safeParse(e??{});return t.success?t.data:C.parse({})}function T(e){let t={};return e.trace&&(t.trace=e.trace),e.span&&(t.span=e.span),e.effect&&(t.effect=e.effect),e.q&&(t.q=e.q),e.folds&&(t.folds=e.folds),e.boost&&(t.boost=e.boost),t}function E(e){return e.folds?new Set(e.folds.split(`,`).map(e=>e.trim()).filter(Boolean)):new Set}function D(e,t,n){return{...e,trace:t,span:n}}function ee(e){return{...e,trace:void 0,span:void 0,folds:void 0}}function te(e,t){let n=E(e);n.has(t)?n.delete(t):n.add(t);let r=[...n].join(`,`);return{...e,folds:r||void 0}}function O(e,t){return{...e,effect:S(t)}}function k(e){let t=new Map,n=new Map;for(let n of e)t.set(n.id,n);for(let t of e){if(!t.parentId)continue;let e=n.get(t.parentId)??[];e.push(t),n.set(t.parentId,e)}for(let[,e]of n)e.sort((e,t)=>e.startedAt-t.startedAt);return{byId:t,childrenOf:n}}function A(e,t){let{byId:n,childrenOf:r}=k(e),i=n.get(t);if(!i)return null;let a=[],o=i,s=new Set;for(;o?.parentId&&!s.has(o.parentId);){s.add(o.parentId);let e=n.get(o.parentId);if(!e)break;a.unshift(e),o=e}return{parents:a,current:i,children:r.get(i.id)??[],connected:N((a[0]??i).id,n,r)}}function j(e){let{byId:t,childrenOf:n}=k(e),r=e.filter(e=>!e.parentId||!t.has(e.parentId));return r.sort((e,t)=>t.startedAt-e.startedAt),r.map(e=>({rootId:e.id,root:e,spans:N(e.id,t,n)}))}function M(e,t){if(t&&e.some(e=>e.id===t))return t;let n=e.find(e=>e.errorCode!=null&&e.errorCode!==``);return n?n.id:e.find(t=>!t.parentId||!e.some(e=>e.id===t.parentId))?.id??e[0]?.id}function N(e,t,n){let r=[],i=e=>{let a=t.get(e);if(a){r.push(a);for(let t of n.get(e)??[])i(t.id)}};return i(e),r.sort((e,t)=>e.startedAt-t.startedAt),r}function P(e){if(e.length===0)return new Set;let{byId:t,childrenOf:n}=k(e),r=e.filter(e=>!e.parentId||!t.has(e.parentId)),i=[],a=-1,o=(e,r,s)=>{let c=n.get(e)??[],l=t.get(e);if(!l)return;let u=s+F(l),d=[...r,e];if(c.length===0){u>a&&(a=u,i=d);return}for(let e of c)o(e.id,d,u)};for(let e of r)o(e.id,[],0);return new Set(i)}function F(e){return e.effects.length===0?Math.max(0,e.durationMs):e.effects.reduce((e,t)=>e+Math.max(0,t.duration),0)}function I(e){switch(e){case`read`:return`reads`;case`write`:return`writes`;case`emit`:return`emits`;case`send`:case`ask`:return`external`;case`secret`:return`capabilities`;case`call`:return`reads`}}function L(e){let t=`none`;for(let n of e){let e=I(n.kind);z(e)>z(t)&&(t=e)}return t}function R(e){return e.some(e=>L(e.effects)===`external`)}function z(e){switch(e){case`external`:return 5;case`capabilities`:return 4;case`emits`:return 3;case`writes`:return 2;case`reads`:return 1;case`none`:return 0}}function B(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms idle`;let n=t/1e3;if(n<60)return`${U(n)}s idle`;let r=n/60;if(r<60)return`${U(r)}m idle`;let i=r/60;return i<48?`${U(i)}h idle`:`${U(i/24)}d idle`}function V(e,t={},n=new Set){let r=t.foldThresholdMs??50,i=t.expandedFolds??new Set,a=[...e].sort((e,t)=>e.startMs-t.startMs);if(a.length===0)return{segments:[],displayDurationMs:0,wallDurationMs:0};let o=a[0],s=a[a.length-1];if(!o||!s)return{segments:[],displayDurationMs:0,wallDurationMs:0};let c=o.startMs,l=Math.max(...a.map(e=>e.endMs)),u=[],d=c;for(let e of a){let t=e.startMs-d;if(t>=r){let n=`fold:${d}:${e.startMs}`,r=i.has(n),a=t;u.push({kind:`fold`,id:n,startMs:d,endMs:e.startMs,durationMs:a,label:B(a),expanded:r,displayMs:r?a:40})}let a=Math.max(0,e.endMs-e.startMs);u.push({kind:`work`,id:e.id,label:e.label,startMs:e.startMs,endMs:e.endMs,durationMs:a,tier:e.tier,spanId:e.spanId,critical:n.has(e.spanId),failed:e.failed===!0,displayMs:Math.max(1,a)}),d=Math.max(d,e.endMs)}let f=u.reduce((e,t)=>e+t.displayMs,0);return{segments:u,displayDurationMs:Math.max(1,f),wallDurationMs:l-c}}function H(e){let t=[];for(let n of e)if(n.effects.length>0)for(let e of n.effects)t.push({id:`${n.id}:${e.kind}:${e.resource}:${e.timestamp}`,label:`${e.kind} ${e.resource}`,startMs:e.timestamp,endMs:e.timestamp+Math.max(1,e.duration),tier:I(e.kind),spanId:n.id,failed:n.errorCode!=null&&e===n.effects[n.effects.length-1]});else t.push({id:n.id,label:n.flow,startMs:n.startedAt,endMs:n.endedAt,tier:`none`,spanId:n.id,failed:n.errorCode!=null});return t}function U(e){let t=Math.round(e*10)/10;return Number.isInteger(t)?String(t):t.toFixed(1)}function W(e){if(e.length===0)return[];let t=Math.min(...e.map(e=>e.startedAt)),n=Math.max(...e.map(e=>e.endedAt)),r=Math.max(1,n-t);if(e.every(e=>e.effects.length===0))return e.map(e=>({start:(e.startedAt-t)/r,width:Math.max(.02,e.durationMs/r),tier:L(e.effects),failed:e.errorCode!=null}));let i=[];for(let n of e){if(n.effects.length===0){i.push({start:(n.startedAt-t)/r,width:Math.max(.02,n.durationMs/r),tier:`none`,failed:n.errorCode!=null});continue}for(let e=0;e<n.effects.length;e++){let a=n.effects[e];a&&i.push({start:(a.timestamp-t)/r,width:Math.max(.02,a.duration/r),tier:I(a.kind),failed:n.errorCode!=null&&e===n.effects.length-1})}}return i}function G(e){for(let t of e)if(t.errorCode)return t.errorCode;return null}function K(e){return R(e)?{mode:`dry-run`,reason:`This trace contains an external effect. Replay runs as a dry run with external effects stubbed.`}:{mode:`replay`}}var q=`10% + all errors`,J=6e5;function Y(e,t=Date.now()){let n=e.filter(e=>e.until>t);return n.length===0?q:`${q} · full: ${n.map(e=>e.flow).join(`, `)}`}function X(e,t,n=Date.now()){let r=n+J;return[...e.filter(e=>e.flow!==t&&e.until>n),{flow:t,until:r}]}function ne(e,t=Date.now()){return e.filter(e=>e.until>t)}var Z=d();function Q(){let e=p({from:`/traces`}),t=n({from:`/traces`}),a=s(),[l,d]=(0,v.useState)([]),[m]=(0,v.useState)(()=>_()),[y,S]=(0,v.useState)(0),[,C]=(0,v.useState)(0),w=e=>{t({search:T(e),replace:!0})},k=r({queryKey:[`console.runs.list`],queryFn:async()=>{let e=await o.runsList();if(e.error)throw Error(e.error.code);return e.data.runs},refetchInterval:5e3}),N=(0,v.useMemo)(()=>(k.data??[]).map(re),[k.data]);(0,v.useEffect)(()=>{if(N.length===0)return;if(m.visible.length===0){for(let e of N)m.offer({id:e.id,value:e,arrivedAt:e.startedAt});m.flush(),S(0),C(e=>e+1);return}let e=new Set(m.visible.map(e=>e.id));for(let t of m.pending)e.add(t.id);for(let t of N)e.has(t.id)?m.updateInPlace(t.id,t):m.offer({id:t.id,value:t,arrivedAt:Date.now()});S(m.pendingCount),C(e=>e+1)},[N,m]);let F=m.visible.map(e=>e.value),I=x(e.effect),R=(0,v.useMemo)(()=>j(F).filter(t=>{let n=g([t.root.flow,t.root.id,G(t.spans)??``],e.q),r=b(t.spans,I);return n&&r}),[F,e.q,I]),z=R.find(t=>t.rootId===e.trace)??(e.trace?j(F).find(t=>t.rootId===e.trace):void 0),B=z?M(z.spans,e.span):void 0,U=B?A(F,B):null,q=U?P(U.connected):new Set,J=U?V(H(U.connected),{expandedFolds:E(e)},q):null,Q=U?K(U.connected):null,$=i({mutationFn:async()=>{if(!U||!Q)return;let e=await o.tracesReplay({rootId:U.connected[0]?.id??U.current.id,dryRun:Q.mode===`dry-run`});if(e.error)throw Error(e.error.code);return e.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.runs.list`]})}}),ae=ne(l);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Traces`}),(0,Z.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Causal chain`}),(0,Z.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[`Sampling: `,Y(ae)]})]}),(0,Z.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter by effect`}),(0,Z.jsxs)(`select`,{"aria-label":`Filter by effect`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:e.effect??``,onChange:t=>{let n=t.target.value;w(O(e,n?x(n):null))},children:[(0,Z.jsx)(`option`,{value:``,children:`All effects`}),(0,Z.jsx)(`option`,{value:`wrote:sql:bookings`,children:`Wrote sql:bookings`}),(0,Z.jsx)(`option`,{value:`sent`,children:`Sent (channel)`}),(0,Z.jsx)(`option`,{value:`asked`,children:`Asked a model`}),(0,Z.jsx)(`option`,{value:`secret`,children:`Read a secret`}),(0,Z.jsx)(`option`,{value:`cost:0.05`,children:`Cost > $0.05`})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(u,{type:`button`,variant:`ghost`,onClick:()=>{let e=z?.root.flow??R[0]?.root.flow??`bookings.create`;d(t=>X(t,e))},children:`Trace flow fully for 10 minutes`}),(0,Z.jsx)(c,{count:y,onFlush:()=>{m.flush(),S(0),C(e=>e+1)}})]})]}),(0,Z.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 md:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]`,children:[(0,Z.jsx)(`section`,{"aria-label":`Trace list`,className:`min-h-0 overflow-auto border-r border-[var(--oke-line)]`,children:k.isLoading?(0,Z.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`Loading traces…`}):R.length===0?(0,Z.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`No traces yet. Invoke a flow or wait for traffic.`}):(0,Z.jsx)(`ul`,{className:`divide-y divide-[var(--oke-line)]`,children:R.map(t=>{let n=G(t.spans),r=W(t.spans),i=t.rootId===e.trace;return(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,"aria-pressed":i,className:f(`flex w-full min-h-10 flex-col gap-1 px-4 py-3 text-left text-sm`,i?`bg-[color-mix(in_oklab,var(--oke-fg)_6%,transparent)]`:`hover:bg-[color-mix(in_oklab,var(--oke-fg)_3%,transparent)]`),onClick:()=>{let n=M(t.spans);w(D(e,t.rootId,n))},children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:t.root.flow}),n?(0,Z.jsx)(`span`,{role:`status`,className:`font-mono text-xs text-[var(--oke-danger)]`,children:n}):(0,Z.jsxs)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:[t.root.durationMs,`ms`]})]}),(0,Z.jsx)(ie,{bars:r})]})},t.rootId)})})}),(0,Z.jsx)(`section`,{"aria-label":`Trace detail`,className:`min-h-0 overflow-auto px-6 py-6`,"aria-live":`polite`,children:!U||!J?(0,Z.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a trace to see the causal chain and folded-time waterfall.`}):(0,Z.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:U.current.flow}),(0,Z.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[U.connected.length,` span`,U.connected.length===1?``:`s`,` · wall `,J.wallDurationMs,`ms · display scale `,Math.round(J.displayDurationMs),`ms`]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(h,{to:`/runs`,search:{run:U.current.id},className:`inline-flex min-h-8 items-center border border-[var(--oke-line)] px-3 text-sm`,children:`Open in Runs`}),(0,Z.jsx)(u,{type:`button`,variant:Q?.mode===`dry-run`?`external`:`primary`,disabled:$.isPending,title:Q?.mode===`dry-run`?Q.reason:`Replay from the journal`,onClick:()=>$.mutate(),children:Q?.mode===`dry-run`?`Dry-run replay`:`Replay`}),(0,Z.jsx)(u,{type:`button`,variant:`ghost`,onClick:()=>w(ee(e)),children:`Close`})]})]}),Q?.mode===`dry-run`?(0,Z.jsx)(`p`,{role:`note`,className:`text-sm text-[var(--oke-external)]`,children:Q.reason}):null,(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`Causal chain`}),(0,Z.jsxs)(`ol`,{className:`flex flex-col gap-1 border-l border-[var(--oke-line)] pl-4`,children:[U.parents.map(t=>(0,Z.jsx)(`li`,{children:(0,Z.jsx)(`button`,{type:`button`,className:`min-h-8 text-sm text-[var(--oke-muted)]`,onClick:()=>w({...e,span:t.id}),children:t.flow})},t.id)),(0,Z.jsxs)(`li`,{"aria-current":`true`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:U.current.flow}),U.current.errorCode?(0,Z.jsx)(`span`,{role:`status`,className:`ml-2 font-mono text-xs text-[var(--oke-danger)]`,children:U.current.errorCode}):null,L(U.current.effects)===`external`?(0,Z.jsx)(`span`,{"aria-label":`external effect`,children:` ↗`}):null]}),U.children.map(t=>(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,className:`min-h-8 text-sm text-[var(--oke-muted)]`,onClick:()=>w({...e,span:t.id}),children:[t.flow,L(t.effects)===`external`?(0,Z.jsx)(`span`,{"aria-label":`external effect`,children:` ↗`}):null]})},t.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{id:`waterfall-heading`,className:`mb-2 text-sm font-medium`,children:`Waterfall`}),(0,Z.jsx)(`ul`,{"aria-labelledby":`waterfall-heading`,className:`flex min-h-10 list-none items-stretch gap-0.5 p-0`,children:J.segments.map(t=>t.kind===`fold`?(0,Z.jsx)(`li`,{style:{flex:`${t.displayMs} 1 0`,minWidth:24},children:(0,Z.jsx)(`button`,{type:`button`,"aria-expanded":t.expanded,className:`h-full min-h-10 w-full border border-dashed border-[var(--oke-line)] px-1 font-mono text-[10px] text-[var(--oke-muted)]`,onClick:()=>w(te(e,t.id)),children:t.label})},t.id):(0,Z.jsx)(`li`,{title:t.label,className:f(`min-h-10 px-1 text-[10px] leading-10`,t.tier===`external`?`bg-[var(--oke-external)] text-black`:`bg-[color-mix(in_oklab,var(--oke-accent)_55%,transparent)]`,t.failed&&`outline outline-2 outline-[var(--oke-danger)]`),style:{flex:`${t.displayMs} 1 0`,opacity:t.critical?1:.38,minWidth:4},children:(0,Z.jsxs)(`span`,{className:`sr-only`,children:[t.label,t.critical?` (critical path)`:``,t.failed?` (failed)`:``]})},t.id))}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-[var(--oke-muted)]`,children:`Critical path at full opacity · dead time folded into expandable bars`})]})]})})]})]})}function re(e){return{id:e.id,...e.parentId?{parentId:e.parentId}:{},flow:e.flow,...e.unit?{unit:e.unit}:{},trigger:e.trigger,startedAt:e.startedAt,endedAt:e.endedAt,durationMs:e.durationMs,errorCode:e.error,cost:e.cost??void 0,sampled:e.sampled??(e.error?`error`:`sample`),effects:e.effects??[]}}function ie({bars:e}){return(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:`relative h-2 w-full overflow-hidden bg-[color-mix(in_oklab,var(--oke-fg)_6%,transparent)]`,children:e.map((e,t)=>(0,Z.jsx)(`span`,{className:f(`absolute inset-y-0`,e.tier===`external`?`bg-[var(--oke-external)]`:e.failed?`bg-[var(--oke-danger)]`:`bg-[var(--oke-accent)]`),style:{left:`${e.start*100}%`,width:`${Math.max(2,e.width*100)}%`}},t))})}var $=t({default:()=>Q});export{w as n,$ as t};
1
+ import{a as e,r as t}from"./rolldown-runtime-B0Z9INg1.js";import{C as n,Q as r,Z as i,b as a,d as o,et as s,l as c,nt as l,o as u,tt as d,u as f,w as p,y as m}from"./panel-access-ri1X9Otj.js";import{r as h}from"./panel-runs-BxuyDI3x.js";import{n as g,t as _}from"./panel-flows-B8TRhcoe.js";var v=e(l(),1);function y(e,t){if(!t)return!0;switch(t.kind){case`wrote`:return e.effects.some(e=>e.kind===`write`&&e.resource===t.resource);case`asked`:return e.effects.some(e=>e.kind===`ask`);case`sent`:return e.effects.some(e=>e.kind===`send`&&(t.resource===void 0||e.resource===t.resource));case`secret`:return e.effects.some(e=>e.kind===`secret`&&(t.resource===void 0||e.resource===t.resource));case`cost`:return(e.cost??0)>t.min}}function b(e,t){return!t||e.some(e=>y(e,t))}function x(e){if(!e?.trim())return null;let t=e.trim();if(t===`asked`)return{kind:`asked`};if(t===`sent`)return{kind:`sent`};if(t.startsWith(`wrote:`))return{kind:`wrote`,resource:t.slice(6)};if(t.startsWith(`sent:`))return{kind:`sent`,resource:t.slice(5)};if(t.startsWith(`secret:`))return{kind:`secret`,resource:t.slice(7)};if(t===`secret`)return{kind:`secret`};if(t.startsWith(`cost:`)){let e=Number(t.slice(5));return Number.isFinite(e)?{kind:`cost`,min:e}:null}return null}function S(e){if(e)switch(e.kind){case`wrote`:return`wrote:${e.resource}`;case`asked`:return`asked`;case`sent`:return e.resource?`sent:${e.resource}`:`sent`;case`secret`:return e.resource?`secret:${e.resource}`:`secret`;case`cost`:return`cost:${e.min}`}}var C=m({trace:a().optional(),span:a().optional(),effect:a().optional(),q:a().optional(),folds:a().optional(),boost:a().optional()});function w(e){let t=C.safeParse(e??{});return t.success?t.data:C.parse({})}function T(e){let t={};return e.trace&&(t.trace=e.trace),e.span&&(t.span=e.span),e.effect&&(t.effect=e.effect),e.q&&(t.q=e.q),e.folds&&(t.folds=e.folds),e.boost&&(t.boost=e.boost),t}function E(e){return e.folds?new Set(e.folds.split(`,`).map(e=>e.trim()).filter(Boolean)):new Set}function D(e,t,n){return{...e,trace:t,span:n}}function ee(e){return{...e,trace:void 0,span:void 0,folds:void 0}}function te(e,t){let n=E(e);n.has(t)?n.delete(t):n.add(t);let r=[...n].join(`,`);return{...e,folds:r||void 0}}function O(e,t){return{...e,effect:S(t)}}function k(e){let t=new Map,n=new Map;for(let n of e)t.set(n.id,n);for(let t of e){if(!t.parentId)continue;let e=n.get(t.parentId)??[];e.push(t),n.set(t.parentId,e)}for(let[,e]of n)e.sort((e,t)=>e.startedAt-t.startedAt);return{byId:t,childrenOf:n}}function A(e,t){let{byId:n,childrenOf:r}=k(e),i=n.get(t);if(!i)return null;let a=[],o=i,s=new Set;for(;o?.parentId&&!s.has(o.parentId);){s.add(o.parentId);let e=n.get(o.parentId);if(!e)break;a.unshift(e),o=e}return{parents:a,current:i,children:r.get(i.id)??[],connected:N((a[0]??i).id,n,r)}}function j(e){let{byId:t,childrenOf:n}=k(e),r=e.filter(e=>!e.parentId||!t.has(e.parentId));return r.sort((e,t)=>t.startedAt-e.startedAt),r.map(e=>({rootId:e.id,root:e,spans:N(e.id,t,n)}))}function M(e,t){if(t&&e.some(e=>e.id===t))return t;let n=e.find(e=>e.errorCode!=null&&e.errorCode!==``);return n?n.id:e.find(t=>!t.parentId||!e.some(e=>e.id===t.parentId))?.id??e[0]?.id}function N(e,t,n){let r=[],i=e=>{let a=t.get(e);if(a){r.push(a);for(let t of n.get(e)??[])i(t.id)}};return i(e),r.sort((e,t)=>e.startedAt-t.startedAt),r}function P(e){if(e.length===0)return new Set;let{byId:t,childrenOf:n}=k(e),r=e.filter(e=>!e.parentId||!t.has(e.parentId)),i=[],a=-1,o=(e,r,s)=>{let c=n.get(e)??[],l=t.get(e);if(!l)return;let u=s+F(l),d=[...r,e];if(c.length===0){u>a&&(a=u,i=d);return}for(let e of c)o(e.id,d,u)};for(let e of r)o(e.id,[],0);return new Set(i)}function F(e){return e.effects.length===0?Math.max(0,e.durationMs):e.effects.reduce((e,t)=>e+Math.max(0,t.duration),0)}function I(e){switch(e){case`read`:return`reads`;case`write`:return`writes`;case`emit`:return`emits`;case`send`:case`ask`:return`external`;case`secret`:return`capabilities`;case`call`:return`reads`}}function L(e){let t=`none`;for(let n of e){let e=I(n.kind);z(e)>z(t)&&(t=e)}return t}function R(e){return e.some(e=>L(e.effects)===`external`)}function z(e){switch(e){case`external`:return 5;case`capabilities`:return 4;case`emits`:return 3;case`writes`:return 2;case`reads`:return 1;case`none`:return 0}}function B(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms idle`;let n=t/1e3;if(n<60)return`${U(n)}s idle`;let r=n/60;if(r<60)return`${U(r)}m idle`;let i=r/60;return i<48?`${U(i)}h idle`:`${U(i/24)}d idle`}function V(e,t={},n=new Set){let r=t.foldThresholdMs??50,i=t.expandedFolds??new Set,a=[...e].sort((e,t)=>e.startMs-t.startMs);if(a.length===0)return{segments:[],displayDurationMs:0,wallDurationMs:0};let o=a[0],s=a[a.length-1];if(!o||!s)return{segments:[],displayDurationMs:0,wallDurationMs:0};let c=o.startMs,l=Math.max(...a.map(e=>e.endMs)),u=[],d=c;for(let e of a){let t=e.startMs-d;if(t>=r){let n=`fold:${d}:${e.startMs}`,r=i.has(n),a=t;u.push({kind:`fold`,id:n,startMs:d,endMs:e.startMs,durationMs:a,label:B(a),expanded:r,displayMs:r?a:40})}let a=Math.max(0,e.endMs-e.startMs);u.push({kind:`work`,id:e.id,label:e.label,startMs:e.startMs,endMs:e.endMs,durationMs:a,tier:e.tier,spanId:e.spanId,critical:n.has(e.spanId),failed:e.failed===!0,displayMs:Math.max(1,a)}),d=Math.max(d,e.endMs)}let f=u.reduce((e,t)=>e+t.displayMs,0);return{segments:u,displayDurationMs:Math.max(1,f),wallDurationMs:l-c}}function H(e){let t=[];for(let n of e)if(n.effects.length>0)for(let e of n.effects)t.push({id:`${n.id}:${e.kind}:${e.resource}:${e.timestamp}`,label:`${e.kind} ${e.resource}`,startMs:e.timestamp,endMs:e.timestamp+Math.max(1,e.duration),tier:I(e.kind),spanId:n.id,failed:n.errorCode!=null&&e===n.effects[n.effects.length-1]});else t.push({id:n.id,label:n.flow,startMs:n.startedAt,endMs:n.endedAt,tier:`none`,spanId:n.id,failed:n.errorCode!=null});return t}function U(e){let t=Math.round(e*10)/10;return Number.isInteger(t)?String(t):t.toFixed(1)}function W(e){if(e.length===0)return[];let t=Math.min(...e.map(e=>e.startedAt)),n=Math.max(...e.map(e=>e.endedAt)),r=Math.max(1,n-t);if(e.every(e=>e.effects.length===0))return e.map(e=>({start:(e.startedAt-t)/r,width:Math.max(.02,e.durationMs/r),tier:L(e.effects),failed:e.errorCode!=null}));let i=[];for(let n of e){if(n.effects.length===0){i.push({start:(n.startedAt-t)/r,width:Math.max(.02,n.durationMs/r),tier:`none`,failed:n.errorCode!=null});continue}for(let e=0;e<n.effects.length;e++){let a=n.effects[e];a&&i.push({start:(a.timestamp-t)/r,width:Math.max(.02,a.duration/r),tier:I(a.kind),failed:n.errorCode!=null&&e===n.effects.length-1})}}return i}function G(e){for(let t of e)if(t.errorCode)return t.errorCode;return null}function K(e){return R(e)?{mode:`dry-run`,reason:`This trace contains an external effect. Replay runs as a dry run with external effects stubbed.`}:{mode:`replay`}}var q=`10% + all errors`,J=6e5;function Y(e,t=Date.now()){let n=e.filter(e=>e.until>t);return n.length===0?q:`${q} · full: ${n.map(e=>e.flow).join(`, `)}`}function X(e,t,n=Date.now()){let r=n+J;return[...e.filter(e=>e.flow!==t&&e.until>n),{flow:t,until:r}]}function ne(e,t=Date.now()){return e.filter(e=>e.until>t)}var Z=d();function Q(){let e=p({from:`/traces`}),t=n({from:`/traces`}),a=s(),[l,d]=(0,v.useState)([]),[m]=(0,v.useState)(()=>_()),[y,S]=(0,v.useState)(0),[,C]=(0,v.useState)(0),w=e=>{t({search:T(e),replace:!0})},k=r({queryKey:[`console.runs.list`],queryFn:async()=>{let e=await o.runsList();if(e.error)throw Error(e.error.code);return e.data.runs},refetchInterval:5e3}),N=(0,v.useMemo)(()=>(k.data??[]).map(re),[k.data]);(0,v.useEffect)(()=>{if(N.length===0)return;if(m.visible.length===0){for(let e of N)m.offer({id:e.id,value:e,arrivedAt:e.startedAt});m.flush(),S(0),C(e=>e+1);return}let e=new Set(m.visible.map(e=>e.id));for(let t of m.pending)e.add(t.id);for(let t of N)e.has(t.id)?m.updateInPlace(t.id,t):m.offer({id:t.id,value:t,arrivedAt:Date.now()});S(m.pendingCount),C(e=>e+1)},[N,m]);let F=m.visible.map(e=>e.value),I=x(e.effect),R=(0,v.useMemo)(()=>j(F).filter(t=>{let n=g([t.root.flow,t.root.id,G(t.spans)??``],e.q),r=b(t.spans,I);return n&&r}),[F,e.q,I]),z=R.find(t=>t.rootId===e.trace)??(e.trace?j(F).find(t=>t.rootId===e.trace):void 0),B=z?M(z.spans,e.span):void 0,U=B?A(F,B):null,q=U?P(U.connected):new Set,J=U?V(H(U.connected),{expandedFolds:E(e)},q):null,Q=U?K(U.connected):null,$=i({mutationFn:async()=>{if(!U||!Q)return;let e=await o.tracesReplay({rootId:U.connected[0]?.id??U.current.id,dryRun:Q.mode===`dry-run`});if(e.error)throw Error(e.error.code);return e.data},onSuccess:()=>{a.invalidateQueries({queryKey:[`console.runs.list`]})}}),ae=ne(l);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`header`,{className:`flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`p`,{className:`text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]`,children:`Traces`}),(0,Z.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Causal chain`}),(0,Z.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[`Sampling: `,Y(ae)]})]}),(0,Z.jsxs)(`label`,{className:`flex flex-col gap-1 text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-[var(--oke-muted)]`,children:`Filter by effect`}),(0,Z.jsxs)(`select`,{"aria-label":`Filter by effect`,className:`min-h-8 border border-[var(--oke-line)] bg-transparent px-2 text-sm`,value:e.effect??``,onChange:t=>{let n=t.target.value;w(O(e,n?x(n):null))},children:[(0,Z.jsx)(`option`,{value:``,children:`All effects`}),(0,Z.jsx)(`option`,{value:`wrote:sql:bookings`,children:`Wrote sql:bookings`}),(0,Z.jsx)(`option`,{value:`sent`,children:`Sent (channel)`}),(0,Z.jsx)(`option`,{value:`asked`,children:`Asked a model`}),(0,Z.jsx)(`option`,{value:`secret`,children:`Read a secret`}),(0,Z.jsx)(`option`,{value:`cost:0.05`,children:`Cost > $0.05`})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(u,{type:`button`,variant:`ghost`,onClick:()=>{let e=z?.root.flow??R[0]?.root.flow??`bookings.create`;d(t=>X(t,e))},children:`Trace flow fully for 10 minutes`}),(0,Z.jsx)(c,{count:y,onFlush:()=>{m.flush(),S(0),C(e=>e+1)}})]})]}),(0,Z.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 md:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]`,children:[(0,Z.jsx)(`section`,{"aria-label":`Trace list`,className:`min-h-0 overflow-auto border-r border-[var(--oke-line)]`,children:k.isLoading?(0,Z.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`Loading traces…`}):R.length===0?(0,Z.jsx)(`p`,{className:`px-6 py-8 text-sm text-[var(--oke-muted)]`,children:`No traces yet. Invoke a flow or wait for traffic.`}):(0,Z.jsx)(`ul`,{className:`divide-y divide-[var(--oke-line)]`,children:R.map(t=>{let n=G(t.spans),r=W(t.spans),i=t.rootId===e.trace;return(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,"aria-pressed":i,className:f(`flex w-full min-h-10 flex-col gap-1 px-4 py-3 text-left text-sm`,i?`bg-[color-mix(in_oklab,var(--oke-fg)_6%,transparent)]`:`hover:bg-[color-mix(in_oklab,var(--oke-fg)_3%,transparent)]`),onClick:()=>{let n=M(t.spans);w(D(e,t.rootId,n))},children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:t.root.flow}),n?(0,Z.jsx)(`span`,{role:`status`,className:`font-mono text-xs text-[var(--oke-danger)]`,children:n}):(0,Z.jsxs)(`span`,{className:`font-mono text-xs text-[var(--oke-muted)]`,children:[t.root.durationMs,`ms`]})]}),(0,Z.jsx)(ie,{bars:r})]})},t.rootId)})})}),(0,Z.jsx)(`section`,{"aria-label":`Trace detail`,className:`min-h-0 overflow-auto px-6 py-6`,"aria-live":`polite`,children:!U||!J?(0,Z.jsx)(`p`,{className:`text-sm text-[var(--oke-muted)]`,children:`Select a trace to see the causal chain and folded-time waterfall.`}):(0,Z.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:U.current.flow}),(0,Z.jsxs)(`p`,{className:`text-xs text-[var(--oke-muted)]`,children:[U.connected.length,` span`,U.connected.length===1?``:`s`,` · wall `,J.wallDurationMs,`ms · display scale `,Math.round(J.displayDurationMs),`ms`]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(h,{to:`/runs`,search:{run:U.current.id},className:`inline-flex min-h-8 items-center border border-[var(--oke-line)] px-3 text-sm`,children:`Open in Runs`}),(0,Z.jsx)(u,{type:`button`,variant:Q?.mode===`dry-run`?`external`:`primary`,disabled:$.isPending,title:Q?.mode===`dry-run`?Q.reason:`Replay from the journal`,onClick:()=>$.mutate(),children:Q?.mode===`dry-run`?`Dry-run replay`:`Replay`}),(0,Z.jsx)(u,{type:`button`,variant:`ghost`,onClick:()=>w(ee(e)),children:`Close`})]})]}),Q?.mode===`dry-run`?(0,Z.jsx)(`p`,{role:`note`,className:`text-sm text-[var(--oke-external)]`,children:Q.reason}):null,(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`Causal chain`}),(0,Z.jsxs)(`ol`,{className:`flex flex-col gap-1 border-l border-[var(--oke-line)] pl-4`,children:[U.parents.map(t=>(0,Z.jsx)(`li`,{children:(0,Z.jsx)(`button`,{type:`button`,className:`min-h-8 text-sm text-[var(--oke-muted)]`,onClick:()=>w({...e,span:t.id}),children:t.flow})},t.id)),(0,Z.jsxs)(`li`,{"aria-current":`true`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:U.current.flow}),U.current.errorCode?(0,Z.jsx)(`span`,{role:`status`,className:`ml-2 font-mono text-xs text-[var(--oke-danger)]`,children:U.current.errorCode}):null,L(U.current.effects)===`external`?(0,Z.jsx)(`span`,{"aria-label":`external effect`,children:` ↗`}):null]}),U.children.map(t=>(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,className:`min-h-8 text-sm text-[var(--oke-muted)]`,onClick:()=>w({...e,span:t.id}),children:[t.flow,L(t.effects)===`external`?(0,Z.jsx)(`span`,{"aria-label":`external effect`,children:` ↗`}):null]})},t.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{id:`waterfall-heading`,className:`mb-2 text-sm font-medium`,children:`Waterfall`}),(0,Z.jsx)(`ul`,{"aria-labelledby":`waterfall-heading`,className:`flex min-h-10 list-none items-stretch gap-0.5 p-0`,children:J.segments.map(t=>t.kind===`fold`?(0,Z.jsx)(`li`,{style:{flex:`${t.displayMs} 1 0`,minWidth:24},children:(0,Z.jsx)(`button`,{type:`button`,"aria-expanded":t.expanded,className:`h-full min-h-10 w-full border border-dashed border-[var(--oke-line)] px-1 font-mono text-[10px] text-[var(--oke-muted)]`,onClick:()=>w(te(e,t.id)),children:t.label})},t.id):(0,Z.jsx)(`li`,{title:t.label,className:f(`min-h-10 px-1 text-[10px] leading-10`,t.tier===`external`?`bg-[var(--oke-external)] text-black`:`bg-[color-mix(in_oklab,var(--oke-accent)_55%,transparent)]`,t.failed&&`outline outline-2 outline-[var(--oke-danger)]`),style:{flex:`${t.displayMs} 1 0`,opacity:t.critical?1:.38,minWidth:4},children:(0,Z.jsxs)(`span`,{className:`sr-only`,children:[t.label,t.critical?` (critical path)`:``,t.failed?` (failed)`:``]})},t.id))}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-[var(--oke-muted)]`,children:`Critical path at full opacity · dead time folded into expandable bars`})]})]})})]})]})}function re(e){return{id:e.id,...e.parentId?{parentId:e.parentId}:{},flow:e.flow,...e.unit?{unit:e.unit}:{},trigger:e.trigger,startedAt:e.startedAt,endedAt:e.endedAt,durationMs:e.durationMs,errorCode:e.error,cost:e.cost??void 0,sampled:e.sampled??(e.error?`error`:`sample`),effects:e.effects??[]}}function ie({bars:e}){return(0,Z.jsx)(`div`,{"aria-hidden":`true`,className:`relative h-2 w-full overflow-hidden bg-[color-mix(in_oklab,var(--oke-fg)_6%,transparent)]`,children:e.map((e,t)=>(0,Z.jsx)(`span`,{className:f(`absolute inset-y-0`,e.tier===`external`?`bg-[var(--oke-external)]`:e.failed?`bg-[var(--oke-danger)]`:`bg-[var(--oke-accent)]`),style:{left:`${e.start*100}%`,width:`${Math.max(2,e.width*100)}%`}},t))})}var $=t({default:()=>Q});export{w as n,$ as t};
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
7
7
  <title>oke Console</title>
8
- <script type="module" crossorigin src="/assets/index-ClX0ZCe5.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-D-9KFce5.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-B0Z9INg1.js">
10
10
  <link rel="stylesheet" crossorigin href="/assets/style-C8MxEWPd.css">
11
11
  </head>
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * SLO burn rates from declared Manifest objectives + real Runs (console §9.16).
3
3
  *
4
- * Burn rate = current error rate ÷ tolerable rate. Thresholds come only from
5
- * Manifest `slo.availability` never invented here.
4
+ * Availability burn = current error rate ÷ tolerable rate.
5
+ * Latency breaches use Manifest `slo.latency.p95` / `p99` against window P95/P99.
6
6
  */
7
7
 
8
+ import { parseLatencyMs } from "../../../runs/window.ts";
8
9
  import type { Journey, Manifest, Slo } from "../../../manifest/types.ts";
9
10
  import type { RunRecord } from "../runs/types.ts";
10
11
  import type { SloBurn } from "./types.ts";
@@ -29,6 +30,7 @@ export interface DeclaredSlo {
29
30
  readonly availability: string;
30
31
  readonly tolerableErrorRate: number;
31
32
  readonly flowIds: readonly string[];
33
+ readonly latencyP95Ms: number | null;
32
34
  }
33
35
 
34
36
  /**
@@ -67,6 +69,7 @@ export function declaredSlos(manifest: Manifest | null): readonly DeclaredSlo[]
67
69
  availability,
68
70
  tolerableErrorRate: tolerable,
69
71
  flowIds: [name],
72
+ latencyP95Ms: parseLatencyMs(slo?.latency?.p95 ?? undefined),
70
73
  });
71
74
  }
72
75
 
@@ -82,6 +85,7 @@ export function declaredSlos(manifest: Manifest | null): readonly DeclaredSlo[]
82
85
  availability,
83
86
  tolerableErrorRate: tolerable,
84
87
  flowIds: journeyFlowIds(journey),
88
+ latencyP95Ms: parseLatencyMs(journey.slo?.latency?.p95 ?? undefined),
85
89
  });
86
90
  }
87
91
 
@@ -138,6 +142,10 @@ function burnForObjective(obj: DeclaredSlo, runs: readonly RunRecord[], now: num
138
142
 
139
143
  const lastBurnAt = lastBurnTimestamp(runs, obj.flowIds, obj.tolerableErrorRate, now);
140
144
  const ceremonial = lastBurnAt == null || now - lastBurnAt >= CEREMONIAL_LOOKBACK_MS;
145
+ const latencyP95Ms = shortLatencyP95(runs, obj.flowIds, now - BURN_SHORT_WINDOW_MS, now);
146
+ const latencyP95ThresholdMs = obj.latencyP95Ms;
147
+ const latencyBreached =
148
+ latencyP95ThresholdMs != null && short.total > 0 && latencyP95Ms > latencyP95ThresholdMs;
141
149
 
142
150
  return {
143
151
  id: obj.id,
@@ -153,9 +161,29 @@ function burnForObjective(obj: DeclaredSlo, runs: readonly RunRecord[], now: num
153
161
  lastBurnAt,
154
162
  sampleCount: short.total,
155
163
  errorCount: short.errors,
164
+ latencyP95Ms,
165
+ latencyP95ThresholdMs,
166
+ latencyBreached,
156
167
  };
157
168
  }
158
169
 
170
+ function shortLatencyP95(
171
+ runs: readonly RunRecord[],
172
+ flowIds: readonly string[],
173
+ from: number,
174
+ to: number,
175
+ ): number {
176
+ const set = new Set(flowIds);
177
+ const durations = runs
178
+ .filter((r) => r.startedAt >= from && r.startedAt <= to && (set.size === 0 || set.has(r.flow)))
179
+ .map((r) => r.durationMs)
180
+ .sort((a, b) => a - b);
181
+ if (durations.length === 0) return 0;
182
+ if (durations.length === 1) return durations[0]!;
183
+ const idx = Math.min(durations.length - 1, Math.max(0, Math.ceil(0.95 * durations.length) - 1));
184
+ return durations[idx]!;
185
+ }
186
+
159
187
  function windowStats(
160
188
  runs: readonly RunRecord[],
161
189
  flowIds: readonly string[],
@@ -206,7 +234,7 @@ function journeyFlowIds(journey: Journey): readonly string[] {
206
234
  return flows.map((f) => (typeof f === "string" ? f : String(f)));
207
235
  }
208
236
 
209
- /** @internal — exported for tests that assert latency SLO presence is ignored for burn. */
237
+ /** @internal — availability must be declared for Overview burn rows. */
210
238
  export function sloHasAvailability(slo: Slo | undefined): boolean {
211
239
  return typeof slo?.availability === "string" && slo.availability.length > 0;
212
240
  }
@@ -57,6 +57,12 @@ export interface SloBurn {
57
57
  readonly lastBurnAt: number | null;
58
58
  readonly sampleCount: number;
59
59
  readonly errorCount: number;
60
+ /** Observed p95 latency ms in the short window (0 when empty). */
61
+ readonly latencyP95Ms: number;
62
+ /** Declared p95 threshold ms when Manifest sets `slo.latency.p95`. */
63
+ readonly latencyP95ThresholdMs: number | null;
64
+ /** True when observed p95 exceeds the declared threshold. */
65
+ readonly latencyBreached: boolean;
60
66
  }
61
67
 
62
68
  /** Cost budget in the same visual model as the error budget. */
@@ -0,0 +1,53 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ errorPatterns,
4
+ failedRunsInWindow,
5
+ filterRunsSince,
6
+ parseSinceWindowMs,
7
+ } from "./errors.ts";
8
+ import { RUNS_CHAIN_FIXTURE } from "./fixture.ts";
9
+ import type { RunRecord } from "./types.ts";
10
+
11
+ function withTime(run: RunRecord, startedAt: number, error: string | null): RunRecord {
12
+ return {
13
+ ...run,
14
+ startedAt,
15
+ endedAt: startedAt + run.durationMs,
16
+ error,
17
+ dimensions: { ...run.dimensions, error_code: error },
18
+ };
19
+ }
20
+
21
+ describe("error patterns", () => {
22
+ test("parseSinceWindowMs accepts durations and epoch ms", () => {
23
+ expect(parseSinceWindowMs("1h")).toBe(3_600_000);
24
+ expect(parseSinceWindowMs("5m")).toBe(300_000);
25
+ expect(parseSinceWindowMs("3600000")).toBe(3_600_000);
26
+ expect(parseSinceWindowMs("nope")).toBeUndefined();
27
+ });
28
+
29
+ test("aggregates error codes in the last hour", () => {
30
+ const now = 1_000_000;
31
+ const base = RUNS_CHAIN_FIXTURE[0]!;
32
+ const runs: RunRecord[] = [
33
+ withTime(base, now - 10_000, "FlightFull"),
34
+ withTime(base, now - 20_000, "FlightFull"),
35
+ withTime(base, now - 30_000, "Timeout"),
36
+ withTime(base, now - 2 * 3_600_000, "FlightFull"), // outside window
37
+ withTime(base, now - 5_000, null),
38
+ ];
39
+ const patterns = errorPatterns(runs, now, 3_600_000);
40
+ expect(patterns.map((p) => [p.key, p.count])).toEqual([
41
+ ["FlightFull", 2],
42
+ ["Timeout", 1],
43
+ ]);
44
+ expect(failedRunsInWindow(runs, now, 3_600_000)).toHaveLength(3);
45
+ });
46
+
47
+ test("filterRunsSince keeps only recent runs", () => {
48
+ const now = 1_000_000;
49
+ const base = RUNS_CHAIN_FIXTURE[0]!;
50
+ const runs = [withTime(base, now - 100, null), withTime(base, now - 10_000, null)];
51
+ expect(filterRunsSince(runs, now - 1_000)).toHaveLength(1);
52
+ });
53
+ });