@customize-agent/server 4.60.34 → 4.60.36
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +197 -297
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +3 -7
- package/.next/routes-manifest.json +19 -30
- package/.next/server/chunks/{8645.js → 1026.js} +1 -1
- package/.next/server/chunks/1146.js +1 -0
- package/.next/server/chunks/1547.js +385 -0
- package/.next/server/chunks/3074.js +1 -0
- package/.next/server/chunks/3750.js +2 -0
- package/.next/server/chunks/407.js +1 -0
- package/.next/server/chunks/5037.js +46 -0
- package/.next/server/chunks/5304.js +2 -2
- package/.next/server/chunks/5599.js +1 -0
- package/.next/server/chunks/5763.js +159 -0
- package/.next/server/chunks/6138.js +5 -0
- package/.next/server/chunks/6355.js +1 -0
- package/.next/server/chunks/6822.js +1 -1
- package/.next/server/chunks/702.js +3 -0
- package/.next/server/chunks/7296.js +1 -0
- package/.next/server/chunks/8176.js +1 -0
- package/.next/server/chunks/8204.js +1 -1
- package/.next/server/chunks/8459.js +11 -0
- package/.next/server/chunks/8570.js +1 -0
- package/.next/server/chunks/9270.js +1 -0
- package/.next/server/chunks/9283.js +7 -0
- package/.next/server/chunks/9301.js +2 -2
- package/.next/server/chunks/9522.js +5 -0
- package/.next/server/chunks/9559.js +1 -0
- package/.next/server/chunks/9688.js +10 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_app.js +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +1 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated/preview.js +2 -1
- package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated.js +2 -1
- package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
- package/.next/server/pages/api/config/embedding/healthCheck.js +2 -3
- package/.next/server/pages/api/config/embedding/healthCheck.js.nft.json +1 -1
- package/.next/server/pages/api/config/embedding.js +2 -3
- package/.next/server/pages/api/config/embedding.js.nft.json +1 -1
- package/.next/server/pages/api/config/healthCheck.js +2 -3
- package/.next/server/pages/api/config/healthCheck.js.nft.json +1 -1
- package/.next/server/pages/api/config/models.js +2 -3
- package/.next/server/pages/api/config/models.js.nft.json +1 -1
- package/.next/server/pages/api/config/providers/[provider].js +2 -3
- package/.next/server/pages/api/config/providers/[provider].js.nft.json +1 -1
- package/.next/server/pages/api/config/providers.js +2 -3
- package/.next/server/pages/api/config/providers.js.nft.json +1 -1
- package/.next/server/pages/api/config/reset.js +2 -3
- package/.next/server/pages/api/config/reset.js.nft.json +1 -1
- package/.next/server/pages/api/config/web-access.js +2 -3
- package/.next/server/pages/api/config/web-access.js.nft.json +1 -1
- package/.next/server/pages/api/documents/canvas/[id].js +2 -1
- package/.next/server/pages/api/documents/canvas/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/delivery-review.js +2 -0
- package/.next/server/pages/api/documents/delivery-review.js.nft.json +1 -0
- package/.next/server/pages/api/documents/export.js +5 -2
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate/preview.js +6 -1
- package/.next/server/pages/api/documents/generate/preview.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate.js +2 -1
- package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/events.js +4 -3
- package/.next/server/pages/api/documents/generated/[id]/events.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/figure/[name].js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/figure/[name].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/instruction.js +4 -2
- package/.next/server/pages/api/documents/generated/[id]/instruction.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/messages.js +2 -0
- package/.next/server/pages/api/documents/generated/[id]/messages.js.nft.json +1 -0
- package/.next/server/pages/api/documents/generated/[id]/nodes/[nodeId].js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/nodes/[nodeId].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/nodes.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/nodes.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/pause.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/pause.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/preview.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/preview.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/confirm.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/confirm.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/rollback.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/rollback.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/repair.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/report.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/report.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/resume-generate.js +2 -1
- package/.next/server/pages/api/documents/generated/[id]/resume-generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id].js +2 -1
- package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated.js +2 -1
- package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
- package/.next/server/pages/api/health.js +1 -1
- package/.next/server/pages/api/health.js.nft.json +1 -1
- package/.next/server/pages/api/jobs/[id].js +2 -2
- package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
- package/.next/server/pages/api/kb/categories.js +2 -1
- package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
- package/.next/server/pages/api/kb/duplicates.js +2 -1
- package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
- package/.next/server/pages/api/kb/features.js +2 -3
- package/.next/server/pages/api/kb/features.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/detail.js +2 -1
- package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/export.js +2 -1
- package/.next/server/pages/api/kb/files/export.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/open.js +2 -1
- package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/preview-pdf-page.js +2 -1
- package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/reindex.js +1 -2
- package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/search.js +2 -1
- package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/source-preview.js +2 -1
- package/.next/server/pages/api/kb/files/source-preview.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files.js +2 -2
- package/.next/server/pages/api/kb/files.js.nft.json +1 -1
- package/.next/server/pages/api/kb/ignore.js +2 -1
- package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
- package/.next/server/pages/api/kb/material-groups.js +2 -1
- package/.next/server/pages/api/kb/material-groups.js.nft.json +1 -1
- package/.next/server/pages/api/kb/operations.js +2 -2
- package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
- package/.next/server/pages/api/kb/reindex.js +1 -2
- package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/stats.js +2 -1
- package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
- package/.next/server/pages/api/kb/tags.js +2 -1
- package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload/complete.js +1 -2
- package/.next/server/pages/api/kb/upload/complete.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload.js +1 -2
- package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
- package/.next/server/pages/api/prompt/chat.js +3 -4
- package/.next/server/pages/api/prompt/chat.js.nft.json +1 -1
- package/.next/server/pages/api/skills/[id].js +2 -1
- package/.next/server/pages/api/skills/[id].js.nft.json +1 -1
- package/.next/server/pages/api/skills/validate.js +2 -1
- package/.next/server/pages/api/skills/validate.js.nft.json +1 -1
- package/.next/server/pages/api/skills.js +2 -1
- package/.next/server/pages/api/skills.js.nft.json +1 -1
- package/.next/server/pages/api/system/data-health.js +2 -2
- package/.next/server/pages/api/system/data-health.js.nft.json +1 -1
- package/.next/server/pages/api/system/reset.js +1 -1
- package/.next/server/pages/api/system/reset.js.nft.json +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/documents.js.nft.json +1 -1
- package/.next/server/pages/generation/[id].html +1 -0
- package/.next/server/pages/generation/[id].js.nft.json +1 -0
- package/.next/server/pages/generation.html +1 -0
- package/.next/server/pages/generation.js.nft.json +1 -0
- package/.next/server/pages/index.js +1 -0
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/jobs.html +1 -1
- package/.next/server/pages/jobs.js.nft.json +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/file-detail.js.nft.json +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/files.js.nft.json +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/manage.js.nft.json +1 -1
- package/.next/server/pages/knowledge/source-preview.html +1 -1
- package/.next/server/pages/knowledge/source-preview.js.nft.json +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/knowledge.js.nft.json +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/models.js.nft.json +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/settings.js.nft.json +1 -1
- package/.next/server/pages/skills/[id]/edit.html +1 -1
- package/.next/server/pages/skills/[id]/edit.js.nft.json +1 -1
- package/.next/server/pages/skills/[id].html +1 -1
- package/.next/server/pages/skills/[id].js.nft.json +1 -1
- package/.next/server/pages/skills/new.html +1 -1
- package/.next/server/pages/skills/new.js.nft.json +1 -1
- package/.next/server/pages/skills.html +1 -1
- package/.next/server/pages/skills.js.nft.json +1 -1
- package/.next/server/pages-manifest.json +35 -40
- package/.next/static/chunks/112-9eacc7c0686813d6.js +1 -0
- package/.next/static/chunks/127-5ee1899eef559281.js +1 -0
- package/.next/static/chunks/{1210-703ad87eaeee1e4e.js → 210-71eaf9de9aa92051.js} +1 -1
- package/.next/static/chunks/325-45106bb003a2c5ce.js +4 -0
- package/.next/static/chunks/326-a3915e61888b0dbf.js +1 -0
- package/.next/static/chunks/333-7642e65bff6b8465.js +1 -0
- package/.next/static/chunks/338-19ccbaec57a7bf9c.js +4 -0
- package/.next/static/chunks/350-87b9c900a356d9b9.js +1 -0
- package/.next/static/chunks/359-f87c659236e0e0fe.js +1 -0
- package/.next/static/chunks/{8399-a001bb2a0cb1640b.js → 399-aa8a45d80e989621.js} +1 -1
- package/.next/static/chunks/430-f288e16301b9aea5.js +1 -0
- package/.next/static/chunks/465-80fbb245d43232c8.js +6 -0
- package/.next/static/chunks/499-2233cadc6d4da647.js +10 -0
- package/.next/static/chunks/551-fd86e95935b0957f.js +16 -0
- package/.next/static/chunks/576-6699fed6c88502fe.js +1 -0
- package/.next/static/chunks/61-de1dd9c104680470.js +1 -0
- package/.next/static/chunks/665-0634aa49137defc4.js +1 -0
- package/.next/static/chunks/681-e31b13114497e058.js +1 -0
- package/.next/static/chunks/687-644a12a5b584e19f.js +1 -0
- package/.next/static/chunks/702-4d9cc8d4d7775ea9.js +1 -0
- package/.next/static/chunks/748-9e5bf4181d7482f3.js +1 -0
- package/.next/static/chunks/759-280cf4040fae83af.js +25 -0
- package/.next/static/chunks/855-cbf7cd1db33198f0.js +17 -0
- package/.next/static/chunks/862-13d1c84d0938b824.js +1 -0
- package/.next/static/chunks/937-ccd3ceb1b3739535.js +1 -0
- package/.next/static/chunks/{8964-e959915ecfae86b2.js → 964-82cc4701f08f7351.js} +1 -1
- package/.next/static/chunks/992-8032f477230baaaf.js +1 -0
- package/.next/static/chunks/framework-4b565b3ddc94cdac.js +1 -0
- package/.next/static/chunks/main-0c91f573696223ca.js +1 -0
- package/.next/static/chunks/pages/_app-a70de062f1be1c59.js +140 -0
- package/.next/static/chunks/pages/_error-282257fbdcc167b4.js +1 -0
- package/.next/static/chunks/pages/documents-2d99ae9287f9739b.js +1 -0
- package/.next/static/chunks/pages/generation/[id]-1f97e47ce545bd11.js +1 -0
- package/.next/static/chunks/pages/generation-043e325d635c96af.js +1 -0
- package/.next/static/chunks/pages/index-24d1f8f39ae0beb0.js +1 -0
- package/.next/static/chunks/pages/jobs-ff2f899a081b616e.js +1 -0
- package/.next/static/chunks/pages/knowledge/file-detail-9a9a89e4fa33c0d9.js +1 -0
- package/.next/static/chunks/pages/knowledge/files-b3ef5324e4b74c4a.js +1 -0
- package/.next/static/chunks/pages/knowledge/manage-d9eaebf3a8307953.js +1 -0
- package/.next/static/chunks/pages/knowledge/{source-preview-24936b9a746ed07f.js → source-preview-f000b4d63cd65a54.js} +1 -1
- package/.next/static/chunks/pages/knowledge-8fa842d21892e2c3.js +1 -0
- package/.next/static/chunks/pages/models-6d9b301009f82395.js +1 -0
- package/.next/static/chunks/pages/settings-08893ba8afa1a486.js +1 -0
- package/.next/static/chunks/pages/skills/[id]/edit-378249e662ebf31f.js +1 -0
- package/.next/static/chunks/pages/skills/[id]-0ca4cde22e4a518b.js +1 -0
- package/.next/static/chunks/pages/skills/new-c1eb16d98fad4e02.js +1 -0
- package/.next/static/chunks/pages/skills-9fb1fa2b669ad4e3.js +1 -0
- package/.next/static/chunks/{webpack-2da1769ff35eb1ed.js → webpack-6224d37324e372cb.js} +1 -1
- package/.next/static/css/1f6d2a1bf5e15e0f.css +1 -0
- package/.next/static/css/b420c193e0e99857.css +1 -0
- package/.next/static/e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2/_buildManifest.js +1 -0
- package/README.md +14 -4
- package/messages/en-US.json +46 -100
- package/messages/zh-CN.json +44 -98
- package/next.config.ts +6 -5
- package/package.json +5 -6
- package/scripts/build-identity.cjs +16 -5
- package/scripts/check-workspace-deps.cjs +3 -3
- package/scripts/purge-next-artifacts.cjs +8 -5
- package/scripts/upload-matrix.cjs +1 -2
- package/scripts/verify-next-static.js +1 -1
- package/.next/server/chunks/1001.js +0 -2
- package/.next/server/chunks/1243.js +0 -3
- package/.next/server/chunks/1928.js +0 -1
- package/.next/server/chunks/1936.js +0 -385
- package/.next/server/chunks/2328.js +0 -6
- package/.next/server/chunks/2434.js +0 -4
- package/.next/server/chunks/3806.js +0 -1
- package/.next/server/chunks/4974.js +0 -2
- package/.next/server/chunks/5746.js +0 -5
- package/.next/server/chunks/6321.js +0 -1
- package/.next/server/chunks/7848.js +0 -145
- package/.next/server/chunks/9666.js +0 -146
- package/.next/server/instrumentation.js +0 -1
- package/.next/server/instrumentation.js.nft.json +0 -1
- package/.next/server/pages/api/prompt.js +0 -2
- package/.next/server/pages/api/prompt.js.nft.json +0 -1
- package/.next/server/pages/api/system/logs.js +0 -2
- package/.next/server/pages/api/system/logs.js.nft.json +0 -1
- package/.next/server/pages/api/system/stats.js +0 -2
- package/.next/server/pages/api/system/stats.js.nft.json +0 -1
- package/.next/server/pages/canvas/[id].html +0 -1
- package/.next/server/pages/canvas/[id].js.nft.json +0 -1
- package/.next/server/pages/canvas.html +0 -1
- package/.next/server/pages/canvas.js.nft.json +0 -1
- package/.next/server/pages/guide.html +0 -1
- package/.next/server/pages/guide.js.nft.json +0 -1
- package/.next/server/pages/index.html +0 -1
- package/.next/server/pages/overview.html +0 -1
- package/.next/server/pages/overview.js.nft.json +0 -1
- package/.next/server/pages/prompt.html +0 -1
- package/.next/server/pages/prompt.js.nft.json +0 -1
- package/.next/server/pages/system/logs.html +0 -1
- package/.next/server/pages/system/logs.js.nft.json +0 -1
- package/.next/static/0e37797d2ec62d17ca5f253c10b385fa939228f353538722f095755edce292af/_buildManifest.js +0 -1
- package/.next/static/chunks/1141-d420a7685bc3623c.js +0 -1
- package/.next/static/chunks/1499-ff8f02f6bb6f3d45.js +0 -10
- package/.next/static/chunks/1702-f5e99af7aface475.js +0 -1
- package/.next/static/chunks/2864-b040f2bffa08c139.js +0 -6
- package/.next/static/chunks/3456-70bb03a39473f693.js +0 -1
- package/.next/static/chunks/3980-73841c40d55ddfa1.js +0 -1
- package/.next/static/chunks/4052-199e61ca9e6a33e7.js +0 -1
- package/.next/static/chunks/4337-a670a1a94ab505d9.js +0 -1
- package/.next/static/chunks/4530-8b9788da40548ec6.js +0 -1
- package/.next/static/chunks/4565-3c5ff667062ccec9.js +0 -21
- package/.next/static/chunks/4665-1984a3d8b0573fa1.js +0 -1
- package/.next/static/chunks/5061-80765d4a612286e0.js +0 -1
- package/.next/static/chunks/5544-d77b8289662b4c28.js +0 -4
- package/.next/static/chunks/5760-f4191aac081b12d4.js +0 -11
- package/.next/static/chunks/6409-5a3bb0fbad4f64b1.js +0 -14
- package/.next/static/chunks/6506-ac0ba7338cc84b7d.js +0 -1
- package/.next/static/chunks/6748-07b0b05bf03c72f0.js +0 -1
- package/.next/static/chunks/7217-416b8488e0d2d498.js +0 -1
- package/.next/static/chunks/7576-ba6fc03060415b0e.js +0 -1
- package/.next/static/chunks/7646-159733564c7eb8dc.js +0 -1
- package/.next/static/chunks/7795-c11ff1a81c67c5aa.js +0 -1
- package/.next/static/chunks/8318-cb3a94de1617f983.js +0 -1
- package/.next/static/chunks/8338-b2ea00050048ba9f.js +0 -4
- package/.next/static/chunks/8564-ac3e2f1bf87765b3.js +0 -1
- package/.next/static/chunks/8569-1d5c61a3f4fa0e26.js +0 -16
- package/.next/static/chunks/8715-ee013bd7f5ba38e8.js +0 -1
- package/.next/static/chunks/8750-a3c55a576effb3a6.js +0 -1
- package/.next/static/chunks/8787-49b1f35eb4acfac9.js +0 -10
- package/.next/static/chunks/9551-f4b09bf2213ad571.js +0 -16
- package/.next/static/chunks/9605-3dee531f8a7ecbe0.js +0 -4
- package/.next/static/chunks/9937-e4b2deadd24e3962.js +0 -1
- package/.next/static/chunks/framework-9cde5013cd555765.js +0 -1
- package/.next/static/chunks/main-b313efde54fa6d2e.js +0 -1
- package/.next/static/chunks/pages/_app-51c48c5efcf5c721.js +0 -140
- package/.next/static/chunks/pages/_error-c01b6fb772028676.js +0 -1
- package/.next/static/chunks/pages/canvas/[id]-18865f1b7e3a4696.js +0 -1
- package/.next/static/chunks/pages/canvas-1d3589790493e955.js +0 -1
- package/.next/static/chunks/pages/documents-a1af5c6be26daed2.js +0 -1
- package/.next/static/chunks/pages/guide-fdf0822dc1d28813.js +0 -1
- package/.next/static/chunks/pages/index-c572e9caa60cb278.js +0 -1
- package/.next/static/chunks/pages/jobs-ebd1877dbf788a83.js +0 -1
- package/.next/static/chunks/pages/knowledge/file-detail-3d1ffd43f4f0e47b.js +0 -1
- package/.next/static/chunks/pages/knowledge/files-b796702bb5f8ac50.js +0 -1
- package/.next/static/chunks/pages/knowledge/manage-6d7b21cdca1255f2.js +0 -1
- package/.next/static/chunks/pages/knowledge-2a776c1740386874.js +0 -1
- package/.next/static/chunks/pages/models-8a89dd5bf0f81242.js +0 -1
- package/.next/static/chunks/pages/overview-7e8018014009682e.js +0 -1
- package/.next/static/chunks/pages/prompt-11f87694feb6514c.js +0 -1
- package/.next/static/chunks/pages/settings-e8dcaba1551a0b2b.js +0 -1
- package/.next/static/chunks/pages/skills/[id]/edit-99e616d5019e80b1.js +0 -1
- package/.next/static/chunks/pages/skills/[id]-71f696be252bbf0d.js +0 -1
- package/.next/static/chunks/pages/skills/new-00886ea4c676f927.js +0 -1
- package/.next/static/chunks/pages/skills-8ad2577b4aa17f3b.js +0 -1
- package/.next/static/chunks/pages/system/logs-0856f7c65432befb.js +0 -1
- package/.next/static/css/2da1c822e3bdb4bb.css +0 -1
- package/.next/static/css/9eb02c1a401fd278.css +0 -1
- package/scripts/half-built-scan.allow.json +0 -152
- package/scripts/half-built-scan.baseline.json +0 -190
- package/scripts/half-built-scan.mjs +0 -287
- /package/.next/static/{0e37797d2ec62d17ca5f253c10b385fa939228f353538722f095755edce292af → e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2}/_ssgManifest.js +0 -0
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"note": "引用扫描登记:每项须有具体的测试、观察或内部用途;新增零引用或仅测试候选须独立核查,不能用登记掩盖未接入业务。",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"file": "apps/server/src/lib/api.ts",
|
|
7
|
-
"symbol": "__resetExportReceiptForTest",
|
|
8
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"file": "apps/server/src/lib/i18n.ts",
|
|
12
|
-
"symbol": "resetMissingTranslationKeys",
|
|
13
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"file": "apps/server/src/lib/i18n.ts",
|
|
17
|
-
"symbol": "catalogKeyParity",
|
|
18
|
-
"reason": "观察面/查询面(口径可穷举):供用例与审计读,生产路径不直接调用"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"file": "apps/server/src/pages/api/documents/canvas/[id].ts",
|
|
22
|
-
"symbol": "isAggregateFoldSummary",
|
|
23
|
-
"reason": "观察面/查询面(口径可穷举):供用例与审计读,生产路径不直接调用"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"file": "apps/server/src/pages/api/documents/export.ts",
|
|
27
|
-
"symbol": "__documentExportTest__",
|
|
28
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"file": "apps/server/src/services/agent/eventBus.ts",
|
|
32
|
-
"symbol": "resetEventBusForTest",
|
|
33
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"file": "apps/server/src/services/agent/eventBus.ts",
|
|
37
|
-
"symbol": "flushSubscriptions",
|
|
38
|
-
"reason": "测试/审计读面:用例据此读工具表/任务表/蓝图/事件总线"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"file": "apps/server/src/services/agent/eventBus.ts",
|
|
42
|
-
"symbol": "subscriberCount",
|
|
43
|
-
"reason": "观察面/查询面(口径可穷举):供用例与审计读,生产路径不直接调用"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"file": "apps/server/src/services/agent/loopBudget.ts",
|
|
47
|
-
"symbol": "resetBudgetMeters",
|
|
48
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"file": "apps/server/src/services/agent/toolRegistry.ts",
|
|
52
|
-
"symbol": "getTool",
|
|
53
|
-
"reason": "测试/审计读面:用例据此读工具表/任务表/蓝图/事件总线"
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"file": "apps/server/src/services/agent/toolRegistry.ts",
|
|
57
|
-
"symbol": "TOOL_GROUP_COUNTS",
|
|
58
|
-
"reason": "登记表/账本的机械自证面:用例据此核对登记与实现一致;生产不需要调用"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"file": "apps/server/src/services/document-core/documentDomainProfileService.ts",
|
|
62
|
-
"symbol": "fieldMatchesCategory",
|
|
63
|
-
"reason": "观察面/查询面(口径可穷举):供用例与审计读,生产路径不直接调用"
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"file": "apps/server/src/services/document-core/generatedDocumentService.ts",
|
|
67
|
-
"symbol": "setProcessAliveProbeForTest",
|
|
68
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"file": "apps/server/src/services/document-core/generatedDocumentService.ts",
|
|
72
|
-
"symbol": "getGenerateTask",
|
|
73
|
-
"reason": "测试/审计读面:用例据此读工具表/任务表/蓝图/事件总线"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"file": "apps/server/src/services/document-workflow/costModel.ts",
|
|
77
|
-
"symbol": "resetCostModelCaches",
|
|
78
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"file": "apps/server/src/services/document-workflow/envRegistry.ts",
|
|
82
|
-
"symbol": "unregisteredAppEnvVars",
|
|
83
|
-
"reason": "登记表/账本的机械自证面:用例据此核对登记与实现一致;生产不需要调用"
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"file": "apps/server/src/services/document-workflow/generationStages/generationSession.ts",
|
|
87
|
-
"symbol": "createEmptyGenerationSession",
|
|
88
|
-
"reason": "测试钩子:构造空会话的最小骨架(生产总是由真实输入建会话)"
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"file": "apps/server/src/services/document-workflow/integratedBlueprint.ts",
|
|
92
|
-
"symbol": "loadBlueprintAsset",
|
|
93
|
-
"reason": "测试/审计读面:用例据此读工具表/任务表/蓝图/事件总线"
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"file": "apps/server/src/services/document-workflow/llmClient.ts",
|
|
97
|
-
"symbol": "resetEmptyStormStreak",
|
|
98
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"file": "apps/server/src/services/document-workflow/llmClient.ts",
|
|
102
|
-
"symbol": "activeLlmCallCount",
|
|
103
|
-
"reason": "观察面/查询面(口径可穷举):供用例与审计读,生产路径不直接调用"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"file": "apps/server/src/services/document-workflow/llmClient.ts",
|
|
107
|
-
"symbol": "resetLlmSlotStateForTest",
|
|
108
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"file": "apps/server/src/services/document-workflow/semanticSimilarity.ts",
|
|
112
|
-
"symbol": "clearEmbedCacheForTest",
|
|
113
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"file": "apps/server/src/services/knowledge/kbService.ts",
|
|
117
|
-
"symbol": "shutdownKbService",
|
|
118
|
-
"reason": "测试钩子(重置/探针):只有用例需要,生产不该调用"
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"file": "apps/server/src/services/agent/emitNode.ts",
|
|
122
|
-
"symbol": "resetEmitNodeState",
|
|
123
|
-
"reason": "实际节点生产器emitNode的进程状态重置测试面,隔离轮次/幂等状态;非未接入业务函数。"
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
"file": "apps/server/src/services/document-workflow/semanticSimilarity.ts",
|
|
127
|
-
"symbol": "snapshotEmbedCacheStats",
|
|
128
|
-
"reason": "实际事实检索、evidence/Native阶段共用的embedding缓存统计只读测试观察面;不承担正文雷同删除或写作评分。"
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
"file": "apps/server/src/services/document-workflow/sourceVersionPolicy.ts",
|
|
132
|
-
"symbol": "isAuthenticatedSourceVersionPolicy",
|
|
133
|
-
"reason": "实际SourceVersionPolicy WeakSet认证状态只读测试面,验证伪造/恢复前后的真实来源权限;非模型声明或验收通过资格。"
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
"file": "apps/server/src/lib/i18n.ts",
|
|
137
|
-
"symbol": "getMissingTranslationKeys",
|
|
138
|
-
"reason": "读取真实翻译缺失缓存,供测试验证去重与告警;不写配置或授予产品能力。"
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
"file": "apps/server/src/services/agent/nodeLog.ts",
|
|
142
|
-
"symbol": "readNode",
|
|
143
|
-
"reason": "读取真实追加日志中单个节点,供持久化、更新投影与截断恢复回归核查。"
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
"file": "apps/server/src/services/document-workflow/detectorFixerRegistry.ts",
|
|
147
|
-
"symbol": "manualDispositionIssues",
|
|
148
|
-
"reason": "只读筛选现有检测器登记的人工核查项,验证危大分级等实际错误的处置属性;不自动授予修复或通过。"
|
|
149
|
-
}
|
|
150
|
-
],
|
|
151
|
-
"retirementUpdatedAt": "2026-10-10T18:16:44.738Z"
|
|
152
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"note": "引用扫描基线:已移除不存在的声明,零引用导出不允许新增;实际入口、公开接口及测试观察面分别核查。",
|
|
3
|
-
"generatedAt": "2026-09-29",
|
|
4
|
-
"scope": [
|
|
5
|
-
"apps/server/src",
|
|
6
|
-
"packages"
|
|
7
|
-
],
|
|
8
|
-
"counts": {
|
|
9
|
-
"谁都不用": 0,
|
|
10
|
-
"半成品嫌疑": 22,
|
|
11
|
-
"封装暴露(只导出给测试)": 142,
|
|
12
|
-
"不可判(星号再导出)": 0
|
|
13
|
-
},
|
|
14
|
-
"roster": {
|
|
15
|
-
"谁都不用": [],
|
|
16
|
-
"半成品嫌疑": [
|
|
17
|
-
"apps/server/src/lib/i18n.ts::catalogKeyParity",
|
|
18
|
-
"apps/server/src/lib/i18n.ts::resetMissingTranslationKeys",
|
|
19
|
-
"apps/server/src/pages/api/documents/canvas/[id].ts::isAggregateFoldSummary",
|
|
20
|
-
"apps/server/src/pages/api/documents/export.ts::__documentExportTest__",
|
|
21
|
-
"apps/server/src/services/agent/eventBus.ts::flushSubscriptions",
|
|
22
|
-
"apps/server/src/services/agent/eventBus.ts::resetEventBusForTest",
|
|
23
|
-
"apps/server/src/services/agent/eventBus.ts::subscriberCount",
|
|
24
|
-
"apps/server/src/services/agent/loopBudget.ts::resetBudgetMeters",
|
|
25
|
-
"apps/server/src/services/agent/toolRegistry.ts::TOOL_GROUP_COUNTS",
|
|
26
|
-
"apps/server/src/services/agent/toolRegistry.ts::getTool",
|
|
27
|
-
"apps/server/src/services/document-core/documentDomainProfileService.ts::fieldMatchesCategory",
|
|
28
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::getGenerateTask",
|
|
29
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::setProcessAliveProbeForTest",
|
|
30
|
-
"apps/server/src/services/document-workflow/costModel.ts::resetCostModelCaches",
|
|
31
|
-
"apps/server/src/services/document-workflow/envRegistry.ts::unregisteredAppEnvVars",
|
|
32
|
-
"apps/server/src/services/document-workflow/generationStages/generationSession.ts::createEmptyGenerationSession",
|
|
33
|
-
"apps/server/src/services/document-workflow/integratedBlueprint.ts::loadBlueprintAsset",
|
|
34
|
-
"apps/server/src/services/document-workflow/llmClient.ts::activeLlmCallCount",
|
|
35
|
-
"apps/server/src/services/document-workflow/llmClient.ts::resetEmptyStormStreak",
|
|
36
|
-
"apps/server/src/services/document-workflow/llmClient.ts::resetLlmSlotStateForTest",
|
|
37
|
-
"apps/server/src/services/document-workflow/semanticSimilarity.ts::clearEmbedCacheForTest",
|
|
38
|
-
"apps/server/src/services/knowledge/kbService.ts::shutdownKbService"
|
|
39
|
-
],
|
|
40
|
-
"封装暴露(只导出给测试)": [
|
|
41
|
-
"apps/server/src/components/Canvas/DeliverablePreview.tsx::bodySourceText",
|
|
42
|
-
"apps/server/src/components/Canvas/activeAgents.ts::ACTIVE_AGENT_LIMIT",
|
|
43
|
-
"apps/server/src/components/Canvas/activeAgents.ts::RECENT_DONE_MS",
|
|
44
|
-
"apps/server/src/components/Canvas/activeAgents.ts::agentKindLabel",
|
|
45
|
-
"apps/server/src/components/Canvas/handoff.ts::HANDOFF_FRESH_MS",
|
|
46
|
-
"apps/server/src/components/Canvas/handoff.ts::HANDOFF_MAX",
|
|
47
|
-
"apps/server/src/components/Canvas/handoff.ts::clipLabel",
|
|
48
|
-
"apps/server/src/components/Canvas/handoff.ts::handoffLabel",
|
|
49
|
-
"apps/server/src/components/Canvas/handoff.ts::metricsLabel",
|
|
50
|
-
"apps/server/src/components/Canvas/handoff.ts::reversedEdgePath",
|
|
51
|
-
"apps/server/src/components/Canvas/nodeView.ts::DOC_STATUS_TEXT",
|
|
52
|
-
"apps/server/src/components/Canvas/nodeView.ts::NODE_STATUS_TEXT",
|
|
53
|
-
"apps/server/src/components/Canvas/nodeView.ts::NODE_TYPE_LABELS",
|
|
54
|
-
"apps/server/src/components/Canvas/useCanvasViewport.ts::FOLLOW_EDGE_RATIO",
|
|
55
|
-
"apps/server/src/hooks/useGenerationState.ts::buildFlowStepsFromNodes",
|
|
56
|
-
"apps/server/src/hooks/useGenerationState.ts::stageIconFor",
|
|
57
|
-
"apps/server/src/lib/i18n.ts::flattenCatalogKeys",
|
|
58
|
-
"apps/server/src/lib/i18n.ts::getMissingTranslationKeys",
|
|
59
|
-
"apps/server/src/lib/markdownPreview.ts::createPreviewStats",
|
|
60
|
-
"apps/server/src/lib/markdownPreview.ts::decodePreviewEntities",
|
|
61
|
-
"apps/server/src/lib/markdownPreview.ts::escapePreviewText",
|
|
62
|
-
"apps/server/src/lib/markdownPreview.ts::isSafePreviewUrl",
|
|
63
|
-
"apps/server/src/lib/markdownPreview.ts::sanitizePreviewHtml",
|
|
64
|
-
"apps/server/src/pages/api/documents/canvas/[id].ts::FOLD_SUMMARY_MARK",
|
|
65
|
-
"apps/server/src/pages/api/documents/canvas/[id].ts::foldAggregateStageDetails",
|
|
66
|
-
"apps/server/src/pages/api/skills/index.ts::skillEditorOptions",
|
|
67
|
-
"apps/server/src/services/agent/auditCapability.ts::normalizeClarificationQuestion",
|
|
68
|
-
"apps/server/src/services/agent/capabilityGaps.ts::CAPABILITY_GAPS",
|
|
69
|
-
"apps/server/src/services/agent/emitNode.ts::PHASE_ROOTS",
|
|
70
|
-
"apps/server/src/services/agent/emitNode.ts::stageIdentity",
|
|
71
|
-
"apps/server/src/services/agent/eventBus.ts::BoundedEventBuffer",
|
|
72
|
-
"apps/server/src/services/agent/eventBus.ts::EVENT_BUS_GLOBAL_KEY",
|
|
73
|
-
"apps/server/src/services/agent/eventBus.ts::eventBusState",
|
|
74
|
-
"apps/server/src/services/agent/eventBus.ts::publishGenerationEvent",
|
|
75
|
-
"apps/server/src/services/agent/loopBudget.ts::cacheShareText",
|
|
76
|
-
"apps/server/src/services/agent/loopBudget.ts::configureBudgetMeter",
|
|
77
|
-
"apps/server/src/services/agent/loopBudget.ts::isFallbackMeter",
|
|
78
|
-
"apps/server/src/services/agent/nodeImpact.ts::IMPACT_ESCALATION_THRESHOLD",
|
|
79
|
-
"apps/server/src/services/agent/nodeLog.ts::appendNodeEvent",
|
|
80
|
-
"apps/server/src/services/agent/nodeLog.ts::assertNodeShape",
|
|
81
|
-
"apps/server/src/services/agent/nodeRollup.ts::NODE_STATUS_PRECEDENCE",
|
|
82
|
-
"apps/server/src/services/agent/nodeRollup.ts::nodeChildrenIndex",
|
|
83
|
-
"apps/server/src/services/agent/nodeRollup.ts::nodeDepths",
|
|
84
|
-
"apps/server/src/services/agent/nodeTypes.ts::AGENT_NODE_TYPES",
|
|
85
|
-
"apps/server/src/services/agent/nodeTypes.ts::NODE_STATUSES",
|
|
86
|
-
"apps/server/src/services/agent/repairStore.ts::RepairStoreError",
|
|
87
|
-
"apps/server/src/services/agent/repairStore.ts::collectRepairFeedback",
|
|
88
|
-
"apps/server/src/services/agent/repairStore.ts::readRepairHistory",
|
|
89
|
-
"apps/server/src/services/agent/repairStore.ts::repairLocalizationProbes",
|
|
90
|
-
"apps/server/src/services/agent/repairStore.ts::repairLogPath",
|
|
91
|
-
"apps/server/src/services/agent/repairStore.ts::toRepairFeedbackEntry",
|
|
92
|
-
"apps/server/src/services/agent/repairTransaction.ts::decideRepairOutcome",
|
|
93
|
-
"apps/server/src/services/agent/toolEnvelope.ts::INJECTION_PATTERNS",
|
|
94
|
-
"apps/server/src/services/agent/toolEnvelope.ts::detectInjection",
|
|
95
|
-
"apps/server/src/services/agent/toolRegistry.ts::ALL_TOOLS",
|
|
96
|
-
"apps/server/src/services/agent/toolRegistry.ts::toolNames",
|
|
97
|
-
"apps/server/src/services/agent/writerLoopBlock.ts::unfixableDeclarationOf",
|
|
98
|
-
"apps/server/src/services/common/errorLogService.ts::createProcessErrorHandler",
|
|
99
|
-
"apps/server/src/services/common/safePath.ts::rejectRelativePath",
|
|
100
|
-
"apps/server/src/services/common/serviceState.ts::getFirstStartedAt",
|
|
101
|
-
"apps/server/src/services/common/serviceState.ts::serviceStatePath",
|
|
102
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::buildResumeInitialRecord",
|
|
103
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::hasActiveTaskForProject",
|
|
104
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::upsertGeneratedAssets",
|
|
105
|
-
"apps/server/src/services/document-core/generatedDocumentService.ts::upsertGeneratedDocumentAsset",
|
|
106
|
-
"apps/server/src/services/document-workflow/agentWorkflow.ts::scopedMaterialRootsOf",
|
|
107
|
-
"apps/server/src/services/document-workflow/authoritativeValues.ts::attributeValueShapeMismatch",
|
|
108
|
-
"apps/server/src/services/document-workflow/authoritativeValues.ts::cleanValueForm",
|
|
109
|
-
"apps/server/src/services/document-workflow/authoritativeValues.ts::stripTrailingOcrGarbage",
|
|
110
|
-
"apps/server/src/services/document-workflow/constructionBidStructure.ts::representativeTitleForPattern",
|
|
111
|
-
"apps/server/src/services/document-workflow/constructionProcessKnowledge.ts::STANDARDS_PENDING_CALIBRATION",
|
|
112
|
-
"apps/server/src/services/document-workflow/costModel.ts::parsePriceOverride",
|
|
113
|
-
"apps/server/src/services/document-workflow/costModel.ts::priceEntryFor",
|
|
114
|
-
"apps/server/src/services/document-workflow/costModel.ts::priceKeyOf",
|
|
115
|
-
"apps/server/src/services/document-workflow/costModel.ts::priceTable",
|
|
116
|
-
"apps/server/src/services/document-workflow/defectHeatmap.ts::REPAIR_ATTRIBUTION_LABELS",
|
|
117
|
-
"apps/server/src/services/document-workflow/defectHeatmap.ts::REPAIR_FEEDBACK_STUBBORN_THRESHOLD",
|
|
118
|
-
"apps/server/src/services/document-workflow/documentInstruction.ts::INSTRUCTION_KINDS",
|
|
119
|
-
"apps/server/src/services/document-workflow/documentInstruction.ts::INSTRUCTION_KIND_LABELS",
|
|
120
|
-
"apps/server/src/services/document-workflow/documentInstruction.ts::classifyInstructionByRules",
|
|
121
|
-
"apps/server/src/services/document-workflow/documentInstruction.ts::extractInstructionTarget",
|
|
122
|
-
"apps/server/src/services/document-workflow/envRegistry.ts::AGENT_ENV_REGISTRY",
|
|
123
|
-
"apps/server/src/services/document-workflow/envRegistry.ts::APP_ENV_PREFIXES",
|
|
124
|
-
"apps/server/src/services/document-workflow/envRegistry.ts::APP_ENV_REGISTRY",
|
|
125
|
-
"apps/server/src/services/document-workflow/envRegistry.ts::CUSTOMIZE_ENV_REGISTRY",
|
|
126
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::SUPPORT_FORM_LEXICON",
|
|
127
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::applyScopeOverridesToText",
|
|
128
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::collectMarkdownTableCandidates",
|
|
129
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::collectStructuredFactCandidates",
|
|
130
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::numericScopeResolutions",
|
|
131
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::resolveCanonicalFacts",
|
|
132
|
-
"apps/server/src/services/document-workflow/factGovernance.ts::unitReForKind",
|
|
133
|
-
"apps/server/src/services/document-workflow/factsModel.ts::sanitizeFactPool",
|
|
134
|
-
"apps/server/src/services/document-workflow/hazardBinding.ts::billOfQuantitiesCorpus",
|
|
135
|
-
"apps/server/src/services/document-workflow/hazardBinding.ts::extractHazardParameters",
|
|
136
|
-
"apps/server/src/services/document-workflow/hazardBinding.ts::normalizeParameterValue",
|
|
137
|
-
"apps/server/src/services/document-workflow/integratedBlueprint/parse.ts::isStructuralOnlyBillFile",
|
|
138
|
-
"apps/server/src/services/document-workflow/llmCassette.ts::CASSETTE_PROMPT_VERSION",
|
|
139
|
-
"apps/server/src/services/document-workflow/llmCassette.ts::CassetteMissError",
|
|
140
|
-
"apps/server/src/services/document-workflow/llmCassette.ts::cassetteDir",
|
|
141
|
-
"apps/server/src/services/document-workflow/llmCassette.ts::cassetteMode",
|
|
142
|
-
"apps/server/src/services/document-workflow/llmClient.ts::judgeThinkingEnabled",
|
|
143
|
-
"apps/server/src/services/document-workflow/planningArtifactCache.ts::PLANNING_ARTIFACT_CACHE_VERSION",
|
|
144
|
-
"apps/server/src/services/document-workflow/poolNoise.ts::penaltyTableHitCount",
|
|
145
|
-
"apps/server/src/services/document-workflow/promptRuleExtraction.ts::dedupePlannedSections",
|
|
146
|
-
"apps/server/src/services/document-workflow/promptRuleExtraction.ts::extractOutlineHeadings",
|
|
147
|
-
"apps/server/src/services/document-workflow/resumeLedger.ts::isManualIssue",
|
|
148
|
-
"apps/server/src/services/document-workflow/structureIntegrityRules.ts::tailOrphanBlockIssues",
|
|
149
|
-
"apps/server/src/services/document-workflow/textMatch.ts::chineseTokenMatchScore",
|
|
150
|
-
"apps/server/src/services/document-workflow/textMatch.ts::chineseTokens",
|
|
151
|
-
"apps/server/src/services/knowledge/kbExportService.ts::txtEntryNameFor",
|
|
152
|
-
"apps/server/src/services/knowledge/kbIndexWorkerService.ts::enqueueKnowledgeIndex",
|
|
153
|
-
"apps/server/src/services/knowledge/kbService.ts::getKnownProjectRoots",
|
|
154
|
-
"apps/server/src/services/skills/blockKnowledge.ts::selectBlockCards",
|
|
155
|
-
"apps/server/src/services/skills/match.ts::assertFocusRuleMapping",
|
|
156
|
-
"apps/server/src/services/skills/match.ts::chapterDomainPatterns",
|
|
157
|
-
"apps/server/src/services/skills/schema.ts::MAX_SECTION_REGEX_LENGTH",
|
|
158
|
-
"apps/server/src/services/skills/store.ts::applySkillOverride",
|
|
159
|
-
"apps/server/src/services/skills/store.ts::skillFilePath",
|
|
160
|
-
"apps/server/src/services/skills/store.ts::skillsDir",
|
|
161
|
-
"packages/knowledge/src/core/knowledge-base-manager.ts::diversifiedRerankCandidates",
|
|
162
|
-
"packages/knowledge/src/extraction/content-extractor.ts::extractTopLevelOoxmlElements",
|
|
163
|
-
"packages/knowledge/src/extraction/content-extractor.ts::isPdfWrappedClauseLike",
|
|
164
|
-
"packages/knowledge/src/extraction/content-extractor.ts::ocrPageCacheKeyOf",
|
|
165
|
-
"packages/knowledge/src/extraction/content-extractor.ts::reorderPdfRowsAroundWrappedParagraphs",
|
|
166
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::OCR_NEIGHBOR_CONFUSION_LOW_CONFIDENCE",
|
|
167
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::PaddleOcrJsProvider",
|
|
168
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::TesseractJsProvider",
|
|
169
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::gateOcrNeighborClassConfusions",
|
|
170
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::resolveOcrSessionThreads",
|
|
171
|
-
"packages/knowledge/src/extraction/ocr-providers.ts::withOcrSessionThreads",
|
|
172
|
-
"packages/knowledge/src/extraction/ocr-tiling.ts::assembleTiledText",
|
|
173
|
-
"packages/knowledge/src/extraction/ocr-tiling.ts::cropRgbTile",
|
|
174
|
-
"packages/knowledge/src/extraction/ocr-tiling.ts::filterTiledRegions",
|
|
175
|
-
"packages/knowledge/src/extraction/ocr-tiling.ts::mergeTileRegions",
|
|
176
|
-
"packages/knowledge/src/extraction/office-embedded-images.ts::MIN_EMBEDDED_IMAGE_BYTES",
|
|
177
|
-
"packages/knowledge/src/extraction/office-embedded-images.ts::carveImageCandidates",
|
|
178
|
-
"packages/knowledge/src/extraction/office-embedded-images.ts::carveJpeg",
|
|
179
|
-
"packages/knowledge/src/extraction/office-embedded-images.ts::carvePng",
|
|
180
|
-
"packages/knowledge/src/extraction/paddle-model-select.ts::MIN_ONNX_BYTES",
|
|
181
|
-
"packages/knowledge/src/extraction/paddle-model-select.ts::PADDLE_MODEL_FILES",
|
|
182
|
-
"packages/knowledge/src/extraction/paddle-model-select.ts::PADDLE_MODEL_PRESET"
|
|
183
|
-
],
|
|
184
|
-
"不可判(星号再导出)": []
|
|
185
|
-
},
|
|
186
|
-
"retirementUpdatedAt": "2026-10-13",
|
|
187
|
-
"retirementUpdate": "Removed only the actually deleted CAD collapseAdjacentRepeatedLines export; removed count matches retained roster. No new allowances, baseline regeneration, or relaxation of zero-dead-symbol cap.",
|
|
188
|
-
"retirementCountReconciledAt": "2026-10-10T01:23:32.058Z",
|
|
189
|
-
"retirementCountReconciliation": "Reconciles 296 count to exact existing 294-row test-only export roster after prior two retirements; no rows/allowances added and zero-dead-symbol hard cap retained."
|
|
190
|
-
}
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** 文本引用候选扫描,覆盖源码、测试和脚本,供实际调用闭包审查使用。
|
|
3
|
-
* 新增零引用导出、未处置的仅测试引用与星号转导出候选均阻断;其他增量显式报告。
|
|
4
|
-
* 转导出、动态派发、类型引用与副作用需独立核查,不能据文本数量删除实际入口。
|
|
5
|
-
* 基线只收紧已退休条目;登记仅允许有具体用途的观察/测试面,不能掩盖未接入业务。
|
|
6
|
-
* 用法:node apps/server/scripts/half-built-scan.mjs --full --gate --baseline <file>
|
|
7
|
-
*/
|
|
8
|
-
import fs from 'node:fs';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
import { fileURLToPath } from 'node:url';
|
|
11
|
-
|
|
12
|
-
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
-
const ROOT = path.resolve(HERE, '../../..'); // 仓库根
|
|
14
|
-
const DEFAULT_DIRS = ['apps/server/src', 'packages'];
|
|
15
|
-
const ARGS = process.argv.slice(2);
|
|
16
|
-
const FULL = ARGS.includes('--full');
|
|
17
|
-
const VALUE_FLAGS = new Set(['--baseline', '--write-baseline']);
|
|
18
|
-
const POSITIONAL = [];
|
|
19
|
-
for (let i = 0; i < ARGS.length; i++) {
|
|
20
|
-
if (VALUE_FLAGS.has(ARGS[i])) {
|
|
21
|
-
if (ARGS[i + 1] !== undefined && !ARGS[i + 1].startsWith('--')) i++;
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
if (ARGS[i].startsWith('--')) continue;
|
|
25
|
-
POSITIONAL.push(ARGS[i]);
|
|
26
|
-
}
|
|
27
|
-
const DIRS = POSITIONAL.length > 0 ? POSITIONAL : DEFAULT_DIRS;
|
|
28
|
-
|
|
29
|
-
const GATE = ARGS.includes('--gate');
|
|
30
|
-
const flagValue = name => {
|
|
31
|
-
const i = ARGS.indexOf(name);
|
|
32
|
-
return i >= 0 ? ARGS[i + 1] : undefined;
|
|
33
|
-
};
|
|
34
|
-
const BASELINE_ARG = flagValue('--baseline');
|
|
35
|
-
const WRITE_BASELINE_ARG = flagValue('--write-baseline');
|
|
36
|
-
/** 默认基线路径:与脚本同目录(CI 与本地同一条路径) */
|
|
37
|
-
const DEFAULT_BASELINE = path.join(HERE, 'half-built-scan.baseline.json');
|
|
38
|
-
|
|
39
|
-
const TEST_HINT = /(^|\/)(test|tests|__tests__|__mocks__)\//;
|
|
40
|
-
/** 报告范围:只报 `.ts`/`.tsx` 的导出符号 */
|
|
41
|
-
const isSource = file => /\.(ts|tsx)$/.test(file) && !/\.d\.ts$/.test(file);
|
|
42
|
-
const isPoolFile = file => /\.(ts|tsx|cjs|mjs|js)$/.test(file) && !/\.d\.ts$/.test(file);
|
|
43
|
-
const SKIP_DIRS = new Set(['node_modules', 'dist', '.next', 'coverage']);
|
|
44
|
-
|
|
45
|
-
function walk(dir, out = []) {
|
|
46
|
-
if (!fs.existsSync(dir)) return out;
|
|
47
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
48
|
-
const full = path.join(dir, entry.name);
|
|
49
|
-
if (entry.isDirectory()) {
|
|
50
|
-
if (SKIP_DIRS.has(entry.name)) continue;
|
|
51
|
-
walk(full, out);
|
|
52
|
-
} else if (isPoolFile(full)) out.push(full);
|
|
53
|
-
}
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const REFERENCE_DIRS = ['apps/server/src', 'apps/server/test', 'apps/server/scripts', 'packages', 'scripts'];
|
|
58
|
-
|
|
59
|
-
function starReExportTargets() {
|
|
60
|
-
const targets = new Set();
|
|
61
|
-
for (const file of allFiles) {
|
|
62
|
-
const text = texts.get(file) ?? '';
|
|
63
|
-
for (const m of text.matchAll(/^\s*export \*\s*(?:as\s+\w+\s*)?from\s*'(\.[^']+)'/gm)) {
|
|
64
|
-
const base = path.resolve(path.dirname(file), m[1]);
|
|
65
|
-
for (const cand of [`${base}.ts`, `${base}.tsx`, path.join(base, 'index.ts')]) {
|
|
66
|
-
if (fs.existsSync(cand)) { targets.add(cand); break; }
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return targets;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* ⚠️ **不把 `docs/` 放进引用池**:文档是散文,而且本仓的文档里大量是**缺口清单**
|
|
74
|
-
* ("这条写好没接线")——把清单算成"有引用",会让真死代码因为它被记过一笔而永远不被清理。
|
|
75
|
-
* 文档命中的符号由**人**处置(要么接上、要么连同条目一起删),不交给扫描器自动判。
|
|
76
|
-
* 另一个已知盲区:`.cjs`/`.mjs`/`.js` 消费者(`isSource` 只认 .ts/.tsx)——
|
|
77
|
-
* 实测 `searchKb` 只被 `scripts/upload-matrix.cjs` 用着,曾因此被误判为死代码。
|
|
78
|
-
*/
|
|
79
|
-
const ALL_DIRS = REFERENCE_DIRS;
|
|
80
|
-
const SELF = fileURLToPath(import.meta.url);
|
|
81
|
-
const allFiles = ALL_DIRS.flatMap(dir => walk(path.resolve(ROOT, dir)))
|
|
82
|
-
.filter(file => path.resolve(file) !== path.resolve(SELF));
|
|
83
|
-
const texts = new Map(allFiles.map(f => [f, fs.readFileSync(f, 'utf8')]));
|
|
84
|
-
const prod = allFiles.filter(f => !TEST_HINT.test(f));
|
|
85
|
-
const tests = allFiles.filter(f => TEST_HINT.test(f));
|
|
86
|
-
const scopeRoots = DIRS.map(dir => path.resolve(ROOT, dir));
|
|
87
|
-
const inScope = file => scopeRoots.some(root => file.startsWith(root + path.sep) || file === root);
|
|
88
|
-
/** 被 `export *` 再导出的文件(其符号名不会被任何地方提到 ⇒ 不可判,见上文说明) */
|
|
89
|
-
const STAR_REEXPORTED = starReExportTargets();
|
|
90
|
-
|
|
91
|
-
const EXPORT_PATTERNS = [
|
|
92
|
-
[/^export\s+(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/gm, 'fn'],
|
|
93
|
-
[/^export\s+class\s+([A-Za-z_$][\w$]*)/gm, 'class'],
|
|
94
|
-
[/^export\s+(?:const|let|var)\s+([A-Za-z_$][\w$]*)/gm, 'const'],
|
|
95
|
-
];
|
|
96
|
-
|
|
97
|
-
function countRefs(name, pool, selfFile, subtractDeclaration) {
|
|
98
|
-
const re = new RegExp(`\\b${name.replace(/\$/g, '\\$')}\\b`, 'g');
|
|
99
|
-
let total = 0;
|
|
100
|
-
for (const file of pool) {
|
|
101
|
-
let hits = (texts.get(file).match(re) || []).length;
|
|
102
|
-
if (subtractDeclaration && file === selfFile) {
|
|
103
|
-
const decl = new RegExp(`^export\\s+(async\\s+)?(function|class|const|let|var)\\s+${name.replace(/\$/g, '\\$')}\\b`, 'gm');
|
|
104
|
-
hits -= (texts.get(file).match(decl) || []).length;
|
|
105
|
-
}
|
|
106
|
-
total += Math.max(0, hits);
|
|
107
|
-
}
|
|
108
|
-
return total;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const rows = [];
|
|
112
|
-
for (const file of prod) {
|
|
113
|
-
if (!inScope(file)) continue; // 报告范围 = 参数;引用池 = 全仓
|
|
114
|
-
const rel = path.relative(ROOT, file);
|
|
115
|
-
const text = texts.get(file);
|
|
116
|
-
for (const [pattern, kind] of EXPORT_PATTERNS) {
|
|
117
|
-
for (const match of text.matchAll(pattern)) {
|
|
118
|
-
const name = match[1];
|
|
119
|
-
if (name.length < 4) continue;
|
|
120
|
-
const inFile = countRefs(name, [file], file, true);
|
|
121
|
-
const otherProd = countRefs(name, prod.filter(f => f !== file), file, false);
|
|
122
|
-
const testRefs = countRefs(name, tests, file, false);
|
|
123
|
-
if (otherProd > 0) continue;
|
|
124
|
-
rows.push({
|
|
125
|
-
rel, name, kind, inFile, testRefs,
|
|
126
|
-
verdict: STAR_REEXPORTED.has(file) ? '不可判(星号再导出)'
|
|
127
|
-
: inFile === 0 && testRefs === 0 ? '谁都不用'
|
|
128
|
-
: inFile === 0 && testRefs > 0 ? '半成品嫌疑'
|
|
129
|
-
: '封装暴露(只导出给测试)',
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const byVerdict = verdict => rows.filter(r => r.verdict === verdict);
|
|
136
|
-
const suspect = byVerdict('半成品嫌疑');
|
|
137
|
-
const unused = byVerdict('谁都不用');
|
|
138
|
-
const undecidable = byVerdict('不可判(星号再导出)');
|
|
139
|
-
|
|
140
|
-
const ALLOW_PATH = path.join(HERE, 'half-built-scan.allow.json');
|
|
141
|
-
const allowed = (() => {
|
|
142
|
-
try {
|
|
143
|
-
const file = JSON.parse(fs.readFileSync(ALLOW_PATH, 'utf8'));
|
|
144
|
-
const map = new Map();
|
|
145
|
-
for (const entry of file.entries || []) map.set(`${entry.file}::${entry.symbol}`, entry.reason);
|
|
146
|
-
return map;
|
|
147
|
-
} catch {
|
|
148
|
-
return new Map();
|
|
149
|
-
}
|
|
150
|
-
})();
|
|
151
|
-
const registered = suspect.filter(row => allowed.has(`${row.rel}::${row.name}`));
|
|
152
|
-
const unregistered = suspect.filter(row => !allowed.has(`${row.rel}::${row.name}`));
|
|
153
|
-
const undecidableRegistered = undecidable.filter(row => allowed.has(`${row.rel}::${row.name}`));
|
|
154
|
-
const undecidableUnregistered = undecidable.filter(row => !allowed.has(`${row.rel}::${row.name}`));
|
|
155
|
-
|
|
156
|
-
console.log('════════ 半成品扫描 ════════');
|
|
157
|
-
console.log(`扫描范围:${DIRS.join(', ')}(引用池 = 全仓 ${prod.length} 个生产文件 / ${tests.length} 个测试文件)`);
|
|
158
|
-
console.log(`导出符号在他处生产零引用:${rows.length}`);
|
|
159
|
-
console.log(` · 半成品嫌疑(仅测试引用) ${suspect.length}(**未登记 ${unregistered.length}** / 已登记 ${registered.length})`);
|
|
160
|
-
console.log(` · 谁都不用(含自身文件) ${unused.length}`);
|
|
161
|
-
console.log(` · 封装暴露(本文件内自用) ${byVerdict('封装暴露(只导出给测试)').length}`);
|
|
162
|
-
console.log(` · 不可判(星号再导出) ${undecidable.length}(**未登记 ${undecidableUnregistered.length}** / 已登记 ${undecidableRegistered.length})`);
|
|
163
|
-
|
|
164
|
-
if (ARGS.includes('--csv')) {
|
|
165
|
-
console.log('file,name,kind,inFile,testRefs,verdict');
|
|
166
|
-
for (const row of rows) {
|
|
167
|
-
console.log([row.rel, row.name, row.kind, row.inFile, row.testRefs, row.verdict].join(','));
|
|
168
|
-
}
|
|
169
|
-
process.exit(0);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const print = (title, list, limit = 40) => {
|
|
173
|
-
if (list.length === 0) return;
|
|
174
|
-
console.log(`\n── ${title}(${list.length} 条${FULL ? '' : `,列前 ${Math.min(limit, list.length)}`})`);
|
|
175
|
-
for (const row of (FULL ? list : list.slice(0, limit))) {
|
|
176
|
-
console.log(` ${row.rel} :: ${row.name}${row.testRefs ? ` (测试引用 ${row.testRefs})` : ''}`);
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
print('半成品嫌疑 未登记(**要当场判**:接线 / 删除 / 写进登记表并给理由)', unregistered);
|
|
180
|
-
print('半成品嫌疑 已登记(测试/观察/登记面,理由见 half-built-scan.allow.json)', registered);
|
|
181
|
-
if (registered.length > 0 && FULL) {
|
|
182
|
-
for (const row of registered) console.log(` · ${row.rel} :: ${row.name} —— ${allowed.get(`${row.rel}::${row.name}`)}`);
|
|
183
|
-
}
|
|
184
|
-
print('谁都不用', unused, 30);
|
|
185
|
-
print('不可判(星号再导出:符号可达但没有名字被提到,本脚本判不了)', undecidable, 10);
|
|
186
|
-
|
|
187
|
-
console.log('\n当前方案见 docs/project-improvements/README.md;实际入口、动态注册和公开接口须独立核查。');
|
|
188
|
-
console.log('本扫描仅提供文本引用候选;转导出、动态入口、内部可达依赖和副作用需按实际调用另行核查。');
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* 口径全文在文件头「## 门禁口径(G2)」一节。这里只写实现锚点:
|
|
192
|
-
* - **四类计数 + 四类名录**都进基线(名录让"新增了什么"可以逐条打出来,而不是只给一个差值);
|
|
193
|
-
* - **只有「谁都不用」红**;其余三类超基线只 `⚠`(理由:366 条"封装暴露"是刻意形态,
|
|
194
|
-
* 判红 = 每加一个测试用导出就挂 CI = 门禁当天就该被绕过);
|
|
195
|
-
* - 基线文件缺失时「谁都不用」按 **0** 判(零容忍),其余三类不做棘轮比较(没有基线就没有差值)。
|
|
196
|
-
*/
|
|
197
|
-
const VERDICT_KEYS = ['谁都不用', '半成品嫌疑', '封装暴露(只导出给测试)', '不可判(星号再导出)'];
|
|
198
|
-
const GATED_KEY = '谁都不用';
|
|
199
|
-
const counts = Object.fromEntries(VERDICT_KEYS.map(key => [key, rows.filter(row => row.verdict === key).length]));
|
|
200
|
-
const roster = Object.fromEntries(VERDICT_KEYS.map(key => [
|
|
201
|
-
key,
|
|
202
|
-
rows.filter(row => row.verdict === key).map(row => `${row.rel}::${row.name}`).sort(),
|
|
203
|
-
]));
|
|
204
|
-
|
|
205
|
-
/** 基线文件路径:`--baseline <file>` 显式给的优先;`--write-baseline [file]` 同理 */
|
|
206
|
-
const writeBaselineTarget = WRITE_BASELINE_ARG !== undefined && !WRITE_BASELINE_ARG.startsWith('--')
|
|
207
|
-
? WRITE_BASELINE_ARG
|
|
208
|
-
: DEFAULT_BASELINE;
|
|
209
|
-
const baselinePath = BASELINE_ARG ? path.resolve(process.cwd(), BASELINE_ARG) : DEFAULT_BASELINE;
|
|
210
|
-
|
|
211
|
-
if (ARGS.includes('--write-baseline')) {
|
|
212
|
-
const target = path.resolve(process.cwd(), writeBaselineTarget);
|
|
213
|
-
fs.writeFileSync(target, `${JSON.stringify({
|
|
214
|
-
note: '半成品扫描门禁基线(棘轮:数不许变多)。重新生成:node apps/server/scripts/half-built-scan.mjs --write-baseline',
|
|
215
|
-
generatedAt: new Date().toISOString().slice(0, 10),
|
|
216
|
-
scope: DIRS,
|
|
217
|
-
counts,
|
|
218
|
-
roster,
|
|
219
|
-
}, null, 2)}\n`, 'utf8');
|
|
220
|
-
console.log(`\n★ 已写入基线:${path.relative(ROOT, target)}(谁都不用 ${counts[GATED_KEY]} 条)`);
|
|
221
|
-
process.exit(0);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (GATE) {
|
|
225
|
-
let baseline = { counts: {}, roster: {} };
|
|
226
|
-
let baselineNote = '未提供(「谁都不用」按 0 零容忍判;其余三类不做棘轮比较)';
|
|
227
|
-
if (fs.existsSync(baselinePath)) {
|
|
228
|
-
baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
|
|
229
|
-
baselineNote = `${path.relative(ROOT, baselinePath)}(生成于 ${baseline.generatedAt ?? '未知'})`;
|
|
230
|
-
} else if (BASELINE_ARG) {
|
|
231
|
-
// 显式给了路径却不存在 = 大概率是路径写错。**不静默降级**:报出来,免得基线悄悄失效。
|
|
232
|
-
console.log(`\n⚠ 基线文件不存在:${baselinePath}(按「谁都不用 = 0」零容忍口径继续)`);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const baselineRoster = key => new Set(Array.isArray(baseline.roster?.[key]) ? baseline.roster[key] : []);
|
|
236
|
-
const currentRoster = key => new Set(roster[key]);
|
|
237
|
-
const grew = key => [...currentRoster(key)].filter(id => !baselineRoster(key).has(id));
|
|
238
|
-
const shrank = key => [...baselineRoster(key)].filter(id => !currentRoster(key).has(id));
|
|
239
|
-
|
|
240
|
-
console.log('\n════════ 门禁判定(--gate)════════');
|
|
241
|
-
console.log(`基线:${baselineNote}`);
|
|
242
|
-
const gatedBaseline = typeof baseline.counts?.[GATED_KEY] === 'number' ? baseline.counts[GATED_KEY] : 0;
|
|
243
|
-
console.log(`【硬红】${GATED_KEY}:${counts[GATED_KEY]} 条(基线允许 ≤ ${gatedBaseline})`);
|
|
244
|
-
for (const key of VERDICT_KEYS) {
|
|
245
|
-
if (key === GATED_KEY) continue;
|
|
246
|
-
const base = baseline.counts?.[key];
|
|
247
|
-
console.log(`【只报】${key}:${counts[key]} 条${typeof base === 'number' ? `(基线 ${base})` : ''}`);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const newDead = grew(GATED_KEY);
|
|
251
|
-
const vanishedDead = shrank(GATED_KEY);
|
|
252
|
-
const baselineScope = Array.isArray(baseline.scope) ? baseline.scope.join(',') : '';
|
|
253
|
-
const scopeMismatch = baselineScope !== '' && baselineScope !== DIRS.join(',');
|
|
254
|
-
let failed = scopeMismatch || counts[GATED_KEY] > gatedBaseline || newDead.length > 0 || unregistered.length > 0 || undecidableUnregistered.length > 0;
|
|
255
|
-
if (scopeMismatch) {
|
|
256
|
-
console.log(`\n❌ 门禁红:扫描范围与基线不一致,计数不可比`);
|
|
257
|
-
console.log(` 基线:${baselineScope}`);
|
|
258
|
-
console.log(` 本次:${DIRS.join(',')}`);
|
|
259
|
-
console.log(' 要门禁局部范围,请先用同一范围重跑 --write-baseline 另存一份基线。');
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
for (const key of VERDICT_KEYS) {
|
|
263
|
-
if (key === GATED_KEY) continue;
|
|
264
|
-
const delta = grew(key);
|
|
265
|
-
if (delta.length > 0) {
|
|
266
|
-
console.log(`⚠ 棘轮超基线(不红):${key} 比基线多 ${delta.length} 条 —— 新增项:`);
|
|
267
|
-
for (const id of delta) console.log(` ${id}`);
|
|
268
|
-
console.log(' (这一类**刻意不红**:它含大量"只导出给测试"的合法形态,判红等于焊死门禁。见文件头「门禁口径」)');
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
if (newDead.length > 0) {
|
|
273
|
-
console.log(`\n❌ 门禁红:新增 ${newDead.length} 个「谁都不用」的**真死符号**(生产零调用 ∧ 测试零引用 ∧ 本文件零自用)`);
|
|
274
|
-
for (const id of newDead) console.log(` ${id}`);
|
|
275
|
-
console.log(' 处置二选一(不许留着):接到生产调用点,或按 P5 纪律连同它的路径一起删除。');
|
|
276
|
-
} else if (counts[GATED_KEY] > gatedBaseline) {
|
|
277
|
-
console.log(`\n❌ 门禁红:${GATED_KEY} ${counts[GATED_KEY]} 条 > 基线允许的 ${gatedBaseline} 条(名单与基线一致,是基线本身过宽)`);
|
|
278
|
-
}
|
|
279
|
-
if (vanishedDead.length > 0) {
|
|
280
|
-
console.log(`\n★ 棘轮可收紧:${GATED_KEY} 比基线少 ${vanishedDead.length} 条 —— 请重跑 --write-baseline 把它固化(棘轮只许往下走)`);
|
|
281
|
-
for (const id of vanishedDead) console.log(` ${id}`);
|
|
282
|
-
}
|
|
283
|
-
if (!failed && newDead.length === 0) {
|
|
284
|
-
console.log(`\n✅ 门禁通过:${GATED_KEY} ${counts[GATED_KEY]} 条,无新增真死符号。`);
|
|
285
|
-
}
|
|
286
|
-
process.exit(failed ? 1 : 0);
|
|
287
|
-
}
|