@sema-ai/core 1.275.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 (962) hide show
  1. package/CHANGELOG.md +5433 -0
  2. package/LICENSE +27 -0
  3. package/NOTICE.md +30 -0
  4. package/README.md +1040 -0
  5. package/dist/agents/agent-definition.d.ts +10 -0
  6. package/dist/agents/agent-definition.d.ts.map +1 -0
  7. package/dist/agents/agent-definition.js +18 -0
  8. package/dist/agents/agent-definition.js.map +1 -0
  9. package/dist/agents/builtin-agents.d.ts +69 -0
  10. package/dist/agents/builtin-agents.d.ts.map +1 -0
  11. package/dist/agents/builtin-agents.js +177 -0
  12. package/dist/agents/builtin-agents.js.map +1 -0
  13. package/dist/agents/cascade.d.ts +101 -0
  14. package/dist/agents/cascade.d.ts.map +1 -0
  15. package/dist/agents/cascade.js +189 -0
  16. package/dist/agents/cascade.js.map +1 -0
  17. package/dist/agents/observer.d.ts +209 -0
  18. package/dist/agents/observer.d.ts.map +1 -0
  19. package/dist/agents/observer.js +495 -0
  20. package/dist/agents/observer.js.map +1 -0
  21. package/dist/agents/repair-loop.d.ts +236 -0
  22. package/dist/agents/repair-loop.d.ts.map +1 -0
  23. package/dist/agents/repair-loop.js +293 -0
  24. package/dist/agents/repair-loop.js.map +1 -0
  25. package/dist/agents/session-util.d.ts +8 -0
  26. package/dist/agents/session-util.d.ts.map +1 -0
  27. package/dist/agents/session-util.js +9 -0
  28. package/dist/agents/session-util.js.map +1 -0
  29. package/dist/agents/subagent-steps.d.ts +93 -0
  30. package/dist/agents/subagent-steps.d.ts.map +1 -0
  31. package/dist/agents/subagent-steps.js +206 -0
  32. package/dist/agents/subagent-steps.js.map +1 -0
  33. package/dist/agents/subagent.d.ts +441 -0
  34. package/dist/agents/subagent.d.ts.map +1 -0
  35. package/dist/agents/subagent.js +2492 -0
  36. package/dist/agents/subagent.js.map +1 -0
  37. package/dist/agents/suspend-guard.d.ts +35 -0
  38. package/dist/agents/suspend-guard.d.ts.map +1 -0
  39. package/dist/agents/suspend-guard.js +48 -0
  40. package/dist/agents/suspend-guard.js.map +1 -0
  41. package/dist/agents/teacher.d.ts +137 -0
  42. package/dist/agents/teacher.d.ts.map +1 -0
  43. package/dist/agents/teacher.js +575 -0
  44. package/dist/agents/teacher.js.map +1 -0
  45. package/dist/agents/team.d.ts +211 -0
  46. package/dist/agents/team.d.ts.map +1 -0
  47. package/dist/agents/team.js +293 -0
  48. package/dist/agents/team.js.map +1 -0
  49. package/dist/agents/tool-filter.d.ts +29 -0
  50. package/dist/agents/tool-filter.d.ts.map +1 -0
  51. package/dist/agents/tool-filter.js +50 -0
  52. package/dist/agents/tool-filter.js.map +1 -0
  53. package/dist/agents/verify.d.ts +177 -0
  54. package/dist/agents/verify.d.ts.map +1 -0
  55. package/dist/agents/verify.js +305 -0
  56. package/dist/agents/verify.js.map +1 -0
  57. package/dist/bench/metrics.d.ts +714 -0
  58. package/dist/bench/metrics.d.ts.map +1 -0
  59. package/dist/bench/metrics.js +618 -0
  60. package/dist/bench/metrics.js.map +1 -0
  61. package/dist/bin/sema-tb.d.ts +3 -0
  62. package/dist/bin/sema-tb.d.ts.map +1 -0
  63. package/dist/bin/sema-tb.js +516 -0
  64. package/dist/bin/sema-tb.js.map +1 -0
  65. package/dist/bin/tb-env.d.ts +13 -0
  66. package/dist/bin/tb-env.d.ts.map +1 -0
  67. package/dist/bin/tb-env.js +26 -0
  68. package/dist/bin/tb-env.js.map +1 -0
  69. package/dist/brain/anthropic.d.ts +46 -0
  70. package/dist/brain/anthropic.d.ts.map +1 -0
  71. package/dist/brain/anthropic.js +830 -0
  72. package/dist/brain/anthropic.js.map +1 -0
  73. package/dist/brain/circuit-breaker.d.ts +46 -0
  74. package/dist/brain/circuit-breaker.d.ts.map +1 -0
  75. package/dist/brain/circuit-breaker.js +173 -0
  76. package/dist/brain/circuit-breaker.js.map +1 -0
  77. package/dist/brain/degrading.d.ts +98 -0
  78. package/dist/brain/degrading.d.ts.map +1 -0
  79. package/dist/brain/degrading.js +249 -0
  80. package/dist/brain/degrading.js.map +1 -0
  81. package/dist/brain/errors.d.ts +31 -0
  82. package/dist/brain/errors.d.ts.map +1 -0
  83. package/dist/brain/errors.js +58 -0
  84. package/dist/brain/errors.js.map +1 -0
  85. package/dist/brain/failover.d.ts +18 -0
  86. package/dist/brain/failover.d.ts.map +1 -0
  87. package/dist/brain/failover.js +118 -0
  88. package/dist/brain/failover.js.map +1 -0
  89. package/dist/brain/model-presets.d.ts +36 -0
  90. package/dist/brain/model-presets.d.ts.map +1 -0
  91. package/dist/brain/model-presets.js +54 -0
  92. package/dist/brain/model-presets.js.map +1 -0
  93. package/dist/brain/openai.d.ts +43 -0
  94. package/dist/brain/openai.d.ts.map +1 -0
  95. package/dist/brain/openai.js +784 -0
  96. package/dist/brain/openai.js.map +1 -0
  97. package/dist/brain/reasoning.d.ts +138 -0
  98. package/dist/brain/reasoning.d.ts.map +1 -0
  99. package/dist/brain/reasoning.js +146 -0
  100. package/dist/brain/reasoning.js.map +1 -0
  101. package/dist/brain/repetition.d.ts +60 -0
  102. package/dist/brain/repetition.d.ts.map +1 -0
  103. package/dist/brain/repetition.js +121 -0
  104. package/dist/brain/repetition.js.map +1 -0
  105. package/dist/brain/request-params.d.ts +29 -0
  106. package/dist/brain/request-params.d.ts.map +1 -0
  107. package/dist/brain/request-params.js +78 -0
  108. package/dist/brain/request-params.js.map +1 -0
  109. package/dist/brain/retry.d.ts +18 -0
  110. package/dist/brain/retry.d.ts.map +1 -0
  111. package/dist/brain/retry.js +42 -0
  112. package/dist/brain/retry.js.map +1 -0
  113. package/dist/brain/routing.d.ts +19 -0
  114. package/dist/brain/routing.d.ts.map +1 -0
  115. package/dist/brain/routing.js +44 -0
  116. package/dist/brain/routing.js.map +1 -0
  117. package/dist/brain/status-sink.d.ts +46 -0
  118. package/dist/brain/status-sink.d.ts.map +1 -0
  119. package/dist/brain/status-sink.js +36 -0
  120. package/dist/brain/status-sink.js.map +1 -0
  121. package/dist/brain/stream-engine.d.ts +85 -0
  122. package/dist/brain/stream-engine.d.ts.map +1 -0
  123. package/dist/brain/stream-engine.js +391 -0
  124. package/dist/brain/stream-engine.js.map +1 -0
  125. package/dist/brain/timeout.d.ts +44 -0
  126. package/dist/brain/timeout.d.ts.map +1 -0
  127. package/dist/brain/timeout.js +41 -0
  128. package/dist/brain/timeout.js.map +1 -0
  129. package/dist/brain/tool-call-repair.d.ts +15 -0
  130. package/dist/brain/tool-call-repair.d.ts.map +1 -0
  131. package/dist/brain/tool-call-repair.js +67 -0
  132. package/dist/brain/tool-call-repair.js.map +1 -0
  133. package/dist/brain/walltime.d.ts +14 -0
  134. package/dist/brain/walltime.d.ts.map +1 -0
  135. package/dist/brain/walltime.js +14 -0
  136. package/dist/brain/walltime.js.map +1 -0
  137. package/dist/core/arg-summary.d.ts +19 -0
  138. package/dist/core/arg-summary.d.ts.map +1 -0
  139. package/dist/core/arg-summary.js +96 -0
  140. package/dist/core/arg-summary.js.map +1 -0
  141. package/dist/core/ask-question.d.ts +113 -0
  142. package/dist/core/ask-question.d.ts.map +1 -0
  143. package/dist/core/ask-question.js +246 -0
  144. package/dist/core/ask-question.js.map +1 -0
  145. package/dist/core/auto-compaction.d.ts +341 -0
  146. package/dist/core/auto-compaction.d.ts.map +1 -0
  147. package/dist/core/auto-compaction.js +495 -0
  148. package/dist/core/auto-compaction.js.map +1 -0
  149. package/dist/core/auto-promote.d.ts +126 -0
  150. package/dist/core/auto-promote.d.ts.map +1 -0
  151. package/dist/core/auto-promote.js +171 -0
  152. package/dist/core/auto-promote.js.map +1 -0
  153. package/dist/core/background-shell.d.ts +128 -0
  154. package/dist/core/background-shell.d.ts.map +1 -0
  155. package/dist/core/background-shell.js +42 -0
  156. package/dist/core/background-shell.js.map +1 -0
  157. package/dist/core/cache-break-detector.d.ts +63 -0
  158. package/dist/core/cache-break-detector.d.ts.map +1 -0
  159. package/dist/core/cache-break-detector.js +0 -0
  160. package/dist/core/cache-break-detector.js.map +1 -0
  161. package/dist/core/canonical-json.d.ts +45 -0
  162. package/dist/core/canonical-json.d.ts.map +1 -0
  163. package/dist/core/canonical-json.js +132 -0
  164. package/dist/core/canonical-json.js.map +1 -0
  165. package/dist/core/checkpoint-store.d.ts +1101 -0
  166. package/dist/core/checkpoint-store.d.ts.map +1 -0
  167. package/dist/core/checkpoint-store.js +514 -0
  168. package/dist/core/checkpoint-store.js.map +1 -0
  169. package/dist/core/consolidate-scope.d.ts +94 -0
  170. package/dist/core/consolidate-scope.d.ts.map +1 -0
  171. package/dist/core/consolidate-scope.js +158 -0
  172. package/dist/core/consolidate-scope.js.map +1 -0
  173. package/dist/core/context-edit.d.ts +82 -0
  174. package/dist/core/context-edit.d.ts.map +1 -0
  175. package/dist/core/context-edit.js +149 -0
  176. package/dist/core/context-edit.js.map +1 -0
  177. package/dist/core/context-guard.d.ts +43 -0
  178. package/dist/core/context-guard.d.ts.map +1 -0
  179. package/dist/core/context-guard.js +171 -0
  180. package/dist/core/context-guard.js.map +1 -0
  181. package/dist/core/dynamic-recall.d.ts +100 -0
  182. package/dist/core/dynamic-recall.d.ts.map +1 -0
  183. package/dist/core/dynamic-recall.js +108 -0
  184. package/dist/core/dynamic-recall.js.map +1 -0
  185. package/dist/core/exec-gate.d.ts +74 -0
  186. package/dist/core/exec-gate.d.ts.map +1 -0
  187. package/dist/core/exec-gate.js +143 -0
  188. package/dist/core/exec-gate.js.map +1 -0
  189. package/dist/core/exec-output-tail.d.ts +37 -0
  190. package/dist/core/exec-output-tail.d.ts.map +1 -0
  191. package/dist/core/exec-output-tail.js +63 -0
  192. package/dist/core/exec-output-tail.js.map +1 -0
  193. package/dist/core/file-snapshot-store.d.ts +137 -0
  194. package/dist/core/file-snapshot-store.d.ts.map +1 -0
  195. package/dist/core/file-snapshot-store.js +319 -0
  196. package/dist/core/file-snapshot-store.js.map +1 -0
  197. package/dist/core/git-worktree-env.d.ts +41 -0
  198. package/dist/core/git-worktree-env.d.ts.map +1 -0
  199. package/dist/core/git-worktree-env.js +64 -0
  200. package/dist/core/git-worktree-env.js.map +1 -0
  201. package/dist/core/hooks.d.ts +372 -0
  202. package/dist/core/hooks.d.ts.map +1 -0
  203. package/dist/core/hooks.js +269 -0
  204. package/dist/core/hooks.js.map +1 -0
  205. package/dist/core/lsp-diagnostics.d.ts +74 -0
  206. package/dist/core/lsp-diagnostics.d.ts.map +1 -0
  207. package/dist/core/lsp-diagnostics.js +125 -0
  208. package/dist/core/lsp-diagnostics.js.map +1 -0
  209. package/dist/core/lsp-protocol.d.ts +28 -0
  210. package/dist/core/lsp-protocol.d.ts.map +1 -0
  211. package/dist/core/lsp-protocol.js +179 -0
  212. package/dist/core/lsp-protocol.js.map +1 -0
  213. package/dist/core/lsp-session.d.ts +56 -0
  214. package/dist/core/lsp-session.d.ts.map +1 -0
  215. package/dist/core/lsp-session.js +185 -0
  216. package/dist/core/lsp-session.js.map +1 -0
  217. package/dist/core/lsp.d.ts +132 -0
  218. package/dist/core/lsp.d.ts.map +1 -0
  219. package/dist/core/lsp.js +147 -0
  220. package/dist/core/lsp.js.map +1 -0
  221. package/dist/core/mcp.d.ts +294 -0
  222. package/dist/core/mcp.d.ts.map +1 -0
  223. package/dist/core/mcp.js +992 -0
  224. package/dist/core/mcp.js.map +1 -0
  225. package/dist/core/media-byte-cap.d.ts +34 -0
  226. package/dist/core/media-byte-cap.d.ts.map +1 -0
  227. package/dist/core/media-byte-cap.js +76 -0
  228. package/dist/core/media-byte-cap.js.map +1 -0
  229. package/dist/core/memory-engine/data-plane.d.ts +103 -0
  230. package/dist/core/memory-engine/data-plane.d.ts.map +1 -0
  231. package/dist/core/memory-engine/data-plane.js +272 -0
  232. package/dist/core/memory-engine/data-plane.js.map +1 -0
  233. package/dist/core/memory-engine/dual-root.d.ts +40 -0
  234. package/dist/core/memory-engine/dual-root.d.ts.map +1 -0
  235. package/dist/core/memory-engine/dual-root.js +95 -0
  236. package/dist/core/memory-engine/dual-root.js.map +1 -0
  237. package/dist/core/memory-engine/engine.d.ts +161 -0
  238. package/dist/core/memory-engine/engine.d.ts.map +1 -0
  239. package/dist/core/memory-engine/engine.js +1110 -0
  240. package/dist/core/memory-engine/engine.js.map +1 -0
  241. package/dist/core/memory-engine/file-backend.d.ts +162 -0
  242. package/dist/core/memory-engine/file-backend.d.ts.map +1 -0
  243. package/dist/core/memory-engine/file-backend.js +948 -0
  244. package/dist/core/memory-engine/file-backend.js.map +1 -0
  245. package/dist/core/memory-engine/frontmatter.d.ts +24 -0
  246. package/dist/core/memory-engine/frontmatter.d.ts.map +1 -0
  247. package/dist/core/memory-engine/frontmatter.js +135 -0
  248. package/dist/core/memory-engine/frontmatter.js.map +1 -0
  249. package/dist/core/memory-engine/index.d.ts +13 -0
  250. package/dist/core/memory-engine/index.d.ts.map +1 -0
  251. package/dist/core/memory-engine/index.js +28 -0
  252. package/dist/core/memory-engine/index.js.map +1 -0
  253. package/dist/core/memory-engine/layout.d.ts +123 -0
  254. package/dist/core/memory-engine/layout.d.ts.map +1 -0
  255. package/dist/core/memory-engine/layout.js +643 -0
  256. package/dist/core/memory-engine/layout.js.map +1 -0
  257. package/dist/core/memory-engine/memory-backend-contract.d.ts +22 -0
  258. package/dist/core/memory-engine/memory-backend-contract.d.ts.map +1 -0
  259. package/dist/core/memory-engine/memory-backend-contract.js +271 -0
  260. package/dist/core/memory-engine/memory-backend-contract.js.map +1 -0
  261. package/dist/core/memory-engine/migrate.d.ts +17 -0
  262. package/dist/core/memory-engine/migrate.d.ts.map +1 -0
  263. package/dist/core/memory-engine/migrate.js +35 -0
  264. package/dist/core/memory-engine/migrate.js.map +1 -0
  265. package/dist/core/memory-engine/scan.d.ts +20 -0
  266. package/dist/core/memory-engine/scan.d.ts.map +1 -0
  267. package/dist/core/memory-engine/scan.js +84 -0
  268. package/dist/core/memory-engine/scan.js.map +1 -0
  269. package/dist/core/memory-engine/scope-contract.d.ts +104 -0
  270. package/dist/core/memory-engine/scope-contract.d.ts.map +1 -0
  271. package/dist/core/memory-engine/scope-contract.js +288 -0
  272. package/dist/core/memory-engine/scope-contract.js.map +1 -0
  273. package/dist/core/memory-engine/sync-client.d.ts +100 -0
  274. package/dist/core/memory-engine/sync-client.d.ts.map +1 -0
  275. package/dist/core/memory-engine/sync-client.js +328 -0
  276. package/dist/core/memory-engine/sync-client.js.map +1 -0
  277. package/dist/core/memory-engine/sync.d.ts +97 -0
  278. package/dist/core/memory-engine/sync.d.ts.map +1 -0
  279. package/dist/core/memory-engine/sync.js +91 -0
  280. package/dist/core/memory-engine/sync.js.map +1 -0
  281. package/dist/core/memory-engine/types.d.ts +279 -0
  282. package/dist/core/memory-engine/types.d.ts.map +1 -0
  283. package/dist/core/memory-engine/types.js +9 -0
  284. package/dist/core/memory-engine/types.js.map +1 -0
  285. package/dist/core/memory-recall.d.ts +261 -0
  286. package/dist/core/memory-recall.d.ts.map +1 -0
  287. package/dist/core/memory-recall.js +600 -0
  288. package/dist/core/memory-recall.js.map +1 -0
  289. package/dist/core/memory-vector.d.ts +24 -0
  290. package/dist/core/memory-vector.d.ts.map +1 -0
  291. package/dist/core/memory-vector.js +51 -0
  292. package/dist/core/memory-vector.js.map +1 -0
  293. package/dist/core/memory.d.ts +502 -0
  294. package/dist/core/memory.d.ts.map +1 -0
  295. package/dist/core/memory.js +881 -0
  296. package/dist/core/memory.js.map +1 -0
  297. package/dist/core/message-utils.d.ts +7 -0
  298. package/dist/core/message-utils.d.ts.map +1 -0
  299. package/dist/core/message-utils.js +10 -0
  300. package/dist/core/message-utils.js.map +1 -0
  301. package/dist/core/oracle-isolation.d.ts +85 -0
  302. package/dist/core/oracle-isolation.d.ts.map +1 -0
  303. package/dist/core/oracle-isolation.js +121 -0
  304. package/dist/core/oracle-isolation.js.map +1 -0
  305. package/dist/core/permission-rules.d.ts +102 -0
  306. package/dist/core/permission-rules.d.ts.map +1 -0
  307. package/dist/core/permission-rules.js +357 -0
  308. package/dist/core/permission-rules.js.map +1 -0
  309. package/dist/core/present-plan-tool.d.ts +28 -0
  310. package/dist/core/present-plan-tool.d.ts.map +1 -0
  311. package/dist/core/present-plan-tool.js +119 -0
  312. package/dist/core/present-plan-tool.js.map +1 -0
  313. package/dist/core/pricing.d.ts +48 -0
  314. package/dist/core/pricing.d.ts.map +1 -0
  315. package/dist/core/pricing.js +46 -0
  316. package/dist/core/pricing.js.map +1 -0
  317. package/dist/core/property-harness.d.ts +126 -0
  318. package/dist/core/property-harness.d.ts.map +1 -0
  319. package/dist/core/property-harness.js +192 -0
  320. package/dist/core/property-harness.js.map +1 -0
  321. package/dist/core/push-queue.d.ts +10 -0
  322. package/dist/core/push-queue.d.ts.map +1 -0
  323. package/dist/core/push-queue.js +42 -0
  324. package/dist/core/push-queue.js.map +1 -0
  325. package/dist/core/remote-env.d.ts +432 -0
  326. package/dist/core/remote-env.d.ts.map +1 -0
  327. package/dist/core/remote-env.js +77 -0
  328. package/dist/core/remote-env.js.map +1 -0
  329. package/dist/core/roles.d.ts +74 -0
  330. package/dist/core/roles.d.ts.map +1 -0
  331. package/dist/core/roles.js +272 -0
  332. package/dist/core/roles.js.map +1 -0
  333. package/dist/core/runner/active-skill-scope.d.ts +64 -0
  334. package/dist/core/runner/active-skill-scope.d.ts.map +1 -0
  335. package/dist/core/runner/active-skill-scope.js +197 -0
  336. package/dist/core/runner/active-skill-scope.js.map +1 -0
  337. package/dist/core/runner/assemble-result.d.ts +191 -0
  338. package/dist/core/runner/assemble-result.d.ts.map +1 -0
  339. package/dist/core/runner/assemble-result.js +250 -0
  340. package/dist/core/runner/assemble-result.js.map +1 -0
  341. package/dist/core/runner/call-cap.d.ts +130 -0
  342. package/dist/core/runner/call-cap.d.ts.map +1 -0
  343. package/dist/core/runner/call-cap.js +151 -0
  344. package/dist/core/runner/call-cap.js.map +1 -0
  345. package/dist/core/runner/grounding-signal.d.ts +12 -0
  346. package/dist/core/runner/grounding-signal.d.ts.map +1 -0
  347. package/dist/core/runner/grounding-signal.js +94 -0
  348. package/dist/core/runner/grounding-signal.js.map +1 -0
  349. package/dist/core/runner/image.d.ts +23 -0
  350. package/dist/core/runner/image.d.ts.map +1 -0
  351. package/dist/core/runner/image.js +151 -0
  352. package/dist/core/runner/image.js.map +1 -0
  353. package/dist/core/runner/memory-consolidation.d.ts +112 -0
  354. package/dist/core/runner/memory-consolidation.d.ts.map +1 -0
  355. package/dist/core/runner/memory-consolidation.js +372 -0
  356. package/dist/core/runner/memory-consolidation.js.map +1 -0
  357. package/dist/core/runner/prepare-task.d.ts +583 -0
  358. package/dist/core/runner/prepare-task.d.ts.map +1 -0
  359. package/dist/core/runner/prepare-task.js +3612 -0
  360. package/dist/core/runner/prepare-task.js.map +1 -0
  361. package/dist/core/runner/prompt-suggestions.d.ts +33 -0
  362. package/dist/core/runner/prompt-suggestions.d.ts.map +1 -0
  363. package/dist/core/runner/prompt-suggestions.js +116 -0
  364. package/dist/core/runner/prompt-suggestions.js.map +1 -0
  365. package/dist/core/runner/runtask.d.ts +274 -0
  366. package/dist/core/runner/runtask.d.ts.map +1 -0
  367. package/dist/core/runner/runtask.js +4606 -0
  368. package/dist/core/runner/runtask.js.map +1 -0
  369. package/dist/core/runner/session-rule-policy.d.ts +28 -0
  370. package/dist/core/runner/session-rule-policy.d.ts.map +1 -0
  371. package/dist/core/runner/session-rule-policy.js +110 -0
  372. package/dist/core/runner/session-rule-policy.js.map +1 -0
  373. package/dist/core/runner/strict-output-schema.d.ts +36 -0
  374. package/dist/core/runner/strict-output-schema.d.ts.map +1 -0
  375. package/dist/core/runner/strict-output-schema.js +365 -0
  376. package/dist/core/runner/strict-output-schema.js.map +1 -0
  377. package/dist/core/runner/synthetic-tools.d.ts +72 -0
  378. package/dist/core/runner/synthetic-tools.d.ts.map +1 -0
  379. package/dist/core/runner/synthetic-tools.js +203 -0
  380. package/dist/core/runner/synthetic-tools.js.map +1 -0
  381. package/dist/core/runner/tool-disclosure.d.ts +117 -0
  382. package/dist/core/runner/tool-disclosure.d.ts.map +1 -0
  383. package/dist/core/runner/tool-disclosure.js +0 -0
  384. package/dist/core/runner/tool-disclosure.js.map +1 -0
  385. package/dist/core/runner/turn-attachments.d.ts +381 -0
  386. package/dist/core/runner/turn-attachments.d.ts.map +1 -0
  387. package/dist/core/runner/turn-attachments.js +596 -0
  388. package/dist/core/runner/turn-attachments.js.map +1 -0
  389. package/dist/core/runner/usage-accounting.d.ts +35 -0
  390. package/dist/core/runner/usage-accounting.d.ts.map +1 -0
  391. package/dist/core/runner/usage-accounting.js +45 -0
  392. package/dist/core/runner/usage-accounting.js.map +1 -0
  393. package/dist/core/runtime.d.ts +9 -0
  394. package/dist/core/runtime.d.ts.map +1 -0
  395. package/dist/core/runtime.js +17 -0
  396. package/dist/core/runtime.js.map +1 -0
  397. package/dist/core/safety-axis-vocab.d.ts +33 -0
  398. package/dist/core/safety-axis-vocab.d.ts.map +1 -0
  399. package/dist/core/safety-axis-vocab.js +35 -0
  400. package/dist/core/safety-axis-vocab.js.map +1 -0
  401. package/dist/core/safety-merge-corpus.d.ts +48 -0
  402. package/dist/core/safety-merge-corpus.d.ts.map +1 -0
  403. package/dist/core/safety-merge-corpus.js +203 -0
  404. package/dist/core/safety-merge-corpus.js.map +1 -0
  405. package/dist/core/scheduler.d.ts +126 -0
  406. package/dist/core/scheduler.d.ts.map +1 -0
  407. package/dist/core/scheduler.js +54 -0
  408. package/dist/core/scheduler.js.map +1 -0
  409. package/dist/core/secret-env.d.ts +23 -0
  410. package/dist/core/secret-env.d.ts.map +1 -0
  411. package/dist/core/secret-env.js +35 -0
  412. package/dist/core/secret-env.js.map +1 -0
  413. package/dist/core/select-model.d.ts +26 -0
  414. package/dist/core/select-model.d.ts.map +1 -0
  415. package/dist/core/select-model.js +58 -0
  416. package/dist/core/select-model.js.map +1 -0
  417. package/dist/core/sensitive-path-policy.d.ts +24 -0
  418. package/dist/core/sensitive-path-policy.d.ts.map +1 -0
  419. package/dist/core/sensitive-path-policy.js +96 -0
  420. package/dist/core/sensitive-path-policy.js.map +1 -0
  421. package/dist/core/session-policy-store.d.ts +102 -0
  422. package/dist/core/session-policy-store.d.ts.map +1 -0
  423. package/dist/core/session-policy-store.js +177 -0
  424. package/dist/core/session-policy-store.js.map +1 -0
  425. package/dist/core/session-reconcile.d.ts +63 -0
  426. package/dist/core/session-reconcile.d.ts.map +1 -0
  427. package/dist/core/session-reconcile.js +71 -0
  428. package/dist/core/session-reconcile.js.map +1 -0
  429. package/dist/core/session-store.d.ts +99 -0
  430. package/dist/core/session-store.d.ts.map +1 -0
  431. package/dist/core/session-store.js +298 -0
  432. package/dist/core/session-store.js.map +1 -0
  433. package/dist/core/session.d.ts +144 -0
  434. package/dist/core/session.d.ts.map +1 -0
  435. package/dist/core/session.js +56 -0
  436. package/dist/core/session.js.map +1 -0
  437. package/dist/core/spec-contract.d.ts +147 -0
  438. package/dist/core/spec-contract.d.ts.map +1 -0
  439. package/dist/core/spec-contract.js +340 -0
  440. package/dist/core/spec-contract.js.map +1 -0
  441. package/dist/core/strategy-store.d.ts +50 -0
  442. package/dist/core/strategy-store.d.ts.map +1 -0
  443. package/dist/core/strategy-store.js +100 -0
  444. package/dist/core/strategy-store.js.map +1 -0
  445. package/dist/core/stub-env.d.ts +35 -0
  446. package/dist/core/stub-env.d.ts.map +1 -0
  447. package/dist/core/stub-env.js +69 -0
  448. package/dist/core/stub-env.js.map +1 -0
  449. package/dist/core/task-notification.d.ts +115 -0
  450. package/dist/core/task-notification.d.ts.map +1 -0
  451. package/dist/core/task-notification.js +247 -0
  452. package/dist/core/task-notification.js.map +1 -0
  453. package/dist/core/task-outcome.d.ts +80 -0
  454. package/dist/core/task-outcome.d.ts.map +1 -0
  455. package/dist/core/task-outcome.js +40 -0
  456. package/dist/core/task-outcome.js.map +1 -0
  457. package/dist/core/task-registry.d.ts +349 -0
  458. package/dist/core/task-registry.d.ts.map +1 -0
  459. package/dist/core/task-registry.js +1751 -0
  460. package/dist/core/task-registry.js.map +1 -0
  461. package/dist/core/tighten-task-spec.d.ts +27 -0
  462. package/dist/core/tighten-task-spec.d.ts.map +1 -0
  463. package/dist/core/tighten-task-spec.js +95 -0
  464. package/dist/core/tighten-task-spec.js.map +1 -0
  465. package/dist/core/tool-detach.d.ts +31 -0
  466. package/dist/core/tool-detach.d.ts.map +1 -0
  467. package/dist/core/tool-detach.js +62 -0
  468. package/dist/core/tool-detach.js.map +1 -0
  469. package/dist/core/tool-errors.d.ts +72 -0
  470. package/dist/core/tool-errors.d.ts.map +1 -0
  471. package/dist/core/tool-errors.js +194 -0
  472. package/dist/core/tool-errors.js.map +1 -0
  473. package/dist/core/tool-name-aliases.d.ts +5 -0
  474. package/dist/core/tool-name-aliases.d.ts.map +1 -0
  475. package/dist/core/tool-name-aliases.js +130 -0
  476. package/dist/core/tool-name-aliases.js.map +1 -0
  477. package/dist/core/tool-policy.d.ts +295 -0
  478. package/dist/core/tool-policy.d.ts.map +1 -0
  479. package/dist/core/tool-policy.js +567 -0
  480. package/dist/core/tool-policy.js.map +1 -0
  481. package/dist/core/tool-result-budget.d.ts +44 -0
  482. package/dist/core/tool-result-budget.d.ts.map +1 -0
  483. package/dist/core/tool-result-budget.js +140 -0
  484. package/dist/core/tool-result-budget.js.map +1 -0
  485. package/dist/core/tool-result-store.d.ts +136 -0
  486. package/dist/core/tool-result-store.d.ts.map +1 -0
  487. package/dist/core/tool-result-store.js +219 -0
  488. package/dist/core/tool-result-store.js.map +1 -0
  489. package/dist/core/tools.d.ts +14 -0
  490. package/dist/core/tools.d.ts.map +1 -0
  491. package/dist/core/tools.js +98 -0
  492. package/dist/core/tools.js.map +1 -0
  493. package/dist/core/trace.d.ts +340 -0
  494. package/dist/core/trace.d.ts.map +1 -0
  495. package/dist/core/trace.js +12 -0
  496. package/dist/core/trace.js.map +1 -0
  497. package/dist/core/types.d.ts +2828 -0
  498. package/dist/core/types.d.ts.map +1 -0
  499. package/dist/core/types.js +2 -0
  500. package/dist/core/types.js.map +1 -0
  501. package/dist/core/untrusted-egress.d.ts +32 -0
  502. package/dist/core/untrusted-egress.d.ts.map +1 -0
  503. package/dist/core/untrusted-egress.js +49 -0
  504. package/dist/core/untrusted-egress.js.map +1 -0
  505. package/dist/core/untrusted-text.d.ts +64 -0
  506. package/dist/core/untrusted-text.d.ts.map +1 -0
  507. package/dist/core/untrusted-text.js +119 -0
  508. package/dist/core/untrusted-text.js.map +1 -0
  509. package/dist/core/warm-resume.d.ts +23 -0
  510. package/dist/core/warm-resume.d.ts.map +1 -0
  511. package/dist/core/warm-resume.js +28 -0
  512. package/dist/core/warm-resume.js.map +1 -0
  513. package/dist/core/with-retry.d.ts +43 -0
  514. package/dist/core/with-retry.d.ts.map +1 -0
  515. package/dist/core/with-retry.js +59 -0
  516. package/dist/core/with-retry.js.map +1 -0
  517. package/dist/core/workflow-journal-store.d.ts +44 -0
  518. package/dist/core/workflow-journal-store.d.ts.map +1 -0
  519. package/dist/core/workflow-journal-store.js +47 -0
  520. package/dist/core/workflow-journal-store.js.map +1 -0
  521. package/dist/core/workflow-run-store-contract.d.ts +31 -0
  522. package/dist/core/workflow-run-store-contract.d.ts.map +1 -0
  523. package/dist/core/workflow-run-store-contract.js +191 -0
  524. package/dist/core/workflow-run-store-contract.js.map +1 -0
  525. package/dist/core/workflow-run-store.d.ts +149 -0
  526. package/dist/core/workflow-run-store.d.ts.map +1 -0
  527. package/dist/core/workflow-run-store.js +110 -0
  528. package/dist/core/workflow-run-store.js.map +1 -0
  529. package/dist/engine/compaction/compaction.d.ts +139 -0
  530. package/dist/engine/compaction/compaction.d.ts.map +1 -0
  531. package/dist/engine/compaction/compaction.js +1030 -0
  532. package/dist/engine/compaction/compaction.js.map +1 -0
  533. package/dist/engine/compaction/utils.d.ts +45 -0
  534. package/dist/engine/compaction/utils.d.ts.map +1 -0
  535. package/dist/engine/compaction/utils.js +203 -0
  536. package/dist/engine/compaction/utils.js.map +1 -0
  537. package/dist/engine/execution-env/kill-tree.d.ts +20 -0
  538. package/dist/engine/execution-env/kill-tree.d.ts.map +1 -0
  539. package/dist/engine/execution-env/kill-tree.js +183 -0
  540. package/dist/engine/execution-env/kill-tree.js.map +1 -0
  541. package/dist/engine/execution-env/node-execution-env.d.ts +133 -0
  542. package/dist/engine/execution-env/node-execution-env.d.ts.map +1 -0
  543. package/dist/engine/execution-env/node-execution-env.js +1031 -0
  544. package/dist/engine/execution-env/node-execution-env.js.map +1 -0
  545. package/dist/engine/harness/agent-harness.d.ts +174 -0
  546. package/dist/engine/harness/agent-harness.d.ts.map +1 -0
  547. package/dist/engine/harness/agent-harness.js +1053 -0
  548. package/dist/engine/harness/agent-harness.js.map +1 -0
  549. package/dist/engine/harness/messages.d.ts +17 -0
  550. package/dist/engine/harness/messages.d.ts.map +1 -0
  551. package/dist/engine/harness/messages.js +122 -0
  552. package/dist/engine/harness/messages.js.map +1 -0
  553. package/dist/engine/harness/types.d.ts +713 -0
  554. package/dist/engine/harness/types.d.ts.map +1 -0
  555. package/dist/engine/harness/types.js +100 -0
  556. package/dist/engine/harness/types.js.map +1 -0
  557. package/dist/engine/llm/diagnostics.d.ts +23 -0
  558. package/dist/engine/llm/diagnostics.d.ts.map +1 -0
  559. package/dist/engine/llm/diagnostics.js +32 -0
  560. package/dist/engine/llm/diagnostics.js.map +1 -0
  561. package/dist/engine/llm/event-stream.d.ts +25 -0
  562. package/dist/engine/llm/event-stream.d.ts.map +1 -0
  563. package/dist/engine/llm/event-stream.js +103 -0
  564. package/dist/engine/llm/event-stream.js.map +1 -0
  565. package/dist/engine/llm/index.d.ts +12 -0
  566. package/dist/engine/llm/index.d.ts.map +1 -0
  567. package/dist/engine/llm/index.js +12 -0
  568. package/dist/engine/llm/index.js.map +1 -0
  569. package/dist/engine/llm/types.d.ts +753 -0
  570. package/dist/engine/llm/types.d.ts.map +1 -0
  571. package/dist/engine/llm/types.js +2 -0
  572. package/dist/engine/llm/types.js.map +1 -0
  573. package/dist/engine/llm/validation.d.ts +8 -0
  574. package/dist/engine/llm/validation.d.ts.map +1 -0
  575. package/dist/engine/llm/validation.js +318 -0
  576. package/dist/engine/llm/validation.js.map +1 -0
  577. package/dist/engine/loop/agent-loop.d.ts +74 -0
  578. package/dist/engine/loop/agent-loop.d.ts.map +1 -0
  579. package/dist/engine/loop/agent-loop.js +1490 -0
  580. package/dist/engine/loop/agent-loop.js.map +1 -0
  581. package/dist/engine/loop/runtime-deps.d.ts +17 -0
  582. package/dist/engine/loop/runtime-deps.d.ts.map +1 -0
  583. package/dist/engine/loop/runtime-deps.js +21 -0
  584. package/dist/engine/loop/runtime-deps.js.map +1 -0
  585. package/dist/engine/loop/types.d.ts +609 -0
  586. package/dist/engine/loop/types.d.ts.map +1 -0
  587. package/dist/engine/loop/types.js +2 -0
  588. package/dist/engine/loop/types.js.map +1 -0
  589. package/dist/engine/lsp/frame-decoder.d.ts +16 -0
  590. package/dist/engine/lsp/frame-decoder.d.ts.map +1 -0
  591. package/dist/engine/lsp/frame-decoder.js +53 -0
  592. package/dist/engine/lsp/frame-decoder.js.map +1 -0
  593. package/dist/engine/lsp/node-lsp-manager.d.ts +105 -0
  594. package/dist/engine/lsp/node-lsp-manager.d.ts.map +1 -0
  595. package/dist/engine/lsp/node-lsp-manager.js +343 -0
  596. package/dist/engine/lsp/node-lsp-manager.js.map +1 -0
  597. package/dist/engine/lsp/stdio-lsp-transport.d.ts +37 -0
  598. package/dist/engine/lsp/stdio-lsp-transport.d.ts.map +1 -0
  599. package/dist/engine/lsp/stdio-lsp-transport.js +185 -0
  600. package/dist/engine/lsp/stdio-lsp-transport.js.map +1 -0
  601. package/dist/engine/session/import-validate.d.ts +44 -0
  602. package/dist/engine/session/import-validate.d.ts.map +1 -0
  603. package/dist/engine/session/import-validate.js +92 -0
  604. package/dist/engine/session/import-validate.js.map +1 -0
  605. package/dist/engine/session/memory-repo.d.ts +25 -0
  606. package/dist/engine/session/memory-repo.d.ts.map +1 -0
  607. package/dist/engine/session/memory-repo.js +59 -0
  608. package/dist/engine/session/memory-repo.js.map +1 -0
  609. package/dist/engine/session/memory-storage.d.ts +14 -0
  610. package/dist/engine/session/memory-storage.d.ts.map +1 -0
  611. package/dist/engine/session/memory-storage.js +17 -0
  612. package/dist/engine/session/memory-storage.js.map +1 -0
  613. package/dist/engine/session/repo-utils.d.ts +11 -0
  614. package/dist/engine/session/repo-utils.d.ts.map +1 -0
  615. package/dist/engine/session/repo-utils.js +40 -0
  616. package/dist/engine/session/repo-utils.js.map +1 -0
  617. package/dist/engine/session/session.d.ts +34 -0
  618. package/dist/engine/session/session.d.ts.map +1 -0
  619. package/dist/engine/session/session.js +227 -0
  620. package/dist/engine/session/session.js.map +1 -0
  621. package/dist/engine/session/storage-base.d.ts +38 -0
  622. package/dist/engine/session/storage-base.d.ts.map +1 -0
  623. package/dist/engine/session/storage-base.js +157 -0
  624. package/dist/engine/session/storage-base.js.map +1 -0
  625. package/dist/engine/session/timestamps.d.ts +3 -0
  626. package/dist/engine/session/timestamps.d.ts.map +1 -0
  627. package/dist/engine/session/timestamps.js +15 -0
  628. package/dist/engine/session/timestamps.js.map +1 -0
  629. package/dist/engine/session/uuid.d.ts +2 -0
  630. package/dist/engine/session/uuid.d.ts.map +1 -0
  631. package/dist/engine/session/uuid.js +50 -0
  632. package/dist/engine/session/uuid.js.map +1 -0
  633. package/dist/index.d.ts +160 -0
  634. package/dist/index.d.ts.map +1 -0
  635. package/dist/index.js +374 -0
  636. package/dist/index.js.map +1 -0
  637. package/dist/internal/harness.d.ts +26 -0
  638. package/dist/internal/harness.d.ts.map +1 -0
  639. package/dist/internal/harness.js +24 -0
  640. package/dist/internal/harness.js.map +1 -0
  641. package/dist/internal/llm.d.ts +9 -0
  642. package/dist/internal/llm.d.ts.map +1 -0
  643. package/dist/internal/llm.js +8 -0
  644. package/dist/internal/llm.js.map +1 -0
  645. package/dist/orchestration/builtin-workflows.d.ts +44 -0
  646. package/dist/orchestration/builtin-workflows.d.ts.map +1 -0
  647. package/dist/orchestration/builtin-workflows.js +165 -0
  648. package/dist/orchestration/builtin-workflows.js.map +1 -0
  649. package/dist/orchestration/dev-vm-script-runner.d.ts +24 -0
  650. package/dist/orchestration/dev-vm-script-runner.d.ts.map +1 -0
  651. package/dist/orchestration/dev-vm-script-runner.js +106 -0
  652. package/dist/orchestration/dev-vm-script-runner.js.map +1 -0
  653. package/dist/orchestration/goal.d.ts +97 -0
  654. package/dist/orchestration/goal.d.ts.map +1 -0
  655. package/dist/orchestration/goal.js +248 -0
  656. package/dist/orchestration/goal.js.map +1 -0
  657. package/dist/orchestration/run-spec.d.ts +63 -0
  658. package/dist/orchestration/run-spec.d.ts.map +1 -0
  659. package/dist/orchestration/run-spec.js +274 -0
  660. package/dist/orchestration/run-spec.js.map +1 -0
  661. package/dist/orchestration/run-workflow-tool.d.ts +187 -0
  662. package/dist/orchestration/run-workflow-tool.d.ts.map +1 -0
  663. package/dist/orchestration/run-workflow-tool.js +612 -0
  664. package/dist/orchestration/run-workflow-tool.js.map +1 -0
  665. package/dist/orchestration/workflow-governance.d.ts +70 -0
  666. package/dist/orchestration/workflow-governance.d.ts.map +1 -0
  667. package/dist/orchestration/workflow-governance.js +176 -0
  668. package/dist/orchestration/workflow-governance.js.map +1 -0
  669. package/dist/orchestration/workflow-meta.d.ts +41 -0
  670. package/dist/orchestration/workflow-meta.d.ts.map +1 -0
  671. package/dist/orchestration/workflow-meta.js +426 -0
  672. package/dist/orchestration/workflow-meta.js.map +1 -0
  673. package/dist/orchestration/workflow-observe.d.ts +77 -0
  674. package/dist/orchestration/workflow-observe.d.ts.map +1 -0
  675. package/dist/orchestration/workflow-observe.js +177 -0
  676. package/dist/orchestration/workflow-observe.js.map +1 -0
  677. package/dist/orchestration/workflow-primitives.d.ts +31 -0
  678. package/dist/orchestration/workflow-primitives.d.ts.map +1 -0
  679. package/dist/orchestration/workflow-primitives.js +104 -0
  680. package/dist/orchestration/workflow-primitives.js.map +1 -0
  681. package/dist/orchestration/workflow-sandbox-conformance.d.ts +34 -0
  682. package/dist/orchestration/workflow-sandbox-conformance.d.ts.map +1 -0
  683. package/dist/orchestration/workflow-sandbox-conformance.js +301 -0
  684. package/dist/orchestration/workflow-sandbox-conformance.js.map +1 -0
  685. package/dist/orchestration/workflow-script-runner.d.ts +127 -0
  686. package/dist/orchestration/workflow-script-runner.d.ts.map +1 -0
  687. package/dist/orchestration/workflow-script-runner.js +48 -0
  688. package/dist/orchestration/workflow-script-runner.js.map +1 -0
  689. package/dist/orchestration/workflow-script-store.d.ts +99 -0
  690. package/dist/orchestration/workflow-script-store.d.ts.map +1 -0
  691. package/dist/orchestration/workflow-script-store.js +133 -0
  692. package/dist/orchestration/workflow-script-store.js.map +1 -0
  693. package/dist/orchestration/workflow-size-guideline.d.ts +50 -0
  694. package/dist/orchestration/workflow-size-guideline.d.ts.map +1 -0
  695. package/dist/orchestration/workflow-size-guideline.js +78 -0
  696. package/dist/orchestration/workflow-size-guideline.js.map +1 -0
  697. package/dist/orchestration/workflow.d.ts +624 -0
  698. package/dist/orchestration/workflow.d.ts.map +1 -0
  699. package/dist/orchestration/workflow.js +1596 -0
  700. package/dist/orchestration/workflow.js.map +1 -0
  701. package/dist/prompts/default.d.ts +474 -0
  702. package/dist/prompts/default.d.ts.map +1 -0
  703. package/dist/prompts/default.js +676 -0
  704. package/dist/prompts/default.js.map +1 -0
  705. package/dist/prompts/supervisor.d.ts +60 -0
  706. package/dist/prompts/supervisor.d.ts.map +1 -0
  707. package/dist/prompts/supervisor.js +162 -0
  708. package/dist/prompts/supervisor.js.map +1 -0
  709. package/dist/scenarios/env.d.ts +41 -0
  710. package/dist/scenarios/env.d.ts.map +1 -0
  711. package/dist/scenarios/env.js +65 -0
  712. package/dist/scenarios/env.js.map +1 -0
  713. package/dist/scenarios/full-body.d.ts +47 -0
  714. package/dist/scenarios/full-body.d.ts.map +1 -0
  715. package/dist/scenarios/full-body.js +36 -0
  716. package/dist/scenarios/full-body.js.map +1 -0
  717. package/dist/scenarios/scenario-registry.d.ts +107 -0
  718. package/dist/scenarios/scenario-registry.d.ts.map +1 -0
  719. package/dist/scenarios/scenario-registry.js +192 -0
  720. package/dist/scenarios/scenario-registry.js.map +1 -0
  721. package/dist/scenarios/teacher-quickstart.d.ts +41 -0
  722. package/dist/scenarios/teacher-quickstart.d.ts.map +1 -0
  723. package/dist/scenarios/teacher-quickstart.js +32 -0
  724. package/dist/scenarios/teacher-quickstart.js.map +1 -0
  725. package/dist/server/http.d.ts +36 -0
  726. package/dist/server/http.d.ts.map +1 -0
  727. package/dist/server/http.js +144 -0
  728. package/dist/server/http.js.map +1 -0
  729. package/dist/stores/file/checkpoint-store.d.ts +62 -0
  730. package/dist/stores/file/checkpoint-store.d.ts.map +1 -0
  731. package/dist/stores/file/checkpoint-store.js +250 -0
  732. package/dist/stores/file/checkpoint-store.js.map +1 -0
  733. package/dist/stores/file/file-snapshot-store.d.ts +43 -0
  734. package/dist/stores/file/file-snapshot-store.d.ts.map +1 -0
  735. package/dist/stores/file/file-snapshot-store.js +374 -0
  736. package/dist/stores/file/file-snapshot-store.js.map +1 -0
  737. package/dist/stores/file/fs-atomic.d.ts +95 -0
  738. package/dist/stores/file/fs-atomic.d.ts.map +1 -0
  739. package/dist/stores/file/fs-atomic.js +415 -0
  740. package/dist/stores/file/fs-atomic.js.map +1 -0
  741. package/dist/stores/file/index.d.ts +98 -0
  742. package/dist/stores/file/index.d.ts.map +1 -0
  743. package/dist/stores/file/index.js +109 -0
  744. package/dist/stores/file/index.js.map +1 -0
  745. package/dist/stores/file/memory-store.d.ts +95 -0
  746. package/dist/stores/file/memory-store.d.ts.map +1 -0
  747. package/dist/stores/file/memory-store.js +393 -0
  748. package/dist/stores/file/memory-store.js.map +1 -0
  749. package/dist/stores/file/session-policy-store.d.ts +24 -0
  750. package/dist/stores/file/session-policy-store.d.ts.map +1 -0
  751. package/dist/stores/file/session-policy-store.js +123 -0
  752. package/dist/stores/file/session-policy-store.js.map +1 -0
  753. package/dist/stores/file/session-store.d.ts +34 -0
  754. package/dist/stores/file/session-store.d.ts.map +1 -0
  755. package/dist/stores/file/session-store.js +175 -0
  756. package/dist/stores/file/session-store.js.map +1 -0
  757. package/dist/stores/file/tool-result-store.d.ts +23 -0
  758. package/dist/stores/file/tool-result-store.d.ts.map +1 -0
  759. package/dist/stores/file/tool-result-store.js +61 -0
  760. package/dist/stores/file/tool-result-store.js.map +1 -0
  761. package/dist/stores/file/workflow-journal-store.d.ts +36 -0
  762. package/dist/stores/file/workflow-journal-store.d.ts.map +1 -0
  763. package/dist/stores/file/workflow-journal-store.js +157 -0
  764. package/dist/stores/file/workflow-journal-store.js.map +1 -0
  765. package/dist/stores/file/workflow-run-store.d.ts +58 -0
  766. package/dist/stores/file/workflow-run-store.d.ts.map +1 -0
  767. package/dist/stores/file/workflow-run-store.js +178 -0
  768. package/dist/stores/file/workflow-run-store.js.map +1 -0
  769. package/dist/stores/pg.d.ts +210 -0
  770. package/dist/stores/pg.d.ts.map +1 -0
  771. package/dist/stores/pg.js +652 -0
  772. package/dist/stores/pg.js.map +1 -0
  773. package/dist/tools/fs/encoding.d.ts +51 -0
  774. package/dist/tools/fs/encoding.d.ts.map +1 -0
  775. package/dist/tools/fs/encoding.js +74 -0
  776. package/dist/tools/fs/encoding.js.map +1 -0
  777. package/dist/tools/fs/gh-rate-limit.d.ts +19 -0
  778. package/dist/tools/fs/gh-rate-limit.d.ts.map +1 -0
  779. package/dist/tools/fs/gh-rate-limit.js +35 -0
  780. package/dist/tools/fs/gh-rate-limit.js.map +1 -0
  781. package/dist/tools/fs/index.d.ts +246 -0
  782. package/dist/tools/fs/index.d.ts.map +1 -0
  783. package/dist/tools/fs/index.js +2130 -0
  784. package/dist/tools/fs/index.js.map +1 -0
  785. package/dist/tools/fs/pdf.d.ts +106 -0
  786. package/dist/tools/fs/pdf.d.ts.map +1 -0
  787. package/dist/tools/fs/pdf.js +178 -0
  788. package/dist/tools/fs/pdf.js.map +1 -0
  789. package/dist/tools/fs/repo-map.d.ts +15 -0
  790. package/dist/tools/fs/repo-map.d.ts.map +1 -0
  791. package/dist/tools/fs/repo-map.js +251 -0
  792. package/dist/tools/fs/repo-map.js.map +1 -0
  793. package/dist/tools/fs/safety.d.ts +168 -0
  794. package/dist/tools/fs/safety.d.ts.map +1 -0
  795. package/dist/tools/fs/safety.js +479 -0
  796. package/dist/tools/fs/safety.js.map +1 -0
  797. package/dist/tools/fs/search.d.ts +118 -0
  798. package/dist/tools/fs/search.d.ts.map +1 -0
  799. package/dist/tools/fs/search.js +650 -0
  800. package/dist/tools/fs/search.js.map +1 -0
  801. package/dist/tools/gitea-issue.d.ts +39 -0
  802. package/dist/tools/gitea-issue.d.ts.map +1 -0
  803. package/dist/tools/gitea-issue.js +91 -0
  804. package/dist/tools/gitea-issue.js.map +1 -0
  805. package/dist/tools/monitor.d.ts +64 -0
  806. package/dist/tools/monitor.d.ts.map +1 -0
  807. package/dist/tools/monitor.js +135 -0
  808. package/dist/tools/monitor.js.map +1 -0
  809. package/dist/tools/scheduler-tools.d.ts +48 -0
  810. package/dist/tools/scheduler-tools.d.ts.map +1 -0
  811. package/dist/tools/scheduler-tools.js +449 -0
  812. package/dist/tools/scheduler-tools.js.map +1 -0
  813. package/dist/tools/sql-adapters.d.ts +32 -0
  814. package/dist/tools/sql-adapters.d.ts.map +1 -0
  815. package/dist/tools/sql-adapters.js +31 -0
  816. package/dist/tools/sql-adapters.js.map +1 -0
  817. package/dist/tools/sql.d.ts +36 -0
  818. package/dist/tools/sql.d.ts.map +1 -0
  819. package/dist/tools/sql.js +131 -0
  820. package/dist/tools/sql.js.map +1 -0
  821. package/dist/tools/task-list.d.ts +26 -0
  822. package/dist/tools/task-list.d.ts.map +1 -0
  823. package/dist/tools/task-list.js +352 -0
  824. package/dist/tools/task-list.js.map +1 -0
  825. package/dist/tools/todo.d.ts +11 -0
  826. package/dist/tools/todo.d.ts.map +1 -0
  827. package/dist/tools/todo.js +126 -0
  828. package/dist/tools/todo.js.map +1 -0
  829. package/dist/tools/web.d.ts +59 -0
  830. package/dist/tools/web.d.ts.map +1 -0
  831. package/dist/tools/web.js +607 -0
  832. package/dist/tools/web.js.map +1 -0
  833. package/dist/tools/worktree.d.ts +88 -0
  834. package/dist/tools/worktree.d.ts.map +1 -0
  835. package/dist/tools/worktree.js +434 -0
  836. package/dist/tools/worktree.js.map +1 -0
  837. package/docs/A1-ATTRIBUTION-ROUND1-2026-07-09.md +181 -0
  838. package/docs/AB-ORACLE-GATE-VERDICT-2026-07-10.md +100 -0
  839. package/docs/ANCHOR-GAP-INVENTORY-2026-07-09.md +143 -0
  840. package/docs/ARCHITECTURE.md +125 -0
  841. package/docs/BUGHUNT-2026-07-05-NIGHT.md +98 -0
  842. package/docs/BUILD.md +63 -0
  843. package/docs/CANCEL-ASYNC-ATTRIBUTION-2026-07-09.md +98 -0
  844. package/docs/CC-198-VS-201-DRIFT-2026-07-09.md +70 -0
  845. package/docs/CC-BASELINE-FAKE-ZERO-AUDIT-2026-07-09.md +51 -0
  846. package/docs/CC-DRIFT-198-206-AGENT-TYPES-2026-07-10.md +82 -0
  847. package/docs/CC-DRIFT-198-206-CHANGELOG-2026-07-10.md +82 -0
  848. package/docs/CC-DRIFT-198-206-REMINDERS-2026-07-10.md +96 -0
  849. package/docs/CC-DRIFT-198-206-ROADMAP-2026-07-10.md +110 -0
  850. package/docs/CC-DRIFT-198-206-TOOL-INVENTORY-2026-07-10.md +53 -0
  851. package/docs/CC-DRIFT-198-206-USAGE-CONSTANTS-2026-07-10.md +64 -0
  852. package/docs/CC-DRIFT-198-206-WORKFLOW-2026-07-10.md +83 -0
  853. package/docs/CC-PARITY-CHECKLIST.md +220 -0
  854. package/docs/CC-PARITY-DEEP-SWEEP-2026-07-07.md +149 -0
  855. package/docs/CC-SUBAGENT-PROMPT-STUDY-2026-07-09.md +219 -0
  856. package/docs/CC-TASK-REMINDER-CADENCE-STUDY-2026-07-09.md +396 -0
  857. package/docs/CC-TOOL-PARITY-SWEEP-2026-07.md +56 -0
  858. package/docs/CC-TOOL-PROMPT-DEEP-DIFF-2026-07-08.md +274 -0
  859. package/docs/CC-TOOLSURFACE-DEEP-DIVE-2026-07-07.md +197 -0
  860. package/docs/CC206-OBSERVER-ANCHORS-2026-07-11.md +463 -0
  861. package/docs/CC207-CORE-SWEEP-BACKLOG-2026-07-12.md +155 -0
  862. package/docs/CENTER-CONTROL-PLANE-SEAM.md +86 -0
  863. package/docs/CLEANUP-CONTRACT-ANCHOR-2026-07-09.md +83 -0
  864. package/docs/COLD-START-RSI-2026-07-09.md +72 -0
  865. package/docs/COMPACTION-LIVE-AUDIT-2026-07-09.md +114 -0
  866. package/docs/CONTEXT-lifecycle-extension-points-and-stop-attribution.md +71 -0
  867. package/docs/COREWARS-POLYGLOT-TRIAGE-2026-07-09.md +85 -0
  868. package/docs/DEADTARGET-OVERFULL-HBOX-2026-07-10.md +92 -0
  869. package/docs/DEADTARGET-PATH-TRACING-REVERSE-2026-07-10.md +87 -0
  870. package/docs/DEADTARGET-WINNING-AVG-COREWARS-2026-07-10.md +96 -0
  871. package/docs/DEEPSEEK-API-LIMITS-PROBE-2026-07-09.md +118 -0
  872. package/docs/DESIGN-140-MOCK-VERIFY-2026-07-11.md +79 -0
  873. package/docs/DESIGN-140-VERIFICATION-2026-07-11.md +43 -0
  874. package/docs/DESIGN-DRAFT-workflow-collab-2026-07-11.md +56 -0
  875. package/docs/DESIGN-ORACLE-GROUNDING-GATE-2026-07-10.md +167 -0
  876. package/docs/DESIGN-TFRAG-RECONCILE-SCAFFOLD-2026-07-09.md +102 -0
  877. package/docs/EXP-PA2-PE-DESIGN-2026-07-11.md +220 -0
  878. package/docs/EXT-DOGFOOD-2026-07-12.md +50 -0
  879. package/docs/FINAL-VERIFY-SURFACE-AUDIT-2026-07-09.md +44 -0
  880. package/docs/FRAG-RECON-INVESTIGATION-2026-07-09.md +183 -0
  881. package/docs/HANDOFF.md +121 -0
  882. package/docs/KNOWN-ISSUES.md +96 -0
  883. package/docs/LEGW-WINDOW-TAX-2026-07-10.md +82 -0
  884. package/docs/LIVE-PROBE-BATCH-2026-07-11.md +207 -0
  885. package/docs/M2-CERT-ATTRIBUTION-2026-07-10.md +61 -0
  886. package/docs/M25-LEG-VARIANCE-ATTRIBUTION-2026-07-10.md +81 -0
  887. package/docs/MAILMAN-TIMEOUT-ATTRIBUTION-2026-07-10.md +88 -0
  888. package/docs/MEMORY-BACKEND-DIALECT-NOTES.md +69 -0
  889. package/docs/MTEB-ESCAPE-HATCH-ATTRIBUTION-2026-07-09.md +57 -0
  890. package/docs/MTEB-LEADERBOARD-ATTRIBUTION-2026-07-10.md +134 -0
  891. package/docs/ORACLE-GATE-NEGATIVE-SAMPLE-2026-07-11.md +28 -0
  892. package/docs/PARITY-CONTEXT-TRANSACTIONS-2026-07-10.md +67 -0
  893. package/docs/PARITY-PROGRESS-MATRIX-2026-07-10.md +37 -0
  894. package/docs/PARITY-SPOT-AGENT-TYPES-2026-07-10.md +70 -0
  895. package/docs/PARITY-SPOT-REMINDERS-2026-07-10.md +144 -0
  896. package/docs/PARITY-SPOT-TOOL-INVENTORY-2026-07-10.md +61 -0
  897. package/docs/PARITY-SPOT-USAGE-CONSTANTS-2026-07-10.md +95 -0
  898. package/docs/PARITY-SPOT-WORKFLOW-2026-07-10.md +93 -0
  899. package/docs/PASSWORD-RECOVERY-PANEL-VERDICT-2026-07-10.md +62 -0
  900. package/docs/R8-R9-FINALIZE-COORDINATION-2026-07-09.md +124 -0
  901. package/docs/REPL-CODE-MODE-EVALUATION-2026-07-10.md +187 -0
  902. package/docs/REPORT-1249-TARGETED.md +48 -0
  903. package/docs/RESEARCH-3P-MEMORY-SWAP-2026-07-12.md +273 -0
  904. package/docs/ROADMAP.md +111 -0
  905. package/docs/RSI-CLOUD-DEPLOY-2026-07-06.md +289 -0
  906. package/docs/RSI-PROCESS-AI-COLDSTART-2026-07-11.md +68 -0
  907. package/docs/S18-THOROUGHNESS-AUDIT-2026-07-09.md +113 -0
  908. package/docs/SERVICE-INTEGRATION-GUIDE.md +298 -0
  909. package/docs/SUBAGENT-STREAM-RESILIENCE-PARITY-2026-07-10.md +118 -0
  910. package/docs/SWEBENCH-PRO-RECON-2026-07-11.md +31 -0
  911. package/docs/TB-EFFICIENCY-TELEMETRY-2026-07-08.md +114 -0
  912. package/docs/TB-FAILURE-AUTOPSY-2026-07-05-RERUN.md +67 -0
  913. package/docs/TB-FAIRNESS-AUDIT-2026-07-08.md +141 -0
  914. package/docs/TB-FULL-1257-2026-07-08.md +77 -0
  915. package/docs/TB-LEG-GAP-ATTRIBUTION-1261-1263-2026-07-11.md +154 -0
  916. package/docs/TB-REGRESSION-DAEMON-KILL-2026-07-08.md +58 -0
  917. package/docs/TB-RSI-CROSSCHECK-2026-07-06.md +68 -0
  918. package/docs/TB-RSI-LEDGER.md +30 -0
  919. package/docs/TB-STABLE-SET-2026-07-08.md +127 -0
  920. package/docs/TB21-RECON-2026-07-11.md +28 -0
  921. package/docs/TEST-DESIGN-BATCH-1-2-3.md +97 -0
  922. package/docs/THIRD-PARTY-INTEGRATION.md +45 -0
  923. package/docs/TOKEN-ESTIMATE-CALIBRATION-LIVE-2026-07-09.md +102 -0
  924. package/docs/audit-2026-06-10-/347/254/254/344/272/214/350/275/256-/347/251/272/347/231/275/345/214/272/344/270/216/345/277/230/346/216/245/347/272/277.md +147 -0
  925. package/docs/audit-2026-06-10-/350/256/241/347/256/227bug/346/211/253/346/217/217.md +163 -0
  926. package/docs/audit-2026-06-11-/344/277/256/345/244/215/345/244/215/345/256/241/344/270/216/345/233/236/345/275/222/344/270/223/346/211/253.md +95 -0
  927. package/docs/audit-2026-06-12-design71-P1/346/275/234/344/274/217/351/235/242/350/243/201/345/206/263/344/270/216/345/220/236/351/224/231/345/256/241/350/256/241.md +45 -0
  928. package/docs/audit-2026-06-12-/345/205/254/345/274/200/346/227/213/351/222/256/346/264/273/346/200/247/344/270/216vendored/346/255/273/350/267/257.md +63 -0
  929. package/docs/audit-2026-06-15/ADDENDUM-second-pass.md +88 -0
  930. package/docs/audit-2026-06-15/ARCHITECTURE-AND-ROADMAP.md +187 -0
  931. package/docs/audit-2026-06-15/DOC-CORRECTIONS.md +105 -0
  932. package/docs/audit-2026-06-15/INDEX.md +49 -0
  933. package/docs/audit-2026-06-15/ORCHESTRATION-STATUS.md +98 -0
  934. package/docs/audit-2026-06-15/PRODUCTION-ISSUES.md +189 -0
  935. package/docs/audit-2026-06-15/REFERENCES-literature.md +139 -0
  936. package/docs/audit-2026-06-15/VENDOR-REFACTOR-PLAN.md +96 -0
  937. package/docs/cc-probe-198/README.md +72 -0
  938. package/docs/cc-probe-198/STABILITY-AUDIT.md +118 -0
  939. package/docs/cc-probe-198/live-schema-monitor-worktree-2026-07-09.json +56 -0
  940. package/docs/cc-probe-198/mount-variants.json +536 -0
  941. package/docs/cc-probe-198/plan-mode-run.json +1 -0
  942. package/docs/cc-probe-198/probe-bash-bg.json +224 -0
  943. package/docs/cc-probe-198/probe-edit-mismatch.json +120 -0
  944. package/docs/cc-probe-198/probe-read-missing.json +62 -0
  945. package/docs/cc-probe-198/probe-search-empty.json +127 -0
  946. package/docs/cc-probe-198/probe-task-family.json +227 -0
  947. package/docs/cc-probe-198/probes.status +6 -0
  948. package/docs/cc-probe-198/raw-capture-interactive.json +948 -0
  949. package/docs/cc-probe-198/raw-capture-print.json +787 -0
  950. package/docs/cc-probe-198/raw-capture2-interactive.json +948 -0
  951. package/docs/cc-probe-198/raw-capture2-print.json +787 -0
  952. package/docs/cc-probe-198/system-prompt.txt +135 -0
  953. package/docs/cc-probe-198/tools-array.json +962 -0
  954. package/docs/durability-boundary.md +63 -0
  955. package/docs/fix-2026-06-10-/350/256/241/347/256/227bug/344/277/256/345/244/215-search/346/211/271.md +75 -0
  956. package/docs/fix-2026-06-11-/347/254/254/344/272/214/350/275/256-/344/277/256/345/244/215-search/346/211/271.md +62 -0
  957. package/docs/parity-sweep/REPORT-DYNAMIC.md +97 -0
  958. package/docs/parity-sweep/REPORT-STATIC-GGB.md +127 -0
  959. package/docs/parity-sweep/REPORT-STATIC-RWE.md +133 -0
  960. package/docs/vendor-history.md +385 -0
  961. package/docs/vendored-upstream-diff-2026-07.md +83 -0
  962. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,1040 @@
1
+ # sema-core
2
+
3
+ > **本文件是消费者集成文档(usage),主要读者是 AI。** 内容力求精确、完整、可直接执行:确切的类型签名、所有导出、
4
+ > 事件协议、状态语义、可复制的集成代码、安全契约。看完即可独立集成,不需要再读源码。
5
+ >
6
+ > 🧭 **要理解架构 / 编译发版 / 当前 bug / 路线图与难点,或刚接手本仓?先读 [`docs/HANDOFF.md`](docs/HANDOFF.md)(唯一权威入口)。** 本 README 只覆盖"如何调用引擎"。
7
+
8
+ 一个**无状态、任务化**的 AI agent 核心,推理循环最初蒸馏自 [openclaw](https://github.com/openclaw/openclaw),现已全量重写为 first-party(design/118;血统史 `docs/vendor-history.md`)。
9
+
10
+ 设计取向:**大脑在外**(你提供一个模型网关)、**执行靠工具/MCP**、**session 默认内存化**(重启丢、不重启默认留 7 天;接 durable `SessionStore`/`SessionRepo` 即升级为持久会话中心,§11)、
11
+ **MCP/skill 不持久化**(随每个任务传、跑完即弃)。一个"任务"自带它的全套配置(模型、提示词、工具、MCP、skill、限额),
12
+ 跑完返回一个机器可读的结果(完成 / 受阻 / 失败 / 超时)。
13
+
14
+ - 语言/运行时:TypeScript + Node(ESM, NodeNext)。
15
+ - 外部依赖:**仅 `typebox` 与 `@modelcontextprotocol/sdk`**(design/71 P1 已删除 vendored 磁盘 skill 面,连带移除 `ignore`/`yaml` 两个旧依赖;如本文别处仍提及它们即为过时)。
16
+ - 已在真实网关(Qwen3.5-35B, vLLM, OpenAI 兼容)上全链路 live 验证。
17
+
18
+ > 📌 **当前版本状态(2026-06-29 核实,权威实时状态见 [`docs/HANDOFF.md`](docs/HANDOFF.md))**:已干净发布 + 打 tag **`1.162.0`**(`package.json`、`git tag v1.162.0`、`npm view @sema-ai/core version` 三处一致)。**1.151~1.162 见 CHANGELOG**——含 **🖥️ 1.162 K-8 第二批 后台 shell seam**(design/103:`Bash(run_in_background)`/`BashOutput`/`KillShell` 让引擎跑真实开发循环;`BackgroundShellCapability` 接口导出单源 + NodeExecutionEnv naturalize + dispose-before-suspendVM + 三安全红线;codex+workflow 双轨复审两轮;TOB 实现归 service)、**🔴 1.161 K-8「CC full-body」第一批**(full-body profile 切片 `FULL_BODY_SYSTEM_PROMPT`/`assembleFullBodyTools` + **BREAKING 工具名对齐 CC**:read_file→Read 等,模型 tool-call 保真度,consumer 锁步翻名)、**1.160 message-identity Phase 1**(`TaskEvent.message_committed`,解锁 `compacted.preserved_segment`)+ **service [325] env-teardown 时序修**、1.155~1.159(shell §K / manual /compact / per-principal 授权轴 / P-13 / CC Plan 模式)。早段脉络:`1.104.0`(design/80 supervisor 封顶)→ `1.111~1.114`(metrics→`/bench` / ask 冒泡 / `tightenTaskSpec`)→ `1.115~1.118`(CC-parity:推理强度真切换 / S1 workflow 引擎 / S8 LLM 自助编排 / goal 模式 S2+S4)→ `1.119.0`(**改名 `@ai-only/ai-agent-core`→`@sema-ai/core`,仓库 `sema-core`**)→ `1.120~1.128`(**sema-shell 主权契约 E1–E25**,design/99)→ `1.129~1.139`(**多轮对抗 bug-hunt + vendored 硬化**,1.139 含 36 修)→ `1.135~1.143`(**2c session-sync** 云↔本地会话同步)→ `1.144~1.145`(workflow-parity CORE-1~9:`WorkflowJournalStore` scope-keyed durable resume + steerable agents `agentStream`/`onWorkflowAgentSpawn` + worktree 隔离 + per-agent activity 流;CORE-1~9 × SVC-1~5 全 SHIPPED)→ **`1.146~1.150`(当前)= sema-shell 数据契约 MF-\***(引擎↔sema-shell `/workflows` monitor↔service 的可观测数据契约,与 service 协调:MF-24 `TaskResult.stats.humanReview.gates[]` 权限门/denial 账本 + 脱敏边界 `src/core/arg-summary.ts` / MF-10 `TaskEvent.task_progress` subagent usage tick / MF-25 `TaskResult.model` 回声 effective model / MF-18 `compacted.trigger` / MF-14 `CheckpointSummary.contentKind` / MF-W WorkflowRun monitor header+活动 arg;MF-Fleet 由 service 进程内 live 聚合,core 只产 fact/signal 不建 durable 父系血缘)。**最近建造线 = sema-shell 数据契约(MF-\*/MF-Fleet)+ P2 design-review / workflow-parity(design/97)/ sema-shell 主权契约(design/99)/ 2c session-sync**;**已封顶降为基座**:CC-parity 编排 + 推理强度 + goal + S8(design/96/97/98,§4.15)· design/80 Supervisor + 价值判决 GOAL 达成(§4.14)。**当前焦点**(快速移动,真相=`git log`+`团队/`通道+memory)= sema-shell 数据契约 loop(MF-\*/MF-Fleet)+ P2 design-review,与 service 协调。默认仍是 `DEFAULT_MAX_TURNS=100` / `DEFAULT_MAX_SUSPENDS=5`(保守安全网,长自治任务由 leader 显式设上限)。`npm test` 全绿(以实跑为准;**3351 passed / 25 skipped**,每发布版都跑全维度)。design/74(资源切片 suspend/resume,长自治跑)已**落地并 make-real LIVE 验证**。
19
+
20
+ ---
21
+
22
+ ## 目录
23
+
24
+ 1. [要求与安装](#1-要求与安装)
25
+ 2. [60 秒集成](#2-60-秒集成)
26
+ 3. [核心概念](#3-核心概念)
27
+ 4. [API 参考](#4-api-参考)
28
+ 5. [流式事件协议(SSE)](#5-流式事件协议sse)
29
+ 6. [任务状态语义](#6-任务状态语义)
30
+ 7. [安全模型](#7-安全模型必读)
31
+ 8. [多 agent:subagent 与 team](#8-多-agentsubagent-与-team)
32
+ 9. [Session、内存化与自动压缩](#9-session内存化与自动压缩)
33
+ 10. [模型网关接入](#10-模型网关接入)
34
+ 11. [扩展点](#11-扩展点)
35
+ 12. [示例与自检](#12-示例与自检)
36
+ 13. [vendored 内核与许可](#13-vendored-内核与许可)
37
+ 14. [已知限制 / TODO](#14-已知限制--todo)
38
+
39
+ ---
40
+
41
+ ## 1. 要求与安装
42
+
43
+ - Node ≥ 20(用到全局 `fetch`、`zlib.crc32`;开发机实测 Node 22/24)。
44
+ - 模型网关:一个 **OpenAI 兼容**的 `/v1/chat/completions` 端点(流式 + function calling)。
45
+
46
+ ```bash
47
+ npm install # 安装 typebox / @modelcontextprotocol/sdk 等
48
+ npx tsc --noEmit # 类型检查(应为 0 错误)
49
+ npm run smoke # 用 mock brain 跑 e2e(无需网关)
50
+ ```
51
+
52
+ **作为 npm 包安装**(发布在你们 Gitea 的私有 registry,scope `@sema-ai`):
53
+
54
+ ```bash
55
+ # 一次性:把 @sema-ai 这个 scope 指向 Gitea registry(参考 .npmrc.example)
56
+ npm config set @sema-ai:registry http://git.zhenbs.com:9999/api/packages/AI-Only/npm/
57
+ npm config set //git.zhenbs.com:9999/api/packages/AI-Only/npm/:_authToken <你的_Gitea_token>
58
+ npm install @sema-ai/core
59
+ ```
60
+
61
+ 导入:`import { Runner, createOpenAIBrain } from "@sema-ai/core";`。
62
+ 包发布的是编译产物 `dist/`(`.js` + `.d.ts`);在本仓开发时直接用 `tsx` 跑 `src/`。
63
+
64
+ ---
65
+
66
+ ## 2. 60 秒集成
67
+
68
+ ```ts
69
+ import { Runner, createOpenAIBrain, createSqlTool, pgQuery, type Model } from "@sema-ai/core";
70
+ import { Type } from "typebox";
71
+
72
+ // 1) 定义模型(指向你的网关)
73
+ const model: Model = {
74
+ id: "Qwen3.5-35B", name: "Qwen3.5-35B",
75
+ api: "openai-completions", provider: "local-vllm",
76
+ baseUrl: "http://172.30.228.10:8000/v1", // 你的网关,结尾不带 /chat/completions
77
+ reasoning: true, input: ["text", "image"],
78
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
79
+ contextWindow: 262144, maxTokens: 4096,
80
+ };
81
+
82
+ // 2) 建 Runner(brain = 外部大脑;models = ref 目录)
83
+ const runner = new Runner({
84
+ brain: createOpenAIBrain(), // 直连 model.baseUrl
85
+ models: { qwen: model },
86
+ });
87
+
88
+ // 3) 跑一个任务
89
+ const res = await runner.runTask({
90
+ objective: "查 orders 表里华东区(East)的总销售额,并说出数字。",
91
+ model: "qwen",
92
+ sessionId: "chat-42", // 传则续聊,不传则新建
93
+ tools: [
94
+ createSqlTool({
95
+ allowTables: ["orders"],
96
+ query: pgQuery(readonlyPgPool), // 你的【只读】连接池
97
+ }),
98
+ ],
99
+ });
100
+
101
+ console.log(res.status); // "completed" | "blocked" | "failed" | "timeout"
102
+ console.log(res.result); // 最终文本
103
+ console.log(res.sessionId);// 用于下一轮续聊
104
+ ```
105
+
106
+ 流式版(OA 聊天框逐字输出)见 [§5](#5-流式事件协议sse);HTTP 服务见 [§4.10](#410-createtaskserver--http--sse-服务)。
107
+
108
+ ---
109
+
110
+ ## 3. 核心概念
111
+
112
+ | 概念 | 是什么 | 对应类型/函数 |
113
+ |------|--------|--------------|
114
+ | **Brain(大脑)** | 外部 LLM。一个流式补全函数。你提供它,全局共用。 | `Brain` / `createOpenAIBrain` |
115
+ | **Task(任务)** | 一次自带全套配置的运行单元(模型/提示/工具/MCP/skill/限额)。 | `TaskSpec` → `TaskResult` |
116
+ | **Runner** | 持有 brain + 模型目录 + 内存 session 仓库;执行任务。 | `Runner` |
117
+ | **Session** | 一段对话的工作记忆。**内存**存储,传同一个 `sessionId` 即续聊。 | `TtlSessionStore` |
118
+ | **Tool(工具)** | 模型能调用的原生函数(typebox 参数 + execute)。 | `defineTool` / `ToolSpec` |
119
+ | **MCP** | 任务级临时连接的 MCP server,工具被 materialize,跑完断开。 | `materializeMcpTools` / `McpServerSpec` |
120
+ | **ExecutionEnv** | "在哪执行 shell/文件"的抽象。本包默认 stub(不需要 shell)。 | `StubExecutionEnv` |
121
+
122
+ **一句话数据流**:`TaskSpec` →(Runner 装配 harness:注入 brain、工具、内存 session)→ agent 循环(模型↔工具)→ 自动压缩 → `TaskResult`。
123
+
124
+ ---
125
+
126
+ ## 4. API 参考
127
+
128
+ 所有导出见 `src/index.ts`。下面是确切签名与语义。
129
+
130
+ ### 4.1 `Runner`
131
+
132
+ ```ts
133
+ class Runner {
134
+ constructor(deps: RunnerDeps); // 含可选 sessionStore(持久化见 §4.11)
135
+ readonly sessions: SessionStore;
136
+
137
+ runTask(spec: TaskSpec): Promise<TaskResult>;
138
+ runTaskStream(spec: TaskSpec): TaskStream; // AsyncIterable<TaskEvent> & { result(): Promise<TaskResult> }
139
+ }
140
+
141
+ interface RunnerDeps {
142
+ brain: Brain;
143
+ models?: Record<string, Model>; // 解析字符串 ModelRef 用
144
+ roles?: ModelRoles; // 角色→模型默认表(见 §4.12)
145
+ sessionStore?: SessionStore; // 持久化会话(见 §4.11)
146
+ // … memoryStore / promptProvider / toolPolicy / allowImageUrl / onError
147
+ }
148
+
149
+ // 便捷一次性:runTask(spec, deps) —— 内部建临时 Runner
150
+ function runTask(spec: TaskSpec, deps: RunnerDeps): Promise<TaskResult>;
151
+ ```
152
+
153
+ - `runTask` = 跑到结束返回结果。`runTaskStream` = 边跑边吐事件、`.result()` 取最终结果。
154
+ - 同一个 `Runner` 实例共享内存 session 仓库(续聊、TTL 都在这里)。
155
+
156
+ ### 4.2 `TaskSpec`(任务输入)
157
+
158
+ ```ts
159
+ interface TaskSpec {
160
+ taskId?: string; // 缺省用 sessionId
161
+ objective: string; // ★ 本轮指令 / 用户消息
162
+ images?: ImageInput[]; // 图文输入(模型需支持 vision)
163
+ sessionId?: string; // 传=续聊;不传=新建(隔离)
164
+ model?: ModelRef; // "qwen" 这类 ref(查 RunnerDeps.models)或完整 Model 对象;省略则按 modelRole 解析(见 §4.12)
165
+ modelRole?: ModelRole; // model 省略时解析哪个角色,默认 "default"
166
+ roles?: ModelRoles; // 按任务/场景覆盖 RunnerDeps.roles
167
+ compactionModel?: ModelRef; // 压缩用的便宜模型(可选;不传则用 summarize 角色,若配置了)
168
+ thinking?: ThinkingLevel; // "off"|"minimal"|"low"|"medium"|"high"|"xhigh"|"max"
169
+ systemPrompt?: string; // 预设系统提示
170
+ tools?: ToolSpec[]; // 原生工具
171
+ mcp?: McpServerSpec[]; // 任务级 MCP(跑完即弃)
172
+ skills?: SkillSpec[]; // 任务级 skill(对象,不落盘)
173
+ limits?: { maxTurns?: number; timeoutSec?: number };
174
+ enableBlockedReport?: boolean; // 注入 report_blocked 工具,默认 true(见 §6/§7)
175
+ shellGate?: "off"|"always"|"classify"; // design/80 D-2:hands `bash` 的不可逆门控原则(见 §4.14/§7)。默认 "off"
176
+ signal?: AbortSignal; // 外部取消:abort 即停(取消 brain 请求 + 释放审批闸)
177
+ getApiKeyAndHeaders?: (model: Model) =>
178
+ Promise<{ apiKey: string; headers?: Record<string,string> } | undefined>;
179
+ }
180
+
181
+ type ImageInput =
182
+ | { data: string; mimeType: string } // base64(无 data: 前缀)
183
+ | { url: string }; // runner 端 fetch→base64
184
+
185
+ type ModelRef = string | Model;
186
+ ```
187
+
188
+ ### 4.3 `TaskResult`(任务输出,机器可读)
189
+
190
+ ```ts
191
+ interface TaskResult {
192
+ taskId: string;
193
+ sessionId: string; // ★ 下一轮续聊用
194
+ status: "completed" | "blocked" | "failed" | "timeout";
195
+ result: string; // 最终 assistant 文本(已 trim)
196
+ blockedReason?: string; // status==="blocked" 时:为何卡住
197
+ errorMessage?: string; // status==="failed"/"timeout" 时
198
+ stats: {
199
+ turns: number; tokens: number; costUsd?: number;
200
+ promptTokens?: number; // 跨 provider 归一的输入 token(命中率分母)
201
+ cachedTokens?: number; // 前缀缓存命中的 token
202
+ cacheWriteTokens?: number; // 写入缓存的 token(Anthropic cache_creation)
203
+ cacheHitRate?: number; // cachedTokens/promptTokens ∈[0,1],成本关键,按会话趋势监控
204
+ nested?: { tokens; turns; tasks; costUsd? }; // 子 agent 委派用量
205
+ costBreakdown?: { // design/80 D-E-core:LLM 派生成本的财务分类(micro-USD),供监督面分摊
206
+ llmRootMicroUsd; // 根 agent LLM 成本 = costMicroUsd − compactionMicroUsd
207
+ nestedSubagentMicroUsd; // 委派子 agent(nested)LLM 成本
208
+ memoryConsolidationMicroUsd; // 任务后记忆固化 LLM 成本(独立预算外行,异步补填)
209
+ compactionMicroUsd; // 任务内压缩 LLM 成本(含在 costMicroUsd 内)
210
+ }; // 恒等式:llmRoot+nestedSubagent+compaction === costMicroUsd(infra 轴由 service 补)
211
+ };
212
+ }
213
+ ```
214
+ > **缓存可观测**:`cacheHitRate` 是前缀缓存命中率(成本命脉)。多轮任务(≥2)+ 大提示(≥8000 token)+ 命中 <15%
215
+ > 时,core 经 `onError({ phase:"prompt-cache" })` **告警**(前缀不稳/被污染的信号);单轮冷启动不会误报。
216
+ > 按任务记录 `cacheHitRate`、按 `sessionId` 聚合成趋势即可做你们的成本看板/告警。
217
+ > - **命中率分母按 `model.api` 自动判 family**(Anthropic 的 input 不含缓存、OpenAI 含)。若你**按 provider 路由、
218
+ > `model.api` 与实际 brain 不符**(会导致命中率 >100%),用 `model.params.promptCacheFamily =
219
+ > "input-includes-cached"|"input-excludes-cached"`(别名 `"openai"`/`"anthropic"`)**显式覆盖**;core 还会在
220
+ > `cachedTokens>promptTokens` 时 clamp 到 1 并经 `onError` 报错,不会给你荒谬值。
221
+
222
+ 状态判定见 [§6](#6-任务状态语义)。
223
+
224
+ ### 4.4 `Brain` 与 `createOpenAIBrain`
225
+
226
+ ```ts
227
+ interface Brain {
228
+ stream: StreamFn; // 流式补全(核心)
229
+ complete?: (model, ctx, options?) => Promise<...>; // 非流式;缺省由 stream 派生
230
+ }
231
+
232
+ function createOpenAIBrain(config?: OpenAIBrainConfig): Brain;
233
+
234
+ interface OpenAIBrainConfig {
235
+ baseUrl?: string; // 缺省用 model.baseUrl
236
+ apiKey?: string; // 被 options.apiKey / getApiKeyAndHeaders 覆盖
237
+ headers?: Record<string, string>;
238
+ fetchImpl?: typeof fetch; // 测试/代理用
239
+ maxRetries?: number; // 瞬时失败(网络/5xx/429)重试,默认 2;流开始后不重试,abort 不重试
240
+ retryDelayMs?: number; // 退避基数,默认 400(指数:base*2^attempt)
241
+ replayThinking?: boolean; // 回灌 assistant reasoning_content(DeepSeek V4 等需要;R1/多数不要)。默认关
242
+ connectTimeoutMs?: number; // 建连超时:fetch 未在时限内返回响应头 → 可重试的 [network]。默认关
243
+ firstTokenTimeoutMs?: number; // 首-token 超时:SSE 已开但迟迟不吐第一个 delta → cancel + [network]。默认关
244
+ }
245
+ ```
246
+
247
+ > 网关偶发抖动(5xx/429/连接重置)会被自动重试(仅在响应体开始流式之前)。4xx 不重试,abort 不重试。
248
+
249
+ > **分级超时(1.38.1)**:任务级 `timeoutSec` 之下补两级 brain 超时(`OpenAIBrainConfig`/`AnthropicBrainConfig`
250
+ > 共有的 `BrainTimeoutConfig`,默认关)。`connectTimeoutMs` 管"建连"(`fetch` 返回响应头前),`firstTokenTimeoutMs`
251
+ > 管"首字"(SSE 已开但网关 hang、迟迟不吐 delta —— 最常见的故障症状),两者超时都记为**可重试的 `[network]`**,
252
+ > 自动走重试 / 断路器 / failover;total 仍由 `timeoutSec` 兜底。**reasoning 模型的首个 thinking delta 也算首 token**,
253
+ > 长思考模型不会因"迟迟不出可见字"被误杀。
254
+
255
+ `createOpenAIBrain` 把统一上下文翻译成 OpenAI `/chat/completions` 请求,并把流式响应(含 **native 工具调用增量**、
256
+ `delta.reasoning`/`reasoning_content` 思考流、图片多模态)翻译回统一事件协议。**这是模型兼容性的核心**——覆盖
257
+ Qwen / Gemini / DeepSeek / GPT / OpenRouter 等所有 OpenAI 兼容网关。要接非 OpenAI 协议的网关,自己实现一个 `Brain`。
258
+
259
+ > **思考模式(reasoning)按 provider 不同**:有的 provider(DeepSeek V4)在 assistant 工具调用轮**要求回灌** reasoning,
260
+ > 否则报错/降级;有的(DeepSeek R1、多数)要丢掉。用 `replayThinking` 开关(默认丢)。截断的工具参数(`finish_reason:"length"`)
261
+ > 不会再被静默当 `{}` 执行——会以 `errorMessage` 暴露,调用方可重试。
262
+
263
+ ### Anthropic 大脑(云 API):`createAnthropicBrain`
264
+
265
+ 接 Anthropic Messages API(`/v1/messages`),给**云部署**用(不止本地 vLLM)。同一 `Brain` 契约,直接进 Runner,
266
+ 和 failover/routing 组合(**云 Anthropic ↔ 本地 vLLM** 路由/兜底)。
267
+
268
+ ```ts
269
+ import { createAnthropicBrain, createRoutingBrain, createOpenAIBrain } from "@sema-ai/core";
270
+
271
+ const brain = createRoutingBrain(
272
+ { anthropic: createAnthropicBrain({ apiKey: process.env.ANTHROPIC_API_KEY }),
273
+ "local-vllm": createOpenAIBrain() },
274
+ { by: "provider", fallback: "local-vllm" },
275
+ );
276
+ ```
277
+ - **提示词缓存**:`cache_control:{type:"ephemeral"}` 断点打在 system 块 + 最后一个工具(照 Claude Code);
278
+ `cache_read/creation_input_tokens` → `usage.cacheRead/cacheWrite` → `TaskResult.stats.cachedTokens` **真实命中可见**。`cacheBreakpoints` 开关。
279
+ - **extended thinking + tool use**:thinking 块带 `signature` 捕获并**回灌**(Anthropic 硬要求)。
280
+ 思考预算 `budget_tokens` 自动钳到 `1024 ≤ budget < max_tokens`(否则 Anthropic 422);`max_tokens`
281
+ 太小时上调到能容纳"最小思考预算 + 回答余量"。用 `thinkingBudgetShare`(占 `max_tokens` 的比例,默认 0.5)
282
+ 或 `thinkingBudgetTokens`(固定值)给爱长思考的模型(如 deepseek-v4-pro)**留足回答空间**。
283
+ - **截断即报错,不再空成功**:`max_tokens`/`length` 截断且**没产出任何回答文本**(思考吃光预算)时,
284
+ turn 以 `stopReason:"error"` + 清晰 `errorMessage` 收尾(OpenAI/Anthropic 两条路一致),不再伪装成 `completed`。
285
+ 截断的 `tool_use` 参数 JSON 同理:不带空参执行,直接报错暴露。
286
+ - 真机验证脚本:`ANTHROPIC_API_KEY=… npx tsx src/examples/anthropic-live.ts`(连跑两遍看第二遍 `cachedTokens`>0)。
287
+
288
+ > **前缀缓存对成本极关键**(见 `design/09`):提示词排版 STABLE→VARIABLE(稳定 base 在前、记忆在尾),时间戳/当前日期/id
289
+ > **绝不进前缀**,工具顺序要稳定。core 1.12 修了默认 prompt 排序;`stats.cachedTokens` + 离线 cache-guard 测试量化命中率。
290
+
291
+ **多网关故障转移**:`createFailoverBrain([primary, backup, …])` 把多个 brain 组合成主备。正常路径实时流式;
292
+ 仅当某 brain **在吐任何内容之前**就失败(如网关挂)才切到下一个(不会出现重复 start/文本)。每个 brain 各自保留重试策略。
293
+ ```ts
294
+ const brain = createFailoverBrain([
295
+ createOpenAIBrain({ baseUrl: PRIMARY }),
296
+ createOpenAIBrain({ baseUrl: BACKUP }),
297
+ ]);
298
+ ```
299
+
300
+ ### 4.5 `defineTool` / `ToolSpec`
301
+
302
+ ```ts
303
+ interface ToolSpec<TParams extends TSchema = TSchema> {
304
+ name: string;
305
+ aliases?: string[]; // 旧 wire 名兼容;新工具调用应使用 name
306
+ description: string; // 模型据此决定何时调用——写清楚
307
+ label?: string;
308
+ parameters: TParams; // typebox schema(Type.Object({...}))
309
+ execute: (args: unknown, ctx: ToolExecuteContext) => Promise<ToolReturn> | ToolReturn;
310
+ }
311
+ interface ToolExecuteContext { toolCallId: string; signal?: AbortSignal }
312
+ type ToolReturn =
313
+ | string // 文本结果
314
+ | { content: Array<TextContent|ImageContent> | string; details?: unknown; terminate?: boolean };
315
+
316
+ function defineTool(spec: ToolSpec): AgentTool; // ToolSpec 也可直接放进 TaskSpec.tools(内部会转)
317
+ ```
318
+
319
+ - `parameters` 用 typebox。模型看到的是它序列化出的 JSON Schema。
320
+ - `execute` 抛异常 = 工具失败(循环会把错误编码成工具结果让模型看到,不会 crash 任务)。
321
+ - `terminate: true` = 提示 agent 本轮工具批次后停止。
322
+
323
+ > 注意:`TaskSpec.tools` 接受的就是 `ToolSpec[]`,无需手动 `defineTool`(Runner 内部转)。`defineTool` 用于你想拿到底层 `AgentTool`(如包一层)。
324
+
325
+ ### 4.6 SQL 工具:`createSqlTool` + 适配器
326
+
327
+ ```ts
328
+ function createSqlTool(opts: SqlToolOptions): ToolSpec;
329
+ interface SqlToolOptions {
330
+ query: (sql: string) => Promise<unknown[]>; // ★ 你注入【只读】执行器
331
+ allowTables?: string[]; // 表白名单(大小写不敏感)
332
+ maxRows?: number; // 返回给模型的行上限,默认 100
333
+ name?: string; // 默认 "query_sql"
334
+ description?: string;
335
+ }
336
+ function validateReadOnlySql(sql: string, allowTables?: string[]): void; // 单独可用;非法则 throw
337
+
338
+ // 适配器(零依赖,结构化类型;你传已建好的【只读】客户端)
339
+ function pgQuery(pool): (sql:string)=>Promise<unknown[]>; // node-postgres
340
+ function mysqlQuery(conn): (sql:string)=>Promise<unknown[]>; // mysql2/promise(也用于 TiDB)
341
+ function sqliteQuery(db): (sql:string)=>Promise<unknown[]>; // better-sqlite3
342
+ ```
343
+
344
+ > **TiDB**:TiDB 是 MySQL 线协议兼容的,直接用 `mysql2` 建一个**只读**连接池指向 TiDB,
345
+ > 再 `createSqlTool({ query: mysqlQuery(pool), allowTables: [...] })`。例:
346
+ > ```ts
347
+ > import mysql from "mysql2/promise";
348
+ > const pool = mysql.createPool({ host, port: 4000, user: READONLY_USER, password, database });
349
+ > const tool = createSqlTool({ query: mysqlQuery(pool), allowTables: ["orders"], maxRows: 200 });
350
+ > ```
351
+ > 务必用只读账号;TiDB 可按用户授予 `SELECT`-only 权限作为第一层保证。
352
+
353
+ 安全分层(详见 [§7](#7-安全模型必读)):①只读 DB 凭据(你的责任)②静态校验(仅 SELECT/WITH、拒多语句/注释/DML-DDL/`INTO`)③表白名单 ④行上限。
354
+
355
+ ### 4.7 Gitea Issue 工具:`createGiteaIssueTool`
356
+
357
+ 让 agent **给维护者开 Gitea issue**(报 bug / 提需求)。按场景注入,仓库/鉴权/默认标签由 config 固定,模型只选 `title`/`body`:
358
+ ```ts
359
+ import { createGiteaIssueTool } from "@sema-ai/core";
360
+ const issueTool = createGiteaIssueTool({
361
+ baseUrl: "http://git.zhenbs.com:9999",
362
+ owner: "AI-Only", repo: "sema-core",
363
+ token: process.env.GITEA_ISSUE_TOKEN!, // ★ 从环境变量取,绝不硬编码/提交
364
+ defaultLabels: [/* Gitea 数字 label ID */], // 给所有 AI 开的 issue 打标
365
+ });
366
+ runner.runTask({ objective, model, tools: [issueTool] });
367
+ ```
368
+ - `effect:"write"`(非幂等:每次开新 issue,中断**不自动重试**,避免重复 issue)。
369
+ - token **只进 `Authorization` 头**,不进 body、不进任何返回/日志文本。
370
+ - 失败(HTTP 4xx/5xx、网络)返回**可恢复的工具结果**(非抛错),模型可重试或 `report_blocked`。
371
+ - 可选 `allowModelLabels` 让模型自带 label ID(与 `defaultLabels` 合并去重)。
372
+
373
+ ### 4.7 MCP:`materializeMcpTools`
374
+
375
+ ```ts
376
+ function materializeMcpTools(specs: McpServerSpec[]): Promise<MaterializedMcp>;
377
+ interface MaterializedMcp { tools: AgentTool[]; dispose: () => Promise<void> }
378
+
379
+ type McpServerSpec = {
380
+ name: string; // 工具会被命名空间化为 `<name>__<tool>`
381
+ transport:
382
+ | { kind: "stdio"; command: string; args?: string[]; env?: Record<string,string> }
383
+ | { kind: "http"; url: string; headers?: Record<string,string> };
384
+ allowTools?: string[]; // 仅暴露这些工具
385
+ };
386
+ ```
387
+
388
+ 通常**不用直接调**:把 `McpServerSpec[]` 放进 `TaskSpec.mcp`,Runner 会在任务开始时连接、materialize 成工具,
389
+ 任务结束 `dispose()` 断开。MCP 工具的 `inputSchema`(JSON Schema) 直接作为参数 schema,模型看到真实结构、循环原生校验。
390
+
391
+ ### 4.8 `createSubagentTool`(委派)
392
+
393
+ 见 [§8](#8-多-agentsubagent-与-team)。
394
+
395
+ ### 4.9 `runTeamDiscussion`(多 agent 讨论)
396
+
397
+ 见 [§8](#8-多-agentsubagent-与-team)。
398
+
399
+ ### 4.10 `createTaskServer`(HTTP + SSE 服务)
400
+
401
+ ```ts
402
+ function createTaskServer(opts: TaskServerOptions): http.Server;
403
+ interface TaskServerOptions {
404
+ runner: Runner;
405
+ resolveSpec: (body: TaskRequestBody, req) => TaskSpec | Promise<TaskSpec>; // ★ 服务端注入 model/tools
406
+ authorize?: (req) => boolean | Promise<boolean>; // 返回 false → 401
407
+ corsOrigin?: string; // 如 "*"
408
+ maxBodyBytes?: number; // 默认 5 MiB
409
+ }
410
+ interface TaskRequestBody { objective: string; sessionId?: string; images?: ImageInput[]; [k:string]: unknown }
411
+ ```
412
+
413
+ 端点:
414
+ - `POST /task` → 跑到结束,返回 `TaskResult` JSON。
415
+ - `POST /task/stream` → SSE,逐条 `data: <TaskEvent JSON>\n\n`,`done` 事件后结束。
416
+
417
+ **关键安全设计**:请求体只带内容(objective/sessionId/images),**工具与模型由服务端 `resolveSpec` 注入**——
418
+ 因为工具的 `execute` 函数无法、也不应通过网络传输。前端/外部 AI 不能注入可执行工具。
419
+
420
+ ```ts
421
+ const server = createTaskServer({
422
+ runner,
423
+ corsOrigin: "https://oa.internal",
424
+ authorize: (req) => verify(req.headers.authorization),
425
+ resolveSpec: (body) => ({
426
+ objective: body.objective,
427
+ sessionId: body.sessionId,
428
+ images: body.images,
429
+ model: "qwen",
430
+ tools: [ createSqlTool({ allowTables: ["orders"], query: pgQuery(readonlyPool) }) ],
431
+ limits: { timeoutSec: 120 },
432
+ }),
433
+ });
434
+ server.listen(8090);
435
+ ```
436
+
437
+ ### 4.11 `TtlSessionStore`
438
+
439
+ ```ts
440
+ class TtlSessionStore {
441
+ constructor(opts?: {
442
+ defaultTtlDays?: number; // 默认 7 天
443
+ sweepIntervalMs?: number;
444
+ repo?: SessionRepo; // ★ 注入【持久】会话仓 → 重启/多副本续话
445
+ evict?: "delete" | "forget"; // 空闲/release:删库 or 只清缓存(custom repo 默认 forget)
446
+ });
447
+ acquire(sessionId?: string): Promise<{ session: Session; sessionId: string }>;
448
+ touch(sessionId: string): void;
449
+ release(sessionId: string): Promise<void>; // 一次性任务跑完想立刻丢就调它
450
+ sweep(now?: number): void;
451
+ get size(): number;
452
+ dispose(): void; // 关定时器
453
+ }
454
+ ```
455
+
456
+ `Runner` 默认自带一个(内存,重启丢)。**持久化("会话中心"):** 给 `TtlSessionStore` 传一个 durable `SessionRepo`
457
+ (如 TiDB 后端),`acquire` 会经 `repo.open` **从事件日志续话**——任意无状态 runner 重启后、或另一副本都能接上同一对话;
458
+ custom repo 下 `evict` 默认 `"forget"`(空闲只清缓存、**不删库**)。完整实现契约(CAS 乐观锁、TiDB 表草图、两条路线)见
459
+ **`design/10-会话持久化与会话中心.md`**;`test/sessions.test.ts` 有 `DbSessionRepo`/`DbSessionStore` 真跑续话。
460
+ ```ts
461
+ new Runner({ brain, sessionStore: new TtlSessionStore({ repo: myTiDbSessionRepo }) }); // 持久、可横向扩
462
+ ```
463
+
464
+ ### 4.12 模型角色(`roles`)与 `@-model`
465
+
466
+ **角色表**:声明一次模型,主任务/压缩/子代理/team **各按角色解析**,不必每处重复模型名。角色:
467
+ `default`(主任务,`TaskSpec.model` 省略时用它)、`summarize`(压缩总结,= aider weak-model)、`subagent`、`team`、`synthesize`;
468
+ 带回退链(`summarize→default`、`synthesize→team→default`)。`TaskSpec.roles` **按任务/场景覆盖** `RunnerDeps.roles`。
469
+ ```ts
470
+ const runner = new Runner({
471
+ brain, models: { strong, cheap },
472
+ roles: { default: "strong", summarize: "cheap", subagent: "cheap" }, // 两行做成本分级
473
+ });
474
+ runner.runTask({ objective }); // model 省略 → 走 default 角色
475
+ runner.runTask({ objective, roles: { default: "cheap" } }); // 本任务/场景覆盖
476
+ createSubagentTool({ runner }); // 无 model → subagent 角色(→ default)
477
+ ```
478
+ - `RoleSpec` 可是 `ModelRef`,也可 `{ model, thinking }` —— 角色还能带**默认 thinking 档**(显式 `TaskSpec.thinking` 仍胜)。
479
+ - 压缩:`compactionModel` 显式 > `summarize` 角色(若配置)> 主模型(不变)。
480
+ - 设计/调研(含 aider/Claude Code/LiteLLM/RouteLLM 对照、能力角色与 Layer 2 规划)见 **`design/11-模型路由与选择层.md`**。
481
+ - **两轴一起的真机示例**:`src/examples/deepseek-routing-roles.ts` —— 一个 Runner 里 `createRoutingBrain` 按 `provider`
482
+ 路由到 DeepSeek 的 Anthropic(`/v1/messages`)与 OpenAI(`/chat/completions`)两条传输,叠加 `roles` 把 pro/flash 分工
483
+ (父任务走 pro/Anthropic、子代理走 flash/OpenAI)。`DEEPSEEK_API_KEY=… npx tsx src/examples/deepseek-routing-roles.ts`。
484
+
485
+ **`@-model`**(聊天框内联选模型):`parseModelMention(text, allowedNames)` → `{ model?, cleanedText }`。
486
+ **只返回 allowlist 内的名字、绝不内联 Model 对象**——终端用户能选*哪个已配置模型*,但注入不了任意 `baseUrl`/`apiKey`(安全边界)。
487
+ ```ts
488
+ const { model, cleanedText } = parseModelMention(userMsg, Object.keys(deps.models));
489
+ runner.runTask({ objective: cleanedText, model }); // model 为空则回落 default 角色
490
+ ```
491
+
492
+ ### 4.13 老师模式:`runWithTeacher`(便宜学生 + 强老师升级)
493
+
494
+ **便宜小模型干主要活,卡住/答错才请教强"老师"**(escalation cascade,见 `design/12`/`design/13`)。
495
+ 配 `roles: { default: 便宜学生, advisor: 强老师 }`,跑 `runWithTeacher`:
496
+
497
+ > **适用前提:任务要有"可判定的 verify 信号"**——升级只在能判断学生答错时才触发(Tier 0 同工具+同错卡住 / Tier 1 终态 rubric 质检 / `blocked`/`failed` 终态)。**不适用于开放式"完整性/质量"判断**(如 code-review"找全 bug"、创意质量):没有 oracle 知道"该有几个、漏了哪个",学生找到一个明显问题就过 verifier、却静默漏掉其余,触发机制空转(verifier 纯增本)。这类任务靠**广度 + 对抗(`team` council/debate)**而非**深度升级**——两者正交。亦提醒:**小而明确的任务上"强模型"未必更贵**(强模型输出简洁、弱模型啰嗦),"便宜学生省钱"在小任务上前提会被削弱。(service 实测反馈,2026-06,详见 `design/12` §六)
498
+ ```ts
499
+ const r = await runWithTeacher(runner, { objective, tools }, {
500
+ // 全部可选,下面是默认值
501
+ maxEscalations: 3, // 每次运行最多升级几次
502
+ teacherSpendRatioCap: 0.4, // 老师花费 ≤ 学生花费 × 此比例就停(止损)
503
+ stuckThreshold: 3, // 同一工具连续失败几次算"卡住"
504
+ verifyOutput: true, // 终态产出过一次"便宜模型 + rubric"语义质检
505
+ takeoverAfter: 2, // 纠正再失败几次 → 老师直接接管
506
+ });
507
+ console.log(r.status, r.result, r.escalations, r.teacherStats); // teacherStats={tokens,tasks,costUsd}
508
+ ```
509
+ - **两层触发**:Tier 0 —— 重复同工具失败 → **提前中止止损**(可选便宜 stuck-monitor 二次确认);Tier 1 —— **语义 rubric 质检**(便宜模型)抓"通过了但语义错"(纯确定性触发的盲区);外加 `blocked`/`failed` 终态。
510
+ - **老师 = 隔离的 `advisor` 角色子运行**,只回 JSON `{strategy,correction,nextStep,takeover,confidence}`;**对话丢弃、只把结构化建议注回同一学生 session**(护前缀缓存),并要求学生**先用工具输出核验建议再照做**。
511
+ - **纠正→接管**:纠正多次仍不行(或 `takeover:true`)→ 老师直接做完。
512
+ - **硬护栏**:升级上限、老师/学生花费比、老师每次 ≤4 turn;全程接 `studentSpec.signal`。
513
+ - `r.escalations`(每次升级的 trigger/建议/是否接管)+ `r.teacherStats`(老师用量 `{tokens,tasks,costUsd}`,与学生 `stats` 分开)。
514
+ - 老师/helper 未配 advisor 角色时**优雅退化**到学生模型(escalation 退化为"带结构化指导重试")。真机已验(DeepSeek flash 学生 / pro 老师,pro 返回的 JSON 建议解析正常)。
515
+ - **策略仓库(可选,二期 design/14)**:配 `strategyStore` + `scope` 后,老师"奏效的通用策略"会被存下,后续**相似问题**把策略注入学生 objective(前缀缓存安全),省得再请教老师(跨会话复用)。`scope` **强制隔离**(多租户不串)。检索**高精度低召回**(每个有意义词都要命中),注入带"过去*不同*任务、可能不适用、请核验"的否定前言。`new InMemoryStrategyStore()` 默认实现;可换 TiDB/embedding 后端。
516
+ ```ts
517
+ const store = new InMemoryStrategyStore();
518
+ runWithTeacher(runner, spec, { strategyStore: store, scope: "user:42" });
519
+ ```
520
+ - **触发可调**:Tier 0 卡住检测按"同工具+**同错误**"计数(变错=进展);`escalationPolicy` 可**否决**某次升级(独立监测解耦);`verifierSamples` 让 rubric verifier 多数表决(校准)。硬护栏:`maxEscalations`、`teacherSpendRatioCap`(老师 token ≤ 学生×此比例;老师远贵于学生时调大)、老师每次 ≤4 turn。
521
+ - **真机示例**:`src/examples/teacher-mode.ts`(DeepSeek flash 学生 / pro 老师 + 策略仓库):`DEEPSEEK_API_KEY=… npx tsx src/examples/teacher-mode.ts`。
522
+
523
+ ### 4.14 Supervisor 公共面(design/80 人在环监督式编排,core 侧已 shipped 至 1.104.0;已封顶降为基座)
524
+
525
+ design/80 给"人在环监督式编排"加了一组 **durable-checkpoint substrate** 公共面。**全部 ADDITIVE / 多数 INERT**——
526
+ core 只**铸造/附带**这些字段,**从不**用它们去 gate / 限额 / 抑制(结构性 ask 经 `combinePolicies` 严格胜出);由
527
+ profile / 监督面 / 部署侧去**读取并据此编排**。新增公共面如下(导出件全在 `src/index.ts`):
528
+
529
+ **① `ToolCallRequest.budget`(只读 durable 预算快照)** —— 让**无状态** `ToolPolicy.check(req)` 能针对**跨 suspend/resume
530
+ 存活**的预算自限(进程内计数器每段会清零=监督升级预算缺口)。core 在 prepare 期从 durable 资源账本 + suspend 链构造,
531
+ **策略无法写回放宽**:
532
+ ```ts
533
+ req.budget?: {
534
+ resourceRemainingMicroUsd?: number; // 本 run 还可花的 durable $(micro-USD);undefined=无上限。
535
+ // ⚠️ 绝不 falsy-test:0=已耗尽 ≠ 无上限(只有 undefined 才是无上限)
536
+ resourceSpentMicroUsd: number; // 跨所有 leg 累计已花 $(micro-USD)
537
+ suspendCount: number; // 本 run 已 suspend 次数(durable 链);策略可随链增长收紧
538
+ }
539
+ ```
540
+ > SAFETY ask(egress / 不可逆)**永远忽略 budget、永远 ask**(不变量结构性保住,core 对安全工具照铸 `irreversible_ask`)。
541
+
542
+ **② `CheckpointGate.riskDescriptor`(监督收件箱分诊元数据,INERT)** —— 铸造在 `human` / `irreversible_ask` 升级门上的
543
+ **确定性、已脱敏**风险摘要,让监督收件箱无需重算风险即可按真严重度排序/分诊:
544
+ ```ts
545
+ riskDescriptor?: {
546
+ severity: 1|2|3|4|5; // ToolEmu 风格分层(5 最严重),收件箱按此降序排。= riskSeverity(axes) 的纯函数
547
+ axes: { egress?: boolean; irreversible?: boolean; shell?: boolean }; // 触发的安全轴;{} = 纯可预算 human ask
548
+ toolName: string;
549
+ summary?: string; // 单行已脱敏预览(经 inlineUntrusted + 长度截断;绝不含原始密钥/全参/env)
550
+ touchedPaths?: string[]; // fs 工具 path 参数(best-effort,每条 inlineUntrusted 截断;shell 不解析)
551
+ };
552
+ ```
553
+ > INERT(trace 验证):core 从不读它去 gate/限额/抑制。`summary`/`touchedPaths` 经脱敏硬化——所有模型可控值过
554
+ > `inlineUntrusted` + 码点上限,只摘**顶层 DATA 属性标量**(嵌套对象/数组/getter 永不进收件箱),`buildRiskDescriptor`
555
+ > **结构上 TOTAL**(对抗性 / 被 hook 改写的 args 都不会让铸造崩溃或让显示输出变化)。
556
+
557
+ **③ 新增门类(`CheckpointGate.kind`)与 `ResumeOutcome` arm**:
558
+ - `irreversible_ask`(design/80 D-2):安全 mint-site ask,带 `safetyAxis { egress?, irreversible? }`(来自工具**静态** spec 标记
559
+ `ToolSpec.egress` / `ToolSpec.irreversibility`,非可伪造的 per-call decisionReason)+ 可选 `riskDescriptor`。**非可预算**——
560
+ budget 解析器对它永不自动批准。
561
+ - `plan_review`(design/80 D-B):**动作前**计划评审门(distinct kind,非复用 `resource_limit` 占位)。**没有待裁决的工具**——
562
+ 人评审的是**计划**而非工具调用,故此 arm **无 tool 字段**;`ResumeOutcome` 有对应 `{ kind: "plan_review" }` arm。**每个读
563
+ `tool_approval` 字段的消费者都必须先 branch on `kind`**(契约测试钉死),计划工件本身是 profile 关注(REF)。
564
+
565
+ **④ `pendingSteer`(durable steering on a paused checkpoint)** —— 监督者可在一个**已暂停的 checkpoint** 上 park 一条
566
+ 转向指令,resume 时注入(runtask)。`Checkpoint.state.pendingSteer { text: string; trusted: boolean }`;`trusted` 在
567
+ `setPendingSteer` 时从 service 的已验证 principal 检查**冻结**(operator 角色)。脏内容在 `setPendingSteer` 即被拒
568
+ (typed `steering.invalid_content`)。CheckpointStore 新增 `setPendingSteer(...)` 方法 + 导出 `validatePendingSteer(steer)`
569
+ (每个 impl 在持久化前都跑的同一套校验)。**last-writer-wins**;只写 `state.pendingSteer`,绝不动 status / 审批通道。
570
+
571
+ **⑤ `AskUserQuestion`(模型可调的结构化提问合成工具)** —— 让 agent 向**用户**提一个结构化问题。
572
+ `createAskUserQuestionTool(onQuestion?)`,工具名固定为 `"AskUserQuestion"`(内部常量 `ASK_USER_QUESTION_TOOL_NAME`,未从根导出)。
573
+ durable 模式下一次提问会**durably suspend** 任务(在工具执行前),由部署侧路由到真人/UI、答完 resume。配套导出:
574
+ `createDurableQuestionPolicy`、`QUESTION_AWAITS_RESUME` 及类型 `OnQuestion`/`AskQuestion`/`AskQuestionOption`/
575
+ `AskQuestionRequest`/`QuestionAnswer`/`QuestionAnswerItem`。无 live human 时工具仍挂载、返回 placeholder。
576
+
577
+ **⑥ 导出的辅助函数 + `Checkpoint.deadline` D-D 契约**:
578
+ - `riskSeverity(axes)` → `1|2|3|4|5`:纯函数(无 LLM / 无 clock / 无 random),收件箱排序的稳定 key。规则:
579
+ 不可逆+egress→**5** / 仅不可逆→**4** / 仅 egress→**3** / shell-gated tighten→**3** / 纯 human ask→**2**。
580
+ - `buildRiskDescriptor(input)` → `RiskDescriptor`:在门铸造处由 D-2 `safetyAxis` + shell-gate 上下文 + **SHOWN** 工具参数
581
+ 确定性派生,TOTAL by construction。
582
+ - `Checkpoint.deadline`(epoch-ms)承载 **§D-D 过期语义契约**(写在该字段 + `CheckpointStore` 接口的文档上):FACET A
583
+ 审批门=`deadline` 是 SLA resolve-deny 时间 + 更晚的 `terminalAt` 弃用 backstop;FACET B(`resource_limit`/`needs_review`/
584
+ `plan_review`)=`deadline` 是 abandonment-TTL,只过期/reap、**绝不** resolve-deny(否则 `gate_mismatch`)。**reaper 循环 +
585
+ gate.kind 策略 + 铸 `terminalAt` 都是部署侧(service)的活**;core 只保证 durable 字段(`deadline` + 持久化的 `gate.kind`)。
586
+ - (注:`isDurablePause(status)` 仍是 core 内部 helper、**未**从 `src/index.ts` 导出;监督 substrate 对外的辅助函数即上述
587
+ `riskSeverity` / `buildRiskDescriptor` / `validatePendingSteer`。)
588
+
589
+ > **何处用**:这是给**自建监督客户端**(steer box / 计划评审 / decision-with-token / riskDescriptor 收件箱渲染)与
590
+ > **service 编排**(durable 审批 + steering + plan-review + worker 自修复环)消费的 substrate。core 侧已 TOP OUT;§5 序列里
591
+ > 仍属 service 的有 D-G(direct-connect client principal 加密绑定,server 侧已建+双 council+canary e2e、激活待 M2)、
592
+ > D-C(leader 监督视图=seam 注记非实现切片)。完整保证/不保证边界见 [`docs/durability-boundary.md`](docs/durability-boundary.md)。
593
+
594
+ ### 4.15 CC-parity 编排 + 推理强度公共面(design/96/97/98,1.114–1.118;已封顶基座)
595
+
596
+ > 注:此后还 ship 了 **workflow-parity**(design/97 CORE-1~9,1.144~1.145:`runWorkflow`/`WorkflowRunContext` 的 steerable `agentStream`/`onWorkflowAgentSpawn` + worktree 隔离 + `WorkflowJournalStore` durable resume + per-agent activity)、**sema-shell 主权契约**(design/99 E1–E25:`tool_end.output`/`workspace_changed`/`status` 事件/`McpServerStatus`/`onElicit`/`SessionPolicyStore`)、**2c session-sync**(`SessionRepo.export/importEntries`/`FileSnapshotStore`/`StreamingImportValidator`)。这些新公共面的契约速查见 `docs/ARCHITECTURE.md` §4 能力矩阵 + `docs/SERVICE-INTEGRATION-GUIDE.md` §13/§14,完整签名以 `src/index.ts` 导出为准。
597
+ >
598
+ > 注(1.146~1.150):还 ship 了 **sema-shell 数据契约 MF-\***(引擎↔sema-shell `/workflows` monitor↔service 的可观测公共面):`TaskResult.stats.humanReview.gates[]`(MF-24 权限门/denial 账本,toolArg 经共享脱敏边界 `src/core/arg-summary.ts`)、`TaskEvent.task_progress`(MF-10 subagent usage tick,ephemeral)、`TaskResult.model`(MF-25 回声 effective/resolved model id)、`compacted.trigger`(MF-18)、`CheckpointSummary.contentKind`(MF-14)。这些数据契约的服务侧消费见 `docs/SERVICE-INTEGRATION-GUIDE.md`,完整签名以 `src/index.ts` 导出为准。
599
+
600
+ design/80 封顶后,主线转向 **CC-parity 编排 + 推理强度**。新增以下公开 API(导出件全在 `src/index.ts`):
601
+
602
+ **① Workflow 模式(`src/orchestration/workflow.ts`,design/97 S1)** —— **确定性脚本编排** thin helper,**非** LLM 动态
603
+ planner(脚本显式调 `ctx.parallel`/`ctx.pipeline`/`ctx.phase`/`ctx.agent`,而不是让模型自己规划 DAG)。
604
+ - `runWorkflow(script, deps, opts?)` → `Promise<RunWorkflowResult>`:跑一个 `(ctx: WorkflowRunContext) => Promise<...>` 脚本。
605
+ - `WorkflowRunContext` 方法:`agent(spec, opts?)`(跑一个记录在案的 agent-run,任何终态都不 throw)/ `parallel(thunks)`
606
+ (并发,**有 barrier**=等全部;throw 的 thunk 解析为 `null`)/ `pipeline(items, ...stages)`(每项独立流过各 stage,
607
+ **无 barrier**)/ `phase(title, body)`(可观测分组)/ `log(message)`(narrator 日志);只读字段 `runId` / `budget`。
608
+ - `WorkflowBudgetExceededError`:`opts.budget`(token 上限)耗尽时 `ctx.agent` 抛出。`MAX_WORKFLOW_ITEMS`=单次 `parallel`/
609
+ `pipeline` 的项数上限(对齐 CC Workflow 工具)。配套类型 `WorkflowRun`/`WorkflowEvent`/`WorkflowBudget`/`RunWorkflowOptions`/
610
+ `RunWorkflowResult` 等。
611
+
612
+ **② `/workflows` 可观测(`src/core/workflow-run-store.ts` + `src/orchestration/workflow-observe.ts`,S1b/S1c)** ——
613
+ 让 workflow run 进 `/workflows` 历史 + 跨副本可见(**opt-in**,无 store 仍跑+进程内可订阅;持久化 best-effort,store throw
614
+ 绝不破坏 workflow)。
615
+ - `WorkflowRunStore`(接口)+ `InMemoryWorkflowRunStore`(core 自带)+ `FileWorkflowRunStore`(`src/stores/file/workflow-run-store.ts`,
616
+ `FileWorkflowRunStoreOptions`)。**PG 归 service**(部署 persist 轴=部署外壳实现,不在 core)。
617
+ - `summarizeWorkflowRun(run)` → `WorkflowRunSummary`、`workflowRunStoreContract`(跨后端等价契约)、`isTerminalWorkflowStatus`、
618
+ `WorkflowRunStoreError`。
619
+ - 读取面:`listWorkflowRuns` / `getWorkflowRun` / `subscribeWorkflow`(`workflow-observe.ts`)。
620
+
621
+ **③ 推理强度(`src/brain/reasoning.ts`,design/96 S3/S5/S6)** —— 复用 vendor 7 档 `ThinkingLevel` 的 `ReasoningIntensity`
622
+ 抽象 + per-endpoint clamp + effective-intensity surfacing。
623
+ - `resolveReasoning(requested, endpoint)` → `ResolvedReasoning`(`{ requested, effective, graded, clamped, format, endpoint }`):
624
+ task 启动时由 runner 调用,发出 `reasoning.resolved` TraceEvent,让部署看到 tier 为何被降级(binary provider →`graded:false`)
625
+ 或被夹(effort-set cap →`clamped:true`)而非静默吞掉(§E honesty)。
626
+ - `resolveEffort(...)`(per-endpoint effort 档夹)、`reasoningBudgetShare` / `REASONING_BUDGET_SHARE`、`DEFAULT_EFFORT_LEVELS`、
627
+ `isThinkingLevel` / `rankOf` / `resolveBinary`;配套类型 `ReasoningIntensity`/`ResolvedReasoning`/`ReasoningResolution`/
628
+ `ReasoningFormat`。默认强度常量 `DEFAULT_REASONING_INTENSITY`(`src/scenarios/env.js`)。
629
+
630
+ **④ `CheckpointSummary` 新字段(`src/core/checkpoint-store.ts`,S1e)** —— 让 service inbox 一次投影即拿到展示所需,免 N+1 回取:
631
+ - `createdAt?`(epoch-ms 标量,checkpoint 创建时间,从 `Checkpoint.createdAt` 投影)。
632
+ - `toolInput?`:`tool_approval` 工具 args 的 **bounded raw 预览**(超过 `MAX_TOOL_INPUT_PREVIEW_CHARS=512` 字符截断 + `…` 标记)。
633
+ **ECHO-ONLY**(无 gate / CAS / resume 读它——同 `riskDescriptor` 的 INERT 不变量);**脱敏归 consumer**(core 只做长度
634
+ 上限,不替 consumer 决定 redaction 策略)。
635
+
636
+ **⑤ `tightenTaskSpec`(`src/core/tighten-task-spec.ts`,config-center §10,1.114.0)** —— **tighten-only** TaskSpec merge
637
+ 治理原语:把 `overrides` 层叠到 `base`,但**放松任何安全字段**(如把 `handsReadOnly` 从 `true` 降到 `false`、或两边冲突的
638
+ 不可合成字段)即 `throw TaskSpecTightenError`,而不是静默选边。两件导出:`tightenTaskSpec` + `TaskSpecTightenError`。
639
+
640
+ ---
641
+
642
+ ## 5. 流式事件协议(SSE)
643
+
644
+ `runTaskStream(spec)` 返回 `TaskStream`(`AsyncIterable<TaskEvent>` + `.result()`)。事件类型:
645
+
646
+ ```ts
647
+ type TaskEvent =
648
+ | { type: "text_delta"; delta: string } // 正文增量(推给前端逐字显示)
649
+ | { type: "reasoning_delta"; delta: string } // 思考增量(可折叠显示;不进最终结果)
650
+ | { type: "tool_start"; toolCallId: string; toolName: string; args: unknown }
651
+ | { type: "tool_end"; toolCallId: string; toolName: string; isError: boolean }
652
+ | { type: "turn_end" } // 一轮(assistant + 工具)结束
653
+ | { type: "compacted"; tokensBefore: number; trigger: "auto" | "manual"; preserved_segment?: { firstKeptEntryId: string } } // 压缩边界(preserved_segment = 保留尾起点的 entryId)
654
+ | { type: "message_committed"; entryId: string; role: "user" | "assistant" | "toolResult"; toolCallId?: string } // message-identity:刚持久化的消息→其 SessionTreeEntry id(消费者据此解析 preserved_segment)
655
+ | { type: "done"; result: TaskResult }; // 终止,携带最终结果
656
+ ```
657
+ > 注:内容类事件还各带一个 ephemeral `eventId`(uuidv7,§E2 message identity)+ 子代理运行时的 `parentToolCallId`。`message_committed`(message-identity Phase 1)在每条可渲染消息(user/assistant/toolResult)持久化后发出其稳定的 `entryId`(= `SessionTreeEntry.id`,与 `compacted.preserved_segment.firstKeptEntryId` / E18 `resumeAt` / E19 `rewindFiles` 同一 id 空间):消费者自建 `entryId→消息` 映射(tool result 用 `toolCallId` 关联、assistant/user 用流序),即可把 `firstKeptEntryId` 解析到「哪条渲染消息是压缩保留尾的起点」并画分隔线——无需 service 侧的 eventId↔entryId 旁路映射。
658
+
659
+ 前端消费(SSE):
660
+ ```ts
661
+ for await (const ev of runner.runTaskStream(spec)) {
662
+ if (ev.type === "reasoning_delta") ui.appendThinking(ev.delta);
663
+ if (ev.type === "text_delta") ui.appendAnswer(ev.delta);
664
+ if (ev.type === "tool_start") ui.showStatus(`调用 ${ev.toolName}…`);
665
+ if (ev.type === "done") ui.finalize(ev.result); // {status,result,blockedReason,sessionId,stats}
666
+ }
667
+ ```
668
+
669
+ `POST /task/stream` 把上面每个事件按 `data: <json>\n\n` 发出,语义一致。
670
+
671
+ ---
672
+
673
+ ## 6. 任务状态语义
674
+
675
+ `TaskResult.status` 的判定优先级(见 `assembleResult`):
676
+
677
+ | status | 触发 | 附带字段 |
678
+ |--------|------|----------|
679
+ | `timeout` | `limits.timeoutSec` 到点被 abort(或异常发生在超时后) | `errorMessage` |
680
+ | `failed` | 抛异常 / 模型 `stopReason:"error"` / 被 abort(非超时,如 `maxTurns`)/ 无 assistant 消息 | `errorMessage` |
681
+ | `blocked` | 模型调用了内置 `report_blocked` 工具 | `blockedReason`(模型给的理由) |
682
+ | `completed` | 正常结束(`stopReason:"stop"`/`"toolUse"` 收尾) | — |
683
+
684
+ `blocked` 是给"外部 AI 大脑"看的关键信号:当 agent 缺信息/缺权限/请求歧义无法继续时,它会调用 `report_blocked({reason})`,
685
+ 任务即以 `blocked` + `blockedReason` 返回。用 `enableBlockedReport: false` 可关掉该工具(则永远不会是 blocked)。
686
+
687
+ ---
688
+
689
+ ## 7. 安全模型(必读)
690
+
691
+ 本系统会让 LLM 调用你提供的工具、查你的库、连 MCP。务必在集成层守住边界:
692
+
693
+ 1. **工具只在服务端定义**。HTTP 层 (`createTaskServer`) 的请求体**不能**携带可执行工具——`execute` 是函数,不过网络。
694
+ 外部只传 `objective/sessionId/images`,`resolveSpec` 决定 model + tools。**不要**把任意工具集暴露给不可信调用方。
695
+ - **工具策略 / 写审批(ToolPolicy)**:用 `TaskSpec.toolPolicy` 或 `RunnerDeps.toolPolicy` 在**每次工具调用前**拦截。
696
+ ```ts
697
+ toolPolicy: createApprovalPolicy({
698
+ requireApproval: ["delete_order", "send_email"], // 高危写操作
699
+ approve: async (req) => await askOperator(req), // 人工确认(可 await);拒则模型收到拒绝、不执行
700
+ deny: ["drop_table"],
701
+ });
702
+ // 或 createAllowDenyPolicy({ allow:[...] }) / combinePolicies(...)
703
+ ```
704
+ 被拒的工具 `execute` **绝不执行**,模型拿到拒绝原因可继续或上报。`approve` 可 await 操作员决定(`limits.timeoutSec` 兜底)。
705
+ - **安全 ask 的结构性优先(design/80 D-2)**:被 `ToolSpec.egress`(外部写:push/开 PR/发送)或 `ToolSpec.irreversibility`(`always`/`maybe`)
706
+ 标记的工具,即便预算允许也**永远** ask——core 据**静态 spec 标记**(非可伪造的 per-call 值)铸 `irreversible_ask` 门并附
707
+ `safetyAxis`/`riskDescriptor`(见 §4.14);budget 解析器对它永不自动批准。`TaskSpec.shellGate`(`off`/`always`/`classify`)
708
+ 按部署原则门控 hands `bash`:`classify` 下可证 benign 的只读单命令自动放行,其余(写/egress/管道/未知)收紧到 ask。
709
+ **resume 必须重传 `shellGate`**(同 `toolPolicy`/`tools`),否则恢复后的后续 `bash` 不受门控。
710
+ 2. **SQL 只读是你的责任**。`createSqlTool` 的静态校验(仅 SELECT/WITH、拒多语句/注释/DML-DDL/`INTO`/危险关键字、表白名单、行上限)
711
+ 是**纵深防御**,不是唯一保证。**必须**用只读 DB 账号(`pgQuery(readonlyPool)`)。把 `allowTables` 收到最小集。
712
+ 3. **Prompt 注入防御**:用户输入与工具/MCP 返回的数据**是数据,不是指令**。本包内部已遵循此约定(subagent/team 的他人内容
713
+ 都以 `<statement>`/`<...>` 块"引用为数据")。你的工具返回、SQL 结果同理——不要让其中的文本被当成可执行指令。
714
+ 子 agent 的 handoff 报告也是"证据待核验",不能覆盖系统/用户策略。
715
+ 4. **执行环境**:默认 `StubExecutionEnv`(无 shell、无文件系统)。若将来需要真执行 shell,自己实现 `ExecutionEnv` 并施加沙箱;
716
+ 不要随便给不可信任务开 shell。
717
+ 5. **限额**:给每个任务设 `limits.timeoutSec` 和 `limits.maxTurns`,防失控循环与超长占用。
718
+ 6. **鉴权**:`createTaskServer({ authorize })` 必接;按 token/来源校验。`corsOrigin` 收紧到你的 OA 域名。
719
+ 7. **MCP**:任务级 MCP server 来自你的 `resolveSpec`(服务端),不要接受外部传入的任意 MCP 端点(可能是 SSRF/数据外泄面)。
720
+
721
+ ---
722
+
723
+ ## 8. 多 agent:subagent 与 team
724
+
725
+ > 两者都**显式告知模型**当前处于何种结构(subagent 的工具描述 + `SUBAGENT_SYSTEM_NOTE`;team 的角色提示块),
726
+ > 满足"需要显式提示说明"的要求。
727
+
728
+ ### 8.1 subagent(委派,单向)
729
+
730
+ 父任务把一个**自包含子任务**委派给隔离的子 agent;子在干净上下文里跑(看不到父对话),同步返回结构化报告。
731
+
732
+ ```ts
733
+ import { createSubagentTool, SUBAGENT_SYSTEM_NOTE } from "@sema-ai/core";
734
+
735
+ const subagent = createSubagentTool({
736
+ runner,
737
+ model: "qwen", // 子模型(可与父不同,如更便宜)
738
+ purpose: "隔离的检索/长任务/计算",
739
+ tools: [ /* 子可用的工具子集 */ ],
740
+ limits: { timeoutSec: 120 },
741
+ });
742
+
743
+ await runner.runTask({
744
+ objective: "把 X 的调研委派给子 agent,拿到结果后汇总。",
745
+ model: "qwen",
746
+ systemPrompt: SUBAGENT_SYSTEM_NOTE, // 可选:强化"你可以委派"的说明
747
+ tools: [subagent],
748
+ });
749
+ ```
750
+
751
+ 子 agent 通过工具 `Agent({ description, prompt, subagent_type? })` 调起(旧名 `Task` 仍作为 alias 兼容),返回给父的工具结果形如:
752
+ ```
753
+ [Sub-agent report · <taskName>]
754
+ status: completed
755
+ stats: turns=.. tokens=..
756
+
757
+ result:
758
+ <子的最终文本>
759
+
760
+ Verify this result before concluding. ...
761
+ ```
762
+ 父据此核验、续做或再委派。子默认 `enableBlockedReport: true`(子也能上报受阻)。
763
+
764
+ ### 8.2 team(多 agent 讨论 + 收敛)
765
+
766
+ N 个角色化成员多轮讨论,最后由 synthesizer 合成结论。
767
+
768
+ ```ts
769
+ import { runTeamDiscussion } from "@sema-ai/core";
770
+
771
+ const team = await runTeamDiscussion({
772
+ runner,
773
+ model: "qwen", // 默认模型(成员可各自覆盖)
774
+ topic: "MVP 用单体还是微服务?",
775
+ members: [
776
+ { role: "求快的实用派" },
777
+ { role: "可扩展性架构师", model: "qwen", systemPrompt: "你偏好长期可演进性。" },
778
+ ],
779
+ rounds: 2, // 默认 2
780
+ synthesizer: { role: "facilitator" },// 默认中立主持合成
781
+ onEvent: (e) => { /* member_start/member_end/synthesis_start/done */ },
782
+ limits: { timeoutSec: 120 },
783
+ });
784
+
785
+ team.conclusion; // 合成的最终结论
786
+ team.transcript; // [{ round, role, text }, ...] 全过程
787
+ team.stats; // { tokens, turns }
788
+ team.failures; // 重试后仍失败的成员/合成轮数(失败会显式标记 [unavailable: ...],不再静默)
789
+ ```
790
+
791
+ > 健壮性:某成员一轮失败(网关错误/空结果)会**自动重试一次**;仍失败则该发言标记为 `[unavailable: <status>]`
792
+ > 并计入 `failures`,不会静默变成空发言污染讨论。
793
+
794
+ 机制:每轮每个成员收到「`<team-discussion round=N your_role=X>` + 此前所有发言(以 `<statement>` 数据块引用)」,
795
+ 只从本角色视角发言;成员每轮无状态(共享 transcript 提供连续性),编排简单、隔离。
796
+
797
+ **subagent vs team**:subagent = 父→子单向"干活";team = 多成员互见多轮"讨论收敛"。
798
+
799
+ ---
800
+
801
+ ## 9. Session、内存化与自动压缩
802
+
803
+ - **内存化**:session 只在进程内存(`TtlSessionStore` 包 vendored `InMemorySessionRepo`)。**重启即丢**。
804
+ - **续聊**:传相同 `sessionId` → 复用该 session(带完整历史 + 模型/思考档位回放)。不传 → 新建隔离 session。
805
+ - **TTL 清理**:空闲 session 由 store 清理 —— 用 `TtlSessionStore({ defaultTtlDays })`(store 级,非 per-task)。一次性任务想立刻释放:`runner.sessions.release(sessionId)`。
806
+ - **自动压缩(零配置)**:每个任务结束后(idle 时)检查上下文 token,超阈值就用 LLM 生成结构化摘要替换旧历史
807
+ (默认 `reserveTokens 16384 / keepRecentTokens 20000`)。可用 `TaskSpec.compactionModel` 指定更便宜的压缩模型。
808
+ 压缩对前端透明;发生时流式会有一个 `{type:"compacted"}` 事件。
809
+ - **自动裁剪**:超长工具/shell 输出在 vendored 层截断(保留头尾)。
810
+ - **MCP / skill 不持久化**:它们是"任务配置"的一部分,每次随 `TaskSpec` 传入,跑完即弃——不进 session 历史。
811
+
812
+ ### 长期记忆(L2,跨会话)
813
+
814
+ session(L1) 是单段对话的工作记忆;**长期记忆(L2)** 让模型跨会话记住稳定的事实/偏好(用户/组织画像、约定)。
815
+ 对标 Anthropic memory tool / CodeWhale user-memory:模型用 `remember` 工具存"声明性事实",下次任务自动注入系统提示。
816
+
817
+ ```ts
818
+ import { Runner, InMemoryMemoryStore } from "@sema-ai/core";
819
+ const runner = new Runner({ brain, models, memoryStore: new InMemoryMemoryStore() }); // 生产用 TiDB 后端
820
+ const res = await runner.runTask({
821
+ objective, model: "qwen", sessionId: chatId,
822
+ memory: { scope: "user:42" }, // 开启;按用户/组织分租户
823
+ });
824
+ ```
825
+ 启用后:① 该 scope 的记忆作为 `<user_memory>` 块注入系统提示(稳定前缀);② 加一个 `remember` 工具(模型自存,
826
+ "durable 声明性事实,不存临时任务态")。后端 `MemoryStore` 可插拔(默认内存,生产实现 TiDB)。记忆是**事实不是命令**,
827
+ 用户当前请求永远优先。
828
+
829
+ ### 默认提示词 / harness 层
830
+
831
+ 不传 `systemPrompt` 时,任务用内置 **`DEFAULT_SYSTEM_PROMPT`**(通用 agent 纪律:真相/行动/验证/工具使用强制/权威层级,
832
+ harvested from CodeWhale Constitution, MIT)。传了 `systemPrompt` 则原样用(非破坏)。可用 `RunnerDeps.promptProvider`
833
+ 完全接管提示词组装;`DEFAULT_SYSTEM_PROMPT` 已导出供拼接你的领域提示。
834
+
835
+ > **⚠️ 自定义 promptProvider:用 `stableSystem`,别手工拼顺序。** 前缀缓存要求**稳定内容在前、易变内容(per-user
836
+ > memory / 时间戳 / id)在尾**;手工 `system()` 拼装很容易把 memory 放错(这个错从 core 一路继承到 service、OA)。
837
+ > 新口子让场景**只给稳定 base**,由 core 按纪律把 memory 追加到**最后**——结构上不可能摆错:
838
+ > ```ts
839
+ > // ✅ 推荐:只返回稳定 base,core 负责把 memory 放到最后
840
+ > const reviewer: PromptProvider = { stableSystem: ({ userSystemPrompt }) => `审查 harness…\n\n${userSystemPrompt ?? DEFAULT_SYSTEM_PROMPT}` };
841
+ > // ⛔ 旧式 system():你自己负责顺序(memory 必须放最后),Runner 会在放错时经 onError(phase:"prompt-cache") 报警
842
+ > ```
843
+ > - **`composeSystemPrompt(stable, memoryBlock?)`** — 把易变 memory 追加到尾的同一套纪律(core 内部就用它)。
844
+ > - **`assertPromptCacheFriendly(provider)`** / `analyzePromptCacheFriendliness(provider)` — 放进 CI/单测,
845
+ > 用两份只在 memory 处不同的提示词比对公共前缀,**自动揪出前缀污染**(任何把易变内容前置的写法,不止 memory)。
846
+ > `stableSystem` provider 永远安全(core 拥有尾部),恒过。
847
+ - **可调阈值**:`TaskSpec.compaction = { enabled?, reserveTokens?, keepRecentTokens?, instructions? }`。
848
+ `instructions` 会拼进摘要提示,用于**保住关键事实**(如 `"逐字保留所有代码/ID/名称/数字与用户显式指令"`)。
849
+ - **context-editing(工具结果清理,最轻)**:任务内上下文超窗口 ~70% 时,把**较旧 toolResult 的内容**替换成标记
850
+ (保留轮次结构、保最近 N 条)。**请求级、非破坏**——session 仍存全量。对标 Anthropic(单清理 +29%)。`clearStaleToolResults` 可单用。
851
+ - **任务内安全网(context guard)**:若清理后仍超(~85%),按滑动窗口裁剪(保留摘要+最近,绝不在 orphan toolResult 处开头),防顶爆。
852
+ - **空摘要保护**:若摘要模型返回空(网关抖动),**不会**用空摘要替换历史(避免上下文丢失),本轮跳过压缩。
853
+
854
+ > **触发时机**:自动压缩在**任务之间**(idle)与**任务内每个请求边界**(turn-boundary,1.88.0 起、默认开,
855
+ > `compaction.withinTask: false` 可关)都会触发;超长单任务(多日级)不再只靠 context guard 兜底。
856
+ > 内置防抖:连续压缩失败 3 次熔断、anti-thrash 再增长地板、病态配置自修复(`sanitizeCompactionSettings`)。
857
+ >
858
+ > ⚠️ **摘要质量取决于模型**。实测 Qwen3.5-35B(int4) 在**激进压缩**下会丢掉"很早之前、只提过一次、被大量无关内容淹没"的事实,
859
+ > 即便加了保留指令;split-turn 摘要也可能偏空。**这不是流程 bug**(流程正确性见单测),是模型摘要保真度的限制。
860
+ > OA 实践建议:① 用真实 256K 窗口(压缩极少触发,事实在原文里存活很久)② 调大 `keepRecentTokens`
861
+ > ③ 用更强的 `compactionModel` ④ 关键事实在对话中复述。`compaction.instructions` 能改善但不保证。
862
+
863
+ ---
864
+
865
+ ## 10. 模型网关接入
866
+
867
+ 默认 `createOpenAIBrain()` 走 `model.baseUrl + "/chat/completions"`,标准 OpenAI 兼容(vLLM/Ollama/各类网关都适用)。
868
+
869
+ 已验证网关:`http://172.30.228.10:8000/v1`,模型 `Qwen3.5-35B`(vLLM, MoE, 256K 上下文, 图文, reasoning)。要点:
870
+ - 流式 `delta.reasoning`(思考)已被解析成 `reasoning_delta` 事件;`delta.content`(正文)→ `text_delta`。
871
+ - 工具调用是标准 OpenAI 流式增量格式,brain 原生处理。
872
+ - 思考内容**不写回最终消息**(省 token、不回灌)。
873
+
874
+ `Model` 对象字段(`api` 取 `openai-completions` 等;详见 vendored `llm-core` 类型):
875
+ ```ts
876
+ interface Model {
877
+ id; name; api; provider; baseUrl;
878
+ reasoning: boolean; input: ("text"|"image")[];
879
+ cost: { input; output; cacheRead; cacheWrite }; // $/百万 token,仅用于 stats.costUsd
880
+ contextWindow: number; contextTokens?: number; // 压缩预算用 contextTokens ?? contextWindow
881
+ charsPerToken?: number; // design/123 D2:结构估算系数(默认 4;新家族/代码密集 3、中文重 2-3),
882
+ // 贯穿压缩触发 fallback / 请求层防线 / cut-point 记账 / prompt-overhead
883
+ maxTokens: number; params?; headers?; compat?; thinkingLevelMap?;
884
+ }
885
+ ```
886
+
887
+ 切模型/思考档位:在 `TaskSpec` 里改 `model`/`thinking` 即可(每任务独立)。
888
+
889
+ ---
890
+
891
+ ## 11. 扩展点
892
+
893
+ 三个注入接口让你在不改核心的前提下替换实现:
894
+
895
+ 1. **大脑** = `Brain.stream: StreamFn`。接非 OpenAI 协议网关 / 多 provider 路由 → 自己实现 `Brain`。
896
+ 2. **持久化(session)** = `SessionStore` 接口(0.3.0 起一等公民)。`Runner` 接受任意 `SessionStore`:
897
+ ```ts
898
+ new Runner({ brain, sessionStore: myStore }); // 默认 TtlSessionStore(内存,7天TTL)
899
+ ```
900
+ 要落"持久化中心"(如 TiDB):实现 `SessionStore`,其 `acquire` 从持久事件日志**重建** session(= wake/resume)。
901
+ 底层用导出的 `BaseSessionStorage`(extend 它,override `appendEntry`/`setLeafId` 落库) → `Session` → 自定义 `SessionStore`。
902
+ 导出件:`SessionStore` `AcquiredSession` `Session` `BaseSessionStorage` `InMemorySessionRepo` `InMemorySessionStorage`
903
+ `uuidv7` + 类型 `SessionStorage` `SessionRepo` `SessionMetadata` `SessionTreeEntry`。
904
+ (test/sessions.test.ts 有一个"DB rehearsal":落外部 map + 新进程 wake 续聊,即 TiDB 的接法。)
905
+
906
+ > **崩溃一致性(1.2.0)**:若任务在一轮中途被打断(工具调用已落库、结果未落),wake 重建出的尾部会是一个**没有结果的 tool_call**
907
+ > → 多数网关报 `tool_calls must be followed by tool messages`,该 session 之后每轮起不来。续聊 session 时 `Runner` 会自动调
908
+ > `reconcileInterruptedSession()`:为悬空 tool_call 合成 `isError` 的 "interrupted, 结果未知" 结果,**绝不重放工具**,把"是否重做"交给模型。
909
+ > 给工具标 `effect: "read" | "write" | "idempotent"`(`ToolSpec.effect`,默认 `write` 保守)可让该提示更精准——read/idempotent 安全重做,
910
+ > write 需确认。自定义 `SessionStore` 也可在 `acquire` 里直接调用导出的 `reconcileInterruptedSession`。
911
+ >
912
+ > **跨实例并发的乐观锁(1.3.0)**:`appendEntry`/`setLeafId` 接受可选 `{ expectedLeafId }`(`SessionWriteOptions`)。`Session` 自动以
913
+ > `entry.parentId` 为 expected leaf 传入;durable 后端把它实现成**条件写**(TiDB:`(session_id, seq)` 唯一键),两个实例 wake 同一 session
914
+ > 并发 append 时输家抛 `SessionError("conflict")`(用导出的 `isSessionConflict(err)` 捕获后重试),**不会静默分叉**。
915
+ > (快照 seam 等其余地基项见 `design/07`。)
916
+
917
+ > **PostgreSQL reference adapters(1.94.0,`src/stores/pg.ts`)**:四个 durable seam 的现成 PG 实现,驱动中立
918
+ > (传任意 `(text, params) => {rows}`,如 `(t, p) => pool.query(t, p)`),零新增运行时依赖:
919
+ > ```ts
920
+ > await ensurePgAgentSchema(q); // 幂等 DDL(可选 { memoryVector: { dimensions, pgvector: true } })
921
+ > new Runner({
922
+ > brain,
923
+ > sessionStore: new TtlSessionStore({ repo: new PgSessionRepo(q) }), // 会话中心(乐观锁=(session_id,seq)唯一键)
924
+ > checkpointStore: new PgCheckpointStore(q), // design/45 durable suspend/resume(原子 CAS resolve)
925
+ > toolResultStore: new PgToolResultStore(q), // durable offload(durable suspend 的前置)
926
+ > memoryStore: new PgMemoryStore(q, { embedder, pgvectorSql: true }), // 记忆:词面 / 进程内 cosine / pgvector SQL 三档可切
927
+ > });
928
+ > ```
929
+ > 召回三档共用同一 cosine-distance 契约(score∈[0,2],0=最近),升级召回是配置切换不是重标定。
930
+ 3. **执行环境** = `ExecutionEnv = FileSystem & Shell`。需要真跑 shell/远程 SSH 时实现它(vendored 有本地 `NodeExecutionEnv` 可参考;
931
+ openclaw 有 SSH/Docker 实现思路)。当前 `StubExecutionEnv` 适用于"只用工具/MCP"的场景。
932
+ 4. **提示词/harness(prompt)** = `PromptProvider`(组装整套 system+memory+harness)。可在 `Runner` 级注入,
933
+ 也可**每个任务热插拔**(1.1.0 起):`TaskSpec.promptProvider` 覆盖 `RunnerDeps.promptProvider`。
934
+ → 一个 Runner 服务多场景、各自不同的整套 harness 提示词(用 `stableSystem`,core 自动把 memory 放尾,见上方 ⚠️):
935
+ ```ts
936
+ const reviewer: PromptProvider = { stableSystem: ({ userSystemPrompt }) => `...审查 harness...` };
937
+ runner.runTask({ objective, model, promptProvider: reviewer }); // 仅本任务换整套提示词
938
+ ```
939
+
940
+ ### 默认即"零配置"(集成方可只传两个字段)
941
+
942
+ 什么都不指定时,最简用法 `new Runner({ brain }).runTask({ objective, model })` 即可跑。安全/重型能力**全部 opt-in**:
943
+
944
+ | 维度 | 不指定时的默认 | 想要时怎么开 |
945
+ |------|----------------|--------------|
946
+ | session 持久化 | 内存 `TtlSessionStore`(7 天 TTL) | `new Runner({ brain, sessionStore })` |
947
+ | 工具审查/审批 | **无**(工具自由执行,适合长时自治跑) | `runTask({ toolPolicy })` |
948
+ | 记忆 | 关 | `new Runner({ brain, memoryStore })` + `runTask({ memory:{scope} })` |
949
+ | 提示词 | `DEFAULT_SYSTEM_PROMPT`(或任务 `systemPrompt`) | `promptProvider`(见上,可热插拔) |
950
+ | 上下文管理 | 自动压缩 + context-editing **开**(保证长跑不超窗) | `compaction` 调参 |
951
+ | 轮次/超时上限 | 都不设时套用 `DEFAULT_MAX_TURNS`(100,保守安全网——拦住工具死循环;长自治任务设自己的显式上限,如 leader 给 worker 设 10000/超时/预算)防跑飞;设任一即用你的边界 | `runTask({ limits: { maxTurns, timeoutSec } })`(`maxTurns:0` 关闭) |
952
+ | 审批闸超时 | 不挂死:Runner 把 `ToolPolicy.check` 与 task abort 信号 race,超时/取消必释放 | `createApprovalPolicy({ approve(req, signal?) })` 自行 race signal |
953
+
954
+ > "默认去除所有审查以保证长运行"=不传 `toolPolicy` 即得;长跑稳定性靠默认开启的压缩 + context-editing。
955
+
956
+ > **durable 挂起/恢复的诚实边界**:`durableApproval` + `CheckpointStore` 提供的是**审批边界的 human-in-the-loop 挂起/恢复 + exactly-once 续跑 + 跨副本恢复**,**不是**通用确定性重放 workflow 引擎;resume token 是单因子 bearer,高风险场景请在 `resume` 外包自己的授权。完整保证/不保证清单见 [`docs/durability-boundary.md`](docs/durability-boundary.md)。
957
+
958
+ ---
959
+
960
+ ## 12. 示例与自检
961
+
962
+ `src/examples/`(运行需网关可达,url-image/advanced 会起本地端口):
963
+
964
+ ```bash
965
+ npm test # vitest 单测+集成(mock brain,含真实 stdio MCP server),CI 友好
966
+ npm run smoke # mock brain e2e(循环/工具/session/续聊)
967
+ npx tsx src/examples/live.ts # 真实网关:工具调用 + 续聊
968
+ npx tsx src/examples/features.ts # 流式 / 图片(base64) / SQL / blocked
969
+ npx tsx src/examples/advanced.ts # reasoning流 / subagent / team / HTTP-SSE
970
+ npx tsx src/examples/url-image.ts # URL 图片(本地起静态服务供图)
971
+ npx tsx src/examples/team-bugs.ts # 两个不同基础提示的 agent 讨论代码 bug
972
+ npx tsx src/examples/mcp-demo.ts # 真实 stdio MCP server:模型发现→校验→调用→dispose
973
+ ```
974
+
975
+ 全部应打印 `... OK ✅`。改网关地址:编辑各示例顶部的 `model.baseUrl`。
976
+
977
+ ### 测试按维度组织
978
+
979
+ `test/` 一个文件一个维度,覆盖矩阵见 [`test/COVERAGE.md`](test/COVERAGE.md)(brain / tools / tasks / sessions /
980
+ streaming / compaction / multiagent / mcp / server / concurrency / primitives)。每个发布版本都须保持全维度绿。
981
+ 确定性单测用 mock brain(离线);真实网关行为由 `src/examples/*` 手动验证。
982
+
983
+ ### 构建与发布(npm 包)
984
+
985
+ 源码为 TS(NodeNext, ESM)。构建产出 `dist/`(`.js` + `.d.ts`),`exports` 指向 `dist`:
986
+
987
+ ```bash
988
+ npm run build # tsc -p tsconfig.build.json → dist/
989
+ npm test # 全维度回归(prepublishOnly 会跑 build + test)
990
+ ```
991
+
992
+ **发布到 Gitea registry**(已配好:`name=@sema-ai/core`,`publishConfig.registry` 指向 Gitea,`files` 只发 `dist`+文档):
993
+
994
+ ```bash
995
+ # .npmrc(本地,已 gitignore;模板见 .npmrc.example)需带一个有 write:package 权限的 Gitea token
996
+ npm run build && npm publish # prepublishOnly 会自动 build + 全维度 test
997
+ ```
998
+
999
+ > ⚠️ 发布前提:Gitea PAT 需要 **`write:package`(+ `read:package`)** scope。仓库现用的 token 只有 org/repo 权限,
1000
+ > 发布会报 `E401`。在 Gitea「设置 → 应用 → 生成令牌」勾选 package 读写即可。版本遵循 semver;原 vendored 内核 MIT,归属史见 `docs/vendor-history.md`。
1001
+
1002
+ ---
1003
+
1004
+ ## 13. vendored 内核与许可
1005
+
1006
+ - `src/core` `src/brain` `src/tools` `src/agents` `src/server` `src/engine` `src/prompts`:**本项目编写的蒸馏层**(**~24k 行**非 vendor 非 test,2026-06 已远超早期 ~1.9k)。
1007
+ - `src/engine/`:first-party 引擎层(llm/loop/harness/session/compaction/execution-env;原 openclaw 蒸馏内核已全量 naturalize,历史见 `docs/vendor-history.md`)。
1008
+ - 内核未发布 npm(openclaw 内部 private workspace 包),故以 vendored 源码方式纳入。
1009
+ - vendored 层里"磁盘 session / nodejs-exec / 磁盘 skill"等本蒸馏层不用(`StubExecutionEnv` 代替 exec),可按需裁剪。
1010
+
1011
+ ---
1012
+
1013
+ ## 14. 已知限制 / TODO
1014
+
1015
+ - **真实 DB**:示例用假 executor;接你们库需把 `query` 换成只读连接(`pgQuery(pool)` 等)。
1016
+ - **图片**:支持 base64 与 URL(URL 由 runner 进程 fetch)。无图片输出生成。
1017
+ - **subagent**:当前是**同步委派**(父等子);并行靠 `team`(fan-out/council)与 `cascade`。push-based 异步委派是后续项。
1018
+ - **持久化中心**:`SessionStore` 接口(§11)+ durable suspend/resume(`CheckpointStore`,design/45/49)已就绪;具体后端(TiDB)在 `ai-agent-service` 仓实现。
1019
+ - **brain**:内置 OpenAI 兼容 + Anthropic 两个适配器;其他协议自行实现 `Brain`。
1020
+
1021
+ > 历史备注:任务内自动压缩(超长单任务的 turn-boundary 压缩)自 **1.88.0** 起支持且**默认开启**
1022
+ > (`compaction.withinTask`,§9);更早版本只在任务之间压缩。
1023
+
1024
+ ---
1025
+
1026
+ ### 速查:最小可用清单
1027
+
1028
+ ```
1029
+ [ ] 一个 OpenAI 兼容网关 baseUrl + 可达
1030
+ [ ] Model 对象(id / baseUrl / contextWindow / input)
1031
+ [ ] new Runner({ brain: createOpenAIBrain(), models })
1032
+ [ ] 工具:createSqlTool({ query: pgQuery(只读池), allowTables }) 或自定义 defineTool
1033
+ [ ] createTaskServer({ runner, resolveSpec(服务端注入tools), authorize, corsOrigin }).listen(port)
1034
+ [ ] 前端 POST /task/stream 消费 SSE:reasoning_delta / text_delta / tool_* / done
1035
+ [ ] 每任务设 limits.timeoutSec;DB 只读;CORS/鉴权收紧
1036
+ ```
1037
+
1038
+ ---
1039
+ > 📍 本 README 是**消费者集成(usage)活文档**。架构/编译/bug/路线图入口见 [`docs/HANDOFF.md`](docs/HANDOFF.md)。
1040
+ > **如何重验本文仍准**:`grep -c export src/index.ts`(导出面,现 105)、`npm run build && echo $?`(签名编译)、`npm test`(行为,现 3351 passed)、`grep -A3 '"dependencies"' package.json`(依赖仅 typebox+MCP)、`npm view @sema-ai/core version`(已发布版本=`1.150.0`)。最后核实 2026-06-27。