dialog-survey 1.7.8 → 1.10.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 (877) hide show
  1. package/README.md +205 -212
  2. package/README.zh-CN.md +226 -0
  3. package/dist/src/api/admin-templates.d.ts +2 -2
  4. package/dist/src/api/admin-templates.d.ts.map +1 -1
  5. package/dist/src/api/admin-templates.js +202 -32
  6. package/dist/src/api/admin-templates.js.map +1 -1
  7. package/dist/src/api/analysis.d.ts +1 -1
  8. package/dist/src/api/analysis.d.ts.map +1 -1
  9. package/dist/src/api/analysis.js.map +1 -1
  10. package/dist/src/api/health.d.ts +1 -1
  11. package/dist/src/api/health.d.ts.map +1 -1
  12. package/dist/src/api/health.js +4 -1
  13. package/dist/src/api/health.js.map +1 -1
  14. package/dist/src/api/plans.d.ts +3 -2
  15. package/dist/src/api/plans.d.ts.map +1 -1
  16. package/dist/src/api/plans.js +41 -15
  17. package/dist/src/api/plans.js.map +1 -1
  18. package/dist/src/api/templates.d.ts +1 -1
  19. package/dist/src/api/templates.d.ts.map +1 -1
  20. package/dist/src/api/templates.js +1 -1
  21. package/dist/src/api/templates.js.map +1 -1
  22. package/dist/src/config/constants.d.ts +2 -0
  23. package/dist/src/config/constants.d.ts.map +1 -0
  24. package/dist/src/config/constants.js +2 -0
  25. package/dist/src/config/constants.js.map +1 -0
  26. package/dist/src/core/graph.d.ts +1 -1
  27. package/dist/src/core/graph.d.ts.map +1 -1
  28. package/dist/src/core/graph.js +7 -1
  29. package/dist/src/core/graph.js.map +1 -1
  30. package/dist/src/core/nodes/interviewing.d.ts +1 -1
  31. package/dist/src/core/nodes/interviewing.d.ts.map +1 -1
  32. package/dist/src/core/nodes/interviewing.js +23 -12
  33. package/dist/src/core/nodes/interviewing.js.map +1 -1
  34. package/dist/src/core/nodes/planning.d.ts +1 -1
  35. package/dist/src/core/nodes/planning.d.ts.map +1 -1
  36. package/dist/src/core/nodes/planning.js +3 -2
  37. package/dist/src/core/nodes/planning.js.map +1 -1
  38. package/dist/src/core/nodes/template-utils.d.ts +1 -1
  39. package/dist/src/core/nodes/template-utils.d.ts.map +1 -1
  40. package/dist/src/core/nodes/template-utils.js.map +1 -1
  41. package/dist/src/core/types/index.d.ts +3 -4
  42. package/dist/src/core/types/index.d.ts.map +1 -1
  43. package/dist/src/core/types/index.js +2 -2
  44. package/dist/src/core/types/index.js.map +1 -1
  45. package/dist/src/generated/prisma/browser.d.ts +55 -0
  46. package/dist/src/generated/prisma/browser.d.ts.map +1 -0
  47. package/dist/src/generated/prisma/browser.js +18 -0
  48. package/dist/src/generated/prisma/browser.js.map +1 -0
  49. package/dist/src/generated/prisma/client.d.ts +74 -0
  50. package/dist/src/generated/prisma/client.d.ts.map +1 -0
  51. package/dist/src/generated/prisma/client.js +35 -0
  52. package/dist/src/generated/prisma/client.js.map +1 -0
  53. package/dist/src/generated/prisma/commonInputTypes.d.ts +650 -0
  54. package/dist/src/generated/prisma/commonInputTypes.d.ts.map +1 -0
  55. package/dist/src/generated/prisma/commonInputTypes.js +11 -0
  56. package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
  57. package/dist/src/generated/prisma/enums.d.ts +45 -0
  58. package/dist/src/generated/prisma/enums.d.ts.map +1 -0
  59. package/dist/src/generated/prisma/enums.js +48 -0
  60. package/dist/src/generated/prisma/enums.js.map +1 -0
  61. package/dist/src/generated/prisma/internal/class.d.ts +232 -0
  62. package/dist/src/generated/prisma/internal/class.d.ts.map +1 -0
  63. package/dist/src/generated/prisma/internal/class.js +50 -0
  64. package/dist/src/generated/prisma/internal/class.js.map +1 -0
  65. package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +1495 -0
  66. package/dist/src/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
  67. package/dist/src/generated/prisma/internal/prismaNamespace.js +245 -0
  68. package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
  69. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +218 -0
  70. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  71. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +216 -0
  72. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
  73. package/dist/src/generated/prisma/models/AnalysisFailure.d.ts +1097 -0
  74. package/dist/src/generated/prisma/models/AnalysisFailure.d.ts.map +1 -0
  75. package/dist/src/generated/prisma/models/AnalysisFailure.js +2 -0
  76. package/dist/src/generated/prisma/models/AnalysisFailure.js.map +1 -0
  77. package/dist/src/generated/prisma/models/AnalysisReport.d.ts +1418 -0
  78. package/dist/src/generated/prisma/models/AnalysisReport.d.ts.map +1 -0
  79. package/dist/src/generated/prisma/models/AnalysisReport.js +2 -0
  80. package/dist/src/generated/prisma/models/AnalysisReport.js.map +1 -0
  81. package/dist/src/generated/prisma/models/ApiKey.d.ts +1054 -0
  82. package/dist/src/generated/prisma/models/ApiKey.d.ts.map +1 -0
  83. package/dist/src/generated/prisma/models/ApiKey.js +2 -0
  84. package/dist/src/generated/prisma/models/ApiKey.js.map +1 -0
  85. package/dist/src/generated/prisma/models/AuditLog.d.ts +1110 -0
  86. package/dist/src/generated/prisma/models/AuditLog.d.ts.map +1 -0
  87. package/dist/src/generated/prisma/models/AuditLog.js +2 -0
  88. package/dist/src/generated/prisma/models/AuditLog.js.map +1 -0
  89. package/dist/src/generated/prisma/models/BatchAnalysisReport.d.ts +1715 -0
  90. package/dist/src/generated/prisma/models/BatchAnalysisReport.d.ts.map +1 -0
  91. package/dist/src/generated/prisma/models/BatchAnalysisReport.js +2 -0
  92. package/dist/src/generated/prisma/models/BatchAnalysisReport.js.map +1 -0
  93. package/dist/src/generated/prisma/models/Interview.d.ts +2437 -0
  94. package/dist/src/generated/prisma/models/Interview.d.ts.map +1 -0
  95. package/dist/src/generated/prisma/models/Interview.js +2 -0
  96. package/dist/src/generated/prisma/models/Interview.js.map +1 -0
  97. package/dist/src/generated/prisma/models/InterviewPlan.d.ts +2017 -0
  98. package/dist/src/generated/prisma/models/InterviewPlan.d.ts.map +1 -0
  99. package/dist/src/generated/prisma/models/InterviewPlan.js +2 -0
  100. package/dist/src/generated/prisma/models/InterviewPlan.js.map +1 -0
  101. package/dist/src/generated/prisma/models/Message.d.ts +1211 -0
  102. package/dist/src/generated/prisma/models/Message.d.ts.map +1 -0
  103. package/dist/src/generated/prisma/models/Message.js +2 -0
  104. package/dist/src/generated/prisma/models/Message.js.map +1 -0
  105. package/dist/src/generated/prisma/models/Response.d.ts +1287 -0
  106. package/dist/src/generated/prisma/models/Response.d.ts.map +1 -0
  107. package/dist/src/generated/prisma/models/Response.js +2 -0
  108. package/dist/src/generated/prisma/models/Response.js.map +1 -0
  109. package/dist/src/generated/prisma/models/Template.d.ts +1684 -0
  110. package/dist/src/generated/prisma/models/Template.d.ts.map +1 -0
  111. package/dist/src/generated/prisma/models/Template.js +2 -0
  112. package/dist/src/generated/prisma/models/Template.js.map +1 -0
  113. package/dist/src/generated/prisma/models.d.ts +12 -0
  114. package/dist/src/generated/prisma/models.d.ts.map +1 -0
  115. package/dist/src/generated/prisma/models.js +2 -0
  116. package/dist/src/generated/prisma/models.js.map +1 -0
  117. package/dist/src/integrations/dingtalk/client.js +2 -2
  118. package/dist/src/integrations/dingtalk/client.js.map +1 -1
  119. package/dist/src/integrations/dingtalk/stream-client.d.ts +5 -1
  120. package/dist/src/integrations/dingtalk/stream-client.d.ts.map +1 -1
  121. package/dist/src/integrations/dingtalk/stream-client.js +39 -5
  122. package/dist/src/integrations/dingtalk/stream-client.js.map +1 -1
  123. package/dist/src/integrations/llm/alibaba.d.ts +1 -1
  124. package/dist/src/integrations/llm/alibaba.d.ts.map +1 -1
  125. package/dist/src/integrations/llm/alibaba.js +3 -2
  126. package/dist/src/integrations/llm/alibaba.js.map +1 -1
  127. package/dist/src/integrations/llm/openai-compatible.d.ts +1 -1
  128. package/dist/src/integrations/llm/openai-compatible.d.ts.map +1 -1
  129. package/dist/src/integrations/llm/openai-compatible.js +50 -34
  130. package/dist/src/integrations/llm/openai-compatible.js.map +1 -1
  131. package/dist/src/middleware/admin-auth.d.ts +8 -1
  132. package/dist/src/middleware/admin-auth.d.ts.map +1 -1
  133. package/dist/src/middleware/admin-auth.js +42 -26
  134. package/dist/src/middleware/admin-auth.js.map +1 -1
  135. package/dist/src/middleware/admin-csrf.d.ts +5 -0
  136. package/dist/src/middleware/admin-csrf.d.ts.map +1 -0
  137. package/dist/src/middleware/admin-csrf.js +24 -0
  138. package/dist/src/middleware/admin-csrf.js.map +1 -0
  139. package/dist/src/middleware/session-auth.d.ts +8 -0
  140. package/dist/src/middleware/session-auth.d.ts.map +1 -0
  141. package/dist/src/middleware/session-auth.js +13 -0
  142. package/dist/src/middleware/session-auth.js.map +1 -0
  143. package/dist/src/repositories/interview-state.repository.d.ts +2 -2
  144. package/dist/src/repositories/interview-state.repository.d.ts.map +1 -1
  145. package/dist/src/repositories/interview-state.repository.js +4 -2
  146. package/dist/src/repositories/interview-state.repository.js.map +1 -1
  147. package/dist/src/repositories/interview.repository.d.ts +5 -5
  148. package/dist/src/repositories/interview.repository.d.ts.map +1 -1
  149. package/dist/src/repositories/message.repository.d.ts +1 -3
  150. package/dist/src/repositories/message.repository.d.ts.map +1 -1
  151. package/dist/src/repositories/message.repository.js +0 -2
  152. package/dist/src/repositories/message.repository.js.map +1 -1
  153. package/dist/src/repositories/template.repository.d.ts +17 -17
  154. package/dist/src/repositories/template.repository.d.ts.map +1 -1
  155. package/dist/src/repositories/template.repository.js +1 -1
  156. package/dist/src/repositories/template.repository.js.map +1 -1
  157. package/dist/src/routes/admin-auth.d.ts +9 -0
  158. package/dist/src/routes/admin-auth.d.ts.map +1 -0
  159. package/dist/src/routes/admin-auth.js +87 -0
  160. package/dist/src/routes/admin-auth.js.map +1 -0
  161. package/dist/src/server-lifecycle.d.ts +56 -0
  162. package/dist/src/server-lifecycle.d.ts.map +1 -0
  163. package/dist/src/server-lifecycle.js +112 -0
  164. package/dist/src/server-lifecycle.js.map +1 -0
  165. package/dist/src/server.d.ts +19 -7
  166. package/dist/src/server.d.ts.map +1 -1
  167. package/dist/src/server.js +274 -165
  168. package/dist/src/server.js.map +1 -1
  169. package/dist/src/services/analysis.service.d.ts +6 -5
  170. package/dist/src/services/analysis.service.d.ts.map +1 -1
  171. package/dist/src/services/analysis.service.js +33 -3
  172. package/dist/src/services/analysis.service.js.map +1 -1
  173. package/dist/src/services/analytics.service.d.ts +1 -1
  174. package/dist/src/services/analytics.service.d.ts.map +1 -1
  175. package/dist/src/services/analytics.service.js.map +1 -1
  176. package/dist/src/services/audit-cleanup.service.d.ts +1 -1
  177. package/dist/src/services/audit-cleanup.service.d.ts.map +1 -1
  178. package/dist/src/services/audit-cleanup.service.js.map +1 -1
  179. package/dist/src/services/dead-letter.service.d.ts +1 -1
  180. package/dist/src/services/dead-letter.service.d.ts.map +1 -1
  181. package/dist/src/services/dead-letter.service.js.map +1 -1
  182. package/dist/src/services/export.service.d.ts +2 -1
  183. package/dist/src/services/export.service.d.ts.map +1 -1
  184. package/dist/src/services/export.service.js +73 -23
  185. package/dist/src/services/export.service.js.map +1 -1
  186. package/dist/src/services/followup.service.d.ts +5 -0
  187. package/dist/src/services/followup.service.d.ts.map +1 -1
  188. package/dist/src/services/followup.service.js +33 -8
  189. package/dist/src/services/followup.service.js.map +1 -1
  190. package/dist/src/services/interview-plan-base.service.d.ts +36 -36
  191. package/dist/src/services/interview-plan-base.service.d.ts.map +1 -1
  192. package/dist/src/services/interview-plan-base.service.js +1 -1
  193. package/dist/src/services/interview-plan-base.service.js.map +1 -1
  194. package/dist/src/services/interview-plan-members.service.d.ts +2 -2
  195. package/dist/src/services/interview-plan-members.service.d.ts.map +1 -1
  196. package/dist/src/services/interview-plan-members.service.js +3 -1
  197. package/dist/src/services/interview-plan-members.service.js.map +1 -1
  198. package/dist/src/services/interview-plan-send.service.d.ts +1 -1
  199. package/dist/src/services/interview-plan-send.service.d.ts.map +1 -1
  200. package/dist/src/services/interview-plan-send.service.js +1 -1
  201. package/dist/src/services/interview-plan-send.service.js.map +1 -1
  202. package/dist/src/services/llm-clustering.d.ts +1 -1
  203. package/dist/src/services/llm-clustering.d.ts.map +1 -1
  204. package/dist/src/services/llm-clustering.js +0 -2
  205. package/dist/src/services/llm-clustering.js.map +1 -1
  206. package/dist/src/services/prompt.service.d.ts.map +1 -1
  207. package/dist/src/services/prompt.service.js +70 -14
  208. package/dist/src/services/prompt.service.js.map +1 -1
  209. package/dist/src/services/report.service.d.ts +1 -0
  210. package/dist/src/services/report.service.d.ts.map +1 -1
  211. package/dist/src/services/report.service.js +44 -9
  212. package/dist/src/services/report.service.js.map +1 -1
  213. package/dist/src/services/stream-message.service.d.ts +1 -1
  214. package/dist/src/services/stream-message.service.d.ts.map +1 -1
  215. package/dist/src/services/stream-message.service.js +18 -7
  216. package/dist/src/services/stream-message.service.js.map +1 -1
  217. package/dist/src/services/template-dimension.service.d.ts +6 -6
  218. package/dist/src/services/template-dimension.service.d.ts.map +1 -1
  219. package/dist/src/services/template-dimension.service.js.map +1 -1
  220. package/dist/src/utils/db.d.ts +4 -1
  221. package/dist/src/utils/db.d.ts.map +1 -1
  222. package/dist/src/utils/db.js +5 -2
  223. package/dist/src/utils/db.js.map +1 -1
  224. package/dist/src/utils/markdown.d.ts.map +1 -1
  225. package/dist/src/utils/markdown.js +10 -6
  226. package/dist/src/utils/markdown.js.map +1 -1
  227. package/dist/src/utils/path-resolver.d.ts +13 -0
  228. package/dist/src/utils/path-resolver.d.ts.map +1 -0
  229. package/dist/src/utils/path-resolver.js +38 -0
  230. package/dist/src/utils/path-resolver.js.map +1 -0
  231. package/dist/src/utils/prisma-client.d.ts +14 -0
  232. package/dist/src/utils/prisma-client.d.ts.map +1 -0
  233. package/dist/src/utils/prisma-client.js +14 -0
  234. package/dist/src/utils/prisma-client.js.map +1 -0
  235. package/dist/src/utils/prisma-factory.d.ts +18 -0
  236. package/dist/src/utils/prisma-factory.d.ts.map +1 -0
  237. package/dist/src/utils/prisma-factory.js +26 -0
  238. package/dist/src/utils/prisma-factory.js.map +1 -0
  239. package/dist/src/utils/security.d.ts +17 -1
  240. package/dist/src/utils/security.d.ts.map +1 -1
  241. package/dist/src/utils/security.js +47 -2
  242. package/dist/src/utils/security.js.map +1 -1
  243. package/dist/tests/admin-auth-integration.test.d.ts +2 -0
  244. package/dist/tests/admin-auth-integration.test.d.ts.map +1 -0
  245. package/dist/tests/admin-auth-integration.test.js +91 -0
  246. package/dist/tests/admin-auth-integration.test.js.map +1 -0
  247. package/dist/tests/admin-auth-routes.test.d.ts +2 -0
  248. package/dist/tests/admin-auth-routes.test.d.ts.map +1 -0
  249. package/dist/tests/admin-auth-routes.test.js +290 -0
  250. package/dist/tests/admin-auth-routes.test.js.map +1 -0
  251. package/dist/tests/admin-auth.test.d.ts +2 -0
  252. package/dist/tests/admin-auth.test.d.ts.map +1 -0
  253. package/dist/tests/admin-auth.test.js +224 -0
  254. package/dist/tests/admin-auth.test.js.map +1 -0
  255. package/dist/tests/admin-csrf.test.d.ts +2 -0
  256. package/dist/tests/admin-csrf.test.d.ts.map +1 -0
  257. package/dist/tests/admin-csrf.test.js +117 -0
  258. package/dist/tests/admin-csrf.test.js.map +1 -0
  259. package/dist/tests/admin-delete.test.js +12 -6
  260. package/dist/tests/admin-delete.test.js.map +1 -1
  261. package/dist/tests/admin-plan-csrf.test.d.ts +2 -0
  262. package/dist/tests/admin-plan-csrf.test.d.ts.map +1 -0
  263. package/dist/tests/admin-plan-csrf.test.js +291 -0
  264. package/dist/tests/admin-plan-csrf.test.js.map +1 -0
  265. package/dist/tests/admin-plan-matcher.test.d.ts +2 -0
  266. package/dist/tests/admin-plan-matcher.test.d.ts.map +1 -0
  267. package/dist/tests/admin-plan-matcher.test.js +80 -0
  268. package/dist/tests/admin-plan-matcher.test.js.map +1 -0
  269. package/dist/tests/admin-plan-route-csrf.test.d.ts +2 -0
  270. package/dist/tests/admin-plan-route-csrf.test.d.ts.map +1 -0
  271. package/dist/tests/admin-plan-route-csrf.test.js +190 -0
  272. package/dist/tests/admin-plan-route-csrf.test.js.map +1 -0
  273. package/dist/tests/admin-shell-csrf.test.d.ts +2 -0
  274. package/dist/tests/admin-shell-csrf.test.d.ts.map +1 -0
  275. package/dist/tests/admin-shell-csrf.test.js +95 -0
  276. package/dist/tests/admin-shell-csrf.test.js.map +1 -0
  277. package/dist/tests/admin-template-csrf.test.d.ts +2 -0
  278. package/dist/tests/admin-template-csrf.test.d.ts.map +1 -0
  279. package/dist/tests/admin-template-csrf.test.js +160 -0
  280. package/dist/tests/admin-template-csrf.test.js.map +1 -0
  281. package/dist/tests/admin-templates-extra.test.js +22 -5
  282. package/dist/tests/admin-templates-extra.test.js.map +1 -1
  283. package/dist/tests/admin-templates-import.test.js +68 -58
  284. package/dist/tests/admin-templates-import.test.js.map +1 -1
  285. package/dist/tests/admin-templates-integration.test.js +69 -57
  286. package/dist/tests/admin-templates-integration.test.js.map +1 -1
  287. package/dist/tests/admin-templates.test.js +1 -174
  288. package/dist/tests/admin-templates.test.js.map +1 -1
  289. package/dist/tests/admin-tree.test.js +10 -4
  290. package/dist/tests/admin-tree.test.js.map +1 -1
  291. package/dist/tests/analysis-api.test.js +7 -4
  292. package/dist/tests/analysis-api.test.js.map +1 -1
  293. package/dist/tests/analysis.test.js +1 -0
  294. package/dist/tests/analysis.test.js.map +1 -1
  295. package/dist/tests/analytics.service.test.js.map +1 -1
  296. package/dist/tests/audit-cleanup.service.test.js +7 -3
  297. package/dist/tests/audit-cleanup.service.test.js.map +1 -1
  298. package/dist/tests/batch-aggregate-api.test.js +5 -2
  299. package/dist/tests/batch-aggregate-api.test.js.map +1 -1
  300. package/dist/tests/batch-import.test.js +28 -19
  301. package/dist/tests/batch-import.test.js.map +1 -1
  302. package/dist/tests/cli.test.js +142 -2
  303. package/dist/tests/cli.test.js.map +1 -1
  304. package/dist/tests/commitlint-ci.test.d.ts +2 -0
  305. package/dist/tests/commitlint-ci.test.d.ts.map +1 -0
  306. package/dist/tests/commitlint-ci.test.js +376 -0
  307. package/dist/tests/commitlint-ci.test.js.map +1 -0
  308. package/dist/tests/conversation-engine.integration.test.js +6 -21
  309. package/dist/tests/conversation-engine.integration.test.js.map +1 -1
  310. package/dist/tests/core-nodes-branches.test.js +12 -8
  311. package/dist/tests/core-nodes-branches.test.js.map +1 -1
  312. package/dist/tests/coverage-gate.test.d.ts +2 -0
  313. package/dist/tests/coverage-gate.test.d.ts.map +1 -0
  314. package/dist/tests/coverage-gate.test.js +32 -0
  315. package/dist/tests/coverage-gate.test.js.map +1 -0
  316. package/dist/tests/create-test-prisma.test.d.ts +2 -0
  317. package/dist/tests/create-test-prisma.test.d.ts.map +1 -0
  318. package/dist/tests/create-test-prisma.test.js +35 -0
  319. package/dist/tests/create-test-prisma.test.js.map +1 -0
  320. package/dist/tests/db.test.js +12 -4
  321. package/dist/tests/db.test.js.map +1 -1
  322. package/dist/tests/dead-letter.test.js +6 -3
  323. package/dist/tests/dead-letter.test.js.map +1 -1
  324. package/dist/tests/dingtalk-client-get-by-mobile.test.js.map +1 -1
  325. package/dist/tests/dingtalk-services.test.js +0 -33
  326. package/dist/tests/dingtalk-services.test.js.map +1 -1
  327. package/dist/tests/dingtalk-stream.test.js +84 -0
  328. package/dist/tests/dingtalk-stream.test.js.map +1 -1
  329. package/dist/tests/e2e/admin-auth.e2e.test.d.ts +2 -0
  330. package/dist/tests/e2e/admin-auth.e2e.test.d.ts.map +1 -0
  331. package/dist/tests/e2e/admin-auth.e2e.test.js +243 -0
  332. package/dist/tests/e2e/admin-auth.e2e.test.js.map +1 -0
  333. package/dist/tests/e2e/admin-core.e2e.test.js +51 -39
  334. package/dist/tests/e2e/admin-core.e2e.test.js.map +1 -1
  335. package/dist/tests/e2e/admin-template-crud.e2e.test.d.ts +2 -0
  336. package/dist/tests/e2e/admin-template-crud.e2e.test.d.ts.map +1 -0
  337. package/dist/tests/e2e/admin-template-crud.e2e.test.js +271 -0
  338. package/dist/tests/e2e/admin-template-crud.e2e.test.js.map +1 -0
  339. package/dist/tests/e2e/admin-tree-refresh.e2e.test.d.ts +2 -0
  340. package/dist/tests/e2e/admin-tree-refresh.e2e.test.d.ts.map +1 -0
  341. package/dist/tests/e2e/admin-tree-refresh.e2e.test.js +130 -0
  342. package/dist/tests/e2e/admin-tree-refresh.e2e.test.js.map +1 -0
  343. package/dist/tests/e2e/admin-ui-coverage.e2e.test.d.ts +2 -0
  344. package/dist/tests/e2e/admin-ui-coverage.e2e.test.d.ts.map +1 -0
  345. package/dist/tests/e2e/admin-ui-coverage.e2e.test.js +306 -0
  346. package/dist/tests/e2e/admin-ui-coverage.e2e.test.js.map +1 -0
  347. package/dist/tests/e2e/batch-import.e2e.test.js +15 -9
  348. package/dist/tests/e2e/batch-import.e2e.test.js.map +1 -1
  349. package/dist/tests/e2e/cli-install.e2e.test.d.ts +2 -0
  350. package/dist/tests/e2e/cli-install.e2e.test.d.ts.map +1 -0
  351. package/dist/tests/e2e/cli-install.e2e.test.js +102 -0
  352. package/dist/tests/e2e/cli-install.e2e.test.js.map +1 -0
  353. package/dist/tests/e2e/helpers/admin-login.d.ts +45 -0
  354. package/dist/tests/e2e/helpers/admin-login.d.ts.map +1 -0
  355. package/dist/tests/e2e/helpers/admin-login.js +98 -0
  356. package/dist/tests/e2e/helpers/admin-login.js.map +1 -0
  357. package/dist/tests/e2e/helpers/e2e-server.d.ts +10 -2
  358. package/dist/tests/e2e/helpers/e2e-server.d.ts.map +1 -1
  359. package/dist/tests/e2e/helpers/e2e-server.js +146 -21
  360. package/dist/tests/e2e/helpers/e2e-server.js.map +1 -1
  361. package/dist/tests/e2e/helpers/mock-dingtalk.d.ts +1 -1
  362. package/dist/tests/e2e/helpers/mock-dingtalk.d.ts.map +1 -1
  363. package/dist/tests/e2e/helpers/mock-dingtalk.js.map +1 -1
  364. package/dist/tests/e2e/interview-flow.e2e.test.js +17 -11
  365. package/dist/tests/e2e/interview-flow.e2e.test.js.map +1 -1
  366. package/dist/tests/e2e/member-management.e2e.test.d.ts +2 -0
  367. package/dist/tests/e2e/member-management.e2e.test.d.ts.map +1 -0
  368. package/dist/tests/e2e/member-management.e2e.test.js +393 -0
  369. package/dist/tests/e2e/member-management.e2e.test.js.map +1 -0
  370. package/dist/tests/e2e/plan-lifecycle.e2e.test.d.ts +2 -0
  371. package/dist/tests/e2e/plan-lifecycle.e2e.test.d.ts.map +1 -0
  372. package/dist/tests/e2e/plan-lifecycle.e2e.test.js +461 -0
  373. package/dist/tests/e2e/plan-lifecycle.e2e.test.js.map +1 -0
  374. package/dist/tests/e2e/report-viewing.e2e.test.d.ts +2 -0
  375. package/dist/tests/e2e/report-viewing.e2e.test.d.ts.map +1 -0
  376. package/dist/tests/e2e/report-viewing.e2e.test.js +270 -0
  377. package/dist/tests/e2e/report-viewing.e2e.test.js.map +1 -0
  378. package/dist/tests/e2e/template-lifecycle.e2e.test.js +8 -4
  379. package/dist/tests/e2e/template-lifecycle.e2e.test.js.map +1 -1
  380. package/dist/tests/e2e-hermetic-llm-env.test.d.ts +2 -0
  381. package/dist/tests/e2e-hermetic-llm-env.test.d.ts.map +1 -0
  382. package/dist/tests/e2e-hermetic-llm-env.test.js +53 -0
  383. package/dist/tests/e2e-hermetic-llm-env.test.js.map +1 -0
  384. package/dist/tests/env-config.test.js +2 -6
  385. package/dist/tests/env-config.test.js.map +1 -1
  386. package/dist/tests/export.integration.test.js +2 -2
  387. package/dist/tests/export.integration.test.js.map +1 -1
  388. package/dist/tests/export.service.test.js +40 -1
  389. package/dist/tests/export.service.test.js.map +1 -1
  390. package/dist/tests/global-setup.d.ts +9 -0
  391. package/dist/tests/global-setup.d.ts.map +1 -0
  392. package/dist/tests/global-setup.js +29 -0
  393. package/dist/tests/global-setup.js.map +1 -0
  394. package/dist/tests/graph.test.js +10 -12
  395. package/dist/tests/graph.test.js.map +1 -1
  396. package/dist/tests/health-api.test.js +13 -3
  397. package/dist/tests/health-api.test.js.map +1 -1
  398. package/dist/tests/helpers/admin-auth.d.ts +3 -0
  399. package/dist/tests/helpers/admin-auth.d.ts.map +1 -0
  400. package/dist/tests/helpers/admin-auth.js +18 -0
  401. package/dist/tests/helpers/admin-auth.js.map +1 -0
  402. package/dist/tests/helpers/create-test-prisma.d.ts +18 -0
  403. package/dist/tests/helpers/create-test-prisma.d.ts.map +1 -0
  404. package/dist/tests/helpers/create-test-prisma.js +30 -0
  405. package/dist/tests/helpers/create-test-prisma.js.map +1 -0
  406. package/dist/tests/helpers/pglite-template.d.ts +31 -0
  407. package/dist/tests/helpers/pglite-template.d.ts.map +1 -0
  408. package/dist/tests/helpers/pglite-template.js +215 -0
  409. package/dist/tests/helpers/pglite-template.js.map +1 -0
  410. package/dist/tests/helpers/test-db.d.ts +19 -4
  411. package/dist/tests/helpers/test-db.d.ts.map +1 -1
  412. package/dist/tests/helpers/test-db.js +49 -41
  413. package/dist/tests/helpers/test-db.js.map +1 -1
  414. package/dist/tests/helpers/test-server.d.ts +1 -1
  415. package/dist/tests/helpers/test-server.d.ts.map +1 -1
  416. package/dist/tests/helpers/test-server.js +2 -0
  417. package/dist/tests/helpers/test-server.js.map +1 -1
  418. package/dist/tests/interview-plan-additional.test.js +1 -1
  419. package/dist/tests/interview-plan-additional.test.js.map +1 -1
  420. package/dist/tests/interview-plan-members-phone.test.js +16 -5
  421. package/dist/tests/interview-plan-members-phone.test.js.map +1 -1
  422. package/dist/tests/interview-plan-members.test.js.map +1 -1
  423. package/dist/tests/interview-plan.integration.test.js +8 -2
  424. package/dist/tests/interview-plan.integration.test.js.map +1 -1
  425. package/dist/tests/interview-plan.test.js +1 -1
  426. package/dist/tests/interview-plan.test.js.map +1 -1
  427. package/dist/tests/interview-repository.test.js +9 -5
  428. package/dist/tests/interview-repository.test.js.map +1 -1
  429. package/dist/tests/interview-state-full.test.js +10 -10
  430. package/dist/tests/interview-state-full.test.js.map +1 -1
  431. package/dist/tests/interview-state-repository.integration.test.js +4 -6
  432. package/dist/tests/interview-state-repository.integration.test.js.map +1 -1
  433. package/dist/tests/interview-state-repository.test.js +7 -9
  434. package/dist/tests/interview-state-repository.test.js.map +1 -1
  435. package/dist/tests/interviewing-node.test.js +10 -9
  436. package/dist/tests/interviewing-node.test.js.map +1 -1
  437. package/dist/tests/interviewing-smart-response.test.js +1 -1
  438. package/dist/tests/llm-clustering.test.js.map +1 -1
  439. package/dist/tests/login-csrf.test.d.ts +2 -0
  440. package/dist/tests/login-csrf.test.d.ts.map +1 -0
  441. package/dist/tests/login-csrf.test.js +24 -0
  442. package/dist/tests/login-csrf.test.js.map +1 -0
  443. package/dist/tests/login-rate-limit.test.d.ts +2 -0
  444. package/dist/tests/login-rate-limit.test.d.ts.map +1 -0
  445. package/dist/tests/login-rate-limit.test.js +69 -0
  446. package/dist/tests/login-rate-limit.test.js.map +1 -0
  447. package/dist/tests/message-repository.test.js +7 -35
  448. package/dist/tests/message-repository.test.js.map +1 -1
  449. package/dist/tests/mutation-testing.test.d.ts +2 -0
  450. package/dist/tests/mutation-testing.test.d.ts.map +1 -0
  451. package/dist/tests/mutation-testing.test.js +215 -0
  452. package/dist/tests/mutation-testing.test.js.map +1 -0
  453. package/dist/tests/optin-hooks.test.d.ts +2 -0
  454. package/dist/tests/optin-hooks.test.d.ts.map +1 -0
  455. package/dist/tests/optin-hooks.test.js +456 -0
  456. package/dist/tests/optin-hooks.test.js.map +1 -0
  457. package/dist/tests/path-resolver.test.d.ts +2 -0
  458. package/dist/tests/path-resolver.test.d.ts.map +1 -0
  459. package/dist/tests/path-resolver.test.js +72 -0
  460. package/dist/tests/path-resolver.test.js.map +1 -0
  461. package/dist/tests/pglite-template.test.d.ts +2 -0
  462. package/dist/tests/pglite-template.test.d.ts.map +1 -0
  463. package/dist/tests/pglite-template.test.js +47 -0
  464. package/dist/tests/pglite-template.test.js.map +1 -0
  465. package/dist/tests/plan-form-tree-refresh.test.d.ts +2 -0
  466. package/dist/tests/plan-form-tree-refresh.test.d.ts.map +1 -0
  467. package/dist/tests/plan-form-tree-refresh.test.js +27 -0
  468. package/dist/tests/plan-form-tree-refresh.test.js.map +1 -0
  469. package/dist/tests/plan-form-tree-target.test.d.ts +2 -0
  470. package/dist/tests/plan-form-tree-target.test.d.ts.map +1 -0
  471. package/dist/tests/plan-form-tree-target.test.js +26 -0
  472. package/dist/tests/plan-form-tree-target.test.js.map +1 -0
  473. package/dist/tests/planning-node.test.js +2 -2
  474. package/dist/tests/planning-node.test.js.map +1 -1
  475. package/dist/tests/plans-api.test.js +59 -2
  476. package/dist/tests/plans-api.test.js.map +1 -1
  477. package/dist/tests/prisma-client.test.d.ts +2 -0
  478. package/dist/tests/prisma-client.test.d.ts.map +1 -0
  479. package/dist/tests/prisma-client.test.js +96 -0
  480. package/dist/tests/prisma-client.test.js.map +1 -0
  481. package/dist/tests/prisma-factory.test.d.ts +2 -0
  482. package/dist/tests/prisma-factory.test.d.ts.map +1 -0
  483. package/dist/tests/prisma-factory.test.js +52 -0
  484. package/dist/tests/prisma-factory.test.js.map +1 -0
  485. package/dist/tests/prisma-migrate-workflow.test.d.ts +2 -0
  486. package/dist/tests/prisma-migrate-workflow.test.d.ts.map +1 -0
  487. package/dist/tests/prisma-migrate-workflow.test.js +46 -0
  488. package/dist/tests/prisma-migrate-workflow.test.js.map +1 -0
  489. package/dist/tests/prisma7-spec-invariants.test.d.ts +2 -0
  490. package/dist/tests/prisma7-spec-invariants.test.d.ts.map +1 -0
  491. package/dist/tests/prisma7-spec-invariants.test.js +327 -0
  492. package/dist/tests/prisma7-spec-invariants.test.js.map +1 -0
  493. package/dist/tests/release-bootstrap.test.d.ts +2 -0
  494. package/dist/tests/release-bootstrap.test.d.ts.map +1 -0
  495. package/dist/tests/release-bootstrap.test.js +204 -0
  496. package/dist/tests/release-bootstrap.test.js.map +1 -0
  497. package/dist/tests/release-config.test.d.ts +2 -0
  498. package/dist/tests/release-config.test.d.ts.map +1 -0
  499. package/dist/tests/release-config.test.js +698 -0
  500. package/dist/tests/release-config.test.js.map +1 -0
  501. package/dist/tests/release-hook-key.test.d.ts +2 -0
  502. package/dist/tests/release-hook-key.test.d.ts.map +1 -0
  503. package/dist/tests/release-hook-key.test.js +145 -0
  504. package/dist/tests/release-hook-key.test.js.map +1 -0
  505. package/dist/tests/release-script-behaviour.test.d.ts +2 -0
  506. package/dist/tests/release-script-behaviour.test.d.ts.map +1 -0
  507. package/dist/tests/release-script-behaviour.test.js +244 -0
  508. package/dist/tests/release-script-behaviour.test.js.map +1 -0
  509. package/dist/tests/release.integration.test.d.ts +2 -0
  510. package/dist/tests/release.integration.test.d.ts.map +1 -0
  511. package/dist/tests/release.integration.test.js +251 -0
  512. package/dist/tests/release.integration.test.js.map +1 -0
  513. package/dist/tests/report-api.test.js +5 -2
  514. package/dist/tests/report-api.test.js.map +1 -1
  515. package/dist/tests/report-dimensions.test.js.map +1 -1
  516. package/dist/tests/report.test.js.map +1 -1
  517. package/dist/tests/schema-analysis-dimensions.test.js +6 -3
  518. package/dist/tests/schema-analysis-dimensions.test.js.map +1 -1
  519. package/dist/tests/security.test.js +22 -6
  520. package/dist/tests/security.test.js.map +1 -1
  521. package/dist/tests/server-api.test.js +51 -24
  522. package/dist/tests/server-api.test.js.map +1 -1
  523. package/dist/tests/server-lifecycle.test.d.ts +2 -0
  524. package/dist/tests/server-lifecycle.test.d.ts.map +1 -0
  525. package/dist/tests/server-lifecycle.test.js +571 -0
  526. package/dist/tests/server-lifecycle.test.js.map +1 -0
  527. package/dist/tests/session-auth.test.d.ts +2 -0
  528. package/dist/tests/session-auth.test.d.ts.map +1 -0
  529. package/dist/tests/session-auth.test.js +100 -0
  530. package/dist/tests/session-auth.test.js.map +1 -0
  531. package/dist/tests/smart-response.test.js +1 -1
  532. package/dist/tests/smart-response.test.js.map +1 -1
  533. package/dist/tests/state-integration.test.js +11 -13
  534. package/dist/tests/state-integration.test.js.map +1 -1
  535. package/dist/tests/state-persistence.test.js +6 -5
  536. package/dist/tests/state-persistence.test.js.map +1 -1
  537. package/dist/tests/stream-client-branches.test.js +3 -1
  538. package/dist/tests/stream-client-branches.test.js.map +1 -1
  539. package/dist/tests/stream-message-full.test.js +8 -11
  540. package/dist/tests/stream-message-full.test.js.map +1 -1
  541. package/dist/tests/stream-message-service.test.js +4 -4
  542. package/dist/tests/stream-message-service.test.js.map +1 -1
  543. package/dist/tests/stream-message.integration.test.js +4 -4
  544. package/dist/tests/strip-extra-questions.test.d.ts +2 -0
  545. package/dist/tests/strip-extra-questions.test.d.ts.map +1 -0
  546. package/dist/tests/strip-extra-questions.test.js +43 -0
  547. package/dist/tests/strip-extra-questions.test.js.map +1 -0
  548. package/dist/tests/sync-version-parity.test.d.ts +2 -0
  549. package/dist/tests/sync-version-parity.test.d.ts.map +1 -0
  550. package/dist/tests/sync-version-parity.test.js +334 -0
  551. package/dist/tests/sync-version-parity.test.js.map +1 -0
  552. package/dist/tests/sync-version.test.d.ts +2 -0
  553. package/dist/tests/sync-version.test.d.ts.map +1 -0
  554. package/dist/tests/sync-version.test.js +101 -0
  555. package/dist/tests/sync-version.test.js.map +1 -0
  556. package/dist/tests/template-crud.test.js +1 -1
  557. package/dist/tests/template-crud.test.js.map +1 -1
  558. package/dist/tests/template-dimensions-api.test.js +6 -3
  559. package/dist/tests/template-dimensions-api.test.js.map +1 -1
  560. package/dist/tests/template-import-export.test.js +1 -1
  561. package/dist/tests/template-import-export.test.js.map +1 -1
  562. package/dist/tests/template-repository.integration.test.js +3 -4
  563. package/dist/tests/template-repository.integration.test.js.map +1 -1
  564. package/dist/tests/template-version.test.js +1 -1
  565. package/dist/tests/template-version.test.js.map +1 -1
  566. package/dist/tests/templates-api.test.js +6 -2
  567. package/dist/tests/templates-api.test.js.map +1 -1
  568. package/dist/tests/test-database.test.d.ts +2 -0
  569. package/dist/tests/test-database.test.d.ts.map +1 -0
  570. package/dist/tests/test-database.test.js +21 -0
  571. package/dist/tests/test-database.test.js.map +1 -0
  572. package/dist/tests/token-manager.test.js +3 -1
  573. package/dist/tests/token-manager.test.js.map +1 -1
  574. package/dist/tests/workflow-interview-lifecycle.test.js +25 -8
  575. package/dist/tests/workflow-interview-lifecycle.test.js.map +1 -1
  576. package/package.json +26 -9
  577. package/prisma/migrations/20261004000000_init/migration.sql +242 -0
  578. package/prisma/migrations/migration_lock.toml +1 -0
  579. package/prisma/schema.prisma +4 -5
  580. package/prisma/seed-satisfaction-survey.ts +3 -2
  581. package/prisma/seed-test-interview.ts +3 -2
  582. package/prisma.config.ts +13 -0
  583. package/scripts/cli.mjs +173 -29
  584. package/scripts/deploy.sh +22 -7
  585. package/scripts/fix-max-followups.ts +60 -0
  586. package/scripts/install-git-hooks.sh +245 -0
  587. package/scripts/mutation-test.mjs +181 -0
  588. package/scripts/release-bootstrap.sh +113 -0
  589. package/scripts/release.sh +321 -0
  590. package/scripts/sync-version.cjs +186 -0
  591. package/scripts/sync-version.sh +102 -6
  592. package/scripts/write-version.cjs +94 -0
  593. package/src/views/AGENTS.md +1 -1
  594. package/src/views/admin/content/plan-detail.njk +19 -25
  595. package/src/views/admin/content/plan-form.njk +1 -0
  596. package/src/views/admin/content/report-detail.njk +226 -4
  597. package/src/views/admin/content/template-info.njk +0 -1
  598. package/src/views/admin/login.njk +57 -0
  599. package/src/views/layouts/admin-tree.njk +22 -3
  600. package/src/views/layouts/admin.njk +1 -1
  601. package/src/views/reports/detail.njk +220 -12
  602. package/dist/api/admin-templates.d.ts +0 -17
  603. package/dist/api/admin-templates.d.ts.map +0 -1
  604. package/dist/api/admin-templates.js +0 -718
  605. package/dist/api/admin-templates.js.map +0 -1
  606. package/dist/api/analysis.d.ts +0 -8
  607. package/dist/api/analysis.d.ts.map +0 -1
  608. package/dist/api/analysis.js +0 -106
  609. package/dist/api/analysis.js.map +0 -1
  610. package/dist/api/health.d.ts +0 -6
  611. package/dist/api/health.d.ts.map +0 -1
  612. package/dist/api/health.js +0 -116
  613. package/dist/api/health.js.map +0 -1
  614. package/dist/api/plans.d.ts +0 -8
  615. package/dist/api/plans.d.ts.map +0 -1
  616. package/dist/api/plans.js +0 -402
  617. package/dist/api/plans.js.map +0 -1
  618. package/dist/api/templates.d.ts +0 -9
  619. package/dist/api/templates.d.ts.map +0 -1
  620. package/dist/api/templates.js +0 -211
  621. package/dist/api/templates.js.map +0 -1
  622. package/dist/api/webhook.d.ts +0 -3
  623. package/dist/api/webhook.d.ts.map +0 -1
  624. package/dist/api/webhook.js +0 -98
  625. package/dist/api/webhook.js.map +0 -1
  626. package/dist/core/graph.d.ts +0 -8
  627. package/dist/core/graph.d.ts.map +0 -1
  628. package/dist/core/graph.js +0 -59
  629. package/dist/core/graph.js.map +0 -1
  630. package/dist/core/nodes/analyzing.d.ts +0 -4
  631. package/dist/core/nodes/analyzing.d.ts.map +0 -1
  632. package/dist/core/nodes/analyzing.js +0 -38
  633. package/dist/core/nodes/analyzing.js.map +0 -1
  634. package/dist/core/nodes/completed.d.ts +0 -3
  635. package/dist/core/nodes/completed.d.ts.map +0 -1
  636. package/dist/core/nodes/completed.js +0 -8
  637. package/dist/core/nodes/completed.js.map +0 -1
  638. package/dist/core/nodes/interviewing.d.ts +0 -7
  639. package/dist/core/nodes/interviewing.d.ts.map +0 -1
  640. package/dist/core/nodes/interviewing.js +0 -119
  641. package/dist/core/nodes/interviewing.js.map +0 -1
  642. package/dist/core/nodes/planning.d.ts +0 -4
  643. package/dist/core/nodes/planning.d.ts.map +0 -1
  644. package/dist/core/nodes/planning.js +0 -30
  645. package/dist/core/nodes/planning.js.map +0 -1
  646. package/dist/core/nodes/template-utils.d.ts +0 -4
  647. package/dist/core/nodes/template-utils.d.ts.map +0 -1
  648. package/dist/core/nodes/template-utils.js +0 -12
  649. package/dist/core/nodes/template-utils.js.map +0 -1
  650. package/dist/core/types/index.d.ts +0 -87
  651. package/dist/core/types/index.d.ts.map +0 -1
  652. package/dist/core/types/index.js +0 -61
  653. package/dist/core/types/index.js.map +0 -1
  654. package/dist/domains/interview/entities/interview.entity.d.ts +0 -21
  655. package/dist/domains/interview/entities/interview.entity.d.ts.map +0 -1
  656. package/dist/domains/interview/entities/interview.entity.js +0 -20
  657. package/dist/domains/interview/entities/interview.entity.js.map +0 -1
  658. package/dist/domains/interview/entities/message.entity.d.ts +0 -15
  659. package/dist/domains/interview/entities/message.entity.d.ts.map +0 -1
  660. package/dist/domains/interview/entities/message.entity.js +0 -11
  661. package/dist/domains/interview/entities/message.entity.js.map +0 -1
  662. package/dist/domains/interview/entities/response.entity.d.ts +0 -17
  663. package/dist/domains/interview/entities/response.entity.d.ts.map +0 -1
  664. package/dist/domains/interview/entities/response.entity.js +0 -12
  665. package/dist/domains/interview/entities/response.entity.js.map +0 -1
  666. package/dist/domains/interview/services/interview.domain.d.ts +0 -8
  667. package/dist/domains/interview/services/interview.domain.d.ts.map +0 -1
  668. package/dist/domains/interview/services/interview.domain.js +0 -30
  669. package/dist/domains/interview/services/interview.domain.js.map +0 -1
  670. package/dist/index.d.ts +0 -8
  671. package/dist/index.d.ts.map +0 -1
  672. package/dist/index.js +0 -13
  673. package/dist/index.js.map +0 -1
  674. package/dist/integrations/dingtalk/client.d.ts +0 -41
  675. package/dist/integrations/dingtalk/client.d.ts.map +0 -1
  676. package/dist/integrations/dingtalk/client.js +0 -124
  677. package/dist/integrations/dingtalk/client.js.map +0 -1
  678. package/dist/integrations/dingtalk/message-sender.d.ts +0 -24
  679. package/dist/integrations/dingtalk/message-sender.d.ts.map +0 -1
  680. package/dist/integrations/dingtalk/message-sender.js +0 -81
  681. package/dist/integrations/dingtalk/message-sender.js.map +0 -1
  682. package/dist/integrations/dingtalk/middleware.d.ts +0 -4
  683. package/dist/integrations/dingtalk/middleware.d.ts.map +0 -1
  684. package/dist/integrations/dingtalk/middleware.js +0 -31
  685. package/dist/integrations/dingtalk/middleware.js.map +0 -1
  686. package/dist/integrations/dingtalk/stream-client.d.ts +0 -131
  687. package/dist/integrations/dingtalk/stream-client.d.ts.map +0 -1
  688. package/dist/integrations/dingtalk/stream-client.js +0 -365
  689. package/dist/integrations/dingtalk/stream-client.js.map +0 -1
  690. package/dist/integrations/dingtalk/token-manager.d.ts +0 -22
  691. package/dist/integrations/dingtalk/token-manager.d.ts.map +0 -1
  692. package/dist/integrations/dingtalk/token-manager.js +0 -109
  693. package/dist/integrations/dingtalk/token-manager.js.map +0 -1
  694. package/dist/integrations/llm/alibaba.d.ts +0 -10
  695. package/dist/integrations/llm/alibaba.d.ts.map +0 -1
  696. package/dist/integrations/llm/alibaba.js +0 -60
  697. package/dist/integrations/llm/alibaba.js.map +0 -1
  698. package/dist/integrations/llm/base.d.ts +0 -28
  699. package/dist/integrations/llm/base.d.ts.map +0 -1
  700. package/dist/integrations/llm/base.js +0 -2
  701. package/dist/integrations/llm/base.js.map +0 -1
  702. package/dist/integrations/llm/openai-compatible.d.ts +0 -12
  703. package/dist/integrations/llm/openai-compatible.d.ts.map +0 -1
  704. package/dist/integrations/llm/openai-compatible.js +0 -81
  705. package/dist/integrations/llm/openai-compatible.js.map +0 -1
  706. package/dist/integrations/llm/volcengine.d.ts +0 -12
  707. package/dist/integrations/llm/volcengine.d.ts.map +0 -1
  708. package/dist/integrations/llm/volcengine.js +0 -75
  709. package/dist/integrations/llm/volcengine.js.map +0 -1
  710. package/dist/middleware/admin-auth.d.ts +0 -3
  711. package/dist/middleware/admin-auth.d.ts.map +0 -1
  712. package/dist/middleware/admin-auth.js +0 -37
  713. package/dist/middleware/admin-auth.js.map +0 -1
  714. package/dist/middleware/api-auth.d.ts +0 -10
  715. package/dist/middleware/api-auth.d.ts.map +0 -1
  716. package/dist/middleware/api-auth.js +0 -30
  717. package/dist/middleware/api-auth.js.map +0 -1
  718. package/dist/repositories/interview-state-mapper.d.ts +0 -29
  719. package/dist/repositories/interview-state-mapper.d.ts.map +0 -1
  720. package/dist/repositories/interview-state-mapper.js +0 -33
  721. package/dist/repositories/interview-state-mapper.js.map +0 -1
  722. package/dist/repositories/interview-state.repository.d.ts +0 -37
  723. package/dist/repositories/interview-state.repository.d.ts.map +0 -1
  724. package/dist/repositories/interview-state.repository.js +0 -237
  725. package/dist/repositories/interview-state.repository.js.map +0 -1
  726. package/dist/repositories/interview.repository.d.ts +0 -29
  727. package/dist/repositories/interview.repository.d.ts.map +0 -1
  728. package/dist/repositories/interview.repository.js +0 -36
  729. package/dist/repositories/interview.repository.js.map +0 -1
  730. package/dist/repositories/message.repository.d.ts +0 -17
  731. package/dist/repositories/message.repository.d.ts.map +0 -1
  732. package/dist/repositories/message.repository.js +0 -39
  733. package/dist/repositories/message.repository.js.map +0 -1
  734. package/dist/repositories/template.repository.d.ts +0 -117
  735. package/dist/repositories/template.repository.d.ts.map +0 -1
  736. package/dist/repositories/template.repository.js +0 -283
  737. package/dist/repositories/template.repository.js.map +0 -1
  738. package/dist/schemas/dimensions.d.ts +0 -61
  739. package/dist/schemas/dimensions.d.ts.map +0 -1
  740. package/dist/schemas/dimensions.js +0 -44
  741. package/dist/schemas/dimensions.js.map +0 -1
  742. package/dist/server.d.ts +0 -10
  743. package/dist/server.d.ts.map +0 -1
  744. package/dist/server.js +0 -270
  745. package/dist/server.js.map +0 -1
  746. package/dist/services/analysis.service.d.ts +0 -81
  747. package/dist/services/analysis.service.d.ts.map +0 -1
  748. package/dist/services/analysis.service.js +0 -233
  749. package/dist/services/analysis.service.js.map +0 -1
  750. package/dist/services/analytics.service.d.ts +0 -57
  751. package/dist/services/analytics.service.d.ts.map +0 -1
  752. package/dist/services/analytics.service.js +0 -265
  753. package/dist/services/analytics.service.js.map +0 -1
  754. package/dist/services/asr.service.d.ts +0 -9
  755. package/dist/services/asr.service.d.ts.map +0 -1
  756. package/dist/services/asr.service.js +0 -41
  757. package/dist/services/asr.service.js.map +0 -1
  758. package/dist/services/audit-cleanup.service.d.ts +0 -9
  759. package/dist/services/audit-cleanup.service.d.ts.map +0 -1
  760. package/dist/services/audit-cleanup.service.js +0 -27
  761. package/dist/services/audit-cleanup.service.js.map +0 -1
  762. package/dist/services/batch-aggregation.service.d.ts +0 -34
  763. package/dist/services/batch-aggregation.service.d.ts.map +0 -1
  764. package/dist/services/batch-aggregation.service.js +0 -91
  765. package/dist/services/batch-aggregation.service.js.map +0 -1
  766. package/dist/services/conversation-engine.d.ts +0 -16
  767. package/dist/services/conversation-engine.d.ts.map +0 -1
  768. package/dist/services/conversation-engine.js +0 -49
  769. package/dist/services/conversation-engine.js.map +0 -1
  770. package/dist/services/dead-letter.service.d.ts +0 -12
  771. package/dist/services/dead-letter.service.d.ts.map +0 -1
  772. package/dist/services/dead-letter.service.js +0 -24
  773. package/dist/services/dead-letter.service.js.map +0 -1
  774. package/dist/services/dingtalk.service.d.ts +0 -13
  775. package/dist/services/dingtalk.service.d.ts.map +0 -1
  776. package/dist/services/dingtalk.service.js +0 -76
  777. package/dist/services/dingtalk.service.js.map +0 -1
  778. package/dist/services/export.service.d.ts +0 -12
  779. package/dist/services/export.service.d.ts.map +0 -1
  780. package/dist/services/export.service.js +0 -197
  781. package/dist/services/export.service.js.map +0 -1
  782. package/dist/services/followup.service.d.ts +0 -19
  783. package/dist/services/followup.service.d.ts.map +0 -1
  784. package/dist/services/followup.service.js +0 -177
  785. package/dist/services/followup.service.js.map +0 -1
  786. package/dist/services/interview-plan-base.service.d.ts +0 -204
  787. package/dist/services/interview-plan-base.service.d.ts.map +0 -1
  788. package/dist/services/interview-plan-base.service.js +0 -162
  789. package/dist/services/interview-plan-base.service.js.map +0 -1
  790. package/dist/services/interview-plan-members.service.d.ts +0 -56
  791. package/dist/services/interview-plan-members.service.d.ts.map +0 -1
  792. package/dist/services/interview-plan-members.service.js +0 -301
  793. package/dist/services/interview-plan-members.service.js.map +0 -1
  794. package/dist/services/interview-plan-send.service.d.ts +0 -18
  795. package/dist/services/interview-plan-send.service.d.ts.map +0 -1
  796. package/dist/services/interview-plan-send.service.js +0 -204
  797. package/dist/services/interview-plan-send.service.js.map +0 -1
  798. package/dist/services/interview-plan.service.d.ts +0 -7
  799. package/dist/services/interview-plan.service.d.ts.map +0 -1
  800. package/dist/services/interview-plan.service.js +0 -7
  801. package/dist/services/interview-plan.service.js.map +0 -1
  802. package/dist/services/llm-clustering.d.ts +0 -16
  803. package/dist/services/llm-clustering.d.ts.map +0 -1
  804. package/dist/services/llm-clustering.js +0 -91
  805. package/dist/services/llm-clustering.js.map +0 -1
  806. package/dist/services/member-verification.service.d.ts +0 -33
  807. package/dist/services/member-verification.service.d.ts.map +0 -1
  808. package/dist/services/member-verification.service.js +0 -78
  809. package/dist/services/member-verification.service.js.map +0 -1
  810. package/dist/services/prompt.service.d.ts +0 -13
  811. package/dist/services/prompt.service.d.ts.map +0 -1
  812. package/dist/services/prompt.service.js +0 -156
  813. package/dist/services/prompt.service.js.map +0 -1
  814. package/dist/services/report.service.d.ts +0 -28
  815. package/dist/services/report.service.d.ts.map +0 -1
  816. package/dist/services/report.service.js +0 -170
  817. package/dist/services/report.service.js.map +0 -1
  818. package/dist/services/stream-message-utils.d.ts +0 -31
  819. package/dist/services/stream-message-utils.d.ts.map +0 -1
  820. package/dist/services/stream-message-utils.js +0 -83
  821. package/dist/services/stream-message-utils.js.map +0 -1
  822. package/dist/services/stream-message.service.d.ts +0 -34
  823. package/dist/services/stream-message.service.d.ts.map +0 -1
  824. package/dist/services/stream-message.service.js +0 -319
  825. package/dist/services/stream-message.service.js.map +0 -1
  826. package/dist/services/template-dimension.service.d.ts +0 -21
  827. package/dist/services/template-dimension.service.d.ts.map +0 -1
  828. package/dist/services/template-dimension.service.js +0 -9
  829. package/dist/services/template-dimension.service.js.map +0 -1
  830. package/dist/src/services/asr.service.d.ts +0 -9
  831. package/dist/src/services/asr.service.d.ts.map +0 -1
  832. package/dist/src/services/asr.service.js +0 -41
  833. package/dist/src/services/asr.service.js.map +0 -1
  834. package/dist/tests/asr.test.d.ts +0 -2
  835. package/dist/tests/asr.test.d.ts.map +0 -1
  836. package/dist/tests/asr.test.js +0 -137
  837. package/dist/tests/asr.test.js.map +0 -1
  838. package/dist/utils/date.d.ts +0 -6
  839. package/dist/utils/date.d.ts.map +0 -1
  840. package/dist/utils/date.js +0 -56
  841. package/dist/utils/date.js.map +0 -1
  842. package/dist/utils/db.d.ts +0 -10
  843. package/dist/utils/db.d.ts.map +0 -1
  844. package/dist/utils/db.js +0 -21
  845. package/dist/utils/db.js.map +0 -1
  846. package/dist/utils/encryption.d.ts +0 -3
  847. package/dist/utils/encryption.d.ts.map +0 -1
  848. package/dist/utils/encryption.js +0 -34
  849. package/dist/utils/encryption.js.map +0 -1
  850. package/dist/utils/logger.d.ts +0 -8
  851. package/dist/utils/logger.d.ts.map +0 -1
  852. package/dist/utils/logger.js +0 -22
  853. package/dist/utils/logger.js.map +0 -1
  854. package/dist/utils/markdown.d.ts +0 -2
  855. package/dist/utils/markdown.d.ts.map +0 -1
  856. package/dist/utils/markdown.js +0 -42
  857. package/dist/utils/markdown.js.map +0 -1
  858. package/dist/utils/pii-anonymizer.d.ts +0 -2
  859. package/dist/utils/pii-anonymizer.d.ts.map +0 -1
  860. package/dist/utils/pii-anonymizer.js +0 -13
  861. package/dist/utils/pii-anonymizer.js.map +0 -1
  862. package/dist/utils/rate-limiter.d.ts +0 -22
  863. package/dist/utils/rate-limiter.d.ts.map +0 -1
  864. package/dist/utils/rate-limiter.js +0 -76
  865. package/dist/utils/rate-limiter.js.map +0 -1
  866. package/dist/utils/retry.d.ts +0 -15
  867. package/dist/utils/retry.d.ts.map +0 -1
  868. package/dist/utils/retry.js +0 -45
  869. package/dist/utils/retry.js.map +0 -1
  870. package/dist/utils/security.d.ts +0 -26
  871. package/dist/utils/security.d.ts.map +0 -1
  872. package/dist/utils/security.js +0 -107
  873. package/dist/utils/security.js.map +0 -1
  874. package/dist/utils/validation.d.ts +0 -8
  875. package/dist/utils/validation.d.ts.map +0 -1
  876. package/dist/utils/validation.js +0 -30
  877. package/dist/utils/validation.js.map +0 -1
package/README.md CHANGED
@@ -1,307 +1,300 @@
1
1
  # Dialog Survey
2
2
 
3
- AI-powered interview robot that conducts async multi-turn interviews via DingTalk with intelligent follow-up questions, multi-turn context memory, and voice input support.
3
+ > **Turn DingTalk conversations into structured intelligence.**
4
+ >
5
+ > An AI-powered survey dialog bot that conducts async multi-turn conversations via DingTalk — with LLM-driven follow-ups, context memory, and automated report generation.
4
6
 
5
- ## Features
7
+ [![Version](https://img.shields.io/badge/version-1.10.0-blue)](https://github.com/boyingliu01/dialog-survey)
8
+ [![Node](https://img.shields.io/badge/node-%3E%3D20.19-brightgreen)]()
9
+ [![License](https://img.shields.io/badge/license-MIT-green)]()
6
10
 
7
- - **AI 智能追问**: 基于 LLM 的完全智能型追问能力
8
- - **多轮上下文记忆**: 支持跨多天、多条消息的对话连贯性
9
- - **语音输入**: 支持语音消息回答
10
- - **异步消息式访谈**: 被访谈者可以在碎片时间回答
11
- - **自动生成报告**: 访谈结束后自动生成 Markdown 报告
12
- - **私有部署**: 数据全留存,确保安全性
11
+ ---
13
12
 
14
- ## Tech Stack
15
-
16
- - **对话引擎**: Custom LangGraph-inspired workflow (not StateGraph API)
17
- - **LLM**: OpenAI-compatible API(支持本地部署:如 ollama / vLLM / LocalAI;也可对接云服务)
18
- - **语音识别**: 阿里云 Fun-ASR
19
- - **消息平台**: DingTalk Stream Mode (WebSocket)
20
- - **数据存储**: PostgreSQL (Prisma ORM)
21
- - **Web 框架**: Fastify 5.x
22
- - **模板引擎**: Nunjucks (server-side views)
23
- - **语言**: TypeScript (strict mode, ESM)
24
-
25
- ## Installation
13
+ ## Quickstart
26
14
 
27
15
  ```bash
28
- # Interactive installation — prompts for each value
16
+ # One-line install — interactive prompts for each value
29
17
  npx dialog-survey install
30
18
 
31
- # Non-interactive installation (all required flags)
32
- npx dialog-survey install \
33
- --db-url "postgresql://user:pass@localhost:5432/dialog_survey" \
34
- --dingtalk-client-id "xxx" \
35
- --dingtalk-client-secret "xxx" \
36
- --dingtalk-agent-id "xxx"
37
-
38
- # Lifecycle management
19
+ # Start the service
39
20
  npx dialog-survey start
40
- npx dialog-survey stop
41
- npx dialog-survey status
42
- npx dialog-survey uninstall
43
21
 
44
- # View help
45
- npx dialog-survey help
22
+ # That's it. Your dialog bot is live on DingTalk.
46
23
  ```
47
24
 
48
- **Prerequisites**: Node.js >=20, PostgreSQL 14+.
49
- - **Linux**: [PM2](https://pm2.keymetrics.io/) (`npm install -g pm2`) recommended for production process management
50
- - **Windows**: PM2 在 Windows 上的稳定性存在问题,CLI 会自动使用直接 `node` 启动(TypeScript 编译必须可用)
25
+ **Prerequisites:** Node.js >= 20.19, PostgreSQL 14+, a DingTalk application (Client ID/Secret/Agent ID).
51
26
 
52
- > For local LLM deployment, leave `--llm-api-key` empty during install;
53
- > the service will connect to an OpenAI-compatible endpoint at `http://localhost:11434/v1`
54
- > by default. Set `LLM_BASE_URL` and `LLM_MODEL` in the generated `.env` file if needed.
27
+ ---
55
28
 
56
- ## Usage
29
+ ## Why — 为什么做这个项目?
57
30
 
58
- After installation, use the CLI commands for lifecycle management:
31
+ **One-on-one conversations are great.** People enjoy real dialogue — a skilled facilitator builds rapport, reads between the lines, and asks exactly the right follow-up. But sitting down with hundreds or thousands of people one by one is expensive and doesn't scale.
59
32
 
60
- ```bash
61
- # Start the service
62
- npx dialog-survey start
33
+ **Surveys scale beautifully**, but they're shallow. A fixed questionnaire can't pivot when a respondent says something unexpected.
63
34
 
64
- # Stop the service
65
- npx dialog-survey stop
35
+ Dialog Survey fills the gap between these two. It's **deeper than a form, broader than a human-led session.** An AI-powered dialog bot probes interesting responses like a skilled facilitator would, while reaching hundreds of participants in parallel via DingTalk. It won't replace a great human conversation — but when you need structured, first-hand insights from a large group, it's the closest thing without hiring an army of researchers.
66
36
 
67
- # Check service status
68
- npx dialog-survey status
37
+ ---
69
38
 
70
- # Uninstall completely
71
- npx dialog-survey uninstall
39
+ ## What — 这个项目是什么?
72
40
 
73
- # View help
74
- npx dialog-survey help
75
- ```
41
+ Dialog Survey is an **async survey dialog bot** that lives inside DingTalk. You design a survey template, invite participants, and the AI conducts a multi-turn conversation with each person — asking initial questions, probing deeper on interesting answers, and remembering context across days and messages.
76
42
 
77
- ## Quick Start (Development)
43
+ ### Key Capabilities
78
44
 
79
- ### 1. Install Dependencies
45
+ | Capability | Description |
46
+ |-----------|-------------|
47
+ | **AI-driven follow-ups** | LLM-powered intelligent probing — when a participant says something interesting, the bot digs deeper automatically |
48
+ | **Multi-turn context memory** | Coherent conversations that span days and multiple messages, not isolated Q&A rounds |
49
+ | **Async messaging** | Participants answer in their spare time on DingTalk — no scheduled calls, no pressure |
50
+ | **Auto report generation** | Markdown reports generated automatically after dialogs complete — PDF/Excel export via Playwright |
51
+ | **Self-hosted** | All data stays on your infrastructure. PostgreSQL, your LLM (ollama / vLLM / cloud), your DingTalk app |
80
52
 
81
- ```bash
82
- cd dialog-survey
83
- npm install
84
- ```
53
+ ### What's New (v1.10.x)
85
54
 
86
- ### 2. Configure Environment
55
+ - **v1.10.0** — Prisma 6 → 7 with driver adapters. Tests no longer need PostgreSQL: the suite runs on PGlite (isolated WASM database per test file), so `npm test` works with zero manual setup. Node.js requirement raised to >= 20.19.0.
56
+ - **v1.8.1** — Full project doc refresh: compressed AGENTS.md to 88 lines, added subdirectory AGENTS.md for repositories/integrations/utils
57
+ - **v1.8.0** — Removed unused ASR/voice recognition. Fixed COMPLETED dialogs stuck in CONTINUE loop. Fixed maxFollowups not persisted to DB. Fixed add-member modal swallowing errors silently.
58
+ - **v1.7.9** — CI stability: fixed flaky integration tests, cleaned up secrets from sample configs
59
+ - **v1.7.8** — Unified tsconfig.json, fixed 81 type errors across 35 files
87
60
 
88
- ```bash
89
- cp .env.example .env
90
- # Edit .env with your configuration
91
- ```
61
+ > Full changelog in [CHANGELOG.md](./CHANGELOG.md).
92
62
 
93
- ### 3. Initialize Database
63
+ ---
94
64
 
95
- ```bash
96
- npx prisma generate
97
- npx prisma db push
98
- ```
65
+ ## How — 怎么使用这个项目?
99
66
 
100
- ### 4. Start Service
67
+ ### Tech Stack
68
+
69
+ | Layer | Technology |
70
+ |-------|-----------|
71
+ | **Conversation Engine** | Custom LangGraph-inspired workflow (not StateGraph API) |
72
+ | **LLM** | OpenAI-compatible API — ollama / vLLM / LocalAI / cloud |
73
+ | **Messaging** | DingTalk Stream Mode (WebSocket) |
74
+ | **Database** | PostgreSQL + Prisma 7 (driver adapters) |
75
+ | **Web Framework** | Fastify 5.x |
76
+ | **Templates** | Nunjucks (admin UI) |
77
+ | **Language** | TypeScript (strict mode, ESM) |
78
+
79
+ ---
80
+
81
+ ### Installation
82
+
83
+ #### Option A: Quick CLI (recommended for production)
101
84
 
102
85
  ```bash
103
- npm run dev
86
+ # Interactive
87
+ npx dialog-survey install
88
+
89
+ # Non-interactive (CI / automation)
90
+ npx dialog-survey install \
91
+ --db-url "postgresql://user:pass@localhost:5432/dialog_survey" \
92
+ --dingtalk-client-id "xxx" \
93
+ --dingtalk-client-secret "xxx" \
94
+ --dingtalk-agent-id "xxx"
104
95
  ```
105
96
 
106
- ## 项目结构
97
+ This generates `.env`, applies database migrations with `prisma migrate deploy` (Prisma 7), and sets up PM2 (Linux/macOS) or direct node launch (Windows).
107
98
 
108
- ```
109
- dialog-survey/
110
- ├── src/
111
- │ ├── api/ # API 层 (Fastify routes)
112
- │ ├── core/ # 核心逻辑 (LangGraph StateGraph)
113
- │ ├── services/ # 服务层 (LLM, ASR, 钉钉)
114
- │ ├── repositories/ # 数据访问层 (Prisma)
115
- │ ├── integrations/ # 外部服务集成
116
- │ ├── domains/ # 领域实体
117
- │ ├── middleware/ # Fastify 中间件
118
- │ ├── views/ # Nunjucks 模板
119
- │ └── utils/ # 工具函数
120
- ├── tests/ # 测试 (Vitest)
121
- ├── scripts/ # CLI 脚本和部署脚本
122
- ├── prisma/ # Prisma schema 和迁移
123
- ├── templates/ # 访谈模板
124
- ├── reports/ # 生成的报告
125
- ├── package.json
126
- ├── tsconfig.json
127
- └── vitest.config.ts
99
+ #### Option B: Docker Compose (recommended for evaluation)
100
+
101
+ ```bash
102
+ cp .env.example .env
103
+ # Fill in your DingTalk + LLM config
104
+ docker compose up -d
105
+ curl http://localhost:3001/health
128
106
  ```
129
107
 
130
- ## 开发命令
108
+ #### Option C: Manual setup (development)
131
109
 
132
110
  ```bash
133
- # 类型检查
134
- npm run type-check
135
-
136
- # 运行测试
137
- npm test
111
+ git clone https://github.com/boyingliu01/dialog-survey
112
+ cd dialog-survey
113
+ npm install
114
+ cp .env.example .env
115
+ # Edit .env with your config
116
+ npx prisma generate && npx prisma migrate dev
117
+ npm run dev
118
+ ```
138
119
 
139
- # 测试覆盖率
140
- npm run test:coverage
120
+ ---
141
121
 
142
- # 代码检查
143
- npm run lint
122
+ ### Lifecycle Management
144
123
 
145
- # 构建
146
- npm run build
124
+ ```bash
125
+ npx dialog-survey start # Start service
126
+ npx dialog-survey stop # Stop service
127
+ npx dialog-survey status # Check status
128
+ npx dialog-survey uninstall # Remove completely (data preserved)
129
+ npx dialog-survey help # View all commands
147
130
  ```
148
131
 
149
- ## 部署
132
+ ---
150
133
 
151
- ### 环境要求
134
+ ### Configuration
152
135
 
153
- | 组件 | 版本/说明 |
154
- |------|-----------|
155
- | Node.js | >= 20.0.0 (推荐 v20 LTS) |
156
- | PostgreSQL | 14+ |
157
- | npm | 随 Node.js 自带 |
158
- | 操作系统 | Linux / macOS / Windows |
136
+ Key environment variables (see `.env.example` for the full list):
159
137
 
160
- ### 部署步骤
138
+ | Variable | Description | Example |
139
+ |----------|-------------|---------|
140
+ | `DATABASE_URL` | PostgreSQL connection string | `postgresql://user:pass@localhost:5432/dialog_survey` |
141
+ | `LLM_BASE_URL` | LLM endpoint (OpenAI-compatible) | `http://localhost:11434/v1` |
142
+ | `LLM_MODEL` | Model name | `qwen2.5` |
143
+ | `DINGTALK_CLIENT_ID` | DingTalk Client ID | From DingTalk Open Platform |
144
+ | `DINGTALK_CLIENT_SECRET` | DingTalk Client Secret | From DingTalk Open Platform |
145
+ | `DINGTALK_AGENT_ID` | DingTalk Agent ID | From DingTalk Open Platform |
146
+ | `DISABLE_STARTUP_RESEND` | Skip the startup resend of unsent messages (`1`/`true`/`yes`) | `1` |
147
+ | `ADMIN_API_KEY` | Admin panel API key | Your custom key |
161
148
 
162
- #### 1. 克隆或复制项目
149
+ > Leave `LLM_API_KEY` empty to use a local LLM at `http://localhost:11434/v1`.
150
+ > Without `DINGTALK_CLIENT_ID`/`DINGTALK_CLIENT_SECRET` the server boots read-only (no Stream connection, no outbound messages). Startup resend additionally requires `DINGTALK_AGENT_ID`.
163
151
 
164
- ```bash
165
- # 推荐:从 Git 仓库克隆
166
- git clone <repo-url> dialog-survey
167
- cd dialog-survey
152
+ ---
168
153
 
169
- # 或:直接拷贝项目目录到目标机器
170
- ```
154
+ ### Admin Authentication
171
155
 
172
- #### 2. 安装依赖
156
+ The admin UI requires authentication. Configure the following environment variables:
173
157
 
174
158
  ```bash
175
- npm install
159
+ # Admin credentials
160
+ ADMIN_USERNAME=admin
161
+ ADMIN_PASSWORD_HASH=<bcrypt-hash> # Generate with bcrypt
162
+
163
+ # Session configuration
164
+ SESSION_SECRET=<64-char-hex> # 32 random bytes — hex string of at least 32 characters
165
+ SESSION_SALT=<32-char-hex> # exactly 16 random bytes — must be 32 hex chars or startup fails
166
+ SESSION_MAX_AGE=28800 # 8 hours in seconds
176
167
  ```
177
168
 
178
- #### 3. 配置环境变量
169
+ #### Generate Password Hash
179
170
 
180
171
  ```bash
181
- cp .env.example .env
182
- # 编辑 .env,填入实际配置值(见下方环境变量说明)
172
+ node -e "const bcrypt = require('bcryptjs'); bcrypt.hash('your-password', 12).then(console.log)"
183
173
  ```
184
174
 
185
- #### 4. 初始化数据库
175
+ Copy the output hash and set it as `ADMIN_PASSWORD_HASH`.
186
176
 
187
- ```bash
188
- npx prisma generate # 生成 Prisma Client
189
- npx prisma db push # 同步 schema 到数据库
190
- ```
177
+ #### Rotate the Admin Password
191
178
 
192
- #### 5. 启动服务
179
+ Password changes are deployment-managed. There is no online password-change route. To rotate the password:
193
180
 
194
- **开发模式** (热重载):
195
- ```bash
196
- npm run dev
197
- # 默认监听 http://0.0.0.0:3001
198
- ```
181
+ 1. Generate a new bcrypt hash with the command above.
182
+ 2. Update `ADMIN_PASSWORD_HASH` in the deployment secret or configuration. Do not commit the password or hash to the repository.
183
+ 3. Restart or roll the application so it loads the updated configuration.
184
+ 4. Verify that the new password logs in at `/admin` and that the old password no longer works.
199
185
 
200
- **生产模式** (推荐用于长期运行):
186
+ The application reads its configuration at runtime and never writes `.env` files.
201
187
 
202
- **Linux / macOS** — 使用 PM2 管理进程:
203
- ```bash
204
- npm install -g pm2
205
- npm run build # 编译到 dist/
206
- pm2 start dist/src/server.ts --name dialog-survey
207
- pm2 save
208
- pm2 startup # 设置开机自启
209
- ```
188
+ #### Generate Session Secret and Salt
210
189
 
211
- **Windows** — 直接使用 Node 启动(PM2 在 Windows 上不稳定):
212
190
  ```bash
213
- npm run build # 编译到 dist/
214
- node dist/src/server.ts
215
- ```
191
+ # Generate SESSION_SECRET (32 bytes)
192
+ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
216
193
 
217
- ### 环境变量说明
218
-
219
- | 变量名 | 说明 | 示例 |
220
- |--------|------|------|
221
- | `NODE_ENV` | 运行环境 | `production` |
222
- | `PORT` | 服务端口 | `3001` |
223
- | `HOST` | 监听地址 | `0.0.0.0` |
224
- | `DATABASE_URL` | PostgreSQL 连接串 | `postgresql://user:pass@localhost:5432/dialog_survey?schema=public` |
225
- | `LLM_BASE_URL` | LLM 服务地址(OpenAI-compatible),指向本地或云服务 | `http://localhost:11434/v1` |
226
- | `LLM_API_KEY` | LLM API Key | `sk-xxx` |
227
- | `LLM_MODEL` | LLM 模型名称 | `qwen2.5` |
228
- | `DINGTALK_CLIENT_ID` | 钉钉 Client ID | 开放平台获取 |
229
- | `DINGTALK_CLIENT_SECRET` | 钉钉 Client Secret | 开放平台获取 |
230
- | `DINGTALK_AGENT_ID` | 钉钉 Agent ID | 开放平台获取 |
231
- | `DINGTALK_APP_KEY` | 钉钉 AppKey | 开放平台获取 |
232
- | `DINGTALK_APP_SECRET` | 钉钉 AppSecret | 开放平台获取 |
233
- | `PUBLIC_URL` | 公网回调地址 | `https://your-domain.com` |
234
- | `FUN_ASR_API_KEY` | 阿里云 Fun-ASR API Key | 语音识别用 |
235
- | `ENCRYPTION_KEY` | AES 加密密钥 | 32 字节 hex 字符串 |
236
- | `ADMIN_API_KEY` | 管理后台 API Key | 自定义密钥 |
237
- | `REPORTS_DIR` | 报告存储目录 | `./reports` |
238
- | `LOG_LEVEL` | 日志级别 | `info` |
239
-
240
- 安全起见,`ENCRYPTION_KEY` 可通过 Node.js 生成:
241
- ```bash
194
+ # Generate SESSION_SALT (16 bytes)
242
195
  node -e "console.log(require('crypto').randomBytes(16).toString('hex'))"
243
196
  ```
244
197
 
245
- ### 健康检查
198
+ #### Access the Admin UI
199
+
200
+ 1. Navigate to `http://localhost:3001/admin`
201
+ 2. Enter your username and password
202
+ 3. You will be redirected to the admin dashboard
203
+
204
+ #### Session Management
205
+
206
+ - Sessions expire after 8 hours of inactivity (configurable via `SESSION_MAX_AGE`)
207
+ - Session data is stored in encrypted cookies (no server-side storage)
208
+ - To log out, submit the logout form, which sends a `POST` request to `/admin/logout`; clearing the browser cookie also removes the session from that browser
209
+ - Because sessions are stateless encrypted cookies, logout removes the browser's cookie but cannot revoke a copied old cookie without a server-side session store. A copied cookie still expires after the inactivity limit
210
+
211
+ #### API Key Backward Compatibility
212
+
213
+ The `ADMIN_API_KEY` environment variable is optional. Configure it only when automation or an existing integration needs header-based admin access. API access via the `X-Admin-Key` header is supported for those scripts and integrations:
246
214
 
247
- 服务启动后可访问:
248
215
  ```bash
249
- curl http://localhost:3001/health
216
+ curl -H "X-Admin-Key: <admin-api-key>" http://localhost:3001/admin
250
217
  ```
251
218
 
252
- ### Docker 部署 (推荐)
219
+ #### Security Features
253
220
 
254
- 使用 Docker Compose 一键部署应用和 PostgreSQL 数据库。
221
+ - **CSRF Protection**: All form submissions include CSRF tokens automatically
222
+ - **Session Timeout**: Inactive sessions expire after 8 hours
223
+ - **Encrypted Cookies**: Session data is encrypted and signed
224
+ - **Password Hashing**: Passwords are hashed using bcrypt (cost factor 12)
255
225
 
256
- #### 1. 配置环境变量
226
+ ---
257
227
 
228
+ ### Production Deployment
229
+
230
+ **Linux / macOS** (PM2):
258
231
  ```bash
259
- cp .env.example .env
260
- # 编辑 .env,填入 DingTalk、LLM、ASR 等实际配置值
232
+ npm run build
233
+ pm2 start dist/src/server.js --name dialog-survey
234
+ pm2 save && pm2 startup
261
235
  ```
262
236
 
263
- #### 2. 启动服务
237
+ **Windows** (direct node):
238
+ ```bash
239
+ npm run build
240
+ node dist/src/server.js
241
+ ```
264
242
 
243
+ **Docker**:
265
244
  ```bash
266
- # 构建并启动所有服务
267
- docker-compose up -d
245
+ docker compose up -d
246
+ docker compose logs -f app
247
+ ```
268
248
 
269
- # 查看日志
270
- docker-compose logs -f app
249
+ Health check: `curl http://localhost:3001/health`
271
250
 
272
- # 查看所有服务状态
273
- docker-compose ps
274
- ```
251
+ ---
275
252
 
276
- #### 3. 验证部署
253
+ ### Development Commands
277
254
 
278
- 服务启动后,访问健康检查端点:
279
255
  ```bash
280
- curl http://localhost:3001/health
256
+ npx prisma generate # Generate Prisma client (required after checkout)
257
+ npm run dev # Hot-reload dev server on :3001
258
+ npm run type-check # TypeScript check (tsc --noEmit)
259
+ npm test # Vitest watch; npx vitest run for one-shot — no PostgreSQL needed (PGlite)
260
+ npm run lint # Biome lint
261
+ npm run build # Compile to dist/
262
+ npm run smoke # Quick sanity check (type-check + lint + key tests)
281
263
  ```
282
264
 
283
- #### 常用 Docker 命令
265
+ ---
284
266
 
285
- ```bash
286
- # 停止服务
287
- docker-compose down
267
+ ### Project Structure
268
+
269
+ ```
270
+ dialog-survey/
271
+ ├── src/
272
+ │ ├── api/ # Fastify routes
273
+ │ ├── core/ # Graph workflow engine
274
+ │ ├── services/ # Business logic (18 services)
275
+ │ ├── repositories/ # Data access (Prisma)
276
+ │ ├── integrations/ # DingTalk + LLM clients
277
+ │ ├── middleware/ # Fastify middleware
278
+ │ ├── views/ # Nunjucks admin UI (HTMX + Alpine.js)
279
+ │ ├── generated/ # Prisma client output (gitignored; npx prisma generate)
280
+ │ └── utils/ # Helpers (logger, security, PII, etc.) + Prisma facade/factory
281
+ ├── tests/ # 117 files, ~1266 tests (Vitest + PGlite, no PostgreSQL needed)
282
+ ├── scripts/ # CLI binary + deploy scripts
283
+ ├── prisma/ # Schema + migrations + seeds
284
+ └── docs/ # Architecture & design docs
285
+ ```
288
286
 
289
- # 重启服务
290
- docker-compose restart
287
+ ---
291
288
 
292
- # 查看数据库日志
293
- docker-compose logs -f postgres
289
+ ### Further Reading
294
290
 
295
- # 进入数据库 shell
296
- docker-compose exec postgres psql -U dialog_survey -d dialog_survey
291
+ - [DEPLOY.md](./DEPLOY.md) — Detailed deployment guide
292
+ - [AGENTS.md](./AGENTS.md) — Codebase map for AI agents
293
+ - [CHANGELOG.md](./CHANGELOG.md) — Full release history
294
+ - [Architecture](./architecture.yaml) — Architecture validation rules
297
295
 
298
- # 重新构建应用镜像
299
- docker-compose build --no-cache app
300
- docker-compose up -d app
301
- ```
296
+ ---
302
297
 
303
- ### 预提交检查 (开发时)
298
+ ## License
304
299
 
305
- ```bash
306
- npm run type-check && npm run lint && npm run test:coverage
307
- ```
300
+ MIT