@contractspec/example.locale-jurisdiction-gate 3.7.16 → 3.7.18

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 (66) hide show
  1. package/.turbo/turbo-build.log +66 -66
  2. package/CHANGELOG.md +22 -0
  3. package/dist/browser/docs/index.js +3 -27
  4. package/dist/browser/docs/locale-jurisdiction-gate.docblock.js +3 -27
  5. package/dist/browser/entities/index.js +1 -110
  6. package/dist/browser/entities/models.js +1 -110
  7. package/dist/browser/events.js +1 -73
  8. package/dist/browser/example.js +1 -35
  9. package/dist/browser/forms/assistant-context.form.js +1 -213
  10. package/dist/browser/forms/index.js +1 -213
  11. package/dist/browser/handlers/demo.handlers.js +2 -152
  12. package/dist/browser/handlers/index.js +2 -152
  13. package/dist/browser/index.js +4 -844
  14. package/dist/browser/locale-jurisdiction-gate.feature.js +1 -105
  15. package/dist/browser/operations/assistant.js +1 -192
  16. package/dist/browser/operations/index.js +1 -192
  17. package/dist/browser/policy/assistant-gate.policy.js +1 -62
  18. package/dist/browser/policy/guard.js +2 -73
  19. package/dist/browser/policy/index.js +2 -134
  20. package/dist/browser/translations/assistant-gate.en-GB.translation.js +1 -48
  21. package/dist/browser/translations/assistant-gate.en-US.translation.js +1 -50
  22. package/dist/browser/translations/assistant-gate.fr-FR.translation.js +1 -52
  23. package/dist/browser/translations/index.js +1 -148
  24. package/dist/docs/index.js +3 -27
  25. package/dist/docs/locale-jurisdiction-gate.docblock.js +3 -27
  26. package/dist/entities/index.js +1 -110
  27. package/dist/entities/models.js +1 -110
  28. package/dist/events.js +1 -73
  29. package/dist/example.js +1 -35
  30. package/dist/forms/assistant-context.form.js +1 -213
  31. package/dist/forms/index.js +1 -213
  32. package/dist/handlers/demo.handlers.js +2 -152
  33. package/dist/handlers/index.js +2 -152
  34. package/dist/index.js +4 -844
  35. package/dist/locale-jurisdiction-gate.feature.js +1 -105
  36. package/dist/node/docs/index.js +3 -27
  37. package/dist/node/docs/locale-jurisdiction-gate.docblock.js +3 -27
  38. package/dist/node/entities/index.js +1 -110
  39. package/dist/node/entities/models.js +1 -110
  40. package/dist/node/events.js +1 -73
  41. package/dist/node/example.js +1 -35
  42. package/dist/node/forms/assistant-context.form.js +1 -213
  43. package/dist/node/forms/index.js +1 -213
  44. package/dist/node/handlers/demo.handlers.js +2 -152
  45. package/dist/node/handlers/index.js +2 -152
  46. package/dist/node/index.js +4 -844
  47. package/dist/node/locale-jurisdiction-gate.feature.js +1 -105
  48. package/dist/node/operations/assistant.js +1 -192
  49. package/dist/node/operations/index.js +1 -192
  50. package/dist/node/policy/assistant-gate.policy.js +1 -62
  51. package/dist/node/policy/guard.js +2 -73
  52. package/dist/node/policy/index.js +2 -134
  53. package/dist/node/translations/assistant-gate.en-GB.translation.js +1 -48
  54. package/dist/node/translations/assistant-gate.en-US.translation.js +1 -50
  55. package/dist/node/translations/assistant-gate.fr-FR.translation.js +1 -52
  56. package/dist/node/translations/index.js +1 -148
  57. package/dist/operations/assistant.js +1 -192
  58. package/dist/operations/index.js +1 -192
  59. package/dist/policy/assistant-gate.policy.js +1 -62
  60. package/dist/policy/guard.js +2 -73
  61. package/dist/policy/index.js +2 -134
  62. package/dist/translations/assistant-gate.en-GB.translation.js +1 -48
  63. package/dist/translations/assistant-gate.en-US.translation.js +1 -50
  64. package/dist/translations/assistant-gate.fr-FR.translation.js +1 -52
  65. package/dist/translations/index.js +1 -148
  66. package/package.json +7 -7
@@ -1,152 +1,2 @@
1
- // src/policy/guard.ts
2
- var SUPPORTED_LOCALES = new Set(["en-US", "en-GB", "fr-FR"]);
3
- function err(code, message) {
4
- return { code, message };
5
- }
6
- function validateEnvelope(envelope) {
7
- if (!envelope.locale || !SUPPORTED_LOCALES.has(envelope.locale)) {
8
- return {
9
- ok: false,
10
- error: err("LOCALE_REQUIRED", "locale is required and must be supported")
11
- };
12
- }
13
- if (!envelope.regulatoryContext?.jurisdiction) {
14
- return {
15
- ok: false,
16
- error: err("JURISDICTION_REQUIRED", "jurisdiction is required")
17
- };
18
- }
19
- if (!envelope.kbSnapshotId) {
20
- return {
21
- ok: false,
22
- error: err("KB_SNAPSHOT_REQUIRED", "kbSnapshotId is required")
23
- };
24
- }
25
- if (!envelope.allowedScope) {
26
- return {
27
- ok: false,
28
- error: err("SCOPE_VIOLATION", "allowedScope is required")
29
- };
30
- }
31
- return { ok: true, value: envelope };
32
- }
33
- function enforceCitations(answer) {
34
- const citations = answer.citations ?? [];
35
- if (!Array.isArray(citations) || citations.length === 0) {
36
- return {
37
- ok: false,
38
- error: err("CITATIONS_REQUIRED", "answers must include at least one citation")
39
- };
40
- }
41
- return { ok: true, value: answer };
42
- }
43
- var EDUCATION_ONLY_FORBIDDEN_PATTERNS = [
44
- /\b(buy|sell)\b/i,
45
- /\b(should\s+buy|should\s+sell)\b/i,
46
- /\b(guarantee(d)?|promise(d)?)\b/i
47
- ];
48
- function enforceAllowedScope(allowedScope, answer) {
49
- if (!allowedScope) {
50
- return {
51
- ok: false,
52
- error: err("SCOPE_VIOLATION", "allowedScope is required")
53
- };
54
- }
55
- if (allowedScope !== "education_only") {
56
- return { ok: true, value: answer };
57
- }
58
- const bodies = (answer.sections ?? []).map((s) => s.body).join(`
59
- `);
60
- const violations = EDUCATION_ONLY_FORBIDDEN_PATTERNS.some((re) => re.test(bodies));
61
- if (violations) {
62
- return {
63
- ok: false,
64
- error: err("SCOPE_VIOLATION", "answer violates education_only scope (contains actionable or promotional language)")
65
- };
66
- }
67
- return { ok: true, value: answer };
68
- }
69
-
70
- // src/handlers/demo.handlers.ts
71
- function createDemoAssistantHandlers() {
72
- async function answer(input) {
73
- const env = validateEnvelope(input.envelope);
74
- if (!env.ok) {
75
- return {
76
- locale: input.envelope.locale ?? "en-US",
77
- jurisdiction: input.envelope.regulatoryContext?.jurisdiction ?? "UNKNOWN",
78
- allowedScope: input.envelope.allowedScope ?? "education_only",
79
- sections: [
80
- {
81
- heading: "Request blocked",
82
- body: env.error.message
83
- }
84
- ],
85
- citations: [],
86
- disclaimers: [
87
- "This system refuses to answer without a valid envelope."
88
- ],
89
- riskFlags: [env.error.code],
90
- refused: true,
91
- refusalReason: env.error.code
92
- };
93
- }
94
- const draft = {
95
- locale: env.value.locale,
96
- jurisdiction: env.value.regulatoryContext?.jurisdiction ?? "UNKNOWN",
97
- allowedScope: env.value.allowedScope ?? "education_only",
98
- sections: [
99
- {
100
- heading: "Answer (demo)",
101
- body: `You asked: "${input.question}". This demo answer is derived from the KB snapshot only.`
102
- }
103
- ],
104
- citations: [
105
- {
106
- kbSnapshotId: env.value.kbSnapshotId ?? "unknown",
107
- sourceType: "ruleVersion",
108
- sourceId: "rv_demo",
109
- title: "Demo rule version",
110
- excerpt: "Demo excerpt"
111
- }
112
- ],
113
- disclaimers: ["Educational demo only."],
114
- riskFlags: []
115
- };
116
- const scope = enforceAllowedScope(env.value.allowedScope, draft);
117
- if (!scope.ok) {
118
- return {
119
- ...draft,
120
- sections: [
121
- { heading: "Escalation required", body: scope.error.message }
122
- ],
123
- citations: draft.citations,
124
- refused: true,
125
- refusalReason: scope.error.code,
126
- riskFlags: [...draft.riskFlags ?? [], scope.error.code]
127
- };
128
- }
129
- const cited = enforceCitations(draft);
130
- if (!cited.ok) {
131
- return {
132
- ...draft,
133
- sections: [{ heading: "Request blocked", body: cited.error.message }],
134
- citations: [],
135
- refused: true,
136
- refusalReason: cited.error.code,
137
- riskFlags: [...draft.riskFlags ?? [], cited.error.code]
138
- };
139
- }
140
- return draft;
141
- }
142
- async function explainConcept(input) {
143
- return await answer({
144
- envelope: input.envelope,
145
- question: `Explain concept: ${input.conceptKey}`
146
- });
147
- }
148
- return { answer, explainConcept };
149
- }
150
- export {
151
- createDemoAssistantHandlers
152
- };
1
+ var V=new Set(["en-US","en-GB","fr-FR"]);function G(h,k){return{code:h,message:k}}function K(h){if(!h.locale||!V.has(h.locale))return{ok:!1,error:G("LOCALE_REQUIRED","locale is required and must be supported")};if(!h.regulatoryContext?.jurisdiction)return{ok:!1,error:G("JURISDICTION_REQUIRED","jurisdiction is required")};if(!h.kbSnapshotId)return{ok:!1,error:G("KB_SNAPSHOT_REQUIRED","kbSnapshotId is required")};if(!h.allowedScope)return{ok:!1,error:G("SCOPE_VIOLATION","allowedScope is required")};return{ok:!0,value:h}}function M(h){let k=h.citations??[];if(!Array.isArray(k)||k.length===0)return{ok:!1,error:G("CITATIONS_REQUIRED","answers must include at least one citation")};return{ok:!0,value:h}}var W=[/\b(buy|sell)\b/i,/\b(should\s+buy|should\s+sell)\b/i,/\b(guarantee(d)?|promise(d)?)\b/i];function Q(h,k){if(!h)return{ok:!1,error:G("SCOPE_VIOLATION","allowedScope is required")};if(h!=="education_only")return{ok:!0,value:k};let q=(k.sections??[]).map((j)=>j.body).join(`
2
+ `);if(W.some((j)=>j.test(q)))return{ok:!1,error:G("SCOPE_VIOLATION","answer violates education_only scope (contains actionable or promotional language)")};return{ok:!0,value:k}}function $(){async function h(q){let z=K(q.envelope);if(!z.ok)return{locale:q.envelope.locale??"en-US",jurisdiction:q.envelope.regulatoryContext?.jurisdiction??"UNKNOWN",allowedScope:q.envelope.allowedScope??"education_only",sections:[{heading:"Request blocked",body:z.error.message}],citations:[],disclaimers:["This system refuses to answer without a valid envelope."],riskFlags:[z.error.code],refused:!0,refusalReason:z.error.code};let j={locale:z.value.locale,jurisdiction:z.value.regulatoryContext?.jurisdiction??"UNKNOWN",allowedScope:z.value.allowedScope??"education_only",sections:[{heading:"Answer (demo)",body:`You asked: "${q.question}". This demo answer is derived from the KB snapshot only.`}],citations:[{kbSnapshotId:z.value.kbSnapshotId??"unknown",sourceType:"ruleVersion",sourceId:"rv_demo",title:"Demo rule version",excerpt:"Demo excerpt"}],disclaimers:["Educational demo only."],riskFlags:[]},H=Q(z.value.allowedScope,j);if(!H.ok)return{...j,sections:[{heading:"Escalation required",body:H.error.message}],citations:j.citations,refused:!0,refusalReason:H.error.code,riskFlags:[...j.riskFlags??[],H.error.code]};let J=M(j);if(!J.ok)return{...j,sections:[{heading:"Request blocked",body:J.error.message}],citations:[],refused:!0,refusalReason:J.error.code,riskFlags:[...j.riskFlags??[],J.error.code]};return j}async function k(q){return await h({envelope:q.envelope,question:`Explain concept: ${q.conceptKey}`})}return{answer:h,explainConcept:k}}export{$ as createDemoAssistantHandlers};