stylegallery 0.1.0 → 0.1.1

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 (230) hide show
  1. package/AGENTS.md +4 -1
  2. package/DOMAINS.md +2 -6
  3. package/GOVERNANCE.md +10 -9
  4. package/README.md +23 -127
  5. package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
  6. package/consumer-reference/agent-native/v2/material-registry.json +1 -0
  7. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
  8. package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
  10. package/consumer-reference/contract.md +1 -1
  11. package/consumer-reference/index.md +5 -3
  12. package/layout/index.md +124 -0
  13. package/log.md +51 -0
  14. package/package.json +181 -22
  15. package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
  16. package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
  17. package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
  18. package/scripts/agent-native/v2/material-admission.mjs +295 -0
  19. package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
  20. package/scripts/agent-native/v2/material-context.mjs +251 -0
  21. package/scripts/agent-native/v2/material-identity.mjs +71 -0
  22. package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
  23. package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
  24. package/scripts/agent-native/v2/material-queries.mjs +398 -0
  25. package/scripts/agent-native/v2/material-registry.mjs +319 -0
  26. package/scripts/sg-material-mcp.mjs +98 -0
  27. package/scripts/sg-material.mjs +27 -0
  28. package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
  29. package/consumer-reference/baselines/calibration.json +0 -260
  30. package/consumer-reference/baselines/manifest.json +0 -21
  31. package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
  32. package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
  33. package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
  34. package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
  35. package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
  36. package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
  37. package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
  38. package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
  39. package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
  40. package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
  41. package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
  42. package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
  43. package/consumer-reference/fixtures/promotion/manifest.json +0 -15
  44. package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
  45. package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
  46. package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
  47. package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
  48. package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
  49. package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
  50. package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
  51. package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
  52. package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
  53. package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
  54. package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
  55. package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
  56. package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
  57. package/consumer-reference/fixtures/valid-deprecated.json +0 -21
  58. package/consumer-reference/fixtures/valid-experimental.json +0 -19
  59. package/consumer-reference/generated/manifest.json +0 -40
  60. package/consumer-reference/generated/tokens.css +0 -12
  61. package/consumer-reference/policies/shared-experimental.json +0 -37
  62. package/consumer-reference/schema/ax-evidence.schema.json +0 -30
  63. package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
  64. package/consumer-reference/schema/calibration-record.schema.json +0 -190
  65. package/consumer-reference/schema/capture-session.schema.json +0 -161
  66. package/consumer-reference/schema/component-state.schema.json +0 -150
  67. package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
  68. package/consumer-reference/schema/dom-evidence.schema.json +0 -38
  69. package/consumer-reference/schema/evidence-record.schema.json +0 -81
  70. package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
  71. package/consumer-reference/schema/item.schema.json +0 -188
  72. package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
  73. package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
  74. package/consumer-reference/schema/portable-tokens.schema.json +0 -104
  75. package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
  76. package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
  77. package/consumer-reference/schema/visual-evidence.schema.json +0 -31
  78. package/design-engineering/consumer-migration-readiness.md +0 -124
  79. package/design-engineering/interface-craft.md +0 -107
  80. package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
  81. package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
  82. package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
  83. package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
  84. package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
  85. package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
  86. package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
  87. package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
  88. package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
  89. package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
  90. package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
  91. package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
  92. package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
  93. package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
  94. package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
  95. package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
  96. package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
  97. package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
  98. package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
  99. package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
  100. package/game-ui/classification.md +0 -82
  101. package/game-ui/reference-record.md +0 -62
  102. package/game-ui/screen-hierarchy.md +0 -107
  103. package/game-ui/unity/architecture.md +0 -166
  104. package/game-ui/unity/cli-loop.md +0 -84
  105. package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
  106. package/game-ui/unity/org-wiki.md +0 -146
  107. package/game-ui/unity/repository-map.md +0 -102
  108. package/game-ui/unity/ui-systems.md +0 -85
  109. package/motion/practice-reference.md +0 -145
  110. package/motion/review-workflow.md +0 -86
  111. package/motion/vocabulary.md +0 -82
  112. package/platform-guides/apple-interaction.md +0 -89
  113. package/scripts/agent-native/events.mjs +0 -113
  114. package/scripts/agent-native/immutable-store.mjs +0 -102
  115. package/scripts/artifact-metadata.mjs +0 -20
  116. package/scripts/audit-evidence-freshness.mjs +0 -308
  117. package/scripts/baseline-contract.mjs +0 -189
  118. package/scripts/baseline-schema-parity.mjs +0 -40
  119. package/scripts/build-reference-artifacts.mjs +0 -127
  120. package/scripts/calibration-raw-contract.mjs +0 -172
  121. package/scripts/capture-session-contract.mjs +0 -187
  122. package/scripts/component-state-artifact-fixture.mjs +0 -44
  123. package/scripts/component-state-contract.mjs +0 -99
  124. package/scripts/component-state-semantics.mjs +0 -128
  125. package/scripts/component-state-workflow-contract.mjs +0 -67
  126. package/scripts/component-state-workflow-negative-cases.mjs +0 -64
  127. package/scripts/consumer-conformance-contract.mjs +0 -198
  128. package/scripts/consumer-evidence-governance-contract.mjs +0 -210
  129. package/scripts/consumer-reference-case-runner.mjs +0 -93
  130. package/scripts/consumer-reference-schema.mjs +0 -155
  131. package/scripts/create-component-state-session.mjs +0 -100
  132. package/scripts/create-page-evidence-session.mjs +0 -139
  133. package/scripts/domain-document-boundaries.mjs +0 -40
  134. package/scripts/domain-validation-checks.mjs +0 -141
  135. package/scripts/evidence-artifact-contract.mjs +0 -191
  136. package/scripts/finalize-component-state-evidence.mjs +0 -165
  137. package/scripts/finalize-page-evidence.mjs +0 -197
  138. package/scripts/generate-consumer-reference-evidence.mjs +0 -154
  139. package/scripts/generate-patterns.mjs +0 -218
  140. package/scripts/governance-matrix-contract.mjs +0 -73
  141. package/scripts/governance-matrix-negative-cases.mjs +0 -114
  142. package/scripts/governance-policy-contract.mjs +0 -49
  143. package/scripts/governance-test-fixture.mjs +0 -321
  144. package/scripts/governance-workflow-negative-cases.mjs +0 -241
  145. package/scripts/governed-profile-registry.mjs +0 -125
  146. package/scripts/json-schema-formats.mjs +0 -31
  147. package/scripts/markdown-structure.mjs +0 -45
  148. package/scripts/page-artifact-metadata.mjs +0 -124
  149. package/scripts/page-evidence-contract.mjs +0 -297
  150. package/scripts/page-evidence-fixture.mjs +0 -271
  151. package/scripts/pattern-data.mjs +0 -325
  152. package/scripts/profile-record-contract.mjs +0 -140
  153. package/scripts/promotion-attestation-contract.mjs +0 -91
  154. package/scripts/promotion-boundary-test-contract.mjs +0 -92
  155. package/scripts/promotion-fixture-inventory.mjs +0 -109
  156. package/scripts/promotion-governance-contract.mjs +0 -28
  157. package/scripts/reference-artifact-path-contract.mjs +0 -28
  158. package/scripts/reference-profile-contract.mjs +0 -114
  159. package/scripts/reference-token-contract.mjs +0 -156
  160. package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
  161. package/scripts/summarize-sentinel-calibration.mjs +0 -98
  162. package/scripts/test-agent-adapter-conformance.mjs +0 -250
  163. package/scripts/test-agent-conformance-receipt.mjs +0 -106
  164. package/scripts/test-agent-events.mjs +0 -81
  165. package/scripts/test-agent-execution-effects.mjs +0 -114
  166. package/scripts/test-agent-execution-fixtures.mjs +0 -140
  167. package/scripts/test-agent-execution-kernel.mjs +0 -39
  168. package/scripts/test-agent-execution-learning.mjs +0 -130
  169. package/scripts/test-agent-execution-lifecycle.mjs +0 -143
  170. package/scripts/test-agent-execution-safety.mjs +0 -158
  171. package/scripts/test-agent-execution-views.mjs +0 -117
  172. package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
  173. package/scripts/test-agent-knowledge-kernel.mjs +0 -183
  174. package/scripts/test-agent-learning.mjs +0 -246
  175. package/scripts/test-agent-mcp.mjs +0 -246
  176. package/scripts/test-agent-native-schemas.mjs +0 -215
  177. package/scripts/test-agent-projections.mjs +0 -249
  178. package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
  179. package/scripts/test-agent-registry-mutations.mjs +0 -110
  180. package/scripts/test-audit-evidence-freshness.mjs +0 -177
  181. package/scripts/test-component-state-sentinel.mjs +0 -35
  182. package/scripts/test-component-state-source-contract.mjs +0 -83
  183. package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
  184. package/scripts/test-consumer-reference-sentinel.mjs +0 -31
  185. package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
  186. package/scripts/test-json-cli-output.mjs +0 -151
  187. package/scripts/test-json-schema-formats.mjs +0 -40
  188. package/scripts/test-reference-adapters.mjs +0 -199
  189. package/scripts/test-renderer-purity.mjs +0 -34
  190. package/scripts/test-sg-cli.mjs +0 -129
  191. package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
  192. package/scripts/test-validate-baseline-manifest.mjs +0 -234
  193. package/scripts/test-validate-component-state-artifacts.mjs +0 -243
  194. package/scripts/test-validate-component-state.mjs +0 -106
  195. package/scripts/test-validate-consumer-conformance.mjs +0 -427
  196. package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
  197. package/scripts/test-validate-consumer-reference.mjs +0 -263
  198. package/scripts/test-validate-domains.mjs +0 -357
  199. package/scripts/test-validate-governance.mjs +0 -292
  200. package/scripts/test-validate-ia.mjs +0 -262
  201. package/scripts/test-validate-okf.mjs +0 -73
  202. package/scripts/test-validate-page-evidence.mjs +0 -302
  203. package/scripts/test-validate-patterns.mjs +0 -157
  204. package/scripts/test-validate-promotion-rfc.mjs +0 -250
  205. package/scripts/test-validate-reference-profiles.mjs +0 -170
  206. package/scripts/test-validate-unity-org-wiki.mjs +0 -57
  207. package/scripts/test-validate-unity-source-contracts.mjs +0 -67
  208. package/scripts/test-validate-vocabulary.mjs +0 -174
  209. package/scripts/test-validate-webpage-workflow.mjs +0 -293
  210. package/scripts/validate-baseline-manifest.mjs +0 -44
  211. package/scripts/validate-catalog.mjs +0 -65
  212. package/scripts/validate-component-state.mjs +0 -141
  213. package/scripts/validate-consumer-conformance.mjs +0 -477
  214. package/scripts/validate-consumer-reference.mjs +0 -288
  215. package/scripts/validate-domains.mjs +0 -237
  216. package/scripts/validate-governance.mjs +0 -248
  217. package/scripts/validate-ia.mjs +0 -136
  218. package/scripts/validate-links.mjs +0 -66
  219. package/scripts/validate-okf.mjs +0 -104
  220. package/scripts/validate-page-evidence.mjs +0 -191
  221. package/scripts/validate-patterns.mjs +0 -246
  222. package/scripts/validate-promotion-rfc.mjs +0 -224
  223. package/scripts/validate-reference-artifacts.mjs +0 -125
  224. package/scripts/validate-renderer-purity.mjs +0 -56
  225. package/scripts/validate-unity-org-wiki.mjs +0 -146
  226. package/scripts/validate-unity-source-contracts.mjs +0 -107
  227. package/scripts/validate-vocabulary.mjs +0 -115
  228. package/scripts/validate-webpage-workflow.mjs +0 -254
  229. package/scripts/visual-expectation-contract.mjs +0 -20
  230. package/scripts/workflow-action-contract.mjs +0 -163
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "stylegallery",
3
- "version": "0.1.0",
4
- "description": "A governed gallery of portable interface knowledge with a deterministic CLI and read-only MCP server.",
3
+ "version": "0.1.1",
4
+ "description": "A governed gallery of portable interface knowledge with deterministic CLIs and read-only MCP servers.",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/changeroa/StyleGallery#readme",
7
7
  "bugs": {
@@ -22,30 +22,177 @@
22
22
  "engines": {
23
23
  "node": ">=22"
24
24
  },
25
- "bin": {
26
- "sg": "scripts/sg.mjs",
27
- "stylegallery": "scripts/sg.mjs",
28
- "stylegallery-mcp": "scripts/sg-mcp.mjs"
29
- },
30
25
  "files": [
31
26
  "AGENTS.md",
32
27
  "CATALOG.md",
33
28
  "DOMAINS.md",
34
29
  "GOVERNANCE.md",
35
30
  "GUIDE.md",
36
- "consumer-reference/",
37
- "design-engineering/",
38
- "game-ui/",
39
- "guides/",
31
+ "README.md",
32
+ "consumer-reference/agent-native/README.md",
33
+ "consumer-reference/agent-native/registry.json",
34
+ "consumer-reference/agent-native/schema/agent-native.schema.json",
35
+ "consumer-reference/agent-native/schema/epistemic.schema.json",
36
+ "consumer-reference/agent-native/schema/execution.schema.json",
37
+ "consumer-reference/agent-native/schema/identity.schema.json",
38
+ "consumer-reference/agent-native/schema/learning.schema.json",
39
+ "consumer-reference/agent-native/schema/manifest.schema.json",
40
+ "consumer-reference/agent-native/schema/operation.schema.json",
41
+ "consumer-reference/agent-native/schema/protocol-binding.schema.json",
42
+ "consumer-reference/agent-native/schema/retrieval.schema.json",
43
+ "consumer-reference/agent-native/v2/admission-policy.json",
44
+ "consumer-reference/agent-native/v2/material-registry.json",
45
+ "consumer-reference/agent-native/v2/schema/admission-policy.schema.json",
46
+ "consumer-reference/agent-native/v2/schema/material-manifest.schema.json",
47
+ "consumer-reference/agent-native/v2/schema/material-record.schema.json",
48
+ "consumer-reference/contract.md",
49
+ "consumer-reference/index.md",
50
+ "design-engineering/index.md",
51
+ "design-engineering/reference-profiles/governed-local/editorial/profile.json",
52
+ "design-engineering/reference-profiles/governed-local/index.md",
53
+ "design-engineering/reference-profiles/index.md",
54
+ "game-ui/index.md",
55
+ "guides/decision-tree.md",
56
+ "guides/documentation-mode-taxonomy.md",
57
+ "guides/layout-brief.md",
58
+ "guides/vocabulary.md",
59
+ "guides/webpage-generation-workflow.md",
40
60
  "index.md",
41
- "layout/",
42
- "motion/",
43
- "patterns/",
44
- "platform-guides/",
45
- "quality/",
46
- "recipes/",
47
- "scripts/"
61
+ "layout/index.md",
62
+ "log.md",
63
+ "motion/index.md",
64
+ "patterns/centering/center.md",
65
+ "patterns/centering/index.md",
66
+ "patterns/centering/super-center.md",
67
+ "patterns/containment/box.md",
68
+ "patterns/containment/clamped-card.md",
69
+ "patterns/containment/content-limiter.md",
70
+ "patterns/containment/fluid-styles.md",
71
+ "patterns/containment/index.md",
72
+ "patterns/grid-repetition/card-grid.md",
73
+ "patterns/grid-repetition/columns.md",
74
+ "patterns/grid-repetition/dense-grid.md",
75
+ "patterns/grid-repetition/grid-wrapper.md",
76
+ "patterns/grid-repetition/index.md",
77
+ "patterns/grid-repetition/masonry-approx.md",
78
+ "patterns/grid-repetition/page-grid.md",
79
+ "patterns/grid-repetition/ram-grid.md",
80
+ "patterns/grid-repetition/twelve-span-grid.md",
81
+ "patterns/in-line-grouping/badge-list.md",
82
+ "patterns/in-line-grouping/breadcrumb.md",
83
+ "patterns/in-line-grouping/cluster.md",
84
+ "patterns/in-line-grouping/deconstructed-pancake.md",
85
+ "patterns/in-line-grouping/index.md",
86
+ "patterns/in-line-grouping/pagination.md",
87
+ "patterns/in-line-grouping/reel.md",
88
+ "patterns/in-line-grouping/split-nav.md",
89
+ "patterns/in-line-grouping/tab-strip.md",
90
+ "patterns/in-line-grouping/wrap-row.md",
91
+ "patterns/index.md",
92
+ "patterns/media-fit/frame.md",
93
+ "patterns/media-fit/icon-frame.md",
94
+ "patterns/media-fit/index.md",
95
+ "patterns/overlay-exception/imposter.md",
96
+ "patterns/overlay-exception/index.md",
97
+ "patterns/overlay-exception/overlay-stack.md",
98
+ "patterns/split-sidebar/index.md",
99
+ "patterns/split-sidebar/list-detail.md",
100
+ "patterns/split-sidebar/main-with-rail.md",
101
+ "patterns/split-sidebar/media-object.md",
102
+ "patterns/split-sidebar/sidebar.md",
103
+ "patterns/split-sidebar/split-screen.md",
104
+ "patterns/split-sidebar/sticky-aside.md",
105
+ "patterns/split-sidebar/supporting-pane.md",
106
+ "patterns/split-sidebar/switcher.md",
107
+ "patterns/stacking/feed.md",
108
+ "patterns/stacking/index.md",
109
+ "patterns/stacking/line-up.md",
110
+ "patterns/stacking/stack.md",
111
+ "patterns/stacking/step-nav.md",
112
+ "patterns/viewport-shell/cover.md",
113
+ "patterns/viewport-shell/fixed-sidenav-shell.md",
114
+ "patterns/viewport-shell/holy-grail.md",
115
+ "patterns/viewport-shell/index.md",
116
+ "patterns/viewport-shell/panel-layout.md",
117
+ "patterns/viewport-shell/scroll-body-shell.md",
118
+ "patterns/viewport-shell/sticky-footer.md",
119
+ "patterns/viewport-shell/sticky-header.md",
120
+ "platform-guides/index.md",
121
+ "quality/claim-records/index.md",
122
+ "quality/claim-records/samples.md",
123
+ "quality/claim-records/stylegallery-multidomain-scope.md",
124
+ "quality/claims.md",
125
+ "quality/evidence/accessibility.md",
126
+ "quality/evidence/consumer-migration.md",
127
+ "quality/evidence/design-rationale.md",
128
+ "quality/evidence/executable-evidence.md",
129
+ "quality/evidence/families.md",
130
+ "quality/evidence/hci-evaluation.md",
131
+ "quality/evidence/index.md",
132
+ "quality/evidence/pattern-contract-audit.md",
133
+ "quality/evidence/search-metadata-polyhierarchy.md",
134
+ "quality/evidence/sources.md",
135
+ "quality/evidence/tokens.md",
136
+ "quality/evidence/visual-qa.md",
137
+ "quality/gates/accessibility-evidence.md",
138
+ "quality/gates/consumer-migration-evidence.md",
139
+ "quality/gates/design-claim.md",
140
+ "quality/gates/harmony-evaluation.md",
141
+ "quality/gates/index.md",
142
+ "quality/gates/layout.md",
143
+ "quality/gates/rationale.md",
144
+ "quality/gates/visual-evidence.md",
145
+ "quality/index.md",
146
+ "quality/principles.md",
147
+ "recipes/article-page.md",
148
+ "recipes/command-surface.md",
149
+ "recipes/dashboard.md",
150
+ "recipes/form-flow.md",
151
+ "recipes/homepage.md",
152
+ "recipes/index.md",
153
+ "recipes/list-detail.md",
154
+ "recipes/primitive-to-recipe-matrix.md",
155
+ "recipes/saas-settings.md",
156
+ "scripts/agent-native/a2a-projection.mjs",
157
+ "scripts/agent-native/agui-projection.mjs",
158
+ "scripts/agent-native/canonical-json.mjs",
159
+ "scripts/agent-native/cli-adapter.mjs",
160
+ "scripts/agent-native/execution.mjs",
161
+ "scripts/agent-native/fixture.mjs",
162
+ "scripts/agent-native/identity.mjs",
163
+ "scripts/agent-native/knowledge.mjs",
164
+ "scripts/agent-native/learning-records.mjs",
165
+ "scripts/agent-native/learning.mjs",
166
+ "scripts/agent-native/mcp-adapter.mjs",
167
+ "scripts/agent-native/queries.mjs",
168
+ "scripts/agent-native/registry.mjs",
169
+ "scripts/agent-native/retrieval.mjs",
170
+ "scripts/agent-native/self-description.mjs",
171
+ "scripts/agent-native/v2/experimental-extension-registry.mjs",
172
+ "scripts/agent-native/v2/extensions/a2a-projection.mjs",
173
+ "scripts/agent-native/v2/extensions/agui-projection.mjs",
174
+ "scripts/agent-native/v2/material-admission.mjs",
175
+ "scripts/agent-native/v2/material-cli-adapter.mjs",
176
+ "scripts/agent-native/v2/material-context.mjs",
177
+ "scripts/agent-native/v2/material-identity.mjs",
178
+ "scripts/agent-native/v2/material-mcp-adapter.mjs",
179
+ "scripts/agent-native/v2/material-operation-registry.mjs",
180
+ "scripts/agent-native/v2/material-queries.mjs",
181
+ "scripts/agent-native/v2/material-registry.mjs",
182
+ "scripts/sg-material-mcp.mjs",
183
+ "scripts/sg-material.mjs",
184
+ "scripts/sg-mcp.mjs",
185
+ "scripts/sg.mjs",
186
+ "scripts/strict-json.mjs"
48
187
  ],
188
+ "bin": {
189
+ "sg": "scripts/sg.mjs",
190
+ "sg-material": "scripts/sg-material.mjs",
191
+ "stylegallery": "scripts/sg.mjs",
192
+ "stylegallery-material": "scripts/sg-material.mjs",
193
+ "stylegallery-material-mcp": "scripts/sg-material-mcp.mjs",
194
+ "stylegallery-mcp": "scripts/sg-mcp.mjs"
195
+ },
49
196
  "publishConfig": {
50
197
  "access": "public"
51
198
  },
@@ -55,13 +202,24 @@
55
202
  "create:component-state-session": "node scripts/create-component-state-session.mjs",
56
203
  "test": "node scripts/test-reference-adapters.mjs --json",
57
204
  "test:consumer-conformance": "playwright test tests/consumer-conformance.spec.mjs",
205
+ "test:consumer-conformance:matrix": "node scripts/agent-native/v2/test-consumer-conformance-matrix-comparator.mjs",
206
+ "test:consumer-conformance:matrix:execute": "node scripts/agent-native/v2/test-consumer-conformance-matrix-comparator.mjs --execute",
58
207
  "test:component-state": "node scripts/test-component-state-source-contract.mjs && node scripts/test-validate-component-state.mjs --json && node scripts/test-validate-component-state-artifacts.mjs && node scripts/test-generate-consumer-reference-evidence.mjs --json",
59
208
  "test:component-state:runtime": "playwright test tests/component-state-evidence.spec.mjs --project=chromium",
60
209
  "test:component-state:runtime-negative": "node scripts/test-component-state-sentinel.mjs",
61
210
  "test:sentinel": "playwright test tests/consumer-reference-sentinels.spec.mjs --project=chromium",
211
+ "test:source-inventory": "node --test scripts/test-repository-source-inventory.mjs",
212
+ "test:json-schema-formats": "node --test scripts/test-json-schema-formats.mjs",
213
+ "generate:material": "node scripts/agent-native/v2/generate-material-registry.mjs",
214
+ "validate:material": "node scripts/agent-native/v2/validate-material-registry.mjs",
215
+ "test:material": "node scripts/agent-native/v2/test-material-admission.mjs && node scripts/agent-native/v2/test-material-registry.mjs && node scripts/agent-native/v2/test-material-query.mjs && node scripts/agent-native/v2/test-material-context.mjs && node scripts/agent-native/v2/test-sg-material-cli.mjs && node scripts/agent-native/v2/test-material-mcp.mjs && node scripts/agent-native/v2/test-material-mcp-stdio.mjs && node scripts/agent-native/v2/test-sg-material-package.mjs",
216
+ "test:lifecycle-dispositions": "node scripts/test-lifecycle-disposition.mjs",
217
+ "validate:lifecycle-dispositions": "node scripts/validate-lifecycle-disposition.mjs --json",
62
218
  "sg": "node scripts/sg.mjs",
219
+ "sg:material": "node scripts/sg-material.mjs",
220
+ "sg:material:mcp": "node scripts/sg-material-mcp.mjs",
63
221
  "sg:mcp": "node scripts/sg-mcp.mjs",
64
- "test:agent-native": "node scripts/test-agent-knowledge-kernel.mjs --json && node scripts/test-agent-execution-kernel.mjs --json && node scripts/test-agent-execution-safety.mjs --json && node scripts/test-agent-events.mjs --json && node scripts/test-agent-learning.mjs --json && node scripts/test-agent-native-schemas.mjs --json && node scripts/test-sg-cli.mjs --json && node scripts/test-agent-conformance-receipt.mjs --json && node scripts/test-agent-mcp.mjs --json && node scripts/test-agent-registry-mcp-integrity.mjs --json && node scripts/test-agent-registry-mutations.mjs --json && node scripts/test-agent-adapter-conformance.mjs --json && node scripts/test-agent-projections.mjs --json",
222
+ "test:agent-native": "node scripts/test-agent-knowledge-kernel.mjs --json && node scripts/test-agent-execution-kernel.mjs --json && node scripts/test-agent-execution-safety.mjs --json && node scripts/test-agent-events.mjs --json && node scripts/test-agent-learning.mjs --json && node scripts/test-agent-native-schemas.mjs --json && node scripts/test-sg-cli.mjs --json && node scripts/test-agent-conformance-receipt.mjs --json && node scripts/test-agent-mcp.mjs --json && node scripts/test-agent-registry-mcp-integrity.mjs --json && node scripts/test-agent-registry-mutations.mjs --json && node scripts/test-agent-adapter-conformance.mjs --json && node scripts/agent-native/v2/test-agent-extension-boundary.mjs && node scripts/test-agent-projections.mjs --json && node scripts/agent-native/v2/test-agent-v1-compatibility.mjs",
65
223
  "validate": "node scripts/validate-reference-artifacts.mjs --manifest consumer-reference/generated/manifest.json --json",
66
224
  "validate:component-state": "node scripts/validate-component-state.mjs --json && node scripts/generate-consumer-reference-evidence.mjs --check --json"
67
225
  },
@@ -69,10 +227,11 @@
69
227
  "@axe-core/playwright": "4.12.1",
70
228
  "@playwright/test": "1.61.0",
71
229
  "ajv": "8.20.0",
72
- "ajv-formats": "3.0.1",
73
- "style-dictionary": "5.5.0"
230
+ "ajv-formats": "3.0.1"
74
231
  },
75
232
  "dependencies": {
76
- "@modelcontextprotocol/sdk": "1.29.0"
233
+ "@modelcontextprotocol/sdk": "1.29.0",
234
+ "style-dictionary": "5.5.0",
235
+ "zod": "4.4.3"
77
236
  }
78
237
  }
@@ -0,0 +1,143 @@
1
+ import { types as utilTypes } from "node:util";
2
+
3
+ import { A2A_EXPERIMENTAL_EXTENSION } from "./extensions/a2a-projection.mjs";
4
+ import { AG_UI_EXPERIMENTAL_EXTENSION } from "./extensions/agui-projection.mjs";
5
+
6
+ const SUPPORTED = Object.freeze({ a2a: "1.0", "ag-ui": "0.0.57" });
7
+ const CANONICAL = new Map([
8
+ ["a2a\u00001.0", A2A_EXPERIMENTAL_EXTENSION],
9
+ ["ag-ui\u00000.0.57", AG_UI_EXPERIMENTAL_EXTENSION],
10
+ ]);
11
+ const SENSITIVE_FIELDS = new Set(["body", "prose", "repository_path", "repository_root", "source", "source_body", "source_path"]);
12
+ const SENSITIVE_INPUT_FIELDS = new Set([...SENSITIVE_FIELDS, "path"]);
13
+ const DESCRIPTOR_KEYS = new Set(["operations", "protocol", "version"]);
14
+ const REQUEST_KEYS = new Set(["input", "operation", "protocol", "version"]);
15
+
16
+ export class ExperimentalExtensionError extends TypeError {
17
+ constructor(code, message) {
18
+ super(message);
19
+ this.name = "ExperimentalExtensionError";
20
+ this.code = code;
21
+ }
22
+ }
23
+
24
+ function fail(code, message) {
25
+ throw new ExperimentalExtensionError(code, message);
26
+ }
27
+ function unsafe() {
28
+ fail("experimental_extension_input_unsafe", "experimental extension input must contain only own plain data");
29
+ }
30
+ function descriptorsOf(value, allowedKeys) {
31
+ if (!value || typeof value !== "object" || Array.isArray(value) || utilTypes.isProxy(value)) unsafe();
32
+ const prototype = Object.getPrototypeOf(value);
33
+ if (prototype !== Object.prototype && prototype !== null) unsafe();
34
+ const keys = Reflect.ownKeys(value);
35
+ if (keys.some((key) => typeof key !== "string" || (allowedKeys && !allowedKeys.has(key)))) unsafe();
36
+ const descriptors = Object.getOwnPropertyDescriptors(value);
37
+ if (keys.some((key) => !Object.hasOwn(descriptors[key], "value") || descriptors[key].enumerable !== true)) unsafe();
38
+ return descriptors;
39
+ }
40
+ function snapshotJson(value, seen = new WeakSet()) {
41
+ if (value === null || typeof value === "string" || typeof value === "boolean") return value;
42
+ if (typeof value === "number") {
43
+ if (!Number.isFinite(value)) unsafe();
44
+ return value;
45
+ }
46
+ if (!value || typeof value !== "object" || utilTypes.isProxy(value) || seen.has(value)) unsafe();
47
+ const array = Array.isArray(value);
48
+ const prototype = Object.getPrototypeOf(value);
49
+ if (prototype !== (array ? Array.prototype : Object.prototype) && prototype !== null) unsafe();
50
+ const keys = Reflect.ownKeys(value);
51
+ if (keys.some((key) => typeof key !== "string" || key === "__proto__" || key === "prototype" || key === "constructor")) unsafe();
52
+ const descriptors = Object.getOwnPropertyDescriptors(value);
53
+ if (keys.some((key) => !Object.hasOwn(descriptors[key], "value") || (descriptors[key].enumerable !== true && !(array && key === "length")))) unsafe();
54
+ if (array && keys.some((key) => key !== "length" && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= value.length))) unsafe();
55
+ seen.add(value);
56
+ const copy = array ? [] : {};
57
+ for (const key of keys) {
58
+ if (array && key === "length") continue;
59
+ copy[key] = snapshotJson(descriptors[key].value, seen);
60
+ }
61
+ seen.delete(value);
62
+ return copy;
63
+ }
64
+ function extensionKey(protocol, version) {
65
+ return `${protocol}\u0000${version}`;
66
+ }
67
+ function deepFreeze(value) {
68
+ if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
69
+ for (const child of Object.values(value)) deepFreeze(child);
70
+ return Object.freeze(value);
71
+ }
72
+ function assertNoSensitiveFields(value, forbidden = SENSITIVE_FIELDS) {
73
+ if (!value || typeof value !== "object") return;
74
+ for (const [key, child] of Object.entries(value)) {
75
+ if (forbidden.has(key.toLowerCase())) {
76
+ fail("experimental_extension_sensitive_field_forbidden", "sensitive path or body fields cannot cross the experimental extension boundary");
77
+ }
78
+ assertNoSensitiveFields(child, forbidden);
79
+ }
80
+ }
81
+ function validateProtocol(protocol, version) {
82
+ if (typeof protocol !== "string" || !Object.hasOwn(SUPPORTED, protocol)) {
83
+ fail("experimental_extension_protocol_unknown", "experimental extension protocol is not supported");
84
+ }
85
+ if (typeof version !== "string" || SUPPORTED[protocol] !== version) {
86
+ fail("experimental_extension_version_unknown", "experimental extension version is not supported");
87
+ }
88
+ }
89
+ function snapshotDescriptor(descriptor) {
90
+ const fields = descriptorsOf(descriptor, DESCRIPTOR_KEYS);
91
+ if (!fields.protocol || !fields.version || !fields.operations) {
92
+ fail("experimental_extension_registration_invalid", "protocol, version, and operations are required");
93
+ }
94
+ const protocol = fields.protocol.value;
95
+ const version = fields.version.value;
96
+ validateProtocol(protocol, version);
97
+ const operationFields = descriptorsOf(fields.operations.value);
98
+ const names = Object.keys(operationFields).sort();
99
+ if (names.length === 0 || names.some((name) => name.length === 0 || typeof operationFields[name].value !== "function")) {
100
+ fail("experimental_extension_registration_invalid", "operations must be a non-empty own function map");
101
+ }
102
+ const canonical = CANONICAL.get(extensionKey(protocol, version));
103
+ const canonicalNames = Object.keys(canonical.operations).sort();
104
+ if (JSON.stringify(names) !== JSON.stringify(canonicalNames)) {
105
+ fail("experimental_extension_catalog_invalid", "experimental extension operation catalog does not match the governed catalog");
106
+ }
107
+ if (names.some((name) => operationFields[name].value !== canonical.operations[name])) {
108
+ fail("experimental_extension_implementation_invalid", "experimental extension implementation does not match the governed projection");
109
+ }
110
+ return { names, operations: new Map(names.map((name) => [name, operationFields[name].value])), protocol, version };
111
+ }
112
+
113
+ /** Create an empty registry. Protocol extensions are never imported or registered by v1 core. */
114
+ export function createExperimentalExtensionRegistry() {
115
+ const extensions = new Map();
116
+ const register = (descriptor) => {
117
+ const snapshot = snapshotDescriptor(descriptor);
118
+ const key = extensionKey(snapshot.protocol, snapshot.version);
119
+ if (extensions.has(key)) fail("experimental_extension_duplicate", "experimental extension is already registered");
120
+ extensions.set(key, snapshot);
121
+ return Object.freeze({ operations: Object.freeze([...snapshot.names]), protocol: snapshot.protocol, version: snapshot.version });
122
+ };
123
+ const list = () => Object.freeze([...extensions.values()]
124
+ .map(({ names, protocol, version }) => Object.freeze({ operations: Object.freeze([...names]), protocol, version }))
125
+ .sort((left, right) => left.protocol.localeCompare(right.protocol) || left.version.localeCompare(right.version)));
126
+ const project = (request) => {
127
+ const fields = descriptorsOf(request, REQUEST_KEYS);
128
+ const snapshot = snapshotJson(Object.fromEntries(Object.entries(fields).map(([key, descriptor]) => [key, descriptor.value])));
129
+ validateProtocol(snapshot.protocol, snapshot.version);
130
+ assertNoSensitiveFields(snapshot.input, SENSITIVE_INPUT_FIELDS);
131
+ const extension = extensions.get(extensionKey(snapshot.protocol, snapshot.version));
132
+ if (!extension) fail("experimental_extension_protocol_unknown", "experimental extension is not registered");
133
+ if (typeof snapshot.operation !== "string" || !extension.operations.has(snapshot.operation)) {
134
+ fail("experimental_extension_operation_unknown", "experimental extension operation is not registered");
135
+ }
136
+ const result = snapshotJson(extension.operations.get(snapshot.operation)(snapshot.input));
137
+ assertNoSensitiveFields(result);
138
+ return deepFreeze(result);
139
+ };
140
+ return Object.freeze({ list, project, register });
141
+ }
142
+
143
+ export const experimentalExtensionVersions = SUPPORTED;
@@ -0,0 +1,264 @@
1
+ import { cloneAndFreeze, hashCanonical } from "../../canonical-json.mjs";
2
+
3
+ const STATE_MAP = Object.freeze({
4
+ PENDING: "submitted", CREATED: "submitted", QUEUED: "submitted", SUBMITTED: "submitted",
5
+ RUNNING: "working", STARTED: "working", IN_PROGRESS: "working", WORKING: "working",
6
+ COMPLETED: "completed", SUCCEEDED: "completed", SUCCESS: "completed", DONE: "completed",
7
+ FAILED: "failed", ERROR: "failed", ERRORED: "failed",
8
+ CANCELED: "canceled", CANCELLED: "canceled", ABORTED: "canceled",
9
+ REJECTED: "rejected", AUTH_REQUIRED: "auth-required", AUTHENTICATION_REQUIRED: "auth-required",
10
+ });
11
+
12
+ const TERMINAL_STATES = new Set(["completed", "failed", "canceled", "rejected", "auth-required"]);
13
+
14
+ export class A2AProjectionError extends TypeError {
15
+ constructor(code, message, path = "") {
16
+ super(message);
17
+ this.name = "A2AProjectionError";
18
+ this.code = code;
19
+ if (path) this.path = path;
20
+ }
21
+ }
22
+
23
+ function fail(code, message, path) {
24
+ throw new A2AProjectionError(code, message, path);
25
+ }
26
+
27
+ function object(value) {
28
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
29
+ }
30
+
31
+ function pick(value, ...keys) {
32
+ if (!object(value)) return undefined;
33
+ for (const key of keys) if (Object.hasOwn(value, key) && value[key] !== undefined) return value[key];
34
+ return undefined;
35
+ }
36
+
37
+ function copy(value) {
38
+ return value === undefined ? undefined : structuredClone(value);
39
+ }
40
+
41
+ function freeze(value) {
42
+ return cloneAndFreeze(value);
43
+ }
44
+
45
+ function digest(value) {
46
+ return hashCanonical(value).slice("sha256:".length);
47
+ }
48
+
49
+ function idOf(value, ...keys) {
50
+ const id = pick(value, ...keys, "stableRef", "stable_ref", "id");
51
+ return typeof id === "string" && id.length > 0 ? id : undefined;
52
+ }
53
+
54
+ function domainTaskId(source, task) {
55
+ const explicit = idOf(source, "domainTaskId", "domain_task_id");
56
+ const taskRef = idOf(task, "taskId", "task_id", "stableRef", "stable_ref");
57
+ const generic = !pick(source, "domainTask", "domain_task") ? idOf(source, "taskId", "task_id") : undefined;
58
+ return explicit
59
+ ?? taskRef
60
+ ?? generic
61
+ ?? `sg:task/a2a-${digest({ task, message: pick(source, "message") }).slice(0, 20)}`;
62
+ }
63
+
64
+ function domainRunId(source, run, taskId) {
65
+ const explicit = idOf(source, "domainRunId", "domain_run_id");
66
+ const runRef = idOf(run, "runId", "run_id", "stableRef", "stable_ref");
67
+ const generic = !pick(source, "domainRun", "domain_run") ? idOf(source, "runId", "run_id") : undefined;
68
+ return explicit
69
+ ?? runRef
70
+ ?? generic
71
+ ?? `sg:run/a2a-${digest({ run, taskId }).slice(0, 20)}`;
72
+ }
73
+
74
+ function protocolIds(source, task, binding, taskId, runId) {
75
+ const protocolTaskId = pick(source, "protocolTaskId", "protocol_task_id", "a2aTaskId", "a2a_task_id")
76
+ ?? pick(binding, "protocolTaskId", "protocol_task_id", "a2aTaskId", "a2a_task_id")
77
+ ?? pick(task, "protocolTaskId", "protocol_task_id", "a2aTaskId", "a2a_task_id")
78
+ ?? `a2a-task-${digest({ taskId, runId, message: pick(source, "message"), binding }).slice(0, 24)}`;
79
+ const protocolContextId = pick(source, "protocolContextId", "protocol_context_id", "a2aContextId", "a2a_context_id")
80
+ ?? pick(binding, "protocolContextId", "protocol_context_id", "a2aContextId", "a2a_context_id")
81
+ ?? pick(task, "contextId", "context_id")
82
+ ?? `a2a-context-${digest({ taskId, runId }).slice(0, 24)}`;
83
+ if (protocolTaskId === taskId || protocolTaskId === runId) fail("protocol_task_id_conflict", "A2A task ID must not equal a domain Task or Run ID", "protocolTaskId");
84
+ if (protocolContextId === taskId || protocolContextId === runId || protocolContextId === protocolTaskId) fail("protocol_context_id_conflict", "A2A context ID must remain distinct from domain and task IDs", "protocolContextId");
85
+ return { protocolTaskId: String(protocolTaskId), protocolContextId: String(protocolContextId) };
86
+ }
87
+
88
+ function makeBinding(binding, taskId, runId, protocolTaskId, protocolContextId) {
89
+ const supplied = object(binding) ? copy(binding) : {};
90
+ const bindingId = pick(supplied, "bindingId", "binding_id", "protocolBindingId", "protocol_binding_id")
91
+ ?? `sg:binding/a2a-${digest({ taskId, runId, protocolTaskId, protocolContextId }).slice(0, 24)}`;
92
+ if (typeof bindingId !== "string" || bindingId.length === 0) fail("protocol_binding_required", "ProtocolBinding requires a non-empty binding ID", "protocolBindingId");
93
+ if (bindingId === taskId || bindingId === runId || bindingId === protocolTaskId || bindingId === protocolContextId) fail("protocol_binding_id_conflict", "ProtocolBinding ID must remain distinct from every correlated ID", "protocolBindingId");
94
+ return freeze({
95
+ ...supplied,
96
+ bindingId,
97
+ domainRunId: runId,
98
+ domainTaskId: taskId,
99
+ protocol: "a2a",
100
+ protocolBindingId: bindingId,
101
+ protocolContextId,
102
+ protocolTaskId,
103
+ runId,
104
+ taskId,
105
+ });
106
+ }
107
+
108
+ function taskFrom(input) {
109
+ const source = object(input) ? input : {};
110
+ const task = object(source.task) ? source.task : source;
111
+ return object(task.task) && !pick(task, "status", "id", "contextId") ? task.task : task;
112
+ }
113
+
114
+ function bindingFrom(input, task) {
115
+ return pick(input, "protocolBinding", "protocol_binding", "binding")
116
+ ?? pick(task, "protocolBinding", "protocol_binding", "binding")
117
+ ?? {};
118
+ }
119
+
120
+ function domainState(input, task) {
121
+ const source = object(input) ? input : {};
122
+ const domainTask = pick(source, "domainTask", "domain_task");
123
+ return pick(domainTask, "state", "status", "taskState", "task_state")
124
+ ?? pick(task, "domainState", "domain_state")
125
+ ?? pick(task, "state", "taskState", "task_state")
126
+ ?? pick(pick(task, "status"), "state", "status")
127
+ ?? "UNKNOWN";
128
+ }
129
+
130
+ function taskStatus(task, state) {
131
+ const status = object(pick(task, "status")) ? copy(task.status) : {};
132
+ return { ...status, state };
133
+ }
134
+
135
+ function responseFor(task) {
136
+ const { protocolBinding: _binding, ...nested } = task;
137
+ return freeze({ ...task, task: nested });
138
+ }
139
+
140
+ function projectTask(input, state, mode = "project") {
141
+ const source = object(input) ? input : {};
142
+ const task = taskFrom(source);
143
+ const domainTask = object(pick(source, "domainTask", "domain_task")) ? pick(source, "domainTask", "domain_task") : task;
144
+ const run = pick(source, "run", "domainRun", "domain_run");
145
+ const taskId = domainTaskId(source, domainTask);
146
+ const runId = domainRunId(source, run, taskId);
147
+ const suppliedBinding = bindingFrom(source, task);
148
+ const { protocolTaskId, protocolContextId } = protocolIds(source, task, suppliedBinding, taskId, runId);
149
+ const binding = makeBinding(suppliedBinding, taskId, runId, protocolTaskId, protocolContextId);
150
+ const requestedTaskId = pick(source, "taskId", "task_id");
151
+ const existingProtocolId = pick(task, "id", "protocolTaskId", "protocol_task_id")
152
+ ?? (object(pick(task, "status")) ? pick(task, "taskId", "task_id") : undefined);
153
+ const currentProtocolId = mode === "send" ? protocolTaskId : existingProtocolId ?? protocolTaskId;
154
+ if (requestedTaskId !== undefined && requestedTaskId !== currentProtocolId && requestedTaskId !== protocolTaskId) fail("protocol_task_mismatch", "requested A2A task ID does not match the correlated task", "taskId");
155
+ const message = pick(source, "message");
156
+ const history = Array.isArray(pick(task, "history")) ? copy(task.history) : (message ? [copy(message)] : []);
157
+ const artifacts = Array.isArray(pick(task, "artifacts")) ? copy(task.artifacts) : [];
158
+ const projected = {
159
+ artifacts,
160
+ contextId: protocolContextId,
161
+ history,
162
+ id: currentProtocolId,
163
+ kind: "task",
164
+ metadata: {
165
+ ...(object(pick(task, "metadata")) ? copy(task.metadata) : {}),
166
+ stylegallery: { domainRunId: runId, domainTaskId: taskId, protocolBindingId: binding.protocolBindingId },
167
+ },
168
+ protocolBinding: binding,
169
+ status: taskStatus(task, state),
170
+ };
171
+ if (mode === "send") projected.history = message ? [copy(message)] : history;
172
+ return freeze(projected);
173
+ }
174
+
175
+ /** Map every domain lifecycle state to an official A2A TaskState value. */
176
+ export function mapTaskState(value) {
177
+ const raw = typeof value === "string" ? value : pick(value, "state", "status", "taskState", "task_state");
178
+ const normalized = String(raw ?? "UNKNOWN").trim().toUpperCase().replaceAll("-", "_").replaceAll(" ", "_");
179
+ return STATE_MAP[normalized] ?? "unknown";
180
+ }
181
+
182
+ /** Return the deterministic, v1-shaped Agent Card for StyleGallery. */
183
+ export function createAgentCard(input = {}) {
184
+ const source = object(input) ? input : {};
185
+ const skills = [
186
+ ["discover", "Discover StyleGallery capabilities and immutable manifest."],
187
+ ["resolve", "Resolve a StableRef or VersionID to its immutable object."],
188
+ ["claims", "Inspect claims, evidence, validation, and governance disposition."],
189
+ ["context", "Build a bounded retrieval context package with provenance."],
190
+ ["ops", "List read-only operation specifications and schemas."],
191
+ ["retrieve", "Retrieve ranked governed knowledge without mutation."],
192
+ ].map(([id, description]) => ({ description, examples: [], id, inputModes: ["text", "data"], name: id, outputModes: ["text", "data"], tags: ["stylegallery", "knowledge"] }));
193
+ return freeze({
194
+ capabilities: { pushNotifications: false, stateTransitionHistory: true, streaming: false },
195
+ defaultInputModes: ["text", "data"],
196
+ defaultOutputModes: ["text", "data"],
197
+ description: typeof source.description === "string" ? source.description : "Evidence-preserving, agent-native StyleGallery knowledge operations.",
198
+ name: typeof source.name === "string" ? source.name : "StyleGallery Agent",
199
+ protocolVersion: "1.0",
200
+ skills,
201
+ supportsAuthenticatedExtendedCard: false,
202
+ url: typeof source.url === "string" ? source.url : "https://stylegallery.local/agent",
203
+ version: typeof source.version === "string" ? source.version : "1.0.0",
204
+ });
205
+ }
206
+
207
+ /** Project an A2A SendMessage request into a new submitted protocol task. */
208
+ export function sendMessage(input) {
209
+ const source = object(input) ? input : fail("send_message_input_required", "sendMessage expects an object");
210
+ const message = pick(source, "message");
211
+ if (!object(message)) fail("message_required", "SendMessage requires a message object", "message");
212
+ const task = projectTask({ ...source, message }, "submitted", "send");
213
+ return responseFor(task);
214
+ }
215
+
216
+ /** Project current domain Task/Run state while preserving the A2A task ID. */
217
+ export function getTask(input) {
218
+ const source = object(input) ? input : fail("get_task_input_required", "getTask expects an object");
219
+ const task = taskFrom(source);
220
+ const taskId = pick(source, "taskId", "task_id");
221
+ if (taskId === undefined && !idOf(task, "id", "taskId", "task_id", "protocolTaskId", "protocol_task_id")) fail("protocol_task_required", "GetTask requires an A2A task ID", "taskId");
222
+ const state = mapTaskState(domainState(source, task));
223
+ const projected = projectTask(source, state);
224
+ return responseFor(projected);
225
+ }
226
+
227
+ /** Request cancellation; terminal non-canceled states reject invalid transitions. */
228
+ export function cancelTask(input) {
229
+ const source = object(input) ? input : fail("cancel_task_input_required", "cancelTask expects an object");
230
+ const task = taskFrom(source);
231
+ const current = mapTaskState(domainState(source, task));
232
+ if (TERMINAL_STATES.has(current) && current !== "canceled") fail("cancellation_not_allowed", `cannot cancel a ${current} A2A task`, "task");
233
+ if (current === "unknown") fail("invalid_task_transition", "cannot cancel an unknown A2A task state", "task");
234
+ const projected = projectTask(source, "canceled");
235
+ return responseFor(projected);
236
+ }
237
+
238
+ export const buildAgentCard = createAgentCard;
239
+ export const projectAgentCard = createAgentCard;
240
+ export const agentCard = createAgentCard;
241
+ export const projectSendMessage = sendMessage;
242
+ export const handleSendMessage = sendMessage;
243
+ export const projectGetTask = getTask;
244
+ export const handleGetTask = getTask;
245
+ export const projectCancelTask = cancelTask;
246
+ export const handleCancelTask = cancelTask;
247
+ export const projectTaskState = mapTaskState;
248
+ export const toA2ATaskState = mapTaskState;
249
+
250
+ export const A2A_EXPERIMENTAL_EXTENSION = Object.freeze({
251
+ protocol: "a2a",
252
+ version: "1.0",
253
+ operations: Object.freeze({
254
+ "agent-card.create": createAgentCard,
255
+ "message.send": sendMessage,
256
+ "task.cancel": cancelTask,
257
+ "task.get": getTask,
258
+ "task.state": mapTaskState,
259
+ }),
260
+ });
261
+
262
+ export function registerA2AExtension(registry) {
263
+ return registry.register(A2A_EXPERIMENTAL_EXTENSION);
264
+ }