@contractspec/example.kb-update-pipeline 3.7.17 → 3.7.19

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 (45) hide show
  1. package/.turbo/turbo-build.log +45 -45
  2. package/CHANGELOG.md +17 -0
  3. package/dist/browser/docs/index.js +3 -27
  4. package/dist/browser/docs/kb-update-pipeline.docblock.js +3 -27
  5. package/dist/browser/entities/index.js +1 -56
  6. package/dist/browser/entities/models.js +1 -56
  7. package/dist/browser/events.js +1 -128
  8. package/dist/browser/example.js +1 -35
  9. package/dist/browser/handlers/index.js +1 -109
  10. package/dist/browser/handlers/memory.handlers.js +1 -109
  11. package/dist/browser/index.js +3 -636
  12. package/dist/browser/kb-update-pipeline.feature.js +1 -68
  13. package/dist/browser/operations/index.js +1 -199
  14. package/dist/browser/operations/pipeline.js +1 -199
  15. package/dist/browser/presentations.js +1 -123
  16. package/dist/browser/tests/operations.test-spec.js +1 -85
  17. package/dist/docs/index.js +3 -27
  18. package/dist/docs/kb-update-pipeline.docblock.js +3 -27
  19. package/dist/entities/index.js +1 -56
  20. package/dist/entities/models.js +1 -56
  21. package/dist/events.js +1 -128
  22. package/dist/example.js +1 -35
  23. package/dist/handlers/index.js +1 -109
  24. package/dist/handlers/memory.handlers.js +1 -109
  25. package/dist/index.js +3 -636
  26. package/dist/kb-update-pipeline.feature.js +1 -68
  27. package/dist/node/docs/index.js +3 -27
  28. package/dist/node/docs/kb-update-pipeline.docblock.js +3 -27
  29. package/dist/node/entities/index.js +1 -56
  30. package/dist/node/entities/models.js +1 -56
  31. package/dist/node/events.js +1 -128
  32. package/dist/node/example.js +1 -35
  33. package/dist/node/handlers/index.js +1 -109
  34. package/dist/node/handlers/memory.handlers.js +1 -109
  35. package/dist/node/index.js +3 -636
  36. package/dist/node/kb-update-pipeline.feature.js +1 -68
  37. package/dist/node/operations/index.js +1 -199
  38. package/dist/node/operations/pipeline.js +1 -199
  39. package/dist/node/presentations.js +1 -123
  40. package/dist/node/tests/operations.test-spec.js +1 -85
  41. package/dist/operations/index.js +1 -199
  42. package/dist/operations/pipeline.js +1 -199
  43. package/dist/presentations.js +1 -123
  44. package/dist/tests/operations.test-spec.js +1 -85
  45. package/package.json +5 -5
@@ -1,85 +1 @@
1
- // src/tests/operations.test-spec.ts
2
- import { defineTestSpec } from "@contractspec/lib.contracts-spec/tests";
3
- var RunWatchTest = defineTestSpec({
4
- meta: {
5
- key: "kbPipeline.runWatch.test",
6
- version: "1.0.0",
7
- stability: "experimental",
8
- owners: ["@example.kb-update-pipeline"],
9
- description: "Test for run watch operation",
10
- tags: ["test"]
11
- },
12
- target: {
13
- type: "operation",
14
- operation: { key: "kbPipeline.runWatch", version: "1.0.0" }
15
- },
16
- scenarios: [
17
- {
18
- key: "success",
19
- when: { operation: { key: "kbPipeline.runWatch" } },
20
- then: [{ type: "expectOutput", match: {} }]
21
- },
22
- {
23
- key: "error",
24
- when: { operation: { key: "kbPipeline.runWatch" } },
25
- then: [{ type: "expectError" }]
26
- }
27
- ]
28
- });
29
- var CreateReviewTaskTest = defineTestSpec({
30
- meta: {
31
- key: "kbPipeline.createReviewTask.test",
32
- version: "1.0.0",
33
- stability: "experimental",
34
- owners: ["@example.kb-update-pipeline"],
35
- description: "Test for creating review task",
36
- tags: ["test"]
37
- },
38
- target: {
39
- type: "operation",
40
- operation: { key: "kbPipeline.createReviewTask", version: "1.0.0" }
41
- },
42
- scenarios: [
43
- {
44
- key: "success",
45
- when: { operation: { key: "kbPipeline.createReviewTask" } },
46
- then: [{ type: "expectOutput", match: {} }]
47
- },
48
- {
49
- key: "error",
50
- when: { operation: { key: "kbPipeline.createReviewTask" } },
51
- then: [{ type: "expectError" }]
52
- }
53
- ]
54
- });
55
- var SubmitDecisionTest = defineTestSpec({
56
- meta: {
57
- key: "kbPipeline.submitDecision.test",
58
- version: "1.0.0",
59
- stability: "experimental",
60
- owners: ["@example.kb-update-pipeline"],
61
- description: "Test for submitting decision",
62
- tags: ["test"]
63
- },
64
- target: {
65
- type: "operation",
66
- operation: { key: "kbPipeline.submitDecision", version: "1.0.0" }
67
- },
68
- scenarios: [
69
- {
70
- key: "success",
71
- when: { operation: { key: "kbPipeline.submitDecision" } },
72
- then: [{ type: "expectOutput", match: {} }]
73
- },
74
- {
75
- key: "error",
76
- when: { operation: { key: "kbPipeline.submitDecision" } },
77
- then: [{ type: "expectError" }]
78
- }
79
- ]
80
- });
81
- export {
82
- SubmitDecisionTest,
83
- RunWatchTest,
84
- CreateReviewTaskTest
85
- };
1
+ import{defineTestSpec as g}from"@contractspec/lib.contracts-spec/tests";var j=g({meta:{key:"kbPipeline.runWatch.test",version:"1.0.0",stability:"experimental",owners:["@example.kb-update-pipeline"],description:"Test for run watch operation",tags:["test"]},target:{type:"operation",operation:{key:"kbPipeline.runWatch",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"kbPipeline.runWatch"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"kbPipeline.runWatch"}},then:[{type:"expectError"}]}]}),k=g({meta:{key:"kbPipeline.createReviewTask.test",version:"1.0.0",stability:"experimental",owners:["@example.kb-update-pipeline"],description:"Test for creating review task",tags:["test"]},target:{type:"operation",operation:{key:"kbPipeline.createReviewTask",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"kbPipeline.createReviewTask"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"kbPipeline.createReviewTask"}},then:[{type:"expectError"}]}]}),m=g({meta:{key:"kbPipeline.submitDecision.test",version:"1.0.0",stability:"experimental",owners:["@example.kb-update-pipeline"],description:"Test for submitting decision",tags:["test"]},target:{type:"operation",operation:{key:"kbPipeline.submitDecision",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"kbPipeline.submitDecision"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"kbPipeline.submitDecision"}},then:[{type:"expectError"}]}]});export{m as SubmitDecisionTest,j as RunWatchTest,k as CreateReviewTaskTest};
@@ -1,33 +1,12 @@
1
1
  // @bun
2
- // src/docs/kb-update-pipeline.docblock.ts
3
- import { registerDocBlocks } from "@contractspec/lib.contracts-spec/docs";
4
- var docBlocks = [
5
- {
6
- id: "docs.examples.kb-update-pipeline.goal",
7
- title: "KB Update Pipeline \u2014 Goal",
8
- summary: "Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",
9
- kind: "goal",
10
- visibility: "public",
11
- route: "/docs/examples/kb-update-pipeline/goal",
12
- tags: ["knowledge", "pipeline", "hitl", "audit"],
13
- body: `## Why it matters
2
+ import{registerDocBlocks as m}from"@contractspec/lib.contracts-spec/docs";var f=[{id:"docs.examples.kb-update-pipeline.goal",title:"KB Update Pipeline \u2014 Goal",summary:"Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",kind:"goal",visibility:"public",route:"/docs/examples/kb-update-pipeline/goal",tags:["knowledge","pipeline","hitl","audit"],body:`## Why it matters
14
3
  - Keeps humans as the verifiers (HITL) while automation does the busywork.
15
4
  - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
16
5
 
17
6
  ## Guardrails
18
7
  - High-risk changes require expert approval.
19
8
  - Publishing fails if any included rule versions are not approved.
20
- - Review requests emit notifications/events.`
21
- },
22
- {
23
- id: "docs.examples.kb-update-pipeline.reference",
24
- title: "KB Update Pipeline \u2014 Reference",
25
- summary: "Entities, contracts, and events for the KB update pipeline example.",
26
- kind: "reference",
27
- visibility: "public",
28
- route: "/docs/examples/kb-update-pipeline",
29
- tags: ["knowledge", "reference"],
30
- body: `## Contracts
9
+ - Review requests emit notifications/events.`},{id:"docs.examples.kb-update-pipeline.reference",title:"KB Update Pipeline \u2014 Reference",summary:"Entities, contracts, and events for the KB update pipeline example.",kind:"reference",visibility:"public",route:"/docs/examples/kb-update-pipeline",tags:["knowledge","reference"],body:`## Contracts
31
10
  - kbPipeline.runWatch
32
11
  - kbPipeline.createReviewTask
33
12
  - kbPipeline.submitDecision
@@ -38,7 +17,4 @@ var docBlocks = [
38
17
  - kb.change.summarized
39
18
  - kb.patch.proposed
40
19
  - kb.review.requested
41
- - kb.review.decided`
42
- }
43
- ];
44
- registerDocBlocks(docBlocks);
20
+ - kb.review.decided`}];m(f);
@@ -1,33 +1,12 @@
1
1
  // @bun
2
- // src/docs/kb-update-pipeline.docblock.ts
3
- import { registerDocBlocks } from "@contractspec/lib.contracts-spec/docs";
4
- var docBlocks = [
5
- {
6
- id: "docs.examples.kb-update-pipeline.goal",
7
- title: "KB Update Pipeline \u2014 Goal",
8
- summary: "Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",
9
- kind: "goal",
10
- visibility: "public",
11
- route: "/docs/examples/kb-update-pipeline/goal",
12
- tags: ["knowledge", "pipeline", "hitl", "audit"],
13
- body: `## Why it matters
2
+ import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.examples.kb-update-pipeline.goal",title:"KB Update Pipeline \u2014 Goal",summary:"Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",kind:"goal",visibility:"public",route:"/docs/examples/kb-update-pipeline/goal",tags:["knowledge","pipeline","hitl","audit"],body:`## Why it matters
14
3
  - Keeps humans as the verifiers (HITL) while automation does the busywork.
15
4
  - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
16
5
 
17
6
  ## Guardrails
18
7
  - High-risk changes require expert approval.
19
8
  - Publishing fails if any included rule versions are not approved.
20
- - Review requests emit notifications/events.`
21
- },
22
- {
23
- id: "docs.examples.kb-update-pipeline.reference",
24
- title: "KB Update Pipeline \u2014 Reference",
25
- summary: "Entities, contracts, and events for the KB update pipeline example.",
26
- kind: "reference",
27
- visibility: "public",
28
- route: "/docs/examples/kb-update-pipeline",
29
- tags: ["knowledge", "reference"],
30
- body: `## Contracts
9
+ - Review requests emit notifications/events.`},{id:"docs.examples.kb-update-pipeline.reference",title:"KB Update Pipeline \u2014 Reference",summary:"Entities, contracts, and events for the KB update pipeline example.",kind:"reference",visibility:"public",route:"/docs/examples/kb-update-pipeline",tags:["knowledge","reference"],body:`## Contracts
31
10
  - kbPipeline.runWatch
32
11
  - kbPipeline.createReviewTask
33
12
  - kbPipeline.submitDecision
@@ -38,7 +17,4 @@ var docBlocks = [
38
17
  - kb.change.summarized
39
18
  - kb.patch.proposed
40
19
  - kb.review.requested
41
- - kb.review.decided`
42
- }
43
- ];
44
- registerDocBlocks(docBlocks);
20
+ - kb.review.decided`}];f(h);
@@ -1,57 +1,2 @@
1
1
  // @bun
2
- // src/entities/models.ts
3
- import {
4
- defineEnum,
5
- defineSchemaModel,
6
- ScalarTypeEnum
7
- } from "@contractspec/lib.schema";
8
- var ChangeRiskLevelEnum = defineEnum("ChangeRiskLevel", [
9
- "low",
10
- "medium",
11
- "high"
12
- ]);
13
- var ReviewAssignedRoleEnum = defineEnum("ReviewAssignedRole", [
14
- "curator",
15
- "expert"
16
- ]);
17
- var ReviewDecisionEnum = defineEnum("ReviewDecision", [
18
- "approve",
19
- "reject"
20
- ]);
21
- var ChangeCandidateModel = defineSchemaModel({
22
- name: "ChangeCandidate",
23
- description: "Candidate change detected in a source document.",
24
- fields: {
25
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
26
- sourceDocumentId: {
27
- type: ScalarTypeEnum.String_unsecure(),
28
- isOptional: false
29
- },
30
- detectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
31
- diffSummary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
32
- riskLevel: { type: ChangeRiskLevelEnum, isOptional: false }
33
- }
34
- });
35
- var ReviewTaskModel = defineSchemaModel({
36
- name: "ReviewTask",
37
- description: "Human verification task for a change candidate.",
38
- fields: {
39
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
40
- changeCandidateId: {
41
- type: ScalarTypeEnum.String_unsecure(),
42
- isOptional: false
43
- },
44
- status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
45
- assignedRole: { type: ReviewAssignedRoleEnum, isOptional: false },
46
- decision: { type: ReviewDecisionEnum, isOptional: true },
47
- decidedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
48
- decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
49
- }
50
- });
51
- export {
52
- ReviewTaskModel,
53
- ReviewDecisionEnum,
54
- ReviewAssignedRoleEnum,
55
- ChangeRiskLevelEnum,
56
- ChangeCandidateModel
57
- };
2
+ import{defineEnum as i,defineSchemaModel as t,ScalarTypeEnum as e}from"@contractspec/lib.schema";var n=i("ChangeRiskLevel",["low","medium","high"]),a=i("ReviewAssignedRole",["curator","expert"]),s=i("ReviewDecision",["approve","reject"]),d=t({name:"ChangeCandidate",description:"Candidate change detected in a source document.",fields:{id:{type:e.String_unsecure(),isOptional:!1},sourceDocumentId:{type:e.String_unsecure(),isOptional:!1},detectedAt:{type:e.DateTime(),isOptional:!1},diffSummary:{type:e.String_unsecure(),isOptional:!1},riskLevel:{type:n,isOptional:!1}}}),r=t({name:"ReviewTask",description:"Human verification task for a change candidate.",fields:{id:{type:e.String_unsecure(),isOptional:!1},changeCandidateId:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},assignedRole:{type:a,isOptional:!1},decision:{type:s,isOptional:!0},decidedAt:{type:e.DateTime(),isOptional:!0},decidedBy:{type:e.String_unsecure(),isOptional:!0}}});export{r as ReviewTaskModel,s as ReviewDecisionEnum,a as ReviewAssignedRoleEnum,n as ChangeRiskLevelEnum,d as ChangeCandidateModel};
@@ -1,57 +1,2 @@
1
1
  // @bun
2
- // src/entities/models.ts
3
- import {
4
- defineEnum,
5
- defineSchemaModel,
6
- ScalarTypeEnum
7
- } from "@contractspec/lib.schema";
8
- var ChangeRiskLevelEnum = defineEnum("ChangeRiskLevel", [
9
- "low",
10
- "medium",
11
- "high"
12
- ]);
13
- var ReviewAssignedRoleEnum = defineEnum("ReviewAssignedRole", [
14
- "curator",
15
- "expert"
16
- ]);
17
- var ReviewDecisionEnum = defineEnum("ReviewDecision", [
18
- "approve",
19
- "reject"
20
- ]);
21
- var ChangeCandidateModel = defineSchemaModel({
22
- name: "ChangeCandidate",
23
- description: "Candidate change detected in a source document.",
24
- fields: {
25
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
26
- sourceDocumentId: {
27
- type: ScalarTypeEnum.String_unsecure(),
28
- isOptional: false
29
- },
30
- detectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
31
- diffSummary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
32
- riskLevel: { type: ChangeRiskLevelEnum, isOptional: false }
33
- }
34
- });
35
- var ReviewTaskModel = defineSchemaModel({
36
- name: "ReviewTask",
37
- description: "Human verification task for a change candidate.",
38
- fields: {
39
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
40
- changeCandidateId: {
41
- type: ScalarTypeEnum.String_unsecure(),
42
- isOptional: false
43
- },
44
- status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
45
- assignedRole: { type: ReviewAssignedRoleEnum, isOptional: false },
46
- decision: { type: ReviewDecisionEnum, isOptional: true },
47
- decidedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
48
- decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
49
- }
50
- });
51
- export {
52
- ReviewTaskModel,
53
- ReviewDecisionEnum,
54
- ReviewAssignedRoleEnum,
55
- ChangeRiskLevelEnum,
56
- ChangeCandidateModel
57
- };
2
+ import{defineEnum as i,defineSchemaModel as t,ScalarTypeEnum as e}from"@contractspec/lib.schema";var n=i("ChangeRiskLevel",["low","medium","high"]),a=i("ReviewAssignedRole",["curator","expert"]),s=i("ReviewDecision",["approve","reject"]),d=t({name:"ChangeCandidate",description:"Candidate change detected in a source document.",fields:{id:{type:e.String_unsecure(),isOptional:!1},sourceDocumentId:{type:e.String_unsecure(),isOptional:!1},detectedAt:{type:e.DateTime(),isOptional:!1},diffSummary:{type:e.String_unsecure(),isOptional:!1},riskLevel:{type:n,isOptional:!1}}}),r=t({name:"ReviewTask",description:"Human verification task for a change candidate.",fields:{id:{type:e.String_unsecure(),isOptional:!1},changeCandidateId:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},assignedRole:{type:a,isOptional:!1},decision:{type:s,isOptional:!0},decidedAt:{type:e.DateTime(),isOptional:!0},decidedBy:{type:e.String_unsecure(),isOptional:!0}}});export{r as ReviewTaskModel,s as ReviewDecisionEnum,a as ReviewAssignedRoleEnum,n as ChangeRiskLevelEnum,d as ChangeCandidateModel};
package/dist/events.js CHANGED
@@ -1,129 +1,2 @@
1
1
  // @bun
2
- // src/events.ts
3
- import { defineEvent, StabilityEnum } from "@contractspec/lib.contracts-spec";
4
- import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
5
- var KbChangeDetectedPayload = defineSchemaModel({
6
- name: "KbChangeDetectedPayload",
7
- description: "Emitted when a source change is detected.",
8
- fields: {
9
- changeCandidateId: {
10
- type: ScalarTypeEnum.String_unsecure(),
11
- isOptional: false
12
- },
13
- sourceDocumentId: {
14
- type: ScalarTypeEnum.String_unsecure(),
15
- isOptional: false
16
- },
17
- riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
18
- }
19
- });
20
- var KbChangeDetectedEvent = defineEvent({
21
- meta: {
22
- key: "kb.change.detected",
23
- version: "1.0.0",
24
- description: "KB source change detected.",
25
- stability: StabilityEnum.Experimental,
26
- owners: [],
27
- tags: []
28
- },
29
- payload: KbChangeDetectedPayload
30
- });
31
- var KbChangeSummarizedPayload = defineSchemaModel({
32
- name: "KbChangeSummarizedPayload",
33
- description: "Emitted when a change summary is produced.",
34
- fields: {
35
- changeCandidateId: {
36
- type: ScalarTypeEnum.String_unsecure(),
37
- isOptional: false
38
- },
39
- summary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
40
- riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
41
- }
42
- });
43
- var KbChangeSummarizedEvent = defineEvent({
44
- meta: {
45
- key: "kb.change.summarized",
46
- version: "1.0.0",
47
- description: "KB change summarized.",
48
- stability: StabilityEnum.Experimental,
49
- owners: [],
50
- tags: []
51
- },
52
- payload: KbChangeSummarizedPayload
53
- });
54
- var KbPatchProposedPayload = defineSchemaModel({
55
- name: "KbPatchProposedPayload",
56
- description: "Emitted when draft rule patches are proposed.",
57
- fields: {
58
- changeCandidateId: {
59
- type: ScalarTypeEnum.String_unsecure(),
60
- isOptional: false
61
- },
62
- proposedRuleVersionIds: {
63
- type: ScalarTypeEnum.String_unsecure(),
64
- isArray: true,
65
- isOptional: false
66
- }
67
- }
68
- });
69
- var KbPatchProposedEvent = defineEvent({
70
- meta: {
71
- key: "kb.patch.proposed",
72
- version: "1.0.0",
73
- description: "KB rule patch proposed (draft versions created).",
74
- stability: StabilityEnum.Experimental,
75
- owners: [],
76
- tags: []
77
- },
78
- payload: KbPatchProposedPayload
79
- });
80
- var KbReviewRequestedPayload = defineSchemaModel({
81
- name: "KbReviewRequestedPayload",
82
- description: "Emitted when a review is requested.",
83
- fields: {
84
- reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
85
- changeCandidateId: {
86
- type: ScalarTypeEnum.String_unsecure(),
87
- isOptional: false
88
- },
89
- assignedRole: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
90
- }
91
- });
92
- var KbReviewRequestedEvent = defineEvent({
93
- meta: {
94
- key: "kb.review.requested",
95
- version: "1.0.0",
96
- description: "KB review requested.",
97
- stability: StabilityEnum.Experimental,
98
- owners: [],
99
- tags: []
100
- },
101
- payload: KbReviewRequestedPayload
102
- });
103
- var KbReviewDecidedPayload = defineSchemaModel({
104
- name: "KbReviewDecidedPayload",
105
- description: "Emitted when a review task is decided.",
106
- fields: {
107
- reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
108
- decision: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
109
- decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
110
- }
111
- });
112
- var KbReviewDecidedEvent = defineEvent({
113
- meta: {
114
- key: "kb.review.decided",
115
- version: "1.0.0",
116
- description: "KB review decided.",
117
- stability: StabilityEnum.Experimental,
118
- owners: [],
119
- tags: []
120
- },
121
- payload: KbReviewDecidedPayload
122
- });
123
- export {
124
- KbReviewRequestedEvent,
125
- KbReviewDecidedEvent,
126
- KbPatchProposedEvent,
127
- KbChangeSummarizedEvent,
128
- KbChangeDetectedEvent
129
- };
2
+ import{defineEvent as k,StabilityEnum as x}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as A,ScalarTypeEnum as j}from"@contractspec/lib.schema";var B=A({name:"KbChangeDetectedPayload",description:"Emitted when a source change is detected.",fields:{changeCandidateId:{type:j.String_unsecure(),isOptional:!1},sourceDocumentId:{type:j.String_unsecure(),isOptional:!1},riskLevel:{type:j.String_unsecure(),isOptional:!1}}}),N=k({meta:{key:"kb.change.detected",version:"1.0.0",description:"KB source change detected.",stability:x.Experimental,owners:[],tags:[]},payload:B}),F=A({name:"KbChangeSummarizedPayload",description:"Emitted when a change summary is produced.",fields:{changeCandidateId:{type:j.String_unsecure(),isOptional:!1},summary:{type:j.String_unsecure(),isOptional:!1},riskLevel:{type:j.String_unsecure(),isOptional:!1}}}),O=k({meta:{key:"kb.change.summarized",version:"1.0.0",description:"KB change summarized.",stability:x.Experimental,owners:[],tags:[]},payload:F}),G=A({name:"KbPatchProposedPayload",description:"Emitted when draft rule patches are proposed.",fields:{changeCandidateId:{type:j.String_unsecure(),isOptional:!1},proposedRuleVersionIds:{type:j.String_unsecure(),isArray:!0,isOptional:!1}}}),Q=k({meta:{key:"kb.patch.proposed",version:"1.0.0",description:"KB rule patch proposed (draft versions created).",stability:x.Experimental,owners:[],tags:[]},payload:G}),H=A({name:"KbReviewRequestedPayload",description:"Emitted when a review is requested.",fields:{reviewTaskId:{type:j.String_unsecure(),isOptional:!1},changeCandidateId:{type:j.String_unsecure(),isOptional:!1},assignedRole:{type:j.String_unsecure(),isOptional:!1}}}),U=k({meta:{key:"kb.review.requested",version:"1.0.0",description:"KB review requested.",stability:x.Experimental,owners:[],tags:[]},payload:H}),I=A({name:"KbReviewDecidedPayload",description:"Emitted when a review task is decided.",fields:{reviewTaskId:{type:j.String_unsecure(),isOptional:!1},decision:{type:j.String_unsecure(),isOptional:!1},decidedBy:{type:j.String_unsecure(),isOptional:!1}}}),V=k({meta:{key:"kb.review.decided",version:"1.0.0",description:"KB review decided.",stability:x.Experimental,owners:[],tags:[]},payload:I});export{U as KbReviewRequestedEvent,V as KbReviewDecidedEvent,Q as KbPatchProposedEvent,O as KbChangeSummarizedEvent,N as KbChangeDetectedEvent};
package/dist/example.js CHANGED
@@ -1,36 +1,2 @@
1
1
  // @bun
2
- // src/example.ts
3
- import { defineExample } from "@contractspec/lib.contracts-spec";
4
- var example = defineExample({
5
- meta: {
6
- key: "kb-update-pipeline",
7
- version: "1.0.0",
8
- title: "KB Update Pipeline",
9
- description: "Automation proposes KB updates; humans verify; everything audited and notified.",
10
- kind: "knowledge",
11
- visibility: "public",
12
- stability: "experimental",
13
- owners: ["@platform.core"],
14
- tags: ["knowledge", "pipeline", "hitl", "audit"]
15
- },
16
- docs: {
17
- rootDocId: "docs.examples.kb-update-pipeline"
18
- },
19
- entrypoints: {
20
- packageName: "@contractspec/example.kb-update-pipeline",
21
- feature: "./feature",
22
- contracts: "./contracts",
23
- handlers: "./handlers",
24
- docs: "./docs"
25
- },
26
- surfaces: {
27
- templates: true,
28
- sandbox: { enabled: true, modes: ["markdown", "specs", "builder"] },
29
- studio: { enabled: true, installable: true },
30
- mcp: { enabled: true }
31
- }
32
- });
33
- var example_default = example;
34
- export {
35
- example_default as default
36
- };
2
+ import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"kb-update-pipeline",version:"1.0.0",title:"KB Update Pipeline",description:"Automation proposes KB updates; humans verify; everything audited and notified.",kind:"knowledge",visibility:"public",stability:"experimental",owners:["@platform.core"],tags:["knowledge","pipeline","hitl","audit"]},docs:{rootDocId:"docs.examples.kb-update-pipeline"},entrypoints:{packageName:"@contractspec/example.kb-update-pipeline",feature:"./feature",contracts:"./contracts",handlers:"./handlers",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["markdown","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
@@ -1,110 +1,2 @@
1
1
  // @bun
2
- // src/handlers/memory.handlers.ts
3
- function createPipelineMemoryStore() {
4
- return {
5
- candidates: new Map,
6
- reviewTasks: new Map,
7
- proposedRuleVersionIdsByCandidate: new Map,
8
- approvedRuleVersionIds: new Set,
9
- notifications: []
10
- };
11
- }
12
- function stableId(prefix, value) {
13
- return `${prefix}_${value.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
14
- }
15
- function createPipelineMemoryHandlers(store) {
16
- async function runWatch(input) {
17
- const candidates = [...store.candidates.values()].filter((c) => c.sourceDocumentId.startsWith(`${input.jurisdiction}_`) || true);
18
- return { candidates };
19
- }
20
- async function createReviewTask(input) {
21
- const candidate = store.candidates.get(input.changeCandidateId);
22
- if (!candidate)
23
- throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
24
- const assignedRole = candidate.riskLevel === "high" ? "expert" : "curator";
25
- const id = stableId("review", input.changeCandidateId);
26
- const task = {
27
- id,
28
- changeCandidateId: input.changeCandidateId,
29
- status: "open",
30
- assignedRole,
31
- decision: undefined,
32
- decidedAt: undefined,
33
- decidedBy: undefined
34
- };
35
- store.reviewTasks.set(id, task);
36
- store.notifications.push({
37
- kind: "kb.review.requested",
38
- reviewTaskId: id,
39
- changeCandidateId: input.changeCandidateId,
40
- assignedRole,
41
- createdAt: new Date
42
- });
43
- return task;
44
- }
45
- async function proposeRulePatch(input) {
46
- if (!store.candidates.has(input.changeCandidateId)) {
47
- throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
48
- }
49
- store.proposedRuleVersionIdsByCandidate.set(input.changeCandidateId, [
50
- ...input.proposedRuleVersionIds
51
- ]);
52
- return { proposedRuleVersionIds: [...input.proposedRuleVersionIds] };
53
- }
54
- async function markRuleVersionApproved(input) {
55
- store.approvedRuleVersionIds.add(input.ruleVersionId);
56
- return { ruleVersionId: input.ruleVersionId };
57
- }
58
- async function submitDecision(input) {
59
- const task = store.reviewTasks.get(input.reviewTaskId);
60
- if (!task)
61
- throw new Error("REVIEW_TASK_NOT_FOUND");
62
- const candidate = store.candidates.get(task.changeCandidateId);
63
- if (!candidate)
64
- throw new Error("CHANGE_CANDIDATE_NOT_FOUND");
65
- if (candidate.riskLevel === "high" && input.decision === "approve") {
66
- if (input.decidedByRole !== "expert")
67
- throw new Error("FORBIDDEN_ROLE");
68
- }
69
- const decided = {
70
- ...task,
71
- status: "decided",
72
- decision: input.decision,
73
- decidedAt: new Date,
74
- decidedBy: input.decidedBy
75
- };
76
- store.reviewTasks.set(decided.id, decided);
77
- return decided;
78
- }
79
- async function publishIfReady(_input) {
80
- const openTasks = [...store.reviewTasks.values()].filter((t) => t.status !== "decided");
81
- if (openTasks.length) {
82
- throw new Error("NOT_READY");
83
- }
84
- const rejected = [...store.reviewTasks.values()].some((t) => t.decision === "reject");
85
- if (rejected)
86
- return { published: false, reason: "REJECTED" };
87
- for (const task of store.reviewTasks.values()) {
88
- if (task.decision !== "approve")
89
- continue;
90
- const proposed = store.proposedRuleVersionIdsByCandidate.get(task.changeCandidateId) ?? [];
91
- const unapproved = proposed.filter((id) => !store.approvedRuleVersionIds.has(id));
92
- if (unapproved.length) {
93
- throw new Error("NOT_READY");
94
- }
95
- }
96
- return { published: true };
97
- }
98
- return {
99
- runWatch,
100
- createReviewTask,
101
- proposeRulePatch,
102
- markRuleVersionApproved,
103
- submitDecision,
104
- publishIfReady
105
- };
106
- }
107
- export {
108
- createPipelineMemoryStore,
109
- createPipelineMemoryHandlers
110
- };
2
+ function S(){return{candidates:new Map,reviewTasks:new Map,proposedRuleVersionIdsByCandidate:new Map,approvedRuleVersionIds:new Set,notifications:[]}}function O(q,F){return`${q}_${F.replace(/[^a-zA-Z0-9_-]/g,"_")}`}function U(q){async function F(j){return{candidates:[...q.candidates.values()].filter((C)=>C.sourceDocumentId.startsWith(`${j.jurisdiction}_`)||!0)}}async function H(j){let B=q.candidates.get(j.changeCandidateId);if(!B)throw Error("CHANGE_CANDIDATE_NOT_FOUND");let C=B.riskLevel==="high"?"expert":"curator",z=O("review",j.changeCandidateId),G={id:z,changeCandidateId:j.changeCandidateId,status:"open",assignedRole:C,decision:void 0,decidedAt:void 0,decidedBy:void 0};return q.reviewTasks.set(z,G),q.notifications.push({kind:"kb.review.requested",reviewTaskId:z,changeCandidateId:j.changeCandidateId,assignedRole:C,createdAt:new Date}),G}async function J(j){if(!q.candidates.has(j.changeCandidateId))throw Error("CHANGE_CANDIDATE_NOT_FOUND");return q.proposedRuleVersionIdsByCandidate.set(j.changeCandidateId,[...j.proposedRuleVersionIds]),{proposedRuleVersionIds:[...j.proposedRuleVersionIds]}}async function K(j){return q.approvedRuleVersionIds.add(j.ruleVersionId),{ruleVersionId:j.ruleVersionId}}async function L(j){let B=q.reviewTasks.get(j.reviewTaskId);if(!B)throw Error("REVIEW_TASK_NOT_FOUND");let C=q.candidates.get(B.changeCandidateId);if(!C)throw Error("CHANGE_CANDIDATE_NOT_FOUND");if(C.riskLevel==="high"&&j.decision==="approve"){if(j.decidedByRole!=="expert")throw Error("FORBIDDEN_ROLE")}let z={...B,status:"decided",decision:j.decision,decidedAt:new Date,decidedBy:j.decidedBy};return q.reviewTasks.set(z.id,z),z}async function M(j){if([...q.reviewTasks.values()].filter((z)=>z.status!=="decided").length)throw Error("NOT_READY");if([...q.reviewTasks.values()].some((z)=>z.decision==="reject"))return{published:!1,reason:"REJECTED"};for(let z of q.reviewTasks.values()){if(z.decision!=="approve")continue;if((q.proposedRuleVersionIdsByCandidate.get(z.changeCandidateId)??[]).filter((N)=>!q.approvedRuleVersionIds.has(N)).length)throw Error("NOT_READY")}return{published:!0}}return{runWatch:F,createReviewTask:H,proposeRulePatch:J,markRuleVersionApproved:K,submitDecision:L,publishIfReady:M}}export{S as createPipelineMemoryStore,U as createPipelineMemoryHandlers};