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,140 @@
1
+ /**
2
+ * core:memory 类型面(06 篇 §3/§5——记忆表族 + 合并三分支;批 18c-1)。
3
+ *
4
+ * 单向 DAG(02 §4.1 memory 席 deps = contracts + context + session + persist):
5
+ * 四实边已全通(contracts 错误码注册 + persist SqliteDatabase/MigrationSpec +
6
+ * context canonical 根接线 + session/event 提取注入两路——18c-3/4/5 落码后
7
+ * 实况;拓扑边表四边在位执法)。
8
+ *
9
+ * 本文件钉死:kind 七值闭集、status 三值闭集、source_refs 溯源形、
10
+ * 候选/行形、三分支裁决结果、入库结局——契约先行的词汇面单源。
11
+ */
12
+ /** kind 七值闭集单源(运行时校验消费——MEMORY_ENTRY_INVALID 判据之一) */
13
+ export const MEMORY_KINDS = [
14
+ 'preference',
15
+ 'fact',
16
+ 'convention',
17
+ 'correction',
18
+ 'failure',
19
+ 'insight',
20
+ 'profile',
21
+ ];
22
+ /** 状态三值闭集单源 */
23
+ export const MEMORY_STATUSES = ['active', 'dismissed', 'expired'];
24
+ /* ---------------- 常量(缺省值单源——06 §3/§5 起草值) ---------------- */
25
+ /** 模糊合并 Jaccard 阈值(Mercury 实证档 0.74——Jaccard 交并比钉死,落码定形注) */
26
+ export const MEMORY_FUZZY_JACCARD_THRESHOLD = 0.74;
27
+ /** 极性冲突去极性后 Jaccard 阈值(同主题判据——06 §5 分支 3) */
28
+ export const MEMORY_POLARITY_JACCARD_THRESHOLD = 0.5;
29
+ /** source_refs 并集去重上限(血缘继承同罩——06 §5 血缘继承段「50 条上限」) */
30
+ export const MEMORY_SOURCE_REFS_CAP = 50;
31
+ /** summary 硬帽(合并比较面与 FTS 索引面的合理量级——起草值随实测调) */
32
+ export const MEMORY_SUMMARY_MAX_CHARS = 2_000;
33
+ /** content 硬帽(注入用全文——与 summary 同律起草值) */
34
+ export const MEMORY_CONTENT_MAX_CHARS = 64_000;
35
+ /* 持有面/检索面常量(批 18c-2——06 §7 工具九件;起草值随实测调) */
36
+ /** 检索行帽缺省 / 硬帽(memory_search) */
37
+ export const MEMORY_SEARCH_DEFAULT_LIMIT = 10;
38
+ export const MEMORY_SEARCH_MAX_LIMIT = 50;
39
+ /** 访问日志流水面行帽缺省 / 硬帽(memory_access_log) */
40
+ export const MEMORY_ACCESS_LOG_DEFAULT_LIMIT = 50;
41
+ export const MEMORY_ACCESS_LOG_MAX_LIMIT = 200;
42
+ /** 访问聚合面 top-N(「top-N 被用条目」——06 §7 access_log 行) */
43
+ export const MEMORY_ACCESS_AGGREGATE_TOP_N = 20;
44
+ /** 晋升搬家技能名词法(06 §7 forget 行 promotedToSkill——与技能侧 name 校验同源的纯字面量档) */
45
+ export const MEMORY_SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
46
+ /** 晋升搬家技能名帽(≤64) */
47
+ export const MEMORY_SKILL_NAME_MAX = 64;
48
+ /** memory_read 最近变更腿行数(updated_at DESC) */
49
+ export const MEMORY_RECENT_LIMIT = 5;
50
+ /** 天 → 毫秒换算单源(ttl_days / expires_at 重算共用) */
51
+ export const MEMORY_DAY_MS = 86_400_000;
52
+ /* 注入面常量(批 18c-4——06 §6 两路;起草值随实测调) */
53
+ /** 常驻简报段固定标记(memory/core 具名段的包裹锚——prompt 侧锚点) */
54
+ export const MEMORY_BRIEF_MARKER = '<!-- memory:core -->';
55
+ /** 常驻简报字符限额(约值——只约竞争面,frozen 免限额恒全收) */
56
+ export const MEMORY_BRIEF_CHAR_LIMIT = 2000;
57
+ /** 常驻简报竞争面行数帽(top N——「取 top N」的 N 值起草档) */
58
+ export const MEMORY_BRIEF_TOP_N = 20;
59
+ /** 未用强排除阈值天数(§5 效用维度——30 天管常驻面;frozen 免) */
60
+ export const MEMORY_BRIEF_STALE_DAYS = 30;
61
+ /** TTL 临近阈值天数(06 §6 条目行时效标注——p-1 批:expires_at 距今 ≤ 此值时注入行复合「TTL剩M天」段) */
62
+ export const MEMORY_TTL_SOON_DAYS = 7;
63
+ /** 按需检索 query 帽(当轮 user 消息作为检索 query 的资格条件——超长不入检) */
64
+ export const MEMORY_RECALL_QUERY_MAX_CHARS = 200;
65
+ /** 按需检索注入条数(top-k 缺省 3) */
66
+ export const MEMORY_RECALL_TOP_K = 3;
67
+ /** 按需检索 kind 优先重排候选池倍数(一次取款覆盖 kind 重排的候选面——起草值) */
68
+ export const MEMORY_RECALL_POOL_FACTOR = 4;
69
+ /** 检索注入自定义角色名(04 运行时骨架自定义角色机制——装配面包装 hidden/toLlm,件内只出常量与文本) */
70
+ export const MEMORY_RECALL_ROLE = 'memory/recall';
71
+ /* 周期路/整理面常量(批 18c-5——06 §4/§5/§4.1 起草值) */
72
+ /** 周期路触发阈值:turn/end 计数(两阈值任一达标即触发后台 review) */
73
+ export const MEMORY_REVIEW_TURN_THRESHOLD = 10;
74
+ /** 周期路触发阈值:tool/call 计数 */
75
+ export const MEMORY_REVIEW_TOOL_CALL_THRESHOLD = 15;
76
+ /** 周期路审阅窗:最近 N 个 turn(fetchEvents 切片窗——窗内转录喂 LLM) */
77
+ export const MEMORY_REVIEW_WINDOW_TURNS = 10;
78
+ /** 周期路候选置信度缺省(弱于即时路纠正 0.7——review 是推断性提取) */
79
+ export const MEMORY_REVIEW_CONFIDENCE = 0.6;
80
+ /** consolidation 老化阈值天数(updated_at 超此入候选集) */
81
+ export const MEMORY_CONSOLIDATION_STALE_DAYS = 90;
82
+ /** owner 容量上限(TTL 可见行数超此 → 低分盈余入候选;**永不因满拒写**) */
83
+ export const MEMORY_OWNER_CAPACITY = 500;
84
+ /** consolidation 拍间最小间隔毫秒(anchor 护栏——防抖) */
85
+ export const MEMORY_CONSOLIDATION_ANCHOR_MS = 5 * 60_000;
86
+ /** decay 降权因子(confidence × factor——起草值随实测调) */
87
+ export const MEMORY_DECAY_FACTOR = 0.7;
88
+ /**
89
+ * polluted 判据缺省表('*' 通配——06 §4.1 落码定形注起草值):
90
+ * 'fetch'/'mcp' 精确名 + '*__*' = MCP 复合键全族(`server__tool`——服务器键
91
+ * 无下划线,'__' 子串即复合键指纹)。
92
+ */
93
+ export const MEMORY_POLLUTION_DEFAULT_PATTERNS = ['fetch', 'mcp', '*__*'];
94
+ /** review kind 五值闭集单源(TypeBox schema 构建消费) */
95
+ export const REVIEW_KINDS = ['preference', 'fact', 'convention', 'failure', 'insight'];
96
+ /** LLM 回复文本面提取(string 直取;块数组拼 text 块——结构兼容双形) */
97
+ export function llmTextOf(content) {
98
+ if (typeof content === 'string')
99
+ return content;
100
+ return content
101
+ .filter((b) => b.type === 'text' && typeof b.text === 'string')
102
+ .map((b) => b.text)
103
+ .join('\n');
104
+ }
105
+ /* ---------------- 跨会话检索面(批 18c-6——06 §10 落码定形注五则) ---------------- */
106
+ /** snippet 切窗:命中位前取字符数(06 §10 定形注②——前窗短后窗长) */
107
+ export const MEMORY_SNIPPET_BEFORE = 16;
108
+ /** snippet 切窗:命中位后取字符数(含命中词本身) */
109
+ export const MEMORY_SNIPPET_AFTER = 48;
110
+ /* ---------------- 晋升候选与简报差分常量(批 18c-7——06 §9.1/§6) ---------------- */
111
+ /** 晋升候选 kind 集(§9.1——「反复命中才值得固化」的三 kind;preference/fact 等不点名) */
112
+ export const MEMORY_PROMOTION_KINDS = ['failure', 'insight', 'convention'];
113
+ /** 晋升候选行数帽(§9.1「取 top 3」——起草值随实测调) */
114
+ export const MEMORY_PROMOTION_TOP_N = 3;
115
+ /** 晋升候选判据:evidence_count 下限(≥2 = 反复命中;起草值随实测调) */
116
+ export const MEMORY_PROMOTION_EVIDENCE_MIN = 2;
117
+ /** 晋升候选判据:usage_count 下限(cite 是比 recall/search 流水更强的效用信号——单次即够格) */
118
+ export const MEMORY_PROMOTION_USAGE_MIN = 1;
119
+ /**
120
+ * 晋升候选判据:证据来源会话多样数下限(§9.1 跨会话维——2026-09-08 消化批;
121
+ * source_refs 溯源面纯派生零新账)。命名循冷读闸观察注:**证据来源**会话多样数,
122
+ * 非 cite 使用命中面——单会话重复命中多为同一任务重试,跨会话独立复现才是
123
+ * 可迁移策略(disjoint 泛化的个人化最小形态)。
124
+ */
125
+ export const MEMORY_PROMOTION_DISTINCT_SESSIONS_MIN = 2;
126
+ /** 简报差分纪元表容量帽(per-session epochs Map LRU——§6 差分纪律;被逐纪元下一请求懒派生) */
127
+ export const MEMORY_DIFF_EPOCHS_LRU = 256;
128
+ /** 回看缓存容量帽(per-session 最近 assistant 文本 Map LRU——§4 即时路第二动作;帽族同 §6 epochs 256) */
129
+ export const MEMORY_LAST_ASSISTANT_TEXT_LRU = 256;
130
+ /* ---------------- 持有面收口与导入导出(批 18c-8——06 §3 落码定形注) ---------------- */
131
+ /**
132
+ * 访问日志滚动窗口天数(06 §3 访问日志条「留存 = 滚动窗口(起草 90 天)」单源):
133
+ * 流水是可丢弃审计面——窗口清扫只删 memory_access 行,聚合列
134
+ * usage_count/last_used_at 不随清扫回退。
135
+ */
136
+ export const MEMORY_ACCESS_WINDOW_DAYS = 90;
137
+ /** 导出文件 magic 串(对外声明值位——品牌词例外律;持久互操作标识第一天定死) */
138
+ export const MEMORY_EXPORT_MAGIC = 'berry-agent-memory';
139
+ /** 导出格式版本(formatVersion 非 version——版本链语境下 version 会被读成数据版本) */
140
+ export const MEMORY_EXPORT_FORMAT_VERSION = 2;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * obs 域错误码注册(02 §5.3 OBS_ 族批 18b 明列两码;03 §10.8 错误码族条款;
3
+ * 2026-09-08 e-2 观测腿批扩 SESSION_OBSERVE_DENIED——module 段 obs,与
4
+ * SESSION_ 族操控四码〔module 段 conversation〕分域并存〔02 §5.3 跨功能域
5
+ * 共用前缀注〕)。
6
+ *
7
+ * 两码分层:OBS_DB_OPEN_FAILED 管开库/建链失败(fail-loud——派生库坏
8
+ * 不拖垮宿主:构造即抛、由装载面降级跳件);OBS_ROLLUP_CORRUPT 管查询
9
+ * 命中坏行(fail-loud 拒误读,同 PERSIST_DATA_CORRUPT 律——派生物宁弃
10
+ * 读不误读,重算即修复)。
11
+ * SESSION_OBSERVE_DENIED 管跨树观测门拒(03 §4.6 v1 首批第五枚
12
+ * sessions.observe-cross——CREDENTIALS_NAMESPACE_DENIED 同构门检拒码
13
+ * 先例;obs 会话维工具族 execute 内执法)。
14
+ * 本文件由模块公开面 index.ts 引入(注册纪律:import 发生才注册)。
15
+ */
16
+ import { registerErrorCodes } from '../contracts/index.js';
17
+ registerErrorCodes([
18
+ {
19
+ code: 'OBS_DB_OPEN_FAILED',
20
+ module: 'obs',
21
+ description: 'rollup 自管库开库/建链失败 fail-loud(03 §10.8——派生库坏不拖垮宿主:构造即抛、由装载面降级跳件;含 schema 版本高于本件的拒开档与 dispose 后再调用的拒用档)',
22
+ },
23
+ {
24
+ code: 'OBS_ROLLUP_CORRUPT',
25
+ module: 'obs',
26
+ description: '查询命中 rollup 坏行(计数/桶值非数或负数)——fail-loud 拒误读,同 PERSIST_DATA_CORRUPT 律(派生物重算即修复)',
27
+ },
28
+ {
29
+ code: 'SESSION_OBSERVE_DENIED',
30
+ module: 'obs',
31
+ description: '跨树观测未开门拒(03 §4.6 v1 首批第五枚 sessions.observe-cross 门检执法——obs 会话维工具族跨树目标/全会话枚举;树内 self/tree 两档零开门〔03 §10.8 可见性分轴——观测轴树内白给〕;CREDENTIALS_NAMESPACE_DENIED 同构先例)',
32
+ },
33
+ {
34
+ code: 'SESSION_OBSERVE_SCOPE_INVALID',
35
+ module: 'obs',
36
+ description: '活体订阅作用域坏形拒(04 §6 e-2——ctx.events.subscribeSessionLifecycle 的 scope self/tree 档缺 sessionId 锚、或 scope 非三值词面;fail-loud 拒不静默降档——静默升 all 档等价于绕门)',
37
+ },
38
+ ]);
package/dist/obs/db.js ADDED
@@ -0,0 +1,115 @@
1
+ /**
2
+ * obs — rollup 自管库 DDL 与开库(03 §10.8 rollup 表族条款)。
3
+ *
4
+ * 库文件 = `<dataDir>/data/obs/rollup.db`(路径由装配面算好传入——本件
5
+ * 不解析数据目录梯子)。开库经 persist 公开面 openAuxDatabase(物理卫生
6
+ * 三拍单源);schema 主权归本件:PRAGMA user_version 自管(本库文件私有
7
+ * ——与主库 user_version 门禁物理分立不串档)。
8
+ *
9
+ * 版本编舞:0(全新/空)→ 单事务建全表 + 落 v1;1 → 直通;>1 → 拒开
10
+ * (OBS_DB_OPEN_FAILED——旧程序开新库宁拒不误读,openStore 的
11
+ * PERSIST_SCHEMA_TOO_NEW 同律)。
12
+ */
13
+ import { BaseError } from '../contracts/index.js';
14
+ import { openAuxDatabase } from '../persist/index.js';
15
+ /** rollup schema 版本(本件唯一版本位——自管,随表族演进递增) */
16
+ export const OBS_SCHEMA_VERSION = 1;
17
+ /**
18
+ * rollup 表族 DDL(两粒度三表一视图一元表;桶列恒 UTC 整点/整日对齐的
19
+ * epoch ms——存储客观、时区换算归呈现层)。
20
+ *
21
+ * - events_hour/events_day:全 durable 事件类型按桶计数(PRIMARY KEY
22
+ * (bucket, event_type)——脏桶重算 DELETE+INSERT 的替换单元);
23
+ * - usage_hour/usage_day:llm/usage 计量聚合(token 原始值;四桶必列 +
24
+ * 两可选列缺省 0——行级非空,坏行的拒读判据在查询面);
25
+ * - deprecation_rollup_hour 视图:plugin/deprecation-used 单型投影
26
+ * (03 §2 命名兑现零第二张表);
27
+ * - obs_meta:水位与告警冷却键值位。
28
+ */
29
+ const CANONICAL_DDL = `
30
+ CREATE TABLE events_hour (
31
+ bucket INTEGER NOT NULL,
32
+ event_type TEXT NOT NULL,
33
+ count INTEGER NOT NULL,
34
+ PRIMARY KEY (bucket, event_type)
35
+ );
36
+ CREATE TABLE usage_hour (
37
+ bucket INTEGER NOT NULL,
38
+ calls INTEGER NOT NULL,
39
+ input INTEGER NOT NULL,
40
+ output INTEGER NOT NULL,
41
+ cache_read INTEGER NOT NULL,
42
+ cache_write INTEGER NOT NULL,
43
+ cache_write_1h INTEGER NOT NULL DEFAULT 0,
44
+ reasoning INTEGER NOT NULL DEFAULT 0,
45
+ PRIMARY KEY (bucket)
46
+ );
47
+ CREATE TABLE events_day (
48
+ bucket INTEGER NOT NULL,
49
+ event_type TEXT NOT NULL,
50
+ count INTEGER NOT NULL,
51
+ PRIMARY KEY (bucket, event_type)
52
+ );
53
+ CREATE TABLE usage_day (
54
+ bucket INTEGER NOT NULL,
55
+ calls INTEGER NOT NULL,
56
+ input INTEGER NOT NULL,
57
+ output INTEGER NOT NULL,
58
+ cache_read INTEGER NOT NULL,
59
+ cache_write INTEGER NOT NULL,
60
+ cache_write_1h INTEGER NOT NULL DEFAULT 0,
61
+ reasoning INTEGER NOT NULL DEFAULT 0,
62
+ PRIMARY KEY (bucket)
63
+ );
64
+ CREATE VIEW deprecation_rollup_hour AS
65
+ SELECT bucket, count FROM events_hour WHERE event_type = 'plugin/deprecation-used';
66
+ CREATE TABLE obs_meta (
67
+ key TEXT PRIMARY KEY,
68
+ value TEXT NOT NULL
69
+ );
70
+ `;
71
+ /**
72
+ * 打开 rollup 库(开库 + 版本编舞;失败抛 OBS_DB_OPEN_FAILED——装载面
73
+ * 降级跳件)。
74
+ * @param dbPath 库文件路径(':memory:' 支持——测试位)
75
+ * @param warn 告警面(透传 openAuxDatabase——权限修复/WAL 降级)
76
+ */
77
+ export function openRollupDatabase(dbPath, warn = (message) => console.error(message)) {
78
+ let db;
79
+ try {
80
+ db = openAuxDatabase(dbPath, { warn });
81
+ }
82
+ catch (err) {
83
+ // 开库/建链失败 fail-loud(03 §10.8——不拖垮宿主由装载面消费本码降级)
84
+ throw new BaseError('OBS_DB_OPEN_FAILED', `rollup 库开库失败(${dbPath}):${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? { cause: err } : undefined);
85
+ }
86
+ const row = db.pragma('user_version', { simple: true });
87
+ const version = typeof row === 'number' ? row : 0;
88
+ try {
89
+ if (version > OBS_SCHEMA_VERSION) {
90
+ db.close();
91
+ throw new BaseError('OBS_DB_OPEN_FAILED', `rollup 库 ${dbPath} 的 user_version=${version} 高于本件 head=${OBS_SCHEMA_VERSION}(旧程序开新库拒开——宁拒不误读)`);
92
+ }
93
+ if (version === 0) {
94
+ // 全新库单事务建链(原子性——openStore 冷启动同律)
95
+ const bootstrap = db.transaction(() => {
96
+ db.exec(CANONICAL_DDL);
97
+ db.pragma(`user_version = ${OBS_SCHEMA_VERSION}`);
98
+ });
99
+ bootstrap();
100
+ }
101
+ }
102
+ catch (err) {
103
+ // 建链中途失败:关库再抛 OBS 码(不留半开句柄)
104
+ try {
105
+ db.close();
106
+ }
107
+ catch {
108
+ /* close 自身失败不掩原错误 */
109
+ }
110
+ if (err instanceof BaseError)
111
+ throw err;
112
+ throw new BaseError('OBS_DB_OPEN_FAILED', `rollup 库建链失败(${dbPath}):${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? { cause: err } : undefined);
113
+ }
114
+ return db;
115
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * obs 模块公开面(L4 观测面——02 §4.1 席 #24;机制真源 03 §10.8)。
3
+ *
4
+ * 本批落码(批 18b):rollup 自管库(经 persist aux 面开库——主库零
5
+ * schema 残迹、可禁用 = 文件不在场)+ 两粒度三表一视图 + 水位−1h 重叠窗
6
+ * 幂等摄取 + 闭日物化 + 告警「只通知不执法」(hasAudience 前置不耗冷却)
7
+ * + obs_query 只读工具。装载态集成(mount config alerts 注入 / 事件面
8
+ * 直传 Store / notify·audience 接 ctx.ui / 工具注册)归批 12 装配面。
9
+ *
10
+ * e-2 观测腿(2026-09-08——03 §10.8 会话维扩展):SessionView 会话维视图
11
+ * (尾条推导粗状态 + parent_id 链树判定 + list/read/trace/status 四数据
12
+ * 面——纯派生读零自管库);会话维工具族与 host 接线随 e2-2/e2-4 笔。
13
+ */
14
+ import './codes.js';
15
+ export { createObsService } from './service.js';
16
+ export { createObsQueryTool } from './tool.js';
17
+ export { createSessionView } from './session-view.js';
18
+ export { createSessionTools, OBSERVE_CROSS_CAPABILITY } from './session-tools.js';
19
+ export { OBS_SCHEMA_VERSION } from './db.js';
20
+ export { aggregateHours, hourBucketMs, dayBucketMs, bucketClosed, HOUR_MS, DAY_MS } from './rollup.js';
@@ -0,0 +1,61 @@
1
+ /** 小时毫秒 */
2
+ export const HOUR_MS = 3_600_000;
3
+ /** 日毫秒 */
4
+ export const DAY_MS = 86_400_000;
5
+ /** 取事件时刻所在 UTC 小时桶起点 */
6
+ export function hourBucketMs(timeMs) {
7
+ return Math.floor(timeMs / HOUR_MS) * HOUR_MS;
8
+ }
9
+ /** 取事件时刻所在 UTC 日桶起点 */
10
+ export function dayBucketMs(timeMs) {
11
+ return Math.floor(timeMs / DAY_MS) * DAY_MS;
12
+ }
13
+ /** 桶是否已闭合(桶终点 <= now——日物化只做闭日) */
14
+ export function bucketClosed(bucketMs, nowMs, spanMs) {
15
+ return bucketMs + spanMs <= nowMs;
16
+ }
17
+ /** llm/usage 事件载荷 usage 桶字段(宽收防御——坏形按缺席折 0 不误读) */
18
+ function usageNumber(value) {
19
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : 0;
20
+ }
21
+ /**
22
+ * 单遍聚合事件流 → 小时桶计数 + llm/usage 用量累计(全 durable 事件类型
23
+ * 入计数;用量只认 llm/usage 型)。扫描窗按小时边界对齐时本函数产物即
24
+ * 各桶的完整真值——脏桶 DELETE+INSERT 整体替换即幂等自愈。
25
+ */
26
+ export function aggregateHours(events) {
27
+ const counts = new Map();
28
+ const usage = new Map();
29
+ const touchedBuckets = new Set();
30
+ for (const event of events) {
31
+ const bucket = hourBucketMs(event.time);
32
+ touchedBuckets.add(bucket);
33
+ // 计数面:全类型(事件类型缺字坏行按 '(unknown)' 归一——计数不丢行)
34
+ const eventType = typeof event.type === 'string' && event.type !== '' ? event.type : '(unknown)';
35
+ let byType = counts.get(bucket);
36
+ if (!byType) {
37
+ byType = new Map();
38
+ counts.set(bucket, byType);
39
+ }
40
+ byType.set(eventType, (byType.get(eventType) ?? 0) + 1);
41
+ // 用量面:只认 llm/usage(05 §1.1 载荷形——usage 四桶必落、两可选上报才落)
42
+ if (eventType === 'llm/usage') {
43
+ const data = event.data;
44
+ const buckets = data && typeof data === 'object' ? data.usage : undefined;
45
+ const raw = buckets && typeof buckets === 'object' ? buckets : {};
46
+ let agg = usage.get(bucket);
47
+ if (!agg) {
48
+ agg = { calls: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cacheWrite1h: 0, reasoning: 0 };
49
+ usage.set(bucket, agg);
50
+ }
51
+ agg.calls += 1;
52
+ agg.input += usageNumber(raw.input);
53
+ agg.output += usageNumber(raw.output);
54
+ agg.cacheRead += usageNumber(raw.cacheRead);
55
+ agg.cacheWrite += usageNumber(raw.cacheWrite);
56
+ agg.cacheWrite1h += usageNumber(raw.cacheWrite1h);
57
+ agg.reasoning += usageNumber(raw.reasoning);
58
+ }
59
+ }
60
+ return { counts, usage, touchedBuckets };
61
+ }