@contractspec/example.kb-update-pipeline 3.7.16 → 3.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.turbo/turbo-build.log +45 -45
  2. package/CHANGELOG.md +22 -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 +7 -7
@@ -1,69 +1,2 @@
1
1
  // @bun
2
- // src/kb-update-pipeline.feature.ts
3
- import { defineFeature } from "@contractspec/lib.contracts-spec";
4
- var KbUpdatePipelineFeature = defineFeature({
5
- meta: {
6
- key: "kb-update-pipeline",
7
- version: "1.0.0",
8
- title: "KB Update Pipeline (HITL)",
9
- description: "Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",
10
- domain: "knowledge",
11
- owners: ["@examples"],
12
- tags: ["knowledge", "pipeline", "hitl", "audit", "notifications"],
13
- stability: "experimental"
14
- },
15
- operations: [
16
- { key: "kbPipeline.runWatch", version: "1.0.0" },
17
- { key: "kbPipeline.createReviewTask", version: "1.0.0" },
18
- { key: "kbPipeline.submitDecision", version: "1.0.0" },
19
- { key: "kbPipeline.publishIfReady", version: "1.0.0" }
20
- ],
21
- events: [
22
- { key: "kb.change.detected", version: "1.0.0" },
23
- { key: "kb.change.summarized", version: "1.0.0" },
24
- { key: "kb.patch.proposed", version: "1.0.0" },
25
- { key: "kb.review.requested", version: "1.0.0" },
26
- { key: "kb.review.decided", version: "1.0.0" }
27
- ],
28
- presentations: [
29
- { key: "kb.dashboard", version: "1.0.0" },
30
- { key: "kb.review.list", version: "1.0.0" },
31
- { key: "kb.review.form", version: "1.0.0" }
32
- ],
33
- opToPresentation: [
34
- {
35
- op: { key: "kbPipeline.runWatch", version: "1.0.0" },
36
- pres: { key: "kb.dashboard", version: "1.0.0" }
37
- },
38
- {
39
- op: { key: "kbPipeline.createReviewTask", version: "1.0.0" },
40
- pres: { key: "kb.review.list", version: "1.0.0" }
41
- },
42
- {
43
- op: { key: "kbPipeline.submitDecision", version: "1.0.0" },
44
- pres: { key: "kb.review.form", version: "1.0.0" }
45
- }
46
- ],
47
- presentationsTargets: [
48
- { key: "kb.dashboard", version: "1.0.0", targets: ["react", "markdown"] },
49
- { key: "kb.review.list", version: "1.0.0", targets: ["react", "markdown"] },
50
- { key: "kb.review.form", version: "1.0.0", targets: ["react"] }
51
- ],
52
- capabilities: {
53
- requires: [
54
- { key: "identity", version: "1.0.0" },
55
- { key: "notifications", version: "1.0.0" },
56
- { key: "audit-trail", version: "1.0.0" }
57
- ]
58
- },
59
- knowledge: [{ key: "kb.knowledge.rules", version: "1.0.0" }],
60
- telemetry: [{ key: "kb-pipeline.telemetry", version: "1.0.0" }],
61
- jobs: [{ key: "kb-pipeline.job.watch", version: "1.0.0" }],
62
- docs: [
63
- "docs.examples.kb-update-pipeline.goal",
64
- "docs.examples.kb-update-pipeline.reference"
65
- ]
66
- });
67
- export {
68
- KbUpdatePipelineFeature
69
- };
2
+ import{defineFeature as g}from"@contractspec/lib.contracts-spec";var j=g({meta:{key:"kb-update-pipeline",version:"1.0.0",title:"KB Update Pipeline (HITL)",description:"Automation proposes KB patches; humans verify; publishing is blocked until approvals are complete.",domain:"knowledge",owners:["@examples"],tags:["knowledge","pipeline","hitl","audit","notifications"],stability:"experimental"},operations:[{key:"kbPipeline.runWatch",version:"1.0.0"},{key:"kbPipeline.createReviewTask",version:"1.0.0"},{key:"kbPipeline.submitDecision",version:"1.0.0"},{key:"kbPipeline.publishIfReady",version:"1.0.0"}],events:[{key:"kb.change.detected",version:"1.0.0"},{key:"kb.change.summarized",version:"1.0.0"},{key:"kb.patch.proposed",version:"1.0.0"},{key:"kb.review.requested",version:"1.0.0"},{key:"kb.review.decided",version:"1.0.0"}],presentations:[{key:"kb.dashboard",version:"1.0.0"},{key:"kb.review.list",version:"1.0.0"},{key:"kb.review.form",version:"1.0.0"}],opToPresentation:[{op:{key:"kbPipeline.runWatch",version:"1.0.0"},pres:{key:"kb.dashboard",version:"1.0.0"}},{op:{key:"kbPipeline.createReviewTask",version:"1.0.0"},pres:{key:"kb.review.list",version:"1.0.0"}},{op:{key:"kbPipeline.submitDecision",version:"1.0.0"},pres:{key:"kb.review.form",version:"1.0.0"}}],presentationsTargets:[{key:"kb.dashboard",version:"1.0.0",targets:["react","markdown"]},{key:"kb.review.list",version:"1.0.0",targets:["react","markdown"]},{key:"kb.review.form",version:"1.0.0",targets:["react"]}],capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"notifications",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"}]},knowledge:[{key:"kb.knowledge.rules",version:"1.0.0"}],telemetry:[{key:"kb-pipeline.telemetry",version:"1.0.0"}],jobs:[{key:"kb-pipeline.job.watch",version:"1.0.0"}],docs:["docs.examples.kb-update-pipeline.goal","docs.examples.kb-update-pipeline.reference"]});export{j as KbUpdatePipelineFeature};
@@ -1,32 +1,11 @@
1
- // src/docs/kb-update-pipeline.docblock.ts
2
- import { registerDocBlocks } from "@contractspec/lib.contracts-spec/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
1
+ import{registerDocBlocks as m}from"@contractspec/lib.contracts-spec/docs";var f=[{id:"docs.examples.kb-update-pipeline.goal",title:"KB Update Pipeline — 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
13
2
  - Keeps humans as the verifiers (HITL) while automation does the busywork.
14
3
  - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
15
4
 
16
5
  ## Guardrails
17
6
  - High-risk changes require expert approval.
18
7
  - 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
8
+ - Review requests emit notifications/events.`},{id:"docs.examples.kb-update-pipeline.reference",title:"KB Update Pipeline — 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
30
9
  - kbPipeline.runWatch
31
10
  - kbPipeline.createReviewTask
32
11
  - kbPipeline.submitDecision
@@ -37,7 +16,4 @@ var docBlocks = [
37
16
  - kb.change.summarized
38
17
  - kb.patch.proposed
39
18
  - kb.review.requested
40
- - kb.review.decided`
41
- }
42
- ];
43
- registerDocBlocks(docBlocks);
19
+ - kb.review.decided`}];m(f);
@@ -1,32 +1,11 @@
1
- // src/docs/kb-update-pipeline.docblock.ts
2
- import { registerDocBlocks } from "@contractspec/lib.contracts-spec/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
1
+ import{registerDocBlocks as f}from"@contractspec/lib.contracts-spec/docs";var h=[{id:"docs.examples.kb-update-pipeline.goal",title:"KB Update Pipeline — 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
13
2
  - Keeps humans as the verifiers (HITL) while automation does the busywork.
14
3
  - Produces an auditable chain: source change -> diff -> proposal -> review -> publish.
15
4
 
16
5
  ## Guardrails
17
6
  - High-risk changes require expert approval.
18
7
  - 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
8
+ - Review requests emit notifications/events.`},{id:"docs.examples.kb-update-pipeline.reference",title:"KB Update Pipeline — 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
30
9
  - kbPipeline.runWatch
31
10
  - kbPipeline.createReviewTask
32
11
  - kbPipeline.submitDecision
@@ -37,7 +16,4 @@ var docBlocks = [
37
16
  - kb.change.summarized
38
17
  - kb.patch.proposed
39
18
  - kb.review.requested
40
- - kb.review.decided`
41
- }
42
- ];
43
- registerDocBlocks(docBlocks);
19
+ - kb.review.decided`}];f(h);
@@ -1,56 +1 @@
1
- // src/entities/models.ts
2
- import {
3
- defineEnum,
4
- defineSchemaModel,
5
- ScalarTypeEnum
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
- };
1
+ 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,56 +1 @@
1
- // src/entities/models.ts
2
- import {
3
- defineEnum,
4
- defineSchemaModel,
5
- ScalarTypeEnum
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
- };
1
+ 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,128 +1 @@
1
- // src/events.ts
2
- import { defineEvent, StabilityEnum } from "@contractspec/lib.contracts-spec";
3
- import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
4
- var KbChangeDetectedPayload = defineSchemaModel({
5
- name: "KbChangeDetectedPayload",
6
- description: "Emitted when a source change is detected.",
7
- fields: {
8
- changeCandidateId: {
9
- type: ScalarTypeEnum.String_unsecure(),
10
- isOptional: false
11
- },
12
- sourceDocumentId: {
13
- type: ScalarTypeEnum.String_unsecure(),
14
- isOptional: false
15
- },
16
- riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
17
- }
18
- });
19
- var KbChangeDetectedEvent = defineEvent({
20
- meta: {
21
- key: "kb.change.detected",
22
- version: "1.0.0",
23
- description: "KB source change detected.",
24
- stability: StabilityEnum.Experimental,
25
- owners: [],
26
- tags: []
27
- },
28
- payload: KbChangeDetectedPayload
29
- });
30
- var KbChangeSummarizedPayload = defineSchemaModel({
31
- name: "KbChangeSummarizedPayload",
32
- description: "Emitted when a change summary is produced.",
33
- fields: {
34
- changeCandidateId: {
35
- type: ScalarTypeEnum.String_unsecure(),
36
- isOptional: false
37
- },
38
- summary: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
39
- riskLevel: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
40
- }
41
- });
42
- var KbChangeSummarizedEvent = defineEvent({
43
- meta: {
44
- key: "kb.change.summarized",
45
- version: "1.0.0",
46
- description: "KB change summarized.",
47
- stability: StabilityEnum.Experimental,
48
- owners: [],
49
- tags: []
50
- },
51
- payload: KbChangeSummarizedPayload
52
- });
53
- var KbPatchProposedPayload = defineSchemaModel({
54
- name: "KbPatchProposedPayload",
55
- description: "Emitted when draft rule patches are proposed.",
56
- fields: {
57
- changeCandidateId: {
58
- type: ScalarTypeEnum.String_unsecure(),
59
- isOptional: false
60
- },
61
- proposedRuleVersionIds: {
62
- type: ScalarTypeEnum.String_unsecure(),
63
- isArray: true,
64
- isOptional: false
65
- }
66
- }
67
- });
68
- var KbPatchProposedEvent = defineEvent({
69
- meta: {
70
- key: "kb.patch.proposed",
71
- version: "1.0.0",
72
- description: "KB rule patch proposed (draft versions created).",
73
- stability: StabilityEnum.Experimental,
74
- owners: [],
75
- tags: []
76
- },
77
- payload: KbPatchProposedPayload
78
- });
79
- var KbReviewRequestedPayload = defineSchemaModel({
80
- name: "KbReviewRequestedPayload",
81
- description: "Emitted when a review is requested.",
82
- fields: {
83
- reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
84
- changeCandidateId: {
85
- type: ScalarTypeEnum.String_unsecure(),
86
- isOptional: false
87
- },
88
- assignedRole: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
89
- }
90
- });
91
- var KbReviewRequestedEvent = defineEvent({
92
- meta: {
93
- key: "kb.review.requested",
94
- version: "1.0.0",
95
- description: "KB review requested.",
96
- stability: StabilityEnum.Experimental,
97
- owners: [],
98
- tags: []
99
- },
100
- payload: KbReviewRequestedPayload
101
- });
102
- var KbReviewDecidedPayload = defineSchemaModel({
103
- name: "KbReviewDecidedPayload",
104
- description: "Emitted when a review task is decided.",
105
- fields: {
106
- reviewTaskId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
107
- decision: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
108
- decidedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
109
- }
110
- });
111
- var KbReviewDecidedEvent = defineEvent({
112
- meta: {
113
- key: "kb.review.decided",
114
- version: "1.0.0",
115
- description: "KB review decided.",
116
- stability: StabilityEnum.Experimental,
117
- owners: [],
118
- tags: []
119
- },
120
- payload: KbReviewDecidedPayload
121
- });
122
- export {
123
- KbReviewRequestedEvent,
124
- KbReviewDecidedEvent,
125
- KbPatchProposedEvent,
126
- KbChangeSummarizedEvent,
127
- KbChangeDetectedEvent
128
- };
1
+ 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};
@@ -1,35 +1 @@
1
- // src/example.ts
2
- import { defineExample } from "@contractspec/lib.contracts-spec";
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
- };
1
+ 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,109 +1 @@
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
- };
1
+ 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};