@elicitkit/conformance 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/corpus.d.ts +338 -0
- package/dist/corpus.d.ts.map +1 -0
- package/dist/corpus.js +328 -0
- package/dist/corpus.js.map +1 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +211 -0
- package/dist/index.js.map +1 -0
- package/package.json +23 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2026 the Elicitkit authors
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
package/dist/corpus.d.ts
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The conformance corpus — spec-derived fixtures. This file is the
|
|
3
|
+
* language-agnostic source of truth for "Elicitkit-compliant" (SPEC §8).
|
|
4
|
+
* Any implementation in any language can consume these cases; the runner
|
|
5
|
+
* (index.ts) is just the reference harness over them.
|
|
6
|
+
*/
|
|
7
|
+
export interface AskSetCase {
|
|
8
|
+
name: string;
|
|
9
|
+
valid: boolean;
|
|
10
|
+
/** an AskSet payload */
|
|
11
|
+
askSet: unknown;
|
|
12
|
+
note: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AnswerCase {
|
|
15
|
+
name: string;
|
|
16
|
+
valid: boolean;
|
|
17
|
+
/** the AskSet the answer is for (single ask) */
|
|
18
|
+
askSet: unknown;
|
|
19
|
+
/** raw answers array */
|
|
20
|
+
answers: unknown;
|
|
21
|
+
note: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const VALID_ASKSETS: AskSetCase[];
|
|
24
|
+
export declare const INVALID_ASKSETS: AskSetCase[];
|
|
25
|
+
export declare const VALID_ANSWERS: AnswerCase[];
|
|
26
|
+
export declare const INVALID_ANSWERS: AnswerCase[];
|
|
27
|
+
export interface ElicitationRenderCase {
|
|
28
|
+
name: string;
|
|
29
|
+
/** A single-Ask AskSet to render through the elicitation tier. */
|
|
30
|
+
askSet: unknown;
|
|
31
|
+
/** Substrings that MUST appear in message + serialized request schema. */
|
|
32
|
+
mustInclude: string[];
|
|
33
|
+
/** Substrings that MUST NOT appear (e.g. labels leaking as wire ids). */
|
|
34
|
+
mustExclude?: string[];
|
|
35
|
+
note: string;
|
|
36
|
+
}
|
|
37
|
+
export declare const ELICITATION_RENDER: ElicitationRenderCase[];
|
|
38
|
+
export interface IntegrationCase {
|
|
39
|
+
name: string;
|
|
40
|
+
/** The AskSet to validate + render across all 4 tiers. */
|
|
41
|
+
askSet: unknown;
|
|
42
|
+
/** Per-tier substrings that MUST appear in the tier's rendering. The
|
|
43
|
+
* same labels are expected to surface across tiers (cross-type-drift
|
|
44
|
+
* guard); the lists are split per-tier in case a tier emits less
|
|
45
|
+
* context (e.g. tui condenses; the runner unions them in practice). */
|
|
46
|
+
mustIncludePerTier: {
|
|
47
|
+
apps: string[];
|
|
48
|
+
url: string[];
|
|
49
|
+
tui: string[];
|
|
50
|
+
elicitation: string[];
|
|
51
|
+
};
|
|
52
|
+
note: string;
|
|
53
|
+
}
|
|
54
|
+
/** Public re-export so adopters can drive the same showcase through their
|
|
55
|
+
* own renderTiers implementation without duplicating the fixture. */
|
|
56
|
+
export declare const SHOWCASE: {
|
|
57
|
+
readonly specVersion: "0.1.0";
|
|
58
|
+
readonly meta: {
|
|
59
|
+
readonly layout: "auto";
|
|
60
|
+
readonly accent: "#7c3aed";
|
|
61
|
+
};
|
|
62
|
+
readonly asks: readonly [{
|
|
63
|
+
readonly id: "text_single";
|
|
64
|
+
readonly type: "ask_text";
|
|
65
|
+
readonly prompt: "Single-line text";
|
|
66
|
+
readonly help: "ask_text — auto half-width.";
|
|
67
|
+
readonly spec: {
|
|
68
|
+
readonly placeholder: "type here";
|
|
69
|
+
};
|
|
70
|
+
readonly meta: {
|
|
71
|
+
specVersion: string;
|
|
72
|
+
minTier: string;
|
|
73
|
+
};
|
|
74
|
+
}, {
|
|
75
|
+
readonly id: "text_multi";
|
|
76
|
+
readonly type: "ask_text";
|
|
77
|
+
readonly prompt: "Multiline text";
|
|
78
|
+
readonly help: "ask_text multiline — auto full-width.";
|
|
79
|
+
readonly required: false;
|
|
80
|
+
readonly spec: {
|
|
81
|
+
readonly multiline: true;
|
|
82
|
+
readonly placeholder: "longer answer…";
|
|
83
|
+
};
|
|
84
|
+
readonly meta: {
|
|
85
|
+
specVersion: string;
|
|
86
|
+
minTier: string;
|
|
87
|
+
};
|
|
88
|
+
}, {
|
|
89
|
+
readonly id: "sel_list";
|
|
90
|
+
readonly type: "ask_select";
|
|
91
|
+
readonly prompt: "Select — list (default)";
|
|
92
|
+
readonly spec: {
|
|
93
|
+
readonly options: readonly [{
|
|
94
|
+
readonly id: "a";
|
|
95
|
+
readonly label: "Alpha";
|
|
96
|
+
readonly description: "first option";
|
|
97
|
+
}, {
|
|
98
|
+
readonly id: "b";
|
|
99
|
+
readonly label: "Bravo";
|
|
100
|
+
}];
|
|
101
|
+
};
|
|
102
|
+
readonly meta: {
|
|
103
|
+
specVersion: string;
|
|
104
|
+
minTier: string;
|
|
105
|
+
};
|
|
106
|
+
}, {
|
|
107
|
+
readonly id: "sel_segmented";
|
|
108
|
+
readonly type: "ask_select";
|
|
109
|
+
readonly prompt: "Select — segmented";
|
|
110
|
+
readonly spec: {
|
|
111
|
+
readonly display: "segmented";
|
|
112
|
+
readonly options: readonly [{
|
|
113
|
+
readonly id: "lo";
|
|
114
|
+
readonly label: "Low";
|
|
115
|
+
}, {
|
|
116
|
+
readonly id: "md";
|
|
117
|
+
readonly label: "Med";
|
|
118
|
+
}, {
|
|
119
|
+
readonly id: "hi";
|
|
120
|
+
readonly label: "High";
|
|
121
|
+
}];
|
|
122
|
+
};
|
|
123
|
+
readonly meta: {
|
|
124
|
+
specVersion: string;
|
|
125
|
+
minTier: string;
|
|
126
|
+
};
|
|
127
|
+
}, {
|
|
128
|
+
readonly id: "sel_cards";
|
|
129
|
+
readonly type: "ask_select";
|
|
130
|
+
readonly prompt: "Select — cards with icons";
|
|
131
|
+
readonly spec: {
|
|
132
|
+
readonly display: "cards";
|
|
133
|
+
readonly options: readonly [{
|
|
134
|
+
readonly id: "ship";
|
|
135
|
+
readonly label: "Ship";
|
|
136
|
+
readonly description: "deploy now";
|
|
137
|
+
readonly icon: "rocket";
|
|
138
|
+
}, {
|
|
139
|
+
readonly id: "hold";
|
|
140
|
+
readonly label: "Hold";
|
|
141
|
+
readonly description: "needs review";
|
|
142
|
+
readonly icon: "clock";
|
|
143
|
+
}, {
|
|
144
|
+
readonly id: "block";
|
|
145
|
+
readonly label: "Block";
|
|
146
|
+
readonly description: "do not merge";
|
|
147
|
+
readonly icon: "warning";
|
|
148
|
+
}];
|
|
149
|
+
};
|
|
150
|
+
readonly meta: {
|
|
151
|
+
specVersion: string;
|
|
152
|
+
minTier: string;
|
|
153
|
+
};
|
|
154
|
+
}, {
|
|
155
|
+
readonly id: "sel_grid_multi";
|
|
156
|
+
readonly type: "ask_select";
|
|
157
|
+
readonly prompt: "Multi-select — grid, with color swatches";
|
|
158
|
+
readonly spec: {
|
|
159
|
+
readonly multiple: true;
|
|
160
|
+
readonly min: 1;
|
|
161
|
+
readonly display: "grid";
|
|
162
|
+
readonly options: readonly [{
|
|
163
|
+
readonly id: "red";
|
|
164
|
+
readonly label: "Critical";
|
|
165
|
+
readonly description: "P0";
|
|
166
|
+
readonly color: "#dc2626";
|
|
167
|
+
}, {
|
|
168
|
+
readonly id: "amber";
|
|
169
|
+
readonly label: "Warning";
|
|
170
|
+
readonly description: "P1";
|
|
171
|
+
readonly color: "#d97706";
|
|
172
|
+
}, {
|
|
173
|
+
readonly id: "green";
|
|
174
|
+
readonly label: "Healthy";
|
|
175
|
+
readonly description: "P2";
|
|
176
|
+
readonly color: "#059669";
|
|
177
|
+
}];
|
|
178
|
+
};
|
|
179
|
+
readonly meta: {
|
|
180
|
+
specVersion: string;
|
|
181
|
+
minTier: string;
|
|
182
|
+
};
|
|
183
|
+
}, {
|
|
184
|
+
readonly id: "confirm_cards";
|
|
185
|
+
readonly type: "ask_confirm";
|
|
186
|
+
readonly prompt: "Confirm — with consequence";
|
|
187
|
+
readonly spec: {
|
|
188
|
+
readonly affirm: "Run migration";
|
|
189
|
+
readonly deny: "Skip";
|
|
190
|
+
readonly consequence: "Irreversible without a restore.";
|
|
191
|
+
};
|
|
192
|
+
readonly meta: {
|
|
193
|
+
specVersion: string;
|
|
194
|
+
minTier: string;
|
|
195
|
+
};
|
|
196
|
+
}, {
|
|
197
|
+
readonly id: "num";
|
|
198
|
+
readonly type: "ask_number";
|
|
199
|
+
readonly prompt: "Number — bounded integer with unit";
|
|
200
|
+
readonly spec: {
|
|
201
|
+
readonly min: 1;
|
|
202
|
+
readonly max: 64;
|
|
203
|
+
readonly step: 1;
|
|
204
|
+
readonly integer: true;
|
|
205
|
+
readonly unit: "vCPU";
|
|
206
|
+
};
|
|
207
|
+
readonly meta: {
|
|
208
|
+
specVersion: string;
|
|
209
|
+
minTier: string;
|
|
210
|
+
};
|
|
211
|
+
}, {
|
|
212
|
+
readonly id: "rate_stars";
|
|
213
|
+
readonly type: "ask_rating";
|
|
214
|
+
readonly prompt: "Rating — stars with labels";
|
|
215
|
+
readonly spec: {
|
|
216
|
+
readonly max: 5;
|
|
217
|
+
readonly icon: "star";
|
|
218
|
+
readonly labels: {
|
|
219
|
+
readonly min: "poor";
|
|
220
|
+
readonly max: "great";
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
readonly meta: {
|
|
224
|
+
specVersion: string;
|
|
225
|
+
minTier: string;
|
|
226
|
+
};
|
|
227
|
+
}, {
|
|
228
|
+
readonly id: "slider";
|
|
229
|
+
readonly type: "ask_slider";
|
|
230
|
+
readonly prompt: "Slider — 0–100 step 5";
|
|
231
|
+
readonly spec: {
|
|
232
|
+
readonly min: 0;
|
|
233
|
+
readonly max: 100;
|
|
234
|
+
readonly step: 5;
|
|
235
|
+
readonly unit: "%";
|
|
236
|
+
};
|
|
237
|
+
readonly meta: {
|
|
238
|
+
specVersion: string;
|
|
239
|
+
minTier: string;
|
|
240
|
+
};
|
|
241
|
+
}, {
|
|
242
|
+
readonly id: "date";
|
|
243
|
+
readonly type: "ask_date";
|
|
244
|
+
readonly prompt: "Date";
|
|
245
|
+
readonly spec: {};
|
|
246
|
+
readonly meta: {
|
|
247
|
+
specVersion: string;
|
|
248
|
+
minTier: string;
|
|
249
|
+
};
|
|
250
|
+
}, {
|
|
251
|
+
readonly id: "rank";
|
|
252
|
+
readonly type: "ask_rank";
|
|
253
|
+
readonly prompt: "Rank — reorderable, with descriptions";
|
|
254
|
+
readonly spec: {
|
|
255
|
+
readonly items: readonly [{
|
|
256
|
+
readonly id: "speed";
|
|
257
|
+
readonly label: "Ship speed";
|
|
258
|
+
}, {
|
|
259
|
+
readonly id: "safety";
|
|
260
|
+
readonly label: "Safety";
|
|
261
|
+
readonly description: "rollback / blast radius";
|
|
262
|
+
}, {
|
|
263
|
+
readonly id: "polish";
|
|
264
|
+
readonly label: "UX polish";
|
|
265
|
+
}];
|
|
266
|
+
};
|
|
267
|
+
readonly meta: {
|
|
268
|
+
specVersion: string;
|
|
269
|
+
minTier: string;
|
|
270
|
+
};
|
|
271
|
+
}, {
|
|
272
|
+
readonly id: "color_fixed";
|
|
273
|
+
readonly type: "ask_color";
|
|
274
|
+
readonly prompt: "Color — fixed palette only";
|
|
275
|
+
readonly spec: {
|
|
276
|
+
readonly palette: readonly ["#1d4ed8", "#059669", "#d97706"];
|
|
277
|
+
};
|
|
278
|
+
readonly meta: {
|
|
279
|
+
specVersion: string;
|
|
280
|
+
minTier: string;
|
|
281
|
+
};
|
|
282
|
+
}, {
|
|
283
|
+
readonly id: "diff";
|
|
284
|
+
readonly type: "ask_code_diff";
|
|
285
|
+
readonly prompt: "Code diff — multi-file, per-hunk accept/reject";
|
|
286
|
+
readonly help: "ask_code_diff — always full-width; the v0.1 wedge.";
|
|
287
|
+
readonly spec: {
|
|
288
|
+
readonly granularity: "hunk";
|
|
289
|
+
readonly files: readonly [{
|
|
290
|
+
readonly path: "src/auth.ts";
|
|
291
|
+
readonly hunks: readonly [{
|
|
292
|
+
readonly id: "h1";
|
|
293
|
+
readonly header: "@@ tighten check @@";
|
|
294
|
+
readonly before: "if (user) {\n return allow();\n}";
|
|
295
|
+
readonly after: "if (user && user.active) {\n return allow();\n}";
|
|
296
|
+
}];
|
|
297
|
+
}];
|
|
298
|
+
};
|
|
299
|
+
readonly meta: {
|
|
300
|
+
specVersion: string;
|
|
301
|
+
minTier: string;
|
|
302
|
+
};
|
|
303
|
+
}];
|
|
304
|
+
};
|
|
305
|
+
export declare const INTEGRATION: IntegrationCase[];
|
|
306
|
+
export interface PendingShapeCase {
|
|
307
|
+
name: string;
|
|
308
|
+
/** Per-tier substrings the rendering MUST surface. */
|
|
309
|
+
mustIncludePerTier: {
|
|
310
|
+
tui?: string[];
|
|
311
|
+
elicitation?: string[];
|
|
312
|
+
url?: string[];
|
|
313
|
+
apps?: string[];
|
|
314
|
+
};
|
|
315
|
+
/** The AskSet to render; same across tiers so the only var is the tier. */
|
|
316
|
+
askSet: unknown;
|
|
317
|
+
note: string;
|
|
318
|
+
}
|
|
319
|
+
export declare const ELICIT_PENDING_SHAPE: PendingShapeCase[];
|
|
320
|
+
export interface SlowAskRoutingCase {
|
|
321
|
+
name: string;
|
|
322
|
+
askSet: unknown;
|
|
323
|
+
/** Substrings that MUST appear in the route-decision blob. */
|
|
324
|
+
mustInclude: string[];
|
|
325
|
+
/** Substrings that MUST NOT appear (e.g. `"elicitation"` in chosen tier). */
|
|
326
|
+
mustExclude: string[];
|
|
327
|
+
note: string;
|
|
328
|
+
}
|
|
329
|
+
export declare const SLOW_ASK_ROUTING: SlowAskRoutingCase[];
|
|
330
|
+
export interface SemanticCase {
|
|
331
|
+
name: string;
|
|
332
|
+
askSet: unknown;
|
|
333
|
+
answers: unknown;
|
|
334
|
+
shouldPass: boolean;
|
|
335
|
+
note: string;
|
|
336
|
+
}
|
|
337
|
+
export declare const SEMANTIC: SemanticCase[];
|
|
338
|
+
//# sourceMappingURL=corpus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus.d.ts","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"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"}
|
package/dist/corpus.js
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The conformance corpus — spec-derived fixtures. This file is the
|
|
3
|
+
* language-agnostic source of truth for "Elicitkit-compliant" (SPEC §8).
|
|
4
|
+
* Any implementation in any language can consume these cases; the runner
|
|
5
|
+
* (index.ts) is just the reference harness over them.
|
|
6
|
+
*/
|
|
7
|
+
const META = { specVersion: "0.1.0", minTier: "tui" };
|
|
8
|
+
const ask = (type, spec, extra = {}) => ({
|
|
9
|
+
id: type, type, prompt: `${type}?`, spec, meta: META, ...extra,
|
|
10
|
+
});
|
|
11
|
+
const set = (...asks) => ({ specVersion: "0.1.0", asks });
|
|
12
|
+
// ── Valid AskSets: one per type + envelope guarantees ──────────────────
|
|
13
|
+
export const VALID_ASKSETS = [
|
|
14
|
+
{ name: "ask_text", valid: true, note: "free text", askSet: set(ask("ask_text", { multiline: true })) },
|
|
15
|
+
{ name: "ask_select", valid: true, note: "single", askSet: set(ask("ask_select", { options: [{ id: "a", label: "A" }] })) },
|
|
16
|
+
{ name: "ask_select.multiple", valid: true, note: "multi w/ bounds", askSet: set(ask("ask_select", { options: [{ id: "a", label: "A" }, { id: "b", label: "B" }], multiple: true, min: 1, max: 2 })) },
|
|
17
|
+
{ name: "ask_confirm", valid: true, note: "consequence", askSet: set(ask("ask_confirm", { affirm: "Do it", consequence: "irreversible" })) },
|
|
18
|
+
{ name: "ask_code_diff", valid: true, note: "the wedge", askSet: set(ask("ask_code_diff", { granularity: "hunk", files: [{ path: "a.ts", hunks: [{ id: "h1", after: "x=1" }] }] })) },
|
|
19
|
+
{ name: "ask_number", valid: true, note: "bounded int", askSet: set(ask("ask_number", { min: 0, max: 10, integer: true })) },
|
|
20
|
+
{ name: "ask_rating", valid: true, note: "1..5", askSet: set(ask("ask_rating", { max: 5 })) },
|
|
21
|
+
{ name: "ask_slider", valid: true, note: "range", askSet: set(ask("ask_slider", { min: 0, max: 100, step: 5 })) },
|
|
22
|
+
{ name: "ask_date", valid: true, note: "date+time", askSet: set(ask("ask_date", { time: true })) },
|
|
23
|
+
{ name: "ask_rank", valid: true, note: "order", askSet: set(ask("ask_rank", { items: [{ id: "a", label: "A" }, { id: "b", label: "B" }] })) },
|
|
24
|
+
{ name: "ask_color", valid: true, note: "palette", askSet: set(ask("ask_color", { palette: ["#000000", "#ffffff"] })) },
|
|
25
|
+
{ name: "ask_select.display+icon", valid: true, note: "presentation hints are optional/ignorable", askSet: set(ask("ask_select", { display: "cards", options: [{ id: "a", label: "A", icon: "rocket", color: "#f00" }] })) },
|
|
26
|
+
{
|
|
27
|
+
name: "safe-colors-accepted",
|
|
28
|
+
valid: true,
|
|
29
|
+
note: "legit colors across the safe grammar must NOT be over-rejected: #hex, CSS keyword, functional rgb()",
|
|
30
|
+
askSet: {
|
|
31
|
+
specVersion: "0.1.0",
|
|
32
|
+
meta: { layout: "auto", accent: "rebeccapurple" },
|
|
33
|
+
asks: [
|
|
34
|
+
ask("ask_select", { options: [{ id: "o", label: "L", color: "#1d4ed8" }] }),
|
|
35
|
+
ask("ask_color", { palette: ["#1d4ed8", "rebeccapurple", "rgb(10 20 30)"] }),
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "reserved-hooks-and-unknown-meta",
|
|
41
|
+
valid: true,
|
|
42
|
+
note: "agentGuess/confidence/memoryKey inert; unknown meta keys preserved (forward-compat)",
|
|
43
|
+
askSet: set(ask("ask_text", {}, {
|
|
44
|
+
agentGuess: "maybe", confidence: 0.5, memoryKey: "k",
|
|
45
|
+
meta: { ...META, futureKnob: true },
|
|
46
|
+
})),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "askSet.edges-reserved",
|
|
50
|
+
valid: true,
|
|
51
|
+
note: "reserved branching field present but empty is allowed",
|
|
52
|
+
askSet: { specVersion: "0.1.0", asks: [ask("ask_confirm", {})], edges: [] },
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
// ── Invalid AskSets: the schema MUST reject these ──────────────────────
|
|
56
|
+
export const INVALID_ASKSETS = [
|
|
57
|
+
{ name: "missing-type", valid: false, note: "ask without type", askSet: set({ id: "x", prompt: "?", spec: {} }) },
|
|
58
|
+
{ name: "missing-prompt", valid: false, note: "ask without prompt", askSet: set({ id: "x", type: "ask_text", spec: {} }) },
|
|
59
|
+
{ name: "empty-id", valid: false, note: "id minLength 1", askSet: set(ask("ask_text", {}, { id: "" })) },
|
|
60
|
+
{ name: "bad-specVersion", valid: false, note: "not semver", askSet: { specVersion: "0.1", asks: [ask("ask_text", {})] } },
|
|
61
|
+
{ name: "no-asks", valid: false, note: "asks minItems 1", askSet: { specVersion: "0.1.0", asks: [] } },
|
|
62
|
+
{ name: "select-without-options", valid: false, note: "ask_select requires options", askSet: set(ask("ask_select", {})) },
|
|
63
|
+
{ name: "code_diff-no-files", valid: false, note: "ask_code_diff requires files", askSet: set(ask("ask_code_diff", { granularity: "hunk" })) },
|
|
64
|
+
{ name: "code_diff-hunk-without-after", valid: false, note: "hunk requires after", askSet: set(ask("ask_code_diff", { files: [{ path: "a", hunks: [{ id: "h" }] }] })) },
|
|
65
|
+
{ name: "slider-without-bounds", valid: false, note: "ask_slider requires min+max", askSet: set(ask("ask_slider", { step: 1 })) },
|
|
66
|
+
{ name: "rank-single-item", valid: false, note: "ask_rank needs ≥2 items", askSet: set(ask("ask_rank", { items: [{ id: "a", label: "A" }] })) },
|
|
67
|
+
{ name: "confidence-out-of-range", valid: false, note: "confidence ∈ [0,1]", askSet: set(ask("ask_text", {}, { confidence: 9 })) },
|
|
68
|
+
// CSS url() value-injection guard (security review): SelectOption.color,
|
|
69
|
+
// ask_color.palette[], and AskSet.meta.accent MUST match the safe color
|
|
70
|
+
// grammar. url(/var(/quotes etc. are a no-CSP-channel exfil/breakout and
|
|
71
|
+
// MUST be rejected by a compliant impl.
|
|
72
|
+
{
|
|
73
|
+
name: "meta.accent-url-injection",
|
|
74
|
+
valid: false,
|
|
75
|
+
note: "AskSet.meta.accent must match the safe color grammar (no url())",
|
|
76
|
+
askSet: { specVersion: "0.1.0", meta: { accent: "url(https://x)" }, asks: [ask("ask_text", {})] },
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "select-option-color-url-injection",
|
|
80
|
+
valid: false,
|
|
81
|
+
note: "SelectOption.color must match the safe color grammar (no url())",
|
|
82
|
+
askSet: set(ask("ask_select", { options: [{ id: "o", label: "L", color: "url(https://evil/x)" }] })),
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "ask_color-palette-url-injection",
|
|
86
|
+
valid: false,
|
|
87
|
+
note: "ask_color.palette[] entries must match the safe color grammar (no url())",
|
|
88
|
+
askSet: set(ask("ask_color", { palette: ["url(https://evil/x)"] })),
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
// ── Answers: per-type value contract (SPEC §5/§7) ──────────────────────
|
|
92
|
+
const a = (type, spec, value, status = "answered") => ({
|
|
93
|
+
name: `${type}:${status}:${JSON.stringify(value)}`,
|
|
94
|
+
askSet: set(ask(type, spec)),
|
|
95
|
+
answers: [{ id: type, type, status, value }],
|
|
96
|
+
});
|
|
97
|
+
export const VALID_ANSWERS = [
|
|
98
|
+
{ ...a("ask_text", {}, "hello"), valid: true, note: "string" },
|
|
99
|
+
{ ...a("ask_confirm", {}, false), valid: true, note: "boolean" },
|
|
100
|
+
{ ...a("ask_select", { options: [{ id: "a", label: "A" }] }, "a"), valid: true, note: "id" },
|
|
101
|
+
{ ...a("ask_number", { min: 0, max: 9 }, 4), valid: true, note: "in range" },
|
|
102
|
+
{ ...a("ask_rating", { max: 5 }, 5), valid: true, note: "max" },
|
|
103
|
+
{ ...a("ask_date", {}, "2026-05-18"), valid: true, note: "iso date" },
|
|
104
|
+
{ ...a("ask_rank", { items: [{ id: "a", label: "A" }, { id: "b", label: "B" }] }, ["b", "a"]), valid: true, note: "permutation" },
|
|
105
|
+
{ ...a("ask_color", { palette: ["#000", "#fff"] }, "#fff"), valid: true, note: "in palette" },
|
|
106
|
+
{ ...a("ask_color", { allowCustom: true }, "#1d4ed8"), valid: true, note: "custom allowed" },
|
|
107
|
+
{ ...a("ask_text", {}, undefined, "declined"), valid: true, note: "declined is first-class (SPEC §5)" },
|
|
108
|
+
];
|
|
109
|
+
export const INVALID_ANSWERS = [
|
|
110
|
+
{ ...a("ask_text", {}, 123), valid: false, note: "number for text" },
|
|
111
|
+
{ ...a("ask_confirm", {}, "yes"), valid: false, note: "string for boolean" },
|
|
112
|
+
{ ...a("ask_select", { options: [{ id: "a", label: "A" }] }, "z"), valid: false, note: "unknown id" },
|
|
113
|
+
{ ...a("ask_number", { min: 0, max: 9 }, 50), valid: false, note: "out of range" },
|
|
114
|
+
{ ...a("ask_rating", { max: 5 }, 0), valid: false, note: "below 1" },
|
|
115
|
+
{ ...a("ask_date", {}, "18-05-2026"), valid: false, note: "wrong date format" },
|
|
116
|
+
{ ...a("ask_rank", { items: [{ id: "a", label: "A" }, { id: "b", label: "B" }] }, ["a"]), valid: false, note: "incomplete ranking" },
|
|
117
|
+
{ ...a("ask_rank", { items: [{ id: "a", label: "A" }, { id: "b", label: "B" }] }, ["a", "a"]), valid: false, note: "dupe in ranking" },
|
|
118
|
+
{ ...a("ask_color", { palette: ["#000", "#fff"] }, "#abc"), valid: false, note: "not in fixed palette" },
|
|
119
|
+
{ ...a("ask_color", {}, 123), valid: false, note: "non-string color" },
|
|
120
|
+
];
|
|
121
|
+
export const ELICITATION_RENDER = [
|
|
122
|
+
{
|
|
123
|
+
name: "ask_select.labels-surfaced",
|
|
124
|
+
note: "single-pick options must carry the option label, not just the id",
|
|
125
|
+
askSet: set(ask("ask_select", {
|
|
126
|
+
options: [
|
|
127
|
+
{ id: "q01_a", label: "A quiet beach", description: "low tide, gulls" },
|
|
128
|
+
{ id: "q01_b", label: "A rainy garden" },
|
|
129
|
+
{ id: "q01_c", label: "A library nook" },
|
|
130
|
+
],
|
|
131
|
+
})),
|
|
132
|
+
mustInclude: ["A quiet beach", "A rainy garden", "A library nook", "low tide, gulls"],
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: "ask_select.multiple.labels-surfaced",
|
|
136
|
+
note: "multi-pick: same label contract applies through items.anyOf",
|
|
137
|
+
askSet: set(ask("ask_select", {
|
|
138
|
+
multiple: true, min: 1, max: 2,
|
|
139
|
+
options: [
|
|
140
|
+
{ id: "stack_node", label: "Node.js" },
|
|
141
|
+
{ id: "stack_go", label: "Go" },
|
|
142
|
+
{ id: "stack_rust", label: "Rust" },
|
|
143
|
+
],
|
|
144
|
+
})),
|
|
145
|
+
mustInclude: ["Node.js", "Go", "Rust"],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "ask_rank.labels-surfaced",
|
|
149
|
+
note: "rank items must reach the user as human-readable rows",
|
|
150
|
+
askSet: set(ask("ask_rank", {
|
|
151
|
+
items: [
|
|
152
|
+
{ id: "p1", label: "Reduce onboarding friction" },
|
|
153
|
+
{ id: "p2", label: "Cut p95 latency" },
|
|
154
|
+
{ id: "p3", label: "Ship the audit log" },
|
|
155
|
+
],
|
|
156
|
+
})),
|
|
157
|
+
mustInclude: ["Reduce onboarding friction", "Cut p95 latency", "Ship the audit log"],
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
// The showcase AskSet: every v0.1 type, plus the ask_select display
|
|
161
|
+
// variants and the ask_color custom/fixed split, expressed inline so the
|
|
162
|
+
// corpus stays a portable single-file moat. Mirrors
|
|
163
|
+
// examples/showcase-askset.json (kept in sync; tests assert overlap).
|
|
164
|
+
const SHOWCASE_ASKSET = {
|
|
165
|
+
specVersion: "0.1.0",
|
|
166
|
+
meta: { layout: "auto", accent: "#7c3aed" },
|
|
167
|
+
asks: [
|
|
168
|
+
{ id: "text_single", type: "ask_text", prompt: "Single-line text", help: "ask_text — auto half-width.", spec: { placeholder: "type here" }, meta: META },
|
|
169
|
+
{ id: "text_multi", type: "ask_text", prompt: "Multiline text", help: "ask_text multiline — auto full-width.", required: false, spec: { multiline: true, placeholder: "longer answer…" }, meta: META },
|
|
170
|
+
{ id: "sel_list", type: "ask_select", prompt: "Select — list (default)", spec: { options: [{ id: "a", label: "Alpha", description: "first option" }, { id: "b", label: "Bravo" }] }, meta: META },
|
|
171
|
+
{ id: "sel_segmented", type: "ask_select", prompt: "Select — segmented", spec: { display: "segmented", options: [{ id: "lo", label: "Low" }, { id: "md", label: "Med" }, { id: "hi", label: "High" }] }, meta: META },
|
|
172
|
+
{ id: "sel_cards", type: "ask_select", prompt: "Select — cards with icons", spec: { display: "cards", options: [{ id: "ship", label: "Ship", description: "deploy now", icon: "rocket" }, { id: "hold", label: "Hold", description: "needs review", icon: "clock" }, { id: "block", label: "Block", description: "do not merge", icon: "warning" }] }, meta: META },
|
|
173
|
+
{ id: "sel_grid_multi", type: "ask_select", prompt: "Multi-select — grid, with color swatches", spec: { multiple: true, min: 1, display: "grid", options: [{ id: "red", label: "Critical", description: "P0", color: "#dc2626" }, { id: "amber", label: "Warning", description: "P1", color: "#d97706" }, { id: "green", label: "Healthy", description: "P2", color: "#059669" }] }, meta: META },
|
|
174
|
+
{ id: "confirm_cards", type: "ask_confirm", prompt: "Confirm — with consequence", spec: { affirm: "Run migration", deny: "Skip", consequence: "Irreversible without a restore." }, meta: META },
|
|
175
|
+
{ id: "num", type: "ask_number", prompt: "Number — bounded integer with unit", spec: { min: 1, max: 64, step: 1, integer: true, unit: "vCPU" }, meta: META },
|
|
176
|
+
{ id: "rate_stars", type: "ask_rating", prompt: "Rating — stars with labels", spec: { max: 5, icon: "star", labels: { min: "poor", max: "great" } }, meta: META },
|
|
177
|
+
{ id: "slider", type: "ask_slider", prompt: "Slider — 0–100 step 5", spec: { min: 0, max: 100, step: 5, unit: "%" }, meta: META },
|
|
178
|
+
{ id: "date", type: "ask_date", prompt: "Date", spec: {}, meta: META },
|
|
179
|
+
{ id: "rank", type: "ask_rank", prompt: "Rank — reorderable, with descriptions", spec: { items: [{ id: "speed", label: "Ship speed" }, { id: "safety", label: "Safety", description: "rollback / blast radius" }, { id: "polish", label: "UX polish" }] }, meta: META },
|
|
180
|
+
{ id: "color_fixed", type: "ask_color", prompt: "Color — fixed palette only", spec: { palette: ["#1d4ed8", "#059669", "#d97706"] }, meta: META },
|
|
181
|
+
{ id: "diff", type: "ask_code_diff", prompt: "Code diff — multi-file, per-hunk accept/reject", help: "ask_code_diff — always full-width; the v0.1 wedge.", spec: { granularity: "hunk", files: [{ path: "src/auth.ts", hunks: [{ id: "h1", header: "@@ tighten check @@", before: "if (user) {\n return allow();\n}", after: "if (user && user.active) {\n return allow();\n}" }] }] }, meta: META },
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
/** Public re-export so adopters can drive the same showcase through their
|
|
185
|
+
* own renderTiers implementation without duplicating the fixture. */
|
|
186
|
+
export const SHOWCASE = SHOWCASE_ASKSET;
|
|
187
|
+
export const INTEGRATION = [
|
|
188
|
+
{
|
|
189
|
+
name: "showcase.all-10-types.no-cross-type-drift",
|
|
190
|
+
askSet: SHOWCASE_ASKSET,
|
|
191
|
+
note: "all 10 v0.1 types in one AskSet must validate AND each ask's labels/markers must reach every tier — no type silently dropped or rendered as another",
|
|
192
|
+
mustIncludePerTier: {
|
|
193
|
+
// apps/url emit the panel HTML (same buildPanelHtml under the hood);
|
|
194
|
+
// panel embeds the ask JSON, so type tokens AND option labels both
|
|
195
|
+
// surface in the serialized HTML.
|
|
196
|
+
apps: [
|
|
197
|
+
"ask_text", "ask_select", "ask_confirm", "ask_code_diff", "ask_number",
|
|
198
|
+
"ask_rating", "ask_slider", "ask_date", "ask_rank", "ask_color",
|
|
199
|
+
"Alpha", "Critical", "Ship speed", "#1d4ed8",
|
|
200
|
+
],
|
|
201
|
+
url: [
|
|
202
|
+
"ask_text", "ask_select", "ask_confirm", "ask_code_diff", "ask_number",
|
|
203
|
+
"ask_rating", "ask_slider", "ask_date", "ask_rank", "ask_color",
|
|
204
|
+
"Alpha", "Critical", "Ship speed", "#1d4ed8",
|
|
205
|
+
],
|
|
206
|
+
// tui prints `(ask_*)` per row plus enumerated option labels.
|
|
207
|
+
tui: [
|
|
208
|
+
"ask_text", "ask_select", "ask_confirm", "ask_code_diff", "ask_number",
|
|
209
|
+
"ask_rating", "ask_slider", "ask_date", "ask_rank", "ask_color",
|
|
210
|
+
"Alpha", "Critical", "Ship speed",
|
|
211
|
+
],
|
|
212
|
+
// elicitation is per-ask; the runner concatenates each ask's
|
|
213
|
+
// schema+message into one blob, so type-specific tokens (titled
|
|
214
|
+
// oneOf labels, hunk ids, ask_confirm consequence text, color
|
|
215
|
+
// palette entries, ask_number unit) all land in the union. The
|
|
216
|
+
// ask_confirm primitive is boolean-only — affirm/deny labels do
|
|
217
|
+
// not reach the schema — so we match on the consequence text
|
|
218
|
+
// instead, which IS folded into the message body.
|
|
219
|
+
elicitation: [
|
|
220
|
+
"Alpha", "Critical", "Ship speed", // labelled enum branches
|
|
221
|
+
"Irreversible without a restore.", // ask_confirm consequence
|
|
222
|
+
"vCPU", // ask_number unit
|
|
223
|
+
"#1d4ed8", // ask_color palette
|
|
224
|
+
"h1", // ask_code_diff hunk id
|
|
225
|
+
],
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
];
|
|
229
|
+
const PENDING_SHAPE_ASKSET = set(ask("ask_confirm", {}));
|
|
230
|
+
export const ELICIT_PENDING_SHAPE = [
|
|
231
|
+
{
|
|
232
|
+
name: "pending-shape.tui",
|
|
233
|
+
askSet: PENDING_SHAPE_ASKSET,
|
|
234
|
+
note: "tui returns the panel reference + token immediately (pending:true)",
|
|
235
|
+
mustIncludePerTier: {
|
|
236
|
+
tui: ["pending", "token", "tui"],
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: "pending-shape.elicitation",
|
|
241
|
+
askSet: PENDING_SHAPE_ASKSET,
|
|
242
|
+
note: "elicitation returns pending + a completed/total counter so the agent calls elicit_next per ask",
|
|
243
|
+
mustIncludePerTier: {
|
|
244
|
+
elicitation: ["pending", "token", "elicitation"],
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: "pending-shape.url",
|
|
249
|
+
askSet: PENDING_SHAPE_ASKSET,
|
|
250
|
+
note: "url returns the panel reference + token immediately (pending:true)",
|
|
251
|
+
mustIncludePerTier: {
|
|
252
|
+
url: ["pending", "token", "url"],
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
];
|
|
256
|
+
export const SLOW_ASK_ROUTING = [
|
|
257
|
+
{
|
|
258
|
+
name: "slow-ask-routing.text-multiline",
|
|
259
|
+
askSet: set(ask("ask_text", { multiline: true })),
|
|
260
|
+
note: "a multiline ask_text takes too long for a per-prompt elicitation; route to a panel tier",
|
|
261
|
+
mustInclude: ["routedAwayFromElicitation", "true", "ask_text"],
|
|
262
|
+
mustExclude: ['"renderedTier":"elicitation"', '"chosen":"elicitation"'],
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: "slow-ask-routing.code-diff-many-hunks",
|
|
266
|
+
askSet: set(ask("ask_code_diff", {
|
|
267
|
+
granularity: "hunk",
|
|
268
|
+
files: [{ path: "src/a.ts", hunks: [
|
|
269
|
+
{ id: "h1", after: "x=1" },
|
|
270
|
+
{ id: "h2", after: "y=2" },
|
|
271
|
+
{ id: "h3", after: "z=3" },
|
|
272
|
+
] }],
|
|
273
|
+
})),
|
|
274
|
+
note: "ask_code_diff with > 2 hunks is too long for per-prompt elicitation",
|
|
275
|
+
mustInclude: ["routedAwayFromElicitation", "true", "ask_code_diff"],
|
|
276
|
+
mustExclude: ['"renderedTier":"elicitation"', '"chosen":"elicitation"'],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
name: "slow-ask-routing.rank-many-items",
|
|
280
|
+
askSet: set(ask("ask_rank", {
|
|
281
|
+
items: [
|
|
282
|
+
{ id: "a", label: "A" }, { id: "b", label: "B" }, { id: "c", label: "C" },
|
|
283
|
+
{ id: "d", label: "D" }, { id: "e", label: "E" },
|
|
284
|
+
],
|
|
285
|
+
})),
|
|
286
|
+
note: "ask_rank with > 4 items is too long for per-prompt elicitation",
|
|
287
|
+
mustInclude: ["routedAwayFromElicitation", "true", "ask_rank"],
|
|
288
|
+
mustExclude: ['"renderedTier":"elicitation"', '"chosen":"elicitation"'],
|
|
289
|
+
},
|
|
290
|
+
];
|
|
291
|
+
export const SEMANTIC = [
|
|
292
|
+
{
|
|
293
|
+
name: "required-missing-fails",
|
|
294
|
+
askSet: set(ask("ask_text", {})),
|
|
295
|
+
answers: [],
|
|
296
|
+
shouldPass: false,
|
|
297
|
+
note: "a required ask with no answer must fail (no silent skip)",
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: "required-declined-ok",
|
|
301
|
+
askSet: set(ask("ask_text", {})),
|
|
302
|
+
answers: [{ id: "ask_text", type: "ask_text", status: "declined" }],
|
|
303
|
+
shouldPass: true,
|
|
304
|
+
note: "declined is first-class even for a required ask (SPEC §5)",
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: "required-deferred-fails",
|
|
308
|
+
askSet: set(ask("ask_text", {})),
|
|
309
|
+
answers: [{ id: "ask_text", type: "ask_text", status: "deferred" }],
|
|
310
|
+
shouldPass: false,
|
|
311
|
+
note: "a required ask cannot be deferred",
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: "optional-missing-ok",
|
|
315
|
+
askSet: set(ask("ask_text", {}, { required: false })),
|
|
316
|
+
answers: [],
|
|
317
|
+
shouldPass: true,
|
|
318
|
+
note: "an optional ask may be omitted",
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: "answer-type-mismatch-fails",
|
|
322
|
+
askSet: set(ask("ask_confirm", {})),
|
|
323
|
+
answers: [{ id: "ask_confirm", type: "ask_text", status: "answered", value: "x" }],
|
|
324
|
+
shouldPass: false,
|
|
325
|
+
note: "answer.type must match the ask",
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
//# sourceMappingURL=corpus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export * from "./corpus.js";
|
|
2
|
+
/** Per-tier rendering of an AskSet, as serialisable strings. The runner
|
|
3
|
+
* substring-matches against each tier's expected tokens, so an impl may
|
|
4
|
+
* return literal HTML for `apps`/`url`, the tui plaintext, and either
|
|
5
|
+
* a single concatenated schema-blob or an array of per-ask schema blobs
|
|
6
|
+
* for `elicitation` (the runner JSON-serialises anything non-string). */
|
|
7
|
+
export interface TierRenderings {
|
|
8
|
+
apps?: unknown;
|
|
9
|
+
url?: unknown;
|
|
10
|
+
tui?: unknown;
|
|
11
|
+
elicitation?: unknown;
|
|
12
|
+
}
|
|
13
|
+
/** The minimal surface an implementation exposes to be checked. Only
|
|
14
|
+
* `validateAskSet` + `validateAnswer` are required; `validateAnswers`
|
|
15
|
+
* (set-aware: required/declined/deferred + per-type value) unlocks the
|
|
16
|
+
* set-aware tier. `renderElicitationAsk` is optional and exercises the
|
|
17
|
+
* elicitation-tier rendering contract (labels MUST reach the client).
|
|
18
|
+
* `renderTiers` is the integration capstone — render the SAME AskSet
|
|
19
|
+
* across all four tiers and assert every type/label surfaces in each
|
|
20
|
+
* (the no-cross-type-drift guard at SPEC §6/§7).
|
|
21
|
+
* Shapes are intentionally tiny so any language can adapt. */
|
|
22
|
+
export interface ConformanceTarget {
|
|
23
|
+
validateAskSet(input: unknown): {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
};
|
|
26
|
+
validateAnswer(input: unknown): {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
};
|
|
29
|
+
validateAnswers?(askSet: unknown, rawAnswers: unknown): {
|
|
30
|
+
ok: boolean;
|
|
31
|
+
};
|
|
32
|
+
/** Optional: return what the implementation would send to the host's
|
|
33
|
+
* native elicitation primitive for the single Ask in `askSet`. Can
|
|
34
|
+
* be the full `{ message, requestedSchema }` params or just the
|
|
35
|
+
* schema — the runner serialises whatever is returned and substring-
|
|
36
|
+
* matches the expected labels, so labels may live in either place. */
|
|
37
|
+
renderElicitationAsk?(askSet: unknown): unknown;
|
|
38
|
+
/** Optional: render the WHOLE AskSet across all four tiers. The
|
|
39
|
+
* runner serialises each tier and substring-matches the integration
|
|
40
|
+
* fixture's per-tier tokens — that is what "faithfully rendered
|
|
41
|
+
* across all 4 tiers" means for a v0.1 implementation. */
|
|
42
|
+
renderTiers?(askSet: unknown): TierRenderings;
|
|
43
|
+
/** Optional: simulate an `elicit` tool call (non-blocking contract).
|
|
44
|
+
* Returns the rendering blob the agent receives back per tier — must
|
|
45
|
+
* carry the pending-shape tokens (pending/token/tier) the SPEC
|
|
46
|
+
* defines. The runner serialises whatever is returned and
|
|
47
|
+
* substring-matches against the fixture's per-tier expectations. */
|
|
48
|
+
elicitPendingShape?(askSet: unknown, tier: "tui" | "elicitation" | "url" | "apps"): unknown;
|
|
49
|
+
/** Optional: simulate tier negotiation for an AskSet against a host
|
|
50
|
+
* that offers ALL four tiers — the slow-ask auto-router MUST drop
|
|
51
|
+
* `elicitation` when the set contains a slow-likely ask. Return
|
|
52
|
+
* enough context that the runner can substring-match BOTH the
|
|
53
|
+
* decision flag (e.g. `routedAwayFromElicitation: true`) AND the
|
|
54
|
+
* rule name (the ask type that triggered). */
|
|
55
|
+
slowAskRoute?(askSet: unknown): unknown;
|
|
56
|
+
}
|
|
57
|
+
export interface CheckResult {
|
|
58
|
+
group: string;
|
|
59
|
+
name: string;
|
|
60
|
+
ok: boolean;
|
|
61
|
+
detail: string;
|
|
62
|
+
}
|
|
63
|
+
export interface ConformanceReport {
|
|
64
|
+
/** true ⇒ may display the "Elicitkit-compliant (v0.1)" badge */
|
|
65
|
+
compliant: boolean;
|
|
66
|
+
total: number;
|
|
67
|
+
passed: number;
|
|
68
|
+
/** full per-fixture results — show the failures to the implementer */
|
|
69
|
+
results: CheckResult[];
|
|
70
|
+
/** which optional capabilities were exercised */
|
|
71
|
+
exercised: {
|
|
72
|
+
askSet: boolean;
|
|
73
|
+
answerEnvelope: boolean;
|
|
74
|
+
answerSemantics: boolean;
|
|
75
|
+
elicitationRender: boolean;
|
|
76
|
+
integration: boolean;
|
|
77
|
+
pendingShape: boolean;
|
|
78
|
+
slowAskRouting: boolean;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Run the conformance corpus against `target`. The reference implementation
|
|
83
|
+
* (@elicitkit/core) MUST pass its own suite — that is what makes the suite,
|
|
84
|
+
* not the server, the moat (watchpoint #4).
|
|
85
|
+
*/
|
|
86
|
+
export declare function runConformance(target: ConformanceTarget): ConformanceReport;
|
|
87
|
+
/** Human-readable one-liner per failure, for CLI/CI output. */
|
|
88
|
+
export declare function formatReport(r: ConformanceReport): string;
|
|
89
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,cAAc,aAAa,CAAC;AAE5B;;;;0EAI0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;+DAQ+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,eAAe,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IACxE;;;;2EAIuE;IACvE,oBAAoB,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD;;;+DAG2D;IAC3D,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAAC;IAC9C;;;;yEAIqE;IACrE,kBAAkB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,GAAG,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5F;;;;;mDAK+C;IAC/C,YAAY,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,iDAAiD;IACjD,SAAS,EAAE;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,cAAc,EAAE,OAAO,CAAC;QACxB,eAAe,EAAE,OAAO,CAAC;QACzB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CA8M3E;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAQzD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { VALID_ASKSETS, INVALID_ASKSETS, VALID_ANSWERS, INVALID_ANSWERS, SEMANTIC, ELICITATION_RENDER, INTEGRATION, ELICIT_PENDING_SHAPE, SLOW_ASK_ROUTING, } from "./corpus.js";
|
|
2
|
+
export * from "./corpus.js";
|
|
3
|
+
function rec(results, group, name, ok, detail) {
|
|
4
|
+
results.push({ group, name, ok, detail });
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Run the conformance corpus against `target`. The reference implementation
|
|
8
|
+
* (@elicitkit/core) MUST pass its own suite — that is what makes the suite,
|
|
9
|
+
* not the server, the moat (watchpoint #4).
|
|
10
|
+
*/
|
|
11
|
+
export function runConformance(target) {
|
|
12
|
+
const results = [];
|
|
13
|
+
for (const c of [...VALID_ASKSETS, ...INVALID_ASKSETS]) {
|
|
14
|
+
const got = target.validateAskSet(c.askSet).ok;
|
|
15
|
+
rec(results, "askSet", c.name, got === c.valid, `expected ${c.valid ? "accept" : "reject"} (${c.note}); got ${got ? "accept" : "reject"}`);
|
|
16
|
+
}
|
|
17
|
+
for (const c of [...VALID_ANSWERS, ...INVALID_ANSWERS]) {
|
|
18
|
+
// Envelope-only check: the Answer object itself is schema-valid; the
|
|
19
|
+
// per-type value contract is exercised via validateAnswers below.
|
|
20
|
+
const answer = c.answers[0];
|
|
21
|
+
const got = target.validateAnswer(answer).ok;
|
|
22
|
+
// every fixture answer is a well-formed envelope; the schema MUST accept
|
|
23
|
+
// the envelope regardless of value (value typing is §7, not the schema).
|
|
24
|
+
rec(results, "answerEnvelope", c.name, got === true, `Answer envelope must be schema-valid (${c.note}); got ${got ? "accept" : "reject"}`);
|
|
25
|
+
}
|
|
26
|
+
const hasSetAware = typeof target.validateAnswers === "function";
|
|
27
|
+
if (hasSetAware) {
|
|
28
|
+
const va = target.validateAnswers.bind(target);
|
|
29
|
+
for (const c of [...VALID_ANSWERS, ...INVALID_ANSWERS]) {
|
|
30
|
+
const got = va(c.askSet, c.answers).ok;
|
|
31
|
+
rec(results, "answerValue", c.name, got === c.valid, `value contract: expected ${c.valid ? "accept" : "reject"} (${c.note}); got ${got ? "accept" : "reject"}`);
|
|
32
|
+
}
|
|
33
|
+
for (const c of SEMANTIC) {
|
|
34
|
+
const got = va(c.askSet, c.answers).ok;
|
|
35
|
+
rec(results, "semantics", c.name, got === c.shouldPass, `${c.note}; expected ${c.shouldPass ? "pass" : "fail"}, got ${got ? "pass" : "fail"}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const hasElicitRender = typeof target.renderElicitationAsk === "function";
|
|
39
|
+
if (hasElicitRender) {
|
|
40
|
+
const render = target.renderElicitationAsk.bind(target);
|
|
41
|
+
for (const c of ELICITATION_RENDER) {
|
|
42
|
+
let serialized = "";
|
|
43
|
+
let crashed = false;
|
|
44
|
+
try {
|
|
45
|
+
serialized = JSON.stringify(render(c.askSet));
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
crashed = true;
|
|
49
|
+
serialized = String(e);
|
|
50
|
+
}
|
|
51
|
+
const missing = c.mustInclude.filter((s) => !serialized.includes(s));
|
|
52
|
+
const leaked = (c.mustExclude ?? []).filter((s) => serialized.includes(s));
|
|
53
|
+
const ok = !crashed && missing.length === 0 && leaked.length === 0;
|
|
54
|
+
rec(results, "elicitationRender", c.name, ok, crashed
|
|
55
|
+
? `renderElicitationAsk threw: ${serialized}`
|
|
56
|
+
: missing.length
|
|
57
|
+
? `missing label substrings: ${missing.join(", ")} (${c.note})`
|
|
58
|
+
: leaked.length
|
|
59
|
+
? `leaked substrings: ${leaked.join(", ")} (${c.note})`
|
|
60
|
+
: `labels surfaced (${c.note})`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Integration: validate the showcase as a whole AND assert every type
|
|
64
|
+
// surfaces faithfully in every tier (no cross-type drift). ONE result
|
|
65
|
+
// per case — either the entire showcase round-trips through the four
|
|
66
|
+
// tiers or this row fails with the exact missing substrings. Opt-in:
|
|
67
|
+
// a target without renderTiers gets a skip-row noted as exercised=false
|
|
68
|
+
// (it still passes if validateAskSet accepts the showcase — the
|
|
69
|
+
// schema half of the contract — so absence of the renderer doesn't
|
|
70
|
+
// silently inflate the row count).
|
|
71
|
+
const hasRenderTiers = typeof target.renderTiers === "function";
|
|
72
|
+
for (const c of INTEGRATION) {
|
|
73
|
+
const wholeValid = target.validateAskSet(c.askSet).ok;
|
|
74
|
+
if (!wholeValid) {
|
|
75
|
+
rec(results, "integration", c.name, false, `showcase AskSet rejected by validateAskSet (${c.note})`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!hasRenderTiers) {
|
|
79
|
+
// Schema-only target: the integration row passes on the AskSet
|
|
80
|
+
// half (the rendering half is genuinely not exercised). Keep
|
|
81
|
+
// total stable so the count is deterministic across capability
|
|
82
|
+
// levels — the implementation will see exercised.integration=false.
|
|
83
|
+
rec(results, "integration", c.name, true, `showcase AskSet validates; renderTiers not provided (${c.note})`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const r = target.renderTiers.bind(target);
|
|
87
|
+
let rendered;
|
|
88
|
+
try {
|
|
89
|
+
rendered = r(c.askSet) ?? {};
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
rec(results, "integration", c.name, false, `renderTiers threw: ${String(e)}`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const ser = (v) => (typeof v === "string" ? v : JSON.stringify(v));
|
|
96
|
+
const tiers = ["apps", "url", "tui", "elicitation"];
|
|
97
|
+
const missing = [];
|
|
98
|
+
for (const t of tiers) {
|
|
99
|
+
const blob = rendered[t] === undefined ? "" : ser(rendered[t]);
|
|
100
|
+
for (const s of c.mustIncludePerTier[t]) {
|
|
101
|
+
if (!blob.includes(s))
|
|
102
|
+
missing.push(`${t}:${s}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const ok = missing.length === 0;
|
|
106
|
+
rec(results, "integration", c.name, ok, ok
|
|
107
|
+
? `every type's labels/markers reached every tier (${c.note})`
|
|
108
|
+
: `cross-type drift — missing per-tier substrings: ${missing.join(", ")} (${c.note})`);
|
|
109
|
+
}
|
|
110
|
+
// Non-blocking `elicit` contract: per-tier pending-shape fixtures.
|
|
111
|
+
// Optional capability — an adopter without `elicitPendingShape` still
|
|
112
|
+
// passes (validateAskSet on the underlying AskSet is part of askSet),
|
|
113
|
+
// but the pending rows are listed as a skip so the count is stable
|
|
114
|
+
// across capability levels.
|
|
115
|
+
const hasPendingShape = typeof target.elicitPendingShape === "function";
|
|
116
|
+
for (const c of ELICIT_PENDING_SHAPE) {
|
|
117
|
+
const askValid = target.validateAskSet(c.askSet).ok;
|
|
118
|
+
if (!askValid) {
|
|
119
|
+
rec(results, "pendingShape", c.name, false, `pending-shape AskSet rejected by validateAskSet (${c.note})`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (!hasPendingShape) {
|
|
123
|
+
rec(results, "pendingShape", c.name, true, `AskSet validates; elicitPendingShape not provided (${c.note})`);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const tiers = Object.keys(c.mustIncludePerTier);
|
|
127
|
+
const missing = [];
|
|
128
|
+
let crashed = null;
|
|
129
|
+
for (const t of tiers) {
|
|
130
|
+
let blob = "";
|
|
131
|
+
try {
|
|
132
|
+
const out = target.elicitPendingShape.bind(target)(c.askSet, t);
|
|
133
|
+
blob = typeof out === "string" ? out : JSON.stringify(out);
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
crashed = String(e);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
for (const s of c.mustIncludePerTier[t] ?? []) {
|
|
140
|
+
if (!blob.includes(s))
|
|
141
|
+
missing.push(`${t}:${s}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const ok = crashed === null && missing.length === 0;
|
|
145
|
+
rec(results, "pendingShape", c.name, ok, crashed
|
|
146
|
+
? `elicitPendingShape threw: ${crashed}`
|
|
147
|
+
: missing.length
|
|
148
|
+
? `missing pending-shape tokens: ${missing.join(", ")} (${c.note})`
|
|
149
|
+
: `pending-shape tokens surfaced (${c.note})`);
|
|
150
|
+
}
|
|
151
|
+
// Slow-ask auto-router fixtures: an AskSet containing a slow-likely
|
|
152
|
+
// ask MUST route away from elicitation. The runner serialises the
|
|
153
|
+
// route-decision blob and substring-matches the required + forbidden
|
|
154
|
+
// tokens.
|
|
155
|
+
const hasSlowAsk = typeof target.slowAskRoute === "function";
|
|
156
|
+
for (const c of SLOW_ASK_ROUTING) {
|
|
157
|
+
if (!hasSlowAsk) {
|
|
158
|
+
// Optional capability: surface as a skip-row that passes, so a
|
|
159
|
+
// schema-only target's count stays deterministic.
|
|
160
|
+
const askValid = target.validateAskSet(c.askSet).ok;
|
|
161
|
+
rec(results, "slowAskRouting", c.name, askValid, askValid
|
|
162
|
+
? `AskSet validates; slowAskRoute not provided (${c.note})`
|
|
163
|
+
: `slow-ask AskSet rejected by validateAskSet (${c.note})`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
let blob = "";
|
|
167
|
+
try {
|
|
168
|
+
const out = target.slowAskRoute.bind(target)(c.askSet);
|
|
169
|
+
blob = typeof out === "string" ? out : JSON.stringify(out);
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
rec(results, "slowAskRouting", c.name, false, `slowAskRoute threw: ${String(e)} (${c.note})`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const missing = c.mustInclude.filter((s) => !blob.includes(s));
|
|
176
|
+
const leaked = c.mustExclude.filter((s) => blob.includes(s));
|
|
177
|
+
const ok = missing.length === 0 && leaked.length === 0;
|
|
178
|
+
rec(results, "slowAskRouting", c.name, ok, missing.length
|
|
179
|
+
? `missing route tokens: ${missing.join(", ")} (${c.note})`
|
|
180
|
+
: leaked.length
|
|
181
|
+
? `forbidden route tokens leaked: ${leaked.join(", ")} (${c.note})`
|
|
182
|
+
: `routed away from elicitation (${c.note})`);
|
|
183
|
+
}
|
|
184
|
+
const passed = results.filter((r) => r.ok).length;
|
|
185
|
+
return {
|
|
186
|
+
compliant: passed === results.length && results.length > 0,
|
|
187
|
+
total: results.length,
|
|
188
|
+
passed,
|
|
189
|
+
results,
|
|
190
|
+
exercised: {
|
|
191
|
+
askSet: true,
|
|
192
|
+
answerEnvelope: true,
|
|
193
|
+
answerSemantics: hasSetAware,
|
|
194
|
+
elicitationRender: hasElicitRender,
|
|
195
|
+
integration: hasRenderTiers,
|
|
196
|
+
pendingShape: hasPendingShape,
|
|
197
|
+
slowAskRouting: hasSlowAsk,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/** Human-readable one-liner per failure, for CLI/CI output. */
|
|
202
|
+
export function formatReport(r) {
|
|
203
|
+
const head = r.compliant
|
|
204
|
+
? `Elicitkit-compliant (v0.1) — ${r.passed}/${r.total}`
|
|
205
|
+
: `NOT compliant — ${r.passed}/${r.total}`;
|
|
206
|
+
const fails = r.results
|
|
207
|
+
.filter((x) => !x.ok)
|
|
208
|
+
.map((x) => ` ✗ [${x.group}] ${x.name}: ${x.detail}`);
|
|
209
|
+
return [head, ...fails].join("\n");
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,cAAc,aAAa,CAAC;AA+E5B,SAAS,GAAG,CAAC,OAAsB,EAAE,KAAa,EAAE,IAAY,EAAE,EAAW,EAAE,MAAc;IAC3F,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,EAC5C,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC;QACvD,qEAAqE;QACrE,kEAAkE;QAClE,MAAM,MAAM,GAAI,CAAC,CAAC,OAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC7C,yEAAyE;QACzE,yEAAyE;QACzE,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,EACjD,yCAAyC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,CAAC;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,MAAM,CAAC,eAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,EACjD,4BAA4B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,EACpD,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,MAAM,CAAC,oBAAoB,KAAK,UAAU,CAAC;IAC1E,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACnC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,CAAC;gBACf,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;YACnE,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAC1C,OAAO;gBACL,CAAC,CAAC,+BAA+B,UAAU,EAAE;gBAC7C,CAAC,CAAC,OAAO,CAAC,MAAM;oBACd,CAAC,CAAC,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;oBAC/D,CAAC,CAAC,MAAM,CAAC,MAAM;wBACb,CAAC,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;wBACvD,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,qEAAqE;IACrE,qEAAqE;IACrE,wEAAwE;IACxE,gEAAgE;IAChE,mEAAmE;IACnE,mCAAmC;IACnC,MAAM,cAAc,GAAG,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EACvC,+CAA+C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,+DAA+D;YAC/D,6DAA6D;YAC7D,+DAA+D;YAC/D,oEAAoE;YACpE,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EACtC,wDAAwD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,WAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EACvC,sBAAsB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAU,CAAC;QAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;QAChC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EACpC,EAAE;YACA,CAAC,CAAC,mDAAmD,CAAC,CAAC,IAAI,GAAG;YAC9D,CAAC,CAAC,mDAAmD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,mEAAmE;IACnE,sEAAsE;IACtE,sEAAsE;IACtE,mEAAmE;IACnE,4BAA4B;IAC5B,MAAM,eAAe,GAAG,OAAO,MAAM,CAAC,kBAAkB,KAAK,UAAU,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EACxC,oDAAoD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EACvC,sDAAsD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAA6C,CAAC;QAC5F,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjE,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;QACpD,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EACrC,OAAO;YACL,CAAC,CAAC,6BAA6B,OAAO,EAAE;YACxC,CAAC,CAAC,OAAO,CAAC,MAAM;gBACd,CAAC,CAAC,iCAAiC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;gBACnE,CAAC,CAAC,kCAAkC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,oEAAoE;IACpE,kEAAkE;IAClE,qEAAqE;IACrE,UAAU;IACV,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,YAAY,KAAK,UAAU,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,+DAA+D;YAC/D,kDAAkD;YAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAC7C,QAAQ;gBACN,CAAC,CAAC,gDAAgD,CAAC,CAAC,IAAI,GAAG;gBAC3D,CAAC,CAAC,+CAA+C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAChE,SAAS;QACX,CAAC;QACD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAC1C,uBAAuB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACvD,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EACvC,OAAO,CAAC,MAAM;YACZ,CAAC,CAAC,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;YAC3D,CAAC,CAAC,MAAM,CAAC,MAAM;gBACb,CAAC,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;gBACnE,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO;QACL,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAC1D,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,MAAM;QACN,OAAO;QACP,SAAS,EAAE;YACT,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,WAAW;YAC5B,iBAAiB,EAAE,eAAe;YAClC,WAAW,EAAE,cAAc;YAC3B,YAAY,EAAE,eAAe;YAC7B,cAAc,EAAE,UAAU;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,YAAY,CAAC,CAAoB;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS;QACtB,CAAC,CAAC,gCAAgC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE;QACvD,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elicitkit/conformance",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The Elicitkit conformance suite — the source of truth for what \"Elicitkit-compliant\" means. A spec-derived fixture corpus + a portable runner any implementation points at.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" },
|
|
11
|
+
"./corpus": "./dist/corpus.js"
|
|
12
|
+
},
|
|
13
|
+
"files": ["dist"],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"test": "tsc -p tsconfig.json && node test/smoke.mjs"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@elicitkit/core": "workspace:*",
|
|
20
|
+
"@elicitkit/renderers": "workspace:*"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": { "access": "public" }
|
|
23
|
+
}
|