@bolloon/bolloon-agent 0.5.5 → 0.6.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/dist/agents/execution-entry.js +10 -0
- package/dist/agents/goal-flywheel/wiring/seams.js +5 -1
- package/dist/agents/parse-tool-call.js +6 -1
- package/dist/agents/pi-sdk-session-factory.js +36 -3
- package/dist/agents/pi-sdk-tools.js +18 -8
- package/dist/agents/pi-sdk.js +749 -1390
- package/dist/agents/run-context.js +20 -0
- package/dist/agents/runner-resolver.js +3 -1
- package/dist/agents/tool-capability/index.js +51 -0
- package/dist/agents/workflow-pivot-loop.js +31 -10
- package/dist/agents/write-verify.js +60 -0
- package/dist/bollharness-integration/integration.js +8 -0
- package/dist/bollharness-integration/skill-adapter.js +32 -3
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +5 -1
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -1
- package/dist/electron-build/agents/parse-tool-call.js +6 -1
- package/dist/electron-build/agents/parse-tool-call.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-session-factory.js +36 -3
- package/dist/electron-build/agents/pi-sdk-session-factory.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-tools.js +21 -11
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +750 -1389
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/run-context.js +24 -0
- package/dist/electron-build/agents/run-context.js.map +1 -0
- package/dist/electron-build/agents/runner-resolver.js +3 -1
- package/dist/electron-build/agents/runner-resolver.js.map +1 -1
- package/dist/electron-build/agents/tool-capability/index.js +90 -0
- package/dist/electron-build/agents/tool-capability/index.js.map +1 -0
- package/dist/electron-build/agents/workflow-pivot-loop.js +31 -10
- package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
- package/dist/electron-build/agents/write-verify.js +99 -0
- package/dist/electron-build/agents/write-verify.js.map +1 -0
- package/dist/electron-build/bollharness-integration/integration.js +8 -0
- package/dist/electron-build/bollharness-integration/integration.js.map +1 -1
- package/dist/electron-build/bollharness-integration/skill-adapter.js +32 -3
- package/dist/electron-build/bollharness-integration/skill-adapter.js.map +1 -1
- package/dist/electron-build/kernel/channel-actor.js +339 -0
- package/dist/electron-build/kernel/channel-actor.js.map +1 -0
- package/dist/electron-build/kernel/control.js +102 -0
- package/dist/electron-build/kernel/control.js.map +1 -0
- package/dist/electron-build/kernel/model-runtime.js +508 -0
- package/dist/electron-build/kernel/model-runtime.js.map +1 -0
- package/dist/electron-build/kernel/run-lifecycle.js +146 -0
- package/dist/electron-build/kernel/run-lifecycle.js.map +1 -0
- package/dist/electron-build/kernel/transport.js +119 -0
- package/dist/electron-build/kernel/transport.js.map +1 -0
- package/dist/electron-build/llm/native-adapter.js +122 -0
- package/dist/electron-build/llm/native-adapter.js.map +1 -0
- package/dist/index.js +43 -19
- package/dist/ios/bolloon-web.json +3 -3
- package/dist/ios/client.js +13 -7
- package/dist/ios/mobile-core.js +7762 -6289
- package/dist/ios/mobile.js +64 -0
- package/dist/ios/routes-mobile-tasks.js +2 -1
- package/dist/ios/routes-tasks.js +16 -1
- package/dist/ios/routes-x402-info.js +28 -1
- package/dist/ios/server-storage.js +26 -5
- package/dist/ios/server.js +840 -862
- package/dist/ios/sw.js +1 -1
- package/dist/ios/ui/message-renderer.js +473 -29
- package/dist/ios/ui/step-timeline.js +13 -12
- package/dist/kernel/channel-actor.js +321 -0
- package/dist/kernel/control.js +95 -0
- package/dist/kernel/gate-scan.js +1350 -0
- package/dist/kernel/model-runtime.js +494 -0
- package/dist/kernel/plan-channel-actor.js +305 -0
- package/dist/kernel/plan-communication.js +163 -0
- package/dist/kernel/plan-constraint.js +152 -0
- package/dist/kernel/plan-deletion.js +32 -0
- package/dist/kernel/plan-harness.js +78 -0
- package/dist/kernel/plan-modelruntime.js +60 -0
- package/dist/kernel/plan-runcontext.js +163 -0
- package/dist/kernel/plan.js +149 -0
- package/dist/kernel/roster.js +244 -0
- package/dist/kernel/run-lifecycle.js +138 -0
- package/dist/kernel/transport.js +111 -0
- package/dist/llm/native-adapter.js +117 -0
- package/dist/web/bolloon-web.json +3 -3
- package/dist/web/client.js +12 -7
- package/dist/web/routes-tasks.js +16 -1
- package/dist/web/server.js +838 -862
- package/dist/web/sw.js +1 -1
- package/dist/web/ui/message-renderer.js +473 -29
- package/dist/web/ui/step-timeline.js +13 -12
- package/package.json +1 -1
- package/scripts/build-web.ts +74 -1
- package/dist/constraint-runtime/_archive_helper.d.ts +0 -1
- package/dist/constraint-runtime/_archive_helper.js +0 -9
- package/dist/constraint-runtime/assistant/index.d.ts +0 -11
- package/dist/constraint-runtime/assistant/index.js +0 -12
- package/dist/constraint-runtime/bootstrap/index.d.ts +0 -11
- package/dist/constraint-runtime/bootstrap/index.js +0 -12
- package/dist/constraint-runtime/bridge/index.d.ts +0 -11
- package/dist/constraint-runtime/bridge/index.js +0 -12
- package/dist/constraint-runtime/buddy/index.d.ts +0 -11
- package/dist/constraint-runtime/buddy/index.js +0 -12
- package/dist/constraint-runtime/cli/index.d.ts +0 -11
- package/dist/constraint-runtime/cli/index.js +0 -12
- package/dist/constraint-runtime/components/index.d.ts +0 -11
- package/dist/constraint-runtime/components/index.js +0 -12
- package/dist/constraint-runtime/constants/index.d.ts +0 -11
- package/dist/constraint-runtime/constants/index.js +0 -12
- package/dist/constraint-runtime/coordinator/index.d.ts +0 -11
- package/dist/constraint-runtime/coordinator/index.js +0 -12
- package/dist/constraint-runtime/cost_hook.d.ts +0 -2
- package/dist/constraint-runtime/cost_hook.js +0 -4
- package/dist/constraint-runtime/entrypoints/index.d.ts +0 -11
- package/dist/constraint-runtime/entrypoints/index.js +0 -12
- package/dist/constraint-runtime/execution_registry.d.ts +0 -20
- package/dist/constraint-runtime/execution_registry.js +0 -44
- package/dist/constraint-runtime/hooks/index.d.ts +0 -11
- package/dist/constraint-runtime/hooks/index.js +0 -12
- package/dist/constraint-runtime/ink.d.ts +0 -1
- package/dist/constraint-runtime/ink.js +0 -4
- package/dist/constraint-runtime/keybindings/index.d.ts +0 -11
- package/dist/constraint-runtime/keybindings/index.js +0 -12
- package/dist/constraint-runtime/memdir/index.d.ts +0 -11
- package/dist/constraint-runtime/memdir/index.js +0 -12
- package/dist/constraint-runtime/migrations/index.d.ts +0 -11
- package/dist/constraint-runtime/migrations/index.js +0 -12
- package/dist/constraint-runtime/moreright/index.d.ts +0 -11
- package/dist/constraint-runtime/moreright/index.js +0 -12
- package/dist/constraint-runtime/native_ts/index.d.ts +0 -11
- package/dist/constraint-runtime/native_ts/index.js +0 -12
- package/dist/constraint-runtime/output_styles/index.d.ts +0 -11
- package/dist/constraint-runtime/output_styles/index.js +0 -12
- package/dist/constraint-runtime/plugins/index.d.ts +0 -11
- package/dist/constraint-runtime/plugins/index.js +0 -12
- package/dist/constraint-runtime/port_manifest.d.ts +0 -7
- package/dist/constraint-runtime/port_manifest.js +0 -11
- package/dist/constraint-runtime/query.d.ts +0 -6
- package/dist/constraint-runtime/query.js +0 -1
- package/dist/constraint-runtime/remote/index.d.ts +0 -11
- package/dist/constraint-runtime/remote/index.js +0 -12
- package/dist/constraint-runtime/schemas/index.d.ts +0 -11
- package/dist/constraint-runtime/schemas/index.js +0 -12
- package/dist/constraint-runtime/screens/index.d.ts +0 -11
- package/dist/constraint-runtime/screens/index.js +0 -12
- package/dist/constraint-runtime/server/index.d.ts +0 -11
- package/dist/constraint-runtime/server/index.js +0 -12
- package/dist/constraint-runtime/services/index.d.ts +0 -11
- package/dist/constraint-runtime/services/index.js +0 -12
- package/dist/constraint-runtime/state/index.d.ts +0 -11
- package/dist/constraint-runtime/state/index.js +0 -12
- package/dist/constraint-runtime/system_init.d.ts +0 -1
- package/dist/constraint-runtime/system_init.js +0 -20
- package/dist/constraint-runtime/types/index.d.ts +0 -11
- package/dist/constraint-runtime/types/index.js +0 -12
- package/dist/constraint-runtime/upstream_proxy/index.d.ts +0 -11
- package/dist/constraint-runtime/upstream_proxy/index.js +0 -12
- package/dist/constraint-runtime/utils/index.d.ts +0 -11
- package/dist/constraint-runtime/utils/index.js +0 -12
- package/dist/constraint-runtime/vim/index.d.ts +0 -11
- package/dist/constraint-runtime/vim/index.js +0 -12
- package/dist/constraint-runtime/voice/index.d.ts +0 -11
- package/dist/constraint-runtime/voice/index.js +0 -12
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* K0 ②③④ —— 模块 owner 名册 · 入口调用关系图 · 旧代码删除台账 (冻结面, 数据, 零 import)
|
|
3
|
+
*
|
|
4
|
+
* 这三样是 leo 修订版 K0 的缺项 (原 K0 只交了 import 白名单 / 越权检测 / 行数棘轮)。
|
|
5
|
+
* 判据: src/test/kernel-plan.test.ts; 纯函数: src/kernel/gate-scan.ts。
|
|
6
|
+
*
|
|
7
|
+
* 生成口径 (防"好看的架构图"):
|
|
8
|
+
* · owner 名册由**真实文件清单机械生成** + 逐条处置 —— 门枚举 src/ 每个产品码文件, 必须恰好命中一条;
|
|
9
|
+
* · ENTRY_GRAPH 每行由**判据自己扫出来的**调用点填 (不手写): 门重扫一次必须逐字相等 (含 count);
|
|
10
|
+
* · 删除候选集用**集合 sha256** 冻结: 增/删/替换任一条都变哈希 ⇒ 红。
|
|
11
|
+
*/
|
|
12
|
+
/** ② 模块 owner 名册 —— 覆盖 src/ 全部产品码 (test/ 与 constraint-runtime/ 另册) */
|
|
13
|
+
export const MODULE_OWNERS = [
|
|
14
|
+
{ key: 'kernel/', module: 'kernel', owner: '内核线', disposition: 'keep', phase: 'K0', note: "K1/K2/K3 三道门 + 台账" },
|
|
15
|
+
{ key: 'agents/pi-sdk.ts', module: 'adapter', owner: '推理适配器线', disposition: 'converge', phase: 'K2/K4/K10', note: "Pi 可变状态外置 → 拆 Adapter" },
|
|
16
|
+
{ key: 'agents/workflow-pivot-loop.ts', module: 'adapter', owner: '推理适配器线', disposition: 'converge', phase: 'K4', note: "旧 loop 降为策略" },
|
|
17
|
+
{ key: 'agents/loop-review.ts', module: 'adapter', owner: '推理适配器线', disposition: 'converge', phase: 'K4', note: "并进 KernelLoop 的 reducer 段" },
|
|
18
|
+
{ key: 'agents/react-loop.ts', module: 'adapter', owner: '推理适配器线', disposition: 'converge', phase: 'K4', note: "并进 KernelLoop" },
|
|
19
|
+
{ key: 'agents/pi-sdk-tools.ts', module: 'tools', owner: 'Tool 线', disposition: 'converge', phase: 'K7', note: "经 Harness 唯一门" },
|
|
20
|
+
{ key: 'agents/pi-harness.ts', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "已是唯一门面, 继续补齐" },
|
|
21
|
+
{ key: 'agents/deny-pipeline.ts', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
22
|
+
{ key: 'agents/pre-tool-validator.ts', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
23
|
+
{ key: 'agents/permission-mode.ts', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
24
|
+
{ key: 'agents/shell-guard.ts', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
25
|
+
{ key: 'agents/goal-store.ts', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "唯一事实来源" },
|
|
26
|
+
{ key: 'agents/run-store.ts', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "唯一事实来源" },
|
|
27
|
+
{ key: 'agents/decision-store.ts', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "" },
|
|
28
|
+
{ key: 'agents/plan-store.ts', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "" },
|
|
29
|
+
{ key: 'agents/pi-sdk-session-manager.ts', module: 'channel', owner: 'Channel 线', disposition: 'converge', phase: 'K2', note: "Session 不再是全局可变状态中心" },
|
|
30
|
+
{ key: 'agents/pi-sdk-session-factory.ts', module: 'channel', owner: 'Channel 线', disposition: 'converge', phase: 'K2', note: "" },
|
|
31
|
+
{ key: 'agents/session-store.ts', module: 'channel', owner: 'Channel 线', disposition: 'keep', phase: 'K2', note: "" },
|
|
32
|
+
{ key: 'agents/', module: 'agents-misc', owner: 'Agent 装配线', disposition: 'converge', phase: 'K2/K7', note: "逐个判归宿: 状态类→state, 工具类→tools" },
|
|
33
|
+
{ key: 'llm/', module: 'llm', owner: 'Model 线', disposition: 'keep', phase: 'K6', note: "唯一写口保留, 加 ModelRuntime 只读层" },
|
|
34
|
+
{ key: 'security/', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
35
|
+
{ key: 'web/', module: 'channel-web', owner: 'Channel 线', disposition: 'converge', phase: 'K3/K5', note: "入口只能投递事件" },
|
|
36
|
+
{ key: 'cli/', module: 'cli', owner: 'CLI 表面线', disposition: 'converge', phase: 'K3', note: "与 Web 共用同一 KernelLoop" },
|
|
37
|
+
{ key: 'external-engines/', module: 'delegate', owner: '子 Agent 线', disposition: 'converge', phase: 'K7', note: "子 Agent 不能结束 Goal" },
|
|
38
|
+
{ key: 'bollharness/', module: 'bollharness', owner: '外部项目镜像', disposition: 'freeze', phase: '第一批审查', note: "**不是 Bolloon 运行时**; 68 文件, 61 个 0 入边" },
|
|
39
|
+
{ key: 'bollharness-integration/', module: 'bollharness-integration', owner: 'Harness 集成线', disposition: 'freeze', phase: '第一批审查', note: "" },
|
|
40
|
+
{ key: 'bootstrap/', module: 'bootstrap', owner: '装配/上下文线', disposition: 'converge', phase: 'K2', note: "Context 归 RunContext/ChannelContext" },
|
|
41
|
+
{ key: 'context-compaction/', module: 'bootstrap', owner: '装配/上下文线', disposition: 'converge', phase: 'K2', note: "" },
|
|
42
|
+
{ key: 'cron/', module: 'channel', owner: 'Channel 线', disposition: 'converge', phase: 'K3', note: "入口只能投递事件" },
|
|
43
|
+
{ key: 'network/', module: 'communication', owner: '通信线', disposition: 'converge', phase: 'K8', note: "绝不能 transport → agent.promptStream" },
|
|
44
|
+
{ key: 'git-transport/', module: 'communication', owner: '通信线', disposition: 'converge', phase: 'K8', note: "" },
|
|
45
|
+
{ key: 'orbitdb/', module: 'communication', owner: '通信线', disposition: 'keep', phase: 'K8', note: "群/事件层已被 P0-P5 验收" },
|
|
46
|
+
{ key: 'heartbeat/', module: 'communication', owner: '通信线', disposition: 'converge', phase: 'K8', note: "" },
|
|
47
|
+
{ key: 'social/', module: 'communication', owner: '通信线', disposition: 'converge', phase: 'K8', note: "" },
|
|
48
|
+
{ key: 'pi-ecosystem-judgment/', module: 'judgment', owner: '判断力线', disposition: 'converge', phase: 'K7', note: "经 Harness 接入" },
|
|
49
|
+
{ key: 'judgeness/', module: 'judgment', owner: '判断力线', disposition: 'converge', phase: 'K7', note: "" },
|
|
50
|
+
{ key: 'pi-ecosystem-mcp/', module: 'judgment', owner: 'MCP 线', disposition: 'converge', phase: 'K7', note: "MCP 不能绕过 Harness" },
|
|
51
|
+
{ key: 'pi-ecosystem-a2ui/', module: 'judgment', owner: 'UI 桥线', disposition: 'freeze', phase: 'K7', note: "" },
|
|
52
|
+
{ key: 'pi-ecosystem-goals/', module: 'state', owner: 'Goal-Run 线', disposition: 'freeze', phase: 'K2', note: "与 goal-store 职责待收敛" },
|
|
53
|
+
{ key: 'workflows/', module: 'adapter', owner: '推理适配器线', disposition: 'converge', phase: 'K4', note: "" },
|
|
54
|
+
{ key: 'documents/', module: 'tools', owner: 'Tool 线', disposition: 'converge', phase: 'K7', note: "" },
|
|
55
|
+
{ key: 'lsp/', module: 'tools', owner: 'Tool 线', disposition: 'converge', phase: 'K7', note: "" },
|
|
56
|
+
{ key: 'hooks/', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "hooks-engine 属策略面" },
|
|
57
|
+
{ key: 'constraints/', module: 'policy', owner: 'Harness 线', disposition: 'keep', phase: 'K7', note: "" },
|
|
58
|
+
{ key: 'storage/', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "" },
|
|
59
|
+
{ key: 'setup/', module: 'bootstrap', owner: '装配/上下文线', disposition: 'converge', phase: 'K2', note: "" },
|
|
60
|
+
{ key: 'utils/', module: 'shared', owner: '共享原语线', disposition: 'keep', phase: '—', note: "全仓可用的纯工具" },
|
|
61
|
+
{ key: 'locales/', module: 'shared', owner: '共享原语线', disposition: 'keep', phase: '—', note: "" },
|
|
62
|
+
{ key: 'efficode/', module: 'efficode', owner: '对外协议线', disposition: 'freeze', phase: '第一批审查', note: "AI 间交流语言, 不属内核" },
|
|
63
|
+
{ key: 'electron/', module: 'electron', owner: '桌面壳', disposition: 'freeze', phase: '第一批审查', note: "" },
|
|
64
|
+
{ key: 'migration/', module: 'migration', owner: '迁移脚本', disposition: 'freeze', phase: '第一批审查', note: "一次性" },
|
|
65
|
+
{ key: 'scripts/', module: 'scripts', owner: '内嵌脚本', disposition: 'freeze', phase: '第一批审查', note: "" },
|
|
66
|
+
{ key: 'cli-entry.ts', module: 'entry', owner: '入口装配', disposition: 'converge', phase: 'K3', note: "CLI 入口: 只能投递事件" },
|
|
67
|
+
{ key: 'index.ts', module: 'entry', owner: '入口装配', disposition: 'converge', phase: 'K3', note: "CLI/Web 装配点; 8 处直调 prompt" },
|
|
68
|
+
{ key: 'electron.ts', module: 'electron', owner: '桌面壳', disposition: 'freeze', phase: '第一批审查', note: "" },
|
|
69
|
+
{ key: 'electron-preload.ts', module: 'electron', owner: '桌面壳', disposition: 'freeze', phase: '第一批审查', note: "" },
|
|
70
|
+
{ key: 'pi-ecosystem-subagents/', module: 'judgment', owner: '子智能体线', disposition: 'converge', phase: 'K7', note: "" },
|
|
71
|
+
{ key: 'pi-ecosystem/', module: 'judgment', owner: '判断力/MCP 线', disposition: 'converge', phase: 'K7', note: "" },
|
|
72
|
+
{ key: 'agents/x402/', module: 'state', owner: 'Goal-Run 线', disposition: 'keep', phase: 'K2', note: "交易/支付事实层" },
|
|
73
|
+
];
|
|
74
|
+
/** 名册外的根 (各有自己的册子, 不混进产品码覆盖判据) */
|
|
75
|
+
export const OUT_OF_SCOPE_ROOTS = ['test/', 'constraint-runtime/'];
|
|
76
|
+
export const ENTRY_GRAPH = [
|
|
77
|
+
// K5 步骤⑦: `runExecution` (一次性请求的唯一入口) 内部派发 —— 新增 prompt/promptStream 各一处
|
|
78
|
+
{ file: 'agents/pi-sdk.ts', kind: 'adapter-internal', method: 'prompt', count: 2, path: 'direct', targetPhase: 'K4', note: "适配器内部 pivot 分派 + runExecution 的非流式派发 (都不是外部入口)" },
|
|
79
|
+
{ file: 'agents/pi-sdk.ts', kind: 'adapter-internal', method: 'promptStream', count: 1, path: 'direct', targetPhase: 'K4', note: "runExecution 的流式派发 (K5 步骤⑦ 新增)" },
|
|
80
|
+
{ file: 'agents/pi-sdk.ts', kind: 'adapter-internal', method: 'promptWithPivotLoop', count: 2, path: 'direct', targetPhase: 'K4', note: "适配器内部 pivot 分派 (不是外部入口)" },
|
|
81
|
+
{ file: 'cli/interface.ts', kind: 'readline-tui', method: 'prompt', count: 3, path: 'queued', targetPhase: 'K3', note: "readline 输入提示, 非 agent 入口" },
|
|
82
|
+
{ file: 'index.ts', kind: 'agent-entry', method: 'prompt', count: 7, path: 'direct', targetPhase: 'K3', note: "CLI 装配点" },
|
|
83
|
+
{ file: 'index.ts', kind: 'agent-entry', method: 'promptStream', count: 1, path: 'direct', targetPhase: 'K3', note: "CLI 装配点" },
|
|
84
|
+
];
|
|
85
|
+
/**
|
|
86
|
+
* 直调 `prompt*()` 的调用点总数 (K3 只许把它压到 0; 棘轮只许减)。
|
|
87
|
+
* ⚠️ 24 → **25** (2026-10-02, K5 步骤⑦): `runExecution` 内部新增 `prompt`/`promptStream` 派发各 1 处 (+2),
|
|
88
|
+
* web/server.ts 用户消息路径改成请求式 (-1)。**这是"形态变化"不是"旁路复活"** —— 见 ENTRY_GRAPH 的两行 adapter-internal。
|
|
89
|
+
*/
|
|
90
|
+
export const ENTRY_DIRECT_CALLS_FROZEN_AT = 13; // 2026-10-02: 20 → 16 → 13 (K8 第四/五步: server.ts 7 处全迁; 只剩 CLI 侧 index.ts 的 8 处) // 2026-10-02: 25 → 20 (K8: 5 处改走 runExecution; 棘轮只许降)
|
|
91
|
+
export const DELETION_LEDGER = [
|
|
92
|
+
{
|
|
93
|
+
target: 'src/constraint-runtime/src/migrations/',
|
|
94
|
+
oldEntry: '无 (0 引用; 不在 CR/src/index.ts 导出面)',
|
|
95
|
+
replacement: '无 (0 引用; 不在 CR/src/index.ts 导出面)',
|
|
96
|
+
remainingRefs: 0,
|
|
97
|
+
runtimeHits: 0,
|
|
98
|
+
acceptance: 'tsc --noEmit 0 错 · 四道 kernel 门 75/75 · 引用面核验 0 处 · pre-commit 聚焦套件',
|
|
99
|
+
rollbackCommit: '9808e8e',
|
|
100
|
+
deletedAt: '2026-10-02',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
target: 'src/constraint-runtime/src/remote/',
|
|
104
|
+
oldEntry: '无 (0 引用; 不在 CR/src/index.ts 导出面)',
|
|
105
|
+
replacement: '无 (0 引用; 不在 CR/src/index.ts 导出面)',
|
|
106
|
+
remainingRefs: 0,
|
|
107
|
+
runtimeHits: 0,
|
|
108
|
+
acceptance: 'tsc --noEmit 0 错 · 四道 kernel 门 75/75 · 引用面核验 0 处 · pre-commit 聚焦套件',
|
|
109
|
+
rollbackCommit: '9808e8e',
|
|
110
|
+
deletedAt: '2026-10-02',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
target: 'src/constraint-runtime/src/<26 个移植存档壳>/index.ts',
|
|
114
|
+
targets: ['src/constraint-runtime/src/assistant/index.ts', 'src/constraint-runtime/src/bootstrap/index.ts', 'src/constraint-runtime/src/bridge/index.ts', 'src/constraint-runtime/src/buddy/index.ts', 'src/constraint-runtime/src/cli/index.ts', 'src/constraint-runtime/src/components/index.ts', 'src/constraint-runtime/src/constants/index.ts', 'src/constraint-runtime/src/coordinator/index.ts', 'src/constraint-runtime/src/entrypoints/index.ts', 'src/constraint-runtime/src/hooks/index.ts', 'src/constraint-runtime/src/keybindings/index.ts', 'src/constraint-runtime/src/memdir/index.ts', 'src/constraint-runtime/src/moreright/index.ts', 'src/constraint-runtime/src/native_ts/index.ts', 'src/constraint-runtime/src/output_styles/index.ts', 'src/constraint-runtime/src/plugins/index.ts', 'src/constraint-runtime/src/schemas/index.ts', 'src/constraint-runtime/src/screens/index.ts', 'src/constraint-runtime/src/server/index.ts', 'src/constraint-runtime/src/services/index.ts', 'src/constraint-runtime/src/state/index.ts', 'src/constraint-runtime/src/types/index.ts', 'src/constraint-runtime/src/upstream_proxy/index.ts', 'src/constraint-runtime/src/utils/index.ts', 'src/constraint-runtime/src/vim/index.ts', 'src/constraint-runtime/src/voice/index.ts'],
|
|
115
|
+
oldEntry: '26 个 15 行移植存档壳 (assistant/bootstrap/bridge/.../voice): 每个 import _archive_helper 并读 reference_data/subsystems/<name>.json 快照, 自述为 "Python placeholder package"',
|
|
116
|
+
replacement: '无 (包入口闭包外 + 主仓 0 引用 + 不在任何快照的 source_hint 里)',
|
|
117
|
+
remainingRefs: 0,
|
|
118
|
+
runtimeHits: 0,
|
|
119
|
+
acceptance: 'CR tsc 0 错 · 主仓 tsc 0 错 · 五道 kernel 门全绿 · 引用 CR 的两个主仓测试 20/20 · 运行期真跑 require(dist/index.js) 25 个导出完好 · 干净重建 dist 保留文件逐字节一致',
|
|
120
|
+
rollbackCommit: '3b1bc42',
|
|
121
|
+
deletedAt: '2026-10-02',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
target: 'src/constraint-runtime/src/_archive_helper.ts',
|
|
125
|
+
targets: ['src/constraint-runtime/src/_archive_helper.ts'],
|
|
126
|
+
oldEntry: 'loadArchiveMetadata(): 读 reference_data/subsystems/<name>.json —— 只被上面 26 个存档壳调用',
|
|
127
|
+
replacement: '无 (随存档壳一起消失; reference_data/subsystems/*.json 变为孤立数据, 待第③批处置)',
|
|
128
|
+
remainingRefs: 0,
|
|
129
|
+
runtimeHits: 0,
|
|
130
|
+
acceptance: '同上 (同一批)',
|
|
131
|
+
rollbackCommit: '3b1bc42',
|
|
132
|
+
deletedAt: '2026-10-02',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
target: 'src/constraint-runtime/src/<6 个根级移植残留>.ts',
|
|
136
|
+
targets: ['src/constraint-runtime/src/_archive_helper.ts', 'src/constraint-runtime/src/cost_hook.ts', 'src/constraint-runtime/src/execution_registry.ts', 'src/constraint-runtime/src/ink.ts', 'src/constraint-runtime/src/port_manifest.ts', 'src/constraint-runtime/src/query.ts', 'src/constraint-runtime/src/system_init.ts'],
|
|
137
|
+
oldEntry: 'cost_hook / execution_registry / ink / port_manifest / query / system_init —— 移植快照的根级镜像文件',
|
|
138
|
+
replacement: '无 (闭包外 + 主仓 0 引用 + 快照 0 点名)',
|
|
139
|
+
remainingRefs: 0,
|
|
140
|
+
runtimeHits: 0,
|
|
141
|
+
acceptance: '同上 (同一批)',
|
|
142
|
+
rollbackCommit: '3b1bc42',
|
|
143
|
+
deletedAt: '2026-10-02',
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
/** 第一批删除候选 = 产品码里 **0 入边引用** 且非入口形态 (机械派生, 不手写) */
|
|
147
|
+
export const DELETION_CANDIDATE_COUNT = 94;
|
|
148
|
+
export const DELETION_CANDIDATE_SHA256 = '8ec437279513ddb82e0d909338c84d003486c3905143615b2b86f76d0d070112';
|
|
149
|
+
export const DELETION_CANDIDATE_DIRS = { "agents": 5, "bollharness-integration": 1, "bollharness": 61, "cli": 1, "(根)": 1, "judgeness": 3, "llm": 1, "network": 3, "orbitdb": 2, "scripts": 1, "social": 2, "utils": 3, "web": 10 };
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bolloon Native Macro-Kernel —— K0 模块名册与越权禁令 (冻结面, **数据, 零逻辑, 零 import**)
|
|
3
|
+
*
|
|
4
|
+
* 设计页: docs/wiki/bolloon-native-macro-kernel.md
|
|
5
|
+
* 门: src/test/kernel-boundary.test.ts (K1 目录边界 / K3 行数棘轮)
|
|
6
|
+
* src/test/kernel-authority.test.ts (K2 五条越权禁令)
|
|
7
|
+
* 判据: src/test/kernel-gate-scan.ts (纯函数吃源码文本; 变异验证在测试里每次真跑)
|
|
8
|
+
*
|
|
9
|
+
* 本文件为什么零 import: 它自己就是「内核目录不许 import 业务模块」这条规则的第一个样本 ——
|
|
10
|
+
* 规则若在本文件上都成立不了, 那道门就是装饰。**别在这里加 import。**
|
|
11
|
+
*
|
|
12
|
+
* 为什么名册要机器校验而不是靠人记: 「模块不许互相越权」写成文档 = 半年后没人知道有没有被绕过;
|
|
13
|
+
* 写成这张表 + 两道门 = 绕过它当场判红。仓里先例: goal-flywheel/wiring/seams.ts + wiring-freeze 门。
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* 层划分 —— **按真实目录/文件声明**, 不是理想蓝图。
|
|
17
|
+
* 这份划分是 K0 的冻结面: 改它等于改门的判据, 必须同时说明为什么 (留 diff)。
|
|
18
|
+
*/
|
|
19
|
+
export const LAYERS = [
|
|
20
|
+
{
|
|
21
|
+
id: 'kernel',
|
|
22
|
+
paths: ['kernel/'],
|
|
23
|
+
role: '内核: 调度 / 队列 / 并发 / 取消 / 超时 / 资源隔离 / 状态提交 / 事件派发 (只机制, 不业务判断)',
|
|
24
|
+
},
|
|
25
|
+
{ id: 'llm', paths: ['llm/'], role: 'Model Runtime + 供应商/目录/发现/模型选择协议 (写口唯一)' },
|
|
26
|
+
{
|
|
27
|
+
id: 'policy',
|
|
28
|
+
paths: [
|
|
29
|
+
'security/',
|
|
30
|
+
'agents/pi-harness.ts',
|
|
31
|
+
'agents/deny-pipeline.ts',
|
|
32
|
+
'agents/pre-tool-validator.ts',
|
|
33
|
+
'agents/permission-mode.ts',
|
|
34
|
+
'agents/shell-guard.ts',
|
|
35
|
+
],
|
|
36
|
+
role: 'Policy / Harness: 拒绝与许可的唯一判定面',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'state',
|
|
40
|
+
paths: [
|
|
41
|
+
'agents/goal-store.ts',
|
|
42
|
+
'agents/run-store.ts',
|
|
43
|
+
'agents/transaction-store.ts',
|
|
44
|
+
'agents/decision-store.ts',
|
|
45
|
+
'agents/plan-store.ts',
|
|
46
|
+
],
|
|
47
|
+
role: 'Goal / Run / 证据 / 恢复: **唯一事实来源**',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'tools',
|
|
51
|
+
paths: [
|
|
52
|
+
'agents/pi-sdk-tools.ts',
|
|
53
|
+
'agents/patch-tool.ts',
|
|
54
|
+
'agents/computer-use.ts',
|
|
55
|
+
'agents/browser-cdp.ts',
|
|
56
|
+
'agents/tool-subset.ts',
|
|
57
|
+
'agents/managed-services.ts',
|
|
58
|
+
'agents/tool-path-args.ts',
|
|
59
|
+
'agents/tool-result-gate.ts',
|
|
60
|
+
'agents/tool-telemetry.ts',
|
|
61
|
+
'lsp/lsp-tools.ts',
|
|
62
|
+
],
|
|
63
|
+
role: 'Tool Runtime: 工具实现 (副作用在这里, 权限判定不在这里)',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'channel',
|
|
67
|
+
paths: [
|
|
68
|
+
'web/',
|
|
69
|
+
'agents/pi-sdk-session-manager.ts',
|
|
70
|
+
'agents/pi-sdk-session-factory.ts',
|
|
71
|
+
'agents/session-store.ts',
|
|
72
|
+
],
|
|
73
|
+
role: 'Channel Runtime: 通道/会话/入站出站 (将来是一个 Actor)',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'adapter',
|
|
77
|
+
paths: [
|
|
78
|
+
'agents/pi-sdk.ts',
|
|
79
|
+
'agents/workflow-pivot-loop.ts',
|
|
80
|
+
'agents/loop-review.ts',
|
|
81
|
+
'agents/react-loop.ts',
|
|
82
|
+
],
|
|
83
|
+
role: '推理适配器 (当前实现 = Pi; 将来可被第二个实现替换)',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'delegate',
|
|
87
|
+
paths: ['external-engines/', 'agents/runner-resolver.ts'],
|
|
88
|
+
role: '子 Agent / 外部引擎委派',
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
/**
|
|
92
|
+
* K1 —— kernel 目录允许 import 的前缀 (相对 src/)。
|
|
93
|
+
*
|
|
94
|
+
* 现阶段**只许 kernel 内部**: 内核需要的对外能力一律通过 contracts / ports / adapters 传入,
|
|
95
|
+
* 不许自己伸手去摸业务模块 (那正是 pi-sdk.ts 变成 4099 行单体的成因)。
|
|
96
|
+
*/
|
|
97
|
+
export const KERNEL_ALLOWED_IMPORT_PREFIXES = ['kernel/'];
|
|
98
|
+
/**
|
|
99
|
+
* 名册登记的 kernel 目录文件 (相对 src/)。
|
|
100
|
+
* 判据是**双向相等**: 盘上多一个未登记文件 ⇒ 红; 名册有而盘上没有 ⇒ 红。
|
|
101
|
+
* (先例: SEAM_ROSTER 的「名册外无人越界」)
|
|
102
|
+
*/
|
|
103
|
+
export const KERNEL_FILES = ['kernel/channel-actor.ts', 'kernel/control.ts', 'kernel/run-lifecycle.ts', 'kernel/transport.ts', 'kernel/gate-scan.ts', 'kernel/model-runtime.ts', 'kernel/plan-harness.ts', 'kernel/plan-modelruntime.ts', 'kernel/plan-constraint.ts', 'kernel/plan-channel-actor.ts', 'kernel/plan-deletion.ts', 'kernel/plan-runcontext.ts', 'kernel/plan-communication.ts', 'kernel/plan.ts', 'kernel/roster.ts'];
|
|
104
|
+
/** Goal 事实的写入口 (goal-store.ts 的导出中带副作用的那些) */
|
|
105
|
+
export const GOAL_WRITES = [
|
|
106
|
+
'createGoal',
|
|
107
|
+
'updateGoal',
|
|
108
|
+
'attachRun',
|
|
109
|
+
'markCriterion',
|
|
110
|
+
'setUnresolved',
|
|
111
|
+
'addEvidence',
|
|
112
|
+
'setCriteria',
|
|
113
|
+
'completeGoalIfEligible',
|
|
114
|
+
'setContinuation',
|
|
115
|
+
'bumpContinuationAttempts',
|
|
116
|
+
'resetContinuationAttempts',
|
|
117
|
+
'claimGoal',
|
|
118
|
+
'heartbeatGoal',
|
|
119
|
+
'releaseGoal',
|
|
120
|
+
];
|
|
121
|
+
/** Run 事实的写入口 (run-store.ts 的导出中带副作用的那些) */
|
|
122
|
+
export const RUN_WRITES = [
|
|
123
|
+
'startRun',
|
|
124
|
+
'setRunStatus',
|
|
125
|
+
'saveCheckpoint',
|
|
126
|
+
'recordRecovery',
|
|
127
|
+
'recordHarnessEvent',
|
|
128
|
+
'recordModelSwitch',
|
|
129
|
+
'addRunEvidence',
|
|
130
|
+
'recordStep',
|
|
131
|
+
'finishRun',
|
|
132
|
+
'markRunRunning',
|
|
133
|
+
'setOnRunTerminal',
|
|
134
|
+
];
|
|
135
|
+
/** 权限的写入口 (allowTool/denyTool 在会话上是真改权限面; permission-mode 的测试重置口也算) */
|
|
136
|
+
export const PERMISSION_WRITES = [
|
|
137
|
+
'allowTool',
|
|
138
|
+
'denyTool',
|
|
139
|
+
'setPermissionMode',
|
|
140
|
+
'clearDeniedTools',
|
|
141
|
+
'_resetPermissionModeForTest',
|
|
142
|
+
];
|
|
143
|
+
export const PROHIBITIONS = [
|
|
144
|
+
{
|
|
145
|
+
id: 'model-must-not-execute-tool',
|
|
146
|
+
rule: 'Model 不能直接执行 Tool',
|
|
147
|
+
fromLayer: 'llm',
|
|
148
|
+
mode: 'import-edge',
|
|
149
|
+
targets: [
|
|
150
|
+
'agents/pi-sdk-tools',
|
|
151
|
+
'agents/patch-tool',
|
|
152
|
+
'agents/managed-services',
|
|
153
|
+
'agents/computer-use',
|
|
154
|
+
'agents/browser-cdp',
|
|
155
|
+
'lsp/lsp-tools',
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: 'provider-must-not-write-run',
|
|
160
|
+
rule: 'Provider 不能直接写 Run',
|
|
161
|
+
fromLayer: 'llm',
|
|
162
|
+
mode: 'write-call',
|
|
163
|
+
writeCalls: RUN_WRITES,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: 'tool-must-not-change-permission',
|
|
167
|
+
rule: 'Tool 不能直接改权限',
|
|
168
|
+
fromLayer: 'tools',
|
|
169
|
+
mode: 'write-call',
|
|
170
|
+
writeCalls: PERMISSION_WRITES,
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: 'channel-must-not-write-goal',
|
|
174
|
+
rule: 'Channel 不能直接改 Goal',
|
|
175
|
+
fromLayer: 'channel',
|
|
176
|
+
mode: 'write-call',
|
|
177
|
+
writeCalls: GOAL_WRITES,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'channel-must-not-write-run',
|
|
181
|
+
rule: 'Channel 不能直接写 Run',
|
|
182
|
+
derivedFrom: '路线 K3「入口收口」—— 所有入口统一走 submit(request) → enqueue → RunContext → execute → close',
|
|
183
|
+
fromLayer: 'channel',
|
|
184
|
+
mode: 'write-call',
|
|
185
|
+
writeCalls: RUN_WRITES,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'child-must-not-end-goal',
|
|
189
|
+
rule: '子 Agent 不能直接结束 Goal',
|
|
190
|
+
fromLayer: 'delegate',
|
|
191
|
+
mode: 'write-call',
|
|
192
|
+
writeCalls: ['completeGoalIfEligible', 'updateGoal', 'setCriteria', 'createGoal'],
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
/**
|
|
196
|
+
* **阶段完工状态** (数据) —— 供判据核"欠账记着由某阶段还, 而那个阶段已经收工"。
|
|
197
|
+
* 只许按事实填: 说 `done` 就要有对应的完工判据支撑 (K5 有 `K5_STEP8` + `scanStep8Completion`)。
|
|
198
|
+
*/
|
|
199
|
+
export const STAGE_STATUS = {
|
|
200
|
+
K0: 'done',
|
|
201
|
+
K1: 'partial',
|
|
202
|
+
K2: 'done',
|
|
203
|
+
K3: 'done',
|
|
204
|
+
K5: 'done',
|
|
205
|
+
// 2026-10-02 (leo 拍板): K4 = **Kernel Execution Core**, 拆两半, 不许两个含义共用一个编号
|
|
206
|
+
'K4-A': 'done', // 内核控制面 / Goal·Run 写权限收口 (AUTHORITY_DEBT 3 → 0, 经 kernel/control.ts)
|
|
207
|
+
'K4-B': 'done', // 2026-10-02 合并完成: 老 `runReActLoop` (1123 行) **已删除**, 所有入口只跑 pivot (`usePivotLoop` 默认 true); 同时补回只存在于老 loop 的门面阶段 (sessionStart/sessionEnd/beforeModelCall/afterModelCall/afterToolCall) + TS 记账上移到唯一执行点 + 自检三路径。**如实两条边界**: ① `reviewFinal` 已恢复调用与留痕, 但它的判定**不参与流程** (pivot 收尾仍由自己的质量判定决定) ② 老 loop 的 `IterationBudget` (净用量+批处理退还) 随它退休, pivot 用复杂度画像预算 (行为差量) // 合并两套 Agent Loop —— 已落: 默认切 pivot (所有入口一套) + 收尾自检抽成 runTurnEndTypecheck 挂**三条路径**(原先生产 pivot 路径从没跑过自检, 见 K7 evidence 补正); 待做: 删老 `runReActLoop` (~1100 行, 需先核清两条入口 finally/尾段差异)
|
|
208
|
+
K6: 'done', // 2026-10-02 修正: 能力 9/9 全 done (capabilities-done) —— 原写 not-started 是台账滞后
|
|
209
|
+
K7: 'done', // 2026-10-02 收尾: 旁路 **3 → 0** (pivot ✅ · skill ✅ 两路端到端 · tscTool ✅ 端到端取证含两条变异 · getSkillRegistry ✅ 受门包装) — 提交 5483e3a / 1af7e46
|
|
210
|
+
K8: 'partial', // 台账+门已落 · 直连 12 → **0** · 各通道状态 37/33 · didFixQueue 经邮箱 · **正刀已落地** (每条消息都进邮箱, 删掉重复的第二条路径, 提交 2fc197e, 真跑: 一条不丢/严格串行/FIFO) ⇒ 剩 `abortController` 语义定夺 (目标是 ExecutionRequest.signal), 显式留下不随队列顺手合并
|
|
211
|
+
K9: 'done', // 2026-10-02: **转 done (口径已重述并逐条取证)** —— 设计页那条"与 Pi 完全相同的五套验收"里, 4 套全过; 第 5 套("Durable Run/checkpoint 经适配器")经核实**按字面不可造**(startRun/recordStep 的真调用者只有 真钱 M1 任务 / x402 付费 / 回退路径, 与"适配器只在 LLM 可用时生效"互斥) ⇒ 重述为两半并各自取证: ① durable 写入经内核端口 = K10 ① (门 8/8 + 4/4, 两处变异判红); ② 适配器驱动真跑 = CLI + Web 真跑(会话落库)。 要合成一条"经适配器 + durable"的验收需先补**不含真钱**的 durable-run 路径 ⇒ 已登记为产品/验收设计待办, **不阻塞 K9 收口** (不假装跑过)。原始逐条记录见本条尾部。 // 2026-10-02: **不能算 done** —— 设计页的 K9 要求"最小 Native Adapter 必须通过与 Pi **完全相同**的五套验收"; 已过: model call (真端点 200+回复) · tool call 经 Harness 门恰一次/拒绝零执行 · CLI 非流式真跑 · 名字净化/回程还原 · 超时/退避/abort/4xx 不重试。**未过 → 2026-10-02 口径重述 (有证据)**: "Durable Run / checkpoint 经适配器"这条**按字面不可造** —— 核实三处: ① `startRun` 的真调用者只有 **`agents/task/task-runner.ts:358`(M1 任务, **走真钱/预算**) · `x402/goal-run-bridge.ts`(付费信息场景) · pi-sdk 回退路径(本机不可达)**; ② `recordStep`(每步写 checkpoint) 的调用者也全在这三条路径上; ③ checkpoint 字段实际由 `recordStep`(每步)/`prepareResume`(resume) 写, `saveCheckpoint` 本身**无人调**。 ⇒ 可选路径里**没有一条既不含真钱又能经适配器**(适配器只在 LLM 可用时生效, 而"回退路径"按定义要求 LLM 不可用 ⇒ 互斥)。**诚实处置**: 该条拆成两半分别验 —— ① "durable 写入经内核端口" = K10 ① (门 8/8 + 4/4 + 两处变异); ② "适配器驱动真跑" = CLI(`三面通过`)+Web(会话落库) 真跑。要合成一条"经适配器 + durable"的验收, 得先补一条**不含真钱**的 durable-run 路径 ⇒ 属产品/验收设计, 需拍板。 (适配器层的并发/取消/流式回调已由 ⑧⑨⑩ 覆盖: 3 条并发各自拿到自己的回复 · abort 中途打断且适配器之后仍可用 · 真 loop 的 onStream 收到 token/reply-preview)。以下是已落地部分: **第二个 (非 Pi) 推理适配器** `src/llm/native-adapter.ts` (fetch 直连 OpenAI 兼容端点, 源码不 import 任何 Pi 模块) + 唯一选择点 `BOLLOON_NATIVE_ADAPTER=1`; 门 `k9-native-adapter.test.ts` **8/8** (机械: 不许是 Pi 的壳 · 行为: 回复/tokens · native tool_calls 原样 · 429 退避重试 · abort 透传 · 4xx 不重试 · **出程名字净化+回程还原** · **过同一套门**: 适配器的 tool_call 经受门端口恰执行一次, 拒绝⇒零执行); **真跑**: 非流式 `prompt` 走该适配器打真端点 ⇒ 回 `适配器切换成功` (HTTP 200)。**顺带修掉一处隐式 Pi 依赖**: pivot 入口的 `!minimaxAvailable ⇒ fallback` 改成问**当前适配器**。**如实范围**: 适配器只实现接口所需的 chat 契约 + 超时/退避/abort/名字净化; Pi 侧的 KV 前缀/轻量分流等属 Pi 自身特性, 不在接口面内
|
|
212
|
+
K10: 'done', // 2026-10-02: **八步全落地** —— ① 4/4 (门 8/8 + 4/4, 两处变异) · ② 轻版落地 (内核运行时进生产路径, 门 6/6 + 变异 + 真跑) · ③ 实质完成 · ④ 全接线 (门 26/26 + 变异) · ⑤⑥ 早完成 (K7/K4-B) · ⑦ 已查清处置 (接上死机制, 其余登记保留) · ⑧ 按判据给出结论 (不宣称替换成功 · 不物理删)。**余项(不阻塞)**: 6 处辅助调用仍拿现成 handle; `checkMinimax` 仍 Pi 专有; 12.3% 运行/通道接线待薄化。 // 2026-10-02 起手 (先量后删): pi-sdk.ts **3353 行**; 8 步现状 —— **⑤ 旧工具 gate ✅ (K7 已做)** · **⑥ 旧 loop ✅ (K4-B 删 runReActLoop 1123 行)** · **① Pi 的 Goal/Run 写入 = 已接线 4/4** (端口 `kernel/run-lifecycle.ts` 落地 + 回退路径三处 `start-run/record-step/finish-run` 改经端口 + `assertLifecycleOk` 响失; 门 `k10-run-lifecycle-port.test.ts` 8/8 + 变异判红; **真跑待补**: 该分支需 `getMinimax()` 真抛, 本机模型总能构造 ⇒ 不可达; 第 4 处 = `safeSetRunStatus` 的状态迁移**已改经控制面** (`submitRunControl(kind:"set-run-status")` + `runControlPorts()` 注入; 口径保真: 被拒⇒false 且不记降级 · 未注入/抛错⇒false 并记降级), 门 `k10-run-control-wiring.test.ts` **4/4**(真调私有方法体三态 + 反回归) + **变异判红**(绕过控制面 ⇒ 4 条全红)): 写点 4 处 (1244 `startRun` / 1254 `recordStep` / 1255 `finishRun` = 回退路径落 run 事实; 1999 在 `setGoalId` 里 = Pi 的 Goal 写入), 内核**已有控制面** `kernel/control.ts` (`RunControlRequest{kind,origin,runId,goalId,payload}` → `RunControlPorts{recordRecovery,setRunStatus,setContinuation}`), 但它是**命令式控制面** (供 web/cli/supervisor 发 pause/resume/abort/recover), **不是 run 生命周期写口** ⇒ ① 的正确下一刀 = **照 control.ts 的形状新增 run-lifecycle 端口** (`startRun/recordStep/finishRun/saveCheckpoint`, 同样端口注入 + 未注入即拒), 再把 4 处改经它 (禁直接调 run-store); 不许把生命周期写入硬塞进控制面的 `kind` 里 (语义不同: 一个是"谁命令我停", 一个是"我这一轮的事实") · **② 模型配置解析 = 轻版落地** (回合的模型**先向内核运行时取租约** —— `ModelRuntime.acquire(snapshot)` 只读入手, 超时/取消/退避/熔断/回退/记账/连接池/能力检查由 K6 运行时负责; **传输仍是 Pi 客户端** (端口 `openPiConnection` 注入) ⇒ 行为不变; 取不到就**如实记**"内核租约不可用 ⇒ 回落 Pi 直连"(不假装); 新增只读投影 `snapshotFromSelection`(缺 provider/model ⇒ null, 不许编); 门 `k10-model-runtime-wiring.test.ts` **5/5** + 变异判红; **真跑**: `推理适配器 = kernel-model-runtime (只读 acquire 租约)` + 回复 `内核租约` ✓ ⇒ K6 那个"造了没人用"的运行时**进生产路径了**。**② 余下 (预留升级)**: 6 处辅助调用的 `getMinimax()` 仍拿现成 handle; `checkMinimax` 仍是 Pi 专有探针 —— 两条都属"下一刀", 已点名) (10 处: 6 处 `getMinimax()` 供辅助功能自取自用 [judgment hint 2625 · suggestRename 2915/2946 · summarizeDocument 2970 · improveDocument 3003 · 自动压缩注入 1392] + `checkMinimax` 1127 + 适配器回落 1735 + 注释 2; 内核已有 `class ModelRuntime`(517 行, `acquire(snapshot): ModelLease` 只读) 与能力 9/9 ⇒ **缺的不是运行时, 是取舍**: ① snapshot 由谁传给 Pi (Run 级 vs 会话级) ② 辅助调用拿 lease 还是拿现 handle ③ `checkMinimax` 这种 Pi 专有探针是否保留 —— 三条都影响公开行为, 须拍板后再动, 不许硬编) · **③ Channel 状态 = 已量清, 实质完成** (Pi **无自有**通道状态字段: `this.channelId/currentSessionId/sessionKey/channelName` 赋值与读点均 **0**; 剩余 8 处 `actor.state.channelId` 读的正是 K5 actor —— 归属已在内核) · **⑦ 已查清处置**: 查 6 个导出时挖出 **`verifyWriteOutcome` 是"写后读回"纪律的唯一实现却 0 调用点, 且函数体用 `require('node:fs')`(ESM 产物里必炸、被自己 catch 吞成 `[未核对] … require is not defined` ⇒ 它一次都没成功过)** ⇒ 按"无替代路径不许删"**改为接上**: 拆成 `src/agents/write-verify.ts`(静态 import) + `withWriteVerified` 接进 `write_file`/`edit_file` 成功返回; 门 `k10-write-verify-wiring.test.ts` **10/10**(含两条端到端真跑) + **变异判红**(拆接线 ⇒ 2 条红); 其余 4 导出各有测试与用途 ⇒ **登记保留**, 不删 · · **④ 通信入口 = 首刀落地** (新增内核端口 `kernel/transport.ts`: `send/broadcast/peers` 三动作, 端口注入 + 未注入即拒 + `{ok:false}` 归一化 + 审计, 与 control/run-lifecycle 同一套写法; pi-sdk 的 `sendMessage`/`broadcast` 改经端口 + **失败一律抛**(发送有副作用: 静默丢消息比抛错更糟); 门 `k10-transport-port.test.ts` **8/8**(含真调方法体两条) + **变异判红**(绕过端口 ⇒ 3 条红, 直连真传输那次的失效形态正是 `Node not initialized`); **④ 后半已落地 = ④ 全接线**: 加**同步**读入口 `transportPeersSync(ports)` + `peersSync` 端口 (不硬塞进 async 的 `submitTransport` —— 分开是因为**签名**不是语义: 上层有同步调用点, sync 签名不能凭空变 async); `getPeers()`/`listPeers()` 改经端口: `listPeers` 在端口未注入时**明说"读不到"**(不假装"没有对端"), `getPeers()` 未注入时回落直读并 `console.warn` 留痕; 门扩到 **11/11**(同步入口两种注入态 + 真调方法体三态) + **变异判红**(同步读绕过端口 ⇒ `listPeers` 谎报"无对端", 门抓到)) · **⑦ 兼容层 6 个导出面** · **⑧ 是否删 Pi Adapter 本身 = 已按判据给出结论 (不物理删)**。量占比 (**行数口径**, 方法: 按方法块归类, 脚本在 `docs/wiki/log.md`): `pi-sdk.ts` **3497 行** ⇒ 传输/供应商 **14.4%** · turn-glue **14.0%** · 运行/通道/通信接线 **12.3%** · 文档辅助 **9.2%** · 其余 50.1% 通用编排/装配。**职责口径**: K0–K10 已把「循环 (K4-B) · 工具门 (K7) · Run 事实 (①) · 通道状态 (③) · 通信 (④) · 模型选择 (②)」**全部搬出 Pi** ⇒ 岗位职责只剩"传输适配 + 供应商/Harness 特性 + 文档辅助 + 端口接线"。**结论**: 按判据「迁移后 Pi 职责仍超原职责 30% ⇒ 不许宣称替换成功」—— 行数口径下 Pi 仍是本仓最大单体 ⇒ **不宣称替换成功** (诚实口径); **不物理删** (五个删除条件不满足: 传输在 Pi 有专有实现、无替代路径; 且属公开契约)。**下一刀候选** (已点名): 继续薄化那 12.3% 的运行/通道**接线**与 turn-glue 里的生命周期部分。
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* **越权欠账台账 (棘轮)** —— 判据是「实际违规多重集 == 本表逐字相等」, 不是「⊆」:
|
|
216
|
+
* · 新增一条违规 ⇒ 门立刻红 (要登记就得改这张表, diff 里看得见)
|
|
217
|
+
* · 修掉一条却没同步删 ⇒ 门也红 (强制台账与事实同步, 不许台账烂在上面)
|
|
218
|
+
* 条数另有 `AUTHORITY_DEBT_FROZEN_AT` 冻死, **只许减不许增**。
|
|
219
|
+
*/
|
|
220
|
+
export const AUTHORITY_DEBT = [
|
|
221
|
+
// **K4 已全部还清 (3 → 0)**: 三条越权写 (setContinuation / setRunStatus ×2 / recordRecovery)
|
|
222
|
+
// 都改成"channel 提交请求 → 内核控制面执行写" (kernel/control.ts)。
|
|
223
|
+
// 这张表保持**空**是有判据盯着的事实: 任何一处新的 channel 直写都会让双向判据报 missing ⇒ 立刻红。
|
|
224
|
+
];
|
|
225
|
+
/** 欠账条数冻结值 (只许减; 要加必须同时改这里 → 在 diff 里是一次显式动作) */
|
|
226
|
+
export const AUTHORITY_DEBT_FROZEN_AT = 0; // 3 → 0 (K4 用内核控制面还清全部三条越权写)
|
|
227
|
+
/**
|
|
228
|
+
* K3 —— kernel 目录行数预算 (棘轮, 只许减不许增)。
|
|
229
|
+
*
|
|
230
|
+
* 目的只有一个: **不许所有逻辑回流到 kernel.ts**。要加就得显式抬这个数字, 留下痕迹。
|
|
231
|
+
* 数值 = 当前 kernel 目录真实行数, 不留余量。
|
|
232
|
+
*/
|
|
233
|
+
export const KERNEL_LINE_BUDGET = 3305; // 2026-10-02: K10 ② 内核新增 `snapshotFromSelection` 只读投影 (+20, 显式抬档); // 2026-10-02 **显式抬档 +22** (K8 收尾: channel-actor 加 `abortActorsOfChannel` + 台账/门同步) // 2026-10-02 **显式抬档 +16** (K10 ④ 后半: transport.ts 加同步读入口 `transportPeersSync` + `peersSync` 端口) // 2026-10-02 **显式抬档 +145** (K10 ④: 新增内核模块 kernel/transport.ts —— 通信入口端口) // 2026-10-02 **显式抬档 +184** (K10 ①: 新增内核模块 kernel/run-lifecycle.ts —— 运行生命周期写口, 与 control.ts 的控制面分开; 预算 == 真实值) // 2026-10-02: +1 (K4-B: gate-scan 复位阈值注释) // 2026-10-02: +5 (K8 正刀: gate-scan 加"收口字段数 3→1"+ queue 反回归) // 2026-10-02: +54 (K8: gate-scan 加 K8 判据) // 2026-10-02: +2 (STAGE_STATUS 拆 K4-A/K4-B + K6/K7 如实修正)
|
|
234
|
+
/** 预算冻结值 (棘轮: 只许减; 想抬预算必须同时改上面那个数字 ⇒ 一次显式动作, diff 里看得见) */
|
|
235
|
+
export const KERNEL_LINE_BUDGET_FROZEN_AT = 3305; // 同步至 2026-10-02 真实值 (K10 ④ 新增 transport.ts 后)
|
|
236
|
+
/**
|
|
237
|
+
* K3b —— **台账数据**单独一档预算 (`src/kernel/plan.ts`)。
|
|
238
|
+
*
|
|
239
|
+
* 为什么分开: K3 要防的是「逻辑回流到内核代码」; 台账是**数据** (owner 名册 / 入口图 / 删除候选),
|
|
240
|
+
* 把它算进代码预算会逼着人抬代码上限, 棘轮的信号就废了。两档各自冻结, 都只许减。
|
|
241
|
+
*/
|
|
242
|
+
export const KERNEL_PLAN_LINE_BUDGET = 1442; // 2026-10-02 **显式抬档 +3** (K8 收尾: plan-communication 把 abortController 条目改成删除说明) // 2026-10-02: **收紧** -2 (queue 字段条目删除: 8 字段 → 7) // 2026-10-02: +14 (K8 前置自纠: 把错的"check-then-set 非原子"换成已核实的"handoff 丢消息") // 2026-10-02: K7 tscTool 端到端取证 (evidence 字段 + 变异/踩坑记录) ⇒ 显式抬档 +1 // 2026-10-02: K8 通道状态台账+门落地 ⇒ 显式抬档 (棘轮只许减, 抬档要一次显式动作) // 真实值 (删 ENTRY_GRAPH 一行后); 变异用例要求预算 == 真实值 // 2026-10-02: +91 (K8 台账 plan-communication.ts 落地) // 2026-10-02: +12 (K7 第二步 b: 旁路 status/symbol/evidence 字段 + 卫生规则注释 + 防漂用例)
|
|
243
|
+
/** 台账预算冻结值 (棘轮: 只许减) */
|
|
244
|
+
export const KERNEL_PLAN_LINE_BUDGET_FROZEN_AT = 1442; // 同步至 2026-10-02 真实值
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run-lifecycle.ts — K10 ①: **运行生命周期写口** (与 `control.ts` 分开: 语义不同)
|
|
3
|
+
*
|
|
4
|
+
* `control.ts` = **命令式控制面**: 「谁命令我停 / 继续 / 恢复」—— web · cli · supervisor 发起, 带 origin 审计。
|
|
5
|
+
* 本文件 = **回合事实写口**: 「我这一轮发生了什么」—— start-run · record-step · finish-run · save-checkpoint。
|
|
6
|
+
*
|
|
7
|
+
* 为什么必须分开 (K10 ① 的下一刀定形时复核过):
|
|
8
|
+
* 混进同一个 `kind` 空间之后, K10 ②③④ 那些批次就无法区分「这条写入是外部命令还是回合事实」,
|
|
9
|
+
* 两者的**失败语义也不同** —— 控制面被拒要给 409 (调用方改主意), 而事实写不进是**响亮失败**
|
|
10
|
+
* (run-store 是 strict 的: 写不进 = 这次运行在事实层面不存在, 不许静默继续)。
|
|
11
|
+
*
|
|
12
|
+
* 形状照抄 `control.ts` (同一个仓库里只该有一种端口写法):
|
|
13
|
+
* 端口注入 · **未注入即拒** (不静默降级) · 一律**返回结果对象不抛** · 端口用 `{ok:false}` 表达拒绝要被归一化 · 审计流水可读。
|
|
14
|
+
*/
|
|
15
|
+
export const RUN_LIFECYCLE_OPS = [
|
|
16
|
+
'start-run',
|
|
17
|
+
'record-step',
|
|
18
|
+
'finish-run',
|
|
19
|
+
'save-checkpoint',
|
|
20
|
+
];
|
|
21
|
+
/** 哪些操作必须有 runId (start-run 例外: 它的 runId 是**结果**, 不是入参) */
|
|
22
|
+
export const RUN_LIFECYCLE_NEEDS_RUN_ID = {
|
|
23
|
+
'start-run': false,
|
|
24
|
+
'record-step': true,
|
|
25
|
+
'finish-run': true,
|
|
26
|
+
'save-checkpoint': true,
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* 端口**不抛异常但明确拒绝** (`{ ok: false, reason }`) 的归一化 —— 与 `control.ts` 同口径。
|
|
30
|
+
* 为什么必须有: store 类原语用返回值表达拒绝 (例如状态迁移不合法), 只看"有没有抛"会把**被拒当成成功**。
|
|
31
|
+
*/
|
|
32
|
+
function portRefusal(res) {
|
|
33
|
+
if (res && typeof res === 'object' && 'ok' in res) {
|
|
34
|
+
const r = res;
|
|
35
|
+
if (r.ok === false)
|
|
36
|
+
return `端口拒绝: ${String(r.reason ?? '(未给原因)')}`;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const audit = [];
|
|
41
|
+
const AUDIT_MAX = 200;
|
|
42
|
+
/** 审计流水 (最近 N 条; 测试与运维可读) */
|
|
43
|
+
export function runLifecycleAudit() {
|
|
44
|
+
return audit;
|
|
45
|
+
}
|
|
46
|
+
export function resetRunLifecycleAudit() {
|
|
47
|
+
audit.length = 0;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 提交一条生命周期写入。**唯一入口** —— 校验 (op 合法 / origin 非空 / 需要的定位字段齐) → 派发到 port → 记审计。
|
|
51
|
+
* 一律**返回结果对象**, 不抛 (调用方不该用 try/catch 表达"没落盘"); 要不要把 `ok=false` 变成异常由
|
|
52
|
+
* `assertLifecycleOk` 决定 —— 生命周期写入**一律**要 (见该函数注释)。
|
|
53
|
+
*/
|
|
54
|
+
export async function submitRunLifecycle(req, ports) {
|
|
55
|
+
const op = req?.op;
|
|
56
|
+
const finish = (ok, detail, port, result) => {
|
|
57
|
+
audit.push({
|
|
58
|
+
at: Date.now(),
|
|
59
|
+
op,
|
|
60
|
+
origin: req?.origin ?? '(anonymous)',
|
|
61
|
+
target: String(req?.runId ?? '(new)'),
|
|
62
|
+
ok,
|
|
63
|
+
detail,
|
|
64
|
+
});
|
|
65
|
+
if (audit.length > AUDIT_MAX)
|
|
66
|
+
audit.splice(0, audit.length - AUDIT_MAX);
|
|
67
|
+
return { ok, op, via: 'kernel-run-lifecycle', detail, port, result };
|
|
68
|
+
};
|
|
69
|
+
if (!RUN_LIFECYCLE_OPS.includes(op))
|
|
70
|
+
return finish(false, `未知写入类型: ${String(req?.op)}`);
|
|
71
|
+
if (!req.origin)
|
|
72
|
+
return finish(false, '缺少 origin (审计要求: 不许匿名写入)');
|
|
73
|
+
if (RUN_LIFECYCLE_NEEDS_RUN_ID[op] && !req.runId)
|
|
74
|
+
return finish(false, `${op} 缺少 runId`);
|
|
75
|
+
const payload = req.payload ?? {};
|
|
76
|
+
if (op === 'start-run') {
|
|
77
|
+
if (typeof ports.startRun !== 'function')
|
|
78
|
+
return finish(false, 'port 未注入: startRun');
|
|
79
|
+
try {
|
|
80
|
+
const res = await ports.startRun(payload);
|
|
81
|
+
const refusal = portRefusal(res);
|
|
82
|
+
return refusal ? finish(false, refusal, 'startRun', res) : finish(true, undefined, 'startRun', res);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return finish(false, `startRun 失败: ${String(err?.message ?? err).slice(0, 160)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (op === 'record-step') {
|
|
89
|
+
if (typeof ports.recordStep !== 'function')
|
|
90
|
+
return finish(false, 'port 未注入: recordStep');
|
|
91
|
+
try {
|
|
92
|
+
const res = await ports.recordStep(req.runId, payload);
|
|
93
|
+
const refusal = portRefusal(res);
|
|
94
|
+
return refusal ? finish(false, refusal, 'recordStep', res) : finish(true, undefined, 'recordStep', res);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return finish(false, `recordStep 失败: ${String(err?.message ?? err).slice(0, 160)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (op === 'finish-run') {
|
|
101
|
+
if (typeof ports.finishRun !== 'function')
|
|
102
|
+
return finish(false, 'port 未注入: finishRun');
|
|
103
|
+
try {
|
|
104
|
+
const res = await ports.finishRun(req.runId, payload);
|
|
105
|
+
const refusal = portRefusal(res);
|
|
106
|
+
return refusal ? finish(false, refusal, 'finishRun', res) : finish(true, undefined, 'finishRun', res);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
return finish(false, `finishRun 失败: ${String(err?.message ?? err).slice(0, 160)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (op === 'save-checkpoint') {
|
|
113
|
+
if (typeof ports.saveCheckpoint !== 'function')
|
|
114
|
+
return finish(false, 'port 未注入: saveCheckpoint');
|
|
115
|
+
try {
|
|
116
|
+
const res = await ports.saveCheckpoint(req.runId, payload);
|
|
117
|
+
const refusal = portRefusal(res);
|
|
118
|
+
return refusal ? finish(false, refusal, 'saveCheckpoint', res) : finish(true, undefined, 'saveCheckpoint', res);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return finish(false, `saveCheckpoint 失败: ${String(err?.message ?? err).slice(0, 160)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return finish(false, `未处理的写入类型: ${String(op)}`);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 生命周期写入**必须**落盘 —— 拿不到 `ok` 就抛。
|
|
128
|
+
*
|
|
129
|
+
* 依据: `run-store` 的持久化是 **strict** (写不进 = 这次运行在事实层面不存在),
|
|
130
|
+
* 所以「写失败但继续跑」= 制造"agent 跑了但没记录"的老毛病。要降级只有一种合法姿势:
|
|
131
|
+
* 由调用方显式换持久化等级 (环境开关), 不许在这里静默吞。
|
|
132
|
+
*/
|
|
133
|
+
export function assertLifecycleOk(out) {
|
|
134
|
+
if (!out.ok) {
|
|
135
|
+
throw new Error(`[kernel-run-lifecycle] ${out.op} 未落盘: ${out.detail ?? '未知原因'}`
|
|
136
|
+
+ ' (run-store 是 strict: 写不进 = 这次运行在事实层面不存在, 不许静默继续)');
|
|
137
|
+
}
|
|
138
|
+
}
|