@qjp88995/agent-runtime 0.0.0-stage → 0.1.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 (477) hide show
  1. package/dist/agent-extensions.d.ts +30 -0
  2. package/dist/agent-extensions.d.ts.map +1 -0
  3. package/dist/agent-extensions.js +4 -0
  4. package/dist/agent-extensions.js.map +1 -0
  5. package/dist/builtins/ask-outcome.d.ts +49 -0
  6. package/dist/builtins/ask-outcome.d.ts.map +1 -0
  7. package/dist/builtins/ask-outcome.js +128 -0
  8. package/dist/builtins/ask-outcome.js.map +1 -0
  9. package/dist/builtins/ask-schema.d.ts +110 -0
  10. package/dist/builtins/ask-schema.d.ts.map +1 -0
  11. package/dist/builtins/ask-schema.js +124 -0
  12. package/dist/builtins/ask-schema.js.map +1 -0
  13. package/dist/builtins/ask.service.d.ts +210 -0
  14. package/dist/builtins/ask.service.d.ts.map +1 -0
  15. package/dist/builtins/ask.service.js +373 -0
  16. package/dist/builtins/ask.service.js.map +1 -0
  17. package/dist/builtins/ask.tool.d.ts +49 -0
  18. package/dist/builtins/ask.tool.d.ts.map +1 -0
  19. package/dist/builtins/ask.tool.js +109 -0
  20. package/dist/builtins/ask.tool.js.map +1 -0
  21. package/dist/builtins/index.d.ts +8 -0
  22. package/dist/builtins/index.d.ts.map +1 -0
  23. package/dist/builtins/index.js +8 -0
  24. package/dist/builtins/index.js.map +1 -0
  25. package/dist/builtins/todo-schema.d.ts +90 -0
  26. package/dist/builtins/todo-schema.d.ts.map +1 -0
  27. package/dist/builtins/todo-schema.js +97 -0
  28. package/dist/builtins/todo-schema.js.map +1 -0
  29. package/dist/builtins/todo-settle.hook.d.ts +110 -0
  30. package/dist/builtins/todo-settle.hook.d.ts.map +1 -0
  31. package/dist/builtins/todo-settle.hook.js +174 -0
  32. package/dist/builtins/todo-settle.hook.js.map +1 -0
  33. package/dist/builtins/todo.tool.d.ts +59 -0
  34. package/dist/builtins/todo.tool.d.ts.map +1 -0
  35. package/dist/builtins/todo.tool.js +107 -0
  36. package/dist/builtins/todo.tool.js.map +1 -0
  37. package/dist/context/context-budget-tracker.d.ts +185 -0
  38. package/dist/context/context-budget-tracker.d.ts.map +1 -0
  39. package/dist/context/context-budget-tracker.js +400 -0
  40. package/dist/context/context-budget-tracker.js.map +1 -0
  41. package/dist/context/context-budget.d.ts +48 -0
  42. package/dist/context/context-budget.d.ts.map +1 -0
  43. package/dist/context/context-budget.js +89 -0
  44. package/dist/context/context-budget.js.map +1 -0
  45. package/dist/context/index.d.ts +3 -0
  46. package/dist/context/index.d.ts.map +1 -0
  47. package/dist/context/index.js +3 -0
  48. package/dist/context/index.js.map +1 -0
  49. package/dist/extensions/repeat-call.hook.d.ts +32 -0
  50. package/dist/extensions/repeat-call.hook.d.ts.map +1 -0
  51. package/dist/extensions/repeat-call.hook.js +54 -0
  52. package/dist/extensions/repeat-call.hook.js.map +1 -0
  53. package/dist/hooks/index.d.ts +3 -0
  54. package/dist/hooks/index.d.ts.map +1 -0
  55. package/dist/hooks/index.js +3 -0
  56. package/dist/hooks/index.js.map +1 -0
  57. package/dist/hooks/turn-hook.registry.d.ts +51 -0
  58. package/dist/hooks/turn-hook.registry.d.ts.map +1 -0
  59. package/dist/hooks/turn-hook.registry.js +233 -0
  60. package/dist/hooks/turn-hook.registry.js.map +1 -0
  61. package/dist/hooks/turn-hook.types.d.ts +179 -0
  62. package/dist/hooks/turn-hook.types.d.ts.map +1 -0
  63. package/dist/hooks/turn-hook.types.js +48 -0
  64. package/dist/hooks/turn-hook.types.js.map +1 -0
  65. package/dist/images/byte-cache.d.ts +24 -0
  66. package/dist/images/byte-cache.d.ts.map +1 -0
  67. package/dist/images/byte-cache.js +51 -0
  68. package/dist/images/byte-cache.js.map +1 -0
  69. package/dist/images/delivery.d.ts +115 -0
  70. package/dist/images/delivery.d.ts.map +1 -0
  71. package/dist/images/delivery.js +321 -0
  72. package/dist/images/delivery.js.map +1 -0
  73. package/dist/images/index.d.ts +5 -0
  74. package/dist/images/index.d.ts.map +1 -0
  75. package/dist/images/index.js +5 -0
  76. package/dist/images/index.js.map +1 -0
  77. package/dist/images/prompt.d.ts +151 -0
  78. package/dist/images/prompt.d.ts.map +1 -0
  79. package/dist/images/prompt.js +172 -0
  80. package/dist/images/prompt.js.map +1 -0
  81. package/dist/images/vendor-files.d.ts +93 -0
  82. package/dist/images/vendor-files.d.ts.map +1 -0
  83. package/dist/images/vendor-files.js +156 -0
  84. package/dist/images/vendor-files.js.map +1 -0
  85. package/dist/in-process/conversation-store.d.ts +64 -0
  86. package/dist/in-process/conversation-store.d.ts.map +1 -0
  87. package/dist/in-process/conversation-store.js +222 -0
  88. package/dist/in-process/conversation-store.js.map +1 -0
  89. package/dist/in-process/coordination.d.ts +54 -0
  90. package/dist/in-process/coordination.d.ts.map +1 -0
  91. package/dist/in-process/coordination.js +137 -0
  92. package/dist/in-process/coordination.js.map +1 -0
  93. package/dist/in-process/image-source.d.ts +15 -0
  94. package/dist/in-process/image-source.d.ts.map +1 -0
  95. package/dist/in-process/image-source.js +27 -0
  96. package/dist/in-process/image-source.js.map +1 -0
  97. package/dist/in-process/index.d.ts +36 -0
  98. package/dist/in-process/index.d.ts.map +1 -0
  99. package/dist/in-process/index.js +37 -0
  100. package/dist/in-process/index.js.map +1 -0
  101. package/dist/in-process/question-store.d.ts +28 -0
  102. package/dist/in-process/question-store.d.ts.map +1 -0
  103. package/dist/in-process/question-store.js +122 -0
  104. package/dist/in-process/question-store.js.map +1 -0
  105. package/dist/in-process/run-store.d.ts +36 -0
  106. package/dist/in-process/run-store.d.ts.map +1 -0
  107. package/dist/in-process/run-store.js +81 -0
  108. package/dist/in-process/run-store.js.map +1 -0
  109. package/dist/in-process/session-store.d.ts +33 -0
  110. package/dist/in-process/session-store.d.ts.map +1 -0
  111. package/dist/in-process/session-store.js +93 -0
  112. package/dist/in-process/session-store.js.map +1 -0
  113. package/dist/in-process/stream-bus.d.ts +52 -0
  114. package/dist/in-process/stream-bus.d.ts.map +1 -0
  115. package/dist/in-process/stream-bus.js +200 -0
  116. package/dist/in-process/stream-bus.js.map +1 -0
  117. package/dist/in-process/vendor-file-cache.d.ts +11 -0
  118. package/dist/in-process/vendor-file-cache.d.ts.map +1 -0
  119. package/dist/in-process/vendor-file-cache.js +47 -0
  120. package/dist/in-process/vendor-file-cache.js.map +1 -0
  121. package/dist/index.d.ts +21 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +21 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/loop/active-tick.registry.d.ts +31 -0
  126. package/dist/loop/active-tick.registry.d.ts.map +1 -0
  127. package/dist/loop/active-tick.registry.js +45 -0
  128. package/dist/loop/active-tick.registry.js.map +1 -0
  129. package/dist/loop/index.d.ts +6 -0
  130. package/dist/loop/index.d.ts.map +1 -0
  131. package/dist/loop/index.js +6 -0
  132. package/dist/loop/index.js.map +1 -0
  133. package/dist/loop/loop-driver.d.ts +127 -0
  134. package/dist/loop/loop-driver.d.ts.map +1 -0
  135. package/dist/loop/loop-driver.js +199 -0
  136. package/dist/loop/loop-driver.js.map +1 -0
  137. package/dist/loop/message-hub.d.ts +236 -0
  138. package/dist/loop/message-hub.d.ts.map +1 -0
  139. package/dist/loop/message-hub.js +439 -0
  140. package/dist/loop/message-hub.js.map +1 -0
  141. package/dist/loop/orphan-run.sweeper.d.ts +79 -0
  142. package/dist/loop/orphan-run.sweeper.d.ts.map +1 -0
  143. package/dist/loop/orphan-run.sweeper.js +145 -0
  144. package/dist/loop/orphan-run.sweeper.js.map +1 -0
  145. package/dist/loop/root-host.d.ts +51 -0
  146. package/dist/loop/root-host.d.ts.map +1 -0
  147. package/dist/loop/root-host.js +65 -0
  148. package/dist/loop/root-host.js.map +1 -0
  149. package/dist/ports/context-store.d.ts +69 -0
  150. package/dist/ports/context-store.d.ts.map +1 -0
  151. package/dist/ports/context-store.js +2 -0
  152. package/dist/ports/context-store.js.map +1 -0
  153. package/dist/ports/conversation-store.d.ts +144 -0
  154. package/dist/ports/conversation-store.d.ts.map +1 -0
  155. package/dist/ports/conversation-store.js +2 -0
  156. package/dist/ports/conversation-store.js.map +1 -0
  157. package/dist/ports/coordination.d.ts +76 -0
  158. package/dist/ports/coordination.d.ts.map +1 -0
  159. package/dist/ports/coordination.js +12 -0
  160. package/dist/ports/coordination.js.map +1 -0
  161. package/dist/ports/image-source.d.ts +26 -0
  162. package/dist/ports/image-source.d.ts.map +1 -0
  163. package/dist/ports/image-source.js +2 -0
  164. package/dist/ports/image-source.js.map +1 -0
  165. package/dist/ports/index.d.ts +11 -0
  166. package/dist/ports/index.d.ts.map +1 -0
  167. package/dist/ports/index.js +4 -0
  168. package/dist/ports/index.js.map +1 -0
  169. package/dist/ports/logger.d.ts +14 -0
  170. package/dist/ports/logger.d.ts.map +1 -0
  171. package/dist/ports/logger.js +23 -0
  172. package/dist/ports/logger.js.map +1 -0
  173. package/dist/ports/question-store.d.ts +91 -0
  174. package/dist/ports/question-store.d.ts.map +1 -0
  175. package/dist/ports/question-store.js +8 -0
  176. package/dist/ports/question-store.js.map +1 -0
  177. package/dist/ports/run-store.d.ts +66 -0
  178. package/dist/ports/run-store.d.ts.map +1 -0
  179. package/dist/ports/run-store.js +2 -0
  180. package/dist/ports/run-store.js.map +1 -0
  181. package/dist/ports/session-store.d.ts +72 -0
  182. package/dist/ports/session-store.d.ts.map +1 -0
  183. package/dist/ports/session-store.js +9 -0
  184. package/dist/ports/session-store.js.map +1 -0
  185. package/dist/ports/stream-bus.d.ts +52 -0
  186. package/dist/ports/stream-bus.d.ts.map +1 -0
  187. package/dist/ports/stream-bus.js +2 -0
  188. package/dist/ports/stream-bus.js.map +1 -0
  189. package/dist/ports/vendor-file-cache.d.ts +46 -0
  190. package/dist/ports/vendor-file-cache.d.ts.map +1 -0
  191. package/dist/ports/vendor-file-cache.js +2 -0
  192. package/dist/ports/vendor-file-cache.js.map +1 -0
  193. package/dist/schema/agent-event.d.ts +35 -0
  194. package/dist/schema/agent-event.d.ts.map +1 -0
  195. package/dist/schema/agent-event.js +46 -0
  196. package/dist/schema/agent-event.js.map +1 -0
  197. package/dist/schema/agent-run.d.ts +23 -0
  198. package/dist/schema/agent-run.d.ts.map +1 -0
  199. package/dist/schema/agent-run.js +37 -0
  200. package/dist/schema/agent-run.js.map +1 -0
  201. package/dist/schema/index.d.ts +4 -0
  202. package/dist/schema/index.d.ts.map +1 -0
  203. package/dist/schema/index.js +4 -0
  204. package/dist/schema/index.js.map +1 -0
  205. package/dist/schema/message-part.d.ts +73 -0
  206. package/dist/schema/message-part.d.ts.map +1 -0
  207. package/dist/schema/message-part.js +90 -0
  208. package/dist/schema/message-part.js.map +1 -0
  209. package/dist/subagent/delegate.tool.d.ts +145 -0
  210. package/dist/subagent/delegate.tool.d.ts.map +1 -0
  211. package/dist/subagent/delegate.tool.js +329 -0
  212. package/dist/subagent/delegate.tool.js.map +1 -0
  213. package/dist/subagent/index.d.ts +10 -0
  214. package/dist/subagent/index.d.ts.map +1 -0
  215. package/dist/subagent/index.js +10 -0
  216. package/dist/subagent/index.js.map +1 -0
  217. package/dist/subagent/milestone-body.d.ts +82 -0
  218. package/dist/subagent/milestone-body.d.ts.map +1 -0
  219. package/dist/subagent/milestone-body.js +112 -0
  220. package/dist/subagent/milestone-body.js.map +1 -0
  221. package/dist/subagent/output-scan.d.ts +14 -0
  222. package/dist/subagent/output-scan.d.ts.map +1 -0
  223. package/dist/subagent/output-scan.js +41 -0
  224. package/dist/subagent/output-scan.js.map +1 -0
  225. package/dist/subagent/registry-spawn-policy.d.ts +32 -0
  226. package/dist/subagent/registry-spawn-policy.d.ts.map +1 -0
  227. package/dist/subagent/registry-spawn-policy.js +48 -0
  228. package/dist/subagent/registry-spawn-policy.js.map +1 -0
  229. package/dist/subagent/roster-block.d.ts +45 -0
  230. package/dist/subagent/roster-block.d.ts.map +1 -0
  231. package/dist/subagent/roster-block.js +69 -0
  232. package/dist/subagent/roster-block.js.map +1 -0
  233. package/dist/subagent/situation-block.d.ts +16 -0
  234. package/dist/subagent/situation-block.d.ts.map +1 -0
  235. package/dist/subagent/situation-block.js +71 -0
  236. package/dist/subagent/situation-block.js.map +1 -0
  237. package/dist/subagent/spawn-guards.d.ts +32 -0
  238. package/dist/subagent/spawn-guards.d.ts.map +1 -0
  239. package/dist/subagent/spawn-guards.js +39 -0
  240. package/dist/subagent/spawn-guards.js.map +1 -0
  241. package/dist/subagent/subagent-registry.d.ts +150 -0
  242. package/dist/subagent/subagent-registry.d.ts.map +1 -0
  243. package/dist/subagent/subagent-registry.js +167 -0
  244. package/dist/subagent/subagent-registry.js.map +1 -0
  245. package/dist/subagent/subagent-sessions.d.ts +213 -0
  246. package/dist/subagent/subagent-sessions.d.ts.map +1 -0
  247. package/dist/subagent/subagent-sessions.js +295 -0
  248. package/dist/subagent/subagent-sessions.js.map +1 -0
  249. package/dist/testing/contracts.d.ts +37 -0
  250. package/dist/testing/contracts.d.ts.map +1 -0
  251. package/dist/testing/contracts.js +607 -0
  252. package/dist/testing/contracts.js.map +1 -0
  253. package/dist/testing/index.d.ts +5 -0
  254. package/dist/testing/index.d.ts.map +1 -0
  255. package/dist/testing/index.js +5 -0
  256. package/dist/testing/index.js.map +1 -0
  257. package/dist/testing/stub.d.ts +28 -0
  258. package/dist/testing/stub.d.ts.map +1 -0
  259. package/dist/testing/stub.js +3 -0
  260. package/dist/testing/stub.js.map +1 -0
  261. package/dist/tools/agent-tool.base.d.ts +186 -0
  262. package/dist/tools/agent-tool.base.d.ts.map +1 -0
  263. package/dist/tools/agent-tool.base.js +243 -0
  264. package/dist/tools/agent-tool.base.js.map +1 -0
  265. package/dist/tools/agent-tool.interface.d.ts +95 -0
  266. package/dist/tools/agent-tool.interface.d.ts.map +1 -0
  267. package/dist/tools/agent-tool.interface.js +2 -0
  268. package/dist/tools/agent-tool.interface.js.map +1 -0
  269. package/dist/tools/builtin-names.d.ts +18 -0
  270. package/dist/tools/builtin-names.d.ts.map +1 -0
  271. package/dist/tools/builtin-names.js +20 -0
  272. package/dist/tools/builtin-names.js.map +1 -0
  273. package/dist/tools/index.d.ts +9 -0
  274. package/dist/tools/index.d.ts.map +1 -0
  275. package/dist/tools/index.js +6 -0
  276. package/dist/tools/index.js.map +1 -0
  277. package/dist/tools/tool-definition.d.ts +18 -0
  278. package/dist/tools/tool-definition.d.ts.map +1 -0
  279. package/dist/tools/tool-definition.js +77 -0
  280. package/dist/tools/tool-definition.js.map +1 -0
  281. package/dist/tools/tool-meta.d.ts +55 -0
  282. package/dist/tools/tool-meta.d.ts.map +1 -0
  283. package/dist/tools/tool-meta.js +2 -0
  284. package/dist/tools/tool-meta.js.map +1 -0
  285. package/dist/tools/tool-registry.d.ts +190 -0
  286. package/dist/tools/tool-registry.d.ts.map +1 -0
  287. package/dist/tools/tool-registry.js +379 -0
  288. package/dist/tools/tool-registry.js.map +1 -0
  289. package/dist/tools/tool-result.d.ts +41 -0
  290. package/dist/tools/tool-result.d.ts.map +1 -0
  291. package/dist/tools/tool-result.js +19 -0
  292. package/dist/tools/tool-result.js.map +1 -0
  293. package/dist/tools/tool-wire.d.ts +24 -0
  294. package/dist/tools/tool-wire.d.ts.map +1 -0
  295. package/dist/tools/tool-wire.js +2 -0
  296. package/dist/tools/tool-wire.js.map +1 -0
  297. package/dist/turn/agent-runtime.d.ts +31 -0
  298. package/dist/turn/agent-runtime.d.ts.map +1 -0
  299. package/dist/turn/agent-runtime.js +30 -0
  300. package/dist/turn/agent-runtime.js.map +1 -0
  301. package/dist/turn/chunk-projection.d.ts +32 -0
  302. package/dist/turn/chunk-projection.d.ts.map +1 -0
  303. package/dist/turn/chunk-projection.js +62 -0
  304. package/dist/turn/chunk-projection.js.map +1 -0
  305. package/dist/turn/compaction.d.ts +48 -0
  306. package/dist/turn/compaction.d.ts.map +1 -0
  307. package/dist/turn/compaction.js +89 -0
  308. package/dist/turn/compaction.js.map +1 -0
  309. package/dist/turn/context-overflow.d.ts +11 -0
  310. package/dist/turn/context-overflow.d.ts.map +1 -0
  311. package/dist/turn/context-overflow.js +53 -0
  312. package/dist/turn/context-overflow.js.map +1 -0
  313. package/dist/turn/context-pressure.d.ts +100 -0
  314. package/dist/turn/context-pressure.d.ts.map +1 -0
  315. package/dist/turn/context-pressure.js +21 -0
  316. package/dist/turn/context-pressure.js.map +1 -0
  317. package/dist/turn/events-to-steps.d.ts +8 -0
  318. package/dist/turn/events-to-steps.d.ts.map +1 -0
  319. package/dist/turn/events-to-steps.js +64 -0
  320. package/dist/turn/events-to-steps.js.map +1 -0
  321. package/dist/turn/index.d.ts +17 -0
  322. package/dist/turn/index.d.ts.map +1 -0
  323. package/dist/turn/index.js +16 -0
  324. package/dist/turn/index.js.map +1 -0
  325. package/dist/turn/json-preview.d.ts +22 -0
  326. package/dist/turn/json-preview.d.ts.map +1 -0
  327. package/dist/turn/json-preview.js +34 -0
  328. package/dist/turn/json-preview.js.map +1 -0
  329. package/dist/turn/json-string-field.d.ts +30 -0
  330. package/dist/turn/json-string-field.d.ts.map +1 -0
  331. package/dist/turn/json-string-field.js +125 -0
  332. package/dist/turn/json-string-field.js.map +1 -0
  333. package/dist/turn/loop-reminder.d.ts +79 -0
  334. package/dist/turn/loop-reminder.d.ts.map +1 -0
  335. package/dist/turn/loop-reminder.js +0 -0
  336. package/dist/turn/loop-reminder.js.map +1 -0
  337. package/dist/turn/nul-safe.d.ts +21 -0
  338. package/dist/turn/nul-safe.d.ts.map +1 -0
  339. package/dist/turn/nul-safe.js +23 -0
  340. package/dist/turn/nul-safe.js.map +1 -0
  341. package/dist/turn/parts-from-events.d.ts +71 -0
  342. package/dist/turn/parts-from-events.d.ts.map +1 -0
  343. package/dist/turn/parts-from-events.js +217 -0
  344. package/dist/turn/parts-from-events.js.map +1 -0
  345. package/dist/turn/parts-to-model-messages.d.ts +158 -0
  346. package/dist/turn/parts-to-model-messages.d.ts.map +1 -0
  347. package/dist/turn/parts-to-model-messages.js +334 -0
  348. package/dist/turn/parts-to-model-messages.js.map +1 -0
  349. package/dist/turn/pending-work.d.ts +10 -0
  350. package/dist/turn/pending-work.d.ts.map +1 -0
  351. package/dist/turn/pending-work.js +14 -0
  352. package/dist/turn/pending-work.js.map +1 -0
  353. package/dist/turn/provider-error.d.ts +45 -0
  354. package/dist/turn/provider-error.d.ts.map +1 -0
  355. package/dist/turn/provider-error.js +154 -0
  356. package/dist/turn/provider-error.js.map +1 -0
  357. package/dist/turn/tool-input-preview.d.ts +94 -0
  358. package/dist/turn/tool-input-preview.d.ts.map +1 -0
  359. package/dist/turn/tool-input-preview.js +143 -0
  360. package/dist/turn/tool-input-preview.js.map +1 -0
  361. package/dist/turn/tool-input-progress.d.ts +47 -0
  362. package/dist/turn/tool-input-progress.d.ts.map +1 -0
  363. package/dist/turn/tool-input-progress.js +50 -0
  364. package/dist/turn/tool-input-progress.js.map +1 -0
  365. package/dist/turn/turn-envelope.d.ts +184 -0
  366. package/dist/turn/turn-envelope.d.ts.map +1 -0
  367. package/dist/turn/turn-envelope.js +2 -0
  368. package/dist/turn/turn-envelope.js.map +1 -0
  369. package/dist/turn/turn-journal.d.ts +49 -0
  370. package/dist/turn/turn-journal.d.ts.map +1 -0
  371. package/dist/turn/turn-journal.js +51 -0
  372. package/dist/turn/turn-journal.js.map +1 -0
  373. package/dist/turn/turn-run.d.ts +487 -0
  374. package/dist/turn/turn-run.d.ts.map +1 -0
  375. package/dist/turn/turn-run.js +1167 -0
  376. package/dist/turn/turn-run.js.map +1 -0
  377. package/dist/turn/usage.d.ts +27 -0
  378. package/dist/turn/usage.d.ts.map +1 -0
  379. package/dist/turn/usage.js +51 -0
  380. package/dist/turn/usage.js.map +1 -0
  381. package/package.json +59 -3
  382. package/src/agent-extensions.ts +33 -0
  383. package/src/builtins/ask-outcome.ts +168 -0
  384. package/src/builtins/ask-schema.ts +186 -0
  385. package/src/builtins/ask.service.ts +482 -0
  386. package/src/builtins/ask.tool.ts +138 -0
  387. package/src/builtins/index.ts +25 -0
  388. package/src/builtins/todo-schema.ts +108 -0
  389. package/src/builtins/todo-settle.hook.ts +221 -0
  390. package/src/builtins/todo.tool.ts +134 -0
  391. package/src/context/context-budget-tracker.ts +519 -0
  392. package/src/context/context-budget.ts +124 -0
  393. package/src/context/index.ts +17 -0
  394. package/src/extensions/repeat-call.hook.ts +77 -0
  395. package/src/hooks/index.ts +19 -0
  396. package/src/hooks/turn-hook.registry.ts +307 -0
  397. package/src/hooks/turn-hook.types.ts +210 -0
  398. package/src/images/byte-cache.ts +61 -0
  399. package/src/images/delivery.ts +508 -0
  400. package/src/images/index.ts +35 -0
  401. package/src/images/prompt.ts +289 -0
  402. package/src/images/vendor-files.ts +235 -0
  403. package/src/in-process/conversation-store.ts +304 -0
  404. package/src/in-process/coordination.ts +177 -0
  405. package/src/in-process/image-source.ts +29 -0
  406. package/src/in-process/index.ts +52 -0
  407. package/src/in-process/question-store.ts +155 -0
  408. package/src/in-process/run-store.ts +115 -0
  409. package/src/in-process/session-store.ts +118 -0
  410. package/src/in-process/stream-bus.ts +244 -0
  411. package/src/in-process/vendor-file-cache.ts +67 -0
  412. package/src/index.ts +28 -0
  413. package/src/loop/active-tick.registry.ts +49 -0
  414. package/src/loop/index.ts +25 -0
  415. package/src/loop/loop-driver.ts +275 -0
  416. package/src/loop/message-hub.ts +532 -0
  417. package/src/loop/orphan-run.sweeper.ts +204 -0
  418. package/src/loop/root-host.ts +119 -0
  419. package/src/ports/context-store.ts +71 -0
  420. package/src/ports/conversation-store.ts +165 -0
  421. package/src/ports/coordination.ts +81 -0
  422. package/src/ports/image-source.ts +26 -0
  423. package/src/ports/index.ts +56 -0
  424. package/src/ports/logger.ts +34 -0
  425. package/src/ports/question-store.ts +117 -0
  426. package/src/ports/run-store.ts +69 -0
  427. package/src/ports/session-store.ts +80 -0
  428. package/src/ports/stream-bus.ts +59 -0
  429. package/src/ports/vendor-file-cache.ts +54 -0
  430. package/src/schema/agent-event.ts +69 -0
  431. package/src/schema/agent-run.ts +44 -0
  432. package/src/schema/index.ts +25 -0
  433. package/src/schema/message-part.ts +100 -0
  434. package/src/subagent/delegate.tool.ts +476 -0
  435. package/src/subagent/index.ts +63 -0
  436. package/src/subagent/milestone-body.ts +144 -0
  437. package/src/subagent/output-scan.ts +56 -0
  438. package/src/subagent/registry-spawn-policy.ts +85 -0
  439. package/src/subagent/roster-block.ts +103 -0
  440. package/src/subagent/situation-block.ts +83 -0
  441. package/src/subagent/spawn-guards.ts +54 -0
  442. package/src/subagent/subagent-registry.ts +283 -0
  443. package/src/subagent/subagent-sessions.ts +496 -0
  444. package/src/testing/contracts.ts +882 -0
  445. package/src/testing/index.ts +14 -0
  446. package/src/testing/stub.ts +28 -0
  447. package/src/tools/agent-tool.base.ts +361 -0
  448. package/src/tools/agent-tool.interface.ts +101 -0
  449. package/src/tools/builtin-names.ts +26 -0
  450. package/src/tools/index.ts +39 -0
  451. package/src/tools/tool-definition.ts +93 -0
  452. package/src/tools/tool-meta.ts +60 -0
  453. package/src/tools/tool-registry.ts +513 -0
  454. package/src/tools/tool-result.ts +45 -0
  455. package/src/tools/tool-wire.ts +24 -0
  456. package/src/turn/agent-runtime.ts +43 -0
  457. package/src/turn/chunk-projection.ts +81 -0
  458. package/src/turn/compaction.ts +103 -0
  459. package/src/turn/context-overflow.ts +54 -0
  460. package/src/turn/context-pressure.ts +114 -0
  461. package/src/turn/events-to-steps.ts +73 -0
  462. package/src/turn/index.ts +71 -0
  463. package/src/turn/json-preview.ts +36 -0
  464. package/src/turn/json-string-field.ts +134 -0
  465. package/src/turn/loop-reminder.ts +0 -0
  466. package/src/turn/nul-safe.ts +22 -0
  467. package/src/turn/parts-from-events.ts +248 -0
  468. package/src/turn/parts-to-model-messages.ts +428 -0
  469. package/src/turn/pending-work.ts +14 -0
  470. package/src/turn/provider-error.ts +160 -0
  471. package/src/turn/tool-input-preview.ts +223 -0
  472. package/src/turn/tool-input-progress.ts +76 -0
  473. package/src/turn/turn-envelope.ts +185 -0
  474. package/src/turn/turn-journal.ts +102 -0
  475. package/src/turn/turn-run.ts +1479 -0
  476. package/src/turn/usage.ts +56 -0
  477. package/README.md +0 -3
@@ -0,0 +1,41 @@
1
+ /** 会被中和的控制标签名。 */
2
+ const CONTROL_TAGS = [
3
+ 'system-reminder',
4
+ 'system',
5
+ 'important_instructions',
6
+ 'function_results',
7
+ ];
8
+ /** 权限配置类措辞:只标记,不改文本。 */
9
+ const PERMISSION_PATTERNS = [
10
+ /bypassPermissions/i,
11
+ /permissions?\.(allow|deny)/i,
12
+ /dangerously[-_]?skip/i,
13
+ ];
14
+ /**
15
+ * 扫描子 agent 返回文本里的「指令形状」模式。
16
+ *
17
+ * 原则:**只中和不删改** —— 保留全部语义供人排查,只是让它无法被
18
+ * 父模型当成控制指令。命中项另外打标记,调用方可据此在 UI 上提示。
19
+ */
20
+ export function scanSubagentOutput(text) {
21
+ const flagged = new Set();
22
+ let out = text;
23
+ // ① 伪造的控制标签:在 < 后插反斜杠。
24
+ const tagPattern = new RegExp(`<(/?)(?:${CONTROL_TAGS.join('|')})(\\s[^>]*)?>`, 'gi');
25
+ if (tagPattern.test(out)) {
26
+ flagged.add('control-tag');
27
+ out = out.replace(tagPattern, m => `<\\${m.slice(1)}`);
28
+ }
29
+ // ② 伪造的轮次标记:**必须行首**,避免误伤句中出现的同名词。
30
+ const turnPattern = /^(Human|Assistant|System)\s*:/gm;
31
+ if (turnPattern.test(out)) {
32
+ flagged.add('turn-marker');
33
+ out = out.replace(turnPattern, (_m, role) => `${role}\\:`);
34
+ }
35
+ // ③ 权限配置措辞:只标记,原样保留。
36
+ if (PERMISSION_PATTERNS.some(p => p.test(out))) {
37
+ flagged.add('permission-mention');
38
+ }
39
+ return { text: out, flagged: [...flagged] };
40
+ }
41
+ //# sourceMappingURL=output-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-scan.js","sourceRoot":"","sources":["../../src/subagent/output-scan.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,MAAM,YAAY,GAAG;IACnB,iBAAiB;IACjB,QAAQ;IACR,wBAAwB;IACxB,kBAAkB;CACnB,CAAC;AAEF,wBAAwB;AACxB,MAAM,mBAAmB,GAAG;IAC1B,oBAAoB;IACpB,6BAA6B;IAC7B,uBAAuB;CACxB,CAAC;AASF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,GAAG,GAAG,IAAI,CAAC;IAEf,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,WAAW,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAChD,IAAI,CACL,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,iCAAiC,CAAC;IACtD,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACrE,CAAC;IAED,qBAAqB;IACrB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { SubagentAccess, SubagentMeta, SubagentRegistry } from './subagent-registry.js';
2
+ import type { SpawnPolicy, SpawnRequest } from './subagent-sessions.js';
3
+ export interface RegistrySpawnPolicyOptions<M extends SubagentMeta> {
4
+ /**
5
+ * 这次派生的判据输入(发起人的权限点、父允不允许派要权限点的、父点了哪些名)。缺省:
6
+ * 只有发起人的权限点,父不允许派要权限点的,不点名任何一个——fail-closed。
7
+ * **花名册必须用同一份**(`registry.roster(access, filter)`)。
8
+ */
9
+ access?(req: SpawnRequest): SubagentAccess;
10
+ /** 宿主的附加条件(同 `roster` 的 `filter`)。不过 = 当作没有这个子 Agent。 */
11
+ filter?(meta: M, req: SpawnRequest): boolean;
12
+ /**
13
+ * 宿主的额外拒绝(agent-base:调用方模型自己就能看图,还派识图员)。返回一句话 = 拒绝,
14
+ * 原样给模型;返回 null = 放行。
15
+ */
16
+ refuse?(meta: M, req: SpawnRequest): string | null;
17
+ /** 权限点的显示名(拒绝文案里用)。缺省原样写 key。 */
18
+ permissionLabel?(permission: string): string;
19
+ /** 派生成功时写进子会话行的宿主附加列。 */
20
+ attrs?(meta: M, req: SpawnRequest): Readonly<Record<string, unknown>>;
21
+ /** 同 `SpawnPolicy.onSubagentCreated`。 */
22
+ onSubagentCreated?: SpawnPolicy['onSubagentCreated'];
23
+ }
24
+ /**
25
+ * 以 `SubagentRegistry` 为准的派生策略:注册表里有(认旧名、看可用性)、过了权限点与点名
26
+ * 挂载、过了宿主的附加条件才派得出。与 `registry.roster(...)` 是同一个判据。
27
+ *
28
+ * 子会话钉住的是请求里的那个名字;之后每个 tick 宿主按它 `registry.get(name)` 取定义
29
+ * (旧名照样认得)。
30
+ */
31
+ export declare function registrySpawnPolicy<M extends SubagentMeta>(registry: SubagentRegistry<M>, options?: RegistrySpawnPolicyOptions<M>): SpawnPolicy;
32
+ //# sourceMappingURL=registry-spawn-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-spawn-policy.d.ts","sourceRoot":"","sources":["../../src/subagent/registry-spawn-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAEV,WAAW,EACX,YAAY,EACb,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,0BAA0B,CAAC,CAAC,SAAS,YAAY;IAChE;;;;OAIG;IACH,MAAM,CAAC,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,CAAC;IAC3C,yDAAyD;IACzD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC;IAC7C;;;OAGG;IACH,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;IACnD,iCAAiC;IACjC,eAAe,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,yBAAyB;IACzB,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,YAAY,EACxD,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC7B,OAAO,GAAE,0BAA0B,CAAC,CAAC,CAAM,GAC1C,WAAW,CAyCb"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 以 `SubagentRegistry` 为准的派生策略:注册表里有(认旧名、看可用性)、过了权限点与点名
3
+ * 挂载、过了宿主的附加条件才派得出。与 `registry.roster(...)` 是同一个判据。
4
+ *
5
+ * 子会话钉住的是请求里的那个名字;之后每个 tick 宿主按它 `registry.get(name)` 取定义
6
+ * (旧名照样认得)。
7
+ */
8
+ export function registrySpawnPolicy(registry, options = {}) {
9
+ return {
10
+ checkSpawn(req) {
11
+ const meta = registry.get(req.agentName);
12
+ if (!meta || !(options.filter?.(meta, req) ?? true)) {
13
+ return Promise.resolve({ ok: false, reason: 'unknown' });
14
+ }
15
+ const access = options.access?.(req) ?? {
16
+ permissions: req.initiatorPermissions,
17
+ };
18
+ if (!registry.permits(meta, access)) {
19
+ // 点名挂载的没点名:对这个父它就不存在。
20
+ if (!meta.permission) {
21
+ return Promise.resolve({ ok: false, reason: 'unknown' });
22
+ }
23
+ // 说清是「谁、在哪儿」不够格,而不是「没有这个子 Agent」——后者会让模型换个名字再试。
24
+ const label = options.permissionLabel?.(meta.permission) ?? meta.permission;
25
+ return Promise.resolve({
26
+ ok: false,
27
+ reason: 'refused',
28
+ message: `${meta.name} 需要「${label}」权限,而且只能从允许派它的 Agent 里派出。` +
29
+ '这一轮的发起人没有这个权限、或当前 Agent 不允许,无法派生;需要这类数据请告诉用户去找管理员开通。',
30
+ });
31
+ }
32
+ const refused = options.refuse?.(meta, req) ?? null;
33
+ if (refused !== null) {
34
+ return Promise.resolve({
35
+ ok: false,
36
+ reason: 'refused',
37
+ message: refused,
38
+ });
39
+ }
40
+ const attrs = options.attrs?.(meta, req);
41
+ return Promise.resolve(attrs ? { ok: true, attrs } : { ok: true });
42
+ },
43
+ ...(options.onSubagentCreated
44
+ ? { onSubagentCreated: options.onSubagentCreated }
45
+ : {}),
46
+ };
47
+ }
48
+ //# sourceMappingURL=registry-spawn-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-spawn-policy.js","sourceRoot":"","sources":["../../src/subagent/registry-spawn-policy.ts"],"names":[],"mappings":"AAiCA;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA6B,EAC7B,UAAyC,EAAE;IAE3C,OAAO;QACL,UAAU,CAAC,GAAiB;YAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBACpD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI;gBACtC,WAAW,EAAE,GAAG,CAAC,oBAAoB;aACtC,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpC,sBAAsB;gBACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACrB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,gDAAgD;gBAChD,MAAM,KAAK,GACT,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;gBAChE,OAAO,OAAO,CAAC,OAAO,CAAC;oBACrB,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,SAAS;oBACjB,OAAO,EACL,GAAG,IAAI,CAAC,IAAI,OAAO,KAAK,2BAA2B;wBACnD,sDAAsD;iBACzD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;YACpD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,OAAO,CAAC,OAAO,CAAC;oBACrB,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,OAAO;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,iBAAiB;YAC3B,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE;YAClD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 「可派生的子 Agent」索引块——常驻 system prompt,取代原来的 `ListAgents`
3
+ * 工具(2026-07-31 删除)。与技能索引是同一个形状、同一套理由:花名册对一次会话是固定的,做成工具意味着模型每次想派生前都要多一
4
+ * 次完整的 LLM round-trip(重发 system + 全部历史 + 全部工具定义)才能拿回这
5
+ * 几行字,而常驻的那份落在 provider 的自动前缀缓存里几乎不额外计费。
6
+ *
7
+ * **与技能索引的一处有意差异:没有末尾提醒行。** 技能那边有一条硬约束
8
+ * (「别凭印象写,先读规则」),值得花 30 token 买回 recency 位置;派生子
9
+ * Agent 是一个**可选的效率手段**,不是必须遵守的规则——为它再加一句常驻提醒
10
+ * 只会稀释真正的约束,还会诱导模型为了用而用。
11
+ *
12
+ * 零框架、零 IO,纯函数便于单测。
13
+ */
14
+ /** 花名册的一行(`SubagentRegistry.roster` 的返回,宿主可以再拼上自己的)。 */
15
+ export interface SubagentIndexEntry {
16
+ name: string;
17
+ description: string;
18
+ /**
19
+ * 分组:`own` = 宿主给这个会话自己的(组名缺省「你自己的:」)、`platform` = 平台内置的。
20
+ * **名单里没有一条 `own` 时渲染与不带分组逐字相同**。
21
+ */
22
+ group?: 'own' | 'platform';
23
+ }
24
+ /**
25
+ * 描述的硬上限(按 code point 计)。同技能索引:索引常驻
26
+ * system prompt,而描述在后台是不限长的自由文本,渲染侧必须兜底,否则运营
27
+ * 写一段长说明就会静默抬高每一轮的成本。
28
+ */
29
+ export declare const DESC_LIMIT = 60;
30
+ /** 有自己的一组时,那一组的组名缺省值。 */
31
+ export declare const OWN_GROUP_HEADING = "\u4F60\u81EA\u5DF1\u7684\uFF1A";
32
+ /**
33
+ * 子 Agent 花名册块。
34
+ *
35
+ * **空名单返回空串**——两种情况都会走到:这个 agent 没配任何私有子 Agent 且
36
+ * 内置注册表也是空的,或者**深度已经触顶**(调用方那时不该传名单进来,见
37
+ * `canDelegate`:同一个判据还会把 `Delegate` 从工具集里物理摘掉)。
38
+ * 后一种尤其要紧:名单还在、工具没了,模型会反复尝试一个它根本看不见的
39
+ * 工具——那正是 `excludeTools` 想省掉的 token。
40
+ */
41
+ export declare function buildSubagentIndexBlock(agents: readonly SubagentIndexEntry[], options?: {
42
+ toolName?: string;
43
+ ownHeading?: string;
44
+ }): string;
45
+ //# sourceMappingURL=roster-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster-block.d.ts","sourceRoot":"","sources":["../../src/subagent/roster-block.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,yBAAyB;AACzB,eAAO,MAAM,iBAAiB,mCAAU,CAAC;AA+BzC;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,kBAAkB,EAAE,EACrC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,MAAM,CAwBR"}
@@ -0,0 +1,69 @@
1
+ import { DELEGATE_TOOL_NAME } from '../tools/builtin-names.js';
2
+ /**
3
+ * 描述的硬上限(按 code point 计)。同技能索引:索引常驻
4
+ * system prompt,而描述在后台是不限长的自由文本,渲染侧必须兜底,否则运营
5
+ * 写一段长说明就会静默抬高每一轮的成本。
6
+ */
7
+ export const DESC_LIMIT = 60;
8
+ /** 有自己的一组时,那一组的组名缺省值。 */
9
+ export const OWN_GROUP_HEADING = '你自己的:';
10
+ function truncate(text, limit) {
11
+ // Array.from 按 code point 切,避免把 emoji / 生僻字的代理对劈成半个。
12
+ const chars = Array.from(text);
13
+ return chars.length <= limit ? text : `${chars.slice(0, limit).join('')}...`;
14
+ }
15
+ function lineOf(a) {
16
+ const desc = truncate(a.description.trim(), DESC_LIMIT);
17
+ return desc ? `- ${a.name}:${desc}` : `- ${a.name}`;
18
+ }
19
+ /**
20
+ * 有主体自己的 Agent 时分两组(「你自己的:」「平台:」,空组不出);没有时一行一条、
21
+ * 与分组出现之前逐字相同。
22
+ */
23
+ function linesOf(agents, ownHeading) {
24
+ if (!agents.some(a => a.group === 'own'))
25
+ return agents.map(lineOf);
26
+ const own = agents.filter(a => a.group === 'own');
27
+ const platform = agents.filter(a => a.group !== 'own');
28
+ return [
29
+ ownHeading,
30
+ ...own.map(lineOf),
31
+ ...(platform.length > 0 ? ['平台:', ...platform.map(lineOf)] : []),
32
+ ];
33
+ }
34
+ /**
35
+ * 子 Agent 花名册块。
36
+ *
37
+ * **空名单返回空串**——两种情况都会走到:这个 agent 没配任何私有子 Agent 且
38
+ * 内置注册表也是空的,或者**深度已经触顶**(调用方那时不该传名单进来,见
39
+ * `canDelegate`:同一个判据还会把 `Delegate` 从工具集里物理摘掉)。
40
+ * 后一种尤其要紧:名单还在、工具没了,模型会反复尝试一个它根本看不见的
41
+ * 工具——那正是 `excludeTools` 想省掉的 token。
42
+ */
43
+ export function buildSubagentIndexBlock(agents, options = {}) {
44
+ if (agents.length === 0)
45
+ return '';
46
+ const toolName = options.toolName ?? DELEGATE_TOOL_NAME;
47
+ const lines = linesOf(agents, options.ownHeading ?? OWN_GROUP_HEADING);
48
+ // **不要在这里描述「什么时候适合派」。** 曾经写着「适合可并行、可切分的工作」
49
+ // ——那是首批 fan-out 场景(按脚本分片分析)的遗留,而它与下面每一条子 Agent
50
+ // 自己的描述**直接打架**:`general-purpose` 的描述是「适合把一段自包含的任务
51
+ // 整个交出去」,一整篇文章正是它,却被上面那句「可并行、可切分」排除掉。真机
52
+ // 上撞到过后果——模型面对一件超出自身设定的整块工作,建议用户「另找一个通用
53
+ // 写作类的 Agent」,而那个 Agent 就在它这份名单里。
54
+ //
55
+ // 两句都是平台写的,模型只能在两个平台声明之间挑一个。适用场景归各条目自己的
56
+ // description(运营维护,才知道自己那个子 Agent 是干嘛的),这里只讲机制。
57
+ //
58
+ // 同理**不写「在后台」**:`Delegate` 默认是**同步等待**(等子跑完直接返回
59
+ // 产出),只有显式传 `run_in_background: true` 才是后台。那半句话是工具还只有
60
+ // 异步模式时留下的,与工具描述里「默认会等它跑完并直接把结论返回给你」冲突。
61
+ return [
62
+ '【可派生的子 Agent】',
63
+ `下面这些子 Agent 可以用 ${toolName} 派生,独立完成一段子任务。`,
64
+ '子 Agent 看不到你的对话历史,任务描述要自包含。',
65
+ '',
66
+ ...lines,
67
+ ].join('\n');
68
+ }
69
+ //# sourceMappingURL=roster-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster-block.js","sourceRoot":"","sources":["../../src/subagent/roster-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA2B/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,yBAAyB;AACzB,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,qDAAqD;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAC/E,CAAC;AAED,SAAS,MAAM,CAAC,CAAqB;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CACd,MAAqC,EACrC,UAAkB;IAElB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACvD,OAAO;QACL,UAAU;QACV,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAClB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAqC,EACrC,UAAsD,EAAE;IAExD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,kBAAkB,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC,CAAC;IACvE,2CAA2C;IAC3C,gDAAgD;IAChD,mDAAmD;IACnD,wCAAwC;IACxC,wCAAwC;IACxC,kCAAkC;IAClC,EAAE;IACF,wCAAwC;IACxC,gDAAgD;IAChD,EAAE;IACF,gDAAgD;IAChD,sDAAsD;IACtD,wCAAwC;IACxC,OAAO;QACL,eAAe;QACf,mBAAmB,QAAQ,gBAAgB;QAC3C,6BAA6B;QAC7B,EAAE;QACF,GAAG,KAAK;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** 宿主 system prompt 里放 agent 自己那段提示词的块名缺省值。 */
2
+ export declare const DEFAULT_AGENT_PROMPT_BLOCK = "\u3010Agent \u7CFB\u7EDF\u63D0\u793A\u8BCD\u3011";
3
+ export interface SubagentSituationOptions {
4
+ /**
5
+ * 让位给哪一块:宿主 system prompt 里放这个子 Agent 自己那段提示词的块名。缺省
6
+ * `DEFAULT_AGENT_PROMPT_BLOCK`;`null` = 不写让位那一段(宿主的 system prompt 不分块时)。
7
+ * **按块名指路,不用「上面 / 下面」**——块序会动,靠位置表达的关系会静默失效。
8
+ */
9
+ agentPromptBlock?: string | null;
10
+ }
11
+ /**
12
+ * 子 Agent 处境说明。`isSubagent` 为假返回空串(根会话没有「调用方」,这段话
13
+ * 每一句都不成立)。
14
+ */
15
+ export declare function buildSubagentSituationBlock(isSubagent: boolean, options?: SubagentSituationOptions): string;
16
+ //# sourceMappingURL=situation-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"situation-block.d.ts","sourceRoot":"","sources":["../../src/subagent/situation-block.ts"],"names":[],"mappings":"AAkDA,+CAA+C;AAC/C,eAAO,MAAM,0BAA0B,qDAAkB,CAAC;AAE1D,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAaR"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 「你是一个子 Agent」处境说明块 —— **只对子会话渲染**,常驻 system prompt。
3
+ *
4
+ * ## 为什么这段必须由平台给,而不是让每个子 Agent 的提示词自己写
5
+ *
6
+ * 子 Agent 的系统提示词**完全**是运营写的那段(宿主合成子 Agent 定义时就是那段提示词,平台一个字都不掺)。这段文字
7
+ * 原先住在内置 `general-purpose` 的人格里,于是只有用它派生出来的子 Agent 知道
8
+ * 自己的处境;运营在后台自建的私有子 Agent 一概不知道 —— 而它们并不因此少受
9
+ * 这些机制的约束,只是**不知道**而已。最贵的一条是「信息不足可以交回去问」:
10
+ * 不知道这条路存在的子 Agent,缺参数时会挑一个看起来合理的值继续做完,而它编
11
+ * 出来的产出在调用方眼里**完全正常**。
12
+ *
13
+ * 三段讲的都是**运行时事实**,不是行为规范:
14
+ * - 看不到调用方历史 → 子会话是独立的 `chat_session`,硬隔离。
15
+ * - 产出原样回投 → `finalizeIfIdle` 取本轮全部 assistant text part 拼接、经
16
+ * `scanSubagentOutput` 中和后交给调用方(同步等待时由 `Delegate` 直接取走)。
17
+ * - 交回去还能接着跑 → 调用方 `Delegate(handle)` 往子会话投一条消息即可,
18
+ * 历史原样都在(这半条能力 2026-08-02 才补上;在那之前只有人能软插话进来,
19
+ * 而这段话已经在 `general-purpose` 里承诺了很久)。
20
+ *
21
+ * ## 它不与运营的提示词竞争
22
+ *
23
+ * 末尾显式让位给【Agent 系统提示词】那一块。这不是客套:真有运营写「无论如何
24
+ * 都要给出结论、不许空手回来」,那是它对这个子 Agent 的定位,该赢。平台这段只
25
+ * 负责把「有哪些路可走」说清楚,不替运营决定该走哪条。
26
+ *
27
+ * **用块名指路,不用「上面/下面」** —— 块序还会再动,靠位置表达的关系会在下一
28
+ * 次调整时静默失效(同 `AGENT_PROMPT_AUTHORITY` 的规矩)。
29
+ *
30
+ * 零框架、零 IO,纯函数便于单测。
31
+ */
32
+ const SITUATION_BODY = [
33
+ '【你的处境】',
34
+ '你是一个**子 Agent**:由另一个 Agent 派生出来,独立完成它交给你的一段任务。',
35
+ '这三件事是这套运行时的机制,不是措辞——',
36
+ '',
37
+ '**你看不到调用方的对话历史。** 交给你的任务描述就是你能拿到的全部背景;其中没有',
38
+ '写明的东西,要么用工具查证,要么当作未知,不要凭印象假设。',
39
+ '',
40
+ '**你这一轮说的话会原样回到调用方那里。** 它读到的就是你的全部输出,没有旁白,也',
41
+ '看不到你的中间步骤。所以结论要自包含,不要用「如上所述」「刚才那个文件」这类指向',
42
+ '它看不到的东西的说法;不必复述做过的每一步,但支撑结论的关键依据——查到的事实、',
43
+ '文件位置、具体数据——要一并带上,让它不用重跑一遍就能采信。',
44
+ '',
45
+ '**信息不够时可以交回去问,不必硬撑。** 缺的东西自己查不到、也无从推断时,不要空手',
46
+ '返回,更不要编一个答案:把已经确定的部分、卡在哪里、还需要什么,一起交回去。调用方',
47
+ '补充之后可以让你接着跑——届时你们之前的全部往来都还在,你不必重头再来,它也不用把',
48
+ '背景重讲一遍。',
49
+ ].join('\n');
50
+ /** 宿主 system prompt 里放 agent 自己那段提示词的块名缺省值。 */
51
+ export const DEFAULT_AGENT_PROMPT_BLOCK = '【Agent 系统提示词】';
52
+ /**
53
+ * 子 Agent 处境说明。`isSubagent` 为假返回空串(根会话没有「调用方」,这段话
54
+ * 每一句都不成立)。
55
+ */
56
+ export function buildSubagentSituationBlock(isSubagent, options = {}) {
57
+ if (!isSubagent)
58
+ return '';
59
+ const block = options.agentPromptBlock === undefined
60
+ ? DEFAULT_AGENT_PROMPT_BLOCK
61
+ : options.agentPromptBlock;
62
+ if (block === null)
63
+ return SITUATION_BODY;
64
+ return [
65
+ SITUATION_BODY,
66
+ '',
67
+ `以上是平台对运行方式的说明。具体做什么、按什么标准做,以${block}那一段`,
68
+ '为准;两者冲突时听那一段的。',
69
+ ].join('\n');
70
+ }
71
+ //# sourceMappingURL=situation-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"situation-block.js","sourceRoot":"","sources":["../../src/subagent/situation-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,gDAAgD;IAChD,sBAAsB;IACtB,EAAE;IACF,4CAA4C;IAC5C,+BAA+B;IAC/B,EAAE;IACF,4CAA4C;IAC5C,0CAA0C;IAC1C,0CAA0C;IAC1C,gCAAgC;IAChC,EAAE;IACF,6CAA6C;IAC7C,2CAA2C;IAC3C,2CAA2C;IAC3C,SAAS;CACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,+CAA+C;AAC/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,eAAe,CAAC;AAW1D;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAmB,EACnB,UAAoC,EAAE;IAEtC,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,KAAK,GACT,OAAO,CAAC,gBAAgB,KAAK,SAAS;QACpC,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC/B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,cAAc,CAAC;IAC1C,OAAO;QACL,cAAc;QACd,EAAE;QACF,+BAA+B,KAAK,KAAK;QACzC,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 子 Agent 深度上限。Claude Code 是 5;首批场景是单层 fan-out,3 足够且更安全。
3
+ * 深度 3 的树最深 4 层。宿主可经 `SubagentSessions` / `canDelegate` 的入参改。
4
+ */
5
+ export declare const MAX_SUBAGENT_DEPTH = 3;
6
+ /** 每棵树(根会话)同时存活的子 Agent 数缺省上限(`TreeBudget` 计数)。 */
7
+ export declare const MAX_LIVE_SUBS_PER_TREE = 20;
8
+ /**
9
+ * 能否再往下派生。
10
+ *
11
+ * **调用点在构造本轮工具集时**,命中即从工具集里物理摘掉 `Delegate`——模型看不见
12
+ * 就不会试,比事后报错干净,也不浪费 token 产生错误路径。工具里那道判断是后备。
13
+ */
14
+ export declare function canSpawnDeeper(currentDepth: number, maxDepth?: number): boolean;
15
+ /**
16
+ * 这一轮该不该把 `Delegate` 与花名册端上桌:深度没触顶、且这个子 Agent 不是叶子
17
+ * (`SubagentRegistry.isLeaf`)。**两处消费必须同进同退**——只摘工具会留下一份广告着
18
+ * 不存在工具的名单,只去名单则模型仍会凭工具定义去试。所以只算这一次。
19
+ */
20
+ export declare function canDelegate(depth: number, leaf: boolean, maxDepth?: number): boolean;
21
+ /**
22
+ * 触顶时返回给模型的文案。**写成引导语而非错误**——让模型改用自己的工具干完剩余
23
+ * 工作,而不是让整个 run 失败。
24
+ *
25
+ * 深度与树配额是两种不同的限制(层级 vs 同时存活数),正确的下一步也不同(深度是
26
+ * 本层永久的;树配额随子 Agent 结束而释放),必须分开措辞——曾共用一句「派生次数
27
+ * 已达本轮上限」,对两者各说错一半。
28
+ */
29
+ export declare const DEPTH_EXHAUSTED_HINT = "\u5B50 Agent \u7684\u6D3E\u751F\u5C42\u7EA7\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u8FD9\u4E00\u5C42\u4E0D\u80FD\u518D\u5F80\u4E0B\u6D3E\u751F\u3002\u8BF7\u7528\u4F60\u81EA\u5DF1\u7684\u5DE5\u5177\u5B8C\u6210\u5269\u4F59\u5DE5\u4F5C\u3002";
30
+ export declare function treeFullHint(limit: number): string;
31
+ export declare const TREE_FULL_HINT: string;
32
+ //# sourceMappingURL=spawn-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-guards.d.ts","sourceRoot":"","sources":["../../src/subagent/spawn-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAA2B,GACpC,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,MAA2B,GACpC,OAAO,CAET;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,0OACe,CAAC;AAEjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,eAAO,MAAM,cAAc,QAAuC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 子 Agent 深度上限。Claude Code 是 5;首批场景是单层 fan-out,3 足够且更安全。
3
+ * 深度 3 的树最深 4 层。宿主可经 `SubagentSessions` / `canDelegate` 的入参改。
4
+ */
5
+ export const MAX_SUBAGENT_DEPTH = 3;
6
+ /** 每棵树(根会话)同时存活的子 Agent 数缺省上限(`TreeBudget` 计数)。 */
7
+ export const MAX_LIVE_SUBS_PER_TREE = 20;
8
+ /**
9
+ * 能否再往下派生。
10
+ *
11
+ * **调用点在构造本轮工具集时**,命中即从工具集里物理摘掉 `Delegate`——模型看不见
12
+ * 就不会试,比事后报错干净,也不浪费 token 产生错误路径。工具里那道判断是后备。
13
+ */
14
+ export function canSpawnDeeper(currentDepth, maxDepth = MAX_SUBAGENT_DEPTH) {
15
+ return currentDepth < maxDepth;
16
+ }
17
+ /**
18
+ * 这一轮该不该把 `Delegate` 与花名册端上桌:深度没触顶、且这个子 Agent 不是叶子
19
+ * (`SubagentRegistry.isLeaf`)。**两处消费必须同进同退**——只摘工具会留下一份广告着
20
+ * 不存在工具的名单,只去名单则模型仍会凭工具定义去试。所以只算这一次。
21
+ */
22
+ export function canDelegate(depth, leaf, maxDepth = MAX_SUBAGENT_DEPTH) {
23
+ return canSpawnDeeper(depth, maxDepth) && !leaf;
24
+ }
25
+ /**
26
+ * 触顶时返回给模型的文案。**写成引导语而非错误**——让模型改用自己的工具干完剩余
27
+ * 工作,而不是让整个 run 失败。
28
+ *
29
+ * 深度与树配额是两种不同的限制(层级 vs 同时存活数),正确的下一步也不同(深度是
30
+ * 本层永久的;树配额随子 Agent 结束而释放),必须分开措辞——曾共用一句「派生次数
31
+ * 已达本轮上限」,对两者各说错一半。
32
+ */
33
+ export const DEPTH_EXHAUSTED_HINT = '子 Agent 的派生层级已达上限,这一层不能再往下派生。请用你自己的工具完成剩余工作。';
34
+ export function treeFullHint(limit) {
35
+ return (`当前会话树同时存活的子 Agent 已达上限(${limit} 个),` +
36
+ '已有子 Agent 结束后名额会释放。眼下请用你自己的工具推进剩余工作。');
37
+ }
38
+ export const TREE_FULL_HINT = treeFullHint(MAX_LIVE_SUBS_PER_TREE);
39
+ //# sourceMappingURL=spawn-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-guards.js","sourceRoot":"","sources":["../../src/subagent/spawn-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,mDAAmD;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAoB,EACpB,WAAmB,kBAAkB;IAErC,OAAO,YAAY,GAAG,QAAQ,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,IAAa,EACb,WAAmB,kBAAkB;IAErC,OAAO,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8CAA8C,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CACL,0BAA0B,KAAK,MAAM;QACrC,sCAAsC,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,150 @@
1
+ import type { ToolRegistry } from '../tools/tool-registry.js';
2
+ import { type SubagentIndexEntry } from './roster-block.js';
3
+ /**
4
+ * 一个内置子 Agent 的登记信息。搬自 agent-base `BuiltinSubagentMeta`,只留与运行时机制
5
+ * 有关的字段;模型从哪来(档位、顶替能力的模型、媒体服务商)是宿主的配置语义,宿主
6
+ * 扩展这个接口自己加(`SubagentRegistry<MyMeta>`),在 `SpawnPolicy` 与 tick 设置里读。
7
+ *
8
+ * **optional 字段留空 = 由父决定**:通用子 Agent 正是靠全部留空,把工具 / 步数交还给
9
+ * 派生它的那个父(宿主合成子定义时 `meta.tools ?? parent.enabledTools`)。
10
+ */
11
+ export interface SubagentMeta {
12
+ /** 模型看到、派生时填的名字。全局唯一。 */
13
+ name: string;
14
+ /**
15
+ * 界面上的默认叫法(「识图员」):派它那一行、过程弹窗、回执标题都写它。**只管显示,
16
+ * 模型看到的永远是 `name`**。1..`labelMax` 个码点,注册期校验。
17
+ */
18
+ label: string;
19
+ /** 花名册那一行。超过 `DESC_LIMIT` 个码点注册期拒绝(花名册会截掉,模型看不见)。 */
20
+ description: string;
21
+ /** 子会话的人格提示词。 */
22
+ prompt: string;
23
+ /** 工具白名单;不给 = 用父的。 */
24
+ tools?: readonly string[];
25
+ /** 步数上限;不给 = 用父的。 */
26
+ maxSteps?: number;
27
+ /** **叶子**:不给 `Delegate`、花名册清空(它只做一件事,再分包只会绕回来)。 */
28
+ leaf?: boolean;
29
+ /**
30
+ * **功能型**:做一件具体的事、自带一套工具;谁派都按它自己的定义跑,且**必须是叶子**
31
+ * (隐含 `leaf`)。标不标是一次显式决定,别因为收窄了 `tools` 就顺手标上。
32
+ */
33
+ functional?: true;
34
+ /**
35
+ * **要权限点才派得出**:本轮发起人有这个点,**且**父允许派这类子 Agent
36
+ * (`SubagentAccess.allowPermissioned`)时才进花名册、才派得出。填它自带工具要的那个点,
37
+ * 花名册与工具门禁认同一件事。**这不是工具的门**:它用到的工具自己仍要现查权限。
38
+ */
39
+ permission?: string;
40
+ /**
41
+ * **点名挂载**:默认不进任何花名册、谁都派不出,只有点名要它的父
42
+ * (`SubagentAccess.optIn`)才列、才派得出。与 `permission` 不能同标(注册期拒绝)。
43
+ */
44
+ optIn?: true;
45
+ /**
46
+ * 系统类工具(`ToolRegistry` 里 `alwaysOnCategories` 那几组)的白名单。不给 = 不限。
47
+ * `tools` 管不到恒上桌的工具,要让它只做一件事就得在这里点名;名单外的由
48
+ * `excludedSystemTools` 算出、宿主放进本轮摘除清单。
49
+ */
50
+ systemTools?: readonly string[];
51
+ /**
52
+ * 改名前用过的名字。旧子会话钉着旧名(`SessionRecord.subagentName`),追问它时每个 tick
53
+ * 都按它查定义——查不到就再也续不上。`get` 认它,花名册只出现名。
54
+ */
55
+ formerNames?: readonly string[];
56
+ }
57
+ /** 注册时可附的运行期问答。 */
58
+ export interface SubagentProvider {
59
+ /**
60
+ * 此刻能不能用(服务端没配取数账号时取数员不可用)。不可用时 `get` / `list` 都当它
61
+ * 不存在。**每次调用现问**,不在注册时快照。
62
+ */
63
+ isAvailable?(): boolean;
64
+ }
65
+ /** 花名册 / 派生对「要权限点」与「点名挂载」的判据输入。缺省即 fail-closed。 */
66
+ export interface SubagentAccess {
67
+ /** 本轮发起人此刻的权限点(`Initiator.permissions`;没有发起人 = 空)。 */
68
+ permissions: ReadonlySet<string>;
69
+ /** 父允许派要权限点的子 Agent(agent-base:系统管理分身)。缺省 false。 */
70
+ allowPermissioned?: boolean;
71
+ /** 这个父点名要的「点名挂载」子 Agent。缺省空。 */
72
+ optIn?: readonly string[];
73
+ }
74
+ export interface SubagentRegistryOptions<M extends SubagentMeta> {
75
+ /** `label` 的码点上限,缺省 20。 */
76
+ labelMax?: number;
77
+ /** 宿主字段的注册期校验(抛错即拒绝)。 */
78
+ validate?(meta: M): void;
79
+ /** 宿主字段隐含的叶子(agent-base:按能力顶替的子 Agent)。 */
80
+ impliesLeaf?(meta: M): boolean;
81
+ }
82
+ /**
83
+ * 内置子 Agent 注册表:宿主显式 `register`(以前靠 Nest 装饰器 + DiscoveryService 扫)。
84
+ * 名字重复、旧名冲突、说明过长、两个互斥标记同标都在注册期抛。
85
+ *
86
+ * 花名册顺序 = 注册顺序。
87
+ */
88
+ export declare class SubagentRegistry<M extends SubagentMeta = SubagentMeta> {
89
+ private readonly options;
90
+ private readonly byName;
91
+ /** 旧名 → 现名。 */
92
+ private readonly aliases;
93
+ private readonly labelMax;
94
+ constructor(options?: SubagentRegistryOptions<M>);
95
+ register(meta: M, provider?: SubagentProvider): void;
96
+ /** 现名(认旧名);没登记过返回 null。不看可用性。 */
97
+ currentName(name: string): string | null;
98
+ /** 这个名字(含旧名)的定义;没有或此刻不可用返回 null。 */
99
+ get(name: string): M | null;
100
+ /** 此刻可用的全部定义(注册顺序)。 */
101
+ list(): M[];
102
+ /** 注册过的全部定义(含此刻不可用的),带可用性。后台页用。 */
103
+ listAll(): {
104
+ meta: M;
105
+ available: boolean;
106
+ }[];
107
+ /**
108
+ * 注册过的全部现名,**不看可用性**。给「名字不许与内置子 Agent 撞」这类静态判断用:
109
+ * 按 `list()` 判的话,取数员不可用时别人就能占走它的名字,可用之后两者同名。
110
+ */
111
+ allNames(): string[];
112
+ /** 名字 → 界面默认叫法,**含旧名**;不看可用性(历史里派过的照样要叫得出来)。 */
113
+ defaultLabels(): Record<string, string>;
114
+ /**
115
+ * 这个名字是不是叶子(不给 `Delegate`、花名册清空):`leaf` / `functional` /
116
+ * 宿主的 `impliesLeaf`。没登记过的名字(宿主自己的子 Agent)返回 false。
117
+ */
118
+ isLeaf(name: string): boolean;
119
+ /** 这个名字要的权限点;不要或没登记过返回 null。 */
120
+ requiredPermission(name: string): string | null;
121
+ /**
122
+ * 判据输入下这个定义派不派得出(花名册与派生同一句):要权限点的要发起人有且父允许;
123
+ * 点名挂载的要父点了名。
124
+ */
125
+ permits(meta: M, access: SubagentAccess): boolean;
126
+ /**
127
+ * 花名册:此刻可用、对这份判据输入派得出的定义。`filter` 是宿主的附加条件
128
+ * (agent-base:顶替型只在当前模型缺那项能力且父配了顶替模型时列)——**不广告一个
129
+ * 派不出来的东西**,派生那一侧(`SpawnPolicy.checkSpawn`)要用同一个判据。
130
+ */
131
+ roster(access: SubagentAccess, filter?: (meta: M) => boolean): SubagentIndexEntry[];
132
+ /**
133
+ * 这个子 Agent 本轮要摘掉的恒上桌工具:声明了 `systemTools` 时,`alwaysOn` 那几组里
134
+ * 名单外的全部。没声明返回空数组(与父一样)。
135
+ */
136
+ excludedSystemTools(name: string, tools: ToolRegistry, alwaysOnCategories?: readonly string[]): string[];
137
+ private available;
138
+ }
139
+ /**
140
+ * 通用子 Agent 的固定人格提示词。**短得几乎没有内容,这是对的**:处境说明(看不到
141
+ * 调用方历史、产出原样回投、卡住可以交回去问)归平台,由 `buildSubagentSituationBlock`
142
+ * 对每个子会话注入;剩下这一句才是「通用款」独有的——它没有领域设定。
143
+ */
144
+ export declare const GENERAL_PURPOSE_PROMPT = "\u4F60\u6CA1\u6709\u7279\u5B9A\u7684\u9886\u57DF\u8BBE\u5B9A\uFF0C\u4E5F\u6CA1\u6709\u9884\u8BBE\u7684\u5DE5\u4F5C\u5957\u8DEF\u3002\u6309\u4EFB\u52A1\u63CF\u8FF0\u672C\u8EAB\u7684\u8981\u6C42\u6765\u505A\uFF1A\u5B83\u8981\u4EC0\u4E48\u5C31\u4EA7\u51FA\u4EC0\u4E48\uFF0C\u9700\u8981\u4EC0\u4E48\u624B\u6BB5\u5C31\u7528\u4EC0\u4E48\u624B\u6BB5\u3002";
145
+ /**
146
+ * 内置「通用子 Agent」。**除人格外一个字段都不设,是它的全部要点**:工具、步数(以及
147
+ * 宿主的档位、推理等级)统统由派生它的那个父决定。宿主要用就 `registry.register(GENERAL_PURPOSE_SUBAGENT)`。
148
+ */
149
+ export declare const GENERAL_PURPOSE_SUBAGENT: SubagentMeta;
150
+ //# sourceMappingURL=subagent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-registry.d.ts","sourceRoot":"","sources":["../../src/subagent/subagent-registry.ts"],"names":[],"mappings":"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"}