dialog-survey 1.7.8 → 1.11.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.
- package/README.md +205 -212
- package/README.zh-CN.md +226 -0
- package/dist/src/api/admin-templates.d.ts +5 -3
- package/dist/src/api/admin-templates.d.ts.map +1 -1
- package/dist/src/api/admin-templates.js +151 -35
- package/dist/src/api/admin-templates.js.map +1 -1
- package/dist/src/api/analysis.d.ts +2 -2
- package/dist/src/api/analysis.d.ts.map +1 -1
- package/dist/src/api/analysis.js +1 -2
- package/dist/src/api/analysis.js.map +1 -1
- package/dist/src/api/health.d.ts +2 -2
- package/dist/src/api/health.d.ts.map +1 -1
- package/dist/src/api/health.js +5 -15
- package/dist/src/api/health.js.map +1 -1
- package/dist/src/api/metrics.d.ts +15 -0
- package/dist/src/api/metrics.d.ts.map +1 -0
- package/dist/src/api/metrics.js +54 -0
- package/dist/src/api/metrics.js.map +1 -0
- package/dist/src/api/plans.d.ts +4 -3
- package/dist/src/api/plans.d.ts.map +1 -1
- package/dist/src/api/plans.js +61 -89
- package/dist/src/api/plans.js.map +1 -1
- package/dist/src/api/templates.d.ts +2 -2
- package/dist/src/api/templates.d.ts.map +1 -1
- package/dist/src/api/templates.js +3 -4
- package/dist/src/api/templates.js.map +1 -1
- package/dist/src/config/constants.d.ts +2 -0
- package/dist/src/config/constants.d.ts.map +1 -0
- package/dist/src/config/constants.js +2 -0
- package/dist/src/config/constants.js.map +1 -0
- package/dist/src/core/graph.d.ts +1 -1
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +7 -1
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/core/nodes/interviewing.d.ts +1 -1
- package/dist/src/core/nodes/interviewing.d.ts.map +1 -1
- package/dist/src/core/nodes/interviewing.js +23 -12
- package/dist/src/core/nodes/interviewing.js.map +1 -1
- package/dist/src/core/nodes/planning.d.ts +1 -1
- package/dist/src/core/nodes/planning.d.ts.map +1 -1
- package/dist/src/core/nodes/planning.js +3 -2
- package/dist/src/core/nodes/planning.js.map +1 -1
- package/dist/src/core/nodes/template-utils.d.ts +1 -1
- package/dist/src/core/nodes/template-utils.d.ts.map +1 -1
- package/dist/src/core/nodes/template-utils.js.map +1 -1
- package/dist/src/core/types/index.d.ts +5 -6
- package/dist/src/core/types/index.d.ts.map +1 -1
- package/dist/src/core/types/index.js +2 -2
- package/dist/src/core/types/index.js.map +1 -1
- package/dist/src/generated/prisma/browser.d.ts +55 -0
- package/dist/src/generated/prisma/browser.d.ts.map +1 -0
- package/dist/src/generated/prisma/browser.js +18 -0
- package/dist/src/generated/prisma/browser.js.map +1 -0
- package/dist/src/generated/prisma/client.d.ts +74 -0
- package/dist/src/generated/prisma/client.d.ts.map +1 -0
- package/dist/src/generated/prisma/client.js +35 -0
- package/dist/src/generated/prisma/client.js.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts +650 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.js +11 -0
- package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/src/generated/prisma/enums.d.ts +45 -0
- package/dist/src/generated/prisma/enums.d.ts.map +1 -0
- package/dist/src/generated/prisma/enums.js +48 -0
- package/dist/src/generated/prisma/enums.js.map +1 -0
- package/dist/src/generated/prisma/internal/class.d.ts +232 -0
- package/dist/src/generated/prisma/internal/class.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/class.js +50 -0
- package/dist/src/generated/prisma/internal/class.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +1495 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js +245 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +218 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +216 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/src/generated/prisma/models/AnalysisFailure.d.ts +1097 -0
- package/dist/src/generated/prisma/models/AnalysisFailure.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/AnalysisFailure.js +2 -0
- package/dist/src/generated/prisma/models/AnalysisFailure.js.map +1 -0
- package/dist/src/generated/prisma/models/AnalysisReport.d.ts +1418 -0
- package/dist/src/generated/prisma/models/AnalysisReport.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/AnalysisReport.js +2 -0
- package/dist/src/generated/prisma/models/AnalysisReport.js.map +1 -0
- package/dist/src/generated/prisma/models/ApiKey.d.ts +1054 -0
- package/dist/src/generated/prisma/models/ApiKey.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/ApiKey.js +2 -0
- package/dist/src/generated/prisma/models/ApiKey.js.map +1 -0
- package/dist/src/generated/prisma/models/AuditLog.d.ts +1110 -0
- package/dist/src/generated/prisma/models/AuditLog.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/AuditLog.js +2 -0
- package/dist/src/generated/prisma/models/AuditLog.js.map +1 -0
- package/dist/src/generated/prisma/models/BatchAnalysisReport.d.ts +1715 -0
- package/dist/src/generated/prisma/models/BatchAnalysisReport.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/BatchAnalysisReport.js +2 -0
- package/dist/src/generated/prisma/models/BatchAnalysisReport.js.map +1 -0
- package/dist/src/generated/prisma/models/Interview.d.ts +2437 -0
- package/dist/src/generated/prisma/models/Interview.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Interview.js +2 -0
- package/dist/src/generated/prisma/models/Interview.js.map +1 -0
- package/dist/src/generated/prisma/models/InterviewPlan.d.ts +2017 -0
- package/dist/src/generated/prisma/models/InterviewPlan.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/InterviewPlan.js +2 -0
- package/dist/src/generated/prisma/models/InterviewPlan.js.map +1 -0
- package/dist/src/generated/prisma/models/Message.d.ts +1211 -0
- package/dist/src/generated/prisma/models/Message.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Message.js +2 -0
- package/dist/src/generated/prisma/models/Message.js.map +1 -0
- package/dist/src/generated/prisma/models/Response.d.ts +1287 -0
- package/dist/src/generated/prisma/models/Response.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Response.js +2 -0
- package/dist/src/generated/prisma/models/Response.js.map +1 -0
- package/dist/src/generated/prisma/models/Template.d.ts +1684 -0
- package/dist/src/generated/prisma/models/Template.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Template.js +2 -0
- package/dist/src/generated/prisma/models/Template.js.map +1 -0
- package/dist/src/generated/prisma/models.d.ts +12 -0
- package/dist/src/generated/prisma/models.d.ts.map +1 -0
- package/dist/src/generated/prisma/models.js +2 -0
- package/dist/src/generated/prisma/models.js.map +1 -0
- package/dist/src/integrations/dingtalk/client.js +2 -2
- package/dist/src/integrations/dingtalk/client.js.map +1 -1
- package/dist/src/integrations/dingtalk/stream-client.d.ts +5 -1
- package/dist/src/integrations/dingtalk/stream-client.d.ts.map +1 -1
- package/dist/src/integrations/dingtalk/stream-client.js +39 -5
- package/dist/src/integrations/dingtalk/stream-client.js.map +1 -1
- package/dist/src/integrations/llm/alibaba.d.ts +1 -1
- package/dist/src/integrations/llm/alibaba.d.ts.map +1 -1
- package/dist/src/integrations/llm/alibaba.js +3 -2
- package/dist/src/integrations/llm/alibaba.js.map +1 -1
- package/dist/src/integrations/llm/openai-compatible.d.ts +1 -1
- package/dist/src/integrations/llm/openai-compatible.d.ts.map +1 -1
- package/dist/src/integrations/llm/openai-compatible.js +50 -34
- package/dist/src/integrations/llm/openai-compatible.js.map +1 -1
- package/dist/src/middleware/admin-auth.d.ts +8 -1
- package/dist/src/middleware/admin-auth.d.ts.map +1 -1
- package/dist/src/middleware/admin-auth.js +42 -26
- package/dist/src/middleware/admin-auth.js.map +1 -1
- package/dist/src/middleware/admin-csrf.d.ts +5 -0
- package/dist/src/middleware/admin-csrf.d.ts.map +1 -0
- package/dist/src/middleware/admin-csrf.js +24 -0
- package/dist/src/middleware/admin-csrf.js.map +1 -0
- package/dist/src/middleware/session-auth.d.ts +8 -0
- package/dist/src/middleware/session-auth.d.ts.map +1 -0
- package/dist/src/middleware/session-auth.js +13 -0
- package/dist/src/middleware/session-auth.js.map +1 -0
- package/dist/src/repositories/database-health.repository.d.ts +17 -0
- package/dist/src/repositories/database-health.repository.d.ts.map +1 -0
- package/dist/src/repositories/database-health.repository.js +27 -0
- package/dist/src/repositories/database-health.repository.js.map +1 -0
- package/dist/src/repositories/interview-plan.repository.d.ts +39 -0
- package/dist/src/repositories/interview-plan.repository.d.ts.map +1 -0
- package/dist/src/repositories/interview-plan.repository.js +22 -0
- package/dist/src/repositories/interview-plan.repository.js.map +1 -0
- package/dist/src/repositories/interview-state.repository.d.ts +2 -2
- package/dist/src/repositories/interview-state.repository.d.ts.map +1 -1
- package/dist/src/repositories/interview-state.repository.js +4 -2
- package/dist/src/repositories/interview-state.repository.js.map +1 -1
- package/dist/src/repositories/interview.repository.d.ts +56 -5
- package/dist/src/repositories/interview.repository.d.ts.map +1 -1
- package/dist/src/repositories/interview.repository.js +57 -0
- package/dist/src/repositories/interview.repository.js.map +1 -1
- package/dist/src/repositories/message.repository.d.ts +1 -3
- package/dist/src/repositories/message.repository.d.ts.map +1 -1
- package/dist/src/repositories/message.repository.js +0 -2
- package/dist/src/repositories/message.repository.js.map +1 -1
- package/dist/src/repositories/template.repository.d.ts +23 -23
- package/dist/src/repositories/template.repository.d.ts.map +1 -1
- package/dist/src/repositories/template.repository.js +1 -1
- package/dist/src/repositories/template.repository.js.map +1 -1
- package/dist/src/routes/admin-auth.d.ts +9 -0
- package/dist/src/routes/admin-auth.d.ts.map +1 -0
- package/dist/src/routes/admin-auth.js +87 -0
- package/dist/src/routes/admin-auth.js.map +1 -0
- package/dist/src/server-lifecycle.d.ts +56 -0
- package/dist/src/server-lifecycle.d.ts.map +1 -0
- package/dist/src/server-lifecycle.js +112 -0
- package/dist/src/server-lifecycle.js.map +1 -0
- package/dist/src/server.d.ts +19 -7
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +322 -158
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/analysis.service.d.ts +6 -5
- package/dist/src/services/analysis.service.d.ts.map +1 -1
- package/dist/src/services/analysis.service.js +33 -3
- package/dist/src/services/analysis.service.js.map +1 -1
- package/dist/src/services/analytics.service.d.ts +1 -1
- package/dist/src/services/analytics.service.d.ts.map +1 -1
- package/dist/src/services/analytics.service.js.map +1 -1
- package/dist/src/services/audit-cleanup.service.d.ts +1 -1
- package/dist/src/services/audit-cleanup.service.d.ts.map +1 -1
- package/dist/src/services/audit-cleanup.service.js.map +1 -1
- package/dist/src/services/dead-letter.service.d.ts +1 -1
- package/dist/src/services/dead-letter.service.d.ts.map +1 -1
- package/dist/src/services/dead-letter.service.js.map +1 -1
- package/dist/src/services/export.service.d.ts +2 -1
- package/dist/src/services/export.service.d.ts.map +1 -1
- package/dist/src/services/export.service.js +73 -23
- package/dist/src/services/export.service.js.map +1 -1
- package/dist/src/services/followup.service.d.ts +5 -0
- package/dist/src/services/followup.service.d.ts.map +1 -1
- package/dist/src/services/followup.service.js +33 -8
- package/dist/src/services/followup.service.js.map +1 -1
- package/dist/src/services/interview-plan-base.service.d.ts +76 -76
- package/dist/src/services/interview-plan-base.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-base.service.js +1 -1
- package/dist/src/services/interview-plan-base.service.js.map +1 -1
- package/dist/src/services/interview-plan-members.service.d.ts +17 -2
- package/dist/src/services/interview-plan-members.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-members.service.js +81 -1
- package/dist/src/services/interview-plan-members.service.js.map +1 -1
- package/dist/src/services/interview-plan-send.service.d.ts +1 -1
- package/dist/src/services/interview-plan-send.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-send.service.js +1 -1
- package/dist/src/services/interview-plan-send.service.js.map +1 -1
- package/dist/src/services/llm-clustering.d.ts +1 -1
- package/dist/src/services/llm-clustering.d.ts.map +1 -1
- package/dist/src/services/llm-clustering.js +0 -2
- package/dist/src/services/llm-clustering.js.map +1 -1
- package/dist/src/services/prompt.service.d.ts.map +1 -1
- package/dist/src/services/prompt.service.js +70 -14
- package/dist/src/services/prompt.service.js.map +1 -1
- package/dist/src/services/report.service.d.ts +1 -0
- package/dist/src/services/report.service.d.ts.map +1 -1
- package/dist/src/services/report.service.js +44 -9
- package/dist/src/services/report.service.js.map +1 -1
- package/dist/src/services/stream-message.service.d.ts +1 -1
- package/dist/src/services/stream-message.service.d.ts.map +1 -1
- package/dist/src/services/stream-message.service.js +18 -7
- package/dist/src/services/stream-message.service.js.map +1 -1
- package/dist/src/services/template-dimension.service.d.ts +34 -7
- package/dist/src/services/template-dimension.service.d.ts.map +1 -1
- package/dist/src/services/template-dimension.service.js +13 -0
- package/dist/src/services/template-dimension.service.js.map +1 -1
- package/dist/src/utils/db.d.ts +4 -1
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js +5 -2
- package/dist/src/utils/db.js.map +1 -1
- package/dist/src/utils/markdown.d.ts.map +1 -1
- package/dist/src/utils/markdown.js +10 -6
- package/dist/src/utils/markdown.js.map +1 -1
- package/dist/src/utils/metrics.d.ts +46 -0
- package/dist/src/utils/metrics.d.ts.map +1 -0
- package/dist/src/utils/metrics.js +149 -0
- package/dist/src/utils/metrics.js.map +1 -0
- package/dist/src/utils/path-resolver.d.ts +13 -0
- package/dist/src/utils/path-resolver.d.ts.map +1 -0
- package/dist/src/utils/path-resolver.js +38 -0
- package/dist/src/utils/path-resolver.js.map +1 -0
- package/dist/src/utils/prisma-client.d.ts +14 -0
- package/dist/src/utils/prisma-client.d.ts.map +1 -0
- package/dist/src/utils/prisma-client.js +14 -0
- package/dist/src/utils/prisma-client.js.map +1 -0
- package/dist/src/utils/prisma-factory.d.ts +18 -0
- package/dist/src/utils/prisma-factory.d.ts.map +1 -0
- package/dist/src/utils/prisma-factory.js +26 -0
- package/dist/src/utils/prisma-factory.js.map +1 -0
- package/dist/src/utils/security.d.ts +17 -1
- package/dist/src/utils/security.d.ts.map +1 -1
- package/dist/src/utils/security.js +47 -2
- package/dist/src/utils/security.js.map +1 -1
- package/dist/tests/admin-auth-integration.test.d.ts +2 -0
- package/dist/tests/admin-auth-integration.test.d.ts.map +1 -0
- package/dist/tests/admin-auth-integration.test.js +91 -0
- package/dist/tests/admin-auth-integration.test.js.map +1 -0
- package/dist/tests/admin-auth-routes.test.d.ts +2 -0
- package/dist/tests/admin-auth-routes.test.d.ts.map +1 -0
- package/dist/tests/admin-auth-routes.test.js +290 -0
- package/dist/tests/admin-auth-routes.test.js.map +1 -0
- package/dist/tests/admin-auth.test.d.ts +2 -0
- package/dist/tests/admin-auth.test.d.ts.map +1 -0
- package/dist/tests/admin-auth.test.js +224 -0
- package/dist/tests/admin-auth.test.js.map +1 -0
- package/dist/tests/admin-csrf.test.d.ts +2 -0
- package/dist/tests/admin-csrf.test.d.ts.map +1 -0
- package/dist/tests/admin-csrf.test.js +117 -0
- package/dist/tests/admin-csrf.test.js.map +1 -0
- package/dist/tests/admin-delete.test.js +16 -7
- package/dist/tests/admin-delete.test.js.map +1 -1
- package/dist/tests/admin-plan-csrf.test.d.ts +2 -0
- package/dist/tests/admin-plan-csrf.test.d.ts.map +1 -0
- package/dist/tests/admin-plan-csrf.test.js +292 -0
- package/dist/tests/admin-plan-csrf.test.js.map +1 -0
- package/dist/tests/admin-plan-matcher.test.d.ts +2 -0
- package/dist/tests/admin-plan-matcher.test.d.ts.map +1 -0
- package/dist/tests/admin-plan-matcher.test.js +80 -0
- package/dist/tests/admin-plan-matcher.test.js.map +1 -0
- package/dist/tests/admin-plan-route-csrf.test.d.ts +2 -0
- package/dist/tests/admin-plan-route-csrf.test.d.ts.map +1 -0
- package/dist/tests/admin-plan-route-csrf.test.js +191 -0
- package/dist/tests/admin-plan-route-csrf.test.js.map +1 -0
- package/dist/tests/admin-shell-csrf.test.d.ts +2 -0
- package/dist/tests/admin-shell-csrf.test.d.ts.map +1 -0
- package/dist/tests/admin-shell-csrf.test.js +98 -0
- package/dist/tests/admin-shell-csrf.test.js.map +1 -0
- package/dist/tests/admin-template-csrf.test.d.ts +2 -0
- package/dist/tests/admin-template-csrf.test.d.ts.map +1 -0
- package/dist/tests/admin-template-csrf.test.js +163 -0
- package/dist/tests/admin-template-csrf.test.js.map +1 -0
- package/dist/tests/admin-templates-extra.test.js +26 -6
- package/dist/tests/admin-templates-extra.test.js.map +1 -1
- package/dist/tests/admin-templates-import.test.js +70 -59
- package/dist/tests/admin-templates-import.test.js.map +1 -1
- package/dist/tests/admin-templates-integration.test.js +73 -58
- package/dist/tests/admin-templates-integration.test.js.map +1 -1
- package/dist/tests/admin-templates.test.js +1 -174
- package/dist/tests/admin-templates.test.js.map +1 -1
- package/dist/tests/admin-tree.test.js +10 -4
- package/dist/tests/admin-tree.test.js.map +1 -1
- package/dist/tests/analysis-api.test.js +14 -10
- package/dist/tests/analysis-api.test.js.map +1 -1
- package/dist/tests/analysis.test.js +1 -0
- package/dist/tests/analysis.test.js.map +1 -1
- package/dist/tests/analytics.service.test.js.map +1 -1
- package/dist/tests/audit-cleanup.service.test.js +7 -3
- package/dist/tests/audit-cleanup.service.test.js.map +1 -1
- package/dist/tests/batch-aggregate-api.test.js +7 -3
- package/dist/tests/batch-aggregate-api.test.js.map +1 -1
- package/dist/tests/batch-import.test.js +84 -21
- package/dist/tests/batch-import.test.js.map +1 -1
- package/dist/tests/cli.test.js +142 -2
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/commitlint-ci.test.d.ts +2 -0
- package/dist/tests/commitlint-ci.test.d.ts.map +1 -0
- package/dist/tests/commitlint-ci.test.js +376 -0
- package/dist/tests/commitlint-ci.test.js.map +1 -0
- package/dist/tests/conversation-engine.integration.test.js +6 -21
- package/dist/tests/conversation-engine.integration.test.js.map +1 -1
- package/dist/tests/core-nodes-branches.test.js +12 -8
- package/dist/tests/core-nodes-branches.test.js.map +1 -1
- package/dist/tests/coverage-gate.test.d.ts +2 -0
- package/dist/tests/coverage-gate.test.d.ts.map +1 -0
- package/dist/tests/coverage-gate.test.js +32 -0
- package/dist/tests/coverage-gate.test.js.map +1 -0
- package/dist/tests/create-test-prisma.test.d.ts +2 -0
- package/dist/tests/create-test-prisma.test.d.ts.map +1 -0
- package/dist/tests/create-test-prisma.test.js +35 -0
- package/dist/tests/create-test-prisma.test.js.map +1 -0
- package/dist/tests/database-health-repository.test.d.ts +2 -0
- package/dist/tests/database-health-repository.test.d.ts.map +1 -0
- package/dist/tests/database-health-repository.test.js +37 -0
- package/dist/tests/database-health-repository.test.js.map +1 -0
- package/dist/tests/db.test.js +12 -4
- package/dist/tests/db.test.js.map +1 -1
- package/dist/tests/dead-letter.test.js +6 -3
- package/dist/tests/dead-letter.test.js.map +1 -1
- package/dist/tests/dingtalk-client-get-by-mobile.test.js.map +1 -1
- package/dist/tests/dingtalk-services.test.js +0 -33
- package/dist/tests/dingtalk-services.test.js.map +1 -1
- package/dist/tests/dingtalk-stream.test.js +84 -0
- package/dist/tests/dingtalk-stream.test.js.map +1 -1
- package/dist/tests/e2e/admin-auth.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/admin-auth.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/admin-auth.e2e.test.js +243 -0
- package/dist/tests/e2e/admin-auth.e2e.test.js.map +1 -0
- package/dist/tests/e2e/admin-core.e2e.test.js +51 -39
- package/dist/tests/e2e/admin-core.e2e.test.js.map +1 -1
- package/dist/tests/e2e/admin-template-crud.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/admin-template-crud.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/admin-template-crud.e2e.test.js +271 -0
- package/dist/tests/e2e/admin-template-crud.e2e.test.js.map +1 -0
- package/dist/tests/e2e/admin-tree-refresh.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/admin-tree-refresh.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/admin-tree-refresh.e2e.test.js +130 -0
- package/dist/tests/e2e/admin-tree-refresh.e2e.test.js.map +1 -0
- package/dist/tests/e2e/admin-ui-coverage.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/admin-ui-coverage.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/admin-ui-coverage.e2e.test.js +306 -0
- package/dist/tests/e2e/admin-ui-coverage.e2e.test.js.map +1 -0
- package/dist/tests/e2e/batch-import.e2e.test.js +15 -9
- package/dist/tests/e2e/batch-import.e2e.test.js.map +1 -1
- package/dist/tests/e2e/cli-install.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/cli-install.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/cli-install.e2e.test.js +102 -0
- package/dist/tests/e2e/cli-install.e2e.test.js.map +1 -0
- package/dist/tests/e2e/helpers/admin-login.d.ts +45 -0
- package/dist/tests/e2e/helpers/admin-login.d.ts.map +1 -0
- package/dist/tests/e2e/helpers/admin-login.js +98 -0
- package/dist/tests/e2e/helpers/admin-login.js.map +1 -0
- package/dist/tests/e2e/helpers/e2e-server.d.ts +10 -2
- package/dist/tests/e2e/helpers/e2e-server.d.ts.map +1 -1
- package/dist/tests/e2e/helpers/e2e-server.js +146 -21
- package/dist/tests/e2e/helpers/e2e-server.js.map +1 -1
- package/dist/tests/e2e/helpers/mock-dingtalk.d.ts +1 -1
- package/dist/tests/e2e/helpers/mock-dingtalk.d.ts.map +1 -1
- package/dist/tests/e2e/helpers/mock-dingtalk.js.map +1 -1
- package/dist/tests/e2e/interview-flow.e2e.test.js +17 -11
- package/dist/tests/e2e/interview-flow.e2e.test.js.map +1 -1
- package/dist/tests/e2e/member-management.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/member-management.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/member-management.e2e.test.js +393 -0
- package/dist/tests/e2e/member-management.e2e.test.js.map +1 -0
- package/dist/tests/e2e/plan-lifecycle.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/plan-lifecycle.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/plan-lifecycle.e2e.test.js +461 -0
- package/dist/tests/e2e/plan-lifecycle.e2e.test.js.map +1 -0
- package/dist/tests/e2e/report-viewing.e2e.test.d.ts +2 -0
- package/dist/tests/e2e/report-viewing.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/report-viewing.e2e.test.js +270 -0
- package/dist/tests/e2e/report-viewing.e2e.test.js.map +1 -0
- package/dist/tests/e2e/template-lifecycle.e2e.test.js +8 -4
- package/dist/tests/e2e/template-lifecycle.e2e.test.js.map +1 -1
- package/dist/tests/e2e-hermetic-llm-env.test.d.ts +2 -0
- package/dist/tests/e2e-hermetic-llm-env.test.d.ts.map +1 -0
- package/dist/tests/e2e-hermetic-llm-env.test.js +53 -0
- package/dist/tests/e2e-hermetic-llm-env.test.js.map +1 -0
- package/dist/tests/env-config.test.js +2 -6
- package/dist/tests/env-config.test.js.map +1 -1
- package/dist/tests/export.integration.test.js +2 -2
- package/dist/tests/export.integration.test.js.map +1 -1
- package/dist/tests/export.service.test.js +40 -1
- package/dist/tests/export.service.test.js.map +1 -1
- package/dist/tests/global-setup.d.ts +9 -0
- package/dist/tests/global-setup.d.ts.map +1 -0
- package/dist/tests/global-setup.js +29 -0
- package/dist/tests/global-setup.js.map +1 -0
- package/dist/tests/graph.test.js +10 -12
- package/dist/tests/graph.test.js.map +1 -1
- package/dist/tests/health-api.test.js +17 -4
- package/dist/tests/health-api.test.js.map +1 -1
- package/dist/tests/helpers/admin-auth.d.ts +3 -0
- package/dist/tests/helpers/admin-auth.d.ts.map +1 -0
- package/dist/tests/helpers/admin-auth.js +18 -0
- package/dist/tests/helpers/admin-auth.js.map +1 -0
- package/dist/tests/helpers/create-test-prisma.d.ts +18 -0
- package/dist/tests/helpers/create-test-prisma.d.ts.map +1 -0
- package/dist/tests/helpers/create-test-prisma.js +30 -0
- package/dist/tests/helpers/create-test-prisma.js.map +1 -0
- package/dist/tests/helpers/pglite-template.d.ts +31 -0
- package/dist/tests/helpers/pglite-template.d.ts.map +1 -0
- package/dist/tests/helpers/pglite-template.js +241 -0
- package/dist/tests/helpers/pglite-template.js.map +1 -0
- package/dist/tests/helpers/test-db.d.ts +19 -4
- package/dist/tests/helpers/test-db.d.ts.map +1 -1
- package/dist/tests/helpers/test-db.js +49 -41
- package/dist/tests/helpers/test-db.js.map +1 -1
- package/dist/tests/helpers/test-server.d.ts +1 -1
- package/dist/tests/helpers/test-server.d.ts.map +1 -1
- package/dist/tests/helpers/test-server.js +14 -5
- package/dist/tests/helpers/test-server.js.map +1 -1
- package/dist/tests/interview-plan-additional.test.js +1 -1
- package/dist/tests/interview-plan-additional.test.js.map +1 -1
- package/dist/tests/interview-plan-import-members.test.d.ts +2 -0
- package/dist/tests/interview-plan-import-members.test.d.ts.map +1 -0
- package/dist/tests/interview-plan-import-members.test.js +134 -0
- package/dist/tests/interview-plan-import-members.test.js.map +1 -0
- package/dist/tests/interview-plan-members-phone.test.js +18 -6
- package/dist/tests/interview-plan-members-phone.test.js.map +1 -1
- package/dist/tests/interview-plan-members.test.js.map +1 -1
- package/dist/tests/interview-plan-repository.test.d.ts +2 -0
- package/dist/tests/interview-plan-repository.test.d.ts.map +1 -0
- package/dist/tests/interview-plan-repository.test.js +61 -0
- package/dist/tests/interview-plan-repository.test.js.map +1 -0
- package/dist/tests/interview-plan.integration.test.js +8 -2
- package/dist/tests/interview-plan.integration.test.js.map +1 -1
- package/dist/tests/interview-plan.test.js +1 -1
- package/dist/tests/interview-plan.test.js.map +1 -1
- package/dist/tests/interview-repository-extensions.test.d.ts +2 -0
- package/dist/tests/interview-repository-extensions.test.d.ts.map +1 -0
- package/dist/tests/interview-repository-extensions.test.js +108 -0
- package/dist/tests/interview-repository-extensions.test.js.map +1 -0
- package/dist/tests/interview-repository.test.js +9 -5
- package/dist/tests/interview-repository.test.js.map +1 -1
- package/dist/tests/interview-state-full.test.js +10 -10
- package/dist/tests/interview-state-full.test.js.map +1 -1
- package/dist/tests/interview-state-repository.integration.test.js +4 -6
- package/dist/tests/interview-state-repository.integration.test.js.map +1 -1
- package/dist/tests/interview-state-repository.test.js +7 -9
- package/dist/tests/interview-state-repository.test.js.map +1 -1
- package/dist/tests/interviewing-node.test.js +10 -9
- package/dist/tests/interviewing-node.test.js.map +1 -1
- package/dist/tests/interviewing-smart-response.test.js +1 -1
- package/dist/tests/llm-clustering.test.js.map +1 -1
- package/dist/tests/login-csrf.test.d.ts +2 -0
- package/dist/tests/login-csrf.test.d.ts.map +1 -0
- package/dist/tests/login-csrf.test.js +24 -0
- package/dist/tests/login-csrf.test.js.map +1 -0
- package/dist/tests/login-rate-limit.test.d.ts +2 -0
- package/dist/tests/login-rate-limit.test.d.ts.map +1 -0
- package/dist/tests/login-rate-limit.test.js +69 -0
- package/dist/tests/login-rate-limit.test.js.map +1 -0
- package/dist/tests/message-repository.test.js +7 -35
- package/dist/tests/message-repository.test.js.map +1 -1
- package/dist/tests/metrics-api.test.d.ts +2 -0
- package/dist/tests/metrics-api.test.d.ts.map +1 -0
- package/dist/tests/metrics-api.test.js +74 -0
- package/dist/tests/metrics-api.test.js.map +1 -0
- package/dist/tests/metrics.test.d.ts +2 -0
- package/dist/tests/metrics.test.d.ts.map +1 -0
- package/dist/tests/metrics.test.js +79 -0
- package/dist/tests/metrics.test.js.map +1 -0
- package/dist/tests/mutation-testing.test.d.ts +2 -0
- package/dist/tests/mutation-testing.test.d.ts.map +1 -0
- package/dist/tests/mutation-testing.test.js +215 -0
- package/dist/tests/mutation-testing.test.js.map +1 -0
- package/dist/tests/optin-hooks.test.d.ts +2 -0
- package/dist/tests/optin-hooks.test.d.ts.map +1 -0
- package/dist/tests/optin-hooks.test.js +456 -0
- package/dist/tests/optin-hooks.test.js.map +1 -0
- package/dist/tests/path-resolver.test.d.ts +2 -0
- package/dist/tests/path-resolver.test.d.ts.map +1 -0
- package/dist/tests/path-resolver.test.js +72 -0
- package/dist/tests/path-resolver.test.js.map +1 -0
- package/dist/tests/pglite-template.test.d.ts +2 -0
- package/dist/tests/pglite-template.test.d.ts.map +1 -0
- package/dist/tests/pglite-template.test.js +47 -0
- package/dist/tests/pglite-template.test.js.map +1 -0
- package/dist/tests/plan-form-tree-refresh.test.d.ts +2 -0
- package/dist/tests/plan-form-tree-refresh.test.d.ts.map +1 -0
- package/dist/tests/plan-form-tree-refresh.test.js +27 -0
- package/dist/tests/plan-form-tree-refresh.test.js.map +1 -0
- package/dist/tests/plan-form-tree-target.test.d.ts +2 -0
- package/dist/tests/plan-form-tree-target.test.d.ts.map +1 -0
- package/dist/tests/plan-form-tree-target.test.js +26 -0
- package/dist/tests/plan-form-tree-target.test.js.map +1 -0
- package/dist/tests/planning-node.test.js +2 -2
- package/dist/tests/planning-node.test.js.map +1 -1
- package/dist/tests/plans-api.test.js +61 -3
- package/dist/tests/plans-api.test.js.map +1 -1
- package/dist/tests/prisma-client.test.d.ts +2 -0
- package/dist/tests/prisma-client.test.d.ts.map +1 -0
- package/dist/tests/prisma-client.test.js +96 -0
- package/dist/tests/prisma-client.test.js.map +1 -0
- package/dist/tests/prisma-factory.test.d.ts +2 -0
- package/dist/tests/prisma-factory.test.d.ts.map +1 -0
- package/dist/tests/prisma-factory.test.js +52 -0
- package/dist/tests/prisma-factory.test.js.map +1 -0
- package/dist/tests/prisma-migrate-workflow.test.d.ts +2 -0
- package/dist/tests/prisma-migrate-workflow.test.d.ts.map +1 -0
- package/dist/tests/prisma-migrate-workflow.test.js +46 -0
- package/dist/tests/prisma-migrate-workflow.test.js.map +1 -0
- package/dist/tests/prisma7-spec-invariants.test.d.ts +2 -0
- package/dist/tests/prisma7-spec-invariants.test.d.ts.map +1 -0
- package/dist/tests/prisma7-spec-invariants.test.js +354 -0
- package/dist/tests/prisma7-spec-invariants.test.js.map +1 -0
- package/dist/tests/release-bootstrap.test.d.ts +2 -0
- package/dist/tests/release-bootstrap.test.d.ts.map +1 -0
- package/dist/tests/release-bootstrap.test.js +204 -0
- package/dist/tests/release-bootstrap.test.js.map +1 -0
- package/dist/tests/release-config.test.d.ts +2 -0
- package/dist/tests/release-config.test.d.ts.map +1 -0
- package/dist/tests/release-config.test.js +698 -0
- package/dist/tests/release-config.test.js.map +1 -0
- package/dist/tests/release-hook-key.test.d.ts +2 -0
- package/dist/tests/release-hook-key.test.d.ts.map +1 -0
- package/dist/tests/release-hook-key.test.js +145 -0
- package/dist/tests/release-hook-key.test.js.map +1 -0
- package/dist/tests/release-script-behaviour.test.d.ts +2 -0
- package/dist/tests/release-script-behaviour.test.d.ts.map +1 -0
- package/dist/tests/release-script-behaviour.test.js +244 -0
- package/dist/tests/release-script-behaviour.test.js.map +1 -0
- package/dist/tests/release.integration.test.d.ts +2 -0
- package/dist/tests/release.integration.test.d.ts.map +1 -0
- package/dist/tests/release.integration.test.js +251 -0
- package/dist/tests/release.integration.test.js.map +1 -0
- package/dist/tests/report-api.test.js +7 -3
- package/dist/tests/report-api.test.js.map +1 -1
- package/dist/tests/report-dimensions.test.js.map +1 -1
- package/dist/tests/report.test.js.map +1 -1
- package/dist/tests/schema-analysis-dimensions.test.js +6 -3
- package/dist/tests/schema-analysis-dimensions.test.js.map +1 -1
- package/dist/tests/security.test.js +22 -6
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/server-api.test.js +51 -24
- package/dist/tests/server-api.test.js.map +1 -1
- package/dist/tests/server-lifecycle.test.d.ts +2 -0
- package/dist/tests/server-lifecycle.test.d.ts.map +1 -0
- package/dist/tests/server-lifecycle.test.js +571 -0
- package/dist/tests/server-lifecycle.test.js.map +1 -0
- package/dist/tests/session-auth.test.d.ts +2 -0
- package/dist/tests/session-auth.test.d.ts.map +1 -0
- package/dist/tests/session-auth.test.js +100 -0
- package/dist/tests/session-auth.test.js.map +1 -0
- package/dist/tests/smart-response.test.js +1 -1
- package/dist/tests/smart-response.test.js.map +1 -1
- package/dist/tests/state-integration.test.js +11 -13
- package/dist/tests/state-integration.test.js.map +1 -1
- package/dist/tests/state-persistence.test.js +6 -5
- package/dist/tests/state-persistence.test.js.map +1 -1
- package/dist/tests/stream-client-branches.test.js +3 -1
- package/dist/tests/stream-client-branches.test.js.map +1 -1
- package/dist/tests/stream-message-full.test.js +8 -11
- package/dist/tests/stream-message-full.test.js.map +1 -1
- package/dist/tests/stream-message-service.test.js +4 -4
- package/dist/tests/stream-message-service.test.js.map +1 -1
- package/dist/tests/stream-message.integration.test.js +4 -4
- package/dist/tests/strip-extra-questions.test.d.ts +2 -0
- package/dist/tests/strip-extra-questions.test.d.ts.map +1 -0
- package/dist/tests/strip-extra-questions.test.js +43 -0
- package/dist/tests/strip-extra-questions.test.js.map +1 -0
- package/dist/tests/sync-version-parity.test.d.ts +2 -0
- package/dist/tests/sync-version-parity.test.d.ts.map +1 -0
- package/dist/tests/sync-version-parity.test.js +334 -0
- package/dist/tests/sync-version-parity.test.js.map +1 -0
- package/dist/tests/sync-version.test.d.ts +2 -0
- package/dist/tests/sync-version.test.d.ts.map +1 -0
- package/dist/tests/sync-version.test.js +101 -0
- package/dist/tests/sync-version.test.js.map +1 -0
- package/dist/tests/template-crud.test.js +1 -1
- package/dist/tests/template-crud.test.js.map +1 -1
- package/dist/tests/template-dimensions-api.test.js +6 -3
- package/dist/tests/template-dimensions-api.test.js.map +1 -1
- package/dist/tests/template-import-export.test.js +1 -1
- package/dist/tests/template-import-export.test.js.map +1 -1
- package/dist/tests/template-repository.integration.test.js +3 -4
- package/dist/tests/template-repository.integration.test.js.map +1 -1
- package/dist/tests/template-version.test.js +1 -1
- package/dist/tests/template-version.test.js.map +1 -1
- package/dist/tests/templates-api.test.js +11 -3
- package/dist/tests/templates-api.test.js.map +1 -1
- package/dist/tests/test-database.test.d.ts +2 -0
- package/dist/tests/test-database.test.d.ts.map +1 -0
- package/dist/tests/test-database.test.js +21 -0
- package/dist/tests/test-database.test.js.map +1 -0
- package/dist/tests/token-manager.test.js +3 -1
- package/dist/tests/token-manager.test.js.map +1 -1
- package/dist/tests/workflow-interview-lifecycle.test.js +33 -11
- package/dist/tests/workflow-interview-lifecycle.test.js.map +1 -1
- package/package.json +32 -12
- package/prisma/migrations/20261004000000_init/migration.sql +242 -0
- package/prisma/migrations/migration_lock.toml +1 -0
- package/prisma/schema.prisma +4 -5
- package/prisma/seed-satisfaction-survey.ts +3 -2
- package/prisma/seed-test-interview.ts +3 -2
- package/prisma.config.ts +13 -0
- package/scripts/backup.sh +83 -0
- package/scripts/cli.mjs +173 -29
- package/scripts/deploy.sh +22 -7
- package/scripts/fix-max-followups.ts +60 -0
- package/scripts/install-git-hooks.sh +245 -0
- package/scripts/mutation-test.mjs +181 -0
- package/scripts/release-bootstrap.sh +113 -0
- package/scripts/release.sh +321 -0
- package/scripts/restore.sh +69 -0
- package/scripts/sync-version.cjs +186 -0
- package/scripts/sync-version.sh +102 -6
- package/scripts/write-version.cjs +94 -0
- package/src/views/AGENTS.md +1 -1
- package/src/views/admin/content/plan-detail.njk +19 -25
- package/src/views/admin/content/plan-form.njk +1 -0
- package/src/views/admin/content/report-detail.njk +226 -4
- package/src/views/admin/content/template-info.njk +0 -1
- package/src/views/admin/login.njk +57 -0
- package/src/views/layouts/admin-tree.njk +22 -3
- package/src/views/layouts/admin.njk +1 -1
- package/src/views/reports/detail.njk +220 -12
- package/dist/api/admin-templates.d.ts +0 -17
- package/dist/api/admin-templates.d.ts.map +0 -1
- package/dist/api/admin-templates.js +0 -718
- package/dist/api/admin-templates.js.map +0 -1
- package/dist/api/analysis.d.ts +0 -8
- package/dist/api/analysis.d.ts.map +0 -1
- package/dist/api/analysis.js +0 -106
- package/dist/api/analysis.js.map +0 -1
- package/dist/api/health.d.ts +0 -6
- package/dist/api/health.d.ts.map +0 -1
- package/dist/api/health.js +0 -116
- package/dist/api/health.js.map +0 -1
- package/dist/api/plans.d.ts +0 -8
- package/dist/api/plans.d.ts.map +0 -1
- package/dist/api/plans.js +0 -402
- package/dist/api/plans.js.map +0 -1
- package/dist/api/templates.d.ts +0 -9
- package/dist/api/templates.d.ts.map +0 -1
- package/dist/api/templates.js +0 -211
- package/dist/api/templates.js.map +0 -1
- package/dist/api/webhook.d.ts +0 -3
- package/dist/api/webhook.d.ts.map +0 -1
- package/dist/api/webhook.js +0 -98
- package/dist/api/webhook.js.map +0 -1
- package/dist/core/graph.d.ts +0 -8
- package/dist/core/graph.d.ts.map +0 -1
- package/dist/core/graph.js +0 -59
- package/dist/core/graph.js.map +0 -1
- package/dist/core/nodes/analyzing.d.ts +0 -4
- package/dist/core/nodes/analyzing.d.ts.map +0 -1
- package/dist/core/nodes/analyzing.js +0 -38
- package/dist/core/nodes/analyzing.js.map +0 -1
- package/dist/core/nodes/completed.d.ts +0 -3
- package/dist/core/nodes/completed.d.ts.map +0 -1
- package/dist/core/nodes/completed.js +0 -8
- package/dist/core/nodes/completed.js.map +0 -1
- package/dist/core/nodes/interviewing.d.ts +0 -7
- package/dist/core/nodes/interviewing.d.ts.map +0 -1
- package/dist/core/nodes/interviewing.js +0 -119
- package/dist/core/nodes/interviewing.js.map +0 -1
- package/dist/core/nodes/planning.d.ts +0 -4
- package/dist/core/nodes/planning.d.ts.map +0 -1
- package/dist/core/nodes/planning.js +0 -30
- package/dist/core/nodes/planning.js.map +0 -1
- package/dist/core/nodes/template-utils.d.ts +0 -4
- package/dist/core/nodes/template-utils.d.ts.map +0 -1
- package/dist/core/nodes/template-utils.js +0 -12
- package/dist/core/nodes/template-utils.js.map +0 -1
- package/dist/core/types/index.d.ts +0 -87
- package/dist/core/types/index.d.ts.map +0 -1
- package/dist/core/types/index.js +0 -61
- package/dist/core/types/index.js.map +0 -1
- package/dist/domains/interview/entities/interview.entity.d.ts +0 -21
- package/dist/domains/interview/entities/interview.entity.d.ts.map +0 -1
- package/dist/domains/interview/entities/interview.entity.js +0 -20
- package/dist/domains/interview/entities/interview.entity.js.map +0 -1
- package/dist/domains/interview/entities/message.entity.d.ts +0 -15
- package/dist/domains/interview/entities/message.entity.d.ts.map +0 -1
- package/dist/domains/interview/entities/message.entity.js +0 -11
- package/dist/domains/interview/entities/message.entity.js.map +0 -1
- package/dist/domains/interview/entities/response.entity.d.ts +0 -17
- package/dist/domains/interview/entities/response.entity.d.ts.map +0 -1
- package/dist/domains/interview/entities/response.entity.js +0 -12
- package/dist/domains/interview/entities/response.entity.js.map +0 -1
- package/dist/domains/interview/services/interview.domain.d.ts +0 -8
- package/dist/domains/interview/services/interview.domain.d.ts.map +0 -1
- package/dist/domains/interview/services/interview.domain.js +0 -30
- package/dist/domains/interview/services/interview.domain.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -13
- package/dist/index.js.map +0 -1
- package/dist/integrations/dingtalk/client.d.ts +0 -41
- package/dist/integrations/dingtalk/client.d.ts.map +0 -1
- package/dist/integrations/dingtalk/client.js +0 -124
- package/dist/integrations/dingtalk/client.js.map +0 -1
- package/dist/integrations/dingtalk/message-sender.d.ts +0 -24
- package/dist/integrations/dingtalk/message-sender.d.ts.map +0 -1
- package/dist/integrations/dingtalk/message-sender.js +0 -81
- package/dist/integrations/dingtalk/message-sender.js.map +0 -1
- package/dist/integrations/dingtalk/middleware.d.ts +0 -4
- package/dist/integrations/dingtalk/middleware.d.ts.map +0 -1
- package/dist/integrations/dingtalk/middleware.js +0 -31
- package/dist/integrations/dingtalk/middleware.js.map +0 -1
- package/dist/integrations/dingtalk/stream-client.d.ts +0 -131
- package/dist/integrations/dingtalk/stream-client.d.ts.map +0 -1
- package/dist/integrations/dingtalk/stream-client.js +0 -365
- package/dist/integrations/dingtalk/stream-client.js.map +0 -1
- package/dist/integrations/dingtalk/token-manager.d.ts +0 -22
- package/dist/integrations/dingtalk/token-manager.d.ts.map +0 -1
- package/dist/integrations/dingtalk/token-manager.js +0 -109
- package/dist/integrations/dingtalk/token-manager.js.map +0 -1
- package/dist/integrations/llm/alibaba.d.ts +0 -10
- package/dist/integrations/llm/alibaba.d.ts.map +0 -1
- package/dist/integrations/llm/alibaba.js +0 -60
- package/dist/integrations/llm/alibaba.js.map +0 -1
- package/dist/integrations/llm/base.d.ts +0 -28
- package/dist/integrations/llm/base.d.ts.map +0 -1
- package/dist/integrations/llm/base.js +0 -2
- package/dist/integrations/llm/base.js.map +0 -1
- package/dist/integrations/llm/openai-compatible.d.ts +0 -12
- package/dist/integrations/llm/openai-compatible.d.ts.map +0 -1
- package/dist/integrations/llm/openai-compatible.js +0 -81
- package/dist/integrations/llm/openai-compatible.js.map +0 -1
- package/dist/integrations/llm/volcengine.d.ts +0 -12
- package/dist/integrations/llm/volcengine.d.ts.map +0 -1
- package/dist/integrations/llm/volcengine.js +0 -75
- package/dist/integrations/llm/volcengine.js.map +0 -1
- package/dist/middleware/admin-auth.d.ts +0 -3
- package/dist/middleware/admin-auth.d.ts.map +0 -1
- package/dist/middleware/admin-auth.js +0 -37
- package/dist/middleware/admin-auth.js.map +0 -1
- package/dist/middleware/api-auth.d.ts +0 -10
- package/dist/middleware/api-auth.d.ts.map +0 -1
- package/dist/middleware/api-auth.js +0 -30
- package/dist/middleware/api-auth.js.map +0 -1
- package/dist/repositories/interview-state-mapper.d.ts +0 -29
- package/dist/repositories/interview-state-mapper.d.ts.map +0 -1
- package/dist/repositories/interview-state-mapper.js +0 -33
- package/dist/repositories/interview-state-mapper.js.map +0 -1
- package/dist/repositories/interview-state.repository.d.ts +0 -37
- package/dist/repositories/interview-state.repository.d.ts.map +0 -1
- package/dist/repositories/interview-state.repository.js +0 -237
- package/dist/repositories/interview-state.repository.js.map +0 -1
- package/dist/repositories/interview.repository.d.ts +0 -29
- package/dist/repositories/interview.repository.d.ts.map +0 -1
- package/dist/repositories/interview.repository.js +0 -36
- package/dist/repositories/interview.repository.js.map +0 -1
- package/dist/repositories/message.repository.d.ts +0 -17
- package/dist/repositories/message.repository.d.ts.map +0 -1
- package/dist/repositories/message.repository.js +0 -39
- package/dist/repositories/message.repository.js.map +0 -1
- package/dist/repositories/template.repository.d.ts +0 -117
- package/dist/repositories/template.repository.d.ts.map +0 -1
- package/dist/repositories/template.repository.js +0 -283
- package/dist/repositories/template.repository.js.map +0 -1
- package/dist/schemas/dimensions.d.ts +0 -61
- package/dist/schemas/dimensions.d.ts.map +0 -1
- package/dist/schemas/dimensions.js +0 -44
- package/dist/schemas/dimensions.js.map +0 -1
- package/dist/server.d.ts +0 -10
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -270
- package/dist/server.js.map +0 -1
- package/dist/services/analysis.service.d.ts +0 -81
- package/dist/services/analysis.service.d.ts.map +0 -1
- package/dist/services/analysis.service.js +0 -233
- package/dist/services/analysis.service.js.map +0 -1
- package/dist/services/analytics.service.d.ts +0 -57
- package/dist/services/analytics.service.d.ts.map +0 -1
- package/dist/services/analytics.service.js +0 -265
- package/dist/services/analytics.service.js.map +0 -1
- package/dist/services/asr.service.d.ts +0 -9
- package/dist/services/asr.service.d.ts.map +0 -1
- package/dist/services/asr.service.js +0 -41
- package/dist/services/asr.service.js.map +0 -1
- package/dist/services/audit-cleanup.service.d.ts +0 -9
- package/dist/services/audit-cleanup.service.d.ts.map +0 -1
- package/dist/services/audit-cleanup.service.js +0 -27
- package/dist/services/audit-cleanup.service.js.map +0 -1
- package/dist/services/batch-aggregation.service.d.ts +0 -34
- package/dist/services/batch-aggregation.service.d.ts.map +0 -1
- package/dist/services/batch-aggregation.service.js +0 -91
- package/dist/services/batch-aggregation.service.js.map +0 -1
- package/dist/services/conversation-engine.d.ts +0 -16
- package/dist/services/conversation-engine.d.ts.map +0 -1
- package/dist/services/conversation-engine.js +0 -49
- package/dist/services/conversation-engine.js.map +0 -1
- package/dist/services/dead-letter.service.d.ts +0 -12
- package/dist/services/dead-letter.service.d.ts.map +0 -1
- package/dist/services/dead-letter.service.js +0 -24
- package/dist/services/dead-letter.service.js.map +0 -1
- package/dist/services/dingtalk.service.d.ts +0 -13
- package/dist/services/dingtalk.service.d.ts.map +0 -1
- package/dist/services/dingtalk.service.js +0 -76
- package/dist/services/dingtalk.service.js.map +0 -1
- package/dist/services/export.service.d.ts +0 -12
- package/dist/services/export.service.d.ts.map +0 -1
- package/dist/services/export.service.js +0 -197
- package/dist/services/export.service.js.map +0 -1
- package/dist/services/followup.service.d.ts +0 -19
- package/dist/services/followup.service.d.ts.map +0 -1
- package/dist/services/followup.service.js +0 -177
- package/dist/services/followup.service.js.map +0 -1
- package/dist/services/interview-plan-base.service.d.ts +0 -204
- package/dist/services/interview-plan-base.service.d.ts.map +0 -1
- package/dist/services/interview-plan-base.service.js +0 -162
- package/dist/services/interview-plan-base.service.js.map +0 -1
- package/dist/services/interview-plan-members.service.d.ts +0 -56
- package/dist/services/interview-plan-members.service.d.ts.map +0 -1
- package/dist/services/interview-plan-members.service.js +0 -301
- package/dist/services/interview-plan-members.service.js.map +0 -1
- package/dist/services/interview-plan-send.service.d.ts +0 -18
- package/dist/services/interview-plan-send.service.d.ts.map +0 -1
- package/dist/services/interview-plan-send.service.js +0 -204
- package/dist/services/interview-plan-send.service.js.map +0 -1
- package/dist/services/interview-plan.service.d.ts +0 -7
- package/dist/services/interview-plan.service.d.ts.map +0 -1
- package/dist/services/interview-plan.service.js +0 -7
- package/dist/services/interview-plan.service.js.map +0 -1
- package/dist/services/llm-clustering.d.ts +0 -16
- package/dist/services/llm-clustering.d.ts.map +0 -1
- package/dist/services/llm-clustering.js +0 -91
- package/dist/services/llm-clustering.js.map +0 -1
- package/dist/services/member-verification.service.d.ts +0 -33
- package/dist/services/member-verification.service.d.ts.map +0 -1
- package/dist/services/member-verification.service.js +0 -78
- package/dist/services/member-verification.service.js.map +0 -1
- package/dist/services/prompt.service.d.ts +0 -13
- package/dist/services/prompt.service.d.ts.map +0 -1
- package/dist/services/prompt.service.js +0 -156
- package/dist/services/prompt.service.js.map +0 -1
- package/dist/services/report.service.d.ts +0 -28
- package/dist/services/report.service.d.ts.map +0 -1
- package/dist/services/report.service.js +0 -170
- package/dist/services/report.service.js.map +0 -1
- package/dist/services/stream-message-utils.d.ts +0 -31
- package/dist/services/stream-message-utils.d.ts.map +0 -1
- package/dist/services/stream-message-utils.js +0 -83
- package/dist/services/stream-message-utils.js.map +0 -1
- package/dist/services/stream-message.service.d.ts +0 -34
- package/dist/services/stream-message.service.d.ts.map +0 -1
- package/dist/services/stream-message.service.js +0 -319
- package/dist/services/stream-message.service.js.map +0 -1
- package/dist/services/template-dimension.service.d.ts +0 -21
- package/dist/services/template-dimension.service.d.ts.map +0 -1
- package/dist/services/template-dimension.service.js +0 -9
- package/dist/services/template-dimension.service.js.map +0 -1
- package/dist/src/services/asr.service.d.ts +0 -9
- package/dist/src/services/asr.service.d.ts.map +0 -1
- package/dist/src/services/asr.service.js +0 -41
- package/dist/src/services/asr.service.js.map +0 -1
- package/dist/tests/asr.test.d.ts +0 -2
- package/dist/tests/asr.test.d.ts.map +0 -1
- package/dist/tests/asr.test.js +0 -137
- package/dist/tests/asr.test.js.map +0 -1
- package/dist/utils/date.d.ts +0 -6
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -56
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/db.d.ts +0 -10
- package/dist/utils/db.d.ts.map +0 -1
- package/dist/utils/db.js +0 -21
- package/dist/utils/db.js.map +0 -1
- package/dist/utils/encryption.d.ts +0 -3
- package/dist/utils/encryption.d.ts.map +0 -1
- package/dist/utils/encryption.js +0 -34
- package/dist/utils/encryption.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -8
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -22
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/markdown.d.ts +0 -2
- package/dist/utils/markdown.d.ts.map +0 -1
- package/dist/utils/markdown.js +0 -42
- package/dist/utils/markdown.js.map +0 -1
- package/dist/utils/pii-anonymizer.d.ts +0 -2
- package/dist/utils/pii-anonymizer.d.ts.map +0 -1
- package/dist/utils/pii-anonymizer.js +0 -13
- package/dist/utils/pii-anonymizer.js.map +0 -1
- package/dist/utils/rate-limiter.d.ts +0 -22
- package/dist/utils/rate-limiter.d.ts.map +0 -1
- package/dist/utils/rate-limiter.js +0 -76
- package/dist/utils/rate-limiter.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -15
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -45
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/security.d.ts +0 -26
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -107
- package/dist/utils/security.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -8
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -30
- package/dist/utils/validation.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,307 +1,300 @@
|
|
|
1
1
|
# Dialog Survey
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
7
|
+
[](https://github.com/boyingliu01/dialog-survey)
|
|
8
|
+
[]()
|
|
9
|
+
[]()
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
- **多轮上下文记忆**: 支持跨多天、多条消息的对话连贯性
|
|
9
|
-
- **语音输入**: 支持语音消息回答
|
|
10
|
-
- **异步消息式访谈**: 被访谈者可以在碎片时间回答
|
|
11
|
-
- **自动生成报告**: 访谈结束后自动生成 Markdown 报告
|
|
12
|
-
- **私有部署**: 数据全留存,确保安全性
|
|
11
|
+
---
|
|
13
12
|
|
|
14
|
-
##
|
|
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
|
-
#
|
|
16
|
+
# One-line install — interactive prompts for each value
|
|
29
17
|
npx dialog-survey install
|
|
30
18
|
|
|
31
|
-
#
|
|
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
|
-
#
|
|
45
|
-
npx dialog-survey help
|
|
22
|
+
# That's it. Your dialog bot is live on DingTalk.
|
|
46
23
|
```
|
|
47
24
|
|
|
48
|
-
**Prerequisites
|
|
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
|
-
|
|
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
|
-
##
|
|
29
|
+
## Why — 为什么做这个项目?
|
|
57
30
|
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
npx dialog-survey status
|
|
37
|
+
---
|
|
69
38
|
|
|
70
|
-
|
|
71
|
-
npx dialog-survey uninstall
|
|
39
|
+
## What — 这个项目是什么?
|
|
72
40
|
|
|
73
|
-
|
|
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
|
-
|
|
43
|
+
### Key Capabilities
|
|
78
44
|
|
|
79
|
-
|
|
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
|
-
|
|
82
|
-
cd dialog-survey
|
|
83
|
-
npm install
|
|
84
|
-
```
|
|
53
|
+
### What's New (v1.10.x)
|
|
85
54
|
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
cp .env.example .env
|
|
90
|
-
# Edit .env with your configuration
|
|
91
|
-
```
|
|
61
|
+
> Full changelog in [CHANGELOG.md](./CHANGELOG.md).
|
|
92
62
|
|
|
93
|
-
|
|
63
|
+
---
|
|
94
64
|
|
|
95
|
-
|
|
96
|
-
npx prisma generate
|
|
97
|
-
npx prisma db push
|
|
98
|
-
```
|
|
65
|
+
## How — 怎么使用这个项目?
|
|
99
66
|
|
|
100
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
165
|
-
# 推荐:从 Git 仓库克隆
|
|
166
|
-
git clone <repo-url> dialog-survey
|
|
167
|
-
cd dialog-survey
|
|
152
|
+
---
|
|
168
153
|
|
|
169
|
-
|
|
170
|
-
```
|
|
154
|
+
### Admin Authentication
|
|
171
155
|
|
|
172
|
-
|
|
156
|
+
The admin UI requires authentication. Configure the following environment variables:
|
|
173
157
|
|
|
174
158
|
```bash
|
|
175
|
-
|
|
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
|
-
####
|
|
169
|
+
#### Generate Password Hash
|
|
179
170
|
|
|
180
171
|
```bash
|
|
181
|
-
|
|
182
|
-
# 编辑 .env,填入实际配置值(见下方环境变量说明)
|
|
172
|
+
node -e "const bcrypt = require('bcryptjs'); bcrypt.hash('your-password', 12).then(console.log)"
|
|
183
173
|
```
|
|
184
174
|
|
|
185
|
-
|
|
175
|
+
Copy the output hash and set it as `ADMIN_PASSWORD_HASH`.
|
|
186
176
|
|
|
187
|
-
|
|
188
|
-
npx prisma generate # 生成 Prisma Client
|
|
189
|
-
npx prisma db push # 同步 schema 到数据库
|
|
190
|
-
```
|
|
177
|
+
#### Rotate the Admin Password
|
|
191
178
|
|
|
192
|
-
|
|
179
|
+
Password changes are deployment-managed. There is no online password-change route. To rotate the password:
|
|
193
180
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
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
|
-
|
|
214
|
-
node
|
|
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/
|
|
216
|
+
curl -H "X-Admin-Key: <admin-api-key>" http://localhost:3001/admin
|
|
250
217
|
```
|
|
251
218
|
|
|
252
|
-
|
|
219
|
+
#### Security Features
|
|
253
220
|
|
|
254
|
-
|
|
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
|
-
|
|
226
|
+
---
|
|
257
227
|
|
|
228
|
+
### Production Deployment
|
|
229
|
+
|
|
230
|
+
**Linux / macOS** (PM2):
|
|
258
231
|
```bash
|
|
259
|
-
|
|
260
|
-
|
|
232
|
+
npm run build
|
|
233
|
+
pm2 start dist/src/server.js --name dialog-survey
|
|
234
|
+
pm2 save && pm2 startup
|
|
261
235
|
```
|
|
262
236
|
|
|
263
|
-
|
|
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
|
|
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
|
-
|
|
253
|
+
### Development Commands
|
|
277
254
|
|
|
278
|
-
服务启动后,访问健康检查端点:
|
|
279
255
|
```bash
|
|
280
|
-
|
|
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
|
-
|
|
265
|
+
---
|
|
284
266
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
296
|
-
|
|
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
|
-
|
|
306
|
-
npm run type-check && npm run lint && npm run test:coverage
|
|
307
|
-
```
|
|
300
|
+
MIT
|