@knpkv/control-center 0.8.0 → 0.8.1

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 (67) hide show
  1. package/dist/client/.vite/manifest.json +66 -66
  2. package/dist/client/assets/ActiveWorkPage-DKlotZGc.js +2 -0
  3. package/dist/client/assets/{ActiveWorkPage-C6lIQfjL.js.map → ActiveWorkPage-DKlotZGc.js.map} +1 -1
  4. package/dist/client/assets/{AgentPage-DqB5BilE.js → AgentPage-Cxm1gj2C.js} +3 -3
  5. package/dist/client/assets/{AgentPage-DqB5BilE.js.map → AgentPage-Cxm1gj2C.js.map} +1 -1
  6. package/dist/client/assets/{AtlassianOAuthCallbackPage-DzTO6SqN.js → AtlassianOAuthCallbackPage-fEFUJE2g.js} +2 -2
  7. package/dist/client/assets/{AtlassianOAuthCallbackPage-DzTO6SqN.js.map → AtlassianOAuthCallbackPage-fEFUJE2g.js.map} +1 -1
  8. package/dist/client/assets/{AuthorizedSharePage-V_E5giT7.js → AuthorizedSharePage-Dh7Y_gmJ.js} +2 -2
  9. package/dist/client/assets/{AuthorizedSharePage-V_E5giT7.js.map → AuthorizedSharePage-Dh7Y_gmJ.js.map} +1 -1
  10. package/dist/client/assets/{BrowserSessionHydrator-CEypgMkR.js → BrowserSessionHydrator-DkomS8Yl.js} +2 -2
  11. package/dist/client/assets/{BrowserSessionHydrator-CEypgMkR.js.map → BrowserSessionHydrator-DkomS8Yl.js.map} +1 -1
  12. package/dist/client/assets/{CommandSearch-syQMt_rx.js → CommandSearch-nf16HEqz.js} +2 -2
  13. package/dist/client/assets/{CommandSearch-syQMt_rx.js.map → CommandSearch-nf16HEqz.js.map} +1 -1
  14. package/dist/client/assets/{ItemsPage-Cr3--iJc.js → ItemsPage-Bok8Vpy4.js} +2 -2
  15. package/dist/client/assets/{ItemsPage-Cr3--iJc.js.map → ItemsPage-Bok8Vpy4.js.map} +1 -1
  16. package/dist/client/assets/{OpenPullRequestPage-BYoRmtui.js → OpenPullRequestPage-DdL7PhKZ.js} +2 -2
  17. package/dist/client/assets/{OpenPullRequestPage-BYoRmtui.js.map → OpenPullRequestPage-DdL7PhKZ.js.map} +1 -1
  18. package/dist/client/assets/{PairPage-ByOBKuBB.js → PairPage-BCtzYqK6.js} +2 -2
  19. package/dist/client/assets/{PairPage-ByOBKuBB.js.map → PairPage-BCtzYqK6.js.map} +1 -1
  20. package/dist/client/assets/{PortfolioOverview-BacOXO-c.js → PortfolioOverview-C-jqvYgQ.js} +2 -2
  21. package/dist/client/assets/{PortfolioOverview-BacOXO-c.js.map → PortfolioOverview-C-jqvYgQ.js.map} +1 -1
  22. package/dist/client/assets/{ReleaseRoute-C-MfQKnL.js → ReleaseRoute-cuvP4ug5.js} +2 -2
  23. package/dist/client/assets/{ReleaseRoute-C-MfQKnL.js.map → ReleaseRoute-cuvP4ug5.js.map} +1 -1
  24. package/dist/client/assets/{ReleaseWorkset-MV3I0HCi.js → ReleaseWorkset-DImwmjS3.js} +2 -2
  25. package/dist/client/assets/{ReleaseWorkset-MV3I0HCi.js.map → ReleaseWorkset-DImwmjS3.js.map} +1 -1
  26. package/dist/client/assets/{ServicesPage-BjeCOlsh.js → ServicesPage-CrM8R820.js} +2 -2
  27. package/dist/client/assets/{ServicesPage-BjeCOlsh.js.map → ServicesPage-CrM8R820.js.map} +1 -1
  28. package/dist/client/assets/{TimelinePage-Ccnp6Mmg.js → TimelinePage-FrvepGa_.js} +2 -2
  29. package/dist/client/assets/{TimelinePage-Ccnp6Mmg.js.map → TimelinePage-FrvepGa_.js.map} +1 -1
  30. package/dist/client/assets/{WorkspaceEntityLink-D3TXDcD0.js → WorkspaceEntityLink-CAj42f02.js} +2 -2
  31. package/dist/client/assets/{WorkspaceEntityLink-D3TXDcD0.js.map → WorkspaceEntityLink-CAj42f02.js.map} +1 -1
  32. package/dist/client/assets/WorkspaceEntityRoute-rQ9ccetx.js +14 -0
  33. package/dist/client/assets/{WorkspaceEntityRoute-uUK6vwM_.js.map → WorkspaceEntityRoute-rQ9ccetx.js.map} +1 -1
  34. package/dist/client/assets/WorkspaceHomeLink-ObQ3AQVw.js +2 -0
  35. package/dist/client/assets/{WorkspaceHomeLink-D5SdEgJJ.js.map → WorkspaceHomeLink-ObQ3AQVw.js.map} +1 -1
  36. package/dist/client/assets/{WorkspacePullRequestDetails-CKedGIT8.js → WorkspacePullRequestDetails-BhxoqR7V.js} +2 -2
  37. package/dist/client/assets/{WorkspacePullRequestDetails-CKedGIT8.js.map → WorkspacePullRequestDetails-BhxoqR7V.js.map} +1 -1
  38. package/dist/client/assets/{WorkspaceReleaseLayout-Bdvl0q99.js → WorkspaceReleaseLayout-BWL66Fff.js} +2 -2
  39. package/dist/client/assets/{WorkspaceReleaseLayout-Bdvl0q99.js.map → WorkspaceReleaseLayout-BWL66Fff.js.map} +1 -1
  40. package/dist/client/assets/{WorkspaceSettingsPage-BxFq65Vf.js → WorkspaceSettingsPage-DutfiGPe.js} +2 -2
  41. package/dist/client/assets/{WorkspaceSettingsPage-BxFq65Vf.js.map → WorkspaceSettingsPage-DutfiGPe.js.map} +1 -1
  42. package/dist/client/assets/{controlCenterRelayDock-D7375HPG.js → controlCenterRelayDock-CyYeXh75.js} +3 -3
  43. package/dist/client/assets/{controlCenterRelayDock-D7375HPG.js.map → controlCenterRelayDock-CyYeXh75.js.map} +1 -1
  44. package/dist/client/assets/{controlCenterRelayDockChrome-B7jSUI3t.js → controlCenterRelayDockChrome-upgtq649.js} +2 -2
  45. package/dist/client/assets/{controlCenterRelayDockChrome-B7jSUI3t.js.map → controlCenterRelayDockChrome-upgtq649.js.map} +1 -1
  46. package/dist/client/assets/{index-BVikncBH.js → index-kmYFvwT0.js} +3 -3
  47. package/dist/client/assets/{index-BVikncBH.js.map → index-kmYFvwT0.js.map} +1 -1
  48. package/dist/client/assets/patterns-DuFUSnJW.js +2 -0
  49. package/dist/client/assets/patterns-DuFUSnJW.js.map +1 -0
  50. package/dist/client/assets/{useWorkspaceDefaultLanding-DMWfrZfF.js → useWorkspaceDefaultLanding-BmaR7aTj.js} +2 -2
  51. package/dist/client/assets/{useWorkspaceDefaultLanding-DMWfrZfF.js.map → useWorkspaceDefaultLanding-BmaR7aTj.js.map} +1 -1
  52. package/dist/client/assets/{workspaceEntityRoutes-BJ-SC0Jd.js → workspaceEntityRoutes-BHccxrFj.js} +2 -2
  53. package/dist/client/assets/{workspaceEntityRoutes-BJ-SC0Jd.js.map → workspaceEntityRoutes-BHccxrFj.js.map} +1 -1
  54. package/dist/client/assets/{workspaceScrollCapture-CwBIBHg8.js → workspaceScrollCapture-BzsNJoL7.js} +2 -2
  55. package/dist/client/assets/{workspaceScrollCapture-CwBIBHg8.js.map → workspaceScrollCapture-BzsNJoL7.js.map} +1 -1
  56. package/dist/client/index.html +1 -1
  57. package/dist/server/assets/{BindConfig-D8aIjI_R.js → BindConfig-BG-FGtB5.js} +13 -4
  58. package/dist/server/assets/BindConfig-BG-FGtB5.js.map +1 -0
  59. package/dist/server/server/cli.js +1 -1
  60. package/dist/server/server/index.js +1 -1
  61. package/package.json +5 -5
  62. package/dist/client/assets/ActiveWorkPage-C6lIQfjL.js +0 -2
  63. package/dist/client/assets/WorkspaceEntityRoute-uUK6vwM_.js +0 -14
  64. package/dist/client/assets/WorkspaceHomeLink-D5SdEgJJ.js +0 -2
  65. package/dist/client/assets/patterns-DAeEdyxU.js +0 -2
  66. package/dist/client/assets/patterns-DAeEdyxU.js.map +0 -1
  67. package/dist/server/assets/BindConfig-D8aIjI_R.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"mappings":";0VAUM,EAAiB,EAAmB,sBAAsB,EAGnD,GACX,EACA,IAEA,IAAmB,cACf,EAAwB,CAAW,EACnC,EAAkB,CAAW,EAS7B,EAA4E,CAChF,KAAM,KAAO,IAAW,CACtB,GAAM,CAAE,2DAAF,IAAE,yCAA0C,MAAM,OACtD,6HAEF,OAAO,EAAsC,KAAK,CAAM,CAC1D,CACF,EAGa,GACX,EACA,EAA4C,IAC1B,CAClB,GAAM,CAAE,oBAAmB,MAAO,GAAmB,EAAkB,EACjE,EAAqB,EAA0B,CAAc,EAC7D,EAAqB,EAAe,OAAS,iBAC/C,EAAe,OAAS,sBACxB,EAAe,SAAS,aAAe,KACvC,KACE,EAAa,IAAgB,MAAQ,IAAuB,EAC9D,EACA,KACE,CAAC,EAAQ,MAAa,YAA+B,IAAI,EA0E/D,OAxEA,mBACE,EAAgC,GAAa,CAEzC,IAAgB,MAChB,IAAe,MACf,EAAS,cAAgB,GAE3B,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,GACxB,EAAQ,SAAW,EAAS,SACrB,EACF,CACL,KAAM,EACJ,EACA,EAAS,aAAa,cACxB,EACA,SAAU,EAAS,SACnB,aACA,aACF,CACD,CACH,CAAC,EAAG,CAAC,EAAY,CAAW,CAAC,GAE/B,mBAAgB,CACd,GAAI,IAAgB,MAAQ,IAAe,KAAM,CAC/C,EAAU,IAAI,EACd,MACF,CACA,IAAM,EAAU,IAAI,gBAuCpB,OAtCA,EAAU,KAAK,EAAQ,MAAM,CAAC,CAAC,KAC5B,GAAa,CACR,EAAQ,OAAO,SAAW,EAAS,cAAgB,IACvD,EAA6B,CAAQ,EACrC,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,GACxB,EAAQ,SAAW,EAAS,SACrB,EACF,CACL,KAAM,EACJ,EACA,EAAS,aAAa,cACxB,EACA,SAAU,EAAS,SACnB,aACA,aACF,CACD,EACH,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAe,CAAO,GAAG,EAAkB,CAAU,EACzD,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,EACjB,EACF,CACL,KAAM,EAAkB,CAAW,EACnC,SAAU,EACV,aACA,aACF,CACD,EACH,CACF,MACa,EAAQ,MAAM,CAC7B,EAAG,CAAC,EAAmB,EAAY,EAAW,CAAW,CAAC,EAEnD,GAAQ,aAAe,GAAc,EAAO,cAAgB,EAC/D,EAAO,KACP,IACN","names":[],"ignoreList":[],"sources":["../../../src/client/settings/useWorkspaceDefaultLanding.ts"],"sourcesContent":["import * as Predicate from \"effect/Predicate\"\nimport { useEffect, useState } from \"react\"\n\nimport type { WorkspacePresentationReadModel } from \"../../api/workspaceSettings.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { releaseParentPath, workspaceActiveWorkPath } from \"../releases/releaseRoutes.js\"\nimport { publishWorkspacePresentation, subscribeWorkspacePresentation } from \"./workspaceSettingsSignals.js\"\nimport type { WorkspacePresentationTransport } from \"./workspaceSettingsTransport.js\"\n\nconst isUnauthorized = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Resolve the configured home destination without redirecting deep links. */\nexport const workspaceDefaultLandingPath = (\n workspaceId: WorkspaceId,\n defaultLanding: WorkspacePresentationReadModel[\"presentation\"][\"defaultLanding\"]\n): string =>\n defaultLanding === \"active-work\"\n ? workspaceActiveWorkPath(workspaceId)\n : releaseParentPath(workspaceId)\n\ninterface LoadedLanding {\n readonly path: string\n readonly revision: number\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n}\n\nconst lazyBrowserWorkspacePresentationTransport: WorkspacePresentationTransport = {\n load: async (signal) => {\n const { browserWorkspacePresentationTransport } = await import(\n \"./workspaceSettingsTransport.js\"\n )\n return browserWorkspacePresentationTransport.load(signal)\n }\n}\n\n/** Read one workspace's server-owned home destination for brand and root navigation. */\nexport const useWorkspaceDefaultLandingPath = (\n workspaceId: WorkspaceId | null,\n transport: WorkspacePresentationTransport = lazyBrowserWorkspacePresentationTransport\n): string | null => {\n const { invalidateSession, state: browserSession } = useBrowserSession()\n const readableSessionKey = browserReadableSessionKey(browserSession)\n const browserWorkspaceId = browserSession._tag === \"authenticated\" ||\n browserSession._tag === \"storage-unavailable\"\n ? browserSession.session?.workspaceId ?? null\n : null\n const sessionKey = workspaceId !== null && browserWorkspaceId === workspaceId\n ? readableSessionKey\n : null\n const [loaded, setLoaded] = useState<LoadedLanding | null>(null)\n\n useEffect(() =>\n subscribeWorkspacePresentation((settings) => {\n if (\n workspaceId === null ||\n sessionKey === null ||\n settings.workspaceId !== workspaceId\n ) return\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId &&\n current.revision > settings.revision\n ) return current\n return {\n path: workspaceDefaultLandingPath(\n workspaceId,\n settings.presentation.defaultLanding\n ),\n revision: settings.revision,\n sessionKey,\n workspaceId\n }\n })\n }), [sessionKey, workspaceId])\n\n useEffect(() => {\n if (workspaceId === null || sessionKey === null) {\n setLoaded(null)\n return\n }\n const request = new AbortController()\n transport.load(request.signal).then(\n (settings) => {\n if (request.signal.aborted || settings.workspaceId !== workspaceId) return\n publishWorkspacePresentation(settings)\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId &&\n current.revision > settings.revision\n ) return current\n return {\n path: workspaceDefaultLandingPath(\n workspaceId,\n settings.presentation.defaultLanding\n ),\n revision: settings.revision,\n sessionKey,\n workspaceId\n }\n })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure)) invalidateSession(sessionKey)\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId\n ) return current\n return {\n path: releaseParentPath(workspaceId),\n revision: 0,\n sessionKey,\n workspaceId\n }\n })\n }\n )\n return () => request.abort()\n }, [invalidateSession, sessionKey, transport, workspaceId])\n\n return loaded?.sessionKey === sessionKey && loaded.workspaceId === workspaceId\n ? loaded.path\n : null\n}\n"],"file":"useWorkspaceDefaultLanding-DMWfrZfF.js"}
1
+ {"version":3,"mappings":";0VAUM,EAAiB,EAAmB,sBAAsB,EAGnD,GACX,EACA,IAEA,IAAmB,cACf,EAAwB,CAAW,EACnC,EAAkB,CAAW,EAS7B,EAA4E,CAChF,KAAM,KAAO,IAAW,CACtB,GAAM,CAAE,2DAAF,IAAE,yCAA0C,MAAM,OACtD,6HAEF,OAAO,EAAsC,KAAK,CAAM,CAC1D,CACF,EAGa,GACX,EACA,EAA4C,IAC1B,CAClB,GAAM,CAAE,oBAAmB,MAAO,GAAmB,EAAkB,EACjE,EAAqB,EAA0B,CAAc,EAC7D,EAAqB,EAAe,OAAS,iBAC/C,EAAe,OAAS,sBACxB,EAAe,SAAS,aAAe,KACvC,KACE,EAAa,IAAgB,MAAQ,IAAuB,EAC9D,EACA,KACE,CAAC,EAAQ,MAAa,YAA+B,IAAI,EA0E/D,OAxEA,mBACE,EAAgC,GAAa,CAEzC,IAAgB,MAChB,IAAe,MACf,EAAS,cAAgB,GAE3B,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,GACxB,EAAQ,SAAW,EAAS,SACrB,EACF,CACL,KAAM,EACJ,EACA,EAAS,aAAa,cACxB,EACA,SAAU,EAAS,SACnB,aACA,aACF,CACD,CACH,CAAC,EAAG,CAAC,EAAY,CAAW,CAAC,GAE/B,mBAAgB,CACd,GAAI,IAAgB,MAAQ,IAAe,KAAM,CAC/C,EAAU,IAAI,EACd,MACF,CACA,IAAM,EAAU,IAAI,gBAuCpB,OAtCA,EAAU,KAAK,EAAQ,MAAM,CAAC,CAAC,KAC5B,GAAa,CACR,EAAQ,OAAO,SAAW,EAAS,cAAgB,IACvD,EAA6B,CAAQ,EACrC,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,GACxB,EAAQ,SAAW,EAAS,SACrB,EACF,CACL,KAAM,EACJ,EACA,EAAS,aAAa,cACxB,EACA,SAAU,EAAS,SACnB,aACA,aACF,CACD,EACH,EACC,GAAY,CACP,EAAQ,OAAO,UACf,EAAe,CAAO,GAAG,EAAkB,CAAU,EACzD,EAAW,GAEP,GAAS,aAAe,GACxB,EAAQ,cAAgB,EACjB,EACF,CACL,KAAM,EAAkB,CAAW,EACnC,SAAU,EACV,aACA,aACF,CACD,EACH,CACF,MACa,EAAQ,MAAM,CAC7B,EAAG,CAAC,EAAmB,EAAY,EAAW,CAAW,CAAC,EAEnD,GAAQ,aAAe,GAAc,EAAO,cAAgB,EAC/D,EAAO,KACP,IACN","names":[],"ignoreList":[],"sources":["../../../src/client/settings/useWorkspaceDefaultLanding.ts"],"sourcesContent":["import * as Predicate from \"effect/Predicate\"\nimport { useEffect, useState } from \"react\"\n\nimport type { WorkspacePresentationReadModel } from \"../../api/workspaceSettings.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { releaseParentPath, workspaceActiveWorkPath } from \"../releases/releaseRoutes.js\"\nimport { publishWorkspacePresentation, subscribeWorkspacePresentation } from \"./workspaceSettingsSignals.js\"\nimport type { WorkspacePresentationTransport } from \"./workspaceSettingsTransport.js\"\n\nconst isUnauthorized = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Resolve the configured home destination without redirecting deep links. */\nexport const workspaceDefaultLandingPath = (\n workspaceId: WorkspaceId,\n defaultLanding: WorkspacePresentationReadModel[\"presentation\"][\"defaultLanding\"]\n): string =>\n defaultLanding === \"active-work\"\n ? workspaceActiveWorkPath(workspaceId)\n : releaseParentPath(workspaceId)\n\ninterface LoadedLanding {\n readonly path: string\n readonly revision: number\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n}\n\nconst lazyBrowserWorkspacePresentationTransport: WorkspacePresentationTransport = {\n load: async (signal) => {\n const { browserWorkspacePresentationTransport } = await import(\n \"./workspaceSettingsTransport.js\"\n )\n return browserWorkspacePresentationTransport.load(signal)\n }\n}\n\n/** Read one workspace's server-owned home destination for brand and root navigation. */\nexport const useWorkspaceDefaultLandingPath = (\n workspaceId: WorkspaceId | null,\n transport: WorkspacePresentationTransport = lazyBrowserWorkspacePresentationTransport\n): string | null => {\n const { invalidateSession, state: browserSession } = useBrowserSession()\n const readableSessionKey = browserReadableSessionKey(browserSession)\n const browserWorkspaceId = browserSession._tag === \"authenticated\" ||\n browserSession._tag === \"storage-unavailable\"\n ? browserSession.session?.workspaceId ?? null\n : null\n const sessionKey = workspaceId !== null && browserWorkspaceId === workspaceId\n ? readableSessionKey\n : null\n const [loaded, setLoaded] = useState<LoadedLanding | null>(null)\n\n useEffect(() =>\n subscribeWorkspacePresentation((settings) => {\n if (\n workspaceId === null ||\n sessionKey === null ||\n settings.workspaceId !== workspaceId\n ) return\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId &&\n current.revision > settings.revision\n ) return current\n return {\n path: workspaceDefaultLandingPath(\n workspaceId,\n settings.presentation.defaultLanding\n ),\n revision: settings.revision,\n sessionKey,\n workspaceId\n }\n })\n }), [sessionKey, workspaceId])\n\n useEffect(() => {\n if (workspaceId === null || sessionKey === null) {\n setLoaded(null)\n return\n }\n const request = new AbortController()\n transport.load(request.signal).then(\n (settings) => {\n if (request.signal.aborted || settings.workspaceId !== workspaceId) return\n publishWorkspacePresentation(settings)\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId &&\n current.revision > settings.revision\n ) return current\n return {\n path: workspaceDefaultLandingPath(\n workspaceId,\n settings.presentation.defaultLanding\n ),\n revision: settings.revision,\n sessionKey,\n workspaceId\n }\n })\n },\n (failure) => {\n if (request.signal.aborted) return\n if (isUnauthorized(failure)) invalidateSession(sessionKey)\n setLoaded((current) => {\n if (\n current?.sessionKey === sessionKey &&\n current.workspaceId === workspaceId\n ) return current\n return {\n path: releaseParentPath(workspaceId),\n revision: 0,\n sessionKey,\n workspaceId\n }\n })\n }\n )\n return () => request.abort()\n }, [invalidateSession, sessionKey, transport, workspaceId])\n\n return loaded?.sessionKey === sessionKey && loaded.workspaceId === workspaceId\n ? loaded.path\n : null\n}\n"],"file":"useWorkspaceDefaultLanding-BmaR7aTj.js"}
@@ -1,2 +1,2 @@
1
- import{l as e,u as t}from"./index-BVikncBH.js";import{$t as n,Aa as r,Bn as i,Ln as a,Pn as o,dn as s,ja as c,mn as l,nr as u,zn as d}from"./agent-api-CUWP1qs8.js";import{t as f,u as p}from"./releaseRoutes-h4FVwFvJ.js";import{t as m}from"./workspaceEntityPaths-xAl2jRFm.js";var h=i({hash:d,pathname:d,search:d,state:a(f)}),g=i({entityOrigin:i({_tag:o(`entity-origin/v2`),entityId:n,origin:h,workspaceId:l})}),_=e=>{if(e.includes(`?`)||e.includes(`#`))return null;let t=e.split(`/`);if(t.length!==5||t[0]!==``||t[1]!==`w`||t[3]!==`items`)return null;let r=u(l)(t[2]),i=u(n)(t[4]);return c(r)&&c(i)?{entityId:i.value,workspaceId:r.value}:null},v=e=>{let t=u(n)(e);return c(t)?t.value:null},y=e=>({hash:``,pathname:m(e),search:``,state:null}),b=e=>e.length<=2048&&(e.length===0||e.startsWith(`?`)),x=e=>e.length<=1024&&(e.length===0||e.startsWith(`#`)),S=(e,t)=>{if(e.length!==5&&e.length!==6||e[0]!==``||e[1]!==`w`||e[2]!==t||e[3]!==`releases`)return null;let n=u(s)(e[4]);return r(n)||e.length===6&&e[5]!==`preview`?null:{releaseId:n.value,workspaceId:t}},C=(e,t)=>{if(e.length>2048)return!1;let n=e.split(`/`);return n[0]!==``||n[1]!==`w`||n[2]!==t?!1:n.length===4?[`overview`,`work`,`items`,`timeline`].includes(n[3]??``):S(n,t)!==null},w=({hash:e,pathname:t,search:n,state:r})=>{let i=u(l)(t.split(`/`)[2]),a=c(i)?S(t.split(`/`),i.value):null;return{hash:e,pathname:t,search:n,state:a===null?null:p(r,a.workspaceId,a.releaseId)}},T=(e,t)=>{if(!C(e.pathname,t)||!b(e.search)||!x(e.hash))return!1;if(e.state===null)return!0;let n=S(e.pathname.split(`/`),t);return n!==null&&p(e.state,t,n.releaseId)!==null},E=(e,t)=>{let n=u(g)(e);if(r(n))return null;let i=n.value.entityOrigin;return i.workspaceId===t&&T(i.origin,t)?i.origin:null},D=(e,t,n,r)=>({entityOrigin:{_tag:`entity-origin/v2`,entityId:n,origin:E(e,t)??(T(r,t)?r:y(t)),workspaceId:t}}),O=(e,t,n)=>{let i=y(t),a=u(g)(e);if(r(a))return{isStored:!1,origin:i};let o=a.value.entityOrigin;return o.workspaceId===t&&o.entityId===n&&T(o.origin,t)?{isStored:!0,origin:o.origin}:{isStored:!1,origin:i}},k=({hash:e,pathname:t,search:n})=>`${t}${n}${e}`,A=(n,r,i,a,o)=>{let s=S(n.pathname.split(`/`),r),c=a.canonicalReleaseId,l=s===null?a.releaseMembershipsTruncated||a.releaseIds.length!==1||a.releaseIds[0]!==c||c===null||!o.has(c)?null:c:!a.releaseMembershipsTruncated&&a.releaseIds.includes(s.releaseId)&&o.has(s.releaseId)?s.releaseId:null;if(l!==null)return t(r,l,i.pathname);let u=_(i.pathname);if(u===null||u.workspaceId!==r)return e(i.pathname,i.search,i.hash);let d=new URLSearchParams(n.pathname===m(r)?n.search:``);return d.set(`object`,u.entityId),e(m(r),`?${d.toString()}`,`#item-details`)};export{A as a,O as i,w as n,k as o,D as r,_ as s,v as t};
2
- //# sourceMappingURL=workspaceEntityRoutes-BJ-SC0Jd.js.map
1
+ import{l as e,u as t}from"./index-kmYFvwT0.js";import{$t as n,Aa as r,Bn as i,Ln as a,Pn as o,dn as s,ja as c,mn as l,nr as u,zn as d}from"./agent-api-CUWP1qs8.js";import{t as f,u as p}from"./releaseRoutes-h4FVwFvJ.js";import{t as m}from"./workspaceEntityPaths-xAl2jRFm.js";var h=i({hash:d,pathname:d,search:d,state:a(f)}),g=i({entityOrigin:i({_tag:o(`entity-origin/v2`),entityId:n,origin:h,workspaceId:l})}),_=e=>{if(e.includes(`?`)||e.includes(`#`))return null;let t=e.split(`/`);if(t.length!==5||t[0]!==``||t[1]!==`w`||t[3]!==`items`)return null;let r=u(l)(t[2]),i=u(n)(t[4]);return c(r)&&c(i)?{entityId:i.value,workspaceId:r.value}:null},v=e=>{let t=u(n)(e);return c(t)?t.value:null},y=e=>({hash:``,pathname:m(e),search:``,state:null}),b=e=>e.length<=2048&&(e.length===0||e.startsWith(`?`)),x=e=>e.length<=1024&&(e.length===0||e.startsWith(`#`)),S=(e,t)=>{if(e.length!==5&&e.length!==6||e[0]!==``||e[1]!==`w`||e[2]!==t||e[3]!==`releases`)return null;let n=u(s)(e[4]);return r(n)||e.length===6&&e[5]!==`preview`?null:{releaseId:n.value,workspaceId:t}},C=(e,t)=>{if(e.length>2048)return!1;let n=e.split(`/`);return n[0]!==``||n[1]!==`w`||n[2]!==t?!1:n.length===4?[`overview`,`work`,`items`,`timeline`].includes(n[3]??``):S(n,t)!==null},w=({hash:e,pathname:t,search:n,state:r})=>{let i=u(l)(t.split(`/`)[2]),a=c(i)?S(t.split(`/`),i.value):null;return{hash:e,pathname:t,search:n,state:a===null?null:p(r,a.workspaceId,a.releaseId)}},T=(e,t)=>{if(!C(e.pathname,t)||!b(e.search)||!x(e.hash))return!1;if(e.state===null)return!0;let n=S(e.pathname.split(`/`),t);return n!==null&&p(e.state,t,n.releaseId)!==null},E=(e,t)=>{let n=u(g)(e);if(r(n))return null;let i=n.value.entityOrigin;return i.workspaceId===t&&T(i.origin,t)?i.origin:null},D=(e,t,n,r)=>({entityOrigin:{_tag:`entity-origin/v2`,entityId:n,origin:E(e,t)??(T(r,t)?r:y(t)),workspaceId:t}}),O=(e,t,n)=>{let i=y(t),a=u(g)(e);if(r(a))return{isStored:!1,origin:i};let o=a.value.entityOrigin;return o.workspaceId===t&&o.entityId===n&&T(o.origin,t)?{isStored:!0,origin:o.origin}:{isStored:!1,origin:i}},k=({hash:e,pathname:t,search:n})=>`${t}${n}${e}`,A=(n,r,i,a,o)=>{let s=S(n.pathname.split(`/`),r),c=a.canonicalReleaseId,l=s===null?a.releaseMembershipsTruncated||a.releaseIds.length!==1||a.releaseIds[0]!==c||c===null||!o.has(c)?null:c:!a.releaseMembershipsTruncated&&a.releaseIds.includes(s.releaseId)&&o.has(s.releaseId)?s.releaseId:null;if(l!==null)return t(r,l,i.pathname);let u=_(i.pathname);if(u===null||u.workspaceId!==r)return e(i.pathname,i.search,i.hash);let d=new URLSearchParams(n.pathname===m(r)?n.search:``);return d.set(`object`,u.entityId),e(m(r),`?${d.toString()}`,`#item-details`)};export{A as a,O as i,w as n,k as o,D as r,_ as s,v as t};
2
+ //# sourceMappingURL=workspaceEntityRoutes-BHccxrFj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceEntityRoutes-BJ-SC0Jd.js","names":[],"sources":["../../../src/client/items/workspaceEntityRoutes.ts"],"sourcesContent":["import * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n ReleaseId,\n type ReleaseId as ReleaseIdType,\n WorkspaceId,\n type WorkspaceId as WorkspaceIdType\n} from \"../../domain/identifiers.js\"\nimport { contextualAgentPath, contextualReleaseAgentPath } from \"../contextualAgentPath.js\"\nimport { releaseAgentPath } from \"../releases/releasePaths.js\"\nimport { type ReleaseRouteState, ReleaseRouteStateSchema, retainReleaseRouteState } from \"../releases/releaseRoutes.js\"\nimport { workspaceEntityParentPath } from \"../workspaceEntityPaths.js\"\n\nexport { workspaceEntityParentPath, workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\n/** Exact in-application location preserved while a canonical entity route is open. */\nexport interface WorkspaceEntityOrigin {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: ReleaseRouteState | null\n}\n\n/** Versioned, bounded router state for one canonical entity activation. */\nexport interface WorkspaceEntityRouteState {\n readonly entityOrigin: {\n readonly _tag: \"entity-origin/v2\"\n readonly entityId: EntityIdType\n readonly origin: WorkspaceEntityOrigin\n readonly workspaceId: WorkspaceIdType\n }\n}\n\n/** Decoded entity origin plus whether it came from trusted matching history state. */\nexport interface ResolvedWorkspaceEntityOrigin {\n readonly isStored: boolean\n readonly origin: WorkspaceEntityOrigin\n}\n\n/** Decoded target of one exact canonical workspace entity href. */\nexport interface WorkspaceEntityTarget {\n readonly entityId: EntityIdType\n readonly workspaceId: WorkspaceIdType\n}\n\n/** Release membership evidence used to select an unambiguous entity-owned agent thread. */\nexport interface WorkspaceEntityReleaseContext {\n readonly canonicalReleaseId: ReleaseIdType | null\n readonly releaseIds: ReadonlyArray<ReleaseIdType>\n readonly releaseMembershipsTruncated: boolean\n}\n\ninterface LocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state?: unknown\n}\n\nconst WorkspaceEntityOriginSchema = Schema.Struct({\n hash: Schema.String,\n pathname: Schema.String,\n search: Schema.String,\n state: Schema.NullOr(ReleaseRouteStateSchema)\n})\n\nconst WorkspaceEntityRouteStateSchema = Schema.Struct({\n entityOrigin: Schema.Struct({\n _tag: Schema.Literal(\"entity-origin/v2\"),\n entityId: EntityId,\n origin: WorkspaceEntityOriginSchema,\n workspaceId: WorkspaceId\n })\n})\n\n/** Decode only an exact canonical entity path, rejecting query, hash, and extra path material. */\nexport const workspaceEntityTargetFromHref = (href: string): WorkspaceEntityTarget | null => {\n if (href.includes(\"?\") || href.includes(\"#\")) return null\n const parts = href.split(\"/\")\n if (parts.length !== 5 || parts[0] !== \"\" || parts[1] !== \"w\" || parts[3] !== \"items\") return null\n const workspaceId = Schema.decodeUnknownOption(WorkspaceId)(parts[2])\n const entityId = Schema.decodeUnknownOption(EntityId)(parts[4])\n return Option.isSome(workspaceId) && Option.isSome(entityId)\n ? { entityId: entityId.value, workspaceId: workspaceId.value }\n : null\n}\n\n/** Decode one entity route segment at the browser boundary. */\nexport const decodeEntityRouteId = <UnparsedInput>(value: UnparsedInput): EntityIdType | null => {\n const decoded = Schema.decodeUnknownOption(EntityId)(value)\n return Option.isSome(decoded) ? decoded.value : null\n}\n\nconst fallbackOrigin = (workspaceId: WorkspaceIdType): WorkspaceEntityOrigin => ({\n hash: \"\",\n pathname: workspaceEntityParentPath(workspaceId),\n search: \"\",\n state: null\n})\n\nconst isSearch = (search: string): boolean => search.length <= 2_048 && (search.length === 0 || search.startsWith(\"?\"))\n\nconst isHash = (hash: string): boolean => hash.length <= 1_024 && (hash.length === 0 || hash.startsWith(\"#\"))\n\nconst releaseOriginTarget = (\n parts: ReadonlyArray<string>,\n workspaceId: WorkspaceIdType\n): { readonly releaseId: ReleaseIdType; readonly workspaceId: WorkspaceIdType } | null => {\n if (parts.length !== 5 && parts.length !== 6) return null\n if (parts[0] !== \"\" || parts[1] !== \"w\" || parts[2] !== workspaceId || parts[3] !== \"releases\") return null\n const releaseId = Schema.decodeUnknownOption(ReleaseId)(parts[4])\n if (Option.isNone(releaseId) || (parts.length === 6 && parts[5] !== \"preview\")) return null\n return { releaseId: releaseId.value, workspaceId }\n}\n\nconst isRecognizedOriginPath = (pathname: string, workspaceId: WorkspaceIdType): boolean => {\n if (pathname.length > 2_048) return false\n const parts = pathname.split(\"/\")\n if (parts[0] !== \"\" || parts[1] !== \"w\" || parts[2] !== workspaceId) return false\n if (parts.length === 4) return [\"overview\", \"work\", \"items\", \"timeline\"].includes(parts[3] ?? \"\")\n return releaseOriginTarget(parts, workspaceId) !== null\n}\n\n/** Capture an exact location while retaining only matching, bounded release origin state. */\nexport const entityOriginFromLocation = ({\n hash,\n pathname,\n search,\n state\n}: LocationParts): WorkspaceEntityOrigin => {\n const workspaceId = Schema.decodeUnknownOption(WorkspaceId)(pathname.split(\"/\")[2])\n const target = Option.isSome(workspaceId) ? releaseOriginTarget(pathname.split(\"/\"), workspaceId.value) : null\n return {\n hash,\n pathname,\n search,\n state: target === null ? null : retainReleaseRouteState(state, target.workspaceId, target.releaseId)\n }\n}\n\n/** Confirm an origin is bounded and belongs to a supported page in the exact workspace. */\nexport const isSafeWorkspaceEntityOrigin = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType\n): boolean => {\n if (!isRecognizedOriginPath(origin.pathname, workspaceId) || !isSearch(origin.search) || !isHash(origin.hash)) {\n return false\n }\n if (origin.state === null) return true\n const target = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n return target !== null && retainReleaseRouteState(origin.state, workspaceId, target.releaseId) !== null\n}\n\nconst reusableStoredOrigin = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType\n): WorkspaceEntityOrigin | null => {\n const decoded = Schema.decodeUnknownOption(WorkspaceEntityRouteStateSchema)(state)\n if (Option.isNone(decoded)) return null\n const marker = decoded.value.entityOrigin\n return marker.workspaceId === workspaceId && isSafeWorkspaceEntityOrigin(marker.origin, workspaceId)\n ? marker.origin\n : null\n}\n\n/**\n * Construct bounded entity route state.\n *\n * A previously validated entity origin is carried through related-entity navigation so the\n * shell's explicit Back action still returns to the root activation surface.\n */\nexport const makeWorkspaceEntityRouteState = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType,\n entityId: EntityIdType,\n origin: WorkspaceEntityOrigin\n): WorkspaceEntityRouteState => ({\n entityOrigin: {\n _tag: \"entity-origin/v2\",\n entityId,\n origin: reusableStoredOrigin(state, workspaceId) ??\n (isSafeWorkspaceEntityOrigin(origin, workspaceId) ? origin : fallbackOrigin(workspaceId)),\n workspaceId\n }\n})\n\n/** Decode safe history state for the exact workspace/entity pair or use the Items parent. */\nexport const resolveWorkspaceEntityOrigin = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType,\n entityId: EntityIdType\n): ResolvedWorkspaceEntityOrigin => {\n const fallback = fallbackOrigin(workspaceId)\n const decoded = Schema.decodeUnknownOption(WorkspaceEntityRouteStateSchema)(state)\n if (Option.isNone(decoded)) return { isStored: false, origin: fallback }\n const marker = decoded.value.entityOrigin\n return marker.workspaceId === workspaceId &&\n marker.entityId === entityId &&\n isSafeWorkspaceEntityOrigin(marker.origin, workspaceId)\n ? { isStored: true, origin: marker.origin }\n : { isStored: false, origin: fallback }\n}\n\n/** Serialize an exact validated origin for React Router navigation. */\nexport const workspaceEntityOriginHref = ({\n hash,\n pathname,\n search\n}: WorkspaceEntityOrigin): string => `${pathname}${search}${hash}`\n\n/** Resolve a release-owned agent thread only when the stored origin is an exact release route. */\nexport const workspaceEntityOriginAgentPath = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType,\n routableReleaseIds: ReadonlySet<ReleaseIdType>\n): string | null => {\n const target = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n return target === null || !routableReleaseIds.has(target.releaseId)\n ? null\n : releaseAgentPath(target.workspaceId, target.releaseId)\n}\n\n/** Keep entity actions in a release-owned thread, falling back to the current-page context. */\nexport const workspaceEntityAgentPath = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType,\n current: Pick<LocationParts, \"hash\" | \"pathname\" | \"search\">,\n releaseContext: WorkspaceEntityReleaseContext,\n routableReleaseIds: ReadonlySet<ReleaseIdType>\n): string => {\n const originRelease = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n const canonicalReleaseId = releaseContext.canonicalReleaseId\n const releaseTargetId = originRelease === null\n ? releaseContext.releaseMembershipsTruncated ||\n releaseContext.releaseIds.length !== 1 ||\n releaseContext.releaseIds[0] !== canonicalReleaseId ||\n canonicalReleaseId === null ||\n !routableReleaseIds.has(canonicalReleaseId)\n ? null\n : canonicalReleaseId\n : !releaseContext.releaseMembershipsTruncated &&\n releaseContext.releaseIds.includes(originRelease.releaseId) &&\n routableReleaseIds.has(originRelease.releaseId)\n ? originRelease.releaseId\n : null\n if (releaseTargetId !== null) {\n return contextualReleaseAgentPath(workspaceId, releaseTargetId, current.pathname)\n }\n\n const entity = workspaceEntityTargetFromHref(current.pathname)\n if (entity === null || entity.workspaceId !== workspaceId) {\n return contextualAgentPath(current.pathname, current.search, current.hash)\n }\n const itemSearch = new URLSearchParams(\n origin.pathname === workspaceEntityParentPath(workspaceId) ? origin.search : \"\"\n )\n itemSearch.set(\"object\", entity.entityId)\n return contextualAgentPath(\n workspaceEntityParentPath(workspaceId),\n `?${itemSearch.toString()}`,\n \"#item-details\"\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workspaceEntityRoutes-BHccxrFj.js","names":[],"sources":["../../../src/client/items/workspaceEntityRoutes.ts"],"sourcesContent":["import * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n ReleaseId,\n type ReleaseId as ReleaseIdType,\n WorkspaceId,\n type WorkspaceId as WorkspaceIdType\n} from \"../../domain/identifiers.js\"\nimport { contextualAgentPath, contextualReleaseAgentPath } from \"../contextualAgentPath.js\"\nimport { releaseAgentPath } from \"../releases/releasePaths.js\"\nimport { type ReleaseRouteState, ReleaseRouteStateSchema, retainReleaseRouteState } from \"../releases/releaseRoutes.js\"\nimport { workspaceEntityParentPath } from \"../workspaceEntityPaths.js\"\n\nexport { workspaceEntityParentPath, workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\n/** Exact in-application location preserved while a canonical entity route is open. */\nexport interface WorkspaceEntityOrigin {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: ReleaseRouteState | null\n}\n\n/** Versioned, bounded router state for one canonical entity activation. */\nexport interface WorkspaceEntityRouteState {\n readonly entityOrigin: {\n readonly _tag: \"entity-origin/v2\"\n readonly entityId: EntityIdType\n readonly origin: WorkspaceEntityOrigin\n readonly workspaceId: WorkspaceIdType\n }\n}\n\n/** Decoded entity origin plus whether it came from trusted matching history state. */\nexport interface ResolvedWorkspaceEntityOrigin {\n readonly isStored: boolean\n readonly origin: WorkspaceEntityOrigin\n}\n\n/** Decoded target of one exact canonical workspace entity href. */\nexport interface WorkspaceEntityTarget {\n readonly entityId: EntityIdType\n readonly workspaceId: WorkspaceIdType\n}\n\n/** Release membership evidence used to select an unambiguous entity-owned agent thread. */\nexport interface WorkspaceEntityReleaseContext {\n readonly canonicalReleaseId: ReleaseIdType | null\n readonly releaseIds: ReadonlyArray<ReleaseIdType>\n readonly releaseMembershipsTruncated: boolean\n}\n\ninterface LocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state?: unknown\n}\n\nconst WorkspaceEntityOriginSchema = Schema.Struct({\n hash: Schema.String,\n pathname: Schema.String,\n search: Schema.String,\n state: Schema.NullOr(ReleaseRouteStateSchema)\n})\n\nconst WorkspaceEntityRouteStateSchema = Schema.Struct({\n entityOrigin: Schema.Struct({\n _tag: Schema.Literal(\"entity-origin/v2\"),\n entityId: EntityId,\n origin: WorkspaceEntityOriginSchema,\n workspaceId: WorkspaceId\n })\n})\n\n/** Decode only an exact canonical entity path, rejecting query, hash, and extra path material. */\nexport const workspaceEntityTargetFromHref = (href: string): WorkspaceEntityTarget | null => {\n if (href.includes(\"?\") || href.includes(\"#\")) return null\n const parts = href.split(\"/\")\n if (parts.length !== 5 || parts[0] !== \"\" || parts[1] !== \"w\" || parts[3] !== \"items\") return null\n const workspaceId = Schema.decodeUnknownOption(WorkspaceId)(parts[2])\n const entityId = Schema.decodeUnknownOption(EntityId)(parts[4])\n return Option.isSome(workspaceId) && Option.isSome(entityId)\n ? { entityId: entityId.value, workspaceId: workspaceId.value }\n : null\n}\n\n/** Decode one entity route segment at the browser boundary. */\nexport const decodeEntityRouteId = <UnparsedInput>(value: UnparsedInput): EntityIdType | null => {\n const decoded = Schema.decodeUnknownOption(EntityId)(value)\n return Option.isSome(decoded) ? decoded.value : null\n}\n\nconst fallbackOrigin = (workspaceId: WorkspaceIdType): WorkspaceEntityOrigin => ({\n hash: \"\",\n pathname: workspaceEntityParentPath(workspaceId),\n search: \"\",\n state: null\n})\n\nconst isSearch = (search: string): boolean => search.length <= 2_048 && (search.length === 0 || search.startsWith(\"?\"))\n\nconst isHash = (hash: string): boolean => hash.length <= 1_024 && (hash.length === 0 || hash.startsWith(\"#\"))\n\nconst releaseOriginTarget = (\n parts: ReadonlyArray<string>,\n workspaceId: WorkspaceIdType\n): { readonly releaseId: ReleaseIdType; readonly workspaceId: WorkspaceIdType } | null => {\n if (parts.length !== 5 && parts.length !== 6) return null\n if (parts[0] !== \"\" || parts[1] !== \"w\" || parts[2] !== workspaceId || parts[3] !== \"releases\") return null\n const releaseId = Schema.decodeUnknownOption(ReleaseId)(parts[4])\n if (Option.isNone(releaseId) || (parts.length === 6 && parts[5] !== \"preview\")) return null\n return { releaseId: releaseId.value, workspaceId }\n}\n\nconst isRecognizedOriginPath = (pathname: string, workspaceId: WorkspaceIdType): boolean => {\n if (pathname.length > 2_048) return false\n const parts = pathname.split(\"/\")\n if (parts[0] !== \"\" || parts[1] !== \"w\" || parts[2] !== workspaceId) return false\n if (parts.length === 4) return [\"overview\", \"work\", \"items\", \"timeline\"].includes(parts[3] ?? \"\")\n return releaseOriginTarget(parts, workspaceId) !== null\n}\n\n/** Capture an exact location while retaining only matching, bounded release origin state. */\nexport const entityOriginFromLocation = ({\n hash,\n pathname,\n search,\n state\n}: LocationParts): WorkspaceEntityOrigin => {\n const workspaceId = Schema.decodeUnknownOption(WorkspaceId)(pathname.split(\"/\")[2])\n const target = Option.isSome(workspaceId) ? releaseOriginTarget(pathname.split(\"/\"), workspaceId.value) : null\n return {\n hash,\n pathname,\n search,\n state: target === null ? null : retainReleaseRouteState(state, target.workspaceId, target.releaseId)\n }\n}\n\n/** Confirm an origin is bounded and belongs to a supported page in the exact workspace. */\nexport const isSafeWorkspaceEntityOrigin = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType\n): boolean => {\n if (!isRecognizedOriginPath(origin.pathname, workspaceId) || !isSearch(origin.search) || !isHash(origin.hash)) {\n return false\n }\n if (origin.state === null) return true\n const target = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n return target !== null && retainReleaseRouteState(origin.state, workspaceId, target.releaseId) !== null\n}\n\nconst reusableStoredOrigin = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType\n): WorkspaceEntityOrigin | null => {\n const decoded = Schema.decodeUnknownOption(WorkspaceEntityRouteStateSchema)(state)\n if (Option.isNone(decoded)) return null\n const marker = decoded.value.entityOrigin\n return marker.workspaceId === workspaceId && isSafeWorkspaceEntityOrigin(marker.origin, workspaceId)\n ? marker.origin\n : null\n}\n\n/**\n * Construct bounded entity route state.\n *\n * A previously validated entity origin is carried through related-entity navigation so the\n * shell's explicit Back action still returns to the root activation surface.\n */\nexport const makeWorkspaceEntityRouteState = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType,\n entityId: EntityIdType,\n origin: WorkspaceEntityOrigin\n): WorkspaceEntityRouteState => ({\n entityOrigin: {\n _tag: \"entity-origin/v2\",\n entityId,\n origin: reusableStoredOrigin(state, workspaceId) ??\n (isSafeWorkspaceEntityOrigin(origin, workspaceId) ? origin : fallbackOrigin(workspaceId)),\n workspaceId\n }\n})\n\n/** Decode safe history state for the exact workspace/entity pair or use the Items parent. */\nexport const resolveWorkspaceEntityOrigin = <UnparsedInput>(\n state: UnparsedInput,\n workspaceId: WorkspaceIdType,\n entityId: EntityIdType\n): ResolvedWorkspaceEntityOrigin => {\n const fallback = fallbackOrigin(workspaceId)\n const decoded = Schema.decodeUnknownOption(WorkspaceEntityRouteStateSchema)(state)\n if (Option.isNone(decoded)) return { isStored: false, origin: fallback }\n const marker = decoded.value.entityOrigin\n return marker.workspaceId === workspaceId &&\n marker.entityId === entityId &&\n isSafeWorkspaceEntityOrigin(marker.origin, workspaceId)\n ? { isStored: true, origin: marker.origin }\n : { isStored: false, origin: fallback }\n}\n\n/** Serialize an exact validated origin for React Router navigation. */\nexport const workspaceEntityOriginHref = ({\n hash,\n pathname,\n search\n}: WorkspaceEntityOrigin): string => `${pathname}${search}${hash}`\n\n/** Resolve a release-owned agent thread only when the stored origin is an exact release route. */\nexport const workspaceEntityOriginAgentPath = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType,\n routableReleaseIds: ReadonlySet<ReleaseIdType>\n): string | null => {\n const target = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n return target === null || !routableReleaseIds.has(target.releaseId)\n ? null\n : releaseAgentPath(target.workspaceId, target.releaseId)\n}\n\n/** Keep entity actions in a release-owned thread, falling back to the current-page context. */\nexport const workspaceEntityAgentPath = (\n origin: WorkspaceEntityOrigin,\n workspaceId: WorkspaceIdType,\n current: Pick<LocationParts, \"hash\" | \"pathname\" | \"search\">,\n releaseContext: WorkspaceEntityReleaseContext,\n routableReleaseIds: ReadonlySet<ReleaseIdType>\n): string => {\n const originRelease = releaseOriginTarget(origin.pathname.split(\"/\"), workspaceId)\n const canonicalReleaseId = releaseContext.canonicalReleaseId\n const releaseTargetId = originRelease === null\n ? releaseContext.releaseMembershipsTruncated ||\n releaseContext.releaseIds.length !== 1 ||\n releaseContext.releaseIds[0] !== canonicalReleaseId ||\n canonicalReleaseId === null ||\n !routableReleaseIds.has(canonicalReleaseId)\n ? null\n : canonicalReleaseId\n : !releaseContext.releaseMembershipsTruncated &&\n releaseContext.releaseIds.includes(originRelease.releaseId) &&\n routableReleaseIds.has(originRelease.releaseId)\n ? originRelease.releaseId\n : null\n if (releaseTargetId !== null) {\n return contextualReleaseAgentPath(workspaceId, releaseTargetId, current.pathname)\n }\n\n const entity = workspaceEntityTargetFromHref(current.pathname)\n if (entity === null || entity.workspaceId !== workspaceId) {\n return contextualAgentPath(current.pathname, current.search, current.hash)\n }\n const itemSearch = new URLSearchParams(\n origin.pathname === workspaceEntityParentPath(workspaceId) ? origin.search : \"\"\n )\n itemSearch.set(\"object\", entity.entityId)\n return contextualAgentPath(\n workspaceEntityParentPath(workspaceId),\n `?${itemSearch.toString()}`,\n \"#item-details\"\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e,r as t,t as n}from"./index-BVikncBH.js";var r=32,i=(e,t)=>!e.defaultPrevented&&e.button===0&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&(t===``||t===`_self`),a=(i,a)=>{let o=t(i);for(let[t,n]of e){if(!n[3]||!n[2].includes(i.pathname))continue;let r=n[2].includes(a)?n[2]:[...n[2],a];e.set(t,[n[0],n[1],r,!0])}e.delete(o);let s=document.querySelector(n),c=[s?.scrollTop??window.scrollY,s!==null,[a],!1];if(!(c[0]<=2)&&(e.set(o,c),!(e.size<=r)))for(let t of e.keys()){e.delete(t);break}};export{i as n,a as t};
2
- //# sourceMappingURL=workspaceScrollCapture-CwBIBHg8.js.map
1
+ import{n as e,r as t,t as n}from"./index-kmYFvwT0.js";var r=32,i=(e,t)=>!e.defaultPrevented&&e.button===0&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&(t===``||t===`_self`),a=(i,a)=>{let o=t(i);for(let[t,n]of e){if(!n[3]||!n[2].includes(i.pathname))continue;let r=n[2].includes(a)?n[2]:[...n[2],a];e.set(t,[n[0],n[1],r,!0])}e.delete(o);let s=document.querySelector(n),c=[s?.scrollTop??window.scrollY,s!==null,[a],!1];if(!(c[0]<=2)&&(e.set(o,c),!(e.size<=r)))for(let t of e.keys()){e.delete(t);break}};export{i as n,a as t};
2
+ //# sourceMappingURL=workspaceScrollCapture-BzsNJoL7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceScrollCapture-CwBIBHg8.js","names":[],"sources":["../../../src/client/workspaceScrollCapture.ts"],"sourcesContent":["import type { Location } from \"react-router\"\n\nimport {\n RELEASE_PREVIEW_SCROLL_SELECTOR,\n type SavedWorkspaceScrollPosition,\n savedWorkspaceScrollPositions,\n SCROLL_POSITION_TOLERANCE,\n workspaceScrollRestorationKey\n} from \"./workspaceScrollRestoration.js\"\n\nconst MAXIMUM_SAVED_WORKSPACE_SCROLL_POSITIONS = 32\n\ninterface WorkspaceNavigationClick {\n readonly altKey: boolean\n readonly button: number\n readonly ctrlKey: boolean\n readonly defaultPrevented: boolean\n readonly metaKey: boolean\n readonly shiftKey: boolean\n}\n\n/** Match the same primary, unmodified, same-tab click contract as React Router. */\nexport const shouldRememberWorkspaceScrollPosition = (event: WorkspaceNavigationClick, linkTarget: string): boolean =>\n !event.defaultPrevented &&\n event.button === 0 &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.shiftKey &&\n (linkTarget === \"\" || linkTarget === \"_self\")\n\n/** Remember the current viewport before opening a canonical entity route. */\nexport const rememberWorkspaceScrollPosition = (\n location: Pick<Location, \"hash\" | \"pathname\" | \"search\">,\n entityPath: string\n): void => {\n const key = workspaceScrollRestorationKey(location)\n for (const [originKey, saved] of savedWorkspaceScrollPositions) {\n if (!saved[3] || !saved[2].includes(location.pathname)) continue\n const entityPaths = saved[2].includes(entityPath) ? saved[2] : [...saved[2], entityPath]\n savedWorkspaceScrollPositions.set(originKey, [saved[0], saved[1], entityPaths, true])\n }\n savedWorkspaceScrollPositions.delete(key)\n const previewScroller = document.querySelector<HTMLElement>(RELEASE_PREVIEW_SCROLL_SELECTOR)\n const savedPosition = [\n previewScroller?.scrollTop ?? window.scrollY,\n previewScroller !== null,\n [entityPath],\n false\n ] satisfies SavedWorkspaceScrollPosition\n if (savedPosition[0] <= SCROLL_POSITION_TOLERANCE) return\n savedWorkspaceScrollPositions.set(key, savedPosition)\n if (savedWorkspaceScrollPositions.size <= MAXIMUM_SAVED_WORKSPACE_SCROLL_POSITIONS) return\n for (const oldestKey of savedWorkspaceScrollPositions.keys()) {\n savedWorkspaceScrollPositions.delete(oldestKey)\n break\n }\n}\n"],"mappings":"sDAUA,IAAM,EAA2C,GAYpC,GAAyC,EAAiC,IACrF,CAAC,EAAM,kBACP,EAAM,SAAW,GACjB,CAAC,EAAM,QACP,CAAC,EAAM,SACP,CAAC,EAAM,SACP,CAAC,EAAM,WACN,IAAe,IAAM,IAAe,SAG1B,GACX,EACA,IACS,CACT,IAAM,EAAM,EAA8B,CAAQ,EAClD,IAAK,GAAM,CAAC,EAAW,KAAU,EAA+B,CAC9D,GAAI,CAAC,EAAM,IAAM,CAAC,EAAM,EAAE,CAAC,SAAS,EAAS,QAAQ,EAAG,SACxD,IAAM,EAAc,EAAM,EAAE,CAAC,SAAS,CAAU,EAAI,EAAM,GAAK,CAAC,GAAG,EAAM,GAAI,CAAU,EACvF,EAA8B,IAAI,EAAW,CAAC,EAAM,GAAI,EAAM,GAAI,EAAa,EAAI,CAAC,CACtF,CACA,EAA8B,OAAO,CAAG,EACxC,IAAM,EAAkB,SAAS,cAA2B,CAA+B,EACrF,EAAgB,CACpB,GAAiB,WAAa,OAAO,QACrC,IAAoB,KACpB,CAAC,CAAU,EACX,EACF,EACI,OAAc,IAAA,KAClB,EAA8B,IAAI,EAAK,CAAa,EAChD,IAA8B,MAAQ,IAC1C,IAAK,IAAM,KAAa,EAA8B,KAAK,EAAG,CAC5D,EAA8B,OAAO,CAAS,EAC9C,KACF,CACF"}
1
+ {"version":3,"file":"workspaceScrollCapture-BzsNJoL7.js","names":[],"sources":["../../../src/client/workspaceScrollCapture.ts"],"sourcesContent":["import type { Location } from \"react-router\"\n\nimport {\n RELEASE_PREVIEW_SCROLL_SELECTOR,\n type SavedWorkspaceScrollPosition,\n savedWorkspaceScrollPositions,\n SCROLL_POSITION_TOLERANCE,\n workspaceScrollRestorationKey\n} from \"./workspaceScrollRestoration.js\"\n\nconst MAXIMUM_SAVED_WORKSPACE_SCROLL_POSITIONS = 32\n\ninterface WorkspaceNavigationClick {\n readonly altKey: boolean\n readonly button: number\n readonly ctrlKey: boolean\n readonly defaultPrevented: boolean\n readonly metaKey: boolean\n readonly shiftKey: boolean\n}\n\n/** Match the same primary, unmodified, same-tab click contract as React Router. */\nexport const shouldRememberWorkspaceScrollPosition = (event: WorkspaceNavigationClick, linkTarget: string): boolean =>\n !event.defaultPrevented &&\n event.button === 0 &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.shiftKey &&\n (linkTarget === \"\" || linkTarget === \"_self\")\n\n/** Remember the current viewport before opening a canonical entity route. */\nexport const rememberWorkspaceScrollPosition = (\n location: Pick<Location, \"hash\" | \"pathname\" | \"search\">,\n entityPath: string\n): void => {\n const key = workspaceScrollRestorationKey(location)\n for (const [originKey, saved] of savedWorkspaceScrollPositions) {\n if (!saved[3] || !saved[2].includes(location.pathname)) continue\n const entityPaths = saved[2].includes(entityPath) ? saved[2] : [...saved[2], entityPath]\n savedWorkspaceScrollPositions.set(originKey, [saved[0], saved[1], entityPaths, true])\n }\n savedWorkspaceScrollPositions.delete(key)\n const previewScroller = document.querySelector<HTMLElement>(RELEASE_PREVIEW_SCROLL_SELECTOR)\n const savedPosition = [\n previewScroller?.scrollTop ?? window.scrollY,\n previewScroller !== null,\n [entityPath],\n false\n ] satisfies SavedWorkspaceScrollPosition\n if (savedPosition[0] <= SCROLL_POSITION_TOLERANCE) return\n savedWorkspaceScrollPositions.set(key, savedPosition)\n if (savedWorkspaceScrollPositions.size <= MAXIMUM_SAVED_WORKSPACE_SCROLL_POSITIONS) return\n for (const oldestKey of savedWorkspaceScrollPositions.keys()) {\n savedWorkspaceScrollPositions.delete(oldestKey)\n break\n }\n}\n"],"mappings":"sDAUA,IAAM,EAA2C,GAYpC,GAAyC,EAAiC,IACrF,CAAC,EAAM,kBACP,EAAM,SAAW,GACjB,CAAC,EAAM,QACP,CAAC,EAAM,SACP,CAAC,EAAM,SACP,CAAC,EAAM,WACN,IAAe,IAAM,IAAe,SAG1B,GACX,EACA,IACS,CACT,IAAM,EAAM,EAA8B,CAAQ,EAClD,IAAK,GAAM,CAAC,EAAW,KAAU,EAA+B,CAC9D,GAAI,CAAC,EAAM,IAAM,CAAC,EAAM,EAAE,CAAC,SAAS,EAAS,QAAQ,EAAG,SACxD,IAAM,EAAc,EAAM,EAAE,CAAC,SAAS,CAAU,EAAI,EAAM,GAAK,CAAC,GAAG,EAAM,GAAI,CAAU,EACvF,EAA8B,IAAI,EAAW,CAAC,EAAM,GAAI,EAAM,GAAI,EAAa,EAAI,CAAC,CACtF,CACA,EAA8B,OAAO,CAAG,EACxC,IAAM,EAAkB,SAAS,cAA2B,CAA+B,EACrF,EAAgB,CACpB,GAAiB,WAAa,OAAO,QACrC,IAAoB,KACpB,CAAC,CAAU,EACX,EACF,EACI,OAAc,IAAA,KAClB,EAA8B,IAAI,EAAK,CAAa,EAChD,IAA8B,MAAQ,IAC1C,IAAK,IAAM,KAAa,EAA8B,KAAK,EAAG,CAC5D,EAA8B,OAAO,CAAS,EAC9C,KACF,CACF"}
@@ -10,7 +10,7 @@
10
10
  />
11
11
  <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
12
12
  <title>Control Center</title>
13
- <script type="module" crossorigin src="/assets/index-BVikncBH.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-kmYFvwT0.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/react-CwJFpaho.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/loader-circle-Dem7LJJw.js">
@@ -8503,10 +8503,11 @@ var ReviewKind = Schema.Literals([
8503
8503
  "explain"
8504
8504
  ]);
8505
8505
  ReviewKind.literals;
8506
- var ReviewProvider = Schema.Literals(["codex"]);
8507
- var ReviewHarness = Schema.Literals(["native-codex"]);
8506
+ var ReviewProvider = Schema.Literals(["codex", "claude"]);
8507
+ var ReviewHarness = Schema.Literals(["native-codex", "native-claude"]);
8508
8508
  var ReviewModel = Schema.Literals([
8509
8509
  "configured-default",
8510
+ "default",
8510
8511
  "gpt-5.6-luna",
8511
8512
  "gpt-5.6-terra",
8512
8513
  "gpt-5.6-sol"
@@ -8514,6 +8515,14 @@ var ReviewModel = Schema.Literals([
8514
8515
  ReviewProvider.literals;
8515
8516
  ReviewHarness.literals;
8516
8517
  ReviewModel.literals;
8518
+ /** Models accepted by each local reviewer CLI. */
8519
+ var reviewModelOptionsForProvider = (provider) => provider === "claude" ? ["configured-default", "default"] : [
8520
+ "configured-default",
8521
+ "gpt-5.6-luna",
8522
+ "gpt-5.6-terra",
8523
+ "gpt-5.6-sol"
8524
+ ];
8525
+ var isReviewProfileExecution = (profile) => profile.harness === (profile.provider === "claude" ? "native-claude" : "native-codex") && reviewModelOptionsForProvider(profile.provider).includes(profile.model);
8517
8526
  var ReviewProfileConfig = Schema.Struct({
8518
8527
  id: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(64), Schema.isPattern(/^[a-z][a-z0-9-]*$/u)),
8519
8528
  name: Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(80)),
@@ -8522,7 +8531,7 @@ var ReviewProfileConfig = Schema.Struct({
8522
8531
  harness: ReviewHarness.pipe(Schema.withDecodingDefaultTypeKey(decodingDefault$1("native-codex"))),
8523
8532
  model: ReviewModel.pipe(Schema.withDecodingDefaultTypeKey(decodingDefault$1("configured-default"))),
8524
8533
  skillIds: Schema.Array(Schema.String.check(Schema.isTrimmed(), Schema.isNonEmpty(), Schema.isMaxLength(256))).check(Schema.isMaxLength(24), Schema.isUnique())
8525
- });
8534
+ }).check(Schema.makeFilter(isReviewProfileExecution, { expected: "a supported reviewer provider, harness, and model" }));
8526
8535
  var defaultReviewProfiles = [
8527
8536
  {
8528
8537
  id: "thorough",
@@ -28229,4 +28238,4 @@ var effectiveReachableUrls = (config, detectedPrivateAddresses) => {
28229
28238
  //#endregion
28230
28239
  export { deliveryGraphInspectionLayer as $, controlCenterBootstrapLayer as $n, TerminalRecoveryRefusedError as $r, authorizePairingRequest as $t, makeTimelineExportAudits as A, PrReviewSandboxTools as An, makeSecretStore as Ar, listPluginConnectionSummaries as At, releaseAgentJobsUnavailableLayer as B, prReviewSandboxToolsLayer as Bn, terminalRecoveryLayer as Br, JiraReadPluginConfiguration as Bt, staticApplicationWithAssetsLayer as C, AgentJobWorker as Cn, decodeOperationalDataPaths as Cr, DEFAULT_MAXIMUM_LIVE_STREAMS as Ct, makeStaticAssetStore as D, PrReviewCommandArtifactId as Dn, syncDataRootPath as Dr, releasePublicationSubmissionsLayer as Dt, StaticAssetStoreError as E, prReviewAgentJobWorkerLayer as En, publishFreshDataRootClaim as Er, LiveStreamAdmissionExceeded as Et, synchronizeFakeRelease as F, ReviewReadFile as Fn, SecretTooLargeError as Fr, pluginAdministrationLayerWithConnections as Ft, relationshipRepairProposalsLayer as G, PLUGIN_RETRY_MAX_DELAY_MILLIS as Gn, SESSION_ABSOLUTE_LIFETIME_DAYS as Gr, ClockifyReadPluginConfiguration as Gt, releaseAgentTurnsLayer as H, PLUGIN_OPERATION_MAX_ATTEMPTS as Hn, PairingCodeId as Hr, makeJiraReadPluginRuntime as Ht, synchronizeFakeReleaseFromMap as I, ReviewRunCommand as In, secretStoreIoError as Ir, pluginAdministrationOAuthLayer as It, portfolioSnapshotsLayer as J, retryPluginStream as Jn, AuthCryptoError as Jr, makeClockifyReadPluginRuntime as Jt, pullRequestReviewsLayer as K, isPluginFailureRetryable as Kn, SESSION_IDLE_LIFETIME_HOURS as Kr, clockifyReadOnlyPluginDescriptor as Kt, makeReleaseAgentJobs as L, ReviewSearchArtifact as Ln, MINIMUM_PR_REVIEW_BUDGET_MILLIS as Lr, pluginAdministrationOAuthLayerWithConnections as Lt, reconcileFakeReleaseProjection as M, ReviewListFiles as Mn, SecretProtectionError as Mr, makePluginAdministrationWithConnections as Mt, reconcileFakeReleaseSyncAttempts as N, ReviewPageArtifact as Nn, SecretStoreInputError as Nr, makePluginAdministrationWithOAuth as Nt, makeWorkspaceSettingsAdministration as O, PrReviewSandboxSessionError as On, SecretRoot as Or, releasePublicationSubmissionsUnavailableLayer as Ot, recoverFakeReleaseProjection as P, ReviewReadDiff as Pn, SecretStoreIoError as Pr, pluginAdministrationLayer as Pt, makeLiveEvents as Q, ControlCenterBootstrap as Qn, FirstRunPairingAlreadyIssuedError as Qr, PluginConnectionMap as Qt, releaseAgentJobsLayer as R, ReviewSearchFiles as Rn, TERMINAL_RECOVERY_CONFIRMATION as Rr, mapPersistenceReadError as Rt, staticApplicationLayer as S, ApiBindConfiguration as Sn, decodeControlCenterDataPaths as Sr, controlCenterApiMiddlewareLayer as St, StaticAssetStore as T, agentJobWorkerWithPrReviewLayer as Tn, publishDataRootMarker as Tr, LiveStreamAdmission as Tt, releaseAgentUnavailableLayer as U, PLUGIN_RATE_LIMIT_MAX_DELAY_MILLIS as Un, PairingCodeSummary as Ur, makeJiraReadPluginRuntimeFromProvider as Ut, makeReleaseAgentTurns as V, CodeCommitPluginDefinition as Vn, PAIRING_CODE_LIFETIME_MINUTES as Vr, jiraReadPluginDescriptor as Vt, makeRelationshipRepairProposals as W, PLUGIN_RETRY_BASE_DELAY_MILLIS as Wn, PairingPurpose as Wr, CodePipelinePluginDefinition as Wt, mediaReadsLayer as X, agentProviderRuntimeRegistryLayer as Xn, AuthPersistenceError as Xr, clockifyActionSubmissionsLayer as Xt, makeMediaReads as Y, AgentRuntimeRegistry as Yn, AuthPermissionDeniedError as Yr, makeClockifyReadPluginRuntimeFromProvider as Yt, liveEventsLayer as Z, agentRuntimeRegistryLayer as Zn, CredentialRejectedError as Zr, clockifyActionSubmissionsUnavailableLayer as Zt, prReviewWorkerStartupLayer as _, hashCsrfToken as _n, DATA_ROOT_MARKER_V1_CONTENT as _r, HttpByteLimit as _t, decodeBindConfig as a, withCorrelationResponse as an, restoreBackup as ar, codePipelineReadsLayer as at, controlCenterTransportProtocol as b, ServerDraining as bn, DATA_ROOT_STAGING_PREFIX as br, controlCenterApiLayer as bt, makeControlCenterApplication as c, InsecureLanCapability as cn, BackupBlobEntryV1 as cr, makeAuthorizedShares as ct, ReleaseSynchronizationStartup as d, authorizeAuthenticatedMutation as dn, BackupId as dr, requestRateLimiterLayer as dt, layer as ei, mutationCsrfLayer as en, makeControlCenterBootstrap as er, makeDeliveryGraphInspection as et, ReleaseSynchronizationStartupConfigurationError as f, authorizeAuthenticatedRead as fn, BackupManifestJsonV1 as fr, securityHeaders as ft, PrReviewWorkerStartup as g, effectiveRequestAuthority as gn, DATA_ROOT_MARKER_NAME as gr, DEFAULT_HTTP_SECURITY_LIMITS as gt, PrReviewWorkerRunning as h, authorizeRequest as hn, DATA_ROOT_MARKER_MAX_BYTES as hr, limitRequestBodyStream as ht, TransportPolicy as i, provideCurrentRequest as in, createVerifiedBackup as ir, makeCompleteDiffReads as it, timelineExportAuditsLayer as j, ReviewApplyPatch as jn, SecretNotFoundError as jr, makePluginAdministration as jt, workspaceSettingsAdministrationLayer as k, PrReviewSandboxSessions as kn, SecretStore as kr, listFirstPartyServiceMetadata as kt, makeControlCenterServer as l, RequestAccess as ln, BackupBoundaryV1 as lr, requestBoundaryLayer as lt, releaseSynchronizationStartupLayer as m, authorizeInsecureLanCapability as mn, ReproducibleBlobGap as mr, authorizeRequestBody as mt, BindConfigError as n, CurrentRequestContext as nn, authLayer as nr, timelineReadsLayer as nt, effectiveReachableUrls as o, CsrfDigest as on, verifyBackup as or, makeCodePipelineReads as ot, releaseIdFromStartupState as p, authorizeAuthenticatedReadPost as pn, BackupManifestV1 as pr, RequestBodyPolicyError as pt, makePortfolioSnapshots as q, retryPluginOperation as qn, SessionSummary as qr, clockifyReadPluginDescriptor as qt, DirectTlsMaterial as r, makeCurrentRequestContext as rn, createOfflineVerifiedBackup as rr, completeDiffReadsLayer as rt, PrReviewWorkerConfigurationError as s, CsrfToken as sn, BackupBlobCountsV1 as sr, authorizedSharesLayer as st, BindConfig as t, sessionCookieAuthLayer as tn, Auth as tr, makeTimelineReads as tt, requestUrlBoundaryLayer as u, RequestSecurityError as un, BackupDatabaseArtifactV1 as ur, RequestLimitPolicy as ut, DirectTlsServerError as v, sessionCookiePolicy as vn, DATA_ROOT_MARKER_V2_PREFIX as vr, HttpSecurityLimits as vt, StaticAssetMimeType as w, agentJobWorkerLayer as wn, inspectFreshDataRootClaim as wr, DEFAULT_MAXIMUM_LIVE_STREAMS_PER_SESSION as wt, makeNodeTransportLayer as x, ServerLifecycle as xn, boundDataRootMarkerContent as xr, controlCenterApiLayerWithLifecycle as xt, NODE_LISTENER_SECURITY_POLICY as y, verifyCsrfToken as yn, DATA_ROOT_PENDING_MARKER_PREFIX as yr, controlCenterApiHandlersLayer as yt, releaseAgentJobsLayerForWorkerWorkspace as z, prReviewSandboxSessionsLayer as zn, TerminalRecovery as zr, mapPersistenceWriteError as zt };
28231
28240
 
28232
- //# sourceMappingURL=BindConfig-D8aIjI_R.js.map
28241
+ //# sourceMappingURL=BindConfig-BG-FGtB5.js.map