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
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent 件 — 工具批执行器(loop 骨架的工具腿;04 §2 批语义的执法位)。
|
|
3
|
+
*
|
|
4
|
+
* 本件是 loop 零 try/catch 形态铁律的配套执法位:插件工具 execute 可抛错,
|
|
5
|
+
* 包装在此(错误 → isError 结果数据面),loop 骨架只见结果不见异常。
|
|
6
|
+
* 批语义六条:①单响应护栏两闸(04 §2——消费序前插 limiter,零改 loop
|
|
7
|
+
* 骨架):call_id 幂等(同 id 重放不重执行——批内/跨轮/重试续入三域同律,
|
|
8
|
+
* 账本挂 context)+ 批调用数上限(超帽丢尾配对 isError + 计数暴露);
|
|
9
|
+
* ②读写批调度(03 §2.3 尾注——effect 一位两用):read(含缺省)段内并发、
|
|
10
|
+
* write 批边界串行(写前清空在飞只读——段序天然执法:write 前的 read 段已
|
|
11
|
+
* Promise.all 排干、write 后的 read 段待其结算才起跑);③beforeToolCall
|
|
12
|
+
* block → immediate isError 结果;④terminate 批内一致裁决(批内全
|
|
13
|
+
* terminate 才 terminate——单件否决不放大;回执腿/中止配对腿/丢尾腿非执行
|
|
14
|
+
* 腿不否决——空真通过与批内任何真实执行腿的 false 一票即续跑,纯非执行
|
|
15
|
+
* 批恒 terminate 停跑——重放循环卡死的兜底);⑤abort 余量配对(落批中
|
|
16
|
+
* 间时未执行 calls 逐个配对 isError toolResult,防下一轮孤儿 toolUse)。
|
|
17
|
+
*/
|
|
18
|
+
import { BaseError, redactSensitiveText } from '../contracts/index.js';
|
|
19
|
+
/** 单响应工具批调用数上限缺省值(04 §2 闸②——帽常量可配置:AgentLoopConfig.maxToolCallsPerResponse) */
|
|
20
|
+
export const DEFAULT_MAX_TOOL_CALLS_PER_RESPONSE = 32;
|
|
21
|
+
/**
|
|
22
|
+
* 组装一条工具结果消息(block/错误/中止配对/正常四腿共用的组装面)。
|
|
23
|
+
*
|
|
24
|
+
* 出口治理③ 定形③(04 §7):错误/拒绝腿文本在此单一扼点同过模式消毒
|
|
25
|
+
* (正常腿由管道链尾消毒——本位幂等不重复)。agent 侧无活值 provider
|
|
26
|
+
* (值基腿只在管道),纯模式腿覆盖具名形。
|
|
27
|
+
*
|
|
28
|
+
* @param call 配对的 toolCall 块 @param content 文本腿 @param isError 错误标记
|
|
29
|
+
* @param details 结构化明细(可选)
|
|
30
|
+
*/
|
|
31
|
+
function buildResult(call, content, isError, details) {
|
|
32
|
+
return {
|
|
33
|
+
role: 'toolResult',
|
|
34
|
+
toolCallId: call.id,
|
|
35
|
+
toolName: call.name,
|
|
36
|
+
content: [{ type: 'text', text: redactSensitiveText(content) }],
|
|
37
|
+
isError,
|
|
38
|
+
timestamp: Date.now(),
|
|
39
|
+
...(details !== undefined ? { details } : {}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 执行单条工具调用(含 beforeToolCall 守门、执行体替换、迟到进度丢弃、
|
|
44
|
+
* execute 抛错包装、afterToolCall 字段级整体替换)。
|
|
45
|
+
*/
|
|
46
|
+
async function executeOne(config, context, tool, call, emit) {
|
|
47
|
+
emit({ type: 'tool_execution_start', toolCallId: call.id, name: call.name, arguments: call.arguments });
|
|
48
|
+
// 工具不在场:结果数据面直接回错(工具清单在 run 内静态——不可达名即配置漂移)
|
|
49
|
+
if (!tool) {
|
|
50
|
+
const message = buildResult(call, `工具 ${call.name} 不在本 run 工具集(配置漂移——清单与调用不同源)`, true);
|
|
51
|
+
emit({ type: 'tool_execution_end', toolCallId: call.id, result: { content: message.content, isError: true } });
|
|
52
|
+
return { message, terminate: false };
|
|
53
|
+
}
|
|
54
|
+
// 守门行安装点:block 拒因 → immediate isError 结果(不执行)
|
|
55
|
+
const decision = (await config.beforeToolCall?.(call, context)) ?? {};
|
|
56
|
+
if (decision.block !== undefined) {
|
|
57
|
+
const message = buildResult(call, decision.block, true);
|
|
58
|
+
emit({ type: 'tool_execution_end', toolCallId: call.id, result: { content: message.content, isError: true } });
|
|
59
|
+
return { message, terminate: decision.terminate === true };
|
|
60
|
+
}
|
|
61
|
+
// 参数预处理(执行前最后一改参数的机会)
|
|
62
|
+
const args = tool.prepareArguments ? await tool.prepareArguments(call.arguments) : call.arguments;
|
|
63
|
+
// 迟到进度丢弃:promise 结算后 onUpdate 静默(accepting 旗——终值已落,迟到腿不重放)
|
|
64
|
+
let accepting = true;
|
|
65
|
+
const onUpdate = (update) => {
|
|
66
|
+
if (accepting)
|
|
67
|
+
emit({ type: 'tool_execution_update', toolCallId: call.id, update });
|
|
68
|
+
};
|
|
69
|
+
let result;
|
|
70
|
+
try {
|
|
71
|
+
// 执行体替换点(测试注金样 seam);缺省走 tool.execute(signal 协作面透传)
|
|
72
|
+
result = config.toolExecution
|
|
73
|
+
? await config.toolExecution(tool, call.id, args, config.signal, onUpdate)
|
|
74
|
+
: await tool.execute(call.id, args, config.signal, onUpdate);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
// 插件工具抛错包装位(loop 零 try/catch 的配套——错误转数据面);错误
|
|
78
|
+
// 文本可能携出工具内部秘密(stderr env dump / 含 token 的 URL 报错)——
|
|
79
|
+
// 同过模式消毒(出口治理③ 定形③:与 buildResult 同一出口语义)
|
|
80
|
+
const text = err instanceof BaseError ? `${err.code}: ${err.message}` : String(err);
|
|
81
|
+
result = {
|
|
82
|
+
content: [{ type: 'text', text: redactSensitiveText(`工具 ${call.name} 执行异常:${text}`) }],
|
|
83
|
+
isError: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
accepting = false;
|
|
88
|
+
}
|
|
89
|
+
// 结果组装(一次到位:正常腿与错误腿同形——错误是数据契约之一)
|
|
90
|
+
let message = {
|
|
91
|
+
role: 'toolResult',
|
|
92
|
+
toolCallId: call.id,
|
|
93
|
+
toolName: call.name,
|
|
94
|
+
content: result.content,
|
|
95
|
+
isError: result.isError === true,
|
|
96
|
+
timestamp: Date.now(),
|
|
97
|
+
...(result.details !== undefined ? { details: result.details } : {}),
|
|
98
|
+
...(result.usage !== undefined ? { usage: result.usage } : {}),
|
|
99
|
+
...(result.addedToolNames !== undefined ? { addedToolNames: result.addedToolNames } : {}),
|
|
100
|
+
};
|
|
101
|
+
// 后置钩子:字段级整体替换(返回新消息替换默认组装形)
|
|
102
|
+
const replaced = await config.afterToolCall?.(call, result, message, context);
|
|
103
|
+
if (replaced !== undefined && replaced !== null)
|
|
104
|
+
message = replaced;
|
|
105
|
+
emit({ type: 'tool_execution_end', toolCallId: call.id, result });
|
|
106
|
+
return { message, terminate: result.terminate === true };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 执行一批工具调用(单响应护栏两闸 + 读写批调度 + abort 余量配对 + 批内一致 terminate)。
|
|
110
|
+
*
|
|
111
|
+
* 护栏两闸(04 §2,消费序前插——零改 loop 骨架):闸②批调用数上限——超帽
|
|
112
|
+
* 丢尾(被丢 calls 逐个 isError 配对 + 计数暴露;丢尾腿不进账本——未执行
|
|
113
|
+
* 条目无「既有结果」,模型重发该 id 时按新调用执行);闸①call_id 幂等——
|
|
114
|
+
* 账本(context.toolResultLedger,driver 终身单实例)与批内首现双命中均走
|
|
115
|
+
* 回执腿(直接回既有结果,不重执行、不发执行活体事件、不参与 terminate
|
|
116
|
+
* 表决——strix wait→check 轮询防回归锁)。
|
|
117
|
+
*
|
|
118
|
+
* 调度(03 §2.3 尾注——effect 一位两用的消费执法):按原序切段——连续 read
|
|
119
|
+
* 调用成一段(段内并发 Promise.all)、write 调用独立成段(单件串行屏障:
|
|
120
|
+
* 写前清空在飞只读、写后 read 待其结算)。工具不在场(lookup 失败)视同
|
|
121
|
+
* read 入段——executeOne 自会回配置漂移 isError,不影响调度归类。
|
|
122
|
+
*
|
|
123
|
+
* @param config loop 配置 @param context 运行上下文 @param calls assistant 批内全部调用
|
|
124
|
+
* @param emit 活体事件发射器
|
|
125
|
+
*/
|
|
126
|
+
export async function executeToolBatch(config, context, calls, emit) {
|
|
127
|
+
// 闸②批调用数上限:单响应批超帽丢尾(缺省 32;负值归 0——0 即拒全批)
|
|
128
|
+
const cap = Math.max(0, config.maxToolCallsPerResponse ?? DEFAULT_MAX_TOOL_CALLS_PER_RESPONSE);
|
|
129
|
+
const droppedCount = Math.max(0, calls.length - cap);
|
|
130
|
+
const outcome = { results: [], terminate: false, droppedCount };
|
|
131
|
+
// 三分类预演(保序——结果按 calls 原序落位):dropped = 超帽丢尾(不进调度
|
|
132
|
+
// 不进账本);replay = 账本命中或批内首现之后的同 id 重现(回执腿);
|
|
133
|
+
// dispatch = 首达执行腿
|
|
134
|
+
const ledger = (context.toolResultLedger ??= new Map()); // 闸①首达建账
|
|
135
|
+
const seenInBatch = new Set();
|
|
136
|
+
const kinds = calls.map((call, i) => {
|
|
137
|
+
if (i >= cap)
|
|
138
|
+
return 'dropped';
|
|
139
|
+
if (ledger.has(call.id) || seenInBatch.has(call.id))
|
|
140
|
+
return 'replay';
|
|
141
|
+
seenInBatch.add(call.id);
|
|
142
|
+
return 'dispatch';
|
|
143
|
+
});
|
|
144
|
+
let allTerminate = true;
|
|
145
|
+
let index = 0;
|
|
146
|
+
while (index < calls.length) {
|
|
147
|
+
// 段前中止检查:已中止 → 余量全部配对 isError 收口(无孤儿 toolUse;配对腿不参与 terminate 表决——与旧串行路径同律)
|
|
148
|
+
if (config.signal?.aborted) {
|
|
149
|
+
for (const call of calls.slice(index)) {
|
|
150
|
+
outcome.results.push(buildResult(call, '工具批已被打断(run 中止——余量配对收口)', true));
|
|
151
|
+
}
|
|
152
|
+
outcome.terminate = calls.length > 0 && allTerminate;
|
|
153
|
+
return outcome;
|
|
154
|
+
}
|
|
155
|
+
// 非执行腿排干(保序内联,切段):回执腿 = 账本既有结果直接回执(拷贝重铸
|
|
156
|
+
// 配对键——同 id 多块 toolUse 各得一条);丢尾腿 = 超帽 isError 配对
|
|
157
|
+
while (index < calls.length && kinds[index] !== 'dispatch') {
|
|
158
|
+
const call = calls[index];
|
|
159
|
+
if (kinds[index] === 'replay') {
|
|
160
|
+
outcome.results.push(replayOf(call, ledger.get(call.id)));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
outcome.results.push(buildResult(call, `单响应工具批超上限 ${cap} 条——丢尾收口(本条未执行;请减少单次响应内的工具调用量)`, true));
|
|
164
|
+
}
|
|
165
|
+
index++;
|
|
166
|
+
}
|
|
167
|
+
if (index >= calls.length)
|
|
168
|
+
break; // 排干到尾(余量全是非执行腿——收尾)
|
|
169
|
+
// 连续 read 段(effect=read 并行档——2026-09-11 审批分档批三值扩后唯一
|
|
170
|
+
// 并行档;write|exec 均串行屏障。工具不在场腿留在本段〔执行期报不在场
|
|
171
|
+
// 错——缺席非声明,与「在场未声明 = exec 最危」的注册面归一分立〕;
|
|
172
|
+
// 非执行腿切段)
|
|
173
|
+
const segment = [];
|
|
174
|
+
while (index < calls.length && kinds[index] === 'dispatch') {
|
|
175
|
+
const found = lookup(context, calls[index]);
|
|
176
|
+
// 并行仅限显式 read:write/exec(及在场未声明的最危归一形)一律出局走屏障腿
|
|
177
|
+
if (found !== undefined && found.effect !== 'read')
|
|
178
|
+
break;
|
|
179
|
+
segment.push(calls[index]);
|
|
180
|
+
index++;
|
|
181
|
+
}
|
|
182
|
+
if (segment.length > 0) {
|
|
183
|
+
// read 段内并发(03 §2.3「批内可并行调度」);结果按 calls 原序落位(Promise.all 保序)
|
|
184
|
+
const settled = await Promise.all(segment.map((call) => executeOne(config, context, lookup(context, call), call, emit)));
|
|
185
|
+
for (let i = 0; i < settled.length; i++) {
|
|
186
|
+
const item = settled[i];
|
|
187
|
+
outcome.results.push(item.message);
|
|
188
|
+
ledger.set(segment[i].id, item.message); // 执行后入账(后续重放回执;段内 id 已去重)
|
|
189
|
+
allTerminate = allTerminate && item.terminate;
|
|
190
|
+
}
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// write/exec 屏障腿:单件串行(写前清空在飞只读——前 read 段已排干;
|
|
194
|
+
// 屏障后 read 段待本腿结算。03 §2.3 尾注读写调度语义:write|exec 批边界
|
|
195
|
+
// 串行——审批分档批三值扩同律)
|
|
196
|
+
const writeCall = calls[index];
|
|
197
|
+
index++;
|
|
198
|
+
const settled = await executeOne(config, context, lookup(context, writeCall), writeCall, emit);
|
|
199
|
+
outcome.results.push(settled.message);
|
|
200
|
+
ledger.set(writeCall.id, settled.message); // 执行后入账(后续重放回执)
|
|
201
|
+
allTerminate = allTerminate && settled.terminate;
|
|
202
|
+
}
|
|
203
|
+
// 空批不终止;回执腿/丢尾腿不否决(空真通过与中止配对腿同律)——纯非执行
|
|
204
|
+
// 批(全回执/全丢尾)恒 terminate:停跑正是重放循环卡死的兜底(strix 病理
|
|
205
|
+
// 下继续跑 = 模型每轮空转重放烧 token;批内只要有一条真实执行腿投 false
|
|
206
|
+
// 即续跑)
|
|
207
|
+
outcome.terminate = calls.length > 0 && allTerminate;
|
|
208
|
+
return outcome;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* 回执腿组装(04 §2 闸①):既有结果的回执拷贝——内容/错误位与原结果一致,
|
|
212
|
+
* 配对键与工具名重铸为本次 call(回执也是配对——防孤儿 toolUse 同律)。
|
|
213
|
+
* @param call 本次重放的调用块 @param cached 账本内既有结果消息
|
|
214
|
+
*/
|
|
215
|
+
function replayOf(call, cached) {
|
|
216
|
+
return { ...cached, toolCallId: call.id, toolName: call.name, timestamp: Date.now() };
|
|
217
|
+
}
|
|
218
|
+
/** 按名查工具(批内 lookup 单源) */
|
|
219
|
+
function lookup(context, call) {
|
|
220
|
+
return context.tools?.find((t) => t.name === call.name);
|
|
221
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 虚拟模块 `berry-agent/llm` 的类型面(pi-ai provider 工厂族)。
|
|
3
|
+
*
|
|
4
|
+
* 运行时注入物 = llm 模块 providerApiFace 对象(键即导出面);类型面以 indexed
|
|
5
|
+
* access 从同一对象派生——单源不重抄签名。宿主类型锚 = dist/llm/provider-face.d.ts
|
|
6
|
+
* (tsconfig.api.json 发射;其 pi-ai 类型引用经宿主依赖链解析)。
|
|
7
|
+
*
|
|
8
|
+
* 本文件由 tools/generate-api-decls.mjs 生成(declare 行从面快照 Face 键集派生)——勿手编。
|
|
9
|
+
*/
|
|
10
|
+
import type { providerApiFace } from '../llm/provider-face.js';
|
|
11
|
+
|
|
12
|
+
type Face = typeof providerApiFace;
|
|
13
|
+
|
|
14
|
+
export declare const anthropicMessagesApi: Face['anthropicMessagesApi'];
|
|
15
|
+
export declare const createProvider: Face['createProvider'];
|
|
16
|
+
export declare const hasApi: Face['hasApi'];
|
|
17
|
+
export declare const lazyApi: Face['lazyApi'];
|
|
18
|
+
export declare const openAICompletionsApi: Face['openAICompletionsApi'];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 虚拟模块 `berry-agent` 的类型面(API 治理公开面第一键——宿主公开根)。
|
|
3
|
+
*
|
|
4
|
+
* 内容恒为一行再导出——真身在 dist/contracts/*.d.ts(tsconfig.api.json 声明
|
|
5
|
+
* 发射产物,公开根 src/contracts/index.ts 传递闭包)。插件侧 tsconfig paths
|
|
6
|
+
* 把 `berry-agent` 映到本文件(模板见同目录 tsconfig.paths.json)——插件
|
|
7
|
+
* 作者 tsc 可解析虚拟键,类型面不靠运行时注入后猜。
|
|
8
|
+
*/
|
|
9
|
+
export * from '../contracts/index.js';
|