dsh-tavern-bundle 0.1.0

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 (422) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/cordis.patch.yml +14 -0
  4. package/lib/adapters/model-gateway.d.ts +4 -0
  5. package/lib/adapters/model-gateway.d.ts.map +1 -0
  6. package/lib/adapters/model-gateway.js +3 -0
  7. package/lib/adapters/model-gateway.js.map +1 -0
  8. package/lib/adapters/prestep-spike.d.ts +16 -0
  9. package/lib/adapters/prestep-spike.d.ts.map +1 -0
  10. package/lib/adapters/prestep-spike.js +114 -0
  11. package/lib/adapters/prestep-spike.js.map +1 -0
  12. package/lib/adapters/runtime-probe.d.ts +67 -0
  13. package/lib/adapters/runtime-probe.d.ts.map +1 -0
  14. package/lib/adapters/runtime-probe.js +106 -0
  15. package/lib/adapters/runtime-probe.js.map +1 -0
  16. package/lib/adapters/session-agent-provider.d.ts +3 -0
  17. package/lib/adapters/session-agent-provider.d.ts.map +1 -0
  18. package/lib/adapters/session-agent-provider.js +3 -0
  19. package/lib/adapters/session-agent-provider.js.map +1 -0
  20. package/lib/adapters/subagent-gateway.d.ts +3 -0
  21. package/lib/adapters/subagent-gateway.d.ts.map +1 -0
  22. package/lib/adapters/subagent-gateway.js +3 -0
  23. package/lib/adapters/subagent-gateway.js.map +1 -0
  24. package/lib/application/chat/chat-application-service.d.ts +94 -0
  25. package/lib/application/chat/chat-application-service.d.ts.map +1 -0
  26. package/lib/application/chat/chat-application-service.js +291 -0
  27. package/lib/application/chat/chat-application-service.js.map +1 -0
  28. package/lib/application/companion/agent-orchestrator.d.ts +91 -0
  29. package/lib/application/companion/agent-orchestrator.d.ts.map +1 -0
  30. package/lib/application/companion/agent-orchestrator.js +298 -0
  31. package/lib/application/companion/agent-orchestrator.js.map +1 -0
  32. package/lib/application/companion/companion-child-service.d.ts +47 -0
  33. package/lib/application/companion/companion-child-service.d.ts.map +1 -0
  34. package/lib/application/companion/companion-child-service.js +30 -0
  35. package/lib/application/companion/companion-child-service.js.map +1 -0
  36. package/lib/application/companion/companion-invocation-service.d.ts +42 -0
  37. package/lib/application/companion/companion-invocation-service.d.ts.map +1 -0
  38. package/lib/application/companion/companion-invocation-service.js +50 -0
  39. package/lib/application/companion/companion-invocation-service.js.map +1 -0
  40. package/lib/application/companion/companion-profile-service.d.ts +32 -0
  41. package/lib/application/companion/companion-profile-service.d.ts.map +1 -0
  42. package/lib/application/companion/companion-profile-service.js +112 -0
  43. package/lib/application/companion/companion-profile-service.js.map +1 -0
  44. package/lib/application/companion/companion-promotion-service.d.ts +69 -0
  45. package/lib/application/companion/companion-promotion-service.d.ts.map +1 -0
  46. package/lib/application/companion/companion-promotion-service.js +129 -0
  47. package/lib/application/companion/companion-promotion-service.js.map +1 -0
  48. package/lib/application/group-chat/group-chat-execution-service.d.ts +22 -0
  49. package/lib/application/group-chat/group-chat-execution-service.d.ts.map +1 -0
  50. package/lib/application/group-chat/group-chat-execution-service.js +110 -0
  51. package/lib/application/group-chat/group-chat-execution-service.js.map +1 -0
  52. package/lib/application/group-chat/group-chat-orchestrator.d.ts +51 -0
  53. package/lib/application/group-chat/group-chat-orchestrator.d.ts.map +1 -0
  54. package/lib/application/group-chat/group-chat-orchestrator.js +57 -0
  55. package/lib/application/group-chat/group-chat-orchestrator.js.map +1 -0
  56. package/lib/application/memory/memory-retriever.d.ts +37 -0
  57. package/lib/application/memory/memory-retriever.d.ts.map +1 -0
  58. package/lib/application/memory/memory-retriever.js +91 -0
  59. package/lib/application/memory/memory-retriever.js.map +1 -0
  60. package/lib/application/memory/memory-service.d.ts +128 -0
  61. package/lib/application/memory/memory-service.d.ts.map +1 -0
  62. package/lib/application/memory/memory-service.js +346 -0
  63. package/lib/application/memory/memory-service.js.map +1 -0
  64. package/lib/application/ports/companion-runtime-port.d.ts +72 -0
  65. package/lib/application/ports/companion-runtime-port.d.ts.map +1 -0
  66. package/lib/application/ports/companion-runtime-port.js +2 -0
  67. package/lib/application/ports/companion-runtime-port.js.map +1 -0
  68. package/lib/application/ports/llm-port.d.ts +7 -0
  69. package/lib/application/ports/llm-port.d.ts.map +1 -0
  70. package/lib/application/ports/llm-port.js +2 -0
  71. package/lib/application/ports/llm-port.js.map +1 -0
  72. package/lib/application/ports/message-source.d.ts +4 -0
  73. package/lib/application/ports/message-source.d.ts.map +1 -0
  74. package/lib/application/ports/message-source.js +5 -0
  75. package/lib/application/ports/message-source.js.map +1 -0
  76. package/lib/application/ports/session-context-port.d.ts +13 -0
  77. package/lib/application/ports/session-context-port.d.ts.map +1 -0
  78. package/lib/application/ports/session-context-port.js +2 -0
  79. package/lib/application/ports/session-context-port.js.map +1 -0
  80. package/lib/application/ports/subagent-port.d.ts +31 -0
  81. package/lib/application/ports/subagent-port.d.ts.map +1 -0
  82. package/lib/application/ports/subagent-port.js +2 -0
  83. package/lib/application/ports/subagent-port.js.map +1 -0
  84. package/lib/application/ports/user-resolver-port.d.ts +5 -0
  85. package/lib/application/ports/user-resolver-port.d.ts.map +1 -0
  86. package/lib/application/ports/user-resolver-port.js +2 -0
  87. package/lib/application/ports/user-resolver-port.js.map +1 -0
  88. package/lib/application/relationship/relationship-event-service.d.ts +31 -0
  89. package/lib/application/relationship/relationship-event-service.d.ts.map +1 -0
  90. package/lib/application/relationship/relationship-event-service.js +43 -0
  91. package/lib/application/relationship/relationship-event-service.js.map +1 -0
  92. package/lib/application/relationship/relationship-policy.d.ts +20 -0
  93. package/lib/application/relationship/relationship-policy.d.ts.map +1 -0
  94. package/lib/application/relationship/relationship-policy.js +24 -0
  95. package/lib/application/relationship/relationship-policy.js.map +1 -0
  96. package/lib/application/relationship/relationship-projection.d.ts +14 -0
  97. package/lib/application/relationship/relationship-projection.d.ts.map +1 -0
  98. package/lib/application/relationship/relationship-projection.js +25 -0
  99. package/lib/application/relationship/relationship-projection.js.map +1 -0
  100. package/lib/application/relationship/relationship-service.d.ts +95 -0
  101. package/lib/application/relationship/relationship-service.d.ts.map +1 -0
  102. package/lib/application/relationship/relationship-service.js +254 -0
  103. package/lib/application/relationship/relationship-service.js.map +1 -0
  104. package/lib/application/workspace/workspace-service.d.ts +106 -0
  105. package/lib/application/workspace/workspace-service.d.ts.map +1 -0
  106. package/lib/application/workspace/workspace-service.js +44 -0
  107. package/lib/application/workspace/workspace-service.js.map +1 -0
  108. package/lib/bootstrap/create-domain.d.ts +5 -0
  109. package/lib/bootstrap/create-domain.d.ts.map +1 -0
  110. package/lib/bootstrap/create-domain.js +14 -0
  111. package/lib/bootstrap/create-domain.js.map +1 -0
  112. package/lib/bootstrap/create-repositories.d.ts +403 -0
  113. package/lib/bootstrap/create-repositories.d.ts.map +1 -0
  114. package/lib/bootstrap/create-repositories.js +39 -0
  115. package/lib/bootstrap/create-repositories.js.map +1 -0
  116. package/lib/bootstrap/create-runtime.d.ts +8 -0
  117. package/lib/bootstrap/create-runtime.d.ts.map +1 -0
  118. package/lib/bootstrap/create-runtime.js +10 -0
  119. package/lib/bootstrap/create-runtime.js.map +1 -0
  120. package/lib/bootstrap/create-services.d.ts +52 -0
  121. package/lib/bootstrap/create-services.d.ts.map +1 -0
  122. package/lib/bootstrap/create-services.js +79 -0
  123. package/lib/bootstrap/create-services.js.map +1 -0
  124. package/lib/bootstrap/install-commands.d.ts +4 -0
  125. package/lib/bootstrap/install-commands.d.ts.map +1 -0
  126. package/lib/bootstrap/install-commands.js +322 -0
  127. package/lib/bootstrap/install-commands.js.map +1 -0
  128. package/lib/bootstrap/install-http.d.ts +7 -0
  129. package/lib/bootstrap/install-http.d.ts.map +1 -0
  130. package/lib/bootstrap/install-http.js +265 -0
  131. package/lib/bootstrap/install-http.js.map +1 -0
  132. package/lib/bootstrap/lifecycle.d.ts +14 -0
  133. package/lib/bootstrap/lifecycle.d.ts.map +1 -0
  134. package/lib/bootstrap/lifecycle.js +56 -0
  135. package/lib/bootstrap/lifecycle.js.map +1 -0
  136. package/lib/bootstrap/types.d.ts +9 -0
  137. package/lib/bootstrap/types.d.ts.map +1 -0
  138. package/lib/bootstrap/types.js +2 -0
  139. package/lib/bootstrap/types.js.map +1 -0
  140. package/lib/client.js +6 -0
  141. package/lib/client.js.map +1 -0
  142. package/lib/core/audit-service.d.ts +43 -0
  143. package/lib/core/audit-service.d.ts.map +1 -0
  144. package/lib/core/audit-service.js +75 -0
  145. package/lib/core/audit-service.js.map +1 -0
  146. package/lib/core/candidate-extractor.d.ts +31 -0
  147. package/lib/core/candidate-extractor.d.ts.map +1 -0
  148. package/lib/core/candidate-extractor.js +83 -0
  149. package/lib/core/candidate-extractor.js.map +1 -0
  150. package/lib/core/candidate-service.d.ts +72 -0
  151. package/lib/core/candidate-service.d.ts.map +1 -0
  152. package/lib/core/candidate-service.js +283 -0
  153. package/lib/core/candidate-service.js.map +1 -0
  154. package/lib/core/character-service.d.ts +26 -0
  155. package/lib/core/character-service.d.ts.map +1 -0
  156. package/lib/core/character-service.js +68 -0
  157. package/lib/core/character-service.js.map +1 -0
  158. package/lib/core/chat-file-io.d.ts +28 -0
  159. package/lib/core/chat-file-io.d.ts.map +1 -0
  160. package/lib/core/chat-file-io.js +114 -0
  161. package/lib/core/chat-file-io.js.map +1 -0
  162. package/lib/core/chat-service.d.ts +4 -0
  163. package/lib/core/chat-service.d.ts.map +1 -0
  164. package/lib/core/chat-service.js +3 -0
  165. package/lib/core/chat-service.js.map +1 -0
  166. package/lib/core/command-arguments.d.ts +2 -0
  167. package/lib/core/command-arguments.d.ts.map +1 -0
  168. package/lib/core/command-arguments.js +42 -0
  169. package/lib/core/command-arguments.js.map +1 -0
  170. package/lib/core/companion-child-agent-service.d.ts +3 -0
  171. package/lib/core/companion-child-agent-service.d.ts.map +1 -0
  172. package/lib/core/companion-child-agent-service.js +3 -0
  173. package/lib/core/companion-child-agent-service.js.map +1 -0
  174. package/lib/core/companion-invocation-service.d.ts +3 -0
  175. package/lib/core/companion-invocation-service.d.ts.map +1 -0
  176. package/lib/core/companion-invocation-service.js +3 -0
  177. package/lib/core/companion-invocation-service.js.map +1 -0
  178. package/lib/core/companion-profile-service.d.ts +3 -0
  179. package/lib/core/companion-profile-service.d.ts.map +1 -0
  180. package/lib/core/companion-profile-service.js +3 -0
  181. package/lib/core/companion-profile-service.js.map +1 -0
  182. package/lib/core/companion-promotion-service.d.ts +3 -0
  183. package/lib/core/companion-promotion-service.d.ts.map +1 -0
  184. package/lib/core/companion-promotion-service.js +3 -0
  185. package/lib/core/companion-promotion-service.js.map +1 -0
  186. package/lib/core/context-assembler.d.ts +92 -0
  187. package/lib/core/context-assembler.d.ts.map +1 -0
  188. package/lib/core/context-assembler.js +185 -0
  189. package/lib/core/context-assembler.js.map +1 -0
  190. package/lib/core/conversation-repository.d.ts +42 -0
  191. package/lib/core/conversation-repository.d.ts.map +1 -0
  192. package/lib/core/conversation-repository.js +94 -0
  193. package/lib/core/conversation-repository.js.map +1 -0
  194. package/lib/core/group-chat-execution-service.d.ts +3 -0
  195. package/lib/core/group-chat-execution-service.d.ts.map +1 -0
  196. package/lib/core/group-chat-execution-service.js +3 -0
  197. package/lib/core/group-chat-execution-service.js.map +1 -0
  198. package/lib/core/group-chat-orchestrator.d.ts +3 -0
  199. package/lib/core/group-chat-orchestrator.d.ts.map +1 -0
  200. package/lib/core/group-chat-orchestrator.js +3 -0
  201. package/lib/core/group-chat-orchestrator.js.map +1 -0
  202. package/lib/core/memory-retriever.d.ts +3 -0
  203. package/lib/core/memory-retriever.d.ts.map +1 -0
  204. package/lib/core/memory-retriever.js +3 -0
  205. package/lib/core/memory-retriever.js.map +1 -0
  206. package/lib/core/memory-service.d.ts +3 -0
  207. package/lib/core/memory-service.d.ts.map +1 -0
  208. package/lib/core/memory-service.js +3 -0
  209. package/lib/core/memory-service.js.map +1 -0
  210. package/lib/core/personality-candidate-service.d.ts +46 -0
  211. package/lib/core/personality-candidate-service.d.ts.map +1 -0
  212. package/lib/core/personality-candidate-service.js +65 -0
  213. package/lib/core/personality-candidate-service.js.map +1 -0
  214. package/lib/core/prompt-assembler.d.ts +43 -0
  215. package/lib/core/prompt-assembler.d.ts.map +1 -0
  216. package/lib/core/prompt-assembler.js +67 -0
  217. package/lib/core/prompt-assembler.js.map +1 -0
  218. package/lib/core/relationship-event-service.d.ts +3 -0
  219. package/lib/core/relationship-event-service.d.ts.map +1 -0
  220. package/lib/core/relationship-event-service.js +3 -0
  221. package/lib/core/relationship-event-service.js.map +1 -0
  222. package/lib/core/relationship-policy.d.ts +3 -0
  223. package/lib/core/relationship-policy.d.ts.map +1 -0
  224. package/lib/core/relationship-policy.js +3 -0
  225. package/lib/core/relationship-policy.js.map +1 -0
  226. package/lib/core/relationship-projection.d.ts +3 -0
  227. package/lib/core/relationship-projection.d.ts.map +1 -0
  228. package/lib/core/relationship-projection.js +3 -0
  229. package/lib/core/relationship-projection.js.map +1 -0
  230. package/lib/core/relationship-service.d.ts +3 -0
  231. package/lib/core/relationship-service.d.ts.map +1 -0
  232. package/lib/core/relationship-service.js +3 -0
  233. package/lib/core/relationship-service.js.map +1 -0
  234. package/lib/core/roleplay-contract.d.ts +11 -0
  235. package/lib/core/roleplay-contract.d.ts.map +1 -0
  236. package/lib/core/roleplay-contract.js +27 -0
  237. package/lib/core/roleplay-contract.js.map +1 -0
  238. package/lib/core/runtime-binding-service.d.ts +19 -0
  239. package/lib/core/runtime-binding-service.d.ts.map +1 -0
  240. package/lib/core/runtime-binding-service.js +66 -0
  241. package/lib/core/runtime-binding-service.js.map +1 -0
  242. package/lib/core/scene-service.d.ts +60 -0
  243. package/lib/core/scene-service.d.ts.map +1 -0
  244. package/lib/core/scene-service.js +212 -0
  245. package/lib/core/scene-service.js.map +1 -0
  246. package/lib/core/session-binding-service.d.ts +51 -0
  247. package/lib/core/session-binding-service.d.ts.map +1 -0
  248. package/lib/core/session-binding-service.js +106 -0
  249. package/lib/core/session-binding-service.js.map +1 -0
  250. package/lib/core/skill-service.d.ts +82 -0
  251. package/lib/core/skill-service.d.ts.map +1 -0
  252. package/lib/core/skill-service.js +45 -0
  253. package/lib/core/skill-service.js.map +1 -0
  254. package/lib/core/tavern-session-bridge.d.ts +3 -0
  255. package/lib/core/tavern-session-bridge.d.ts.map +1 -0
  256. package/lib/core/tavern-session-bridge.js +3 -0
  257. package/lib/core/tavern-session-bridge.js.map +1 -0
  258. package/lib/core/user-resolver.d.ts +15 -0
  259. package/lib/core/user-resolver.d.ts.map +1 -0
  260. package/lib/core/user-resolver.js +17 -0
  261. package/lib/core/user-resolver.js.map +1 -0
  262. package/lib/core/workspace-service.d.ts +3 -0
  263. package/lib/core/workspace-service.d.ts.map +1 -0
  264. package/lib/core/workspace-service.js +3 -0
  265. package/lib/core/workspace-service.js.map +1 -0
  266. package/lib/core/workspace-session-service.d.ts +11 -0
  267. package/lib/core/workspace-session-service.d.ts.map +1 -0
  268. package/lib/core/workspace-session-service.js +14 -0
  269. package/lib/core/workspace-session-service.js.map +1 -0
  270. package/lib/domain/schemas.d.ts +1173 -0
  271. package/lib/domain/schemas.d.ts.map +1 -0
  272. package/lib/domain/schemas.js +590 -0
  273. package/lib/domain/schemas.js.map +1 -0
  274. package/lib/domain/spec.d.ts +494 -0
  275. package/lib/domain/spec.d.ts.map +1 -0
  276. package/lib/domain/spec.js +63 -0
  277. package/lib/domain/spec.js.map +1 -0
  278. package/lib/import/artifact-service.d.ts +33 -0
  279. package/lib/import/artifact-service.d.ts.map +1 -0
  280. package/lib/import/artifact-service.js +67 -0
  281. package/lib/import/artifact-service.js.map +1 -0
  282. package/lib/import/import-service.d.ts +30 -0
  283. package/lib/import/import-service.d.ts.map +1 -0
  284. package/lib/import/import-service.js +154 -0
  285. package/lib/import/import-service.js.map +1 -0
  286. package/lib/import/parser.d.ts +81 -0
  287. package/lib/import/parser.d.ts.map +1 -0
  288. package/lib/import/parser.js +423 -0
  289. package/lib/import/parser.js.map +1 -0
  290. package/lib/index.d.ts +60 -0
  291. package/lib/index.d.ts.map +1 -0
  292. package/lib/index.js +111 -0
  293. package/lib/index.js.map +1 -0
  294. package/lib/infrastructure/dsh/llm/llm-port.d.ts +3 -0
  295. package/lib/infrastructure/dsh/llm/llm-port.d.ts.map +1 -0
  296. package/lib/infrastructure/dsh/llm/llm-port.js +2 -0
  297. package/lib/infrastructure/dsh/llm/llm-port.js.map +1 -0
  298. package/lib/infrastructure/dsh/llm/model-gateway.d.ts +10 -0
  299. package/lib/infrastructure/dsh/llm/model-gateway.d.ts.map +1 -0
  300. package/lib/infrastructure/dsh/llm/model-gateway.js +21 -0
  301. package/lib/infrastructure/dsh/llm/model-gateway.js.map +1 -0
  302. package/lib/infrastructure/dsh/session/session-agent-provider.d.ts +28 -0
  303. package/lib/infrastructure/dsh/session/session-agent-provider.d.ts.map +1 -0
  304. package/lib/infrastructure/dsh/session/session-agent-provider.js +40 -0
  305. package/lib/infrastructure/dsh/session/session-agent-provider.js.map +1 -0
  306. package/lib/infrastructure/dsh/session/tavern-session-bridge.d.ts +142 -0
  307. package/lib/infrastructure/dsh/session/tavern-session-bridge.d.ts.map +1 -0
  308. package/lib/infrastructure/dsh/session/tavern-session-bridge.js +544 -0
  309. package/lib/infrastructure/dsh/session/tavern-session-bridge.js.map +1 -0
  310. package/lib/infrastructure/dsh/subagent/subagent-gateway.d.ts +63 -0
  311. package/lib/infrastructure/dsh/subagent/subagent-gateway.d.ts.map +1 -0
  312. package/lib/infrastructure/dsh/subagent/subagent-gateway.js +70 -0
  313. package/lib/infrastructure/dsh/subagent/subagent-gateway.js.map +1 -0
  314. package/lib/infrastructure/runtime/companion-runtime.d.ts +128 -0
  315. package/lib/infrastructure/runtime/companion-runtime.d.ts.map +1 -0
  316. package/lib/infrastructure/runtime/companion-runtime.js +127 -0
  317. package/lib/infrastructure/runtime/companion-runtime.js.map +1 -0
  318. package/lib/infrastructure/runtime/runtime-factory.d.ts +10 -0
  319. package/lib/infrastructure/runtime/runtime-factory.d.ts.map +1 -0
  320. package/lib/infrastructure/runtime/runtime-factory.js +14 -0
  321. package/lib/infrastructure/runtime/runtime-factory.js.map +1 -0
  322. package/lib/interfaces/http/chat/chat-http.d.ts +23 -0
  323. package/lib/interfaces/http/chat/chat-http.d.ts.map +1 -0
  324. package/lib/interfaces/http/chat/chat-http.js +310 -0
  325. package/lib/interfaces/http/chat/chat-http.js.map +1 -0
  326. package/lib/interfaces/http/companion/companion-http.d.ts +8 -0
  327. package/lib/interfaces/http/companion/companion-http.d.ts.map +1 -0
  328. package/lib/interfaces/http/companion/companion-http.js +76 -0
  329. package/lib/interfaces/http/companion/companion-http.js.map +1 -0
  330. package/lib/interfaces/http/companion/promotion-http.d.ts +6 -0
  331. package/lib/interfaces/http/companion/promotion-http.d.ts.map +1 -0
  332. package/lib/interfaces/http/companion/promotion-http.js +25 -0
  333. package/lib/interfaces/http/companion/promotion-http.js.map +1 -0
  334. package/lib/interfaces/http/companion/runtime-http.d.ts +13 -0
  335. package/lib/interfaces/http/companion/runtime-http.d.ts.map +1 -0
  336. package/lib/interfaces/http/companion/runtime-http.js +51 -0
  337. package/lib/interfaces/http/companion/runtime-http.js.map +1 -0
  338. package/lib/interfaces/http/companion/stage4-companion-http.d.ts +30 -0
  339. package/lib/interfaces/http/companion/stage4-companion-http.d.ts.map +1 -0
  340. package/lib/interfaces/http/companion/stage4-companion-http.js +149 -0
  341. package/lib/interfaces/http/companion/stage4-companion-http.js.map +1 -0
  342. package/lib/interfaces/http/group/group-http.d.ts +11 -0
  343. package/lib/interfaces/http/group/group-http.d.ts.map +1 -0
  344. package/lib/interfaces/http/group/group-http.js +77 -0
  345. package/lib/interfaces/http/group/group-http.js.map +1 -0
  346. package/lib/interfaces/http/memory/candidate-http.d.ts +8 -0
  347. package/lib/interfaces/http/memory/candidate-http.d.ts.map +1 -0
  348. package/lib/interfaces/http/memory/candidate-http.js +86 -0
  349. package/lib/interfaces/http/memory/candidate-http.js.map +1 -0
  350. package/lib/interfaces/http/relationship/companion-relationship-http.d.ts +7 -0
  351. package/lib/interfaces/http/relationship/companion-relationship-http.d.ts.map +1 -0
  352. package/lib/interfaces/http/relationship/companion-relationship-http.js +30 -0
  353. package/lib/interfaces/http/relationship/companion-relationship-http.js.map +1 -0
  354. package/lib/interfaces/http/workspace/workspace-http.d.ts +19 -0
  355. package/lib/interfaces/http/workspace/workspace-http.d.ts.map +1 -0
  356. package/lib/interfaces/http/workspace/workspace-http.js +78 -0
  357. package/lib/interfaces/http/workspace/workspace-http.js.map +1 -0
  358. package/lib/interfaces/read-model/tavern-read-api.d.ts +44 -0
  359. package/lib/interfaces/read-model/tavern-read-api.d.ts.map +1 -0
  360. package/lib/interfaces/read-model/tavern-read-api.js +189 -0
  361. package/lib/interfaces/read-model/tavern-read-api.js.map +1 -0
  362. package/lib/remote/candidate-api.d.ts +3 -0
  363. package/lib/remote/candidate-api.d.ts.map +1 -0
  364. package/lib/remote/candidate-api.js +3 -0
  365. package/lib/remote/candidate-api.js.map +1 -0
  366. package/lib/remote/chat-api.d.ts +3 -0
  367. package/lib/remote/chat-api.d.ts.map +1 -0
  368. package/lib/remote/chat-api.js +3 -0
  369. package/lib/remote/chat-api.js.map +1 -0
  370. package/lib/remote/companion-api.d.ts +3 -0
  371. package/lib/remote/companion-api.d.ts.map +1 -0
  372. package/lib/remote/companion-api.js +3 -0
  373. package/lib/remote/companion-api.js.map +1 -0
  374. package/lib/remote/companion-promotion-api.d.ts +3 -0
  375. package/lib/remote/companion-promotion-api.d.ts.map +1 -0
  376. package/lib/remote/companion-promotion-api.js +3 -0
  377. package/lib/remote/companion-promotion-api.js.map +1 -0
  378. package/lib/remote/import-http.d.ts +29 -0
  379. package/lib/remote/import-http.d.ts.map +1 -0
  380. package/lib/remote/import-http.js +106 -0
  381. package/lib/remote/import-http.js.map +1 -0
  382. package/lib/remote/stage4-api.d.ts +6 -0
  383. package/lib/remote/stage4-api.d.ts.map +1 -0
  384. package/lib/remote/stage4-api.js +4 -0
  385. package/lib/remote/stage4-api.js.map +1 -0
  386. package/lib/remote/stage5-runtime-api.d.ts +4 -0
  387. package/lib/remote/stage5-runtime-api.d.ts.map +1 -0
  388. package/lib/remote/stage5-runtime-api.js +2 -0
  389. package/lib/remote/stage5-runtime-api.js.map +1 -0
  390. package/lib/remote/stage6-group-api.d.ts +4 -0
  391. package/lib/remote/stage6-group-api.d.ts.map +1 -0
  392. package/lib/remote/stage6-group-api.js +2 -0
  393. package/lib/remote/stage6-group-api.js.map +1 -0
  394. package/lib/remote/tavern-api.d.ts +3 -0
  395. package/lib/remote/tavern-api.d.ts.map +1 -0
  396. package/lib/remote/tavern-api.js +3 -0
  397. package/lib/remote/tavern-api.js.map +1 -0
  398. package/lib/runtime/agent-orchestrator.d.ts +3 -0
  399. package/lib/runtime/agent-orchestrator.d.ts.map +1 -0
  400. package/lib/runtime/agent-orchestrator.js +3 -0
  401. package/lib/runtime/agent-orchestrator.js.map +1 -0
  402. package/lib/runtime/companion-runtime.d.ts +3 -0
  403. package/lib/runtime/companion-runtime.d.ts.map +1 -0
  404. package/lib/runtime/companion-runtime.js +3 -0
  405. package/lib/runtime/companion-runtime.js.map +1 -0
  406. package/lib/runtime/langgraph-graph.d.ts +32 -0
  407. package/lib/runtime/langgraph-graph.d.ts.map +1 -0
  408. package/lib/runtime/langgraph-graph.js +32 -0
  409. package/lib/runtime/langgraph-graph.js.map +1 -0
  410. package/lib/runtime/state.d.ts +38 -0
  411. package/lib/runtime/state.d.ts.map +1 -0
  412. package/lib/runtime/state.js +16 -0
  413. package/lib/runtime/state.js.map +1 -0
  414. package/lib/seed/elaine.d.ts +9 -0
  415. package/lib/seed/elaine.d.ts.map +1 -0
  416. package/lib/seed/elaine.js +27 -0
  417. package/lib/seed/elaine.js.map +1 -0
  418. package/lib/tools/import-character.d.ts +16 -0
  419. package/lib/tools/import-character.d.ts.map +1 -0
  420. package/lib/tools/import-character.js +98 -0
  421. package/lib/tools/import-character.js.map +1 -0
  422. package/package.json +108 -0
@@ -0,0 +1,544 @@
1
+ /**
2
+ * TavernSessionBridge —— DSH 原生会话 ↔ ChatService 桥(阶段 2,ADR-008;呈现方案 v2)。
3
+ *
4
+ * 架构(选项 B,spike 已验证):
5
+ * 角色卡会话 = DSH Session + agent(原生输入/呈现/持久化全复用;每角色一行),
6
+ * 聊天文件 = Tavern Conversation(一个角色多个),activeConversationId 为当前文件;
7
+ * 我们在 agent 的 `agent/pre-step`(waterfall)拦截 LLM 调用:
8
+ * 1. 补写 user/message(消息已从 inbox 移出,agent 不再写);
9
+ * 2. 转 ChatService.stream(写当前聊天文件 + 返回流);
10
+ * 3. 回复以 assistant/chunk(流式)+ assistant/message 注入同一 turn/step;
11
+ * 4. 返回 { kind: 'reject' } → agent 不调 LLM,turn 以 blocked 干净结束。
12
+ *
13
+ * 切换聊天文件:更新 activeConversationId + reproject(surface replace 把旧投影
14
+ * 替换为新聊天文件消息)。
15
+ * 恢复:进程启动时对 binding 表全部 sessionId 调 agents.resume 并重挂拦截器。
16
+ */
17
+ import { randomUUID } from 'node:crypto';
18
+ import { createAssistantMessage, createUserMessage } from '@deepseek-ai/dsh-llm';
19
+ function textOf(message) {
20
+ return message.content
21
+ .filter(block => block.type === 'text')
22
+ .map(block => block.text)
23
+ .join('');
24
+ }
25
+ /** 绑定行当前打开的聊天文件:旧 1:1 行无 activeConversationId → 回退 sessionId(旧语义 sessionId === conversationId)。 */
26
+ function conversationOf(binding) {
27
+ // 兼容最早的 1:1 binding:当时 sessionId 即 conversationId。
28
+ return binding.conversationId ?? binding.activeConversationId ?? binding.sessionId;
29
+ }
30
+ export class TavernSessionBridge {
31
+ #userResolver;
32
+ #characters;
33
+ #bindingService;
34
+ #chatService;
35
+ #modelSelection;
36
+ /** Tavern 工作区目录(会话 header.cwd 必须等于它才能 attach,ADR-008)。 */
37
+ #tavernWorkspacePath;
38
+ #workspaceAttachResults = new Map();
39
+ #companions;
40
+ /** Host-owned parent sessions for HTTP-driven entertainment batches. */
41
+ #entertainmentSessions = new Map();
42
+ #nativeHandlers = new Map();
43
+ /** sessionId → pre-step 监听 disposer:复用/重建时先移除旧监听再挂新 binding。 */
44
+ #interceptors = new Map();
45
+ /** attach 失败的会话(workspaceRegistry 未就绪等)——registry 就绪后重试补挂。 */
46
+ #pendingAttach = new Set();
47
+ /** 最近一次 reconcile 统计(diag 可观测)。 */
48
+ #reconcileSummary = {
49
+ restored: 0, rebuilt: 0, created: 0, failed: [],
50
+ };
51
+ constructor(userResolver, characters, bindingService, chatService, modelSelection, tavernWorkspacePath, companions) {
52
+ this.#userResolver = userResolver;
53
+ this.#characters = characters;
54
+ this.#bindingService = bindingService;
55
+ this.#chatService = chatService;
56
+ this.#modelSelection = modelSelection;
57
+ this.#tavernWorkspacePath = tavernWorkspacePath;
58
+ this.#companions = companions;
59
+ }
60
+ /**
61
+ * 新建聊天文件(呈现方案 v2):
62
+ * - 角色首次:创建角色会话(DSH Session/agent/binding,sessionId = conversationId);
63
+ * - 角色已有会话:复用角色会话,仅新建聊天文件并切换 active(重投影到该会话)。
64
+ * 返回 { sessionId(角色会话), conversationId(新聊天文件), workspace }。
65
+ */
66
+ async bindNew(ctx, params) {
67
+ const { conversationId } = await this.#chatService.startConversation({
68
+ characterId: params.characterId,
69
+ ...(params.greetingIndex === undefined ? {} : { greetingIndex: params.greetingIndex }),
70
+ ...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
71
+ });
72
+ return this.openConversation(ctx, conversationId);
73
+ }
74
+ /** 伙伴 Agent 会话:创建或恢复以伙伴档案为 persona 的个人 Agent 聊天。 */
75
+ async bindCompanionAgent(ctx, profile) {
76
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
77
+ const existing = await this.#bindingService.getByCompanion(ownerUserId, profile.id);
78
+ if (existing !== null) {
79
+ const conversationId = conversationOf(existing);
80
+ const opened = await this.openConversation(ctx, conversationId, profile.id);
81
+ return { ...opened, restored: true };
82
+ }
83
+ const created = await this.#chatService.startConversation({ characterId: profile.characterId });
84
+ const opened = await this.openConversation(ctx, created.conversationId, profile.id);
85
+ return { ...opened, restored: false };
86
+ }
87
+ /** Creates a native DSH session for an entertainment workspace. No Tavern Conversation is attached. */
88
+ async openEntertainmentSpace(ctx, title, key = title, handler) {
89
+ const agents = ctx.get('agents');
90
+ if (agents === undefined)
91
+ throw new Error('[Tavern] agents 服务不可用(无 dsh-agent)');
92
+ const existingId = this.#entertainmentSessions.get(key);
93
+ if (existingId !== undefined && agents.get(existingId) !== undefined) {
94
+ if (handler !== undefined) {
95
+ const existing = agents.get(existingId);
96
+ existing.ctx.on('agent/pre-step', (payload, _next) => handler(existing.session, payload));
97
+ }
98
+ return { sessionId: existingId, workspace: await this.attachToTavernWorkspace(ctx, existingId) };
99
+ }
100
+ const sessionId = randomUUID();
101
+ const selection = this.#modelSelection();
102
+ const handle = await agents.create({
103
+ sessionId,
104
+ agentOptions: { provider: selection.provider, model: selection.model },
105
+ meta: { cwd: this.#tavernWorkspacePath },
106
+ });
107
+ const nativeHandler = handler;
108
+ if (nativeHandler !== undefined) {
109
+ handle.agent.ctx.on('agent/pre-step', (payload, next) => {
110
+ if (handle.agent.id !== sessionId)
111
+ return next();
112
+ return nativeHandler(handle.agent.session, payload);
113
+ });
114
+ }
115
+ this.#entertainmentSessions.set(key, sessionId);
116
+ if (handler !== undefined)
117
+ this.#nativeHandlers.set(sessionId, handler);
118
+ await this.renameSession(ctx, handle.agent.session, `娱乐空间 · ${title}`);
119
+ return { sessionId, workspace: await this.attachToTavernWorkspace(ctx, sessionId) };
120
+ }
121
+ /** 将既有聊天文件载入它独有的原生 DSH Session;companionProfileId 存在时标记为伙伴 Agent 会话。 */
122
+ async openConversation(ctx, conversationId, companionProfileId) {
123
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
124
+ const conversation = await this.#chatService.getConversation(conversationId);
125
+ if (conversation === null)
126
+ throw new Error(`[Tavern] 聊天文件不存在:${conversationId}`);
127
+ if (conversation.status !== 'active')
128
+ throw new Error('[Tavern] 该聊天文件不可打开');
129
+ const agents = ctx.get('agents');
130
+ if (agents === undefined)
131
+ throw new Error('[Tavern] agents 服务不可用(无 dsh-agent)');
132
+ const existing = await this.#bindingService.getByConversation(ownerUserId, conversationId);
133
+ if (existing !== null) {
134
+ const agent = agents.get(existing.sessionId);
135
+ // DSH 原生归档保留 session 日志却把它从 workspace 隐藏。此时不可直接
136
+ // open 旧 session,否则客户端会打开一个归档的空视图;解除绑定并以 Tavern
137
+ // Conversation 为事实源创建新呈现 session,历史会重新投影。
138
+ const archived = await this.isSessionArchived(ctx, existing.sessionId);
139
+ if (!archived && agent !== undefined && agent.session.header.cwd === this.#tavernWorkspacePath) {
140
+ this.attachInterceptor(agent, existing);
141
+ const workspace = await this.attachToTavernWorkspace(ctx, existing.sessionId);
142
+ return { sessionId: existing.sessionId, conversationId, workspace };
143
+ }
144
+ await this.#bindingService.remove(existing.sessionId);
145
+ }
146
+ const sessionId = randomUUID();
147
+ const selection = this.#modelSelection();
148
+ const handle = await agents.create({
149
+ sessionId,
150
+ agentOptions: { provider: selection.provider, model: selection.model },
151
+ meta: { cwd: this.#tavernWorkspacePath },
152
+ });
153
+ const binding = await this.#bindingService.upsert({
154
+ sessionId,
155
+ conversationId,
156
+ characterId: conversation.characterId,
157
+ ownerUserId,
158
+ ...(companionProfileId === undefined ? {} : { companionProfileId }),
159
+ });
160
+ this.attachInterceptor(handle.agent, binding);
161
+ await this.projectHistory(handle.agent.session, conversationId);
162
+ const character = this.#characters.get(conversation.characterId);
163
+ if (character !== null) {
164
+ const label = conversation.title?.trim() || new Date(conversation.createdAt).toLocaleDateString('zh-CN');
165
+ await this.renameSession(ctx, handle.agent.session, `${character.name} · ${label}`);
166
+ }
167
+ const workspace = await this.attachToTavernWorkspace(ctx, sessionId);
168
+ return { sessionId, conversationId, workspace };
169
+ }
170
+ /** 检查 DSH 原生归档状态;无 workspaceRegistry 时保持可用的 false 降级。 */
171
+ async isSessionArchived(ctx, sessionId) {
172
+ return new Promise(resolve => {
173
+ let settled = false;
174
+ const done = (value) => { if (!settled) {
175
+ settled = true;
176
+ resolve(value);
177
+ } };
178
+ const timer = setTimeout(() => done(false), 500);
179
+ void Promise.resolve(ctx.inject(['workspaceRegistry'], async (wsCtx) => {
180
+ const registry = wsCtx.get('workspaceRegistry');
181
+ clearTimeout(timer);
182
+ done(registry?.archivedSessionIds?.includes(sessionId) ?? false);
183
+ })).catch(() => { clearTimeout(timer); done(false); });
184
+ });
185
+ }
186
+ /** 会话标题 = 角色名(sessionTitle 服务,超时保护;失败不影响聊天)。 */
187
+ async renameSession(ctx, session, title) {
188
+ await Promise.race([
189
+ Promise.resolve(ctx.inject(['sessionTitle'], async (stCtx) => {
190
+ const titles = stCtx.get('sessionTitle');
191
+ if (titles !== undefined) {
192
+ titles.rename(session, title);
193
+ }
194
+ })).catch(() => { }),
195
+ new Promise(resolve => setTimeout(resolve, 2000)),
196
+ ]);
197
+ }
198
+ /** 把会话计入 Tavern 工作区(Host 端 workspaceRegistry + attachSession)。 */
199
+ async attachToTavernWorkspace(ctx, sessionId) {
200
+ const unavailable = (status, error) => {
201
+ ctx.logger.warn(`[Tavern] workspace attach ${status}: session=${sessionId} path=${this.#tavernWorkspacePath} error=${error}`);
202
+ return { status, sessionId, error };
203
+ };
204
+ let timer;
205
+ try {
206
+ const outcome = await Promise.race([
207
+ new Promise(resolve => {
208
+ void Promise.resolve(ctx.inject(['workspaceRegistry'], async (wsCtx) => {
209
+ const registry = wsCtx.get('workspaceRegistry');
210
+ if (registry === undefined) {
211
+ resolve(unavailable('registry-unavailable', 'workspaceRegistry 服务未注入'));
212
+ return;
213
+ }
214
+ try {
215
+ const workspace = await registry.create(this.#tavernWorkspacePath, '🍷 Tavern');
216
+ ctx.logger.info(`[Tavern] workspace ready: session=${sessionId} path=${workspace.path ?? this.#tavernWorkspacePath}`);
217
+ await workspace.attachSession(sessionId);
218
+ ctx.logger.info(`[Tavern] workspace attached: session=${sessionId} path=${workspace.path ?? this.#tavernWorkspacePath}`);
219
+ resolve({ status: 'attached', sessionId });
220
+ }
221
+ catch (error) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ const status = message.includes('create') ? 'workspace-create-failed' : 'attach-failed';
224
+ resolve(unavailable(status, message));
225
+ }
226
+ })).catch(error => {
227
+ const message = error instanceof Error ? error.message : String(error);
228
+ resolve(unavailable('registry-unavailable', message));
229
+ });
230
+ }),
231
+ new Promise(resolve => {
232
+ timer = setTimeout(() => resolve(unavailable('injection-timeout', '等待 workspaceRegistry 注入超过 2000ms')), 2000);
233
+ }),
234
+ ]);
235
+ this.#workspaceAttachResults.set(sessionId, outcome);
236
+ if (outcome.status === 'attached') {
237
+ this.#pendingAttach.delete(sessionId);
238
+ }
239
+ else {
240
+ // registry 未就绪/超时等:登记重试队列,就绪后由 retryPendingAttach 补挂。
241
+ this.#pendingAttach.add(sessionId);
242
+ }
243
+ return outcome;
244
+ }
245
+ finally {
246
+ if (timer !== undefined)
247
+ clearTimeout(timer);
248
+ }
249
+ }
250
+ /** 重试挂起的 attach(workspaceRegistry 就绪后调用;幂等)。返回本次成功数。 */
251
+ async retryPendingAttach(ctx) {
252
+ let attached = 0;
253
+ for (const sessionId of [...this.#pendingAttach]) {
254
+ const result = await this.attachToTavernWorkspace(ctx, sessionId);
255
+ if (result.status === 'attached')
256
+ attached += 1;
257
+ }
258
+ return attached;
259
+ }
260
+ /**
261
+ * 把 Conversation 消息树投影到 DSH Session(原生 UI 呈现层)。
262
+ * 幂等:session 已有消息(持久化恢复/已投影)时不重复写入。
263
+ * 每条消息以 user/message 或 assistant/message + surfaceOp 'append' 追加,
264
+ * 与 pre-step 拦截注入共用同一 surface 通道(ADR-008)。
265
+ */
266
+ async projectHistory(session, conversationId) {
267
+ // 空会话可能仍带有非消息 surface 节点;只有已经存在聊天消息时才视为已投影,
268
+ // 否则重新载入聊天文件会错误显示为空白。
269
+ if (session.events.some(event => event.type === 'user/message' || event.type === 'assistant/message'))
270
+ return 0;
271
+ const messages = await this.#chatService.listMessages(conversationId);
272
+ const selection = this.#modelSelection();
273
+ let projected = 0;
274
+ let step = 0;
275
+ for (const message of messages) {
276
+ if (message.role === 'assistant') {
277
+ step += 1;
278
+ const assistant = createAssistantMessage({
279
+ content: [{ type: 'text', text: message.content }],
280
+ source: { provider: selection.provider, model: selection.model },
281
+ });
282
+ session.append('assistant/message', { turn: 1, step, message: assistant }, { surfaceOp: 'append' });
283
+ projected += 1;
284
+ }
285
+ else if (message.role === 'user') {
286
+ // 历史聊天的用户发言必须用 DSH 原生 user source。plugin/relay 事件虽能
287
+ // 写入 session,却会被 Web 原生聊天视图视为插件上下文而折叠或隐藏。
288
+ const user = createUserMessage({
289
+ content: [{ type: 'text', text: message.content }],
290
+ source: { kind: 'user' },
291
+ });
292
+ session.append('user/message', user, { surfaceOp: 'append' });
293
+ projected += 1;
294
+ }
295
+ }
296
+ return projected;
297
+ }
298
+ workspaceDiagnostic(sessionId) {
299
+ return {
300
+ tavernWorkspacePath: this.#tavernWorkspacePath,
301
+ attach: sessionId === undefined ? undefined : this.#workspaceAttachResults.get(sessionId),
302
+ reconcile: this.#reconcileSummary,
303
+ pendingAttach: [...this.#pendingAttach],
304
+ };
305
+ }
306
+ /** 将伙伴档案组装为个人 Agent 会话 system 提示词。 */
307
+ async #companionSystemFor(companionProfileId) {
308
+ if (this.#companions === undefined)
309
+ return undefined;
310
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
311
+ const profile = this.#companions.getForUser(ownerUserId, companionProfileId);
312
+ if (profile === null)
313
+ return undefined;
314
+ const character = this.#characters.get(profile.characterId);
315
+ const blocks = [];
316
+ blocks.push(`你是「${profile.displayName ?? profile.identitySummary ?? character?.name ?? '伙伴'}」,已经从角色卡《${character?.name ?? profile.characterId}》的原本世界升格为用户身边的个人 Agent 与长期伙伴。保留角色性格、说话方式、背景与记忆,以活生生的角色扮演伙伴身份和用户相处;不要继续假装自己还困在原剧情里。`);
317
+ if (profile.identitySummary?.trim())
318
+ blocks.push(`基本信息与背景:${profile.identitySummary.trim()}`);
319
+ if (profile.personalitySummary?.trim())
320
+ blocks.push(`性格:${profile.personalitySummary.trim()}`);
321
+ if (profile.userRelationshipSummary?.trim())
322
+ blocks.push(`你和用户的关系:${profile.userRelationshipSummary.trim()}`);
323
+ if (profile.sharedHistorySummary?.trim())
324
+ blocks.push(`共同经历:${profile.sharedHistorySummary.trim()}`);
325
+ if (profile.communicationPreferences?.trim())
326
+ blocks.push(`交流偏好:${profile.communicationPreferences.trim()}`);
327
+ if (profile.boundaries.length > 0)
328
+ blocks.push(`行为边界:${profile.boundaries.join(';')}`);
329
+ if (profile.goals.length > 0)
330
+ blocks.push(`长期目标:${profile.goals.join(';')}`);
331
+ if (character?.persona.trim())
332
+ blocks.push(`角色卡原始设定(仅作人物底色):${character.persona.trim()}`);
333
+ return blocks.join('\n\n');
334
+ }
335
+ /** 聊天文件移入回收站时,仅解除其 Tavern binding;消息事实源不受影响。 */
336
+ async closeConversationSession(ctx, conversationId) {
337
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
338
+ const binding = await this.#bindingService.getByConversation(ownerUserId, conversationId);
339
+ if (binding === null)
340
+ return false;
341
+ const agents = ctx.get('agents');
342
+ const agent = agents?.get(binding.sessionId);
343
+ if (agent !== undefined) {
344
+ this.#interceptors.get(agent.id)?.();
345
+ this.#interceptors.delete(agent.id);
346
+ }
347
+ await this.#bindingService.remove(binding.sessionId);
348
+ this.#workspaceAttachResults.delete(binding.sessionId);
349
+ this.#pendingAttach.delete(binding.sessionId);
350
+ return true;
351
+ }
352
+ /** 角色进入 Tavern 回收站时,解除其所有原生会话呈现租约。 */
353
+ async closeCharacterSessions(ctx, characterId) {
354
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
355
+ const bindings = await this.#bindingService.listByCharacter(ownerUserId, characterId);
356
+ const agents = ctx.get('agents');
357
+ for (const binding of bindings) {
358
+ const agent = agents?.get(binding.sessionId);
359
+ if (agent !== undefined) {
360
+ const disposer = this.#interceptors.get(agent.id);
361
+ disposer?.();
362
+ this.#interceptors.delete(agent.id);
363
+ // DSH 原生 session 归档/移除由其自身实现;Tavern 只释放绑定,防止后续输入继续写入已删除角色。
364
+ }
365
+ await this.#bindingService.remove(binding.sessionId);
366
+ this.#workspaceAttachResults.delete(binding.sessionId);
367
+ this.#pendingAttach.delete(binding.sessionId);
368
+ }
369
+ void ctx;
370
+ return bindings.length;
371
+ }
372
+ /** 当前用户的绑定会话列表(工作区/管理 tab 的数据面)。 */
373
+ async listBindings() {
374
+ const ownerUserId = await this.#userResolver.getCurrentUserId();
375
+ const bindings = await this.#bindingService.listByUser(ownerUserId);
376
+ return bindings.map(binding => ({
377
+ sessionId: binding.sessionId,
378
+ conversationId: conversationOf(binding),
379
+ characterId: binding.characterId,
380
+ updatedAt: binding.updatedAt,
381
+ }));
382
+ }
383
+ /**
384
+ * 启动恢复 + 工作区归组(方案 A):
385
+ * 1. 现有绑定:resume → header.cwd 校验——无 cwd / 不匹配 → 重建角色会话
386
+ * (meta.cwd = 工作区路径,attach 必需)→ attach + 投影;旧会话 retire;
387
+ * 2. 无绑定角色:自动补建角色会话(工作区 = 全部角色卡,呈现方案 v2)。
388
+ * 返回 { restored, rebuilt, created, failed }。
389
+ */
390
+ async resumeAll(ctx) {
391
+ const agents = ctx.get('agents');
392
+ const bindings = await this.#bindingService.listAll();
393
+ const failed = [];
394
+ let restored = 0;
395
+ let rebuilt = 0;
396
+ let created = 0;
397
+ // 1. 现有绑定:resume → cwd 校验 → 保留或重建。
398
+ if (agents !== undefined) {
399
+ for (const binding of bindings) {
400
+ try {
401
+ const selection = this.#modelSelection();
402
+ const handle = await agents.resume({
403
+ resumeSessionId: binding.sessionId,
404
+ agentOptions: { provider: selection.provider, model: selection.model },
405
+ });
406
+ const cwd = handle.agent.session.header.cwd;
407
+ if (cwd !== this.#tavernWorkspacePath) {
408
+ // 旧会话(M1 前无 cwd / cwd 不匹配):attachSession 会拒绝
409
+ // ("stored header carries no cwd to validate against")→ 重建角色会话。
410
+ const newSessionId = randomUUID();
411
+ const newHandle = await agents.create({
412
+ sessionId: newSessionId,
413
+ agentOptions: { provider: selection.provider, model: selection.model },
414
+ meta: { cwd: this.#tavernWorkspacePath },
415
+ });
416
+ const newBinding = await this.#bindingService.upsert({
417
+ sessionId: newSessionId,
418
+ characterId: binding.characterId,
419
+ ownerUserId: binding.ownerUserId,
420
+ conversationId: conversationOf(binding),
421
+ ...(binding.companionProfileId === undefined ? {} : { companionProfileId: binding.companionProfileId }),
422
+ });
423
+ this.attachInterceptor(newHandle.agent, newBinding);
424
+ // 会话标题 = 角色名(重建会话默认标题 = cwd basename "tavern-workspace")。
425
+ const character = this.#characters.get(binding.characterId);
426
+ if (character !== null) {
427
+ const conversation = await this.#chatService.getConversation(conversationOf(binding));
428
+ const label = conversation?.title?.trim() || (conversation === null ? '' : new Date(conversation.createdAt).toLocaleDateString('zh-CN'));
429
+ await this.renameSession(ctx, newHandle.agent.session, label === '' ? character.name : `${character.name} · ${label}`);
430
+ }
431
+ await this.attachToTavernWorkspace(ctx, newSessionId);
432
+ await this.projectHistory(newHandle.agent.session, conversationOf(binding));
433
+ await handle.dispose(); // 旧会话 retire(store 移除;持久化 log 保留可审计)
434
+ rebuilt += 1;
435
+ }
436
+ else {
437
+ this.attachInterceptor(handle.agent, binding);
438
+ await this.projectHistory(handle.agent.session, conversationOf(binding));
439
+ await this.attachToTavernWorkspace(ctx, binding.sessionId);
440
+ restored += 1;
441
+ }
442
+ }
443
+ catch (error) {
444
+ failed.push(`${binding.sessionId}: ${error instanceof Error ? error.message : String(error)}`);
445
+ }
446
+ }
447
+ }
448
+ // 不为无绑定角色或聊天文件自动创建会话:Tavern 工作区只展示用户明确打开的聊天。
449
+ void created;
450
+ this.#reconcileSummary = { restored, rebuilt, created, failed };
451
+ return { restored, rebuilt, created, failed };
452
+ }
453
+ /** 挂 pre-step 拦截器(agent 创建/恢复后调用;agent-scoped 监听)。
454
+ * 同一 agent 重复挂载(复用/重建)会先移除旧监听——旧闭包持有过期 binding。 */
455
+ attachInterceptor(agent, binding) {
456
+ const existing = this.#interceptors.get(agent.id);
457
+ if (existing !== undefined) {
458
+ existing();
459
+ this.#interceptors.delete(agent.id);
460
+ }
461
+ const session = agent.session;
462
+ const bridge = this;
463
+ const disposer = agent.ctx.on('agent/pre-step', async (payload, next) => {
464
+ // 只处理本绑定会话(agent-scoped 已限定本 agent,双保险校验 id)。
465
+ if (agent.id !== binding.sessionId)
466
+ return next();
467
+ return bridge.handlePreStep(session, binding, payload);
468
+ });
469
+ this.#interceptors.set(agent.id, disposer);
470
+ }
471
+ /**
472
+ * 拦截一个 step(可测核心,不依赖真实 Agent):
473
+ * 补写 user/message → ChatService.stream → 注入 assistant 流 + 终态 → reject。
474
+ */
475
+ async handlePreStep(session, binding, payload) {
476
+ const user = payload.messages[0];
477
+ if (user !== undefined) {
478
+ // 消息已从 inbox 移出且 step 被拒绝,agent 不会写 user/message——由我们补写。
479
+ session.append('user/message', user, { surfaceOp: 'append' });
480
+ }
481
+ const userText = user === undefined ? '' : textOf(user);
482
+ const { turn } = payload;
483
+ // step 避开投影历史已占用的编号:projectHistory 投影的开场白与 agent 首个
484
+ // 回合都落在 turn=1(agent 内部 phase 计数),若都用 step=1,原生 UI 会把
485
+ // 同 (turn, step) 的两条 assistant 消息折叠为一条(开场白消失)。
486
+ const usedSteps = new Set();
487
+ for (const event of session.events) {
488
+ if (event.type === 'assistant/message' && event.data.turn === turn) {
489
+ usedSteps.add(event.data.step);
490
+ }
491
+ }
492
+ let step = payload.step;
493
+ while (usedSteps.has(step))
494
+ step += 1;
495
+ try {
496
+ const systemOverride = binding.companionProfileId === undefined
497
+ ? undefined
498
+ : await this.#companionSystemFor(binding.companionProfileId);
499
+ const result = await this.#chatService.stream({
500
+ characterId: binding.characterId,
501
+ message: userText,
502
+ conversationId: conversationOf(binding),
503
+ ...(systemOverride === undefined ? {} : { systemOverride }),
504
+ });
505
+ let text = '';
506
+ session.append('assistant/chunk', {
507
+ turn,
508
+ step,
509
+ chunk: { type: 'block-start', index: 0, blockType: 'text' },
510
+ });
511
+ for await (const delta of result.stream) {
512
+ if (payload.signal.aborted)
513
+ break;
514
+ text += delta;
515
+ session.append('assistant/chunk', {
516
+ turn,
517
+ step,
518
+ chunk: { type: 'text-delta', index: 0, text: delta },
519
+ });
520
+ }
521
+ if (text !== '') {
522
+ session.append('assistant/chunk', {
523
+ turn,
524
+ step,
525
+ chunk: { type: 'block-end', index: 0, block: { type: 'text', text } },
526
+ });
527
+ const selection = this.#modelSelection();
528
+ const message = createAssistantMessage({
529
+ content: [{ type: 'text', text }],
530
+ source: { provider: selection.provider, model: selection.model },
531
+ });
532
+ session.append('assistant/message', { turn, step, message }, { surfaceOp: 'append' });
533
+ }
534
+ }
535
+ catch (error) {
536
+ // 生成失败:turn 以 blocked 结束,UI 显示无回复(错误已入 Conversation 审计面?暂无)。
537
+ // 保留日志线索:不向 session 注入失败文本,避免把错误当角色回复。
538
+ void error;
539
+ }
540
+ // 不调用 next():拒绝该 step(agent 永不调 LLM)。
541
+ return { kind: 'reject' };
542
+ }
543
+ }
544
+ //# sourceMappingURL=tavern-session-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tavern-session-bridge.js","sourceRoot":"","sources":["../../../../src/infrastructure/dsh/session/tavern-session-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * SubagentGateway —— 对 ctx.subagents 的窄适配器。
3
+ * 所有 continuable 子代理的创建、续推和中断均通过此适配器。
4
+ */
5
+ import type { Context } from '@deepseek-ai/cordis';
6
+ import type { Agent, AgentOptions } from '@deepseek-ai/dsh-agent';
7
+ import type { ContentBlock, MessageId, MessageSource } from '@deepseek-ai/dsh-llm';
8
+ import type { SessionId } from '@deepseek-ai/dsh-session';
9
+ import type { ToolRestriction } from '@deepseek-ai/dsh-tools';
10
+ import type { SubagentPort, SubagentStartPortInput, SubagentStartPortResult, SubagentFollowupPortInput } from '../../../application/ports/subagent-port.js';
11
+ /** 启动一个 continuable 子 Agent 的适配器输入(= ContinuableStartSpec 的业务字段)。 */
12
+ export interface SubagentStartInput {
13
+ /** 提供方名称,例如 'spawn'。 */
14
+ readonly provider: string;
15
+ /** 初始委派的短描述,持久化为子 Agent 的创建标签。 */
16
+ readonly label: string;
17
+ /** 创建该子 Agent 的直接父 Agent(权限边界)。 */
18
+ readonly parent: Agent;
19
+ /** 作为子 Agent 首条 user 消息的 ContentBlock[]。 */
20
+ readonly prompt: ContentBlock[];
21
+ /** 可选的每子 Agent persona(要求 provider 具备 persona 能力)。 */
22
+ readonly persona?: string;
23
+ /** 可选的子 Agent 工具收敛(要求 provider 具备 toolFilter 能力)。 */
24
+ readonly toolFilter?: ToolRestriction;
25
+ /** Optional child provider/model override, resolved by DSH. */
26
+ readonly agentOptions?: AgentOptions;
27
+ /** 调用方取消信号;缺省时使用一个不会自动触发的 AbortController。 */
28
+ readonly signal?: AbortSignal;
29
+ }
30
+ /** startContinuable 成功结果:持久化子 Agent id 与已接受初始消息的 inbox id。 */
31
+ export interface SubagentStartResult {
32
+ readonly childId: SessionId;
33
+ readonly messageId: MessageId;
34
+ }
35
+ /** 向既有 continuable 子 Agent 投递一条后续消息的适配器输入。 */
36
+ export interface SubagentFollowupInput {
37
+ /** 必须是对应 child 的直接父 Agent(否则宿主拒绝)。 */
38
+ readonly parent: Agent;
39
+ /** startContinuable 返回的持久化子 Agent session id。 */
40
+ readonly childId: SessionId;
41
+ /** 用户角色内容,必须是 ContentBlock[] 而非纯字符串。 */
42
+ readonly content: ContentBlock[];
43
+ /** 消息来源(MessageSource),仅作持久化归属,不授予权限。 */
44
+ readonly source: MessageSource;
45
+ /** 调用方取消信号;只拥有到 inbox 接受为止。 */
46
+ readonly signal?: AbortSignal;
47
+ }
48
+ /** 本 bundle 编排投递使用的 MessageSource:plugin 来源、relay 形式。 */
49
+ export declare function tavernMessageSource(): MessageSource;
50
+ export declare class SubagentGateway implements SubagentPort {
51
+ #private;
52
+ constructor(ctx: Context);
53
+ /** 建立持久 continuable 子 Agent 并投递初始消息。 */
54
+ startContinuable(input: SubagentStartPortInput): Promise<SubagentStartPortResult>;
55
+ /**
56
+ * 向子 Agent 投递后续消息。注意:返回只代表 inbox 已接受(accepted),
57
+ * 不表示模型已回复或已完成(completed)。
58
+ */
59
+ followup(input: SubagentFollowupPortInput): Promise<MessageId>;
60
+ }
61
+ /** 中断一个仍在执行中的 continuable 子 Agent;中断后可再次召唤。 */
62
+ export declare function interruptContinuableChild(ctx: Context, childId: SessionId, parent: Agent): void;
63
+ //# sourceMappingURL=subagent-gateway.d.ts.map