opencode-copilot-account-switcher 0.14.20 → 0.14.21

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.
@@ -7,18 +7,25 @@ type SessionMessages = Array<{
7
7
  parts: Part[];
8
8
  }>;
9
9
  type SessionLite = Pick<Session, "id" | "title" | "directory" | "time">;
10
+ type SdkFieldsResult<T> = {
11
+ data: T | undefined;
12
+ error?: unknown;
13
+ request?: unknown;
14
+ response?: unknown;
15
+ };
16
+ type SdkReadResult<T> = T | SdkFieldsResult<T>;
10
17
  type WechatBridgeClient = {
11
18
  session: {
12
- list: () => Promise<SessionLite[]>;
13
- status: () => Promise<Record<string, SessionStatus | undefined>>;
14
- todo: (sessionID: string) => Promise<Todo[]>;
15
- messages: (sessionID: string) => Promise<SessionMessages>;
19
+ list: () => Promise<SdkReadResult<SessionLite[]>>;
20
+ status: () => Promise<SdkReadResult<Record<string, SessionStatus | undefined>>>;
21
+ todo: (sessionID: string) => Promise<SdkReadResult<Todo[]>>;
22
+ messages: (sessionID: string) => Promise<SdkReadResult<SessionMessages>>;
16
23
  };
17
24
  question: {
18
- list: () => Promise<QuestionRequest[]>;
25
+ list: () => Promise<SdkReadResult<QuestionRequest[]>>;
19
26
  };
20
27
  permission: {
21
- list: () => Promise<PermissionRequest[]>;
28
+ list: () => Promise<SdkReadResult<PermissionRequest[]>>;
22
29
  };
23
30
  };
24
31
  export type InstanceUnavailableKind = "sessionStatus" | "questionList" | "permissionList";
@@ -66,6 +66,23 @@ function withTimeout(task, timeoutMs, name) {
66
66
  });
67
67
  });
68
68
  }
69
+ function isSdkFieldsResult(value) {
70
+ return typeof value === "object"
71
+ && value !== null
72
+ && ("data" in value || "error" in value);
73
+ }
74
+ function unwrapSdkReadResult(value, name) {
75
+ if (!isSdkFieldsResult(value)) {
76
+ return value;
77
+ }
78
+ if (value.error != null) {
79
+ throw value.error instanceof Error ? value.error : new Error(`${name} failed`);
80
+ }
81
+ if (value.data === undefined) {
82
+ throw new Error(`${name} returned no data`);
83
+ }
84
+ return value.data;
85
+ }
69
86
  export function createWechatBridge(input) {
70
87
  const collectStatusSnapshot = async () => {
71
88
  const liveReadTimeoutMs = typeof input.liveReadTimeoutMs === "number" && Number.isFinite(input.liveReadTimeoutMs)
@@ -73,10 +90,10 @@ export function createWechatBridge(input) {
73
90
  : DEFAULT_LIVE_READ_TIMEOUT_MS;
74
91
  const unavailable = new Set();
75
92
  const [sessionListResult, statusResult, questionResult, permissionResult] = await Promise.allSettled([
76
- withTimeout(() => input.client.session.list(), liveReadTimeoutMs, "session.list"),
77
- withTimeout(() => input.client.session.status(), liveReadTimeoutMs, "session.status"),
78
- withTimeout(() => input.client.question.list(), liveReadTimeoutMs, "question.list"),
79
- withTimeout(() => input.client.permission.list(), liveReadTimeoutMs, "permission.list"),
93
+ withTimeout(async () => unwrapSdkReadResult(await input.client.session.list(), "session.list"), liveReadTimeoutMs, "session.list"),
94
+ withTimeout(async () => unwrapSdkReadResult(await input.client.session.status(), "session.status"), liveReadTimeoutMs, "session.status"),
95
+ withTimeout(async () => unwrapSdkReadResult(await input.client.question.list(), "question.list"), liveReadTimeoutMs, "question.list"),
96
+ withTimeout(async () => unwrapSdkReadResult(await input.client.permission.list(), "permission.list"), liveReadTimeoutMs, "permission.list"),
80
97
  ]);
81
98
  const sessions = sessionListResult.status === "fulfilled" ? sessionListResult.value : [];
82
99
  const recentSessions = pickRecentSessions(sessions, 3);
@@ -94,8 +111,8 @@ export function createWechatBridge(input) {
94
111
  : (unavailable.add("permissionList"), groupPermissionsBySession([]));
95
112
  const sessionDigests = await Promise.all(recentSessions.map(async (session) => {
96
113
  const [todoResult, messagesResult] = await Promise.allSettled([
97
- withTimeout(() => input.client.session.todo(session.id), liveReadTimeoutMs, `session.todo:${session.id}`),
98
- withTimeout(() => input.client.session.messages(session.id), liveReadTimeoutMs, `session.messages:${session.id}`),
114
+ withTimeout(async () => unwrapSdkReadResult(await input.client.session.todo(session.id), `session.todo:${session.id}`), liveReadTimeoutMs, `session.todo:${session.id}`),
115
+ withTimeout(async () => unwrapSdkReadResult(await input.client.session.messages(session.id), `session.messages:${session.id}`), liveReadTimeoutMs, `session.messages:${session.id}`),
99
116
  ]);
100
117
  const sessionUnavailable = [];
101
118
  const todos = todoResult.status === "fulfilled" ? todoResult.value : (sessionUnavailable.push("todo"), []);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-copilot-account-switcher",
3
- "version": "0.14.20",
3
+ "version": "0.14.21",
4
4
  "description": "GitHub Copilot account switcher plugin for OpenCode",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",