@contractspec/example.kb-update-pipeline 1.57.0 → 1.59.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 +58 -60
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +25 -0
  4. package/dist/browser/docs/index.js +43 -0
  5. package/dist/browser/docs/kb-update-pipeline.docblock.js +43 -0
  6. package/dist/browser/entities/index.js +56 -0
  7. package/dist/browser/entities/models.js +56 -0
  8. package/dist/browser/events.js +132 -0
  9. package/dist/browser/example.js +35 -0
  10. package/dist/browser/handlers/index.js +109 -0
  11. package/dist/browser/handlers/memory.handlers.js +109 -0
  12. package/dist/browser/index.js +646 -0
  13. package/dist/browser/kb-update-pipeline.feature.js +61 -0
  14. package/dist/browser/operations/index.js +199 -0
  15. package/dist/browser/operations/pipeline.js +199 -0
  16. package/dist/browser/presentations.js +120 -0
  17. package/dist/browser/tests/operations.test-spec.js +85 -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 +44 -1
  21. package/dist/docs/kb-update-pipeline.docblock.d.ts +2 -1
  22. package/dist/docs/kb-update-pipeline.docblock.d.ts.map +1 -0
  23. package/dist/docs/kb-update-pipeline.docblock.js +41 -28
  24. package/dist/entities/index.d.ts +2 -2
  25. package/dist/entities/index.d.ts.map +1 -0
  26. package/dist/entities/index.js +57 -3
  27. package/dist/entities/models.d.ts +53 -58
  28. package/dist/entities/models.d.ts.map +1 -1
  29. package/dist/entities/models.js +54 -71
  30. package/dist/events.d.ts +62 -68
  31. package/dist/events.d.ts.map +1 -1
  32. package/dist/events.js +122 -139
  33. package/dist/example.d.ts +2 -6
  34. package/dist/example.d.ts.map +1 -1
  35. package/dist/example.js +34 -47
  36. package/dist/handlers/index.d.ts +2 -2
  37. package/dist/handlers/index.d.ts.map +1 -0
  38. package/dist/handlers/index.js +110 -3
  39. package/dist/handlers/memory.handlers.d.ts +58 -60
  40. package/dist/handlers/memory.handlers.d.ts.map +1 -1
  41. package/dist/handlers/memory.handlers.js +104 -87
  42. package/dist/handlers/memory.handlers.test.d.ts +2 -0
  43. package/dist/handlers/memory.handlers.test.d.ts.map +1 -0
  44. package/dist/index.d.ts +14 -10
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +647 -12
  47. package/dist/kb-update-pipeline.feature.d.ts +1 -6
  48. package/dist/kb-update-pipeline.feature.d.ts.map +1 -1
  49. package/dist/kb-update-pipeline.feature.js +60 -140
  50. package/dist/node/docs/index.js +43 -0
  51. package/dist/node/docs/kb-update-pipeline.docblock.js +43 -0
  52. package/dist/node/entities/index.js +56 -0
  53. package/dist/node/entities/models.js +56 -0
  54. package/dist/node/events.js +132 -0
  55. package/dist/node/example.js +35 -0
  56. package/dist/node/handlers/index.js +109 -0
  57. package/dist/node/handlers/memory.handlers.js +109 -0
  58. package/dist/node/index.js +646 -0
  59. package/dist/node/kb-update-pipeline.feature.js +61 -0
  60. package/dist/node/operations/index.js +199 -0
  61. package/dist/node/operations/pipeline.js +199 -0
  62. package/dist/node/presentations.js +120 -0
  63. package/dist/node/tests/operations.test-spec.js +85 -0
  64. package/dist/operations/index.d.ts +2 -2
  65. package/dist/operations/index.d.ts.map +1 -0
  66. package/dist/operations/index.js +199 -2
  67. package/dist/operations/pipeline.d.ts +126 -132
  68. package/dist/operations/pipeline.d.ts.map +1 -1
  69. package/dist/operations/pipeline.js +189 -172
  70. package/dist/presentations.d.ts +3 -8
  71. package/dist/presentations.d.ts.map +1 -1
  72. package/dist/presentations.js +117 -67
  73. package/dist/tests/operations.test-spec.d.ts +3 -8
  74. package/dist/tests/operations.test-spec.d.ts.map +1 -1
  75. package/dist/tests/operations.test-spec.js +82 -90
  76. package/package.json +157 -41
  77. package/tsdown.config.js +1 -2
  78. package/.turbo/turbo-build$colon$bundle.log +0 -60
  79. package/dist/docs/kb-update-pipeline.docblock.js.map +0 -1
  80. package/dist/entities/models.js.map +0 -1
  81. package/dist/events.js.map +0 -1
  82. package/dist/example.js.map +0 -1
  83. package/dist/handlers/memory.handlers.js.map +0 -1
  84. package/dist/kb-update-pipeline.feature.js.map +0 -1
  85. package/dist/operations/pipeline.js.map +0 -1
  86. package/dist/presentations.js.map +0 -1
  87. package/dist/tests/operations.test-spec.js.map +0 -1
  88. package/tsconfig.tsbuildinfo +0 -1
@@ -1,61 +1,59 @@
1
- $ bun build:types && bun build:bundle
2
- $ tsc --noEmit
3
- $ tsdown
4
- ℹ tsdown v0.20.3 powered by rolldown v1.0.0-rc.3
5
- ℹ config file: /home/runner/work/contractspec/contractspec/packages/examples/kb-update-pipeline/tsdown.config.js
6
- ℹ entry: src/events.ts, src/example.ts, src/index.ts, src/kb-update-pipeline.feature.ts, src/presentations.ts, src/docs/index.ts, src/docs/kb-update-pipeline.docblock.ts, src/entities/index.ts, src/entities/models.ts, src/handlers/index.ts, src/handlers/memory.handlers.ts, src/operations/index.ts, src/operations/pipeline.ts, src/tests/operations.test-spec.ts
7
- ℹ target: esnext
8
- ℹ tsconfig: tsconfig.json
9
- ℹ Build start
10
- ℹ dist/operations/pipeline.js 4.95 kB │ gzip: 1.37 kB
11
- ℹ dist/events.js 3.69 kB │ gzip: 0.73 kB
12
- ℹ dist/handlers/memory.handlers.js 3.37 kB │ gzip: 1.12 kB
13
- ℹ dist/kb-update-pipeline.feature.js 2.35 kB │ gzip: 0.68 kB
14
- ℹ dist/tests/operations.test-spec.js 2.13 kB │ gzip: 0.50 kB
15
- ℹ dist/presentations.js 1.90 kB │ gzip: 0.63 kB
16
- ℹ dist/entities/models.js 1.81 kB │ gzip: 0.53 kB
17
- ℹ dist/docs/kb-update-pipeline.docblock.js 1.49 kB │ gzip: 0.71 kB
18
- ℹ dist/index.js 1.41 kB │ gzip: 0.41 kB
19
- ℹ dist/example.js 1.01 kB │ gzip: 0.54 kB
20
- ℹ dist/operations/index.js 0.31 kB │ gzip: 0.14 kB
21
- ℹ dist/entities/index.js 0.25 kB │ gzip: 0.13 kB
22
- ℹ dist/handlers/index.js 0.16 kB │ gzip: 0.10 kB
23
- ℹ dist/docs/index.js 0.04 kB │ gzip: 0.06 kB
24
- ℹ dist/handlers/memory.handlers.js.map 8.13 kB │ gzip: 2.34 kB
25
- ℹ dist/operations/pipeline.js.map 7.20 kB │ gzip: 1.81 kB
26
- ℹ dist/events.js.map 5.65 kB │ gzip: 1.04 kB
27
- ℹ dist/tests/operations.test-spec.js.map 3.64 kB │ gzip: 0.76 kB
28
- ℹ dist/kb-update-pipeline.feature.js.map 3.48 kB │ gzip: 1.02 kB
29
- ℹ dist/presentations.js.map 2.87 kB │ gzip: 0.83 kB
30
- ℹ dist/entities/models.js.map 2.68 kB │ gzip: 0.81 kB
31
- ℹ dist/docs/kb-update-pipeline.docblock.js.map 2.00 kB │ gzip: 0.89 kB
32
- ℹ dist/example.js.map 1.50 kB │ gzip: 0.74 kB
33
- ℹ dist/handlers/memory.handlers.d.ts.map 1.03 kB │ gzip: 0.40 kB
34
- ℹ dist/operations/pipeline.d.ts.map 0.54 kB │ gzip: 0.22 kB
35
- ℹ dist/events.d.ts.map 0.47 kB │ gzip: 0.19 kB
36
- ℹ dist/entities/models.d.ts.map 0.33 kB │ gzip: 0.20 kB
37
- ℹ dist/tests/operations.test-spec.d.ts.map 0.25 kB │ gzip: 0.17 kB
38
- ℹ dist/presentations.d.ts.map 0.23 kB │ gzip: 0.15 kB
39
- ℹ dist/kb-update-pipeline.feature.d.ts.map 0.17 kB │ gzip: 0.14 kB
40
- ℹ dist/example.d.ts.map 0.13 kB │ gzip: 0.13 kB
41
- ℹ dist/operations/pipeline.d.ts 4.33 kB │ gzip: 0.58 kB
42
- ℹ dist/events.d.ts 2.52 kB │ gzip: 0.42 kB
43
- ℹ dist/entities/models.d.ts 1.98 kB │ gzip: 0.41 kB
44
- ℹ dist/handlers/memory.handlers.d.ts 1.94 kB │ gzip: 0.64 kB
45
- ℹ dist/index.d.ts 1.48 kB │ gzip: 0.41 kB
46
- ℹ dist/presentations.d.ts 0.52 kB │ gzip: 0.20 kB
47
- ℹ dist/tests/operations.test-spec.d.ts 0.47 kB │ gzip: 0.22 kB
48
- ℹ dist/kb-update-pipeline.feature.d.ts 0.32 kB │ gzip: 0.19 kB
49
- ℹ dist/operations/index.d.ts 0.31 kB │ gzip: 0.13 kB
50
- ℹ dist/handlers/index.d.ts 0.25 kB │ gzip: 0.10 kB
51
- ℹ dist/example.d.ts 0.25 kB │ gzip: 0.17 kB
52
- ℹ dist/entities/index.d.ts 0.25 kB │ gzip: 0.13 kB
53
- ℹ dist/docs/index.d.ts 0.01 kB │ gzip: 0.03 kB
54
- ℹ dist/docs/kb-update-pipeline.docblock.d.ts 0.01 kB │ gzip: 0.03 kB
55
- ℹ 45 files, total: 79.79 kB
56
- [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
57
- - tsdown:external (53%)
58
- - rolldown-plugin-dts:generate (34%)
59
- See https://rolldown.rs/options/checks#plugintimings for more details.
1
+ $ contractspec-bun-build prebuild
2
+ $ bun run prebuild && bun run build:bundle && bun run build:types
3
+ $ contractspec-bun-build prebuild
4
+ $ contractspec-bun-build transpile
5
+ [contractspec-bun-build] transpile target=bun root=src entries=14
6
+ Bundled 14 modules in 33ms
60
7
 
61
- ✔ Build complete in 26632ms
8
+ docs/index.js 1.49 KB (entry point)
9
+ ./index.js 20.53 KB (entry point)
10
+ ./kb-update-pipeline.feature.js 2.15 KB (entry point)
11
+ operations/index.js 6.57 KB (entry point)
12
+ operations/pipeline.js 6.57 KB (entry point)
13
+ ./presentations.js 3.48 KB (entry point)
14
+ tests/operations.test-spec.js 2.21 KB (entry point)
15
+ docs/kb-update-pipeline.docblock.js 1.49 KB (entry point)
16
+ entities/index.js 1.75 KB (entry point)
17
+ entities/models.js 1.75 KB (entry point)
18
+ ./events.js 3.75 KB (entry point)
19
+ ./example.js 1.00 KB (entry point)
20
+ handlers/index.js 3.62 KB (entry point)
21
+ handlers/memory.handlers.js 3.62 KB (entry point)
22
+
23
+ [contractspec-bun-build] transpile target=node root=src entries=14
24
+ Bundled 14 modules in 28ms
25
+
26
+ docs/index.js 1.47 KB (entry point)
27
+ ./index.js 20.52 KB (entry point)
28
+ ./kb-update-pipeline.feature.js 2.14 KB (entry point)
29
+ operations/index.js 6.56 KB (entry point)
30
+ operations/pipeline.js 6.56 KB (entry point)
31
+ ./presentations.js 3.47 KB (entry point)
32
+ tests/operations.test-spec.js 2.21 KB (entry point)
33
+ docs/kb-update-pipeline.docblock.js 1.47 KB (entry point)
34
+ entities/index.js 1.74 KB (entry point)
35
+ entities/models.js 1.74 KB (entry point)
36
+ ./events.js 3.74 KB (entry point)
37
+ ./example.js 0.99 KB (entry point)
38
+ handlers/index.js 3.61 KB (entry point)
39
+ handlers/memory.handlers.js 3.61 KB (entry point)
40
+
41
+ [contractspec-bun-build] transpile target=browser root=src entries=14
42
+ Bundled 14 modules in 28ms
43
+
44
+ docs/index.js 1.47 KB (entry point)
45
+ ./index.js 20.52 KB (entry point)
46
+ ./kb-update-pipeline.feature.js 2.14 KB (entry point)
47
+ operations/index.js 6.56 KB (entry point)
48
+ operations/pipeline.js 6.56 KB (entry point)
49
+ ./presentations.js 3.47 KB (entry point)
50
+ tests/operations.test-spec.js 2.21 KB (entry point)
51
+ docs/kb-update-pipeline.docblock.js 1.47 KB (entry point)
52
+ entities/index.js 1.74 KB (entry point)
53
+ entities/models.js 1.74 KB (entry point)
54
+ ./events.js 3.74 KB (entry point)
55
+ ./example.js 0.99 KB (entry point)
56
+ handlers/index.js 3.61 KB (entry point)
57
+ handlers/memory.handlers.js 3.61 KB (entry point)
58
+
59
+ $ contractspec-bun-build types
@@ -0,0 +1 @@
1
+ $ contractspec-bun-build prebuild
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @contractspec/example.kb-update-pipeline
2
2
 
3
+ ## 1.59.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1a0cf44: fix: publishConfig not supported by bun
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [1a0cf44]
12
+ - @contractspec/lib.contracts@1.59.0
13
+ - @contractspec/lib.schema@1.59.0
14
+
15
+ ## 1.58.0
16
+
17
+ ### Minor Changes
18
+
19
+ - d1f0fd0: chore: Migrate non-app package builds from tsdown to shared Bun tooling, add `@contractspec/tool.bun`, and standardize `prebuild`/`build`/`typecheck` with platform-aware exports and `tsc` declaration emission into `dist`.
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [d1f0fd0]
24
+ - Updated dependencies [4355a9e]
25
+ - @contractspec/lib.contracts@1.58.0
26
+ - @contractspec/lib.schema@1.58.0
27
+
3
28
  ## 1.57.0
4
29
 
5
30
  ### Minor Changes
@@ -0,0 +1,43 @@
1
+ // src/docs/kb-update-pipeline.docblock.ts
2
+ import { registerDocBlocks } from "@contractspec/lib.contracts/docs";
3
+ var docBlocks = [
4
+ {
5
+ id: "docs.examples.kb-update-pipeline.goal",
6
+ title: "KB Update Pipeline — Goal",
7
+ summary: "Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",
8
+ kind: "goal",
9
+ visibility: "public",
10
+ route: "/docs/examples/kb-update-pipeline/goal",
11
+ tags: ["knowledge", "pipeline", "hitl", "audit"],
12
+ body: `## Why it matters
13
+ - Keeps humans as the verifiers (HITL) while automation does the busywork.
14
+ - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
15
+
16
+ ## Guardrails
17
+ - High-risk changes require expert approval.
18
+ - Publishing fails if any included rule versions are not approved.
19
+ - Review requests emit notifications/events.`
20
+ },
21
+ {
22
+ id: "docs.examples.kb-update-pipeline.reference",
23
+ title: "KB Update Pipeline — Reference",
24
+ summary: "Entities, contracts, and events for the KB update pipeline example.",
25
+ kind: "reference",
26
+ visibility: "public",
27
+ route: "/docs/examples/kb-update-pipeline",
28
+ tags: ["knowledge", "reference"],
29
+ body: `## Contracts
30
+ - kbPipeline.runWatch
31
+ - kbPipeline.createReviewTask
32
+ - kbPipeline.submitDecision
33
+ - kbPipeline.publishIfReady
34
+
35
+ ## Events
36
+ - kb.change.detected
37
+ - kb.change.summarized
38
+ - kb.patch.proposed
39
+ - kb.review.requested
40
+ - kb.review.decided`
41
+ }
42
+ ];
43
+ registerDocBlocks(docBlocks);
@@ -0,0 +1,43 @@
1
+ // src/docs/kb-update-pipeline.docblock.ts
2
+ import { registerDocBlocks } from "@contractspec/lib.contracts/docs";
3
+ var docBlocks = [
4
+ {
5
+ id: "docs.examples.kb-update-pipeline.goal",
6
+ title: "KB Update Pipeline — Goal",
7
+ summary: "Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",
8
+ kind: "goal",
9
+ visibility: "public",
10
+ route: "/docs/examples/kb-update-pipeline/goal",
11
+ tags: ["knowledge", "pipeline", "hitl", "audit"],
12
+ body: `## Why it matters
13
+ - Keeps humans as the verifiers (HITL) while automation does the busywork.
14
+ - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
15
+
16
+ ## Guardrails
17
+ - High-risk changes require expert approval.
18
+ - Publishing fails if any included rule versions are not approved.
19
+ - Review requests emit notifications/events.`
20
+ },
21
+ {
22
+ id: "docs.examples.kb-update-pipeline.reference",
23
+ title: "KB Update Pipeline — Reference",
24
+ summary: "Entities, contracts, and events for the KB update pipeline example.",
25
+ kind: "reference",
26
+ visibility: "public",
27
+ route: "/docs/examples/kb-update-pipeline",
28
+ tags: ["knowledge", "reference"],
29
+ body: `## Contracts
30
+ - kbPipeline.runWatch
31
+ - kbPipeline.createReviewTask
32
+ - kbPipeline.submitDecision
33
+ - kbPipeline.publishIfReady
34
+
35
+ ## Events
36
+ - kb.change.detected
37
+ - kb.change.summarized
38
+ - kb.patch.proposed
39
+ - kb.review.requested
40
+ - kb.review.decided`
41
+ }
42
+ ];
43
+ registerDocBlocks(docBlocks);
@@ -0,0 +1,56 @@
1
+ // src/entities/models.ts
2
+ import {
3
+ ScalarTypeEnum,
4
+ defineEnum,
5
+ defineSchemaModel
6
+ } from "@contractspec/lib.schema";
7
+ var ChangeRiskLevelEnum = defineEnum("ChangeRiskLevel", [
8
+ "low",
9
+ "medium",
10
+ "high"
11
+ ]);
12
+ var ReviewAssignedRoleEnum = defineEnum("ReviewAssignedRole", [
13
+ "curator",
14
+ "expert"
15
+ ]);
16
+ var ReviewDecisionEnum = defineEnum("ReviewDecision", [
17
+ "approve",
18
+ "reject"
19
+ ]);
20
+ var ChangeCandidateModel = defineSchemaModel({
21
+ name: "ChangeCandidate",
22
+ description: "Candidate change detected in a source document.",
23
+ fields: {
24
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
25
+ sourceDocumentId: {
26
+ type: ScalarTypeEnum.String_unsecure(),
27
+ isOptional: false
28
+ },
29
+ detectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
30
+ diffSummary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
31
+ riskLevel: { type: ChangeRiskLevelEnum, isOptional: false }
32
+ }
33
+ });
34
+ var ReviewTaskModel = defineSchemaModel({
35
+ name: "ReviewTask",
36
+ description: "Human verification task for a change candidate.",
37
+ fields: {
38
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
39
+ changeCandidateId: {
40
+ type: ScalarTypeEnum.String_unsecure(),
41
+ isOptional: false
42
+ },
43
+ status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
44
+ assignedRole: { type: ReviewAssignedRoleEnum, isOptional: false },
45
+ decision: { type: ReviewDecisionEnum, isOptional: true },
46
+ decidedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
47
+ decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
48
+ }
49
+ });
50
+ export {
51
+ ReviewTaskModel,
52
+ ReviewDecisionEnum,
53
+ ReviewAssignedRoleEnum,
54
+ ChangeRiskLevelEnum,
55
+ ChangeCandidateModel
56
+ };
@@ -0,0 +1,56 @@
1
+ // src/entities/models.ts
2
+ import {
3
+ ScalarTypeEnum,
4
+ defineEnum,
5
+ defineSchemaModel
6
+ } from "@contractspec/lib.schema";
7
+ var ChangeRiskLevelEnum = defineEnum("ChangeRiskLevel", [
8
+ "low",
9
+ "medium",
10
+ "high"
11
+ ]);
12
+ var ReviewAssignedRoleEnum = defineEnum("ReviewAssignedRole", [
13
+ "curator",
14
+ "expert"
15
+ ]);
16
+ var ReviewDecisionEnum = defineEnum("ReviewDecision", [
17
+ "approve",
18
+ "reject"
19
+ ]);
20
+ var ChangeCandidateModel = defineSchemaModel({
21
+ name: "ChangeCandidate",
22
+ description: "Candidate change detected in a source document.",
23
+ fields: {
24
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
25
+ sourceDocumentId: {
26
+ type: ScalarTypeEnum.String_unsecure(),
27
+ isOptional: false
28
+ },
29
+ detectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
30
+ diffSummary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
31
+ riskLevel: { type: ChangeRiskLevelEnum, isOptional: false }
32
+ }
33
+ });
34
+ var ReviewTaskModel = defineSchemaModel({
35
+ name: "ReviewTask",
36
+ description: "Human verification task for a change candidate.",
37
+ fields: {
38
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
39
+ changeCandidateId: {
40
+ type: ScalarTypeEnum.String_unsecure(),
41
+ isOptional: false
42
+ },
43
+ status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
44
+ assignedRole: { type: ReviewAssignedRoleEnum, isOptional: false },
45
+ decision: { type: ReviewDecisionEnum, isOptional: true },
46
+ decidedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
47
+ decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
48
+ }
49
+ });
50
+ export {
51
+ ReviewTaskModel,
52
+ ReviewDecisionEnum,
53
+ ReviewAssignedRoleEnum,
54
+ ChangeRiskLevelEnum,
55
+ ChangeCandidateModel
56
+ };
@@ -0,0 +1,132 @@
1
+ // src/events.ts
2
+ import {
3
+ defineEvent,
4
+ defineSchemaModel,
5
+ StabilityEnum
6
+ } from "@contractspec/lib.contracts";
7
+ import { ScalarTypeEnum } from "@contractspec/lib.schema";
8
+ var KbChangeDetectedPayload = defineSchemaModel({
9
+ name: "KbChangeDetectedPayload",
10
+ description: "Emitted when a source change is detected.",
11
+ fields: {
12
+ changeCandidateId: {
13
+ type: ScalarTypeEnum.String_unsecure(),
14
+ isOptional: false
15
+ },
16
+ sourceDocumentId: {
17
+ type: ScalarTypeEnum.String_unsecure(),
18
+ isOptional: false
19
+ },
20
+ riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
21
+ }
22
+ });
23
+ var KbChangeDetectedEvent = defineEvent({
24
+ meta: {
25
+ key: "kb.change.detected",
26
+ version: "1.0.0",
27
+ description: "KB source change detected.",
28
+ stability: StabilityEnum.Experimental,
29
+ owners: [],
30
+ tags: []
31
+ },
32
+ payload: KbChangeDetectedPayload
33
+ });
34
+ var KbChangeSummarizedPayload = defineSchemaModel({
35
+ name: "KbChangeSummarizedPayload",
36
+ description: "Emitted when a change summary is produced.",
37
+ fields: {
38
+ changeCandidateId: {
39
+ type: ScalarTypeEnum.String_unsecure(),
40
+ isOptional: false
41
+ },
42
+ summary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
43
+ riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
44
+ }
45
+ });
46
+ var KbChangeSummarizedEvent = defineEvent({
47
+ meta: {
48
+ key: "kb.change.summarized",
49
+ version: "1.0.0",
50
+ description: "KB change summarized.",
51
+ stability: StabilityEnum.Experimental,
52
+ owners: [],
53
+ tags: []
54
+ },
55
+ payload: KbChangeSummarizedPayload
56
+ });
57
+ var KbPatchProposedPayload = defineSchemaModel({
58
+ name: "KbPatchProposedPayload",
59
+ description: "Emitted when draft rule patches are proposed.",
60
+ fields: {
61
+ changeCandidateId: {
62
+ type: ScalarTypeEnum.String_unsecure(),
63
+ isOptional: false
64
+ },
65
+ proposedRuleVersionIds: {
66
+ type: ScalarTypeEnum.String_unsecure(),
67
+ isArray: true,
68
+ isOptional: false
69
+ }
70
+ }
71
+ });
72
+ var KbPatchProposedEvent = defineEvent({
73
+ meta: {
74
+ key: "kb.patch.proposed",
75
+ version: "1.0.0",
76
+ description: "KB rule patch proposed (draft versions created).",
77
+ stability: StabilityEnum.Experimental,
78
+ owners: [],
79
+ tags: []
80
+ },
81
+ payload: KbPatchProposedPayload
82
+ });
83
+ var KbReviewRequestedPayload = defineSchemaModel({
84
+ name: "KbReviewRequestedPayload",
85
+ description: "Emitted when a review is requested.",
86
+ fields: {
87
+ reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
88
+ changeCandidateId: {
89
+ type: ScalarTypeEnum.String_unsecure(),
90
+ isOptional: false
91
+ },
92
+ assignedRole: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
93
+ }
94
+ });
95
+ var KbReviewRequestedEvent = defineEvent({
96
+ meta: {
97
+ key: "kb.review.requested",
98
+ version: "1.0.0",
99
+ description: "KB review requested.",
100
+ stability: StabilityEnum.Experimental,
101
+ owners: [],
102
+ tags: []
103
+ },
104
+ payload: KbReviewRequestedPayload
105
+ });
106
+ var KbReviewDecidedPayload = defineSchemaModel({
107
+ name: "KbReviewDecidedPayload",
108
+ description: "Emitted when a review task is decided.",
109
+ fields: {
110
+ reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
111
+ decision: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
112
+ decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
113
+ }
114
+ });
115
+ var KbReviewDecidedEvent = defineEvent({
116
+ meta: {
117
+ key: "kb.review.decided",
118
+ version: "1.0.0",
119
+ description: "KB review decided.",
120
+ stability: StabilityEnum.Experimental,
121
+ owners: [],
122
+ tags: []
123
+ },
124
+ payload: KbReviewDecidedPayload
125
+ });
126
+ export {
127
+ KbReviewRequestedEvent,
128
+ KbReviewDecidedEvent,
129
+ KbPatchProposedEvent,
130
+ KbChangeSummarizedEvent,
131
+ KbChangeDetectedEvent
132
+ };
@@ -0,0 +1,35 @@
1
+ // src/example.ts
2
+ import { defineExample } from "@contractspec/lib.contracts";
3
+ var example = defineExample({
4
+ meta: {
5
+ key: "kb-update-pipeline",
6
+ version: "1.0.0",
7
+ title: "KB Update Pipeline",
8
+ description: "Automation proposes KB updates; humans verify; everything audited and notified.",
9
+ kind: "knowledge",
10
+ visibility: "public",
11
+ stability: "experimental",
12
+ owners: ["@platform.core"],
13
+ tags: ["knowledge", "pipeline", "hitl", "audit"]
14
+ },
15
+ docs: {
16
+ rootDocId: "docs.examples.kb-update-pipeline"
17
+ },
18
+ entrypoints: {
19
+ packageName: "@contractspec/example.kb-update-pipeline",
20
+ feature: "./feature",
21
+ contracts: "./contracts",
22
+ handlers: "./handlers",
23
+ docs: "./docs"
24
+ },
25
+ surfaces: {
26
+ templates: true,
27
+ sandbox: { enabled: true, modes: ["markdown", "specs", "builder"] },
28
+ studio: { enabled: true, installable: true },
29
+ mcp: { enabled: true }
30
+ }
31
+ });
32
+ var example_default = example;
33
+ export {
34
+ example_default as default
35
+ };
@@ -0,0 +1,109 @@
1
+ // src/handlers/memory.handlers.ts
2
+ function createPipelineMemoryStore() {
3
+ return {
4
+ candidates: new Map,
5
+ reviewTasks: new Map,
6
+ proposedRuleVersionIdsByCandidate: new Map,
7
+ approvedRuleVersionIds: new Set,
8
+ notifications: []
9
+ };
10
+ }
11
+ function stableId(prefix, value) {
12
+ return `${prefix}_${value.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
13
+ }
14
+ function createPipelineMemoryHandlers(store) {
15
+ async function runWatch(input) {
16
+ const candidates = [...store.candidates.values()].filter((c) => c.sourceDocumentId.startsWith(`${input.jurisdiction}_`) || true);
17
+ return { candidates };
18
+ }
19
+ async function createReviewTask(input) {
20
+ const candidate = store.candidates.get(input.changeCandidateId);
21
+ if (!candidate)
22
+ throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
23
+ const assignedRole = candidate.riskLevel === "high" ? "expert" : "curator";
24
+ const id = stableId("review", input.changeCandidateId);
25
+ const task = {
26
+ id,
27
+ changeCandidateId: input.changeCandidateId,
28
+ status: "open",
29
+ assignedRole,
30
+ decision: undefined,
31
+ decidedAt: undefined,
32
+ decidedBy: undefined
33
+ };
34
+ store.reviewTasks.set(id, task);
35
+ store.notifications.push({
36
+ kind: "kb.review.requested",
37
+ reviewTaskId: id,
38
+ changeCandidateId: input.changeCandidateId,
39
+ assignedRole,
40
+ createdAt: new Date
41
+ });
42
+ return task;
43
+ }
44
+ async function proposeRulePatch(input) {
45
+ if (!store.candidates.has(input.changeCandidateId)) {
46
+ throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
47
+ }
48
+ store.proposedRuleVersionIdsByCandidate.set(input.changeCandidateId, [
49
+ ...input.proposedRuleVersionIds
50
+ ]);
51
+ return { proposedRuleVersionIds: [...input.proposedRuleVersionIds] };
52
+ }
53
+ async function markRuleVersionApproved(input) {
54
+ store.approvedRuleVersionIds.add(input.ruleVersionId);
55
+ return { ruleVersionId: input.ruleVersionId };
56
+ }
57
+ async function submitDecision(input) {
58
+ const task = store.reviewTasks.get(input.reviewTaskId);
59
+ if (!task)
60
+ throw new Error("REVIEW_TASK_NOT_FOUND");
61
+ const candidate = store.candidates.get(task.changeCandidateId);
62
+ if (!candidate)
63
+ throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
64
+ if (candidate.riskLevel === "high" && input.decision === "approve") {
65
+ if (input.decidedByRole !== "expert")
66
+ throw new Error("FORBIDDEN_ROLE");
67
+ }
68
+ const decided = {
69
+ ...task,
70
+ status: "decided",
71
+ decision: input.decision,
72
+ decidedAt: new Date,
73
+ decidedBy: input.decidedBy
74
+ };
75
+ store.reviewTasks.set(decided.id, decided);
76
+ return decided;
77
+ }
78
+ async function publishIfReady(_input) {
79
+ const openTasks = [...store.reviewTasks.values()].filter((t) => t.status !== "decided");
80
+ if (openTasks.length) {
81
+ throw new Error("NOT_READY");
82
+ }
83
+ const rejected = [...store.reviewTasks.values()].some((t) => t.decision === "reject");
84
+ if (rejected)
85
+ return { published: false, reason: "REJECTED" };
86
+ for (const task of store.reviewTasks.values()) {
87
+ if (task.decision !== "approve")
88
+ continue;
89
+ const proposed = store.proposedRuleVersionIdsByCandidate.get(task.changeCandidateId) ?? [];
90
+ const unapproved = proposed.filter((id) => !store.approvedRuleVersionIds.has(id));
91
+ if (unapproved.length) {
92
+ throw new Error("NOT_READY");
93
+ }
94
+ }
95
+ return { published: true };
96
+ }
97
+ return {
98
+ runWatch,
99
+ createReviewTask,
100
+ proposeRulePatch,
101
+ markRuleVersionApproved,
102
+ submitDecision,
103
+ publishIfReady
104
+ };
105
+ }
106
+ export {
107
+ createPipelineMemoryStore,
108
+ createPipelineMemoryHandlers
109
+ };