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,156 @@
1
+ // ============================================================
2
+ // CreateWorkflow 的工具卡 display 载荷(rows.ts 的 toolCallDisplaySchema 成员)
3
+ // ============================================================
4
+ // 从 rows.ts 拆出:workflow display + 因果图两段 schema 让 rows.ts 越过 max-lines 上限,
5
+ // 且它们是一块自洽的词汇表(与 workspace-hook-review.ts 同一先例——特性级 schema 单独成模块)。
6
+
7
+ import { z } from "zod";
8
+
9
+ // CreateWorkflow display 是独立于模型文本的有界投影;诊断条数与单条 message 长度都必须在
10
+ // 协议边界限长,避免类型检查结果把 continuous/replayable 消息扩成无界载荷。
11
+ // causalityGraph 同理:step / 车道 / 边的数量与标签长度在工具输出边界已限长,这里镜像
12
+ // 同一组上界。图的词汇表刻意很小:参与者卡 + 一种箭头(runs after,`back` 只标回边)+
13
+ // 阶段模块 + 返回物标记;分析器的 kind / certainty / exact / region 不进载荷。交接边是因果事实按子代理取商,阶段层
14
+ // 的边是控制流图的阶段商;step / 车道只作运行状态与检视器的键,不再画进图。
15
+ //
16
+ // 名字只在运行时成形(`` agent(`研究员${i + 1}`) ``)时静态能拿到的形状:第一个洞之前的
17
+ // 字面量(head)与最后一个洞之后的字面量(tail)。至少一个在场,两者都已 trim 且含实义字符。
18
+ // 只搬**数据**:渲染成「研究员…」的省略号由 name-pattern.ts 在渲染时加,投影里不存文案
19
+ // (与匿名兜底同一道理——见 lane-name.ts 头部)。
20
+ const namePatternSchema = z
21
+ .object({
22
+ head: z.string().min(1).max(128).optional(),
23
+ tail: z.string().min(1).max(128).optional(),
24
+ })
25
+ .strict();
26
+
27
+ // 一条边 = runs after;交接边与阶段边同形。`back` 只标循环回边(布局排秩与 cycle 计数读),
28
+ // 画法与其他边相同。
29
+ const workflowEdgeSchema = z
30
+ .object({
31
+ from: z.string().min(1).max(64),
32
+ to: z.string().min(1).max(64),
33
+ back: z.literal(true).optional(),
34
+ })
35
+ .strict();
36
+
37
+ const toolCallCreateWorkflowCausalityGraphSchema = z
38
+ .object({
39
+ steps: z
40
+ .array(
41
+ z
42
+ .object({
43
+ id: z.string().min(1).max(64),
44
+ kind: z.enum(["ask", "world-read"]),
45
+ label: z.string().min(1).max(128),
46
+ // 内联 `agent()` receiver 让 label 落到兜底串时,那个名字的静态形状。
47
+ labelPattern: namePatternSchema.optional(),
48
+ line: z.number().int().positive().optional(),
49
+ column: z.number().int().positive().optional(),
50
+ lane: z.string().min(1).max(64),
51
+ lanes: z.array(z.string().min(1).max(64)).max(32).optional(),
52
+ // 展开自的站点 id,只出现在 may-set 车道展开的拷贝上(实时叠加的关联键);
53
+ // 加字段是 additive 的,不带它的旧载荷照常通过 .strict()。
54
+ source: z.string().min(1).max(64).optional(),
55
+ // 作者用 `phase("…")` 标记划入的阶段。
56
+ // 与图的 phases / phaseEdges / exits 同进同退:全在场或全缺席。
57
+ phase: z.string().min(1).max(64).optional(),
58
+ repeat: z.enum(["stack", "serial"]).optional(),
59
+ })
60
+ .strict(),
61
+ )
62
+ .max(64),
63
+ lanes: z
64
+ .array(
65
+ z
66
+ .object({
67
+ id: z.string().min(1).max(64),
68
+ name: z.string().min(1).max(128).optional(),
69
+ // `name` 缺席而 agent() 首参是带洞的模板串时的静态形状;与 name 互斥。
70
+ namePattern: namePatternSchema.optional(),
71
+ line: z.number().int().positive().optional(),
72
+ column: z.number().int().positive().optional(),
73
+ })
74
+ .strict(),
75
+ )
76
+ .max(32),
77
+ // 参与者 = 每阶段一张子代理卡(工作区 / 未解析同形);数组顺序就是交接序,第一张是开局者。
78
+ // fan-out 家族按字面量基数展开成 member,基数未知时一张 many 卡。
79
+ participants: z
80
+ .array(
81
+ z
82
+ .object({
83
+ id: z.string().min(1).max(64),
84
+ phase: z.string().min(1).max(64),
85
+ lane: z.string().min(1).max(64),
86
+ steps: z.array(z.string().min(1).max(64)).min(1).max(64),
87
+ member: z
88
+ .object({ index: z.number().int().nonnegative(), of: z.number().int().positive() })
89
+ .strict()
90
+ .optional(),
91
+ many: z.literal(true).optional(),
92
+ })
93
+ .strict(),
94
+ )
95
+ .max(64),
96
+ // 交接 = 参与者之间的 runs after;types 是跨越它的产物类型(检视器素材,不上箭头)。
97
+ handoffs: z
98
+ .array(
99
+ workflowEdgeSchema
100
+ .extend({ types: z.array(z.string().min(1).max(128)).min(1).max(8).optional() })
101
+ .strict(),
102
+ )
103
+ .max(256),
104
+ // 阶段词汇表:作者施加的分组结构,主画面以它为节点。与 phaseEdges / exits / Step.phase
105
+ // 全有或全无——零标记脚本全缺席,UI 据此退回 step/车道视图。零成员阶段也在表里。
106
+ // `unphased` 无 name,显示名由 UI 本地化。
107
+ phases: z
108
+ .array(
109
+ z
110
+ .object({
111
+ id: z.string().min(1).max(64),
112
+ name: z.string().min(1).max(128).optional(),
113
+ line: z.number().int().positive().optional(),
114
+ column: z.number().int().positive().optional(),
115
+ // 进入本阶段时还在跑的其他阶段(它们的 strand 尚未 join),阶段表序,不含自己,
116
+ // 为空时缺席。是节点事实而不是边——控制没有从那里转移过来,所以不进 phaseEdges。
117
+ // 时间轴据此把相邻阶段折成一条分叉的「带」,侧栏迷你轨道画成双线段。
118
+ alongside: z.array(z.string().min(1).max(64)).min(1).max(32).optional(),
119
+ })
120
+ .strict(),
121
+ )
122
+ .max(32)
123
+ .optional(),
124
+ phaseEdges: z.array(workflowEdgeSchema).max(128).optional(),
125
+ // 控制流可在其后正常完成的阶段(阶段视图的「阶段 → 返回物」箭头);组内可为空数组。
126
+ exits: z.array(z.string().min(1).max(64)).max(32).optional(),
127
+ sink: z.array(z.string().min(1).max(64)).max(64).optional(),
128
+ truncated: z.boolean().optional(),
129
+ })
130
+ .strict();
131
+ export type ToolCallCreateWorkflowCausalityGraph = z.infer<
132
+ typeof toolCallCreateWorkflowCausalityGraphSchema
133
+ >;
134
+
135
+ export const toolCallCreateWorkflowDisplaySchema = z
136
+ .object({
137
+ kind: z.literal("create_workflow"),
138
+ ok: z.boolean(),
139
+ errorCount: z.number().int().nonnegative(),
140
+ diagnostics: z
141
+ .array(
142
+ z
143
+ .object({
144
+ line: z.number().int().nonnegative(),
145
+ column: z.number().int().nonnegative(),
146
+ code: z.number().int().nonnegative(),
147
+ message: z.string().min(1).max(2_048),
148
+ })
149
+ .strict(),
150
+ )
151
+ .max(100),
152
+ causalityGraph: toolCallCreateWorkflowCausalityGraphSchema.optional(),
153
+ truncated: z.boolean().optional(),
154
+ })
155
+ .strict();
156
+ export type ToolCallCreateWorkflowDisplay = z.infer<typeof toolCallCreateWorkflowDisplaySchema>;
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ import type { CuaPermissionKind } from "../cuaAccessibilitySettings.js";
3
+ import { timestampSchema } from "./core.js";
4
+
5
+ export const cuaRequestAccessStatusSchema = z
6
+ .object({
7
+ schemaVersion: z.literal(1),
8
+ platform: z.literal("darwin"),
9
+ grantOwner: z.string().min(1),
10
+ accessibility: z.enum(["granted", "stale", "denied"]),
11
+ screenRecording: z.enum(["granted", "denied", "unknown"]),
12
+ })
13
+ .strict();
14
+ export type CuaRequestAccessStatus = z.infer<typeof cuaRequestAccessStatusSchema>;
15
+
16
+ export function requiredCuaPermissionsForRequestAccessStatus(
17
+ status: CuaRequestAccessStatus,
18
+ ): CuaPermissionKind[] {
19
+ const required: CuaPermissionKind[] = [];
20
+ if (status.accessibility === "denied" || status.accessibility === "stale") {
21
+ required.push("accessibility");
22
+ }
23
+ if (status.screenRecording === "denied") {
24
+ required.push("screen_recording");
25
+ }
26
+ return required;
27
+ }
28
+
29
+ export const cuaPermissionObservationSchema = z
30
+ .object({
31
+ schemaVersion: z.literal(1),
32
+ eventId: z.string().min(1),
33
+ eventSeq: z.number().int().nonnegative(),
34
+ occurredAt: timestampSchema,
35
+ sessionId: z.string().min(1),
36
+ turnId: z.string().min(1).optional(),
37
+ toolCallId: z.string().min(1),
38
+ permissionStatus: cuaRequestAccessStatusSchema,
39
+ })
40
+ .strict();
41
+ export type CuaPermissionObservation = z.infer<typeof cuaPermissionObservationSchema>;
@@ -0,0 +1,147 @@
1
+ // ConversationDelta:七个操作,封闭集合。
2
+ // 没有 row.inserted(中间插入)、没有 row.moved、没有字段级 JSON patch——
3
+ // 凡此模型表达不了的结构变化,服务端一律发 snapshot resync,刻意压缩客户端错误面。
4
+ //
5
+ // 唯一的例外是最后两条 `workflowRun.*`:`workflowRuns` 是一个高频状态键,键级整体替换让
6
+ // 每条引擎事件都要重发整张表(O(N) 字节/事件、O(N²)/run)。它们**只**给这一个键开了一道
7
+ // 按 (runId, siteId, ordinal) 的增量口子,语义仍是「键内整体替换,只是下探了两级」:
8
+ // header 键整键替换、条目整条替换,没有任何字段级深合并。规则在 workflow-runs-delta.ts。
9
+ import { z } from "zod";
10
+ import { streamablePathSchema } from "./core.js";
11
+ import { conversationRowSchema } from "./rows.js";
12
+ import { sharedContextImportStateSchema } from "./shared-context-import.js";
13
+ import {
14
+ backgroundWorkSummarySchema,
15
+ commandStateSummarySchema,
16
+ goalStateSchema,
17
+ inputRoutingSchema,
18
+ pendingInteractionSchema,
19
+ planStateSchema,
20
+ queueStateSchema,
21
+ sessionActionAvailabilitySchema,
22
+ sessionConfigStateSchema,
23
+ sessionControlSchema,
24
+ sessionMetaStateSchema,
25
+ sessionModelTransitionSchema,
26
+ sessionUsageStateSchema,
27
+ subagentProjectionStateSchema,
28
+ workspaceHookAdmissionStateSchema,
29
+ } from "./snapshot.js";
30
+ import {
31
+ WORKFLOW_RUNS_LIMITS,
32
+ workflowRunActorSchema,
33
+ workflowRunNodeSchema,
34
+ workflowRunSchema,
35
+ workflowRunsStateSchema,
36
+ } from "./workflow-runs.js";
37
+
38
+ // StatePatch:键级整体替换(Object.assign),键集合封闭。键内绝不深合并。
39
+ export const statePatchSchema = z.object({
40
+ revision: z.number().optional(),
41
+ control: sessionControlSchema.optional(),
42
+ sharedContextImport: sharedContextImportStateSchema.optional(),
43
+ availability: sessionActionAvailabilitySchema.optional(),
44
+ inputRouting: inputRoutingSchema.optional(),
45
+ meta: sessionMetaStateSchema.optional(),
46
+ config: sessionConfigStateSchema.optional(),
47
+ modelTransition: sessionModelTransitionSchema.nullable().optional(),
48
+ usage: sessionUsageStateSchema.optional(),
49
+ queue: queueStateSchema.optional(),
50
+ pendingInteractions: z.array(pendingInteractionSchema).optional(),
51
+ pendingCommands: z.array(commandStateSummarySchema).optional(),
52
+ backgroundWorks: z.array(backgroundWorkSummarySchema).optional(),
53
+ subagents: subagentProjectionStateSchema.optional(),
54
+ // workflow run 的实时运行态。容器本身不 strict,所以旧桌面收到这个新键只是**剥离一个键**、
55
+ // 保住 patch 其余全部键——这正是它不需要任何版本偏斜防御的原因。
56
+ workflowRuns: workflowRunsStateSchema.optional(),
57
+ goal: goalStateSchema.nullable().optional(),
58
+ plan: planStateSchema.nullable().optional(),
59
+ // 软门禁:null = pending 清零(提示条消失);对象 = 待审核状态更新。
60
+ workspaceHookAdmission: workspaceHookAdmissionStateSchema.nullable().optional(),
61
+ });
62
+ export type StatePatch = z.infer<typeof statePatchSchema>;
63
+
64
+ /**
65
+ * run 的 **header** = `workflowRunSchema` 减去 actors / nodes 两张按实例增量同步的表。
66
+ *
67
+ * 使用 `.omit` 从同一 schema 派生,避免独立维护的字段表不一致导致订阅解析失败。小集合(reports / artifacts / phases / pendingQuestions…)留在 header 里整键替换——
68
+ * 它们的上界都是几十条,为它们再开一套增量语法只会多一套能写错的东西。
69
+ */
70
+ export const workflowRunHeaderSchema = workflowRunSchema.omit({ actors: true, nodes: true });
71
+ export type WorkflowRunHeader = z.infer<typeof workflowRunHeaderSchema>;
72
+
73
+ /** header 的部分更新:在场的键整键替换,缺席的键保持不动(绝不深合并)。 */
74
+ export const workflowRunHeaderPatchSchema = workflowRunHeaderSchema.partial();
75
+ export type WorkflowRunHeaderPatch = z.infer<typeof workflowRunHeaderPatchSchema>;
76
+
77
+ /** 变成**缺席**的 header 键。「零条 ⇒ 键缺席」是 reports / pendingQuestions 等键的协议约定,所以增量必须说得出它。 */
78
+ export const workflowRunHeaderKeySchema = workflowRunHeaderSchema.keyof();
79
+ export type WorkflowRunHeaderKey = z.infer<typeof workflowRunHeaderKeySchema>;
80
+
81
+ /**
82
+ * 一条被淘汰条目的**身份**(两张表共用的去重键)。从 actor schema 上 `.pick` 而不是手写
83
+ * 两个字段:这两个字段的界只该有一处定义,理由与 `workflowRunHeaderSchema` 的 `.omit` 逐字相同。
84
+ *
85
+ * 刻意**只有身份**:淘汰要说的全部内容就是「这条走了」,带上条目本身只会让消费者以为这是一次
86
+ * upsert。
87
+ */
88
+ export const workflowRunEntryRefSchema = workflowRunActorSchema.pick({
89
+ siteId: true,
90
+ ordinal: true,
91
+ });
92
+ export type WorkflowRunEntryRef = z.infer<typeof workflowRunEntryRefSchema>;
93
+
94
+ export const conversationDeltaSchema = z.discriminatedUnion("op", [
95
+ // 追加到尾部(99%)。
96
+ z.object({ op: z.literal("row.appended"), row: conversationRowSchema }),
97
+ // 按 rowId 整行替换(状态机迁移)。
98
+ z.object({ op: z.literal("row.upserted"), row: conversationRowSchema }),
99
+ // 删除该行及之后所有(edit/retry 分支)。作用于客户端已加载集合中所有 rowId >= fromRowId 的行。
100
+ z.object({ op: z.literal("row.removed"), fromRowId: z.number() }),
101
+ // 流式文本追加。仅允许作用于流式态行(服务端保证,客户端可断言)。
102
+ z.object({
103
+ op: z.literal("row.delta"),
104
+ rowId: z.number(),
105
+ path: streamablePathSchema,
106
+ append: z.string(),
107
+ }),
108
+ z.object({ op: z.literal("state.updated"), patch: statePatchSchema }),
109
+ /**
110
+ * 一条 dwf run 的键级增量。`revision` 是**这次变化之后**的 `workflowRuns.revision`(绝对值);
111
+ * 一条引擎事件最多产生一条本 op(节点相位、派生的 actor 状态、用量、水位一起落地,原子)。
112
+ *
113
+ * 六个载荷各有各的语义:`run` 按键整体替换、`cleared` 说哪些键变成了缺席、
114
+ * `removedActors` / `removedNodes` 按 (siteId, ordinal) 删条目、`actors` / `nodes` 按同一个键
115
+ * 整条 upsert。四张表的界与状态键同值——增量不该能拼出一个非法的状态。
116
+ *
117
+ * **施加序是 header → 删除 → upsert**,写在这里也写在字段序上:同一个键在一条 op 里被删又被加
118
+ * (溢出过的 run 在 resume 时清表重开,或一个条目被淘汰后又回来)必须落在表尾,才与顺序施加
119
+ * 两条 op 的结果一致。
120
+ */
121
+ z.object({
122
+ op: z.literal("workflowRun.updated"),
123
+ runId: workflowRunSchema.shape.runId,
124
+ revision: workflowRunsStateSchema.shape.revision,
125
+ run: workflowRunHeaderPatchSchema.optional(),
126
+ cleared: z
127
+ .array(workflowRunHeaderKeySchema)
128
+ .max(workflowRunHeaderKeySchema.options.length)
129
+ .optional(),
130
+ removedActors: z
131
+ .array(workflowRunEntryRefSchema)
132
+ .max(WORKFLOW_RUNS_LIMITS.maxActors)
133
+ .optional(),
134
+ removedNodes: z.array(workflowRunEntryRefSchema).max(WORKFLOW_RUNS_LIMITS.maxNodes).optional(),
135
+ actors: z.array(workflowRunActorSchema).max(WORKFLOW_RUNS_LIMITS.maxActors).optional(),
136
+ nodes: z.array(workflowRunNodeSchema).max(WORKFLOW_RUNS_LIMITS.maxNodes).optional(),
137
+ }),
138
+ /** 这条 run 被生产者淘汰了(只有生产者淘汰,而且必须说出来——客户端永远不自行施加上界)。 */
139
+ z.object({
140
+ op: z.literal("workflowRun.removed"),
141
+ runId: workflowRunSchema.shape.runId,
142
+ revision: workflowRunsStateSchema.shape.revision,
143
+ }),
144
+ ]);
145
+ export type ConversationDelta = z.infer<typeof conversationDeltaSchema>;
146
+ export type WorkflowRunUpdatedDelta = Extract<ConversationDelta, { op: "workflowRun.updated" }>;
147
+ export type WorkflowRunRemovedDelta = Extract<ConversationDelta, { op: "workflowRun.removed" }>;
@@ -0,0 +1,69 @@
1
+ // CLI admission 后的自包含输入事实。
2
+ // queue / guide / runtime / transcript 只能携带同一个 intent,不允许各层重建字段。
3
+ import { z } from "zod";
4
+ import { timestampSchema } from "./core.js";
5
+ import { attachmentRefSchema } from "./attachment-ref.js";
6
+ import { modelSelectionSchema } from "../model-selection.js";
7
+ import { submissionModeSchema } from "./submission.js";
8
+ import { sharedContextRefSchema } from "./shared-context-ref.js";
9
+
10
+ export const conversationInputDeliverySchema = z
11
+ .object({
12
+ requested: z.enum(["auto", "startNow", "queue", "guide"]),
13
+ admitted: z.enum(["startNow", "queue", "guide"]),
14
+ fallbackReasonCode: z.string().optional(),
15
+ })
16
+ .strict();
17
+
18
+ export const conversationInputOrderSchema = z
19
+ .object({
20
+ admissionSeq: z.number().int().nonnegative(),
21
+ queuePosition: z.number().int().nonnegative().optional(),
22
+ })
23
+ .strict();
24
+
25
+ export const conversationInputSteerSchema = z
26
+ .object({
27
+ state: z.enum(["notRequested", "submitting", "steering", "guided", "fellBack"]),
28
+ reasonCode: z.string().optional(),
29
+ })
30
+ .strict();
31
+
32
+ export const conversationInputDispatchSchema = z
33
+ .object({
34
+ state: z.enum(["admitted", "queued", "reserved", "promoting", "drained"]),
35
+ reservationId: z.string().optional(),
36
+ })
37
+ .strict();
38
+
39
+ export const conversationInputIntentSchema = z
40
+ .object({
41
+ sourceCommandId: z.string().min(1),
42
+ queueItemId: z.string().min(1),
43
+ clientId: z.string().min(1),
44
+ // compact 是可排队的维护意图;消费时走 compact lifecycle,不投影为 user row。
45
+ kind: z.enum(["sendText", "sendGoalCommand", "compact"]),
46
+ text: z.string(),
47
+ attachments: z.array(attachmentRefSchema).default([]),
48
+ // optional 只服务旧 snapshot hydration;新 admission 必须填入完整 Submission。
49
+ modelSelection: modelSelectionSchema.optional(),
50
+ mode: submissionModeSchema.optional(),
51
+ planEnabled: z.boolean().optional(),
52
+ sharedContextRefs: z.array(sharedContextRefSchema).max(1).optional(),
53
+ delivery: conversationInputDeliverySchema,
54
+ order: conversationInputOrderSchema,
55
+ steer: conversationInputSteerSchema,
56
+ dispatch: conversationInputDispatchSchema,
57
+ admittedAt: timestampSchema,
58
+ provenance: z
59
+ .object({
60
+ sourceCommandId: z.string().min(1),
61
+ queueItemId: z.string().min(1).optional(),
62
+ clientId: z.string().min(1).optional(),
63
+ })
64
+ .strict()
65
+ .optional(),
66
+ })
67
+ .strict();
68
+
69
+ export type ConversationInputIntent = z.infer<typeof conversationInputIntentSchema>;