@vcp-dev/contracts 0.6.11 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +5 -4
  2. package/dist/business-facts.d.ts +23 -0
  3. package/dist/cms-page-directory.d.ts +40 -4
  4. package/dist/colorway-distinctness.js +1 -1
  5. package/dist/connect-dynamic-collection.d.ts +6 -6
  6. package/dist/connect-form.d.ts +6 -6
  7. package/dist/conversion-hints.d.ts +37 -0
  8. package/dist/crawler-task-service.d.ts +244 -2
  9. package/dist/custom-domain.d.ts +119 -239
  10. package/dist/customer-materials.d.ts +5 -5
  11. package/dist/deployment-lifecycle.d.ts +45 -0
  12. package/dist/design-tokens.d.ts +1 -0
  13. package/dist/design-tokens.js +1 -1
  14. package/dist/e2b-preview-proxy.d.ts +5 -0
  15. package/dist/external-site-edit.d.ts +9 -0
  16. package/dist/firecrawl-internal.d.ts +19 -0
  17. package/dist/font-catalog.d.ts +5 -2
  18. package/dist/form-design.d.ts +54 -12
  19. package/dist/google-search-console.d.ts +1 -0
  20. package/dist/index.d.ts +3095 -818
  21. package/dist/index.js +1 -1
  22. package/dist/industry-classification.d.ts +43 -0
  23. package/dist/input-context-bundle.d.ts +10 -0
  24. package/dist/internal-entity-id.d.ts +1 -0
  25. package/dist/knowledge-category.d.ts +20 -0
  26. package/dist/knowledge-source-readiness.d.ts +94 -0
  27. package/dist/launcher-prompt-templates.d.ts +117 -14
  28. package/dist/migration-products.d.ts +45 -0
  29. package/dist/page-slug.d.ts +2 -0
  30. package/dist/page-template.d.ts +95 -0
  31. package/dist/site-build.d.ts +563 -0
  32. package/dist/site-design-presets.d.ts +20 -0
  33. package/dist/site-edit-capability.d.ts +13 -1
  34. package/dist/site-edit-class-name-source.d.ts +40 -8
  35. package/dist/site-edit-command-result.d.ts +15 -4
  36. package/dist/site-edit-composition.d.ts +13 -0
  37. package/dist/site-edit-event.d.ts +68 -14
  38. package/dist/site-edit-history-status.d.ts +193 -0
  39. package/dist/site-edit-operation.d.ts +152 -51
  40. package/dist/site-edit-page-composition.d.ts +101 -22
  41. package/dist/site-edit-patch-plan.d.ts +49 -3
  42. package/dist/site-edit-render-document.d.ts +54 -8
  43. package/dist/site-edit-session.d.ts +5 -2
  44. package/dist/site-edit-source.d.ts +60 -11
  45. package/dist/site-edit-version.d.ts +1 -1
  46. package/dist/site-extra-requirement.d.ts +31 -0
  47. package/dist/site-locale.d.ts +20 -0
  48. package/dist/site-localization-fields.d.ts +196 -0
  49. package/dist/site-localization-scope.d.ts +95 -0
  50. package/dist/site-preview.d.ts +15 -0
  51. package/dist/site-publish-domain.d.ts +680 -0
  52. package/dist/site-publish-workflow.d.ts +612 -0
  53. package/dist/site-workflow-completions.d.ts +163 -0
  54. package/dist/site-workflow.d.ts +231 -211
  55. package/dist/sitemap-navigation.d.ts +4 -1
  56. package/dist/step2-page-selection.d.ts +88 -0
  57. package/dist/step2-site-initialization.d.ts +321 -30
  58. package/dist/step3-digital-employee-analysis.d.ts +177 -211
  59. package/dist/step4-diagnosis.d.ts +72 -4
  60. package/dist/step5-strategy.d.ts +5549 -170
  61. package/dist/step6-design.d.ts +778 -464
  62. package/dist/subsite-localization-input.d.ts +121 -0
  63. package/dist/subsite-mount-path.d.ts +23 -0
  64. package/dist/subsite-visible-text-export.d.ts +22 -0
  65. package/dist/template-upgrade-observability.d.ts +2 -2
  66. package/dist/theme-presets.d.ts +56 -1
  67. package/dist/workspace-design-apply.d.ts +5 -0
  68. package/dist/workspace-resource-operation.d.ts +58 -24
  69. package/package.json +1 -1
  70. package/dist/publish-quality.d.ts +0 -92
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * 整站补充需求:用户在 Step5 十一张卡下面自己写的一段话。
4
+ *
5
+ * 为什么放在 Step5 底部:它要影响有哪些页面,而页面由 sitemap 决定,sitemap 在
6
+ * 用户落到结构规划页的那一刻就自动开始生成,中间没有任何停顿 —— 离开 Step5 就
7
+ * 来不及。也因此它不是卡内备注:卡内备注各限 200 字、只管那张卡的范围。
8
+ *
9
+ * 优先级:低于十一张卡已拍板的策略(那是用户逐项确认过的结论),高于单张卡的
10
+ * 备注。原样透传,不做任何字符串替换、截断关键词或正则规整。
11
+ */
12
+ export declare const SITE_EXTRA_REQUIREMENT_MAX_LENGTH = 2000;
13
+ export declare const SiteExtraRequirementSchema: z.ZodObject<{
14
+ note: z.ZodString;
15
+ updated_at: z.ZodString;
16
+ }, z.core.$strict>;
17
+ export type SiteExtraRequirement = z.infer<typeof SiteExtraRequirementSchema>;
18
+ /** 浏览器提交:清空时发空串,服务端据此删除已存的内容。 */
19
+ export declare const SaveSiteExtraRequirementRequestSchema: z.ZodObject<{
20
+ note: z.ZodString;
21
+ }, z.core.$strict>;
22
+ export type SaveSiteExtraRequirementRequest = z.infer<typeof SaveSiteExtraRequirementRequestSchema>;
23
+ export declare const SiteExtraRequirementResponseSchema: z.ZodObject<{
24
+ code: z.ZodNumber;
25
+ data: z.ZodNullable<z.ZodObject<{
26
+ note: z.ZodString;
27
+ updated_at: z.ZodString;
28
+ }, z.core.$strict>>;
29
+ message: z.ZodString;
30
+ }, z.core.$strip>;
31
+ export type SiteExtraRequirementResponse = z.infer<typeof SiteExtraRequirementResponseSchema>;
@@ -25,6 +25,26 @@ export declare const DEFAULT_SITE_LOCALE: SiteLocale;
25
25
  export declare function resolveSiteTextDirection(locale: SiteLocale): SiteTextDirection;
26
26
  export declare const ISO_639_3_TO_SITE_LOCALE: Readonly<Record<string, SiteLocale>>;
27
27
  export declare function resolveSiteLocaleFromIso6393(iso6393: string): SiteLocale;
28
+ /**
29
+ * 书写系统非拉丁的 locale 闭集。用于 DesignPlan Stage A 的 SEO 关键词分流。
30
+ *
31
+ * step5 关键词强制 English ASCII(`step5-strategy.ts` 的 superRefine),而
32
+ * DesignPlan 有两条相反硬指令:`Never mix languages within visitor-facing copy.`
33
+ * 与「所有 SEO 文案须写成站点 locale」。非拉丁书写系统站点逐字注入英文关键词
34
+ * 即构成混语,因此这些 locale 只把关键词当语义主题信号,由模型用站点语种自行
35
+ * 表达。
36
+ *
37
+ * 写成显式常量清单而不是运行时推断:SiteLocale 是闭集枚举(47 selectable +
38
+ * 43 legacy),不是任意 BCP-47,推断只会引入不可控误判。`sr` 与 `mn-MN` 通行
39
+ * 西里尔,保守归入非拉丁。清单由单测锁死为 SITE_LOCALE_CODES 的子集,防止
40
+ * 新增 locale 时漏更新而静默按拉丁系处理。
41
+ */
42
+ export declare const NON_LATIN_SITE_LOCALE_CODES: readonly ["zh-CN", "zh-HK", "zh-TW", "ja-JP", "ja", "ko-KR", "ko", "ru-RU", "ru", "uk-UA", "uk", "bg", "sr", "mn-MN", "kk-KZ", "ar-SA", "ar", "fa-IR", "fa", "he", "hi", "th-TH", "th", "el-GR", "el", "ka-GE", "bn-BD", "bn", "ta-IN", "ta", "si-LK", "my-MM", "km-KH", "lo-LA"];
43
+ /**
44
+ * 判定站点产出语种是否使用非拉丁书写系统。入参用宽松的 string:调用方拿到的
45
+ * locale 可能来自历史持久化值,不认识的一律按拉丁系处理(不抛、不阻断)。
46
+ */
47
+ export declare function isNonLatinSiteLocale(locale: string): boolean;
28
48
  export declare const SiteLocaleSchema: z.ZodEnum<{
29
49
  id: "id";
30
50
  "zh-CN": "zh-CN";
@@ -0,0 +1,196 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * 生成站点里三种**混合结构**的可本地化字段路径清单。
4
+ *
5
+ * ## 混合结构是什么
6
+ *
7
+ * 子站本地化的作用域判据是文件白名单:`components/site/generated/**` 与 `app/**`
8
+ * 装的是每站自己的内容,其余是模板层。白名单解决「哪些**文件**要翻」,解决不了
9
+ * 「一个文件里哪些**字段**要翻」——白名单内有几处声明同时躺着访客读的文案和站点
10
+ * 赖以工作的机器值,整文件翻或整文件不翻都错。表单规格
11
+ * (`FORM_SPEC_LOCALIZABLE_FIELD_PATHS`)是第一个这样收口的,本文件是同一套范式的
12
+ * 另外三份:
13
+ *
14
+ * - **`PAGE_SEO`**(每个路由段一份的页面 SEO 声明):`title` / `description` 是
15
+ * 浏览器标签页与搜索结果里的文案,必须翻;`path` 是页面注册到 CMS 的路由键,
16
+ * 被 `buildPageMetadata` 拿去做 `seo.pageSeo(decl.path)` 查询,译掉之后查询静默
17
+ * 落空、整页 SEO 元数据全部丢失且不报错。
18
+ * - **根布局 `metadata`**(平台确定性产出的站级元数据):站名、标题模板、
19
+ * OpenGraph / Twitter 的标题与描述是文案;`metadataBase`、`openGraph.type`、
20
+ * `twitter.card`、各类图片地址是机器值。
21
+ * - **`NAV_ITEMS`**(导航静态兜底数据):`label` 是导航上印着的字;`href` 是路由、
22
+ * `targetType` 是渲染分支的判别式、`iconKey` 是图标注册表的键。
23
+ *
24
+ * ## 为什么是字段路径清单,不是字段名词表
25
+ *
26
+ * 字段名黑名单在这条路上已经被证伪过四轮:它是在**开放集合**上猜下一个生成器
27
+ * 字段叫什么,每漏一个都是一次无声失效。这里走的是封闭集合——每个结构的字段由
28
+ * 生成侧的类型钉死,清单逐条列出来,**没列到的一律不翻**。
29
+ *
30
+ * 清单同时是**形状识别**的依据:可译半边与机器半边合起来就是「这个结构长什么样」
31
+ * 的全集。抽取器见到已登记的声明、却在里面读到清单外的字段路径时,不是把那一个
32
+ * 字段跳过就算了,而是整份文件本轮不翻并记降级——否则声明一变形就静默退回旧的
33
+ * 宽松路径,清单等于没写。
34
+ *
35
+ * ## 通配段
36
+ *
37
+ * - `*`:数组下标(查表前把具体下标归一成这一段)。
38
+ * - `**`:**本段及其整棵子树**。只用在取值形状开放、无法逐字段枚举的地方
39
+ * (`schema_json` 是任意 JSON-LD,`meta_tags_json` 是键由 CMS 决定的开放记录)。
40
+ * 这两处按机器值整体处理是**故意往漏翻倒**:真有一天生成侧往里写文案,结果是
41
+ * 那段不被翻译(可见、可查),而不是把结构化数据译坏(静默、难查)。
42
+ */
43
+ /** 已登记的混合结构。取值与抽取器的单元 `kind` 同名,便于对读。 */
44
+ export declare const SITE_LOCALIZATION_STRUCTURES: readonly ["page-seo", "root-layout-metadata", "nav-items"];
45
+ export type SiteLocalizationStructure = (typeof SITE_LOCALIZATION_STRUCTURES)[number];
46
+ /**
47
+ * `PAGE_SEO` 声明的形状,与生成站点 `lib/cms/metadata.ts` 的 `PageSeoDecl` 对齐。
48
+ *
49
+ * 只用于把下面两份清单钉在一份可枚举的 schema 上(穷举用例会走遍它的每个字符串
50
+ * 叶子);本地化链路判定用的是清单,不是这份 schema——抽取器面对的是**源码 AST**,
51
+ * 手里没有可校验的取值。
52
+ *
53
+ * `meta_tags_json` 的真实类型是 `{ og?, twitter? }` 两个开放记录,这里放宽成一层
54
+ * 开放记录:反正整棵子树按机器值处理,放宽只会让「未知字段」判得更宽松一点,
55
+ * 不会让任何机器值漏出去。
56
+ */
57
+ export declare const PageSeoDeclSchema: z.ZodObject<{
58
+ path: z.ZodString;
59
+ title: z.ZodString;
60
+ description: z.ZodOptional<z.ZodString>;
61
+ keywords: z.ZodOptional<z.ZodString>;
62
+ meta_tags_json: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>>;
63
+ schema_json: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>, z.ZodString]>>>;
64
+ breadcrumbs_json: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
65
+ name: z.ZodOptional<z.ZodString>;
66
+ text: z.ZodOptional<z.ZodString>;
67
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
68
+ }, z.core.$strip>>>>;
69
+ }, z.core.$strip>;
70
+ /**
71
+ * 根布局 `export const metadata` 的形状。
72
+ *
73
+ * 上游 `next` 的 `Metadata` 是一个极大的开放类型,这里**只**声明本仓库真正会写进
74
+ * 根布局的那些键:平台确定性产出的那一段(站名 / 标题模板 / 描述 / OpenGraph /
75
+ * Twitter)、模板自带的那一段(`metadataBase` + 扁平 `title` / `description`),
76
+ * 外加 `buildPageMetadata` 组装出来的 `title.absolute`、`alternates.canonical`、
77
+ * `keywords`、`openGraph.url` / `locale`——它们今天只出现在运行时返回值里,但形状
78
+ * 同源,一并登记免得哪天被内联进源码时整份文件停翻。
79
+ *
80
+ * 这里**没有**声明 `robots` / `icons` / `verification` 等其余 Next 元数据键:真出现
81
+ * 了就是「已登记结构长出了没登记的字段」,按设计整文件本轮不翻并记降级,由人来
82
+ * 决定新键是文案还是机器值。这是清单相对上游开放类型必然会漂的那一面,方向安全。
83
+ */
84
+ export declare const RootLayoutMetadataSchema: z.ZodObject<{
85
+ metadataBase: z.ZodOptional<z.ZodString>;
86
+ title: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
87
+ default: z.ZodOptional<z.ZodString>;
88
+ template: z.ZodOptional<z.ZodString>;
89
+ absolute: z.ZodOptional<z.ZodString>;
90
+ }, z.core.$strip>]>>;
91
+ description: z.ZodOptional<z.ZodString>;
92
+ keywords: z.ZodOptional<z.ZodString>;
93
+ openGraph: z.ZodOptional<z.ZodObject<{
94
+ title: z.ZodOptional<z.ZodString>;
95
+ description: z.ZodOptional<z.ZodString>;
96
+ type: z.ZodOptional<z.ZodString>;
97
+ siteName: z.ZodOptional<z.ZodString>;
98
+ url: z.ZodOptional<z.ZodString>;
99
+ locale: z.ZodOptional<z.ZodString>;
100
+ images: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
101
+ url: z.ZodString;
102
+ alt: z.ZodOptional<z.ZodString>;
103
+ }, z.core.$strip>]>>>;
104
+ }, z.core.$strip>>;
105
+ twitter: z.ZodOptional<z.ZodObject<{
106
+ card: z.ZodOptional<z.ZodString>;
107
+ title: z.ZodOptional<z.ZodString>;
108
+ description: z.ZodOptional<z.ZodString>;
109
+ images: z.ZodOptional<z.ZodArray<z.ZodString>>;
110
+ }, z.core.$strip>>;
111
+ alternates: z.ZodOptional<z.ZodObject<{
112
+ canonical: z.ZodOptional<z.ZodString>;
113
+ }, z.core.$strip>>;
114
+ }, z.core.$strip>;
115
+ /**
116
+ * `NAV_ITEMS` 的一条,与 `@vcp/sitemap` 的 `NavItem` 对齐(分组条目是同一批字段的
117
+ * 子集,这里合成一个可选字段的对象,不拆联合)。
118
+ *
119
+ * 只展开一层 `children`:导航是**同构树**,字段语义只取决于叶子字段名、与嵌套深度
120
+ * 无关,因此查表前会把下标与 `children` 层一并归一掉(见
121
+ * {@link isSiteStructureLocalizableFieldPath})。展开两层只是为了让穷举用例能看到
122
+ * 嵌套那一层确实没有新字段。
123
+ */
124
+ export declare const NavItemSchema: z.ZodObject<{
125
+ label: z.ZodString;
126
+ href: z.ZodOptional<z.ZodString>;
127
+ targetType: z.ZodOptional<z.ZodEnum<{
128
+ file: "file";
129
+ external: "external";
130
+ anchor: "anchor";
131
+ email: "email";
132
+ page: "page";
133
+ phone: "phone";
134
+ group: "group";
135
+ }>>;
136
+ role: z.ZodOptional<z.ZodEnum<{
137
+ link: "link";
138
+ cta: "cta";
139
+ }>>;
140
+ openInNewTab: z.ZodOptional<z.ZodBoolean>;
141
+ nofollow: z.ZodOptional<z.ZodBoolean>;
142
+ description: z.ZodOptional<z.ZodString>;
143
+ badge: z.ZodOptional<z.ZodString>;
144
+ iconKey: z.ZodOptional<z.ZodString>;
145
+ children: z.ZodOptional<z.ZodArray<z.ZodObject<{
146
+ label: z.ZodString;
147
+ href: z.ZodOptional<z.ZodString>;
148
+ targetType: z.ZodOptional<z.ZodEnum<{
149
+ file: "file";
150
+ external: "external";
151
+ anchor: "anchor";
152
+ email: "email";
153
+ page: "page";
154
+ phone: "phone";
155
+ group: "group";
156
+ }>>;
157
+ role: z.ZodOptional<z.ZodEnum<{
158
+ link: "link";
159
+ cta: "cta";
160
+ }>>;
161
+ openInNewTab: z.ZodOptional<z.ZodBoolean>;
162
+ nofollow: z.ZodOptional<z.ZodBoolean>;
163
+ description: z.ZodOptional<z.ZodString>;
164
+ badge: z.ZodOptional<z.ZodString>;
165
+ iconKey: z.ZodOptional<z.ZodString>;
166
+ }, z.core.$strip>>>;
167
+ }, z.core.$strip>;
168
+ /** `PAGE_SEO` 里该翻的字段路径。 */
169
+ export declare const PAGE_SEO_LOCALIZABLE_FIELD_PATHS: readonly ["title", "description", "keywords", "breadcrumbs_json.*.name", "breadcrumbs_json.*.text"];
170
+ /** `PAGE_SEO` 里必须逐字节留下的字段路径。 */
171
+ export declare const PAGE_SEO_MACHINE_FIELD_PATHS: readonly ["path", "meta_tags_json.**", "schema_json.**", "breadcrumbs_json.*.url"];
172
+ /** 根布局 `metadata` 里该翻的字段路径。 */
173
+ export declare const ROOT_LAYOUT_METADATA_LOCALIZABLE_FIELD_PATHS: readonly ["title", "title.default", "title.template", "title.absolute", "description", "keywords", "openGraph.title", "openGraph.description", "openGraph.siteName", "openGraph.images.*.alt", "twitter.title", "twitter.description"];
174
+ /** 根布局 `metadata` 里必须逐字节留下的字段路径。 */
175
+ export declare const ROOT_LAYOUT_METADATA_MACHINE_FIELD_PATHS: readonly ["metadataBase", "openGraph.type", "openGraph.url", "openGraph.locale", "openGraph.images.*", "openGraph.images.*.url", "twitter.card", "twitter.images.*", "alternates.canonical"];
176
+ /**
177
+ * `NAV_ITEMS` 里该翻的字段路径。写成**叶子字段名**:查表前下标与 `children` 层会被
178
+ * 归一掉,`NAV_ITEMS[2].children[0].label` 与 `NAV_ITEMS[0].label` 查的是同一条。
179
+ */
180
+ export declare const NAV_ITEMS_LOCALIZABLE_FIELD_PATHS: readonly ["label", "description", "badge"];
181
+ /** `NAV_ITEMS` 里必须逐字节留下的字段路径。 */
182
+ export declare const NAV_ITEMS_MACHINE_FIELD_PATHS: readonly ["href", "targetType", "role", "iconKey"];
183
+ /**
184
+ * 这条字段路径是不是该结构里**该翻**的文案。
185
+ *
186
+ * 失败即关闭:清单没点名的一律报「不可本地化」,包括本合同不认识的结构形态。
187
+ */
188
+ export declare function isSiteStructureLocalizableFieldPath(structure: SiteLocalizationStructure, path: readonly (string | number)[]): boolean;
189
+ /**
190
+ * 这条字段路径是不是该结构里**认得出**的位置——命中任一清单,或者还只是通往清单
191
+ * 某条目的中间层(`openGraph` 通往 `openGraph.title`)。
192
+ *
193
+ * 这是「见到声明却没识别 → 整文件不译」的判据。空路径(结构自身、导航条目自身)
194
+ * 恒为真:那是入口,不是字段。
195
+ */
196
+ export declare function isSiteStructureKnownFieldPath(structure: SiteLocalizationStructure, path: readonly (string | number)[]): boolean;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * 生成站点里**由平台物化器确定性产出**的文件清单:子站本地化的文本阶段整份跳过
3
+ * 它们。
4
+ *
5
+ * ## 为什么白名单不够
6
+ *
7
+ * 文本阶段的作用域判据是目录白名单(`components/site/generated/**` 与 `app/**`:
8
+ * 每站自己的内容)。它挡住了模板层与配置层,挡不住白名单**内部**的另一类文件——
9
+ * `apps/agent` 的物化器按平台源码常量写进快照的那些。它们躺在生成目录里,长得像
10
+ * 每站内容,实际上每个站逐字节相同。
11
+ *
12
+ * 决定性的机制是:**物化器重跑时整份覆写**。`materializeCanonicalFormRuntime` 读到
13
+ * 快照里的 `FORM_RUNTIME_VERSION` 不高于平台当前版本,就把整份内容换成
14
+ * `VCP_FORM_RUNTIME_SOURCE`;`buildMigrationProductFiles` 的五份产物走
15
+ * `apply_patch_batch` 的 `full_content` 整份写入;product-search 物化器逐份比对内容,
16
+ * 不一致就覆写。也就是说,A2 往这些文件里写的译文会被**静默还原,且不报任何错**。
17
+ * 翻译它们不只是越界,是做无用功且不可见。
18
+ *
19
+ * 正确的归属是**平台按目标语言直接产出**(`migrationEmptyProductsLabel` 与表单
20
+ * runtime 自带的语种表已经是这个形状,只是当前只覆盖少数语种)。本清单先把它们摘
21
+ * 出翻译范围,语种覆盖是平台侧的后续工作。
22
+ *
23
+ * ## 收录判据(两条同时成立)
24
+ *
25
+ * 1. 文件由 `apps/agent` 的物化器写入,路径由平台固定(参数只能取自平台常量或
26
+ * 结构 id,不由站点内容派生)。
27
+ * 2. 文件内容**完全由平台源码常量或确定性生成器决定**,不含站点自己的内容。
28
+ *
29
+ * 第 2 条刻意把三类「路径归平台、内容归站点」的文件**留在**翻译范围内:
30
+ *
31
+ * - `components/site/generated/forms/form-<id>.spec.ts`:路径由物化器决定,内容是
32
+ * 表单设计器里用户写的字段文案。它归 `FORM_SPEC_LOCALIZABLE_FIELD_PATHS` 的
33
+ * 字段级清单管辖(同一目录下与它相邻的 `form-<id>.tsx` 容器则是纯平台产物,
34
+ * 由本清单的模式项收录)。
35
+ * - `components/site/generated/site-navigation.tsx` / `site-footer.tsx`:由 sitemap
36
+ * 派生,装的是导航文字与页脚文案。
37
+ * - 区块组件与静态路由页:由生成 Agent 按站点设计写。
38
+ *
39
+ * ## 与模板受保护清单(`.donttouch_files.json`)的边界
40
+ *
41
+ * 两份清单管的是**不同的人**,不要合并:
42
+ *
43
+ * - 受保护清单说的是「**模型**不许改这些文件」,权威源是模板根,覆盖的是模板层
44
+ * 运行时与构建配置;本地化链路把它当白名单之后的第二道校验(读不到就 fail-open)。
45
+ * - 本清单说的是「**A2 文本阶段**不该翻这些文件」,权威源是 `apps/agent` 的物化器
46
+ * 导出,覆盖的是物化器写进生成目录的产物。
47
+ *
48
+ * 两者只在少数条目上重合(如 `app/api/forms/[code]/route.ts` 两边都在),重合是
49
+ * 巧合不是结构。合并会让任一侧的判据被另一侧的历史包袱牵着走。
50
+ *
51
+ * ## 这就是一张硬编码表
52
+ *
53
+ * 它的正当性不来自聪明,来自两件事:**集合封闭**(只有平台自己会新增物化器)+
54
+ * **用例守护**(`apps/agent` 侧的
55
+ * `agents/workspace/generation/platform-materialized-files.contract.test.ts` 反射每个物化器
56
+ * 模块导出的文件路径,
57
+ * 逐条要求出现在本表或本文件登记的豁免里,漏登记即红)。等写盘链路有统一收口时,
58
+ * 应改成物化器落库时登记,本表随即退役。
59
+ */
60
+ /** 已登记的平台物化器。新增物化器必须同时在这里登记并补全下方表项。 */
61
+ export declare const PLATFORM_MATERIALIZERS: readonly ["product-search", "migration-products", "standard-form", "form-submission-infrastructure"];
62
+ export type PlatformMaterializer = (typeof PLATFORM_MATERIALIZERS)[number];
63
+ export interface PlatformMaterializedFile {
64
+ /** 快照内的相对路径,与物化器写入时逐字相同。 */
65
+ readonly path: string;
66
+ readonly materializer: PlatformMaterializer;
67
+ }
68
+ /**
69
+ * 路径参数化的表项:`prefix` 与 `suffix` 之间是**一段裸标识符**(不含 `/` 与 `.`)。
70
+ *
71
+ * 只用在参数是结构 id、无法穷举的地方。判据刻意要求中间段不含 `.`,`form-<id>.spec.ts`
72
+ * 因此不会被 `.tsx` 这条模式误收——它是站点数据,归字段级清单。
73
+ */
74
+ export interface PlatformMaterializedPathPattern {
75
+ readonly prefix: string;
76
+ readonly suffix: string;
77
+ readonly materializer: PlatformMaterializer;
78
+ }
79
+ /**
80
+ * 逐条路径。含白名单之外的条目(`lib/**`、`hooks/**`):本表是「平台物化器写了哪些
81
+ * 文件」的完整记账,作用域裁剪由调用侧的白名单负责,两件事不混在一张表里。
82
+ */
83
+ export declare const PLATFORM_MATERIALIZED_FILES: readonly PlatformMaterializedFile[];
84
+ /** 参数化表项。当前只有表单容器一条。 */
85
+ export declare const PLATFORM_MATERIALIZED_FILE_PATTERNS: readonly PlatformMaterializedPathPattern[];
86
+ /**
87
+ * 已知**不进本表**的物化器路径,连同不收录的理由一起登记。契约用例读它做豁免,
88
+ * 因此新增一个物化器导出而忘了归类时,用例会红在「既不在表里也不在豁免里」。
89
+ */
90
+ export declare const PLATFORM_MATERIALIZED_EXEMPTIONS: readonly {
91
+ readonly path: string;
92
+ readonly reason: string;
93
+ }[];
94
+ /** 逐条路径与参数化模式的并集判据。 */
95
+ export declare function isPlatformMaterializedFile(filePath: string): boolean;
@@ -2,9 +2,14 @@ import { z } from "zod";
2
2
  export declare const SitePreviewActivateErrorCodeSchema: z.ZodEnum<{
3
3
  PREVIEW_SESSION_NOT_FOUND: "PREVIEW_SESSION_NOT_FOUND";
4
4
  PREVIEW_SESSION_INVALID: "PREVIEW_SESSION_INVALID";
5
+ PREVIEW_SESSION_STALE: "PREVIEW_SESSION_STALE";
5
6
  PREVIEW_SESSION_LOOKUP_FAILED: "PREVIEW_SESSION_LOOKUP_FAILED";
6
7
  PREVIEW_SANDBOX_NOT_FOUND: "PREVIEW_SANDBOX_NOT_FOUND";
7
8
  PREVIEW_SANDBOX_CONNECT_FAILED: "PREVIEW_SANDBOX_CONNECT_FAILED";
9
+ PREVIEW_SANDBOX_OWNERSHIP_MISMATCH: "PREVIEW_SANDBOX_OWNERSHIP_MISMATCH";
10
+ PREVIEW_ACTIVATION_TIMEOUT: "PREVIEW_ACTIVATION_TIMEOUT";
11
+ PREVIEW_PREFLIGHT_FAILED: "PREVIEW_PREFLIGHT_FAILED";
12
+ PREVIEW_ENV_LOOKUP_FAILED: "PREVIEW_ENV_LOOKUP_FAILED";
8
13
  PREVIEW_SERVER_START_FAILED: "PREVIEW_SERVER_START_FAILED";
9
14
  PREVIEW_HEALTH_CHECK_FAILED: "PREVIEW_HEALTH_CHECK_FAILED";
10
15
  SANDBOX_NOT_CONFIGURED: "SANDBOX_NOT_CONFIGURED";
@@ -19,9 +24,14 @@ export declare const SitePreviewActivateFailedSchema: z.ZodObject<{
19
24
  code: z.ZodEnum<{
20
25
  PREVIEW_SESSION_NOT_FOUND: "PREVIEW_SESSION_NOT_FOUND";
21
26
  PREVIEW_SESSION_INVALID: "PREVIEW_SESSION_INVALID";
27
+ PREVIEW_SESSION_STALE: "PREVIEW_SESSION_STALE";
22
28
  PREVIEW_SESSION_LOOKUP_FAILED: "PREVIEW_SESSION_LOOKUP_FAILED";
23
29
  PREVIEW_SANDBOX_NOT_FOUND: "PREVIEW_SANDBOX_NOT_FOUND";
24
30
  PREVIEW_SANDBOX_CONNECT_FAILED: "PREVIEW_SANDBOX_CONNECT_FAILED";
31
+ PREVIEW_SANDBOX_OWNERSHIP_MISMATCH: "PREVIEW_SANDBOX_OWNERSHIP_MISMATCH";
32
+ PREVIEW_ACTIVATION_TIMEOUT: "PREVIEW_ACTIVATION_TIMEOUT";
33
+ PREVIEW_PREFLIGHT_FAILED: "PREVIEW_PREFLIGHT_FAILED";
34
+ PREVIEW_ENV_LOOKUP_FAILED: "PREVIEW_ENV_LOOKUP_FAILED";
25
35
  PREVIEW_SERVER_START_FAILED: "PREVIEW_SERVER_START_FAILED";
26
36
  PREVIEW_HEALTH_CHECK_FAILED: "PREVIEW_HEALTH_CHECK_FAILED";
27
37
  SANDBOX_NOT_CONFIGURED: "SANDBOX_NOT_CONFIGURED";
@@ -37,9 +47,14 @@ export declare const SitePreviewActivateResponseSchema: z.ZodDiscriminatedUnion<
37
47
  code: z.ZodEnum<{
38
48
  PREVIEW_SESSION_NOT_FOUND: "PREVIEW_SESSION_NOT_FOUND";
39
49
  PREVIEW_SESSION_INVALID: "PREVIEW_SESSION_INVALID";
50
+ PREVIEW_SESSION_STALE: "PREVIEW_SESSION_STALE";
40
51
  PREVIEW_SESSION_LOOKUP_FAILED: "PREVIEW_SESSION_LOOKUP_FAILED";
41
52
  PREVIEW_SANDBOX_NOT_FOUND: "PREVIEW_SANDBOX_NOT_FOUND";
42
53
  PREVIEW_SANDBOX_CONNECT_FAILED: "PREVIEW_SANDBOX_CONNECT_FAILED";
54
+ PREVIEW_SANDBOX_OWNERSHIP_MISMATCH: "PREVIEW_SANDBOX_OWNERSHIP_MISMATCH";
55
+ PREVIEW_ACTIVATION_TIMEOUT: "PREVIEW_ACTIVATION_TIMEOUT";
56
+ PREVIEW_PREFLIGHT_FAILED: "PREVIEW_PREFLIGHT_FAILED";
57
+ PREVIEW_ENV_LOOKUP_FAILED: "PREVIEW_ENV_LOOKUP_FAILED";
43
58
  PREVIEW_SERVER_START_FAILED: "PREVIEW_SERVER_START_FAILED";
44
59
  PREVIEW_HEALTH_CHECK_FAILED: "PREVIEW_HEALTH_CHECK_FAILED";
45
60
  SANDBOX_NOT_CONFIGURED: "SANDBOX_NOT_CONFIGURED";