dialog-survey 1.13.5 → 1.19.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 (195) hide show
  1. package/VERSION +1 -1
  2. package/dist/src/api/admin/plans.d.ts +0 -8
  3. package/dist/src/api/admin/plans.d.ts.map +1 -1
  4. package/dist/src/api/admin/plans.js +51 -27
  5. package/dist/src/api/admin/plans.js.map +1 -1
  6. package/dist/src/api/admin/report-view.d.ts.map +1 -1
  7. package/dist/src/api/admin/report-view.js +15 -9
  8. package/dist/src/api/admin/report-view.js.map +1 -1
  9. package/dist/src/api/admin/template-form.d.ts.map +1 -1
  10. package/dist/src/api/admin/template-form.js +122 -47
  11. package/dist/src/api/admin/template-form.js.map +1 -1
  12. package/dist/src/api/admin/templates.d.ts +0 -8
  13. package/dist/src/api/admin/templates.d.ts.map +1 -1
  14. package/dist/src/api/admin/templates.js +142 -87
  15. package/dist/src/api/admin/templates.js.map +1 -1
  16. package/dist/src/api/admin/view-models.d.ts.map +1 -1
  17. package/dist/src/api/admin/view-models.js +38 -8
  18. package/dist/src/api/admin/view-models.js.map +1 -1
  19. package/dist/src/api/analysis.d.ts.map +1 -1
  20. package/dist/src/api/analysis.js +35 -23
  21. package/dist/src/api/analysis.js.map +1 -1
  22. package/dist/src/api/health.d.ts +1 -1
  23. package/dist/src/api/health.d.ts.map +1 -1
  24. package/dist/src/api/health.js +181 -46
  25. package/dist/src/api/health.js.map +1 -1
  26. package/dist/src/api/plans.d.ts.map +1 -1
  27. package/dist/src/api/plans.js +257 -137
  28. package/dist/src/api/plans.js.map +1 -1
  29. package/dist/src/api/templates.d.ts.map +1 -1
  30. package/dist/src/api/templates.js +16 -6
  31. package/dist/src/api/templates.js.map +1 -1
  32. package/dist/src/core/graph.d.ts.map +1 -1
  33. package/dist/src/core/graph.js +39 -23
  34. package/dist/src/core/graph.js.map +1 -1
  35. package/dist/src/core/nodes/interviewing.d.ts.map +1 -1
  36. package/dist/src/core/nodes/interviewing.js +123 -75
  37. package/dist/src/core/nodes/interviewing.js.map +1 -1
  38. package/dist/src/core/nodes/planning.d.ts.map +1 -1
  39. package/dist/src/core/nodes/planning.js +34 -12
  40. package/dist/src/core/nodes/planning.js.map +1 -1
  41. package/dist/src/core/nodes/progress.d.ts +37 -0
  42. package/dist/src/core/nodes/progress.d.ts.map +1 -0
  43. package/dist/src/core/nodes/progress.js +58 -0
  44. package/dist/src/core/nodes/progress.js.map +1 -0
  45. package/dist/src/core/types/index.d.ts +1 -0
  46. package/dist/src/core/types/index.d.ts.map +1 -1
  47. package/dist/src/core/types/index.js +1 -1
  48. package/dist/src/core/types/index.js.map +1 -1
  49. package/dist/src/generated/prisma/enums.d.ts +1 -0
  50. package/dist/src/generated/prisma/enums.d.ts.map +1 -1
  51. package/dist/src/generated/prisma/enums.js +2 -1
  52. package/dist/src/generated/prisma/enums.js.map +1 -1
  53. package/dist/src/generated/prisma/internal/class.js +1 -1
  54. package/dist/src/generated/prisma/internal/class.js.map +1 -1
  55. package/dist/src/integrations/dingtalk/client.d.ts +0 -1
  56. package/dist/src/integrations/dingtalk/client.d.ts.map +1 -1
  57. package/dist/src/integrations/dingtalk/client.js +0 -5
  58. package/dist/src/integrations/dingtalk/client.js.map +1 -1
  59. package/dist/src/integrations/dingtalk/message-sender.d.ts.map +1 -1
  60. package/dist/src/integrations/dingtalk/message-sender.js +91 -54
  61. package/dist/src/integrations/dingtalk/message-sender.js.map +1 -1
  62. package/dist/src/integrations/dingtalk/middleware.d.ts.map +1 -1
  63. package/dist/src/integrations/dingtalk/middleware.js +20 -11
  64. package/dist/src/integrations/dingtalk/middleware.js.map +1 -1
  65. package/dist/src/integrations/dingtalk/stream-client.d.ts +37 -0
  66. package/dist/src/integrations/dingtalk/stream-client.d.ts.map +1 -1
  67. package/dist/src/integrations/dingtalk/stream-client.js +190 -107
  68. package/dist/src/integrations/dingtalk/stream-client.js.map +1 -1
  69. package/dist/src/integrations/llm/alibaba.d.ts.map +1 -1
  70. package/dist/src/integrations/llm/alibaba.js +32 -19
  71. package/dist/src/integrations/llm/alibaba.js.map +1 -1
  72. package/dist/src/integrations/llm/openai-compatible.d.ts.map +1 -1
  73. package/dist/src/integrations/llm/openai-compatible.js +70 -26
  74. package/dist/src/integrations/llm/openai-compatible.js.map +1 -1
  75. package/dist/src/middleware/admin-auth.d.ts.map +1 -1
  76. package/dist/src/middleware/admin-auth.js +70 -35
  77. package/dist/src/middleware/admin-auth.js.map +1 -1
  78. package/dist/src/repositories/interview-plan.repository.d.ts +1 -1
  79. package/dist/src/repositories/interview-state.repository.d.ts +64 -0
  80. package/dist/src/repositories/interview-state.repository.d.ts.map +1 -1
  81. package/dist/src/repositories/interview-state.repository.js +198 -36
  82. package/dist/src/repositories/interview-state.repository.js.map +1 -1
  83. package/dist/src/repositories/interview.repository.d.ts +6 -6
  84. package/dist/src/repositories/template.repository.d.ts +4 -4
  85. package/dist/src/repositories/template.repository.d.ts.map +1 -1
  86. package/dist/src/repositories/template.repository.js +28 -10
  87. package/dist/src/repositories/template.repository.js.map +1 -1
  88. package/dist/src/routes/admin-auth.d.ts.map +1 -1
  89. package/dist/src/routes/admin-auth.js +101 -71
  90. package/dist/src/routes/admin-auth.js.map +1 -1
  91. package/dist/src/server-lifecycle.d.ts +1 -1
  92. package/dist/src/server-lifecycle.d.ts.map +1 -1
  93. package/dist/src/server-lifecycle.js +2 -2
  94. package/dist/src/server-lifecycle.js.map +1 -1
  95. package/dist/src/server.d.ts.map +1 -1
  96. package/dist/src/server.js +215 -85
  97. package/dist/src/server.js.map +1 -1
  98. package/dist/src/services/analysis.service.d.ts +7 -7
  99. package/dist/src/services/analysis.service.d.ts.map +1 -1
  100. package/dist/src/services/analysis.service.js +64 -42
  101. package/dist/src/services/analysis.service.js.map +1 -1
  102. package/dist/src/services/analytics.service.d.ts +0 -1
  103. package/dist/src/services/analytics.service.d.ts.map +1 -1
  104. package/dist/src/services/analytics.service.js +105 -70
  105. package/dist/src/services/analytics.service.js.map +1 -1
  106. package/dist/src/services/batch-aggregation.service.d.ts.map +1 -1
  107. package/dist/src/services/batch-aggregation.service.js +23 -15
  108. package/dist/src/services/batch-aggregation.service.js.map +1 -1
  109. package/dist/src/services/export.service.d.ts.map +1 -1
  110. package/dist/src/services/export.service.js +41 -23
  111. package/dist/src/services/export.service.js.map +1 -1
  112. package/dist/src/services/followup.service.d.ts.map +1 -1
  113. package/dist/src/services/followup.service.js +149 -58
  114. package/dist/src/services/followup.service.js.map +1 -1
  115. package/dist/src/services/interview-plan-base.service.d.ts +17 -14
  116. package/dist/src/services/interview-plan-base.service.d.ts.map +1 -1
  117. package/dist/src/services/interview-plan-base.service.js +42 -9
  118. package/dist/src/services/interview-plan-base.service.js.map +1 -1
  119. package/dist/src/services/interview-plan-members.service.d.ts +35 -0
  120. package/dist/src/services/interview-plan-members.service.d.ts.map +1 -1
  121. package/dist/src/services/interview-plan-members.service.js +257 -150
  122. package/dist/src/services/interview-plan-members.service.js.map +1 -1
  123. package/dist/src/services/interview-plan-send.service.d.ts +18 -0
  124. package/dist/src/services/interview-plan-send.service.d.ts.map +1 -1
  125. package/dist/src/services/interview-plan-send.service.js +116 -68
  126. package/dist/src/services/interview-plan-send.service.js.map +1 -1
  127. package/dist/src/services/interview-timeout.service.d.ts +87 -0
  128. package/dist/src/services/interview-timeout.service.d.ts.map +1 -0
  129. package/dist/src/services/interview-timeout.service.js +174 -0
  130. package/dist/src/services/interview-timeout.service.js.map +1 -0
  131. package/dist/src/services/member-verification.service.d.ts.map +1 -1
  132. package/dist/src/services/member-verification.service.js +45 -38
  133. package/dist/src/services/member-verification.service.js.map +1 -1
  134. package/dist/src/services/plan-completion.service.d.ts +15 -11
  135. package/dist/src/services/plan-completion.service.d.ts.map +1 -1
  136. package/dist/src/services/plan-completion.service.js +42 -32
  137. package/dist/src/services/plan-completion.service.js.map +1 -1
  138. package/dist/src/services/prompt.service.d.ts.map +1 -1
  139. package/dist/src/services/prompt.service.js +17 -5
  140. package/dist/src/services/prompt.service.js.map +1 -1
  141. package/dist/src/services/report.service.d.ts.map +1 -1
  142. package/dist/src/services/report.service.js +88 -34
  143. package/dist/src/services/report.service.js.map +1 -1
  144. package/dist/src/services/start-signal.d.ts +28 -0
  145. package/dist/src/services/start-signal.d.ts.map +1 -0
  146. package/dist/src/services/start-signal.js +75 -0
  147. package/dist/src/services/start-signal.js.map +1 -0
  148. package/dist/src/services/stream-message-utils.d.ts.map +1 -1
  149. package/dist/src/services/stream-message-utils.js +71 -31
  150. package/dist/src/services/stream-message-utils.js.map +1 -1
  151. package/dist/src/services/stream-message.service.d.ts +94 -0
  152. package/dist/src/services/stream-message.service.d.ts.map +1 -1
  153. package/dist/src/services/stream-message.service.js +306 -138
  154. package/dist/src/services/stream-message.service.js.map +1 -1
  155. package/dist/src/services/template-dimension.service.d.ts +2 -2
  156. package/dist/src/utils/markdown.d.ts.map +1 -1
  157. package/dist/src/utils/markdown.js +29 -6
  158. package/dist/src/utils/markdown.js.map +1 -1
  159. package/dist/src/utils/retry.d.ts.map +1 -1
  160. package/dist/src/utils/retry.js +62 -14
  161. package/dist/src/utils/retry.js.map +1 -1
  162. package/dist/src/utils/security.d.ts.map +1 -1
  163. package/dist/src/utils/security.js +87 -40
  164. package/dist/src/utils/security.js.map +1 -1
  165. package/package.json +3 -2
  166. package/prisma/migrations/20261107000000_add_interrupted_status/migration.sql +7 -0
  167. package/prisma/schema.prisma +1 -0
  168. package/prisma/seed-test-interview.ts +31 -29
  169. package/scripts/ccn-report.cjs +471 -167
  170. package/scripts/cli.mjs +877 -484
  171. package/scripts/migrate-deploy.mjs +66 -42
  172. package/scripts/mutation-test.mjs +189 -92
  173. package/scripts/ops/README.md +23 -0
  174. package/scripts/ops/ds-alert-send.mjs +47 -0
  175. package/scripts/ops/ds-alert.sh +81 -0
  176. package/scripts/ops/ds-daily-report.sh +62 -0
  177. package/scripts/ops/ds-db-backup.sh +47 -0
  178. package/scripts/ops/ds-health-watch.sh +99 -0
  179. package/scripts/ops/ds-net-repair.service +10 -0
  180. package/scripts/ops/ds-net-repair.sh +81 -0
  181. package/scripts/ops/ds-net-repair.timer +11 -0
  182. package/scripts/ops/ds-ops-env.sh +26 -0
  183. package/scripts/ops/ds-restore-drill.sh +107 -0
  184. package/scripts/ops/ds-smoke.sh +107 -0
  185. package/scripts/ops/ds-win-watch.ps1 +154 -0
  186. package/scripts/ops/install.sh +78 -0
  187. package/scripts/ops/ops.env.example +48 -0
  188. package/scripts/prune-runtime-deps.mjs +211 -108
  189. package/scripts/scan-git-history-secrets.mjs +181 -75
  190. package/scripts/verify-gate-tools.cjs +191 -0
  191. package/scripts/verify-xp-gate-patches.cjs +46 -24
  192. package/scripts/write-version.cjs +31 -17
  193. package/src/views/admin/content/plan-detail.njk +4 -0
  194. package/src/views/analytics/index.njk +3 -3
  195. package/src/views/layouts/admin-tree.njk +1 -0
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.13.5
1
+ 1.19.0
@@ -1,12 +1,4 @@
1
1
  import type { FastifyInstance } from 'fastify';
2
2
  import { type AdminRoutesDeps } from './shared.js';
3
- /**
4
- * Plan management pages under `/admin/content/plans*`.
5
- *
6
- * These render the plan form and the two plan-detail variants (with and without
7
- * the analytics summary), plus the delete endpoint the tree view calls. The
8
- * template select is loaded here too because a plan form cannot render without
9
- * one — that dependency is what ties these routes together.
10
- */
11
3
  export declare function registerPlanPageRoutes(fastify: FastifyInstance, opts: AdminRoutesDeps): Promise<void>;
12
4
  //# sourceMappingURL=plans.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/plans.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAI7E,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAKrE;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Jf"}
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/plans.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAI7E,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAgGrE,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAqIf"}
@@ -5,13 +5,54 @@ import { createAdminGuard } from './shared.js';
5
5
  import { buildInviteeNameMap, parseTemplateContent } from './view-models.js';
6
6
  const API_PATH = '/admin/api';
7
7
  /**
8
- * Plan management pages under `/admin/content/plans*`.
8
+ * What deleting a plan from the admin UI should answer.
9
9
  *
10
- * These render the plan form and the two plan-detail variants (with and without
11
- * the analytics summary), plus the delete endpoint the tree view calls. The
12
- * template select is loaded here too because a plan form cannot render without
13
- * one — that dependency is what ties these routes together.
10
+ * Returns the reply rather than sending it, so the handler keeps one call to
11
+ * `reply.status(...).send(...)` and the four outcomes (missing, forced, blocked,
12
+ * plain) stay readable as a list. `force` is checked BEFORE the blocker on purpose:
13
+ * `?force=true` is the operator having already accepted the cascade in the dialog.
14
14
  */
15
+ async function deletePlanOutcome(service, id, force) {
16
+ const plan = await service.findByIdWithDeleteChecks(id);
17
+ if (!plan)
18
+ return { status: 404, body: '计划不存在' };
19
+ if (force)
20
+ return { status: 200, body: await forceDeleteMessage(service, id) };
21
+ const blocker = deleteBlocker(plan._count);
22
+ if (blocker)
23
+ return { status: 409, body: blocker };
24
+ await service.deletePlan(id);
25
+ info('Admin plan deleted', { planId: id });
26
+ return { status: 200, body: '<div class="text-green-600">计划已删除</div>' };
27
+ }
28
+ /**
29
+ * Delete the plan together with everything hanging off it, and say what went.
30
+ *
31
+ * The counts come from the delete call's own result rather than a preceding read:
32
+ * reporting "3 interviews deleted" from a read that raced another turn could
33
+ * describe more than was actually removed.
34
+ */
35
+ async function forceDeleteMessage(service, id) {
36
+ const result = await service.deletePlanWithInterviews(id);
37
+ return `<div class="text-green-600">计划「${result.planName}」已删除,同时删除 ${result.interviewCount} 条访谈记录和 ${result.batchReportCount} 个批量报告</div>`;
38
+ }
39
+ /**
40
+ * The 409 warning page for a plan that still has data attached, or null.
41
+ *
42
+ * The counts are exposed as data attributes so the confirm dialog can quote them
43
+ * without a second request. Reporting them as a plain sentence would leave the
44
+ * front end parsing prose to build its message.
45
+ */
46
+ function deleteBlocker(counts) {
47
+ const parts = [];
48
+ if (counts.interviews > 0)
49
+ parts.push(`${counts.interviews} 个访谈记录`);
50
+ if (counts.batchReports > 0)
51
+ parts.push(`${counts.batchReports} 个批量报告`);
52
+ if (parts.length === 0)
53
+ return null;
54
+ return `<div class="text-red-600" data-delete-warning="true" data-count-interviews="${counts.interviews}" data-count-reports="${counts.batchReports}">该计划关联了 ${parts.join('、')},删除将一并删除这些数据</div>`;
55
+ }
15
56
  export async function registerPlanPageRoutes(fastify, opts) {
16
57
  const { templateRepo, interviewPlanService, interviewRepo, analyticsService } = opts;
17
58
  const adminMutationGuard = createAdminGuard(fastify);
@@ -108,28 +149,11 @@ export async function registerPlanPageRoutes(fastify, opts) {
108
149
  const { id } = request.params;
109
150
  const query = request.query;
110
151
  try {
111
- const plan = await interviewPlanService.findByIdWithDeleteChecks(id);
112
- if (!plan)
113
- return reply.status(404).type('text/html').send('计划不存在');
114
- const hasInterviews = plan._count.interviews > 0;
115
- const hasBatchReports = plan._count.batchReports > 0;
116
- if (query.force === 'true') {
117
- const result = await interviewPlanService.deletePlanWithInterviews(id);
118
- return reply.send(`<div class="text-green-600">计划「${result.planName}」已删除,同时删除 ${result.interviewCount} 条访谈记录和 ${result.batchReportCount} 个批量报告</div>`);
119
- }
120
- if (hasInterviews || hasBatchReports) {
121
- const parts = [];
122
- if (hasInterviews)
123
- parts.push(`${plan._count.interviews} 个访谈记录`);
124
- if (hasBatchReports)
125
- parts.push(`${plan._count.batchReports} 个批量报告`);
126
- return reply
127
- .status(409)
128
- .send(`<div class="text-red-600" data-delete-warning="true" data-count-interviews="${plan._count.interviews}" data-count-reports="${plan._count.batchReports}">该计划关联了 ${parts.join('、')},删除将一并删除这些数据</div>`);
129
- }
130
- await interviewPlanService.deletePlan(id);
131
- info('Admin plan deleted', { planId: id });
132
- return reply.send('<div class="text-green-600">计划已删除</div>');
152
+ const outcome = await deletePlanOutcome(interviewPlanService, id, query.force === 'true');
153
+ return reply
154
+ .status(outcome.status)
155
+ .type(outcome.status === 404 ? 'text/html' : 'text/html; charset=utf-8')
156
+ .send(outcome.body);
133
157
  }
134
158
  catch (e) {
135
159
  const errMsg = e instanceof Error ? e.message : 'Failed to delete plan';
@@ -1 +1 @@
1
- {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../../../src/api/admin/plans.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../../../src/api/admin/plans.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"report-view.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/report-view.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAQH,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7C,WAAW,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,MAAM,EAAE,CAMV;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAO5F;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACnC,GAAG,MAAM,EAAE,CAgBX"}
1
+ {"version":3,"file":"report-view.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/report-view.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAQH,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7C,WAAW,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,MAAM,EAAE,CAMV;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAO5F;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACnC,GAAG,MAAM,EAAE,CAcX"}
@@ -35,20 +35,26 @@ export function transcriptLines(messages) {
35
35
  export function analysisSectionLines(report) {
36
36
  const lines = ['---', '', '## 访谈分析总结', '', report.content ?? '', ''];
37
37
  if (report.sentiment) {
38
- lines.push(`**情感分析**: ${SENTIMENT_LABELS[report.sentiment] ?? report.sentiment}`, '');
38
+ lines.push(`**情感分析**: ${labelSentiment(report.sentiment)}`, '');
39
39
  }
40
+ // Each block is "heading, blank line, bullets, blank line" -- trailing blank
41
+ // separators throughout, so the sections stay visually distinct in Markdown.
40
42
  if (report.keyFindings?.length) {
41
- lines.push('**关键发现**:', '');
42
- for (const f of report.keyFindings)
43
- lines.push(`- ${f}`);
44
- lines.push('');
43
+ lines.push('**关键发现**:', '', ...report.keyFindings.map((f) => `- ${f}`), '');
45
44
  }
46
45
  if (report.recommendations?.length) {
47
- lines.push('**建议**:', '');
48
- for (const r of report.recommendations)
49
- lines.push(`- ${r}`);
50
- lines.push('');
46
+ lines.push('**建议**:', '', ...report.recommendations.map((r) => `- ${r}`), '');
51
47
  }
52
48
  return lines;
53
49
  }
50
+ /**
51
+ * The localised sentiment label, falling back to the raw value.
52
+ *
53
+ * Falls back rather than dropping the line: an unrecognised sentiment is still
54
+ * information the analyst supplied, and hiding it would make the section look
55
+ * like a report that simply had no sentiment.
56
+ */
57
+ function labelSentiment(sentiment) {
58
+ return SENTIMENT_LABELS[sentiment] ?? sentiment;
59
+ }
54
60
  //# sourceMappingURL=report-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-view.js","sourceRoot":"","sources":["../../../../src/api/admin/report-view.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G;;;;;;;GAOG;AAEH,MAAM,gBAAgB,GAA2B;IAC/C,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAC/B,SAA6C,EAC7C,WAA8C;IAE9C,MAAM,KAAK,GAAG,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,IAAI,WAAW,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,WAAW,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,eAAe,CAAC,QAAkD;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,MAKpC;IACC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,aAAa,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,eAAe;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"report-view.js","sourceRoot":"","sources":["../../../../src/api/admin/report-view.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G;;;;;;;GAOG;AAEH,MAAM,gBAAgB,GAA2B;IAC/C,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAC/B,SAA6C,EAC7C,WAA8C;IAE9C,MAAM,KAAK,GAAG,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,IAAI,WAAW,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,WAAW,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,eAAe,CAAC,QAAkD;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,MAKpC;IACC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,SAAiB;IACvC,OAAO,gBAAgB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;AAClD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-form.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/template-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;GAMG;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,aAAa;;iBAA4D,CAAC;AAkDvF,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK3F;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAUvF;AAED,4DAA4D;AAC5D,MAAM,MAAM,oBAAoB,GAC5B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IACE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACxE,CAAC;AAwCN;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAWnF;AASD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAY3E"}
1
+ {"version":3,"file":"template-form.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/template-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;GAMG;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,aAAa;;iBAA4D,CAAC;AAsFvF,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK3F;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAUvF;AAED,4DAA4D;AAC5D,MAAM,MAAM,oBAAoB,GAC5B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IACE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACxE,CAAC;AA2EN;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAWnF;AASD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAK3E"}
@@ -19,50 +19,85 @@ export const updateTemplateSchema = z.object({
19
19
  content: z.object({}).passthrough(),
20
20
  });
21
21
  export const versionSchema = z.object({ version: z.coerce.number().int().positive() });
22
+ /** Content fields copied through only when the form supplied them. */
23
+ const OPTIONAL_CONTENT_FIELDS = ['closingMessage', 'llmPromptTemplate'];
24
+ /**
25
+ * The questions from whichever shape the body uses.
26
+ *
27
+ * The rendered form sends flat `questions[0][text]` fields; the JSON API sends a
28
+ * keyed object. Both collapse to the same array, and the object shape wins when
29
+ * present because that is the one the API documents.
30
+ */
31
+ function questionsFromBody(body) {
32
+ const questionsObj = body['questions'];
33
+ if (questionsObj && typeof questionsObj === 'object') {
34
+ return extractStructuredQuestions(questionsObj);
35
+ }
36
+ return extractFlatFormQuestions(body);
37
+ }
22
38
  /** Questions submitted as a keyed object (`questions: { 0: { text } }`). */
23
39
  function extractStructuredQuestions(questionsObj) {
24
40
  const questions = [];
41
+ // Sorted by KEY, not by the numeric value: the keys are stringified indices and
42
+ // a plain Object.keys order would put "10" before "2".
25
43
  for (const key of Object.keys(questionsObj).sort()) {
26
- const q = questionsObj[key];
27
- if (q && typeof q === 'object' && typeof q.text === 'string') {
28
- const trimmed = q.text.trim();
29
- if (trimmed)
30
- questions.push(trimmed);
31
- }
44
+ const text = questionTextOf(questionsObj[key]);
45
+ if (text)
46
+ questions.push(text);
32
47
  }
33
48
  return questions;
34
49
  }
50
+ /**
51
+ * The question text carried by one submitted entry, trimmed, or ''.
52
+ *
53
+ * Accepts anything object-like because the body is user-controlled: the rendered
54
+ * form sends `{ text }`, but an empty slot arrives as `{}` and must simply be
55
+ * skipped rather than crash the import.
56
+ */
57
+ function questionTextOf(entry) {
58
+ const obj = asRecord(entry);
59
+ if (!obj)
60
+ return '';
61
+ const text = obj['text'];
62
+ return typeof text === 'string' ? text.trim() : '';
63
+ }
64
+ /** The value as an object, or null when it is not object-like. */
65
+ function asRecord(value) {
66
+ if (!value || typeof value !== 'object')
67
+ return null;
68
+ return value;
69
+ }
35
70
  /** Questions submitted as flat `questions[i][text]` form fields. */
36
71
  function extractFlatFormQuestions(body) {
37
72
  const questions = [];
38
73
  for (const [key, value] of Object.entries(body)) {
39
- const match = key.match(/^questions\[(\d+)\]\[text\]$/);
40
- if (match && typeof value === 'string') {
41
- const index = Number.parseInt(match[1], 10);
42
- const trimmed = value.trim();
43
- if (trimmed) {
44
- questions[index] = trimmed;
45
- }
46
- }
74
+ const index = flatQuestionIndex(key);
75
+ if (index === null || typeof value !== 'string')
76
+ continue;
77
+ const trimmed = value.trim();
78
+ if (trimmed)
79
+ questions[index] = trimmed;
47
80
  }
81
+ // Sparse: a blank slot leaves a hole, and a hole must not become a question.
48
82
  return questions.filter((q) => q !== undefined);
49
83
  }
84
+ /** The array index encoded in a `questions[i][text]` field name, or null. */
85
+ function flatQuestionIndex(key) {
86
+ const match = key.match(/^questions\[(\d+)\]\[text\]$/);
87
+ if (!match)
88
+ return null;
89
+ return Number.parseInt(match[1], 10);
90
+ }
50
91
  function buildDefaultContent(body) {
51
92
  const content = {
52
93
  invitationPrompt: String(body['invitationPrompt'] || ''),
53
94
  questions: [],
54
95
  };
55
- if (body['closingMessage'])
56
- content['closingMessage'] = body['closingMessage'];
57
- if (body['llmPromptTemplate'])
58
- content['llmPromptTemplate'] = body['llmPromptTemplate'];
59
- const questionsObj = body['questions'];
60
- if (questionsObj && typeof questionsObj === 'object') {
61
- content['questions'] = extractStructuredQuestions(questionsObj);
62
- }
63
- else {
64
- content['questions'] = extractFlatFormQuestions(body);
96
+ for (const key of OPTIONAL_CONTENT_FIELDS) {
97
+ if (body[key])
98
+ content[key] = body[key];
65
99
  }
100
+ content['questions'] = questionsFromBody(body);
66
101
  return content;
67
102
  }
68
103
  /** Take the template content from the submitted body, whichever shape it has. */
@@ -98,26 +133,49 @@ function optionalTrimmed(value) {
98
133
  }
99
134
  /** Validate an already-parsed import document. */
100
135
  function validateImportedTemplate(parsed) {
136
+ const shape = importShapeProblem(parsed);
137
+ if (typeof shape === 'string')
138
+ return { error: shape };
139
+ const input = importInputOf(parsed, shape);
140
+ const dimensions = usableDimensions(parsed['dimensions']);
141
+ return dimensions ? { input, dimensions } : { input };
142
+ }
143
+ /**
144
+ * The first reason the pasted document is not a template, or the pieces needed
145
+ * to build one.
146
+ *
147
+ * Ordered so the user gets the most actionable message first: a wrong NAME field
148
+ * is a typo they can see, while a bad content body needs the content rules run.
149
+ */
150
+ function importShapeProblem(parsed) {
101
151
  const name = optionalTrimmed(parsed['name']);
102
152
  if (!name)
103
- return { error: 'JSON 缺少 name 字段' };
153
+ return 'JSON 缺少 name 字段';
104
154
  const content = parsed['content'];
105
155
  if (!content || typeof content !== 'object')
106
- return { error: 'JSON 缺少 content 字段' };
107
- const validationError = validateTemplateContent(content);
108
- if (validationError)
109
- return { error: validationError };
156
+ return 'JSON 缺少 content 字段';
157
+ const contentError = validateTemplateContent(content);
158
+ if (contentError)
159
+ return contentError;
160
+ return { name, content: content };
161
+ }
162
+ /** The create input for a validated document, with description when supplied. */
163
+ function importInputOf(parsed, shape) {
110
164
  const description = optionalTrimmed(parsed['description']);
111
- const input = {
112
- name,
113
- content,
114
- };
115
- if (description)
116
- input.description = description;
117
- const dimensions = parsed['dimensions'];
118
- if (!Array.isArray(dimensions) || dimensions.length === 0)
119
- return { input };
120
- return { input, dimensions };
165
+ if (!description)
166
+ return shape;
167
+ return { ...shape, description };
168
+ }
169
+ /**
170
+ * The dimensions carried by the document, or undefined.
171
+ *
172
+ * An absent or empty list is not an error -- a template with no dimensions is
173
+ * legitimate -- but a non-empty one is passed through for the caller to persist.
174
+ */
175
+ function usableDimensions(value) {
176
+ if (!Array.isArray(value) || value.length === 0)
177
+ return undefined;
178
+ return value;
121
179
  }
122
180
  /**
123
181
  * Validate the JSON a user pasted into the template-import form.
@@ -154,15 +212,32 @@ function isStaleRecordError(e) {
154
212
  * else is a 500 with the original message surfaced for debugging.
155
213
  */
156
214
  export function mapUpdateError(e) {
157
- if (e instanceof z.ZodError) {
158
- return { status: 422, body: htmlError(e.issues[0]?.message ?? 'Validation failed') };
159
- }
160
- if (isStaleRecordError(e)) {
161
- return { status: 409, body: '<div class="text-red-600">模板已被他人修改,请刷新后重试</div>' };
162
- }
163
- if (e instanceof Error && e.message.includes('find')) {
215
+ if (e instanceof z.ZodError)
216
+ return validationFailure(e);
217
+ if (isStaleRecordError(e))
218
+ return staleFailure();
219
+ if (isLookupFailure(e))
164
220
  return { status: 404, body: htmlError('Template not found') };
165
- }
221
+ return serverFailure(e);
222
+ }
223
+ /** 422 with the first Zod issue, which is the one the form highlights. */
224
+ function validationFailure(e) {
225
+ return { status: 422, body: htmlError(e.issues[0]?.message ?? 'Validation failed') };
226
+ }
227
+ /** 409: another admin committed first, so the form is holding a stale version. */
228
+ function staleFailure() {
229
+ return { status: 409, body: '<div class="text-red-600">模板已被他人修改,请刷新后重试</div>' };
230
+ }
231
+ /**
232
+ * A thrown message mentioning `find`, which is this codebase's shape for a
233
+ * failed lookup. Kept as a predicate so the ordering in `mapUpdateError` stays
234
+ * readable.
235
+ */
236
+ function isLookupFailure(e) {
237
+ return e instanceof Error && e.message.includes('find');
238
+ }
239
+ /** 500 with the original message surfaced, so the cause is visible in the UI. */
240
+ function serverFailure(e) {
166
241
  const errMsg = e instanceof Error ? e.message : 'Failed to update template';
167
242
  return { status: 500, body: htmlError(errMsg) };
168
243
  }
@@ -1 +1 @@
1
- {"version":3,"file":"template-form.js","sourceRoot":"","sources":["../../../../src/api/admin/template-form.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-form.js","sourceRoot":"","sources":["../../../../src/api/admin/template-form.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,4 @@
1
1
  import type { FastifyInstance } from 'fastify';
2
2
  import { type AdminRoutesDeps } from './shared.js';
3
- /**
4
- * Template CRUD: the JSON/form endpoints under `/admin/api/templates` plus the
5
- * two HTMX fragment pages that render the create and edit forms.
6
- *
7
- * Kept separate from the plan and report routes because these handlers all
8
- * write through `templateRepo`; the read-only detail page and the plan pages
9
- * that merely *display* a template belong with their own resource.
10
- */
11
3
  export declare function registerTemplateCrudRoutes(fastify: FastifyInstance, opts: AdminRoutesDeps): Promise<void>;
12
4
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/templates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAcrE;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CA8Sf"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/templates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAmMrE,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAgOf"}