@samva/markup 0.8.0 → 0.9.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 (171) hide show
  1. package/AGENTS.md +90 -37
  2. package/README.md +188 -52
  3. package/dist/assets-C5duwTya.d.ts +40 -0
  4. package/dist/{brand-DcoVkh_S.d.ts → brand-B-0bN_Ir.d.ts} +2 -2
  5. package/dist/{render-vAv_4r9v.js → cascade-t6kxlgEI.js} +93 -280
  6. package/dist/channel-edit.d.ts +121 -0
  7. package/dist/channel-edit.js +609 -0
  8. package/dist/channel-specs-B6M_HlaV.js +29 -0
  9. package/dist/channel-specs-C2feJwuP.d.ts +13 -0
  10. package/dist/compatibility-DbISoFIq.js +589 -0
  11. package/dist/compiler.d.ts +10 -257
  12. package/dist/compiler.js +10 -730
  13. package/dist/{css-CS2jLID6.d.ts → css-BVQKICKC.d.ts} +3 -3
  14. package/dist/diagnostic-codes.d.ts +403 -0
  15. package/dist/diagnostic-codes.js +399 -0
  16. package/dist/{diagnostics-BMYtBCQk.d.ts → diagnostics-B-Gym34R.d.ts} +8 -4
  17. package/dist/diagnostics.d.ts +31 -2
  18. package/dist/diagnostics.js +1 -19
  19. package/dist/{elements-BzjjnoCS.d.ts → elements-cqldpaJt.d.ts} +3 -3
  20. package/dist/email/assets.d.ts +2 -40
  21. package/dist/email/brand-footer.d.ts +2 -2
  22. package/dist/email/brand-footer.js +4 -3
  23. package/dist/email/brand.d.ts +1 -1
  24. package/dist/email/brand.js +1 -1
  25. package/dist/email/components.d.ts +21 -10
  26. package/dist/email/components.js +46 -11
  27. package/dist/email/diagnostics.d.ts +2 -2
  28. package/dist/email/diagnostics.js +2 -1
  29. package/dist/email/elements.d.ts +1 -1
  30. package/dist/email/html.d.ts +2 -2
  31. package/dist/email/html.js +45 -2
  32. package/dist/email/jsx-dev-runtime.d.ts +2 -2
  33. package/dist/email/jsx-runtime.d.ts +1 -1
  34. package/dist/email/render.d.ts +8 -18
  35. package/dist/email/render.js +163 -3
  36. package/dist/email/text.d.ts +1 -1
  37. package/dist/fmt.d.ts +32 -0
  38. package/dist/fmt.js +174 -0
  39. package/dist/{html-Bl9BAdqc.d.ts → html-BJepOwZ4.d.ts} +19 -5
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +2 -0
  42. package/dist/ir-aaqNE987.d.ts +252 -0
  43. package/dist/ir.d.ts +2 -0
  44. package/dist/ir.js +7 -0
  45. package/dist/preview-Ekdg1dXG.d.ts +100 -0
  46. package/dist/preview.d.ts +2 -0
  47. package/dist/preview.js +160 -0
  48. package/dist/profile-BH-OtdDA.js +3670 -0
  49. package/dist/render-ir.d.ts +19 -0
  50. package/dist/render-ir.js +826 -0
  51. package/dist/sms-segments.d.ts +13 -2
  52. package/dist/sms.d.ts +16 -0
  53. package/dist/sms.js +12 -0
  54. package/dist/{email/source-edit.d.ts → source-edit.d.ts} +55 -6
  55. package/dist/source-edit.js +343 -0
  56. package/dist/source-locations-C8wCsiAy.d.ts +23 -0
  57. package/dist/source-locations.d.ts +2 -2
  58. package/dist/source-locations.js +3 -89
  59. package/dist/static.d.ts +57 -0
  60. package/dist/static.js +69 -0
  61. package/dist/tailwind-CMYpZf1v.js +614 -0
  62. package/dist/template-_QE_rQND.d.ts +65 -0
  63. package/dist/template.d.ts +2 -2
  64. package/dist/template.js +15 -10
  65. package/dist/theme-css.d.ts +1 -1
  66. package/dist/theme-imports-lvBw3AD1.js +109 -0
  67. package/dist/transform-Ct2OMkFN.d.ts +153 -0
  68. package/dist/whatsapp.d.ts +57 -0
  69. package/dist/whatsapp.js +22 -0
  70. package/generated/contract.json +1782 -0
  71. package/generated/reference.md +353 -0
  72. package/package.json +41 -151
  73. package/skills/sml/SKILL.md +123 -0
  74. package/dist/ast-BrDtApwS.d.ts +0 -107
  75. package/dist/ast.d.ts +0 -2
  76. package/dist/ast.js +0 -124
  77. package/dist/candidate.d.ts +0 -29
  78. package/dist/candidate.js +0 -88
  79. package/dist/catalog-CKuOooB8.d.ts +0 -354
  80. package/dist/checks-D73Xizbw.js +0 -59366
  81. package/dist/checks.d.ts +0 -33
  82. package/dist/checks.js +0 -2
  83. package/dist/classes.d.ts +0 -26
  84. package/dist/classes.js +0 -184
  85. package/dist/compile-sms.d.ts +0 -28
  86. package/dist/compile-sms.js +0 -44
  87. package/dist/compile-whatsapp.d.ts +0 -56
  88. package/dist/compile-whatsapp.js +0 -186
  89. package/dist/compile.d.ts +0 -18
  90. package/dist/compile.js +0 -29
  91. package/dist/components.d.ts +0 -289
  92. package/dist/components.js +0 -106
  93. package/dist/conditionals.d.ts +0 -10
  94. package/dist/conditionals.js +0 -74
  95. package/dist/corpus-CPPfgAHN.d.ts +0 -106
  96. package/dist/diagnostics-OcQKQYSY.d.ts +0 -49
  97. package/dist/email/selection.d.ts +0 -2
  98. package/dist/email/selection.js +0 -91
  99. package/dist/email/source-edit.js +0 -185
  100. package/dist/email/stylesheets.d.ts +0 -15
  101. package/dist/email/stylesheets.js +0 -48
  102. package/dist/emit.d.ts +0 -51
  103. package/dist/emit.js +0 -151
  104. package/dist/interpolate.d.ts +0 -24
  105. package/dist/interpolate.js +0 -43
  106. package/dist/jsx-dev-runtime.d.ts +0 -11
  107. package/dist/jsx-dev-runtime.js +0 -15
  108. package/dist/jsx-runtime-I-1nCtl2.d.ts +0 -57
  109. package/dist/jsx-runtime.d.ts +0 -2
  110. package/dist/jsx-runtime.js +0 -121
  111. package/dist/lexer.d.ts +0 -60
  112. package/dist/lexer.js +0 -281
  113. package/dist/model.d.ts +0 -24
  114. package/dist/model.js +0 -77
  115. package/dist/ops-BvwqHl7V.js +0 -630
  116. package/dist/ops.d.ts +0 -114
  117. package/dist/ops.js +0 -2
  118. package/dist/parser-t29cHLVL.d.ts +0 -396
  119. package/dist/parser.d.ts +0 -2
  120. package/dist/parser.js +0 -859
  121. package/dist/predicate-BI6uRRM-.js +0 -549
  122. package/dist/predicate-M-05Nd7R.d.ts +0 -56
  123. package/dist/predicate.d.ts +0 -2
  124. package/dist/predicate.js +0 -2
  125. package/dist/printer.d.ts +0 -6
  126. package/dist/printer.js +0 -122
  127. package/dist/registry-Dcp6QEK_.d.ts +0 -73
  128. package/dist/registry.d.ts +0 -2
  129. package/dist/registry.js +0 -646
  130. package/dist/render-template.d.ts +0 -45
  131. package/dist/render-template.js +0 -76
  132. package/dist/selection-CCArx9lU.d.ts +0 -91
  133. package/dist/showcase-egkusQBf.d.ts +0 -415
  134. package/dist/sms-segments-y4FpPilJ.d.ts +0 -13
  135. package/dist/source-locations-DrCM82Ym.d.ts +0 -67
  136. package/dist/starters/category-mapping.d.ts +0 -13
  137. package/dist/starters/category-mapping.js +0 -49
  138. package/dist/starters/corpus.d.ts +0 -2
  139. package/dist/starters/corpus.js +0 -194
  140. package/dist/starters/library.d.ts +0 -18
  141. package/dist/starters/library.js +0 -692
  142. package/dist/starters/public-gallery.d.ts +0 -266
  143. package/dist/starters/public-gallery.js +0 -916
  144. package/dist/starters/public-handoff.d.ts +0 -164
  145. package/dist/starters/public-handoff.js +0 -361
  146. package/dist/starters/public-preview-artifacts.d.ts +0 -43
  147. package/dist/starters/public-preview-artifacts.js +0 -104
  148. package/dist/starters/public-preview.d.ts +0 -61
  149. package/dist/starters/public-preview.js +0 -83
  150. package/dist/starters/showcase.d.ts +0 -2
  151. package/dist/starters/showcase.js +0 -335
  152. package/dist/starters/sources.d.ts +0 -45
  153. package/dist/starters/sources.js +0 -7762
  154. package/dist/starters/theme.d.ts +0 -45
  155. package/dist/starters/theme.js +0 -77
  156. package/dist/starters.d.ts +0 -2
  157. package/dist/starters.js +0 -874
  158. package/dist/tailwind-BYq7Lo6u.js +0 -727
  159. package/dist/template-DWftqh4x.d.ts +0 -60
  160. package/dist/tsx-source-instrumentation.d.ts +0 -30
  161. package/dist/tsx-source-instrumentation.js +0 -115
  162. package/dist/tsx-tracer.d.ts +0 -112
  163. package/dist/tsx-tracer.js +0 -985
  164. package/dist/variables-J_L3qxRa.d.ts +0 -77
  165. package/dist/variables.d.ts +0 -2
  166. package/dist/variables.js +0 -141
  167. package/dist/version-BITr58kk.js +0 -96
  168. package/generated/sml-agent-contract.json +0 -709
  169. package/generated/sml-email-agent-contract.json +0 -615
  170. package/generated/sml-email-language-reference.md +0 -94
  171. package/generated/sml-language-reference.md +0 -195
@@ -1,49 +0,0 @@
1
- //#region starters/category-mapping.ts
2
- const LAB_DIMENSIONS = [
3
- "newsletter",
4
- "receipt",
5
- "security",
6
- "product-update",
7
- "onboarding",
8
- "promotion",
9
- "shipping",
10
- "social-notification"
11
- ];
12
- const LAB_KINDS = [
13
- ...LAB_DIMENSIONS,
14
- "digest",
15
- "invoice",
16
- "account",
17
- "event",
18
- "statement",
19
- "developer-notification",
20
- "unknown"
21
- ];
22
- const labKindToStarterCategory = {
23
- newsletter: "digest",
24
- receipt: "transactional",
25
- security: "transactional",
26
- "product-update": "marketing",
27
- onboarding: "lifecycle",
28
- promotion: "marketing",
29
- shipping: "transactional",
30
- "social-notification": "transactional",
31
- digest: "digest",
32
- invoice: "transactional",
33
- account: "transactional",
34
- event: "marketing",
35
- statement: "transactional",
36
- "developer-notification": "transactional",
37
- unknown: "transactional"
38
- };
39
- const starterCategoryToCollection = {
40
- transactional: "category:transactional",
41
- digest: "category:digest-editorial",
42
- marketing: "category:marketing",
43
- lifecycle: "category:lifecycle"
44
- };
45
- const labKindToCollection = (kind) => starterCategoryToCollection[labKindToStarterCategory[kind]];
46
- //#endregion
47
- export { LAB_DIMENSIONS, LAB_KINDS, labKindToCollection, labKindToStarterCategory, starterCategoryToCollection };
48
-
49
- //# sourceMappingURL=category-mapping.js.map
@@ -1,2 +0,0 @@
1
- import { a as PublicCorpusRegistrationIssue, c as TemplateFacetQuery, d as matchesTemplateFacets, f as ownedShowcaseStarterSources, h as templateFacetOptions, i as PublicCorpusRegistration, l as TemplateFacetSet, m as registerPublicCorpusEntry, n as InspirationReference, o as TemplateCorpusKind, p as ownedStarterSourcePath, r as OwnedEditableStarter, s as TemplateCorpusRecord, t as BrandRecreationStarter, u as brandRecreationProvenance } from "../corpus-CPPfgAHN.js";
2
- export { BrandRecreationStarter, InspirationReference, OwnedEditableStarter, PublicCorpusRegistration, PublicCorpusRegistrationIssue, TemplateCorpusKind, TemplateCorpusRecord, TemplateFacetQuery, TemplateFacetSet, brandRecreationProvenance, matchesTemplateFacets, ownedShowcaseStarterSources, ownedStarterSourcePath, registerPublicCorpusEntry, templateFacetOptions };
@@ -1,194 +0,0 @@
1
- import { n as isObject } from "../guards-eV1qLbf2.js";
2
- import { starterCatalog } from "../starters.js";
3
- import { showcaseProject, showcaseProjects, showcaseSourcePath } from "./showcase.js";
4
- import { Result } from "better-result";
5
- //#region starters/corpus.ts
6
- const templateFacetOptions = {
7
- jobType: [
8
- "account-access",
9
- "commerce",
10
- "product-communication",
11
- "lifecycle",
12
- "publishing-campaigns"
13
- ],
14
- lifecycle: [
15
- "acquisition",
16
- "activation",
17
- "engagement",
18
- "transaction",
19
- "retention",
20
- "recovery"
21
- ],
22
- industry: [
23
- "saas",
24
- "ecommerce",
25
- "developer-tools",
26
- "newsletters-media"
27
- ],
28
- season: ["evergreen", "seasonal"],
29
- audience: [
30
- "product-users",
31
- "customers",
32
- "members",
33
- "readers",
34
- "shoppers",
35
- "teams"
36
- ],
37
- design: [
38
- "minimal",
39
- "branded",
40
- "editorial",
41
- "data-heavy",
42
- "single-cta"
43
- ],
44
- brandProvenance: ["samva-original", "third-party-reference"]
45
- };
46
- /** Clean-room recreations of a named brand's own email, authored as editable Samva projects. */
47
- const brandRecreationProvenance = Object.fromEntries(showcaseProjects.flatMap((project) => project.provenance.kind === "brand-recreation" ? [[project.id, {
48
- owner: "Samva",
49
- sourcePath: showcaseSourcePath(project),
50
- recordedAt: project.recordedAt,
51
- brand: project.provenance.brand,
52
- subject: project.provenance.subject,
53
- reviewedNote: project.provenance.reviewedNote
54
- }]] : []));
55
- /**
56
- * Owned starters authored as complete showcase projects with their own stylesheet and assets.
57
- * Every other owned starter is the single module `packages/markup/starters/<id>.tsx`.
58
- */
59
- const ownedShowcaseStarterSources = Object.fromEntries(showcaseProjects.flatMap((project) => project.provenance.kind === "owned" ? [[project.id, showcaseSourcePath(project)]] : []));
60
- const ownedStarterSourcePath = (id) => {
61
- const project = showcaseProject(id);
62
- return project === void 0 || project.provenance.kind !== "owned" ? `packages/markup/starters/${id}.tsx` : showcaseSourcePath(project);
63
- };
64
- const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/;
65
- const nonEmpty = (value) => value.trim().length > 0;
66
- const isHttpsUrl = (value) => {
67
- const url = URL.parse(value);
68
- return url?.protocol === "https:" && url.hostname.length > 0 && url.username.length === 0 && url.password.length === 0;
69
- };
70
- const requiredFacetDimensions = [
71
- "jobType",
72
- "lifecycle",
73
- "industry",
74
- "season",
75
- "audience",
76
- "design",
77
- "brandProvenance"
78
- ];
79
- /** Exact key sets: a record carrying anything else is not the shape this gate admits. */
80
- const exactKeys = (value, keys) => isObject(value) && Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
81
- const isStringIn = (value, values) => typeof value === "string" && values.includes(value);
82
- const isStringArrayIn = (value, values) => Array.isArray(value) && value.every((entry) => isStringIn(entry, values));
83
- const isReview = (value) => exactKeys(value, [
84
- "state",
85
- "reviewedBy",
86
- "reviewedAt",
87
- "notes"
88
- ]) && isStringIn(value.state, [
89
- "draft",
90
- "approved",
91
- "rejected"
92
- ]) && typeof value.reviewedBy === "string" && typeof value.reviewedAt === "string" && typeof value.notes === "string";
93
- const isDisplay = (value) => exactKeys(value, ["state", "attributionLabel"]) && isStringIn(value.state, ["hidden", "public"]) && typeof value.attributionLabel === "string";
94
- const isRetention = (value) => exactKeys(value, ["policy", "reviewedAt"]) && isStringIn(value.policy, ["retain-until-withdrawn", "retain-while-linked"]) && typeof value.reviewedAt === "string";
95
- const isTakedown = (value) => exactKeys(value, [
96
- "state",
97
- "contact",
98
- "procedureUrl"
99
- ]) && isStringIn(value.state, ["active", "removed"]) && typeof value.contact === "string" && typeof value.procedureUrl === "string";
100
- /** The four governance blocks every corpus record carries, whatever its kind. */
101
- const hasGovernance = (value) => isReview(value.review) && isDisplay(value.display) && isRetention(value.retention) && isTakedown(value.takedown);
102
- const CORPUS_KEYS = [
103
- "type",
104
- "corpusKind",
105
- "provenance",
106
- "review",
107
- "display",
108
- "retention",
109
- "takedown"
110
- ];
111
- const isCorpusRecord = (value) => {
112
- if (!exactKeys(value, CORPUS_KEYS) || !hasGovernance(value)) return false;
113
- const provenance = value.provenance;
114
- if (value.type === "OwnedEditableStarter") return value.corpusKind === "owned-editable-sml" && exactKeys(provenance, [
115
- "owner",
116
- "sourcePath",
117
- "recordedAt"
118
- ]) && provenance.owner === "Samva" && typeof provenance.sourcePath === "string" && typeof provenance.recordedAt === "string";
119
- if (value.type === "BrandRecreationStarter") return value.corpusKind === "brand-recreation-sml" && exactKeys(provenance, [
120
- "owner",
121
- "sourcePath",
122
- "recordedAt",
123
- "brand",
124
- "subject",
125
- "reviewedNote"
126
- ]) && provenance.owner === "Samva" && typeof provenance.sourcePath === "string" && typeof provenance.recordedAt === "string" && typeof provenance.brand === "string" && typeof provenance.subject === "string" && typeof provenance.reviewedNote === "string";
127
- return value.type === "InspirationReference" && value.corpusKind === "inspiration-reference" && exactKeys(provenance, [
128
- "publisher",
129
- "sourceUrl",
130
- "capturedAt",
131
- "rightsBasis"
132
- ]) && typeof provenance.publisher === "string" && typeof provenance.sourceUrl === "string" && typeof provenance.capturedAt === "string" && isStringIn(provenance.rightsBasis, ["display-link-and-commentary", "permission"]);
133
- };
134
- const isFacetSet = (value) => exactKeys(value, requiredFacetDimensions) && requiredFacetDimensions.every((dimension) => isStringArrayIn(value[dimension], templateFacetOptions[dimension]));
135
- const isCorpusEntry = (value) => exactKeys(value, [
136
- "id",
137
- "corpus",
138
- "facets"
139
- ]) && typeof value.id === "string" && isCorpusRecord(value.corpus) && isFacetSet(value.facets);
140
- const canonicalOwnedStarterSources = new Map(starterCatalog.filter((starter) => starter.channel === "email" && !Object.hasOwn(brandRecreationProvenance, starter.id)).map((starter) => [starter.id, ownedStarterSourcePath(starter.id)]));
141
- /** Decode and gate a record before it can enter any public projection. */
142
- const registerPublicCorpusEntry = (input) => {
143
- if (!isCorpusEntry(input)) return Result.err({
144
- id: "unknown",
145
- message: "record does not match a corpus schema"
146
- });
147
- const { id, corpus, facets } = input;
148
- const timestamps = [
149
- corpus.review.reviewedAt,
150
- corpus.retention.reviewedAt,
151
- corpus.type === "InspirationReference" ? corpus.provenance.capturedAt : corpus.provenance.recordedAt
152
- ];
153
- if (!nonEmpty(id) || corpus.review.state !== "approved" || !nonEmpty(corpus.review.reviewedBy) || !nonEmpty(corpus.review.notes) || corpus.display.state !== "public" || !nonEmpty(corpus.display.attributionLabel) || corpus.takedown.state !== "active" || !nonEmpty(corpus.takedown.contact) || !isHttpsUrl(corpus.takedown.procedureUrl) || timestamps.some((timestamp) => !ISO_TIMESTAMP.test(timestamp))) return Result.err({
154
- id,
155
- message: "public corpus records require approved review, display, retention, and takedown metadata"
156
- });
157
- if (corpus.type === "OwnedEditableStarter" && (canonicalOwnedStarterSources.get(id) !== corpus.provenance.sourcePath || corpus.retention.policy !== "retain-until-withdrawn" || facets.brandProvenance.some((value) => value !== "samva-original"))) return Result.err({
158
- id,
159
- message: "owned starters require a canonical editable TSX source"
160
- });
161
- if (corpus.type === "BrandRecreationStarter") {
162
- const canonical = Object.entries(brandRecreationProvenance).find(([starterId]) => starterId === id)?.[1];
163
- if (canonical === void 0 || Object.entries(canonical).some(([key, value]) => corpus.provenance[key] !== value) || !nonEmpty(corpus.provenance.brand) || !nonEmpty(corpus.provenance.subject) || corpus.retention.policy !== "retain-until-withdrawn" || facets.brandProvenance.some((value) => value !== "third-party-reference")) return Result.err({
164
- id,
165
- message: "brand recreations require a canonical source, a referenced brand and subject, and third-party provenance"
166
- });
167
- }
168
- if (corpus.type === "InspirationReference" && (!isHttpsUrl(corpus.provenance.sourceUrl) || corpus.retention.policy !== "retain-while-linked" || facets.brandProvenance.some((value) => value !== "third-party-reference"))) return Result.err({
169
- id,
170
- message: "inspiration references require an HTTPS source and third-party provenance facet"
171
- });
172
- for (const dimension of requiredFacetDimensions) {
173
- const values = facets[dimension];
174
- if (values.length === 0 || new Set(values).size !== values.length) return Result.err({
175
- id,
176
- message: `facet ${dimension} must be populated without duplicates`
177
- });
178
- }
179
- return Result.ok({
180
- id,
181
- corpus,
182
- facets
183
- });
184
- };
185
- /** Strict intersection: every selected value in every selected dimension must match. */
186
- const matchesTemplateFacets = (facets, query) => requiredFacetDimensions.every((dimension) => {
187
- const selected = query[dimension];
188
- const available = new Set(facets[dimension]);
189
- return selected === void 0 || selected.every((value) => available.has(value));
190
- });
191
- //#endregion
192
- export { brandRecreationProvenance, matchesTemplateFacets, ownedShowcaseStarterSources, ownedStarterSourcePath, registerPublicCorpusEntry, templateFacetOptions };
193
-
194
- //# sourceMappingURL=corpus.js.map
@@ -1,18 +0,0 @@
1
- //#region starters/library.gen.d.ts
2
- /** One public gallery template whose project the Agents Worker serves at `/library/<digest>.json`. */
3
- interface LibraryTemplate {
4
- readonly slug: string;
5
- readonly starterId: string;
6
- readonly name: string;
7
- /** SHA-256 of the served project bytes, lowercase hex. */
8
- readonly digest: string;
9
- /** Project-relative paths, so a listing needs no fetch. */
10
- readonly paths: ReadonlyArray<string>;
11
- readonly byteSize: number;
12
- }
13
- declare const libraryTemplates: ReadonlyArray<LibraryTemplate>;
14
- /** Identifies this exact library; a workspace records it to notice a changed gallery. */
15
- declare const libraryManifestDigest = "60bd511a973a6d1fe17bc6a03990118dd2a0e8a1f14556f09aaf54713420fd53";
16
- //#endregion
17
- export { LibraryTemplate, libraryManifestDigest, libraryTemplates };
18
- //# sourceMappingURL=library.d.ts.map