@contractspec/example.locale-jurisdiction-gate 3.7.7 → 3.7.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/.turbo/turbo-build.log +72 -51
  2. package/CHANGELOG.md +43 -0
  3. package/README.md +13 -1
  4. package/dist/browser/forms/assistant-context.form.js +213 -0
  5. package/dist/browser/forms/index.js +213 -0
  6. package/dist/browser/index.js +327 -6
  7. package/dist/browser/locale-jurisdiction-gate.feature.js +66 -1
  8. package/dist/browser/policy/assistant-gate.policy.js +62 -0
  9. package/dist/browser/policy/index.js +62 -1
  10. package/dist/browser/translations/assistant-gate.en-GB.translation.js +48 -0
  11. package/dist/browser/translations/assistant-gate.en-US.translation.js +50 -0
  12. package/dist/browser/translations/assistant-gate.fr-FR.translation.js +52 -0
  13. package/dist/browser/translations/index.js +148 -0
  14. package/dist/contracts.test.d.ts +1 -0
  15. package/dist/forms/assistant-context.form.d.ts +22 -0
  16. package/dist/forms/assistant-context.form.js +214 -0
  17. package/dist/forms/index.d.ts +1 -0
  18. package/dist/forms/index.js +214 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +327 -6
  21. package/dist/locale-jurisdiction-gate.feature.js +66 -1
  22. package/dist/node/forms/assistant-context.form.js +213 -0
  23. package/dist/node/forms/index.js +213 -0
  24. package/dist/node/index.js +327 -6
  25. package/dist/node/locale-jurisdiction-gate.feature.js +66 -1
  26. package/dist/node/policy/assistant-gate.policy.js +62 -0
  27. package/dist/node/policy/index.js +62 -1
  28. package/dist/node/translations/assistant-gate.en-GB.translation.js +48 -0
  29. package/dist/node/translations/assistant-gate.en-US.translation.js +50 -0
  30. package/dist/node/translations/assistant-gate.fr-FR.translation.js +52 -0
  31. package/dist/node/translations/index.js +148 -0
  32. package/dist/policy/assistant-gate.policy.d.ts +1 -0
  33. package/dist/policy/assistant-gate.policy.js +63 -0
  34. package/dist/policy/index.d.ts +1 -0
  35. package/dist/policy/index.js +62 -1
  36. package/dist/translations/assistant-gate.en-GB.translation.d.ts +1 -0
  37. package/dist/translations/assistant-gate.en-GB.translation.js +49 -0
  38. package/dist/translations/assistant-gate.en-US.translation.d.ts +1 -0
  39. package/dist/translations/assistant-gate.en-US.translation.js +51 -0
  40. package/dist/translations/assistant-gate.fr-FR.translation.d.ts +1 -0
  41. package/dist/translations/assistant-gate.fr-FR.translation.js +53 -0
  42. package/dist/translations/index.d.ts +3 -0
  43. package/dist/translations/index.js +149 -0
  44. package/package.json +103 -5
  45. package/src/contracts.test.ts +32 -0
  46. package/src/forms/assistant-context.form.ts +112 -0
  47. package/src/forms/index.ts +1 -0
  48. package/src/index.ts +2 -0
  49. package/src/locale-jurisdiction-gate.feature.ts +7 -1
  50. package/src/policy/assistant-gate.policy.ts +65 -0
  51. package/src/policy/index.ts +1 -0
  52. package/src/translations/assistant-gate.en-GB.translation.ts +46 -0
  53. package/src/translations/assistant-gate.en-US.translation.ts +48 -0
  54. package/src/translations/assistant-gate.fr-FR.translation.ts +51 -0
  55. package/src/translations/index.ts +3 -0
@@ -2,61 +2,82 @@ $ contractspec-bun-build prebuild
2
2
  $ bun run prebuild && bun run build:bundle && bun run build:types
3
3
  $ contractspec-bun-build prebuild
4
4
  $ contractspec-bun-build transpile
5
- [contractspec-bun-build] transpile target=bun root=src entries=15 noBundle=false
6
- Bundled 15 modules in 15ms
5
+ [contractspec-bun-build] transpile target=bun root=src entries=22 noBundle=false
6
+ Bundled 22 modules in 31ms
7
7
 
8
- docs/index.js 1.64 KB (entry point)
9
- ./index.js 18.69 KB (entry point)
10
- ./locale-jurisdiction-gate.feature.js 1.38 KB (entry point)
11
- operations/index.js 6.95 KB (entry point)
12
- operations/assistant.js 6.95 KB (entry point)
13
- policy/index.js 2.0 KB (entry point)
14
- policy/types.js 8 bytes (entry point)
15
- docs/locale-jurisdiction-gate.docblock.js 1.64 KB (entry point)
16
- entities/index.js 3.89 KB (entry point)
17
- entities/models.js 3.89 KB (entry point)
18
- ./events.js 2.97 KB (entry point)
19
- ./example.js 1.1 KB (entry point)
20
- handlers/index.js 4.45 KB (entry point)
21
- handlers/demo.handlers.js 4.45 KB (entry point)
22
- policy/guard.js 2.0 KB (entry point)
8
+ docs/index.js 1.64 KB (entry point)
9
+ ./index.js 30.25 KB (entry point)
10
+ policy/index.js 4.12 KB (entry point)
11
+ policy/types.js 8 bytes (entry point)
12
+ translations/index.js 5.92 KB (entry point)
13
+ translations/assistant-gate.en-GB.translation.js 1.85 KB (entry point)
14
+ translations/assistant-gate.en-US.translation.js 2.0 KB (entry point)
15
+ translations/assistant-gate.fr-FR.translation.js 1.94 KB (entry point)
16
+ handlers/index.js 4.45 KB (entry point)
17
+ handlers/demo.handlers.js 4.45 KB (entry point)
18
+ ./locale-jurisdiction-gate.feature.js 3.48 KB (entry point)
19
+ operations/index.js 6.95 KB (entry point)
20
+ operations/assistant.js 6.95 KB (entry point)
21
+ policy/assistant-gate.policy.js 2.10 KB (entry point)
22
+ policy/guard.js 2.0 KB (entry point)
23
+ docs/locale-jurisdiction-gate.docblock.js 1.64 KB (entry point)
24
+ entities/index.js 3.89 KB (entry point)
25
+ ./events.js 2.97 KB (entry point)
26
+ ./example.js 1.1 KB (entry point)
27
+ forms/index.js 7.15 KB (entry point)
28
+ forms/assistant-context.form.js 7.15 KB (entry point)
29
+ entities/models.js 3.89 KB (entry point)
23
30
 
24
- [contractspec-bun-build] transpile target=node root=src entries=15 noBundle=false
25
- Bundled 15 modules in 35ms
31
+ [contractspec-bun-build] transpile target=node root=src entries=22 noBundle=false
32
+ Bundled 22 modules in 55ms
26
33
 
27
- docs/index.js 1.63 KB (entry point)
28
- ./index.js 18.68 KB (entry point)
29
- ./locale-jurisdiction-gate.feature.js 1.37 KB (entry point)
30
- operations/index.js 6.94 KB (entry point)
31
- operations/assistant.js 6.94 KB (entry point)
32
- policy/index.js 2.0 KB (entry point)
33
- policy/types.js 0 KB (entry point)
34
- docs/locale-jurisdiction-gate.docblock.js 1.63 KB (entry point)
35
- entities/index.js 3.88 KB (entry point)
36
- entities/models.js 3.88 KB (entry point)
37
- ./events.js 2.96 KB (entry point)
38
- ./example.js 1.1 KB (entry point)
39
- handlers/index.js 4.44 KB (entry point)
40
- handlers/demo.handlers.js 4.44 KB (entry point)
41
- policy/guard.js 2.0 KB (entry point)
34
+ docs/index.js 1.63 KB (entry point)
35
+ ./index.js 30.21 KB (entry point)
36
+ policy/index.js 4.11 KB (entry point)
37
+ policy/types.js 0 KB (entry point)
38
+ translations/index.js 5.89 KB (entry point)
39
+ translations/assistant-gate.en-GB.translation.js 1.84 KB (entry point)
40
+ translations/assistant-gate.en-US.translation.js 2.0 KB (entry point)
41
+ translations/assistant-gate.fr-FR.translation.js 1.90 KB (entry point)
42
+ handlers/index.js 4.44 KB (entry point)
43
+ handlers/demo.handlers.js 4.44 KB (entry point)
44
+ ./locale-jurisdiction-gate.feature.js 3.47 KB (entry point)
45
+ operations/index.js 6.94 KB (entry point)
46
+ operations/assistant.js 6.94 KB (entry point)
47
+ policy/assistant-gate.policy.js 2.1 KB (entry point)
48
+ policy/guard.js 2.0 KB (entry point)
49
+ docs/locale-jurisdiction-gate.docblock.js 1.63 KB (entry point)
50
+ entities/index.js 3.88 KB (entry point)
51
+ ./events.js 2.96 KB (entry point)
52
+ ./example.js 1.1 KB (entry point)
53
+ forms/index.js 7.14 KB (entry point)
54
+ forms/assistant-context.form.js 7.14 KB (entry point)
55
+ entities/models.js 3.88 KB (entry point)
42
56
 
43
- [contractspec-bun-build] transpile target=browser root=src entries=15 noBundle=false
44
- Bundled 15 modules in 30ms
57
+ [contractspec-bun-build] transpile target=browser root=src entries=22 noBundle=false
58
+ Bundled 22 modules in 53ms
45
59
 
46
- docs/index.js 1.63 KB (entry point)
47
- ./index.js 18.68 KB (entry point)
48
- ./locale-jurisdiction-gate.feature.js 1.37 KB (entry point)
49
- operations/index.js 6.94 KB (entry point)
50
- operations/assistant.js 6.94 KB (entry point)
51
- policy/index.js 2.0 KB (entry point)
52
- policy/types.js 0 KB (entry point)
53
- docs/locale-jurisdiction-gate.docblock.js 1.63 KB (entry point)
54
- entities/index.js 3.88 KB (entry point)
55
- entities/models.js 3.88 KB (entry point)
56
- ./events.js 2.96 KB (entry point)
57
- ./example.js 1.1 KB (entry point)
58
- handlers/index.js 4.44 KB (entry point)
59
- handlers/demo.handlers.js 4.44 KB (entry point)
60
- policy/guard.js 2.0 KB (entry point)
60
+ docs/index.js 1.63 KB (entry point)
61
+ ./index.js 30.21 KB (entry point)
62
+ policy/index.js 4.11 KB (entry point)
63
+ policy/types.js 0 KB (entry point)
64
+ translations/index.js 5.89 KB (entry point)
65
+ translations/assistant-gate.en-GB.translation.js 1.84 KB (entry point)
66
+ translations/assistant-gate.en-US.translation.js 2.0 KB (entry point)
67
+ translations/assistant-gate.fr-FR.translation.js 1.90 KB (entry point)
68
+ handlers/index.js 4.44 KB (entry point)
69
+ handlers/demo.handlers.js 4.44 KB (entry point)
70
+ ./locale-jurisdiction-gate.feature.js 3.47 KB (entry point)
71
+ operations/index.js 6.94 KB (entry point)
72
+ operations/assistant.js 6.94 KB (entry point)
73
+ policy/assistant-gate.policy.js 2.1 KB (entry point)
74
+ policy/guard.js 2.0 KB (entry point)
75
+ docs/locale-jurisdiction-gate.docblock.js 1.63 KB (entry point)
76
+ entities/index.js 3.88 KB (entry point)
77
+ ./events.js 2.96 KB (entry point)
78
+ ./example.js 1.1 KB (entry point)
79
+ forms/index.js 7.14 KB (entry point)
80
+ forms/assistant-context.form.js 7.14 KB (entry point)
81
+ entities/models.js 3.88 KB (entry point)
61
82
 
62
83
  $ contractspec-bun-build types
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @contractspec/example.locale-jurisdiction-gate
2
2
 
3
+ ## 3.7.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [81256ea]
8
+ - Updated dependencies [2619dd8]
9
+ - Updated dependencies [6de2f1c]
10
+ - Updated dependencies [81256ea]
11
+ - Updated dependencies [a4489bb]
12
+ - Updated dependencies [9cb304e]
13
+ - @contractspec/lib.contracts-spec@5.0.0
14
+ - @contractspec/lib.schema@3.7.10
15
+
16
+ ## 3.7.11
17
+
18
+ ### Patch Changes
19
+
20
+ - fix: release
21
+ - Updated dependencies
22
+ - @contractspec/lib.contracts-spec@4.1.3
23
+ - @contractspec/lib.schema@3.7.9
24
+
25
+ ## 3.7.10
26
+
27
+ ### Patch Changes
28
+
29
+ - 1a44cb6: feat: improve examples to increase coverage of Contracts type
30
+ - Updated dependencies [1a44cb6]
31
+ - @contractspec/lib.contracts-spec@4.1.2
32
+ - @contractspec/lib.schema@3.7.8
33
+
34
+ ## 3.7.9
35
+
36
+ ### Patch Changes
37
+
38
+ - fix: release
39
+ - Updated dependencies
40
+ - @contractspec/lib.contracts-spec@4.1.1
41
+ - @contractspec/lib.schema@3.7.7
42
+
3
43
  ## 3.7.6
4
44
 
5
45
  ### Patch Changes
@@ -704,14 +744,17 @@
704
744
  feat: Contract layers support (features, examples, app-configs)
705
745
 
706
746
  ### New CLI Commands
747
+
707
748
  - `contractspec list layers` - List all contract layers with filtering
708
749
 
709
750
  ### Enhanced Commands
751
+
710
752
  - `contractspec ci` - New `layers` check category validates features/examples/config
711
753
  - `contractspec doctor` - New `layers` health checks
712
754
  - `contractspec integrity` - Now shows layer statistics
713
755
 
714
756
  ### New APIs
757
+
715
758
  - `discoverLayers()` - Scan workspace for all layer files
716
759
  - `scanExampleSource()` - Parse ExampleSpec from source code
717
760
  - `isExampleFile()` - Check if file is an example spec
package/README.md CHANGED
@@ -6,6 +6,9 @@ Website: https://contractspec.io
6
6
 
7
7
  ## What This Demonstrates
8
8
 
9
+ - Canonical `policy` export via `AssistantGatePolicy`.
10
+ - Canonical `form` export via `AssistantContextForm`.
11
+ - Canonical `translation` exports for `en-US`, `en-GB`, and `fr-FR`.
9
12
  - Fail-closed policy guard pattern for AI assistant calls.
10
13
  - Entity models for locale/jurisdiction gating.
11
14
  - Event-driven policy enforcement.
@@ -31,9 +34,11 @@ Use `@contractspec/example.locale-jurisdiction-gate` as a reference implementati
31
34
  - `src/entities/` contains domain entities and value objects.
32
35
  - `src/events.ts` is package-level event definitions.
33
36
  - `src/example.ts` is the runnable example entrypoint.
37
+ - `src/forms/` contains the exported assistant context form spec.
34
38
  - `src/handlers/` contains handlers or demo adapters wired to contract surfaces.
35
39
  - `src/index.ts` is the root public barrel and package entrypoint.
36
40
  - `src/locale-jurisdiction-gate.feature.ts` defines a feature entrypoint.
41
+ - `src/translations/` contains the exported locale catalogs.
37
42
 
38
43
  ## Public Entry Points
39
44
 
@@ -44,10 +49,17 @@ Use `@contractspec/example.locale-jurisdiction-gate` as a reference implementati
44
49
  - Export `./entities/models` resolves through `./src/entities/models.ts`.
45
50
  - Export `./events` resolves through `./src/events.ts`.
46
51
  - Export `./example` resolves through `./src/example.ts`.
52
+ - Export `./forms` resolves through `./src/forms/index.ts`.
53
+ - Export `./forms/assistant-context.form` resolves through `./src/forms/assistant-context.form.ts`.
47
54
  - Export `./handlers` resolves through `./src/handlers/index.ts`.
48
55
  - Export `./handlers/demo.handlers` resolves through `./src/handlers/demo.handlers.ts`.
49
56
  - Export `./locale-jurisdiction-gate.feature` resolves through `./src/locale-jurisdiction-gate.feature.ts`.
50
- - The package publishes 15 total export subpaths; keep docs aligned with `package.json`.
57
+ - Export `./policy/assistant-gate.policy` resolves through `./src/policy/assistant-gate.policy.ts`.
58
+ - Export `./translations` resolves through `./src/translations/index.ts`.
59
+ - Export `./translations/assistant-gate.en-GB.translation` resolves through `./src/translations/assistant-gate.en-GB.translation.ts`.
60
+ - Export `./translations/assistant-gate.en-US.translation` resolves through `./src/translations/assistant-gate.en-US.translation.ts`.
61
+ - Export `./translations/assistant-gate.fr-FR.translation` resolves through `./src/translations/assistant-gate.fr-FR.translation.ts`.
62
+ - The package publishes 21 total export subpaths; keep docs aligned with `package.json`.
51
63
 
52
64
  ## Local Commands
53
65
 
@@ -0,0 +1,213 @@
1
+ // src/entities/models.ts
2
+ import {
3
+ defineEnum,
4
+ defineSchemaModel,
5
+ ScalarTypeEnum
6
+ } from "@contractspec/lib.schema";
7
+ var AllowedScopeEnum = defineEnum("AllowedScope", [
8
+ "education_only",
9
+ "generic_info",
10
+ "escalation_required"
11
+ ]);
12
+ var UserProfileModel = defineSchemaModel({
13
+ name: "UserProfile",
14
+ description: "User profile inputs used to derive regulatory context.",
15
+ fields: {
16
+ preferredLocale: {
17
+ type: ScalarTypeEnum.String_unsecure(),
18
+ isOptional: true
19
+ },
20
+ residencyCountry: {
21
+ type: ScalarTypeEnum.String_unsecure(),
22
+ isOptional: true
23
+ },
24
+ taxResidenceCountry: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ clientType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
29
+ }
30
+ });
31
+ var RegulatoryContextModel = defineSchemaModel({
32
+ name: "RegulatoryContext",
33
+ description: "Explicit regulatory context (no guessing).",
34
+ fields: {
35
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
36
+ region: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
37
+ clientType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
38
+ allowedScope: { type: AllowedScopeEnum, isOptional: false }
39
+ }
40
+ });
41
+ var LLMCallEnvelopeModel = defineSchemaModel({
42
+ name: "LLMCallEnvelope",
43
+ description: "Mandatory envelope for assistant calls. All fields are explicit and required for policy gating.",
44
+ fields: {
45
+ traceId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
46
+ locale: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
47
+ regulatoryContext: { type: RegulatoryContextModel, isOptional: false },
48
+ kbSnapshotId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
49
+ allowedScope: { type: AllowedScopeEnum, isOptional: false }
50
+ }
51
+ });
52
+ var AssistantCitationModel = defineSchemaModel({
53
+ name: "AssistantCitation",
54
+ description: "Citation referencing a KB snapshot + a specific item within it.",
55
+ fields: {
56
+ kbSnapshotId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
57
+ sourceType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
58
+ sourceId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
59
+ title: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
60
+ excerpt: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
61
+ }
62
+ });
63
+ var AssistantAnswerSectionModel = defineSchemaModel({
64
+ name: "AssistantAnswerSection",
65
+ description: "Structured answer section.",
66
+ fields: {
67
+ heading: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
68
+ body: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
69
+ }
70
+ });
71
+ var AssistantAnswerIRModel = defineSchemaModel({
72
+ name: "AssistantAnswerIR",
73
+ description: "Structured assistant answer with mandatory citations and explicit locale/jurisdiction.",
74
+ fields: {
75
+ locale: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
76
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
77
+ allowedScope: { type: AllowedScopeEnum, isOptional: false },
78
+ sections: {
79
+ type: AssistantAnswerSectionModel,
80
+ isArray: true,
81
+ isOptional: false
82
+ },
83
+ citations: {
84
+ type: AssistantCitationModel,
85
+ isArray: true,
86
+ isOptional: false
87
+ },
88
+ disclaimers: {
89
+ type: ScalarTypeEnum.String_unsecure(),
90
+ isArray: true,
91
+ isOptional: true
92
+ },
93
+ riskFlags: {
94
+ type: ScalarTypeEnum.String_unsecure(),
95
+ isArray: true,
96
+ isOptional: true
97
+ },
98
+ refused: { type: ScalarTypeEnum.Boolean(), isOptional: true },
99
+ refusalReason: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
100
+ }
101
+ });
102
+
103
+ // src/forms/assistant-context.form.ts
104
+ import { defineFormSpec } from "@contractspec/lib.contracts-spec/forms";
105
+ import {
106
+ OwnersEnum,
107
+ StabilityEnum,
108
+ TagsEnum
109
+ } from "@contractspec/lib.contracts-spec/ownership";
110
+ import { defineSchemaModel as defineSchemaModel2, ScalarTypeEnum as ScalarTypeEnum2 } from "@contractspec/lib.schema";
111
+ var AssistantContextFormModel = defineSchemaModel2({
112
+ name: "AssistantContextFormModel",
113
+ description: "Form values required before a policy-gated assistant request can be executed.",
114
+ fields: {
115
+ locale: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
116
+ jurisdiction: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
117
+ kbSnapshotId: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
118
+ allowedScope: { type: AllowedScopeEnum, isOptional: false },
119
+ question: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false }
120
+ }
121
+ });
122
+ var AssistantContextForm = defineFormSpec({
123
+ meta: {
124
+ key: "locale-jurisdiction-gate.form.assistant-context",
125
+ version: "1.0.0",
126
+ title: "Assistant Context Gate",
127
+ description: "Collects the explicit locale, jurisdiction, scope, and knowledge snapshot required by the assistant gate.",
128
+ domain: "assistant",
129
+ owners: [OwnersEnum.PlatformFinance],
130
+ tags: [TagsEnum.I18n, "assistant", "form", "policy"],
131
+ stability: StabilityEnum.Experimental
132
+ },
133
+ model: AssistantContextFormModel,
134
+ fields: [
135
+ {
136
+ kind: "select",
137
+ name: "locale",
138
+ labelI18n: "assistantGate.locale.label",
139
+ descriptionI18n: "assistantGate.locale.description",
140
+ options: {
141
+ kind: "static",
142
+ options: [
143
+ { labelI18n: "assistantGate.locale.enUs", value: "en-US" },
144
+ { labelI18n: "assistantGate.locale.enGb", value: "en-GB" },
145
+ { labelI18n: "assistantGate.locale.frFr", value: "fr-FR" }
146
+ ]
147
+ },
148
+ required: true
149
+ },
150
+ {
151
+ kind: "text",
152
+ name: "jurisdiction",
153
+ labelI18n: "assistantGate.jurisdiction.label",
154
+ placeholderI18n: "assistantGate.jurisdiction.placeholder",
155
+ required: true
156
+ },
157
+ {
158
+ kind: "text",
159
+ name: "kbSnapshotId",
160
+ labelI18n: "assistantGate.kbSnapshotId.label",
161
+ placeholderI18n: "assistantGate.kbSnapshotId.placeholder",
162
+ required: true
163
+ },
164
+ {
165
+ kind: "radio",
166
+ name: "allowedScope",
167
+ labelI18n: "assistantGate.allowedScope.label",
168
+ options: {
169
+ kind: "static",
170
+ options: [
171
+ {
172
+ labelI18n: "assistantGate.allowedScope.educationOnly",
173
+ value: "education_only"
174
+ },
175
+ {
176
+ labelI18n: "assistantGate.allowedScope.genericInfo",
177
+ value: "generic_info"
178
+ },
179
+ {
180
+ labelI18n: "assistantGate.allowedScope.escalationRequired",
181
+ value: "escalation_required"
182
+ }
183
+ ]
184
+ },
185
+ required: true
186
+ },
187
+ {
188
+ kind: "textarea",
189
+ name: "question",
190
+ labelI18n: "assistantGate.question.label",
191
+ placeholderI18n: "assistantGate.question.placeholder",
192
+ required: true
193
+ }
194
+ ],
195
+ actions: [
196
+ {
197
+ key: "submit",
198
+ labelI18n: "assistantGate.submit.label",
199
+ op: { name: "assistant.answer", version: "1.0.0" }
200
+ }
201
+ ],
202
+ policy: {
203
+ flags: [],
204
+ pii: ["kbSnapshotId", "question"]
205
+ },
206
+ renderHints: {
207
+ ui: "custom",
208
+ form: "react-hook-form"
209
+ }
210
+ });
211
+ export {
212
+ AssistantContextForm
213
+ };
@@ -0,0 +1,213 @@
1
+ // src/entities/models.ts
2
+ import {
3
+ defineEnum,
4
+ defineSchemaModel,
5
+ ScalarTypeEnum
6
+ } from "@contractspec/lib.schema";
7
+ var AllowedScopeEnum = defineEnum("AllowedScope", [
8
+ "education_only",
9
+ "generic_info",
10
+ "escalation_required"
11
+ ]);
12
+ var UserProfileModel = defineSchemaModel({
13
+ name: "UserProfile",
14
+ description: "User profile inputs used to derive regulatory context.",
15
+ fields: {
16
+ preferredLocale: {
17
+ type: ScalarTypeEnum.String_unsecure(),
18
+ isOptional: true
19
+ },
20
+ residencyCountry: {
21
+ type: ScalarTypeEnum.String_unsecure(),
22
+ isOptional: true
23
+ },
24
+ taxResidenceCountry: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ clientType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
29
+ }
30
+ });
31
+ var RegulatoryContextModel = defineSchemaModel({
32
+ name: "RegulatoryContext",
33
+ description: "Explicit regulatory context (no guessing).",
34
+ fields: {
35
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
36
+ region: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
37
+ clientType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
38
+ allowedScope: { type: AllowedScopeEnum, isOptional: false }
39
+ }
40
+ });
41
+ var LLMCallEnvelopeModel = defineSchemaModel({
42
+ name: "LLMCallEnvelope",
43
+ description: "Mandatory envelope for assistant calls. All fields are explicit and required for policy gating.",
44
+ fields: {
45
+ traceId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
46
+ locale: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
47
+ regulatoryContext: { type: RegulatoryContextModel, isOptional: false },
48
+ kbSnapshotId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
49
+ allowedScope: { type: AllowedScopeEnum, isOptional: false }
50
+ }
51
+ });
52
+ var AssistantCitationModel = defineSchemaModel({
53
+ name: "AssistantCitation",
54
+ description: "Citation referencing a KB snapshot + a specific item within it.",
55
+ fields: {
56
+ kbSnapshotId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
57
+ sourceType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
58
+ sourceId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
59
+ title: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
60
+ excerpt: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
61
+ }
62
+ });
63
+ var AssistantAnswerSectionModel = defineSchemaModel({
64
+ name: "AssistantAnswerSection",
65
+ description: "Structured answer section.",
66
+ fields: {
67
+ heading: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
68
+ body: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
69
+ }
70
+ });
71
+ var AssistantAnswerIRModel = defineSchemaModel({
72
+ name: "AssistantAnswerIR",
73
+ description: "Structured assistant answer with mandatory citations and explicit locale/jurisdiction.",
74
+ fields: {
75
+ locale: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
76
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
77
+ allowedScope: { type: AllowedScopeEnum, isOptional: false },
78
+ sections: {
79
+ type: AssistantAnswerSectionModel,
80
+ isArray: true,
81
+ isOptional: false
82
+ },
83
+ citations: {
84
+ type: AssistantCitationModel,
85
+ isArray: true,
86
+ isOptional: false
87
+ },
88
+ disclaimers: {
89
+ type: ScalarTypeEnum.String_unsecure(),
90
+ isArray: true,
91
+ isOptional: true
92
+ },
93
+ riskFlags: {
94
+ type: ScalarTypeEnum.String_unsecure(),
95
+ isArray: true,
96
+ isOptional: true
97
+ },
98
+ refused: { type: ScalarTypeEnum.Boolean(), isOptional: true },
99
+ refusalReason: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
100
+ }
101
+ });
102
+
103
+ // src/forms/assistant-context.form.ts
104
+ import { defineFormSpec } from "@contractspec/lib.contracts-spec/forms";
105
+ import {
106
+ OwnersEnum,
107
+ StabilityEnum,
108
+ TagsEnum
109
+ } from "@contractspec/lib.contracts-spec/ownership";
110
+ import { defineSchemaModel as defineSchemaModel2, ScalarTypeEnum as ScalarTypeEnum2 } from "@contractspec/lib.schema";
111
+ var AssistantContextFormModel = defineSchemaModel2({
112
+ name: "AssistantContextFormModel",
113
+ description: "Form values required before a policy-gated assistant request can be executed.",
114
+ fields: {
115
+ locale: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
116
+ jurisdiction: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
117
+ kbSnapshotId: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false },
118
+ allowedScope: { type: AllowedScopeEnum, isOptional: false },
119
+ question: { type: ScalarTypeEnum2.String_unsecure(), isOptional: false }
120
+ }
121
+ });
122
+ var AssistantContextForm = defineFormSpec({
123
+ meta: {
124
+ key: "locale-jurisdiction-gate.form.assistant-context",
125
+ version: "1.0.0",
126
+ title: "Assistant Context Gate",
127
+ description: "Collects the explicit locale, jurisdiction, scope, and knowledge snapshot required by the assistant gate.",
128
+ domain: "assistant",
129
+ owners: [OwnersEnum.PlatformFinance],
130
+ tags: [TagsEnum.I18n, "assistant", "form", "policy"],
131
+ stability: StabilityEnum.Experimental
132
+ },
133
+ model: AssistantContextFormModel,
134
+ fields: [
135
+ {
136
+ kind: "select",
137
+ name: "locale",
138
+ labelI18n: "assistantGate.locale.label",
139
+ descriptionI18n: "assistantGate.locale.description",
140
+ options: {
141
+ kind: "static",
142
+ options: [
143
+ { labelI18n: "assistantGate.locale.enUs", value: "en-US" },
144
+ { labelI18n: "assistantGate.locale.enGb", value: "en-GB" },
145
+ { labelI18n: "assistantGate.locale.frFr", value: "fr-FR" }
146
+ ]
147
+ },
148
+ required: true
149
+ },
150
+ {
151
+ kind: "text",
152
+ name: "jurisdiction",
153
+ labelI18n: "assistantGate.jurisdiction.label",
154
+ placeholderI18n: "assistantGate.jurisdiction.placeholder",
155
+ required: true
156
+ },
157
+ {
158
+ kind: "text",
159
+ name: "kbSnapshotId",
160
+ labelI18n: "assistantGate.kbSnapshotId.label",
161
+ placeholderI18n: "assistantGate.kbSnapshotId.placeholder",
162
+ required: true
163
+ },
164
+ {
165
+ kind: "radio",
166
+ name: "allowedScope",
167
+ labelI18n: "assistantGate.allowedScope.label",
168
+ options: {
169
+ kind: "static",
170
+ options: [
171
+ {
172
+ labelI18n: "assistantGate.allowedScope.educationOnly",
173
+ value: "education_only"
174
+ },
175
+ {
176
+ labelI18n: "assistantGate.allowedScope.genericInfo",
177
+ value: "generic_info"
178
+ },
179
+ {
180
+ labelI18n: "assistantGate.allowedScope.escalationRequired",
181
+ value: "escalation_required"
182
+ }
183
+ ]
184
+ },
185
+ required: true
186
+ },
187
+ {
188
+ kind: "textarea",
189
+ name: "question",
190
+ labelI18n: "assistantGate.question.label",
191
+ placeholderI18n: "assistantGate.question.placeholder",
192
+ required: true
193
+ }
194
+ ],
195
+ actions: [
196
+ {
197
+ key: "submit",
198
+ labelI18n: "assistantGate.submit.label",
199
+ op: { name: "assistant.answer", version: "1.0.0" }
200
+ }
201
+ ],
202
+ policy: {
203
+ flags: [],
204
+ pii: ["kbSnapshotId", "question"]
205
+ },
206
+ renderHints: {
207
+ ui: "custom",
208
+ form: "react-hook-form"
209
+ }
210
+ });
211
+ export {
212
+ AssistantContextForm
213
+ };