@ycodium-ai/plugin-api 0.2.2100 → 0.2.2126

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.
@@ -2,19 +2,51 @@ import type { ExecutorModelDialect } from "./executor.ts";
2
2
  /** 与 `ExecutorModelConnectivity.dialects` 同一闭集。 */
3
3
  export type PluginProtocolDialect = ExecutorModelDialect;
4
4
  /**
5
- * 脑侧协议转换对。只加类型与 `ctx.protocolConversion` 声明;宿主桥归 W1。
5
+ * 翻译失败的原因。翻译函数抛出带 `reasonCode` 字段的错误时,宿主按它记账、回手:
6
+ * `unsupported-request` 回 400(手的请求翻不了);另两个回 502(上游的流不对)。
7
+ * 不带或不在这三个里的,按出错的环节归类:翻请求记前者,读流记 `invalid-upstream`。
8
+ */
9
+ export type PluginProtocolConversionFailure = "unsupported-request" | "invalid-upstream" | "truncated-stream";
10
+ /**
11
+ * 协议翻译对:手说 `from`,上游脑听 `to`(ADR-0030 §3.9)。
6
12
  *
7
13
  * 约束:纯 JSON 进、纯 JSON 出;无 I/O、无 Effect。`from` / `to` 必须是已声明方言。
14
+ * 宿主对翻译过的请求一律要上游流式(逐块读 usage),所以 `translateRequest` 产出的
15
+ * 上游请求体要自己写上流式开关;手要不要流式看手请求体里的 `stream`,由宿主判断。
8
16
  */
9
17
  export type PluginProtocolConversion = {
10
18
  readonly from: PluginProtocolDialect;
11
19
  readonly to: PluginProtocolDialect;
12
20
  readonly translateRequest: (json: unknown, model: string) => unknown;
21
+ /**
22
+ * 开流前调一次,拿手的原请求建 state,`translateStreamChunk` 第一块收到的就是它。
23
+ * 有些还原只能靠原请求:被改写过的工具名、手要没要 usage 块。缺席时第一块收到 `undefined`。
24
+ */
25
+ readonly startStream?: (json: unknown, model: string) => unknown;
13
26
  readonly translateStreamChunk: (state: unknown, chunk: unknown) => {
14
27
  readonly chunks: ReadonlyArray<unknown>;
15
28
  readonly state: unknown;
16
29
  };
17
30
  readonly translateResponse: (json: unknown) => unknown;
31
+ /**
32
+ * 这一笔手请求里没有映射到上游的字段,写 JSON 路径(`logprobs`、`messages[].name`)。
33
+ * 宿主随调用记录落下,不静默丢。静态清单写不全:手升级一版就多几个字段,今天没见过
34
+ * 的字段也要报出来。缺席 = 这对翻译不报,宿主当作不知道。
35
+ */
36
+ readonly listUnmappedFields?: (json: unknown) => ReadonlyArray<string>;
37
+ /**
38
+ * 上游流到了终点时调一次:宿主按上游方言认终点(chat 的 `[DONE]`、Responses 的
39
+ * `response.completed` / `incomplete` / `failed`、Anthropic 的 `message_stop`、两家的 `error`),
40
+ * 终点之前断流由宿主判截断,走不到这里。`chunks` 是还要发给手的收尾块;`response` 是
41
+ * 手要非流式时整体回给它的响应体。state 说明这一轮没完成时抛 `truncated-stream`,
42
+ * 不伪造完成。
43
+ *
44
+ * 缺席时宿主不发收尾块,非流式响应体取 `translateResponse(最后一块)`。
45
+ */
46
+ readonly finishStream?: (state: unknown) => {
47
+ readonly chunks: ReadonlyArray<unknown>;
48
+ readonly response: unknown;
49
+ };
18
50
  };
19
51
  /** 厂商知识是纯数据;凭据、HTTP 和缓存由宿主持有。 */
20
52
  export interface PluginMetricHeader {
@@ -40,6 +72,11 @@ export type PluginMetricUnit = {
40
72
  };
41
73
  /** path 使用 JSON Pointer;缺失或不能解码的值保持未知。金额保留原生金额单位。 */
42
74
  export interface PluginMetricMapping {
75
+ /**
76
+ * 数值指针全都落空时按 0 算,而不是把整行丢掉。用在「窗口确实存在、只是还没用掉
77
+ * 配额」的情况(厂商这时干脆不发那个百分比字段)。要与 `optional` 一起用。
78
+ */
79
+ readonly zeroWhenAbsent?: boolean;
43
80
  readonly id: string;
44
81
  readonly optional?: boolean;
45
82
  readonly rowsAt?: string;
@@ -54,28 +91,64 @@ export interface PluginMetricMapping {
54
91
  readonly labelAt?: string;
55
92
  readonly modelIdsAt?: string;
56
93
  readonly windowSecondsAt?: string;
94
+ /**
95
+ * 响应里没有、但厂商知识里有的两样:窗口的名字与长度。有 `*At` 指针时以响应为准。
96
+ * `label` 是**标识**不是文案:宿主与界面按它查 catalog,查不到才把原文当文案显示。
97
+ */
98
+ readonly label?: string;
99
+ readonly windowSeconds?: number;
57
100
  readonly resetsAt?: {
58
101
  readonly path: string;
59
102
  readonly format: "epoch-seconds" | "iso";
60
103
  };
61
104
  }
105
+ export interface PluginSourceMetricRequest {
106
+ readonly url: string;
107
+ /** 缺席 = GET;POST 带 `body`(固定 JSON 文本,宿主原样发,不插值)。 */
108
+ readonly method?: "GET" | "POST";
109
+ readonly body?: string;
110
+ readonly headers: Readonly<Record<string, string | PluginMetricHeader>>;
111
+ }
62
112
  export interface PluginSourceMetricProbe {
63
113
  readonly id: string;
64
114
  readonly match: {
65
115
  readonly kind: "api";
66
116
  readonly baseUrls: readonly string[];
117
+ /** 只对这几种凭据有效(订阅用量只认 oauth token);缺席 = 端点是什么凭据都试。 */
118
+ readonly authKinds?: readonly ("bearer" | "api-key-header" | "oauth")[];
67
119
  } | {
68
120
  readonly kind: "native-account";
69
- readonly credentialKind: "codex-chatgpt";
70
- };
71
- readonly request: {
72
- readonly url: string;
73
- readonly headers: Readonly<Record<string, string | PluginMetricHeader>>;
121
+ /** 读哪一家的原生登录凭据;宿主按它选凭据文件与投递受众。 */
122
+ readonly credentialKind: "codex-chatgpt" | "claude-oauth";
74
123
  };
124
+ readonly request: PluginSourceMetricRequest;
125
+ /**
126
+ * 额外的请求。厂商把一份额度拆在几个地址上时用(Grok 的周窗口在
127
+ * `?format=credits`、月窗口在 `/billing`),而一个来源只能匹配一个探针。
128
+ *
129
+ * 每条必须与主请求同源。取回来的内容挂在 `/@requests/<id>/body` 下,指针照常写;
130
+ * 主请求的内容仍在根上。
131
+ */
132
+ readonly extraRequests?: readonly {
133
+ readonly id: string;
134
+ readonly request: PluginSourceMetricRequest;
135
+ }[];
75
136
  readonly metrics: readonly PluginMetricMapping[];
76
137
  readonly ttlMs: number;
77
138
  readonly cooldownMs: number;
78
139
  }
140
+ /**
141
+ * 端点头引用凭据的哪一部分:只有 accountId。比 {@link PluginMetricHeader} 窄是有意的——
142
+ * 探针发往宿主钉死的那一个 origin,端点的 baseUrl 是用户能改的,放开 accessToken 等于
143
+ * 给预设开一条把订阅 token 送进任意请求头的通道。
144
+ */
145
+ export interface PluginEndpointCredentialHeader {
146
+ readonly credential: "accountId";
147
+ readonly prefix?: string;
148
+ /** 这份凭据没有 accountId 时:true = 不发这个头,缺席/false = 这笔端点不兼容。 */
149
+ readonly optional?: boolean;
150
+ }
151
+ export type PluginEndpointHeader = string | PluginEndpointCredentialHeader;
79
152
  export interface PluginModelEndpointPreset {
80
153
  readonly id: string;
81
154
  readonly label: string;
@@ -89,8 +162,15 @@ export interface PluginModelEndpointPreset {
89
162
  readonly kind: "api-key-header";
90
163
  readonly headerName: string;
91
164
  readonly environmentVariable: string;
165
+ }
166
+ /**
167
+ * 只认本预设 oauth 流拿到的订阅账户、不收 API key 的端点(ChatGPT 订阅后端)。
168
+ * 卡片不给它开填 key 的向导;登录或导入账户之后宿主按它建端点。
169
+ */
170
+ | {
171
+ readonly kind: "oauth";
92
172
  };
93
- readonly headers: Readonly<Record<string, string>>;
173
+ readonly headers: Readonly<Record<string, PluginEndpointHeader>>;
94
174
  }
95
175
  /**
96
176
  * 订阅登录(OAuth + PKCE)的**厂商知识**。纯声明:没有函数、没有 I/O。
@@ -99,7 +179,9 @@ export interface PluginModelEndpointPreset {
99
179
  * scope、请求体字段、响应里 token 在哪个 JSON Pointer;**拿到的 token 归宿主**,
100
180
  * 插件在整个流程里看不到 code、code_verifier、access token 或 refresh token。
101
181
  */
102
- export type PluginOAuthRuntimeValue = "client-id" | "client-secret" | "scope" | "redirect-uri" | "code" | "code-verifier" | "code-challenge" | "code-challenge-method" | "state" | "refresh-token";
182
+ export type PluginOAuthRuntimeValue = "client-id" | "client-secret" | "scope" | "redirect-uri" | "code" | "code-verifier" | "code-challenge" | "code-challenge-method" | "state" | "refresh-token"
183
+ /** 设备码那一路:设备授权回包里的 `device_code`,换 token 时按它取。 */
184
+ | "device-code";
103
185
  /** 字面量,或宿主在运行时填进去的那一个值。 */
104
186
  export type PluginOAuthValueSource = {
105
187
  readonly value: string;
@@ -125,12 +207,21 @@ export interface PluginOAuthExpiry {
125
207
  readonly path: string;
126
208
  readonly format: "seconds-from-now" | "epoch-seconds" | "iso";
127
209
  }
128
- /** 身份字段的 JSON Pointer。缺失或类型不符按未知处理,不猜。 */
210
+ /**
211
+ * 凭据文档里一个值在哪:JSON Pointer,或「先按 `jwt` 取出一段 JWT,再读它 payload 里
212
+ * `claim` 指向的值」。OpenAI 把账户 id 与到期时刻放在 token 的 claim 里。宿主只读
213
+ * claim、不验签,取到的只当身份标识与到期时刻用。
214
+ */
215
+ export type PluginCredentialValueRef = string | {
216
+ readonly jwt: string;
217
+ readonly claim: string;
218
+ };
219
+ /** 身份字段在哪。缺失或类型不符按未知处理,不猜。 */
129
220
  export interface PluginOAuthIdentityResponse {
130
- readonly accountIdAt?: string;
131
- readonly accountLabelAt?: string;
132
- readonly organizationIdAt?: string;
133
- readonly organizationLabelAt?: string;
221
+ readonly accountIdAt?: PluginCredentialValueRef;
222
+ readonly accountLabelAt?: PluginCredentialValueRef;
223
+ readonly organizationIdAt?: PluginCredentialValueRef;
224
+ readonly organizationLabelAt?: PluginCredentialValueRef;
134
225
  }
135
226
  /** token 响应:access token 是必需的,其余按身份字段处理。 */
136
227
  export interface PluginOAuthTokenResponse extends PluginOAuthIdentityResponse {
@@ -149,6 +240,31 @@ export interface PluginOAuthPkce {
149
240
  /** 随机字节数;base64url 后长度须落在 RFC 7636 的 43–128 之间。 */
150
241
  readonly verifierBytes: number;
151
242
  }
243
+ /**
244
+ * 设备码一路(RFC 8628)。没有浏览器回调:先 POST 一次拿到给人念的码与验证网址,
245
+ * 宿主把它们交给界面,然后按上游给的间隔轮询 `exchange`(`grant_type` 写设备码那一种,
246
+ * `device_code` 用 `{ from: "device-code" }` 引用第一次的回包)。
247
+ */
248
+ export interface PluginModelDeviceCodeFlow {
249
+ /** 拿 device_code / user_code 的那一次 POST。 */
250
+ readonly authorization: PluginOAuthRequest;
251
+ /** 回包里各字段在哪。`verificationUriComplete` 是带码的直达链接,缺席就让人手输。 */
252
+ readonly response: {
253
+ readonly deviceCode: string;
254
+ readonly userCode: string;
255
+ readonly verificationUri: string;
256
+ readonly verificationUriComplete?: string;
257
+ readonly expiresIn?: string;
258
+ readonly interval?: string;
259
+ };
260
+ /**
261
+ * 上游没给 `interval` 时用它;给了就听上游的,但**不低于**这个值——0 间隔就是拿轮询
262
+ * 打死对方,而 RFC 说的是「最小」等待,取大的那个仍然合规。
263
+ */
264
+ readonly pollIntervalMsFallback: number;
265
+ /** 等人授权的上限。到点就放弃,不无限挂着一个待授权的设备码。 */
266
+ readonly maxPollMs: number;
267
+ }
152
268
  export interface PluginModelOAuthFlow {
153
269
  readonly id: string;
154
270
  readonly label: string;
@@ -164,17 +280,25 @@ export interface PluginModelOAuthFlow {
164
280
  */
165
281
  readonly clientSecret?: string;
166
282
  readonly scope: string;
167
- /** 必须是 loopback http URL:授权码只能回到本机,宿主据此起回调服务器。 */
168
- readonly redirectUri: string;
283
+ /**
284
+ * 必须是 loopback http URL:授权码只能回到本机,宿主据此起回调服务器。
285
+ *
286
+ * 重定向一路必填;声明了 {@link PluginModelOAuthFlow.deviceCode} 的那家没有回调地址,
287
+ * 这一块与 `authorize` 都要缺席——两路同时声明宿主会当成声明错误拒掉。
288
+ */
289
+ readonly redirectUri?: string;
169
290
  /**
170
291
  * 缺席即这家不用 PKCE。不是每家都上:Google 那套走 client_secret,参考实现整份
171
292
  * antigravity 目录里 `code_challenge` / `code_verifier` 零命中。
172
293
  */
173
294
  readonly pkce?: PluginOAuthPkce;
174
- readonly authorize: {
295
+ /** 重定向一路必填:浏览器要去的那个授权地址。 */
296
+ readonly authorize?: {
175
297
  readonly url: string;
176
298
  readonly query: readonly PluginOAuthField[];
177
299
  };
300
+ /** 声明了它就是设备码一路(RFC 8628);与 `redirectUri` / `authorize` 互斥。 */
301
+ readonly deviceCode?: PluginModelDeviceCodeFlow;
178
302
  readonly exchange: PluginOAuthRequest;
179
303
  readonly refresh: PluginOAuthRequest;
180
304
  readonly response: PluginOAuthTokenResponse;
@@ -182,6 +306,50 @@ export interface PluginModelOAuthFlow {
182
306
  /** 过期前多久预刷。宿主的后台循环读它,不等 401。 */
183
307
  readonly refreshLeadMs: number;
184
308
  }
309
+ /**
310
+ * 哪些模型有这一档。按 models.dev 报的**事实**判,不按型号写表:`reasoning` 对上「支不支持
311
+ * 推理」,`minContextWindow` 对上窗口大小;`models` 是正则源,只给少数某一族独有的档位用
312
+ * (Anthropic 的快速模式只在 Opus 上)。缺席 = 这家所有模型都有。
313
+ */
314
+ export interface PluginModelOptionGate {
315
+ readonly reasoning?: boolean;
316
+ readonly minContextWindow?: number;
317
+ readonly models?: readonly string[];
318
+ }
319
+ /**
320
+ * 这家 API 的一档参数。跟手快照里的选项描述同形,多 `defaultValue`(不选时是哪一档,
321
+ * 宿主填到 composer 的当前值上)和 `when`(哪些模型有)。按**协议**声明一套,不是按型号一张表。
322
+ */
323
+ export type PluginModelOption = {
324
+ readonly id: string;
325
+ readonly type: "boolean";
326
+ readonly label: string;
327
+ readonly defaultValue?: boolean;
328
+ readonly when?: PluginModelOptionGate;
329
+ } | {
330
+ readonly id: string;
331
+ readonly type: "select";
332
+ readonly label: string;
333
+ readonly options: readonly {
334
+ readonly id: string;
335
+ readonly label: string;
336
+ }[];
337
+ readonly defaultValue?: string;
338
+ readonly when?: PluginModelOptionGate;
339
+ };
340
+ /**
341
+ * 这家有哪些模型、各有什么档位。
342
+ *
343
+ * 模型名不写在插件里:`modelsDev` 说「我在 models.dev 里叫什么」(一家有几份互不相交的
344
+ * 目录就列几个,如 z.ai 的普通与 Coding Plan),宿主拿本机留存的目录同步成来源的模型,
345
+ * 用户随时手填补充。`exclude` 是正则源,把目录里混着的实时语音、转写这类不能当脑用的
346
+ * 型号筛掉。
347
+ */
348
+ export interface PluginModelCatalog {
349
+ readonly modelsDev: readonly string[];
350
+ readonly exclude?: readonly string[];
351
+ readonly options?: readonly PluginModelOption[];
352
+ }
185
353
  export interface PluginModelPreset {
186
354
  readonly id: string;
187
355
  readonly label: string;
@@ -190,5 +358,7 @@ export interface PluginModelPreset {
190
358
  readonly probes: readonly PluginSourceMetricProbe[];
191
359
  /** 订阅登录流程;没有就不填,宿主按空处理。 */
192
360
  readonly oauth?: readonly PluginModelOAuthFlow[];
361
+ /** 模型来源与档位;没有就不填,模型全靠手填、档位退回手的兜底。 */
362
+ readonly models?: PluginModelCatalog;
193
363
  }
194
364
  //# sourceMappingURL=model-catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 子进程 stdin 的失败口径:写不进去算什么,谁来兜那条流上的 `'error'`。
3
+ *
4
+ * 「对端已经没了」是常态——子进程刚退出、刚被杀、或自己关掉了 stdin。Node 把这**一次**
5
+ * 失败发两份:一份交给 `write` 回调,一份以 `'error'` 事件发在流上。流上没人监听时,
6
+ * 第二份就是未捕获异常,会把整个进程带走(宿主是服务器时带走的是服务器)。
7
+ *
8
+ * 所以**拥有裸 stdin 的那个人必须 `adoptChildStdin`**:它是这条判定的唯一出口,
9
+ * 既挂上那条监听,也把「对端没了」和真异常分开。要加第二处判定前先改这里。
10
+ *
11
+ * 权限、磁盘、编码这些真异常不在此列,原样抛给调用方。
12
+ *
13
+ * 同一个模块还放着 `nodeStreamsFromHandle`——把 `host.process.spawn` 的句柄折成 Node 流。
14
+ * 它归这里而不是各手一份:折法与「写不进去算什么」是同一件事,三双 ACP 手分三份写过。
15
+ */
16
+ import * as NodeStream from "node:stream";
17
+ /** 判「这次失败是不是因为对端没了」。真异常返回 false,交给调用方照旧处理。 */
18
+ export declare function isPeerClosedStdinError(error: unknown): boolean;
19
+ /** 对端没了导致这次写没送到。`code` 保留原始那一个,诊断不丢。 */
20
+ export declare class PeerClosedStdinError extends Error {
21
+ readonly name = "PeerClosedStdinError";
22
+ readonly code: string;
23
+ constructor(operation: "write" | "close", cause?: unknown);
24
+ }
25
+ /** 裸子进程 stdin 的最小形状。`node:stream` 的 `Writable` 与子进程 stdin 都满足它。 */
26
+ export type ChildStdinStream = {
27
+ write(chunk: Uint8Array | string, callback: (error?: Error | null) => void): boolean;
28
+ end(callback: () => void): unknown;
29
+ on(event: "error", listener: (error: Error) => void): unknown;
30
+ readonly destroyed?: boolean | undefined;
31
+ readonly writableEnded?: boolean | undefined;
32
+ };
33
+ export type AdoptedChildStdin = {
34
+ /** 对端没了 → `PeerClosedStdinError`;真异常 → 原错误。两种都是这次调用的普通失败。 */
35
+ readonly write: (chunk: Uint8Array | string) => Promise<void>;
36
+ /** 关一条已经关掉(或对端已经没了)的流不是失败,直接完成。真异常照旧抛。 */
37
+ readonly close: () => Promise<void>;
38
+ };
39
+ /**
40
+ * 接管一条裸子进程 stdin。
41
+ *
42
+ * `onError` 只收真异常——对端没了不走它,那是常态。没给 `onError` 时真异常仍会让
43
+ * 下一次 `write` / `close` 失败,不会静悄悄消失。
44
+ */
45
+ export declare function adoptChildStdin(stdin: ChildStdinStream, options?: {
46
+ readonly onError?: (error: Error) => void;
47
+ }): AdoptedChildStdin;
48
+ /** 宿主 `process.spawn` 句柄里与流有关的那几位;`kill` / `exited` 由调用方自己拿。 */
49
+ export type SpawnHandle = {
50
+ readonly stdout: AsyncIterable<Uint8Array>;
51
+ readonly stderr: AsyncIterable<Uint8Array>;
52
+ readonly writeStdin: (chunk: Uint8Array | string) => Promise<void>;
53
+ readonly closeStdin: () => Promise<void>;
54
+ };
55
+ /**
56
+ * 把 `host.process.spawn` 的句柄折成协议库要的 Node 流。
57
+ *
58
+ * 协议库 / 状态机都不 spawn、也不认宿主句柄——这是插件侧补上的适配。
59
+ * stderr 必须抽干:宿主那条队列有界,只读 stdout 会把子进程写堵死。
60
+ *
61
+ * 写这条 writable 的人要自己接 `'error'`(真实链路上是 `Writable.toWeb`):Node 把
62
+ * 写失败同时投给回调与流,这里不替它兜,兜了就等于把真异常也吞掉。
63
+ */
64
+ export declare function nodeStreamsFromHandle(handle: SpawnHandle): {
65
+ readonly readable: NodeStream.Readable;
66
+ readonly writable: NodeStream.Writable;
67
+ };
68
+ //# sourceMappingURL=process-stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-stdin.d.ts","sourceRoot":"","sources":["../src/process-stdin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAkB1C,8CAA8C;AAC9C,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG9D;AAED,wCAAwC;AACxC,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,SAAS,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO;CAO1D;AAED,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;IACrF,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;IACnC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAMF;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO,GAC1D,iBAAiB,CAwEnB;AAED,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C,CAAC;AAQF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG;IAC1D,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;CACxC,CAkDA"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * 子进程 stdin 的失败口径:写不进去算什么,谁来兜那条流上的 `'error'`。
3
+ *
4
+ * 「对端已经没了」是常态——子进程刚退出、刚被杀、或自己关掉了 stdin。Node 把这**一次**
5
+ * 失败发两份:一份交给 `write` 回调,一份以 `'error'` 事件发在流上。流上没人监听时,
6
+ * 第二份就是未捕获异常,会把整个进程带走(宿主是服务器时带走的是服务器)。
7
+ *
8
+ * 所以**拥有裸 stdin 的那个人必须 `adoptChildStdin`**:它是这条判定的唯一出口,
9
+ * 既挂上那条监听,也把「对端没了」和真异常分开。要加第二处判定前先改这里。
10
+ *
11
+ * 权限、磁盘、编码这些真异常不在此列,原样抛给调用方。
12
+ *
13
+ * 同一个模块还放着 `nodeStreamsFromHandle`——把 `host.process.spawn` 的句柄折成 Node 流。
14
+ * 它归这里而不是各手一份:折法与「写不进去算什么」是同一件事,三双 ACP 手分三份写过。
15
+ */
16
+ import * as NodeStream from "node:stream";
17
+ /** 对端已关:Node 与 libuv 在这几个 code 上说的是同一件事。 */
18
+ const PEER_CLOSED_STDIN_CODES = new Set([
19
+ "EPIPE",
20
+ "ECONNRESET",
21
+ "EOF",
22
+ "ERR_STREAM_DESTROYED",
23
+ "ERR_STREAM_WRITE_AFTER_END",
24
+ "ERR_STREAM_ALREADY_FINISHED",
25
+ ]);
26
+ function errorCode(value) {
27
+ if (typeof value !== "object" || value === null)
28
+ return undefined;
29
+ const code = value.code;
30
+ return typeof code === "string" ? code : undefined;
31
+ }
32
+ /** 判「这次失败是不是因为对端没了」。真异常返回 false,交给调用方照旧处理。 */
33
+ export function isPeerClosedStdinError(error) {
34
+ const code = errorCode(error);
35
+ return code !== undefined && PEER_CLOSED_STDIN_CODES.has(code);
36
+ }
37
+ /** 对端没了导致这次写没送到。`code` 保留原始那一个,诊断不丢。 */
38
+ export class PeerClosedStdinError extends Error {
39
+ name = "PeerClosedStdinError";
40
+ code;
41
+ constructor(operation, cause) {
42
+ super(`Child process stdin is closed; the ${operation} did not reach the peer.`, cause === undefined ? undefined : { cause });
43
+ this.code = errorCode(cause) ?? "ERR_STREAM_DESTROYED";
44
+ }
45
+ }
46
+ function asError(value) {
47
+ return value instanceof Error ? value : new Error(String(value));
48
+ }
49
+ /**
50
+ * 接管一条裸子进程 stdin。
51
+ *
52
+ * `onError` 只收真异常——对端没了不走它,那是常态。没给 `onError` 时真异常仍会让
53
+ * 下一次 `write` / `close` 失败,不会静悄悄消失。
54
+ */
55
+ export function adoptChildStdin(stdin, options = {}) {
56
+ let peerClosed = false;
57
+ let realError;
58
+ const waiters = new Set();
59
+ stdin.on("error", (raw) => {
60
+ const error = asError(raw);
61
+ if (isPeerClosedStdinError(error))
62
+ peerClosed = true;
63
+ else {
64
+ realError ??= error;
65
+ options.onError?.(error);
66
+ }
67
+ // 迭代中 waiter 会把自己摘掉;Set 的删除对正在进行的迭代是安全的。
68
+ for (const waiter of waiters)
69
+ waiter(error);
70
+ });
71
+ const gone = () => peerClosed || stdin.destroyed === true || stdin.writableEnded === true;
72
+ const write = (chunk) => new Promise((resolve, reject) => {
73
+ if (realError !== undefined) {
74
+ reject(realError);
75
+ return;
76
+ }
77
+ if (gone()) {
78
+ reject(new PeerClosedStdinError("write"));
79
+ return;
80
+ }
81
+ const settle = (error) => {
82
+ if (isPeerClosedStdinError(error)) {
83
+ peerClosed = true;
84
+ reject(new PeerClosedStdinError("write", error));
85
+ return;
86
+ }
87
+ reject(asError(error));
88
+ };
89
+ try {
90
+ stdin.write(chunk, (error) => {
91
+ if (error === undefined || error === null)
92
+ resolve();
93
+ else
94
+ settle(error);
95
+ });
96
+ }
97
+ catch (error) {
98
+ // 编码、参数类型这类是同步抛的,不走回调。
99
+ settle(error);
100
+ }
101
+ });
102
+ const close = () => new Promise((resolve, reject) => {
103
+ if (gone()) {
104
+ resolve();
105
+ return;
106
+ }
107
+ const onError = (error) => {
108
+ waiters.delete(onError);
109
+ if (isPeerClosedStdinError(error))
110
+ resolve();
111
+ else
112
+ reject(error);
113
+ };
114
+ waiters.add(onError);
115
+ try {
116
+ stdin.end(() => {
117
+ waiters.delete(onError);
118
+ resolve();
119
+ });
120
+ }
121
+ catch (error) {
122
+ waiters.delete(onError);
123
+ if (isPeerClosedStdinError(error))
124
+ resolve();
125
+ else
126
+ reject(asError(error));
127
+ }
128
+ });
129
+ return { write, close };
130
+ }
131
+ /** 对端没了要看得出来是哪一种;真异常原样往上走。 */
132
+ function toStreamError(operation, error) {
133
+ if (isPeerClosedStdinError(error))
134
+ return new PeerClosedStdinError(operation, error);
135
+ return asError(error);
136
+ }
137
+ /**
138
+ * 把 `host.process.spawn` 的句柄折成协议库要的 Node 流。
139
+ *
140
+ * 协议库 / 状态机都不 spawn、也不认宿主句柄——这是插件侧补上的适配。
141
+ * stderr 必须抽干:宿主那条队列有界,只读 stdout 会把子进程写堵死。
142
+ *
143
+ * 写这条 writable 的人要自己接 `'error'`(真实链路上是 `Writable.toWeb`):Node 把
144
+ * 写失败同时投给回调与流,这里不替它兜,兜了就等于把真异常也吞掉。
145
+ */
146
+ export function nodeStreamsFromHandle(handle) {
147
+ const readable = new NodeStream.PassThrough();
148
+ void (async () => {
149
+ try {
150
+ for await (const chunk of handle.stdout) {
151
+ if (!readable.writable)
152
+ return;
153
+ if (!readable.write(chunk)) {
154
+ await new Promise((resolve) => {
155
+ const onDone = () => {
156
+ readable.off("drain", onDone);
157
+ readable.off("close", onDone);
158
+ resolve();
159
+ };
160
+ readable.once("drain", onDone);
161
+ readable.once("close", onDone);
162
+ });
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ readable.destroy(asError(error));
168
+ return;
169
+ }
170
+ if (readable.writable)
171
+ readable.end();
172
+ })();
173
+ void (async () => {
174
+ for await (const _chunk of handle.stderr) {
175
+ // drain
176
+ }
177
+ })().catch(() => undefined);
178
+ const writable = new NodeStream.Writable({
179
+ write(chunk, _encoding, callback) {
180
+ const bytes = typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk;
181
+ handle.writeStdin(bytes).then(() => callback(), (error) => callback(toStreamError("write", error)));
182
+ },
183
+ final(callback) {
184
+ handle.closeStdin().then(() => callback(),
185
+ // 关一条对端已经没了的流是正常收尾,不是失败;真异常照旧交出去。
186
+ (error) => callback(isPeerClosedStdinError(error) ? undefined : toStreamError("close", error)));
187
+ },
188
+ });
189
+ return { readable, writable };
190
+ }
191
+ //# sourceMappingURL=process-stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-stdin.js","sourceRoot":"","sources":["../src/process-stdin.ts"],"names":[],"mappings":"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"}