berry-agent 0.1.0-alpha.1
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/README.md +96 -0
- package/dist/.api-emit.stamp +1 -0
- package/dist/.build-meta.json +6 -0
- package/dist/agent/events.js +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/loop.js +139 -0
- package/dist/agent/queue.js +119 -0
- package/dist/agent/stream.js +62 -0
- package/dist/agent/tools-batch.js +221 -0
- package/dist/agent/types.js +8 -0
- package/dist/api/berry-agent-llm.d.ts +18 -0
- package/dist/api/berry-agent.d.ts +9 -0
- package/dist/api/surface.json +1632 -0
- package/dist/api/tsconfig.paths.json +12 -0
- package/dist/api/typebox-compile.d.ts +2 -0
- package/dist/api/typebox-value.d.ts +2 -0
- package/dist/api/typebox.d.ts +2 -0
- package/dist/browser/cdp.js +256 -0
- package/dist/browser/codes.js +31 -0
- package/dist/browser/discover.js +107 -0
- package/dist/browser/engine.js +169 -0
- package/dist/browser/index.js +17 -0
- package/dist/browser/install.js +342 -0
- package/dist/browser/page.js +321 -0
- package/dist/browser/service.js +158 -0
- package/dist/browser/tools.js +198 -0
- package/dist/browser/types.js +81 -0
- package/dist/channels/ask-queue.js +82 -0
- package/dist/channels/commands.js +129 -0
- package/dist/channels/engine/cell.js +143 -0
- package/dist/channels/engine/diff.js +143 -0
- package/dist/channels/engine/engine.js +416 -0
- package/dist/channels/engine/index.js +8 -0
- package/dist/channels/engine/input-keys.js +86 -0
- package/dist/channels/engine/input.js +596 -0
- package/dist/channels/engine/memory-io.js +71 -0
- package/dist/channels/engine/process-io.js +38 -0
- package/dist/channels/engine/types.js +17 -0
- package/dist/channels/engine/width.js +122 -0
- package/dist/channels/index.js +15 -0
- package/dist/channels/registry.js +56 -0
- package/dist/channels/sdk/admit.js +29 -0
- package/dist/channels/sdk/backend.js +102 -0
- package/dist/channels/sdk/cursor.js +56 -0
- package/dist/channels/sdk/index.js +20 -0
- package/dist/channels/sdk/jsonl.js +208 -0
- package/dist/channels/sdk/protocol.js +24 -0
- package/dist/channels/sdk/schema.js +91 -0
- package/dist/channels/sdk/wire-core.js +446 -0
- package/dist/channels/service.js +169 -0
- package/dist/channels/tui/autocomplete/autocomplete.js +42 -0
- package/dist/channels/tui/autocomplete/file-mentions.js +106 -0
- package/dist/channels/tui/autocomplete/popup.js +148 -0
- package/dist/channels/tui/autocomplete/provider.js +7 -0
- package/dist/channels/tui/autocomplete/token.js +68 -0
- package/dist/channels/tui/backend/ansi-rows.js +211 -0
- package/dist/channels/tui/backend/main-screen.js +207 -0
- package/dist/channels/tui/backend/osc.js +91 -0
- package/dist/channels/tui/backend/transcript.js +230 -0
- package/dist/channels/tui/backend/tui-backend.js +915 -0
- package/dist/channels/tui/editor/editor-model.js +543 -0
- package/dist/channels/tui/editor/editor-view.js +140 -0
- package/dist/channels/tui/editor/editor.js +275 -0
- package/dist/channels/tui/editor/undo-stack.js +35 -0
- package/dist/channels/tui/editor/visual-lines.js +126 -0
- package/dist/channels/tui/editor/word-nav.js +106 -0
- package/dist/channels/tui/history/history-viewer.js +403 -0
- package/dist/channels/tui/index.js +3 -0
- package/dist/channels/tui/layout.js +167 -0
- package/dist/channels/tui/markdown/blocks.js +111 -0
- package/dist/channels/tui/markdown/inline.js +75 -0
- package/dist/channels/tui/markdown/markdown.js +182 -0
- package/dist/channels/tui/memory/memory-viewer.js +540 -0
- package/dist/channels/tui/overlay/alt-screen.js +105 -0
- package/dist/channels/tui/overlay/overlay.js +57 -0
- package/dist/channels/tui/overlay/select-confirm.js +156 -0
- package/dist/channels/tui/panels/todo-panel.js +54 -0
- package/dist/channels/tui/panels/tool-progress-panel.js +93 -0
- package/dist/channels/tui/scroll/scroll-view.js +254 -0
- package/dist/channels/tui/status/status-line.js +76 -0
- package/dist/channels/tui/text.js +38 -0
- package/dist/channels/tui/theme.js +41 -0
- package/dist/channels/types.js +11 -0
- package/dist/channels/ui-core.js +209 -0
- package/dist/checkpoint/capture.js +45 -0
- package/dist/checkpoint/codes.js +33 -0
- package/dist/checkpoint/command.js +82 -0
- package/dist/checkpoint/gate.js +48 -0
- package/dist/checkpoint/index.js +20 -0
- package/dist/checkpoint/restore.js +172 -0
- package/dist/checkpoint/store.js +247 -0
- package/dist/checkpoint/types.js +4 -0
- package/dist/checkpoint/walk.js +146 -0
- package/dist/compaction/ccr-tools.js +112 -0
- package/dist/compaction/ccr.js +84 -0
- package/dist/compaction/codes.js +21 -0
- package/dist/compaction/index.js +18 -0
- package/dist/compaction/policy.js +200 -0
- package/dist/compaction/service.js +422 -0
- package/dist/compaction/slots.js +121 -0
- package/dist/compaction/types.js +10 -0
- package/dist/context/codes.js +40 -0
- package/dist/context/events.js +160 -0
- package/dist/context/index.js +13 -0
- package/dist/context/logger.js +136 -0
- package/dist/context/scope.js +182 -0
- package/dist/context/workspace.js +104 -0
- package/dist/contracts/agent-events.d.ts +73 -0
- package/dist/contracts/agent-events.js +16 -0
- package/dist/contracts/api.d.ts +249 -0
- package/dist/contracts/api.js +299 -0
- package/dist/contracts/approval.d.ts +37 -0
- package/dist/contracts/approval.js +9 -0
- package/dist/contracts/env-ref.d.ts +41 -0
- package/dist/contracts/env-ref.js +32 -0
- package/dist/contracts/errors.d.ts +56 -0
- package/dist/contracts/errors.js +266 -0
- package/dist/contracts/events.d.ts +70 -0
- package/dist/contracts/events.js +329 -0
- package/dist/contracts/index.d.ts +32 -0
- package/dist/contracts/index.js +26 -0
- package/dist/contracts/llm.d.ts +275 -0
- package/dist/contracts/llm.js +12 -0
- package/dist/contracts/messages.d.ts +63 -0
- package/dist/contracts/messages.js +65 -0
- package/dist/contracts/redact.d.ts +46 -0
- package/dist/contracts/redact.js +223 -0
- package/dist/contracts/tools.d.ts +197 -0
- package/dist/contracts/tools.js +33 -0
- package/dist/contracts/types.d.ts +302 -0
- package/dist/contracts/types.js +50 -0
- package/dist/contracts/ui.d.ts +122 -0
- package/dist/contracts/ui.js +15 -0
- package/dist/conversation/agent-service.js +61 -0
- package/dist/conversation/approval-wiring.js +82 -0
- package/dist/conversation/backoff.js +38 -0
- package/dist/conversation/codes.js +47 -0
- package/dist/conversation/control-tools.js +102 -0
- package/dist/conversation/control.js +210 -0
- package/dist/conversation/driver.js +922 -0
- package/dist/conversation/index.js +12 -0
- package/dist/conversation/model-visible.js +169 -0
- package/dist/conversation/open-tools.js +126 -0
- package/dist/conversation/reseed.js +132 -0
- package/dist/conversation/sessions.js +215 -0
- package/dist/conversation/todo.js +203 -0
- package/dist/conversation/types.js +35 -0
- package/dist/conversation/wiring.js +204 -0
- package/dist/credentials/codes.js +59 -0
- package/dist/credentials/commands.js +186 -0
- package/dist/credentials/env-ref.js +34 -0
- package/dist/credentials/index.js +28 -0
- package/dist/credentials/migration.js +18 -0
- package/dist/credentials/oauth.js +266 -0
- package/dist/credentials/refresh.js +152 -0
- package/dist/credentials/secrets.js +118 -0
- package/dist/credentials/types.js +30 -0
- package/dist/exec/bash.js +279 -0
- package/dist/exec/codes.js +37 -0
- package/dist/exec/env.js +99 -0
- package/dist/exec/environment.js +39 -0
- package/dist/exec/git-guard.js +623 -0
- package/dist/exec/index.js +24 -0
- package/dist/exec/registry.js +120 -0
- package/dist/exec/spawn.js +281 -0
- package/dist/exec/tail.js +77 -0
- package/dist/exec/types.js +5 -0
- package/dist/goal/codes.js +33 -0
- package/dist/goal/command.js +175 -0
- package/dist/goal/fold.js +121 -0
- package/dist/goal/gates.js +122 -0
- package/dist/goal/index.js +22 -0
- package/dist/goal/migration.js +48 -0
- package/dist/goal/service.js +501 -0
- package/dist/goal/todo-tool.js +174 -0
- package/dist/goal/types.js +1 -0
- package/dist/goal/update-tool.js +46 -0
- package/dist/host/approval-cmd.js +276 -0
- package/dist/host/assembly.js +1146 -0
- package/dist/host/boot-failures.js +104 -0
- package/dist/host/budget-advisory.js +74 -0
- package/dist/host/budget-broadcast.js +50 -0
- package/dist/host/builtins.js +54 -0
- package/dist/host/cli.js +544 -0
- package/dist/host/codes.js +120 -0
- package/dist/host/config-schema.js +195 -0
- package/dist/host/conversation-stack.js +654 -0
- package/dist/host/core-plugins.js +1685 -0
- package/dist/host/credentials-cmd.js +42 -0
- package/dist/host/disclosure.js +30 -0
- package/dist/host/dispatch.js +105 -0
- package/dist/host/doors-cmd.js +154 -0
- package/dist/host/dump-config.js +44 -0
- package/dist/host/hook-dispatch-guard.js +27 -0
- package/dist/host/import-gate.js +153 -0
- package/dist/host/index.js +54 -0
- package/dist/host/issue-session.js +241 -0
- package/dist/host/loader.js +372 -0
- package/dist/host/main.js +161 -0
- package/dist/host/manifest.js +381 -0
- package/dist/host/mcp-entry.js +53 -0
- package/dist/host/plugin-boot.js +952 -0
- package/dist/host/plugin-context.js +672 -0
- package/dist/host/plugin-install.js +480 -0
- package/dist/host/plugin-reload.js +124 -0
- package/dist/host/plugin-store.js +462 -0
- package/dist/host/plugin-tools.js +359 -0
- package/dist/host/plugin-uninstall.js +257 -0
- package/dist/host/plugins-cmd.js +302 -0
- package/dist/host/plugins-command.js +130 -0
- package/dist/host/plugins-config.js +195 -0
- package/dist/host/prompt-sections.js +133 -0
- package/dist/host/run-entry.js +544 -0
- package/dist/host/runtime.js +209 -0
- package/dist/host/scheduler-tick.js +294 -0
- package/dist/host/serve-daemon.js +501 -0
- package/dist/host/serve-entry.js +279 -0
- package/dist/host/session-anchor.js +41 -0
- package/dist/host/sessions-cmd.js +219 -0
- package/dist/host/sessions-face.js +47 -0
- package/dist/host/settings-store.js +112 -0
- package/dist/host/signals.js +69 -0
- package/dist/host/single-instance.js +105 -0
- package/dist/host/subagent-factory.js +291 -0
- package/dist/host/testkit/harness.js +283 -0
- package/dist/host/testkit/index.js +14 -0
- package/dist/host/testkit/matrix.js +302 -0
- package/dist/host/tool-policy-store.js +177 -0
- package/dist/host/triggers.js +212 -0
- package/dist/host/tui-entry.js +216 -0
- package/dist/host/webui-bridge.js +165 -0
- package/dist/issue/codes.js +38 -0
- package/dist/issue/filter.js +146 -0
- package/dist/issue/github.js +116 -0
- package/dist/issue/index.js +17 -0
- package/dist/issue/mount.js +70 -0
- package/dist/issue/poll.js +58 -0
- package/dist/issue/service.js +341 -0
- package/dist/issue/tools.js +70 -0
- package/dist/issue/types.js +34 -0
- package/dist/issue/webhook.js +126 -0
- package/dist/llm/codes.js +77 -0
- package/dist/llm/complete.js +196 -0
- package/dist/llm/events.js +15 -0
- package/dist/llm/index.js +24 -0
- package/dist/llm/inflight.js +65 -0
- package/dist/llm/model-id.js +58 -0
- package/dist/llm/provider-face.d.ts +32 -0
- package/dist/llm/provider-face.js +34 -0
- package/dist/llm/recovery.js +146 -0
- package/dist/llm/runtime.js +46 -0
- package/dist/llm/stream-fn.js +147 -0
- package/dist/lsp/codes.js +31 -0
- package/dist/lsp/connection.js +147 -0
- package/dist/lsp/frame.js +110 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/inject.js +58 -0
- package/dist/lsp/instance.js +264 -0
- package/dist/lsp/service.js +522 -0
- package/dist/lsp/tools.js +53 -0
- package/dist/lsp/types.js +201 -0
- package/dist/mcp/bridge.js +222 -0
- package/dist/mcp/codes.js +21 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/jsonrpc.js +230 -0
- package/dist/mcp/service.js +125 -0
- package/dist/mcp/tools.js +145 -0
- package/dist/mcp/types.js +108 -0
- package/dist/memory/cite.js +131 -0
- package/dist/memory/codes.js +50 -0
- package/dist/memory/command.js +71 -0
- package/dist/memory/consolidate.js +219 -0
- package/dist/memory/cycle.js +109 -0
- package/dist/memory/dao.js +878 -0
- package/dist/memory/diff.js +238 -0
- package/dist/memory/extract.js +181 -0
- package/dist/memory/fts.js +58 -0
- package/dist/memory/index.js +42 -0
- package/dist/memory/inject.js +354 -0
- package/dist/memory/merge.js +178 -0
- package/dist/memory/migration.js +132 -0
- package/dist/memory/pollution.js +59 -0
- package/dist/memory/port.js +385 -0
- package/dist/memory/review.js +201 -0
- package/dist/memory/scan.js +89 -0
- package/dist/memory/tools.js +508 -0
- package/dist/memory/types.js +140 -0
- package/dist/obs/codes.js +38 -0
- package/dist/obs/db.js +115 -0
- package/dist/obs/index.js +20 -0
- package/dist/obs/rollup.js +61 -0
- package/dist/obs/service.js +363 -0
- package/dist/obs/session-tools.js +282 -0
- package/dist/obs/session-view.js +225 -0
- package/dist/obs/tool.js +97 -0
- package/dist/obs/types.js +1 -0
- package/dist/persist/audit.js +63 -0
- package/dist/persist/aux.js +39 -0
- package/dist/persist/codes.js +35 -0
- package/dist/persist/index.js +30 -0
- package/dist/persist/load-history.js +50 -0
- package/dist/persist/migrations.js +37 -0
- package/dist/persist/paths.js +108 -0
- package/dist/persist/persistence.js +229 -0
- package/dist/persist/schema.js +99 -0
- package/dist/persist/secret-box.js +95 -0
- package/dist/persist/store.js +706 -0
- package/dist/persist/write-behind.js +238 -0
- package/dist/safety/approval.js +171 -0
- package/dist/safety/bwrap.js +123 -0
- package/dist/safety/codes.js +57 -0
- package/dist/safety/danger.js +505 -0
- package/dist/safety/gate.js +226 -0
- package/dist/safety/index.js +24 -0
- package/dist/safety/presets.js +73 -0
- package/dist/safety/roots.js +139 -0
- package/dist/safety/sandbox.js +214 -0
- package/dist/safety/seatbelt.js +88 -0
- package/dist/safety/sensitive.js +34 -0
- package/dist/safety/tool-policy.js +203 -0
- package/dist/safety/types.js +13 -0
- package/dist/scheduler/codes.js +54 -0
- package/dist/scheduler/cron-backend.js +135 -0
- package/dist/scheduler/engine.js +280 -0
- package/dist/scheduler/gates.js +60 -0
- package/dist/scheduler/index.js +25 -0
- package/dist/scheduler/migration.js +22 -0
- package/dist/scheduler/runner.js +171 -0
- package/dist/scheduler/schedule.js +193 -0
- package/dist/scheduler/service.js +283 -0
- package/dist/scheduler/tick.js +139 -0
- package/dist/scheduler/types.js +1 -0
- package/dist/sdk/http.js +865 -0
- package/dist/sdk/index.js +22 -0
- package/dist/sdk/mcp.js +289 -0
- package/dist/sdk/plugin-route-registry.js +126 -0
- package/dist/sdk/plugin-routes.js +149 -0
- package/dist/sdk/security.js +116 -0
- package/dist/sdk/types.js +32 -0
- package/dist/session/budget.js +159 -0
- package/dist/session/codes.js +40 -0
- package/dist/session/derive.js +180 -0
- package/dist/session/event-data.js +1 -0
- package/dist/session/fork.js +72 -0
- package/dist/session/import-gates.js +148 -0
- package/dist/session/index.js +18 -0
- package/dist/session/recover.js +103 -0
- package/dist/session/session.js +279 -0
- package/dist/session/snapshot.js +107 -0
- package/dist/skills/agents.js +242 -0
- package/dist/skills/codes.js +51 -0
- package/dist/skills/discovery.js +266 -0
- package/dist/skills/frontmatter.js +215 -0
- package/dist/skills/index.js +28 -0
- package/dist/skills/load.js +118 -0
- package/dist/skills/manage.js +201 -0
- package/dist/skills/registry.js +138 -0
- package/dist/skills/render.js +124 -0
- package/dist/skills/sections.js +171 -0
- package/dist/skills/types.js +21 -0
- package/dist/subagent/codes.js +50 -0
- package/dist/subagent/declarative.js +55 -0
- package/dist/subagent/index.js +19 -0
- package/dist/subagent/notify.js +51 -0
- package/dist/subagent/provide.js +7 -0
- package/dist/subagent/registry.js +149 -0
- package/dist/subagent/service.js +338 -0
- package/dist/subagent/surface.js +44 -0
- package/dist/subagent/tool.js +153 -0
- package/dist/subagent/types.js +25 -0
- package/dist/tools/apply-patch.js +164 -0
- package/dist/tools/codes.js +109 -0
- package/dist/tools/fs.js +501 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/observed.js +99 -0
- package/dist/tools/pipeline.js +176 -0
- package/dist/tools/protected-read.js +54 -0
- package/dist/tools/registry.js +250 -0
- package/dist/tools/search.js +451 -0
- package/dist/tools/worktree.js +327 -0
- package/dist/web/codes.js +37 -0
- package/dist/web/gate.js +43 -0
- package/dist/web/hygiene.js +195 -0
- package/dist/web/index.js +16 -0
- package/dist/web/service.js +207 -0
- package/dist/web/ssrf-guard.js +44 -0
- package/dist/web/tool.js +76 -0
- package/dist/web/types.js +10 -0
- package/dist/webui/assets/index-B-t2O8gh.js +22 -0
- package/dist/webui/assets/index-DOlgSZ9Q.css +2 -0
- package/dist/webui/index.html +14 -0
- package/dist/webui/index.js +14 -0
- package/dist/webui/server.js +549 -0
- package/dist/webui/types.js +38 -0
- package/examples/README.md +26 -0
- package/examples/minimal-code-plugin/entry.js +43 -0
- package/examples/minimal-code-plugin/package.json +12 -0
- package/examples/pure-skill-pack/package.json +14 -0
- package/examples/pure-skill-pack/skills/markdown-table/SKILL.md +32 -0
- package/package.json +86 -0
package/dist/exec/env.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* env 白名单构造(04 §11 deny-by-default:默认零继承宿主环境,声明式变更表)。
|
|
3
|
+
*
|
|
4
|
+
* 「零继承」是凭证泄漏面的结构性封死:宿主环境里的 AWS_/GITHUB_ 等凭证类
|
|
5
|
+
* 变量默认一个都不进子进程——子进程拿到什么完全由显式声明决定。allow 从
|
|
6
|
+
* 宿主环境拷贝白名单变量;set 显式注入(内部调用方);deny 覆盖两面——
|
|
7
|
+
* 命中**显式**请求(allow 名单项/set 注入)即抛 EXEC_ENV_FORBIDDEN 拒静默
|
|
8
|
+
* 继承(fail-loud:显式矛盾必须修声明);命中**缺省**白名单项是常规收窄
|
|
9
|
+
* (静默排除——缺省单是愿望清单,deny 即从愿望里划掉)。
|
|
10
|
+
*
|
|
11
|
+
* 注入腿(03 §10.9——c-4 落码批):set 面值可为凭证引用形
|
|
12
|
+
* `@credentials:<name>`(词面单源 contracts/env-ref.ts)。本函数是展开
|
|
13
|
+
* **唯一执法点**(run/spawnInteractive 两入口同点汇入):引用形经
|
|
14
|
+
* resolveEnvRef 在 spawn 时刻展开为明文,明文只进返回的 env 对象——它
|
|
15
|
+
* 是 child_process.spawn 的 env 实参直达子进程,管道内任何其他面
|
|
16
|
+
* (argv/登记簿/结果/日志)恒不见值。引用形在场而展开器缺席 = 席位
|
|
17
|
+
* 缺席(core:credentials 未装载/禁用)——fail-loud 拒以字面值注入。
|
|
18
|
+
*/
|
|
19
|
+
import { BaseError, parseCredentialEnvRef } from '../contracts/index.js';
|
|
20
|
+
/**
|
|
21
|
+
* 缺省 allow 白名单——shell 可用性最小集(PATH 查找、家目录、locale、终端
|
|
22
|
+
* 与临时目录)。刻意不含凭证类变量(零继承封死)与 XDG_ 族(配置注入面);
|
|
23
|
+
* 装配批按部署形态增删。
|
|
24
|
+
*/
|
|
25
|
+
export const DEFAULT_ENV_ALLOW = [
|
|
26
|
+
'PATH',
|
|
27
|
+
'HOME',
|
|
28
|
+
'SHELL',
|
|
29
|
+
'USER',
|
|
30
|
+
'LOGNAME',
|
|
31
|
+
'LANG',
|
|
32
|
+
'LC_ALL',
|
|
33
|
+
'LC_CTYPE',
|
|
34
|
+
'TERM',
|
|
35
|
+
'TMPDIR',
|
|
36
|
+
'TZ',
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* 构造子进程 env。
|
|
40
|
+
* @param policy 声明式变更表(allow/set/deny)
|
|
41
|
+
* @param hostEnv 宿主环境(拷贝源;测试注入桩)
|
|
42
|
+
* @param resolveEnvRef 凭证引用形展开器(03 §10.9 注入腿——`@credentials:<name>`
|
|
43
|
+
* → host 域明文;真身 = credentials 件 createEnvRefResolver 产物,经 spawn
|
|
44
|
+
* 管道装配注入。缺席 = 引用形 fail-loud 拒〔席位缺席律〕)
|
|
45
|
+
* @returns 子进程 env 对象(零继承基底 + 白名单拷贝 + 显式注入〔引用形已展开〕)
|
|
46
|
+
* @throws EXEC_ENV_FORBIDDEN deny 命中显式 allow 名单项(策略自冲突)或显式
|
|
47
|
+
* set 注入——两处都是「调用方明确要了被拒的东西」,fail-loud 拒静默取舍;
|
|
48
|
+
* deny 命中**缺省**白名单项是常规收窄(静默排除——缺省单是愿望清单非请求)
|
|
49
|
+
* @throws CREDENTIALS_ENV_REF_INVALID set 值引用形坏形(前缀命中而名空)
|
|
50
|
+
* @throws CREDENTIALS_NOT_FOUND 引用形在场而展开器缺席(席位缺席——拒以
|
|
51
|
+
* 字面值注入);或展开器对缺席凭证名抛出(message 指路人面录入路径)
|
|
52
|
+
*/
|
|
53
|
+
export function buildChildEnv(policy = {}, hostEnv = process.env, resolveEnvRef) {
|
|
54
|
+
const explicitAllow = policy.allow;
|
|
55
|
+
const allow = explicitAllow ?? DEFAULT_ENV_ALLOW;
|
|
56
|
+
const deny = new Set(policy.deny ?? []);
|
|
57
|
+
const env = {};
|
|
58
|
+
// 面一:allow 白名单从宿主拷贝(宿主没有的名单项静默跳过——名单是愿望
|
|
59
|
+
// 不是要求)。deny 命中:显式名单 = 策略自冲突 fail-loud;缺省名单 = 收窄
|
|
60
|
+
for (const name of allow) {
|
|
61
|
+
if (deny.has(name)) {
|
|
62
|
+
if (explicitAllow !== undefined) {
|
|
63
|
+
throw new BaseError('EXEC_ENV_FORBIDDEN', `环境变量 ${name} 同时出现在显式 allow 与 deny——策略自冲突,拒绝静默取舍(04 §11 deny 覆盖条)`);
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const value = hostEnv[name];
|
|
68
|
+
if (value !== undefined)
|
|
69
|
+
env[name] = value;
|
|
70
|
+
}
|
|
71
|
+
// 面二:set 显式注入(deny 同样封死——防内部调用方绕白名单塞凭证)。
|
|
72
|
+
// 值可为凭证引用形——本函数是展开唯一执法点(run/spawnInteractive 两入口
|
|
73
|
+
// 同点汇入;明文只进本 env 对象 = spawn env 实参直达子进程)
|
|
74
|
+
for (const [name, value] of Object.entries(policy.set ?? {})) {
|
|
75
|
+
if (deny.has(name)) {
|
|
76
|
+
throw new BaseError('EXEC_ENV_FORBIDDEN', `环境变量 ${name} 在 deny 清单内——显式注入被拒(凭证类变量泄漏面封死,04 §11)`);
|
|
77
|
+
}
|
|
78
|
+
env[name] = expandEnvRefValue(value, resolveEnvRef);
|
|
79
|
+
}
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* set 值单值展开(引用形判定 + 席位缺席执法)。
|
|
84
|
+
* 三态放行:非引用形字面原样;引用形经展开器取明文;坏形(前缀命中而名空)
|
|
85
|
+
* 响亮拒。展开器缺席时引用形不得静默降级为字面注入——fail-loud。
|
|
86
|
+
*/
|
|
87
|
+
function expandEnvRefValue(value, resolveEnvRef) {
|
|
88
|
+
const parsed = parseCredentialEnvRef(value);
|
|
89
|
+
if (parsed.kind === 'none')
|
|
90
|
+
return value;
|
|
91
|
+
if (parsed.kind === 'invalid') {
|
|
92
|
+
throw new BaseError('CREDENTIALS_ENV_REF_INVALID', `env 引用形坏形:${JSON.stringify(value)}——@credentials: 后须有凭证名(03 §10.9 注入腿;词面单源 contracts/env-ref.ts)`);
|
|
93
|
+
}
|
|
94
|
+
if (resolveEnvRef === undefined) {
|
|
95
|
+
throw new BaseError('CREDENTIALS_NOT_FOUND', `env 引用形 ${value} 在场而凭证展开面缺席(core:credentials 未装载/禁用)——fail-closed 拒以字面值注入(03 §10.9 注入腿席位缺席律)`);
|
|
96
|
+
}
|
|
97
|
+
// 展开器自带缺席拒(credentials 侧 CREDENTIALS_NOT_FOUND——message 指路人面)
|
|
98
|
+
return resolveEnvRef(parsed.name);
|
|
99
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** 摘要探测预算(git 本地查询秒级;超时归 null 不阻塞会话启动) */
|
|
2
|
+
const GIT_SUMMARY_TIMEOUT_MS = 5_000;
|
|
3
|
+
/**
|
|
4
|
+
* 取工作区 git 摘要。
|
|
5
|
+
* @param cwd 探测目录(通常工作区根)
|
|
6
|
+
* @param pipeline spawn 管道(复用宿主登记簿与 env 白名单纪律)
|
|
7
|
+
* @returns 摘要;非仓库/git 缺席/超时/打断 → null
|
|
8
|
+
*/
|
|
9
|
+
export async function gitSummary(cwd, pipeline) {
|
|
10
|
+
const result = await pipeline.run({
|
|
11
|
+
argv: ['git', 'status', '--porcelain=v1', '--branch'],
|
|
12
|
+
cwd,
|
|
13
|
+
timeoutMs: GIT_SUMMARY_TIMEOUT_MS,
|
|
14
|
+
owner: 'environment',
|
|
15
|
+
});
|
|
16
|
+
// 非零退出(非仓库 128 / git 不在场走 EXEC_SPAWN_FAILED 抛出由调用面 catch)
|
|
17
|
+
// 或非自然退出 → 披露缺席
|
|
18
|
+
if (result.outcome !== 'exit' || result.exitCode !== 0)
|
|
19
|
+
return null;
|
|
20
|
+
const lines = result.stdout.split('\n').filter((line) => line !== '');
|
|
21
|
+
const branchLine = lines[0];
|
|
22
|
+
if (branchLine === undefined || !branchLine.startsWith('## '))
|
|
23
|
+
return null;
|
|
24
|
+
let branch = branchLine.slice(3).split('...')[0] ?? '';
|
|
25
|
+
const tracking = branchLine.slice(3);
|
|
26
|
+
if (branch === 'HEAD' && tracking.includes('(no branch)'))
|
|
27
|
+
branch = 'HEAD (detached)';
|
|
28
|
+
// ahead/behind 尾段:`## main...origin/main [ahead 2, behind 1]`
|
|
29
|
+
const aheadMatch = /\[ahead (\d+)/.exec(tracking);
|
|
30
|
+
const behindMatch = /\[.*behind (\d+)/.exec(tracking);
|
|
31
|
+
// 首行后每行一条工作区条目(含 ?? 未跟踪——脏计数全计)
|
|
32
|
+
const dirtyCount = lines.length - 1;
|
|
33
|
+
return {
|
|
34
|
+
branch,
|
|
35
|
+
ahead: aheadMatch ? Number(aheadMatch[1]) : 0,
|
|
36
|
+
behind: behindMatch ? Number(behindMatch[1]) : 0,
|
|
37
|
+
dirtyCount,
|
|
38
|
+
};
|
|
39
|
+
}
|