@knpkv/control-center 0.1.1 → 0.2.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 (115) hide show
  1. package/dist/client/.vite/manifest.json +127 -125
  2. package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js → ActiveWorkPage-C6QwDV1Y.js} +2 -2
  3. package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js.map → ActiveWorkPage-C6QwDV1Y.js.map} +1 -1
  4. package/dist/client/assets/{AgentPage-Bom41la2.js → AgentPage-OqwP6uRi.js} +2 -2
  5. package/dist/client/assets/{AgentPage-Bom41la2.js.map → AgentPage-OqwP6uRi.js.map} +1 -1
  6. package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js → AtlassianOAuthCallbackPage-Bm7UhU-h.js} +2 -2
  7. package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js.map → AtlassianOAuthCallbackPage-Bm7UhU-h.js.map} +1 -1
  8. package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js → AuthorizedSharePage-DblP3USU.js} +2 -2
  9. package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js.map → AuthorizedSharePage-DblP3USU.js.map} +1 -1
  10. package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js → BrowserCrypto-BGGRC6iW.js} +2 -2
  11. package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js.map → BrowserCrypto-BGGRC6iW.js.map} +1 -1
  12. package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js → BrowserSessionHydrator-39UDbHf0.js} +2 -2
  13. package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js.map → BrowserSessionHydrator-39UDbHf0.js.map} +1 -1
  14. package/dist/client/assets/{CommandSearch-D6iFcdvj.js → CommandSearch-D4Fnjsl-.js} +2 -2
  15. package/dist/client/assets/{CommandSearch-D6iFcdvj.js.map → CommandSearch-D4Fnjsl-.js.map} +1 -1
  16. package/dist/client/assets/{ItemsPage-x39U11an.js → ItemsPage-BZQiTh9b.js} +2 -2
  17. package/dist/client/assets/{ItemsPage-x39U11an.js.map → ItemsPage-BZQiTh9b.js.map} +1 -1
  18. package/dist/client/assets/{PairPage-D5vlz4OG.js → PairPage-Dvfse5ky.js} +2 -2
  19. package/dist/client/assets/{PairPage-D5vlz4OG.js.map → PairPage-Dvfse5ky.js.map} +1 -1
  20. package/dist/client/assets/{PortfolioOverview-DSUabOmm.js → PortfolioOverview-DeJcfXcw.js} +2 -2
  21. package/dist/client/assets/{PortfolioOverview-DSUabOmm.js.map → PortfolioOverview-DeJcfXcw.js.map} +1 -1
  22. package/dist/client/assets/{ReleaseRoute-DyDm5s85.js → ReleaseRoute-D9q8_sCk.js} +2 -2
  23. package/dist/client/assets/{ReleaseRoute-DyDm5s85.js.map → ReleaseRoute-D9q8_sCk.js.map} +1 -1
  24. package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js +2 -0
  25. package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js.map +1 -0
  26. package/dist/client/assets/{ServicesPage-CoMVH2Si.js → ServicesPage-Co6GJHgc.js} +2 -2
  27. package/dist/client/assets/{ServicesPage-CoMVH2Si.js.map → ServicesPage-Co6GJHgc.js.map} +1 -1
  28. package/dist/client/assets/{TimelinePage-D8Fj_351.js → TimelinePage-CM2og72M.js} +2 -2
  29. package/dist/client/assets/{TimelinePage-D8Fj_351.js.map → TimelinePage-CM2og72M.js.map} +1 -1
  30. package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js → WorkspaceEntityLink-CTw_He-8.js} +2 -2
  31. package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js.map → WorkspaceEntityLink-CTw_He-8.js.map} +1 -1
  32. package/dist/client/assets/{WorkspaceEntityRoute-BwpujSqk.css → WorkspaceEntityRoute-Bdmv6ki4.css} +1 -1
  33. package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js +30 -0
  34. package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js.map +1 -0
  35. package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js → WorkspaceReleaseLayout-Ba6keUju.js} +2 -2
  36. package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js.map → WorkspaceReleaseLayout-Ba6keUju.js.map} +1 -1
  37. package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js → authenticatedMutationClient-CJklf3iD.js} +2 -2
  38. package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js.map → authenticatedMutationClient-CJklf3iD.js.map} +1 -1
  39. package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js → authorizedShareTransport-Xg20SHJ5.js} +2 -2
  40. package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js.map → authorizedShareTransport-Xg20SHJ5.js.map} +1 -1
  41. package/dist/client/assets/{client-OmvShYdC.js → client-P7FaPwzJ.js} +2 -2
  42. package/dist/client/assets/{client-OmvShYdC.js.map → client-P7FaPwzJ.js.map} +1 -1
  43. package/dist/client/assets/{connectionTestTransport-c25QXx7A.js → connectionTestTransport-C9iPOkKM.js} +2 -2
  44. package/dist/client/assets/{connectionTestTransport-c25QXx7A.js.map → connectionTestTransport-C9iPOkKM.js.map} +1 -1
  45. package/dist/client/assets/{index-DLoOV6Hp.js → index-DpW_ckau.js} +3 -3
  46. package/dist/client/assets/{index-DLoOV6Hp.js.map → index-DpW_ckau.js.map} +1 -1
  47. package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js → patterns-DEbg7R-A-BhsMyh9D.js} +2 -2
  48. package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js.map → patterns-DEbg7R-A-BhsMyh9D.js.map} +1 -1
  49. package/dist/client/assets/{presentPortfolio-CkRqd_zz.js → presentPortfolio-D-v615bg.js} +2 -2
  50. package/dist/client/assets/{presentPortfolio-CkRqd_zz.js.map → presentPortfolio-D-v615bg.js.map} +1 -1
  51. package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js +2 -0
  52. package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js.map +1 -0
  53. package/dist/client/assets/{releaseRoutes-DSWkTh-E.js → releaseRoutes-CfaNElmG.js} +2 -2
  54. package/dist/client/assets/{releaseRoutes-DSWkTh-E.js.map → releaseRoutes-CfaNElmG.js.map} +1 -1
  55. package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js → serviceOnboarding-BZ2U_Ugw.js} +2 -2
  56. package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js.map → serviceOnboarding-BZ2U_Ugw.js.map} +1 -1
  57. package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js → useWorkspaceItems-DQTYaq1R.js} +2 -2
  58. package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js.map → useWorkspaceItems-DQTYaq1R.js.map} +1 -1
  59. package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js +2 -0
  60. package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js.map +1 -0
  61. package/dist/client/build-graph.json +32 -2
  62. package/dist/client/index.html +1 -1
  63. package/dist/server/api/deliveryGraph.d.ts +126 -0
  64. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  65. package/dist/server/api/index.js +2 -2
  66. package/dist/server/api/shares.d.ts +14 -0
  67. package/dist/server/api/shares.d.ts.map +1 -1
  68. package/dist/server/assets/{BindConfig-BjK10BEb.js → BindConfig-Dk3vjYZc.js} +7 -7
  69. package/dist/server/assets/{BindConfig-BjK10BEb.js.map → BindConfig-Dk3vjYZc.js.map} +1 -1
  70. package/dist/server/assets/{controlCenterApi-tZPvRPRH.js → controlCenterApi-Dsug4Rzi.js} +2 -2
  71. package/dist/server/assets/{controlCenterApi-tZPvRPRH.js.map → controlCenterApi-Dsug4Rzi.js.map} +1 -1
  72. package/dist/server/assets/{domainEvent-x7yeq-gU.js → domainEvent-CZLKMqgn.js} +13 -2
  73. package/dist/server/assets/{domainEvent-x7yeq-gU.js.map → domainEvent-CZLKMqgn.js.map} +1 -1
  74. package/dist/server/assets/{firstPartyServices-Y41P8uke.js → firstPartyServices-BWdrzdfD.js} +2 -2
  75. package/dist/server/assets/{firstPartyServices-Y41P8uke.js.map → firstPartyServices-BWdrzdfD.js.map} +1 -1
  76. package/dist/server/assets/{manualPluginSynchronization-C0aHB4UM.js → manualPluginSynchronization-CDnX9qXi.js} +64 -23
  77. package/dist/server/assets/manualPluginSynchronization-CDnX9qXi.js.map +1 -0
  78. package/dist/server/assets/{portfolioInvalidation-Ds9Xm4_P.js → portfolioInvalidation-iTUo5N4r.js} +26 -6
  79. package/dist/server/assets/portfolioInvalidation-iTUo5N4r.js.map +1 -0
  80. package/dist/server/assets/{readiness-CzU3vjYQ.js → readiness-CZBkcjLP.js} +2 -2
  81. package/dist/server/assets/{readiness-CzU3vjYQ.js.map → readiness-CZBkcjLP.js.map} +1 -1
  82. package/dist/server/build-graph.json +1 -0
  83. package/dist/server/domain/deliveryGraph.d.ts +14 -0
  84. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  85. package/dist/server/domain/index.js +3 -3
  86. package/dist/server/index.js +4 -4
  87. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts +1 -1
  88. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  89. package/dist/server/server/cli.js +4 -4
  90. package/dist/server/server/index.js +3 -3
  91. package/dist/server/server/persistence/Persistence.d.ts +35 -0
  92. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  93. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +56 -0
  94. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  95. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +7 -0
  96. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  97. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +35 -0
  98. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  99. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +7 -0
  100. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  101. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +14 -0
  102. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  103. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +35 -0
  104. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  105. package/package.json +3 -3
  106. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js +0 -2
  107. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js.map +0 -1
  108. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js +0 -30
  109. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js.map +0 -1
  110. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js +0 -2
  111. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js.map +0 -1
  112. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js +0 -2
  113. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js.map +0 -1
  114. package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js.map +0 -1
  115. package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{a as r,h as i,i as a,n as o,r as s,t as c,w as l}from"./Dialog-DwSIPb-B-DVn37afM.js";import{a as u,c as d,i as f,o as p,s as m}from"./index-DLoOV6Hp.js";import{a as h,v as g}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{J as _,K as v,M as y,Q as b,d as x,dt as S,i as C,pt as w,st as T,t as E,zt as D}from"./client-OmvShYdC.js";import{t as O}from"./WorkspaceEntityLink-BRifdJHn.js";var k=e(t(),1),A={body:`_body_vqgmt_1`,loading:`_loading_vqgmt_2`,content:`_content_vqgmt_3`,identity:`_identity_vqgmt_4`,identityMeta:`_identityMeta_vqgmt_5`,section:`_section_vqgmt_6`,ledger:`_ledger_vqgmt_7`,footerLink:`_footerLink_vqgmt_70`},j=D(`UnauthorizedApiError`),M={load:(e,t)=>w(T(function*(){return yield*(yield*E()).timeline.detail({params:{eventKey:e}})}).pipe(S(C)),{signal:t})},N=(e,t,n,r=M)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null||t===null){s({_tag:`idle`});return}let i=new AbortController;return s({_tag:`loading`,eventKey:e,sessionKey:t}),r.load(e,i.signal).then(n=>{i.signal.aborted||s({_tag:`ready`,detail:n,eventKey:e,sessionKey:t})},r=>{i.signal.aborted||(j(r)&&n(t),s({_tag:`failed`,eventKey:e,sessionKey:t}))}),()=>i.abort()},[e,n,i,t,r]);let c=e===null||t===null?{_tag:`idle`}:o._tag===`idle`||o.eventKey!==e||o.sessionKey!==t?{_tag:`loading`,eventKey:e,sessionKey:t}:o;return{retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:c}},P=n(),F={action:`Governed action`,"plugin-sync":`Service sync`,relationship:`Delivery link`,system:`Control Center`},I=e=>_(e.occurredAt,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,second:`2-digit`,year:`numeric`}),L=e=>{let t=[{label:`Actor`,value:e.identifiers.actorId},{label:`Agent job`,value:e.agentJob?.jobId??null},{label:`Action`,value:e.identifiers.actionId},{label:`Relationship`,value:e.identifiers.relationshipId},{label:`Connection`,value:e.identifiers.pluginConnectionId},{label:`Release`,value:e.identifiers.releaseId},{label:`Entity`,value:e.identifiers.entityId}];return[{label:`Event`,value:e.event.eventKey},{label:`Type`,value:e.event.eventType},...t.filter(e=>e.value!==null)]},R=({agentHref:e,event:t,onClose:n,onSessionExpired:l,sessionKey:u,transport:d})=>{let p=N(t?.eventKey??null,u,l,d);return(0,P.jsx)(a.Root,{onOpenChange:e=>{e||n()},open:t!==null,children:(0,P.jsxs)(a.Content,{closeLabel:`Close event details`,description:`Durable provenance for this exact workspace event.`,title:`Event details`,children:[(0,P.jsx)(a.Body,{className:A.body,children:t===null||p.state._tag===`idle`||p.state._tag===`loading`?(0,P.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading event details`,className:A.loading,children:[(0,P.jsx)(r,{height:`10rem`}),(0,P.jsx)(r,{height:`14rem`})]}):p.state._tag===`failed`?(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:p.retry,children:`Try again`}),description:`The Timeline row remains unchanged. Its provenance could not be loaded.`,title:`Event details unavailable`,tone:`caution`}):(0,P.jsxs)(`div`,{className:A.content,children:[(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-detail-title`,className:A.identity,children:[(0,P.jsx)(f,{tone:`secondary`,variant:`label`,children:F[p.state.detail.event.sourceKind]}),(0,P.jsx)(f,{as:`h2`,id:`timeline-detail-title`,variant:`page-title`,children:p.state.detail.event.title}),(0,P.jsxs)(`div`,{className:A.identityMeta,children:[(0,P.jsx)(s,{label:p.state.detail.event.actor.kind,size:`compact`,tone:p.state.detail.event.actor.kind===`agent`?`progress`:`neutral`}),p.state.detail.event.service===null?null:(0,P.jsx)(g,{service:p.state.detail.event.service,size:`compact`}),(0,P.jsx)(f,{tone:`secondary`,variant:`meta`,children:p.state.detail.event.actor.label}),(0,P.jsxs)(f,{as:`time`,dateTime:v(p.state.detail.event.occurredAt),tone:`secondary`,variant:`meta`,children:[I(p.state.detail.event),` UTC`]})]})]}),(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-provenance-title`,className:A.section,children:[(0,P.jsx)(f,{as:`h3`,id:`timeline-provenance-title`,variant:`section-title`,children:`Provenance`}),(0,P.jsx)(`dl`,{className:A.ledger,children:L(p.state.detail).map(({label:e,value:t})=>(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:e}),(0,P.jsx)(`dd`,{children:t})]},e))})]})]})}),(0,P.jsx)(a.Footer,{children:(0,P.jsx)(i,{className:A.footerLink,to:e,children:`Ask Relay about this event`})})]})})},z={page:`_page_18su2_1`,hero:`_hero_18su2_2`,intro:`_intro_18su2_22`,askRelay:`_askRelay_18su2_26`,summary:`_summary_18su2_40`,filters:`_filters_18su2_89`,events:`_events_18su2_115`,rowActor:`_rowActor_18su2_122`},B=(e,t)=>y(x)(`${e}T${t?`23:59:59.999`:`00:00:00.000`}Z`),V={load:(e,t,n)=>w(T(function*(){return yield*(yield*E()).timeline.page({query:{...t.actorKind===`all`?{}:{actor:t.actorKind},...n===null?{}:{beforeEventKey:n.eventKey,beforeOccurredAt:n.occurredAt},...t.from.length===0?{}:{from:B(t.from,!1)},limit:50,...t.to.length===0?{}:{to:B(t.to,!0)}}})}).pipe(S(C)),{signal:e})},H=D(`UnauthorizedApiError`),U=(e,t,n,r=V)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`}),c=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(c.current?.abort(),t===null){s({_tag:`idle`});return}let i=new AbortController;return c.current=i,s({_tag:`loading`}),r.load(i.signal,e,null).then(e=>{i.signal.aborted||s({_tag:`ready`,events:e.events,isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({_tag:`failed`}))}),()=>i.abort()},[`${e.actorKind}|${e.from}|${e.to}`,e,n,i,t,r]),{loadMore:(0,k.useCallback)(()=>{if(t===null||o._tag!==`ready`||o.nextCursor===null||o.isLoadingMore)return;c.current?.abort();let i=new AbortController;c.current=i;let a=o;s({...a,isLoadingMore:!0}),r.load(i.signal,e,a.nextCursor).then(e=>{i.signal.aborted||s({_tag:`ready`,events:[...a.events,...e.events],isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({...a,isLoadingMore:!1}))})},[e,n,t,o,r]),retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:o}},W=e=>new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}).format(b(e)),G=[{label:`Everyone`,value:`all`},{label:`People`,value:`human`},{label:`Agents`,value:`agent`},{label:`Services`,value:`plugin`},{label:`System`,value:`system`}],K=[`action`,`relationship`,`plugin-sync`,`system`],q=e=>G.find(t=>t.value===e)?.value??`all`,J={action:{label:`Governed action`},"plugin-sync":{label:`Service sync`},relationship:{label:`Delivery link`},system:{label:`Control Center`}},Y=({actor:e,continued:t,event:n})=>(0,P.jsx)(h,{continued:t,event:{actor:e??n.actor.label,actorKind:n.actor.kind,dateTime:v(n.occurredAt),detail:J[n.sourceKind].label,...n.href===null?{}:{href:n.href},id:n.eventKey,...n.service===null?{}:{service:n.service},time:W(n.occurredAt),title:n.title}}),X=e=>{switch(e._tag){case`authenticated`:return e.session.permission===`workspace-owner`;case`storage-unavailable`:return e.session?.permission===`workspace-owner`;case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return!1}},Z=(e,t,n,r)=>{let i=new URLSearchParams(t);return i.set(`event`,r),u(e,`?${i.toString()}`,n)},Q=({events:e})=>{let t=(0,k.useMemo)(()=>new Map([[`action`,e.filter(({sourceKind:e})=>e===`action`).length],[`relationship`,e.filter(({sourceKind:e})=>e===`relationship`).length],[`plugin-sync`,e.filter(({sourceKind:e})=>e===`plugin-sync`).length],[`system`,e.filter(({sourceKind:e})=>e===`system`).length]]),[e]);return(0,P.jsx)(`dl`,{className:z.summary,children:K.map(e=>(0,P.jsxs)(`div`,{"data-source":e,children:[(0,P.jsx)(`dt`,{children:J[e].label}),(0,P.jsx)(`dd`,{children:t.get(e)??0})]},e))})},$=({detailTransport:e,transport:t=V}={})=>{let n=l(),r=m(),a=p(r.state),[s,h]=(0,k.useState)({actorKind:`all`,from:``,to:``}),[g,_]=(0,k.useState)(null),v=U(s,a,r.invalidateSession,t),y=u(n.pathname,n.search,n.hash),b=X(r.state);if(v.state._tag===`idle`||v.state._tag===`loading`)return(0,P.jsx)(o,{description:`Combining durable activity across your connected services.`,title:`Loading Timeline`});if(v.state._tag===`failed`)return(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:v.retry,children:`Try again`}),description:`The Timeline could not be read.`,title:`Timeline unavailable`});let x=v.state;return(0,P.jsxs)(`article`,{className:z.page,children:[(0,P.jsxs)(`header`,{className:z.hero,children:[(0,P.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Timeline`}),(0,P.jsxs)(f,{as:`h1`,variant:`verdict`,children:[`Everything`,(0,P.jsx)(`br`,{}),`that moved.`]}),(0,P.jsx)(f,{className:z.intro,tone:`secondary`,variant:`body-large`,children:`One chronological truth across people, agents, code, delivery links, and connected services.`}),(0,P.jsx)(i,{className:z.askRelay,to:y,children:`Ask Relay about this Timeline`})]}),(0,P.jsx)(Q,{events:x.events}),(0,P.jsxs)(`section`,{"aria-label":`Timeline filters`,className:z.filters,children:[(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`Actor`}),(0,P.jsx)(`select`,{value:s.actorKind,onChange:e=>h({...s,actorKind:q(e.currentTarget.value)}),children:G.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`From`}),(0,P.jsx)(`input`,{type:`date`,value:s.from,onChange:e=>h({...s,from:e.currentTarget.value})})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`To`}),(0,P.jsx)(`input`,{type:`date`,value:s.to,onChange:e=>h({...s,to:e.currentTarget.value})})]})]}),x.events.length===0?(0,P.jsx)(o,{description:`Try a wider date range or another actor.`,title:`No activity in this view`}):(0,P.jsx)(d,{component:O,children:(0,P.jsx)(`ol`,{className:z.events,children:x.events.map((e,t)=>(0,P.jsx)(Y,{actor:b?(0,P.jsxs)(`span`,{className:z.rowActor,children:[(0,P.jsx)(`span`,{children:e.actor.label}),(0,P.jsx)(c,{onClick:()=>_(e),size:`compact`,variant:`quiet`,children:`Inspect`})]}):void 0,continued:t<x.events.length-1,event:e},e.eventKey))})}),x.nextCursor===null?null:(0,P.jsx)(c,{disabled:x.isLoadingMore,onClick:v.loadMore,size:`principal`,stretch:!0,children:x.isLoadingMore?`Loading…`:`Show earlier activity`}),(0,P.jsx)(R,{agentHref:g===null?y:Z(n.pathname,n.search,n.hash,g.eventKey),event:g,onClose:()=>_(null),onSessionExpired:r.invalidateSession,sessionKey:a,...e===void 0?{}:{transport:e}})]})};export{$ as TimelinePage,X as canInspectTimelineDetails,Z as timelineEventAgentPath};
2
- //# sourceMappingURL=TimelinePage-D8Fj_351.js.map
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{a as r,h as i,i as a,n as o,r as s,t as c,w as l}from"./Dialog-DwSIPb-B-DVn37afM.js";import{a as u,c as d,i as f,o as p,s as m}from"./index-DpW_ckau.js";import{a as h,v as g}from"./patterns-DEbg7R-A-BhsMyh9D.js";import{J as _,K as v,M as y,Q as b,d as x,dt as S,i as C,pt as w,st as T,t as E,zt as D}from"./client-P7FaPwzJ.js";import{t as O}from"./WorkspaceEntityLink-CTw_He-8.js";var k=e(t(),1),A={body:`_body_vqgmt_1`,loading:`_loading_vqgmt_2`,content:`_content_vqgmt_3`,identity:`_identity_vqgmt_4`,identityMeta:`_identityMeta_vqgmt_5`,section:`_section_vqgmt_6`,ledger:`_ledger_vqgmt_7`,footerLink:`_footerLink_vqgmt_70`},j=D(`UnauthorizedApiError`),M={load:(e,t)=>w(T(function*(){return yield*(yield*E()).timeline.detail({params:{eventKey:e}})}).pipe(S(C)),{signal:t})},N=(e,t,n,r=M)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`});(0,k.useEffect)(()=>{if(e===null||t===null){s({_tag:`idle`});return}let i=new AbortController;return s({_tag:`loading`,eventKey:e,sessionKey:t}),r.load(e,i.signal).then(n=>{i.signal.aborted||s({_tag:`ready`,detail:n,eventKey:e,sessionKey:t})},r=>{i.signal.aborted||(j(r)&&n(t),s({_tag:`failed`,eventKey:e,sessionKey:t}))}),()=>i.abort()},[e,n,i,t,r]);let c=e===null||t===null?{_tag:`idle`}:o._tag===`idle`||o.eventKey!==e||o.sessionKey!==t?{_tag:`loading`,eventKey:e,sessionKey:t}:o;return{retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:c}},P=n(),F={action:`Governed action`,"plugin-sync":`Service sync`,relationship:`Delivery link`,system:`Control Center`},I=e=>_(e.occurredAt,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,second:`2-digit`,year:`numeric`}),L=e=>{let t=[{label:`Actor`,value:e.identifiers.actorId},{label:`Agent job`,value:e.agentJob?.jobId??null},{label:`Action`,value:e.identifiers.actionId},{label:`Relationship`,value:e.identifiers.relationshipId},{label:`Connection`,value:e.identifiers.pluginConnectionId},{label:`Release`,value:e.identifiers.releaseId},{label:`Entity`,value:e.identifiers.entityId}];return[{label:`Event`,value:e.event.eventKey},{label:`Type`,value:e.event.eventType},...t.filter(e=>e.value!==null)]},R=({agentHref:e,event:t,onClose:n,onSessionExpired:l,sessionKey:u,transport:d})=>{let p=N(t?.eventKey??null,u,l,d);return(0,P.jsx)(a.Root,{onOpenChange:e=>{e||n()},open:t!==null,children:(0,P.jsxs)(a.Content,{closeLabel:`Close event details`,description:`Durable provenance for this exact workspace event.`,title:`Event details`,children:[(0,P.jsx)(a.Body,{className:A.body,children:t===null||p.state._tag===`idle`||p.state._tag===`loading`?(0,P.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading event details`,className:A.loading,children:[(0,P.jsx)(r,{height:`10rem`}),(0,P.jsx)(r,{height:`14rem`})]}):p.state._tag===`failed`?(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:p.retry,children:`Try again`}),description:`The Timeline row remains unchanged. Its provenance could not be loaded.`,title:`Event details unavailable`,tone:`caution`}):(0,P.jsxs)(`div`,{className:A.content,children:[(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-detail-title`,className:A.identity,children:[(0,P.jsx)(f,{tone:`secondary`,variant:`label`,children:F[p.state.detail.event.sourceKind]}),(0,P.jsx)(f,{as:`h2`,id:`timeline-detail-title`,variant:`page-title`,children:p.state.detail.event.title}),(0,P.jsxs)(`div`,{className:A.identityMeta,children:[(0,P.jsx)(s,{label:p.state.detail.event.actor.kind,size:`compact`,tone:p.state.detail.event.actor.kind===`agent`?`progress`:`neutral`}),p.state.detail.event.service===null?null:(0,P.jsx)(g,{service:p.state.detail.event.service,size:`compact`}),(0,P.jsx)(f,{tone:`secondary`,variant:`meta`,children:p.state.detail.event.actor.label}),(0,P.jsxs)(f,{as:`time`,dateTime:v(p.state.detail.event.occurredAt),tone:`secondary`,variant:`meta`,children:[I(p.state.detail.event),` UTC`]})]})]}),(0,P.jsxs)(`section`,{"aria-labelledby":`timeline-provenance-title`,className:A.section,children:[(0,P.jsx)(f,{as:`h3`,id:`timeline-provenance-title`,variant:`section-title`,children:`Provenance`}),(0,P.jsx)(`dl`,{className:A.ledger,children:L(p.state.detail).map(({label:e,value:t})=>(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`dt`,{children:e}),(0,P.jsx)(`dd`,{children:t})]},e))})]})]})}),(0,P.jsx)(a.Footer,{children:(0,P.jsx)(i,{className:A.footerLink,to:e,children:`Ask Relay about this event`})})]})})},z={page:`_page_18su2_1`,hero:`_hero_18su2_2`,intro:`_intro_18su2_22`,askRelay:`_askRelay_18su2_26`,summary:`_summary_18su2_40`,filters:`_filters_18su2_89`,events:`_events_18su2_115`,rowActor:`_rowActor_18su2_122`},B=(e,t)=>y(x)(`${e}T${t?`23:59:59.999`:`00:00:00.000`}Z`),V={load:(e,t,n)=>w(T(function*(){return yield*(yield*E()).timeline.page({query:{...t.actorKind===`all`?{}:{actor:t.actorKind},...n===null?{}:{beforeEventKey:n.eventKey,beforeOccurredAt:n.occurredAt},...t.from.length===0?{}:{from:B(t.from,!1)},limit:50,...t.to.length===0?{}:{to:B(t.to,!0)}}})}).pipe(S(C)),{signal:e})},H=D(`UnauthorizedApiError`),U=(e,t,n,r=V)=>{let[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)({_tag:`idle`}),c=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(c.current?.abort(),t===null){s({_tag:`idle`});return}let i=new AbortController;return c.current=i,s({_tag:`loading`}),r.load(i.signal,e,null).then(e=>{i.signal.aborted||s({_tag:`ready`,events:e.events,isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({_tag:`failed`}))}),()=>i.abort()},[`${e.actorKind}|${e.from}|${e.to}`,e,n,i,t,r]),{loadMore:(0,k.useCallback)(()=>{if(t===null||o._tag!==`ready`||o.nextCursor===null||o.isLoadingMore)return;c.current?.abort();let i=new AbortController;c.current=i;let a=o;s({...a,isLoadingMore:!0}),r.load(i.signal,e,a.nextCursor).then(e=>{i.signal.aborted||s({_tag:`ready`,events:[...a.events,...e.events],isLoadingMore:!1,nextCursor:e.nextCursor})},e=>{i.signal.aborted||(H(e)&&n(t),s({...a,isLoadingMore:!1}))})},[e,n,t,o,r]),retry:(0,k.useCallback)(()=>a(e=>e+1),[]),state:o}},W=e=>new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}).format(b(e)),G=[{label:`Everyone`,value:`all`},{label:`People`,value:`human`},{label:`Agents`,value:`agent`},{label:`Services`,value:`plugin`},{label:`System`,value:`system`}],K=[`action`,`relationship`,`plugin-sync`,`system`],q=e=>G.find(t=>t.value===e)?.value??`all`,J={action:{label:`Governed action`},"plugin-sync":{label:`Service sync`},relationship:{label:`Delivery link`},system:{label:`Control Center`}},Y=({actor:e,continued:t,event:n})=>(0,P.jsx)(h,{continued:t,event:{actor:e??n.actor.label,actorKind:n.actor.kind,dateTime:v(n.occurredAt),detail:J[n.sourceKind].label,...n.href===null?{}:{href:n.href},id:n.eventKey,...n.service===null?{}:{service:n.service},time:W(n.occurredAt),title:n.title}}),X=e=>{switch(e._tag){case`authenticated`:return e.session.permission===`workspace-owner`;case`storage-unavailable`:return e.session?.permission===`workspace-owner`;case`anonymous`:case`blocked`:case`checking`:case`unavailable`:return!1}},Z=(e,t,n,r)=>{let i=new URLSearchParams(t);return i.set(`event`,r),u(e,`?${i.toString()}`,n)},Q=({events:e})=>{let t=(0,k.useMemo)(()=>new Map([[`action`,e.filter(({sourceKind:e})=>e===`action`).length],[`relationship`,e.filter(({sourceKind:e})=>e===`relationship`).length],[`plugin-sync`,e.filter(({sourceKind:e})=>e===`plugin-sync`).length],[`system`,e.filter(({sourceKind:e})=>e===`system`).length]]),[e]);return(0,P.jsx)(`dl`,{className:z.summary,children:K.map(e=>(0,P.jsxs)(`div`,{"data-source":e,children:[(0,P.jsx)(`dt`,{children:J[e].label}),(0,P.jsx)(`dd`,{children:t.get(e)??0})]},e))})},$=({detailTransport:e,transport:t=V}={})=>{let n=l(),r=m(),a=p(r.state),[s,h]=(0,k.useState)({actorKind:`all`,from:``,to:``}),[g,_]=(0,k.useState)(null),v=U(s,a,r.invalidateSession,t),y=u(n.pathname,n.search,n.hash),b=X(r.state);if(v.state._tag===`idle`||v.state._tag===`loading`)return(0,P.jsx)(o,{description:`Combining durable activity across your connected services.`,title:`Loading Timeline`});if(v.state._tag===`failed`)return(0,P.jsx)(o,{action:(0,P.jsx)(c,{onClick:v.retry,children:`Try again`}),description:`The Timeline could not be read.`,title:`Timeline unavailable`});let x=v.state;return(0,P.jsxs)(`article`,{className:z.page,children:[(0,P.jsxs)(`header`,{className:z.hero,children:[(0,P.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Timeline`}),(0,P.jsxs)(f,{as:`h1`,variant:`verdict`,children:[`Everything`,(0,P.jsx)(`br`,{}),`that moved.`]}),(0,P.jsx)(f,{className:z.intro,tone:`secondary`,variant:`body-large`,children:`One chronological truth across people, agents, code, delivery links, and connected services.`}),(0,P.jsx)(i,{className:z.askRelay,to:y,children:`Ask Relay about this Timeline`})]}),(0,P.jsx)(Q,{events:x.events}),(0,P.jsxs)(`section`,{"aria-label":`Timeline filters`,className:z.filters,children:[(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`Actor`}),(0,P.jsx)(`select`,{value:s.actorKind,onChange:e=>h({...s,actorKind:q(e.currentTarget.value)}),children:G.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`From`}),(0,P.jsx)(`input`,{type:`date`,value:s.from,onChange:e=>h({...s,from:e.currentTarget.value})})]}),(0,P.jsxs)(`label`,{children:[(0,P.jsx)(`span`,{children:`To`}),(0,P.jsx)(`input`,{type:`date`,value:s.to,onChange:e=>h({...s,to:e.currentTarget.value})})]})]}),x.events.length===0?(0,P.jsx)(o,{description:`Try a wider date range or another actor.`,title:`No activity in this view`}):(0,P.jsx)(d,{component:O,children:(0,P.jsx)(`ol`,{className:z.events,children:x.events.map((e,t)=>(0,P.jsx)(Y,{actor:b?(0,P.jsxs)(`span`,{className:z.rowActor,children:[(0,P.jsx)(`span`,{children:e.actor.label}),(0,P.jsx)(c,{onClick:()=>_(e),size:`compact`,variant:`quiet`,children:`Inspect`})]}):void 0,continued:t<x.events.length-1,event:e},e.eventKey))})}),x.nextCursor===null?null:(0,P.jsx)(c,{disabled:x.isLoadingMore,onClick:v.loadMore,size:`principal`,stretch:!0,children:x.isLoadingMore?`Loading…`:`Show earlier activity`}),(0,P.jsx)(R,{agentHref:g===null?y:Z(n.pathname,n.search,n.hash,g.eventKey),event:g,onClose:()=>_(null),onSessionExpired:r.invalidateSession,sessionKey:a,...e===void 0?{}:{transport:e}})]})};export{$ as TimelinePage,X as canInspectTimelineDetails,Z as timelineEventAgentPath};
2
+ //# sourceMappingURL=TimelinePage-CM2og72M.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimelinePage-D8Fj_351.js","names":[],"sources":["../../../src/client/timeline/TimelineDetailSheet.module.css","../../../src/client/timeline/useTimelineDetail.ts","../../../src/client/timeline/TimelineDetailSheet.tsx","../../../src/client/timeline/TimelinePage.module.css","../../../src/client/timeline/useTimeline.ts","../../../src/client/timeline/TimelinePage.tsx"],"sourcesContent":[".body,\n.loading,\n.content,\n.identity,\n.identityMeta,\n.section,\n.ledger {\n display: grid;\n}\n\n.body,\n.loading,\n.content {\n gap: var(--rly-space-20);\n}\n\n.identity,\n.section {\n gap: var(--rly-space-12);\n}\n\n.identity {\n padding-block: var(--rly-space-12) var(--rly-space-20);\n border-block-end: 1px solid var(--rly-color-border-1);\n}\n\n.identity h2,\n.identity p,\n.section h3,\n.ledger dd {\n margin: 0;\n}\n\n.identity h2 {\n max-inline-size: 13ch;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.identityMeta {\n grid-template-columns: repeat(2, minmax(0, max-content));\n align-items: center;\n gap: var(--rly-space-8) var(--rly-space-12);\n}\n\n.ledger {\n margin: 0;\n}\n\n.ledger div {\n display: grid;\n grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1fr);\n gap: var(--rly-space-12);\n padding-block: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.ledger dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.ledger dd {\n overflow-wrap: anywhere;\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.footerLink {\n min-block-size: 3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-16);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-align: center;\n text-decoration: none;\n}\n\n.footerLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 30rem) {\n .identityMeta,\n .ledger div {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineEvent, TimelineEventDetail } from \"../../domain/timeline.js\"\n\n/** Browser boundary for one exact owner-only Timeline event expansion. */\nexport interface TimelineDetailTransport {\n readonly load: (eventKey: TimelineEvent[\"eventKey\"], signal: AbortSignal) => Promise<TimelineEventDetail>\n}\n\nexport type TimelineDetailState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly detail: TimelineEventDetail\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for an owner-authorized event detail read. */\nexport const browserTimelineDetailTransport: TimelineDetailTransport = {\n load: (eventKey, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.detail({ params: { eventKey } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep a detail result bound to the exact event and authenticated session that requested it. */\nexport const useTimelineDetail = (\n eventKey: TimelineEvent[\"eventKey\"] | null,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineDetailTransport = browserTimelineDetailTransport\n): { readonly retry: () => void; readonly state: TimelineDetailState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineDetailState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (eventKey === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", eventKey, sessionKey })\n transport.load(eventKey, abort.signal).then(\n (detail) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", detail, eventKey, sessionKey })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", eventKey, sessionKey })\n }\n )\n return () => abort.abort()\n }, [eventKey, onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: TimelineDetailState = eventKey === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.eventKey !== eventKey || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", eventKey, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { TimelineEvent, TimelineEventDetail, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport styles from \"./TimelineDetailSheet.module.css\"\nimport { type TimelineDetailTransport, useTimelineDetail } from \"./useTimelineDetail.js\"\n\nconst sourceLabels: Readonly<Record<TimelineSourceKind, string>> = {\n action: \"Governed action\",\n \"plugin-sync\": \"Service sync\",\n relationship: \"Delivery link\",\n system: \"Control Center\"\n}\n\nconst formatTimestamp = (event: TimelineEvent): string =>\n DateTime.formatUtc(event.occurredAt, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n second: \"2-digit\",\n year: \"numeric\"\n })\n\n/** Non-secret durable references that make one owner-visible event attributable. */\nexport const timelineDetailLedger = (\n detail: TimelineEventDetail\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n const optionalEntries: ReadonlyArray<{ readonly label: string; readonly value: string | null }> = [\n { label: \"Actor\", value: detail.identifiers.actorId },\n { label: \"Agent job\", value: detail.agentJob?.jobId ?? null },\n { label: \"Action\", value: detail.identifiers.actionId },\n { label: \"Relationship\", value: detail.identifiers.relationshipId },\n { label: \"Connection\", value: detail.identifiers.pluginConnectionId },\n { label: \"Release\", value: detail.identifiers.releaseId },\n { label: \"Entity\", value: detail.identifiers.entityId }\n ]\n return [\n { label: \"Event\", value: detail.event.eventKey },\n { label: \"Type\", value: detail.event.eventType },\n ...optionalEntries.filter(\n (entry): entry is { readonly label: string; readonly value: string } => entry.value !== null\n )\n ]\n}\n\n/** Owner-only expansion of one redacted Timeline row into its durable provenance. */\nexport const TimelineDetailSheet = ({\n agentHref,\n event,\n onClose,\n onSessionExpired,\n sessionKey,\n transport\n}: {\n readonly agentHref: string\n readonly event: TimelineEvent | null\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string | null\n readonly transport?: TimelineDetailTransport\n}): ReactElement => {\n const controller = useTimelineDetail(event?.eventKey ?? null, sessionKey, onSessionExpired, transport)\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={event !== null}\n >\n <Sheet.Content\n closeLabel=\"Close event details\"\n description=\"Durable provenance for this exact workspace event.\"\n title=\"Event details\"\n >\n <Sheet.Body className={styles.body}>\n {event === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading event details\" className={styles.loading}>\n <Skeleton height=\"10rem\" />\n <Skeleton height=\"14rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline row remains unchanged. Its provenance could not be loaded.\"\n title=\"Event details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"timeline-detail-title\" className={styles.identity}>\n <Text tone=\"secondary\" variant=\"label\">\n {sourceLabels[controller.state.detail.event.sourceKind]}\n </Text>\n <Text as=\"h2\" id=\"timeline-detail-title\" variant=\"page-title\">\n {controller.state.detail.event.title}\n </Text>\n <div className={styles.identityMeta}>\n <StateLabel\n label={controller.state.detail.event.actor.kind}\n size=\"compact\"\n tone={controller.state.detail.event.actor.kind === \"agent\" ? \"progress\" : \"neutral\"}\n />\n {controller.state.detail.event.service === null ? null : (\n <ServiceMark service={controller.state.detail.event.service} size=\"compact\" />\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n {controller.state.detail.event.actor.label}\n </Text>\n <Text\n as=\"time\"\n dateTime={DateTime.formatIso(controller.state.detail.event.occurredAt)}\n tone=\"secondary\"\n variant=\"meta\"\n >\n {formatTimestamp(controller.state.detail.event)} UTC\n </Text>\n </div>\n </section>\n\n <section aria-labelledby=\"timeline-provenance-title\" className={styles.section}>\n <Text as=\"h3\" id=\"timeline-provenance-title\" variant=\"section-title\">\n Provenance\n </Text>\n <dl className={styles.ledger}>\n {timelineDetailLedger(controller.state.detail).map(({ label, value }) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n )}\n </Sheet.Body>\n <Sheet.Footer>\n <Link className={styles.footerLink} to={agentHref}>\n Ask Relay about this event\n </Link>\n </Sheet.Footer>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n",".page,\n.hero,\n.page {\n gap: clamp(2.5rem, 7vw, 6rem);\n}\n\n.hero {\n gap: var(--rly-space-16);\n}\n\n.hero p,\n.hero h1 {\n margin: 0;\n}\n\n.hero h1 {\n max-inline-size: 9ch;\n letter-spacing: -0.075em;\n text-wrap: balance;\n}\n\n.intro {\n max-inline-size: 46rem;\n}\n\n.askRelay {\n inline-size: fit-content;\n min-block-size: 3.5rem;\n display: inline-flex;\n align-items: center;\n padding-inline: var(--rly-space-20);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.summary {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin: 0;\n overflow: hidden;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n}\n\n.summary div {\n display: grid;\n gap: var(--rly-space-12);\n min-block-size: 8rem;\n padding: var(--rly-space-20);\n background: var(--rly-color-surface-1);\n}\n\n.summary div + div {\n border-inline-start: 1px solid var(--rly-color-border-1);\n}\n\n.summary dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.summary dd {\n margin: 0;\n color: var(--rly-color-text-1);\n font-size: clamp(2.5rem, 6vw, 5rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.07em;\n}\n\n.summary div[data-source=\"action\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codecommit);\n}\n.summary div[data-source=\"relationship\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codepipeline);\n}\n.summary div[data-source=\"plugin-sync\"] {\n box-shadow: inset 0 4px var(--rly-color-service-jira);\n}\n.summary div[data-source=\"system\"] {\n box-shadow: inset 0 4px var(--rly-color-focus);\n}\n\n.filters {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n gap: var(--rly-space-12);\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters select,\n.filters input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.events {\n margin: 0;\n padding: 0;\n list-style: none;\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.rowActor {\n display: grid;\n gap: var(--rly-space-8);\n justify-items: start;\n}\n\n@media (max-width: 48rem) {\n .summary {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .summary div:nth-child(3) {\n border-inline-start: 0;\n }\n .summary div:nth-child(n + 3) {\n border-block-start: 1px solid var(--rly-color-border-1);\n }\n .filters {\n grid-template-columns: 1fr;\n }\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineActorKind, TimelineCursor, TimelineEvent, TimelinePage } from \"../../domain/timeline.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\n/** User-controlled Timeline filters. */\nexport interface TimelineFilters {\n readonly actorKind: TimelineActorKind | \"all\"\n readonly from: string\n readonly to: string\n}\n\n/** Browser transport boundary for Timeline tests and authenticated reads. */\nexport interface TimelineTransport {\n readonly load: (\n signal: AbortSignal,\n filters: TimelineFilters,\n cursor: TimelineCursor | null\n ) => Promise<TimelinePage>\n}\n\nexport type TimelineState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly events: ReadonlyArray<TimelineEvent>\n readonly isLoadingMore: boolean\n readonly nextCursor: TimelineCursor | null\n }\n\nconst dateBoundary = (value: string, isEnd: boolean): TimelineCursor[\"occurredAt\"] =>\n Schema.decodeSync(UtcTimestamp)(`${value}T${isEnd ? \"23:59:59.999\" : \"00:00:00.000\"}Z`)\n\n/** Generated-client transport for the authenticated Timeline page. */\nexport const browserTimelineTransport: TimelineTransport = {\n load: (signal, filters, cursor) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.page({\n query: {\n ...(filters.actorKind === \"all\" ? {} : { actor: filters.actorKind }),\n ...(cursor === null\n ? {}\n : { beforeEventKey: cursor.eventKey, beforeOccurredAt: cursor.occurredAt }),\n ...(filters.from.length === 0 ? {} : { from: dateBoundary(filters.from, false) }),\n limit: 50,\n ...(filters.to.length === 0 ? {} : { to: dateBoundary(filters.to, true) })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load and incrementally page one exact authenticated Timeline filter set. */\nexport const useTimeline = (\n filters: TimelineFilters,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineTransport = browserTimelineTransport\n): {\n readonly loadMore: () => void\n readonly retry: () => void\n readonly state: TimelineState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineState>({ _tag: \"idle\" })\n const activeRequest = useRef<AbortController | null>(null)\n const filterKey = `${filters.actorKind}|${filters.from}|${filters.to}`\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal, filters, null).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({ _tag: \"ready\", events: page.events, isLoadingMore: false, nextCursor: page.nextCursor })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [filterKey, filters, onSessionExpired, requestRevision, sessionKey, transport])\n\n const loadMore = useCallback((): void => {\n if (sessionKey === null || state._tag !== \"ready\" || state.nextCursor === null || state.isLoadingMore) return\n activeRequest.current?.abort()\n const request = new AbortController()\n activeRequest.current = request\n const current = state\n setState({ ...current, isLoadingMore: true })\n transport.load(request.signal, filters, current.nextCursor).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n events: [...current.events, ...page.events],\n isLoadingMore: false,\n nextCursor: page.nextCursor\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ ...current, isLoadingMore: false })\n }\n )\n }, [filters, onSessionExpired, sessionKey, state, transport])\n\n return {\n loadMore,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state\n }\n}\n\n/** Compact UTC timestamp for Timeline rows. */\nexport const formatTimelineTimestamp = (timestamp: TimelineEvent[\"occurredAt\"]): string =>\n new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n }).format(DateTime.toDateUtc(timestamp))\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { TimelineRow as RlyTimelineRow } from \"@knpkv/rly/patterns\"\nimport { Button, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, type ReactNode, useMemo, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport type { TimelineActorKind, TimelineEvent, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport { browserReadableSessionKey, type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport { WorkspaceEntityLink } from \"../entities/WorkspaceEntityLink.js\"\nimport { TimelineDetailSheet } from \"./TimelineDetailSheet.js\"\nimport type { TimelineDetailTransport } from \"./useTimelineDetail.js\"\nimport styles from \"./TimelinePage.module.css\"\nimport {\n browserTimelineTransport,\n formatTimelineTimestamp,\n type TimelineFilters,\n type TimelineTransport,\n useTimeline\n} from \"./useTimeline.js\"\n\nconst actorOptions: ReadonlyArray<{ readonly label: string; readonly value: TimelineActorKind | \"all\" }> = [\n { label: \"Everyone\", value: \"all\" },\n { label: \"People\", value: \"human\" },\n { label: \"Agents\", value: \"agent\" },\n { label: \"Services\", value: \"plugin\" },\n { label: \"System\", value: \"system\" }\n]\nconst timelineSources: ReadonlyArray<TimelineSourceKind> = [\"action\", \"relationship\", \"plugin-sync\", \"system\"]\n\nconst actorFilter = (value: string): TimelineFilters[\"actorKind\"] =>\n actorOptions.find((option) => option.value === value)?.value ?? \"all\"\n\nconst sourcePresentation: Readonly<Record<TimelineSourceKind, { readonly label: string }>> = {\n action: { label: \"Governed action\" },\n \"plugin-sync\": { label: \"Service sync\" },\n relationship: { label: \"Delivery link\" },\n system: { label: \"Control Center\" }\n}\n\nconst TimelineRow = ({\n actor,\n continued,\n event\n}: {\n readonly actor?: ReactNode\n readonly continued: boolean\n readonly event: TimelineEvent\n}): ReactElement => (\n <RlyTimelineRow\n continued={continued}\n event={{\n actor: actor ?? event.actor.label,\n actorKind: event.actor.kind,\n dateTime: DateTime.formatIso(event.occurredAt),\n detail: sourcePresentation[event.sourceKind].label,\n ...(event.href === null ? {} : { href: event.href }),\n id: event.eventKey,\n ...(event.service === null ? {} : { service: event.service }),\n time: formatTimelineTimestamp(event.occurredAt),\n title: event.title\n }}\n />\n)\n\n/** Only workspace owners can deliberately expand redacted Timeline rows. */\nexport const canInspectTimelineDetails = (state: BrowserSessionState): boolean => {\n switch (state._tag) {\n case \"authenticated\":\n return state.session.permission === \"workspace-owner\"\n case \"storage-unavailable\":\n return state.session?.permission === \"workspace-owner\"\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return false\n }\n}\n\n/** Preserve one selected event alongside the current Timeline filters for Relay. */\nexport const timelineEventAgentPath = (\n pathname: string,\n search: string,\n hash: string,\n eventKey: TimelineEvent[\"eventKey\"]\n): string => {\n const context = new URLSearchParams(search)\n context.set(\"event\", eventKey)\n return contextualAgentPath(pathname, `?${context.toString()}`, hash)\n}\n\nconst SourceSummary = ({ events }: { readonly events: ReadonlyArray<TimelineEvent> }): ReactElement => {\n const totals = useMemo(\n () =>\n new Map<TimelineSourceKind, number>([\n [\"action\", events.filter(({ sourceKind }) => sourceKind === \"action\").length],\n [\"relationship\", events.filter(({ sourceKind }) => sourceKind === \"relationship\").length],\n [\"plugin-sync\", events.filter(({ sourceKind }) => sourceKind === \"plugin-sync\").length],\n [\"system\", events.filter(({ sourceKind }) => sourceKind === \"system\").length]\n ]),\n [events]\n )\n return (\n <dl className={styles.summary}>\n {timelineSources.map((source) => {\n return (\n <div data-source={source} key={source}>\n <dt>{sourcePresentation[source].label}</dt>\n <dd>{totals.get(source) ?? 0}</dd>\n </div>\n )\n })}\n </dl>\n )\n}\n\n/** Bird's-eye view of attributable human, agent, service, and system activity. */\nexport const TimelinePage = ({\n detailTransport,\n transport = browserTimelineTransport\n}: {\n readonly detailTransport?: TimelineDetailTransport\n readonly transport?: TimelineTransport\n} = {}): ReactElement => {\n const location = useLocation()\n const browserSession = useBrowserSession()\n const sessionKey = browserReadableSessionKey(browserSession.state)\n const [filters, setFilters] = useState<TimelineFilters>({ actorKind: \"all\", from: \"\", to: \"\" })\n const [selectedEvent, setSelectedEvent] = useState<TimelineEvent | null>(null)\n const controller = useTimeline(filters, sessionKey, browserSession.invalidateSession, transport)\n const agentHref = contextualAgentPath(location.pathname, location.search, location.hash)\n const canInspect = canInspectTimelineDetails(browserSession.state)\n\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <StatePanel description=\"Combining durable activity across your connected services.\" title=\"Loading Timeline\" />\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline could not be read.\"\n title=\"Timeline unavailable\"\n />\n )\n }\n const timelineState = controller.state\n\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Timeline\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Everything\n <br />\n that moved.\n </Text>\n <Text className={styles.intro} tone=\"secondary\" variant=\"body-large\">\n One chronological truth across people, agents, code, delivery links, and connected services.\n </Text>\n <Link className={styles.askRelay} to={agentHref}>\n Ask Relay about this Timeline\n </Link>\n </header>\n\n <SourceSummary events={timelineState.events} />\n\n <section aria-label=\"Timeline filters\" className={styles.filters}>\n <label>\n <span>Actor</span>\n <select\n value={filters.actorKind}\n onChange={(event) => setFilters({ ...filters, actorKind: actorFilter(event.currentTarget.value) })}\n >\n {actorOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>From</span>\n <input\n type=\"date\"\n value={filters.from}\n onChange={(event) => setFilters({ ...filters, from: event.currentTarget.value })}\n />\n </label>\n <label>\n <span>To</span>\n <input\n type=\"date\"\n value={filters.to}\n onChange={(event) => setFilters({ ...filters, to: event.currentTarget.value })}\n />\n </label>\n </section>\n\n {timelineState.events.length === 0 ? (\n <StatePanel description=\"Try a wider date range or another actor.\" title=\"No activity in this view\" />\n ) : (\n <LinkProvider component={WorkspaceEntityLink}>\n <ol className={styles.events}>\n {timelineState.events.map((event, index) => (\n <TimelineRow\n actor={\n canInspect ? (\n <span className={styles.rowActor}>\n <span>{event.actor.label}</span>\n <Button onClick={() => setSelectedEvent(event)} size=\"compact\" variant=\"quiet\">\n Inspect\n </Button>\n </span>\n ) : undefined\n }\n continued={index < timelineState.events.length - 1}\n event={event}\n key={event.eventKey}\n />\n ))}\n </ol>\n </LinkProvider>\n )}\n {timelineState.nextCursor === null ? null : (\n <Button disabled={timelineState.isLoadingMore} onClick={controller.loadMore} size=\"principal\" stretch>\n {timelineState.isLoadingMore ? \"Loading…\" : \"Show earlier activity\"}\n </Button>\n )}\n <TimelineDetailSheet\n agentHref={\n selectedEvent === null\n ? agentHref\n : timelineEventAgentPath(location.pathname, location.search, location.hash, selectedEvent.eventKey)\n }\n event={selectedEvent}\n onClose={() => setSelectedEvent(null)}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(detailTransport === undefined ? {} : { transport: detailTransport })}\n />\n </article>\n )\n}\n"],"mappings":"srBCgCM,EAAwB,EAAmB,sBAAsB,EAG1D,EAA0D,CACrE,MAAO,EAAU,IACf,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,SAAS,OAAO,CAAE,OAAQ,CAAE,UAAS,CAAE,CAAC,CAC/D,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ,EAGa,GACX,EACA,EACA,EACA,EAAqC,IACmC,CACxE,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAA+B,CAAC,EAClD,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAA0C,CAAE,KAAM,MAAO,CAAC,GAExE,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAa,MAAQ,IAAe,KAAM,CAC5C,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAM,EAAQ,IAAI,gBAYlB,OAXA,EAAS,CAAE,KAAM,UAAW,WAAU,YAAW,CAAC,EAClD,EAAU,KAAK,EAAU,EAAM,MAAM,CAAC,CAAC,KACpC,GAAW,CACL,EAAM,OAAO,SAAS,EAAS,CAAE,KAAM,QAAS,SAAQ,WAAU,YAAW,CAAC,CACrF,EACC,GAAY,CACP,EAAM,OAAO,UACb,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,KAAM,SAAU,WAAU,YAAW,CAAC,EACnD,CACF,MACa,EAAM,MAAM,CAC3B,EAAG,CAAC,EAAU,EAAkB,EAAiB,EAAY,CAAS,CAAC,EAEvE,IAAM,EAAoC,IAAa,MAAQ,IAAe,KAC1E,CAAE,KAAM,MAAO,EACf,EAAM,OAAS,QAAU,EAAM,WAAa,GAAY,EAAM,aAAe,EAC7E,CAAE,KAAM,UAAW,WAAU,YAAW,EACxC,EAEJ,MAAO,CACL,OAAA,EAAA,EAAA,YAAA,KAAyB,EAAoB,GAAa,EAAW,CAAC,EAAG,CAAC,CAAC,EAC3E,MAAO,CACT,CACF,QC5EM,EAA6D,CACjE,OAAQ,kBACR,cAAe,eACf,aAAc,gBACd,OAAQ,gBACV,EAEM,EAAmB,GACvB,EAAmB,EAAM,WAAY,CACnC,IAAK,UACL,KAAM,UACN,OAAQ,GACR,OAAQ,QACR,OAAQ,UACR,MAAO,QACP,OAAQ,UACR,KAAM,SACR,CAAC,EAGU,EACX,GACsE,CACtE,IAAM,EAA4F,CAChG,CAAE,MAAO,QAAS,MAAO,EAAO,YAAY,OAAQ,EACpD,CAAE,MAAO,YAAa,MAAO,EAAO,UAAU,OAAS,IAAK,EAC5D,CAAE,MAAO,SAAU,MAAO,EAAO,YAAY,QAAS,EACtD,CAAE,MAAO,eAAgB,MAAO,EAAO,YAAY,cAAe,EAClE,CAAE,MAAO,aAAc,MAAO,EAAO,YAAY,kBAAmB,EACpE,CAAE,MAAO,UAAW,MAAO,EAAO,YAAY,SAAU,EACxD,CAAE,MAAO,SAAU,MAAO,EAAO,YAAY,QAAS,CACxD,EACA,MAAO,CACL,CAAE,MAAO,QAAS,MAAO,EAAO,MAAM,QAAS,EAC/C,CAAE,MAAO,OAAQ,MAAO,EAAO,MAAM,SAAU,EAC/C,GAAG,EAAgB,OAChB,GAAuE,EAAM,QAAU,IAC1F,CACF,CACF,EAGa,GAAuB,CAClC,YACA,QACA,UACA,mBACA,aACA,eAQkB,CAClB,IAAM,EAAa,EAAkB,GAAO,UAAY,KAAM,EAAY,EAAkB,CAAS,EAErG,OACE,EAAA,EAAA,IAAA,CAAC,EAAM,KAAP,CACE,aAAe,GAAS,CACjB,GAAM,EAAQ,CACrB,EACA,KAAM,IAAU,eAEhB,EAAA,EAAA,KAAA,CAAC,EAAM,QAAP,CACE,WAAW,sBACX,YAAY,qDACZ,MAAM,yBAHR,EAKE,EAAA,EAAA,IAAA,CAAC,EAAM,KAAP,CAAY,UAAW,EAAO,cAC3B,IAAU,MAAQ,EAAW,MAAM,OAAS,QAAU,EAAW,MAAM,OAAS,WAC/E,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,YAAU,OAAO,aAAW,wBAAwB,UAAW,EAAO,iBAA3E,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAS,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,OAAO,OAAS,CAAA,CACvB,IACH,EAAW,MAAM,OAAS,UAC5B,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAW,eAAO,WAAiB,CAAA,EAC5D,YAAY,0EACZ,MAAM,4BACN,KAAK,SACN,CAAA,GAED,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,wBAAwB,UAAW,EAAO,kBAAnE,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,iBAC5B,EAAa,EAAW,MAAM,OAAO,MAAM,WACxC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,GAAG,wBAAwB,QAAQ,sBAC9C,EAAW,MAAM,OAAO,MAAM,KAC3B,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,sBAAvB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAW,MAAM,OAAO,MAAM,MAAM,KAC3C,KAAK,UACL,KAAM,EAAW,MAAM,OAAO,MAAM,MAAM,OAAS,QAAU,WAAa,SAC3E,CAAA,EACA,EAAW,MAAM,OAAO,MAAM,UAAY,KAAO,MAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,QAAS,EAAW,MAAM,OAAO,MAAM,QAAS,KAAK,SAAW,CAAA,GAE/E,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,gBAC5B,EAAW,MAAM,OAAO,MAAM,MAAM,KACjC,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,OACH,SAAU,EAAmB,EAAW,MAAM,OAAO,MAAM,UAAU,EACrE,KAAK,YACL,QAAQ,gBAJV,CAMG,EAAgB,EAAW,MAAM,OAAO,KAAK,EAAE,MAC5C,GACH,GACE,KAET,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,4BAA4B,UAAW,EAAO,iBAAvE,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,GAAG,4BAA4B,QAAQ,yBAAgB,YAE/D,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,gBACnB,EAAqB,EAAW,MAAM,MAAM,CAAC,CAAC,KAAK,CAAE,QAAO,YAC3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,CAAU,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,CAAU,CAAA,CACZ,CAAA,EAHK,CAGL,CACN,CACC,CAAA,CACG,GACN,GAEG,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,EAAM,OAAP,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,WAAY,GAAI,WAAW,4BAE7C,CAAA,CACM,CAAA,CACD,GACL,CAAA,CAEhB,wNEhHM,GAAgB,EAAe,IACnC,EAAkB,CAAY,CAAC,CAAC,GAAG,EAAM,GAAG,EAAQ,eAAiB,eAAe,EAAE,EAG3E,EAA8C,CACzD,MAAO,EAAQ,EAAS,IACtB,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,SAAS,KAAK,CACjC,MAAO,CACL,GAAI,EAAQ,YAAc,MAAQ,CAAC,EAAI,CAAE,MAAO,EAAQ,SAAU,EAClE,GAAI,IAAW,KACX,CAAC,EACD,CAAE,eAAgB,EAAO,SAAU,iBAAkB,EAAO,UAAW,EAC3E,GAAI,EAAQ,KAAK,SAAW,EAAI,CAAC,EAAI,CAAE,KAAM,EAAa,EAAQ,KAAM,EAAK,CAAE,EAC/E,MAAO,GACP,GAAI,EAAQ,GAAG,SAAW,EAAI,CAAC,EAAI,CAAE,GAAI,EAAa,EAAQ,GAAI,EAAI,CAAE,CAC1E,CACF,CAAC,CACH,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ,EAEM,EAAwB,EAAmB,sBAAsB,EAG1D,GACX,EACA,EACA,EACA,EAA+B,IAK5B,CACH,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAA+B,CAAC,EAClD,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAAoC,CAAE,KAAM,MAAO,CAAC,EAC5D,GAAA,EAAA,EAAA,OAAA,CAA+C,IAAI,EAqDzD,OAlDA,EAAA,EAAA,UAAA,KAAgB,CAEd,GADA,EAAc,SAAS,MAAM,EACzB,IAAe,KAAM,CACvB,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAM,EAAU,IAAI,gBAepB,MAdA,GAAc,QAAU,EACxB,EAAS,CAAE,KAAM,SAAU,CAAC,EAC5B,EAAU,KAAK,EAAQ,OAAQ,EAAS,IAAI,CAAC,CAAC,KAC3C,GAAS,CACH,EAAQ,OAAO,SAClB,EAAS,CAAE,KAAM,QAAS,OAAQ,EAAK,OAAQ,cAAe,GAAO,WAAY,EAAK,UAAW,CAAC,CAEtG,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,KAAM,QAAS,CAAC,EAC7B,CACF,MACa,EAAQ,MAAM,CAC7B,EAAG,CAAC,GAxBiB,EAAQ,UAAU,GAAG,EAAQ,KAAK,GAAG,EAAQ,KAwBnD,EAAS,EAAkB,EAAiB,EAAY,CAAS,CAAC,EA4B1E,CACL,UAAA,EAAA,EAAA,YAAA,KA3BuC,CACvC,GAAI,IAAe,MAAQ,EAAM,OAAS,SAAW,EAAM,aAAe,MAAQ,EAAM,cAAe,OACvG,EAAc,SAAS,MAAM,EAC7B,IAAM,EAAU,IAAI,gBACpB,EAAc,QAAU,EACxB,IAAM,EAAU,EAChB,EAAS,CAAE,GAAG,EAAS,cAAe,EAAK,CAAC,EAC5C,EAAU,KAAK,EAAQ,OAAQ,EAAS,EAAQ,UAAU,CAAC,CAAC,KACzD,GAAS,CACH,EAAQ,OAAO,SAClB,EAAS,CACP,KAAM,QACN,OAAQ,CAAC,GAAG,EAAQ,OAAQ,GAAG,EAAK,MAAM,EAC1C,cAAe,GACf,WAAY,EAAK,UACnB,CAAC,CAEL,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,GAAG,EAAS,cAAe,EAAM,CAAC,EAC/C,CACF,CACF,EAAG,CAAC,EAAS,EAAkB,EAAY,EAAO,CAAS,CAGzD,EACA,OAAA,EAAA,EAAA,YAAA,KAAyB,EAAoB,GAAa,EAAW,CAAC,EAAG,CAAC,CAAC,EAC3E,OACF,CACF,EAGa,EAA2B,GACtC,IAAI,KAAK,eAAe,QAAS,CAC/B,UAAW,SACX,UAAW,QACX,SAAU,KACZ,CAAC,CAAC,CAAC,OAAO,EAAmB,CAAS,CAAC,EC1HnC,EAAqG,CACzG,CAAE,MAAO,WAAY,MAAO,KAAM,EAClC,CAAE,MAAO,SAAU,MAAO,OAAQ,EAClC,CAAE,MAAO,SAAU,MAAO,OAAQ,EAClC,CAAE,MAAO,WAAY,MAAO,QAAS,EACrC,CAAE,MAAO,SAAU,MAAO,QAAS,CACrC,EACM,EAAqD,CAAC,SAAU,eAAgB,cAAe,QAAQ,EAEvG,EAAe,GACnB,EAAa,KAAM,GAAW,EAAO,QAAU,CAAK,CAAC,EAAE,OAAS,MAE5D,EAAuF,CAC3F,OAAQ,CAAE,MAAO,iBAAkB,EACnC,cAAe,CAAE,MAAO,cAAe,EACvC,aAAc,CAAE,MAAO,eAAgB,EACvC,OAAQ,CAAE,MAAO,gBAAiB,CACpC,EAEM,GAAe,CACnB,QACA,YACA,YAMA,EAAA,EAAA,IAAA,CAAC,EAAD,CACa,YACX,MAAO,CACL,MAAO,GAAS,EAAM,MAAM,MAC5B,UAAW,EAAM,MAAM,KACvB,SAAU,EAAmB,EAAM,UAAU,EAC7C,OAAQ,EAAmB,EAAM,WAAW,CAAC,MAC7C,GAAI,EAAM,OAAS,KAAO,CAAC,EAAI,CAAE,KAAM,EAAM,IAAK,EAClD,GAAI,EAAM,SACV,GAAI,EAAM,UAAY,KAAO,CAAC,EAAI,CAAE,QAAS,EAAM,OAAQ,EAC3D,KAAM,EAAwB,EAAM,UAAU,EAC9C,MAAO,EAAM,KACf,CACD,CAAA,EAIU,EAA6B,GAAwC,CAChF,OAAQ,EAAM,KAAd,CACE,IAAK,gBACH,OAAO,EAAM,QAAQ,aAAe,kBACtC,IAAK,sBACH,OAAO,EAAM,SAAS,aAAe,kBACvC,IAAK,YACL,IAAK,UACL,IAAK,WACL,IAAK,cACH,MAAO,EACX,CACF,EAGa,GACX,EACA,EACA,EACA,IACW,CACX,IAAM,EAAU,IAAI,gBAAgB,CAAM,EAE1C,OADA,EAAQ,IAAI,QAAS,CAAQ,EACtB,EAAoB,EAAU,IAAI,EAAQ,SAAS,IAAK,CAAI,CACrE,EAEM,GAAiB,CAAE,YAA8E,CACrG,IAAM,GAAA,EAAA,EAAA,QAAA,KAEF,IAAI,IAAgC,CAClC,CAAC,SAAU,EAAO,QAAQ,CAAE,gBAAiB,IAAe,QAAQ,CAAC,CAAC,MAAM,EAC5E,CAAC,eAAgB,EAAO,QAAQ,CAAE,gBAAiB,IAAe,cAAc,CAAC,CAAC,MAAM,EACxF,CAAC,cAAe,EAAO,QAAQ,CAAE,gBAAiB,IAAe,aAAa,CAAC,CAAC,MAAM,EACtF,CAAC,SAAU,EAAO,QAAQ,CAAE,gBAAiB,IAAe,QAAQ,CAAC,CAAC,MAAM,CAC9E,CAAC,EACH,CAAC,CAAM,CACT,EACA,OACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,iBACnB,EAAgB,IAAK,IAElB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,cAAa,WAAlB,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAmB,EAAO,CAAC,KAAU,CAAA,GAC1C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,IAAI,CAAM,GAAK,CAAM,CAAA,CAC9B,GAH0B,CAG1B,CAER,CACC,CAAA,CAER,EAGa,GAAgB,CAC3B,kBACA,YAAY,GAIV,CAAC,IAAoB,CACvB,IAAM,EAAW,EAAY,EACvB,EAAiB,EAAkB,EACnC,EAAa,EAA0B,EAAe,KAAK,EAC3D,CAAC,EAAS,IAAA,EAAA,EAAA,SAAA,CAAwC,CAAE,UAAW,MAAO,KAAM,GAAI,GAAI,EAAG,CAAC,EACxF,CAAC,EAAe,IAAA,EAAA,EAAA,SAAA,CAAmD,IAAI,EACvE,EAAa,EAAY,EAAS,EAAY,EAAe,kBAAmB,CAAS,EACzF,EAAY,EAAoB,EAAS,SAAU,EAAS,OAAQ,EAAS,IAAI,EACjF,EAAa,EAA0B,EAAe,KAAK,EAEjE,GAAI,EAAW,MAAM,OAAS,QAAU,EAAW,MAAM,OAAS,UAChE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,YAAY,6DAA6D,MAAM,kBAAoB,CAAA,EAGnH,GAAI,EAAW,MAAM,OAAS,SAC5B,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAW,eAAO,WAAiB,CAAA,EAC5D,YAAY,kCACZ,MAAM,sBACP,CAAA,EAGL,IAAM,EAAgB,EAAW,MAEjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,cAA3B,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,cAA1B,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,KAAK,YAAY,QAAQ,iBAAQ,UAExC,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAG,KAAK,QAAQ,mBAAtB,CAAgC,cAE9B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAC,aAEF,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,MAAO,KAAK,YAAY,QAAQ,sBAAa,8FAE/D,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,SAAU,GAAI,WAAW,+BAE3C,CAAA,CACA,KAER,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,OAAQ,EAAc,MAAS,CAAA,GAE9C,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,aAAW,mBAAmB,UAAW,EAAO,iBAAzD,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,OAAW,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,MAAO,EAAQ,UACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,UAAW,EAAY,EAAM,cAAc,KAAK,CAAE,CAAC,WAEhG,EAAa,IAAK,IACjB,EAAA,EAAA,IAAA,CAAC,SAAD,CAA2B,MAAO,EAAO,eACtC,EAAO,KACF,EAFK,EAAO,KAEZ,CACT,CACK,CAAA,CACH,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAChB,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,MAAO,EAAQ,KACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,KAAM,EAAM,cAAc,KAAM,CAAC,CAChF,CAAA,CACI,CAAA,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,IAAQ,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,MAAO,EAAQ,GACf,SAAW,GAAU,EAAW,CAAE,GAAG,EAAS,GAAI,EAAM,cAAc,KAAM,CAAC,CAC9E,CAAA,CACI,CAAA,CAAA,CACA,IAER,EAAc,OAAO,SAAW,GAC/B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,YAAY,2CAA2C,MAAM,0BAA4B,CAAA,GAErG,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,UAAW,YACvB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,gBACnB,EAAc,OAAO,KAAK,EAAO,KAChC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,GACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,kBAAxB,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAM,MAAM,KAAY,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,YAAe,EAAiB,CAAK,EAAG,KAAK,UAAU,QAAQ,iBAAQ,SAEvE,CAAA,CACJ,IACJ,IAAA,GAEN,UAAW,EAAQ,EAAc,OAAO,OAAS,EAC1C,OAER,EADM,EAAM,QACZ,CACF,CACC,CAAA,CACQ,CAAA,EAEf,EAAc,aAAe,KAAO,MACnC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,SAAU,EAAc,cAAe,QAAS,EAAW,SAAU,KAAK,YAAY,QAAA,YAC3F,EAAc,cAAgB,WAAa,uBACtC,CAAA,GAEV,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UACE,IAAkB,KACd,EACA,EAAuB,EAAS,SAAU,EAAS,OAAQ,EAAS,KAAM,EAAc,QAAQ,EAEtG,MAAO,EACP,YAAe,EAAiB,IAAI,EACpC,iBAAkB,EAAe,kBACrB,aACZ,GAAK,IAAoB,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,CAAgB,CACxE,CAAA,CACM,GAEb"}
1
+ {"version":3,"file":"TimelinePage-CM2og72M.js","names":[],"sources":["../../../src/client/timeline/TimelineDetailSheet.module.css","../../../src/client/timeline/useTimelineDetail.ts","../../../src/client/timeline/TimelineDetailSheet.tsx","../../../src/client/timeline/TimelinePage.module.css","../../../src/client/timeline/useTimeline.ts","../../../src/client/timeline/TimelinePage.tsx"],"sourcesContent":[".body,\n.loading,\n.content,\n.identity,\n.identityMeta,\n.section,\n.ledger {\n display: grid;\n}\n\n.body,\n.loading,\n.content {\n gap: var(--rly-space-20);\n}\n\n.identity,\n.section {\n gap: var(--rly-space-12);\n}\n\n.identity {\n padding-block: var(--rly-space-12) var(--rly-space-20);\n border-block-end: 1px solid var(--rly-color-border-1);\n}\n\n.identity h2,\n.identity p,\n.section h3,\n.ledger dd {\n margin: 0;\n}\n\n.identity h2 {\n max-inline-size: 13ch;\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.identityMeta {\n grid-template-columns: repeat(2, minmax(0, max-content));\n align-items: center;\n gap: var(--rly-space-8) var(--rly-space-12);\n}\n\n.ledger {\n margin: 0;\n}\n\n.ledger div {\n display: grid;\n grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1fr);\n gap: var(--rly-space-12);\n padding-block: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.ledger dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.ledger dd {\n overflow-wrap: anywhere;\n font: var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height)\n var(--rly-type-code-font);\n}\n\n.footerLink {\n min-block-size: 3rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding-inline: var(--rly-space-16);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-align: center;\n text-decoration: none;\n}\n\n.footerLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 30rem) {\n .identityMeta,\n .ledger div {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineEvent, TimelineEventDetail } from \"../../domain/timeline.js\"\n\n/** Browser boundary for one exact owner-only Timeline event expansion. */\nexport interface TimelineDetailTransport {\n readonly load: (eventKey: TimelineEvent[\"eventKey\"], signal: AbortSignal) => Promise<TimelineEventDetail>\n}\n\nexport type TimelineDetailState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly detail: TimelineEventDetail\n readonly eventKey: TimelineEvent[\"eventKey\"]\n readonly sessionKey: string\n }\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for an owner-authorized event detail read. */\nexport const browserTimelineDetailTransport: TimelineDetailTransport = {\n load: (eventKey, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.detail({ params: { eventKey } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep a detail result bound to the exact event and authenticated session that requested it. */\nexport const useTimelineDetail = (\n eventKey: TimelineEvent[\"eventKey\"] | null,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineDetailTransport = browserTimelineDetailTransport\n): { readonly retry: () => void; readonly state: TimelineDetailState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineDetailState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (eventKey === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", eventKey, sessionKey })\n transport.load(eventKey, abort.signal).then(\n (detail) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", detail, eventKey, sessionKey })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", eventKey, sessionKey })\n }\n )\n return () => abort.abort()\n }, [eventKey, onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: TimelineDetailState = eventKey === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.eventKey !== eventKey || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", eventKey, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { TimelineEvent, TimelineEventDetail, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport styles from \"./TimelineDetailSheet.module.css\"\nimport { type TimelineDetailTransport, useTimelineDetail } from \"./useTimelineDetail.js\"\n\nconst sourceLabels: Readonly<Record<TimelineSourceKind, string>> = {\n action: \"Governed action\",\n \"plugin-sync\": \"Service sync\",\n relationship: \"Delivery link\",\n system: \"Control Center\"\n}\n\nconst formatTimestamp = (event: TimelineEvent): string =>\n DateTime.formatUtc(event.occurredAt, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n second: \"2-digit\",\n year: \"numeric\"\n })\n\n/** Non-secret durable references that make one owner-visible event attributable. */\nexport const timelineDetailLedger = (\n detail: TimelineEventDetail\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n const optionalEntries: ReadonlyArray<{ readonly label: string; readonly value: string | null }> = [\n { label: \"Actor\", value: detail.identifiers.actorId },\n { label: \"Agent job\", value: detail.agentJob?.jobId ?? null },\n { label: \"Action\", value: detail.identifiers.actionId },\n { label: \"Relationship\", value: detail.identifiers.relationshipId },\n { label: \"Connection\", value: detail.identifiers.pluginConnectionId },\n { label: \"Release\", value: detail.identifiers.releaseId },\n { label: \"Entity\", value: detail.identifiers.entityId }\n ]\n return [\n { label: \"Event\", value: detail.event.eventKey },\n { label: \"Type\", value: detail.event.eventType },\n ...optionalEntries.filter(\n (entry): entry is { readonly label: string; readonly value: string } => entry.value !== null\n )\n ]\n}\n\n/** Owner-only expansion of one redacted Timeline row into its durable provenance. */\nexport const TimelineDetailSheet = ({\n agentHref,\n event,\n onClose,\n onSessionExpired,\n sessionKey,\n transport\n}: {\n readonly agentHref: string\n readonly event: TimelineEvent | null\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly sessionKey: string | null\n readonly transport?: TimelineDetailTransport\n}): ReactElement => {\n const controller = useTimelineDetail(event?.eventKey ?? null, sessionKey, onSessionExpired, transport)\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={event !== null}\n >\n <Sheet.Content\n closeLabel=\"Close event details\"\n description=\"Durable provenance for this exact workspace event.\"\n title=\"Event details\"\n >\n <Sheet.Body className={styles.body}>\n {event === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading event details\" className={styles.loading}>\n <Skeleton height=\"10rem\" />\n <Skeleton height=\"14rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline row remains unchanged. Its provenance could not be loaded.\"\n title=\"Event details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"timeline-detail-title\" className={styles.identity}>\n <Text tone=\"secondary\" variant=\"label\">\n {sourceLabels[controller.state.detail.event.sourceKind]}\n </Text>\n <Text as=\"h2\" id=\"timeline-detail-title\" variant=\"page-title\">\n {controller.state.detail.event.title}\n </Text>\n <div className={styles.identityMeta}>\n <StateLabel\n label={controller.state.detail.event.actor.kind}\n size=\"compact\"\n tone={controller.state.detail.event.actor.kind === \"agent\" ? \"progress\" : \"neutral\"}\n />\n {controller.state.detail.event.service === null ? null : (\n <ServiceMark service={controller.state.detail.event.service} size=\"compact\" />\n )}\n <Text tone=\"secondary\" variant=\"meta\">\n {controller.state.detail.event.actor.label}\n </Text>\n <Text\n as=\"time\"\n dateTime={DateTime.formatIso(controller.state.detail.event.occurredAt)}\n tone=\"secondary\"\n variant=\"meta\"\n >\n {formatTimestamp(controller.state.detail.event)} UTC\n </Text>\n </div>\n </section>\n\n <section aria-labelledby=\"timeline-provenance-title\" className={styles.section}>\n <Text as=\"h3\" id=\"timeline-provenance-title\" variant=\"section-title\">\n Provenance\n </Text>\n <dl className={styles.ledger}>\n {timelineDetailLedger(controller.state.detail).map(({ label, value }) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n </div>\n )}\n </Sheet.Body>\n <Sheet.Footer>\n <Link className={styles.footerLink} to={agentHref}>\n Ask Relay about this event\n </Link>\n </Sheet.Footer>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n",".page,\n.hero,\n.page {\n gap: clamp(2.5rem, 7vw, 6rem);\n}\n\n.hero {\n gap: var(--rly-space-16);\n}\n\n.hero p,\n.hero h1 {\n margin: 0;\n}\n\n.hero h1 {\n max-inline-size: 9ch;\n letter-spacing: -0.075em;\n text-wrap: balance;\n}\n\n.intro {\n max-inline-size: 46rem;\n}\n\n.askRelay {\n inline-size: fit-content;\n min-block-size: 3.5rem;\n display: inline-flex;\n align-items: center;\n padding-inline: var(--rly-space-20);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.summary {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin: 0;\n overflow: hidden;\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n}\n\n.summary div {\n display: grid;\n gap: var(--rly-space-12);\n min-block-size: 8rem;\n padding: var(--rly-space-20);\n background: var(--rly-color-surface-1);\n}\n\n.summary div + div {\n border-inline-start: 1px solid var(--rly-color-border-1);\n}\n\n.summary dt {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.summary dd {\n margin: 0;\n color: var(--rly-color-text-1);\n font-size: clamp(2.5rem, 6vw, 5rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.07em;\n}\n\n.summary div[data-source=\"action\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codecommit);\n}\n.summary div[data-source=\"relationship\"] {\n box-shadow: inset 0 4px var(--rly-color-service-codepipeline);\n}\n.summary div[data-source=\"plugin-sync\"] {\n box-shadow: inset 0 4px var(--rly-color-service-jira);\n}\n.summary div[data-source=\"system\"] {\n box-shadow: inset 0 4px var(--rly-color-focus);\n}\n\n.filters {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n gap: var(--rly-space-12);\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters select,\n.filters input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.events {\n margin: 0;\n padding: 0;\n list-style: none;\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.rowActor {\n display: grid;\n gap: var(--rly-space-8);\n justify-items: start;\n}\n\n@media (max-width: 48rem) {\n .summary {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .summary div:nth-child(3) {\n border-inline-start: 0;\n }\n .summary div:nth-child(n + 3) {\n border-block-start: 1px solid var(--rly-color-border-1);\n }\n .filters {\n grid-template-columns: 1fr;\n }\n}\n","import * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { TimelineActorKind, TimelineCursor, TimelineEvent, TimelinePage } from \"../../domain/timeline.js\"\nimport { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\n\n/** User-controlled Timeline filters. */\nexport interface TimelineFilters {\n readonly actorKind: TimelineActorKind | \"all\"\n readonly from: string\n readonly to: string\n}\n\n/** Browser transport boundary for Timeline tests and authenticated reads. */\nexport interface TimelineTransport {\n readonly load: (\n signal: AbortSignal,\n filters: TimelineFilters,\n cursor: TimelineCursor | null\n ) => Promise<TimelinePage>\n}\n\nexport type TimelineState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"failed\" }\n | {\n readonly _tag: \"ready\"\n readonly events: ReadonlyArray<TimelineEvent>\n readonly isLoadingMore: boolean\n readonly nextCursor: TimelineCursor | null\n }\n\nconst dateBoundary = (value: string, isEnd: boolean): TimelineCursor[\"occurredAt\"] =>\n Schema.decodeSync(UtcTimestamp)(`${value}T${isEnd ? \"23:59:59.999\" : \"00:00:00.000\"}Z`)\n\n/** Generated-client transport for the authenticated Timeline page. */\nexport const browserTimelineTransport: TimelineTransport = {\n load: (signal, filters, cursor) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.timeline.page({\n query: {\n ...(filters.actorKind === \"all\" ? {} : { actor: filters.actorKind }),\n ...(cursor === null\n ? {}\n : { beforeEventKey: cursor.eventKey, beforeOccurredAt: cursor.occurredAt }),\n ...(filters.from.length === 0 ? {} : { from: dateBoundary(filters.from, false) }),\n limit: 50,\n ...(filters.to.length === 0 ? {} : { to: dateBoundary(filters.to, true) })\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load and incrementally page one exact authenticated Timeline filter set. */\nexport const useTimeline = (\n filters: TimelineFilters,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: TimelineTransport = browserTimelineTransport\n): {\n readonly loadMore: () => void\n readonly retry: () => void\n readonly state: TimelineState\n} => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<TimelineState>({ _tag: \"idle\" })\n const activeRequest = useRef<AbortController | null>(null)\n const filterKey = `${filters.actorKind}|${filters.from}|${filters.to}`\n\n useEffect(() => {\n activeRequest.current?.abort()\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const request = new AbortController()\n activeRequest.current = request\n setState({ _tag: \"loading\" })\n transport.load(request.signal, filters, null).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({ _tag: \"ready\", events: page.events, isLoadingMore: false, nextCursor: page.nextCursor })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\" })\n }\n )\n return () => request.abort()\n }, [filterKey, filters, onSessionExpired, requestRevision, sessionKey, transport])\n\n const loadMore = useCallback((): void => {\n if (sessionKey === null || state._tag !== \"ready\" || state.nextCursor === null || state.isLoadingMore) return\n activeRequest.current?.abort()\n const request = new AbortController()\n activeRequest.current = request\n const current = state\n setState({ ...current, isLoadingMore: true })\n transport.load(request.signal, filters, current.nextCursor).then(\n (page) => {\n if (!request.signal.aborted) {\n setState({\n _tag: \"ready\",\n events: [...current.events, ...page.events],\n isLoadingMore: false,\n nextCursor: page.nextCursor\n })\n }\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ ...current, isLoadingMore: false })\n }\n )\n }, [filters, onSessionExpired, sessionKey, state, transport])\n\n return {\n loadMore,\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state\n }\n}\n\n/** Compact UTC timestamp for Timeline rows. */\nexport const formatTimelineTimestamp = (timestamp: TimelineEvent[\"occurredAt\"]): string =>\n new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n }).format(DateTime.toDateUtc(timestamp))\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { TimelineRow as RlyTimelineRow } from \"@knpkv/rly/patterns\"\nimport { Button, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type ReactElement, type ReactNode, useMemo, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport type { TimelineActorKind, TimelineEvent, TimelineSourceKind } from \"../../domain/timeline.js\"\nimport { browserReadableSessionKey, type BrowserSessionState, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport { WorkspaceEntityLink } from \"../entities/WorkspaceEntityLink.js\"\nimport { TimelineDetailSheet } from \"./TimelineDetailSheet.js\"\nimport type { TimelineDetailTransport } from \"./useTimelineDetail.js\"\nimport styles from \"./TimelinePage.module.css\"\nimport {\n browserTimelineTransport,\n formatTimelineTimestamp,\n type TimelineFilters,\n type TimelineTransport,\n useTimeline\n} from \"./useTimeline.js\"\n\nconst actorOptions: ReadonlyArray<{ readonly label: string; readonly value: TimelineActorKind | \"all\" }> = [\n { label: \"Everyone\", value: \"all\" },\n { label: \"People\", value: \"human\" },\n { label: \"Agents\", value: \"agent\" },\n { label: \"Services\", value: \"plugin\" },\n { label: \"System\", value: \"system\" }\n]\nconst timelineSources: ReadonlyArray<TimelineSourceKind> = [\"action\", \"relationship\", \"plugin-sync\", \"system\"]\n\nconst actorFilter = (value: string): TimelineFilters[\"actorKind\"] =>\n actorOptions.find((option) => option.value === value)?.value ?? \"all\"\n\nconst sourcePresentation: Readonly<Record<TimelineSourceKind, { readonly label: string }>> = {\n action: { label: \"Governed action\" },\n \"plugin-sync\": { label: \"Service sync\" },\n relationship: { label: \"Delivery link\" },\n system: { label: \"Control Center\" }\n}\n\nconst TimelineRow = ({\n actor,\n continued,\n event\n}: {\n readonly actor?: ReactNode\n readonly continued: boolean\n readonly event: TimelineEvent\n}): ReactElement => (\n <RlyTimelineRow\n continued={continued}\n event={{\n actor: actor ?? event.actor.label,\n actorKind: event.actor.kind,\n dateTime: DateTime.formatIso(event.occurredAt),\n detail: sourcePresentation[event.sourceKind].label,\n ...(event.href === null ? {} : { href: event.href }),\n id: event.eventKey,\n ...(event.service === null ? {} : { service: event.service }),\n time: formatTimelineTimestamp(event.occurredAt),\n title: event.title\n }}\n />\n)\n\n/** Only workspace owners can deliberately expand redacted Timeline rows. */\nexport const canInspectTimelineDetails = (state: BrowserSessionState): boolean => {\n switch (state._tag) {\n case \"authenticated\":\n return state.session.permission === \"workspace-owner\"\n case \"storage-unavailable\":\n return state.session?.permission === \"workspace-owner\"\n case \"anonymous\":\n case \"blocked\":\n case \"checking\":\n case \"unavailable\":\n return false\n }\n}\n\n/** Preserve one selected event alongside the current Timeline filters for Relay. */\nexport const timelineEventAgentPath = (\n pathname: string,\n search: string,\n hash: string,\n eventKey: TimelineEvent[\"eventKey\"]\n): string => {\n const context = new URLSearchParams(search)\n context.set(\"event\", eventKey)\n return contextualAgentPath(pathname, `?${context.toString()}`, hash)\n}\n\nconst SourceSummary = ({ events }: { readonly events: ReadonlyArray<TimelineEvent> }): ReactElement => {\n const totals = useMemo(\n () =>\n new Map<TimelineSourceKind, number>([\n [\"action\", events.filter(({ sourceKind }) => sourceKind === \"action\").length],\n [\"relationship\", events.filter(({ sourceKind }) => sourceKind === \"relationship\").length],\n [\"plugin-sync\", events.filter(({ sourceKind }) => sourceKind === \"plugin-sync\").length],\n [\"system\", events.filter(({ sourceKind }) => sourceKind === \"system\").length]\n ]),\n [events]\n )\n return (\n <dl className={styles.summary}>\n {timelineSources.map((source) => {\n return (\n <div data-source={source} key={source}>\n <dt>{sourcePresentation[source].label}</dt>\n <dd>{totals.get(source) ?? 0}</dd>\n </div>\n )\n })}\n </dl>\n )\n}\n\n/** Bird's-eye view of attributable human, agent, service, and system activity. */\nexport const TimelinePage = ({\n detailTransport,\n transport = browserTimelineTransport\n}: {\n readonly detailTransport?: TimelineDetailTransport\n readonly transport?: TimelineTransport\n} = {}): ReactElement => {\n const location = useLocation()\n const browserSession = useBrowserSession()\n const sessionKey = browserReadableSessionKey(browserSession.state)\n const [filters, setFilters] = useState<TimelineFilters>({ actorKind: \"all\", from: \"\", to: \"\" })\n const [selectedEvent, setSelectedEvent] = useState<TimelineEvent | null>(null)\n const controller = useTimeline(filters, sessionKey, browserSession.invalidateSession, transport)\n const agentHref = contextualAgentPath(location.pathname, location.search, location.hash)\n const canInspect = canInspectTimelineDetails(browserSession.state)\n\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <StatePanel description=\"Combining durable activity across your connected services.\" title=\"Loading Timeline\" />\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The Timeline could not be read.\"\n title=\"Timeline unavailable\"\n />\n )\n }\n const timelineState = controller.state\n\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Timeline\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Everything\n <br />\n that moved.\n </Text>\n <Text className={styles.intro} tone=\"secondary\" variant=\"body-large\">\n One chronological truth across people, agents, code, delivery links, and connected services.\n </Text>\n <Link className={styles.askRelay} to={agentHref}>\n Ask Relay about this Timeline\n </Link>\n </header>\n\n <SourceSummary events={timelineState.events} />\n\n <section aria-label=\"Timeline filters\" className={styles.filters}>\n <label>\n <span>Actor</span>\n <select\n value={filters.actorKind}\n onChange={(event) => setFilters({ ...filters, actorKind: actorFilter(event.currentTarget.value) })}\n >\n {actorOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>From</span>\n <input\n type=\"date\"\n value={filters.from}\n onChange={(event) => setFilters({ ...filters, from: event.currentTarget.value })}\n />\n </label>\n <label>\n <span>To</span>\n <input\n type=\"date\"\n value={filters.to}\n onChange={(event) => setFilters({ ...filters, to: event.currentTarget.value })}\n />\n </label>\n </section>\n\n {timelineState.events.length === 0 ? (\n <StatePanel description=\"Try a wider date range or another actor.\" title=\"No activity in this view\" />\n ) : (\n <LinkProvider component={WorkspaceEntityLink}>\n <ol className={styles.events}>\n {timelineState.events.map((event, index) => (\n <TimelineRow\n actor={\n canInspect ? (\n <span className={styles.rowActor}>\n <span>{event.actor.label}</span>\n <Button onClick={() => setSelectedEvent(event)} size=\"compact\" variant=\"quiet\">\n Inspect\n </Button>\n </span>\n ) : undefined\n }\n continued={index < timelineState.events.length - 1}\n event={event}\n key={event.eventKey}\n />\n ))}\n </ol>\n </LinkProvider>\n )}\n {timelineState.nextCursor === null ? null : (\n <Button disabled={timelineState.isLoadingMore} onClick={controller.loadMore} size=\"principal\" stretch>\n {timelineState.isLoadingMore ? \"Loading…\" : \"Show earlier activity\"}\n </Button>\n )}\n <TimelineDetailSheet\n agentHref={\n selectedEvent === null\n ? agentHref\n : timelineEventAgentPath(location.pathname, location.search, location.hash, selectedEvent.eventKey)\n }\n event={selectedEvent}\n onClose={() => setSelectedEvent(null)}\n onSessionExpired={browserSession.invalidateSession}\n sessionKey={sessionKey}\n {...(detailTransport === undefined ? {} : { transport: detailTransport })}\n />\n </article>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{h as r,w as i}from"./Dialog-DwSIPb-B-DVn37afM.js";import{n as a,o,r as s}from"./workspaceEntityRoutes-CRcfSq7c.js";var c=e(t(),1),l=n(),u=(e,t)=>{let n=o(e);return n===null?void 0:s(t.state,n.workspaceId,n.entityId,a(t))},d=(0,c.forwardRef)(function({href:e,...t},n){let a=i();return(0,l.jsx)(r,{...t,ref:n,state:u(e,a),to:e})});export{u as n,d as t};
2
- //# sourceMappingURL=WorkspaceEntityLink-BRifdJHn.js.map
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{h as r,w as i}from"./Dialog-DwSIPb-B-DVn37afM.js";import{n as a,r as o,s}from"./workspaceEntityRoutes-Biw67kRR.js";var c=e(t(),1),l=n(),u=(e,t)=>{let n=s(e);return n===null?void 0:o(t.state,n.workspaceId,n.entityId,a(t))},d=(0,c.forwardRef)(function({href:e,...t},n){let a=i();return(0,l.jsx)(r,{...t,ref:n,state:u(e,a),to:e})});export{u as n,d as t};
2
+ //# sourceMappingURL=WorkspaceEntityLink-CTw_He-8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceEntityLink-BRifdJHn.js","names":[],"sources":["../../../src/client/entities/WorkspaceEntityLink.tsx"],"sourcesContent":["import type { RlyLinkProps } from \"@knpkv/rly/foundations\"\nimport { forwardRef, type ReactElement } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport {\n entityOriginFromLocation,\n makeWorkspaceEntityRouteState,\n workspaceEntityTargetFromHref\n} from \"../items/workspaceEntityRoutes.js\"\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Preserve the validated root origin when an Rly relationship opens another canonical entity. */\nexport const workspaceEntityStateForHref = (href: string, location: RouterLocationParts): unknown => {\n const target = workspaceEntityTargetFromHref(href)\n return target === null\n ? undefined\n : makeWorkspaceEntityRouteState(\n location.state,\n target.workspaceId,\n target.entityId,\n entityOriginFromLocation(location)\n )\n}\n\n/** React Router bridge installed only inside lazy entity-aware route chunks. */\nexport const WorkspaceEntityLink = forwardRef<HTMLAnchorElement, RlyLinkProps>(function WorkspaceEntityLink(\n { href, ...props },\n ref\n): ReactElement {\n const location = useLocation()\n return <Link {...props} ref={ref} state={workspaceEntityStateForHref(href, location)} to={href} />\n})\n"],"mappings":"2MAkBa,GAA+B,EAAc,IAA2C,CACnG,IAAM,EAAS,EAA8B,CAAI,EACjD,OAAO,IAAW,KACd,IAAA,GACA,EACE,EAAS,MACT,EAAO,YACP,EAAO,SACP,EAAyB,CAAQ,CACnC,CACN,EAGa,GAAA,EAAA,EAAA,WAAA,CAAkE,SAC7E,CAAE,OAAM,GAAG,GACX,EACc,CACd,IAAM,EAAW,EAAY,EAC7B,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAY,MAAK,MAAO,EAA4B,EAAM,CAAQ,EAAG,GAAI,CAAO,CAAA,CACnG,CAAC"}
1
+ {"version":3,"file":"WorkspaceEntityLink-CTw_He-8.js","names":[],"sources":["../../../src/client/entities/WorkspaceEntityLink.tsx"],"sourcesContent":["import type { RlyLinkProps } from \"@knpkv/rly/foundations\"\nimport { forwardRef, type ReactElement } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport {\n entityOriginFromLocation,\n makeWorkspaceEntityRouteState,\n workspaceEntityTargetFromHref\n} from \"../items/workspaceEntityRoutes.js\"\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Preserve the validated root origin when an Rly relationship opens another canonical entity. */\nexport const workspaceEntityStateForHref = (href: string, location: RouterLocationParts): unknown => {\n const target = workspaceEntityTargetFromHref(href)\n return target === null\n ? undefined\n : makeWorkspaceEntityRouteState(\n location.state,\n target.workspaceId,\n target.entityId,\n entityOriginFromLocation(location)\n )\n}\n\n/** React Router bridge installed only inside lazy entity-aware route chunks. */\nexport const WorkspaceEntityLink = forwardRef<HTMLAnchorElement, RlyLinkProps>(function WorkspaceEntityLink(\n { href, ...props },\n ref\n): ReactElement {\n const location = useLocation()\n return <Link {...props} ref={ref} state={workspaceEntityStateForHref(href, location)} to={href} />\n})\n"],"mappings":"2MAkBa,GAA+B,EAAc,IAA2C,CACnG,IAAM,EAAS,EAA8B,CAAI,EACjD,OAAO,IAAW,KACd,IAAA,GACA,EACE,EAAS,MACT,EAAO,YACP,EAAO,SACP,EAAyB,CAAQ,CACnC,CACN,EAGa,GAAA,EAAA,EAAA,WAAA,CAAkE,SAC7E,CAAE,OAAM,GAAG,GACX,EACc,CACd,IAAM,EAAW,EAAY,EAC7B,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAY,MAAK,MAAO,EAA4B,EAAM,CAAQ,EAAG,GAAI,CAAO,CAAA,CACnG,CAAC"}
@@ -1 +1 @@
1
- ._state_dgh51_1{outline:none;place-items:center;min-block-size:60dvh;display:grid}._state_dgh51_1>*{inline-size:min(100%,42rem)}._loading_dgh51_12,._loadingColumns_dgh51_13,._content_dgh51_14,._deliveryPath_dgh51_15,._facts_dgh51_16,._evidence_dgh51_17,._activity_dgh51_18,._sectionHeading_dgh51_19{display:grid}._loading_dgh51_12{gap:var(--rly-space-32);min-block-size:60dvh}._loadingColumns_dgh51_13{gap:var(--rly-space-24);grid-template-columns:minmax(var(--rly-space-0), 1fr) minmax(var(--rly-space-0), 20rem)}._back_dgh51_33,._principalAction_dgh51_34,._releasePath_dgh51_35 a{color:inherit;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-underline-offset:var(--rly-space-4)}._back_dgh51_33:focus-visible,._principalAction_dgh51_34:focus-visible,._releasePath_dgh51_35 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._principalAction_dgh51_34{background:var(--rly-color-action-background);border-radius:var(--rly-radius-control);color:var(--rly-color-action-foreground);font-size:var(--rly-type-body-large-size);min-block-size:var(--rly-space-48);padding-inline:var(--rly-space-24);justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._content_dgh51_14{gap:var(--rly-space-24)}._deliveryPath_dgh51_15{gap:var(--rly-space-20)}._sectionHeading_dgh51_19{gap:var(--rly-space-4)}._pathRail_dgh51_74{align-items:stretch;gap:var(--rly-space-12);min-inline-size:var(--rly-space-0);padding-block:var(--rly-space-4);display:flex;overflow-x:auto}._pathNode_dgh51_83,._pathEmpty_dgh51_84,._releasePath_dgh51_35 li{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-control);align-items:center;gap:var(--rly-space-12);min-block-size:var(--rly-space-48);padding:var(--rly-space-12) var(--rly-space-16);flex:none;display:flex}._pathNode_dgh51_83>span{gap:var(--rly-space-2);display:grid}._pathNode_dgh51_83 code,._pathEmpty_dgh51_84{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._releasePath_dgh51_35{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none;display:contents}._releasePath_dgh51_35 li:before{color:var(--rly-color-text-3);content:"→";margin-inline-end:var(--rly-space-4)}._facts_dgh51_16,._evidence_dgh51_17{gap:var(--rly-space-16)}._facts_dgh51_16 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._facts_dgh51_16 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(6rem, .65fr) minmax(var(--rly-space-0), 1fr);display:grid}._facts_dgh51_16 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._facts_dgh51_16 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._workingCircle_dgh51_152{--entity-accent:var(--rly-color-focus);isolation:isolate;min-inline-size:var(--rly-space-0);position:relative;overflow:hidden}._workingCircle_dgh51_152:before{block-size:calc(var(--rly-space-64) * 2);border:1px solid color-mix(in srgb, var(--entity-accent) 46%, var(--rly-color-border-1));border-radius:var(--rly-radius-round);content:"";inline-size:calc(var(--rly-space-64) * 2);pointer-events:none;z-index:-1;position:absolute;inset-block-start:calc(var(--rly-space-64) * -1);inset-inline-end:calc(var(--rly-space-48) * -1)}._shell_dgh51_174[data-service=codecommit] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codecommit)}._shell_dgh51_174[data-service=codepipeline] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codepipeline)}._shell_dgh51_174[data-service=jira] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-jira)}._shell_dgh51_174[data-service=confluence] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-confluence)}._shell_dgh51_174[data-service=clockify] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-clockify)}._activity_dgh51_18{gap:var(--rly-space-24)}._timeline_dgh51_198{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}@media (width<=44rem){._loadingColumns_dgh51_13,._facts_dgh51_16 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._pathRail_dgh51_74{scroll-behavior:auto}}._document_1cny9_1,._section_1cny9_2,._sectionHeading_1cny9_3,._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6,._related_1cny9_7,._metadata_1cny9_8,._attribution_1cny9_9{display:grid}._document_1cny9_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._section_1cny9_2{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1cny9_3{gap:var(--rly-space-4)}._richText_1cny9_28,._commentBody_1cny9_29{overflow-wrap:anywhere}._richText_1cny9_28{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);max-inline-size:58ch}._richText_1cny9_28>:first-child,._commentBody_1cny9_29>:first-child{margin-block-start:var(--rly-space-0)}._richText_1cny9_28>:last-child,._commentBody_1cny9_29>:last-child{margin-block-end:var(--rly-space-0)}._richText_1cny9_28 pre,._commentBody_1cny9_29 pre{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);max-inline-size:100%;padding:var(--rly-space-16);overflow:auto}._richText_1cny9_28 blockquote,._commentBody_1cny9_29 blockquote{border-inline-start:2px solid var(--rly-color-border-2);margin-inline:var(--rly-space-0);padding-inline-start:var(--rly-space-16)}._richText_1cny9_28 a,._commentBody_1cny9_29 a{color:var(--rly-color-service-jira)}._criteria_1cny9_70{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-jira);padding:var(--rly-space-8) var(--rly-space-24)}._boundaryNotice_1cny9_75,._collectionNotice_1cny9_76{border-radius:var(--rly-radius-field);margin:var(--rly-space-0);padding:var(--rly-space-12) var(--rly-space-16)}._boundaryNotice_1cny9_75{background:var(--rly-color-held-tint);color:var(--rly-color-held-ink)}._collectionNotice_1cny9_76{background:var(--rly-color-surface-2)}._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._people_1cny9_4{gap:var(--rly-space-20);grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}._metadata_1cny9_8{gap:var(--rly-space-0) var(--rly-space-32);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._metadata_1cny9_8>div{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-6);padding-block:var(--rly-space-16);display:grid}._metadata_1cny9_8 dt,._history_1cny9_6 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._metadata_1cny9_8 dd,._history_1cny9_6 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._related_1cny9_7{gap:var(--rly-space-12);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr))}._related_1cny9_7>div{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-control);gap:var(--rly-space-6);padding:var(--rly-space-16);display:grid}._related_1cny9_7 strong,._related_1cny9_7 a{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._related_1cny9_7 a{color:var(--rly-color-service-jira);text-underline-offset:var(--rly-space-4);inline-size:fit-content;text-decoration-thickness:1px}._related_1cny9_7 small,._attribution_1cny9_9 time{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._conversation_1cny9_5,._history_1cny9_6{gap:var(--rly-space-0)}._conversation_1cny9_5>li,._history_1cny9_6>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-16);padding-block:var(--rly-space-24);display:grid}._conversation_1cny9_5>li:first-child,._history_1cny9_6>li:first-child{padding-block-start:var(--rly-space-0)}._attribution_1cny9_9{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._history_1cny9_6 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._history_1cny9_6 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(7rem, .35fr) minmax(var(--rly-space-0), 1fr);display:grid}@media (width<=44rem){._document_1cny9_1{gap:var(--rly-space-40)}._metadata_1cny9_8,._history_1cny9_6 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._criteria_1cny9_70{padding-inline-end:var(--rly-space-0)}}
1
+ ._state_dgh51_1{outline:none;place-items:center;min-block-size:60dvh;display:grid}._state_dgh51_1>*{inline-size:min(100%,42rem)}._loading_dgh51_12,._loadingColumns_dgh51_13,._content_dgh51_14,._deliveryPath_dgh51_15,._facts_dgh51_16,._evidence_dgh51_17,._activity_dgh51_18,._sectionHeading_dgh51_19{display:grid}._loading_dgh51_12{gap:var(--rly-space-32);min-block-size:60dvh}._loadingColumns_dgh51_13{gap:var(--rly-space-24);grid-template-columns:minmax(var(--rly-space-0), 1fr) minmax(var(--rly-space-0), 20rem)}._back_dgh51_33,._principalAction_dgh51_34,._releasePath_dgh51_35 a{color:inherit;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);text-underline-offset:var(--rly-space-4)}._back_dgh51_33:focus-visible,._principalAction_dgh51_34:focus-visible,._releasePath_dgh51_35 a:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}._principalAction_dgh51_34{background:var(--rly-color-action-background);border-radius:var(--rly-radius-control);color:var(--rly-color-action-foreground);font-size:var(--rly-type-body-large-size);min-block-size:var(--rly-space-48);padding-inline:var(--rly-space-24);justify-content:center;align-items:center;text-decoration:none;display:inline-flex}._content_dgh51_14{gap:var(--rly-space-24)}._deliveryPath_dgh51_15{gap:var(--rly-space-20)}._sectionHeading_dgh51_19{gap:var(--rly-space-4)}._pathRail_dgh51_74{align-items:stretch;gap:var(--rly-space-12);min-inline-size:var(--rly-space-0);padding-block:var(--rly-space-4);display:flex;overflow-x:auto}._pathNode_dgh51_83,._pathEmpty_dgh51_84,._releasePath_dgh51_35 li{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-control);align-items:center;gap:var(--rly-space-12);min-block-size:var(--rly-space-48);padding:var(--rly-space-12) var(--rly-space-16);flex:none;display:flex}._pathNode_dgh51_83>span{gap:var(--rly-space-2);display:grid}._pathNode_dgh51_83 code,._pathEmpty_dgh51_84{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._releasePath_dgh51_35{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none;display:contents}._releasePath_dgh51_35 li:before{color:var(--rly-color-text-3);content:"→";margin-inline-end:var(--rly-space-4)}._facts_dgh51_16,._evidence_dgh51_17{gap:var(--rly-space-16)}._facts_dgh51_16 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._facts_dgh51_16 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(6rem, .65fr) minmax(var(--rly-space-0), 1fr);display:grid}._facts_dgh51_16 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._facts_dgh51_16 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._workingCircle_dgh51_152{--entity-accent:var(--rly-color-focus);isolation:isolate;min-inline-size:var(--rly-space-0);position:relative;overflow:hidden}._workingCircle_dgh51_152:before{block-size:calc(var(--rly-space-64) * 2);border:1px solid color-mix(in srgb, var(--entity-accent) 46%, var(--rly-color-border-1));border-radius:var(--rly-radius-round);content:"";inline-size:calc(var(--rly-space-64) * 2);pointer-events:none;z-index:-1;position:absolute;inset-block-start:calc(var(--rly-space-64) * -1);inset-inline-end:calc(var(--rly-space-48) * -1)}._shell_dgh51_174[data-service=codecommit] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codecommit)}._shell_dgh51_174[data-service=codepipeline] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-codepipeline)}._shell_dgh51_174[data-service=jira] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-jira)}._shell_dgh51_174[data-service=confluence] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-confluence)}._shell_dgh51_174[data-service=clockify] ._workingCircle_dgh51_152{--entity-accent:var(--rly-color-service-clockify)}._activity_dgh51_18{gap:var(--rly-space-24)}._timeline_dgh51_198{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}@media (width<=44rem){._loadingColumns_dgh51_13,._facts_dgh51_16 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (prefers-reduced-motion:reduce){._pathRail_dgh51_74{scroll-behavior:auto}}._document_1cny9_1,._section_1cny9_2,._sectionHeading_1cny9_3,._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6,._related_1cny9_7,._metadata_1cny9_8,._attribution_1cny9_9{display:grid}._document_1cny9_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._section_1cny9_2{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_1cny9_3{gap:var(--rly-space-4)}._richText_1cny9_28,._commentBody_1cny9_29{overflow-wrap:anywhere}._richText_1cny9_28{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);max-inline-size:58ch}._richText_1cny9_28>:first-child,._commentBody_1cny9_29>:first-child{margin-block-start:var(--rly-space-0)}._richText_1cny9_28>:last-child,._commentBody_1cny9_29>:last-child{margin-block-end:var(--rly-space-0)}._richText_1cny9_28 pre,._commentBody_1cny9_29 pre{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-field);max-inline-size:100%;padding:var(--rly-space-16);overflow:auto}._richText_1cny9_28 blockquote,._commentBody_1cny9_29 blockquote{border-inline-start:2px solid var(--rly-color-border-2);margin-inline:var(--rly-space-0);padding-inline-start:var(--rly-space-16)}._richText_1cny9_28 a,._commentBody_1cny9_29 a{color:var(--rly-color-service-jira)}._criteria_1cny9_70{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-jira);padding:var(--rly-space-8) var(--rly-space-24)}._boundaryNotice_1cny9_75,._collectionNotice_1cny9_76{border-radius:var(--rly-radius-field);margin:var(--rly-space-0);padding:var(--rly-space-12) var(--rly-space-16)}._boundaryNotice_1cny9_75{background:var(--rly-color-held-tint);color:var(--rly-color-held-ink)}._collectionNotice_1cny9_76{background:var(--rly-color-surface-2)}._people_1cny9_4,._conversation_1cny9_5,._history_1cny9_6{margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._people_1cny9_4{gap:var(--rly-space-20);grid-template-columns:repeat(auto-fit,minmax(13rem,1fr))}._metadata_1cny9_8{gap:var(--rly-space-0) var(--rly-space-32);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._metadata_1cny9_8>div{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-6);padding-block:var(--rly-space-16);display:grid}._metadata_1cny9_8 dt,._history_1cny9_6 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._metadata_1cny9_8 dd,._history_1cny9_6 dd{font:var(--rly-type-body-weight) var(--rly-type-body-size) / var(--rly-type-body-line-height) var(--rly-type-body-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._related_1cny9_7{gap:var(--rly-space-12);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr))}._related_1cny9_7>div{background:var(--rly-color-surface-2);border-radius:var(--rly-radius-control);gap:var(--rly-space-6);padding:var(--rly-space-16);display:grid}._related_1cny9_7 strong,._related_1cny9_7 a{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font)}._related_1cny9_7 a{color:var(--rly-color-service-jira);text-underline-offset:var(--rly-space-4);inline-size:fit-content;text-decoration-thickness:1px}._related_1cny9_7 small,._attribution_1cny9_9 time{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._conversation_1cny9_5,._history_1cny9_6{gap:var(--rly-space-0)}._conversation_1cny9_5>li,._history_1cny9_6>li{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-16);padding-block:var(--rly-space-24);display:grid}._conversation_1cny9_5>li:first-child,._history_1cny9_6>li:first-child{padding-block-start:var(--rly-space-0)}._attribution_1cny9_9{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto}._history_1cny9_6 dl{gap:var(--rly-space-12);margin:var(--rly-space-0);display:grid}._history_1cny9_6 dl>div{gap:var(--rly-space-4);grid-template-columns:minmax(7rem, .35fr) minmax(var(--rly-space-0), 1fr);display:grid}@media (width<=44rem){._document_1cny9_1{gap:var(--rly-space-40)}._metadata_1cny9_8,._history_1cny9_6 dl>div{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._criteria_1cny9_70{padding-inline-end:var(--rly-space-0)}}._document_121r2_1,._section_121r2_2,._sectionHeading_121r2_3,._revisionCard_121r2_4,._branchPair_121r2_5,._commitPair_121r2_6,._revisionMeta_121r2_7,._peopleGroups_121r2_8,._peopleGroups_121r2_8>div,._people_121r2_8,._reviewLanes_121r2_11,._reviewLanes_121r2_11>div,._deliveryCounts_121r2_13{display:grid}._document_121r2_1{gap:var(--rly-space-48);min-inline-size:var(--rly-space-0)}._revisionCard_121r2_4{background:color-mix(in srgb, var(--rly-color-service-codecommit) 9%, var(--rly-color-surface-2));border:1px solid color-mix(in srgb, var(--rly-color-service-codecommit) 42%, var(--rly-color-border-1));border-radius:var(--rly-radius-control);gap:var(--rly-space-24);padding:var(--rly-space-32);overflow:hidden}._branchPair_121r2_5{align-items:center;gap:var(--rly-space-16);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto minmax(var(--rly-space-0), 1fr)}._branchPair_121r2_5>span:not(._direction_121r2_37){gap:var(--rly-space-4);min-inline-size:var(--rly-space-0);display:grid}._branchPair_121r2_5 small,._reviewLanes_121r2_11 small,._revisionMeta_121r2_7 dt,._deliveryCounts_121r2_13 dt{color:var(--rly-color-text-2);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._branchPair_121r2_5 strong{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);overflow-wrap:anywhere}._direction_121r2_37{color:var(--rly-color-service-codecommit);font-size:var(--rly-space-32)}._commitPair_121r2_6{align-items:center;gap:var(--rly-space-8);grid-template-columns:minmax(var(--rly-space-0), 1fr) auto minmax(var(--rly-space-0), 1fr)}._commitPair_121r2_6 code{background:var(--rly-color-surface-1);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-field);font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font);padding:var(--rly-space-12);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._commitPair_121r2_6 span{color:var(--rly-color-text-3);font:var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height) var(--rly-type-meta-font)}._revisionMeta_121r2_7{gap:var(--rly-space-16) var(--rly-space-32);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._revisionMeta_121r2_7>div{gap:var(--rly-space-4);display:grid}._revisionMeta_121r2_7 dd{font:var(--rly-type-code-weight) var(--rly-type-code-size) / var(--rly-type-code-line-height) var(--rly-type-code-font);margin:var(--rly-space-0);overflow-wrap:anywhere}._section_121r2_2{border-block-start:1px solid var(--rly-color-border-1);gap:var(--rly-space-24);padding-block-start:var(--rly-space-32)}._sectionHeading_121r2_3{gap:var(--rly-space-4)}._description_121r2_115{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);overflow-wrap:anywhere;max-inline-size:58ch}._description_121r2_115>:first-child{margin-block-start:var(--rly-space-0)}._description_121r2_115>:last-child{margin-block-end:var(--rly-space-0)}._peopleGroups_121r2_8{gap:var(--rly-space-24);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr))}._peopleGroups_121r2_8>div{align-content:start;gap:var(--rly-space-12)}._people_121r2_8{gap:var(--rly-space-12);margin:var(--rly-space-0);padding:var(--rly-space-0);list-style:none}._reviewLanes_121r2_11{gap:var(--rly-space-16);grid-template-columns:repeat(2, minmax(var(--rly-space-0), 1fr))}._reviewLanes_121r2_11>div{background:var(--rly-color-surface-2);border:1px solid var(--rly-color-border-1);border-radius:var(--rly-radius-control);align-content:start;gap:var(--rly-space-12);padding:var(--rly-space-20)}._reviewLanes_121r2_11>div:first-child{border-inline-start:var(--rly-space-4) solid var(--rly-color-service-codecommit)}._reviewLanes_121r2_11 strong{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font)}._reviewLanes_121r2_11 span{color:var(--rly-color-text-2)}._reviewLanes_121r2_11 button{inline-size:fit-content}._deliveryCounts_121r2_13{gap:var(--rly-space-12);grid-template-columns:repeat(3, minmax(var(--rly-space-0), 1fr));margin:var(--rly-space-0)}._deliveryCounts_121r2_13>div{border-block-end:1px solid var(--rly-color-border-1);gap:var(--rly-space-4);padding-block-end:var(--rly-space-12);display:grid}._deliveryCounts_121r2_13 dd{font:var(--rly-type-body-large-weight) var(--rly-type-body-large-size) / var(--rly-type-body-large-line-height) var(--rly-type-body-large-font);margin:var(--rly-space-0)}._filesLink_121r2_197{border:1px solid var(--rly-color-service-codecommit);border-radius:var(--rly-radius-control);color:inherit;font:var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height) var(--rly-type-label-font);inline-size:fit-content;min-block-size:var(--rly-space-48);padding-inline:var(--rly-space-20);align-items:center;text-decoration:none;display:inline-flex}._filesLink_121r2_197:focus-visible{outline:2px solid var(--rly-color-focus);outline-offset:var(--rly-space-4)}@media (width<=52rem){._peopleGroups_121r2_8{grid-template-columns:minmax(var(--rly-space-0), 1fr)}}@media (width<=44rem){._document_121r2_1{gap:var(--rly-space-40)}._branchPair_121r2_5,._commitPair_121r2_6,._revisionMeta_121r2_7,._reviewLanes_121r2_11,._deliveryCounts_121r2_13{grid-template-columns:minmax(var(--rly-space-0), 1fr)}._direction_121r2_37{rotate:90deg}}