@contractspec/example.policy-safe-knowledge-assistant 1.56.1 → 1.58.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.
Files changed (88) hide show
  1. package/.turbo/turbo-build.log +59 -56
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +46 -0
  4. package/dist/browser/docs/index.js +38 -0
  5. package/dist/browser/docs/policy-safe-knowledge-assistant.docblock.js +38 -0
  6. package/dist/browser/example.js +37 -0
  7. package/dist/browser/handlers/index.js +334 -0
  8. package/dist/browser/handlers/policy-safe-knowledge-assistant.handlers.js +334 -0
  9. package/dist/browser/index.js +917 -0
  10. package/dist/browser/orchestrator/buildAnswer.js +73 -0
  11. package/dist/browser/policy-safe-knowledge-assistant.feature.js +57 -0
  12. package/dist/browser/seed/fixtures.js +35 -0
  13. package/dist/browser/seed/index.js +35 -0
  14. package/dist/browser/seeders/index.js +12 -0
  15. package/dist/browser/ui/PolicySafeKnowledgeAssistantDashboard.js +420 -0
  16. package/dist/browser/ui/hooks/usePolicySafeKnowledgeAssistant.js +154 -0
  17. package/dist/browser/ui/index.js +420 -0
  18. package/dist/docs/index.d.ts +2 -1
  19. package/dist/docs/index.d.ts.map +1 -0
  20. package/dist/docs/index.js +39 -1
  21. package/dist/docs/policy-safe-knowledge-assistant.docblock.d.ts +2 -1
  22. package/dist/docs/policy-safe-knowledge-assistant.docblock.d.ts.map +1 -0
  23. package/dist/docs/policy-safe-knowledge-assistant.docblock.js +37 -33
  24. package/dist/example.d.ts +2 -6
  25. package/dist/example.d.ts.map +1 -1
  26. package/dist/example.js +35 -51
  27. package/dist/handlers/index.d.ts +2 -2
  28. package/dist/handlers/index.d.ts.map +1 -0
  29. package/dist/handlers/index.js +334 -2
  30. package/dist/handlers/policy-safe-knowledge-assistant.handlers.d.ts +124 -122
  31. package/dist/handlers/policy-safe-knowledge-assistant.handlers.d.ts.map +1 -1
  32. package/dist/handlers/policy-safe-knowledge-assistant.handlers.js +325 -254
  33. package/dist/index.d.ts +11 -8
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +918 -10
  36. package/dist/integration.test.d.ts +2 -0
  37. package/dist/integration.test.d.ts.map +1 -0
  38. package/dist/node/docs/index.js +38 -0
  39. package/dist/node/docs/policy-safe-knowledge-assistant.docblock.js +38 -0
  40. package/dist/node/example.js +37 -0
  41. package/dist/node/handlers/index.js +334 -0
  42. package/dist/node/handlers/policy-safe-knowledge-assistant.handlers.js +334 -0
  43. package/dist/node/index.js +917 -0
  44. package/dist/node/orchestrator/buildAnswer.js +73 -0
  45. package/dist/node/policy-safe-knowledge-assistant.feature.js +57 -0
  46. package/dist/node/seed/fixtures.js +35 -0
  47. package/dist/node/seed/index.js +35 -0
  48. package/dist/node/seeders/index.js +12 -0
  49. package/dist/node/ui/PolicySafeKnowledgeAssistantDashboard.js +420 -0
  50. package/dist/node/ui/hooks/usePolicySafeKnowledgeAssistant.js +154 -0
  51. package/dist/node/ui/index.js +420 -0
  52. package/dist/orchestrator/buildAnswer.d.ts +40 -42
  53. package/dist/orchestrator/buildAnswer.d.ts.map +1 -1
  54. package/dist/orchestrator/buildAnswer.js +72 -75
  55. package/dist/policy-safe-knowledge-assistant.feature.d.ts +1 -6
  56. package/dist/policy-safe-knowledge-assistant.feature.d.ts.map +1 -1
  57. package/dist/policy-safe-knowledge-assistant.feature.js +56 -148
  58. package/dist/seed/fixtures.d.ts +28 -31
  59. package/dist/seed/fixtures.d.ts.map +1 -1
  60. package/dist/seed/fixtures.js +35 -33
  61. package/dist/seed/index.d.ts +2 -2
  62. package/dist/seed/index.d.ts.map +1 -0
  63. package/dist/seed/index.js +36 -3
  64. package/dist/seeders/index.d.ts +4 -8
  65. package/dist/seeders/index.d.ts.map +1 -1
  66. package/dist/seeders/index.js +11 -14
  67. package/dist/ui/PolicySafeKnowledgeAssistantDashboard.d.ts +1 -6
  68. package/dist/ui/PolicySafeKnowledgeAssistantDashboard.d.ts.map +1 -1
  69. package/dist/ui/PolicySafeKnowledgeAssistantDashboard.js +415 -225
  70. package/dist/ui/hooks/usePolicySafeKnowledgeAssistant.d.ts +49 -51
  71. package/dist/ui/hooks/usePolicySafeKnowledgeAssistant.d.ts.map +1 -1
  72. package/dist/ui/hooks/usePolicySafeKnowledgeAssistant.js +147 -185
  73. package/dist/ui/index.d.ts +2 -2
  74. package/dist/ui/index.d.ts.map +1 -0
  75. package/dist/ui/index.js +420 -2
  76. package/package.json +174 -45
  77. package/tsdown.config.js +1 -2
  78. package/.turbo/turbo-build$colon$bundle.log +0 -55
  79. package/dist/docs/policy-safe-knowledge-assistant.docblock.js.map +0 -1
  80. package/dist/example.js.map +0 -1
  81. package/dist/handlers/policy-safe-knowledge-assistant.handlers.js.map +0 -1
  82. package/dist/orchestrator/buildAnswer.js.map +0 -1
  83. package/dist/policy-safe-knowledge-assistant.feature.js.map +0 -1
  84. package/dist/seed/fixtures.js.map +0 -1
  85. package/dist/seeders/index.js.map +0 -1
  86. package/dist/ui/PolicySafeKnowledgeAssistantDashboard.js.map +0 -1
  87. package/dist/ui/hooks/usePolicySafeKnowledgeAssistant.js.map +0 -1
  88. package/tsconfig.tsbuildinfo +0 -1
package/package.json CHANGED
@@ -1,73 +1,202 @@
1
1
  {
2
2
  "name": "@contractspec/example.policy-safe-knowledge-assistant",
3
- "version": "1.56.1",
3
+ "version": "1.58.0",
4
4
  "description": "All-in-one template example: policy-safe knowledge assistant with locale/jurisdiction gating, versioned KB snapshots, HITL update pipeline, and learning hub.",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
8
- ".": "./dist/index.js",
9
- "./docs": "./dist/docs/index.js",
10
- "./docs/policy-safe-knowledge-assistant.docblock": "./dist/docs/policy-safe-knowledge-assistant.docblock.js",
11
- "./example": "./dist/example.js",
12
- "./handlers": "./dist/handlers/index.js",
13
- "./handlers/policy-safe-knowledge-assistant.handlers": "./dist/handlers/policy-safe-knowledge-assistant.handlers.js",
14
- "./orchestrator/buildAnswer": "./dist/orchestrator/buildAnswer.js",
15
- "./policy-safe-knowledge-assistant.feature": "./dist/policy-safe-knowledge-assistant.feature.js",
16
- "./seed": "./dist/seed/index.js",
17
- "./seed/fixtures": "./dist/seed/fixtures.js",
18
- "./seeders": "./dist/seeders/index.js",
19
- "./ui": "./dist/ui/index.js",
20
- "./ui/hooks/usePolicySafeKnowledgeAssistant": "./dist/ui/hooks/usePolicySafeKnowledgeAssistant.js",
21
- "./ui/PolicySafeKnowledgeAssistantDashboard": "./dist/ui/PolicySafeKnowledgeAssistantDashboard.js",
22
- "./*": "./*"
8
+ ".": "./src/index.ts",
9
+ "./docs": "./src/docs/index.ts",
10
+ "./docs/index": "./src/docs/index.ts",
11
+ "./docs/policy-safe-knowledge-assistant.docblock": "./src/docs/policy-safe-knowledge-assistant.docblock.ts",
12
+ "./example": "./src/example.ts",
13
+ "./handlers": "./src/handlers/index.ts",
14
+ "./handlers/index": "./src/handlers/index.ts",
15
+ "./handlers/policy-safe-knowledge-assistant.handlers": "./src/handlers/policy-safe-knowledge-assistant.handlers.ts",
16
+ "./orchestrator/buildAnswer": "./src/orchestrator/buildAnswer.ts",
17
+ "./policy-safe-knowledge-assistant.feature": "./src/policy-safe-knowledge-assistant.feature.ts",
18
+ "./seed": "./src/seed/index.ts",
19
+ "./seed/fixtures": "./src/seed/fixtures.ts",
20
+ "./seed/index": "./src/seed/index.ts",
21
+ "./seeders": "./src/seeders/index.ts",
22
+ "./seeders/index": "./src/seeders/index.ts",
23
+ "./ui": "./src/ui/index.ts",
24
+ "./ui/hooks/usePolicySafeKnowledgeAssistant": "./src/ui/hooks/usePolicySafeKnowledgeAssistant.ts",
25
+ "./ui/index": "./src/ui/index.ts",
26
+ "./ui/PolicySafeKnowledgeAssistantDashboard": "./src/ui/PolicySafeKnowledgeAssistantDashboard.tsx"
23
27
  },
24
28
  "scripts": {
25
29
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
26
30
  "publish:pkg:canary": "bun publish:pkg --tag canary",
27
- "build": "bun build:types && bun build:bundle",
28
- "build:bundle": "tsdown",
29
- "build:types": "tsc --noEmit",
30
- "dev": "bun build:bundle --watch",
31
+ "build": "bun run prebuild && bun run build:bundle && bun run build:types",
32
+ "build:bundle": "contractspec-bun-build transpile",
33
+ "build:types": "contractspec-bun-build types",
34
+ "dev": "contractspec-bun-build dev",
31
35
  "clean": "rimraf dist .turbo",
32
36
  "lint": "bun lint:fix",
33
37
  "lint:fix": "eslint src --fix",
34
38
  "lint:check": "eslint src",
35
- "test": "bun test"
39
+ "test": "bun test",
40
+ "prebuild": "contractspec-bun-build prebuild",
41
+ "typecheck": "tsc --noEmit"
36
42
  },
37
43
  "dependencies": {
38
- "@contractspec/example.kb-update-pipeline": "1.56.1",
39
- "@contractspec/example.learning-patterns": "1.56.1",
40
- "@contractspec/example.locale-jurisdiction-gate": "1.56.1",
41
- "@contractspec/example.versioned-knowledge-base": "1.56.1",
42
- "@contractspec/lib.contracts": "1.56.1",
43
- "@contractspec/lib.design-system": "1.56.1",
44
- "@contractspec/lib.example-shared-ui": "1.10.1",
45
- "@contractspec/lib.runtime-sandbox": "0.11.1",
46
- "@contractspec/lib.ui-kit-web": "1.56.1",
47
- "@contractspec/module.learning-journey": "1.56.1",
44
+ "@contractspec/example.kb-update-pipeline": "1.58.0",
45
+ "@contractspec/example.learning-patterns": "1.58.0",
46
+ "@contractspec/example.locale-jurisdiction-gate": "1.58.0",
47
+ "@contractspec/example.versioned-knowledge-base": "1.58.0",
48
+ "@contractspec/lib.contracts": "1.58.0",
49
+ "@contractspec/lib.design-system": "1.58.0",
50
+ "@contractspec/lib.example-shared-ui": "1.12.0",
51
+ "@contractspec/lib.runtime-sandbox": "0.13.0",
52
+ "@contractspec/lib.ui-kit-web": "1.58.0",
53
+ "@contractspec/module.learning-journey": "1.58.0",
48
54
  "react": "19.2.4",
49
55
  "react-dom": "19.2.4"
50
56
  },
51
57
  "devDependencies": {
52
- "@contractspec/tool.tsdown": "1.56.1",
53
- "@contractspec/tool.typescript": "1.56.1",
54
- "tsdown": "^0.19.0",
58
+ "@contractspec/tool.typescript": "1.58.0",
55
59
  "typescript": "^5.9.3",
56
- "@types/react": "^19.2.8",
57
- "@types/react-dom": "^19.2.2"
60
+ "@types/react": "^19.2.13",
61
+ "@types/react-dom": "^19.2.2",
62
+ "@contractspec/tool.bun": "1.57.0"
58
63
  },
59
64
  "publishConfig": {
60
65
  "access": "public",
61
66
  "exports": {
62
- ".": "./dist/index.js",
63
- "./docs": "./dist/docs/index.js",
64
- "./docs/policy-safe-knowledge-assistant.docblock": "./dist/docs/policy-safe-knowledge-assistant.docblock.js",
65
- "./example": "./dist/example.js",
66
- "./policy-safe-knowledge-assistant.feature": "./dist/policy-safe-knowledge-assistant.feature.js",
67
- "./orchestrator/buildAnswer": "./dist/orchestrator/buildAnswer.js",
68
- "./seed": "./dist/seed/index.js",
69
- "./seed/fixtures": "./dist/seed/fixtures.js",
70
- "./*": "./*"
67
+ ".": {
68
+ "types": "./dist/index.d.ts",
69
+ "bun": "./dist/index.js",
70
+ "node": "./dist/node/index.mjs",
71
+ "browser": "./dist/browser/index.js",
72
+ "default": "./dist/index.js"
73
+ },
74
+ "./docs": {
75
+ "types": "./dist/docs/index.d.ts",
76
+ "bun": "./dist/docs/index.js",
77
+ "node": "./dist/node/docs/index.mjs",
78
+ "browser": "./dist/browser/docs/index.js",
79
+ "default": "./dist/docs/index.js"
80
+ },
81
+ "./docs/index": {
82
+ "types": "./dist/docs/index.d.ts",
83
+ "bun": "./dist/docs/index.js",
84
+ "node": "./dist/node/docs/index.mjs",
85
+ "browser": "./dist/browser/docs/index.js",
86
+ "default": "./dist/docs/index.js"
87
+ },
88
+ "./docs/policy-safe-knowledge-assistant.docblock": {
89
+ "types": "./dist/docs/policy-safe-knowledge-assistant.docblock.d.ts",
90
+ "bun": "./dist/docs/policy-safe-knowledge-assistant.docblock.js",
91
+ "node": "./dist/node/docs/policy-safe-knowledge-assistant.docblock.mjs",
92
+ "browser": "./dist/browser/docs/policy-safe-knowledge-assistant.docblock.js",
93
+ "default": "./dist/docs/policy-safe-knowledge-assistant.docblock.js"
94
+ },
95
+ "./example": {
96
+ "types": "./dist/example.d.ts",
97
+ "bun": "./dist/example.js",
98
+ "node": "./dist/node/example.mjs",
99
+ "browser": "./dist/browser/example.js",
100
+ "default": "./dist/example.js"
101
+ },
102
+ "./handlers": {
103
+ "types": "./dist/handlers/index.d.ts",
104
+ "bun": "./dist/handlers/index.js",
105
+ "node": "./dist/node/handlers/index.mjs",
106
+ "browser": "./dist/browser/handlers/index.js",
107
+ "default": "./dist/handlers/index.js"
108
+ },
109
+ "./handlers/index": {
110
+ "types": "./dist/handlers/index.d.ts",
111
+ "bun": "./dist/handlers/index.js",
112
+ "node": "./dist/node/handlers/index.mjs",
113
+ "browser": "./dist/browser/handlers/index.js",
114
+ "default": "./dist/handlers/index.js"
115
+ },
116
+ "./handlers/policy-safe-knowledge-assistant.handlers": {
117
+ "types": "./dist/handlers/policy-safe-knowledge-assistant.handlers.d.ts",
118
+ "bun": "./dist/handlers/policy-safe-knowledge-assistant.handlers.js",
119
+ "node": "./dist/node/handlers/policy-safe-knowledge-assistant.handlers.mjs",
120
+ "browser": "./dist/browser/handlers/policy-safe-knowledge-assistant.handlers.js",
121
+ "default": "./dist/handlers/policy-safe-knowledge-assistant.handlers.js"
122
+ },
123
+ "./orchestrator/buildAnswer": {
124
+ "types": "./dist/orchestrator/buildAnswer.d.ts",
125
+ "bun": "./dist/orchestrator/buildAnswer.js",
126
+ "node": "./dist/node/orchestrator/buildAnswer.mjs",
127
+ "browser": "./dist/browser/orchestrator/buildAnswer.js",
128
+ "default": "./dist/orchestrator/buildAnswer.js"
129
+ },
130
+ "./policy-safe-knowledge-assistant.feature": {
131
+ "types": "./dist/policy-safe-knowledge-assistant.feature.d.ts",
132
+ "bun": "./dist/policy-safe-knowledge-assistant.feature.js",
133
+ "node": "./dist/node/policy-safe-knowledge-assistant.feature.mjs",
134
+ "browser": "./dist/browser/policy-safe-knowledge-assistant.feature.js",
135
+ "default": "./dist/policy-safe-knowledge-assistant.feature.js"
136
+ },
137
+ "./seed": {
138
+ "types": "./dist/seed/index.d.ts",
139
+ "bun": "./dist/seed/index.js",
140
+ "node": "./dist/node/seed/index.mjs",
141
+ "browser": "./dist/browser/seed/index.js",
142
+ "default": "./dist/seed/index.js"
143
+ },
144
+ "./seed/fixtures": {
145
+ "types": "./dist/seed/fixtures.d.ts",
146
+ "bun": "./dist/seed/fixtures.js",
147
+ "node": "./dist/node/seed/fixtures.mjs",
148
+ "browser": "./dist/browser/seed/fixtures.js",
149
+ "default": "./dist/seed/fixtures.js"
150
+ },
151
+ "./seed/index": {
152
+ "types": "./dist/seed/index.d.ts",
153
+ "bun": "./dist/seed/index.js",
154
+ "node": "./dist/node/seed/index.mjs",
155
+ "browser": "./dist/browser/seed/index.js",
156
+ "default": "./dist/seed/index.js"
157
+ },
158
+ "./seeders": {
159
+ "types": "./dist/seeders/index.d.ts",
160
+ "bun": "./dist/seeders/index.js",
161
+ "node": "./dist/node/seeders/index.mjs",
162
+ "browser": "./dist/browser/seeders/index.js",
163
+ "default": "./dist/seeders/index.js"
164
+ },
165
+ "./seeders/index": {
166
+ "types": "./dist/seeders/index.d.ts",
167
+ "bun": "./dist/seeders/index.js",
168
+ "node": "./dist/node/seeders/index.mjs",
169
+ "browser": "./dist/browser/seeders/index.js",
170
+ "default": "./dist/seeders/index.js"
171
+ },
172
+ "./ui": {
173
+ "types": "./dist/ui/index.d.ts",
174
+ "bun": "./dist/ui/index.js",
175
+ "node": "./dist/node/ui/index.mjs",
176
+ "browser": "./dist/browser/ui/index.js",
177
+ "default": "./dist/ui/index.js"
178
+ },
179
+ "./ui/hooks/usePolicySafeKnowledgeAssistant": {
180
+ "types": "./dist/ui/hooks/usePolicySafeKnowledgeAssistant.d.ts",
181
+ "bun": "./dist/ui/hooks/usePolicySafeKnowledgeAssistant.js",
182
+ "node": "./dist/node/ui/hooks/usePolicySafeKnowledgeAssistant.mjs",
183
+ "browser": "./dist/browser/ui/hooks/usePolicySafeKnowledgeAssistant.js",
184
+ "default": "./dist/ui/hooks/usePolicySafeKnowledgeAssistant.js"
185
+ },
186
+ "./ui/index": {
187
+ "types": "./dist/ui/index.d.ts",
188
+ "bun": "./dist/ui/index.js",
189
+ "node": "./dist/node/ui/index.mjs",
190
+ "browser": "./dist/browser/ui/index.js",
191
+ "default": "./dist/ui/index.js"
192
+ },
193
+ "./ui/PolicySafeKnowledgeAssistantDashboard": {
194
+ "types": "./dist/ui/PolicySafeKnowledgeAssistantDashboard.d.ts",
195
+ "bun": "./dist/ui/PolicySafeKnowledgeAssistantDashboard.js",
196
+ "node": "./dist/node/ui/PolicySafeKnowledgeAssistantDashboard.mjs",
197
+ "browser": "./dist/browser/ui/PolicySafeKnowledgeAssistantDashboard.js",
198
+ "default": "./dist/ui/PolicySafeKnowledgeAssistantDashboard.js"
199
+ }
71
200
  },
72
201
  "registry": "https://registry.npmjs.org/"
73
202
  },
package/tsdown.config.js CHANGED
@@ -1,5 +1,4 @@
1
- import { defineConfig } from 'tsdown';
2
- import { moduleLibrary, withDevExports } from '@contractspec/tool.tsdown';
1
+ import { defineConfig, moduleLibrary, withDevExports } from '@contractspec/tool.bun';
3
2
 
4
3
  export default defineConfig(() => ({
5
4
  ...moduleLibrary,
@@ -1,55 +0,0 @@
1
- $ tsdown
2
- ℹ tsdown v0.19.0 powered by rolldown v1.0.0-beta.59
3
- ℹ config file: /home/runner/work/contractspec/contractspec/packages/examples/policy-safe-knowledge-assistant/tsdown.config.js
4
- ℹ entry: src/example.ts, src/index.ts, src/policy-safe-knowledge-assistant.feature.ts, src/docs/index.ts, src/docs/policy-safe-knowledge-assistant.docblock.ts, src/handlers/index.ts, src/handlers/policy-safe-knowledge-assistant.handlers.ts, src/orchestrator/buildAnswer.ts, src/seed/fixtures.ts, src/seed/index.ts, src/seeders/index.ts, src/ui/PolicySafeKnowledgeAssistantDashboard.tsx, src/ui/index.ts, src/ui/hooks/usePolicySafeKnowledgeAssistant.ts
5
- ℹ target: esnext
6
- ℹ tsconfig: tsconfig.json
7
- ℹ Build start
8
- ℹ Cleaning 52 files
9
- ℹ dist/handlers/policy-safe-knowledge-assistant.handlers.js  9.46 kB │ gzip: 2.58 kB
10
- ℹ dist/ui/PolicySafeKnowledgeAssistantDashboard.js  8.14 kB │ gzip: 2.11 kB
11
- ℹ dist/ui/hooks/usePolicySafeKnowledgeAssistant.js  4.78 kB │ gzip: 1.47 kB
12
- ℹ dist/policy-safe-knowledge-assistant.feature.js  2.55 kB │ gzip: 0.71 kB
13
- ℹ dist/orchestrator/buildAnswer.js  2.47 kB │ gzip: 0.93 kB
14
- ℹ dist/docs/policy-safe-knowledge-assistant.docblock.js  1.88 kB │ gzip: 0.90 kB
15
- ℹ dist/example.js  1.24 kB │ gzip: 0.59 kB
16
- ℹ dist/seed/fixtures.js  0.80 kB │ gzip: 0.40 kB
17
- ℹ dist/index.js  0.73 kB │ gzip: 0.26 kB
18
- ℹ dist/seeders/index.js  0.54 kB │ gzip: 0.38 kB
19
- ℹ dist/handlers/index.js  0.16 kB │ gzip: 0.11 kB
20
- ℹ dist/ui/index.js  0.15 kB │ gzip: 0.09 kB
21
- ℹ dist/seed/index.js  0.07 kB │ gzip: 0.07 kB
22
- ℹ dist/docs/index.js  0.06 kB │ gzip: 0.08 kB
23
- ℹ dist/handlers/policy-safe-knowledge-assistant.handlers.js.map 20.30 kB │ gzip: 5.31 kB
24
- ℹ dist/ui/PolicySafeKnowledgeAssistantDashboard.js.map 10.46 kB │ gzip: 3.10 kB
25
- ℹ dist/ui/hooks/usePolicySafeKnowledgeAssistant.js.map  9.84 kB │ gzip: 2.85 kB
26
- ℹ dist/orchestrator/buildAnswer.js.map  5.05 kB │ gzip: 1.68 kB
27
- ℹ dist/policy-safe-knowledge-assistant.feature.js.map  3.71 kB │ gzip: 1.05 kB
28
- ℹ dist/docs/policy-safe-knowledge-assistant.docblock.js.map  2.38 kB │ gzip: 1.08 kB
29
- ℹ dist/example.js.map  1.71 kB │ gzip: 0.80 kB
30
- ℹ dist/seed/fixtures.js.map  1.29 kB │ gzip: 0.55 kB
31
- ℹ dist/handlers/policy-safe-knowledge-assistant.handlers.d.ts.map  0.94 kB │ gzip: 0.44 kB
32
- ℹ dist/seeders/index.js.map  0.93 kB │ gzip: 0.61 kB
33
- ℹ dist/ui/hooks/usePolicySafeKnowledgeAssistant.d.ts.map  0.50 kB │ gzip: 0.29 kB
34
- ℹ dist/orchestrator/buildAnswer.d.ts.map  0.39 kB │ gzip: 0.25 kB
35
- ℹ dist/ui/PolicySafeKnowledgeAssistantDashboard.d.ts.map  0.23 kB │ gzip: 0.17 kB
36
- ℹ dist/seed/fixtures.d.ts.map  0.20 kB │ gzip: 0.15 kB
37
- ℹ dist/policy-safe-knowledge-assistant.feature.d.ts.map  0.20 kB │ gzip: 0.16 kB
38
- ℹ dist/seeders/index.d.ts.map  0.16 kB │ gzip: 0.14 kB
39
- ℹ dist/example.d.ts.map  0.14 kB │ gzip: 0.13 kB
40
- ℹ dist/handlers/policy-safe-knowledge-assistant.handlers.d.ts  3.21 kB │ gzip: 0.86 kB
41
- ℹ dist/ui/hooks/usePolicySafeKnowledgeAssistant.d.ts  1.64 kB │ gzip: 0.58 kB
42
- ℹ dist/orchestrator/buildAnswer.d.ts  1.31 kB │ gzip: 0.57 kB
43
- ℹ dist/seed/fixtures.d.ts  1.03 kB │ gzip: 0.37 kB
44
- ℹ dist/index.d.ts  0.83 kB │ gzip: 0.27 kB
45
- ℹ dist/policy-safe-knowledge-assistant.feature.d.ts  0.37 kB │ gzip: 0.20 kB
46
- ℹ dist/ui/PolicySafeKnowledgeAssistantDashboard.d.ts  0.34 kB │ gzip: 0.20 kB
47
- ℹ dist/seeders/index.d.ts  0.30 kB │ gzip: 0.23 kB
48
- ℹ dist/example.d.ts  0.25 kB │ gzip: 0.17 kB
49
- ℹ dist/handlers/index.d.ts  0.24 kB │ gzip: 0.12 kB
50
- ℹ dist/ui/index.d.ts  0.15 kB │ gzip: 0.09 kB
51
- ℹ dist/seed/index.d.ts  0.07 kB │ gzip: 0.07 kB
52
- ℹ dist/docs/index.d.ts  0.01 kB │ gzip: 0.03 kB
53
- ℹ dist/docs/policy-safe-knowledge-assistant.docblock.d.ts  0.01 kB │ gzip: 0.03 kB
54
- ℹ 45 files, total: 101.22 kB
55
- ✔ Build complete in 32739ms
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy-safe-knowledge-assistant.docblock.js","names":[],"sources":["../../src/docs/policy-safe-knowledge-assistant.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@contractspec/lib.contracts/docs';\nimport { registerDocBlocks } from '@contractspec/lib.contracts/docs';\n\nconst docBlocks: DocBlock[] = [\n {\n id: 'docs.examples.policy-safe-knowledge-assistant.goal',\n title: 'Policy-safe Knowledge Assistant — Goal',\n summary:\n 'End-to-end example: versioned KB snapshots + locale/jurisdiction gating + HITL pipeline + learning hub.',\n kind: 'goal',\n visibility: 'public',\n route: '/docs/examples/policy-safe-knowledge-assistant/goal',\n tags: ['assistant', 'knowledge', 'policy', 'hitl', 'learning'],\n body: `## What this template proves\\n- Assistant answers are structured and must cite a KB snapshot (or refuse).\\n- Locale + jurisdiction are mandatory inputs for every assistant call.\\n- Automation proposes KB patches; humans verify; publishing stays blocked until approvals.\\n- Learning hub demonstrates drills + coaching + quests without spam.\\n\\n## Offline-first\\n- Seeded fixtures are deterministic and require no external services.\\n- Optional non-authoritative fallback can be added behind a single feature flag (disabled by default).`,\n },\n {\n id: 'docs.examples.policy-safe-knowledge-assistant.usage',\n title: 'Policy-safe Knowledge Assistant — Usage',\n summary: '5–10 minute sandbox walkthrough for developers.',\n kind: 'usage',\n visibility: 'public',\n route: '/docs/examples/policy-safe-knowledge-assistant/usage',\n tags: ['assistant', 'knowledge', 'usage'],\n body: `## Demo walkthrough (high level)\\n1) Onboard: set locale + jurisdiction.\\n2) Publish snapshot: ingest source -> propose rule -> approve -> publish.\\n3) Ask assistant: must pass gate and cite snapshot.\\n4) Simulate change: watcher -> review -> publish new snapshot.\\n5) Learning hub: drills session, ambient tip, quest start + step completion.`,\n },\n];\n\nregisterDocBlocks(docBlocks);\n"],"mappings":";;;AA2BA,kBAxB8B,CAC5B;CACE,IAAI;CACJ,OAAO;CACP,SACE;CACF,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAa;EAAa;EAAU;EAAQ;EAAW;CAC9D,MAAM;CACP,EACD;CACE,IAAI;CACJ,OAAO;CACP,SAAS;CACT,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAa;EAAa;EAAQ;CACzC,MAAM;CACP,CACF,CAE2B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.js","names":[],"sources":["../src/example.ts"],"sourcesContent":["import { defineExample } from '@contractspec/lib.contracts';\n\nconst example = defineExample({\n meta: {\n key: 'policy-safe-knowledge-assistant',\n version: '1.0.0',\n title: 'Policy-safe Knowledge Assistant',\n description:\n 'All-in-one template: locale/jurisdiction gating + versioned KB snapshots + HITL update pipeline + learning hub.',\n kind: 'template',\n visibility: 'public',\n stability: 'experimental',\n owners: ['@platform.core'],\n tags: ['assistant', 'knowledge', 'policy', 'hitl', 'learning'],\n },\n docs: {\n goalDocId: 'docs.examples.policy-safe-knowledge-assistant.goal',\n usageDocId: 'docs.examples.policy-safe-knowledge-assistant.usage',\n },\n entrypoints: {\n packageName: '@contractspec/example.policy-safe-knowledge-assistant',\n feature: './policy-safe-knowledge-assistant.feature',\n docs: './docs',\n },\n surfaces: {\n templates: true,\n sandbox: {\n enabled: true,\n modes: ['playground', 'specs', 'builder', 'markdown', 'evolution'],\n },\n studio: { enabled: true, installable: true },\n mcp: { enabled: true },\n },\n});\n\nexport default example;\n"],"mappings":";;;AAEA,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,QAAQ,CAAC,iBAAiB;EAC1B,MAAM;GAAC;GAAa;GAAa;GAAU;GAAQ;GAAW;EAC/D;CACD,MAAM;EACJ,WAAW;EACX,YAAY;EACb;CACD,aAAa;EACX,aAAa;EACb,SAAS;EACT,MAAM;EACP;CACD,UAAU;EACR,WAAW;EACX,SAAS;GACP,SAAS;GACT,OAAO;IAAC;IAAc;IAAS;IAAW;IAAY;IAAY;GACnE;EACD,QAAQ;GAAE,SAAS;GAAM,aAAa;GAAM;EAC5C,KAAK,EAAE,SAAS,MAAM;EACvB;CACF,CAAC;AAEF,sBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy-safe-knowledge-assistant.handlers.js","names":[],"sources":["../../src/handlers/policy-safe-knowledge-assistant.handlers.ts"],"sourcesContent":["/**\n * Runtime-local handlers for the Policy-safe Knowledge Assistant template.\n *\n * These handlers are intentionally minimal and deterministic:\n * - No external LLM calls\n * - No web fetching as primary truth\n * - Answers are derived from KB snapshots and must include citations\n */\nimport type { DatabasePort, DbRow } from '@contractspec/lib.runtime-sandbox';\nimport { web } from '@contractspec/lib.runtime-sandbox';\nconst { generateId } = web;\n\nimport { buildPolicySafeAnswer } from '../orchestrator/buildAnswer';\n\ntype AllowedScope = 'education_only' | 'generic_info' | 'escalation_required';\ntype RiskLevel = 'low' | 'medium' | 'high';\ntype ReviewRole = 'curator' | 'expert';\n\ninterface UserContextRow extends Record<string, unknown> {\n projectId: string;\n locale: string;\n jurisdiction: string;\n allowedScope: AllowedScope;\n kbSnapshotId: string | null;\n}\n\ninterface RuleRow extends Record<string, unknown> {\n id: string;\n projectId: string;\n jurisdiction: string;\n topicKey: string;\n}\n\ninterface RuleVersionRow extends Record<string, unknown> {\n id: string;\n ruleId: string;\n jurisdiction: string;\n topicKey: string;\n version: number;\n content: string;\n status: string;\n sourceRefsJson: string;\n approvedBy: string | null;\n approvedAt: string | null;\n createdAt: string;\n}\n\ninterface SnapshotRow extends Record<string, unknown> {\n id: string;\n jurisdiction: string;\n asOfDate: string;\n includedRuleVersionIdsJson: string;\n publishedAt: string;\n}\n\ninterface ChangeCandidateRow extends Record<string, unknown> {\n id: string;\n projectId: string;\n jurisdiction: string;\n detectedAt: string;\n diffSummary: string;\n riskLevel: RiskLevel;\n proposedRuleVersionIdsJson: string;\n}\n\ninterface ReviewTaskRow extends Record<string, unknown> {\n id: string;\n changeCandidateId: string;\n status: string;\n assignedRole: ReviewRole;\n decision: string | null;\n decidedAt: string | null;\n decidedBy: string | null;\n}\n\nfunction parseJsonArray(value: string | null): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed)\n ? parsed.filter((v) => typeof v === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function createPolicySafeKnowledgeAssistantHandlers(db: DatabasePort) {\n async function getUserContext(input: { projectId: string }) {\n const result = await db.query(\n `SELECT * FROM psa_user_context WHERE \"projectId\" = $1 LIMIT 1`,\n [input.projectId]\n );\n const row = result.rows[0] as UserContextRow | undefined;\n if (!row) {\n return {\n projectId: input.projectId,\n locale: 'en-GB',\n jurisdiction: 'EU',\n allowedScope: 'education_only' as const,\n kbSnapshotId: null as string | null,\n };\n }\n return {\n projectId: row.projectId,\n locale: row.locale,\n jurisdiction: row.jurisdiction,\n allowedScope: row.allowedScope,\n kbSnapshotId: row.kbSnapshotId,\n };\n }\n\n async function setUserContext(input: {\n projectId: string;\n locale: string;\n jurisdiction: string;\n allowedScope: AllowedScope;\n }) {\n const existing = await db.query(\n `SELECT \"projectId\" FROM psa_user_context WHERE \"projectId\" = $1 LIMIT 1`,\n [input.projectId]\n );\n if (existing.rows.length) {\n await db.execute(\n `UPDATE psa_user_context SET locale = $1, jurisdiction = $2, \"allowedScope\" = $3 WHERE \"projectId\" = $4`,\n [input.locale, input.jurisdiction, input.allowedScope, input.projectId]\n );\n } else {\n await db.execute(\n `INSERT INTO psa_user_context (\"projectId\", locale, jurisdiction, \"allowedScope\", \"kbSnapshotId\") VALUES ($1, $2, $3, $4, $5)`,\n [\n input.projectId,\n input.locale,\n input.jurisdiction,\n input.allowedScope,\n null,\n ]\n );\n }\n return await getUserContext({ projectId: input.projectId });\n }\n\n async function createRule(input: {\n projectId: string;\n jurisdiction: string;\n topicKey: string;\n }) {\n const id = generateId('psa_rule');\n await db.execute(\n `INSERT INTO psa_rule (id, \"projectId\", jurisdiction, \"topicKey\") VALUES ($1, $2, $3, $4)`,\n [id, input.projectId, input.jurisdiction, input.topicKey]\n );\n return { id, ...input };\n }\n\n async function upsertRuleVersion(input: {\n projectId: string;\n ruleId: string;\n content: string;\n sourceRefs: { sourceDocumentId: string; excerpt?: string }[];\n }) {\n if (!input.sourceRefs.length) throw new Error('SOURCE_REFS_REQUIRED');\n const rulesResult = await db.query(\n `SELECT * FROM psa_rule WHERE id = $1 LIMIT 1`,\n [input.ruleId]\n );\n const rule = rulesResult.rows[0] as RuleRow | undefined;\n if (!rule) throw new Error('RULE_NOT_FOUND');\n\n const maxResult = await db.query(\n `SELECT MAX(version) as maxVersion FROM psa_rule_version WHERE \"ruleId\" = $1`,\n [input.ruleId]\n );\n const maxVersion = Number(\n (maxResult.rows[0] as Record<string, unknown>)?.maxVersion ?? 0\n );\n const version = maxVersion + 1;\n const id = generateId('psa_rv');\n const createdAt = nowIso();\n await db.execute(\n `INSERT INTO psa_rule_version (id, \"ruleId\", jurisdiction, \"topicKey\", version, content, status, \"sourceRefsJson\", \"approvedBy\", \"approvedAt\", \"createdAt\")\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n [\n id,\n input.ruleId,\n rule.jurisdiction,\n rule.topicKey,\n version,\n input.content,\n 'draft',\n JSON.stringify(input.sourceRefs),\n null,\n null,\n createdAt,\n ]\n );\n return {\n id,\n ruleId: input.ruleId,\n jurisdiction: rule.jurisdiction,\n topicKey: rule.topicKey,\n version,\n content: input.content,\n status: 'draft',\n sourceRefs: input.sourceRefs,\n createdAt: new Date(createdAt),\n };\n }\n\n async function approveRuleVersion(input: {\n ruleVersionId: string;\n approver: string;\n }) {\n const approvedAt = nowIso();\n await db.execute(\n `UPDATE psa_rule_version SET status = $1, \"approvedBy\" = $2, \"approvedAt\" = $3 WHERE id = $4`,\n ['approved', input.approver, approvedAt, input.ruleVersionId]\n );\n return { ruleVersionId: input.ruleVersionId, status: 'approved' as const };\n }\n\n async function publishSnapshot(input: {\n projectId: string;\n jurisdiction: string;\n asOfDate: Date;\n }) {\n const approvedResult = await db.query(\n `SELECT id FROM psa_rule_version WHERE jurisdiction = $1 AND status = 'approved' ORDER BY id ASC`,\n [input.jurisdiction]\n );\n const includedIds = approvedResult.rows\n .map((r: DbRow) => (r as { id: string }).id)\n .filter(Boolean);\n if (!includedIds.length) throw new Error('NO_APPROVED_RULES');\n const id = generateId('psa_snap');\n const publishedAt = nowIso();\n await db.execute(\n `INSERT INTO psa_snapshot (id, jurisdiction, \"asOfDate\", \"includedRuleVersionIdsJson\", \"publishedAt\")\n VALUES ($1, $2, $3, $4, $5)`,\n [\n id,\n input.jurisdiction,\n input.asOfDate.toISOString(),\n JSON.stringify(includedIds),\n publishedAt,\n ]\n );\n // update user context snapshot pointer (single-profile demo)\n await db.execute(\n `UPDATE psa_user_context SET \"kbSnapshotId\" = $1 WHERE \"projectId\" = $2`,\n [id, input.projectId]\n );\n return {\n id,\n jurisdiction: input.jurisdiction,\n includedRuleVersionIds: includedIds,\n };\n }\n\n async function searchKb(input: {\n snapshotId: string;\n jurisdiction: string;\n query: string;\n }) {\n const snapResult = await db.query(\n `SELECT * FROM psa_snapshot WHERE id = $1 LIMIT 1`,\n [input.snapshotId]\n );\n const snap = snapResult.rows[0] as SnapshotRow | undefined;\n if (!snap) throw new Error('SNAPSHOT_NOT_FOUND');\n if (snap.jurisdiction !== input.jurisdiction)\n throw new Error('JURISDICTION_MISMATCH');\n\n const includedIds = parseJsonArray(snap.includedRuleVersionIdsJson);\n const tokens = input.query\n .toLowerCase()\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean);\n\n const items: { ruleVersionId: string; excerpt?: string }[] = [];\n for (const id of includedIds) {\n const rvResult = await db.query(\n `SELECT * FROM psa_rule_version WHERE id = $1 LIMIT 1`,\n [id]\n );\n const rv = rvResult.rows[0] as RuleVersionRow | undefined;\n if (!rv) continue;\n const hay = rv.content.toLowerCase();\n const match = tokens.length ? tokens.every((t) => hay.includes(t)) : true;\n if (!match) continue;\n items.push({ ruleVersionId: rv.id, excerpt: rv.content.slice(0, 140) });\n }\n return { items };\n }\n\n async function answer(input: { projectId: string; question: string }) {\n const ctx = await getUserContext({ projectId: input.projectId });\n if (!ctx.kbSnapshotId) {\n // fail closed: no snapshot id => refuse via gate\n const refused = await buildPolicySafeAnswer({\n envelope: {\n traceId: generateId('trace'),\n locale: ctx.locale,\n kbSnapshotId: '',\n allowedScope: ctx.allowedScope,\n regulatoryContext: { jurisdiction: ctx.jurisdiction },\n },\n question: input.question,\n kbSearch: async () => ({ items: [] }),\n });\n return refused;\n }\n return await buildPolicySafeAnswer({\n envelope: {\n traceId: generateId('trace'),\n locale: ctx.locale,\n kbSnapshotId: ctx.kbSnapshotId,\n allowedScope: ctx.allowedScope,\n regulatoryContext: { jurisdiction: ctx.jurisdiction },\n },\n question: input.question,\n kbSearch: async (q) => await searchKb(q),\n });\n }\n\n async function createChangeCandidate(input: {\n projectId: string;\n jurisdiction: string;\n diffSummary: string;\n riskLevel: RiskLevel;\n proposedRuleVersionIds: string[];\n }) {\n const id = generateId('psa_change');\n await db.execute(\n `INSERT INTO psa_change_candidate (id, \"projectId\", jurisdiction, \"detectedAt\", \"diffSummary\", \"riskLevel\", \"proposedRuleVersionIdsJson\")\n VALUES ($1, $2, $3, $4, $5, $6, $7)`,\n [\n id,\n input.projectId,\n input.jurisdiction,\n nowIso(),\n input.diffSummary,\n input.riskLevel,\n JSON.stringify(input.proposedRuleVersionIds),\n ]\n );\n return { id };\n }\n\n async function createReviewTask(input: { changeCandidateId: string }) {\n const candResult = await db.query(\n `SELECT * FROM psa_change_candidate WHERE id = $1 LIMIT 1`,\n [input.changeCandidateId]\n );\n const candidate = candResult.rows[0] as ChangeCandidateRow | undefined;\n if (!candidate) throw new Error('CHANGE_CANDIDATE_NOT_FOUND');\n const assignedRole: ReviewRole =\n candidate.riskLevel === 'high' ? 'expert' : 'curator';\n const id = generateId('psa_review');\n await db.execute(\n `INSERT INTO psa_review_task (id, \"changeCandidateId\", status, \"assignedRole\", decision, \"decidedAt\", \"decidedBy\")\n VALUES ($1, $2, $3, $4, $5, $6, $7)`,\n [id, input.changeCandidateId, 'open', assignedRole, null, null, null]\n );\n return { id, assignedRole };\n }\n\n async function submitDecision(input: {\n reviewTaskId: string;\n decision: 'approve' | 'reject';\n decidedByRole: ReviewRole;\n decidedBy: string;\n }) {\n const reviewResult = await db.query(\n `SELECT * FROM psa_review_task WHERE id = $1 LIMIT 1`,\n [input.reviewTaskId]\n );\n const task = reviewResult.rows[0] as ReviewTaskRow | undefined;\n if (!task) throw new Error('REVIEW_TASK_NOT_FOUND');\n\n const candidateResult = await db.query(\n `SELECT * FROM psa_change_candidate WHERE id = $1 LIMIT 1`,\n [task.changeCandidateId]\n );\n const candidate = candidateResult.rows[0] as ChangeCandidateRow | undefined;\n if (!candidate) throw new Error('CHANGE_CANDIDATE_NOT_FOUND');\n if (\n candidate.riskLevel === 'high' &&\n input.decision === 'approve' &&\n input.decidedByRole !== 'expert'\n ) {\n throw new Error('FORBIDDEN_ROLE');\n }\n\n const decidedAt = nowIso();\n await db.execute(\n `UPDATE psa_review_task SET status = $1, decision = $2, \"decidedAt\" = $3, \"decidedBy\" = $4 WHERE id = $5`,\n [\n 'decided',\n input.decision,\n decidedAt,\n input.decidedBy,\n input.reviewTaskId,\n ]\n );\n return { id: input.reviewTaskId, status: 'decided' as const };\n }\n\n async function publishIfReady(input: { jurisdiction: string }) {\n const openResult = await db.query(\n `SELECT COUNT(*) as count FROM psa_review_task WHERE status != 'decided'`,\n []\n );\n const openCount = Number(\n (openResult.rows[0] as Record<string, unknown>)?.count ?? 0\n );\n if (openCount > 0) throw new Error('NOT_READY');\n\n // Ensure for each approved review, all proposed rule versions are approved in KB.\n const decidedResult = await db.query(`SELECT * FROM psa_review_task`, []);\n for (const row of decidedResult.rows as ReviewTaskRow[]) {\n if (row.decision !== 'approve') continue;\n const candQueryResult = await db.query(\n `SELECT * FROM psa_change_candidate WHERE id = $1 LIMIT 1`,\n [row.changeCandidateId]\n );\n const cand = candQueryResult.rows[0] as ChangeCandidateRow | undefined;\n if (!cand) continue;\n if (cand.jurisdiction !== input.jurisdiction) continue;\n const proposedIds = parseJsonArray(cand.proposedRuleVersionIdsJson);\n for (const rvId of proposedIds) {\n const rvQueryResult = await db.query(\n `SELECT status FROM psa_rule_version WHERE id = $1 LIMIT 1`,\n [rvId]\n );\n const status = String(\n (rvQueryResult.rows[0] as Record<string, unknown> | undefined)\n ?.status ?? ''\n );\n if (status !== 'approved') throw new Error('NOT_READY');\n }\n }\n return { published: true as const };\n }\n\n return {\n // Onboarding\n getUserContext,\n setUserContext,\n\n // KB\n createRule,\n upsertRuleVersion,\n approveRuleVersion,\n publishSnapshot,\n searchKb,\n\n // Assistant\n answer,\n\n // Pipeline\n createChangeCandidate,\n createReviewTask,\n submitDecision,\n publishIfReady,\n };\n}\n\nexport type PolicySafeKnowledgeAssistantHandlers = ReturnType<\n typeof createPolicySafeKnowledgeAssistantHandlers\n>;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAnswer.js","names":[],"sources":["../../src/orchestrator/buildAnswer.ts"],"sourcesContent":["import {\n enforceAllowedScope,\n enforceCitations,\n validateEnvelope,\n} from '@contractspec/example.locale-jurisdiction-gate/policy/guard';\n\ntype AllowedScope = 'education_only' | 'generic_info' | 'escalation_required';\n\nexport interface AssistantAnswerIR {\n locale: string;\n jurisdiction: string;\n allowedScope: AllowedScope;\n sections: { heading: string; body: string }[];\n citations: {\n kbSnapshotId: string;\n sourceType: string;\n sourceId: string;\n title?: string;\n excerpt?: string;\n }[];\n disclaimers?: string[];\n riskFlags?: string[];\n refused?: boolean;\n refusalReason?: string;\n}\n\nexport interface BuildAnswerInput {\n envelope: {\n traceId: string;\n locale: string;\n kbSnapshotId: string;\n allowedScope: AllowedScope;\n regulatoryContext: { jurisdiction: string };\n };\n question: string;\n kbSearch: (input: {\n snapshotId: string;\n jurisdiction: string;\n query: string;\n }) => Promise<{ items: { ruleVersionId: string; excerpt?: string }[] }>;\n}\n\n/**\n * Build a policy-safe assistant answer derived from KB search results.\n *\n * Deterministic: no LLM calls; if search yields no results, it refuses.\n */\nexport async function buildPolicySafeAnswer(\n input: BuildAnswerInput\n): Promise<AssistantAnswerIR> {\n const env = validateEnvelope(input.envelope);\n if (!env.ok) {\n return {\n locale: input.envelope.locale ?? 'en-GB',\n jurisdiction: input.envelope.regulatoryContext?.jurisdiction ?? 'UNKNOWN',\n allowedScope: input.envelope.allowedScope ?? 'education_only',\n sections: [{ heading: 'Request blocked', body: env.error.message }],\n citations: [],\n disclaimers: ['This system refuses to answer without a valid envelope.'],\n riskFlags: [env.error.code],\n refused: true,\n refusalReason: env.error.code,\n };\n }\n\n const results = await input.kbSearch({\n snapshotId: env.value.kbSnapshotId,\n jurisdiction: env.value.regulatoryContext?.jurisdiction ?? 'UNKNOWN',\n query: input.question,\n });\n\n const citations = results.items.map((item) => ({\n kbSnapshotId: env.value.kbSnapshotId,\n sourceType: 'ruleVersion',\n sourceId: item.ruleVersionId,\n title: 'Curated rule version',\n excerpt: item.excerpt,\n }));\n\n const draft: AssistantAnswerIR = {\n locale: env.value.locale,\n jurisdiction: env.value.regulatoryContext?.jurisdiction ?? 'UNKNOWN',\n allowedScope: env.value.allowedScope,\n sections: [\n {\n heading: 'Answer (KB-derived)',\n body:\n results.items.length > 0\n ? `This answer is derived from ${results.items.length} curated rule version(s) in the referenced snapshot.`\n : 'No curated knowledge found in the referenced snapshot.',\n },\n ],\n citations,\n disclaimers: ['Educational demo only.'],\n riskFlags: [],\n };\n\n const scope = enforceAllowedScope(env.value.allowedScope, draft);\n if (!scope.ok) {\n return {\n ...draft,\n sections: [{ heading: 'Escalation required', body: scope.error.message }],\n refused: true,\n refusalReason: scope.error.code,\n riskFlags: [...(draft.riskFlags ?? []), scope.error.code],\n };\n }\n\n const cited = enforceCitations(draft);\n if (!cited.ok) {\n return {\n ...draft,\n sections: [{ heading: 'Request blocked', body: cited.error.message }],\n citations: [],\n refused: true,\n refusalReason: cited.error.code,\n riskFlags: [...(draft.riskFlags ?? []), cited.error.code],\n };\n }\n\n return draft;\n}\n"],"mappings":";;;;;;;;AA+CA,eAAsB,sBACpB,OAC4B;CAC5B,MAAM,MAAM,iBAAiB,MAAM,SAAS;AAC5C,KAAI,CAAC,IAAI,GACP,QAAO;EACL,QAAQ,MAAM,SAAS,UAAU;EACjC,cAAc,MAAM,SAAS,mBAAmB,gBAAgB;EAChE,cAAc,MAAM,SAAS,gBAAgB;EAC7C,UAAU,CAAC;GAAE,SAAS;GAAmB,MAAM,IAAI,MAAM;GAAS,CAAC;EACnE,WAAW,EAAE;EACb,aAAa,CAAC,0DAA0D;EACxE,WAAW,CAAC,IAAI,MAAM,KAAK;EAC3B,SAAS;EACT,eAAe,IAAI,MAAM;EAC1B;CAGH,MAAM,UAAU,MAAM,MAAM,SAAS;EACnC,YAAY,IAAI,MAAM;EACtB,cAAc,IAAI,MAAM,mBAAmB,gBAAgB;EAC3D,OAAO,MAAM;EACd,CAAC;CAEF,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;EAC7C,cAAc,IAAI,MAAM;EACxB,YAAY;EACZ,UAAU,KAAK;EACf,OAAO;EACP,SAAS,KAAK;EACf,EAAE;CAEH,MAAM,QAA2B;EAC/B,QAAQ,IAAI,MAAM;EAClB,cAAc,IAAI,MAAM,mBAAmB,gBAAgB;EAC3D,cAAc,IAAI,MAAM;EACxB,UAAU,CACR;GACE,SAAS;GACT,MACE,QAAQ,MAAM,SAAS,IACnB,+BAA+B,QAAQ,MAAM,OAAO,wDACpD;GACP,CACF;EACD;EACA,aAAa,CAAC,yBAAyB;EACvC,WAAW,EAAE;EACd;CAED,MAAM,QAAQ,oBAAoB,IAAI,MAAM,cAAc,MAAM;AAChE,KAAI,CAAC,MAAM,GACT,QAAO;EACL,GAAG;EACH,UAAU,CAAC;GAAE,SAAS;GAAuB,MAAM,MAAM,MAAM;GAAS,CAAC;EACzE,SAAS;EACT,eAAe,MAAM,MAAM;EAC3B,WAAW,CAAC,GAAI,MAAM,aAAa,EAAE,EAAG,MAAM,MAAM,KAAK;EAC1D;CAGH,MAAM,QAAQ,iBAAiB,MAAM;AACrC,KAAI,CAAC,MAAM,GACT,QAAO;EACL,GAAG;EACH,UAAU,CAAC;GAAE,SAAS;GAAmB,MAAM,MAAM,MAAM;GAAS,CAAC;EACrE,WAAW,EAAE;EACb,SAAS;EACT,eAAe,MAAM,MAAM;EAC3B,WAAW,CAAC,GAAI,MAAM,aAAa,EAAE,EAAG,MAAM,MAAM,KAAK;EAC1D;AAGH,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy-safe-knowledge-assistant.feature.js","names":[],"sources":["../src/policy-safe-knowledge-assistant.feature.ts"],"sourcesContent":["import { defineFeature } from '@contractspec/lib.contracts';\n\nexport const PolicySafeKnowledgeAssistantFeature = defineFeature({\n meta: {\n key: 'policy-safe-knowledge-assistant',\n version: '1.0.0',\n title: 'Policy-safe Knowledge Assistant',\n description:\n 'All-in-one example composing locale/jurisdiction gate + versioned KB + HITL pipeline + learning hub.',\n domain: 'knowledge',\n owners: ['@examples'],\n tags: ['assistant', 'knowledge', 'policy', 'hitl', 'learning'],\n stability: 'experimental',\n },\n operations: [\n // Gate\n { key: 'assistant.answer', version: '1.0.0' },\n { key: 'assistant.explainConcept', version: '1.0.0' },\n // KB\n { key: 'kb.ingestSource', version: '1.0.0' },\n { key: 'kb.upsertRuleVersion', version: '1.0.0' },\n { key: 'kb.approveRuleVersion', version: '1.0.0' },\n { key: 'kb.publishSnapshot', version: '1.0.0' },\n { key: 'kb.search', version: '1.0.0' },\n // Pipeline\n { key: 'kbPipeline.runWatch', version: '1.0.0' },\n { key: 'kbPipeline.createReviewTask', version: '1.0.0' },\n { key: 'kbPipeline.submitDecision', version: '1.0.0' },\n { key: 'kbPipeline.publishIfReady', version: '1.0.0' },\n ],\n events: [\n { key: 'assistant.answer.requested', version: '1.0.0' },\n { key: 'assistant.answer.blocked', version: '1.0.0' },\n { key: 'assistant.answer.delivered', version: '1.0.0' },\n { key: 'kb.source.ingested', version: '1.0.0' },\n { key: 'kb.ruleVersion.created', version: '1.0.0' },\n { key: 'kb.ruleVersion.approved', version: '1.0.0' },\n { key: 'kb.snapshot.published', version: '1.0.0' },\n { key: 'kb.change.detected', version: '1.0.0' },\n { key: 'kb.review.requested', version: '1.0.0' },\n { key: 'kb.review.decided', version: '1.0.0' },\n ],\n presentations: [],\n opToPresentation: [],\n presentationsTargets: [],\n capabilities: {\n requires: [\n { key: 'identity', version: '1.0.0' },\n { key: 'audit-trail', version: '1.0.0' },\n { key: 'notifications', version: '1.0.0' },\n { key: 'jobs', version: '1.0.0' },\n { key: 'feature-flags', version: '1.0.0' },\n { key: 'files', version: '1.0.0' },\n { key: 'metering', version: '1.0.0' },\n { key: 'learning-journey', version: '1.0.0' },\n ],\n },\n});\n"],"mappings":";;;AAEA,MAAa,sCAAsC,cAAc;CAC/D,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ;EACR,QAAQ,CAAC,YAAY;EACrB,MAAM;GAAC;GAAa;GAAa;GAAU;GAAQ;GAAW;EAC9D,WAAW;EACZ;CACD,YAAY;EAEV;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAA4B,SAAS;GAAS;EAErD;GAAE,KAAK;GAAmB,SAAS;GAAS;EAC5C;GAAE,KAAK;GAAwB,SAAS;GAAS;EACjD;GAAE,KAAK;GAAyB,SAAS;GAAS;EAClD;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAa,SAAS;GAAS;EAEtC;GAAE,KAAK;GAAuB,SAAS;GAAS;EAChD;GAAE,KAAK;GAA+B,SAAS;GAAS;EACxD;GAAE,KAAK;GAA6B,SAAS;GAAS;EACtD;GAAE,KAAK;GAA6B,SAAS;GAAS;EACvD;CACD,QAAQ;EACN;GAAE,KAAK;GAA8B,SAAS;GAAS;EACvD;GAAE,KAAK;GAA4B,SAAS;GAAS;EACrD;GAAE,KAAK;GAA8B,SAAS;GAAS;EACvD;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAA0B,SAAS;GAAS;EACnD;GAAE,KAAK;GAA2B,SAAS;GAAS;EACpD;GAAE,KAAK;GAAyB,SAAS;GAAS;EAClD;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAuB,SAAS;GAAS;EAChD;GAAE,KAAK;GAAqB,SAAS;GAAS;EAC/C;CACD,eAAe,EAAE;CACjB,kBAAkB,EAAE;CACpB,sBAAsB,EAAE;CACxB,cAAc,EACZ,UAAU;EACR;GAAE,KAAK;GAAY,SAAS;GAAS;EACrC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAiB,SAAS;GAAS;EAC1C;GAAE,KAAK;GAAQ,SAAS;GAAS;EACjC;GAAE,KAAK;GAAiB,SAAS;GAAS;EAC1C;GAAE,KAAK;GAAS,SAAS;GAAS;EAClC;GAAE,KAAK;GAAY,SAAS;GAAS;EACrC;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC9C,EACF;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.js","names":[],"sources":["../../src/seed/fixtures.ts"],"sourcesContent":["export const DEMO_FIXTURES = {\n jurisdictions: ['EU', 'FR'] as const,\n locales: ['en-GB', 'fr-FR'] as const,\n demoOrgId: 'org_demo',\n demoUserId: 'user_demo',\n sources: {\n EU_SOURCE_1: {\n jurisdiction: 'EU',\n authority: 'DemoAuthority',\n title: 'EU Demo Source v1',\n fetchedAt: new Date('2026-01-01T00:00:00.000Z'),\n hash: 'hash_eu_v1',\n fileId: 'file_eu_v1',\n },\n EU_SOURCE_2: {\n jurisdiction: 'EU',\n authority: 'DemoAuthority',\n title: 'EU Demo Source v2',\n fetchedAt: new Date('2026-02-01T00:00:00.000Z'),\n hash: 'hash_eu_v2',\n fileId: 'file_eu_v2',\n },\n },\n rules: {\n EU_RULE_TAX: {\n id: 'rule_eu_tax',\n jurisdiction: 'EU',\n topicKey: 'tax_reporting',\n },\n },\n} as const;\n"],"mappings":";AAAA,MAAa,gBAAgB;CAC3B,eAAe,CAAC,MAAM,KAAK;CAC3B,SAAS,CAAC,SAAS,QAAQ;CAC3B,WAAW;CACX,YAAY;CACZ,SAAS;EACP,aAAa;GACX,cAAc;GACd,WAAW;GACX,OAAO;GACP,2BAAW,IAAI,KAAK,2BAA2B;GAC/C,MAAM;GACN,QAAQ;GACT;EACD,aAAa;GACX,cAAc;GACd,WAAW;GACX,OAAO;GACP,2BAAW,IAAI,KAAK,2BAA2B;GAC/C,MAAM;GACN,QAAQ;GACT;EACF;CACD,OAAO,EACL,aAAa;EACX,IAAI;EACJ,cAAc;EACd,UAAU;EACX,EACF;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/seeders/index.ts"],"sourcesContent":["import type { DatabasePort } from '@contractspec/lib.runtime-sandbox';\n\nexport async function seedPolicyKnowledgeAssistant(params: {\n projectId: string;\n db: DatabasePort;\n}) {\n const { projectId, db } = params;\n\n const existing = await db.query(\n `SELECT COUNT(*) as count FROM psa_user_context WHERE \"projectId\" = $1`,\n [projectId]\n );\n if ((existing.rows[0]?.count as number) > 0) return;\n\n await db.execute(\n `INSERT INTO psa_user_context (\"projectId\", locale, jurisdiction, \"allowedScope\")\n VALUES ($1, $2, $3, $4)`,\n [projectId, 'en-GB', 'EU', 'education_only']\n );\n}\n"],"mappings":";AAEA,eAAsB,6BAA6B,QAGhD;CACD,MAAM,EAAE,WAAW,OAAO;AAM1B,MAJiB,MAAM,GAAG,MACxB,yEACA,CAAC,UAAU,CACZ,EACa,KAAK,IAAI,QAAmB,EAAG;AAE7C,OAAM,GAAG,QACP;+BAEA;EAAC;EAAW;EAAS;EAAM;EAAiB,CAC7C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PolicySafeKnowledgeAssistantDashboard.js","names":[],"sources":["../../src/ui/PolicySafeKnowledgeAssistantDashboard.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\nimport {\n Button,\n ErrorState,\n LoaderBlock,\n StatCard,\n StatCardGroup,\n} from '@contractspec/lib.design-system';\nimport { Card } from '@contractspec/lib.ui-kit-web/ui/card';\nimport { Input } from '@contractspec/lib.ui-kit-web/ui/input';\nimport { Textarea } from '@contractspec/lib.ui-kit-web/ui/textarea';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@contractspec/lib.ui-kit-web/ui/select';\n\nimport { usePolicySafeKnowledgeAssistant } from './hooks/usePolicySafeKnowledgeAssistant';\n\ntype AllowedScope = 'education_only' | 'generic_info' | 'escalation_required';\n\nexport function PolicySafeKnowledgeAssistantDashboard() {\n const { state, actions } = usePolicySafeKnowledgeAssistant();\n const [question, setQuestion] = useState('reporting obligations');\n const [content, setContent] = useState(\n 'EU: Reporting obligations v2 (updated)'\n );\n const [locale, setLocale] = useState('en-GB');\n const [jurisdiction, setJurisdiction] = useState('EU');\n const [allowedScope, setAllowedScope] =\n useState<AllowedScope>('education_only');\n\n const snapshotId =\n state.context?.kbSnapshotId ?? state.lastSnapshotId ?? null;\n\n const stats = useMemo(() => {\n return [\n { label: 'Locale', value: state.context?.locale ?? '—' },\n { label: 'Jurisdiction', value: state.context?.jurisdiction ?? '—' },\n { label: 'Scope', value: state.context?.allowedScope ?? '—' },\n { label: 'KB Snapshot', value: snapshotId ?? '—' },\n ];\n }, [\n snapshotId,\n state.context?.allowedScope,\n state.context?.jurisdiction,\n state.context?.locale,\n ]);\n\n const handleSetContext = useCallback(async () => {\n await actions.setContext({ locale, jurisdiction, allowedScope });\n }, [actions, allowedScope, jurisdiction, locale]);\n\n const handleAsk = useCallback(async () => {\n await actions.askAssistant(question);\n }, [actions, question]);\n\n const handleAdminPublishFlow = useCallback(async () => {\n const ruleId = state.lastRuleId ?? (await actions.createDemoRule());\n const rvId = await actions.upsertRuleVersion({ ruleId, content });\n await actions.approveRuleVersion(rvId);\n await actions.simulateHighRiskChangeAndApprove(rvId);\n await actions.publishSnapshot();\n }, [actions, content, state.lastRuleId]);\n\n if (state.loading && !state.context) {\n return <LoaderBlock label=\"Loading demo...\" />;\n }\n\n if (state.error) {\n return (\n <ErrorState\n title=\"Failed to load demo\"\n description={state.error.message}\n onRetry={actions.refreshContext}\n retryLabel=\"Retry\"\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <StatCardGroup>\n {stats.map((s) => (\n <StatCard key={s.label} label={s.label} value={String(s.value)} />\n ))}\n </StatCardGroup>\n\n <Card className=\"p-4\">\n <h3 className=\"text-lg font-semibold\">\n 1) Onboarding (explicit locale + jurisdiction)\n </h3>\n <div className=\"mt-3 grid gap-3 md:grid-cols-3\">\n <div>\n <div className=\"text-muted-foreground mb-1 text-xs font-semibold tracking-wide uppercase\">\n Locale\n </div>\n <Input value={locale} onChange={(e) => setLocale(e.target.value)} />\n </div>\n <div>\n <div className=\"text-muted-foreground mb-1 text-xs font-semibold tracking-wide uppercase\">\n Jurisdiction\n </div>\n <Input\n value={jurisdiction}\n onChange={(e) => setJurisdiction(e.target.value)}\n />\n </div>\n <div>\n <div className=\"text-muted-foreground mb-1 text-xs font-semibold tracking-wide uppercase\">\n Allowed scope\n </div>\n <Select\n value={allowedScope}\n onValueChange={(v) => setAllowedScope(v as AllowedScope)}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select scope\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"education_only\">education_only</SelectItem>\n <SelectItem value=\"generic_info\">generic_info</SelectItem>\n <SelectItem value=\"escalation_required\">\n escalation_required\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"mt-4 flex gap-2\">\n <Button onPress={handleSetContext}>Save context</Button>\n <Button variant=\"outline\" onPress={actions.refreshContext}>\n Refresh\n </Button>\n </div>\n </Card>\n\n <Card className=\"p-4\">\n <h3 className=\"text-lg font-semibold\">\n 2) Ask the assistant (must cite KB snapshot)\n </h3>\n <div className=\"mt-3 flex flex-col gap-3\">\n <Input\n value={question}\n onChange={(e) => setQuestion(e.target.value)}\n />\n <div className=\"flex gap-2\">\n <Button onPress={handleAsk}>Ask</Button>\n </div>\n </div>\n\n {state.lastAnswer ? (\n <div className=\"mt-4 space-y-3\">\n {state.lastAnswer.refused ? (\n <div className=\"text-sm text-red-600\">\n Refused: {state.lastAnswer.refusalReason ?? 'UNKNOWN'}\n </div>\n ) : null}\n {state.lastAnswer.sections.map((s, idx) => (\n <div key={`${s.heading}-${idx}`}>\n <div className=\"text-sm font-semibold\">{s.heading}</div>\n <div className=\"text-muted-foreground text-sm\">{s.body}</div>\n </div>\n ))}\n <div className=\"text-sm font-semibold\">Citations</div>\n <ul className=\"text-muted-foreground list-disc pl-5 text-sm\">\n {state.lastAnswer.citations.map((c) => (\n <li key={`${c.kbSnapshotId}-${c.sourceId}`}>\n {c.kbSnapshotId} — {c.sourceId}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </Card>\n\n <Card className=\"p-4\">\n <h3 className=\"text-lg font-semibold\">\n 3) Admin: publish a new snapshot (HITL)\n </h3>\n <div className=\"mt-3 space-y-3\">\n <Textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n />\n <Button onPress={handleAdminPublishFlow}>\n Simulate change → review → approve → publish snapshot\n </Button>\n </div>\n </Card>\n\n <Card className=\"p-4\">\n <h3 className=\"text-lg font-semibold\">4) Learning hub (patterns)</h3>\n <p className=\"text-muted-foreground mt-2 text-sm\">\n This template includes drills, ambient coach, and quests as reusable\n Learning Journey tracks. The interactive learning UI is demonstrated\n in dedicated Learning Journey examples.\n </p>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"usePolicySafeKnowledgeAssistant.js","names":[],"sources":["../../../src/ui/hooks/usePolicySafeKnowledgeAssistant.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTemplateRuntime } from '@contractspec/lib.example-shared-ui';\n\ntype AllowedScope = 'education_only' | 'generic_info' | 'escalation_required';\ntype RiskLevel = 'low' | 'medium' | 'high';\n\nexport interface UsePolicySafeKnowledgeAssistantState {\n context: {\n locale: string;\n jurisdiction: string;\n allowedScope: AllowedScope;\n kbSnapshotId: string | null;\n } | null;\n loading: boolean;\n error: Error | null;\n lastAnswer: {\n refused?: boolean;\n refusalReason?: string;\n sections: { heading: string; body: string }[];\n citations: {\n kbSnapshotId: string;\n sourceId: string;\n excerpt?: string;\n }[];\n } | null;\n lastRuleId: string | null;\n lastRuleVersionId: string | null;\n lastSnapshotId: string | null;\n lastReviewTaskId: string | null;\n}\n\ninterface CitationLike {\n kbSnapshotId: string;\n sourceId: string;\n excerpt?: string;\n}\ninterface AnswerLike {\n refused?: boolean;\n refusalReason?: string;\n sections: { heading: string; body: string }[];\n citations: CitationLike[];\n}\n\nfunction isCitationLike(value: unknown): value is CitationLike {\n if (!value || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return typeof v.kbSnapshotId === 'string' && typeof v.sourceId === 'string';\n}\n\nfunction toCitations(value: unknown): CitationLike[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCitationLike).map((c) => ({\n kbSnapshotId: c.kbSnapshotId,\n sourceId: c.sourceId,\n excerpt: c.excerpt,\n }));\n}\n\nimport type { PolicySafeKnowledgeAssistantHandlers } from '../../handlers/policy-safe-knowledge-assistant.handlers';\n\nexport function usePolicySafeKnowledgeAssistant() {\n const { handlers, projectId } = useTemplateRuntime<{\n policySafeKnowledgeAssistant: PolicySafeKnowledgeAssistantHandlers;\n }>();\n const api = handlers.policySafeKnowledgeAssistant;\n\n const [state, setState] = useState<UsePolicySafeKnowledgeAssistantState>({\n context: null,\n loading: true,\n error: null,\n lastAnswer: null,\n lastRuleId: null,\n lastRuleVersionId: null,\n lastSnapshotId: null,\n lastReviewTaskId: null,\n });\n\n const refreshContext = useCallback(async () => {\n try {\n setState((s) => ({ ...s, loading: true, error: null }));\n const ctx = await api.getUserContext({ projectId });\n setState((s) => ({\n ...s,\n context: {\n locale: ctx.locale,\n jurisdiction: ctx.jurisdiction,\n allowedScope: ctx.allowedScope,\n kbSnapshotId: ctx.kbSnapshotId,\n },\n loading: false,\n }));\n } catch (e) {\n setState((s) => ({\n ...s,\n loading: false,\n error: e instanceof Error ? e : new Error('Unknown error'),\n }));\n }\n }, [api, projectId]);\n\n useEffect(() => {\n refreshContext();\n }, [refreshContext]);\n\n const setContext = useCallback(\n async (input: {\n locale: string;\n jurisdiction: string;\n allowedScope: AllowedScope;\n }) => {\n const ctx = await api.setUserContext({ projectId, ...input });\n setState((s) => ({\n ...s,\n context: {\n locale: ctx.locale,\n jurisdiction: ctx.jurisdiction,\n allowedScope: ctx.allowedScope,\n kbSnapshotId: ctx.kbSnapshotId,\n },\n }));\n },\n [api, projectId]\n );\n\n const askAssistant = useCallback(\n async (question: string) => {\n const answerUnknown: unknown = await api.answer({ projectId, question });\n const answer = answerUnknown as AnswerLike;\n setState((s) => ({\n ...s,\n lastAnswer: {\n refused: answer.refused,\n refusalReason: answer.refusalReason,\n sections: answer.sections,\n citations: toCitations(\n (answerUnknown as { citations?: unknown }).citations\n ),\n },\n }));\n },\n [api, projectId]\n );\n\n const createDemoRule = useCallback(async () => {\n const rule = await api.createRule({\n projectId,\n jurisdiction: state.context?.jurisdiction ?? 'EU',\n topicKey: 'tax_reporting',\n });\n setState((s) => ({ ...s, lastRuleId: rule.id }));\n return rule.id as string;\n }, [api, projectId, state.context?.jurisdiction]);\n\n const upsertRuleVersion = useCallback(\n async (input: { ruleId: string; content: string }) => {\n const rv = await api.upsertRuleVersion({\n projectId,\n ruleId: input.ruleId,\n content: input.content,\n sourceRefs: [{ sourceDocumentId: 'src_demo', excerpt: 'demo excerpt' }],\n });\n setState((s) => ({ ...s, lastRuleVersionId: rv.id }));\n return rv.id as string;\n },\n [api, projectId]\n );\n\n const approveRuleVersion = useCallback(\n async (ruleVersionId: string) => {\n await api.approveRuleVersion({ ruleVersionId, approver: 'demo_expert' });\n },\n [api]\n );\n\n const publishSnapshot = useCallback(async () => {\n const snap = await api.publishSnapshot({\n projectId,\n jurisdiction: state.context?.jurisdiction ?? 'EU',\n asOfDate: new Date('2026-02-01T00:00:00.000Z'),\n });\n setState((s) => ({ ...s, lastSnapshotId: snap.id }));\n await refreshContext();\n return snap.id as string;\n }, [api, projectId, refreshContext, state.context?.jurisdiction]);\n\n const simulateHighRiskChangeAndApprove = useCallback(\n async (ruleVersionId: string) => {\n const cand = await api.createChangeCandidate({\n projectId,\n jurisdiction: state.context?.jurisdiction ?? 'EU',\n diffSummary: 'Simulated change (demo)',\n riskLevel: 'high' satisfies RiskLevel,\n proposedRuleVersionIds: [ruleVersionId],\n });\n const review = await api.createReviewTask({ changeCandidateId: cand.id });\n setState((s) => ({ ...s, lastReviewTaskId: review.id }));\n await api.submitDecision({\n reviewTaskId: review.id,\n decision: 'approve',\n decidedByRole: 'expert',\n decidedBy: 'demo_expert',\n });\n await api.publishIfReady({\n jurisdiction: state.context?.jurisdiction ?? 'EU',\n });\n return review.id as string;\n },\n [api, projectId, state.context?.jurisdiction]\n );\n\n const derived = useMemo(() => ({ projectId }), [projectId]);\n\n return {\n state,\n derived,\n actions: {\n refreshContext,\n setContext,\n askAssistant,\n createDemoRule,\n upsertRuleVersion,\n approveRuleVersion,\n publishSnapshot,\n simulateHighRiskChangeAndApprove,\n },\n };\n}\n"],"mappings":"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"}