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,185 @@
1
+ /**
2
+ * ContextAssembler —— 世界书 + 记忆上下文组装(阶段 4 + 5.2)。
3
+ *
4
+ * 每次 summon / followup 前调用:按用户消息检索角色世界书的关键词条目与
5
+ * 独立记忆(MemoryService.recall),稳定排序(Lore 优先,Memory 次之),
6
+ * 按条目数与字符预算截断,生成注入的 ContentBlock[] 与确定性 fingerprint
7
+ * (审计用)。记忆块格式遵循产品文档:
8
+ * <context source="tavern:memory">\n- fact\n- fact\n</context>
9
+ * 位于 Lore 块之后、用户消息之前。
10
+ *
11
+ * 注意:constant(始终激活)世界书条目在导入时已并入 persona,不参与检索;
12
+ * 本模块只处理**非 constant 的触发条目**(社区卡的世界书主体内容)。
13
+ */
14
+ import { createHash } from 'node:crypto';
15
+ /** 默认注入预算:最多 5 条 / 2000 字符。 */
16
+ export const DEFAULT_MAX_LORE_ENTRIES = 5;
17
+ export const DEFAULT_MAX_LORE_CHARS = 2000;
18
+ /** 记忆注入预算:最多 3 条 / 1000 字符。 */
19
+ export const DEFAULT_MAX_MEMORY_ENTRIES = 3;
20
+ export const DEFAULT_MAX_MEMORY_CHARS = 1000;
21
+ /** 单个关键词是否命中(contains=子串;word=完整词 \b 边界)。 */
22
+ export function keyMatches(entry, key, message) {
23
+ const haystack = entry.caseSensitive ? message : message.toLocaleLowerCase();
24
+ const needle = entry.caseSensitive ? key : key.toLocaleLowerCase();
25
+ if (needle === '')
26
+ return false;
27
+ if (entry.matchMode === 'word') {
28
+ const escaped = needle.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
29
+ return new RegExp(`(^|[^\\p{L}\\p{N}_])${escaped}(?=$|[^\\p{L}\\p{N}_])`, 'u').test(haystack);
30
+ }
31
+ return haystack.includes(needle);
32
+ }
33
+ /** 检索 + 排序 + 截断的纯函数(单元测试核心)。 */
34
+ export function selectLoreEntries(lorebook, userMessage, maxEntries, maxChars) {
35
+ if (lorebook === undefined || userMessage.trim() === '') {
36
+ return { entries: [], matched: [], requested: 0, kept: 0, keptChars: 0 };
37
+ }
38
+ const hits = [];
39
+ for (const entry of lorebook.entries) {
40
+ // constant(始终激活)条目已并入 persona,不参与检索注入,避免重复。
41
+ if (!entry.enabled || entry.constant)
42
+ continue;
43
+ for (const key of entry.keys) {
44
+ if (keyMatches(entry, key, userMessage)) {
45
+ hits.push({ entry, key });
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ // 稳定排序:priority DESC,id ASC
51
+ const sorted = hits
52
+ .map(item => item.entry)
53
+ .sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
54
+ // 截断:条目数与字符预算
55
+ const kept = [];
56
+ let keptChars = 0;
57
+ for (const entry of sorted) {
58
+ if (kept.length >= maxEntries)
59
+ break;
60
+ if (keptChars + entry.content.length > maxChars && kept.length > 0)
61
+ break;
62
+ kept.push(entry);
63
+ keptChars += entry.content.length;
64
+ }
65
+ return {
66
+ entries: kept,
67
+ matched: hits.map(item => ({ entryId: item.entry.id, key: item.key })),
68
+ requested: sorted.length,
69
+ kept: kept.length,
70
+ keptChars,
71
+ };
72
+ }
73
+ /** 命中条目 → 注入的 ContentBlock[](每条一个块,带关键词标注)。 */
74
+ export function buildLoreContentBlocks(entries) {
75
+ return entries.map(entry => ({
76
+ type: 'text',
77
+ text: `【世界书 · ${entry.keys.join(' / ')}】\n${entry.content}`,
78
+ }));
79
+ }
80
+ /** 记忆字符预算截断(salience 已在 recall 内排序;首条超长仍保留)。 */
81
+ export function truncateMemoriesByChars(entries, maxChars) {
82
+ const kept = [];
83
+ let keptChars = 0;
84
+ for (const memory of entries) {
85
+ if (kept.length > 0 && keptChars + memory.fact.length > maxChars)
86
+ break;
87
+ kept.push(memory);
88
+ keptChars += memory.fact.length;
89
+ }
90
+ return kept;
91
+ }
92
+ /** 记忆 → 注入块(单块,格式见文件头文档)。 */
93
+ export function buildMemoryContextBlock(entries) {
94
+ if (entries.length === 0)
95
+ return undefined;
96
+ const lines = entries.map(memory => `- ${memory.fact}`).join('\n');
97
+ return { type: 'text', text: `<context source="tavern:memory">\n${lines}\n</context>` };
98
+ }
99
+ /** 确定性指纹:sha256(characterId|message|entryIds|contents)。 */
100
+ export function loreFingerprint(characterId, userMessage, entries) {
101
+ const material = [
102
+ characterId,
103
+ userMessage,
104
+ ...entries.map(entry => `${entry.id}:${entry.content}`),
105
+ ].join('|');
106
+ return createHash('sha256').update(material, 'utf8').digest('hex').slice(0, 16);
107
+ }
108
+ /** 确定性指纹:sha256(characterId|message|memoryIds|facts)。 */
109
+ export function memoryFingerprint(characterId, userMessage, entries) {
110
+ const material = [
111
+ characterId,
112
+ userMessage,
113
+ ...entries.map(memory => `${memory.id}:${memory.fact}`),
114
+ ].join('|');
115
+ return createHash('sha256').update(material, 'utf8').digest('hex').slice(0, 16);
116
+ }
117
+ /** 带存储的组装器:characterId → 角色 → lorebookIds[0] → 世界书 → 记忆 → 注入。 */
118
+ export class ContextAssembler {
119
+ #characters;
120
+ #lorebooks;
121
+ #memories;
122
+ constructor(characters, lorebooks, memories) {
123
+ this.#characters = characters;
124
+ this.#lorebooks = lorebooks;
125
+ this.#memories = memories;
126
+ }
127
+ /** 角色的世界书(未绑定或不存在返回 undefined)。 */
128
+ lorebookOf(characterId) {
129
+ const character = this.#characters.get(characterId);
130
+ const lorebookId = character?.lorebookIds[0];
131
+ if (lorebookId === undefined)
132
+ return undefined;
133
+ return this.#lorebooks.get(lorebookId);
134
+ }
135
+ /**
136
+ * 组装一次投递的世界书 + 记忆上下文。空消息 / 无世界书 / 无命中均返回
137
+ * 空结果(不抛异常);fingerprint 在空结果时也确定性可算。
138
+ * 顺序:Lore 块在前,Memory 块在后(均位于用户消息之前)。
139
+ */
140
+ async assemble(params) {
141
+ const maxEntries = params.maxLoreEntries ?? DEFAULT_MAX_LORE_ENTRIES;
142
+ const maxChars = params.maxLoreChars ?? DEFAULT_MAX_LORE_CHARS;
143
+ const maxMemoryEntries = params.maxMemoryEntries ?? DEFAULT_MAX_MEMORY_ENTRIES;
144
+ const maxMemoryChars = params.maxMemoryChars ?? DEFAULT_MAX_MEMORY_CHARS;
145
+ const lorebook = this.lorebookOf(params.characterId);
146
+ const selection = selectLoreEntries(lorebook, params.userMessage, maxEntries, maxChars);
147
+ // 阶段 3 M6:统一混合检索——将本轮用户消息作为 query,相关性 +
148
+ // salience + recency + 类别配额;pending 候选永远不在此处被召回。
149
+ const recalled = await this.#memories.retrieve({
150
+ characterId: params.characterId,
151
+ query: params.userMessage,
152
+ ...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
153
+ limit: maxMemoryEntries,
154
+ updateAccess: false,
155
+ });
156
+ const keptMemory = truncateMemoriesByChars(recalled.map(hit => hit.memory), maxMemoryChars);
157
+ const memoryBlock = buildMemoryContextBlock(keptMemory);
158
+ const contentBlocks = [
159
+ ...buildLoreContentBlocks(selection.entries),
160
+ ...(memoryBlock === undefined ? [] : [memoryBlock]),
161
+ ];
162
+ const fingerprint = [
163
+ loreFingerprint(params.characterId, params.userMessage, selection.entries),
164
+ memoryFingerprint(params.characterId, params.userMessage, keptMemory),
165
+ ].join(':');
166
+ return {
167
+ injectedLore: selection.entries,
168
+ injectedMemory: keptMemory,
169
+ matched: selection.matched,
170
+ contentBlocks,
171
+ fingerprint,
172
+ truncated: {
173
+ requested: selection.requested,
174
+ kept: selection.kept,
175
+ keptChars: selection.keptChars,
176
+ },
177
+ memoryTruncated: {
178
+ requested: recalled.length,
179
+ kept: keptMemory.length,
180
+ keptChars: keptMemory.reduce((sum, memory) => sum + memory.fact.length, 0),
181
+ },
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=context-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-assembler.js","sourceRoot":"","sources":["../../src/core/context-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ConversationRepository —— 普通聊天的领域事实源(阶段 1,ADR-003)。
3
+ *
4
+ * Conversation / ConversationMessage 是 Tavern 自己存储的消息树:
5
+ * parentMessageId 原生支持编辑/重新生成/swipe/分支;DSH 会话只作呈现通道。
6
+ * 乐观并发:updateActiveLeaf 用 expectedActiveLeafId 做 CAS(ADR-003 §5)。
7
+ */
8
+ import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
9
+ import type { Conversation, ConversationMessage } from '../domain/schemas.js';
10
+ export interface ConversationRepository {
11
+ create(conversation: Omit<Conversation, 'createdAt' | 'updatedAt'>): Promise<Conversation>;
12
+ get(id: string): Promise<Conversation | null>;
13
+ update(id: string, updates: Partial<Conversation>): Promise<Conversation>;
14
+ listByUser(userId: string): Promise<Conversation[]>;
15
+ updateByCharacter(characterId: string, updates: Partial<Conversation>): Promise<number>;
16
+ addMessage(message: Omit<ConversationMessage, 'createdAt'> & {
17
+ createdAt?: string;
18
+ }): Promise<ConversationMessage>;
19
+ getMessage(id: string): Promise<ConversationMessage | null>;
20
+ updateMessage(id: string, updates: Partial<ConversationMessage>): Promise<ConversationMessage>;
21
+ getMessageTree(conversationId: string): Promise<ConversationMessage[]>;
22
+ getActiveLeaf(conversationId: string): Promise<ConversationMessage | null>;
23
+ updateActiveLeaf(conversationId: string, messageId: string, expectedActiveLeafId?: string): Promise<void>;
24
+ }
25
+ export declare class KvTableConversationRepository implements ConversationRepository {
26
+ #private;
27
+ constructor(conversationTable: KvTable<string, Conversation>, messageTable: KvTable<string, ConversationMessage>);
28
+ create(input: Omit<Conversation, 'createdAt' | 'updatedAt'>): Promise<Conversation>;
29
+ get(id: string): Promise<Conversation | null>;
30
+ update(id: string, updates: Partial<Conversation>): Promise<Conversation>;
31
+ listByUser(userId: string): Promise<Conversation[]>;
32
+ updateByCharacter(characterId: string, updates: Partial<Conversation>): Promise<number>;
33
+ addMessage(input: Omit<ConversationMessage, 'createdAt'> & {
34
+ createdAt?: string;
35
+ }): Promise<ConversationMessage>;
36
+ getMessage(id: string): Promise<ConversationMessage | null>;
37
+ getMessageTree(conversationId: string): Promise<ConversationMessage[]>;
38
+ updateMessage(id: string, updates: Partial<ConversationMessage>): Promise<ConversationMessage>;
39
+ getActiveLeaf(conversationId: string): Promise<ConversationMessage | null>;
40
+ updateActiveLeaf(conversationId: string, messageId: string, expectedActiveLeafId?: string): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=conversation-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-repository.d.ts","sourceRoot":"","sources":["../../src/core/conversation-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * ConversationRepository —— 普通聊天的领域事实源(阶段 1,ADR-003)。
3
+ *
4
+ * Conversation / ConversationMessage 是 Tavern 自己存储的消息树:
5
+ * parentMessageId 原生支持编辑/重新生成/swipe/分支;DSH 会话只作呈现通道。
6
+ * 乐观并发:updateActiveLeaf 用 expectedActiveLeafId 做 CAS(ADR-003 §5)。
7
+ */
8
+ export class KvTableConversationRepository {
9
+ #conversations;
10
+ #messages;
11
+ constructor(conversationTable, messageTable) {
12
+ this.#conversations = conversationTable;
13
+ this.#messages = messageTable;
14
+ }
15
+ async create(input) {
16
+ const now = new Date().toISOString();
17
+ const conversation = { ...input, createdAt: now, updatedAt: now };
18
+ await this.#conversations.put(input.id, conversation);
19
+ return conversation;
20
+ }
21
+ get(id) {
22
+ return Promise.resolve(this.#conversations.get(id) ?? null);
23
+ }
24
+ async update(id, updates) {
25
+ const current = this.#conversations.get(id);
26
+ if (current === undefined)
27
+ throw new Error(`[Tavern] Conversation 不存在:${id}`);
28
+ const next = { ...current, ...updates, updatedAt: new Date().toISOString() };
29
+ await this.#conversations.put(id, next);
30
+ return next;
31
+ }
32
+ async listByUser(userId) {
33
+ const result = [];
34
+ for (const [, conversation] of this.#conversations.entries()) {
35
+ if (conversation.ownerUserId === userId)
36
+ result.push(conversation);
37
+ }
38
+ // 更新时间倒序;同时间按 id 倒序(确定性 tie-break,便于测试与稳定展示)。
39
+ result.sort((a, b) => (a.updatedAt > b.updatedAt ? -1 : a.updatedAt < b.updatedAt ? 1
40
+ : (a.id > b.id ? -1 : a.id < b.id ? 1 : 0)));
41
+ return result;
42
+ }
43
+ async updateByCharacter(characterId, updates) {
44
+ let updated = 0;
45
+ for (const [id, conversation] of this.#conversations.entries()) {
46
+ if (conversation.characterId !== characterId)
47
+ continue;
48
+ await this.#conversations.put(id, { ...conversation, ...updates, updatedAt: new Date().toISOString() });
49
+ updated += 1;
50
+ }
51
+ return updated;
52
+ }
53
+ async addMessage(input) {
54
+ const message = { ...input, createdAt: input.createdAt ?? new Date().toISOString() };
55
+ await this.#messages.put(input.id, message);
56
+ return message;
57
+ }
58
+ getMessage(id) {
59
+ return Promise.resolve(this.#messages.get(id) ?? null);
60
+ }
61
+ async getMessageTree(conversationId) {
62
+ const result = [];
63
+ for (const [, message] of this.#messages.entries()) {
64
+ if (message.conversationId === conversationId)
65
+ result.push(message);
66
+ }
67
+ result.sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0));
68
+ return result;
69
+ }
70
+ async updateMessage(id, updates) {
71
+ const current = this.#messages.get(id);
72
+ if (current === undefined)
73
+ throw new Error(`[Tavern] 消息不存在:${id}`);
74
+ const next = { ...current, ...updates };
75
+ await this.#messages.put(id, next);
76
+ return next;
77
+ }
78
+ async getActiveLeaf(conversationId) {
79
+ const conversation = this.#conversations.get(conversationId);
80
+ if (conversation === undefined || conversation.activeLeafMessageId === undefined)
81
+ return null;
82
+ return this.getMessage(conversation.activeLeafMessageId);
83
+ }
84
+ async updateActiveLeaf(conversationId, messageId, expectedActiveLeafId) {
85
+ // KvTable.update 在 domain 写链上原子执行:CAS 校验 + 更新。
86
+ await this.#conversations.update(conversationId, current => {
87
+ if (expectedActiveLeafId !== undefined && current.activeLeafMessageId !== expectedActiveLeafId) {
88
+ throw new Error(`[Tavern] active leaf 已被其他分支更新(期望 ${expectedActiveLeafId},实际 ${current.activeLeafMessageId ?? '<无>'})`);
89
+ }
90
+ return { ...current, activeLeafMessageId: messageId, updatedAt: new Date().toISOString() };
91
+ });
92
+ }
93
+ }
94
+ //# sourceMappingURL=conversation-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../../src/core/conversation-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/group-chat/group-chat-execution-service.js. */
2
+ export * from '../application/group-chat/group-chat-execution-service.js';
3
+ //# sourceMappingURL=group-chat-execution-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-chat-execution-service.d.ts","sourceRoot":"","sources":["../../src/core/group-chat-execution-service.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,cAAc,2DAA2D,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/group-chat/group-chat-execution-service.js. */
2
+ export * from '../application/group-chat/group-chat-execution-service.js';
3
+ //# sourceMappingURL=group-chat-execution-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-chat-execution-service.js","sourceRoot":"","sources":["../../src/core/group-chat-execution-service.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,cAAc,2DAA2D,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/group-chat/group-chat-orchestrator.js. */
2
+ export * from '../application/group-chat/group-chat-orchestrator.js';
3
+ //# sourceMappingURL=group-chat-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-chat-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/group-chat-orchestrator.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,sDAAsD,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/group-chat/group-chat-orchestrator.js. */
2
+ export * from '../application/group-chat/group-chat-orchestrator.js';
3
+ //# sourceMappingURL=group-chat-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-chat-orchestrator.js","sourceRoot":"","sources":["../../src/core/group-chat-orchestrator.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,sDAAsD,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/memory/memory-retriever.js. */
2
+ export * from '../application/memory/memory-retriever.js';
3
+ //# sourceMappingURL=memory-retriever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-retriever.d.ts","sourceRoot":"","sources":["../../src/core/memory-retriever.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,2CAA2C,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/memory/memory-retriever.js. */
2
+ export * from '../application/memory/memory-retriever.js';
3
+ //# sourceMappingURL=memory-retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-retriever.js","sourceRoot":"","sources":["../../src/core/memory-retriever.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,2CAA2C,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/memory/memory-service.js. */
2
+ export * from '../application/memory/memory-service.js';
3
+ //# sourceMappingURL=memory-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../src/core/memory-service.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,cAAc,yCAAyC,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import from application/memory/memory-service.js. */
2
+ export * from '../application/memory/memory-service.js';
3
+ //# sourceMappingURL=memory-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.js","sourceRoot":"","sources":["../../src/core/memory-service.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,cAAc,yCAAyC,CAAA"}
@@ -0,0 +1,46 @@
1
+ import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
2
+ import type { AuditService } from './audit-service.js';
3
+ import type { CompanionProfile, PersonalityCandidate } from '../domain/schemas.js';
4
+ import { KvTableConversationRepository } from './conversation-repository.js';
5
+ export interface CreatePersonalityCandidateParams {
6
+ ownerUserId: string;
7
+ companionProfileId: string;
8
+ conversationId: string;
9
+ traitName: string;
10
+ description: string;
11
+ strength: number;
12
+ confidence: number;
13
+ sourceMessageIds: string[];
14
+ extractionVersion: string;
15
+ }
16
+ export declare class PersonalityCandidateService {
17
+ #private;
18
+ constructor(candidates: KvTable<string, PersonalityCandidate>, profiles: KvTable<string, CompanionProfile>, conversations: KvTableConversationRepository, audit: AuditService);
19
+ create(p: CreatePersonalityCandidateParams): Promise<PersonalityCandidate>;
20
+ listForUser(owner: string, profileId?: string): {
21
+ id: string;
22
+ ownerUserId: string;
23
+ companionProfileId: string;
24
+ conversationId: string;
25
+ traitName: string;
26
+ description: string;
27
+ strength: number;
28
+ confidence: number;
29
+ sourceMessageIds: string[];
30
+ extractionVersion: string;
31
+ status: "accepted" | "superseded" | "pending" | "rejected" | "evidence-invalid";
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ reviewerUserId?: string | undefined;
35
+ reviewedAt?: string | undefined;
36
+ invalidationReason?: string | undefined;
37
+ invalidatedAt?: string | undefined;
38
+ supersedes?: string | undefined;
39
+ }[];
40
+ review(owner: string, id: string, decision: 'accept' | 'reject', edits?: {
41
+ traitName?: string;
42
+ description?: string;
43
+ strength?: number;
44
+ }): Promise<PersonalityCandidate>;
45
+ }
46
+ //# sourceMappingURL=personality-candidate-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personality-candidate-service.d.ts","sourceRoot":"","sources":["../../src/core/personality-candidate-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,sBAAsB,CAAA;AACpG,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAE5E,MAAM,WAAW,gCAAgC;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE;AAClQ,qBAAa,2BAA2B;;gBAK1B,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,aAAa,EAAE,6BAA6B,EAAE,KAAK,EAAE,YAAY;IAIvK,MAAM,CAAC,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAahF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAC,QAAQ,EAAE,KAAK,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAOjL"}
@@ -0,0 +1,65 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { KvTableConversationRepository } from './conversation-repository.js';
3
+ export class PersonalityCandidateService {
4
+ #candidates;
5
+ #profiles;
6
+ #conversations;
7
+ #audit;
8
+ constructor(candidates, profiles, conversations, audit) {
9
+ this.#candidates = candidates;
10
+ this.#profiles = profiles;
11
+ this.#conversations = conversations;
12
+ this.#audit = audit;
13
+ }
14
+ #owned(owner, id) { const c = this.#candidates.get(id); if (!c || c.ownerUserId !== owner)
15
+ throw new Error('[Tavern] 性格候选不存在或无权访问'); return c; }
16
+ async create(p) {
17
+ const profile = this.#profiles.get(p.companionProfileId);
18
+ if (!profile || profile.ownerUserId !== p.ownerUserId)
19
+ throw new Error('[Tavern] Companion 不存在或无权访问');
20
+ const conversation = await this.#conversations.get(p.conversationId);
21
+ if (!conversation || conversation.ownerUserId !== p.ownerUserId)
22
+ throw new Error('[Tavern] Conversation 不存在或无权访问');
23
+ if (conversation.characterId !== profile.characterId)
24
+ throw new Error('[Tavern] 性格证据与 Companion 角色不匹配');
25
+ const ids = [...new Set(p.sourceMessageIds)];
26
+ if (!ids.length)
27
+ throw new Error('[Tavern] 性格候选至少需要一条证据');
28
+ const evidence = await Promise.all(ids.map(id => this.#conversations.getMessage(id)));
29
+ if (evidence.some(m => !m || m.conversationId !== p.conversationId) || !evidence.some(m => m?.role === 'user'))
30
+ throw new Error('[Tavern] 性格候选必须包含有效用户证据');
31
+ const evidenceKey = ids.slice().sort().join(',');
32
+ const duplicate = [...this.#candidates.entries()].map(([, candidate]) => candidate).find(candidate => candidate.ownerUserId === p.ownerUserId && candidate.companionProfileId === p.companionProfileId && candidate.conversationId === p.conversationId && candidate.traitName === p.traitName.trim() && candidate.description === p.description.trim() && candidate.sourceMessageIds.slice().sort().join(',') === evidenceKey);
33
+ if (duplicate)
34
+ return duplicate;
35
+ const now = new Date().toISOString();
36
+ const candidate = { id: randomUUID(), ownerUserId: p.ownerUserId, companionProfileId: p.companionProfileId, conversationId: p.conversationId, traitName: p.traitName.trim(), description: p.description.trim(), strength: p.strength, confidence: p.confidence, sourceMessageIds: ids, extractionVersion: p.extractionVersion, status: 'pending', createdAt: now, updatedAt: now };
37
+ if (!candidate.traitName || !candidate.description)
38
+ throw new Error('[Tavern] 性格候选内容不能为空');
39
+ await this.#candidates.put(candidate.id, candidate);
40
+ await this.#audit.log({ entityType: 'personality_candidate', entityId: candidate.id, action: 'create', after: candidate, source: 'system', actorId: p.ownerUserId });
41
+ return candidate;
42
+ }
43
+ listForUser(owner, profileId) { return [...this.#candidates.entries()].map(([, c]) => c).filter(c => c.ownerUserId === owner && (profileId === undefined || c.companionProfileId === profileId)); }
44
+ async review(owner, id, decision, edits = {}) {
45
+ const current = this.#owned(owner, id);
46
+ if (current.status !== 'pending')
47
+ return current;
48
+ const now = new Date().toISOString();
49
+ const next = { ...current, ...(edits.traitName === undefined ? {} : { traitName: edits.traitName.trim() }), ...(edits.description === undefined ? {} : { description: edits.description.trim() }), ...(edits.strength === undefined ? {} : { strength: edits.strength }), status: decision === 'accept' ? 'accepted' : 'rejected', reviewerUserId: owner, reviewedAt: now, updatedAt: now };
50
+ await this.#candidates.put(id, next);
51
+ if (decision === 'accept') {
52
+ const profile = this.#profiles.get(current.companionProfileId);
53
+ const oldTraits = profile.personalityTraits ?? [];
54
+ const trait = { id: `trait:${id}`, name: next.traitName, description: next.description, strength: next.strength, confidence: next.confidence, source: 'user-confirmed', status: 'active' };
55
+ const version = (profile.personalityVersion ?? 0) + 1;
56
+ const traits = oldTraits.map(t => t.name === trait.name ? { ...t, status: 'superseded' } : t);
57
+ const updated = { ...profile, personalityTraits: [...traits, trait], personalitySummary: [...traits, trait].filter(t => t.status === 'active').map(t => `${t.name}: ${t.description}`).join(';'), personalityVersion: version, personalitySourceConversationIds: [...new Set([...(profile.personalitySourceConversationIds ?? []), current.conversationId])], personalitySourceMessageIds: [...new Set([...(profile.personalitySourceMessageIds ?? []), ...current.sourceMessageIds])], personalitySummarizedAt: now, personalityConfirmedAt: now, updatedAt: now };
58
+ await this.#profiles.put(profile.id, updated);
59
+ await this.#audit.log({ entityType: 'companion_profile', entityId: profile.id, action: 'update', before: profile, after: updated, source: 'user', actorId: owner });
60
+ }
61
+ await this.#audit.log({ entityType: 'personality_candidate', entityId: id, action: 'update', before: current, after: next, source: 'user', actorId: owner });
62
+ return next;
63
+ }
64
+ }
65
+ //# sourceMappingURL=personality-candidate-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personality-candidate-service.js","sourceRoot":"","sources":["../../src/core/personality-candidate-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * PromptAssembler —— 普通聊天的上下文组装(阶段 1,ADR-002/003)。
3
+ *
4
+ * 组装顺序(方案 §23.3):
5
+ * 角色 persona/scenario → 世界书命中 + 已确认记忆(复用 ContextAssembler)→
6
+ * 消息树历史 → 用户本轮消息 → 生成 system + messages + contextSources。
7
+ *
8
+ * 骨架阶段:消息树历史取全量(按 createdAt 排序);分支路径裁剪与历史摘要
9
+ * 在 v0.2(Context Policy)接入。
10
+ */
11
+ import type { CharacterService } from './character-service.js';
12
+ import type { ContextAssembler } from './context-assembler.js';
13
+ import type { ConversationMessage } from '../domain/schemas.js';
14
+ import type { ConversationRepository } from './conversation-repository.js';
15
+ export interface AssembledPrompt {
16
+ /** system 槽:persona + scenario(+ 注入块经 messages 传递)。 */
17
+ system: string;
18
+ /** 有序对话消息(user/assistant;注入块以 system 角色放在最前)。 */
19
+ messages: Array<{
20
+ role: 'user' | 'assistant' | 'system';
21
+ content: string;
22
+ }>;
23
+ /** 本轮上下文来源(lore/memory 命中 id,审计与 UI 展示用)。 */
24
+ contextSources: string[];
25
+ /** 粗略 token 估算(字符数 / 4,正式估算见 ModelCapabilityRegistry)。 */
26
+ tokenEstimate?: number;
27
+ }
28
+ export declare class PromptAssembler {
29
+ #private;
30
+ constructor(characters: CharacterService, assembler: ContextAssembler, conversations: ConversationRepository);
31
+ assemble(params: {
32
+ characterId: string;
33
+ conversationId: string;
34
+ userMessage: string;
35
+ sceneId?: string;
36
+ activeLeafMessageId?: string;
37
+ /** 伙伴 Agent 会话:用伙伴身份/背景/关系替代角色卡 persona。 */
38
+ systemOverride?: string;
39
+ }): Promise<AssembledPrompt>;
40
+ }
41
+ /** 从消息树提取历史文本(供 PromptAssembler 使用;保留导出便于测试)。 */
42
+ export declare function historyTextOf(messages: readonly ConversationMessage[]): string;
43
+ //# sourceMappingURL=prompt-assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-assembler.d.ts","sourceRoot":"","sources":["../../src/core/prompt-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAE1E,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3E,6CAA6C;IAC7C,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,eAAe;;gBAMxB,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,sBAAsB;IAOjC,QAAQ,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,MAAM,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,4CAA4C;QAC5C,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,GAAG,OAAO,CAAC,eAAe,CAAC;CA8C7B;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,MAAM,CAE9E"}