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.
- package/LICENSE +21 -0
- package/NOTICE.md +29 -0
- package/README.md +112 -2
- package/client/account.tsx +827 -0
- package/client/diagnostics.tsx +379 -0
- package/client/runtime.tsx +296 -0
- package/client/settings.tsx +84 -0
- package/client/value.tsx +20 -0
- package/icon.svg +1 -0
- package/index.client.tsx +22 -0
- package/index.server.ts +39 -0
- package/package.json +77 -4
- package/paseo-plugin.json +6 -0
- package/server/account.ts +781 -0
- package/server/attachments.ts +150 -0
- package/server/build-info.ts +2 -0
- package/server/conversation.ts +319 -0
- package/server/diagnostics.ts +252 -0
- package/server/discovery/discover.ts +225 -0
- package/server/discovery/manifest.ts +36 -0
- package/server/discovery/types.ts +30 -0
- package/server/errors.ts +36 -0
- package/server/host/bridge.ts +490 -0
- package/server/host/schemas.ts +119 -0
- package/server/logger.ts +19 -0
- package/server/mapping.ts +270 -0
- package/server/models.ts +68 -0
- package/server/persistence.ts +146 -0
- package/server/presentation.ts +470 -0
- package/server/provider-status.ts +81 -0
- package/server/provider.ts +838 -0
- package/server/runtime/managed.ts +501 -0
- package/server/runtime/pins.ts +72 -0
- package/server/runtime-setup.ts +77 -0
- package/server/session-types.ts +49 -0
- package/server/session.ts +866 -0
- package/server/status.ts +89 -0
- package/server/timeline.ts +18 -0
- package/server/usage.ts +362 -0
- package/server/vendor/zcode/LICENSE +202 -0
- package/server/vendor/zcode/NOTICE.md +70 -0
- package/server/vendor/zcode/THIRD-PARTY-NOTICES.md +37 -0
- package/server/vendor/zcode/packages/model-option-map/src/compiler.ts +92 -0
- package/server/vendor/zcode/packages/model-option-map/src/evaluator.ts +214 -0
- package/server/vendor/zcode/packages/model-option-map/src/index.ts +5 -0
- package/server/vendor/zcode/packages/model-option-map/src/merge-patch.ts +97 -0
- package/server/vendor/zcode/packages/model-option-map/src/option-maps.ts +42 -0
- package/server/vendor/zcode/packages/model-option-map/src/parser.ts +240 -0
- package/server/vendor/zcode/packages/model-option-map/src/tokenizer.ts +141 -0
- package/server/vendor/zcode/packages/model-option-map/src/types.ts +36 -0
- package/server/vendor/zcode/packages/rpc/src/buffer.ts +88 -0
- package/server/vendor/zcode/packages/rpc/src/channelClient.ts +275 -0
- package/server/vendor/zcode/packages/rpc/src/channelServer.ts +283 -0
- package/server/vendor/zcode/packages/rpc/src/channels.shared.ts +66 -0
- package/server/vendor/zcode/packages/rpc/src/channels.ts +4 -0
- package/server/vendor/zcode/packages/rpc/src/delayedChannel.ts +17 -0
- package/server/vendor/zcode/packages/rpc/src/foundation.ts +260 -0
- package/server/vendor/zcode/packages/rpc/src/protocol.ts +397 -0
- package/server/vendor/zcode/packages/rpc/src/proxy-channel.ts +213 -0
- package/server/vendor/zcode/packages/rpc/src/serialization.ts +291 -0
- package/server/vendor/zcode/packages/shared/src/account-provider-state.ts +13 -0
- package/server/vendor/zcode/packages/shared/src/background-bash-output.ts +24 -0
- package/server/vendor/zcode/packages/shared/src/background-task-controls.ts +404 -0
- package/server/vendor/zcode/packages/shared/src/bash-output-display.ts +11 -0
- package/server/vendor/zcode/packages/shared/src/bots.ts +558 -0
- package/server/vendor/zcode/packages/shared/src/browser-use/backend.ts +80 -0
- package/server/vendor/zcode/packages/shared/src/browser-use/command-metadata.ts +170 -0
- package/server/vendor/zcode/packages/shared/src/browser-use/commands.ts +588 -0
- package/server/vendor/zcode/packages/shared/src/browser-use/result.ts +130 -0
- package/server/vendor/zcode/packages/shared/src/browser-use/snapshot.ts +77 -0
- package/server/vendor/zcode/packages/shared/src/command-types.ts +96 -0
- package/server/vendor/zcode/packages/shared/src/config-schema.ts +8 -0
- package/server/vendor/zcode/packages/shared/src/cuaAccessibilitySettings.ts +41 -0
- package/server/vendor/zcode/packages/shared/src/database-startup.ts +178 -0
- package/server/vendor/zcode/packages/shared/src/env.ts +63 -0
- package/server/vendor/zcode/packages/shared/src/execution-output-preview.ts +14 -0
- package/server/vendor/zcode/packages/shared/src/localTtft.ts +192 -0
- package/server/vendor/zcode/packages/shared/src/model-config.ts +123 -0
- package/server/vendor/zcode/packages/shared/src/model-execution.ts +23 -0
- package/server/vendor/zcode/packages/shared/src/model-provider-family.ts +171 -0
- package/server/vendor/zcode/packages/shared/src/model-provider-types.ts +81 -0
- package/server/vendor/zcode/packages/shared/src/model-selection.ts +60 -0
- package/server/vendor/zcode/packages/shared/src/oauth.ts +203 -0
- package/server/vendor/zcode/packages/shared/src/official-mcp-auth.ts +272 -0
- package/server/vendor/zcode/packages/shared/src/official-mcp-tool-error.ts +68 -0
- package/server/vendor/zcode/packages/shared/src/process-diagnostic.ts +42 -0
- package/server/vendor/zcode/packages/shared/src/protocol.ts +369 -0
- package/server/vendor/zcode/packages/shared/src/provider-family-connection-selection.ts +32 -0
- package/server/vendor/zcode/packages/shared/src/remoteAssetInstallMode.ts +11 -0
- package/server/vendor/zcode/packages/shared/src/remoteResourcePackages.ts +91 -0
- package/server/vendor/zcode/packages/shared/src/runtimeEnv.ts +315 -0
- package/server/vendor/zcode/packages/shared/src/settings-source.ts +10 -0
- package/server/vendor/zcode/packages/shared/src/usage-quota.ts +74 -0
- package/server/vendor/zcode/packages/shared/src/usage-stats.ts +462 -0
- package/server/vendor/zcode/packages/shared/src/validationAppSettings.ts +562 -0
- package/server/vendor/zcode/packages/shared/src/workspacePurpose.ts +2 -0
- package/server/vendor/zcode/packages/shared/src/wslUserValidation.ts +33 -0
- package/server/vendor/zcode/packages/shared/src/zcode-agent-policy.ts +25 -0
- package/server/vendor/zcode/packages/shared/src/zcode-media-policy.ts +10 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol/index.ts +3720 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-legacy-types.ts +529 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/apply.ts +218 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/attachment-ref.ts +14 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/command.ts +482 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/core.ts +100 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/create-workflow-display.ts +156 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/cuaPermission.ts +41 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/delta.ts +147 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/input-intent.ts +69 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/rows.ts +432 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/session-config.ts +43 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index-workflow-activity.ts +195 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index.ts +85 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-import.ts +38 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-ref.ts +10 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/snapshot.ts +509 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/submission.ts +5 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/toolDisplay.ts +264 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/transport.ts +1152 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-assembler.ts +574 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-binary.ts +65 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-codec.ts +240 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-fault.ts +39 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire.ts +159 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-artifacts.ts +291 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-observation-display.ts +281 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-row-meta.ts +163 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-run-settings-command.ts +62 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs-delta.ts +517 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs.ts +512 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-config.ts +81 -0
- package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-hook-review.ts +210 -0
- package/server/vendor/zcode/packages/shared/src/zcode-task-mode-schema.ts +6 -0
- package/server/vendor/zcode/packages/shared/src/zcode-task-types-core.ts +1187 -0
- package/server/vendor/zcode/packages/shared/src/zcodeEndpoint.ts +296 -0
- package/server/vendor/zcode/provenance.json +405 -0
- package/shared/account.ts +201 -0
- package/shared/diagnostics.ts +52 -0
- package/shared/runtime-setup.ts +73 -0
- package/vendor/acp-registry/LICENSE +176 -0
- package/vendor/paseo/LICENSE +211 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
export const ZCODE_RUNTIME_ENV_KEY = "ZCODE_RUNTIME_ENV";
|
|
2
|
+
export const ZCODE_HTTP_PROXY_ENV_KEY = "ZCODE_HTTP_PROXY";
|
|
3
|
+
export const ZCODE_NO_PROXY_ENV_KEY = "ZCODE_NO_PROXY";
|
|
4
|
+
/** Desktop Host 只向 desktop-attached remote server 传递一次的网络配置。 */
|
|
5
|
+
export const ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY_ENV_KEY =
|
|
6
|
+
"ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY";
|
|
7
|
+
export const ZCODE_REMOTE_HTTP_PROXY_ENV_KEY = "ZCODE_REMOTE_HTTP_PROXY";
|
|
8
|
+
export const ZCODE_REMOTE_NO_PROXY_ENV_KEY = "ZCODE_REMOTE_NO_PROXY";
|
|
9
|
+
export const ZCODE_AGENT_CA_CERT_ENV_KEY = "ZCODE_AGENT_CA_CERT";
|
|
10
|
+
export const ZCODE_TOOL_ENV_PASSTHROUGH_ENV_KEY = "ZCODE_TOOL_ENV_PASSTHROUGH_JSON";
|
|
11
|
+
/** Desktop Main 将服务端裁决的单功能灰度结果传给 Local/Remote Host。 */
|
|
12
|
+
export const ZCODE_DESKTOP_CONTEXT_PROMPT_ENABLED_ENV = "ZCODE_DESKTOP_CONTEXT_PROMPT_ENABLED";
|
|
13
|
+
export const ZCODE_CUA_PRODUCT_HELPER_ENV_KEY = "ZCODE_CUA_PRODUCT_HELPER";
|
|
14
|
+
export const ZCODE_CUA_BROKER_SOCKET_ENV_KEY = "ZCODE_CUA_PERMISSION_BROKER_SOCKET";
|
|
15
|
+
/** Shared node_repl host marker; unlike the broker bearer values it is not a secret. */
|
|
16
|
+
export const ZCODE_CUA_NODE_REPL_HOST_ENV_KEY = "ZCODE_CUA_NODE_REPL_HOST";
|
|
17
|
+
// One-knob local-development bundle. Setting ZCODE_CUA_DEV_MODE implies the internal feature
|
|
18
|
+
// flag (below) plus the local-helper relaxations wired in packages/services (unsigned/
|
|
19
|
+
// unauthenticated local helper, dev install variant, "Dev.app" naming). It exists so a developer
|
|
20
|
+
// can launch the full local CUA loop with a single env var instead of the historical four-var
|
|
21
|
+
// incantation. 这些开关只在未打包本地构建生效;正式 desktop/Helper bundle 会在编译期关闭并在
|
|
22
|
+
// main→host 边界删除,不能用于 signed release 的 runtime override。
|
|
23
|
+
export const ZCODE_CUA_DEV_MODE_ENV_KEY = "ZCODE_CUA_DEV_MODE";
|
|
24
|
+
|
|
25
|
+
export type ZCodeRuntimeEnv = "development" | "production" | "test";
|
|
26
|
+
|
|
27
|
+
type EnvRecord = Record<string, string | undefined>;
|
|
28
|
+
|
|
29
|
+
export function isCuaDevModeRequested(env: EnvRecord = process.env): boolean {
|
|
30
|
+
const explicit = env[ZCODE_CUA_DEV_MODE_ENV_KEY]?.trim().toLowerCase();
|
|
31
|
+
return explicit === "1" || explicit === "true" || explicit === "on";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isZCodeCuaInternalFeatureEnabled(env: EnvRecord = process.env): boolean {
|
|
35
|
+
// CUA 现已默认打包进正式版(plugin staged + Helper enabled),不再需要显式 env flag。
|
|
36
|
+
// DEV_MODE 仍然 implied(开发一键),PRODUCT_HELPER=0/off/false 可显式关闭。
|
|
37
|
+
if (isCuaDevModeRequested(env)) return true;
|
|
38
|
+
const explicit = env[ZCODE_CUA_PRODUCT_HELPER_ENV_KEY]?.trim().toLowerCase();
|
|
39
|
+
if (explicit === "0" || explicit === "false" || explicit === "off") return false;
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const SANITIZED_RUNTIME_ENV_KEYS = [
|
|
44
|
+
"NODE_ENV",
|
|
45
|
+
"ELECTRON_RUN_AS_NODE",
|
|
46
|
+
"NODE_NO_WARNINGS",
|
|
47
|
+
"HTTP_PROXY",
|
|
48
|
+
"HTTPS_PROXY",
|
|
49
|
+
"ALL_PROXY",
|
|
50
|
+
"NO_PROXY",
|
|
51
|
+
"NODE_EXTRA_CA_CERTS",
|
|
52
|
+
"SSL_CERT_FILE",
|
|
53
|
+
"SSL_CERT_DIR",
|
|
54
|
+
"REQUESTS_CA_BUNDLE",
|
|
55
|
+
"CURL_CA_BUNDLE",
|
|
56
|
+
"GIT_SSL_CAINFO",
|
|
57
|
+
ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY_ENV_KEY,
|
|
58
|
+
ZCODE_REMOTE_HTTP_PROXY_ENV_KEY,
|
|
59
|
+
ZCODE_REMOTE_NO_PROXY_ENV_KEY,
|
|
60
|
+
// CUA broker socket 是只该给目标 zcode-cua MCP server 的连接材料(由 desktop/CLI 在
|
|
61
|
+
// 解析该 server 时定向注入其 env)。绝不能随 agent 全局 env 泄漏给其它 MCP server / Bash / tool
|
|
62
|
+
// 子进程 —— 否则同 agent 内的恶意 MCP 或被 prompt-injection 触发的命令能直接驱动
|
|
63
|
+
// 已授权 Helper(confused-deputy)。这里统一从所有子进程 env 剔除;zcode-cua server 的定向
|
|
64
|
+
// env 注入在 buildMcpStdioEnv 之后 spread,因此仍能拿到(见 adapters/mcp StdioClientTransport)。
|
|
65
|
+
ZCODE_CUA_BROKER_SOCKET_ENV_KEY,
|
|
66
|
+
// 遗留 bearer token:当前 broker 是 identity 模式(socket + authority,无口令,见
|
|
67
|
+
// captureZCodeCuaBrokerCredentials),本进程不再产生也不再消费它。仍然剔除,因为用户机上
|
|
68
|
+
// 可能装着旧版 Helper —— 那些版本认 bearer token,一旦这个变量随 agent 全局 env 漏给别的
|
|
69
|
+
// MCP server / Bash 子进程,同一个 confused-deputy 又成立。剔除一个已不用的键是零成本的。
|
|
70
|
+
"ZCODE_CUA_PERMISSION_BROKER_TOKEN",
|
|
71
|
+
"ZCODE_CUA_PERMISSION_BROKER_REFRESH_MARKER",
|
|
72
|
+
"ZCODE_CUA_PLUGIN_AUTHORITY",
|
|
73
|
+
// Agent OTLP Endpoint/Auth/Identity 只属于 CLI telemetry bootstrap,不能继续泄漏给
|
|
74
|
+
// Bash、MCP 或模型工具子进程。sanitize 前会捕获到本进程私有 Map,供 Agent 启动边界读取。
|
|
75
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT",
|
|
76
|
+
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
|
77
|
+
"OTEL_EXPORTER_OTLP_HEADERS",
|
|
78
|
+
"OTEL_EXPORTER_OTLP_TRACES_HEADERS",
|
|
79
|
+
"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT",
|
|
80
|
+
"OTEL_EXPORTER_OTLP_METRICS_HEADERS",
|
|
81
|
+
"OTEL_SERVICE_NAME",
|
|
82
|
+
"OTEL_RESOURCE_ATTRIBUTES",
|
|
83
|
+
"OTEL_EXPORTER_OTLP_COMPRESSION",
|
|
84
|
+
"ZCODE_MODEL_TELEMETRY_ENABLED",
|
|
85
|
+
"ZCODE_TELEMETRY_DEVICE_MID",
|
|
86
|
+
// 历史身份变量不再受支持,但仍须从所有子进程环境剔除,避免旧配置把原始账号
|
|
87
|
+
// 或可伪造 hash 泄漏给 Host、Bash 与 MCP。
|
|
88
|
+
"ZCODE_TELEMETRY_USER_ID",
|
|
89
|
+
"ZCODE_TELEMETRY_USER_ID_HASH",
|
|
90
|
+
"ZCODE_TELEMETRY_USER_SUBJECT_ID",
|
|
91
|
+
"ZCODE_TELEMETRY_IDENTITY_STATE",
|
|
92
|
+
"ZCODE_TELEMETRY_RUNTIME_SURFACE",
|
|
93
|
+
"ZCODE_TELEMETRY_RUNTIME_DISTRIBUTION",
|
|
94
|
+
] as const;
|
|
95
|
+
|
|
96
|
+
const NON_TOOL_PASSTHROUGH_RUNTIME_ENV_KEYS = [
|
|
97
|
+
"NODE_ENV",
|
|
98
|
+
"ELECTRON_RUN_AS_NODE",
|
|
99
|
+
"NODE_NO_WARNINGS",
|
|
100
|
+
// CUA broker 凭据不得经 tool-env-passthrough 恢复到 Bash/tool 子进程(否则等于绕过上面的剔除)。
|
|
101
|
+
ZCODE_CUA_BROKER_SOCKET_ENV_KEY,
|
|
102
|
+
"ZCODE_CUA_PERMISSION_BROKER_REFRESH_MARKER",
|
|
103
|
+
"ZCODE_CUA_PLUGIN_AUTHORITY",
|
|
104
|
+
ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY_ENV_KEY,
|
|
105
|
+
ZCODE_REMOTE_HTTP_PROXY_ENV_KEY,
|
|
106
|
+
ZCODE_REMOTE_NO_PROXY_ENV_KEY,
|
|
107
|
+
] as const;
|
|
108
|
+
|
|
109
|
+
const SANITIZED_PACKAGE_MANAGER_ENV_PATTERN =
|
|
110
|
+
/^(npm_config|yarn|pnpm)_(http_proxy|https_proxy|proxy|all_proxy|no_proxy|cafile|ca)$/i;
|
|
111
|
+
|
|
112
|
+
export function normalizeZCodeRuntimeEnv(value: string | undefined): ZCodeRuntimeEnv | undefined {
|
|
113
|
+
const normalized = value?.trim().toLowerCase();
|
|
114
|
+
if (normalized === "development" || normalized === "production" || normalized === "test") {
|
|
115
|
+
return normalized;
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function resolveZCodeRuntimeEnv(
|
|
121
|
+
env: Record<string, string | undefined>,
|
|
122
|
+
fallback: ZCodeRuntimeEnv = "production",
|
|
123
|
+
): ZCodeRuntimeEnv {
|
|
124
|
+
return normalizeZCodeRuntimeEnv(env[ZCODE_RUNTIME_ENV_KEY]) ?? fallback;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Exported so services/node.ts can inject the Helper's plugin authority into the agent spawn env
|
|
128
|
+
// (mirrors feat; the agent-side plugin host verifies the broker authority via this env var).
|
|
129
|
+
export const ZCODE_CUA_PLUGIN_AUTHORITY_ENV_KEY = "ZCODE_CUA_PLUGIN_AUTHORITY";
|
|
130
|
+
|
|
131
|
+
interface CapturedCuaBrokerCredentials {
|
|
132
|
+
socket: string;
|
|
133
|
+
pluginAuthority: string;
|
|
134
|
+
refreshMarker?: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let capturedCuaBrokerCredentials: Readonly<CapturedCuaBrokerCredentials> | undefined;
|
|
138
|
+
const capturedZCodeAgentTelemetryEnv: Record<string, string> = {};
|
|
139
|
+
|
|
140
|
+
// CUA broker socket 会被上面的 sanitize 从子进程 env 中剔除(confused-deputy 防护 —— 不能让
|
|
141
|
+
// 其它 MCP server / Bash / tool 子进程直接驱动已授权 Helper)。但 CLI 入口在 bootstrap
|
|
142
|
+
// 解析全局 ~/.zcode/cli/config.json 里的 `zcode-cua` server 之前就会先 sanitize process.env,导致
|
|
143
|
+
// 定向注入时已经读不到凭据 → 全局 zcode-cua 回退 `--backend auto`,让 Python/uvx 成为 TCC 主体
|
|
144
|
+
// (fail-open,违反 "Python/uvx must never become the implicit permission owner")。因此在剔除前把
|
|
145
|
+
// 凭据捕获进本进程私有存储,只经 getCapturedZCodeCuaBrokerCredentials() 暴露给 bootstrap 的定向
|
|
146
|
+
// 注入路径,绝不写回任何子进程 env。
|
|
147
|
+
function captureZCodeCuaBrokerCredentials(env: Record<string, string | undefined>): void {
|
|
148
|
+
const socket = env[ZCODE_CUA_BROKER_SOCKET_ENV_KEY]?.trim();
|
|
149
|
+
const pluginAuthority = env[ZCODE_CUA_PLUGIN_AUTHORITY_ENV_KEY]?.trim();
|
|
150
|
+
const refreshMarker = env["ZCODE_CUA_PERMISSION_BROKER_REFRESH_MARKER"]?.trim();
|
|
151
|
+
// 连接没有口令:socket + authority(config-provenance 随机数)同批出现才构成有效凭据组;
|
|
152
|
+
// 半组说明上游注入不完整或正在轮换。
|
|
153
|
+
if (socket && pluginAuthority) {
|
|
154
|
+
capturedCuaBrokerCredentials = Object.freeze({
|
|
155
|
+
socket,
|
|
156
|
+
pluginAuthority,
|
|
157
|
+
...(refreshMarker ? { refreshMarker } : {}),
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (socket || pluginAuthority) {
|
|
162
|
+
// 发现半组凭据说明上游注入不完整或正在轮换;清掉旧快照并 fail-closed,不能复用另一半。
|
|
163
|
+
capturedCuaBrokerCredentials = undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function captureZCodeAgentTelemetryEnv(env: Record<string, string | undefined>): void {
|
|
168
|
+
Object.assign(capturedZCodeAgentTelemetryEnv, readZCodeAgentTelemetryEnv(env));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* 只提取供 Agent telemetry bootstrap 使用的配置。宿主可在经过通用 env 清洗后,
|
|
173
|
+
* 将这组值定向传给 host/Agent;不得把它并入 Bash/MCP 的 tool env。
|
|
174
|
+
*/
|
|
175
|
+
export function readZCodeAgentTelemetryEnv(
|
|
176
|
+
env: Record<string, string | undefined>,
|
|
177
|
+
): Record<string, string> {
|
|
178
|
+
const telemetryEnv: Record<string, string> = {};
|
|
179
|
+
for (const key of SANITIZED_RUNTIME_ENV_KEYS) {
|
|
180
|
+
if (!isZCodeAgentTelemetryEnvKey(key)) continue;
|
|
181
|
+
const value = env[key]?.trim();
|
|
182
|
+
if (value) telemetryEnv[key] = value;
|
|
183
|
+
}
|
|
184
|
+
return telemetryEnv;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function getCapturedZCodeAgentTelemetryEnv(): Record<string, string> {
|
|
188
|
+
return { ...capturedZCodeAgentTelemetryEnv };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function getCapturedZCodeCuaBrokerCredentials(): {
|
|
192
|
+
socket: string | undefined;
|
|
193
|
+
pluginAuthority: string | undefined;
|
|
194
|
+
refreshMarker?: string;
|
|
195
|
+
} {
|
|
196
|
+
return capturedCuaBrokerCredentials
|
|
197
|
+
? { ...capturedCuaBrokerCredentials }
|
|
198
|
+
: { socket: undefined, pluginAuthority: undefined };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// 仅供测试重置进程内捕获状态。
|
|
202
|
+
export function resetCapturedZCodeCuaBrokerCredentialsForTest(): void {
|
|
203
|
+
capturedCuaBrokerCredentials = undefined;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function resetCapturedZCodeAgentTelemetryEnvForTest(): void {
|
|
207
|
+
for (const key of Object.keys(capturedZCodeAgentTelemetryEnv)) {
|
|
208
|
+
delete capturedZCodeAgentTelemetryEnv[key];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function sanitizeZCodeRuntimeEnv<T extends Record<string, string | undefined>>(
|
|
213
|
+
env: T,
|
|
214
|
+
): Record<string, string> {
|
|
215
|
+
captureZCodeCuaBrokerCredentials(env);
|
|
216
|
+
captureZCodeAgentTelemetryEnv(env);
|
|
217
|
+
const sanitized: Record<string, string> = {};
|
|
218
|
+
for (const [key, value] of Object.entries(env)) {
|
|
219
|
+
if (value === undefined || shouldSanitizeZCodeRuntimeEnvKey(key)) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
sanitized[key] = value;
|
|
223
|
+
}
|
|
224
|
+
return sanitized;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function buildZCodeToolEnvPassthroughEnv(env: EnvRecord): Record<string, string> {
|
|
228
|
+
const captured = readZCodeToolEnvPassthroughEnv(env);
|
|
229
|
+
|
|
230
|
+
for (const [key, value] of Object.entries(env)) {
|
|
231
|
+
if (value === undefined || !shouldCaptureZCodeToolEnvPassthroughKey(key)) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
captured[key] = value;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return stringifyZCodeToolEnvPassthroughEnv(captured);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function readZCodeToolEnvPassthroughEnv(env: EnvRecord): Record<string, string> {
|
|
241
|
+
const raw = env[ZCODE_TOOL_ENV_PASSTHROUGH_ENV_KEY];
|
|
242
|
+
if (!raw) {
|
|
243
|
+
return {};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
try {
|
|
247
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
248
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
249
|
+
return {};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const captured: Record<string, string> = {};
|
|
253
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
254
|
+
if (
|
|
255
|
+
typeof value === "string" &&
|
|
256
|
+
/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) &&
|
|
257
|
+
shouldCaptureZCodeToolEnvPassthroughKey(key)
|
|
258
|
+
) {
|
|
259
|
+
captured[key] = value;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return captured;
|
|
263
|
+
} catch {
|
|
264
|
+
return {};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function sanitizeZCodeRuntimeEnvInPlace(env: Record<string, string | undefined>): void {
|
|
269
|
+
captureZCodeCuaBrokerCredentials(env);
|
|
270
|
+
captureZCodeAgentTelemetryEnv(env);
|
|
271
|
+
for (const key of Object.keys(env)) {
|
|
272
|
+
if (shouldSanitizeZCodeRuntimeEnvKey(key)) {
|
|
273
|
+
delete env[key];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function isZCodeAgentTelemetryEnvKey(key: string): boolean {
|
|
279
|
+
return (
|
|
280
|
+
key.startsWith("OTEL_") ||
|
|
281
|
+
key.startsWith("ZCODE_TELEMETRY_") ||
|
|
282
|
+
key === "ZCODE_MODEL_TELEMETRY_ENABLED"
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export function shouldSanitizeZCodeRuntimeEnvKey(key: string): boolean {
|
|
287
|
+
const upperKey = key.toUpperCase();
|
|
288
|
+
return (
|
|
289
|
+
SANITIZED_RUNTIME_ENV_KEYS.some((candidate) => candidate === upperKey) ||
|
|
290
|
+
SANITIZED_PACKAGE_MANAGER_ENV_PATTERN.test(key)
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function shouldCaptureZCodeToolEnvPassthroughKey(key: string): boolean {
|
|
295
|
+
const upperKey = key.toUpperCase();
|
|
296
|
+
if (isZCodeAgentTelemetryEnvKey(upperKey)) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
if (NON_TOOL_PASSTHROUGH_RUNTIME_ENV_KEYS.some((candidate) => candidate === upperKey)) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
return shouldSanitizeZCodeRuntimeEnvKey(key);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function stringifyZCodeToolEnvPassthroughEnv(
|
|
306
|
+
captured: Record<string, string>,
|
|
307
|
+
): Record<string, string> {
|
|
308
|
+
const entries = Object.entries(captured).sort(([left], [right]) => left.localeCompare(right));
|
|
309
|
+
if (entries.length === 0) {
|
|
310
|
+
return {};
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
[ZCODE_TOOL_ENV_PASSTHROUGH_ENV_KEY]: JSON.stringify(Object.fromEntries(entries)),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type SettingsDirectorySource = "zcode" | "agents" | "claude";
|
|
2
|
+
|
|
3
|
+
export type SettingsDirectoryScope = "user" | "project";
|
|
4
|
+
|
|
5
|
+
export interface SettingsDirectoryLocation {
|
|
6
|
+
source: SettingsDirectorySource;
|
|
7
|
+
scope: SettingsDirectoryScope;
|
|
8
|
+
directoryPath: string;
|
|
9
|
+
projectPath?: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coding Plan 额度相关的纯类型定义。
|
|
3
|
+
*
|
|
4
|
+
* 从 usage-stats.ts 拆出:MCP 额度接入后该文件超过 oxlint max-lines(400) 门禁,
|
|
5
|
+
* 而额度是可以独立描述的一组类型(不依赖统计聚合结构),拆出后两边都在门禁内。
|
|
6
|
+
* 这里只依赖自身,usage-stats.ts 单向导入并 re-export,不构成循环依赖。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface UsageQuotaSnapshot {
|
|
10
|
+
level: string | null;
|
|
11
|
+
limits: UsageQuotaLimit[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface UsageQuotaLimit {
|
|
15
|
+
type: string;
|
|
16
|
+
/** Start Plan 服务端额度桶及周期身份;周期时间为毫秒,供提醒去重。 */
|
|
17
|
+
bucketId?: string;
|
|
18
|
+
userPlanId?: string;
|
|
19
|
+
periodStart?: number;
|
|
20
|
+
periodEnd?: number;
|
|
21
|
+
/** 所属 entitlement 的周期类型,如 daily / one_time。 */
|
|
22
|
+
period?: string;
|
|
23
|
+
meter?: string;
|
|
24
|
+
unitType?: string;
|
|
25
|
+
/** Start Plan bucket 所属套餐身份,仅用于设置页按 plan 分组展示。 */
|
|
26
|
+
planId?: string;
|
|
27
|
+
unit?: number;
|
|
28
|
+
number?: number;
|
|
29
|
+
usage?: number;
|
|
30
|
+
currentValue?: number;
|
|
31
|
+
remaining?: number;
|
|
32
|
+
percentage?: number;
|
|
33
|
+
nextResetTime?: number;
|
|
34
|
+
usageDetails: UsageQuotaUsageDetail[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface UsageQuotaUsageDetail {
|
|
38
|
+
modelCode: string;
|
|
39
|
+
displayName?: string;
|
|
40
|
+
usage: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* `aggregate.type` 的合成值。
|
|
45
|
+
*
|
|
46
|
+
* 不复用 TOKENS_LIMIT / TIME_LIMIT:`isSameLimitCategory` 会把 TIME_LIMIT 判为工具额度同类,
|
|
47
|
+
* 让 MCP 汇总额度被现有的 findCodingPlanQuotaLimit 查询误命中。
|
|
48
|
+
*/
|
|
49
|
+
export const MCP_USAGE_QUOTA_LIMIT_TYPE = "MCP_USAGE_LIMIT" as const;
|
|
50
|
+
|
|
51
|
+
/** MCP 额度所属的 Coding Plan 连接,供 UI 判断能否显示在当前 provider tab 下。 */
|
|
52
|
+
export type UsageMcpQuotaScope =
|
|
53
|
+
| {
|
|
54
|
+
providerFamily: "zai" | "bigmodel";
|
|
55
|
+
targetType: "PERSONAL";
|
|
56
|
+
}
|
|
57
|
+
| {
|
|
58
|
+
providerFamily: "zai" | "bigmodel";
|
|
59
|
+
targetType: "TEAM";
|
|
60
|
+
organizationId: string;
|
|
61
|
+
projectId: string;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export interface UsageMcpQuotaSnapshot {
|
|
65
|
+
/** 服务端 server_time,毫秒(接口返回 Unix 秒)。 */
|
|
66
|
+
serverTime: number;
|
|
67
|
+
level: string | null;
|
|
68
|
+
scope: UsageMcpQuotaScope;
|
|
69
|
+
/**
|
|
70
|
+
* 服务端 `total_usage`(总已用 / 总额度 / 总剩余)的等价表达,直接复用现有额度条 / 额度卡的
|
|
71
|
+
* 展示逻辑。注意 percentage 沿用 quota 接口口径:**已使用占比**,展示端负责反转成剩余。
|
|
72
|
+
*/
|
|
73
|
+
aggregate: UsageQuotaLimit;
|
|
74
|
+
}
|