@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
@@ -504,6 +504,13 @@ export declare const makeDeliveryGraphReader: Effect.Effect<{
504
504
  readonly targetBranch: Schema.String;
505
505
  readonly headRevision: Schema.String;
506
506
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
507
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
508
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
509
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
510
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
511
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
512
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
513
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
507
514
  }>, Schema.TaggedStruct<"page", {
508
515
  readonly spaceKey: Schema.String;
509
516
  readonly revision: Schema.String;
@@ -964,6 +971,13 @@ export declare const makeDeliveryGraphReader: Effect.Effect<{
964
971
  readonly targetBranch: Schema.String;
965
972
  readonly headRevision: Schema.String;
966
973
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
974
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
975
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
976
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
977
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
978
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
979
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
980
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
967
981
  }>, Schema.TaggedStruct<"page", {
968
982
  readonly spaceKey: Schema.String;
969
983
  readonly revision: Schema.String;
@@ -1235,6 +1249,13 @@ export declare const makeDeliveryGraphReader: Effect.Effect<{
1235
1249
  readonly targetBranch: Schema.String;
1236
1250
  readonly headRevision: Schema.String;
1237
1251
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1252
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1253
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1254
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1255
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1256
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1257
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1258
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1238
1259
  }>, Schema.TaggedStruct<"page", {
1239
1260
  readonly spaceKey: Schema.String;
1240
1261
  readonly revision: Schema.String;
@@ -1454,6 +1475,13 @@ export declare const makeDeliveryGraphReader: Effect.Effect<{
1454
1475
  readonly targetBranch: Schema.String;
1455
1476
  readonly headRevision: Schema.String;
1456
1477
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1478
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1479
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1480
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1481
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1482
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1483
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1484
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1457
1485
  }>, Schema.TaggedStruct<"page", {
1458
1486
  readonly spaceKey: Schema.String;
1459
1487
  readonly revision: Schema.String;
@@ -1659,6 +1687,13 @@ export declare const makeDeliveryGraphReader: Effect.Effect<{
1659
1687
  readonly targetBranch: Schema.String;
1660
1688
  readonly headRevision: Schema.String;
1661
1689
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1690
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1691
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1692
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1693
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1694
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1695
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1696
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1662
1697
  }>, Schema.TaggedStruct<"page", {
1663
1698
  readonly spaceKey: Schema.String;
1664
1699
  readonly revision: Schema.String;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/read.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAyErD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAm4BlC,CAAA"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/read.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAyErD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAu5BlC,CAAA"}
@@ -261,6 +261,13 @@ export declare const projectionJson: Schema.fromJsonString<Schema.toTaggedUnion<
261
261
  readonly targetBranch: Schema.String;
262
262
  readonly headRevision: Schema.String;
263
263
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
264
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
265
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
266
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
267
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
268
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
269
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
270
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
264
271
  }>, Schema.TaggedStruct<"page", {
265
272
  readonly spaceKey: Schema.String;
266
273
  readonly revision: Schema.String;
@@ -1 +1 @@
1
- {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAavC,OAAO,EAWL,WAAW,EACZ,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAGtD,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;EAcxB,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;EAIjC,CAAA;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;;EAalB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;EAwBtB,CAAA;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;EAUnB,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC1B,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAiE,CAAA;AAC5F,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAsC,CAAA;AAC/D,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAmC,CAAA;AAC7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;GAAuC,CAAA;AACrE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;GAAwD,CAAA;AACvF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA8C,CAAA;AAC3E,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;GAOlB,CAAA;AAEH,eAAO,MAAM,eAAe,qGAAkC,CAAA;AAE9D,eAAO,MAAM,UAAU,GAAI,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,QAAQ,UAAU,EAAE,MAAM,OAAO,sHACnC,CAAA;AAExD,eAAO,MAAM,gBAAgB,GAC3B,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,yBAC6D,CAAA"}
1
+ {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAavC,OAAO,EAWL,WAAW,EACZ,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAGtD,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;EAcxB,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;EAIjC,CAAA;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;;;EAalB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;EAwBtB,CAAA;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;EAUnB,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC1B,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAiE,CAAA;AAC5F,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAsC,CAAA;AAC/D,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAmC,CAAA;AAC7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;GAAuC,CAAA;AACrE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;GAAwD,CAAA;AACvF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA8C,CAAA;AAC3E,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;GAOlB,CAAA;AAEH,eAAO,MAAM,eAAe,qGAAkC,CAAA;AAE9D,eAAO,MAAM,UAAU,GAAI,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,QAAQ,UAAU,EAAE,MAAM,OAAO,sHACnC,CAAA;AAExD,eAAO,MAAM,gBAAgB,GAC3B,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,yBAC6D,CAAA"}
@@ -158,6 +158,13 @@ export declare const makeDeliveryGraphWriter: Effect.Effect<{
158
158
  readonly targetBranch: Schema.String;
159
159
  readonly headRevision: Schema.String;
160
160
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
161
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
162
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
163
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
164
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
165
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
166
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
167
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
161
168
  }>, Schema.TaggedStruct<"page", {
162
169
  readonly spaceKey: Schema.String;
163
170
  readonly revision: Schema.String;
@@ -624,6 +631,13 @@ export declare const makeDeliveryGraphWriter: Effect.Effect<{
624
631
  readonly targetBranch: Schema.String;
625
632
  readonly headRevision: Schema.String;
626
633
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
634
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
635
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
636
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
637
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
638
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
639
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
640
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
627
641
  }>, Schema.TaggedStruct<"page", {
628
642
  readonly spaceKey: Schema.String;
629
643
  readonly revision: Schema.String;
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAElF,OAAO,EAAE,uBAAuB,EAA6B,MAAM,eAAe,CAAA;AAiBlF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA6iBlC,CAAA"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../../../../src/server/persistence/repositories/delivery-graph/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAElF,OAAO,EAAE,uBAAuB,EAA6B,MAAM,eAAe,CAAA;AAiBlF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA6iBlC,CAAA"}
@@ -469,6 +469,13 @@ declare const makeDeliveryGraphRepository: Effect.Effect<{
469
469
  readonly targetBranch: Schema.String;
470
470
  readonly headRevision: Schema.String;
471
471
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
472
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
473
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
474
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
475
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
476
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
477
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
478
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
472
479
  }>, Schema.TaggedStruct<"page", {
473
480
  readonly spaceKey: Schema.String;
474
481
  readonly revision: Schema.String;
@@ -929,6 +936,13 @@ declare const makeDeliveryGraphRepository: Effect.Effect<{
929
936
  readonly targetBranch: Schema.String;
930
937
  readonly headRevision: Schema.String;
931
938
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
939
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
940
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
941
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
942
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
943
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
944
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
945
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
932
946
  }>, Schema.TaggedStruct<"page", {
933
947
  readonly spaceKey: Schema.String;
934
948
  readonly revision: Schema.String;
@@ -1200,6 +1214,13 @@ declare const makeDeliveryGraphRepository: Effect.Effect<{
1200
1214
  readonly targetBranch: Schema.String;
1201
1215
  readonly headRevision: Schema.String;
1202
1216
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1217
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1218
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1219
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1220
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1221
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1222
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1223
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1203
1224
  }>, Schema.TaggedStruct<"page", {
1204
1225
  readonly spaceKey: Schema.String;
1205
1226
  readonly revision: Schema.String;
@@ -1419,6 +1440,13 @@ declare const makeDeliveryGraphRepository: Effect.Effect<{
1419
1440
  readonly targetBranch: Schema.String;
1420
1441
  readonly headRevision: Schema.String;
1421
1442
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1443
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1444
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1445
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1446
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1447
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1448
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1449
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1422
1450
  }>, Schema.TaggedStruct<"page", {
1423
1451
  readonly spaceKey: Schema.String;
1424
1452
  readonly revision: Schema.String;
@@ -1624,6 +1652,13 @@ declare const makeDeliveryGraphRepository: Effect.Effect<{
1624
1652
  readonly targetBranch: Schema.String;
1625
1653
  readonly headRevision: Schema.String;
1626
1654
  readonly reviewState: Schema.Literals<readonly ["not-requested", "requested", "changes-requested", "approved", "merged"]>;
1655
+ readonly lifecycle: Schema.optionalKey<Schema.NullOr<Schema.Literals<readonly ["open", "closed", "merged"]>>>;
1656
+ readonly description: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1657
+ readonly authorReference: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1658
+ readonly baseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1659
+ readonly mergeBaseRevision: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1660
+ readonly createdAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1661
+ readonly updatedAt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1627
1662
  }>, Schema.TaggedStruct<"page", {
1628
1663
  readonly spaceKey: Schema.String;
1629
1664
  readonly revision: Schema.String;
@@ -1 +1 @@
1
- {"version":3,"file":"deliveryGraphRepository.d.ts","sourceRoot":"","sources":["../../../../../src/server/persistence/repositories/deliveryGraphRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deliveryGraphRepository.d.ts","sourceRoot":"","sources":["../../../../../src/server/persistence/repositories/deliveryGraphRepository.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/control-center",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Human- and agent-oriented delivery control center",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
@@ -60,11 +60,11 @@
60
60
  "@knpkv/ai-runtime": "^0.1.0",
61
61
  "@knpkv/atlassian-common": "^1.2.0",
62
62
  "@knpkv/codecommit-core": "^0.9.1",
63
- "@knpkv/clockify-api-client": "^1.0.1",
63
+ "@knpkv/clockify-api-client": "^1.0.2",
64
64
  "@knpkv/confluence-api-client": "^1.0.0",
65
65
  "@knpkv/confluence-to-markdown": "^2.1.2",
66
66
  "@knpkv/control-center-sql": "^0.1.0",
67
- "@knpkv/jira-api-client": "^1.0.0",
67
+ "@knpkv/jira-api-client": "^1.0.1",
68
68
  "@knpkv/rly": "^0.1.1"
69
69
  },
70
70
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,a as i,h as a,i as o,n as s,r as c,t as l,w as u}from"./Dialog-DwSIPb-B-DVn37afM.js";import{c as d,i as f,o as p,s as m}from"./index-DLoOV6Hp.js";import{r as h,v as g}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{D as _,Ft as v,J as y,P as b,Rt as x,dt as S,i as C,j as w,m as T,ot as E,pt as D,st as O,t as k,v as ee,zt as A}from"./client-OmvShYdC.js";import{n as j}from"./workspaceEntityPaths-xAl2jRFm.js";import{n as M,t as te}from"./WorkspaceEntityLink-BRifdJHn.js";var N=e(t(),1),ne=(e,t,n,r)=>`/w/${e}/releases/${t}?object=${encodeURIComponent(n)}&relationship=${encodeURIComponent(r)}#release-work`,P=e=>{let t=e.toLocaleLowerCase(`en-US`);return[`blocked`,`changes requested`,`failed`,`rejected`,`rolled back`,`stopped`,`superseded`].some(e=>t.includes(e))?`critical`:[`approved`,`closed`,`current`,`done`,`merged`,`not required`,`passed`,`ready`,`resolved`,`succeeded`].some(e=>t.includes(e))?`positive`:[`deploying`,`in progress`,`in review`,`pending`,`queued`,`requested`,`running`,`verifying`].some(e=>t.includes(e))?`progress`:`neutral`},F=e=>{switch(e){case`not-requested`:return`Review not requested`;case`requested`:return`Review requested`;case`changes-requested`:return`Changes requested`;case`approved`:return`Approved`;case`merged`:return`Merged`}},I=e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`,L=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),re=e=>{switch(e){case`issue`:return`jira`;case`pull-request`:return`codecommit`;case`page`:return`confluence`;case`pipeline-execution`:case`deployment`:return`codepipeline`;case`time-entry`:return`clockify`}},ie=e=>{switch(e._tag){case`issue`:return e.status;case`pull-request`:return F(e.reviewState);case`page`:case`deployment`:return L(e.status);case`pipeline-execution`:return I(e.status);case`time-entry`:return L(e.approvalState)}},ae=e=>{switch(e._tag){case`issue`:return[{label:`Priority`,value:e.priority??`Not set`},{label:`Estimate`,value:e.estimatePoints===null?`Not set`:`${e.estimatePoints} points`}];case`pull-request`:return[{label:`Repository`,value:e.repository},{label:`Branch`,value:`${e.sourceBranch} → ${e.targetBranch}`},{label:`Revision`,value:e.headRevision}];case`page`:return[{label:`Space`,value:e.spaceKey},{label:`Revision`,value:e.revision}];case`pipeline-execution`:return[{label:`Pipeline`,value:e.pipelineName},{label:`Execution`,value:e.executionId},{label:`Revision`,value:e.triggerRevision}];case`deployment`:return[{label:`Environment`,value:e.environmentId},{label:`Revision`,value:e.revision}];case`time-entry`:return[{label:`Duration`,value:`${e.durationMinutes} minutes`},{label:`Billing`,value:e.billable?`Billable`:`Non-billable`}]}},R=e=>{let t=ie(e.details);return{facts:ae(e.details),id:e.entityId,kind:e.entityType,label:e.displayKey,service:re(e.entityType),status:t,title:e.title,tone:P(t)}},z=(e,t)=>{if(t===null)return null;let n=e.entityProjections.find(({projection:e})=>e.entityState===`present`&&e.entityId===t)?.projection;return n===void 0?null:R(n)},B=e=>e.lifecycle._tag!==`missing`&&e.lifecycle._tag!==`rejected`&&e.lifecycle._tag!==`superseded`,oe=e=>{switch(e.sourceNodeKind===`release`?e.targetNodeKind:e.sourceNodeKind){case`issue`:return`jira`;case`page`:return`confluence`;case`pipeline-execution`:case`deployment`:return`codepipeline`;case`time-entry`:return`clockify`;case`pull-request`:case`release`:case`environment`:return`codecommit`}return`codecommit`},V=e=>{let t=new Map(e.entityProjections.map(({projection:e})=>[e.entityId,e]));return new Map(e.nodes.flatMap(e=>{if(e.resolution._tag!==`resolved`||e.resolution.target._tag!==`entity`)return[];let n=t.get(e.resolution.target.entityId);return n===void 0?[]:[[e.nodeId,n]]}))},se=e=>{switch(e){case`missing`:case`rejected`:return`critical`;case`governed`:case`verified`:return`positive`;case`inferred`:case`proposed`:return`progress`;case`superseded`:return`neutral`}},ce=e=>{switch(e._tag){case`confirmed`:return`Confirmed`;case`inferred`:return`Inferred ${String(Math.round(e.score*100))}%`;case`unknown`:return`Confidence unknown`}},le=(e,t,n,r)=>{let i=r.get(n);if(i!==void 0){let e=R(i);return{href:i.entityState===`present`?j(t,i.entityId):null,kind:e.kind,label:e.label,service:e.service,title:i.entityState===`present`?e.title:`${e.title} · Deleted`}}let a=e.nodes.find(e=>e.nodeId===n);if(a?.resolution._tag===`missing`)return{href:null,kind:a.endpointKind,label:a.resolution.missingKey,service:null,title:`Missing ${L(a.endpointKind)}`};if(a?.resolution._tag===`resolved`&&a.resolution.target._tag===`release`){let t=a.resolution.target.releaseId===e.releaseId;return{href:null,kind:`release`,label:`Release ${a.resolution.target.releaseId.slice(-6)}`,service:null,title:t?`Current release context`:`Connected release`}}return a?.resolution._tag===`resolved`&&a.resolution.target._tag===`environment`?{href:null,kind:`environment`,label:`Environment ${a.resolution.target.environmentId.slice(-6)}`,service:null,title:`Delivery environment`}:{href:null,kind:`unknown`,label:n.slice(-6),service:null,title:`Unresolved graph node`}},ue=(e,t,n)=>{let r=z(e,n);if(r===null||n===null)return null;let i=new Set(e.nodes.flatMap(e=>e.resolution._tag===`resolved`&&e.resolution.target._tag===`entity`&&e.resolution.target.entityId===n?[e.nodeId]:[])),a=V(e);return{relationships:e.relationships.flatMap(n=>{let o=i.has(n.sourceNodeId)?`outgoing`:i.has(n.targetNodeId)?`incoming`:null;if(o===null)return[];let s=o===`outgoing`?n.targetNodeId:n.sourceNodeId;return[{confidence:ce(n.confidence),detailsHref:ne(t,e.releaseId,r.id,n.relationshipId),direction:o,evidenceCount:n.evidenceClaimIds.length,id:n.relationshipId,kind:n.kind,lifecycle:L(n.lifecycle._tag),other:le(e,t,s,a),tone:se(n.lifecycle._tag)}]}).sort((e,t)=>e.kind.localeCompare(t.kind)||e.other.label.localeCompare(t.other.label)||e.id.localeCompare(t.id)),truncated:e.truncated}},de=(e,t,n)=>{if(n===null||t===null||z(e,t)===null)return null;let r=new Set(e.nodes.flatMap(e=>e.resolution._tag===`resolved`&&e.resolution.target._tag===`entity`&&e.resolution.target.entityId===t?[e.nodeId]:[])),i=null;for(let t of e.relationships)t.relationshipId===n&&(r.has(t.sourceNodeId)||r.has(t.targetNodeId))&&(i===null||t.revision>i.revision)&&(i=t);return i},H=(e,t)=>{if(t===null)return[];let n=new Map(e.evidenceClaims.map(e=>[e.evidenceClaimId,e]));return t.evidenceClaimIds.flatMap(e=>{let t=n.get(e);return t===void 0?[]:[t]})},fe=(e,t)=>{let n=new Set;for(let r of H(e,t))n.add(r.evidenceId);return[...n].sort((e,t)=>e.localeCompare(t))},pe=(e,t)=>{let n=new Map(e.nodes.map(e=>[e.nodeId,e]));return new Set(e.relationships.flatMap(r=>{if(r.kind!==`documented-by`||r.sourceNodeKind!==`release`||r.targetNodeKind!==`page`||!B(r))return[];let i=n.get(r.sourceNodeId),a=t.get(r.targetNodeId);return i?.resolution._tag===`resolved`&&i.resolution.target._tag===`release`&&i.resolution.target.releaseId===e.releaseId&&a?.details._tag===`page`?[a.entityId]:[]}))},me=(e,t)=>{let n=e.sourceNodeKind===`issue`?t.get(e.sourceNodeId):e.targetNodeKind===`issue`?t.get(e.targetNodeId):void 0;return n?.details._tag===`issue`&&e.sourceNodeKind===`pull-request`?`${n.details.key} has no CodeCommit pull request`:`Missing ${e.sourceNodeKind} → ${e.targetNodeKind} relationship`},he=(e,t,n)=>{let r=V(e),i=pe(e,r),a=e=>j(t,e.entityId),o=e.entityProjections.map(({projection:e})=>e).filter(e=>e.entityType===`issue`&&e.details._tag===`issue`&&e.entityState===`present`),s=e.entityProjections.map(({projection:e})=>e).filter(e=>e.entityType===`pull-request`&&e.details._tag===`pull-request`&&e.entityState===`present`),c=e.entityProjections.map(({projection:e})=>e).filter(e=>e.entityType===`pipeline-execution`&&e.details._tag===`pipeline-execution`&&e.entityState===`present`),l=e.entityProjections.map(({projection:e})=>e).filter(e=>e.entityType===`page`&&e.details._tag===`page`&&e.entityState===`present`&&i.has(e.entityId));return{jiraItems:o.map(e=>({id:e.entityId,key:e.details.key,title:e.title,state:e.details.status,tone:P(e.details.status),href:a(e)})),pullRequestGroups:s.map(t=>{let n=new Set(Array.from(r).flatMap(([e,n])=>n.entityId===t.entityId?[e]:[])),i=Array.from(new Set(e.relationships.flatMap(e=>{if(e.kind!==`implements`||!n.has(e.sourceNodeId)||!B(e))return[];let t=r.get(e.targetNodeId);return t?.details._tag===`issue`?[t.details.key]:[]}))),o=F(t.details.reviewState);return{id:t.entityId,title:t.title,reference:t.displayKey,state:o,tone:P(o),href:a(t),linkedJiraKeys:i}}),gaps:e.relationships.flatMap(e=>e.lifecycle._tag===`missing`?[{id:e.relationshipId,label:me(e,r),reason:e.lifecycle.reason,service:oe(e)}]:[]),pipelines:c.map(e=>{let t=I(e.details.status);return{id:e.entityId,title:e.title,reference:e.displayKey,state:t,tone:P(t),href:a(e),stages:n}}),runbooks:l.map(e=>({href:a(e),id:e.entityId,reference:e.displayKey,state:e.details.status,title:e.title})),truncated:e.truncated}},U={body:`_body_ahahc_1`,loading:`_loading_ahahc_2`,content:`_content_ahahc_3`,summary:`_summary_ahahc_4`,section:`_section_ahahc_5`,history:`_history_ahahc_6`,evidence:`_evidence_ahahc_7`,evidenceCard:`_evidenceCard_ahahc_8`,claims:`_claims_ahahc_9`,integrity:`_integrity_ahahc_13`,summaryHeading:`_summaryHeading_ahahc_44`,sectionHeading:`_sectionHeading_ahahc_45`,historyHeading:`_historyHeading_ahahc_46`,evidenceHeading:`_evidenceHeading_ahahc_47`,tags:`_tags_ahahc_48`,facts:`_facts_ahahc_65`},ge=A(`UnauthorizedApiError`),_e={load:(e,t,n)=>D(O(function*(){let n=yield*k(),r=yield*n.deliveryGraph.relationshipHistory({params:{relationshipId:e}});return{evidence:yield*E(t,e=>n.deliveryGraph.evidence({params:{evidenceId:e}}),{concurrency:4}),history:r}}).pipe(S(C)),{signal:n})},ve=(e,t,n,r,i=_e)=>{let[a,o]=(0,N.useState)(0),[s,c]=(0,N.useState)({_tag:`idle`}),l=t.join(`:`),u=(0,N.useRef)(t);(0,N.useEffect)(()=>{u.current=t},[t]),(0,N.useEffect)(()=>{if(e===null||n===null){c({_tag:`idle`});return}let t=new AbortController;return c({_tag:`loading`,evidenceKey:l,relationshipId:e,sessionKey:n}),i.load(e,u.current,t.signal).then(r=>{t.signal.aborted||c({_tag:`ready`,details:r,evidenceKey:l,relationshipId:e,sessionKey:n})},i=>{t.signal.aborted||(ge(i)&&r(n),c({_tag:`failed`,evidenceKey:l,relationshipId:e,sessionKey:n}))}),()=>t.abort()},[l,r,e,a,n,i]);let d=e===null||n===null?{_tag:`idle`}:s._tag===`idle`||s.relationshipId!==e||s.sessionKey!==n||s.evidenceKey!==l?{_tag:`loading`,evidenceKey:l,relationshipId:e,sessionKey:n}:s;return{retry:(0,N.useCallback)(()=>o(e=>e+1),[]),state:d}},W=n(),G=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),K=e=>y(e,{day:`2-digit`,hour:`2-digit`,hour12:!1,locale:`en-GB`,minute:`2-digit`,month:`short`,year:`numeric`}),q=e=>{switch(e._tag){case`human`:return`Human · ${e.personId.slice(-6)}`;case`agent`:return`Agent · ${e.agentId.slice(-6)}`;case`system`:return`System · ${e.component}`}},ye=e=>{switch(e._tag){case`plugin`:return`Plugin source · ${e.pluginConnectionId.slice(-6)}`;case`human`:return`Human decision · ${e.personId.slice(-6)}`;case`agent`:return`Agent proposal · ${e.agentId.slice(-6)}`;case`rule`:return`Rule · ${e.ruleId} v${String(e.ruleVersion)}`}},be=e=>{switch(e.confidence._tag){case`confirmed`:return`Confirmed by immutable evidence.`;case`inferred`:case`unknown`:return e.confidence.rationale}},xe=e=>{switch(e.confidence._tag){case`confirmed`:return`Confirmed`;case`inferred`:return`Inferred ${String(Math.round(e.confidence.score*100))}%`;case`unknown`:return`Confidence unknown`}},J=e=>{switch(e.lifecycle._tag){case`missing`:case`rejected`:return`critical`;case`governed`:case`verified`:return`positive`;case`inferred`:case`proposed`:return`progress`;case`superseded`:return`neutral`}},Se=e=>e.scope===null?`Workspace`:e.scope._tag===`release`?`Release · ${e.scope.releaseId.slice(-6)}`:`Environment · ${e.scope.environmentId.slice(-6)}`,Ce=e=>{switch(e.freshness._tag){case`current`:return`positive`;case`stale`:return`caution`;case`missing`:case`unavailable`:return`critical`}},we=e=>{switch(e.lifecycle._tag){case`missing`:case`rejected`:case`superseded`:return e.lifecycle.reason;case`governed`:case`inferred`:case`proposed`:case`verified`:return null}},Y=e=>{switch(e._tag){case`plugin`:return`Plugin · ${e.pluginConnectionId.slice(-6)}`;case`human`:return`Human · ${e.personId.slice(-6)}`;case`agent`:return`Agent · ${e.agentId.slice(-6)}`;case`system`:return`System · ${e.component}`}},Te=e=>{switch(e.value._tag){case`flag`:return e.value.value?`Yes`:`No`;case`state`:case`revision`:return e.value.value;case`reference`:return`Node ${e.value.targetNodeId.slice(-6)}`}},Ee=({claims:e,inspection:t,relationship:n})=>{let r=new Set(n.evidenceClaimIds),i=e.filter(({evidenceClaimId:e,evidenceId:n})=>n===t.evidence.evidenceId&&r.has(e)),a=t.evidence;return(0,W.jsxs)(`article`,{className:U.evidenceCard,children:[(0,W.jsxs)(`div`,{className:U.evidenceHeading,children:[(0,W.jsxs)(f,{as:`h4`,variant:`label`,children:[`Evidence `,a.evidenceId.slice(-6)]}),(0,W.jsx)(c,{label:G(a.freshness._tag),size:`compact`,tone:Ce(a)})]}),(0,W.jsxs)(`dl`,{className:U.facts,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Observed`}),(0,W.jsx)(`dd`,{children:K(a.observedAt)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Source`}),(0,W.jsx)(`dd`,{children:Y(a.attribution)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Verified by`}),(0,W.jsx)(`dd`,{children:Y(a.verifier)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Retention`}),(0,W.jsxs)(`dd`,{children:[G(a.retention.classification),a.retention.legalHold?` · Legal hold`:``]})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Valid until`}),(0,W.jsx)(`dd`,{children:a.validUntil===null?`No expiry recorded`:K(a.validUntil)})]})]}),i.length===0?(0,W.jsx)(f,{tone:`secondary`,variant:`meta`,children:`No referenced claim was returned for this observation.`}):(0,W.jsx)(`ul`,{className:U.claims,children:i.map(e=>(0,W.jsxs)(`li`,{children:[(0,W.jsx)(f,{as:`span`,variant:`label`,children:G(e.predicate)}),(0,W.jsx)(f,{as:`span`,tone:`secondary`,children:Te(e)})]},e.evidenceClaimId))})]})},De=e=>{let t=0;for(let n of e)t=Math.max(t,n.revision);return t>e.length?`${String(e.length)} of ${String(t)} revisions`:`${String(e.length)} revision${e.length===1?``:`s`}`},Oe=({claims:e,evidenceIds:t,onClose:n,onSessionExpired:r,relationship:a,sessionKey:u,transport:d})=>{let p=ve(a?.relationshipId??null,t,u,r,d),m=a===null?`Relationship details`:`${G(a.kind)} relationship`,h=a===null||e.length===a.evidenceClaimIds.length;return(0,W.jsx)(o.Root,{onOpenChange:e=>{e||n()},open:a!==null,children:(0,W.jsx)(o.Content,{closeLabel:`Close ${m}`,description:`Immutable delivery history and the evidence used to establish this connection.`,title:m,children:(0,W.jsx)(o.Body,{className:U.body,children:a===null||p.state._tag===`idle`||p.state._tag===`loading`?(0,W.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading relationship details`,className:U.loading,children:[(0,W.jsx)(i,{height:`7rem`}),(0,W.jsx)(i,{height:`12rem`})]}):p.state._tag===`failed`?(0,W.jsx)(s,{action:(0,W.jsx)(l,{onClick:p.retry,children:`Try again`}),description:`The selected relationship remains unchanged. Its history could not be loaded.`,title:`Relationship details unavailable`,tone:`caution`}):(0,W.jsxs)(`div`,{className:U.content,children:[(0,W.jsxs)(`section`,{"aria-labelledby":`relationship-summary-title`,className:U.summary,children:[(0,W.jsxs)(`div`,{className:U.summaryHeading,children:[(0,W.jsxs)(f,{as:`h3`,id:`relationship-summary-title`,variant:`section-title`,children:[a.sourceNodeKind,` → `,a.targetNodeKind]}),(0,W.jsxs)(`div`,{className:U.tags,children:[(0,W.jsx)(c,{label:G(a.lifecycle._tag),size:`compact`,tone:J(a)}),(0,W.jsx)(c,{label:xe(a),size:`compact`,tone:`neutral`})]})]}),(0,W.jsx)(f,{tone:`secondary`,children:be(a)}),(0,W.jsxs)(`dl`,{className:U.facts,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Revision`}),(0,W.jsx)(`dd`,{children:String(a.revision)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Recorded by`}),(0,W.jsx)(`dd`,{children:q(a.recordedBy)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Origin`}),(0,W.jsx)(`dd`,{children:ye(a.provenance)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Scope`}),(0,W.jsx)(`dd`,{children:Se(a)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Recorded`}),(0,W.jsx)(`dd`,{children:K(a.recordedAt)})]})]})]}),(0,W.jsxs)(`section`,{"aria-labelledby":`relationship-history-title`,className:U.section,children:[(0,W.jsxs)(`div`,{className:U.sectionHeading,children:[(0,W.jsx)(f,{as:`h3`,id:`relationship-history-title`,variant:`label`,children:`History`}),(0,W.jsx)(c,{label:De(p.state.details.history.revisions),size:`compact`,tone:`neutral`})]}),p.state.details.history.revisions.length===0?(0,W.jsx)(f,{tone:`secondary`,children:`No immutable ledger revisions were returned.`}):(0,W.jsx)(`ol`,{className:U.history,children:p.state.details.history.revisions.map(e=>{let t=we(e);return(0,W.jsxs)(`li`,{children:[(0,W.jsxs)(`div`,{className:U.historyHeading,children:[(0,W.jsxs)(f,{as:`span`,variant:`label`,children:[`Revision `,String(e.revision)]}),(0,W.jsx)(c,{label:G(e.lifecycle._tag),size:`compact`,tone:J(e)})]}),(0,W.jsxs)(f,{tone:`secondary`,variant:`meta`,children:[q(e.recordedBy),` ·`,` `,K(e.recordedAt)]}),t===null?null:(0,W.jsx)(f,{tone:`secondary`,children:t})]},`${e.relationshipId}:${String(e.revision)}`)})})]}),(0,W.jsxs)(`section`,{"aria-labelledby":`relationship-evidence-title`,className:U.section,children:[(0,W.jsxs)(`div`,{className:U.sectionHeading,children:[(0,W.jsx)(f,{as:`h3`,id:`relationship-evidence-title`,variant:`label`,children:`Evidence`}),(0,W.jsx)(c,{label:`${String(p.state.details.evidence.length)} observation${p.state.details.evidence.length===1?``:`s`}`,size:`compact`,tone:`neutral`})]}),h?null:(0,W.jsxs)(`div`,{className:U.integrity,children:[(0,W.jsx)(c,{label:`Evidence incomplete`,size:`compact`,tone:`critical`}),(0,W.jsx)(f,{tone:`secondary`,children:`One or more referenced claims are missing from the release slice. Refresh before relying on this relationship.`})]}),p.state.details.evidence.length===0?(0,W.jsx)(f,{tone:`secondary`,children:`No immutable evidence is attached to this relationship revision.`}):(0,W.jsx)(`div`,{className:U.evidence,children:p.state.details.evidence.map(t=>(0,W.jsx)(Ee,{claims:e,inspection:t,relationship:a},t.evidence.evidenceId))})]})]})})})})},ke=w({relationshipDetailOrigin:w({_tag:_(`relationship-detail-origin/v1`),objectId:T,relationshipId:ee})}),Ae=(e,t,n)=>({...x(e)?e:{},relationshipDetailOrigin:{_tag:`relationship-detail-origin/v1`,objectId:t,relationshipId:n}}),je=(e,t,n)=>{let r=b(ke)(e);return v(r)&&r.value.relationshipDetailOrigin.objectId===t&&r.value.relationshipDetailOrigin.relationshipId===n},Me=(e,t,n,r)=>{if(je(t.state,n,r)){e(-1);return}let i=new URLSearchParams(t.search);i.delete(`relationship`),e({hash:t.hash,pathname:t.pathname,search:i.size===0?``:`?${i.toString()}`},{replace:!0,state:t.state})},X={root:`_root_1y5sp_1`,loading:`_loading_1y5sp_2`,context:`_context_1y5sp_3`,contextGroup:`_contextGroup_1y5sp_4`,selected:`_selected_1y5sp_5`,selectedFacts:`_selectedFacts_1y5sp_6`,trace:`_trace_1y5sp_7`,traceList:`_traceList_1y5sp_8`,runbooks:`_runbooks_1y5sp_9`,runbook:`_runbook_1y5sp_9`,contextHeading:`_contextHeading_1y5sp_34`,tags:`_tags_1y5sp_35`,selectedHeading:`_selectedHeading_1y5sp_61`,traceHeading:`_traceHeading_1y5sp_94`,traceRelation:`_traceRelation_1y5sp_95`,traceConnection:`_traceConnection_1y5sp_107`,traceDetails:`_traceDetails_1y5sp_140`},Z=async(e,t)=>{let n=[null,...e],r=[],i=0,a=!1,o=async()=>{for(;!a&&i<n.length;){let e=i;i+=1;let o=n[e];if(o===void 0)return;try{r.push({index:e,value:await t(o)})}catch(e){throw a=!0,e}}},s=Math.min(4,n.length);return await Promise.all(Array.from({length:s},()=>o())),r.sort((e,t)=>e.index-t.index).map(({value:e})=>e)},Q=500,Ne=(e,t)=>{let n=new Map,r=new Map,i=new Map,a=new Map;for(let e of t){for(let t of e.nodes)n.set(t.nodeId,t);for(let t of e.entityProjections)r.set(t.projection.entityId,t);for(let t of e.evidenceClaims)i.set(t.evidenceClaimId,t);for(let t of e.evidenceItems)a.set(t.evidenceId,t)}let o=new Map,s=new Map,c=new Map,l=new Map,u=new Map,d=t.some(e=>e.truncated);for(let e of t.flatMap(({relationships:e})=>e)){let t=`${e.relationshipId}:${String(e.revision)}`;if(c.has(t))continue;let f=[n.get(e.sourceNodeId),n.get(e.targetNodeId)];if(f.some(e=>e===void 0)){d=!0;continue}let p=f.filter(e=>e!==void 0),m=p.filter(e=>e.resolution._tag===`resolved`&&e.resolution.target._tag===`entity`),h=m.flatMap(e=>{if(e.resolution._tag!==`resolved`||e.resolution.target._tag!==`entity`)return[];let t=r.get(e.resolution.target.entityId);return t===void 0?[]:[t]}),g=e.evidenceClaimIds.flatMap(e=>{let t=i.get(e);return t===void 0?[]:[t]}),_=new Set(g.map(({evidenceId:e})=>e)),v=[..._].flatMap(e=>{let t=a.get(e);return t===void 0?[]:[t]}),y=h.length!==m.length||g.length!==e.evidenceClaimIds.length||v.length!==_.size,b=p.filter(({nodeId:e})=>!o.has(e)).length,x=h.filter(({projection:e})=>!s.has(e.entityId)).length,S=g.filter(({evidenceClaimId:e})=>!l.has(e)).length,C=v.filter(({evidenceId:e})=>!u.has(e)).length,w=c.size===Q||o.size+b>Q||s.size+x>Q||l.size+S>Q||u.size+C>Q;if(y||w){d=!0;continue}c.set(t,e);for(let e of p)o.set(e.nodeId,e);for(let e of h)s.set(e.projection.entityId,e);for(let e of g)l.set(e.evidenceClaimId,e);for(let e of v)u.set(e.evidenceId,e)}return{releaseId:e,environmentId:null,truncated:d,nodes:[...o.values()],entityProjections:[...s.values()],relationships:[...c.values()],evidenceClaims:[...l.values()],evidenceItems:[...u.values()]}},Pe=A(`UnauthorizedApiError`),Fe=async(e,t,n,r)=>Z(t,t=>r.load(e,t,n)),Ie={load:(e,t,n)=>D(O(function*(){return yield*(yield*k()).deliveryGraph.releaseSlice({params:{releaseId:e},query:t===null?{}:{environmentId:t}})}).pipe(S(C)),{signal:n})},Le=(e,t,n,r,i=Ie)=>{let[a,o]=(0,N.useState)(0),[s,c]=(0,N.useState)({_tag:`idle`}),l=t.join(`:`);(0,N.useEffect)(()=>{if(n===null){c({_tag:`idle`});return}let a=new AbortController;return c({_tag:`loading`,environmentScopeKey:l,releaseId:e,sessionKey:n}),Fe(e,t,a.signal,i).then(t=>{a.signal.aborted||c({_tag:`ready`,environmentScopeKey:l,inspection:Ne(e,t),releaseId:e,sessionKey:n})},t=>{a.signal.aborted||(Pe(t)&&r(n),c({_tag:`failed`,environmentScopeKey:l,releaseId:e,sessionKey:n}))}),()=>a.abort()},[l,r,e,a,n,i]);let u=n===null?{_tag:`idle`}:s._tag===`idle`||s.releaseId!==e||s.sessionKey!==n||s.environmentScopeKey!==l?{_tag:`loading`,environmentScopeKey:l,releaseId:e,sessionKey:n}:s;return{retry:(0,N.useCallback)(()=>o(e=>e+1),[]),state:u}},Re=()=>(0,W.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading release work`,className:X.loading,children:[(0,W.jsx)(i,{height:`3rem`}),(0,W.jsx)(i,{height:`15rem`})]}),ze=({linkLocation:e,selectedObject:t,trace:n})=>(0,W.jsxs)(`section`,{"aria-label":`Selected ${t.kind} ${t.label}`,className:X.selected,children:[(0,W.jsxs)(`div`,{className:X.selectedHeading,children:[(0,W.jsx)(g,{service:t.service,size:`compact`}),(0,W.jsxs)(f,{as:`p`,variant:`label`,children:[`Selected object · `,t.label]}),(0,W.jsx)(c,{label:t.status,size:`compact`,tone:t.tone})]}),(0,W.jsx)(f,{as:`h3`,variant:`section-title`,children:t.title}),(0,W.jsx)(f,{tone:`secondary`,variant:`meta`,children:t.kind}),(0,W.jsx)(`dl`,{className:X.selectedFacts,children:t.facts.map(e=>(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:e.label}),(0,W.jsx)(`dd`,{children:e.value})]},e.label))}),n===void 0?null:(0,W.jsxs)(`div`,{className:X.trace,children:[(0,W.jsxs)(`div`,{className:X.traceHeading,children:[(0,W.jsx)(f,{as:`h4`,variant:`label`,children:`Delivery trace`}),(0,W.jsx)(c,{label:`${n.relationships.length} relationship${n.relationships.length===1?``:`s`}${n.truncated?`+`:``}`,size:`compact`,tone:n.truncated?`caution`:`neutral`})]}),n.relationships.length===0?(0,W.jsx)(f,{tone:`secondary`,children:`No relationship touches this object in the current release slice.`}):(0,W.jsx)(`ul`,{className:X.traceList,children:n.relationships.map(n=>(0,W.jsxs)(`li`,{children:[n.other.service===null?null:(0,W.jsx)(g,{service:n.other.service,size:`compact`}),(0,W.jsxs)(`div`,{className:X.traceConnection,children:[(0,W.jsxs)(f,{as:`p`,variant:`label`,children:[n.direction===`incoming`?`From`:`To`,` `,n.other.label]}),n.other.href===null?(0,W.jsx)(f,{tone:`secondary`,children:n.other.title}):(0,W.jsx)(a,{state:e===void 0?void 0:M(n.other.href,e),to:n.other.href,children:n.other.title})]}),(0,W.jsxs)(`div`,{className:X.traceRelation,children:[(0,W.jsx)(f,{as:`span`,tone:`secondary`,variant:`meta`,children:n.kind}),(0,W.jsx)(c,{label:n.lifecycle,size:`compact`,tone:n.tone})]}),(0,W.jsxs)(f,{as:`span`,tone:`secondary`,variant:`meta`,children:[n.confidence,` · `,n.evidenceCount,` evidence claim`,n.evidenceCount===1?``:`s`]}),(0,W.jsx)(a,{"aria-label":`Details for ${n.kind} ${n.direction} relationship with ${n.other.label}`,className:X.traceDetails,state:Ae(e?.state,t.id,n.id),to:n.detailsHref,children:`Details`})]},n.id))})]})]}),$=p,Be=({release:e,workspaceId:t})=>{let n=m(),i=u(),o=r(),p=$(n.state),_=Le(e.id,e.targetEnvironmentIds,p,n.invalidateSession);if(p===null||_.state._tag===`idle`||_.state._tag===`loading`)return(0,W.jsx)(Re,{});if(_.state._tag===`failed`)return(0,W.jsx)(s,{action:(0,W.jsx)(l,{onClick:_.retry,children:`Try again`}),description:`Control Center could not read the delivery graph for this release. Saved release facts remain unchanged.`,title:`Release work unavailable`,tone:`caution`});let v=he(_.state.inspection,t,e.stages),y=new URLSearchParams(i.search),b=y.get(`object`),x=y.get(`relationship`),S=z(_.state.inspection,b),C=ue(_.state.inspection,t,b),w=de(_.state.inspection,b,x),T=fe(_.state.inspection,w),E=H(_.state.inspection,w);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:X.root,children:[(0,W.jsxs)(`div`,{className:X.context,children:[(0,W.jsxs)(`div`,{className:X.contextGroup,children:[(0,W.jsx)(f,{as:`h3`,variant:`label`,children:`Environment`}),e.targetEnvironmentIds.length===0?(0,W.jsx)(f,{tone:`secondary`,children:`No target environment recorded.`}):(0,W.jsx)(`div`,{className:X.tags,children:e.targetEnvironmentIds.map(e=>(0,W.jsx)(c,{label:`Unknown target · ${e.slice(-4)}`,size:`compact`,title:`Environment ${e}; provider metadata unavailable`,tone:`neutral`},e))})]}),(0,W.jsxs)(`div`,{className:X.contextGroup,children:[(0,W.jsxs)(`div`,{className:X.contextHeading,children:[(0,W.jsx)(g,{service:`confluence`,size:`compact`}),(0,W.jsx)(f,{as:`h3`,variant:`label`,children:`Runbook`})]}),v.runbooks.length===0?(0,W.jsx)(f,{tone:`secondary`,children:`No runbook linked.`}):(0,W.jsx)(`div`,{className:X.runbooks,children:v.runbooks.map(e=>(0,W.jsxs)(a,{className:X.runbook,state:M(e.href,i),to:e.href,children:[(0,W.jsx)(`strong`,{children:e.title}),(0,W.jsx)(`span`,{children:e.reference})]},e.id))})]}),v.truncated?(0,W.jsx)(c,{label:`Bounded view · more records exist`,size:`compact`,tone:`caution`}):null,S===null||C===null?null:(0,W.jsx)(ze,{linkLocation:i,selectedObject:S,trace:C})]}),(0,W.jsx)(d,{component:te,children:(0,W.jsx)(h,{gaps:v.gaps,heading:`${e.serviceName} release work`,jiraItems:v.jiraItems,pipelines:v.pipelines,pullRequestGroups:v.pullRequestGroups})})]}),(0,W.jsx)(Oe,{claims:E,evidenceIds:T,onClose:()=>{S===null||w===null||Me(o,i,S.id,w.relationshipId)},onSessionExpired:n.invalidateSession,relationship:w,sessionKey:p})]})};export{$ as n,Z as r,Be as t};
2
- //# sourceMappingURL=ReleaseWorkset-BhGacsgb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReleaseWorkset-BhGacsgb.js","names":[],"sources":["../../../src/client/releases/presentReleaseWorkset.ts","../../../src/client/releases/RelationshipDetailSheet.module.css","../../../src/client/releases/useRelationshipDetails.ts","../../../src/client/releases/RelationshipDetailSheet.tsx","../../../src/client/releases/relationshipDetailRoute.ts","../../../src/client/releases/ReleaseWorkset.module.css","../../../src/client/releases/loadReleaseEnvironmentSlices.ts","../../../src/client/releases/useReleaseWorkset.ts","../../../src/client/releases/ReleaseWorkset.tsx"],"sourcesContent":["import type {\n RlyService,\n RlyStage,\n RlyWorksetGap,\n RlyWorksetJiraItem,\n RlyWorksetPipeline,\n RlyWorksetPullRequestGroup\n} from \"@knpkv/rly/patterns\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\n\nimport type { ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport type {\n DeliveryEntityDetails,\n DeliveryEntityProjection,\n DeliveryRelationship,\n EvidenceClaim\n} from \"../../domain/deliveryGraph.js\"\nimport type {\n EntityId,\n EvidenceId,\n GraphNodeId,\n RelationshipId,\n ReleaseId,\n WorkspaceId\n} from \"../../domain/identifiers.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\ntype Projection = ReleaseDeliveryGraphInspection[\"entityProjections\"][number][\"projection\"]\ntype ProjectionWithDetails<Tag extends DeliveryEntityDetails[\"_tag\"]> = Projection & {\n readonly details: Extract<DeliveryEntityDetails, { readonly _tag: Tag }>\n}\n\nexport interface ReleaseWorksetRunbook {\n readonly href: string\n readonly id: EntityId\n readonly reference: string\n readonly state: string\n readonly title: string\n}\n\nexport interface SelectedReleaseWorksetObject {\n readonly facts: ReadonlyArray<{ readonly label: string; readonly value: string }>\n readonly id: EntityId\n readonly kind: DeliveryEntityProjection[\"entityType\"]\n readonly label: string\n readonly service: RlyService\n readonly status: string\n readonly title: string\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTraceConnection {\n readonly href: string | null\n readonly kind: string\n readonly label: string\n readonly service: RlyService | null\n readonly title: string\n}\n\nexport interface SelectedReleaseWorksetTraceRelationship {\n readonly confidence: string\n readonly detailsHref: string\n readonly direction: \"incoming\" | \"outgoing\"\n readonly evidenceCount: number\n readonly id: RelationshipId\n readonly kind: DeliveryRelationship[\"kind\"]\n readonly lifecycle: string\n readonly other: SelectedReleaseWorksetTraceConnection\n readonly tone: RlyStateTone\n}\n\nexport interface SelectedReleaseWorksetTrace {\n readonly relationships: ReadonlyArray<SelectedReleaseWorksetTraceRelationship>\n readonly truncated: boolean\n}\n\nexport interface ReleaseWorksetPresentation {\n readonly gaps: ReadonlyArray<RlyWorksetGap>\n readonly jiraItems: ReadonlyArray<RlyWorksetJiraItem>\n readonly pipelines: ReadonlyArray<RlyWorksetPipeline>\n readonly pullRequestGroups: ReadonlyArray<RlyWorksetPullRequestGroup>\n readonly runbooks: ReadonlyArray<ReleaseWorksetRunbook>\n readonly truncated: boolean\n}\n\nconst relationshipHref = (\n workspaceId: WorkspaceId,\n releaseId: ReleaseId,\n entityId: EntityId,\n relationshipId: RelationshipId\n): string =>\n `/w/${workspaceId}/releases/${releaseId}?object=${encodeURIComponent(entityId)}&relationship=${\n encodeURIComponent(relationshipId)\n }#release-work`\n\nconst statusTone = (status: string): RlyStateTone => {\n const normalized = status.toLocaleLowerCase(\"en-US\")\n if (\n [\"blocked\", \"changes requested\", \"failed\", \"rejected\", \"rolled back\", \"stopped\", \"superseded\"].some(\n (value) => normalized.includes(value)\n )\n ) {\n return \"critical\"\n }\n if (\n [\"approved\", \"closed\", \"current\", \"done\", \"merged\", \"not required\", \"passed\", \"ready\", \"resolved\", \"succeeded\"]\n .some((value) => normalized.includes(value))\n ) return \"positive\"\n if (\n [\"deploying\", \"in progress\", \"in review\", \"pending\", \"queued\", \"requested\", \"running\", \"verifying\"]\n .some((value) => normalized.includes(value))\n ) return \"progress\"\n return \"neutral\"\n}\n\nconst reviewStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pull-request\" }>[\"reviewState\"]\n): string => {\n switch (state) {\n case \"not-requested\":\n return \"Review not requested\"\n case \"requested\":\n return \"Review requested\"\n case \"changes-requested\":\n return \"Changes requested\"\n case \"approved\":\n return \"Approved\"\n case \"merged\":\n return \"Merged\"\n }\n}\n\nconst pipelineStateLabel = (\n state: Extract<DeliveryEntityDetails, { readonly _tag: \"pipeline-execution\" }>[\"status\"]\n): string => `${state.charAt(0).toLocaleUpperCase(\"en-US\")}${state.slice(1)}`\n\nconst titleCase = (value: string): string =>\n value.split(\"-\").map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`).join(\" \")\n\nconst selectedObjectService = (kind: DeliveryEntityProjection[\"entityType\"]): RlyService => {\n switch (kind) {\n case \"issue\":\n return \"jira\"\n case \"pull-request\":\n return \"codecommit\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n }\n}\n\nconst selectedObjectStatus = (details: DeliveryEntityDetails): string => {\n switch (details._tag) {\n case \"issue\":\n return details.status\n case \"pull-request\":\n return reviewStateLabel(details.reviewState)\n case \"page\":\n case \"deployment\":\n return titleCase(details.status)\n case \"pipeline-execution\":\n return pipelineStateLabel(details.status)\n case \"time-entry\":\n return titleCase(details.approvalState)\n }\n}\n\nconst selectedObjectFacts = (\n details: DeliveryEntityDetails\n): ReadonlyArray<{ readonly label: string; readonly value: string }> => {\n switch (details._tag) {\n case \"issue\":\n return [\n { label: \"Priority\", value: details.priority ?? \"Not set\" },\n { label: \"Estimate\", value: details.estimatePoints === null ? \"Not set\" : `${details.estimatePoints} points` }\n ]\n case \"pull-request\":\n return [\n { label: \"Repository\", value: details.repository },\n { label: \"Branch\", value: `${details.sourceBranch} → ${details.targetBranch}` },\n { label: \"Revision\", value: details.headRevision }\n ]\n case \"page\":\n return [\n { label: \"Space\", value: details.spaceKey },\n { label: \"Revision\", value: details.revision }\n ]\n case \"pipeline-execution\":\n return [\n { label: \"Pipeline\", value: details.pipelineName },\n { label: \"Execution\", value: details.executionId },\n { label: \"Revision\", value: details.triggerRevision }\n ]\n case \"deployment\":\n return [\n { label: \"Environment\", value: details.environmentId },\n { label: \"Revision\", value: details.revision }\n ]\n case \"time-entry\":\n return [\n { label: \"Duration\", value: `${details.durationMinutes} minutes` },\n { label: \"Billing\", value: details.billable ? \"Billable\" : \"Non-billable\" }\n ]\n }\n}\n\nconst presentSelectedObject = (selected: DeliveryEntityProjection): SelectedReleaseWorksetObject => {\n const status = selectedObjectStatus(selected.details)\n return {\n facts: selectedObjectFacts(selected.details),\n id: selected.entityId,\n kind: selected.entityType,\n label: selected.displayKey,\n service: selectedObjectService(selected.entityType),\n status,\n title: selected.title,\n tone: statusTone(status)\n }\n}\n\n/** Resolve every present normalized object into an inspectable selected-object surface. */\nexport const selectReleaseWorksetObject = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null\n): SelectedReleaseWorksetObject | null => {\n if (selectedObjectId === null) return null\n const selected = inspection.entityProjections.find(\n ({ projection }) => projection.entityState === \"present\" && projection.entityId === selectedObjectId\n )?.projection\n if (selected === undefined) return null\n return presentSelectedObject(selected)\n}\n\nconst currentRelationship = (relationship: DeliveryRelationship): boolean =>\n relationship.lifecycle._tag !== \"missing\" &&\n relationship.lifecycle._tag !== \"rejected\" &&\n relationship.lifecycle._tag !== \"superseded\"\n\nconst gapService = (relationship: DeliveryRelationship): RlyService => {\n const missingKind = relationship.sourceNodeKind === \"release\"\n ? relationship.targetNodeKind\n : relationship.sourceNodeKind\n switch (missingKind) {\n case \"issue\":\n return \"jira\"\n case \"page\":\n return \"confluence\"\n case \"pipeline-execution\":\n case \"deployment\":\n return \"codepipeline\"\n case \"time-entry\":\n return \"clockify\"\n case \"pull-request\":\n case \"release\":\n case \"environment\":\n return \"codecommit\"\n }\n return \"codecommit\"\n}\n\nconst entityProjectionByNode = (\n inspection: ReleaseDeliveryGraphInspection\n): ReadonlyMap<GraphNodeId, DeliveryEntityProjection> => {\n const projections = new Map(inspection.entityProjections.map(({ projection }) => [projection.entityId, projection]))\n return new Map(\n inspection.nodes.flatMap((node): ReadonlyArray<readonly [GraphNodeId, DeliveryEntityProjection]> => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = projections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [[node.nodeId, projection]]\n })\n )\n}\n\nconst relationshipLifecycleTone = (lifecycle: DeliveryRelationship[\"lifecycle\"][\"_tag\"]): RlyStateTone => {\n switch (lifecycle) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipConfidenceLabel = (confidence: DeliveryRelationship[\"confidence\"]): string => {\n switch (confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst traceConnection = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n nodeId: GraphNodeId,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): SelectedReleaseWorksetTraceConnection => {\n const projection = projections.get(nodeId)\n if (projection !== undefined) {\n const selected = presentSelectedObject(projection)\n return {\n href: projection.entityState === \"present\"\n ? workspaceEntityPath(workspaceId, projection.entityId)\n : null,\n kind: selected.kind,\n label: selected.label,\n service: selected.service,\n title: projection.entityState === \"present\" ? selected.title : `${selected.title} · Deleted`\n }\n }\n const node = inspection.nodes.find((candidate) => candidate.nodeId === nodeId)\n if (node?.resolution._tag === \"missing\") {\n return {\n href: null,\n kind: node.endpointKind,\n label: node.resolution.missingKey,\n service: null,\n title: `Missing ${titleCase(node.endpointKind)}`\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"release\") {\n const isCurrentRelease = node.resolution.target.releaseId === inspection.releaseId\n return {\n href: null,\n kind: \"release\",\n label: `Release ${node.resolution.target.releaseId.slice(-6)}`,\n service: null,\n title: isCurrentRelease ? \"Current release context\" : \"Connected release\"\n }\n }\n if (node?.resolution._tag === \"resolved\" && node.resolution.target._tag === \"environment\") {\n return {\n href: null,\n kind: \"environment\",\n label: `Environment ${node.resolution.target.environmentId.slice(-6)}`,\n service: null,\n title: \"Delivery environment\"\n }\n }\n return { href: null, kind: \"unknown\", label: nodeId.slice(-6), service: null, title: \"Unresolved graph node\" }\n}\n\n/** Center the bounded current release graph on one selected normalized object. */\nexport const selectReleaseWorksetTrace = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n selectedObjectId: string | null\n): SelectedReleaseWorksetTrace | null => {\n const selectedObject = selectReleaseWorksetObject(inspection, selectedObjectId)\n if (selectedObject === null || selectedObjectId === null) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n const projections = entityProjectionByNode(inspection)\n const relationships = inspection.relationships.flatMap(\n (relationship): ReadonlyArray<SelectedReleaseWorksetTraceRelationship> => {\n const direction = selectedNodeIds.has(relationship.sourceNodeId)\n ? \"outgoing\"\n : selectedNodeIds.has(relationship.targetNodeId)\n ? \"incoming\"\n : null\n if (direction === null) return []\n const otherNodeId = direction === \"outgoing\" ? relationship.targetNodeId : relationship.sourceNodeId\n return [{\n confidence: relationshipConfidenceLabel(relationship.confidence),\n detailsHref: relationshipHref(\n workspaceId,\n inspection.releaseId,\n selectedObject.id,\n relationship.relationshipId\n ),\n direction,\n evidenceCount: relationship.evidenceClaimIds.length,\n id: relationship.relationshipId,\n kind: relationship.kind,\n lifecycle: titleCase(relationship.lifecycle._tag),\n other: traceConnection(inspection, workspaceId, otherNodeId, projections),\n tone: relationshipLifecycleTone(relationship.lifecycle._tag)\n }]\n }\n ).sort((left, right) =>\n left.kind.localeCompare(right.kind) || left.other.label.localeCompare(right.other.label) ||\n left.id.localeCompare(right.id)\n )\n return { relationships, truncated: inspection.truncated }\n}\n\n/** Resolve a URL-selected relationship only when it touches the selected object in this bounded slice. */\nexport const selectReleaseWorksetRelationship = (\n inspection: ReleaseDeliveryGraphInspection,\n selectedObjectId: string | null,\n selectedRelationshipId: string | null\n): DeliveryRelationship | null => {\n if (\n selectedRelationshipId === null ||\n selectedObjectId === null ||\n selectReleaseWorksetObject(inspection, selectedObjectId) === null\n ) return null\n const selectedNodeIds = new Set(\n inspection.nodes.flatMap((node): ReadonlyArray<GraphNodeId> =>\n node.resolution._tag === \"resolved\" &&\n node.resolution.target._tag === \"entity\" &&\n node.resolution.target.entityId === selectedObjectId\n ? [node.nodeId]\n : []\n )\n )\n let selected: DeliveryRelationship | null = null\n for (const relationship of inspection.relationships) {\n if (\n relationship.relationshipId === selectedRelationshipId &&\n (selectedNodeIds.has(relationship.sourceNodeId) || selectedNodeIds.has(relationship.targetNodeId)) &&\n (selected === null || relationship.revision > selected.revision)\n ) selected = relationship\n }\n return selected\n}\n\n/** Resolve exact referenced claims from the closure-checked release slice. */\nexport const releaseWorksetRelationshipEvidenceClaims = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceClaim> => {\n if (relationship === null) return []\n const claimById = new Map(inspection.evidenceClaims.map((claim) => [claim.evidenceClaimId, claim]))\n return relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = claimById.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n}\n\n/** Resolve the unique evidence observations referenced by one relationship from the closed release slice. */\nexport const releaseWorksetRelationshipEvidenceIds = (\n inspection: ReleaseDeliveryGraphInspection,\n relationship: DeliveryRelationship | null\n): ReadonlyArray<EvidenceId> => {\n const evidenceIds = new Set<EvidenceId>()\n for (const claim of releaseWorksetRelationshipEvidenceClaims(inspection, relationship)) {\n evidenceIds.add(claim.evidenceId)\n }\n return [...evidenceIds].sort((left, right) => left.localeCompare(right))\n}\n\nconst releaseRunbookEntityIds = (\n inspection: ReleaseDeliveryGraphInspection,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): ReadonlySet<EntityId> => {\n const nodes = new Map(inspection.nodes.map((node) => [node.nodeId, node]))\n return new Set(\n inspection.relationships.flatMap((relationship): ReadonlyArray<EntityId> => {\n if (\n relationship.kind !== \"documented-by\" ||\n relationship.sourceNodeKind !== \"release\" ||\n relationship.targetNodeKind !== \"page\" ||\n !currentRelationship(relationship)\n ) return []\n const source = nodes.get(relationship.sourceNodeId)\n const target = projections.get(relationship.targetNodeId)\n return source?.resolution._tag === \"resolved\" &&\n source.resolution.target._tag === \"release\" &&\n source.resolution.target.releaseId === inspection.releaseId &&\n target?.details._tag === \"page\"\n ? [target.entityId]\n : []\n })\n )\n}\n\nconst gapLabel = (\n relationship: DeliveryRelationship,\n projections: ReadonlyMap<GraphNodeId, DeliveryEntityProjection>\n): string => {\n const issue = relationship.sourceNodeKind === \"issue\"\n ? projections.get(relationship.sourceNodeId)\n : relationship.targetNodeKind === \"issue\"\n ? projections.get(relationship.targetNodeId)\n : undefined\n if (issue?.details._tag === \"issue\" && relationship.sourceNodeKind === \"pull-request\") {\n return `${issue.details.key} has no CodeCommit pull request`\n }\n return `Missing ${relationship.sourceNodeKind} → ${relationship.targetNodeKind} relationship`\n}\n\n/** Present one bounded graph inspection as three explicit release-work dimensions. */\nexport const presentReleaseWorkset = (\n inspection: ReleaseDeliveryGraphInspection,\n workspaceId: WorkspaceId,\n stages: ReadonlyArray<RlyStage>\n): ReleaseWorksetPresentation => {\n const projections = entityProjectionByNode(inspection)\n const runbookEntityIds = releaseRunbookEntityIds(inspection, projections)\n const href = (projection: DeliveryEntityProjection): string => workspaceEntityPath(workspaceId, projection.entityId)\n const issues = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"issue\"> =>\n projection.entityType === \"issue\" && projection.details._tag === \"issue\" && projection.entityState === \"present\"\n )\n const pullRequests = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pull-request\"> =>\n projection.entityType === \"pull-request\" &&\n projection.details._tag === \"pull-request\" &&\n projection.entityState === \"present\"\n )\n const pipelineExecutions = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"pipeline-execution\"> =>\n projection.entityType === \"pipeline-execution\" &&\n projection.details._tag === \"pipeline-execution\" &&\n projection.entityState === \"present\"\n )\n const pages = inspection.entityProjections\n .map(({ projection }) => projection)\n .filter((projection): projection is ProjectionWithDetails<\"page\"> =>\n projection.entityType === \"page\" &&\n projection.details._tag === \"page\" &&\n projection.entityState === \"present\" &&\n runbookEntityIds.has(projection.entityId)\n )\n\n return {\n jiraItems: issues.map((issue) => ({\n id: issue.entityId,\n key: issue.details.key,\n title: issue.title,\n state: issue.details.status,\n tone: statusTone(issue.details.status),\n href: href(issue)\n })),\n pullRequestGroups: pullRequests.map((pullRequest) => {\n const sourceNodes = new Set(\n Array.from(projections).flatMap(([nodeId, projection]): ReadonlyArray<GraphNodeId> =>\n projection.entityId === pullRequest.entityId ? [nodeId] : []\n )\n )\n const linkedJiraKeys = Array.from(\n new Set(inspection.relationships.flatMap((relationship): ReadonlyArray<string> => {\n if (\n relationship.kind !== \"implements\" ||\n !sourceNodes.has(relationship.sourceNodeId) ||\n !currentRelationship(relationship)\n ) return []\n const issue = projections.get(relationship.targetNodeId)\n return issue?.details._tag === \"issue\" ? [issue.details.key] : []\n }))\n )\n const state = reviewStateLabel(pullRequest.details.reviewState)\n return {\n id: pullRequest.entityId,\n title: pullRequest.title,\n reference: pullRequest.displayKey,\n state,\n tone: statusTone(state),\n href: href(pullRequest),\n linkedJiraKeys\n }\n }),\n gaps: inspection.relationships.flatMap((relationship): ReadonlyArray<RlyWorksetGap> =>\n relationship.lifecycle._tag === \"missing\"\n ? [{\n id: relationship.relationshipId,\n label: gapLabel(relationship, projections),\n reason: relationship.lifecycle.reason,\n service: gapService(relationship)\n }]\n : []\n ),\n pipelines: pipelineExecutions.map((pipeline) => {\n const state = pipelineStateLabel(pipeline.details.status)\n return {\n id: pipeline.entityId,\n title: pipeline.title,\n reference: pipeline.displayKey,\n state,\n tone: statusTone(state),\n href: href(pipeline),\n stages\n }\n }),\n runbooks: pages.map((page) => ({\n href: href(page),\n id: page.entityId,\n reference: page.displayKey,\n state: page.details.status,\n title: page.title\n })),\n truncated: inspection.truncated\n }\n}\n",".body,\n.loading,\n.content,\n.summary,\n.section,\n.history,\n.evidence,\n.evidenceCard,\n.claims {\n display: grid;\n}\n\n.integrity {\n display: flex;\n align-items: flex-start;\n gap: var(--rly-space-8);\n}\n\n.integrity p {\n margin: 0;\n}\n\n.body,\n.content,\n.loading {\n gap: var(--rly-space-20);\n}\n\n.content,\n.summary,\n.section,\n.evidenceCard {\n gap: var(--rly-space-12);\n}\n\n.summary,\n.evidenceCard {\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.summaryHeading,\n.sectionHeading,\n.historyHeading,\n.evidenceHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-8);\n}\n\n.tags {\n justify-content: flex-end;\n}\n\n.summary h3,\n.section h3,\n.evidenceCard h4,\n.summary p,\n.history p,\n.facts dd {\n margin: 0;\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.facts div {\n min-width: 0;\n}\n\n.facts 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.facts dd {\n overflow-wrap: anywhere;\n}\n\n.history,\n.claims {\n gap: var(--rly-space-8);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.history li,\n.claims li {\n display: grid;\n gap: var(--rly-space-4);\n padding: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.history li:first-child,\n.claims li:first-child {\n border-block-start: 0;\n}\n\n.claims li {\n grid-template-columns: minmax(8rem, auto) minmax(0, 1fr);\n}\n\n@media (max-width: 36rem) {\n .facts,\n .claims li {\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, useRef, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { EvidenceId, RelationshipId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY = 4\n\nexport interface RelationshipDetails {\n readonly evidence: ReadonlyArray<EvidenceInspection>\n readonly history: RelationshipHistoryInspection\n}\n\nexport interface RelationshipDetailsTransport {\n readonly load: (\n relationshipId: RelationshipId,\n evidenceIds: ReadonlyArray<EvidenceId>,\n signal: AbortSignal\n ) => Promise<RelationshipDetails>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load one relationship ledger and only the immutable evidence it references. */\nexport const browserRelationshipDetailsTransport: RelationshipDetailsTransport = {\n load: (relationshipId, evidenceIds, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n const history = yield* client.deliveryGraph.relationshipHistory({ params: { relationshipId } })\n const evidence = yield* Effect.forEach(\n evidenceIds,\n (evidenceId) => client.deliveryGraph.evidence({ params: { evidenceId } }),\n { concurrency: MAXIMUM_RELATIONSHIP_EVIDENCE_REQUEST_CONCURRENCY }\n )\n return { evidence, history }\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nexport type RelationshipDetailsState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly details: RelationshipDetails\n readonly evidenceKey: string\n readonly relationshipId: RelationshipId\n readonly sessionKey: string\n }\n\n/** Keep relationship details bound to the exact selection and authenticated browser session. */\nexport const useRelationshipDetails = (\n relationshipId: RelationshipId | null,\n evidenceIds: ReadonlyArray<EvidenceId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: RelationshipDetailsTransport = browserRelationshipDetailsTransport\n): { readonly retry: () => void; readonly state: RelationshipDetailsState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<RelationshipDetailsState>({ _tag: \"idle\" })\n const evidenceKey = evidenceIds.join(\":\")\n const evidenceIdsRef = useRef(evidenceIds)\n\n useEffect(() => {\n evidenceIdsRef.current = evidenceIds\n }, [evidenceIds])\n\n useEffect(() => {\n if (relationshipId === null || sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", evidenceKey, relationshipId, sessionKey })\n transport.load(relationshipId, evidenceIdsRef.current, abort.signal).then(\n (details) => {\n if (!abort.signal.aborted) setState({ _tag: \"ready\", details, evidenceKey, relationshipId, sessionKey })\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", evidenceKey, relationshipId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [evidenceKey, onSessionExpired, relationshipId, requestRevision, sessionKey, transport])\n\n const currentState: RelationshipDetailsState = relationshipId === null || sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.relationshipId !== relationshipId ||\n state.sessionKey !== sessionKey ||\n state.evidenceKey !== evidenceKey\n ? { _tag: \"loading\", evidenceKey, relationshipId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { Button, Sheet, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport type { RlyStateTone } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport type { ReactElement } from \"react\"\n\nimport type { EvidenceInspection, RelationshipHistoryInspection } from \"../../api/deliveryGraph.js\"\nimport type { DeliveryRelationship, EvidenceClaim, EvidenceItem } from \"../../domain/deliveryGraph.js\"\nimport type { EvidenceId } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport styles from \"./RelationshipDetailSheet.module.css\"\nimport { type RelationshipDetailsTransport, useRelationshipDetails } from \"./useRelationshipDetails.js\"\n\nconst titleCase = (value: string): string =>\n value\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const formatRelationshipTimestamp = (value: UtcTimestamp): string =>\n DateTime.formatUtc(value, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hour12: false,\n locale: \"en-GB\",\n minute: \"2-digit\",\n month: \"short\",\n year: \"numeric\"\n })\n\nexport const relationshipActorLabel = (actor: DeliveryRelationship[\"recordedBy\"]): string => {\n switch (actor._tag) {\n case \"human\":\n return `Human · ${actor.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${actor.agentId.slice(-6)}`\n case \"system\":\n return `System · ${actor.component}`\n }\n}\n\nexport const relationshipProvenanceLabel = (provenance: DeliveryRelationship[\"provenance\"]): string => {\n switch (provenance._tag) {\n case \"plugin\":\n return `Plugin source · ${provenance.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human decision · ${provenance.personId.slice(-6)}`\n case \"agent\":\n return `Agent proposal · ${provenance.agentId.slice(-6)}`\n case \"rule\":\n return `Rule · ${provenance.ruleId} v${String(provenance.ruleVersion)}`\n }\n}\n\nconst relationshipRationale = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed by immutable evidence.\"\n case \"inferred\":\n case \"unknown\":\n return relationship.confidence.rationale\n }\n}\n\nconst relationshipConfidenceLabel = (relationship: DeliveryRelationship): string => {\n switch (relationship.confidence._tag) {\n case \"confirmed\":\n return \"Confirmed\"\n case \"inferred\":\n return `Inferred ${String(Math.round(relationship.confidence.score * 100))}%`\n case \"unknown\":\n return \"Confidence unknown\"\n }\n}\n\nconst relationshipLifecycleTone = (relationship: DeliveryRelationship): RlyStateTone => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n return \"critical\"\n case \"governed\":\n case \"verified\":\n return \"positive\"\n case \"inferred\":\n case \"proposed\":\n return \"progress\"\n case \"superseded\":\n return \"neutral\"\n }\n}\n\nconst relationshipScopeLabel = (relationship: DeliveryRelationship): string => {\n if (relationship.scope === null) return \"Workspace\"\n if (relationship.scope._tag === \"release\") return `Release · ${relationship.scope.releaseId.slice(-6)}`\n return `Environment · ${relationship.scope.environmentId.slice(-6)}`\n}\n\nconst evidenceFreshnessTone = (evidence: EvidenceItem): RlyStateTone => {\n switch (evidence.freshness._tag) {\n case \"current\":\n return \"positive\"\n case \"stale\":\n return \"caution\"\n case \"missing\":\n case \"unavailable\":\n return \"critical\"\n }\n}\n\nconst lifecycleReason = (relationship: DeliveryRelationship): string | null => {\n switch (relationship.lifecycle._tag) {\n case \"missing\":\n case \"rejected\":\n case \"superseded\":\n return relationship.lifecycle.reason\n case \"governed\":\n case \"inferred\":\n case \"proposed\":\n case \"verified\":\n return null\n }\n}\n\nconst evidencePartyLabel = (party: EvidenceItem[\"attribution\"] | EvidenceItem[\"verifier\"]): string => {\n switch (party._tag) {\n case \"plugin\":\n return `Plugin · ${party.pluginConnectionId.slice(-6)}`\n case \"human\":\n return `Human · ${party.personId.slice(-6)}`\n case \"agent\":\n return `Agent · ${party.agentId.slice(-6)}`\n case \"system\":\n return `System · ${party.component}`\n }\n}\n\nexport const evidenceClaimValueLabel = (claim: EvidenceClaim): string => {\n switch (claim.value._tag) {\n case \"flag\":\n return claim.value.value ? \"Yes\" : \"No\"\n case \"state\":\n case \"revision\":\n return claim.value.value\n case \"reference\":\n return `Node ${claim.value.targetNodeId.slice(-6)}`\n }\n}\n\nconst EvidenceCard = ({\n claims,\n inspection,\n relationship\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly inspection: EvidenceInspection\n readonly relationship: DeliveryRelationship\n}): ReactElement => {\n const relatedClaimIds = new Set(relationship.evidenceClaimIds)\n const relatedClaims = claims.filter(\n ({ evidenceClaimId, evidenceId }) =>\n evidenceId === inspection.evidence.evidenceId && relatedClaimIds.has(evidenceClaimId)\n )\n const evidence = inspection.evidence\n return (\n <article className={styles.evidenceCard}>\n <div className={styles.evidenceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Evidence {evidence.evidenceId.slice(-6)}\n </Text>\n <StateLabel label={titleCase(evidence.freshness._tag)} size=\"compact\" tone={evidenceFreshnessTone(evidence)} />\n </div>\n <dl className={styles.facts}>\n <div>\n <dt>Observed</dt>\n <dd>{formatRelationshipTimestamp(evidence.observedAt)}</dd>\n </div>\n <div>\n <dt>Source</dt>\n <dd>{evidencePartyLabel(evidence.attribution)}</dd>\n </div>\n <div>\n <dt>Verified by</dt>\n <dd>{evidencePartyLabel(evidence.verifier)}</dd>\n </div>\n <div>\n <dt>Retention</dt>\n <dd>\n {titleCase(evidence.retention.classification)}\n {evidence.retention.legalHold ? \" · Legal hold\" : \"\"}\n </dd>\n </div>\n <div>\n <dt>Valid until</dt>\n <dd>\n {evidence.validUntil === null ? \"No expiry recorded\" : formatRelationshipTimestamp(evidence.validUntil)}\n </dd>\n </div>\n </dl>\n {relatedClaims.length === 0 ? (\n <Text tone=\"secondary\" variant=\"meta\">\n No referenced claim was returned for this observation.\n </Text>\n ) : (\n <ul className={styles.claims}>\n {relatedClaims.map((claim) => (\n <li key={claim.evidenceClaimId}>\n <Text as=\"span\" variant=\"label\">\n {titleCase(claim.predicate)}\n </Text>\n <Text as=\"span\" tone=\"secondary\">\n {evidenceClaimValueLabel(claim)}\n </Text>\n </li>\n ))}\n </ul>\n )}\n </article>\n )\n}\n\n/** Report the bounded history prefix without presenting it as a complete ledger. */\nexport const relationshipHistoryCountLabel = (revisions: RelationshipHistoryInspection[\"revisions\"]): string => {\n let newestRevision = 0\n for (const revision of revisions) newestRevision = Math.max(newestRevision, revision.revision)\n if (newestRevision > revisions.length) return `${String(revisions.length)} of ${String(newestRevision)} revisions`\n return `${String(revisions.length)} revision${revisions.length === 1 ? \"\" : \"s\"}`\n}\n\n/** URL-owned detail panel for immutable relationship history and evidence. */\nexport const RelationshipDetailSheet = ({\n claims,\n evidenceIds,\n onClose,\n onSessionExpired,\n relationship,\n sessionKey,\n transport\n}: {\n readonly claims: ReadonlyArray<EvidenceClaim>\n readonly evidenceIds: ReadonlyArray<EvidenceId>\n readonly onClose: () => void\n readonly onSessionExpired: (sessionKey: string) => void\n readonly relationship: DeliveryRelationship | null\n readonly sessionKey: string | null\n readonly transport?: RelationshipDetailsTransport\n}): ReactElement => {\n const controller = useRelationshipDetails(\n relationship?.relationshipId ?? null,\n evidenceIds,\n sessionKey,\n onSessionExpired,\n transport\n )\n const title = relationship === null ? \"Relationship details\" : `${titleCase(relationship.kind)} relationship`\n const evidenceIntegrityComplete = relationship === null || claims.length === relationship.evidenceClaimIds.length\n\n return (\n <Sheet.Root\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n open={relationship !== null}\n >\n <Sheet.Content\n closeLabel={`Close ${title}`}\n description=\"Immutable delivery history and the evidence used to establish this connection.\"\n title={title}\n >\n <Sheet.Body className={styles.body}>\n {relationship === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\" ? (\n <div aria-busy=\"true\" aria-label=\"Loading relationship details\" className={styles.loading}>\n <Skeleton height=\"7rem\" />\n <Skeleton height=\"12rem\" />\n </div>\n ) : controller.state._tag === \"failed\" ? (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"The selected relationship remains unchanged. Its history could not be loaded.\"\n title=\"Relationship details unavailable\"\n tone=\"caution\"\n />\n ) : (\n <div className={styles.content}>\n <section aria-labelledby=\"relationship-summary-title\" className={styles.summary}>\n <div className={styles.summaryHeading}>\n <Text as=\"h3\" id=\"relationship-summary-title\" variant=\"section-title\">\n {relationship.sourceNodeKind} → {relationship.targetNodeKind}\n </Text>\n <div className={styles.tags}>\n <StateLabel\n label={titleCase(relationship.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(relationship)}\n />\n <StateLabel label={relationshipConfidenceLabel(relationship)} size=\"compact\" tone=\"neutral\" />\n </div>\n </div>\n <Text tone=\"secondary\">{relationshipRationale(relationship)}</Text>\n <dl className={styles.facts}>\n <div>\n <dt>Revision</dt>\n <dd>{String(relationship.revision)}</dd>\n </div>\n <div>\n <dt>Recorded by</dt>\n <dd>{relationshipActorLabel(relationship.recordedBy)}</dd>\n </div>\n <div>\n <dt>Origin</dt>\n <dd>{relationshipProvenanceLabel(relationship.provenance)}</dd>\n </div>\n <div>\n <dt>Scope</dt>\n <dd>{relationshipScopeLabel(relationship)}</dd>\n </div>\n <div>\n <dt>Recorded</dt>\n <dd>{formatRelationshipTimestamp(relationship.recordedAt)}</dd>\n </div>\n </dl>\n </section>\n\n <section aria-labelledby=\"relationship-history-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-history-title\" variant=\"label\">\n History\n </Text>\n <StateLabel\n label={relationshipHistoryCountLabel(controller.state.details.history.revisions)}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {controller.state.details.history.revisions.length === 0 ? (\n <Text tone=\"secondary\">No immutable ledger revisions were returned.</Text>\n ) : (\n <ol className={styles.history}>\n {controller.state.details.history.revisions.map((revision) => {\n const reason = lifecycleReason(revision)\n return (\n <li key={`${revision.relationshipId}:${String(revision.revision)}`}>\n <div className={styles.historyHeading}>\n <Text as=\"span\" variant=\"label\">\n Revision {String(revision.revision)}\n </Text>\n <StateLabel\n label={titleCase(revision.lifecycle._tag)}\n size=\"compact\"\n tone={relationshipLifecycleTone(revision)}\n />\n </div>\n <Text tone=\"secondary\" variant=\"meta\">\n {relationshipActorLabel(revision.recordedBy)} ·{\" \"}\n {formatRelationshipTimestamp(revision.recordedAt)}\n </Text>\n {reason === null ? null : <Text tone=\"secondary\">{reason}</Text>}\n </li>\n )\n })}\n </ol>\n )}\n </section>\n\n <section aria-labelledby=\"relationship-evidence-title\" className={styles.section}>\n <div className={styles.sectionHeading}>\n <Text as=\"h3\" id=\"relationship-evidence-title\" variant=\"label\">\n Evidence\n </Text>\n <StateLabel\n label={`${String(controller.state.details.evidence.length)} observation${controller.state.details.evidence.length === 1 ? \"\" : \"s\"}`}\n size=\"compact\"\n tone=\"neutral\"\n />\n </div>\n {evidenceIntegrityComplete ? null : (\n <div className={styles.integrity}>\n <StateLabel label=\"Evidence incomplete\" size=\"compact\" tone=\"critical\" />\n <Text tone=\"secondary\">\n One or more referenced claims are missing from the release slice. Refresh before relying on this\n relationship.\n </Text>\n </div>\n )}\n {controller.state.details.evidence.length === 0 ? (\n <Text tone=\"secondary\">No immutable evidence is attached to this relationship revision.</Text>\n ) : (\n <div className={styles.evidence}>\n {controller.state.details.evidence.map((inspection) => (\n <EvidenceCard\n claims={claims}\n inspection={inspection}\n key={inspection.evidence.evidenceId}\n relationship={relationship}\n />\n ))}\n </div>\n )}\n </section>\n </div>\n )}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n )\n}\n","import * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport type { NavigateFunction } from \"react-router\"\n\nimport {\n EntityId,\n type EntityId as EntityIdType,\n RelationshipId,\n type RelationshipId as RelationshipIdType\n} from \"../../domain/identifiers.js\"\n\nconst RelationshipDetailMarker = Schema.Struct({\n _tag: Schema.Literal(\"relationship-detail-origin/v1\"),\n objectId: EntityId,\n relationshipId: RelationshipId\n})\n\nconst RelationshipDetailRouteState = Schema.Struct({\n relationshipDetailOrigin: RelationshipDetailMarker\n})\n\n/** Preserve existing release-origin state while marking an in-app relationship-detail activation. */\nexport const makeRelationshipDetailRouteState = (\n state: unknown,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): unknown => ({\n ...(Predicate.isObject(state) ? state : {}),\n relationshipDetailOrigin: {\n _tag: \"relationship-detail-origin/v1\",\n objectId,\n relationshipId\n }\n})\n\n/** Accept Back navigation only for the exact versioned object/relationship activation. */\nexport const matchesRelationshipDetailRouteState = (\n state: unknown,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): boolean => {\n const decoded = Schema.decodeUnknownOption(RelationshipDetailRouteState)(state)\n return Option.isSome(decoded) &&\n decoded.value.relationshipDetailOrigin.objectId === objectId &&\n decoded.value.relationshipDetailOrigin.relationshipId === relationshipId\n}\n\n/** Close an in-app detail with Back; canonicalize direct detail URLs in place. */\nexport const closeRelationshipDetailRoute = (\n navigate: NavigateFunction,\n location: Readonly<{ hash: string; pathname: string; search: string; state: unknown }>,\n objectId: EntityIdType,\n relationshipId: RelationshipIdType\n): void => {\n if (matchesRelationshipDetailRouteState(location.state, objectId, relationshipId)) {\n navigate(-1)\n return\n }\n const next = new URLSearchParams(location.search)\n next.delete(\"relationship\")\n navigate(\n { hash: location.hash, pathname: location.pathname, search: next.size === 0 ? \"\" : `?${next.toString()}` },\n { replace: true, state: location.state }\n )\n}\n",".root,\n.loading,\n.context,\n.contextGroup,\n.selected,\n.selectedFacts,\n.trace,\n.traceList,\n.runbooks,\n.runbook {\n display: grid;\n}\n\n.root,\n.loading {\n gap: var(--rly-space-16);\n}\n\n.context {\n grid-template-columns: repeat(2, minmax(0, 1fr)) auto;\n align-items: start;\n gap: var(--rly-space-24);\n padding: var(--rly-space-16) var(--rly-space-20);\n border: 1px solid var(--rly-color-border-1);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-2);\n}\n\n.contextGroup,\n.runbook {\n gap: var(--rly-space-4);\n}\n\n.contextHeading,\n.tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.contextGroup h3 {\n margin: 0;\n}\n\n.selected {\n grid-column: 1 / -1;\n gap: var(--rly-space-12);\n padding: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-group);\n background: var(--rly-color-surface-1);\n}\n\n.selected h3,\n.selected p,\n.selectedFacts dd {\n margin: 0;\n}\n\n.selectedHeading {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.selectedFacts {\n grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n gap: var(--rly-space-12);\n margin: 0;\n}\n\n.selectedFacts div {\n min-width: 0;\n}\n\n.selectedFacts 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.selectedFacts dd {\n overflow-wrap: anywhere;\n}\n\n.trace {\n gap: var(--rly-space-8);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n}\n\n.traceHeading,\n.traceRelation {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-8);\n}\n\n.traceHeading {\n justify-content: space-between;\n}\n\n.traceHeading h4,\n.traceConnection p {\n margin: 0;\n}\n\n.traceList {\n gap: var(--rly-space-4);\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.traceList li {\n display: grid;\n grid-template-columns: auto minmax(10rem, 1fr) auto auto auto;\n align-items: center;\n gap: var(--rly-space-12);\n min-width: 0;\n padding: var(--rly-space-8) var(--rly-space-12);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-2);\n}\n\n.traceConnection {\n min-width: 0;\n}\n\n.traceConnection a {\n color: var(--rly-color-text-1);\n overflow-wrap: anywhere;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails {\n color: var(--rly-color-text-1);\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-underline-offset: var(--rly-space-2);\n}\n\n.traceDetails:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.traceConnection a:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.runbooks {\n gap: var(--rly-space-8);\n}\n\n.runbook {\n color: inherit;\n text-decoration-color: var(--rly-color-border-2);\n text-underline-offset: var(--rly-space-2);\n}\n\n.runbook span {\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.runbook:focus-visible {\n border-radius: var(--rly-radius-tag);\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n@media (max-width: 48rem) {\n .context {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .traceList li {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .traceRelation,\n .traceList li > span,\n .traceDetails {\n grid-column: 2;\n }\n}\n","import type { EnvironmentId } from \"../../domain/identifiers.js\"\n\nexport const MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY = 4\n\n/** Load release scope followed by every target environment without saturating browser connection pools. */\nexport const loadReleaseEnvironmentSlices = async <Value>(\n environmentIds: ReadonlyArray<EnvironmentId>,\n load: (environmentId: EnvironmentId | null) => Promise<Value>\n): Promise<ReadonlyArray<Value>> => {\n const scopes: ReadonlyArray<EnvironmentId | null> = [null, ...environmentIds]\n const completed: Array<{ readonly index: number; readonly value: Value }> = []\n let nextIndex = 0\n let isStopped = false\n const loadNext = async (): Promise<void> => {\n while (!isStopped && nextIndex < scopes.length) {\n const index = nextIndex\n nextIndex += 1\n const environmentId = scopes[index]\n if (environmentId === undefined) return\n try {\n completed.push({ index, value: await load(environmentId) })\n } catch (failure) {\n isStopped = true\n throw failure\n }\n }\n }\n const workerCount = Math.min(MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY, scopes.length)\n await Promise.all(Array.from({ length: workerCount }, () => loadNext()))\n return completed.sort((left, right) => left.index - right.index).map(({ value }) => value)\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 { MAXIMUM_RELEASE_SLICE_RECORDS, type ReleaseDeliveryGraphInspection } from \"../../api/deliveryGraph.js\"\nimport type { EnvironmentId, ReleaseId } from \"../../domain/identifiers.js\"\nimport {\n loadReleaseEnvironmentSlices,\n MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n} from \"./loadReleaseEnvironmentSlices.js\"\n\nexport const MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS = MAXIMUM_RELEASE_SLICE_RECORDS\n\n/** Combine release and environment slices while retaining complete relationship closure. */\nexport const aggregateReleaseWorksetInspections = (\n releaseId: ReleaseId,\n inspections: ReadonlyArray<ReleaseDeliveryGraphInspection>\n): ReleaseDeliveryGraphInspection => {\n type Inspection = ReleaseDeliveryGraphInspection\n const availableNodes = new Map<string, Inspection[\"nodes\"][number]>()\n const availableProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const availableClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const availableEvidence = new Map<string, Inspection[\"evidenceItems\"][number]>()\n for (const inspection of inspections) {\n for (const node of inspection.nodes) availableNodes.set(node.nodeId, node)\n for (const entry of inspection.entityProjections) {\n availableProjections.set(entry.projection.entityId, entry)\n }\n for (const claim of inspection.evidenceClaims) availableClaims.set(claim.evidenceClaimId, claim)\n for (const item of inspection.evidenceItems) availableEvidence.set(item.evidenceId, item)\n }\n const nodes = new Map<string, Inspection[\"nodes\"][number]>()\n const entityProjections = new Map<string, Inspection[\"entityProjections\"][number]>()\n const relationships = new Map<string, Inspection[\"relationships\"][number]>()\n const evidenceClaims = new Map<string, Inspection[\"evidenceClaims\"][number]>()\n const evidenceItems = new Map<string, Inspection[\"evidenceItems\"][number]>()\n let truncated = inspections.some((inspection) => inspection.truncated)\n\n for (const relationship of inspections.flatMap(({ relationships }) => relationships)) {\n const relationshipKey = `${relationship.relationshipId}:${String(relationship.revision)}`\n if (relationships.has(relationshipKey)) continue\n const requiredNodes = [\n availableNodes.get(relationship.sourceNodeId),\n availableNodes.get(relationship.targetNodeId)\n ]\n if (requiredNodes.some((node) => node === undefined)) {\n truncated = true\n continue\n }\n const presentNodes = requiredNodes.filter((node) => node !== undefined)\n const entityNodes = presentNodes.filter(\n (node) => node.resolution._tag === \"resolved\" && node.resolution.target._tag === \"entity\"\n )\n const requiredProjections = entityNodes.flatMap((node) => {\n if (node.resolution._tag !== \"resolved\" || node.resolution.target._tag !== \"entity\") return []\n const projection = availableProjections.get(node.resolution.target.entityId)\n return projection === undefined ? [] : [projection]\n })\n const requiredClaims = relationship.evidenceClaimIds.flatMap((claimId) => {\n const claim = availableClaims.get(claimId)\n return claim === undefined ? [] : [claim]\n })\n const evidenceIds = new Set(requiredClaims.map(({ evidenceId }) => evidenceId))\n const requiredEvidence = [...evidenceIds].flatMap((evidenceId) => {\n const evidence = availableEvidence.get(evidenceId)\n return evidence === undefined ? [] : [evidence]\n })\n const closureMissing = requiredProjections.length !== entityNodes.length ||\n requiredClaims.length !== relationship.evidenceClaimIds.length ||\n requiredEvidence.length !== evidenceIds.size\n const newNodeCount = presentNodes.filter(({ nodeId }) => !nodes.has(nodeId)).length\n const newProjectionCount = requiredProjections.filter(({ projection }) =>\n !entityProjections.has(projection.entityId)\n ).length\n const newClaimCount = requiredClaims.filter(({ evidenceClaimId }) => !evidenceClaims.has(evidenceClaimId)).length\n const newEvidenceCount = requiredEvidence.filter(({ evidenceId }) => !evidenceItems.has(evidenceId)).length\n const closureExceedsBound = relationships.size === MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n nodes.size + newNodeCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n entityProjections.size + newProjectionCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceClaims.size + newClaimCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS ||\n evidenceItems.size + newEvidenceCount > MAXIMUM_AGGREGATED_RELEASE_WORKSET_RECORDS\n if (closureMissing || closureExceedsBound) {\n truncated = true\n continue\n }\n relationships.set(relationshipKey, relationship)\n for (const node of presentNodes) nodes.set(node.nodeId, node)\n for (const entry of requiredProjections) entityProjections.set(entry.projection.entityId, entry)\n for (const claim of requiredClaims) evidenceClaims.set(claim.evidenceClaimId, claim)\n for (const item of requiredEvidence) evidenceItems.set(item.evidenceId, item)\n }\n return {\n releaseId,\n environmentId: null,\n truncated,\n nodes: [...nodes.values()],\n entityProjections: [...entityProjections.values()],\n relationships: [...relationships.values()],\n evidenceClaims: [...evidenceClaims.values()],\n evidenceItems: [...evidenceItems.values()]\n }\n}\n\nexport interface ReleaseWorksetTransport {\n readonly load: (\n releaseId: ReleaseId,\n environmentId: EnvironmentId | null,\n signal: AbortSignal\n ) => Promise<ReleaseDeliveryGraphInspection>\n}\n\nexport const MAXIMUM_RELEASE_WORKSET_REQUEST_CONCURRENCY = MAXIMUM_RELEASE_ENVIRONMENT_REQUEST_CONCURRENCY\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Load every release/environment slice without saturating browser or server connection pools. */\nexport const loadReleaseWorksetInspections = async (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n signal: AbortSignal,\n transport: ReleaseWorksetTransport\n): Promise<ReadonlyArray<ReleaseDeliveryGraphInspection>> => {\n return loadReleaseEnvironmentSlices(\n environmentIds,\n (environmentId) => transport.load(releaseId, environmentId, signal)\n )\n}\n\nexport type ReleaseWorksetState =\n | { readonly _tag: \"idle\" }\n | {\n readonly _tag: \"loading\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"failed\"\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n | {\n readonly _tag: \"ready\"\n readonly inspection: ReleaseDeliveryGraphInspection\n readonly environmentScopeKey: string\n readonly releaseId: ReleaseId\n readonly sessionKey: string\n }\n\n/** Generated-client transport for one authenticated bounded release graph. */\nexport const browserReleaseWorksetTransport: ReleaseWorksetTransport = {\n load: (releaseId, environmentId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.deliveryGraph.releaseSlice({\n params: { releaseId },\n query: environmentId === null ? {} : { environmentId }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\n/** Keep one release workset scoped to the exact authenticated browser session. */\nexport const useReleaseWorkset = (\n releaseId: ReleaseId,\n environmentIds: ReadonlyArray<EnvironmentId>,\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: ReleaseWorksetTransport = browserReleaseWorksetTransport\n): { readonly retry: () => void; readonly state: ReleaseWorksetState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<ReleaseWorksetState>({ _tag: \"idle\" })\n const environmentScopeKey = environmentIds.join(\":\")\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", environmentScopeKey, releaseId, sessionKey })\n loadReleaseWorksetInspections(releaseId, environmentIds, abort.signal, transport).then(\n (inspections) => {\n if (!abort.signal.aborted) {\n setState({\n _tag: \"ready\",\n environmentScopeKey,\n inspection: aggregateReleaseWorksetInspections(releaseId, inspections),\n releaseId,\n sessionKey\n })\n }\n },\n (failure) => {\n if (!abort.signal.aborted) {\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", environmentScopeKey, releaseId, sessionKey })\n }\n }\n )\n return () => abort.abort()\n }, [environmentScopeKey, onSessionExpired, releaseId, requestRevision, sessionKey, transport])\n\n const currentState: ReleaseWorksetState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" ||\n state.releaseId !== releaseId ||\n state.sessionKey !== sessionKey ||\n state.environmentScopeKey !== environmentScopeKey\n ? { _tag: \"loading\", environmentScopeKey, releaseId, sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n","import { LinkProvider } from \"@knpkv/rly/foundations\"\nimport { ServiceMark, WorksetCard } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Text } from \"@knpkv/rly/primitives\"\nimport { type ReactElement } from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport type { WorkspaceId } from \"../../domain/identifiers.js\"\nimport { WorkspaceEntityLink, workspaceEntityStateForHref } from \"../entities/WorkspaceEntityLink.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport {\n presentReleaseWorkset,\n releaseWorksetRelationshipEvidenceClaims,\n releaseWorksetRelationshipEvidenceIds,\n selectReleaseWorksetObject,\n selectReleaseWorksetRelationship,\n selectReleaseWorksetTrace,\n type SelectedReleaseWorksetObject,\n type SelectedReleaseWorksetTrace\n} from \"./presentReleaseWorkset.js\"\nimport { RelationshipDetailSheet } from \"./RelationshipDetailSheet.js\"\nimport { closeRelationshipDetailRoute, makeRelationshipDetailRouteState } from \"./relationshipDetailRoute.js\"\nimport styles from \"./ReleaseWorkset.module.css\"\nimport { useReleaseWorkset } from \"./useReleaseWorkset.js\"\n\nconst LoadingWorkset = (): ReactElement => (\n <div aria-busy=\"true\" aria-label=\"Loading release work\" className={styles.loading}>\n <Skeleton height=\"3rem\" />\n <Skeleton height=\"15rem\" />\n </div>\n)\n\n/** Inspectable destination for an Items result selected within its release context. */\nexport const SelectedReleaseWorksetObjectPanel = ({\n linkLocation,\n selectedObject,\n trace\n}: {\n readonly linkLocation?: RouterLocationParts\n readonly selectedObject: SelectedReleaseWorksetObject\n readonly trace?: SelectedReleaseWorksetTrace\n}): ReactElement => {\n return (\n <section aria-label={`Selected ${selectedObject.kind} ${selectedObject.label}`} className={styles.selected}>\n <div className={styles.selectedHeading}>\n <ServiceMark service={selectedObject.service} size=\"compact\" />\n <Text as=\"p\" variant=\"label\">\n Selected object · {selectedObject.label}\n </Text>\n <StateLabel label={selectedObject.status} size=\"compact\" tone={selectedObject.tone} />\n </div>\n <Text as=\"h3\" variant=\"section-title\">\n {selectedObject.title}\n </Text>\n <Text tone=\"secondary\" variant=\"meta\">\n {selectedObject.kind}\n </Text>\n <dl className={styles.selectedFacts}>\n {selectedObject.facts.map((fact) => (\n <div key={fact.label}>\n <dt>{fact.label}</dt>\n <dd>{fact.value}</dd>\n </div>\n ))}\n </dl>\n {trace === undefined ? null : (\n <div className={styles.trace}>\n <div className={styles.traceHeading}>\n <Text as=\"h4\" variant=\"label\">\n Delivery trace\n </Text>\n <StateLabel\n label={`${trace.relationships.length} relationship${trace.relationships.length === 1 ? \"\" : \"s\"}${trace.truncated ? \"+\" : \"\"}`}\n size=\"compact\"\n tone={trace.truncated ? \"caution\" : \"neutral\"}\n />\n </div>\n {trace.relationships.length === 0 ? (\n <Text tone=\"secondary\">No relationship touches this object in the current release slice.</Text>\n ) : (\n <ul className={styles.traceList}>\n {trace.relationships.map((relationship) => (\n <li key={relationship.id}>\n {relationship.other.service === null ? null : (\n <ServiceMark service={relationship.other.service} size=\"compact\" />\n )}\n <div className={styles.traceConnection}>\n <Text as=\"p\" variant=\"label\">\n {relationship.direction === \"incoming\" ? \"From\" : \"To\"} {relationship.other.label}\n </Text>\n {relationship.other.href === null ? (\n <Text tone=\"secondary\">{relationship.other.title}</Text>\n ) : (\n <Link\n state={\n linkLocation === undefined\n ? undefined\n : workspaceEntityStateForHref(relationship.other.href, linkLocation)\n }\n to={relationship.other.href}\n >\n {relationship.other.title}\n </Link>\n )}\n </div>\n <div className={styles.traceRelation}>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.kind}\n </Text>\n <StateLabel label={relationship.lifecycle} size=\"compact\" tone={relationship.tone} />\n </div>\n <Text as=\"span\" tone=\"secondary\" variant=\"meta\">\n {relationship.confidence} · {relationship.evidenceCount} evidence claim\n {relationship.evidenceCount === 1 ? \"\" : \"s\"}\n </Text>\n <Link\n aria-label={`Details for ${relationship.kind} ${relationship.direction} relationship with ${relationship.other.label}`}\n className={styles.traceDetails}\n state={makeRelationshipDetailRouteState(linkLocation?.state, selectedObject.id, relationship.id)}\n to={relationship.detailsHref}\n >\n Details\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </section>\n )\n}\n\ninterface RouterLocationParts {\n readonly hash: string\n readonly pathname: string\n readonly search: string\n readonly state: unknown\n}\n\n/** Compatibility name retained for release-workset callers of the shared readable-session policy. */\nexport const releaseWorksetSessionKey = browserReadableSessionKey\n\n/** Render one server-backed release graph without substituting demo relationships. */\nexport const ReleaseWorkset = ({\n release,\n workspaceId\n}: {\n readonly release: PortfolioReleasePresentation\n readonly workspaceId: WorkspaceId\n}): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const controller = useReleaseWorkset(\n release.id,\n release.targetEnvironmentIds,\n sessionKey,\n browserSession.invalidateSession\n )\n if (sessionKey === null || controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return <LoadingWorkset />\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the delivery graph for this release. Saved release facts remain unchanged.\"\n title=\"Release work unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const workset = presentReleaseWorkset(controller.state.inspection, workspaceId, release.stages)\n const searchParams = new URLSearchParams(location.search)\n const selectedObjectId = searchParams.get(\"object\")\n const selectedRelationshipId = searchParams.get(\"relationship\")\n const selectedObject = selectReleaseWorksetObject(controller.state.inspection, selectedObjectId)\n const selectedTrace = selectReleaseWorksetTrace(controller.state.inspection, workspaceId, selectedObjectId)\n const selectedRelationship = selectReleaseWorksetRelationship(\n controller.state.inspection,\n selectedObjectId,\n selectedRelationshipId\n )\n const selectedEvidenceIds = releaseWorksetRelationshipEvidenceIds(controller.state.inspection, selectedRelationship)\n const selectedEvidenceClaims = releaseWorksetRelationshipEvidenceClaims(\n controller.state.inspection,\n selectedRelationship\n )\n const closeRelationshipDetails = (): void => {\n if (selectedObject === null || selectedRelationship === null) return\n closeRelationshipDetailRoute(navigate, location, selectedObject.id, selectedRelationship.relationshipId)\n }\n return (\n <>\n <div className={styles.root}>\n <div className={styles.context}>\n <div className={styles.contextGroup}>\n <Text as=\"h3\" variant=\"label\">\n Environment\n </Text>\n {release.targetEnvironmentIds.length === 0 ? (\n <Text tone=\"secondary\">No target environment recorded.</Text>\n ) : (\n <div className={styles.tags}>\n {release.targetEnvironmentIds.map((environmentId) => (\n <StateLabel\n key={environmentId}\n label={`Unknown target · ${environmentId.slice(-4)}`}\n size=\"compact\"\n title={`Environment ${environmentId}; provider metadata unavailable`}\n tone=\"neutral\"\n />\n ))}\n </div>\n )}\n </div>\n <div className={styles.contextGroup}>\n <div className={styles.contextHeading}>\n <ServiceMark service=\"confluence\" size=\"compact\" />\n <Text as=\"h3\" variant=\"label\">\n Runbook\n </Text>\n </div>\n {workset.runbooks.length === 0 ? (\n <Text tone=\"secondary\">No runbook linked.</Text>\n ) : (\n <div className={styles.runbooks}>\n {workset.runbooks.map((runbook) => (\n <Link\n className={styles.runbook}\n key={runbook.id}\n state={workspaceEntityStateForHref(runbook.href, location)}\n to={runbook.href}\n >\n <strong>{runbook.title}</strong>\n <span>{runbook.reference}</span>\n </Link>\n ))}\n </div>\n )}\n </div>\n {workset.truncated ? (\n <StateLabel label=\"Bounded view · more records exist\" size=\"compact\" tone=\"caution\" />\n ) : null}\n {selectedObject === null || selectedTrace === null ? null : (\n <SelectedReleaseWorksetObjectPanel\n linkLocation={location}\n selectedObject={selectedObject}\n trace={selectedTrace}\n />\n )}\n </div>\n <LinkProvider component={WorkspaceEntityLink}>\n <WorksetCard\n gaps={workset.gaps}\n heading={`${release.serviceName} release work`}\n jiraItems={workset.jiraItems}\n pipelines={workset.pipelines}\n pullRequestGroups={workset.pullRequestGroups}\n />\n </LinkProvider>\n </div>\n <RelationshipDetailSheet\n claims={selectedEvidenceClaims}\n evidenceIds={selectedEvidenceIds}\n onClose={closeRelationshipDetails}\n onSessionExpired={browserSession.invalidateSession}\n relationship={selectedRelationship}\n sessionKey={sessionKey}\n />\n </>\n )\n}\n"],"mappings":"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"}