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.
- package/VERSION +1 -1
- package/dist/src/api/admin/plans.d.ts +0 -8
- package/dist/src/api/admin/plans.d.ts.map +1 -1
- package/dist/src/api/admin/plans.js +51 -27
- package/dist/src/api/admin/plans.js.map +1 -1
- package/dist/src/api/admin/report-view.d.ts.map +1 -1
- package/dist/src/api/admin/report-view.js +15 -9
- package/dist/src/api/admin/report-view.js.map +1 -1
- package/dist/src/api/admin/template-form.d.ts.map +1 -1
- package/dist/src/api/admin/template-form.js +122 -47
- package/dist/src/api/admin/template-form.js.map +1 -1
- package/dist/src/api/admin/templates.d.ts +0 -8
- package/dist/src/api/admin/templates.d.ts.map +1 -1
- package/dist/src/api/admin/templates.js +142 -87
- package/dist/src/api/admin/templates.js.map +1 -1
- package/dist/src/api/admin/view-models.d.ts.map +1 -1
- package/dist/src/api/admin/view-models.js +38 -8
- package/dist/src/api/admin/view-models.js.map +1 -1
- package/dist/src/api/analysis.d.ts.map +1 -1
- package/dist/src/api/analysis.js +35 -23
- package/dist/src/api/analysis.js.map +1 -1
- package/dist/src/api/health.d.ts +1 -1
- package/dist/src/api/health.d.ts.map +1 -1
- package/dist/src/api/health.js +181 -46
- package/dist/src/api/health.js.map +1 -1
- package/dist/src/api/plans.d.ts.map +1 -1
- package/dist/src/api/plans.js +257 -137
- package/dist/src/api/plans.js.map +1 -1
- package/dist/src/api/templates.d.ts.map +1 -1
- package/dist/src/api/templates.js +16 -6
- package/dist/src/api/templates.js.map +1 -1
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +39 -23
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/core/nodes/interviewing.d.ts.map +1 -1
- package/dist/src/core/nodes/interviewing.js +123 -75
- package/dist/src/core/nodes/interviewing.js.map +1 -1
- package/dist/src/core/nodes/planning.d.ts.map +1 -1
- package/dist/src/core/nodes/planning.js +34 -12
- package/dist/src/core/nodes/planning.js.map +1 -1
- package/dist/src/core/nodes/progress.d.ts +37 -0
- package/dist/src/core/nodes/progress.d.ts.map +1 -0
- package/dist/src/core/nodes/progress.js +58 -0
- package/dist/src/core/nodes/progress.js.map +1 -0
- package/dist/src/core/types/index.d.ts +1 -0
- package/dist/src/core/types/index.d.ts.map +1 -1
- package/dist/src/core/types/index.js +1 -1
- package/dist/src/core/types/index.js.map +1 -1
- package/dist/src/generated/prisma/enums.d.ts +1 -0
- package/dist/src/generated/prisma/enums.d.ts.map +1 -1
- package/dist/src/generated/prisma/enums.js +2 -1
- package/dist/src/generated/prisma/enums.js.map +1 -1
- package/dist/src/generated/prisma/internal/class.js +1 -1
- package/dist/src/generated/prisma/internal/class.js.map +1 -1
- package/dist/src/integrations/dingtalk/client.d.ts +0 -1
- package/dist/src/integrations/dingtalk/client.d.ts.map +1 -1
- package/dist/src/integrations/dingtalk/client.js +0 -5
- package/dist/src/integrations/dingtalk/client.js.map +1 -1
- package/dist/src/integrations/dingtalk/message-sender.d.ts.map +1 -1
- package/dist/src/integrations/dingtalk/message-sender.js +91 -54
- package/dist/src/integrations/dingtalk/message-sender.js.map +1 -1
- package/dist/src/integrations/dingtalk/middleware.d.ts.map +1 -1
- package/dist/src/integrations/dingtalk/middleware.js +20 -11
- package/dist/src/integrations/dingtalk/middleware.js.map +1 -1
- package/dist/src/integrations/dingtalk/stream-client.d.ts +37 -0
- package/dist/src/integrations/dingtalk/stream-client.d.ts.map +1 -1
- package/dist/src/integrations/dingtalk/stream-client.js +190 -107
- package/dist/src/integrations/dingtalk/stream-client.js.map +1 -1
- package/dist/src/integrations/llm/alibaba.d.ts.map +1 -1
- package/dist/src/integrations/llm/alibaba.js +32 -19
- package/dist/src/integrations/llm/alibaba.js.map +1 -1
- package/dist/src/integrations/llm/openai-compatible.d.ts.map +1 -1
- package/dist/src/integrations/llm/openai-compatible.js +70 -26
- package/dist/src/integrations/llm/openai-compatible.js.map +1 -1
- package/dist/src/middleware/admin-auth.d.ts.map +1 -1
- package/dist/src/middleware/admin-auth.js +70 -35
- package/dist/src/middleware/admin-auth.js.map +1 -1
- package/dist/src/repositories/interview-plan.repository.d.ts +1 -1
- package/dist/src/repositories/interview-state.repository.d.ts +64 -0
- package/dist/src/repositories/interview-state.repository.d.ts.map +1 -1
- package/dist/src/repositories/interview-state.repository.js +198 -36
- package/dist/src/repositories/interview-state.repository.js.map +1 -1
- package/dist/src/repositories/interview.repository.d.ts +6 -6
- package/dist/src/repositories/template.repository.d.ts +4 -4
- package/dist/src/repositories/template.repository.d.ts.map +1 -1
- package/dist/src/repositories/template.repository.js +28 -10
- package/dist/src/repositories/template.repository.js.map +1 -1
- package/dist/src/routes/admin-auth.d.ts.map +1 -1
- package/dist/src/routes/admin-auth.js +101 -71
- package/dist/src/routes/admin-auth.js.map +1 -1
- package/dist/src/server-lifecycle.d.ts +1 -1
- package/dist/src/server-lifecycle.d.ts.map +1 -1
- package/dist/src/server-lifecycle.js +2 -2
- package/dist/src/server-lifecycle.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +215 -85
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/analysis.service.d.ts +7 -7
- package/dist/src/services/analysis.service.d.ts.map +1 -1
- package/dist/src/services/analysis.service.js +64 -42
- package/dist/src/services/analysis.service.js.map +1 -1
- package/dist/src/services/analytics.service.d.ts +0 -1
- package/dist/src/services/analytics.service.d.ts.map +1 -1
- package/dist/src/services/analytics.service.js +105 -70
- package/dist/src/services/analytics.service.js.map +1 -1
- package/dist/src/services/batch-aggregation.service.d.ts.map +1 -1
- package/dist/src/services/batch-aggregation.service.js +23 -15
- package/dist/src/services/batch-aggregation.service.js.map +1 -1
- package/dist/src/services/export.service.d.ts.map +1 -1
- package/dist/src/services/export.service.js +41 -23
- package/dist/src/services/export.service.js.map +1 -1
- package/dist/src/services/followup.service.d.ts.map +1 -1
- package/dist/src/services/followup.service.js +149 -58
- package/dist/src/services/followup.service.js.map +1 -1
- package/dist/src/services/interview-plan-base.service.d.ts +17 -14
- package/dist/src/services/interview-plan-base.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-base.service.js +42 -9
- package/dist/src/services/interview-plan-base.service.js.map +1 -1
- package/dist/src/services/interview-plan-members.service.d.ts +35 -0
- package/dist/src/services/interview-plan-members.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-members.service.js +257 -150
- package/dist/src/services/interview-plan-members.service.js.map +1 -1
- package/dist/src/services/interview-plan-send.service.d.ts +18 -0
- package/dist/src/services/interview-plan-send.service.d.ts.map +1 -1
- package/dist/src/services/interview-plan-send.service.js +116 -68
- package/dist/src/services/interview-plan-send.service.js.map +1 -1
- package/dist/src/services/interview-timeout.service.d.ts +87 -0
- package/dist/src/services/interview-timeout.service.d.ts.map +1 -0
- package/dist/src/services/interview-timeout.service.js +174 -0
- package/dist/src/services/interview-timeout.service.js.map +1 -0
- package/dist/src/services/member-verification.service.d.ts.map +1 -1
- package/dist/src/services/member-verification.service.js +45 -38
- package/dist/src/services/member-verification.service.js.map +1 -1
- package/dist/src/services/plan-completion.service.d.ts +15 -11
- package/dist/src/services/plan-completion.service.d.ts.map +1 -1
- package/dist/src/services/plan-completion.service.js +42 -32
- package/dist/src/services/plan-completion.service.js.map +1 -1
- package/dist/src/services/prompt.service.d.ts.map +1 -1
- package/dist/src/services/prompt.service.js +17 -5
- package/dist/src/services/prompt.service.js.map +1 -1
- package/dist/src/services/report.service.d.ts.map +1 -1
- package/dist/src/services/report.service.js +88 -34
- package/dist/src/services/report.service.js.map +1 -1
- package/dist/src/services/start-signal.d.ts +28 -0
- package/dist/src/services/start-signal.d.ts.map +1 -0
- package/dist/src/services/start-signal.js +75 -0
- package/dist/src/services/start-signal.js.map +1 -0
- package/dist/src/services/stream-message-utils.d.ts.map +1 -1
- package/dist/src/services/stream-message-utils.js +71 -31
- package/dist/src/services/stream-message-utils.js.map +1 -1
- package/dist/src/services/stream-message.service.d.ts +94 -0
- package/dist/src/services/stream-message.service.d.ts.map +1 -1
- package/dist/src/services/stream-message.service.js +306 -138
- package/dist/src/services/stream-message.service.js.map +1 -1
- package/dist/src/services/template-dimension.service.d.ts +2 -2
- package/dist/src/utils/markdown.d.ts.map +1 -1
- package/dist/src/utils/markdown.js +29 -6
- package/dist/src/utils/markdown.js.map +1 -1
- package/dist/src/utils/retry.d.ts.map +1 -1
- package/dist/src/utils/retry.js +62 -14
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/security.d.ts.map +1 -1
- package/dist/src/utils/security.js +87 -40
- package/dist/src/utils/security.js.map +1 -1
- package/package.json +3 -2
- package/prisma/migrations/20261107000000_add_interrupted_status/migration.sql +7 -0
- package/prisma/schema.prisma +1 -0
- package/prisma/seed-test-interview.ts +31 -29
- package/scripts/ccn-report.cjs +471 -167
- package/scripts/cli.mjs +877 -484
- package/scripts/migrate-deploy.mjs +66 -42
- package/scripts/mutation-test.mjs +189 -92
- package/scripts/ops/README.md +23 -0
- package/scripts/ops/ds-alert-send.mjs +47 -0
- package/scripts/ops/ds-alert.sh +81 -0
- package/scripts/ops/ds-daily-report.sh +62 -0
- package/scripts/ops/ds-db-backup.sh +47 -0
- package/scripts/ops/ds-health-watch.sh +99 -0
- package/scripts/ops/ds-net-repair.service +10 -0
- package/scripts/ops/ds-net-repair.sh +81 -0
- package/scripts/ops/ds-net-repair.timer +11 -0
- package/scripts/ops/ds-ops-env.sh +26 -0
- package/scripts/ops/ds-restore-drill.sh +107 -0
- package/scripts/ops/ds-smoke.sh +107 -0
- package/scripts/ops/ds-win-watch.ps1 +154 -0
- package/scripts/ops/install.sh +78 -0
- package/scripts/ops/ops.env.example +48 -0
- package/scripts/prune-runtime-deps.mjs +211 -108
- package/scripts/scan-git-history-secrets.mjs +181 -75
- package/scripts/verify-gate-tools.cjs +191 -0
- package/scripts/verify-xp-gate-patches.cjs +46 -24
- package/scripts/write-version.cjs +31 -17
- package/src/views/admin/content/plan-detail.njk +4 -0
- package/src/views/analytics/index.njk +3 -3
- package/src/views/layouts/admin-tree.njk +1 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
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;
|
|
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
|
-
*
|
|
8
|
+
* What deleting a plan from the admin UI should answer.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAwB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,QAAQ,GAAG,YAAY,CAAC;
|
|
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,
|
|
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(`**情感分析**: ${
|
|
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,
|
|
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;
|
|
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
|
|
27
|
-
if (
|
|
28
|
-
|
|
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
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
153
|
+
return 'JSON 缺少 name 字段';
|
|
104
154
|
const content = parsed['content'];
|
|
105
155
|
if (!content || typeof content !== 'object')
|
|
106
|
-
return
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
109
|
-
return
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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":"AAAA,4GAA4G;AAC5G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACpD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACpD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEvF,4EAA4E;AAC5E,SAAS,0BAA0B,CAAC,YAA8C;IAChF,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,
|
|
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;
|
|
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"}
|