diff --git a/apps/server/package.json b/apps/server/package.json
index 74512c4996cb..ef6fcc8f8221 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -38,6 +38,7 @@
"@napi-rs/keyring": "^1.3.0",
"@opencode-ai/sdk": "^1.3.15",
"@t3tools/issue-tracker-core": "workspace:*",
+ "@t3tools/issue-tracker-jira": "workspace:*",
"@t3tools/issue-tracker-linear": "workspace:*",
"@t3tools/provider-acp": "workspace:*",
"@t3tools/provider-acp-registry": "workspace:*",
diff --git a/apps/server/src/auth/RpcAuthorization.test.ts b/apps/server/src/auth/RpcAuthorization.test.ts
index dc3645dc4551..aa85e4bcf2d4 100644
--- a/apps/server/src/auth/RpcAuthorization.test.ts
+++ b/apps/server/src/auth/RpcAuthorization.test.ts
@@ -131,6 +131,7 @@ describe("RPC authorization scopes", () => {
for (const method of [
WS_METHODS.issuesList,
WS_METHODS.issuesDetail,
+ WS_METHODS.issuesResolveUrl,
WS_METHODS.issuesComments,
WS_METHODS.issuesTemplates,
WS_METHODS.issuesCandidates,
diff --git a/apps/server/src/auth/RpcAuthorization.ts b/apps/server/src/auth/RpcAuthorization.ts
index 6a584e128eae..2b5fdbcbfacd 100644
--- a/apps/server/src/auth/RpcAuthorization.ts
+++ b/apps/server/src/auth/RpcAuthorization.ts
@@ -131,6 +131,7 @@ export const RPC_REQUIRED_SCOPES = {
[WS_METHODS.pullRequestsDetail]: AuthOrchestrationReadScope,
[WS_METHODS.issuesList]: AuthOrchestrationReadScope,
[WS_METHODS.issuesDetail]: AuthOrchestrationReadScope,
+ [WS_METHODS.issuesResolveUrl]: AuthOrchestrationReadScope,
[WS_METHODS.issuesComments]: AuthOrchestrationReadScope,
[WS_METHODS.issuesTemplates]: AuthOrchestrationReadScope,
[WS_METHODS.issuesCandidates]: AuthOrchestrationReadScope,
diff --git a/apps/server/src/auth/ServerSecretStore.test.ts b/apps/server/src/auth/ServerSecretStore.test.ts
index 539b35dc8fec..56d840fd3b32 100644
--- a/apps/server/src/auth/ServerSecretStore.test.ts
+++ b/apps/server/src/auth/ServerSecretStore.test.ts
@@ -1,12 +1,12 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { assert, it } from "@effect/vitest";
-import * as Cause from "effect/Cause";
import * as Deferred from "effect/Deferred";
import * as Effect from "effect/Effect";
+import * as Fiber from "effect/Fiber";
import * as FileSystem from "effect/FileSystem";
import * as Layer from "effect/Layer";
import * as Option from "effect/Option";
-import * as Ref from "effect/Ref";
+import * as Path from "effect/Path";
import * as PlatformError from "effect/PlatformError";
import * as ServerConfig from "../config.ts";
@@ -98,52 +98,6 @@ const layerRemoveFailureSecretStore = () =>
Layer.provideMerge(layerRemoveFailureFileSystem),
);
-const layerConcurrentReadMissFileSystem = Layer.effect(
- FileSystem.FileSystem,
- Effect.gen(function* () {
- const fileSystem = yield* FileSystem.FileSystem;
- const readCountRef = yield* Ref.make(0);
- const readBarrier = yield* Deferred.makeIssue on {environmentId}
+ ),
+}));
+vi.mock("./pullRequest/PullRequestsUnavailableState", () => ({
+ PullRequestsUnavailableState: ({ title }: { title: string }) => {title}
,
+}));
+vi.mock("./pullRequest/PullRequestGhosts", () => ({
+ PullRequestDetailGhost: () => Loading issue
,
+}));
+
+const issueLinks = vi.hoisted(() => ({
+ resolve: vi.fn(),
+ enabled: false,
+}));
+
+vi.mock("../connection/runtime", async () => {
+ const { Atom } = await import("effect/reactivity");
+ const Layer = await import("effect/Layer");
+ const Option = await import("effect/Option");
+ const SubscriptionRef = await import("effect/SubscriptionRef");
+ const services = await import("@t3tools/client-runtime/connection");
+ const decodeResolved = Schema.decodeUnknownEffect(IssueResolvedUrl);
+ return {
+ connectionAtomRuntime: Atom.runtime(
+ Layer.succeed(
+ services.EnvironmentRegistry.EnvironmentRegistry,
+ services.EnvironmentRegistry.EnvironmentRegistry.of({
+ run: (environmentId: EnvironmentId, effect: Effect.Effect) =>
+ Effect.gen(function* () {
+ const client = {
+ "issues.resolveUrl": (input: Record
+ PR on {environmentId}: {reference.repository}#{reference.number}
+
+ ),
+}));
+vi.mock("./pullRequest/PullRequestGhosts", () => ({
+ PullRequestDetailGhost: () => Loading PR
,
+}));
+vi.mock("./issue/IssueDetailPanel", () => ({
+ IssueDetailPanel: ({
+ onSelectPullRequest,
+ }: ComponentProps
{blocked}
: null} + {templateError !== null ? ( + + ) : null}