stylegallery 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -1
- package/DOMAINS.md +2 -6
- package/GOVERNANCE.md +10 -9
- package/README.md +29 -127
- package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
- package/consumer-reference/agent-native/v2/material-registry.json +1 -0
- package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
- package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
- package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
- package/consumer-reference/contract.md +1 -1
- package/consumer-reference/index.md +5 -3
- package/layout/index.md +124 -0
- package/log.md +57 -0
- package/package.json +183 -22
- package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
- package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
- package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
- package/scripts/agent-native/v2/material-admission.mjs +295 -0
- package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
- package/scripts/agent-native/v2/material-context.mjs +251 -0
- package/scripts/agent-native/v2/material-identity.mjs +71 -0
- package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
- package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
- package/scripts/agent-native/v2/material-queries.mjs +398 -0
- package/scripts/agent-native/v2/material-registry.mjs +319 -0
- package/scripts/sg-material-mcp.mjs +98 -0
- package/scripts/sg-material.mjs +27 -0
- package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
- package/consumer-reference/baselines/calibration.json +0 -260
- package/consumer-reference/baselines/manifest.json +0 -21
- package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
- package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
- package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
- package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
- package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
- package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
- package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
- package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
- package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
- package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
- package/consumer-reference/fixtures/promotion/manifest.json +0 -15
- package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
- package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
- package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
- package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
- package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
- package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
- package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
- package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
- package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
- package/consumer-reference/fixtures/valid-deprecated.json +0 -21
- package/consumer-reference/fixtures/valid-experimental.json +0 -19
- package/consumer-reference/generated/manifest.json +0 -40
- package/consumer-reference/generated/tokens.css +0 -12
- package/consumer-reference/policies/shared-experimental.json +0 -37
- package/consumer-reference/schema/ax-evidence.schema.json +0 -30
- package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
- package/consumer-reference/schema/calibration-record.schema.json +0 -190
- package/consumer-reference/schema/capture-session.schema.json +0 -161
- package/consumer-reference/schema/component-state.schema.json +0 -150
- package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
- package/consumer-reference/schema/dom-evidence.schema.json +0 -38
- package/consumer-reference/schema/evidence-record.schema.json +0 -81
- package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
- package/consumer-reference/schema/item.schema.json +0 -188
- package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
- package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
- package/consumer-reference/schema/portable-tokens.schema.json +0 -104
- package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
- package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
- package/consumer-reference/schema/visual-evidence.schema.json +0 -31
- package/design-engineering/consumer-migration-readiness.md +0 -124
- package/design-engineering/interface-craft.md +0 -107
- package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
- package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
- package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
- package/game-ui/classification.md +0 -82
- package/game-ui/reference-record.md +0 -62
- package/game-ui/screen-hierarchy.md +0 -107
- package/game-ui/unity/architecture.md +0 -166
- package/game-ui/unity/cli-loop.md +0 -84
- package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
- package/game-ui/unity/org-wiki.md +0 -146
- package/game-ui/unity/repository-map.md +0 -102
- package/game-ui/unity/ui-systems.md +0 -85
- package/motion/practice-reference.md +0 -145
- package/motion/review-workflow.md +0 -86
- package/motion/vocabulary.md +0 -82
- package/platform-guides/apple-interaction.md +0 -89
- package/scripts/agent-native/events.mjs +0 -113
- package/scripts/agent-native/immutable-store.mjs +0 -102
- package/scripts/artifact-metadata.mjs +0 -20
- package/scripts/audit-evidence-freshness.mjs +0 -308
- package/scripts/baseline-contract.mjs +0 -189
- package/scripts/baseline-schema-parity.mjs +0 -40
- package/scripts/build-reference-artifacts.mjs +0 -127
- package/scripts/calibration-raw-contract.mjs +0 -172
- package/scripts/capture-session-contract.mjs +0 -187
- package/scripts/component-state-artifact-fixture.mjs +0 -44
- package/scripts/component-state-contract.mjs +0 -99
- package/scripts/component-state-semantics.mjs +0 -128
- package/scripts/component-state-workflow-contract.mjs +0 -67
- package/scripts/component-state-workflow-negative-cases.mjs +0 -64
- package/scripts/consumer-conformance-contract.mjs +0 -198
- package/scripts/consumer-evidence-governance-contract.mjs +0 -210
- package/scripts/consumer-reference-case-runner.mjs +0 -93
- package/scripts/consumer-reference-schema.mjs +0 -155
- package/scripts/create-component-state-session.mjs +0 -100
- package/scripts/create-page-evidence-session.mjs +0 -139
- package/scripts/domain-document-boundaries.mjs +0 -40
- package/scripts/domain-validation-checks.mjs +0 -141
- package/scripts/evidence-artifact-contract.mjs +0 -191
- package/scripts/finalize-component-state-evidence.mjs +0 -165
- package/scripts/finalize-page-evidence.mjs +0 -197
- package/scripts/generate-consumer-reference-evidence.mjs +0 -154
- package/scripts/generate-patterns.mjs +0 -218
- package/scripts/governance-matrix-contract.mjs +0 -73
- package/scripts/governance-matrix-negative-cases.mjs +0 -114
- package/scripts/governance-policy-contract.mjs +0 -49
- package/scripts/governance-test-fixture.mjs +0 -321
- package/scripts/governance-workflow-negative-cases.mjs +0 -241
- package/scripts/governed-profile-registry.mjs +0 -125
- package/scripts/json-schema-formats.mjs +0 -31
- package/scripts/markdown-structure.mjs +0 -45
- package/scripts/page-artifact-metadata.mjs +0 -124
- package/scripts/page-evidence-contract.mjs +0 -297
- package/scripts/page-evidence-fixture.mjs +0 -271
- package/scripts/pattern-data.mjs +0 -325
- package/scripts/profile-record-contract.mjs +0 -140
- package/scripts/promotion-attestation-contract.mjs +0 -91
- package/scripts/promotion-boundary-test-contract.mjs +0 -92
- package/scripts/promotion-fixture-inventory.mjs +0 -109
- package/scripts/promotion-governance-contract.mjs +0 -28
- package/scripts/reference-artifact-path-contract.mjs +0 -28
- package/scripts/reference-profile-contract.mjs +0 -114
- package/scripts/reference-token-contract.mjs +0 -156
- package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
- package/scripts/summarize-sentinel-calibration.mjs +0 -98
- package/scripts/test-agent-adapter-conformance.mjs +0 -250
- package/scripts/test-agent-conformance-receipt.mjs +0 -106
- package/scripts/test-agent-events.mjs +0 -81
- package/scripts/test-agent-execution-effects.mjs +0 -114
- package/scripts/test-agent-execution-fixtures.mjs +0 -140
- package/scripts/test-agent-execution-kernel.mjs +0 -39
- package/scripts/test-agent-execution-learning.mjs +0 -130
- package/scripts/test-agent-execution-lifecycle.mjs +0 -143
- package/scripts/test-agent-execution-safety.mjs +0 -158
- package/scripts/test-agent-execution-views.mjs +0 -117
- package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
- package/scripts/test-agent-knowledge-kernel.mjs +0 -183
- package/scripts/test-agent-learning.mjs +0 -246
- package/scripts/test-agent-mcp.mjs +0 -246
- package/scripts/test-agent-native-schemas.mjs +0 -215
- package/scripts/test-agent-projections.mjs +0 -249
- package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
- package/scripts/test-agent-registry-mutations.mjs +0 -110
- package/scripts/test-audit-evidence-freshness.mjs +0 -177
- package/scripts/test-component-state-sentinel.mjs +0 -35
- package/scripts/test-component-state-source-contract.mjs +0 -83
- package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
- package/scripts/test-consumer-reference-sentinel.mjs +0 -31
- package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
- package/scripts/test-json-cli-output.mjs +0 -151
- package/scripts/test-json-schema-formats.mjs +0 -40
- package/scripts/test-reference-adapters.mjs +0 -199
- package/scripts/test-renderer-purity.mjs +0 -34
- package/scripts/test-sg-cli.mjs +0 -129
- package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
- package/scripts/test-validate-baseline-manifest.mjs +0 -234
- package/scripts/test-validate-component-state-artifacts.mjs +0 -243
- package/scripts/test-validate-component-state.mjs +0 -106
- package/scripts/test-validate-consumer-conformance.mjs +0 -427
- package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
- package/scripts/test-validate-consumer-reference.mjs +0 -263
- package/scripts/test-validate-domains.mjs +0 -357
- package/scripts/test-validate-governance.mjs +0 -292
- package/scripts/test-validate-ia.mjs +0 -262
- package/scripts/test-validate-okf.mjs +0 -73
- package/scripts/test-validate-page-evidence.mjs +0 -302
- package/scripts/test-validate-patterns.mjs +0 -157
- package/scripts/test-validate-promotion-rfc.mjs +0 -250
- package/scripts/test-validate-reference-profiles.mjs +0 -170
- package/scripts/test-validate-unity-org-wiki.mjs +0 -57
- package/scripts/test-validate-unity-source-contracts.mjs +0 -67
- package/scripts/test-validate-vocabulary.mjs +0 -174
- package/scripts/test-validate-webpage-workflow.mjs +0 -293
- package/scripts/validate-baseline-manifest.mjs +0 -44
- package/scripts/validate-catalog.mjs +0 -65
- package/scripts/validate-component-state.mjs +0 -141
- package/scripts/validate-consumer-conformance.mjs +0 -477
- package/scripts/validate-consumer-reference.mjs +0 -288
- package/scripts/validate-domains.mjs +0 -237
- package/scripts/validate-governance.mjs +0 -248
- package/scripts/validate-ia.mjs +0 -136
- package/scripts/validate-links.mjs +0 -66
- package/scripts/validate-okf.mjs +0 -104
- package/scripts/validate-page-evidence.mjs +0 -191
- package/scripts/validate-patterns.mjs +0 -246
- package/scripts/validate-promotion-rfc.mjs +0 -224
- package/scripts/validate-reference-artifacts.mjs +0 -125
- package/scripts/validate-renderer-purity.mjs +0 -56
- package/scripts/validate-unity-org-wiki.mjs +0 -146
- package/scripts/validate-unity-source-contracts.mjs +0 -107
- package/scripts/validate-vocabulary.mjs +0 -115
- package/scripts/validate-webpage-workflow.mjs +0 -254
- package/scripts/visual-expectation-contract.mjs +0 -20
- 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.
|
|
4
|
-
"description": "A governed gallery of portable interface knowledge with
|
|
3
|
+
"version": "0.1.2",
|
|
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
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
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
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
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,25 @@
|
|
|
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:homepage:cdp": "node examples/stylegallery-homepage/qa.mjs",
|
|
206
|
+
"test:consumer-conformance:matrix": "node scripts/agent-native/v2/test-consumer-conformance-matrix-comparator.mjs",
|
|
207
|
+
"test:consumer-conformance:matrix:execute": "node scripts/agent-native/v2/test-consumer-conformance-matrix-comparator.mjs --execute",
|
|
58
208
|
"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
209
|
"test:component-state:runtime": "playwright test tests/component-state-evidence.spec.mjs --project=chromium",
|
|
60
210
|
"test:component-state:runtime-negative": "node scripts/test-component-state-sentinel.mjs",
|
|
61
211
|
"test:sentinel": "playwright test tests/consumer-reference-sentinels.spec.mjs --project=chromium",
|
|
212
|
+
"test:source-inventory": "node --test scripts/test-repository-source-inventory.mjs",
|
|
213
|
+
"test:json-schema-formats": "node --test scripts/test-json-schema-formats.mjs",
|
|
214
|
+
"generate:material": "node scripts/agent-native/v2/generate-material-registry.mjs",
|
|
215
|
+
"validate:material": "node scripts/agent-native/v2/validate-material-registry.mjs",
|
|
216
|
+
"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",
|
|
217
|
+
"test:lifecycle-dispositions": "node scripts/test-lifecycle-disposition.mjs",
|
|
218
|
+
"validate:lifecycle-dispositions": "node scripts/validate-lifecycle-disposition.mjs --json",
|
|
62
219
|
"sg": "node scripts/sg.mjs",
|
|
220
|
+
"sg:material": "node scripts/sg-material.mjs",
|
|
221
|
+
"sg:material:mcp": "node scripts/sg-material-mcp.mjs",
|
|
63
222
|
"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",
|
|
223
|
+
"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
224
|
"validate": "node scripts/validate-reference-artifacts.mjs --manifest consumer-reference/generated/manifest.json --json",
|
|
66
225
|
"validate:component-state": "node scripts/validate-component-state.mjs --json && node scripts/generate-consumer-reference-evidence.mjs --check --json"
|
|
67
226
|
},
|
|
@@ -69,10 +228,12 @@
|
|
|
69
228
|
"@axe-core/playwright": "4.12.1",
|
|
70
229
|
"@playwright/test": "1.61.0",
|
|
71
230
|
"ajv": "8.20.0",
|
|
72
|
-
"ajv-formats": "3.0.1"
|
|
73
|
-
"style-dictionary": "5.5.0"
|
|
231
|
+
"ajv-formats": "3.0.1"
|
|
74
232
|
},
|
|
75
233
|
"dependencies": {
|
|
76
|
-
"@
|
|
234
|
+
"@chenglou/pretext": "0.0.8",
|
|
235
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
236
|
+
"style-dictionary": "5.5.0",
|
|
237
|
+
"zod": "4.4.3"
|
|
77
238
|
}
|
|
78
239
|
}
|
|
@@ -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
|
+
}
|