paseo-plugin-zcode-provider 0.0.0-stage → 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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +29 -0
  3. package/README.md +112 -2
  4. package/client/account.tsx +827 -0
  5. package/client/diagnostics.tsx +379 -0
  6. package/client/runtime.tsx +296 -0
  7. package/client/settings.tsx +84 -0
  8. package/client/value.tsx +20 -0
  9. package/icon.svg +1 -0
  10. package/index.client.tsx +22 -0
  11. package/index.server.ts +39 -0
  12. package/package.json +77 -4
  13. package/paseo-plugin.json +6 -0
  14. package/server/account.ts +781 -0
  15. package/server/attachments.ts +150 -0
  16. package/server/build-info.ts +2 -0
  17. package/server/conversation.ts +319 -0
  18. package/server/diagnostics.ts +252 -0
  19. package/server/discovery/discover.ts +225 -0
  20. package/server/discovery/manifest.ts +36 -0
  21. package/server/discovery/types.ts +30 -0
  22. package/server/errors.ts +36 -0
  23. package/server/host/bridge.ts +490 -0
  24. package/server/host/schemas.ts +119 -0
  25. package/server/logger.ts +19 -0
  26. package/server/mapping.ts +270 -0
  27. package/server/models.ts +68 -0
  28. package/server/persistence.ts +146 -0
  29. package/server/presentation.ts +470 -0
  30. package/server/provider-status.ts +81 -0
  31. package/server/provider.ts +838 -0
  32. package/server/runtime/managed.ts +501 -0
  33. package/server/runtime/pins.ts +72 -0
  34. package/server/runtime-setup.ts +77 -0
  35. package/server/session-types.ts +49 -0
  36. package/server/session.ts +866 -0
  37. package/server/status.ts +89 -0
  38. package/server/timeline.ts +18 -0
  39. package/server/usage.ts +362 -0
  40. package/server/vendor/zcode/LICENSE +202 -0
  41. package/server/vendor/zcode/NOTICE.md +70 -0
  42. package/server/vendor/zcode/THIRD-PARTY-NOTICES.md +37 -0
  43. package/server/vendor/zcode/packages/model-option-map/src/compiler.ts +92 -0
  44. package/server/vendor/zcode/packages/model-option-map/src/evaluator.ts +214 -0
  45. package/server/vendor/zcode/packages/model-option-map/src/index.ts +5 -0
  46. package/server/vendor/zcode/packages/model-option-map/src/merge-patch.ts +97 -0
  47. package/server/vendor/zcode/packages/model-option-map/src/option-maps.ts +42 -0
  48. package/server/vendor/zcode/packages/model-option-map/src/parser.ts +240 -0
  49. package/server/vendor/zcode/packages/model-option-map/src/tokenizer.ts +141 -0
  50. package/server/vendor/zcode/packages/model-option-map/src/types.ts +36 -0
  51. package/server/vendor/zcode/packages/rpc/src/buffer.ts +88 -0
  52. package/server/vendor/zcode/packages/rpc/src/channelClient.ts +275 -0
  53. package/server/vendor/zcode/packages/rpc/src/channelServer.ts +283 -0
  54. package/server/vendor/zcode/packages/rpc/src/channels.shared.ts +66 -0
  55. package/server/vendor/zcode/packages/rpc/src/channels.ts +4 -0
  56. package/server/vendor/zcode/packages/rpc/src/delayedChannel.ts +17 -0
  57. package/server/vendor/zcode/packages/rpc/src/foundation.ts +260 -0
  58. package/server/vendor/zcode/packages/rpc/src/protocol.ts +397 -0
  59. package/server/vendor/zcode/packages/rpc/src/proxy-channel.ts +213 -0
  60. package/server/vendor/zcode/packages/rpc/src/serialization.ts +291 -0
  61. package/server/vendor/zcode/packages/shared/src/account-provider-state.ts +13 -0
  62. package/server/vendor/zcode/packages/shared/src/background-bash-output.ts +24 -0
  63. package/server/vendor/zcode/packages/shared/src/background-task-controls.ts +404 -0
  64. package/server/vendor/zcode/packages/shared/src/bash-output-display.ts +11 -0
  65. package/server/vendor/zcode/packages/shared/src/bots.ts +558 -0
  66. package/server/vendor/zcode/packages/shared/src/browser-use/backend.ts +80 -0
  67. package/server/vendor/zcode/packages/shared/src/browser-use/command-metadata.ts +170 -0
  68. package/server/vendor/zcode/packages/shared/src/browser-use/commands.ts +588 -0
  69. package/server/vendor/zcode/packages/shared/src/browser-use/result.ts +130 -0
  70. package/server/vendor/zcode/packages/shared/src/browser-use/snapshot.ts +77 -0
  71. package/server/vendor/zcode/packages/shared/src/command-types.ts +96 -0
  72. package/server/vendor/zcode/packages/shared/src/config-schema.ts +8 -0
  73. package/server/vendor/zcode/packages/shared/src/cuaAccessibilitySettings.ts +41 -0
  74. package/server/vendor/zcode/packages/shared/src/database-startup.ts +178 -0
  75. package/server/vendor/zcode/packages/shared/src/env.ts +63 -0
  76. package/server/vendor/zcode/packages/shared/src/execution-output-preview.ts +14 -0
  77. package/server/vendor/zcode/packages/shared/src/localTtft.ts +192 -0
  78. package/server/vendor/zcode/packages/shared/src/model-config.ts +123 -0
  79. package/server/vendor/zcode/packages/shared/src/model-execution.ts +23 -0
  80. package/server/vendor/zcode/packages/shared/src/model-provider-family.ts +171 -0
  81. package/server/vendor/zcode/packages/shared/src/model-provider-types.ts +81 -0
  82. package/server/vendor/zcode/packages/shared/src/model-selection.ts +60 -0
  83. package/server/vendor/zcode/packages/shared/src/oauth.ts +203 -0
  84. package/server/vendor/zcode/packages/shared/src/official-mcp-auth.ts +272 -0
  85. package/server/vendor/zcode/packages/shared/src/official-mcp-tool-error.ts +68 -0
  86. package/server/vendor/zcode/packages/shared/src/process-diagnostic.ts +42 -0
  87. package/server/vendor/zcode/packages/shared/src/protocol.ts +369 -0
  88. package/server/vendor/zcode/packages/shared/src/provider-family-connection-selection.ts +32 -0
  89. package/server/vendor/zcode/packages/shared/src/remoteAssetInstallMode.ts +11 -0
  90. package/server/vendor/zcode/packages/shared/src/remoteResourcePackages.ts +91 -0
  91. package/server/vendor/zcode/packages/shared/src/runtimeEnv.ts +315 -0
  92. package/server/vendor/zcode/packages/shared/src/settings-source.ts +10 -0
  93. package/server/vendor/zcode/packages/shared/src/usage-quota.ts +74 -0
  94. package/server/vendor/zcode/packages/shared/src/usage-stats.ts +462 -0
  95. package/server/vendor/zcode/packages/shared/src/validationAppSettings.ts +562 -0
  96. package/server/vendor/zcode/packages/shared/src/workspacePurpose.ts +2 -0
  97. package/server/vendor/zcode/packages/shared/src/wslUserValidation.ts +33 -0
  98. package/server/vendor/zcode/packages/shared/src/zcode-agent-policy.ts +25 -0
  99. package/server/vendor/zcode/packages/shared/src/zcode-media-policy.ts +10 -0
  100. package/server/vendor/zcode/packages/shared/src/zcode-protocol/index.ts +3720 -0
  101. package/server/vendor/zcode/packages/shared/src/zcode-protocol-legacy-types.ts +529 -0
  102. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/apply.ts +218 -0
  103. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/attachment-ref.ts +14 -0
  104. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/command.ts +482 -0
  105. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/core.ts +100 -0
  106. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/create-workflow-display.ts +156 -0
  107. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/cuaPermission.ts +41 -0
  108. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/delta.ts +147 -0
  109. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/input-intent.ts +69 -0
  110. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/rows.ts +432 -0
  111. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/session-config.ts +43 -0
  112. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index-workflow-activity.ts +195 -0
  113. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index.ts +85 -0
  114. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-import.ts +38 -0
  115. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-ref.ts +10 -0
  116. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/snapshot.ts +509 -0
  117. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/submission.ts +5 -0
  118. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/toolDisplay.ts +264 -0
  119. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/transport.ts +1152 -0
  120. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-assembler.ts +574 -0
  121. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-binary.ts +65 -0
  122. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-codec.ts +240 -0
  123. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-fault.ts +39 -0
  124. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire.ts +159 -0
  125. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-artifacts.ts +291 -0
  126. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-observation-display.ts +281 -0
  127. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-row-meta.ts +163 -0
  128. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-run-settings-command.ts +62 -0
  129. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs-delta.ts +517 -0
  130. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs.ts +512 -0
  131. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-config.ts +81 -0
  132. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-hook-review.ts +210 -0
  133. package/server/vendor/zcode/packages/shared/src/zcode-task-mode-schema.ts +6 -0
  134. package/server/vendor/zcode/packages/shared/src/zcode-task-types-core.ts +1187 -0
  135. package/server/vendor/zcode/packages/shared/src/zcodeEndpoint.ts +296 -0
  136. package/server/vendor/zcode/provenance.json +405 -0
  137. package/shared/account.ts +201 -0
  138. package/shared/diagnostics.ts +52 -0
  139. package/shared/runtime-setup.ts +73 -0
  140. package/vendor/acp-registry/LICENSE +176 -0
  141. package/vendor/paseo/LICENSE +211 -0
@@ -0,0 +1,404 @@
1
+ export type ZCodeBackgroundTaskControlStatus =
2
+ | "pending"
3
+ | "running"
4
+ | "completed"
5
+ | "failed"
6
+ | "killed"
7
+ | "lost";
8
+
9
+ export interface ZCodeBackgroundTaskControlItem {
10
+ jobId: string;
11
+ toolCallId?: string;
12
+ command: string;
13
+ taskKind: "agent" | "bash";
14
+ cancellable?: boolean;
15
+ title?: string;
16
+ status: ZCodeBackgroundTaskControlStatus;
17
+ startedAt?: number;
18
+ elapsedMs?: number;
19
+ pid?: number;
20
+ stdoutTail?: string;
21
+ stderrTail?: string;
22
+ outputTail?: string;
23
+ raw?: unknown;
24
+ }
25
+
26
+ const ACTIVE_BACKGROUND_TASK_CONTROL_STATUSES = new Set<ZCodeBackgroundTaskControlStatus>([
27
+ "running",
28
+ ]);
29
+
30
+ function isPlainRecord(value: unknown): value is Record<string, unknown> {
31
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32
+ }
33
+
34
+ function readStringField(value: unknown, keys: readonly string[]): string | undefined {
35
+ if (!isPlainRecord(value)) {
36
+ return undefined;
37
+ }
38
+ for (const key of keys) {
39
+ const candidate = value[key];
40
+ if (typeof candidate !== "string") {
41
+ continue;
42
+ }
43
+ const trimmed = candidate.trim();
44
+ if (trimmed.length > 0) {
45
+ return trimmed;
46
+ }
47
+ }
48
+ return undefined;
49
+ }
50
+
51
+ function readNumberField(value: unknown, keys: readonly string[]): number | undefined {
52
+ if (!isPlainRecord(value)) {
53
+ return undefined;
54
+ }
55
+ for (const key of keys) {
56
+ const candidate = value[key];
57
+ if (typeof candidate === "number" && Number.isFinite(candidate)) {
58
+ return candidate;
59
+ }
60
+ if (typeof candidate === "string" && candidate.trim().length > 0) {
61
+ const parsed = Number(candidate);
62
+ if (Number.isFinite(parsed)) {
63
+ return parsed;
64
+ }
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+
70
+ function readBooleanField(value: unknown, keys: readonly string[]): boolean | undefined {
71
+ if (!isPlainRecord(value)) {
72
+ return undefined;
73
+ }
74
+ for (const key of keys) {
75
+ const candidate = value[key];
76
+ if (typeof candidate === "boolean") {
77
+ return candidate;
78
+ }
79
+ if (typeof candidate === "string") {
80
+ const normalized = candidate.trim().toLowerCase();
81
+ if (normalized === "true" || normalized === "yes" || normalized === "1") {
82
+ return true;
83
+ }
84
+ if (normalized === "false" || normalized === "no" || normalized === "0") {
85
+ return false;
86
+ }
87
+ }
88
+ }
89
+ return undefined;
90
+ }
91
+
92
+ function readInstantMs(value: unknown, keys: readonly string[]): number | undefined {
93
+ const numberValue = readNumberField(value, keys);
94
+ if (numberValue !== undefined) {
95
+ return numberValue;
96
+ }
97
+ if (!isPlainRecord(value)) {
98
+ return undefined;
99
+ }
100
+ for (const key of keys) {
101
+ const candidate = value[key];
102
+ if (typeof candidate !== "string" || candidate.trim().length === 0) {
103
+ continue;
104
+ }
105
+ const parsed = Date.parse(candidate);
106
+ if (Number.isFinite(parsed)) {
107
+ return parsed;
108
+ }
109
+ }
110
+ return undefined;
111
+ }
112
+
113
+ function commandFromValue(value: unknown): string | undefined {
114
+ if (typeof value === "string" && value.trim().length > 0) {
115
+ return value.trim();
116
+ }
117
+ if (Array.isArray(value)) {
118
+ const parts = value
119
+ .map((item) => (typeof item === "string" ? item.trim() : ""))
120
+ .filter((item) => item.length > 0);
121
+ return parts.length > 0 ? parts.join(" ") : undefined;
122
+ }
123
+ return undefined;
124
+ }
125
+
126
+ function readCommand(record: Record<string, unknown>): string | undefined {
127
+ const direct =
128
+ commandFromValue(record.command) ??
129
+ commandFromValue(record.cmd) ??
130
+ commandFromValue(record.script);
131
+ if (direct) {
132
+ return direct;
133
+ }
134
+ const input = isPlainRecord(record.input) ? record.input : null;
135
+ return input
136
+ ? (commandFromValue(input.command) ??
137
+ commandFromValue(input.cmd) ??
138
+ commandFromValue(input.script))
139
+ : undefined;
140
+ }
141
+
142
+ function normalizeToken(value: string | undefined): string {
143
+ return (
144
+ value
145
+ ?.trim()
146
+ .toLowerCase()
147
+ .replace(/[^a-z0-9]+/gu, "_") ?? ""
148
+ );
149
+ }
150
+
151
+ type BackgroundTaskControlKind = ZCodeBackgroundTaskControlItem["taskKind"];
152
+
153
+ function taskKindFromToken(token: string): BackgroundTaskControlKind | undefined {
154
+ if (
155
+ token === "agent" ||
156
+ token === "local_agent" ||
157
+ token === "subagent" ||
158
+ token === "background_agent"
159
+ ) {
160
+ return "agent";
161
+ }
162
+ if (
163
+ token === "bash" ||
164
+ token === "local_bash" ||
165
+ token === "shell" ||
166
+ token === "terminal" ||
167
+ token === "background_bash" ||
168
+ token === "background_shell"
169
+ ) {
170
+ return "bash";
171
+ }
172
+ return undefined;
173
+ }
174
+
175
+ function readExplicitTaskKind(
176
+ record: Record<string, unknown>,
177
+ ): BackgroundTaskControlKind | undefined {
178
+ const token = normalizeToken(
179
+ readStringField(record, ["taskKind", "task_kind", "taskType", "task_type"]),
180
+ );
181
+ return taskKindFromToken(token);
182
+ }
183
+
184
+ function readToolTaskKind(record: Record<string, unknown>): BackgroundTaskControlKind | undefined {
185
+ const token = normalizeToken(readStringField(record, ["toolName", "tool_name"]));
186
+ if (token === "task") {
187
+ return "agent";
188
+ }
189
+ return taskKindFromToken(token);
190
+ }
191
+
192
+ function readBackgroundTypeTaskKind(
193
+ record: Record<string, unknown>,
194
+ ): BackgroundTaskControlKind | undefined {
195
+ const token = normalizeToken(readStringField(record, ["type", "kind", "category"]));
196
+ if (
197
+ token === "local_agent" ||
198
+ token === "subagent" ||
199
+ token === "background_agent" ||
200
+ token === "agent_background"
201
+ ) {
202
+ return "agent";
203
+ }
204
+ if (
205
+ token === "local_bash" ||
206
+ token === "background_bash" ||
207
+ token === "background_shell" ||
208
+ token === "bash_background" ||
209
+ token === "shell_background"
210
+ ) {
211
+ return "bash";
212
+ }
213
+ return undefined;
214
+ }
215
+
216
+ function resolveTaskKind(record: Record<string, unknown>): BackgroundTaskControlKind | undefined {
217
+ return (
218
+ readExplicitTaskKind(record) ?? readToolTaskKind(record) ?? readBackgroundTypeTaskKind(record)
219
+ );
220
+ }
221
+
222
+ /**
223
+ * 旧 background task 事件的唯一 kind 兼容入口。
224
+ * 新协议应直接携带 taskKind;只有历史记录缺字段时才从工具名/类型别名恢复。
225
+ */
226
+ export function resolveZCodeBackgroundTaskControlKind(
227
+ value: unknown,
228
+ ): BackgroundTaskControlKind | undefined {
229
+ return isPlainRecord(value) ? resolveTaskKind(value) : undefined;
230
+ }
231
+
232
+ function readDisplayCommand(
233
+ record: Record<string, unknown>,
234
+ taskKind: BackgroundTaskControlKind,
235
+ ): string | undefined {
236
+ if (taskKind === "agent") {
237
+ return (
238
+ readStringField(record, ["description", "summary", "title", "label"]) ?? readCommand(record)
239
+ );
240
+ }
241
+ return (
242
+ readCommand(record) ?? readStringField(record, ["description", "summary", "title", "label"])
243
+ );
244
+ }
245
+
246
+ function normalizeStatus(value: string | undefined): ZCodeBackgroundTaskControlStatus {
247
+ const normalized = normalizeToken(value);
248
+ if (
249
+ normalized === "queued" ||
250
+ normalized === "scheduled" ||
251
+ normalized === "starting" ||
252
+ normalized === "pending"
253
+ ) {
254
+ return "pending";
255
+ }
256
+ if (
257
+ normalized === "running" ||
258
+ normalized === "in_progress" ||
259
+ normalized === "started" ||
260
+ normalized === "active"
261
+ ) {
262
+ return "running";
263
+ }
264
+ if (
265
+ normalized === "completed" ||
266
+ normalized === "complete" ||
267
+ normalized === "success" ||
268
+ normalized === "succeeded" ||
269
+ normalized === "done"
270
+ ) {
271
+ return "completed";
272
+ }
273
+ if (
274
+ normalized === "failed" ||
275
+ normalized === "failure" ||
276
+ normalized === "error" ||
277
+ normalized === "spawn_error"
278
+ ) {
279
+ return "failed";
280
+ }
281
+ if (
282
+ normalized === "killed" ||
283
+ normalized === "cancelled" ||
284
+ normalized === "canceled" ||
285
+ normalized === "stopped" ||
286
+ normalized === "terminated" ||
287
+ normalized === "timed_out" ||
288
+ normalized === "timeout"
289
+ ) {
290
+ return "killed";
291
+ }
292
+ if (normalized === "lost" || normalized === "unknown") {
293
+ return "lost";
294
+ }
295
+ return "running";
296
+ }
297
+
298
+ function readJobId(record: Record<string, unknown>, command: string): string {
299
+ const explicitId = readStringField(record, [
300
+ // ZCode Protocol 后台任务取消入口按 taskId 查找 runtime task 记录;
301
+ // 若这里落到 toolCallId,UI 会发送 call_*,后端只能返回 background_task_not_found。
302
+ "taskId",
303
+ "task_id",
304
+ "backgroundTaskId",
305
+ "background_task_id",
306
+ "jobId",
307
+ "job_id",
308
+ "backgroundJobId",
309
+ "background_job_id",
310
+ "id",
311
+ ]);
312
+ if (explicitId) {
313
+ return explicitId;
314
+ }
315
+ const startedAt = readInstantMs(record, ["startedAt", "started_at", "startTime", "start_time"]);
316
+ const pid = readNumberField(record, ["pid", "processId", "process_id"]);
317
+ return `background-task:${pid ?? "no-pid"}:${startedAt ?? "no-start"}:${command}`;
318
+ }
319
+
320
+ export function parseZCodeBackgroundTaskControlItems(
321
+ value: unknown,
322
+ ): ZCodeBackgroundTaskControlItem[] {
323
+ if (!Array.isArray(value)) {
324
+ return [];
325
+ }
326
+ const jobsById = new Map<string, ZCodeBackgroundTaskControlItem>();
327
+ for (const item of value) {
328
+ if (!isPlainRecord(item)) {
329
+ continue;
330
+ }
331
+ const taskKind = resolveZCodeBackgroundTaskControlKind(item);
332
+ if (!taskKind) {
333
+ continue;
334
+ }
335
+ const command = readDisplayCommand(item, taskKind);
336
+ if (!command) {
337
+ continue;
338
+ }
339
+ const jobId = readJobId(item, command);
340
+ const toolCallId = readStringField(item, ["toolCallId", "tool_call_id"]);
341
+ const startedAt = readInstantMs(item, ["startedAt", "started_at", "startTime", "start_time"]);
342
+ const elapsedMs = readNumberField(item, [
343
+ "elapsedMs",
344
+ "elapsed_ms",
345
+ "durationMs",
346
+ "duration_ms",
347
+ ]);
348
+ const pid = readNumberField(item, ["pid", "processId", "process_id"]);
349
+ const title = readStringField(item, ["title", "name", "label", "description"]);
350
+ const status = normalizeStatus(readStringField(item, ["status", "state", "phase"]));
351
+ const cancellable = readBooleanField(item, ["cancellable"]);
352
+ const stdoutTail = readStringField(item, ["stdoutTail", "stdout_tail"]);
353
+ const stderrTail = readStringField(item, ["stderrTail", "stderr_tail"]);
354
+ const outputTail = readStringField(item, ["outputTail", "output_tail"]);
355
+ const job: ZCodeBackgroundTaskControlItem = {
356
+ jobId,
357
+ ...(toolCallId ? { toolCallId } : {}),
358
+ command,
359
+ taskKind,
360
+ ...(cancellable !== undefined ? { cancellable } : {}),
361
+ ...(title ? { title } : {}),
362
+ status,
363
+ ...(startedAt !== undefined ? { startedAt } : {}),
364
+ ...(elapsedMs !== undefined ? { elapsedMs } : {}),
365
+ ...(pid !== undefined ? { pid } : {}),
366
+ ...(stdoutTail ? { stdoutTail } : {}),
367
+ ...(stderrTail ? { stderrTail } : {}),
368
+ ...(outputTail ? { outputTail } : {}),
369
+ raw: item,
370
+ };
371
+ jobsById.set(job.jobId, job);
372
+ }
373
+ return Array.from(jobsById.values());
374
+ }
375
+
376
+ export function isActiveZCodeBackgroundTaskControlItem(
377
+ job: ZCodeBackgroundTaskControlItem,
378
+ ): boolean {
379
+ return ACTIVE_BACKGROUND_TASK_CONTROL_STATUSES.has(job.status);
380
+ }
381
+
382
+ export function getZCodeBackgroundTaskControlItemElapsedMs(
383
+ job: ZCodeBackgroundTaskControlItem,
384
+ now = Date.now(),
385
+ ): number {
386
+ const elapsedFromStart =
387
+ job.startedAt !== undefined ? Math.max(0, now - job.startedAt) : undefined;
388
+ return Math.max(elapsedFromStart ?? 0, job.elapsedMs ?? 0);
389
+ }
390
+
391
+ export function collectVisibleZCodeBackgroundTaskControlItems(
392
+ jobs: readonly ZCodeBackgroundTaskControlItem[],
393
+ now = Date.now(),
394
+ thresholdMs = 30_000,
395
+ ): Array<ZCodeBackgroundTaskControlItem & { elapsedMs: number }> {
396
+ return jobs
397
+ .filter(isActiveZCodeBackgroundTaskControlItem)
398
+ .map((job) => ({
399
+ ...job,
400
+ elapsedMs: getZCodeBackgroundTaskControlItemElapsedMs(job, now),
401
+ }))
402
+ .filter((job) => job.elapsedMs >= thresholdMs)
403
+ .sort((left, right) => right.elapsedMs - left.elapsedMs);
404
+ }
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+
3
+ // Bash 原始文件不会进入协议;仅传递有界头部与真实截断/文件保留事实。
4
+ export const bashOutputDisplaySchema = z
5
+ .object({
6
+ kind: z.literal("bash_output"),
7
+ output: z.string().max(150_000),
8
+ truncated: z.boolean(),
9
+ outputPath: z.string().min(1).max(32_768).optional(),
10
+ })
11
+ .strict();