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,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话事件信封与归因词汇类型(05 篇 §1.1 信封定稿 + §3.1 source 闭集定稿)。
|
|
3
|
+
*
|
|
4
|
+
* 本文件是 SessionEvent 形态的唯一权威——02 篇词汇表钉、05 篇 §1.1 重述,
|
|
5
|
+
* 此处逐字段转录;LLM 消息/流/角色与工具/插件/子代理/Job 类型随对应模块
|
|
6
|
+
* 落码批按 pi-ai 实形定义(contract-first:纵切批内先契约后实现)。
|
|
7
|
+
*/
|
|
8
|
+
import type { Usage } from './llm.js';
|
|
9
|
+
/**
|
|
10
|
+
* 表面遮蔽指令(改历史的唯一合法形态——追加 replace 指令事件遮蔽旧区间,
|
|
11
|
+
* 原文保留可审计)。区间 [start, end] 为被遮蔽事件的 seq 闭区间。
|
|
12
|
+
*/
|
|
13
|
+
export interface SurfaceOp {
|
|
14
|
+
/** 指令形态——v1 唯一值 'replace'(词汇预留扩展) */
|
|
15
|
+
op: 'replace';
|
|
16
|
+
/** 被遮蔽区间起始 seq(含) */
|
|
17
|
+
start: number;
|
|
18
|
+
/** 被遮蔽区间结束 seq(含) */
|
|
19
|
+
end: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 会话事件信封:日志唯一条目形态(append-only,写入即冻结)。
|
|
23
|
+
*/
|
|
24
|
+
export interface SessionEvent<T = unknown> {
|
|
25
|
+
/** 事件类型词汇(核心清单 events.ts + 插件显式注册扩展) */
|
|
26
|
+
type: string;
|
|
27
|
+
/** = 写入时 log.length,强制连续、0 起(只在尾部追加结构保证,无独立分配器) */
|
|
28
|
+
seq: number;
|
|
29
|
+
/** 毫秒时间戳;合成事件复用最后真实事件的 time(确定性——金样回放友好) */
|
|
30
|
+
time: number;
|
|
31
|
+
/** 已冻结的 JSON 快照(写入时单遍校验 + deepFreeze——从冻结快照读 = 免拷贝投影) */
|
|
32
|
+
data: T;
|
|
33
|
+
/** true = 读侧可以不认识此类型(向前兼容);缺省 = 必须认识 */
|
|
34
|
+
ignorable?: boolean;
|
|
35
|
+
/** 遮蔽指令——仅改历史事件携带(§2 surfaceOp 协议) */
|
|
36
|
+
surfaceOp?: SurfaceOp;
|
|
37
|
+
/** 遮蔽溯源:被遮蔽节点 + 依据事件的完整 seq 列表 */
|
|
38
|
+
sourceEventSeqs?: number[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* user/message 的 source 归因词汇闭集(05 §3.1 表全列):
|
|
42
|
+
* 六字面量 ∪ 三前缀模板串。TS 模板字面量类型即闭集执法——已知前缀的
|
|
43
|
+
* 任意后缀(`plugin:未来插件`)类型合法,语义按前缀行展开。
|
|
44
|
+
*/
|
|
45
|
+
export type EventSource = 'user' | `channel:${string}` | 'schedule' | 'subagent-settled' | 'subagent-approval-pending' | 'budget-extended' | 'compaction' | `plugin:${string}` | `session:${string}`;
|
|
46
|
+
/** source 归一化种类(前缀型归并到 kind;字面量一一对应) */
|
|
47
|
+
export type EventSourceKind = 'user' | 'channel' | 'schedule' | 'subagent-settled' | 'subagent-approval-pending' | 'budget-extended' | 'compaction' | 'plugin' | 'session';
|
|
48
|
+
/** parseEventSource 结果:归一化种类 + 原值 + 投影位判别 */
|
|
49
|
+
export interface ParsedEventSource {
|
|
50
|
+
/** 归一化种类(未知字面量归 'user'——旧日志向前兼容按 user 同视) */
|
|
51
|
+
kind: EventSourceKind;
|
|
52
|
+
/** 原始字符串(审计保真) */
|
|
53
|
+
raw: string;
|
|
54
|
+
/**
|
|
55
|
+
* 投影是否以用户话语位展开(05 §3.1「投影同视 user」判据):
|
|
56
|
+
* user/channel/schedule/subagent-settled = true(都是输入位,仅审计可辨入口);
|
|
57
|
+
* compaction/plugin/session = false(摘要载体、受控注入与跨会话操控注入
|
|
58
|
+
* 不视为用户话语——渲染与记忆提取归因区分显示)。
|
|
59
|
+
*/
|
|
60
|
+
treatedAsUser: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 解析 source 归因字符串(闭集执法的读侧判据,05 §3.1):
|
|
64
|
+
* - 已知前缀的未知后缀(如 'plugin:未来插件')按前缀行语义展开;
|
|
65
|
+
* - 未知字面量(旧日志向前兼容)按 user 同视;
|
|
66
|
+
* - append 侧新值必须先扩闭集(类型 + 本函数)——写入纪律归 session 落码批。
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseEventSource(source: string): ParsedEventSource;
|
|
69
|
+
/**
|
|
70
|
+
* turn/end 的 reason 闭集(05 §1.1 表:completed / aborted / blocked / error /
|
|
71
|
+
* max-tokens / interrupted,可扩展)。`(string & {})` 保留字面量自动补全的
|
|
72
|
+
* 同时不拒扩展值——新增终态值属词汇演进,须先扩 05 篇表格。
|
|
73
|
+
*/
|
|
74
|
+
export type TurnEndReason = 'completed' | 'aborted' | 'blocked' | 'error' | 'max-tokens' | 'interrupted' | (string & {});
|
|
75
|
+
/**
|
|
76
|
+
* 会话血缘 origin 闭集(05 §5.1):'conversation'(普通对话)/ 'delegation'
|
|
77
|
+
* (委派子会话)/ 'import'(外部导入)/ 'fork'(显式 fork)/ 'trigger'(触发器
|
|
78
|
+
* starter 起的无头会话——首 turn 非人触,2026-09-07 触发器面 C 批落码扩词;
|
|
79
|
+
* 05 §9 sessions.origin 与 03 §2.4 session_start 载荷三处闭集同笔)。无插件
|
|
80
|
+
* 域——会话直归 agent(05 §0 会话归属模型)。
|
|
81
|
+
*/
|
|
82
|
+
export type SessionOrigin = 'conversation' | 'delegation' | 'import' | 'fork' | 'trigger';
|
|
83
|
+
/** 血缘三元组(fork 动作的分层返回外层,05 §5.2;不返回幻影 id) */
|
|
84
|
+
export interface SessionLineage {
|
|
85
|
+
/** 源会话 id(根会话 = undefined) */
|
|
86
|
+
readonly parentId: string | undefined;
|
|
87
|
+
/** 种子前缀长度(首条新 append 事件恰落此位,05 §5.2) */
|
|
88
|
+
readonly seedLength: number;
|
|
89
|
+
/** 血缘形态 */
|
|
90
|
+
readonly origin: SessionOrigin;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 重试进行态只读小面(04 §3.3 注记 seam——批 13a 落码位):conversation 驱动
|
|
94
|
+
* 重试循环的只读探针,SDK 线协议心跳载荷是该 seam 的**唯一线面出口**
|
|
95
|
+
* (03 §10.6 线协议②:`retry <attempt>/<next>` 不可从事件流推导——活体层
|
|
96
|
+
* 「重试续入零新事件型」维持不破;非事件型、不进 durable)。
|
|
97
|
+
*
|
|
98
|
+
* 归位 contracts:producer(conversation)与 consumer(channels SDK 通道
|
|
99
|
+
* 后端)边表互不可达(02 §4.1),结构共享零 import 边——ApprovalAskRequest
|
|
100
|
+
* 归位同款先例(批 11b)。
|
|
101
|
+
*/
|
|
102
|
+
export interface RetryProbe {
|
|
103
|
+
/** 当前重试序(1 起——attempt 计数生命周期 = 单次 runTurns 调用) */
|
|
104
|
+
readonly attempt: number;
|
|
105
|
+
/** 名额上限(RetryPolicy.maxRetries 面——transient/overflow 各自分账) */
|
|
106
|
+
readonly maxAttempts: number;
|
|
107
|
+
/** 下次续入时间戳(epoch ms);null = 不在退避等待(重试已续入/取消/耗尽) */
|
|
108
|
+
readonly nextAt: number | null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 委派深度帽(04 §10 委派边界③):根会话委派 = 深度 1;子代理再委派逐层 +1;
|
|
112
|
+
* 超帽 3 拒(SUBAGENT_DEPTH_EXCEEDED——防自嵌套爆栈)。
|
|
113
|
+
*/
|
|
114
|
+
export declare const SUBAGENT_DEPTH_MAX = 3;
|
|
115
|
+
/**
|
|
116
|
+
* SubagentProvider 能力协商面(04 §10——五布尔):注册方声明,消费方
|
|
117
|
+
* (委派机器/呈现面)据以决定可用形态(如 background=false 的 provider
|
|
118
|
+
* 不受理后台收场)。in-process 真工厂五项恒真(独立装配全套)。
|
|
119
|
+
*/
|
|
120
|
+
export interface SubagentCapabilities {
|
|
121
|
+
/** 子代理有自己的工具面(非纯文本模型) */
|
|
122
|
+
readonly tools: boolean;
|
|
123
|
+
/** 支持流式过程可见(父可观察中间输出) */
|
|
124
|
+
readonly streaming: boolean;
|
|
125
|
+
/** 支持协作取消(stop → stopping → killed) */
|
|
126
|
+
readonly cancel: boolean;
|
|
127
|
+
/** 支持后台收场(Job 注册表托管;one-shot-only provider 恒 false) */
|
|
128
|
+
readonly background: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* 支持结构化输出(SubagentResult.structured 面):语义 = 「结果携宿主铸造
|
|
131
|
+
* 结构账可依赖」——in-process 真 = 工厂结算位机器账(04 §10 定形段),
|
|
132
|
+
* 第三方 true = 自有形(契约位宽形不锁字段表)。
|
|
133
|
+
*/
|
|
134
|
+
readonly structuredOutput: boolean;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 委派请求(04 §10:请求含 prompt、工具白名单、模型覆盖——其余为机器
|
|
138
|
+
* 注入位,模型侧工具 schema 不暴露)。
|
|
139
|
+
*/
|
|
140
|
+
export interface SubagentRequest {
|
|
141
|
+
/** 委派目标提示(子代理的唯一任务输入) */
|
|
142
|
+
readonly prompt: string;
|
|
143
|
+
/** 工具白名单(与 def 的 tools 交集执法——子代理可用面 ⊆ 交集) */
|
|
144
|
+
readonly tools?: readonly string[];
|
|
145
|
+
/** 模型覆盖(缺省回落宿主模型) */
|
|
146
|
+
readonly model?: string;
|
|
147
|
+
/** 子代理系统提示(声明式子代理正文直传;通用 agent 工具不设) */
|
|
148
|
+
readonly systemPrompt?: string;
|
|
149
|
+
/** 诊断名(Job 名与通知文案的显示位;缺省机器派生) */
|
|
150
|
+
readonly name?: string;
|
|
151
|
+
/** 机器注入位——父会话 id(background 结算通知路由) */
|
|
152
|
+
readonly parentSessionId?: string;
|
|
153
|
+
/** 机器注入位——收场形态(one-shot 缺省 / background 托管) */
|
|
154
|
+
readonly background?: boolean;
|
|
155
|
+
/** 机器注入位——委派深度(根 = 1;超帽拒——模型不可直设) */
|
|
156
|
+
readonly depth?: number;
|
|
157
|
+
/**
|
|
158
|
+
* 机器注入位——审批挂起通知闭包(in-process 子栈审批闸的父路由):
|
|
159
|
+
* background 形注入(one-shot 不注入——挂着等待即知情);实现方执法
|
|
160
|
+
* 恰一条幂等(driver dedupeKey 面)。
|
|
161
|
+
*/
|
|
162
|
+
readonly notifyApproval?: (info: {
|
|
163
|
+
approvalId: string;
|
|
164
|
+
toolName: string;
|
|
165
|
+
reason?: string;
|
|
166
|
+
}) => Promise<unknown>;
|
|
167
|
+
/**
|
|
168
|
+
* 机器注入位——协作停止观察面(background 形注入):JobHandle.stop()
|
|
169
|
+
* 置 stopping 后本闭包变真;in-process 工厂据此桥子栈中止(abort 子 run)。
|
|
170
|
+
* 只读观察非信号——轮询/桥接形态由工厂自选。
|
|
171
|
+
*/
|
|
172
|
+
readonly stopRequested?: () => boolean;
|
|
173
|
+
/**
|
|
174
|
+
* 机器注入位——技能正文永久注入清单(06 §11.6 skills 键 spawn 永久注入模):
|
|
175
|
+
* 技能名数组(形状三验在工厂 spawn 时统一复验——声明式 def 填充缺省/程序化
|
|
176
|
+
* def 镜像/直呼三方同点执法);模型侧工具 schema 不暴露。
|
|
177
|
+
*/
|
|
178
|
+
readonly skills?: readonly string[];
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 委派结算(04 §10:子代理是黑盒——结果不重试,立即结算给父)。
|
|
182
|
+
*/
|
|
183
|
+
export interface SubagentResult {
|
|
184
|
+
/** 最终输出(黑盒面——父只见结果不见内部过程;机器账在位时降为参考面) */
|
|
185
|
+
readonly output: string;
|
|
186
|
+
/**
|
|
187
|
+
* 结构化输出(capabilities.structuredOutput 时有效)。契约位保持宽形
|
|
188
|
+
* (unknown——第三方 provider 可铸自有形);in-process 工厂 v1 唯一形 =
|
|
189
|
+
* 宿主机器账 { childSessionId, jobName?, durationMs, turnCount,
|
|
190
|
+
* messageCount, usage {input,output}|null, stopReason }(04 §10 structured
|
|
191
|
+
* 定形段——subagent/types.ts SubagentMachineAccount 单源形)。
|
|
192
|
+
*/
|
|
193
|
+
readonly structured?: unknown;
|
|
194
|
+
/** 降级上报(≤4096 截断——哪些工具被拒、以何降级路径完成;禁伪装执法位) */
|
|
195
|
+
readonly diagnostic?: string;
|
|
196
|
+
/**
|
|
197
|
+
* 用量(子栈计量上报;缺席 = 未计量)。in-process 工厂与 structured.usage
|
|
198
|
+
* 同值双填(同源一次铸造——顶层位 = 末条 assistant 完整 Usage、机器账位 =
|
|
199
|
+
* 同源两桶投影);顶层位独立保留意义 = 第三方 provider 只报顶层计量不铸
|
|
200
|
+
* 机器账。
|
|
201
|
+
*/
|
|
202
|
+
readonly usage?: Usage;
|
|
203
|
+
/** 收场原因(error 形 = 结果即错误数据——重试是父的策略不是子代理机制) */
|
|
204
|
+
readonly stopReason: SubagentStopReason;
|
|
205
|
+
}
|
|
206
|
+
/** 子代理收场原因闭集(StopReason 子集——委派语境三值;'killed' 承 Job 终态词) */
|
|
207
|
+
export type SubagentStopReason = 'stop' | 'error' | 'aborted';
|
|
208
|
+
/**
|
|
209
|
+
* SubagentProvider 契约(04 §10——subagent 件提供,core:):能力协商 +
|
|
210
|
+
* 单一委派动词。in-process provider 是真工厂——每子代理独立装配全套
|
|
211
|
+
* (自己的 loop/scope/工具面/凭证),运行期无「我是谁派来的」识别。
|
|
212
|
+
*/
|
|
213
|
+
export interface SubagentProvider {
|
|
214
|
+
readonly capabilities: SubagentCapabilities;
|
|
215
|
+
run(request: SubagentRequest): Promise<SubagentResult>;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Job 种类闭集(04 §10——kind 现设四值;registerKind 显式登记后方可使用)。
|
|
219
|
+
* `'trigger'` = 触发器 starter 的缺省托管 kind(jobKind 缺省即隐式进此 kind;
|
|
220
|
+
* host 装配期自登 + 缺省并行帽 4——2026-09-07 触发器面 C 批落码定形)。
|
|
221
|
+
*/
|
|
222
|
+
export type JobKind = 'subagent' | 'process' | 'issue' | 'trigger';
|
|
223
|
+
/** Job 状态机(04 §10:running →(可选 stopping)→ 唯一终态;first-wins) */
|
|
224
|
+
export type JobStatus = 'running' | 'stopping' | 'completed' | 'killed' | 'failed';
|
|
225
|
+
/** Job 终态载荷(settle 时落——first-wins 封口后的不可变值) */
|
|
226
|
+
export interface JobTerminal {
|
|
227
|
+
/** 终态(三值闭集——completed/killed/failed) */
|
|
228
|
+
readonly status: Extract<JobStatus, 'completed' | 'killed' | 'failed'>;
|
|
229
|
+
/** 终态落定时刻(epoch ms) */
|
|
230
|
+
readonly at: number;
|
|
231
|
+
/** 终态说明(人读——killed 的归因/failed 的错误摘要等) */
|
|
232
|
+
readonly detail?: string;
|
|
233
|
+
}
|
|
234
|
+
/** Job 注册表条目(进程内状态——04 §10 终态不镜像落库明文豁免) */
|
|
235
|
+
export interface JobEntry {
|
|
236
|
+
/** 唯一 id(注册表自铸 `job-<n>` 序列) */
|
|
237
|
+
readonly id: string;
|
|
238
|
+
/** 显示名(子代理诊断名/进程命令行等) */
|
|
239
|
+
readonly name: string;
|
|
240
|
+
/** 种类(registerKind 登记词汇) */
|
|
241
|
+
readonly kind: JobKind;
|
|
242
|
+
/** 归属围栏(会话关闭按 owner 收口其在飞 Job 落 killed) */
|
|
243
|
+
readonly owner: string;
|
|
244
|
+
/** 当前状态(终态后不可变——first-wins) */
|
|
245
|
+
readonly status: JobStatus;
|
|
246
|
+
/** 起跑时刻(epoch ms) */
|
|
247
|
+
readonly startedAt: number;
|
|
248
|
+
/** 终态载荷(未终态 = undefined) */
|
|
249
|
+
readonly terminal?: JobTerminal;
|
|
250
|
+
}
|
|
251
|
+
/** job_settled 活体事件载荷(04 §10——总线词,内存直推不落库) */
|
|
252
|
+
export interface JobSettledEvent {
|
|
253
|
+
/** 终态条目快照(含 id/kind/owner/terminal) */
|
|
254
|
+
readonly entry: JobEntry;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* 声明式子代理解析产物(06 §11.6 agents/*.md 纯数据 def)。
|
|
258
|
+
* 归 contracts(02 §4.1 席 1 契约家):解析层住 core:skills、机器住
|
|
259
|
+
* core:subagent——两侧共享形状只可经契约面(skills→subagent 无边,
|
|
260
|
+
* DAG 禁穿);subagent 收纯数据 def 零 yaml(yaml 裸导入白名单不扩)。
|
|
261
|
+
*/
|
|
262
|
+
export interface SubagentDef {
|
|
263
|
+
/** 身份键(frontmatter name 缺省回落文件基名;提供时须与基名一致) */
|
|
264
|
+
readonly name: string;
|
|
265
|
+
/** 描述(必填——披露段清单行 = 模型选择依据) */
|
|
266
|
+
readonly description: string;
|
|
267
|
+
/** 工具白名单(可选 include 名单——与派生面交集执法) */
|
|
268
|
+
readonly tools?: readonly string[];
|
|
269
|
+
/** 前置要求(04 §10 预检闸声明位——与 tools 白名单正交不混读) */
|
|
270
|
+
readonly requires?: readonly string[];
|
|
271
|
+
/** 技能正文永久注入清单(06 §11.6 skills 键——spawn 时具名块拼入子 systemPrompt 尾) */
|
|
272
|
+
readonly skills?: readonly string[];
|
|
273
|
+
/** 模型覆盖(子代理启动参数直传工厂——不进能力协商面) */
|
|
274
|
+
readonly model?: string;
|
|
275
|
+
/** 正文即系统提示(frontmatter 闭合 --- 之后全文) */
|
|
276
|
+
readonly systemPrompt: string;
|
|
277
|
+
/** 来源文件绝对路径(诊断/溯源面) */
|
|
278
|
+
readonly filePath: string;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 程序化 named provider 注册 def(03 §2.2 第十二动词 ctx.agent.registerSubagentProvider
|
|
282
|
+
* 单参——04 §10 程序化注册槽段机制真源)。**镜像 frontmatter 形** = SubagentDef 减
|
|
283
|
+
* 来源文件位(程序化注册无文件载体——filePath 是声明式腿专属归因面);注册即派生
|
|
284
|
+
* 静态工具 `agent_<name>`(物化机器住 core:subagent)。形状归 contracts 同 SubagentDef
|
|
285
|
+
* (消费方 = subagent 注册机器 + host ctx 面——经契约面共享,不私造双形)。
|
|
286
|
+
*/
|
|
287
|
+
export interface ProgrammaticSubagentDef {
|
|
288
|
+
/** 身份键(裸词——06 §11.6 声明式 name 同形:小写字母/数字/连字符,词法真源 06 §11.2) */
|
|
289
|
+
readonly name: string;
|
|
290
|
+
/** 描述(必填——披露段清单行 = 模型选择依据) */
|
|
291
|
+
readonly description: string;
|
|
292
|
+
/** 工具白名单(可选 include 名单——与派生面交集执法) */
|
|
293
|
+
readonly tools?: readonly string[];
|
|
294
|
+
/** 前置要求(04 §10 预检闸声明位——与 tools 白名单正交不混读) */
|
|
295
|
+
readonly requires?: readonly string[];
|
|
296
|
+
/** 技能正文永久注入清单(06 §11.6 skills 键——镜像 frontmatter 形;spawn 时统一复验) */
|
|
297
|
+
readonly skills?: readonly string[];
|
|
298
|
+
/** 模型覆盖(子代理启动参数直传工厂——不进能力协商面) */
|
|
299
|
+
readonly model?: string;
|
|
300
|
+
/** 子代理系统提示(程序化腿无文件载体——正文直传) */
|
|
301
|
+
readonly systemPrompt: string;
|
|
302
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** 字面量六值 → 归一化种类映射(前缀型经 startsWith 归并) */
|
|
2
|
+
const LITERAL_SOURCE_KINDS = {
|
|
3
|
+
user: 'user',
|
|
4
|
+
schedule: 'schedule',
|
|
5
|
+
'subagent-settled': 'subagent-settled',
|
|
6
|
+
'subagent-approval-pending': 'subagent-approval-pending',
|
|
7
|
+
'budget-extended': 'budget-extended',
|
|
8
|
+
compaction: 'compaction',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 解析 source 归因字符串(闭集执法的读侧判据,05 §3.1):
|
|
12
|
+
* - 已知前缀的未知后缀(如 'plugin:未来插件')按前缀行语义展开;
|
|
13
|
+
* - 未知字面量(旧日志向前兼容)按 user 同视;
|
|
14
|
+
* - append 侧新值必须先扩闭集(类型 + 本函数)——写入纪律归 session 落码批。
|
|
15
|
+
*/
|
|
16
|
+
export function parseEventSource(source) {
|
|
17
|
+
if (source.startsWith('channel:')) {
|
|
18
|
+
return { kind: 'channel', raw: source, treatedAsUser: true };
|
|
19
|
+
}
|
|
20
|
+
if (source.startsWith('plugin:')) {
|
|
21
|
+
return { kind: 'plugin', raw: source, treatedAsUser: false };
|
|
22
|
+
}
|
|
23
|
+
if (source.startsWith('session:')) {
|
|
24
|
+
// 跨会话操控注入(模型工具道——前缀自描述送话会话 id):agent 互搏注入
|
|
25
|
+
// 非用户话语,投影位与 plugin 同判 false(05 §3.1 session: 行)
|
|
26
|
+
return { kind: 'session', raw: source, treatedAsUser: false };
|
|
27
|
+
}
|
|
28
|
+
const literal = LITERAL_SOURCE_KINDS[source];
|
|
29
|
+
if (literal) {
|
|
30
|
+
// compaction 是摘要载体:不是人说的——投影位与 plugin 同判 false;
|
|
31
|
+
// subagent-approval-pending 与 subagent-settled 同通道同型(04 §10
|
|
32
|
+
// UserMessage 注入位)——投影同视用户话语;budget-extended 与 schedule
|
|
33
|
+
// 同形(机器注入的起跑输入位,05 §3.1 第六字面量)——投影同视用户话语
|
|
34
|
+
const treatedAsUser = literal === 'user' ||
|
|
35
|
+
literal === 'schedule' ||
|
|
36
|
+
literal === 'subagent-settled' ||
|
|
37
|
+
literal === 'subagent-approval-pending' ||
|
|
38
|
+
literal === 'budget-extended';
|
|
39
|
+
return { kind: literal, raw: source, treatedAsUser };
|
|
40
|
+
}
|
|
41
|
+
// 未知字面量:旧日志向前兼容——按 user 同视(读侧宽容,append 侧严进)
|
|
42
|
+
return { kind: 'user', raw: source, treatedAsUser: true };
|
|
43
|
+
}
|
|
44
|
+
/* ---------------- 子代理与 Job 注册表(04 §10——批 15c 契约先行) ---------------- */
|
|
45
|
+
/**
|
|
46
|
+
* 委派深度帽(04 §10 委派边界③):根会话委派 = 深度 1;子代理再委派逐层 +1;
|
|
47
|
+
* 超帽 3 拒(SUBAGENT_DEPTH_EXCEEDED——防自嵌套爆栈)。
|
|
48
|
+
*/
|
|
49
|
+
export const SUBAGENT_DEPTH_MAX = 3;
|
|
50
|
+
void true;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI 通道后端契约(07 篇 §4.1/§4.3 机制真源;03 §2.2 registerUiBackend
|
|
3
|
+
* 插件注册面)。
|
|
4
|
+
*
|
|
5
|
+
* 归位注记(2026-09-08 U3 落码批):本族类型原住 channels 件
|
|
6
|
+
* (src/channels/types.ts),为插件侧类型可达(虚拟主键 `berry-agent` 面只达
|
|
7
|
+
* contracts——03 §2.2 定形注记)随 U3-1 归位本件(批 11b ApprovalAsk 归位
|
|
8
|
+
* 同款先例);channels 公开面 re-export 维持不变。
|
|
9
|
+
*
|
|
10
|
+
* 插件实装形 = `UiBackend<never>`:投影泛型 TProjection 由宿主装配钉入
|
|
11
|
+
* (session 域投影类型,插件结构性不可达),插件后端走信封驱动呈现
|
|
12
|
+
* (onEnvelope 活体流)、不参与投影重画(onRepaint/openHistory——
|
|
13
|
+
* SDK/webui 后端 `UiBackend<never>` 同形先例)。
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentEvent } from './agent-events.js';
|
|
16
|
+
import type { ApprovalAskAnswer, ApprovalAskRequest } from './approval.js';
|
|
17
|
+
/**
|
|
18
|
+
* 多会话信封(07 §4.1 channels 纵切批定形三则②):AgentEvent 不带会话归属
|
|
19
|
+
* 是刻意的——loop 是单 run 视角无多会话概念;归属信封的包装位 = host 装配
|
|
20
|
+
* 的 per-run sink 包装器(conversation 侧 sink 签名零 channels 感知、纯
|
|
21
|
+
* AgentEvent 回调注册面,host 汇入 channels 分发器时附加信封——装配根是
|
|
22
|
+
* 唯一允许 import 全部宿主模块的横切层,2026-09-06 冷读裁决 C-1),channels
|
|
23
|
+
* 消费分流。
|
|
24
|
+
*/
|
|
25
|
+
export interface SessionEnvelope {
|
|
26
|
+
readonly sessionId: string;
|
|
27
|
+
readonly event: AgentEvent;
|
|
28
|
+
}
|
|
29
|
+
/** notify 通知档(07 §4.3 签名定稿;'success' = 任务完成语义档) */
|
|
30
|
+
export type NotifyLevel = 'info' | 'success' | 'warn' | 'error';
|
|
31
|
+
/** 阻塞原语公共选项(07 §4.3 撤销面:abort 按取消收场取保守值) */
|
|
32
|
+
export interface UiAskOptions {
|
|
33
|
+
/** 可选中止信号——abort 时 confirm→false / select·input→''(保守值收场) */
|
|
34
|
+
readonly signal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
/** select 单选项(07 §4.3 签名定稿形) */
|
|
37
|
+
export interface UiSelectChoice {
|
|
38
|
+
readonly value: string;
|
|
39
|
+
readonly label: string;
|
|
40
|
+
}
|
|
41
|
+
/** input 原语选项 */
|
|
42
|
+
export interface UiInputOptions extends UiAskOptions {
|
|
43
|
+
readonly placeholder?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 通道能力声明(07 §4.3 通道降级规则的判定面):不支持的原语按
|
|
47
|
+
* 「notify 化」降级(select→input→notify、setWidget→notify)——插件不感知
|
|
48
|
+
* 通道能力差异,降级判定与编舞在核。
|
|
49
|
+
*/
|
|
50
|
+
export interface UiCapabilities {
|
|
51
|
+
/** 一次性通知(一切通道的最后降级目标——接口上仍声明,装配健全性由核校验) */
|
|
52
|
+
readonly notify: boolean;
|
|
53
|
+
readonly confirm: boolean;
|
|
54
|
+
readonly select: boolean;
|
|
55
|
+
readonly input: boolean;
|
|
56
|
+
/** 审批 ask(07 §4.3 提问队列条款——阻塞原语与审批统一入队的第四原语位) */
|
|
57
|
+
readonly approval: boolean;
|
|
58
|
+
readonly setStatus: boolean;
|
|
59
|
+
readonly setWidget: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 通道后端接口(通道核的呈现消费面)。TUI 实装 = channels 件内自研 TuiBackend
|
|
63
|
+
* (批 10e 已落)、webui 件同面接入;核经此面驱动一切呈现——阻塞原语多后端并发竞速(04 §9 跨入口竞速
|
|
64
|
+
* 先答先得),败腿经 signal 撤销收场(07 §4.3 撤销面同链)。
|
|
65
|
+
*/
|
|
66
|
+
export interface UiBackend<TProjection> {
|
|
67
|
+
/** 后端身份('tui' / 'webui'——日志与调试面,非能力位) */
|
|
68
|
+
readonly id: string;
|
|
69
|
+
readonly capabilities: UiCapabilities;
|
|
70
|
+
/** 观众探针:本后端自报有观众(TUI 恒真 / webui 报在线连接数 > 0——07 §4.3) */
|
|
71
|
+
hasAudience(): boolean;
|
|
72
|
+
/** 一次性通知(level 档通道不识别时向后端自身归一 info) */
|
|
73
|
+
notify(message: string, opts?: {
|
|
74
|
+
level?: NotifyLevel;
|
|
75
|
+
}): void;
|
|
76
|
+
/** 是/否确认(仅 capable 后端被调——缺席面降级判定在核) */
|
|
77
|
+
confirm?(message: string, opts?: UiAskOptions): Promise<boolean>;
|
|
78
|
+
/** 单选(Enter 选定 / Esc 取消收 ''——TUI 原生实装语义) */
|
|
79
|
+
select?(message: string, choices: readonly UiSelectChoice[], opts?: UiAskOptions): Promise<string>;
|
|
80
|
+
/** 自由文本输入 */
|
|
81
|
+
input?(message: string, opts?: UiInputOptions): Promise<string>;
|
|
82
|
+
/**
|
|
83
|
+
* 审批 ask(仅 capable 后端被调——呈现形态归后端:TUI 主屏浮层是队首呈现之一)。
|
|
84
|
+
* sessionId 首参 = 会话归属承载位(批 13b-3 随 SDK 通道后端定形——ask 帧信封
|
|
85
|
+
* 必携会话归属;核心面 07 §4.3 `askApproval(sessionId, request)` 本含会话位,
|
|
86
|
+
* 后端面同携)。
|
|
87
|
+
*/
|
|
88
|
+
askApproval?(sessionId: string, request: ApprovalAskRequest, opts?: UiAskOptions): Promise<ApprovalAskAnswer>;
|
|
89
|
+
/** 状态行更新(last-writer-wins——多写者自然覆盖) */
|
|
90
|
+
setStatus?(sessionId: string, status: string): void;
|
|
91
|
+
/** 自定义渲染槽呈现(会话级单槽值由核维护——见 UiCore.setWidget) */
|
|
92
|
+
setWidget?(sessionId: string, node: unknown | null): void;
|
|
93
|
+
/** 活体信封呈现(focused 位由核路由——聚焦全渲染/非聚焦摘要行,形态归后端) */
|
|
94
|
+
onEnvelope?(env: SessionEnvelope, focused: boolean): void;
|
|
95
|
+
/** 重画呈现(焦点切换/初始——载荷 = 投影快照 + 该会话当前 widget 槽值) */
|
|
96
|
+
onRepaint?(sessionId: string, projection: readonly TProjection[], widget: {
|
|
97
|
+
node: unknown;
|
|
98
|
+
} | null): void;
|
|
99
|
+
/**
|
|
100
|
+
* 收起副屏(07 §4.1 件 8「ask 强制收起(注意力优先级 ask > 回看):通道
|
|
101
|
+
* ask 入口先收副屏再入提问队列」条款的可选能力面——批 10f-4)。在场即
|
|
102
|
+
* 实现 = 后端自报有副屏可收(TUI = 1049 备屏退出 + 主屏复起);核 ask
|
|
103
|
+
* 入口扇出本钩。缺席 = 无副屏可收零义务(非 TUI 后端不受影响)。
|
|
104
|
+
*/
|
|
105
|
+
collapseAltScreen?(): void;
|
|
106
|
+
/**
|
|
107
|
+
* 开副屏回看器(07 §4.1 件 8 /history 命令的呈现面——命令注册在通道核按
|
|
108
|
+
* ChannelsOptions.history 注入在场判)。载荷 = 全量 durable 正文投影
|
|
109
|
+
* (history() 拉取);呈现形态归后端(TUI = 1049 副屏整屏回看,同一渲染
|
|
110
|
+
* 管线零第二渲染器)。缺席 = 不支持整屏回看的后端。
|
|
111
|
+
*/
|
|
112
|
+
openHistory?(sessionId: string, messages: readonly TProjection[]): void;
|
|
113
|
+
/**
|
|
114
|
+
* 开副屏记忆管理面(06 §7 `/memory` 命令的呈现面——命令注册在通道核按
|
|
115
|
+
* ChannelsOptions.memory 注入在场判;mm 批)。零参形——材料归后端装配
|
|
116
|
+
* 自持(数据不经通道核流转:TuiBackend 经后置 setMemoryScreen 注入位持
|
|
117
|
+
* 有 DAO 窄面/消毒函数/导出闭包,与 openHistory 的载荷经核流转分立)。
|
|
118
|
+
* 返 boolean:true = 已开(支持且有材料);false = 不支持或缺材料——核
|
|
119
|
+
* 据此走 notify 降级提示(不静默)。缺席 = 不支持管理面的后端。
|
|
120
|
+
*/
|
|
121
|
+
openMemory?(): boolean;
|
|
122
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI 通道后端契约(07 篇 §4.1/§4.3 机制真源;03 §2.2 registerUiBackend
|
|
3
|
+
* 插件注册面)。
|
|
4
|
+
*
|
|
5
|
+
* 归位注记(2026-09-08 U3 落码批):本族类型原住 channels 件
|
|
6
|
+
* (src/channels/types.ts),为插件侧类型可达(虚拟主键 `berry-agent` 面只达
|
|
7
|
+
* contracts——03 §2.2 定形注记)随 U3-1 归位本件(批 11b ApprovalAsk 归位
|
|
8
|
+
* 同款先例);channels 公开面 re-export 维持不变。
|
|
9
|
+
*
|
|
10
|
+
* 插件实装形 = `UiBackend<never>`:投影泛型 TProjection 由宿主装配钉入
|
|
11
|
+
* (session 域投影类型,插件结构性不可达),插件后端走信封驱动呈现
|
|
12
|
+
* (onEnvelope 活体流)、不参与投影重画(onRepaint/openHistory——
|
|
13
|
+
* SDK/webui 后端 `UiBackend<never>` 同形先例)。
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctx.agent 服务面(02 §2.3「ctx.agent provide」/ 03 §2.2 能力面表)——
|
|
3
|
+
* conversation 件经 scope.provide('agent', …) 供给的服务词汇。
|
|
4
|
+
*
|
|
5
|
+
* 两动词(03 篇能力面表在册——本面只登记不重复语义):
|
|
6
|
+
* - registerMessageRole:自定义消息角色注册(contracts 注册表的单入口委托
|
|
7
|
+
* ——域名前缀两段式强制/撞名拒绝式执法全在 contracts 单源);
|
|
8
|
+
* - onRunSettled:run 终态订阅(**非总线词汇**——触发契约锚 = run 终态
|
|
9
|
+
* 三值 04 §2;compaction 触发〔05 §2〕消费)。会话内每次 runTurns
|
|
10
|
+
* 结算由 ConversationDriver 在终态边界回调(04 §3——与审批收口同界)。
|
|
11
|
+
*
|
|
12
|
+
* 服务面是进程级单例:多会话共用一枚,订阅回调携 {sessionId} 信封区分
|
|
13
|
+
* 来源会话(多会话并存下活体载荷携带 sessionId 的同律)。
|
|
14
|
+
*/
|
|
15
|
+
import { registerMessageRole } from '../contracts/index.js';
|
|
16
|
+
/** scope 服务名(02 §2.3 ctx.agent provide——服务词汇单源定值) */
|
|
17
|
+
export const AGENT_SERVICE_NAME = 'agent';
|
|
18
|
+
/** 订阅表登记(服务实例 → 终态回调集——驱动回调面的受控读口,WeakMap 随服务回收) */
|
|
19
|
+
const settleTables = new WeakMap();
|
|
20
|
+
/**
|
|
21
|
+
* 组装 ctx.agent 服务并 provide 到装载运行时 scope(host 装配根调用一次,
|
|
22
|
+
* 先于一切驱动起跑——驱动在 runTurns 终态经 scope.tryGet 回调订阅面)。
|
|
23
|
+
*/
|
|
24
|
+
export function provideAgentService(scope) {
|
|
25
|
+
/** run 终态订阅表(注册序回调;dispose 即摘) */
|
|
26
|
+
const settleHandlers = new Set();
|
|
27
|
+
const service = {
|
|
28
|
+
// 委托 contracts 注册表:域名纪律/撞名执法单源在彼,此处零再立法
|
|
29
|
+
registerMessageRole: (role, definition) => registerMessageRole(role, definition),
|
|
30
|
+
onRunSettled: (handler) => {
|
|
31
|
+
settleHandlers.add(handler);
|
|
32
|
+
return () => {
|
|
33
|
+
settleHandlers.delete(handler);
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
settleTables.set(service, settleHandlers);
|
|
38
|
+
scope.provide(AGENT_SERVICE_NAME, service);
|
|
39
|
+
return service;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 驱动侧终态回调(runTurns finally 消费点——04 §3 终态=结算边界,与审批
|
|
43
|
+
* 收口同界)。scope 未 provide(纯对话测试形态/装配序缺口)= 零回调静默
|
|
44
|
+
* 跳过;订阅者异常隔离(emit 族同律——单订阅者故障不反噬 run 结算路径)。
|
|
45
|
+
*/
|
|
46
|
+
export function notifyRunSettled(scope, event) {
|
|
47
|
+
const service = scope.tryGet(AGENT_SERVICE_NAME);
|
|
48
|
+
if (service === undefined)
|
|
49
|
+
return;
|
|
50
|
+
const handlers = settleTables.get(service);
|
|
51
|
+
if (handlers === undefined)
|
|
52
|
+
return;
|
|
53
|
+
for (const handler of [...handlers]) {
|
|
54
|
+
try {
|
|
55
|
+
handler(event);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// 观察者异常隔离——继续其余订阅者,结算路径不受影响
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { APPROVAL_ANSWER_EVENT, bridgeApprovalSignal, createApprovalService } from '../safety/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 组装会话审批三件的前两件。@returns 装配产物(settlePending 归驱动 run 终态
|
|
4
|
+
* 调用——04 §3 终态=结算边界;dispose 归会话拆除)。
|
|
5
|
+
*/
|
|
6
|
+
export function wireSessionApproval(opts) {
|
|
7
|
+
/** 挂起 ask 簿记(本会话 answerer 在身的问询——settlePending 收口对象) */
|
|
8
|
+
const pending = new Set();
|
|
9
|
+
const service = createApprovalService(opts.dispatch, {
|
|
10
|
+
ownership: { sessionId: opts.sessionId },
|
|
11
|
+
...(opts.policy !== undefined ? { policy: opts.policy } : {}),
|
|
12
|
+
...(opts.persistToolPolicy !== undefined ? { persistToolPolicy: opts.persistToolPolicy } : {}),
|
|
13
|
+
// 审批对 durable 落账(05 §1.1 词行 data 形与 sink 载荷一一对应)
|
|
14
|
+
sink: {
|
|
15
|
+
asked: (payload) => opts.session.append('approval/asked', payload),
|
|
16
|
+
decided: (payload) => opts.session.append('approval/decided', payload),
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const off = opts.dispatch.onWaterfall(APPROVAL_ANSWER_EVENT, async (input, next) => {
|
|
20
|
+
// 归属路由(恰一键条款):他会话的 ask 不接——交棒下游(他会的 answerer
|
|
21
|
+
// 或全链无答 unavailable),不越权代答
|
|
22
|
+
if (input.req.ownership?.sessionId !== opts.sessionId)
|
|
23
|
+
return next(input);
|
|
24
|
+
// 呈现面缺席:本行不答(交棒;全链无答 = fail-closed unavailable)
|
|
25
|
+
if (opts.askApproval === undefined)
|
|
26
|
+
return next(input);
|
|
27
|
+
// run 信号桥(04 §9 run 信号透传):已 abort 的 signal 同步触发
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const unbridge = bridgeApprovalSignal(input.req, controller);
|
|
30
|
+
// 挂起簿记 + 收口竞速:settlePending 先胜 = 无答案(迟到答案被弃)
|
|
31
|
+
let settleAsk;
|
|
32
|
+
const settled = new Promise((resolve) => {
|
|
33
|
+
settleAsk = resolve;
|
|
34
|
+
});
|
|
35
|
+
const entry = { settle: settleAsk };
|
|
36
|
+
pending.add(entry);
|
|
37
|
+
let answer;
|
|
38
|
+
try {
|
|
39
|
+
answer = await Promise.race([
|
|
40
|
+
// 呈现面异常 = 无答案(不答交棒——fail-closed 由 service 全链无答承担)
|
|
41
|
+
opts.askApproval(toAskRequest(input.req), { signal: controller.signal }).catch(() => undefined),
|
|
42
|
+
settled,
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
pending.delete(entry);
|
|
47
|
+
unbridge();
|
|
48
|
+
}
|
|
49
|
+
if (answer !== undefined) {
|
|
50
|
+
input.answer = answer; // 能答短路(不调 next——本链应答位;可变载荷就地写)
|
|
51
|
+
return input;
|
|
52
|
+
}
|
|
53
|
+
return next(input);
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
approval: service,
|
|
57
|
+
settlePending() {
|
|
58
|
+
// turn 界闭合:统一无答案(service 落 unavailable)——通道没了问也无从答
|
|
59
|
+
for (const entry of [...pending])
|
|
60
|
+
entry.settle(undefined);
|
|
61
|
+
},
|
|
62
|
+
dispose() {
|
|
63
|
+
off();
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* safety ApprovalRequest → 呈现载荷(contracts/approval 单源形):
|
|
69
|
+
* suggestedEntry 草案对象折人可读一行(`<tool> <pattern>`——面板展示面,
|
|
70
|
+
* 回写走 persistToolPolicy 的结构形草案,不经本串)。
|
|
71
|
+
*/
|
|
72
|
+
function toAskRequest(req) {
|
|
73
|
+
return {
|
|
74
|
+
summary: req.summary,
|
|
75
|
+
...(req.reason !== undefined ? { reason: req.reason } : {}),
|
|
76
|
+
...(req.toolName !== undefined ? { toolName: req.toolName } : {}),
|
|
77
|
+
...(req.approvalId !== undefined ? { approvalId: req.approvalId } : {}),
|
|
78
|
+
...(req.suggestedEntry !== undefined
|
|
79
|
+
? { suggestedEntry: `${req.suggestedEntry.tool} ${req.suggestedEntry.pattern}` }
|
|
80
|
+
: {}),
|
|
81
|
+
};
|
|
82
|
+
}
|