@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.
- package/dist/client/.vite/manifest.json +127 -125
- package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js → ActiveWorkPage-C6QwDV1Y.js} +2 -2
- package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js.map → ActiveWorkPage-C6QwDV1Y.js.map} +1 -1
- package/dist/client/assets/{AgentPage-Bom41la2.js → AgentPage-OqwP6uRi.js} +2 -2
- package/dist/client/assets/{AgentPage-Bom41la2.js.map → AgentPage-OqwP6uRi.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js → AtlassianOAuthCallbackPage-Bm7UhU-h.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js.map → AtlassianOAuthCallbackPage-Bm7UhU-h.js.map} +1 -1
- package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js → AuthorizedSharePage-DblP3USU.js} +2 -2
- package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js.map → AuthorizedSharePage-DblP3USU.js.map} +1 -1
- package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js → BrowserCrypto-BGGRC6iW.js} +2 -2
- package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js.map → BrowserCrypto-BGGRC6iW.js.map} +1 -1
- package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js → BrowserSessionHydrator-39UDbHf0.js} +2 -2
- package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js.map → BrowserSessionHydrator-39UDbHf0.js.map} +1 -1
- package/dist/client/assets/{CommandSearch-D6iFcdvj.js → CommandSearch-D4Fnjsl-.js} +2 -2
- package/dist/client/assets/{CommandSearch-D6iFcdvj.js.map → CommandSearch-D4Fnjsl-.js.map} +1 -1
- package/dist/client/assets/{ItemsPage-x39U11an.js → ItemsPage-BZQiTh9b.js} +2 -2
- package/dist/client/assets/{ItemsPage-x39U11an.js.map → ItemsPage-BZQiTh9b.js.map} +1 -1
- package/dist/client/assets/{PairPage-D5vlz4OG.js → PairPage-Dvfse5ky.js} +2 -2
- package/dist/client/assets/{PairPage-D5vlz4OG.js.map → PairPage-Dvfse5ky.js.map} +1 -1
- package/dist/client/assets/{PortfolioOverview-DSUabOmm.js → PortfolioOverview-DeJcfXcw.js} +2 -2
- package/dist/client/assets/{PortfolioOverview-DSUabOmm.js.map → PortfolioOverview-DeJcfXcw.js.map} +1 -1
- package/dist/client/assets/{ReleaseRoute-DyDm5s85.js → ReleaseRoute-D9q8_sCk.js} +2 -2
- package/dist/client/assets/{ReleaseRoute-DyDm5s85.js.map → ReleaseRoute-D9q8_sCk.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js +2 -0
- package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js.map +1 -0
- package/dist/client/assets/{ServicesPage-CoMVH2Si.js → ServicesPage-Co6GJHgc.js} +2 -2
- package/dist/client/assets/{ServicesPage-CoMVH2Si.js.map → ServicesPage-Co6GJHgc.js.map} +1 -1
- package/dist/client/assets/{TimelinePage-D8Fj_351.js → TimelinePage-CM2og72M.js} +2 -2
- package/dist/client/assets/{TimelinePage-D8Fj_351.js.map → TimelinePage-CM2og72M.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js → WorkspaceEntityLink-CTw_He-8.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js.map → WorkspaceEntityLink-CTw_He-8.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityRoute-BwpujSqk.css → WorkspaceEntityRoute-Bdmv6ki4.css} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js +30 -0
- package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js.map +1 -0
- package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js → WorkspaceReleaseLayout-Ba6keUju.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js.map → WorkspaceReleaseLayout-Ba6keUju.js.map} +1 -1
- package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js → authenticatedMutationClient-CJklf3iD.js} +2 -2
- package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js.map → authenticatedMutationClient-CJklf3iD.js.map} +1 -1
- package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js → authorizedShareTransport-Xg20SHJ5.js} +2 -2
- package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js.map → authorizedShareTransport-Xg20SHJ5.js.map} +1 -1
- package/dist/client/assets/{client-OmvShYdC.js → client-P7FaPwzJ.js} +2 -2
- package/dist/client/assets/{client-OmvShYdC.js.map → client-P7FaPwzJ.js.map} +1 -1
- package/dist/client/assets/{connectionTestTransport-c25QXx7A.js → connectionTestTransport-C9iPOkKM.js} +2 -2
- package/dist/client/assets/{connectionTestTransport-c25QXx7A.js.map → connectionTestTransport-C9iPOkKM.js.map} +1 -1
- package/dist/client/assets/{index-DLoOV6Hp.js → index-DpW_ckau.js} +3 -3
- package/dist/client/assets/{index-DLoOV6Hp.js.map → index-DpW_ckau.js.map} +1 -1
- package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js → patterns-DEbg7R-A-BhsMyh9D.js} +2 -2
- package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js.map → patterns-DEbg7R-A-BhsMyh9D.js.map} +1 -1
- package/dist/client/assets/{presentPortfolio-CkRqd_zz.js → presentPortfolio-D-v615bg.js} +2 -2
- package/dist/client/assets/{presentPortfolio-CkRqd_zz.js.map → presentPortfolio-D-v615bg.js.map} +1 -1
- package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js +2 -0
- package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js.map +1 -0
- package/dist/client/assets/{releaseRoutes-DSWkTh-E.js → releaseRoutes-CfaNElmG.js} +2 -2
- package/dist/client/assets/{releaseRoutes-DSWkTh-E.js.map → releaseRoutes-CfaNElmG.js.map} +1 -1
- package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js → serviceOnboarding-BZ2U_Ugw.js} +2 -2
- package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js.map → serviceOnboarding-BZ2U_Ugw.js.map} +1 -1
- package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js → useWorkspaceItems-DQTYaq1R.js} +2 -2
- package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js.map → useWorkspaceItems-DQTYaq1R.js.map} +1 -1
- package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js +2 -0
- package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js.map +1 -0
- package/dist/client/build-graph.json +32 -2
- package/dist/client/index.html +1 -1
- package/dist/server/api/deliveryGraph.d.ts +126 -0
- package/dist/server/api/deliveryGraph.d.ts.map +1 -1
- package/dist/server/api/index.js +2 -2
- package/dist/server/api/shares.d.ts +14 -0
- package/dist/server/api/shares.d.ts.map +1 -1
- package/dist/server/assets/{BindConfig-BjK10BEb.js → BindConfig-Dk3vjYZc.js} +7 -7
- package/dist/server/assets/{BindConfig-BjK10BEb.js.map → BindConfig-Dk3vjYZc.js.map} +1 -1
- package/dist/server/assets/{controlCenterApi-tZPvRPRH.js → controlCenterApi-Dsug4Rzi.js} +2 -2
- package/dist/server/assets/{controlCenterApi-tZPvRPRH.js.map → controlCenterApi-Dsug4Rzi.js.map} +1 -1
- package/dist/server/assets/{domainEvent-x7yeq-gU.js → domainEvent-CZLKMqgn.js} +13 -2
- package/dist/server/assets/{domainEvent-x7yeq-gU.js.map → domainEvent-CZLKMqgn.js.map} +1 -1
- package/dist/server/assets/{firstPartyServices-Y41P8uke.js → firstPartyServices-BWdrzdfD.js} +2 -2
- package/dist/server/assets/{firstPartyServices-Y41P8uke.js.map → firstPartyServices-BWdrzdfD.js.map} +1 -1
- package/dist/server/assets/{manualPluginSynchronization-C0aHB4UM.js → manualPluginSynchronization-CDnX9qXi.js} +64 -23
- package/dist/server/assets/manualPluginSynchronization-CDnX9qXi.js.map +1 -0
- package/dist/server/assets/{portfolioInvalidation-Ds9Xm4_P.js → portfolioInvalidation-iTUo5N4r.js} +26 -6
- package/dist/server/assets/portfolioInvalidation-iTUo5N4r.js.map +1 -0
- package/dist/server/assets/{readiness-CzU3vjYQ.js → readiness-CZBkcjLP.js} +2 -2
- package/dist/server/assets/{readiness-CzU3vjYQ.js.map → readiness-CZBkcjLP.js.map} +1 -1
- package/dist/server/build-graph.json +1 -0
- package/dist/server/domain/deliveryGraph.d.ts +14 -0
- package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
- package/dist/server/domain/index.js +3 -3
- package/dist/server/index.js +4 -4
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts +1 -1
- package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
- package/dist/server/server/cli.js +4 -4
- package/dist/server/server/index.js +3 -3
- package/dist/server/server/persistence/Persistence.d.ts +35 -0
- package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +56 -0
- package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +7 -0
- package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +35 -0
- package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +7 -0
- package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +14 -0
- package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +35 -0
- package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/client/assets/ReleaseWorkset-BhGacsgb.js +0 -2
- package/dist/client/assets/ReleaseWorkset-BhGacsgb.js.map +0 -1
- package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js +0 -30
- package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js.map +0 -1
- package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js +0 -2
- package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js.map +0 -1
- package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js +0 -2
- package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js.map +0 -1
- package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js.map +0 -1
- package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserCrypto-BPiuCuW-.js","names":["TypeId","Data.TaggedError","Data.Error","Effect.map","Effect.sync","Effect.clockWith","Effect.succeed","Effect.fail","PlatformError.badArgument","EffectCrypto.Crypto","Effect.die","Effect.fail","PlatformError.systemError","Effect.map","Effect.tryPromise","EffectCrypto.make"],"sources":["../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/PlatformError.js","../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/Crypto.js","../../../../../node_modules/.pnpm/@effect+platform-browser@4.0.0-beta.98_effect@4.0.0-beta.98/node_modules/@effect/platform-browser/dist/BrowserCrypto.js"],"sourcesContent":["/**\n * Normalized errors for platform APIs.\n *\n * Platform services such as file systems, terminals, and sockets use\n * `PlatformError` to report host-level failures in a consistent shape. The\n * wrapper records whether the problem came from an invalid argument or from the\n * operating system, while preserving useful details such as the module, method,\n * path, descriptor, description, and original cause when available.\n *\n * @since 4.0.0\n */\nimport * as Data from \"./Data.js\";\nconst TypeId = \"~effect/platform/PlatformError\";\n/**\n * Error data for an invalid argument passed to a platform API.\n *\n * **When to use**\n *\n * Use when you need to model caller input rejected before a platform operation\n * runs, including invalid-argument reason data.\n *\n * **Details**\n *\n * The error records the module and method that rejected the argument, with an\n * optional description and cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link badArgument} for creating a wrapped `PlatformError` whose reason is `BadArgument`\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link PlatformError} for the wrapper used by most platform APIs\n *\n * @category models\n * @since 4.0.0\n */\nexport class BadArgument extends /*#__PURE__*/Data.TaggedError(\"BadArgument\") {\n /**\n * Formats the module, method, and optional description that rejected the argument.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a rejected platform argument.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this.module}.${this.method}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Error data for a platform or system operation failure.\n *\n * **When to use**\n *\n * Use when you need normalized reason data for a platform or system operation\n * failure, including the operation details.\n *\n * **Details**\n *\n * The error records a normalized `_tag`, the module and method that failed,\n * and optional details such as the syscall, path or descriptor, description,\n * and original cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link systemError} for creating the usual `PlatformError` wrapper from this reason data\n * @see {@link BadArgument} for platform API failures caused by rejected caller input before an operation runs\n * @see {@link SystemErrorTag} for the normalized tag values stored in `_tag`\n *\n * @category models\n * @since 4.0.0\n */\nexport class SystemError extends Data.Error {\n /**\n * Formats the normalized system error tag with operation and path details.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a normalized system failure.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this._tag}: ${this.module}.${this.method}${this.pathOrDescriptor !== undefined ? ` (${this.pathOrDescriptor})` : \"\"}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Tagged error used by platform APIs to report either invalid arguments or\n * system-level failures.\n *\n * **When to use**\n *\n * Use as the shared error type for platform APIs that expose invalid arguments\n * and host or operating-system failures through a single `Effect` error\n * channel.\n *\n * **Details**\n *\n * The `reason` field contains the underlying `BadArgument` or `SystemError`.\n * When that reason has a cause, the cause is preserved on the wrapper.\n *\n * @see {@link BadArgument} for invalid inputs rejected before an operation runs\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link badArgument} for creating this wrapper from rejected caller input\n * @see {@link systemError} for creating this wrapper from a host or operating-system failure\n *\n * @category models\n * @since 4.0.0\n */\nexport class PlatformError extends /*#__PURE__*/Data.TaggedError(\"PlatformError\") {\n constructor(reason) {\n if (\"cause\" in reason) {\n super({\n reason,\n cause: reason.cause\n });\n } else {\n super({\n reason\n });\n }\n }\n /**\n * Marks this value as a platform error wrapper for runtime guards.\n *\n * **When to use**\n *\n * Use to identify `PlatformError` values through their runtime type marker.\n *\n * @since 4.0.0\n */\n [TypeId] = TypeId;\n get message() {\n return this.reason.message;\n }\n}\n/**\n * Creates a `PlatformError` whose reason is a `SystemError`.\n *\n * **When to use**\n *\n * Use to adapt an operating-system or platform failure into the normalized\n * platform error model.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const systemError = options => new PlatformError(new SystemError(options));\n/**\n * Creates a `PlatformError` whose reason is a `BadArgument`.\n *\n * **When to use**\n *\n * Use to report a platform API rejecting caller input before performing the\n * underlying operation.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const badArgument = options => new PlatformError(new BadArgument(options));\n//# sourceMappingURL=PlatformError.js.map","/**\n * Defines a platform-independent service for cryptographic operations.\n *\n * Runtime packages provide concrete implementations backed by the host\n * platform's cryptography APIs. This module defines the service interface and a\n * constructor from random-byte and digest primitives. The service provides\n * secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and\n * SHA message digests.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as PlatformError from \"./PlatformError.js\";\nconst TypeId = \"~effect/platform/Crypto\";\n/**\n * Service tag for platform cryptography.\n *\n * **When to use**\n *\n * Use when you need to provide or retrieve the full platform cryptography\n * service from an effect's context.\n *\n * **Details**\n *\n * Providing this service supplies platform-agnostic cryptographic operations\n * such as hashing, UUID generation, and secure random values.\n *\n * @see {@link make} for constructing a Crypto service from primitive operations\n *\n * @category services\n * @since 4.0.0\n */\nexport const Crypto = /*#__PURE__*/Context.Service(\"effect/Crypto\");\n/**\n * Creates a `Crypto` service from the primitive implementation, deriving the\n * random generator helpers and UUID generation from those primitives.\n *\n * **When to use**\n *\n * Use to build a Crypto service for a platform integration, test layer, or\n * custom runtime from primitive random-byte and digest operations.\n *\n * **Details**\n *\n * The constructor derives random numbers, booleans, integer ranges, shuffling,\n * and UUID generation from `impl.randomBytes`. Digest operations delegate to\n * `impl.digest`.\n *\n * **Gotchas**\n *\n * `impl.randomBytes` must return cryptographically secure bytes of the\n * requested length. UUID formatting mutates the byte array returned for UUID\n * generation, so the implementation should return a fresh array for each call.\n *\n * **Example** (Creating a Crypto service)\n *\n * ```ts\n * import { Crypto, Effect, Layer } from \"effect\"\n *\n * const TestCrypto = Layer.succeed(\n * Crypto.Crypto,\n * Crypto.make({\n * randomBytes: (size) => new Uint8Array(size),\n * digest: (_algorithm, data) => Effect.succeed(data)\n * })\n * )\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = impl => {\n const randomBytesUnsafe = impl.randomBytes;\n const randomBytes = size => Effect.map(validateSize(\"randomBytes\", size), randomBytesUnsafe);\n const nextDoubleUnsafe = () => {\n const bytes = randomBytesUnsafe(7);\n const value = (bytes[0] & 0x1f) * 2 ** 48 + bytes[1] * 2 ** 40 + bytes[2] * 2 ** 32 + bytes[3] * 2 ** 24 + bytes[4] * 2 ** 16 + bytes[5] * 2 ** 8 + bytes[6];\n return value / 2 ** 53;\n };\n const nextIntUnsafe = () => Math.floor(nextDoubleUnsafe() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1)) + Number.MIN_SAFE_INTEGER;\n return Crypto.of({\n [TypeId]: TypeId,\n randomBytes,\n nextDoubleUnsafe,\n nextIntUnsafe,\n digest: impl.digest,\n random: Effect.sync(() => nextDoubleUnsafe()),\n randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n randomInt: Effect.sync(() => nextIntUnsafe()),\n randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n randomIntBetween(min, max, options) {\n const extra = options?.halfOpen === true ? 0 : 1;\n return Effect.sync(() => {\n const minInt = Math.ceil(min);\n const maxInt = Math.floor(max);\n return Math.floor(nextDoubleUnsafe() * (maxInt - minInt + extra)) + minInt;\n });\n },\n randomShuffle: elements => Effect.sync(() => {\n const buffer = Array.from(elements);\n for (let i = buffer.length - 1; i >= 1; i = i - 1) {\n const index = Math.min(i, Math.floor(nextDoubleUnsafe() * (i + 1)));\n const value = buffer[i];\n buffer[i] = buffer[index];\n buffer[index] = value;\n }\n return buffer;\n }),\n randomUUIDv4: Effect.sync(() => formatUUIDv4(randomBytesUnsafe(16))),\n randomUUIDv7: Effect.clockWith(clock => Effect.succeed(formatUUIDv7(clock.currentTimeMillisUnsafe(), randomBytesUnsafe(16))))\n });\n};\nconst validateSize = (method, size) => Number.isSafeInteger(size) && size >= 0 ? Effect.succeed(size) : Effect.fail(PlatformError.badArgument({\n module: \"Crypto\",\n method,\n description: \"size must be a non-negative safe integer\"\n}));\nconst hex = byte => byte.toString(16).padStart(2, \"0\");\nconst formatUUID = bytes => {\n const segments = [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10, 16)];\n return segments.map(segment => Array.from(segment, hex).join(\"\")).join(\"-\");\n};\nconst formatUUIDv4 = bytes => {\n bytes[6] = bytes[6] & 0x0f | 0x40;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\nconst maxUUIDv7Timestamp = 2 ** 48 - 1;\nconst formatUUIDv7 = (timestampMillis, bytes) => {\n const timestamp = Math.min(Math.max(0, Math.trunc(timestampMillis)), maxUUIDv7Timestamp);\n bytes[0] = Math.floor(timestamp / 2 ** 40);\n bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;\n bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;\n bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;\n bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;\n bytes[5] = timestamp & 0xff;\n bytes[6] = bytes[6] & 0x0f | 0x70;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\n//# sourceMappingURL=Crypto.js.map","/**\n * Browser-backed implementation of Effect's Crypto service.\n *\n * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.\n * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so\n * browser programs can use the standard implementation while tests or embedded\n * runtimes can provide their own `Crypto` object.\n *\n * @since 1.0.0\n */\nimport * as Context from \"effect/Context\";\nimport * as EffectCrypto from \"effect/Crypto\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PlatformError from \"effect/PlatformError\";\n/**\n * Provides Browser Web Crypto APIs used by the Crypto service implementation.\n *\n * **When to use**\n *\n * Use to override the browser `Crypto` object used by the platform crypto\n * layer.\n *\n * @category references\n * @since 1.0.0\n */\nexport const WebCrypto = /*#__PURE__*/Context.Reference(\"@effect/platform-browser/Crypto/WebCrypto\", {\n defaultValue: () => globalThis.crypto\n});\n/**\n * Layer that directly interfaces with the Web Crypto API.\n *\n * **When to use**\n *\n * Use to provide cryptographic randomness, UUID generation, and digest\n * operations in browser runtimes backed by `globalThis.crypto`.\n *\n * **Details**\n *\n * Random bytes are produced with `crypto.getRandomValues`. Digests are computed\n * with `crypto.subtle.digest` and returned as `Uint8Array` values.\n *\n * **Gotchas**\n *\n * The layer dies if the Web Crypto object is unavailable. Digest operations\n * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the\n * browser rejects the digest request.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(EffectCrypto.Crypto, /*#__PURE__*/Effect.gen(function* () {\n const crypto = yield* WebCrypto;\n if (!crypto) {\n return yield* Effect.die(new Error(\"Web Crypto API is not available\"));\n }\n const randomBytes = size => {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n };\n const digest = (algorithm, data) => {\n if (typeof crypto.subtle.digest !== \"function\") {\n return Effect.fail(PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"crypto.subtle.digest is not available\"\n }));\n }\n return Effect.map(Effect.tryPromise({\n try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: cause => PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause\n })\n }), buffer => new Uint8Array(buffer));\n };\n return EffectCrypto.make({\n randomBytes,\n digest\n });\n}));\n//# sourceMappingURL=BrowserCrypto.js.map"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BrowserCrypto-BGGRC6iW.js","names":["TypeId","Data.TaggedError","Data.Error","Effect.map","Effect.sync","Effect.clockWith","Effect.succeed","Effect.fail","PlatformError.badArgument","EffectCrypto.Crypto","Effect.die","Effect.fail","PlatformError.systemError","Effect.map","Effect.tryPromise","EffectCrypto.make"],"sources":["../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/PlatformError.js","../../../../../node_modules/.pnpm/effect@4.0.0-beta.98/node_modules/effect/dist/Crypto.js","../../../../../node_modules/.pnpm/@effect+platform-browser@4.0.0-beta.98_effect@4.0.0-beta.98/node_modules/@effect/platform-browser/dist/BrowserCrypto.js"],"sourcesContent":["/**\n * Normalized errors for platform APIs.\n *\n * Platform services such as file systems, terminals, and sockets use\n * `PlatformError` to report host-level failures in a consistent shape. The\n * wrapper records whether the problem came from an invalid argument or from the\n * operating system, while preserving useful details such as the module, method,\n * path, descriptor, description, and original cause when available.\n *\n * @since 4.0.0\n */\nimport * as Data from \"./Data.js\";\nconst TypeId = \"~effect/platform/PlatformError\";\n/**\n * Error data for an invalid argument passed to a platform API.\n *\n * **When to use**\n *\n * Use when you need to model caller input rejected before a platform operation\n * runs, including invalid-argument reason data.\n *\n * **Details**\n *\n * The error records the module and method that rejected the argument, with an\n * optional description and cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link badArgument} for creating a wrapped `PlatformError` whose reason is `BadArgument`\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link PlatformError} for the wrapper used by most platform APIs\n *\n * @category models\n * @since 4.0.0\n */\nexport class BadArgument extends /*#__PURE__*/Data.TaggedError(\"BadArgument\") {\n /**\n * Formats the module, method, and optional description that rejected the argument.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a rejected platform argument.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this.module}.${this.method}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Error data for a platform or system operation failure.\n *\n * **When to use**\n *\n * Use when you need normalized reason data for a platform or system operation\n * failure, including the operation details.\n *\n * **Details**\n *\n * The error records a normalized `_tag`, the module and method that failed,\n * and optional details such as the syscall, path or descriptor, description,\n * and original cause. It is usually wrapped in `PlatformError`.\n *\n * @see {@link systemError} for creating the usual `PlatformError` wrapper from this reason data\n * @see {@link BadArgument} for platform API failures caused by rejected caller input before an operation runs\n * @see {@link SystemErrorTag} for the normalized tag values stored in `_tag`\n *\n * @category models\n * @since 4.0.0\n */\nexport class SystemError extends Data.Error {\n /**\n * Formats the normalized system error tag with operation and path details.\n *\n * **When to use**\n *\n * Use to read the formatted error message for a normalized system failure.\n *\n * @since 4.0.0\n */\n get message() {\n return `${this._tag}: ${this.module}.${this.method}${this.pathOrDescriptor !== undefined ? ` (${this.pathOrDescriptor})` : \"\"}${this.description ? `: ${this.description}` : \"\"}`;\n }\n}\n/**\n * Tagged error used by platform APIs to report either invalid arguments or\n * system-level failures.\n *\n * **When to use**\n *\n * Use as the shared error type for platform APIs that expose invalid arguments\n * and host or operating-system failures through a single `Effect` error\n * channel.\n *\n * **Details**\n *\n * The `reason` field contains the underlying `BadArgument` or `SystemError`.\n * When that reason has a cause, the cause is preserved on the wrapper.\n *\n * @see {@link BadArgument} for invalid inputs rejected before an operation runs\n * @see {@link SystemError} for failures reported by the host platform or operating system\n * @see {@link badArgument} for creating this wrapper from rejected caller input\n * @see {@link systemError} for creating this wrapper from a host or operating-system failure\n *\n * @category models\n * @since 4.0.0\n */\nexport class PlatformError extends /*#__PURE__*/Data.TaggedError(\"PlatformError\") {\n constructor(reason) {\n if (\"cause\" in reason) {\n super({\n reason,\n cause: reason.cause\n });\n } else {\n super({\n reason\n });\n }\n }\n /**\n * Marks this value as a platform error wrapper for runtime guards.\n *\n * **When to use**\n *\n * Use to identify `PlatformError` values through their runtime type marker.\n *\n * @since 4.0.0\n */\n [TypeId] = TypeId;\n get message() {\n return this.reason.message;\n }\n}\n/**\n * Creates a `PlatformError` whose reason is a `SystemError`.\n *\n * **When to use**\n *\n * Use to adapt an operating-system or platform failure into the normalized\n * platform error model.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const systemError = options => new PlatformError(new SystemError(options));\n/**\n * Creates a `PlatformError` whose reason is a `BadArgument`.\n *\n * **When to use**\n *\n * Use to report a platform API rejecting caller input before performing the\n * underlying operation.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const badArgument = options => new PlatformError(new BadArgument(options));\n//# sourceMappingURL=PlatformError.js.map","/**\n * Defines a platform-independent service for cryptographic operations.\n *\n * Runtime packages provide concrete implementations backed by the host\n * platform's cryptography APIs. This module defines the service interface and a\n * constructor from random-byte and digest primitives. The service provides\n * secure random bytes and numbers, UUIDv4 and UUIDv7 generation, shuffling, and\n * SHA message digests.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as PlatformError from \"./PlatformError.js\";\nconst TypeId = \"~effect/platform/Crypto\";\n/**\n * Service tag for platform cryptography.\n *\n * **When to use**\n *\n * Use when you need to provide or retrieve the full platform cryptography\n * service from an effect's context.\n *\n * **Details**\n *\n * Providing this service supplies platform-agnostic cryptographic operations\n * such as hashing, UUID generation, and secure random values.\n *\n * @see {@link make} for constructing a Crypto service from primitive operations\n *\n * @category services\n * @since 4.0.0\n */\nexport const Crypto = /*#__PURE__*/Context.Service(\"effect/Crypto\");\n/**\n * Creates a `Crypto` service from the primitive implementation, deriving the\n * random generator helpers and UUID generation from those primitives.\n *\n * **When to use**\n *\n * Use to build a Crypto service for a platform integration, test layer, or\n * custom runtime from primitive random-byte and digest operations.\n *\n * **Details**\n *\n * The constructor derives random numbers, booleans, integer ranges, shuffling,\n * and UUID generation from `impl.randomBytes`. Digest operations delegate to\n * `impl.digest`.\n *\n * **Gotchas**\n *\n * `impl.randomBytes` must return cryptographically secure bytes of the\n * requested length. UUID formatting mutates the byte array returned for UUID\n * generation, so the implementation should return a fresh array for each call.\n *\n * **Example** (Creating a Crypto service)\n *\n * ```ts\n * import { Crypto, Effect, Layer } from \"effect\"\n *\n * const TestCrypto = Layer.succeed(\n * Crypto.Crypto,\n * Crypto.make({\n * randomBytes: (size) => new Uint8Array(size),\n * digest: (_algorithm, data) => Effect.succeed(data)\n * })\n * )\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = impl => {\n const randomBytesUnsafe = impl.randomBytes;\n const randomBytes = size => Effect.map(validateSize(\"randomBytes\", size), randomBytesUnsafe);\n const nextDoubleUnsafe = () => {\n const bytes = randomBytesUnsafe(7);\n const value = (bytes[0] & 0x1f) * 2 ** 48 + bytes[1] * 2 ** 40 + bytes[2] * 2 ** 32 + bytes[3] * 2 ** 24 + bytes[4] * 2 ** 16 + bytes[5] * 2 ** 8 + bytes[6];\n return value / 2 ** 53;\n };\n const nextIntUnsafe = () => Math.floor(nextDoubleUnsafe() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1)) + Number.MIN_SAFE_INTEGER;\n return Crypto.of({\n [TypeId]: TypeId,\n randomBytes,\n nextDoubleUnsafe,\n nextIntUnsafe,\n digest: impl.digest,\n random: Effect.sync(() => nextDoubleUnsafe()),\n randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n randomInt: Effect.sync(() => nextIntUnsafe()),\n randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n randomIntBetween(min, max, options) {\n const extra = options?.halfOpen === true ? 0 : 1;\n return Effect.sync(() => {\n const minInt = Math.ceil(min);\n const maxInt = Math.floor(max);\n return Math.floor(nextDoubleUnsafe() * (maxInt - minInt + extra)) + minInt;\n });\n },\n randomShuffle: elements => Effect.sync(() => {\n const buffer = Array.from(elements);\n for (let i = buffer.length - 1; i >= 1; i = i - 1) {\n const index = Math.min(i, Math.floor(nextDoubleUnsafe() * (i + 1)));\n const value = buffer[i];\n buffer[i] = buffer[index];\n buffer[index] = value;\n }\n return buffer;\n }),\n randomUUIDv4: Effect.sync(() => formatUUIDv4(randomBytesUnsafe(16))),\n randomUUIDv7: Effect.clockWith(clock => Effect.succeed(formatUUIDv7(clock.currentTimeMillisUnsafe(), randomBytesUnsafe(16))))\n });\n};\nconst validateSize = (method, size) => Number.isSafeInteger(size) && size >= 0 ? Effect.succeed(size) : Effect.fail(PlatformError.badArgument({\n module: \"Crypto\",\n method,\n description: \"size must be a non-negative safe integer\"\n}));\nconst hex = byte => byte.toString(16).padStart(2, \"0\");\nconst formatUUID = bytes => {\n const segments = [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10, 16)];\n return segments.map(segment => Array.from(segment, hex).join(\"\")).join(\"-\");\n};\nconst formatUUIDv4 = bytes => {\n bytes[6] = bytes[6] & 0x0f | 0x40;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\nconst maxUUIDv7Timestamp = 2 ** 48 - 1;\nconst formatUUIDv7 = (timestampMillis, bytes) => {\n const timestamp = Math.min(Math.max(0, Math.trunc(timestampMillis)), maxUUIDv7Timestamp);\n bytes[0] = Math.floor(timestamp / 2 ** 40);\n bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;\n bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;\n bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;\n bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;\n bytes[5] = timestamp & 0xff;\n bytes[6] = bytes[6] & 0x0f | 0x70;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n return formatUUID(bytes);\n};\n//# sourceMappingURL=Crypto.js.map","/**\n * Browser-backed implementation of Effect's Crypto service.\n *\n * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.\n * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so\n * browser programs can use the standard implementation while tests or embedded\n * runtimes can provide their own `Crypto` object.\n *\n * @since 1.0.0\n */\nimport * as Context from \"effect/Context\";\nimport * as EffectCrypto from \"effect/Crypto\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PlatformError from \"effect/PlatformError\";\n/**\n * Provides Browser Web Crypto APIs used by the Crypto service implementation.\n *\n * **When to use**\n *\n * Use to override the browser `Crypto` object used by the platform crypto\n * layer.\n *\n * @category references\n * @since 1.0.0\n */\nexport const WebCrypto = /*#__PURE__*/Context.Reference(\"@effect/platform-browser/Crypto/WebCrypto\", {\n defaultValue: () => globalThis.crypto\n});\n/**\n * Layer that directly interfaces with the Web Crypto API.\n *\n * **When to use**\n *\n * Use to provide cryptographic randomness, UUID generation, and digest\n * operations in browser runtimes backed by `globalThis.crypto`.\n *\n * **Details**\n *\n * Random bytes are produced with `crypto.getRandomValues`. Digests are computed\n * with `crypto.subtle.digest` and returned as `Uint8Array` values.\n *\n * **Gotchas**\n *\n * The layer dies if the Web Crypto object is unavailable. Digest operations\n * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the\n * browser rejects the digest request.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(EffectCrypto.Crypto, /*#__PURE__*/Effect.gen(function* () {\n const crypto = yield* WebCrypto;\n if (!crypto) {\n return yield* Effect.die(new Error(\"Web Crypto API is not available\"));\n }\n const randomBytes = size => {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n };\n const digest = (algorithm, data) => {\n if (typeof crypto.subtle.digest !== \"function\") {\n return Effect.fail(PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"crypto.subtle.digest is not available\"\n }));\n }\n return Effect.map(Effect.tryPromise({\n try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: cause => PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause\n })\n }), buffer => new Uint8Array(buffer));\n };\n return EffectCrypto.make({\n randomBytes,\n digest\n });\n}));\n//# sourceMappingURL=BrowserCrypto.js.map"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js → BrowserSessionHydrator-39UDbHf0.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t}from"./jsx-runtime-n5LQ9ujS.js";import{s as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=BrowserSessionHydrator-
|
|
1
|
+
import{a as e,n as t}from"./jsx-runtime-n5LQ9ujS.js";import{s as n}from"./index-DpW_ckau.js";import{Lt as r,dt as i,i as a,pt as o,st as s,t as c}from"./client-P7FaPwzJ.js";var l=e(t(),1),u=s(function*(){return yield*(yield*c()).session.current()}).pipe(i(a)),d=e=>!r(e,`_tag`)||typeof e._tag!=`string`?{_tag:`unavailable`}:e._tag===`UnauthorizedApiError`?{_tag:`anonymous`}:e._tag===`ForbiddenApiError`?{_tag:`blocked`}:{_tag:`unavailable`},f=()=>{let{beginHydration:e,completeHydration:t}=n();return(0,l.useEffect)(()=>{let n=e(),r=!0;return o(u).then(e=>{r&&t(n,{_tag:`authenticated`,csrfToken:e.csrfToken,session:e.session})},e=>{r&&t(n,d(e))}),()=>{r=!1}},[e,t]),null};export{f as BrowserSessionHydrator};
|
|
2
|
+
//# sourceMappingURL=BrowserSessionHydrator-39UDbHf0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserSessionHydrator-
|
|
1
|
+
{"version":3,"file":"BrowserSessionHydrator-39UDbHf0.js","names":[],"sources":["../../../src/client/BrowserSessionHydrator.tsx"],"sourcesContent":["import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { type ReactElement, useEffect } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { useBrowserSession, type BrowserSessionState } from \"./BrowserSession.js\"\n\nconst loadBrowserSession = Effect.gen(function* () {\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.current()\n}).pipe(Effect.provide(FetchHttpClient.layer))\n\nconst failedSessionState = (\n failure: unknown\n): Exclude<BrowserSessionState, { readonly _tag: \"authenticated\" | \"checking\" }> => {\n if (!Predicate.hasProperty(failure, \"_tag\") || typeof failure._tag !== \"string\") {\n return { _tag: \"unavailable\" }\n }\n if (failure._tag === \"UnauthorizedApiError\") return { _tag: \"anonymous\" }\n if (failure._tag === \"ForbiddenApiError\") return { _tag: \"blocked\" }\n return { _tag: \"unavailable\" }\n}\n\n/** Recover this tab's mutation proof once, regardless of its initial route. */\nexport const BrowserSessionHydrator = (): ReactElement | null => {\n const { beginHydration, completeHydration } = useBrowserSession()\n\n useEffect(() => {\n const attempt = beginHydration()\n let isCurrent = true\n Effect.runPromise(loadBrowserSession).then(\n (result) => {\n if (!isCurrent) return\n completeHydration(attempt, {\n _tag: \"authenticated\",\n csrfToken: result.csrfToken,\n session: result.session\n })\n },\n (failure: unknown) => {\n if (isCurrent) completeHydration(attempt, failedSessionState(failure))\n }\n )\n return () => {\n isCurrent = false\n }\n }, [beginHydration, completeHydration])\n\n return null\n}\n"],"mappings":"4LAQM,EAAqB,EAAW,WAAa,CAEjD,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,QAAQ,QAAQ,CACvC,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAEvC,EACJ,GAEI,CAAC,EAAsB,EAAS,MAAM,GAAK,OAAO,EAAQ,MAAS,SAC9D,CAAE,KAAM,aAAc,EAE3B,EAAQ,OAAS,uBAA+B,CAAE,KAAM,WAAY,EACpE,EAAQ,OAAS,oBAA4B,CAAE,KAAM,SAAU,EAC5D,CAAE,KAAM,aAAc,EAIlB,MAAoD,CAC/D,GAAM,CAAE,iBAAgB,qBAAsB,EAAkB,EAuBhE,OArBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAU,EAAe,EAC3B,EAAY,GAchB,OAbA,EAAkB,CAAkB,CAAC,CAAC,KACnC,GAAW,CACL,GACL,EAAkB,EAAS,CACzB,KAAM,gBACN,UAAW,EAAO,UAClB,QAAS,EAAO,OAClB,CAAC,CACH,EACC,GAAqB,CAChB,GAAW,EAAkB,EAAS,EAAmB,CAAO,CAAC,CACvE,CACF,MACa,CACX,EAAY,EACd,CACF,EAAG,CAAC,EAAgB,CAAiB,CAAC,EAE/B,IACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,h as i,r as a,s as o,w as s}from"./Dialog-DwSIPb-B-DVn37afM.js";import{o as c,r as l}from"./releasePaths-s-fSbIM-.js";import{a as u,o as d,s as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=CommandSearch-
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,h as i,r as a,s as o,w as s}from"./Dialog-DwSIPb-B-DVn37afM.js";import{o as c,r as l}from"./releasePaths-s-fSbIM-.js";import{a as u,o as d,s as f}from"./index-DpW_ckau.js";import{v as p}from"./patterns-DEbg7R-A-BhsMyh9D.js";import{dt as m,i as h,pt as g,st as _,t as v,zt as y}from"./client-P7FaPwzJ.js";import{i as b,o as x}from"./releaseRoutes-CfaNElmG.js";import{n as S,r as C}from"./workspaceEntityRoutes-Biw67kRR.js";import{n as w,t as T}from"./useWorkspaceItems-DQTYaq1R.js";import{t as E}from"./presentPortfolio-D-v615bg.js";var D=e(t(),1),O=e=>{let t=new URLSearchParams,n=e.trim();return n.length>0&&t.set(`q`,n),t},k=(e,t)=>{let n=O(t),r=n.size===0?``:`?${n.toString()}`;return`${c(e)}${r}#results`},A=y(`UnauthorizedApiError`),j={load:e=>g(_(function*(){return yield*(yield*v()).portfolio.snapshot()}).pipe(m(h)),{signal:e})},M=e=>E(e).releases.map(t=>({codename:t.relay.codename,href:l(e.workspaceId,t.id),id:t.id,serviceName:t.serviceName,status:t.lifecycleLabel,tone:t.lifecycleTone,version:t.version})),N=(e,t,n=j)=>{let[r,i]=(0,D.useState)(0),[a,o]=(0,D.useState)({_tag:`idle`});(0,D.useEffect)(()=>{if(e===null){o({_tag:`idle`});return}let r=new AbortController;return o({_tag:`loading`,sessionKey:e}),n.load(r.signal).then(t=>{r.signal.aborted||o({_tag:`ready`,releases:M(t),sessionKey:e,workspaceId:t.workspaceId})},n=>{r.signal.aborted||(A(n)&&t(e),o({_tag:`failed`,sessionKey:e}))}),()=>r.abort()},[t,r,e,n]);let s=e===null?{_tag:`idle`}:a._tag===`idle`||a.sessionKey!==e?{_tag:`loading`,sessionKey:e}:a;return{retry:(0,D.useCallback)(()=>i(e=>e+1),[]),state:s}},P={trigger:`_trigger_dhy9p_1`,pairTrigger:`_pairTrigger_dhy9p_2`,dialog:`_dialog_dhy9p_13`,searchField:`_searchField_dhy9p_17`,results:`_results_dhy9p_43`,result:`_result_dhy9p_43`,resultCopy:`_resultCopy_dhy9p_69`,releaseMark:`_releaseMark_dhy9p_75`,resultKey:`_resultKey_dhy9p_96`,message:`_message_dhy9p_102`,loading:`_loading_dhy9p_103`,footer:`_footer_dhy9p_120`,visuallyHidden:`_visuallyHidden_dhy9p_149`},F=n(),I=2,L=6,R=new Set,z=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),B=e=>e===null?!1:`isContentEditable`in e&&e.isContentEditable===!0?!0:!(`nodeName`in e)||typeof e.nodeName!=`string`?!1:e.nodeName===`INPUT`||e.nodeName===`SELECT`||e.nodeName===`TEXTAREA`,V=(e,t)=>{let n=t.map(e=>e.toLocaleLowerCase(`en-US`));return n.some(t=>t===e)?0:n.some(t=>t.startsWith(e))?1:n.some(t=>t.includes(e))?2:3},H=(e,t,n)=>{let r=n.trim().toLocaleLowerCase(`en-US`);if(r.length===0)return[];let i=e.flatMap(e=>{let t=V(r,[e.codename,e.version,e.serviceName,e.status]);return t===3?[]:[{_tag:`release`,rank:t,release:e}]}),a=t.flatMap(e=>{let t=V(r,[e.key,e.title,e.status]);return t===3?[]:[{_tag:`item`,item:e,rank:t}]});return[...i,...a].sort((e,t)=>{if(e.rank!==t.rank)return e.rank-t.rank;if(e._tag!==t._tag)return e._tag===`release`?-1:1;let n=e._tag===`release`?e.release.codename:e.item.key,r=t._tag===`release`?t.release.codename:t.item.key;return n.localeCompare(r)}).slice(0,L)},U=({releaseTransport:e=j,sessionKey:t,transport:n=T,workspaceId:c})=>{let l=f(),d=s(),m=r(),h=(0,D.useRef)(null),[g,_]=(0,D.useState)(!1),[v,y]=(0,D.useState)(``),[E,O]=(0,D.useState)(0),A=v.trim(),M=(0,D.useDeferredValue)(A),L=M.length>=I,V=N(g?t:null,l.invalidateSession,e),U=V.state,W=(0,D.useMemo)(()=>U._tag===`ready`&&U.workspaceId===c?new Set(U.releases.map(({id:e})=>e)):R,[U,c]),G=U._tag===`ready`&&U.workspaceId===c,K=w(c,W,(0,D.useMemo)(()=>({owner:`all`,query:L?M:``,service:`all`,status:`all`,type:`all`}),[M,L]),U._tag===`ready`?U.releases.map(({id:e})=>e).join(`:`):`command-search`,g&&L&&G?t:null,l.invalidateSession,n),q=K.state._tag===`ready`&&!K.state.refreshing,J=G&&q?H(U.releases,K.state.items,M):[],Y=J.length>0,X=e=>{_(e),e||(y(``),O(0))};(0,D.useEffect)(()=>{let e=e=>{e.defaultPrevented||B(e.target)||e.key.toLocaleLowerCase(`en-US`)!==`k`||!e.metaKey&&!e.ctrlKey||(e.preventDefault(),_(!0))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[]),(0,D.useEffect)(()=>O(0),[M]);let Z=e=>{if(X(!1),e._tag===`release`){m(e.release.href,{state:b(c,e.release.id,x(d))});return}let t=e.item;m(t.href,{state:C(d.state,c,t.entityId,S(d))})};return(0,F.jsxs)(o.Root,{onOpenChange:X,open:g,children:[(0,F.jsx)(o.Trigger,{className:P.trigger,size:`compact`,variant:`quiet`,children:`Search ⌘K`}),(0,F.jsxs)(o.Content,{className:P.dialog,description:`Find releases and current work, or continue with Relay.`,initialFocusRef:h,size:`wide`,title:`Go anywhere.`,children:[(0,F.jsxs)(`label`,{className:P.searchField,children:[(0,F.jsx)(`span`,{className:P.visuallyHidden,children:`Search workspace`}),(0,F.jsx)(`input`,{"aria-activedescendant":Y?`command-search-option-${E}`:void 0,"aria-autocomplete":`list`,"aria-busy":M!==A||U._tag===`loading`||K.state._tag===`loading`,"aria-controls":Y?`command-search-results`:void 0,"aria-expanded":Y,"aria-label":`Search workspace`,autoComplete:`off`,maxLength:200,onChange:e=>y(e.currentTarget.value),onKeyDown:e=>{if(J.length!==0){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;O(e=>(e+t+J.length)%J.length);return}if(e.key===`Enter`){e.preventDefault();let t=J[E];t!==void 0&&Z(t)}}},placeholder:`Release, ticket, PR, page, pipeline…`,ref:h,role:`combobox`,type:`search`,value:v})]}),A.length<I?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsx)(`strong`,{children:`Type two characters.`}),(0,F.jsx)(`span`,{children:`Search releases, tickets, pull requests, docs, pipelines, deployments, and time.`})]}):M!==A||U._tag===`idle`||U._tag===`loading`||K.state._tag===`idle`||K.state._tag===`loading`?(0,F.jsx)(`div`,{className:P.loading,children:`Searching the current workspace…`}):!G||K.state._tag===`failed`?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsx)(`strong`,{children:`Search is unavailable.`}),(0,F.jsx)(`span`,{children:`The release and item indexes were not changed.`}),(0,F.jsx)(`button`,{onClick:()=>{V.retry(),K.retry()},type:`button`,children:`Try again`})]}):J.length===0?(0,F.jsxs)(`div`,{className:P.message,children:[(0,F.jsxs)(`strong`,{children:[`No release or current item matches “`,M,`”.`]}),(0,F.jsx)(`span`,{children:`Try a release name, version, key, title, or current status.`})]}):(0,F.jsx)(`div`,{"aria-label":`Workspace search results`,className:P.results,id:`command-search-results`,role:`listbox`,children:J.map((e,t)=>{let n=e._tag===`release`,r=n?e.release.id:e.item.entityId;return(0,F.jsxs)(`button`,{"aria-selected":t===E,className:P.result,id:`command-search-option-${t}`,onClick:()=>Z(e),onMouseEnter:()=>O(t),role:`option`,type:`button`,children:[n?(0,F.jsx)(`span`,{className:P.releaseMark,children:`R`}):(0,F.jsx)(p,{service:e.item.service,size:`compact`}),(0,F.jsxs)(`span`,{className:P.resultCopy,children:[(0,F.jsx)(`span`,{className:P.resultKey,children:n?`${e.release.version} · Release`:e.item.key}),(0,F.jsx)(`strong`,{children:n?e.release.codename:e.item.title}),(0,F.jsx)(`span`,{children:n?e.release.serviceName:z(e.item.kind)})]}),(0,F.jsx)(a,{label:n?e.release.status:e.item.status,size:`compact`,tone:n?e.release.tone:e.item.tone})]},r)})}),(0,F.jsxs)(`footer`,{className:P.footer,children:[(0,F.jsx)(i,{onClick:()=>X(!1),to:k(c,A),children:`Open item results`}),(0,F.jsx)(i,{onClick:()=>X(!1),to:u(d.pathname,d.search,d.hash),children:`Ask Relay from here`}),(0,F.jsx)(`span`,{children:`↑↓ choose · Enter open · Esc close`})]})]})]})},W=e=>{let t=f(),n=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,r=d(t.state);return n!==null&&n.workspaceId!==e.workspaceId?null:r===null?(0,F.jsx)(i,{className:P.pairTrigger,to:`/pair`,children:`Pair to search`}):(0,F.jsx)(U,{...e,sessionKey:r})};export{W as CommandSearch,H as commandSearchResults};
|
|
2
|
+
//# sourceMappingURL=CommandSearch-D4Fnjsl-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandSearch-D6iFcdvj.js","names":[],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n): { readonly retry: () => void; readonly state: CommandReleasesState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || typeof target.nodeName !== \"string\") return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const itemsReady = items.state._tag === \"ready\" && !items.state.refreshing\n const results =\n releasesReady && itemsReady ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery) : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandSearch-D4Fnjsl-.js","names":[],"sources":["../../../src/client/command/commandSearchRoutes.ts","../../../src/client/command/useCommandReleases.ts","../../../src/client/command/CommandSearch.module.css","../../../src/client/command/CommandSearch.tsx"],"sourcesContent":["import type { EntityId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { workspaceItemsPath } from \"../releases/releasePaths.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\n\nconst searchParameters = (query: string): URLSearchParams => {\n const parameters = new URLSearchParams()\n const normalized = query.trim()\n if (normalized.length > 0) parameters.set(\"q\", normalized)\n return parameters\n}\n\n/** Open the workspace Items route with the exact command-search text. */\nexport const commandSearchItemsHref = (workspaceId: WorkspaceId, query: string): string => {\n const parameters = searchParameters(query)\n const search = parameters.size === 0 ? \"\" : `?${parameters.toString()}`\n return `${workspaceItemsPath(workspaceId)}${search}#results`\n}\n\n/** Open one command-search result without inventing a release membership. */\nexport const commandSearchItemHref = (\n workspaceId: WorkspaceId,\n entityId: EntityId\n): string => workspaceEntityPath(workspaceId, entityId)\n","import * as Effect from \"effect/Effect\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { PortfolioSnapshot } from \"../../api/portfolio.js\"\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { presentPortfolio } from \"../portfolio/presentPortfolio.js\"\nimport { releaseFullPath } from \"../releases/releasePaths.js\"\n\nexport type CommandReleasePresentation = {\n readonly codename: string\n readonly href: string\n readonly id: ReleaseId\n readonly serviceName: string\n readonly status: string\n readonly tone: \"caution\" | \"critical\" | \"neutral\" | \"positive\" | \"progress\"\n readonly version: string\n}\n\nexport type CommandReleasesState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\"; readonly sessionKey: string }\n | { readonly _tag: \"failed\"; readonly sessionKey: string }\n | {\n readonly _tag: \"ready\"\n readonly releases: ReadonlyArray<CommandReleasePresentation>\n readonly sessionKey: string\n readonly workspaceId: WorkspaceId\n }\n\nexport type CommandReleasesTransport = {\n readonly load: (signal: AbortSignal) => Promise<PortfolioSnapshot>\n}\n\nconst isUnauthorizedFailure = Predicate.isTagged(\"UnauthorizedApiError\")\n\n/** Generated-client transport for one authenticated, bounded portfolio snapshot. */\nexport const browserCommandReleasesTransport: CommandReleasesTransport = {\n load: (signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.portfolio.snapshot()\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n\nconst presentCommandReleases = (snapshot: PortfolioSnapshot): ReadonlyArray<CommandReleasePresentation> =>\n presentPortfolio(snapshot).releases.map((release) => ({\n codename: release.relay.codename,\n href: releaseFullPath(snapshot.workspaceId, release.id),\n id: release.id,\n serviceName: release.serviceName,\n status: release.lifecycleLabel,\n tone: release.lifecycleTone,\n version: release.version\n }))\n\n/** Load one session-isolated release index while the command surface is open. */\nexport const useCommandReleases = (\n sessionKey: string | null,\n onSessionExpired: (sessionKey: string) => void,\n transport: CommandReleasesTransport = browserCommandReleasesTransport\n): { readonly retry: () => void; readonly state: CommandReleasesState } => {\n const [requestRevision, setRequestRevision] = useState(0)\n const [state, setState] = useState<CommandReleasesState>({ _tag: \"idle\" })\n\n useEffect(() => {\n if (sessionKey === null) {\n setState({ _tag: \"idle\" })\n return\n }\n const abort = new AbortController()\n setState({ _tag: \"loading\", sessionKey })\n transport.load(abort.signal).then(\n (snapshot) => {\n if (abort.signal.aborted) return\n setState({\n _tag: \"ready\",\n releases: presentCommandReleases(snapshot),\n sessionKey,\n workspaceId: snapshot.workspaceId\n })\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (isUnauthorizedFailure(failure)) onSessionExpired(sessionKey)\n setState({ _tag: \"failed\", sessionKey })\n }\n )\n return () => abort.abort()\n }, [onSessionExpired, requestRevision, sessionKey, transport])\n\n const currentState: CommandReleasesState = sessionKey === null\n ? { _tag: \"idle\" }\n : state._tag === \"idle\" || state.sessionKey !== sessionKey\n ? { _tag: \"loading\", sessionKey }\n : state\n\n return {\n retry: useCallback(() => setRequestRevision((revision) => revision + 1), []),\n state: currentState\n }\n}\n",".trigger,\n.pairTrigger {\n white-space: nowrap;\n}\n\n.pairTrigger {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.dialog {\n gap: var(--rly-space-16);\n}\n\n.searchField {\n display: block;\n}\n\n.searchField input {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: 4.5rem;\n border: 0;\n border-block-end: 1px solid var(--rly-color-border-2);\n outline: 0;\n background: transparent;\n color: var(--rly-color-text-1);\n font: var(--rly-type-section-title-weight) var(--rly-type-section-title-size) /\n var(--rly-type-section-title-line-height) var(--rly-type-section-title-font);\n letter-spacing: var(--rly-type-section-title-tracking);\n}\n\n.searchField input::placeholder {\n color: var(--rly-color-text-3);\n}\n\n.searchField input:focus-visible {\n border-block-end-color: var(--rly-color-focus);\n}\n\n.results {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.result {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rly-space-12);\n inline-size: 100%;\n min-block-size: 4.5rem;\n padding: var(--rly-space-12);\n border: 1px solid transparent;\n border-radius: var(--rly-radius-control);\n background: transparent;\n color: var(--rly-color-text-1);\n cursor: pointer;\n text-align: start;\n}\n\n.result[aria-selected=\"true\"] {\n border-color: var(--rly-color-border-2);\n background: var(--rly-color-surface-2);\n}\n\n.resultCopy {\n display: grid;\n min-inline-size: 0;\n gap: var(--rly-space-2);\n}\n\n.releaseMark {\n display: grid;\n inline-size: var(--rly-space-32);\n block-size: var(--rly-space-32);\n place-items: center;\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-action-background);\n color: var(--rly-color-action-foreground);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.resultCopy strong {\n overflow: hidden;\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resultCopy > span:last-child,\n.resultKey {\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.message,\n.loading {\n display: grid;\n min-block-size: 10rem;\n place-content: center;\n gap: var(--rly-space-8);\n color: var(--rly-color-text-2);\n text-align: center;\n}\n\n.message strong {\n color: var(--rly-color-text-1);\n font: var(--rly-type-card-title-weight) var(--rly-type-card-title-size) / var(--rly-type-card-title-line-height)\n var(--rly-type-card-title-font);\n}\n\n.message a,\n.message button,\n.footer a {\n color: var(--rly-color-text-1);\n font: inherit;\n text-underline-offset: 0.2em;\n}\n\n.message button {\n border: 0;\n background: transparent;\n cursor: pointer;\n text-decoration: underline;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rly-space-16);\n padding-block-start: var(--rly-space-12);\n border-block-start: 1px solid var(--rly-color-border-1);\n color: var(--rly-color-text-3);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.footer span {\n margin-inline-start: auto;\n}\n\n.visuallyHidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (max-width: 40rem) {\n .footer span {\n display: none;\n }\n\n .result {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .result > :last-child {\n grid-column: 2;\n }\n}\n","import { ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Dialog, StateLabel } from \"@knpkv/rly/primitives\"\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { Link, useLocation, useNavigate } from \"react-router\"\n\nimport type { ReleaseId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { browserReadableSessionKey, useBrowserSession } from \"../BrowserSession.js\"\nimport { contextualAgentPath } from \"../contextualAgentPath.js\"\nimport type { WorkspaceItemPresentation } from \"../items/presentWorkspaceItems.js\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"../items/workspaceEntityRoutes.js\"\nimport {\n browserWorkspaceItemsTransport,\n useWorkspaceItems,\n type WorkspaceItemsQuery,\n type WorkspaceItemsTransport\n} from \"../items/useWorkspaceItems.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { commandSearchItemsHref } from \"./commandSearchRoutes.js\"\nimport {\n browserCommandReleasesTransport,\n type CommandReleasePresentation,\n type CommandReleasesTransport,\n useCommandReleases\n} from \"./useCommandReleases.js\"\nimport styles from \"./CommandSearch.module.css\"\n\nconst MINIMUM_QUERY_LENGTH = 2\nconst RESULT_LIMIT = 6\nconst EMPTY_RELEASE_SCOPE: ReadonlySet<ReleaseId> = new Set()\n\ntype CommandSearchResult =\n | { readonly _tag: \"item\"; readonly item: WorkspaceItemPresentation; readonly rank: number }\n | { readonly _tag: \"release\"; readonly rank: number; readonly release: CommandReleasePresentation }\n\nconst kindLabel = (kind: WorkspaceItemPresentation[\"kind\"]): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nconst isEditingTarget = (target: EventTarget | null): boolean => {\n if (target === null) return false\n if (\"isContentEditable\" in target && target.isContentEditable === true) return true\n if (!(\"nodeName\" in target) || typeof target.nodeName !== \"string\") return false\n return target.nodeName === \"INPUT\" || target.nodeName === \"SELECT\" || target.nodeName === \"TEXTAREA\"\n}\n\nconst matchRank = (query: string, values: ReadonlyArray<string>): number => {\n const normalizedValues = values.map((value) => value.toLocaleLowerCase(\"en-US\"))\n if (normalizedValues.some((value) => value === query)) return 0\n if (normalizedValues.some((value) => value.startsWith(query))) return 1\n return normalizedValues.some((value) => value.includes(query)) ? 2 : 3\n}\n\n/** Combine bounded release and service-entity results with deterministic exact/prefix/contains ranking. */\nexport const commandSearchResults = (\n releases: ReadonlyArray<CommandReleasePresentation>,\n items: ReadonlyArray<WorkspaceItemPresentation>,\n query: string\n): ReadonlyArray<CommandSearchResult> => {\n const normalizedQuery = query.trim().toLocaleLowerCase(\"en-US\")\n if (normalizedQuery.length === 0) return []\n const releaseResults: ReadonlyArray<CommandSearchResult> = releases.flatMap((release) => {\n const rank = matchRank(normalizedQuery, [release.codename, release.version, release.serviceName, release.status])\n return rank === 3 ? [] : [{ _tag: \"release\", rank, release }]\n })\n const itemResults: ReadonlyArray<CommandSearchResult> = items.flatMap((item) => {\n const rank = matchRank(normalizedQuery, [item.key, item.title, item.status])\n return rank === 3 ? [] : [{ _tag: \"item\", item, rank }]\n })\n return [...releaseResults, ...itemResults]\n .sort((left, right) => {\n if (left.rank !== right.rank) return left.rank - right.rank\n if (left._tag !== right._tag) return left._tag === \"release\" ? -1 : 1\n const leftLabel = left._tag === \"release\" ? left.release.codename : left.item.key\n const rightLabel = right._tag === \"release\" ? right.release.codename : right.item.key\n return leftLabel.localeCompare(rightLabel)\n })\n .slice(0, RESULT_LIMIT)\n}\n\nexport type CommandSearchProps = {\n readonly releaseTransport?: CommandReleasesTransport\n readonly transport?: WorkspaceItemsTransport\n readonly workspaceId: WorkspaceId\n}\n\ntype CommandSearchSurfaceProps = CommandSearchProps & { readonly sessionKey: string }\n\nconst CommandSearchSurface = ({\n releaseTransport = browserCommandReleasesTransport,\n sessionKey,\n transport = browserWorkspaceItemsTransport,\n workspaceId\n}: CommandSearchSurfaceProps): ReactElement => {\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const inputRef = useRef<HTMLInputElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const normalizedQuery = query.trim()\n const deferredQuery = useDeferredValue(normalizedQuery)\n const queryReady = deferredQuery.length >= MINIMUM_QUERY_LENGTH\n const releases = useCommandReleases(open ? sessionKey : null, browserSession.invalidateSession, releaseTransport)\n const releaseState = releases.state\n const releaseScope = useMemo(\n () =>\n releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n ? new Set(releaseState.releases.map(({ id }) => id))\n : EMPTY_RELEASE_SCOPE,\n [releaseState, workspaceId]\n )\n const releasesReady = releaseState._tag === \"ready\" && releaseState.workspaceId === workspaceId\n const filters = useMemo<WorkspaceItemsQuery>(\n () => ({ owner: \"all\", query: queryReady ? deferredQuery : \"\", service: \"all\", status: \"all\", type: \"all\" }),\n [deferredQuery, queryReady]\n )\n const items = useWorkspaceItems(\n workspaceId,\n releaseScope,\n filters,\n releaseState._tag === \"ready\" ? releaseState.releases.map(({ id }) => id).join(\":\") : \"command-search\",\n open && queryReady && releasesReady ? sessionKey : null,\n browserSession.invalidateSession,\n transport\n )\n const itemsReady = items.state._tag === \"ready\" && !items.state.refreshing\n const results =\n releasesReady && itemsReady ? commandSearchResults(releaseState.releases, items.state.items, deferredQuery) : []\n const showListbox = results.length > 0\n\n const changeOpen = (nextOpen: boolean): void => {\n setOpen(nextOpen)\n if (!nextOpen) {\n setQuery(\"\")\n setHighlightedIndex(0)\n }\n }\n\n useEffect(() => {\n const openFromKeyboard = (event: KeyboardEvent): void => {\n if (\n event.defaultPrevented ||\n isEditingTarget(event.target) ||\n event.key.toLocaleLowerCase(\"en-US\") !== \"k\" ||\n (!event.metaKey && !event.ctrlKey)\n )\n return\n event.preventDefault()\n setOpen(true)\n }\n document.addEventListener(\"keydown\", openFromKeyboard)\n return () => document.removeEventListener(\"keydown\", openFromKeyboard)\n }, [])\n\n useEffect(() => setHighlightedIndex(0), [deferredQuery])\n\n const openResult = (result: CommandSearchResult): void => {\n changeOpen(false)\n if (result._tag === \"release\") {\n navigate(result.release.href, {\n state: makeReleaseRouteState(workspaceId, result.release.id, releaseOriginFromLocation(location))\n })\n return\n }\n const item = result.item\n navigate(item.href, {\n state: makeWorkspaceEntityRouteState(\n location.state,\n workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )\n })\n }\n\n const onInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>): void => {\n if (results.length === 0) return\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n const delta = event.key === \"ArrowDown\" ? 1 : -1\n setHighlightedIndex((current) => (current + delta + results.length) % results.length)\n return\n }\n if (event.key === \"Enter\") {\n event.preventDefault()\n const selected = results[highlightedIndex]\n if (selected !== undefined) openResult(selected)\n }\n }\n\n const content = (): ReactElement => {\n if (normalizedQuery.length < MINIMUM_QUERY_LENGTH) {\n return (\n <div className={styles.message}>\n <strong>Type two characters.</strong>\n <span>Search releases, tickets, pull requests, docs, pipelines, deployments, and time.</span>\n </div>\n )\n }\n const loading =\n deferredQuery !== normalizedQuery ||\n releaseState._tag === \"idle\" ||\n releaseState._tag === \"loading\" ||\n items.state._tag === \"idle\" ||\n items.state._tag === \"loading\"\n if (loading) return <div className={styles.loading}>Searching the current workspace…</div>\n if (!releasesReady || items.state._tag === \"failed\") {\n return (\n <div className={styles.message}>\n <strong>Search is unavailable.</strong>\n <span>The release and item indexes were not changed.</span>\n <button\n onClick={() => {\n releases.retry()\n items.retry()\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n )\n }\n if (results.length === 0) {\n return (\n <div className={styles.message}>\n <strong>No release or current item matches “{deferredQuery}”.</strong>\n <span>Try a release name, version, key, title, or current status.</span>\n </div>\n )\n }\n return (\n <div aria-label=\"Workspace search results\" className={styles.results} id=\"command-search-results\" role=\"listbox\">\n {results.map((result, index) => {\n const isRelease = result._tag === \"release\"\n const key = isRelease ? result.release.id : result.item.entityId\n return (\n <button\n aria-selected={index === highlightedIndex}\n className={styles.result}\n id={`command-search-option-${index}`}\n key={key}\n onClick={() => openResult(result)}\n onMouseEnter={() => setHighlightedIndex(index)}\n role=\"option\"\n type=\"button\"\n >\n {isRelease ? (\n <span className={styles.releaseMark}>R</span>\n ) : (\n <ServiceMark service={result.item.service} size=\"compact\" />\n )}\n <span className={styles.resultCopy}>\n <span className={styles.resultKey}>\n {isRelease ? `${result.release.version} · Release` : result.item.key}\n </span>\n <strong>{isRelease ? result.release.codename : result.item.title}</strong>\n <span>{isRelease ? result.release.serviceName : kindLabel(result.item.kind)}</span>\n </span>\n <StateLabel\n label={isRelease ? result.release.status : result.item.status}\n size=\"compact\"\n tone={isRelease ? result.release.tone : result.item.tone}\n />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <Dialog.Root onOpenChange={changeOpen} open={open}>\n <Dialog.Trigger className={styles.trigger} size=\"compact\" variant=\"quiet\">\n Search ⌘K\n </Dialog.Trigger>\n <Dialog.Content\n className={styles.dialog}\n description=\"Find releases and current work, or continue with Relay.\"\n initialFocusRef={inputRef}\n size=\"wide\"\n title=\"Go anywhere.\"\n >\n <label className={styles.searchField}>\n <span className={styles.visuallyHidden}>Search workspace</span>\n <input\n aria-activedescendant={showListbox ? `command-search-option-${highlightedIndex}` : undefined}\n aria-autocomplete=\"list\"\n aria-busy={\n deferredQuery !== normalizedQuery || releaseState._tag === \"loading\" || items.state._tag === \"loading\"\n }\n aria-controls={showListbox ? \"command-search-results\" : undefined}\n aria-expanded={showListbox}\n aria-label=\"Search workspace\"\n autoComplete=\"off\"\n maxLength={200}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n placeholder=\"Release, ticket, PR, page, pipeline…\"\n ref={inputRef}\n role=\"combobox\"\n type=\"search\"\n value={query}\n />\n </label>\n {content()}\n <footer className={styles.footer}>\n <Link onClick={() => changeOpen(false)} to={commandSearchItemsHref(workspaceId, normalizedQuery)}>\n Open item results\n </Link>\n <Link\n onClick={() => changeOpen(false)}\n to={contextualAgentPath(location.pathname, location.search, location.hash)}\n >\n Ask Relay from here\n </Link>\n <span>↑↓ choose · Enter open · Esc close</span>\n </footer>\n </Dialog.Content>\n </Dialog.Root>\n )\n}\n\n/** Suppress search when a syntactically valid route does not belong to the readable browser session. */\nexport const CommandSearch = (props: CommandSearchProps): ReactElement | null => {\n const browserSession = useBrowserSession()\n const readableSession =\n browserSession.state._tag === \"authenticated\"\n ? browserSession.state.session\n : browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const sessionKey = browserReadableSessionKey(browserSession.state)\n if (readableSession !== null && readableSession.workspaceId !== props.workspaceId) return null\n if (sessionKey === null) {\n return (\n <Link className={styles.pairTrigger} to=\"/pair\">\n Pair to search\n </Link>\n )\n }\n return <CommandSearchSurface {...props} sessionKey={sessionKey} />\n}\n"],"mappings":"6mBAIM,EAAoB,GAAmC,CAC3D,IAAM,EAAa,IAAI,gBACjB,EAAa,EAAM,KAAK,EAE9B,OADI,EAAW,OAAS,GAAG,EAAW,IAAI,IAAK,CAAU,EAClD,CACT,EAGa,GAA0B,EAA0B,IAA0B,CACzF,IAAM,EAAa,EAAiB,CAAK,EACnC,EAAS,EAAW,OAAS,EAAI,GAAK,IAAI,EAAW,SAAS,IACpE,MAAO,GAAG,EAAmB,CAAW,IAAI,EAAO,SACrD,ECoBM,EAAwB,EAAmB,sBAAsB,EAG1D,EAA4D,CACvE,KAAO,GACL,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,UAAU,SAAS,CAC1C,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ,EAEM,EAA0B,GAC9B,EAAiB,CAAQ,CAAC,CAAC,SAAS,IAAK,IAAa,CACpD,SAAU,EAAQ,MAAM,SACxB,KAAM,EAAgB,EAAS,YAAa,EAAQ,EAAE,EACtD,GAAI,EAAQ,GACZ,YAAa,EAAQ,YACrB,OAAQ,EAAQ,eAChB,KAAM,EAAQ,cACd,QAAS,EAAQ,OACnB,EAAE,EAGS,GACX,EACA,EACA,EAAsC,IACmC,CACzE,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,SAAA,CAA+B,CAAC,EAClD,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAA2C,CAAE,KAAM,MAAO,CAAC,GAEzE,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAe,KAAM,CACvB,EAAS,CAAE,KAAM,MAAO,CAAC,EACzB,MACF,CACA,IAAM,EAAQ,IAAI,gBAkBlB,OAjBA,EAAS,CAAE,KAAM,UAAW,YAAW,CAAC,EACxC,EAAU,KAAK,EAAM,MAAM,CAAC,CAAC,KAC1B,GAAa,CACR,EAAM,OAAO,SACjB,EAAS,CACP,KAAM,QACN,SAAU,EAAuB,CAAQ,EACzC,aACA,YAAa,EAAS,WACxB,CAAC,CACH,EACC,GAAY,CACP,EAAM,OAAO,UACb,EAAsB,CAAO,GAAG,EAAiB,CAAU,EAC/D,EAAS,CAAE,KAAM,SAAU,YAAW,CAAC,EACzC,CACF,MACa,EAAM,MAAM,CAC3B,EAAG,CAAC,EAAkB,EAAiB,EAAY,CAAS,CAAC,EAE7D,IAAM,EAAqC,IAAe,KACtD,CAAE,KAAM,MAAO,EACf,EAAM,OAAS,QAAU,EAAM,aAAe,EAC9C,CAAE,KAAM,UAAW,YAAW,EAC9B,EAEJ,MAAO,CACL,OAAA,EAAA,EAAA,YAAA,KAAyB,EAAoB,GAAa,EAAW,CAAC,EAAG,CAAC,CAAC,EAC3E,MAAO,CACT,CACF,oaExEM,EAAuB,EACvB,EAAe,EACf,EAA8C,IAAI,IAMlD,EAAa,GACjB,EACG,MAAM,GAAG,CAAC,CACV,IAAK,GAAS,GAAG,EAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,IAAI,EAAK,MAAM,CAAC,GAAG,CAAC,CAC7E,KAAK,GAAG,EAEP,EAAmB,GACnB,IAAW,KAAa,GACxB,sBAAuB,GAAU,EAAO,oBAAsB,GAAa,GAC3E,EAAE,aAAc,IAAW,OAAO,EAAO,UAAa,SAAiB,GACpE,EAAO,WAAa,SAAW,EAAO,WAAa,UAAY,EAAO,WAAa,WAGtF,GAAa,EAAe,IAA0C,CAC1E,IAAM,EAAmB,EAAO,IAAK,GAAU,EAAM,kBAAkB,OAAO,CAAC,EAG/E,OAFI,EAAiB,KAAM,GAAU,IAAU,CAAK,EAAU,EAC1D,EAAiB,KAAM,GAAU,EAAM,WAAW,CAAK,CAAC,EAAU,EAC/D,EAAiB,KAAM,GAAU,EAAM,SAAS,CAAK,CAAC,EAAI,EAAI,CACvE,EAGa,GACX,EACA,EACA,IACuC,CACvC,IAAM,EAAkB,EAAM,KAAK,CAAC,CAAC,kBAAkB,OAAO,EAC9D,GAAI,EAAgB,SAAW,EAAG,MAAO,CAAC,EAC1C,IAAM,EAAqD,EAAS,QAAS,GAAY,CACvF,IAAM,EAAO,EAAU,EAAiB,CAAC,EAAQ,SAAU,EAAQ,QAAS,EAAQ,YAAa,EAAQ,MAAM,CAAC,EAChH,OAAO,IAAS,EAAI,CAAC,EAAI,CAAC,CAAE,KAAM,UAAW,OAAM,SAAQ,CAAC,CAC9D,CAAC,EACK,EAAkD,EAAM,QAAS,GAAS,CAC9E,IAAM,EAAO,EAAU,EAAiB,CAAC,EAAK,IAAK,EAAK,MAAO,EAAK,MAAM,CAAC,EAC3E,OAAO,IAAS,EAAI,CAAC,EAAI,CAAC,CAAE,KAAM,OAAQ,OAAM,MAAK,CAAC,CACxD,CAAC,EACD,MAAO,CAAC,GAAG,EAAgB,GAAG,CAAW,CAAC,CACvC,MAAM,EAAM,IAAU,CACrB,GAAI,EAAK,OAAS,EAAM,KAAM,OAAO,EAAK,KAAO,EAAM,KACvD,GAAI,EAAK,OAAS,EAAM,KAAM,OAAO,EAAK,OAAS,UAAY,GAAK,EACpE,IAAM,EAAY,EAAK,OAAS,UAAY,EAAK,QAAQ,SAAW,EAAK,KAAK,IACxE,EAAa,EAAM,OAAS,UAAY,EAAM,QAAQ,SAAW,EAAM,KAAK,IAClF,OAAO,EAAU,cAAc,CAAU,CAC3C,CAAC,CAAC,CACD,MAAM,EAAG,CAAY,CAC1B,EAUM,GAAwB,CAC5B,mBAAmB,EACnB,aACA,YAAY,EACZ,iBAC6C,CAC7C,IAAM,EAAiB,EAAkB,EACnC,EAAW,EAAY,EACvB,EAAW,EAAY,EACvB,GAAA,EAAA,EAAA,OAAA,CAAoC,IAAI,EACxC,CAAC,EAAM,IAAA,EAAA,EAAA,SAAA,CAAoB,EAAK,EAChC,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAAqB,EAAE,EAC/B,CAAC,EAAkB,IAAA,EAAA,EAAA,SAAA,CAAgC,CAAC,EACpD,EAAkB,EAAM,KAAK,EAC7B,GAAA,EAAA,EAAA,iBAAA,CAAiC,CAAe,EAChD,EAAa,EAAc,QAAU,EACrC,EAAW,EAAmB,EAAO,EAAa,KAAM,EAAe,kBAAmB,CAAgB,EAC1G,EAAe,EAAS,MACxB,GAAA,EAAA,EAAA,QAAA,KAEF,EAAa,OAAS,SAAW,EAAa,cAAgB,EAC1D,IAAI,IAAI,EAAa,SAAS,KAAK,CAAE,QAAS,CAAE,CAAC,EACjD,EACN,CAAC,EAAc,CAAW,CAC5B,EACM,EAAgB,EAAa,OAAS,SAAW,EAAa,cAAgB,EAK9E,EAAQ,EACZ,EACA,GAAA,EAAA,EAAA,QAAA,MALO,CAAE,MAAO,MAAO,MAAO,EAAa,EAAgB,GAAI,QAAS,MAAO,OAAQ,MAAO,KAAM,KAAM,GAC1G,CAAC,EAAe,CAAU,CAK1B,EACA,EAAa,OAAS,QAAU,EAAa,SAAS,KAAK,CAAE,QAAS,CAAE,CAAC,CAAC,KAAK,GAAG,EAAI,iBACtF,GAAQ,GAAc,EAAgB,EAAa,KACnD,EAAe,kBACf,CACF,EACM,EAAa,EAAM,MAAM,OAAS,SAAW,CAAC,EAAM,MAAM,WAC1D,EACJ,GAAiB,EAAa,EAAqB,EAAa,SAAU,EAAM,MAAM,MAAO,CAAa,EAAI,CAAC,EAC3G,EAAc,EAAQ,OAAS,EAE/B,EAAc,GAA4B,CAC9C,EAAQ,CAAQ,EACX,IACH,EAAS,EAAE,EACX,EAAoB,CAAC,EAEzB,GAEA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAoB,GAA+B,CAErD,EAAM,kBACN,EAAgB,EAAM,MAAM,GAC5B,EAAM,IAAI,kBAAkB,OAAO,IAAM,KACxC,CAAC,EAAM,SAAW,CAAC,EAAM,UAG5B,EAAM,eAAe,EACrB,EAAQ,EAAI,EACd,EAEA,OADA,SAAS,iBAAiB,UAAW,CAAgB,MACxC,SAAS,oBAAoB,UAAW,CAAgB,CACvE,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,EAAoB,CAAC,EAAG,CAAC,CAAa,CAAC,EAEvD,IAAM,EAAc,GAAsC,CAExD,GADA,EAAW,EAAK,EACZ,EAAO,OAAS,UAAW,CAC7B,EAAS,EAAO,QAAQ,KAAM,CAC5B,MAAO,EAAsB,EAAa,EAAO,QAAQ,GAAI,EAA0B,CAAQ,CAAC,CAClG,CAAC,EACD,MACF,CACA,IAAM,EAAO,EAAO,KACpB,EAAS,EAAK,KAAM,CAClB,MAAO,EACL,EAAS,MACT,EACA,EAAK,SACL,EAAyB,CAAQ,CACnC,CACF,CAAC,CACH,EAkGA,OACE,EAAA,EAAA,KAAA,CAAC,EAAO,KAAR,CAAa,aAAc,EAAkB,gBAA7C,EACE,EAAA,EAAA,IAAA,CAAC,EAAO,QAAR,CAAgB,UAAW,EAAO,QAAS,KAAK,UAAU,QAAQ,iBAAQ,WAE1D,CAAA,GAChB,EAAA,EAAA,KAAA,CAAC,EAAO,QAAR,CACE,UAAW,EAAO,OAClB,YAAY,0DACZ,gBAAiB,EACjB,KAAK,OACL,MAAM,wBALR,EAOE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,qBAAzB,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,wBAAgB,kBAAsB,CAAA,GAC9D,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,wBAAuB,EAAc,yBAAyB,IAAqB,IAAA,GACnF,oBAAkB,OAClB,YACE,IAAkB,GAAmB,EAAa,OAAS,WAAa,EAAM,MAAM,OAAS,UAE/F,gBAAe,EAAc,yBAA2B,IAAA,GACxD,gBAAe,EACf,aAAW,mBACX,aAAa,MACb,UAAW,IACX,SAAW,GAAU,EAAS,EAAM,cAAc,KAAK,EACvD,UA1Hc,GAAsD,CACxE,KAAQ,SAAW,EACvB,IAAI,EAAM,MAAQ,aAAe,EAAM,MAAQ,UAAW,CACxD,EAAM,eAAe,EACrB,IAAM,EAAQ,EAAM,MAAQ,YAAc,EAAI,GAC9C,EAAqB,IAAa,EAAU,EAAQ,EAAQ,QAAU,EAAQ,MAAM,EACpF,MACF,CACA,GAAI,EAAM,MAAQ,QAAS,CACzB,EAAM,eAAe,EACrB,IAAM,EAAW,EAAQ,GACrB,IAAa,IAAA,IAAW,EAAW,CAAQ,CACjD,CALA,CAMF,EA8GU,YAAY,uCACZ,IAAK,EACL,KAAK,WACL,KAAK,SACL,MAAO,CACR,CAAA,CACI,IAjHP,EAAgB,OAAS,GAEzB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,sBAA4B,CAAA,GACpC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,kFAAsF,CAAA,CACzF,IAIP,IAAkB,GAClB,EAAa,OAAS,QACtB,EAAa,OAAS,WACtB,EAAM,MAAM,OAAS,QACrB,EAAM,MAAM,OAAS,WACH,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAS,kCAAqC,CAAA,EACrF,CAAC,GAAiB,EAAM,MAAM,OAAS,UAEvC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,wBAA8B,CAAA,GACtC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,gDAAoD,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,YAAe,CACb,EAAS,MAAM,EACf,EAAM,MAAM,CACd,EACA,KAAK,kBACN,WAEO,CAAA,CACL,IAGL,EAAQ,SAAW,GAEnB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAA,SAAA,CAAQ,uCAAqC,EAAc,IAAU,CAAA,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,6DAAiE,CAAA,CACpE,KAIP,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,aAAW,2BAA2B,UAAW,EAAO,QAAS,GAAG,yBAAyB,KAAK,mBACpG,EAAQ,KAAK,EAAQ,IAAU,CAC9B,IAAM,EAAY,EAAO,OAAS,UAC5B,EAAM,EAAY,EAAO,QAAQ,GAAK,EAAO,KAAK,SACxD,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,gBAAe,IAAU,EACzB,UAAW,EAAO,OAClB,GAAI,yBAAyB,IAE7B,YAAe,EAAW,CAAM,EAChC,iBAAoB,EAAoB,CAAK,EAC7C,KAAK,SACL,KAAK,kBARP,CAUG,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,qBAAa,GAAO,CAAA,GAE5C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,QAAS,EAAO,KAAK,QAAS,KAAK,SAAW,CAAA,GAE7D,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,oBAAxB,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,mBACrB,EAAY,GAAG,EAAO,QAAQ,QAAQ,YAAc,EAAO,KAAK,GAC7D,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAY,EAAO,QAAQ,SAAW,EAAO,KAAK,KAAc,CAAA,GACzE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAY,EAAO,QAAQ,YAAc,EAAU,EAAO,KAAK,IAAI,CAAQ,CAAA,CAC9E,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAY,EAAO,QAAQ,OAAS,EAAO,KAAK,OACvD,KAAK,UACL,KAAM,EAAY,EAAO,QAAQ,KAAO,EAAO,KAAK,IACrD,CAAA,CACK,GAvBD,CAuBC,CAEZ,CAAC,CACE,CAAA,GAuCH,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,gBAA1B,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,YAAe,EAAW,EAAK,EAAG,GAAI,EAAuB,EAAa,CAAe,WAAG,mBAE5F,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAe,EAAW,EAAK,EAC/B,GAAI,EAAoB,EAAS,SAAU,EAAS,OAAQ,EAAS,IAAI,WAC1E,qBAEK,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,oCAAwC,CAAA,CACxC,GACM,GACL,GAEjB,EAGa,EAAiB,GAAmD,CAC/E,IAAM,EAAiB,EAAkB,EACnC,EACJ,EAAe,MAAM,OAAS,iBAE1B,EAAe,MAAM,OAAS,sBAD9B,EAAe,MAAM,QAGnB,KACF,EAAa,EAA0B,EAAe,KAAK,EASjE,OARI,IAAoB,MAAQ,EAAgB,cAAgB,EAAM,YAAoB,KACtF,IAAe,MAEf,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,YAAa,GAAG,iBAAQ,gBAE1C,CAAA,GAGH,EAAA,EAAA,IAAA,CAAC,EAAD,CAAsB,GAAI,EAAmB,YAAa,CAAA,CACnE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{D as r,E as i,a,h as o,n as s,r as c,t as l,v as u,w as d}from"./Dialog-DwSIPb-B-DVn37afM.js";import{i as f,r as p,s as m}from"./index-DLoOV6Hp.js";import{g as h,v as g}from"./patterns-DEbg7R-A-Cw0A2uKS.js";import{Ft as _,K as v,P as y,g as b}from"./client-OmvShYdC.js";import{t as x}from"./PortfolioOverview-DSUabOmm.js";import{i as S,o as C}from"./releaseRoutes-DSWkTh-E.js";import{n as w,r as T}from"./workspaceEntityRoutes-CRcfSq7c.js";import{a as E}from"./presentWorkspaceItems-BU__8LcC.js";import{n as ee,t as te}from"./useWorkspaceItems-D0FuHGto.js";import{t as D}from"./authorizedShareTransport-Dyj53kJf.js";import{n as ne}from"./ReleaseWorkset-BhGacsgb.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=n(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let a=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,u]=(0,O.useState)(a[0]?.personId??e),[d,p]=(0,O.useState)(`day`),[m,h]=(0,O.useState)({_tag:`idle`}),g=(0,O.useRef)(null),_=(0,O.useRef)(null),y=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>_.current?.abort(),[]),(0,O.useEffect)(()=>{(m._tag===`ready`||m._tag===`revoked`)&&y.current?.focus()},[m._tag]);let x=e=>{e.preventDefault(),_.current?.abort();let n=new AbortController;_.current=n,h({_tag:`creating`});let i=g.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===d?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:d}).then(e=>(g.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=g.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){h({_tag:`failed`});return}if(e.revokedAt!==null){h({_tag:`revoked`});return}h({_tag:`ready`,shareId:e.shareId,expiresAt:v(e.expiresAt)})},()=>{n.signal.aborted||h({_tag:`failed`})})},S=(e,t)=>{_.current?.abort();let n=new AbortController;_.current=n,h({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||h({_tag:`revoked`})},()=>{n.signal.aborted||h({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{g.current=null,u(b.make(e))},w=e=>{g.current=null,p(j(e))},T=()=>{g.current=null,h({_tag:`idle`})};if(m._tag===`ready`||m._tag===`revoking`){let e=`/shares/${i}/${m.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(f,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(f,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,m.expiresAt,`.`]})]}),(0,A.jsx)(o,{to:e,children:e}),(0,A.jsx)(l,{disabled:m._tag===`revoking`,onClick:()=>S(m.shareId,m.expiresAt),children:m._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return m._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsx)(c,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(f,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(l,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(f,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(f,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:m._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:a.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:m._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:d,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(l,{disabled:m._tag===`creating`,type:`submit`,children:m._tag===`creating`?`Creating…`:`Create authorized link`}),m._tag===`failed`?(0,A.jsx)(f,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=y(b)(e);return _(t)?t.value:`all`},re=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(h,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let n=r(),h=m(),_=d(),v=i(),[y]=u(),b=n.controller.state._tag===`ready`?n.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=n.controller.state._tag===`ready`?n.controller.state.portfolio.generatedAt:`pending`,I=ne(h.state),B=re(y),V=ee(n.workspaceId,j,B,M,I,h.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=n.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:h.state._tag===`authenticated`?`checking`:h.state._tag}:null:n.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(x,{onPreviewRelease:()=>void 0,onRetry:n.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,ie=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),ae=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=h.state._tag===`authenticated`&&h.state.session.permission===`workspace-owner`&&h.state.session.actor._tag===`human`?h.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(f,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(f,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!ie?(0,A.jsx)(`option`,{value:B.owner,children:ae?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(p,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(g,{service:Z.service,size:`compact`}),(0,A.jsx)(c,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(f,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(f,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(f,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:n.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(o,{state:S(n.workspaceId,e,C(_)),to:E(n.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(l,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(f,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(c,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(p,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(g,{service:e.service,size:`compact`}),(0,A.jsxs)(o,{className:k.itemLink,state:T(_.state,n.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(c,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(o,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
|
|
2
|
-
//# sourceMappingURL=ItemsPage-
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{D as r,E as i,a,h as o,n as s,r as c,t as l,v as u,w as d}from"./Dialog-DwSIPb-B-DVn37afM.js";import{i as f,r as p,s as m}from"./index-DpW_ckau.js";import{g as h,v as g}from"./patterns-DEbg7R-A-BhsMyh9D.js";import{Ft as _,K as v,P as y,g as b}from"./client-P7FaPwzJ.js";import{t as x}from"./PortfolioOverview-DeJcfXcw.js";import{i as S,o as C}from"./releaseRoutes-CfaNElmG.js";import{n as w,r as T}from"./workspaceEntityRoutes-Biw67kRR.js";import{a as E}from"./presentWorkspaceItems-IAp5SnpB.js";import{n as ee,t as te}from"./useWorkspaceItems-DQTYaq1R.js";import{t as D}from"./authorizedShareTransport-Xg20SHJ5.js";import{n as ne}from"./ReleaseWorkset-Bs_FXlbC.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=n(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let a=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,u]=(0,O.useState)(a[0]?.personId??e),[d,p]=(0,O.useState)(`day`),[m,h]=(0,O.useState)({_tag:`idle`}),g=(0,O.useRef)(null),_=(0,O.useRef)(null),y=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>_.current?.abort(),[]),(0,O.useEffect)(()=>{(m._tag===`ready`||m._tag===`revoked`)&&y.current?.focus()},[m._tag]);let x=e=>{e.preventDefault(),_.current?.abort();let n=new AbortController;_.current=n,h({_tag:`creating`});let i=g.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===d?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:d}).then(e=>(g.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=g.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){h({_tag:`failed`});return}if(e.revokedAt!==null){h({_tag:`revoked`});return}h({_tag:`ready`,shareId:e.shareId,expiresAt:v(e.expiresAt)})},()=>{n.signal.aborted||h({_tag:`failed`})})},S=(e,t)=>{_.current?.abort();let n=new AbortController;_.current=n,h({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||h({_tag:`revoked`})},()=>{n.signal.aborted||h({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{g.current=null,u(b.make(e))},w=e=>{g.current=null,p(j(e))},T=()=>{g.current=null,h({_tag:`idle`})};if(m._tag===`ready`||m._tag===`revoking`){let e=`/shares/${i}/${m.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(f,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(f,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,m.expiresAt,`.`]})]}),(0,A.jsx)(o,{to:e,children:e}),(0,A.jsx)(l,{disabled:m._tag===`revoking`,onClick:()=>S(m.shareId,m.expiresAt),children:m._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return m._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsx)(c,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(f,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(l,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(f,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(f,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:m._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:a.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:m._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:d,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(l,{disabled:m._tag===`creating`,type:`submit`,children:m._tag===`creating`?`Creating…`:`Create authorized link`}),m._tag===`failed`?(0,A.jsx)(f,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=y(b)(e);return _(t)?t.value:`all`},re=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(h,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let n=r(),h=m(),_=d(),v=i(),[y]=u(),b=n.controller.state._tag===`ready`?n.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=n.controller.state._tag===`ready`?n.controller.state.portfolio.generatedAt:`pending`,I=ne(h.state),B=re(y),V=ee(n.workspaceId,j,B,M,I,h.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=n.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:h.state._tag===`authenticated`?`checking`:h.state._tag}:null:n.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(x,{onPreviewRelease:()=>void 0,onRetry:n.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(a,{height:`8rem`,variant:`block`}),(0,A.jsx)(a,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,ie=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),ae=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=h.state._tag===`authenticated`&&h.state.session.permission===`workspace-owner`&&h.state.session.actor._tag===`human`?h.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(f,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(f,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(f,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!ie?(0,A.jsx)(`option`,{value:B.owner,children:ae?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(p,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(g,{service:Z.service,size:`compact`}),(0,A.jsx)(c,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(f,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(f,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(f,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:n.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(o,{state:S(n.workspaceId,e,C(_)),to:E(n.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(l,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(f,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(c,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(s,{action:(0,A.jsx)(l,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(p,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(g,{service:e.service,size:`compact`}),(0,A.jsxs)(o,{className:k.itemLink,state:T(_.state,n.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(c,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(o,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
|
|
2
|
+
//# sourceMappingURL=ItemsPage-BZQiTh9b.js.map
|