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,130 @@
1
+ import { z } from "zod";
2
+ import { browserErrorCodeSchema, browserPageStateSchema } from "./commands.js";
3
+ import { browserViewportSizeSchema } from "./command-metadata.js";
4
+ import { browserBackendTypeSchema } from "./backend.js";
5
+ import { browserSnapshotSchema, browserSnapshotElementSchema } from "./snapshot.js";
6
+
7
+ /**
8
+ * 受控 tab 摘要(list 命令返回):agent 用 tabId 寻址某个具体 tab(含 human 开的 tab)。
9
+ */
10
+ export const browserTabSummarySchema = z
11
+ .object({
12
+ tabId: z.string(),
13
+ url: z.string(),
14
+ title: z.string(),
15
+ /** guest 当前真实 CSS viewport;normal/free-size 均必须返回。 */
16
+ viewport: browserViewportSizeSchema,
17
+ /**
18
+ * main 侧最近可见/激活的内置浏览器 tab。用于让 agent 在用户手动改地址后,
19
+ * 先绑定并读取当前页面,而不是误读 session 默认 tab。
20
+ */
21
+ active: z.boolean().optional(),
22
+ lifecycle: z.enum(["active", "deliverable", "handoff"]).optional(),
23
+ })
24
+ .strict();
25
+ export type BrowserTabSummary = z.infer<typeof browserTabSummarySchema>;
26
+
27
+ /** 尚未被当前 browser session claim 的用户 IAB tab;claim 前不能执行普通 Tab command。 */
28
+ export const browserUserTabInfoSchema = z
29
+ .object({
30
+ id: z.string().min(1),
31
+ lastOpened: z.string().optional(),
32
+ tabGroup: z.string().optional(),
33
+ title: z.string().optional(),
34
+ url: z.string().optional(),
35
+ })
36
+ .strict();
37
+ export type BrowserUserTabInfo = z.infer<typeof browserUserTabInfoSchema>;
38
+
39
+ /** JS 弹窗信息(getDialog 返回)。 */
40
+ export const browserDialogSchema = z
41
+ .object({
42
+ type: z.enum(["alert", "confirm", "prompt", "beforeunload"]),
43
+ message: z.string(),
44
+ defaultPrompt: z.string().optional(),
45
+ })
46
+ .strict();
47
+ export type BrowserDialog = z.infer<typeof browserDialogSchema>;
48
+
49
+ /** browser command 的 UI/客户端元数据;不会自动变成模型 image block。 */
50
+ export const browserResponseMetaSchema = z
51
+ .object({
52
+ browserUse: z.literal(true),
53
+ backendType: browserBackendTypeSchema,
54
+ browserId: z.string().min(1),
55
+ browserGeneration: z.number().int().nonnegative(),
56
+ openTabIds: z.array(z.string()),
57
+ tabId: z.string().optional(),
58
+ currentUrl: z.string().optional(),
59
+ lifecycle: z.enum(["active", "deliverable", "handoff", "closed"]).optional(),
60
+ })
61
+ .strict();
62
+ export type BrowserResponseMeta = z.infer<typeof browserResponseMetaSchema>;
63
+
64
+ export const browserRecordingArtifactSchema = z
65
+ .object({
66
+ path: z.string().min(1),
67
+ mimeType: z.literal("video/webm"),
68
+ width: z.number().int().positive(),
69
+ height: z.number().int().positive(),
70
+ fps: z.number().positive(),
71
+ durationMs: z.number().nonnegative(),
72
+ frameCount: z.number().int().nonnegative(),
73
+ })
74
+ .strict();
75
+ export type BrowserRecordingArtifact = z.infer<typeof browserRecordingArtifactSchema>;
76
+
77
+ export const browserRecordingJobSchema = z
78
+ .object({
79
+ id: z.string().min(1),
80
+ status: z.enum(["running", "completed", "failed", "cancelled"]),
81
+ phase: z.enum(["preparing", "capturing", "finalizing", "completed", "failed", "cancelled"]),
82
+ progress: z.number().min(0).max(1),
83
+ startedAt: z.number().nonnegative(),
84
+ updatedAt: z.number().nonnegative(),
85
+ artifact: browserRecordingArtifactSchema.optional(),
86
+ error: z.string().optional(),
87
+ })
88
+ .strict();
89
+ export type BrowserRecordingJob = z.infer<typeof browserRecordingJobSchema>;
90
+
91
+ /**
92
+ * browser 命令的统一结果(agent BrowserControlPort / 协议 result / main executor 三处同源)。
93
+ * 截图走 image;导航/getState 回 state;snapshot 回 snapshot;list 回 tabs;失败回结构化 error。
94
+ */
95
+ export const browserCommandResultSchema = z
96
+ .object({
97
+ ok: z.boolean(),
98
+ state: browserPageStateSchema.optional(),
99
+ snapshot: browserSnapshotSchema.optional(),
100
+ image: z
101
+ .object({ base64: z.string(), mimeType: z.literal("image/png") })
102
+ .strict()
103
+ .optional(),
104
+ /** list 命令返回:只包含当前 window/workspace/session/generation scope 可见的 tabs。 */
105
+ tabs: z.array(browserTabSummarySchema).optional(),
106
+ /** BrowserUser.openTabs() 返回;与当前 session 自有 tabs.list() 严格分离。 */
107
+ userTabs: z.array(browserUserTabInfoSchema).optional(),
108
+ /** newTab 返回的单个真实 tab。 */
109
+ tab: browserTabSummarySchema.optional(),
110
+ /** evaluate 返回:页面表达式的可 JSON 序列化结果。 */
111
+ value: z.unknown().optional(),
112
+ /** elementInfo 返回:坐标命中元素的信息(复用快照元素结构;未命中则省略)。 */
113
+ element: browserSnapshotElementSchema.optional(),
114
+ /** getDialog 返回:当前 JS 弹窗信息;无弹窗时为 null。 */
115
+ dialog: browserDialogSchema.nullable().optional(),
116
+ /** WebView 异步录制任务;main 临时 path 会在 Host materialize 后改写为 workspace path。 */
117
+ recording: browserRecordingJobSchema.optional(),
118
+ error: z
119
+ .object({
120
+ code: browserErrorCodeSchema,
121
+ message: z.string(),
122
+ sideEffect: z.enum(["none", "uncertain"]).optional(),
123
+ })
124
+ .strict()
125
+ .optional(),
126
+ meta: browserResponseMetaSchema.optional(),
127
+ elapsedMs: z.number().nonnegative(),
128
+ })
129
+ .strict();
130
+ export type BrowserCommandResult = z.infer<typeof browserCommandResultSchema>;
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+
3
+ export const browserElementRectSchema = z
4
+ .object({
5
+ x: z.number(),
6
+ y: z.number(),
7
+ width: z.number(),
8
+ height: z.number(),
9
+ })
10
+ .strict();
11
+ export type BrowserElementRect = z.infer<typeof browserElementRectSchema>;
12
+
13
+ /**
14
+ * 单个可交互元素的快照条目,以 role、name、ref 提供定位信息,避免转储整页 DOM。
15
+ * ref 为按 DOM 序分配的稳定引用(e1, e2, ...),后续 action 用 ref 定位。
16
+ */
17
+ export const browserSnapshotElementSchema = z
18
+ .object({
19
+ ref: z.string().min(1),
20
+ tag: z.string(),
21
+ role: z.string().optional(),
22
+ /** accessibleName */
23
+ name: z.string().optional(),
24
+ text: z.string().optional(),
25
+ value: z.string().optional(),
26
+ disabled: z.boolean().optional(),
27
+ checked: z.boolean().optional(),
28
+ selector: z.string(),
29
+ xpath: z.string(),
30
+ rect: browserElementRectSchema,
31
+ inViewport: z.boolean(),
32
+ /** 父级可交互元素的 ref(层级线索;顶层/无父可交互元素时省略)。 */
33
+ parentRef: z.string().optional(),
34
+ /** 元素来源的 frame 路径(同源 iframe 穿透时标注,如 "0>2";主文档省略)。 */
35
+ framePath: z.string().optional(),
36
+ /** 有界稳定属性,用于从 DOM 事实构造 locator;不返回 class/style/src 等高噪声字段。 */
37
+ attributes: z.record(z.string(), z.string()).optional(),
38
+ })
39
+ .strict();
40
+ export type BrowserSnapshotElement = z.infer<typeof browserSnapshotElementSchema>;
41
+
42
+ /**
43
+ * 可见语义 DOM 节点。它只负责“读懂页面”,可动作句柄仍由 elements/ref 单独维护,
44
+ * 防止正文节点占满 action ref 预算。ref 仅在该语义节点同时属于 elements 时存在。
45
+ */
46
+ export const browserSnapshotDomNodeSchema = z
47
+ .object({
48
+ tag: z.string(),
49
+ depth: z.number().int().nonnegative(),
50
+ inViewport: z.boolean(),
51
+ ref: z.string().min(1).optional(),
52
+ role: z.string().optional(),
53
+ name: z.string().optional(),
54
+ text: z.string().optional(),
55
+ attributes: z.record(z.string(), z.string()).optional(),
56
+ })
57
+ .strict();
58
+ export type BrowserSnapshotDomNode = z.infer<typeof browserSnapshotDomNodeSchema>;
59
+
60
+ export const browserSnapshotSchema = z
61
+ .object({
62
+ url: z.string(),
63
+ title: z.string(),
64
+ /**
65
+ * 有界的可见语义 DOM;optional 保持旧 backend/result 的协议兼容。
66
+ * 必须排在 elements 前定义:Zod 会按 schema 顺序重建对象,大页面工具结果被截断时
67
+ * 应先让模型看到页面语义,而不是 selector/xpath/rect 等动作细节。
68
+ */
69
+ dom: z.array(browserSnapshotDomNodeSchema).optional(),
70
+ /** 语义 DOM 节点超过内部预算时置 true。 */
71
+ domTruncated: z.boolean().optional(),
72
+ elements: z.array(browserSnapshotElementSchema),
73
+ /** 元素数超过 maxElements 时截断。 */
74
+ truncated: z.boolean(),
75
+ })
76
+ .strict();
77
+ export type BrowserSnapshot = z.infer<typeof browserSnapshotSchema>;
@@ -0,0 +1,96 @@
1
+ // Command 相关类型定义
2
+ import type { SettingsDirectoryLocation } from "./settings-source.js";
3
+
4
+ export type CommandSource = "user" | "plugin";
5
+ export type CommandAgentSource = "zcodeAgent";
6
+
7
+ export interface CommandInfo {
8
+ name: string;
9
+ prompt: string;
10
+ content: string;
11
+ filePath: string;
12
+ description?: string;
13
+ argumentHint?: string;
14
+ }
15
+
16
+ export interface UserCommand extends CommandInfo {
17
+ id: string;
18
+ source: "user";
19
+ agentSource: CommandAgentSource;
20
+ location: SettingsDirectoryLocation;
21
+ enabled: boolean;
22
+ scope: "global" | "project";
23
+ projectPath?: string;
24
+ }
25
+
26
+ export interface PluginCommand extends Omit<CommandInfo, "filePath"> {
27
+ id: string;
28
+ source: "plugin";
29
+ enabled: boolean;
30
+ pluginName: string;
31
+ pluginMarketplace: string;
32
+ pluginEnabled: boolean;
33
+ scope: "global";
34
+ filePath: string;
35
+ }
36
+
37
+ export type ZCodeCommand = UserCommand | PluginCommand;
38
+
39
+ export function isUserCommand(command: ZCodeCommand): command is UserCommand {
40
+ return command.source === "user";
41
+ }
42
+
43
+ export function isPluginCommand(command: ZCodeCommand): command is PluginCommand {
44
+ return command.source === "plugin";
45
+ }
46
+
47
+ export interface CommandConfig {
48
+ name: string;
49
+ prompt: string;
50
+ description?: string;
51
+ argumentHint?: string;
52
+ filePath?: string;
53
+ }
54
+
55
+ export type CommandStorageLevel = "user" | "project";
56
+
57
+ export interface CommandsCapability {
58
+ userScopeAvailable: boolean;
59
+ userScopeReason?: "desktop_only";
60
+ }
61
+
62
+ export interface CommandsListResult {
63
+ commands: ZCodeCommand[];
64
+ userCommands: UserCommand[];
65
+ pluginCommands: PluginCommand[];
66
+ capability: CommandsCapability;
67
+ }
68
+
69
+ export interface CommandCreateParams {
70
+ config: CommandConfig;
71
+ agentSource?: CommandAgentSource;
72
+ storageLevel?: CommandStorageLevel;
73
+ workspacePath?: string;
74
+ }
75
+
76
+ export interface CommandUpdateParams {
77
+ commandId: string;
78
+ config: CommandConfig;
79
+ agentSource?: CommandAgentSource;
80
+ oldFilePath?: string;
81
+ storageLevel?: CommandStorageLevel;
82
+ workspacePath?: string;
83
+ }
84
+
85
+ export interface CommandDeleteParams {
86
+ commandId: string;
87
+ filePath: string;
88
+ agentSource?: CommandAgentSource;
89
+ }
90
+
91
+ export interface CommandSetEnabledParams {
92
+ commandId: string;
93
+ filePath: string;
94
+ enabled: boolean;
95
+ agentSource?: CommandAgentSource;
96
+ }
@@ -0,0 +1,8 @@
1
+ import type { z } from "zod";
2
+
3
+ /** 每个字段保持原 schema,只派生覆盖所需的缺省/null;嵌套结构由调用方显式派生。 */
4
+ export function sparseShape<T extends Record<string, z.ZodType>>(shape: T) {
5
+ return Object.fromEntries(
6
+ Object.entries(shape).map(([key, schema]) => [key, schema.nullable().optional()]),
7
+ ) as { [K in keyof T]: z.ZodOptional<z.ZodNullable<T[K]>> };
8
+ }
@@ -0,0 +1,41 @@
1
+ export type CuaPermissionKind = "accessibility" | "screen_recording";
2
+
3
+ export interface OpenCuaPermissionOnboardingOptions {
4
+ /** Renderer 为本次调用生成的不透明 id;关闭该权限 surface 时只取消这一 participant。 */
5
+ operationId?: string;
6
+ initialPermission?: CuaPermissionKind;
7
+ /** 当前新鲜状态确认仍缺失的权限;main 会逐项打开对应设置页并等待应用返回。 */
8
+ requiredPermissions?: CuaPermissionKind[];
9
+ }
10
+
11
+ export interface CuaAccessibilitySettingsResult {
12
+ success: boolean;
13
+ canceled?: boolean;
14
+ /** main 级 onboarding 会话 id;同一 Helper identity 的并发窗口共享同一 id。 */
15
+ sessionId?: string;
16
+ /** 只有所有 staged 设置页都观察到任意 ZCode 窗口返回后才为 true。 */
17
+ returnedFromSettings?: boolean;
18
+ /**
19
+ * 同一 main onboarding 会话可能被多个窗口加入。每个独立 renderer/host 只有一个调用拿到 true,负责
20
+ * 重启该 host 的 Helper;同一 renderer 的重复调用拿到 false。不能全局只选一个窗口,因为每个窗口
21
+ * 都有独立 host/Helper,授权前已启动的进程都需要各自恢复。
22
+ * undefined 是旧 main 的兼容形状,按单窗口 owner 处理。
23
+ */
24
+ restartHelperAfterReturn?: boolean;
25
+ error?: string;
26
+ }
27
+
28
+ /**
29
+ * 拖拽预热结果(renderer 可见形状)。
30
+ *
31
+ * 注意 `helperBundleFingerprint` 故意**不在此声明**:它是 main 进程内存缓存的同步 TOCTOU 证据
32
+ * (dragstart 前用它比对"自验签以来字节未变"),跨 IPC 暴露给 renderer 既无用又扩大攻击面。
33
+ * main 侧另有 `PrepareCuaHelperPermissionDragMainResult` 携带该字段,IPC handler 返回前显式剥离。
34
+ */
35
+ export interface PrepareCuaHelperPermissionDragResult {
36
+ success: boolean;
37
+ error?: string;
38
+ helperAppPath?: string;
39
+ helperDisplayName?: string;
40
+ helperBundleId?: string;
41
+ }
@@ -0,0 +1,178 @@
1
+ import { z } from "zod";
2
+
3
+ export const databaseStartupErrorCodeSchema = z.enum([
4
+ "storage_full",
5
+ "permission_denied",
6
+ "io_error",
7
+ "out_of_memory",
8
+ "corrupt",
9
+ "open_failed",
10
+ "lock_timeout",
11
+ "checksum_mismatch",
12
+ "sql_failed",
13
+ "startup_status_timeout",
14
+ "transport_closed",
15
+ "unsupported_runtime",
16
+ ]);
17
+ export type DatabaseStartupErrorCode = z.infer<typeof databaseStartupErrorCodeSchema>;
18
+
19
+ /** 原始结构化 cause 比外层通用包装更准确;禁止从错误文案推断满盘或 OOM。 */
20
+ export function classifyDatabaseStartupError(error: unknown): DatabaseStartupErrorCode {
21
+ const seen = new Set<unknown>();
22
+ let fallback: DatabaseStartupErrorCode = "sql_failed";
23
+ while (error && typeof error === "object" && !seen.has(error) && seen.size < 12) {
24
+ seen.add(error);
25
+ const value = error as { code?: unknown; errcode?: unknown; kind?: unknown; cause?: unknown };
26
+ const primary = typeof value.errcode === "number" ? value.errcode & 0xff : undefined;
27
+ if (primary === 13 || value.code === "ENOSPC" || value.code === "EDQUOT") return "storage_full";
28
+ if (primary === 3 || primary === 8 || value.code === "EACCES" || value.code === "EPERM")
29
+ return "permission_denied";
30
+ if (primary === 10 || value.code === "EIO") return "io_error";
31
+ if (primary === 7 || value.code === "ENOMEM" || value.code === "ERR_WORKER_OUT_OF_MEMORY")
32
+ return "out_of_memory";
33
+ if (primary === 11 || primary === 26) return "corrupt";
34
+ if (primary === 14) fallback = "open_failed";
35
+ if (primary === 5) fallback = "lock_timeout";
36
+ const kind = databaseStartupErrorCodeSchema.safeParse(value.kind);
37
+ if (kind.success && kind.data !== "sql_failed") fallback = kind.data;
38
+ error = value.cause;
39
+ }
40
+ return fallback;
41
+ }
42
+
43
+ /** 只跨进程传输错误码和冻结迁移 ID,不携带 SQL、文件内容或凭据。 */
44
+ export function databaseStartupErrorDetails(error: unknown): {
45
+ sqliteCode?: number;
46
+ systemCode?: string;
47
+ migrationId?: string;
48
+ } {
49
+ const result: { sqliteCode?: number; systemCode?: string; migrationId?: string } = {};
50
+ const seen = new Set<unknown>();
51
+ while (error && typeof error === "object" && !seen.has(error) && seen.size < 12) {
52
+ seen.add(error);
53
+ const current = error as {
54
+ errcode?: unknown;
55
+ code?: unknown;
56
+ migrationId?: unknown;
57
+ cause?: unknown;
58
+ };
59
+ if (typeof current.errcode === "number" && Number.isSafeInteger(current.errcode))
60
+ result.sqliteCode = current.errcode;
61
+ if (typeof current.code === "string" && /^[A-Z_0-9]{1,64}$/.test(current.code))
62
+ result.systemCode = current.code;
63
+ if (
64
+ typeof current.migrationId === "string" &&
65
+ /^[a-zA-Z_0-9-]{1,128}$/.test(current.migrationId)
66
+ )
67
+ result.migrationId = current.migrationId;
68
+ error = current.cause;
69
+ }
70
+ return result;
71
+ }
72
+ export const databaseStartupErrorDetailsSchema = z.object({
73
+ sqliteCode: z.number().int().optional(),
74
+ systemCode: z.string().max(64).optional(),
75
+ migrationId: z.string().max(128).optional(),
76
+ });
77
+
78
+ export const startupDiskSummarySchema = z
79
+ .object({
80
+ scopeId: z.string().max(128),
81
+ observedAvailableDropPeakBytes: z.number().finite().nonnegative().nullable(),
82
+ minAvailableBytes: z.number().finite().nonnegative().nullable(),
83
+ quality: z.enum(["complete", "partial", "unknown"]),
84
+ sampledAt: z.number().finite().nonnegative().nullable(),
85
+ })
86
+ .strict();
87
+ export type StartupDiskSummary = z.infer<typeof startupDiskSummarySchema>;
88
+ export const databaseStartupPhaseSchema = z.enum([
89
+ "starting",
90
+ "preparing_host_storage",
91
+ "preparing_session_storage",
92
+ "starting_services",
93
+ "ready",
94
+ "failed",
95
+ ]);
96
+ export const databaseMigrationIdSchema = z.string().regex(/^[a-zA-Z_0-9-]{1,128}$/);
97
+
98
+ /** 需求种类与真实执行/提交分开;预检发现需求不意味着当前执行者运行过 SQL。 */
99
+ export const databaseMigrationFactsSchema = z
100
+ .object({
101
+ kind: z.enum(["none", "initialize", "upgrade"]),
102
+ executedCount: z.number().int().nonnegative(),
103
+ committedCount: z.number().int().nonnegative(),
104
+ // null 表示锁内账本为空;缺失表示尚未取得可信起点。
105
+ lastAppliedMigrationId: databaseMigrationIdSchema.nullable().optional(),
106
+ })
107
+ .strict()
108
+ .superRefine((facts, context) => {
109
+ if (
110
+ facts.committedCount > facts.executedCount ||
111
+ (facts.kind === "none" && facts.executedCount !== 0)
112
+ )
113
+ context.addIssue({ code: "custom", message: "Invalid migration execution facts" });
114
+ });
115
+ export type DatabaseMigrationFacts = z.infer<typeof databaseMigrationFactsSchema>;
116
+
117
+ export const databaseStartupStateSchema = z
118
+ .object({
119
+ schemaVersion: z.literal(1),
120
+ startupId: z.string().min(1).max(128),
121
+ attemptId: z.string().min(1).max(128),
122
+ sequence: z.number().int().nonnegative(),
123
+ startedAt: z.number().finite().nonnegative(),
124
+ updatedAt: z.number().finite().nonnegative(),
125
+ phase: databaseStartupPhaseSchema,
126
+ databasePhase: z
127
+ .enum(["checking", "waiting_for_lock", "migrating", "committing", "maintaining", "ready"])
128
+ .optional(),
129
+ migration: databaseMigrationFactsSchema.optional(),
130
+ currentMigration: databaseMigrationFactsSchema.optional(),
131
+ migrationBaselines: z
132
+ .array(
133
+ z
134
+ .object({
135
+ databaseId: z.string().min(1).max(128),
136
+ databaseKind: z.enum(["tasks-index", "session"]),
137
+ lastAppliedMigrationId: databaseMigrationIdSchema.nullable().optional(),
138
+ })
139
+ .strict(),
140
+ )
141
+ .optional(),
142
+ finalDatabase: z.boolean().optional(),
143
+ failedPhase: databaseStartupPhaseSchema.optional(),
144
+ errorCode: databaseStartupErrorCodeSchema.optional(),
145
+ ...databaseStartupErrorDetailsSchema.shape,
146
+ disk: z.array(startupDiskSummarySchema).max(8),
147
+ })
148
+ .strict();
149
+ export type DatabaseStartupState = z.infer<typeof databaseStartupStateSchema>;
150
+ /** 本地端口和启动快照必须来自同一 Host;此 ID 不承担工作区或任务身份。 */
151
+ export const databaseStartupPortPayloadSchema = z
152
+ .object({
153
+ databaseStartupId: z.string().min(1).max(128),
154
+ })
155
+ .strict();
156
+ export const databaseStartupControlSchema = z.discriminatedUnion("action", [
157
+ z.object({ action: z.literal("snapshot") }).strict(),
158
+ z.object({ action: z.literal("exit") }).strict(),
159
+ z.object({ action: z.literal("retry"), attemptId: z.string().min(1).max(128) }).strict(),
160
+ ]);
161
+ export type DatabaseStartupControl = z.infer<typeof databaseStartupControlSchema>;
162
+
163
+ /** 迁移可手动重试;已部分装配服务或损坏/失联时通过退出重开恢复,避免重复启动副作用。 */
164
+ export function canRetryDatabaseStartup(
165
+ state: Pick<DatabaseStartupState, "phase" | "failedPhase" | "errorCode">,
166
+ ): boolean {
167
+ return (
168
+ state.phase === "failed" &&
169
+ state.failedPhase !== "starting_services" &&
170
+ ![
171
+ "corrupt",
172
+ "checksum_mismatch",
173
+ "transport_closed",
174
+ "startup_status_timeout",
175
+ "unsupported_runtime",
176
+ ].includes(state.errorCode ?? "sql_failed")
177
+ );
178
+ }
@@ -0,0 +1,63 @@
1
+ import type { ZCodeRuntimeEnv } from "./runtimeEnv.js";
2
+
3
+ export type ZCodeEnv = "test" | "production";
4
+ /** 安装包身份:决定应用名、app id、Electron 数据目录与更新策略;与后端环境 `ZCodeEnv` 是两个轴。 */
5
+ export type ZCodeProductFlavor = "production" | "preview";
6
+ export type ArmsRumEnv = "local" | "prod";
7
+
8
+ // 非构建环境(如 e2e 测试的 mocha)下 define 不存在,用 typeof 检查 + fallback 避免 ReferenceError
9
+ declare const __ZCODE_ENV__: string;
10
+ declare const __ZCODE_PRODUCT_FLAVOR__: string;
11
+
12
+ export function normalizeZCodeEnv(value: string | undefined): ZCodeEnv {
13
+ return value?.trim().toLowerCase() === "production" ? "production" : "test";
14
+ }
15
+
16
+ export const ZCODE_ENV = normalizeZCodeEnv(
17
+ typeof __ZCODE_ENV__ !== "undefined" ? __ZCODE_ENV__ : undefined,
18
+ );
19
+
20
+ /**
21
+ * 身份缺省跟随后端环境(test → preview,production → production)。
22
+ * 桌面构建通过 `ZCODE_PREVIEW_IDENTITY=1` 显式注入 preview,得到连接生产后端的 Preview 包;
23
+ * 未注入 define 的 bundle(web、CLI、测试)沿用旧的单轴语义。
24
+ */
25
+ export function normalizeZCodeProductFlavor(
26
+ value: string | undefined,
27
+ zcodeEnv: ZCodeEnv,
28
+ ): ZCodeProductFlavor {
29
+ const normalized = value?.trim().toLowerCase();
30
+ if (normalized === "production" || normalized === "preview") {
31
+ return normalized;
32
+ }
33
+ return zcodeEnv === "production" ? "production" : "preview";
34
+ }
35
+
36
+ export const ZCODE_PRODUCT_FLAVOR = normalizeZCodeProductFlavor(
37
+ typeof __ZCODE_PRODUCT_FLAVOR__ !== "undefined" ? __ZCODE_PRODUCT_FLAVOR__ : undefined,
38
+ ZCODE_ENV,
39
+ );
40
+ export const ZCODE_APP_VERSION_ENV = "ZCODE_APP_VERSION" as const;
41
+ export const ZCODE_BUILD_COMMIT_ID_ENV = "ZCODE_BUILD_COMMIT_ID" as const;
42
+
43
+ // ── 运行时环境变量(不经过编译打包,启动时从 process.env 读取) ──
44
+ // 启用调试模式,值为 inspect-brk 的端口号,如 ZCODE_DEBUG=9230
45
+ export const RUNTIME_ZCODE_DEBUG =
46
+ typeof process !== "undefined" ? process.env.ZCODE_DEBUG : undefined;
47
+
48
+ // 恢复原因:写死 false 会让运行时已配置的数仓/ARMS 永远空转。
49
+ // 功能保持可用;实际出网由各出口的运行时端点检查决定,未配置不上报。
50
+ export const ZCODE_TELEMETRY_ENABLED: boolean = true;
51
+
52
+ /** 数仓事件上报端点:由运行时环境变量提供,未配置即停用,构建产物不内嵌。 */
53
+ export const ZCODE_TELEMETRY_REPORT_ENDPOINT =
54
+ typeof process !== "undefined" ? (process.env.ZCODE_TELEMETRY_REPORT_ENDPOINT ?? "") : "";
55
+
56
+ /** ARMS RUM 接入端点:由运行时环境变量提供,未配置即停用,构建产物不内嵌。 */
57
+ export const ZCODE_ARMS_RUM_ENDPOINT =
58
+ typeof process !== "undefined" ? (process.env.ZCODE_ARMS_RUM_ENDPOINT ?? "") : "";
59
+
60
+ /** 将本地运行态与编译期 ZCODE_ENV 映射为 ARMS 控制台识别的上报环境标签 */
61
+ export function mapZCodeEnvToArmsRumEnv(runtimeEnv: ZCodeRuntimeEnv): ArmsRumEnv {
62
+ return runtimeEnv !== "development" && ZCODE_ENV === "production" ? "prod" : "local";
63
+ }
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+
3
+ const OUTPUT_PREVIEW_MAX_CHARACTERS = 4096;
4
+ /** 两端共用的 Bash 有界输出内容;不包含 replayable 传输恢复状态。 */
5
+ export const executionOutputPreviewSchema = z
6
+ .object({
7
+ text: z.string().max(OUTPUT_PREVIEW_MAX_CHARACTERS),
8
+ fullText: z.string().max(OUTPUT_PREVIEW_MAX_CHARACTERS),
9
+ totalLines: z.number().int().nonnegative(),
10
+ totalBytes: z.number().int().nonnegative(),
11
+ linesEstimated: z.boolean(),
12
+ })
13
+ .strict();
14
+ export type ExecutionOutputPreview = z.infer<typeof executionOutputPreviewSchema>;