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.
Files changed (401) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/dist/.api-emit.stamp +1 -0
  4. package/dist/.build-meta.json +6 -0
  5. package/dist/agent/events.js +1 -0
  6. package/dist/agent/index.js +2 -0
  7. package/dist/agent/loop.js +139 -0
  8. package/dist/agent/queue.js +119 -0
  9. package/dist/agent/stream.js +62 -0
  10. package/dist/agent/tools-batch.js +221 -0
  11. package/dist/agent/types.js +8 -0
  12. package/dist/api/berry-agent-llm.d.ts +18 -0
  13. package/dist/api/berry-agent.d.ts +9 -0
  14. package/dist/api/surface.json +1632 -0
  15. package/dist/api/tsconfig.paths.json +12 -0
  16. package/dist/api/typebox-compile.d.ts +2 -0
  17. package/dist/api/typebox-value.d.ts +2 -0
  18. package/dist/api/typebox.d.ts +2 -0
  19. package/dist/browser/cdp.js +256 -0
  20. package/dist/browser/codes.js +31 -0
  21. package/dist/browser/discover.js +107 -0
  22. package/dist/browser/engine.js +169 -0
  23. package/dist/browser/index.js +17 -0
  24. package/dist/browser/install.js +342 -0
  25. package/dist/browser/page.js +321 -0
  26. package/dist/browser/service.js +158 -0
  27. package/dist/browser/tools.js +198 -0
  28. package/dist/browser/types.js +81 -0
  29. package/dist/channels/ask-queue.js +82 -0
  30. package/dist/channels/commands.js +129 -0
  31. package/dist/channels/engine/cell.js +143 -0
  32. package/dist/channels/engine/diff.js +143 -0
  33. package/dist/channels/engine/engine.js +416 -0
  34. package/dist/channels/engine/index.js +8 -0
  35. package/dist/channels/engine/input-keys.js +86 -0
  36. package/dist/channels/engine/input.js +596 -0
  37. package/dist/channels/engine/memory-io.js +71 -0
  38. package/dist/channels/engine/process-io.js +38 -0
  39. package/dist/channels/engine/types.js +17 -0
  40. package/dist/channels/engine/width.js +122 -0
  41. package/dist/channels/index.js +15 -0
  42. package/dist/channels/registry.js +56 -0
  43. package/dist/channels/sdk/admit.js +29 -0
  44. package/dist/channels/sdk/backend.js +102 -0
  45. package/dist/channels/sdk/cursor.js +56 -0
  46. package/dist/channels/sdk/index.js +20 -0
  47. package/dist/channels/sdk/jsonl.js +208 -0
  48. package/dist/channels/sdk/protocol.js +24 -0
  49. package/dist/channels/sdk/schema.js +91 -0
  50. package/dist/channels/sdk/wire-core.js +446 -0
  51. package/dist/channels/service.js +169 -0
  52. package/dist/channels/tui/autocomplete/autocomplete.js +42 -0
  53. package/dist/channels/tui/autocomplete/file-mentions.js +106 -0
  54. package/dist/channels/tui/autocomplete/popup.js +148 -0
  55. package/dist/channels/tui/autocomplete/provider.js +7 -0
  56. package/dist/channels/tui/autocomplete/token.js +68 -0
  57. package/dist/channels/tui/backend/ansi-rows.js +211 -0
  58. package/dist/channels/tui/backend/main-screen.js +207 -0
  59. package/dist/channels/tui/backend/osc.js +91 -0
  60. package/dist/channels/tui/backend/transcript.js +230 -0
  61. package/dist/channels/tui/backend/tui-backend.js +915 -0
  62. package/dist/channels/tui/editor/editor-model.js +543 -0
  63. package/dist/channels/tui/editor/editor-view.js +140 -0
  64. package/dist/channels/tui/editor/editor.js +275 -0
  65. package/dist/channels/tui/editor/undo-stack.js +35 -0
  66. package/dist/channels/tui/editor/visual-lines.js +126 -0
  67. package/dist/channels/tui/editor/word-nav.js +106 -0
  68. package/dist/channels/tui/history/history-viewer.js +403 -0
  69. package/dist/channels/tui/index.js +3 -0
  70. package/dist/channels/tui/layout.js +167 -0
  71. package/dist/channels/tui/markdown/blocks.js +111 -0
  72. package/dist/channels/tui/markdown/inline.js +75 -0
  73. package/dist/channels/tui/markdown/markdown.js +182 -0
  74. package/dist/channels/tui/memory/memory-viewer.js +540 -0
  75. package/dist/channels/tui/overlay/alt-screen.js +105 -0
  76. package/dist/channels/tui/overlay/overlay.js +57 -0
  77. package/dist/channels/tui/overlay/select-confirm.js +156 -0
  78. package/dist/channels/tui/panels/todo-panel.js +54 -0
  79. package/dist/channels/tui/panels/tool-progress-panel.js +93 -0
  80. package/dist/channels/tui/scroll/scroll-view.js +254 -0
  81. package/dist/channels/tui/status/status-line.js +76 -0
  82. package/dist/channels/tui/text.js +38 -0
  83. package/dist/channels/tui/theme.js +41 -0
  84. package/dist/channels/types.js +11 -0
  85. package/dist/channels/ui-core.js +209 -0
  86. package/dist/checkpoint/capture.js +45 -0
  87. package/dist/checkpoint/codes.js +33 -0
  88. package/dist/checkpoint/command.js +82 -0
  89. package/dist/checkpoint/gate.js +48 -0
  90. package/dist/checkpoint/index.js +20 -0
  91. package/dist/checkpoint/restore.js +172 -0
  92. package/dist/checkpoint/store.js +247 -0
  93. package/dist/checkpoint/types.js +4 -0
  94. package/dist/checkpoint/walk.js +146 -0
  95. package/dist/compaction/ccr-tools.js +112 -0
  96. package/dist/compaction/ccr.js +84 -0
  97. package/dist/compaction/codes.js +21 -0
  98. package/dist/compaction/index.js +18 -0
  99. package/dist/compaction/policy.js +200 -0
  100. package/dist/compaction/service.js +422 -0
  101. package/dist/compaction/slots.js +121 -0
  102. package/dist/compaction/types.js +10 -0
  103. package/dist/context/codes.js +40 -0
  104. package/dist/context/events.js +160 -0
  105. package/dist/context/index.js +13 -0
  106. package/dist/context/logger.js +136 -0
  107. package/dist/context/scope.js +182 -0
  108. package/dist/context/workspace.js +104 -0
  109. package/dist/contracts/agent-events.d.ts +73 -0
  110. package/dist/contracts/agent-events.js +16 -0
  111. package/dist/contracts/api.d.ts +249 -0
  112. package/dist/contracts/api.js +299 -0
  113. package/dist/contracts/approval.d.ts +37 -0
  114. package/dist/contracts/approval.js +9 -0
  115. package/dist/contracts/env-ref.d.ts +41 -0
  116. package/dist/contracts/env-ref.js +32 -0
  117. package/dist/contracts/errors.d.ts +56 -0
  118. package/dist/contracts/errors.js +266 -0
  119. package/dist/contracts/events.d.ts +70 -0
  120. package/dist/contracts/events.js +329 -0
  121. package/dist/contracts/index.d.ts +32 -0
  122. package/dist/contracts/index.js +26 -0
  123. package/dist/contracts/llm.d.ts +275 -0
  124. package/dist/contracts/llm.js +12 -0
  125. package/dist/contracts/messages.d.ts +63 -0
  126. package/dist/contracts/messages.js +65 -0
  127. package/dist/contracts/redact.d.ts +46 -0
  128. package/dist/contracts/redact.js +223 -0
  129. package/dist/contracts/tools.d.ts +197 -0
  130. package/dist/contracts/tools.js +33 -0
  131. package/dist/contracts/types.d.ts +302 -0
  132. package/dist/contracts/types.js +50 -0
  133. package/dist/contracts/ui.d.ts +122 -0
  134. package/dist/contracts/ui.js +15 -0
  135. package/dist/conversation/agent-service.js +61 -0
  136. package/dist/conversation/approval-wiring.js +82 -0
  137. package/dist/conversation/backoff.js +38 -0
  138. package/dist/conversation/codes.js +47 -0
  139. package/dist/conversation/control-tools.js +102 -0
  140. package/dist/conversation/control.js +210 -0
  141. package/dist/conversation/driver.js +922 -0
  142. package/dist/conversation/index.js +12 -0
  143. package/dist/conversation/model-visible.js +169 -0
  144. package/dist/conversation/open-tools.js +126 -0
  145. package/dist/conversation/reseed.js +132 -0
  146. package/dist/conversation/sessions.js +215 -0
  147. package/dist/conversation/todo.js +203 -0
  148. package/dist/conversation/types.js +35 -0
  149. package/dist/conversation/wiring.js +204 -0
  150. package/dist/credentials/codes.js +59 -0
  151. package/dist/credentials/commands.js +186 -0
  152. package/dist/credentials/env-ref.js +34 -0
  153. package/dist/credentials/index.js +28 -0
  154. package/dist/credentials/migration.js +18 -0
  155. package/dist/credentials/oauth.js +266 -0
  156. package/dist/credentials/refresh.js +152 -0
  157. package/dist/credentials/secrets.js +118 -0
  158. package/dist/credentials/types.js +30 -0
  159. package/dist/exec/bash.js +279 -0
  160. package/dist/exec/codes.js +37 -0
  161. package/dist/exec/env.js +99 -0
  162. package/dist/exec/environment.js +39 -0
  163. package/dist/exec/git-guard.js +623 -0
  164. package/dist/exec/index.js +24 -0
  165. package/dist/exec/registry.js +120 -0
  166. package/dist/exec/spawn.js +281 -0
  167. package/dist/exec/tail.js +77 -0
  168. package/dist/exec/types.js +5 -0
  169. package/dist/goal/codes.js +33 -0
  170. package/dist/goal/command.js +175 -0
  171. package/dist/goal/fold.js +121 -0
  172. package/dist/goal/gates.js +122 -0
  173. package/dist/goal/index.js +22 -0
  174. package/dist/goal/migration.js +48 -0
  175. package/dist/goal/service.js +501 -0
  176. package/dist/goal/todo-tool.js +174 -0
  177. package/dist/goal/types.js +1 -0
  178. package/dist/goal/update-tool.js +46 -0
  179. package/dist/host/approval-cmd.js +276 -0
  180. package/dist/host/assembly.js +1146 -0
  181. package/dist/host/boot-failures.js +104 -0
  182. package/dist/host/budget-advisory.js +74 -0
  183. package/dist/host/budget-broadcast.js +50 -0
  184. package/dist/host/builtins.js +54 -0
  185. package/dist/host/cli.js +544 -0
  186. package/dist/host/codes.js +120 -0
  187. package/dist/host/config-schema.js +195 -0
  188. package/dist/host/conversation-stack.js +654 -0
  189. package/dist/host/core-plugins.js +1685 -0
  190. package/dist/host/credentials-cmd.js +42 -0
  191. package/dist/host/disclosure.js +30 -0
  192. package/dist/host/dispatch.js +105 -0
  193. package/dist/host/doors-cmd.js +154 -0
  194. package/dist/host/dump-config.js +44 -0
  195. package/dist/host/hook-dispatch-guard.js +27 -0
  196. package/dist/host/import-gate.js +153 -0
  197. package/dist/host/index.js +54 -0
  198. package/dist/host/issue-session.js +241 -0
  199. package/dist/host/loader.js +372 -0
  200. package/dist/host/main.js +161 -0
  201. package/dist/host/manifest.js +381 -0
  202. package/dist/host/mcp-entry.js +53 -0
  203. package/dist/host/plugin-boot.js +952 -0
  204. package/dist/host/plugin-context.js +672 -0
  205. package/dist/host/plugin-install.js +480 -0
  206. package/dist/host/plugin-reload.js +124 -0
  207. package/dist/host/plugin-store.js +462 -0
  208. package/dist/host/plugin-tools.js +359 -0
  209. package/dist/host/plugin-uninstall.js +257 -0
  210. package/dist/host/plugins-cmd.js +302 -0
  211. package/dist/host/plugins-command.js +130 -0
  212. package/dist/host/plugins-config.js +195 -0
  213. package/dist/host/prompt-sections.js +133 -0
  214. package/dist/host/run-entry.js +544 -0
  215. package/dist/host/runtime.js +209 -0
  216. package/dist/host/scheduler-tick.js +294 -0
  217. package/dist/host/serve-daemon.js +501 -0
  218. package/dist/host/serve-entry.js +279 -0
  219. package/dist/host/session-anchor.js +41 -0
  220. package/dist/host/sessions-cmd.js +219 -0
  221. package/dist/host/sessions-face.js +47 -0
  222. package/dist/host/settings-store.js +112 -0
  223. package/dist/host/signals.js +69 -0
  224. package/dist/host/single-instance.js +105 -0
  225. package/dist/host/subagent-factory.js +291 -0
  226. package/dist/host/testkit/harness.js +283 -0
  227. package/dist/host/testkit/index.js +14 -0
  228. package/dist/host/testkit/matrix.js +302 -0
  229. package/dist/host/tool-policy-store.js +177 -0
  230. package/dist/host/triggers.js +212 -0
  231. package/dist/host/tui-entry.js +216 -0
  232. package/dist/host/webui-bridge.js +165 -0
  233. package/dist/issue/codes.js +38 -0
  234. package/dist/issue/filter.js +146 -0
  235. package/dist/issue/github.js +116 -0
  236. package/dist/issue/index.js +17 -0
  237. package/dist/issue/mount.js +70 -0
  238. package/dist/issue/poll.js +58 -0
  239. package/dist/issue/service.js +341 -0
  240. package/dist/issue/tools.js +70 -0
  241. package/dist/issue/types.js +34 -0
  242. package/dist/issue/webhook.js +126 -0
  243. package/dist/llm/codes.js +77 -0
  244. package/dist/llm/complete.js +196 -0
  245. package/dist/llm/events.js +15 -0
  246. package/dist/llm/index.js +24 -0
  247. package/dist/llm/inflight.js +65 -0
  248. package/dist/llm/model-id.js +58 -0
  249. package/dist/llm/provider-face.d.ts +32 -0
  250. package/dist/llm/provider-face.js +34 -0
  251. package/dist/llm/recovery.js +146 -0
  252. package/dist/llm/runtime.js +46 -0
  253. package/dist/llm/stream-fn.js +147 -0
  254. package/dist/lsp/codes.js +31 -0
  255. package/dist/lsp/connection.js +147 -0
  256. package/dist/lsp/frame.js +110 -0
  257. package/dist/lsp/index.js +16 -0
  258. package/dist/lsp/inject.js +58 -0
  259. package/dist/lsp/instance.js +264 -0
  260. package/dist/lsp/service.js +522 -0
  261. package/dist/lsp/tools.js +53 -0
  262. package/dist/lsp/types.js +201 -0
  263. package/dist/mcp/bridge.js +222 -0
  264. package/dist/mcp/codes.js +21 -0
  265. package/dist/mcp/index.js +19 -0
  266. package/dist/mcp/jsonrpc.js +230 -0
  267. package/dist/mcp/service.js +125 -0
  268. package/dist/mcp/tools.js +145 -0
  269. package/dist/mcp/types.js +108 -0
  270. package/dist/memory/cite.js +131 -0
  271. package/dist/memory/codes.js +50 -0
  272. package/dist/memory/command.js +71 -0
  273. package/dist/memory/consolidate.js +219 -0
  274. package/dist/memory/cycle.js +109 -0
  275. package/dist/memory/dao.js +878 -0
  276. package/dist/memory/diff.js +238 -0
  277. package/dist/memory/extract.js +181 -0
  278. package/dist/memory/fts.js +58 -0
  279. package/dist/memory/index.js +42 -0
  280. package/dist/memory/inject.js +354 -0
  281. package/dist/memory/merge.js +178 -0
  282. package/dist/memory/migration.js +132 -0
  283. package/dist/memory/pollution.js +59 -0
  284. package/dist/memory/port.js +385 -0
  285. package/dist/memory/review.js +201 -0
  286. package/dist/memory/scan.js +89 -0
  287. package/dist/memory/tools.js +508 -0
  288. package/dist/memory/types.js +140 -0
  289. package/dist/obs/codes.js +38 -0
  290. package/dist/obs/db.js +115 -0
  291. package/dist/obs/index.js +20 -0
  292. package/dist/obs/rollup.js +61 -0
  293. package/dist/obs/service.js +363 -0
  294. package/dist/obs/session-tools.js +282 -0
  295. package/dist/obs/session-view.js +225 -0
  296. package/dist/obs/tool.js +97 -0
  297. package/dist/obs/types.js +1 -0
  298. package/dist/persist/audit.js +63 -0
  299. package/dist/persist/aux.js +39 -0
  300. package/dist/persist/codes.js +35 -0
  301. package/dist/persist/index.js +30 -0
  302. package/dist/persist/load-history.js +50 -0
  303. package/dist/persist/migrations.js +37 -0
  304. package/dist/persist/paths.js +108 -0
  305. package/dist/persist/persistence.js +229 -0
  306. package/dist/persist/schema.js +99 -0
  307. package/dist/persist/secret-box.js +95 -0
  308. package/dist/persist/store.js +706 -0
  309. package/dist/persist/write-behind.js +238 -0
  310. package/dist/safety/approval.js +171 -0
  311. package/dist/safety/bwrap.js +123 -0
  312. package/dist/safety/codes.js +57 -0
  313. package/dist/safety/danger.js +505 -0
  314. package/dist/safety/gate.js +226 -0
  315. package/dist/safety/index.js +24 -0
  316. package/dist/safety/presets.js +73 -0
  317. package/dist/safety/roots.js +139 -0
  318. package/dist/safety/sandbox.js +214 -0
  319. package/dist/safety/seatbelt.js +88 -0
  320. package/dist/safety/sensitive.js +34 -0
  321. package/dist/safety/tool-policy.js +203 -0
  322. package/dist/safety/types.js +13 -0
  323. package/dist/scheduler/codes.js +54 -0
  324. package/dist/scheduler/cron-backend.js +135 -0
  325. package/dist/scheduler/engine.js +280 -0
  326. package/dist/scheduler/gates.js +60 -0
  327. package/dist/scheduler/index.js +25 -0
  328. package/dist/scheduler/migration.js +22 -0
  329. package/dist/scheduler/runner.js +171 -0
  330. package/dist/scheduler/schedule.js +193 -0
  331. package/dist/scheduler/service.js +283 -0
  332. package/dist/scheduler/tick.js +139 -0
  333. package/dist/scheduler/types.js +1 -0
  334. package/dist/sdk/http.js +865 -0
  335. package/dist/sdk/index.js +22 -0
  336. package/dist/sdk/mcp.js +289 -0
  337. package/dist/sdk/plugin-route-registry.js +126 -0
  338. package/dist/sdk/plugin-routes.js +149 -0
  339. package/dist/sdk/security.js +116 -0
  340. package/dist/sdk/types.js +32 -0
  341. package/dist/session/budget.js +159 -0
  342. package/dist/session/codes.js +40 -0
  343. package/dist/session/derive.js +180 -0
  344. package/dist/session/event-data.js +1 -0
  345. package/dist/session/fork.js +72 -0
  346. package/dist/session/import-gates.js +148 -0
  347. package/dist/session/index.js +18 -0
  348. package/dist/session/recover.js +103 -0
  349. package/dist/session/session.js +279 -0
  350. package/dist/session/snapshot.js +107 -0
  351. package/dist/skills/agents.js +242 -0
  352. package/dist/skills/codes.js +51 -0
  353. package/dist/skills/discovery.js +266 -0
  354. package/dist/skills/frontmatter.js +215 -0
  355. package/dist/skills/index.js +28 -0
  356. package/dist/skills/load.js +118 -0
  357. package/dist/skills/manage.js +201 -0
  358. package/dist/skills/registry.js +138 -0
  359. package/dist/skills/render.js +124 -0
  360. package/dist/skills/sections.js +171 -0
  361. package/dist/skills/types.js +21 -0
  362. package/dist/subagent/codes.js +50 -0
  363. package/dist/subagent/declarative.js +55 -0
  364. package/dist/subagent/index.js +19 -0
  365. package/dist/subagent/notify.js +51 -0
  366. package/dist/subagent/provide.js +7 -0
  367. package/dist/subagent/registry.js +149 -0
  368. package/dist/subagent/service.js +338 -0
  369. package/dist/subagent/surface.js +44 -0
  370. package/dist/subagent/tool.js +153 -0
  371. package/dist/subagent/types.js +25 -0
  372. package/dist/tools/apply-patch.js +164 -0
  373. package/dist/tools/codes.js +109 -0
  374. package/dist/tools/fs.js +501 -0
  375. package/dist/tools/index.js +17 -0
  376. package/dist/tools/observed.js +99 -0
  377. package/dist/tools/pipeline.js +176 -0
  378. package/dist/tools/protected-read.js +54 -0
  379. package/dist/tools/registry.js +250 -0
  380. package/dist/tools/search.js +451 -0
  381. package/dist/tools/worktree.js +327 -0
  382. package/dist/web/codes.js +37 -0
  383. package/dist/web/gate.js +43 -0
  384. package/dist/web/hygiene.js +195 -0
  385. package/dist/web/index.js +16 -0
  386. package/dist/web/service.js +207 -0
  387. package/dist/web/ssrf-guard.js +44 -0
  388. package/dist/web/tool.js +76 -0
  389. package/dist/web/types.js +10 -0
  390. package/dist/webui/assets/index-B-t2O8gh.js +22 -0
  391. package/dist/webui/assets/index-DOlgSZ9Q.css +2 -0
  392. package/dist/webui/index.html +14 -0
  393. package/dist/webui/index.js +14 -0
  394. package/dist/webui/server.js +549 -0
  395. package/dist/webui/types.js +38 -0
  396. package/examples/README.md +26 -0
  397. package/examples/minimal-code-plugin/entry.js +43 -0
  398. package/examples/minimal-code-plugin/package.json +12 -0
  399. package/examples/pure-skill-pack/package.json +14 -0
  400. package/examples/pure-skill-pack/skills/markdown-table/SKILL.md +32 -0
  401. package/package.json +86 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * AgentEvent 活体事件族契约(04 篇 §2 机制真源——10 型,内存直推、不落日志)。
3
+ *
4
+ * 归位注记(2026-09-08 U3 落码批):本族类型原住 agent 件(src/agent/events.ts),
5
+ * 为插件侧 UI 后端类型可达(03 §2.2 registerUiBackend 定形注记——虚拟主键
6
+ * `berry-agent` 面只达 contracts)随 U3-1 归位本件;类型闭包全 contracts 侧
7
+ * (AgentMessage/StopReason/AgentToolResult 既在本域),机制真源仍 04 §2、
8
+ * agent 件经 re-export 维持公开面与件内消费路径不变(批 11b ApprovalAsk
9
+ * 归位同款先例)。
10
+ *
11
+ * 顺序铁律:每族严格 `start → update* → end`;流式 delta 与工具进度经 update
12
+ * 携带。活体流单向消费、不可逆写 durable(05 篇 §7 分层不变式)——「活体呈现」
13
+ * 与「durable 真相」两条线永不合流。重试续入零新事件型:续入即新
14
+ * agent_start/message 流,用户看到重跑。
15
+ */
16
+ export {};
@@ -0,0 +1,249 @@
1
+ /**
2
+ * API 稳定性 tier 词汇(§8.3 四级表的前三级——internal 结构性不可达不进
3
+ * 公开面,故不在本联合)。stable/experimental 执法粒度 = 键级;deprecated 恒
4
+ * 逐符号。目录宿主符号(本文件各目录 + EventTypeMeta)以此类型为**必填字段**
5
+ * ——TS 编译期即红扛零隐式(零隐式 API 原则的载体精化)。
6
+ */
7
+ export type ApiTier = 'stable' | 'experimental' | 'deprecated';
8
+ /** 虚拟模块键登记项(§8.3 键级 tier 载体——tier 列在此单源;模块私有不导出) */
9
+ interface VirtualApiKeyEntry {
10
+ /** 虚拟模块说明符(插件 import 所写键名——loader 注入表键域) */
11
+ readonly key: string;
12
+ /** 稳定性 tier(键级单一整键——混合键结构性不设) */
13
+ readonly tier: ApiTier;
14
+ /** 该键进入 API 面的 apiVersion(首快照全 1.0——预置号非承诺起点,§8.1) */
15
+ readonly since: string;
16
+ }
17
+ /**
18
+ * 虚拟模块键表——现役五键全 `stable`(§8.3:berry-agent/llm 是已落码正路非预览;
19
+ * typebox 三键纯转发)。loader 的注入表由本表派生(注入表不另持键单源);
20
+ * 实验件未来以新键 + tier 'experimental' 进。
21
+ *
22
+ * `berry-agent/sqlite` 键(规范目标态六键之一)**推迟至 persist SqliteFace
23
+ * 落码批进表**:查 1 要求每键至少一条导出、无真身即红——表收现役真源,
24
+ * 键进表 = 真身在场(§8.3 批 2 落码注记)。首条 ctx 服务(SERVICE_CATALOG)
25
+ * 与首个 core: 能力(CAPABILITIES)同律随各自落码批进表。
26
+ */
27
+ export declare const VIRTUAL_API_KEYS: readonly VirtualApiKeyEntry[];
28
+ /** ctx 具名服务目录项(逐符号 tier——§8.3 非虚拟键面半边;模块私有不导出) */
29
+ interface ServiceCatalogEntry {
30
+ /** ctx.get(name) 服务名(官方名位单段式) */
31
+ readonly name: string;
32
+ /** 服务归属模块(拓扑席名——抽取器按此寻址接口源文件) */
33
+ readonly module: string;
34
+ /**
35
+ * 服务面契约接口名(方法级符号):指向宿主模块公开面导出的 interface
36
+ * 声明名(provide 对象 satisfies 本型——面漂移编译期即红)。抽取器按
37
+ * module 列寻址接口源文件、枚举其成员,每方法/属性一符号进 surface.json
38
+ * exports[](module='services',symbol=`服务名.成员名`)。
39
+ */
40
+ readonly faceInterface: string;
41
+ /** 一句话语义(surface.json 文档面消费) */
42
+ readonly note: string;
43
+ /** 稳定性 tier(必填——零隐式载体) */
44
+ readonly tier: ApiTier;
45
+ }
46
+ /**
47
+ * ctx 服务面目录:首条真实 ctx 具名服务随 c-3 落码批入册(drift 闸守快照,
48
+ * 目录本身是声明面——声明即 API)。抽取器 services 块循环本表,接口切片
49
+ * 机制已就位、每条目落码即活。
50
+ */
51
+ export declare const SERVICE_CATALOG: readonly ServiceCatalogEntry[];
52
+ /** 能力目录项(surface.json 顶层 capabilities[] 的声明位形态;模块私有不导出) */
53
+ interface CapabilityEntry {
54
+ /** 能力名:`件域.能力` 两段式(§8.5 名空间——字符集与事件词汇同纪律) */
55
+ readonly name: string;
56
+ /**
57
+ * 提供方(能力位所属域的承载方):core: 官方件引用形(`core:sdk`)、宿主
58
+ * 固定件席位名(`channels`)或宿主装配根(`host`)——前两类与 name 前段
59
+ * (件域)同源;`host` 形系组合根承载的宿主侧能力面,件域名系能力面域
60
+ * 非模块席(`triggers.start-run` 由 host 承载——03 §8.2 2026-09-07 触发器
61
+ * 面 C 批落码定形)。三类形皆指域内单一承载方,非泛标签。
62
+ */
63
+ readonly providedBy: string;
64
+ /**
65
+ * 高危面开门制标注(§4.6 批 U1 定形):`true` = 该能力位系用户可开高权面
66
+ * ——默认关,唯一开门径 = 启用清单 `opens` 授予位显式授权(值域单源即本
67
+ * 标注派生面 USER_GRANTABLE_CAPABILITIES)。缺省无此键 = 常规能力位。
68
+ */
69
+ readonly userGrantable?: true;
70
+ }
71
+ /**
72
+ * 能力面目录:core: 可卸件能力起算集(§8.5——ctx.host.capabilities 读此层)。
73
+ * 语义 = **本构建面**(编译进包即有——启用清单是否挂载属运行时态,两问不混)。
74
+ * 批 U2 首登 v1 首批高危面两枚(§4.6——`userGrantable` 开门制标注单源):
75
+ * - `channels.ui-backend`:替换界面后端(UiBackend 实装换装——02 §2 表 #6
76
+ * 重述所指高权面;承载方 = channels 宿主固定件〔自研 TUI 引擎席位〕);
77
+ * - `sdk.register-route`:注册网页路由(sdk HTTP 面路由扩展位——03 §10.6;
78
+ * 承载方 = core:sdk 件)。
79
+ * 触发器面 C 批补第三枚(2026-09-07——P1 拍板批 v1 名单两枚→三枚的落码兑现):
80
+ * - `triggers.start-run`:触发器起会(非人触发起无头会话——03 §2.2
81
+ * ctx.triggers.register;承载方 = host 装配根〔注册表/starter 编舞住
82
+ * host 侧触发器件,零新席——03 §8.2 providedBy 第三形〕)。
83
+ * 凭证代管件 c-1 规范先行批入册第四枚(2026-09-08——§4.6 v1 首批名单
84
+ * 三枚→四枚;c-3 读腿落码批代码侧兑现):
85
+ * - `credentials.read-cross`:跨域读凭证(ctx.secrets.get 越自域
86
+ * namespace 读——03 §2.2 第十面/§10.9 读腿;承载方 = core:credentials
87
+ * 件〔judged 面——默认关、开门后逐次 capability/used 审计〕)。
88
+ * 环境感知件 e-2 观测腿批入册第五枚(2026-09-08——§4.6 v1 首批名单
89
+ * 四枚→五枚;立题档题 6 拍板「动词族一枚高危面统摄」——拉取与订阅两
90
+ * 形态一枚统摄):
91
+ * - `sessions.observe-cross`:跨树观测(obs 会话维工具族跨树目标读/
92
+ * 全会话维枚举——03 §10.8 可见性分轴观测轴;树内 self/tree 两档零
93
+ * 开门。承载方 = host 装配根〔per-session 工具族闭包装配位 +
94
+ * 订阅作用域执法住宿主侧——03 §8.2 providedBy 第三形同 triggers.
95
+ * start-run;obs 件提供 SessionView 纯派生读面非承载方〕)。
96
+ * 后续高危面经三路准入扩枚举同律入册(§4.6);构建差能力随真实构建分叉日
97
+ * 启用 `API_CAPABILITY_MISSING`(预留码,本批无 thrower)。
98
+ */
99
+ export declare const CAPABILITIES: readonly CapabilityEntry[];
100
+ /**
101
+ * 高危面开门名单单源(§4.6 登记单源的派生面):CAPABILITIES 中 `userGrantable`
102
+ * 标注位的能力名清单。启用清单 `opens` 授予位的**值域即此名单**(行校验拒绝
103
+ * 式消费——host/manifest);门检裁决(adjudicateCapabilityDoor)同源判「是否
104
+ * 高危面」。派生不另持单源——目录增删高危面,本面与校验/门检三面共变。
105
+ */
106
+ export declare const USER_GRANTABLE_CAPABILITIES: readonly string[];
107
+ /**
108
+ * 启用清单顶层 `doors:` 段值域 v1 单源(开门制扩展批 2026-09-09——03 §4.6
109
+ * 双源并集律第二源的值域面):观测/操控两门枚举。**射程即值域**——六枚全宽
110
+ * 将致「清单呈现开、门检实效关」的三读分叉与审计说谎背离(冷读闸 major #1
111
+ * 收窄);USER_GRANTABLE_CAPABILITIES 名单系其上界,扩枚随后续模型道高危面
112
+ * 立题放宽。行校验拒绝式消费(host/manifest——段坏形/值域外 fail-loud 拒)。
113
+ */
114
+ export declare const DOORS_SEGMENT_V1_DOMAIN: readonly string[];
115
+ /**
116
+ * 门检裁决结果(§4.6 开门语义的裁决面形态——纯数据,fail-loud 抛掷归宿主
117
+ * 注入位:装载器/换装缝按 kind 包 `PLUGIN_CAPABILITY_DOOR_CLOSED`)。
118
+ */
119
+ export type CapabilityDoorVerdict = {
120
+ readonly ok: true;
121
+ } | {
122
+ readonly ok: false;
123
+ /**
124
+ * not-a-door = 能力名不在高危面名单(非高危面或不存在——宿主侧误用面,
125
+ * 装配缺陷级);door-closed = 系高危面但该插件未获用户开门授予(§4.6
126
+ * 默认关的正当拒绝面——插件侧可期事件,message 指路授予位写法)。
127
+ */
128
+ readonly kind: 'not-a-door' | 'door-closed';
129
+ /** 人读裁决信息(throw 时的 message 底稿) */
130
+ readonly message: string;
131
+ };
132
+ /**
133
+ * 高危面门检裁决(§4.6——用户主权开门制的执法判定核;纯函数零副作用)。
134
+ *
135
+ * 判定两序:①能力名 ∈ USER_GRANTABLE_CAPABILITIES(不是高危面即 not-a-door
136
+ * ——常规能力位不走开门制,宿主侧把非门面接进门检系装配缺陷);②该插件的
137
+ * 开门授予集是否含此名(缺席 = 默认关 door-closed)。开门授予集 = 启用清单
138
+ * 行 `opens` 位(读侧行校验已保证值域合法——本函数对集外值不再复验,信任
139
+ * 前置校验)。**调用方 = 宿主注入位**(界面后端换装缝/路由受理面随批 U3/U5
140
+ * 落地接线);插件代码结构性不可达本函数(开门是宿主裁决面非插件 API)。
141
+ */
142
+ export declare function adjudicateCapabilityDoor(opened: ReadonlySet<string>, capability: string): CapabilityDoorVerdict;
143
+ /**
144
+ * apiVersion 比较(§8.4 版本比较语义):MAJOR.MINOR 逐段数值比较——禁字符串
145
+ * 比较("1.10" > "1.9")。格式非法抛 API_VERSION_MALFORMED(调用方 = 清单
146
+ * 校验后的执法面,正常路径格式已验)。
147
+ * @returns 负数 = a < b;0 = 相等;正数 = a > b
148
+ */
149
+ export declare function compareApiVersions(a: string, b: string): number;
150
+ /**
151
+ * 断言 apiVersion 格式合法(清单校验面用——错误归 PLUGIN_INVALID 语境由调用方
152
+ * 包,本函数只做纯格式判定的复用体)。
153
+ */
154
+ export declare function isValidApiVersion(v: string): boolean;
155
+ /**
156
+ * API 兼容执法收剑点火位(§8.4「批 4 翻必填」+ §8.10 批表——机器在窗口内、
157
+ * 兼容执法单点收剑)。
158
+ *
159
+ * - `false`(现役)= pre-release 窗口容忍态:api 块缺席走 legacy 出口聚合 warn;
160
+ * - `true`(首个 dist-tag=latest 当笔翻转)= 点火:api 块缺席从 warn 变拒载
161
+ * (`API_VERSION_MISMATCH`),min fail-loud 对全体插件生效。
162
+ *
163
+ * **散拷禁令**(§8.4):常量消费面恰两处——adjudicateApiGate 出口 4(行为面:
164
+ * 缺块 warn/拒载)与抽取器 enforcement 纪元章(tools/extract-api-surface.mjs
165
+ * ——只读单源盖章进面快照,不改不散播,§8.10 点火可见性);测试经纯函数
166
+ * `ignited` 参数注入两态,不改常量。点火日翻转 = 改此单点 + 同笔测试 + 快照
167
+ * 再生成(enforcement 纪元章随翻转变色——查 1 自然拦)。
168
+ */
169
+ export declare const API_ENFORCEMENT_IGNITED = false;
170
+ /** 清单 api 块形状(package.json `api` 键运行时形——§8.4) */
171
+ export interface ApiBlock {
172
+ /** 硬地板:宿主 apiVersion < min 即拒载(api 块在场则必填) */
173
+ readonly minApiVersion: string;
174
+ /** 行为锚(可选——缺省 = min 粘性锚:不声明恒持 min 时点面) */
175
+ readonly targetApiVersion?: string;
176
+ /** 实验键启用声明(键级——import 实验键未声明 = 装载期拒) */
177
+ readonly experimental?: readonly string[];
178
+ }
179
+ /** 装载门裁决结果(§8.4 四出口的机器形态——legacy 态不拒载只聚合 warn) */
180
+ export interface ApiGateResult {
181
+ /** 出口:legacy(api 块缺席)/ admit(三兼容出口统称——钳制细节见 effectiveTarget) */
182
+ readonly status: 'legacy' | 'admit';
183
+ /** 生效 target = min(宿主 apiVersion, targetApiVersion)(钳制出口的核心值) */
184
+ readonly effectiveTarget: string;
185
+ /** 声明的实验键集合(experimental import 门禁数据源——loader 消费) */
186
+ readonly experimentalKeys: ReadonlySet<string>;
187
+ }
188
+ /**
189
+ * 装载门序(§8.4 四出口全定义)。纯函数:清单 api 块 × 宿主 apiVersion → 裁决。
190
+ * 全入口同律——凡构造装载计划的进路必经同一根公式(装机腿 / boot 合成腿 /
191
+ * 试件腿 / 收割腿 / core: 装载)。出口:
192
+ * 1. 宿主 < min → 抛 `API_VERSION_MISMATCH`(拒载——message 载 expected/actual/
193
+ * 升级指引三段);
194
+ * 2. min ≤ 宿主 < target → 钳制不警示(生效 target = min(宿主, target));
195
+ * 3. 宿主 > target → 正常兼容态不警示(editions 设计目的);
196
+ * 4. api 块缺席 → 点火前 status 'legacy'(调用方聚合 per-boot warn);点火后
197
+ * (`API_ENFORCEMENT_IGNITED` 翻 true)抛 `API_VERSION_MISMATCH` 拒载——
198
+ * 「批 4 翻必填」的唯一机器翻转点。
199
+ * 格式/不变式(min ≤ target)由清单校验先执法——本函数防御式复验格式,
200
+ * 不变式信任前置校验。
201
+ *
202
+ * @param ignited 点火位注入(缺省 = `API_ENFORCEMENT_IGNITED` 常量单源——测试
203
+ * 两态注入专用参数,产码调用点不传)。
204
+ */
205
+ export declare function adjudicateApiGate(api: ApiBlock | undefined, hostApiVersion: string, pluginId: string, ignited?: boolean): ApiGateResult;
206
+ /**
207
+ * experimental import 门禁(§8.4 执法点——与说明符白名单门禁同执法位的纯裁决核):
208
+ * import 实验键而清单未声明 → 抛 `API_EXPERIMENTAL_UNDECLARED`。契约即知情:
209
+ * 能用可破面 = 你签了字。键表之外的说明符不属本门禁(白名单三道另辖)。
210
+ */
211
+ export declare function assertExperimentalDeclared(specifier: string, declared: ReadonlySet<string>, pluginId: string | undefined): void;
212
+ /**
213
+ * 宿主自省面——插件问宿主,而非探测猜(rc 随意改名逼出 Function.length 探测
214
+ * 是生态病根的正解;§8.5 面定义)。插件侧经 `ctx.host` 只读取得;装配根一次
215
+ * 性注入(ContextRuntime 持有,fork 共享运行时天然级联)。
216
+ * 〔与 berry 对照注记:formFactor 字段随多形态蒸发——单机单形态〕
217
+ */
218
+ export interface HostFace {
219
+ /** 宿主包版本(package.json version) */
220
+ readonly version: string;
221
+ /** API 面版本(package.json apiVersion——§8.1 独立号) */
222
+ readonly apiVersion: string;
223
+ /** 本构建面能力集(has = 构建面有无,非启用清单挂载态——两问不混) */
224
+ readonly capabilities: {
225
+ has(name: string): boolean;
226
+ list(): string[];
227
+ };
228
+ /** 实验面启用探针:键在本构建面在场且 tier = experimental */
229
+ readonly experimental: {
230
+ enabled(name: string): boolean;
231
+ };
232
+ }
233
+ /**
234
+ * HostFace 的纯数据输入(装配根物化用):capabilities/experimentalKeys 清单
235
+ * 派生源 = surface.json capabilities[] 与键表 tier=experimental 子集。〔与
236
+ * berry 对照注记:无分域桥接——HostFaceData 快照 + 对岸物化的桥接档随
237
+ * worker 域概念整体蒸发,单装配点直接物化〕
238
+ */
239
+ export interface HostFaceInput {
240
+ readonly version: string;
241
+ readonly apiVersion: string;
242
+ /** 能力名清单(has/list 的数据底座——派生源 surface.json capabilities[]) */
243
+ readonly capabilities: readonly string[];
244
+ /** 实验键清单(experimental.enabled 的数据底座——键表 tier=experimental 子集) */
245
+ readonly experimentalKeys: readonly string[];
246
+ }
247
+ /** 由纯数据输入物化 HostFace(装配根唯一构造点——ctx.host 只读面由此而来) */
248
+ export declare function materializeHostFace(data: HostFaceInput): HostFace;
249
+ export {};
@@ -0,0 +1,299 @@
1
+ /**
2
+ * L0 contracts — API 治理元数据单源 + 协商层纯函数(03 篇 §8,2026-09-05
3
+ * API 治理批 2 落码)。
4
+ *
5
+ * 本文件 = API 面身份层的机器可读真相源(§8.2 六真相源中的三处):
6
+ * - `VIRTUAL_API_KEYS`:虚拟模块键表(键 + tier + since——§8.3 键级 tier 载体;
7
+ * loader 注入表、抽取器、check-api 三面共取此单源)
8
+ * - `SERVICE_CATALOG`:ctx 服务面目录(首条真实 ctx 服务落码批增条——现空集)
9
+ * - `CAPABILITIES`:能力面目录(surface.json 顶层 capabilities[] 的声明位,
10
+ * §8.5 ctx.host.capabilities 派生源;起算集 = core: 可卸件能力面——批 U2
11
+ * 首登 v1 高危面两枚并携 `userGrantable` 开门制标注)
12
+ *
13
+ * 加协商层纯函数(§8.4 装载门四出口 + 版本比较语义)与 ctx.host 自省面类型
14
+ * (§8.5——HostFace 插件侧形态 / HostFaceInput 装配侧纯数据输入)。
15
+ * 全部纯数据/纯函数:零副作用、jiti 可载(工具面 check-api/抽取器直接 import)。
16
+ *
17
+ * 分桶纪律(§8.3 internal 行 + §8.4 公开根分桶):本文件顶层导出分两桶——
18
+ * 可见桶六名经 contracts/index.ts 显式 re-export 进公开根(插件作者可消费面);
19
+ * internal 机制桶八名不进公开根(宿主治理机制非插件 API,内核消费深导
20
+ * contracts/api.js)。分桶不变式由抽取器 assertApiBucketPartition fail-loud
21
+ * 执法:新顶层导出未分桶即炸(白名单单点 tools/extract-api-surface.mjs
22
+ * INTERNAL_API_EXPORTS)。
23
+ */
24
+ import { BaseError } from './errors.js';
25
+ /** apiVersion 格式:MAJOR.MINOR 两段(API 面无 patch——§8.1) */
26
+ const API_VERSION_FORMAT = /^\d+\.\d+$/;
27
+ /**
28
+ * 虚拟模块键表——现役五键全 `stable`(§8.3:berry-agent/llm 是已落码正路非预览;
29
+ * typebox 三键纯转发)。loader 的注入表由本表派生(注入表不另持键单源);
30
+ * 实验件未来以新键 + tier 'experimental' 进。
31
+ *
32
+ * `berry-agent/sqlite` 键(规范目标态六键之一)**推迟至 persist SqliteFace
33
+ * 落码批进表**:查 1 要求每键至少一条导出、无真身即红——表收现役真源,
34
+ * 键进表 = 真身在场(§8.3 批 2 落码注记)。首条 ctx 服务(SERVICE_CATALOG)
35
+ * 与首个 core: 能力(CAPABILITIES)同律随各自落码批进表。
36
+ */
37
+ export const VIRTUAL_API_KEYS = [
38
+ { key: 'berry-agent', tier: 'stable', since: '1.0' },
39
+ { key: 'typebox', tier: 'stable', since: '1.0' },
40
+ { key: 'typebox/value', tier: 'stable', since: '1.0' },
41
+ { key: 'typebox/compile', tier: 'stable', since: '1.0' },
42
+ { key: 'berry-agent/llm', tier: 'stable', since: '1.0' },
43
+ ];
44
+ /**
45
+ * ctx 服务面目录:首条真实 ctx 具名服务随 c-3 落码批入册(drift 闸守快照,
46
+ * 目录本身是声明面——声明即 API)。抽取器 services 块循环本表,接口切片
47
+ * 机制已就位、每条目落码即活。
48
+ */
49
+ export const SERVICE_CATALOG = [
50
+ {
51
+ name: 'secrets',
52
+ module: 'credentials',
53
+ faceInterface: 'SecretsService',
54
+ note: '插件凭证受理制读写面(ctx.get("secrets") 消费——get 缺省自域、越域读走高危面开门 credentials.read-cross;set 恒自域且只在宿主回调窗内可达)',
55
+ tier: 'stable',
56
+ },
57
+ {
58
+ name: 'compaction',
59
+ module: 'compaction',
60
+ faceInterface: 'CompactionPluginFace',
61
+ note: '压缩策略面(ctx.get("compaction") 消费——setConfig 数值槽/registerSummarizer 摘要 provider 槽两动词装载窗 only 严于通律、单席位先到占;provider 只作用阈值路,溢出兜底恒宿主缺省算法)',
62
+ tier: 'stable',
63
+ },
64
+ {
65
+ name: 'sdk-routes',
66
+ module: 'sdk',
67
+ faceInterface: 'SdkRoutesPluginFace',
68
+ note: '路由受理面(ctx.get("sdk-routes") 消费——register 受理制注册 sdk HTTP 面插件道路由:前缀 /plugins/<id>/ 恒受理面施加 + 收窄四件〔鉴权子集/loopbackOnly 恒 true/体帽 1MiB 缺席即帽值/数帽 16〕+ 门检 sdk.register-route 前置 + 装载窗 only;裁决纯函数 sdk/plugin-routes.ts)',
69
+ tier: 'stable',
70
+ },
71
+ ];
72
+ /**
73
+ * 能力面目录:core: 可卸件能力起算集(§8.5——ctx.host.capabilities 读此层)。
74
+ * 语义 = **本构建面**(编译进包即有——启用清单是否挂载属运行时态,两问不混)。
75
+ * 批 U2 首登 v1 首批高危面两枚(§4.6——`userGrantable` 开门制标注单源):
76
+ * - `channels.ui-backend`:替换界面后端(UiBackend 实装换装——02 §2 表 #6
77
+ * 重述所指高权面;承载方 = channels 宿主固定件〔自研 TUI 引擎席位〕);
78
+ * - `sdk.register-route`:注册网页路由(sdk HTTP 面路由扩展位——03 §10.6;
79
+ * 承载方 = core:sdk 件)。
80
+ * 触发器面 C 批补第三枚(2026-09-07——P1 拍板批 v1 名单两枚→三枚的落码兑现):
81
+ * - `triggers.start-run`:触发器起会(非人触发起无头会话——03 §2.2
82
+ * ctx.triggers.register;承载方 = host 装配根〔注册表/starter 编舞住
83
+ * host 侧触发器件,零新席——03 §8.2 providedBy 第三形〕)。
84
+ * 凭证代管件 c-1 规范先行批入册第四枚(2026-09-08——§4.6 v1 首批名单
85
+ * 三枚→四枚;c-3 读腿落码批代码侧兑现):
86
+ * - `credentials.read-cross`:跨域读凭证(ctx.secrets.get 越自域
87
+ * namespace 读——03 §2.2 第十面/§10.9 读腿;承载方 = core:credentials
88
+ * 件〔judged 面——默认关、开门后逐次 capability/used 审计〕)。
89
+ * 环境感知件 e-2 观测腿批入册第五枚(2026-09-08——§4.6 v1 首批名单
90
+ * 四枚→五枚;立题档题 6 拍板「动词族一枚高危面统摄」——拉取与订阅两
91
+ * 形态一枚统摄):
92
+ * - `sessions.observe-cross`:跨树观测(obs 会话维工具族跨树目标读/
93
+ * 全会话维枚举——03 §10.8 可见性分轴观测轴;树内 self/tree 两档零
94
+ * 开门。承载方 = host 装配根〔per-session 工具族闭包装配位 +
95
+ * 订阅作用域执法住宿主侧——03 §8.2 providedBy 第三形同 triggers.
96
+ * start-run;obs 件提供 SessionView 纯派生读面非承载方〕)。
97
+ * 后续高危面经三路准入扩枚举同律入册(§4.6);构建差能力随真实构建分叉日
98
+ * 启用 `API_CAPABILITY_MISSING`(预留码,本批无 thrower)。
99
+ */
100
+ export const CAPABILITIES = [
101
+ {
102
+ name: 'channels.ui-backend',
103
+ providedBy: 'channels',
104
+ userGrantable: true,
105
+ },
106
+ {
107
+ name: 'sdk.register-route',
108
+ providedBy: 'core:sdk',
109
+ userGrantable: true,
110
+ },
111
+ {
112
+ name: 'triggers.start-run',
113
+ providedBy: 'host',
114
+ userGrantable: true,
115
+ },
116
+ {
117
+ name: 'credentials.read-cross',
118
+ providedBy: 'core:credentials',
119
+ userGrantable: true,
120
+ },
121
+ {
122
+ name: 'sessions.observe-cross',
123
+ providedBy: 'host',
124
+ userGrantable: true,
125
+ },
126
+ {
127
+ // 操控轴高危面(03 §4.6 v1 首批第六枚——e-4 落码批入册):跨会话
128
+ // send/interrupt/withdraw 全域同门无树内豁免(03 §2.2 第十一面门制句)
129
+ name: 'sessions.control-cross',
130
+ providedBy: 'host',
131
+ userGrantable: true,
132
+ },
133
+ ];
134
+ /**
135
+ * 高危面开门名单单源(§4.6 登记单源的派生面):CAPABILITIES 中 `userGrantable`
136
+ * 标注位的能力名清单。启用清单 `opens` 授予位的**值域即此名单**(行校验拒绝
137
+ * 式消费——host/manifest);门检裁决(adjudicateCapabilityDoor)同源判「是否
138
+ * 高危面」。派生不另持单源——目录增删高危面,本面与校验/门检三面共变。
139
+ */
140
+ export const USER_GRANTABLE_CAPABILITIES = CAPABILITIES.filter((c) => c.userGrantable === true).map((c) => c.name);
141
+ /**
142
+ * 启用清单顶层 `doors:` 段值域 v1 单源(开门制扩展批 2026-09-09——03 §4.6
143
+ * 双源并集律第二源的值域面):观测/操控两门枚举。**射程即值域**——六枚全宽
144
+ * 将致「清单呈现开、门检实效关」的三读分叉与审计说谎背离(冷读闸 major #1
145
+ * 收窄);USER_GRANTABLE_CAPABILITIES 名单系其上界,扩枚随后续模型道高危面
146
+ * 立题放宽。行校验拒绝式消费(host/manifest——段坏形/值域外 fail-loud 拒)。
147
+ */
148
+ export const DOORS_SEGMENT_V1_DOMAIN = ['sessions.observe-cross', 'sessions.control-cross'];
149
+ /**
150
+ * 高危面门检裁决(§4.6——用户主权开门制的执法判定核;纯函数零副作用)。
151
+ *
152
+ * 判定两序:①能力名 ∈ USER_GRANTABLE_CAPABILITIES(不是高危面即 not-a-door
153
+ * ——常规能力位不走开门制,宿主侧把非门面接进门检系装配缺陷);②该插件的
154
+ * 开门授予集是否含此名(缺席 = 默认关 door-closed)。开门授予集 = 启用清单
155
+ * 行 `opens` 位(读侧行校验已保证值域合法——本函数对集外值不再复验,信任
156
+ * 前置校验)。**调用方 = 宿主注入位**(界面后端换装缝/路由受理面随批 U3/U5
157
+ * 落地接线);插件代码结构性不可达本函数(开门是宿主裁决面非插件 API)。
158
+ */
159
+ export function adjudicateCapabilityDoor(opened, capability) {
160
+ if (!USER_GRANTABLE_CAPABILITIES.includes(capability)) {
161
+ return {
162
+ ok: false,
163
+ kind: 'not-a-door',
164
+ message: `能力位 ${capability} 不在高危面名单(现役:${USER_GRANTABLE_CAPABILITIES.join('、')})——常规能力位不走开门制,宿主注入位接错面或能力名拼错`,
165
+ };
166
+ }
167
+ if (!opened.has(capability)) {
168
+ return {
169
+ ok: false,
170
+ kind: 'door-closed',
171
+ message: `高危面 ${capability} 默认关(用户主权开门制 03 §4.6)——本插件未获开门授予;开法:启用清单 enabled.yaml 该插件行加 opens: ["${capability}"] 后重装载,撤位即收回`,
172
+ };
173
+ }
174
+ return { ok: true };
175
+ }
176
+ /* ---------------- 版本比较与装载门(§8.4) ---------------- */
177
+ /**
178
+ * apiVersion 比较(§8.4 版本比较语义):MAJOR.MINOR 逐段数值比较——禁字符串
179
+ * 比较("1.10" > "1.9")。格式非法抛 API_VERSION_MALFORMED(调用方 = 清单
180
+ * 校验后的执法面,正常路径格式已验)。
181
+ * @returns 负数 = a < b;0 = 相等;正数 = a > b
182
+ */
183
+ export function compareApiVersions(a, b) {
184
+ const pa = parseApiVersion(a);
185
+ const pb = parseApiVersion(b);
186
+ return pa[0] !== pb[0] ? pa[0] - pb[0] : pa[1] - pb[1];
187
+ }
188
+ /**
189
+ * API 族错误消息公共指路尾注(公开锚——运行时字符串不指路知识域)。
190
+ *
191
+ * 指路目标 = 仓库公开文档面(COMPATIBILITY.md 与 docs/API参考.md——批 4
192
+ * 收剑点火件落地后在场;本批先占位词面,两件生成后即真)。第三方插件作者
193
+ * 顺错误消息可达;知识域篇名/章节号(gitignored)禁入运行时字符串。
194
+ * 本模块三条拒载消息统一缀此尾注:拒载消息自带「下一步去哪读」。
195
+ * 模块私有(不入公开桶——INTERNAL_API_EXPORTS 白名单无需扩)。
196
+ */
197
+ const API_DOC_ANCHOR_NOTE = 'API 治理语义见仓库 COMPATIBILITY.md 与 docs/API参考.md。';
198
+ /** 解析 apiVersion 为 [MAJOR, MINOR] 数值对;格式非法即抛(单点执法) */
199
+ function parseApiVersion(v) {
200
+ if (!API_VERSION_FORMAT.test(v)) {
201
+ throw new BaseError('API_VERSION_MALFORMED', `apiVersion 格式非法:${v}(应为 MAJOR.MINOR,如 "1.0")${API_DOC_ANCHOR_NOTE}`);
202
+ }
203
+ const [major, minor] = v.split('.');
204
+ return [Number(major), Number(minor)];
205
+ }
206
+ /**
207
+ * 断言 apiVersion 格式合法(清单校验面用——错误归 PLUGIN_INVALID 语境由调用方
208
+ * 包,本函数只做纯格式判定的复用体)。
209
+ */
210
+ export function isValidApiVersion(v) {
211
+ return API_VERSION_FORMAT.test(v);
212
+ }
213
+ /**
214
+ * API 兼容执法收剑点火位(§8.4「批 4 翻必填」+ §8.10 批表——机器在窗口内、
215
+ * 兼容执法单点收剑)。
216
+ *
217
+ * - `false`(现役)= pre-release 窗口容忍态:api 块缺席走 legacy 出口聚合 warn;
218
+ * - `true`(首个 dist-tag=latest 当笔翻转)= 点火:api 块缺席从 warn 变拒载
219
+ * (`API_VERSION_MISMATCH`),min fail-loud 对全体插件生效。
220
+ *
221
+ * **散拷禁令**(§8.4):常量消费面恰两处——adjudicateApiGate 出口 4(行为面:
222
+ * 缺块 warn/拒载)与抽取器 enforcement 纪元章(tools/extract-api-surface.mjs
223
+ * ——只读单源盖章进面快照,不改不散播,§8.10 点火可见性);测试经纯函数
224
+ * `ignited` 参数注入两态,不改常量。点火日翻转 = 改此单点 + 同笔测试 + 快照
225
+ * 再生成(enforcement 纪元章随翻转变色——查 1 自然拦)。
226
+ */
227
+ export const API_ENFORCEMENT_IGNITED = false;
228
+ /**
229
+ * 装载门序(§8.4 四出口全定义)。纯函数:清单 api 块 × 宿主 apiVersion → 裁决。
230
+ * 全入口同律——凡构造装载计划的进路必经同一根公式(装机腿 / boot 合成腿 /
231
+ * 试件腿 / 收割腿 / core: 装载)。出口:
232
+ * 1. 宿主 < min → 抛 `API_VERSION_MISMATCH`(拒载——message 载 expected/actual/
233
+ * 升级指引三段);
234
+ * 2. min ≤ 宿主 < target → 钳制不警示(生效 target = min(宿主, target));
235
+ * 3. 宿主 > target → 正常兼容态不警示(editions 设计目的);
236
+ * 4. api 块缺席 → 点火前 status 'legacy'(调用方聚合 per-boot warn);点火后
237
+ * (`API_ENFORCEMENT_IGNITED` 翻 true)抛 `API_VERSION_MISMATCH` 拒载——
238
+ * 「批 4 翻必填」的唯一机器翻转点。
239
+ * 格式/不变式(min ≤ target)由清单校验先执法——本函数防御式复验格式,
240
+ * 不变式信任前置校验。
241
+ *
242
+ * @param ignited 点火位注入(缺省 = `API_ENFORCEMENT_IGNITED` 常量单源——测试
243
+ * 两态注入专用参数,产码调用点不传)。
244
+ */
245
+ export function adjudicateApiGate(api, hostApiVersion, pluginId, ignited = API_ENFORCEMENT_IGNITED) {
246
+ // 出口 4:api 块缺席——点火前 legacy 容忍态(面/行为按宿主当前——不进任何兼容
247
+ // 模式);点火后拒载(min fail-loud 全体生效的机器形态)
248
+ if (api === undefined) {
249
+ if (ignited) {
250
+ throw new BaseError('API_VERSION_MISMATCH', `插件 ${pluginId} 清单(package.json)缺 api 块——兼容执法已点火(api 块必填),` +
251
+ `须在 package.json 补 "api": { "minApiVersion": "<宿主当前 apiVersion 或更旧>" }` +
252
+ `(批 4 翻必填——min fail-loud 与兼容模式对全体插件生效)。${API_DOC_ANCHOR_NOTE}`);
253
+ }
254
+ return { status: 'legacy', effectiveTarget: hostApiVersion, experimentalKeys: new Set() };
255
+ }
256
+ const min = api.minApiVersion;
257
+ const target = api.targetApiVersion ?? min; // 粘性锚:缺省 = min 的值
258
+ parseApiVersion(min); // 防御式格式复验(前置校验已红过一次)
259
+ parseApiVersion(hostApiVersion);
260
+ // 出口 1:硬地板拒载(fail-loud 三段消息)
261
+ if (compareApiVersions(hostApiVersion, min) < 0) {
262
+ throw new BaseError('API_VERSION_MISMATCH', `插件 ${pluginId} 声明 minApiVersion ${min},宿主 API 面版本 ${hostApiVersion} 低于地板——拒载。` +
263
+ `升级指引:升级 berry-agent 宿主包(npm i -g berry-agent@latest)或联系插件作者放宽 minApiVersion。${API_DOC_ANCHOR_NOTE}`);
264
+ }
265
+ // 出口 2/3:钳制与兼容统称 admit——生效 target = min(宿主, target)(钳制出口
266
+ // 的值在兼容出口自然等于 target,两出口同式不分支——「钳制不警示」的机器形态)
267
+ const effectiveTarget = compareApiVersions(hostApiVersion, target) < 0 ? hostApiVersion : target;
268
+ return { status: 'admit', effectiveTarget, experimentalKeys: new Set(api.experimental ?? []) };
269
+ }
270
+ /**
271
+ * experimental import 门禁(§8.4 执法点——与说明符白名单门禁同执法位的纯裁决核):
272
+ * import 实验键而清单未声明 → 抛 `API_EXPERIMENTAL_UNDECLARED`。契约即知情:
273
+ * 能用可破面 = 你签了字。键表之外的说明符不属本门禁(白名单三道另辖)。
274
+ */
275
+ export function assertExperimentalDeclared(specifier, declared, pluginId) {
276
+ const entry = VIRTUAL_API_KEYS.find((k) => k.key === specifier);
277
+ if (entry === undefined || entry.tier !== 'experimental')
278
+ return;
279
+ if (declared.has(specifier))
280
+ return;
281
+ throw new BaseError('API_EXPERIMENTAL_UNDECLARED', `import 实验键 ${specifier} 未在清单声明——插件 ${pluginId ?? '(未知插件)'} 须在 package.json ` +
282
+ `api 块 experimental 数组显式点名该键方能启用(契约即知情:实验键任意 minor 可破可删)${API_DOC_ANCHOR_NOTE}`);
283
+ }
284
+ /** 由纯数据输入物化 HostFace(装配根唯一构造点——ctx.host 只读面由此而来) */
285
+ export function materializeHostFace(data) {
286
+ const capabilitySet = new Set(data.capabilities);
287
+ const experimentalSet = new Set(data.experimentalKeys);
288
+ return {
289
+ version: data.version,
290
+ apiVersion: data.apiVersion,
291
+ capabilities: {
292
+ has: (name) => capabilitySet.has(name),
293
+ list: () => [...capabilitySet],
294
+ },
295
+ experimental: {
296
+ enabled: (name) => experimentalSet.has(name),
297
+ },
298
+ };
299
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 审批 ask 跨模块词汇(07 §4.3 提问队列条款 + 04 §9 审批链的呈现载荷)。
3
+ *
4
+ * 属地裁决(批 11b 契约先行):原住 channels/types.ts(批 10e-2 通道核
5
+ * askApproval 面定稿时落)——conversation 件(fresh 作用域审批三件)消费
6
+ * 同形而依 02 §4.1 边表不可达 channels,闭集词汇归位 contracts 单源;
7
+ * channels 侧改 import + re-export,公开面零变化。
8
+ */
9
+ /**
10
+ * 审批 ask 应答闭集(07 §4.3 提问队列条款——审批入队契约):approve/reject/
11
+ * cancel/always/unavailable。收口语义两分立(对齐 04 §9 run 信号透传 ask 链):
12
+ * 会话关闭 / run 打断收口 → `'cancel'`(用户主动终止语境);降级到底(全部
13
+ * 后端无 approval capability——headless 单发形态的结构态)→ `'unavailable'`
14
+ * (呈现面结构性无人可答——ApprovalService 侧落 outcome unavailable +
15
+ * source timeout,04 §9 无应答者语义;2026-09-13 真模型实测批增,修前误答
16
+ * `'cancel'` 致 decided 错标 cancel/user 双失真);`always` + 草案的策略表
17
+ * 回写经装配注入回调(onApprovalAlways)。
18
+ */
19
+ export type ApprovalAskAnswer = 'approve' | 'reject' | 'cancel' | 'always' | 'unavailable';
20
+ /**
21
+ * 审批 ask 呈现载荷(07 §4.3——通道侧形):channels 与 safety 边表互无边
22
+ * (02 §4.1),safety 侧 ApprovalRequest 经装配根映射注入本形;`suggestedEntry`
23
+ * = 「始终允许」草案条目(04 §9 ③ 策略表 allow 条目回写目标;无草案 = always 选项
24
+ * 语义上不呈现、防御收口视同 approve)。
25
+ */
26
+ export interface ApprovalAskRequest {
27
+ /** 目标动作摘要(人可读一行——面板标题) */
28
+ readonly summary: string;
29
+ /** 请求方/理由(有则呈现说明段) */
30
+ readonly reason?: string;
31
+ /** 发起审批的工具名(有则呈现) */
32
+ readonly toolName?: string;
33
+ /** 挂起身份短形(多驱动单输入框下防串答) */
34
+ readonly approvalId?: string;
35
+ /** 「始终允许」草案条目(策略表 allow 条目回写目标;缺席 = always 防御收口视同 approve) */
36
+ readonly suggestedEntry?: string;
37
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 审批 ask 跨模块词汇(07 §4.3 提问队列条款 + 04 §9 审批链的呈现载荷)。
3
+ *
4
+ * 属地裁决(批 11b 契约先行):原住 channels/types.ts(批 10e-2 通道核
5
+ * askApproval 面定稿时落)——conversation 件(fresh 作用域审批三件)消费
6
+ * 同形而依 02 §4.1 边表不可达 channels,闭集词汇归位 contracts 单源;
7
+ * channels 侧改 import + re-export,公开面零变化。
8
+ */
9
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 凭证 env 引用形(03 §10.9 注入腿——c-4 落码批)。
3
+ *
4
+ * 词面:`@credentials:<name>`(值位整串精确匹配——sigil 前缀 + 凭证名)。
5
+ * 用户在 MCP/LSP server config 的 env 声明里以引用形代替明文:
6
+ * `{ "GITHUB_TOKEN": "@credentials:github-token" }`——配置与 durable 面恒
7
+ * 只见引用形原文,明文值只在 spawn 时刻经宿主展开进子进程环境(exec
8
+ * buildChildEnv 单点——模型面/插件码面/工具结果结构性不见值)。
9
+ *
10
+ * 本文件是词面**单源**(跨模块契约词汇:exec 执法消费 + credentials
11
+ * resolver 消费 + 用户 config 书写三方法源):放 contracts 使两消费方均
12
+ * 零新 DAG 边(exec 与 credentials 均既有 contracts 边)。纯数据/纯函数、
13
+ * jiti 可载——与 api.ts 同族纪律。
14
+ *
15
+ * v1 无转义形:以 `@credentials:` 起头的 env 值一律视为引用形(该形在
16
+ * env 值位无正当字面用途——逃生口挂账不需要)。
17
+ */
18
+ /** 引用形 sigil 前缀(含冒号——`@credentials:`;名 = 前缀后的非空余段) */
19
+ export declare const CREDENTIALS_ENV_REF_PREFIX = "@credentials:";
20
+ /** 引用形解析结果(三态:非引用形 / 引用形携名 / 前缀命中而坏形) */
21
+ export type CredentialEnvRef =
22
+ /** 非引用形——字面值原样放行 */
23
+ {
24
+ readonly kind: 'none';
25
+ }
26
+ /** 引用形——name 为凭证作用名(host 域 provider 名) */
27
+ | {
28
+ readonly kind: 'ref';
29
+ readonly name: string;
30
+ }
31
+ /** 坏形——前缀命中而名空(意图明确是引用形,fail-loud 拒字面注入) */
32
+ | {
33
+ readonly kind: 'invalid';
34
+ };
35
+ /**
36
+ * 解析 env 值是否为凭证引用形。
37
+ * @param value env 声明值(set 面单值)
38
+ * @returns 三态解析结果——'none' 字面放行 / 'ref' 交宿主展开 / 'invalid'
39
+ * 前缀命中而名空(调用方以 CREDENTIALS_ENV_REF_INVALID 响亮拒)
40
+ */
41
+ export declare function parseCredentialEnvRef(value: string): CredentialEnvRef;