paseo-plugin-zcode-provider 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +29 -0
  3. package/README.md +98 -2
  4. package/client/diagnostics.tsx +397 -0
  5. package/client/setup.tsx +347 -0
  6. package/icon.svg +1 -0
  7. package/index.client.tsx +22 -0
  8. package/index.server.ts +21 -0
  9. package/package.json +75 -4
  10. package/paseo-plugin.json +6 -0
  11. package/server/attachments.ts +150 -0
  12. package/server/build-info.ts +2 -0
  13. package/server/conversation.ts +319 -0
  14. package/server/diagnostics.ts +235 -0
  15. package/server/discovery/discover.ts +225 -0
  16. package/server/discovery/manifest.ts +36 -0
  17. package/server/discovery/types.ts +30 -0
  18. package/server/errors.ts +36 -0
  19. package/server/host/bridge.ts +463 -0
  20. package/server/host/schemas.ts +119 -0
  21. package/server/logger.ts +19 -0
  22. package/server/mapping.ts +270 -0
  23. package/server/models.ts +68 -0
  24. package/server/persistence.ts +146 -0
  25. package/server/presentation.ts +428 -0
  26. package/server/provider.ts +831 -0
  27. package/server/runtime/managed.ts +501 -0
  28. package/server/runtime/pins.ts +72 -0
  29. package/server/runtime-setup.ts +102 -0
  30. package/server/session-types.ts +49 -0
  31. package/server/session.ts +866 -0
  32. package/server/status.ts +89 -0
  33. package/server/timeline.ts +18 -0
  34. package/server/vendor/zcode/LICENSE +202 -0
  35. package/server/vendor/zcode/NOTICE.md +70 -0
  36. package/server/vendor/zcode/THIRD-PARTY-NOTICES.md +37 -0
  37. package/server/vendor/zcode/packages/model-option-map/src/compiler.ts +92 -0
  38. package/server/vendor/zcode/packages/model-option-map/src/evaluator.ts +214 -0
  39. package/server/vendor/zcode/packages/model-option-map/src/index.ts +5 -0
  40. package/server/vendor/zcode/packages/model-option-map/src/merge-patch.ts +97 -0
  41. package/server/vendor/zcode/packages/model-option-map/src/option-maps.ts +42 -0
  42. package/server/vendor/zcode/packages/model-option-map/src/parser.ts +240 -0
  43. package/server/vendor/zcode/packages/model-option-map/src/tokenizer.ts +141 -0
  44. package/server/vendor/zcode/packages/model-option-map/src/types.ts +36 -0
  45. package/server/vendor/zcode/packages/rpc/src/buffer.ts +88 -0
  46. package/server/vendor/zcode/packages/rpc/src/channelClient.ts +275 -0
  47. package/server/vendor/zcode/packages/rpc/src/channelServer.ts +283 -0
  48. package/server/vendor/zcode/packages/rpc/src/channels.shared.ts +66 -0
  49. package/server/vendor/zcode/packages/rpc/src/channels.ts +4 -0
  50. package/server/vendor/zcode/packages/rpc/src/delayedChannel.ts +17 -0
  51. package/server/vendor/zcode/packages/rpc/src/foundation.ts +260 -0
  52. package/server/vendor/zcode/packages/rpc/src/protocol.ts +397 -0
  53. package/server/vendor/zcode/packages/rpc/src/proxy-channel.ts +213 -0
  54. package/server/vendor/zcode/packages/rpc/src/serialization.ts +291 -0
  55. package/server/vendor/zcode/packages/shared/src/account-provider-state.ts +13 -0
  56. package/server/vendor/zcode/packages/shared/src/background-bash-output.ts +24 -0
  57. package/server/vendor/zcode/packages/shared/src/background-task-controls.ts +404 -0
  58. package/server/vendor/zcode/packages/shared/src/bash-output-display.ts +11 -0
  59. package/server/vendor/zcode/packages/shared/src/bots.ts +558 -0
  60. package/server/vendor/zcode/packages/shared/src/browser-use/backend.ts +80 -0
  61. package/server/vendor/zcode/packages/shared/src/browser-use/command-metadata.ts +170 -0
  62. package/server/vendor/zcode/packages/shared/src/browser-use/commands.ts +588 -0
  63. package/server/vendor/zcode/packages/shared/src/browser-use/result.ts +130 -0
  64. package/server/vendor/zcode/packages/shared/src/browser-use/snapshot.ts +77 -0
  65. package/server/vendor/zcode/packages/shared/src/command-types.ts +96 -0
  66. package/server/vendor/zcode/packages/shared/src/config-schema.ts +8 -0
  67. package/server/vendor/zcode/packages/shared/src/cuaAccessibilitySettings.ts +41 -0
  68. package/server/vendor/zcode/packages/shared/src/database-startup.ts +178 -0
  69. package/server/vendor/zcode/packages/shared/src/env.ts +63 -0
  70. package/server/vendor/zcode/packages/shared/src/execution-output-preview.ts +14 -0
  71. package/server/vendor/zcode/packages/shared/src/localTtft.ts +192 -0
  72. package/server/vendor/zcode/packages/shared/src/model-config.ts +123 -0
  73. package/server/vendor/zcode/packages/shared/src/model-execution.ts +23 -0
  74. package/server/vendor/zcode/packages/shared/src/model-provider-family.ts +171 -0
  75. package/server/vendor/zcode/packages/shared/src/model-provider-types.ts +81 -0
  76. package/server/vendor/zcode/packages/shared/src/model-selection.ts +60 -0
  77. package/server/vendor/zcode/packages/shared/src/oauth.ts +203 -0
  78. package/server/vendor/zcode/packages/shared/src/official-mcp-auth.ts +272 -0
  79. package/server/vendor/zcode/packages/shared/src/official-mcp-tool-error.ts +68 -0
  80. package/server/vendor/zcode/packages/shared/src/process-diagnostic.ts +42 -0
  81. package/server/vendor/zcode/packages/shared/src/protocol.ts +369 -0
  82. package/server/vendor/zcode/packages/shared/src/provider-family-connection-selection.ts +32 -0
  83. package/server/vendor/zcode/packages/shared/src/remoteAssetInstallMode.ts +11 -0
  84. package/server/vendor/zcode/packages/shared/src/remoteResourcePackages.ts +91 -0
  85. package/server/vendor/zcode/packages/shared/src/runtimeEnv.ts +315 -0
  86. package/server/vendor/zcode/packages/shared/src/settings-source.ts +10 -0
  87. package/server/vendor/zcode/packages/shared/src/usage-quota.ts +74 -0
  88. package/server/vendor/zcode/packages/shared/src/usage-stats.ts +462 -0
  89. package/server/vendor/zcode/packages/shared/src/validationAppSettings.ts +562 -0
  90. package/server/vendor/zcode/packages/shared/src/workspacePurpose.ts +2 -0
  91. package/server/vendor/zcode/packages/shared/src/wslUserValidation.ts +33 -0
  92. package/server/vendor/zcode/packages/shared/src/zcode-agent-policy.ts +25 -0
  93. package/server/vendor/zcode/packages/shared/src/zcode-media-policy.ts +10 -0
  94. package/server/vendor/zcode/packages/shared/src/zcode-protocol/index.ts +3720 -0
  95. package/server/vendor/zcode/packages/shared/src/zcode-protocol-legacy-types.ts +529 -0
  96. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/apply.ts +218 -0
  97. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/attachment-ref.ts +14 -0
  98. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/command.ts +482 -0
  99. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/core.ts +100 -0
  100. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/create-workflow-display.ts +156 -0
  101. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/cuaPermission.ts +41 -0
  102. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/delta.ts +147 -0
  103. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/input-intent.ts +69 -0
  104. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/rows.ts +432 -0
  105. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/session-config.ts +43 -0
  106. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index-workflow-activity.ts +195 -0
  107. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index.ts +85 -0
  108. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-import.ts +38 -0
  109. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-ref.ts +10 -0
  110. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/snapshot.ts +509 -0
  111. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/submission.ts +5 -0
  112. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/toolDisplay.ts +264 -0
  113. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/transport.ts +1152 -0
  114. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-assembler.ts +574 -0
  115. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-binary.ts +65 -0
  116. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-codec.ts +240 -0
  117. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-fault.ts +39 -0
  118. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire.ts +159 -0
  119. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-artifacts.ts +291 -0
  120. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-observation-display.ts +281 -0
  121. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-row-meta.ts +163 -0
  122. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-run-settings-command.ts +62 -0
  123. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs-delta.ts +517 -0
  124. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs.ts +512 -0
  125. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-config.ts +81 -0
  126. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-hook-review.ts +210 -0
  127. package/server/vendor/zcode/packages/shared/src/zcode-task-mode-schema.ts +6 -0
  128. package/server/vendor/zcode/packages/shared/src/zcode-task-types-core.ts +1187 -0
  129. package/server/vendor/zcode/packages/shared/src/zcodeEndpoint.ts +296 -0
  130. package/server/vendor/zcode/provenance.json +405 -0
  131. package/shared/diagnostics.ts +52 -0
  132. package/shared/runtime-setup.ts +75 -0
  133. package/vendor/acp-registry/LICENSE +176 -0
  134. package/vendor/paseo/LICENSE +211 -0
@@ -0,0 +1,558 @@
1
+ /* oxlint-disable eslint(max-lines) -- Bot 共享合约集中维护 provider、状态和 schema,保持类型与校验就近。 */
2
+ import { z } from "zod";
3
+ import { modelSelectionSchema, type ModelSelection } from "./model-selection.js";
4
+ import { ZCODE_AGENT_PROVIDER, ZCODE_AGENT_PROVIDER_LABEL } from "./zcode-agent-policy.js";
5
+ import type {
6
+ ZCodeConfigOption,
7
+ ZCodeElicitationRequest,
8
+ ZCodeElicitationQuestion,
9
+ ZCodePermissionRequest,
10
+ ZCodePromptAttachment,
11
+ ZCodeProvider,
12
+ ZCodeStreamEvent,
13
+ ZCodeTaskMeta,
14
+ ZCodeTaskRuntimeStatus,
15
+ } from "./zcode-task-types-core.js";
16
+ import {
17
+ zcodeInteractionRequestOriginSchema,
18
+ zcodePermissionResponseSchema,
19
+ type ZCodeInteractionRequestOrigin,
20
+ type ZCodePermissionResponse,
21
+ } from "./zcode-protocol-legacy-types.js";
22
+ import type { Locale } from "./protocol.js";
23
+
24
+ export const botProviders = [
25
+ "telegram",
26
+ "webhook",
27
+ "feishu",
28
+ "lark",
29
+ "weixin",
30
+ "discord",
31
+ "wecom",
32
+ ] as const;
33
+
34
+ export type BotProvider = (typeof botProviders)[number];
35
+ export type FeishuBotProvider = Extract<BotProvider, "feishu" | "lark">;
36
+
37
+ /**
38
+ * 定时任务完成后的 Bot 回推目标。只保留未来仍稳定的会话地址;当前消息 id/context token
39
+ * 属于一次入站交互,不能持久化后复用。该字段由 Host 注入,模型工具参数不直接暴露。
40
+ */
41
+ export const zcodeAutomationBotDeliveryTargetSchema = z
42
+ .object({
43
+ provider: z.enum(["feishu", "lark", "weixin"]),
44
+ botId: z.string().trim().min(1),
45
+ providerUserId: z.string().trim().min(1),
46
+ chatType: z.enum(["private", "group"]),
47
+ })
48
+ .strict();
49
+
50
+ export type ZCodeAutomationBotDeliveryTarget = z.infer<
51
+ typeof zcodeAutomationBotDeliveryTargetSchema
52
+ >;
53
+
54
+ export function isFeishuBotProvider(provider: BotProvider): provider is FeishuBotProvider {
55
+ return provider === "feishu" || provider === "lark";
56
+ }
57
+ export type BotContextMode = "draft" | "task";
58
+ export type BotReplyGranularity =
59
+ | "assistant_changes"
60
+ | "assistant_toolcalls_changes"
61
+ | "summary_changes"
62
+ | "streaming_card";
63
+
64
+ export const BOT_REPLY_GRANULARITIES = [
65
+ "assistant_changes",
66
+ "assistant_toolcalls_changes",
67
+ "summary_changes",
68
+ "streaming_card",
69
+ ] as const satisfies readonly BotReplyGranularity[];
70
+
71
+ export const ALL_BOT_WORKSPACES = "*";
72
+ export const BOT_BIND_CODE_TTL_MS = 30_000;
73
+
74
+ export interface BotWorkspaceRef {
75
+ id: string;
76
+ label: string;
77
+ workspacePath: string;
78
+ workspaceIdentity?: string;
79
+ }
80
+
81
+ export interface BotAllowedCommands {
82
+ status: boolean;
83
+ new: boolean;
84
+ workspace: boolean;
85
+ model: boolean;
86
+ mode?: boolean;
87
+ thoughtLevel: boolean;
88
+ sandboxMode?: boolean;
89
+ approvalPolicy?: boolean;
90
+ reply: boolean;
91
+ }
92
+
93
+ export type BotCommandPolicy = BotAllowedCommands;
94
+
95
+ export interface BotCurrentOptions {
96
+ modelSelection?: ModelSelection;
97
+ mode?: string;
98
+ sandboxMode?: string;
99
+ approvalPolicy?: string;
100
+ }
101
+
102
+ export type BotReplyMode = BotReplyGranularity;
103
+
104
+ export interface BotConfig {
105
+ id: string;
106
+ name: string;
107
+ provider: BotProvider;
108
+ enabled: boolean;
109
+ credentialRef?: string;
110
+ webhookSecretRef?: string;
111
+ webhookUrl?: string;
112
+ webhookAuthHeaderName?: string;
113
+ feishuAppId?: string;
114
+ providerUserId?: string;
115
+ displayName?: string;
116
+ allowedWorkspaces: string[];
117
+ allowedCommands: BotAllowedCommands;
118
+ currentOptions: BotCurrentOptions;
119
+ replyMode: BotReplyMode;
120
+ }
121
+
122
+ export interface BotPendingPermissionOption {
123
+ requestId: string;
124
+ optionId: string;
125
+ command: "approve" | "deny";
126
+ label: string;
127
+ response: ZCodePermissionResponse;
128
+ handledAt?: number;
129
+ }
130
+
131
+ export interface BotPendingElicitation {
132
+ taskId: string;
133
+ requestId: string;
134
+ runId: string;
135
+ origin?: ZCodeInteractionRequestOrigin;
136
+ actorKey?: string;
137
+ currentQuestionIndex: number;
138
+ questions: ZCodeElicitationQuestion[];
139
+ answers: Record<string, string[]>;
140
+ renderContext?: {
141
+ kind: "plan_approval";
142
+ plan: string;
143
+ };
144
+ expandedCustomAnswerQuestionIndexes?: number[];
145
+ handledAt?: number;
146
+ }
147
+
148
+ export interface BotStructuredElicitationResponse {
149
+ requestId: string;
150
+ action: "accept" | "decline" | "cancel";
151
+ content?: Record<string, unknown>;
152
+ }
153
+
154
+ export interface BotOutboundElicitationRequest {
155
+ requestId: string;
156
+ taskId: string;
157
+ runId: string;
158
+ currentQuestionIndex: number;
159
+ questions: ZCodeElicitationQuestion[];
160
+ answers?: Record<string, string[]>;
161
+ status?: "pending" | "completed" | "cancelled";
162
+ expandedCustomAnswerQuestionIndexes?: number[];
163
+ schema?: unknown;
164
+ }
165
+
166
+ export interface BotDraftOptions {
167
+ provider: ZCodeProvider;
168
+ modelSelection?: ModelSelection;
169
+ mode?: string;
170
+ }
171
+
172
+ export interface BotsConfigFile {
173
+ version: 3;
174
+ bots: BotConfig[];
175
+ }
176
+
177
+ export interface BotState {
178
+ botId: string;
179
+ workspacePath: string;
180
+ workspaceIdentity?: string;
181
+ workspaceId?: string;
182
+ mode: BotContextMode;
183
+ activeTaskId: string | null;
184
+ draftOptions?: BotDraftOptions;
185
+ pendingPermissionOptions?: BotPendingPermissionOption[];
186
+ pendingElicitation?: BotPendingElicitation;
187
+ telegramOffset?: number;
188
+ weixinGetUpdatesBuf?: string;
189
+ weixinActivatedAt?: number;
190
+ updatedAt: number;
191
+ }
192
+
193
+ export type BotContextState = BotState;
194
+
195
+ export interface BotsStateFile {
196
+ version: 3;
197
+ bots: Record<string, BotState>;
198
+ }
199
+
200
+ export interface BotRuntimeInfo {
201
+ /** 最近一次消息投递错误;独立于长连接状态,成功投递后清除。 */
202
+ deliveryError?: string;
203
+ botId: string;
204
+ provider: BotProvider;
205
+ status: "disabled" | "idle" | "polling" | "connected" | "error";
206
+ messageId?: string;
207
+ message?: string;
208
+ lastUpdateAt?: number;
209
+ offset?: number;
210
+ }
211
+
212
+ export interface BotActor {
213
+ provider: BotProvider;
214
+ botId: string;
215
+ providerUserId: string;
216
+ displayName?: string;
217
+ chatType: "private" | "group";
218
+ chatId?: string;
219
+ providerMessageId?: string;
220
+ providerContextToken?: string;
221
+ }
222
+
223
+ export type BotInboundAttachmentKind = "image" | "audio" | "video" | "file";
224
+
225
+ export interface BotInboundAttachment {
226
+ id: string;
227
+ kind: BotInboundAttachmentKind;
228
+ filename: string;
229
+ mimeType: string;
230
+ sizeBytes?: number;
231
+ providerFileId?: string;
232
+ downloadUrl?: string;
233
+ dataBase64?: string;
234
+ localPath?: string;
235
+ providerMetadata?: Record<string, string>;
236
+ }
237
+
238
+ export type BotCommand =
239
+ | { type: "bind"; code: string }
240
+ | { type: "help" }
241
+ | { type: "status" }
242
+ | { type: "new" }
243
+ | { type: "reconnect" }
244
+ | { type: "workspace.list" }
245
+ | { type: "workspace.set"; value: string }
246
+ | { type: "model.list" }
247
+ | { type: "model.provider.set"; value: string }
248
+ | { type: "model.set"; value: string }
249
+ | { type: "mode.list" }
250
+ | { type: "mode.set"; value: string }
251
+ | { type: "thoughtLevel.list" }
252
+ | { type: "thoughtLevel.set"; value: string }
253
+ | { type: "task.list" }
254
+ | { type: "task.set"; value: string }
255
+ | { type: "reply.list" }
256
+ | { type: "reply.set"; value: string }
257
+ | { type: "stop" }
258
+ | { type: "permission.respond"; value: string }
259
+ | { type: "elicitation.respond"; value: string }
260
+ | { type: "elicitation.submit" }
261
+ | { type: "approve"; requestId: string; optionId: string }
262
+ | { type: "deny"; requestId: string }
263
+ | { type: "unknown"; name: string; raw: string }
264
+ | { type: "selection.cancel" }
265
+ | { type: "message"; text: string };
266
+
267
+ export interface SelectionPrompt {
268
+ id: string;
269
+ token?: string;
270
+ title: string;
271
+ currentId?: string;
272
+ cancelLabel?: string;
273
+ showCancel?: boolean;
274
+ action:
275
+ | "workspace.set"
276
+ | "model.provider.set"
277
+ | "model.set"
278
+ | "mode.set"
279
+ | "thoughtLevel.set"
280
+ | "task.set"
281
+ | "reply.set"
282
+ | "permission.respond"
283
+ | "elicitation.respond";
284
+ options: Array<{
285
+ id: string;
286
+ label: string;
287
+ description?: string;
288
+ }>;
289
+ }
290
+
291
+ export interface BotInboundMessage {
292
+ botId: string;
293
+ actor: BotActor;
294
+ text: string;
295
+ attachments?: BotInboundAttachment[];
296
+ elicitationResponse?: BotStructuredElicitationResponse;
297
+ receivedAt?: number;
298
+ }
299
+
300
+ export interface BotOutboundMessage {
301
+ botId: string;
302
+ provider: BotProvider;
303
+ providerUserId: string;
304
+ text: string;
305
+ locale?: Locale;
306
+ selection?: SelectionPrompt;
307
+ elicitation?: BotOutboundElicitationRequest;
308
+ providerContextToken?: string;
309
+ }
310
+
311
+ export interface BotTaskSummary {
312
+ taskId: string;
313
+ title: string;
314
+ status: ZCodeTaskRuntimeStatus | "persisted-completed" | "persisted-error" | "unknown";
315
+ workspacePath: string;
316
+ workspaceIdentity?: string;
317
+ provider?: ZCodeProvider;
318
+ model?: string;
319
+ }
320
+
321
+ export const BOT_TASK_BROADCAST_CHANNEL = "bots:task";
322
+ export const BOT_TASK_STREAM_BROADCAST_CHANNEL = "bots:task-stream";
323
+
324
+ export type BotTaskBroadcastEvent =
325
+ | "created"
326
+ | "prompt_sent"
327
+ | "resumed"
328
+ | "streaming"
329
+ | "permission_request"
330
+ | "permission_resolved"
331
+ | "elicitation_request"
332
+ | "elicitation_resolved"
333
+ | "updated"
334
+ | "completed"
335
+ | "error";
336
+
337
+ export interface BotTaskBroadcastPayload {
338
+ workspacePath: string;
339
+ workspaceIdentity?: string;
340
+ taskId: string;
341
+ event: BotTaskBroadcastEvent;
342
+ updatedAt: number;
343
+ task?: ZCodeTaskMeta;
344
+ provider?: ZCodeProvider;
345
+ configOptions?: ZCodeConfigOption[];
346
+ prompt?: {
347
+ content: string;
348
+ attachments?: ZCodePromptAttachment[];
349
+ messageId: string;
350
+ sentAt: number;
351
+ };
352
+ permissionRequest?: ZCodePermissionRequest;
353
+ elicitationRequest?: ZCodeElicitationRequest;
354
+ requestId?: string;
355
+ error?: string;
356
+ }
357
+
358
+ export interface BotTaskStreamBroadcastPayload {
359
+ workspacePath: string;
360
+ workspaceIdentity?: string;
361
+ taskId: string;
362
+ event: ZCodeStreamEvent;
363
+ updatedAt: number;
364
+ }
365
+
366
+ export interface BotServiceStatus {
367
+ botsCount: number;
368
+ enabledBotsCount: number;
369
+ contextsCount: number;
370
+ botRuntime: BotRuntimeInfo[];
371
+ }
372
+
373
+ export interface BotProviderCallbackResult {
374
+ ok: boolean;
375
+ replies: BotOutboundMessage[];
376
+ responseBody?: unknown;
377
+ status?: number;
378
+ }
379
+
380
+ export const botAllowedCommandsSchema = z
381
+ .object({
382
+ status: z.boolean(),
383
+ new: z.boolean(),
384
+ workspace: z.boolean(),
385
+ model: z.boolean(),
386
+ mode: z.boolean().optional(),
387
+ thoughtLevel: z.boolean(),
388
+ sandboxMode: z.boolean().optional(),
389
+ approvalPolicy: z.boolean().optional(),
390
+ // 兼容旧 bot-config.json;/cli 命令已移除,新配置不会再写入这个字段。
391
+ cli: z.boolean().optional(),
392
+ reply: z.boolean(),
393
+ })
394
+ .strict();
395
+
396
+ export const botCommandPolicySchema = botAllowedCommandsSchema;
397
+
398
+ export const botCurrentOptionsSchema = z
399
+ .object({
400
+ modelSelection: modelSelectionSchema.optional(),
401
+ mode: z.string().min(1).optional(),
402
+ sandboxMode: z.string().min(1).optional(),
403
+ approvalPolicy: z.string().min(1).optional(),
404
+ // 兼容旧 bot-config.json;CLI provider 现在统一由 ZCode Protocol 侧配置决定。
405
+ cli: z.literal(ZCODE_AGENT_PROVIDER).optional(),
406
+ })
407
+ .strict();
408
+
409
+ export const botDraftOptionsSchema = z
410
+ .object({
411
+ provider: z.literal(ZCODE_AGENT_PROVIDER),
412
+ modelSelection: modelSelectionSchema.optional(),
413
+ mode: z.string().min(1).optional(),
414
+ })
415
+ .strict();
416
+
417
+ const botElicitationOptionSchema = z
418
+ .object({
419
+ value: z.string(),
420
+ label: z.string(),
421
+ description: z.string().optional(),
422
+ })
423
+ .strict();
424
+
425
+ const botElicitationQuestionSchema = z
426
+ .object({
427
+ question: z.string(),
428
+ header: z.string(),
429
+ options: z.array(botElicitationOptionSchema),
430
+ multiSelect: z.boolean().optional(),
431
+ })
432
+ .strict();
433
+
434
+ const botPendingElicitationSchema = z
435
+ .object({
436
+ taskId: z.string().min(1),
437
+ requestId: z.string().min(1),
438
+ runId: z.string().min(1),
439
+ origin: zcodeInteractionRequestOriginSchema.optional(),
440
+ actorKey: z.string().min(1).optional(),
441
+ currentQuestionIndex: z.number().int().min(0),
442
+ questions: z.array(botElicitationQuestionSchema),
443
+ answers: z.record(z.string(), z.array(z.string())),
444
+ renderContext: z
445
+ .object({
446
+ kind: z.literal("plan_approval"),
447
+ plan: z.string().min(1),
448
+ })
449
+ .strict()
450
+ .optional(),
451
+ expandedCustomAnswerQuestionIndexes: z.array(z.number().int().min(0)).optional(),
452
+ handledAt: z.number().optional(),
453
+ })
454
+ .strict();
455
+
456
+ export const botConfigSchema = z
457
+ .object({
458
+ id: z.string().min(1),
459
+ name: z.string(),
460
+ provider: z.enum(botProviders),
461
+ enabled: z.boolean(),
462
+ credentialRef: z.string().min(1).optional(),
463
+ webhookSecretRef: z.string().min(1).optional(),
464
+ webhookUrl: z.string().url().optional(),
465
+ webhookAuthHeaderName: z.string().min(1).optional(),
466
+ feishuAppId: z.string().min(1).optional(),
467
+ providerUserId: z.string().min(1).optional(),
468
+ displayName: z.string().optional(),
469
+ allowedWorkspaces: z.array(z.string().min(1)),
470
+ allowedCommands: botAllowedCommandsSchema,
471
+ currentOptions: botCurrentOptionsSchema,
472
+ replyMode: z.enum([
473
+ "assistant_changes",
474
+ "assistant_toolcalls_changes",
475
+ "summary_changes",
476
+ "streaming_card",
477
+ ]),
478
+ })
479
+ .strict();
480
+
481
+ export const botsConfigFileSchema = z
482
+ .object({
483
+ version: z.literal(3),
484
+ bots: z.array(botConfigSchema),
485
+ })
486
+ .strict();
487
+
488
+ export const botsStateFileSchema = z
489
+ .object({
490
+ version: z.literal(3),
491
+ bots: z.record(
492
+ z.string(),
493
+ z.object({
494
+ botId: z.string().min(1),
495
+ workspacePath: z.string().min(1),
496
+ workspaceIdentity: z.string().min(1).optional(),
497
+ workspaceId: z.string().min(1).optional(),
498
+ mode: z.enum(["draft", "task"]),
499
+ activeTaskId: z.string().min(1).nullable(),
500
+ draftOptions: botDraftOptionsSchema.optional(),
501
+ pendingPermissionOptions: z
502
+ .array(
503
+ z.object({
504
+ requestId: z.string().min(1),
505
+ optionId: z.string().min(1),
506
+ command: z.enum(["approve", "deny"]),
507
+ label: z.string().min(1),
508
+ response: zcodePermissionResponseSchema,
509
+ handledAt: z.number().optional(),
510
+ }),
511
+ )
512
+ .optional(),
513
+ pendingElicitation: botPendingElicitationSchema.optional(),
514
+ telegramOffset: z.number().optional(),
515
+ weixinGetUpdatesBuf: z.string().optional(),
516
+ weixinActivatedAt: z.number().optional(),
517
+ updatedAt: z.number(),
518
+ }),
519
+ ),
520
+ })
521
+ .strict();
522
+
523
+ export const DEFAULT_BOT_COMMANDS: BotAllowedCommands = {
524
+ status: true,
525
+ new: true,
526
+ workspace: true,
527
+ model: true,
528
+ mode: true,
529
+ thoughtLevel: true,
530
+ reply: true,
531
+ };
532
+
533
+ export const DEFAULT_BOT_REPLY_GRANULARITY: BotReplyGranularity = "assistant_changes";
534
+
535
+ export function getSupportedBotReplyGranularities(
536
+ provider: BotProvider,
537
+ ): readonly BotReplyGranularity[] {
538
+ return isFeishuBotProvider(provider)
539
+ ? (["streaming_card"] as const)
540
+ : BOT_REPLY_GRANULARITIES.filter(
541
+ // Bugfix: streaming card 依赖 Feishu/Lark Card JSON 2.0,其他 channel 无法渲染或更新该消息形态。
542
+ (granularity) => granularity !== "streaming_card",
543
+ );
544
+ }
545
+
546
+ export function normalizeBotReplyGranularity(
547
+ provider: BotProvider,
548
+ replyMode: BotReplyGranularity | undefined,
549
+ ): BotReplyGranularity {
550
+ const supported = getSupportedBotReplyGranularities(provider);
551
+ const candidate = replyMode ?? DEFAULT_BOT_REPLY_GRANULARITY;
552
+ return supported.includes(candidate) ? candidate : supported[0]!;
553
+ }
554
+
555
+ export const BOT_ZCODE_PROVIDER_OPTIONS: Array<{
556
+ id: ZCodeProvider;
557
+ label: string;
558
+ }> = [{ id: ZCODE_AGENT_PROVIDER, label: ZCODE_AGENT_PROVIDER_LABEL }];
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import { browserClientModeSchema } from "./commands.js";
3
+
4
+ /**
5
+ * Browser backend family。Playwright 是 Tab 上的能力层,不是 backend。
6
+ */
7
+ export const browserBackendTypeSchema = z.enum(["iab", "extension", "cdp"]);
8
+ export type BrowserBackendType = z.infer<typeof browserBackendTypeSchema>;
9
+
10
+ /** 单项 browser/tab capability 的稳定描述。 */
11
+ export const browserCapabilityDescriptorSchema = z
12
+ .object({
13
+ id: z.string().trim().min(1),
14
+ description: z.string().trim().min(1),
15
+ })
16
+ .strict();
17
+ export type BrowserCapabilityDescriptor = z.infer<typeof browserCapabilityDescriptorSchema>;
18
+
19
+ /**
20
+ * 可达 browser backend 的运行时描述。
21
+ *
22
+ * id 是 connection identity,同一 type 可以同时存在多个实例;只有完成握手并真实可用的
23
+ * backend 才能出现在 discovery 结果中。
24
+ */
25
+ export const browserBackendDescriptorSchema = z
26
+ .object({
27
+ id: z.string().trim().min(1),
28
+ /** 同一 runtime id 的连接代次;旧代次对象不得自动漂移到新连接。 */
29
+ generation: z.number().int().nonnegative().default(0),
30
+ type: browserBackendTypeSchema,
31
+ name: z.string().trim().min(1),
32
+ capabilities: z
33
+ .object({
34
+ browser: z.array(browserCapabilityDescriptorSchema).optional(),
35
+ tab: z.array(browserCapabilityDescriptorSchema).optional(),
36
+ })
37
+ .strict(),
38
+ apiSupportOverrides: z.record(z.string(), z.boolean()).optional(),
39
+ /** metadata 只允许非敏感字符串,禁止把 credential 混入 discovery。 */
40
+ metadata: z.record(z.string(), z.string()).optional(),
41
+ })
42
+ .strict();
43
+ export type BrowserBackendDescriptor = z.infer<typeof browserBackendDescriptorSchema>;
44
+
45
+ /** backend request 使用实时 session,或使用已缓存的 session context。 */
46
+ export const browserSessionContextKindSchema = z.enum(["live", "cached"]);
47
+ export type BrowserSessionContextKind = z.infer<typeof browserSessionContextKindSchema>;
48
+
49
+ /**
50
+ * Discovery 的完整隔离上下文。workspaceKey 用于身份隔离,workspacePath 仅用于路径语义。
51
+ */
52
+ export const browserDiscoveryContextSchema = z
53
+ .object({
54
+ requestId: z.string().trim().min(1),
55
+ workspaceKey: z.string().trim().min(1),
56
+ workspacePath: z.string().trim().min(1),
57
+ workspaceIdentity: z.string().trim().min(1).optional(),
58
+ remoteSessionId: z.string().trim().min(1).optional(),
59
+ sessionId: z.string().trim().min(1),
60
+ turnId: z.string().trim().min(1).optional(),
61
+ clientMode: browserClientModeSchema,
62
+ sessionContext: browserSessionContextKindSchema,
63
+ })
64
+ .strict();
65
+ export type BrowserDiscoveryContext = z.infer<typeof browserDiscoveryContextSchema>;
66
+
67
+ /** 执行命令时在 discovery context 上增加精确 runtime browser identity。 */
68
+ export const browserSessionContextSchema = browserDiscoveryContextSchema
69
+ .extend({
70
+ browserId: z.string().trim().min(1),
71
+ browserGeneration: z.number().int().nonnegative(),
72
+ })
73
+ .strict();
74
+ export type BrowserSessionContext = z.infer<typeof browserSessionContextSchema>;
75
+
76
+ /** ZCode Protocol 的 discovery result 包装;port 层会解包并直接返回 browsers。 */
77
+ export const browserBackendListResultSchema = z
78
+ .object({ browsers: z.array(browserBackendDescriptorSchema) })
79
+ .strict();
80
+ export type BrowserBackendListResult = z.infer<typeof browserBackendListResultSchema>;