@contractspec/example.versioned-knowledge-base 1.57.0 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.turbo/turbo-build.log +52 -52
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +13 -0
  4. package/dist/browser/docs/index.js +44 -0
  5. package/dist/browser/docs/versioned-knowledge-base.docblock.js +44 -0
  6. package/dist/browser/entities/index.js +74 -0
  7. package/dist/browser/entities/models.js +74 -0
  8. package/dist/browser/events.js +101 -0
  9. package/dist/browser/example.js +35 -0
  10. package/dist/browser/handlers/index.js +115 -0
  11. package/dist/browser/handlers/memory.handlers.js +115 -0
  12. package/dist/browser/index.js +586 -0
  13. package/dist/browser/operations/index.js +257 -0
  14. package/dist/browser/operations/kb.js +257 -0
  15. package/dist/browser/versioned-knowledge-base.feature.js +36 -0
  16. package/dist/docs/index.d.ts +2 -1
  17. package/dist/docs/index.d.ts.map +1 -0
  18. package/dist/docs/index.js +45 -1
  19. package/dist/docs/versioned-knowledge-base.docblock.d.ts +2 -1
  20. package/dist/docs/versioned-knowledge-base.docblock.d.ts.map +1 -0
  21. package/dist/docs/versioned-knowledge-base.docblock.js +42 -28
  22. package/dist/entities/index.d.ts +2 -2
  23. package/dist/entities/index.d.ts.map +1 -0
  24. package/dist/entities/index.js +75 -3
  25. package/dist/entities/models.d.ts +127 -132
  26. package/dist/entities/models.d.ts.map +1 -1
  27. package/dist/entities/models.js +69 -145
  28. package/dist/events.d.ts +52 -58
  29. package/dist/events.d.ts.map +1 -1
  30. package/dist/events.js +92 -114
  31. package/dist/example.d.ts +2 -6
  32. package/dist/example.d.ts.map +1 -1
  33. package/dist/example.js +34 -46
  34. package/dist/handlers/index.d.ts +2 -2
  35. package/dist/handlers/index.d.ts.map +1 -0
  36. package/dist/handlers/index.js +116 -3
  37. package/dist/handlers/memory.handlers.d.ts +62 -64
  38. package/dist/handlers/memory.handlers.d.ts.map +1 -1
  39. package/dist/handlers/memory.handlers.js +110 -97
  40. package/dist/handlers/memory.handlers.test.d.ts +2 -0
  41. package/dist/handlers/memory.handlers.test.d.ts.map +1 -0
  42. package/dist/index.d.ts +13 -9
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +587 -11
  45. package/dist/node/docs/index.js +44 -0
  46. package/dist/node/docs/versioned-knowledge-base.docblock.js +44 -0
  47. package/dist/node/entities/index.js +74 -0
  48. package/dist/node/entities/models.js +74 -0
  49. package/dist/node/events.js +101 -0
  50. package/dist/node/example.js +35 -0
  51. package/dist/node/handlers/index.js +115 -0
  52. package/dist/node/handlers/memory.handlers.js +115 -0
  53. package/dist/node/index.js +586 -0
  54. package/dist/node/operations/index.js +257 -0
  55. package/dist/node/operations/kb.js +257 -0
  56. package/dist/node/versioned-knowledge-base.feature.js +36 -0
  57. package/dist/operations/index.d.ts +2 -2
  58. package/dist/operations/index.d.ts.map +1 -0
  59. package/dist/operations/index.js +257 -2
  60. package/dist/operations/kb.d.ts +252 -258
  61. package/dist/operations/kb.d.ts.map +1 -1
  62. package/dist/operations/kb.js +246 -244
  63. package/dist/versioned-knowledge-base.feature.d.ts +1 -6
  64. package/dist/versioned-knowledge-base.feature.d.ts.map +1 -1
  65. package/dist/versioned-knowledge-base.feature.js +35 -68
  66. package/package.json +141 -38
  67. package/tsdown.config.js +1 -2
  68. package/.turbo/turbo-build$colon$bundle.log +0 -52
  69. package/dist/docs/versioned-knowledge-base.docblock.js.map +0 -1
  70. package/dist/entities/models.js.map +0 -1
  71. package/dist/events.js.map +0 -1
  72. package/dist/example.js.map +0 -1
  73. package/dist/handlers/memory.handlers.js.map +0 -1
  74. package/dist/operations/kb.js.map +0 -1
  75. package/dist/versioned-knowledge-base.feature.js.map +0 -1
  76. package/tsconfig.tsbuildinfo +0 -1
package/dist/events.d.ts CHANGED
@@ -1,63 +1,57 @@
1
- import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
2
- import * as _contractspec_lib_schema0 from "@contractspec/lib.schema";
3
-
4
- //#region src/events.d.ts
5
- declare const KbSourceIngestedEvent: _contractspec_lib_contracts0.EventSpec<_contractspec_lib_schema0.SchemaModel<{
6
- sourceDocumentId: {
7
- type: _contractspec_lib_schema0.FieldType<string, string>;
8
- isOptional: false;
9
- };
10
- jurisdiction: {
11
- type: _contractspec_lib_schema0.FieldType<string, string>;
12
- isOptional: false;
13
- };
14
- hash: {
15
- type: _contractspec_lib_schema0.FieldType<string, string>;
16
- isOptional: false;
17
- };
1
+ export declare const KbSourceIngestedEvent: import("@contractspec/lib.contracts").EventSpec<import("@contractspec/lib.schema").SchemaModel<{
2
+ sourceDocumentId: {
3
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
4
+ isOptional: false;
5
+ };
6
+ jurisdiction: {
7
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
8
+ isOptional: false;
9
+ };
10
+ hash: {
11
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
12
+ isOptional: false;
13
+ };
18
14
  }>>;
19
- declare const KbRuleVersionCreatedEvent: _contractspec_lib_contracts0.EventSpec<_contractspec_lib_schema0.SchemaModel<{
20
- ruleVersionId: {
21
- type: _contractspec_lib_schema0.FieldType<string, string>;
22
- isOptional: false;
23
- };
24
- ruleId: {
25
- type: _contractspec_lib_schema0.FieldType<string, string>;
26
- isOptional: false;
27
- };
28
- jurisdiction: {
29
- type: _contractspec_lib_schema0.FieldType<string, string>;
30
- isOptional: false;
31
- };
32
- status: {
33
- type: _contractspec_lib_schema0.FieldType<string, string>;
34
- isOptional: false;
35
- };
15
+ export declare const KbRuleVersionCreatedEvent: import("@contractspec/lib.contracts").EventSpec<import("@contractspec/lib.schema").SchemaModel<{
16
+ ruleVersionId: {
17
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
18
+ isOptional: false;
19
+ };
20
+ ruleId: {
21
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
22
+ isOptional: false;
23
+ };
24
+ jurisdiction: {
25
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
26
+ isOptional: false;
27
+ };
28
+ status: {
29
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
30
+ isOptional: false;
31
+ };
36
32
  }>>;
37
- declare const KbRuleVersionApprovedEvent: _contractspec_lib_contracts0.EventSpec<_contractspec_lib_schema0.SchemaModel<{
38
- ruleVersionId: {
39
- type: _contractspec_lib_schema0.FieldType<string, string>;
40
- isOptional: false;
41
- };
42
- approver: {
43
- type: _contractspec_lib_schema0.FieldType<string, string>;
44
- isOptional: false;
45
- };
33
+ export declare const KbRuleVersionApprovedEvent: import("@contractspec/lib.contracts").EventSpec<import("@contractspec/lib.schema").SchemaModel<{
34
+ ruleVersionId: {
35
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
36
+ isOptional: false;
37
+ };
38
+ approver: {
39
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
40
+ isOptional: false;
41
+ };
46
42
  }>>;
47
- declare const KbSnapshotPublishedEvent: _contractspec_lib_contracts0.EventSpec<_contractspec_lib_schema0.SchemaModel<{
48
- snapshotId: {
49
- type: _contractspec_lib_schema0.FieldType<string, string>;
50
- isOptional: false;
51
- };
52
- jurisdiction: {
53
- type: _contractspec_lib_schema0.FieldType<string, string>;
54
- isOptional: false;
55
- };
56
- includedRuleVersionsCount: {
57
- type: _contractspec_lib_schema0.FieldType<number, number>;
58
- isOptional: false;
59
- };
43
+ export declare const KbSnapshotPublishedEvent: import("@contractspec/lib.contracts").EventSpec<import("@contractspec/lib.schema").SchemaModel<{
44
+ snapshotId: {
45
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
46
+ isOptional: false;
47
+ };
48
+ jurisdiction: {
49
+ type: import("@contractspec/lib.schema").FieldType<string, string>;
50
+ isOptional: false;
51
+ };
52
+ includedRuleVersionsCount: {
53
+ type: import("@contractspec/lib.schema").FieldType<number, number>;
54
+ isOptional: false;
55
+ };
60
56
  }>>;
61
- //#endregion
62
- export { KbRuleVersionApprovedEvent, KbRuleVersionCreatedEvent, KbSnapshotPublishedEvent, KbSourceIngestedEvent };
63
57
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","names":[],"sources":["../src/events.ts"],"mappings":";;;;cAgBa,qBAAA,EAAqB,4BAAA,CAAA,SAAA,2BAAA,WAAA;;UAUhC,yBAAA,CAAA,SAAA;;;;;;;;;;;;cAgBW,yBAAA,EAAyB,4BAAA,CAAA,SAAA,2BAAA,WAAA;;UAUpC,yBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;cAcW,0BAAA,EAA0B,4BAAA,CAAA,SAAA,2BAAA,WAAA;;UAUrC,yBAAA,CAAA,SAAA;;;;;;;;cAeW,wBAAA,EAAwB,4BAAA,CAAA,SAAA,2BAAA,WAAA;;UAUnC,yBAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;GAUhC,CAAC;AAgBH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;GAUpC,CAAC;AAcH,eAAO,MAAM,0BAA0B;;;;;;;;;GAUrC,CAAC;AAeH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;GAUnC,CAAC"}
package/dist/events.js CHANGED
@@ -1,124 +1,102 @@
1
+ // @bun
2
+ // src/events.ts
1
3
  import { defineEvent, defineSchemaModel } from "@contractspec/lib.contracts";
2
4
  import { ScalarTypeEnum } from "@contractspec/lib.schema";
3
-
4
- //#region src/events.ts
5
- const KbSourceIngestedPayload = defineSchemaModel({
6
- name: "KbSourceIngestedPayload",
7
- description: "Emitted when a source document is ingested.",
8
- fields: {
9
- sourceDocumentId: {
10
- type: ScalarTypeEnum.String_unsecure(),
11
- isOptional: false
12
- },
13
- jurisdiction: {
14
- type: ScalarTypeEnum.String_unsecure(),
15
- isOptional: false
16
- },
17
- hash: {
18
- type: ScalarTypeEnum.String_unsecure(),
19
- isOptional: false
20
- }
21
- }
5
+ var KbSourceIngestedPayload = defineSchemaModel({
6
+ name: "KbSourceIngestedPayload",
7
+ description: "Emitted when a source document is ingested.",
8
+ fields: {
9
+ sourceDocumentId: {
10
+ type: ScalarTypeEnum.String_unsecure(),
11
+ isOptional: false
12
+ },
13
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
14
+ hash: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
15
+ }
22
16
  });
23
- const KbSourceIngestedEvent = defineEvent({
24
- meta: {
25
- key: "kb.source.ingested",
26
- version: "1.0.0",
27
- description: "Source document ingested (immutable).",
28
- stability: "experimental",
29
- owners: ["@examples"],
30
- tags: ["knowledge"]
31
- },
32
- payload: KbSourceIngestedPayload
17
+ var KbSourceIngestedEvent = defineEvent({
18
+ meta: {
19
+ key: "kb.source.ingested",
20
+ version: "1.0.0",
21
+ description: "Source document ingested (immutable).",
22
+ stability: "experimental",
23
+ owners: ["@examples"],
24
+ tags: ["knowledge"]
25
+ },
26
+ payload: KbSourceIngestedPayload
33
27
  });
34
- const KbRuleVersionCreatedPayload = defineSchemaModel({
35
- name: "KbRuleVersionCreatedPayload",
36
- description: "Emitted when a rule version draft is created.",
37
- fields: {
38
- ruleVersionId: {
39
- type: ScalarTypeEnum.String_unsecure(),
40
- isOptional: false
41
- },
42
- ruleId: {
43
- type: ScalarTypeEnum.String_unsecure(),
44
- isOptional: false
45
- },
46
- jurisdiction: {
47
- type: ScalarTypeEnum.String_unsecure(),
48
- isOptional: false
49
- },
50
- status: {
51
- type: ScalarTypeEnum.String_unsecure(),
52
- isOptional: false
53
- }
54
- }
28
+ var KbRuleVersionCreatedPayload = defineSchemaModel({
29
+ name: "KbRuleVersionCreatedPayload",
30
+ description: "Emitted when a rule version draft is created.",
31
+ fields: {
32
+ ruleVersionId: {
33
+ type: ScalarTypeEnum.String_unsecure(),
34
+ isOptional: false
35
+ },
36
+ ruleId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
37
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
38
+ status: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
39
+ }
55
40
  });
56
- const KbRuleVersionCreatedEvent = defineEvent({
57
- meta: {
58
- key: "kb.ruleVersion.created",
59
- version: "1.0.0",
60
- description: "Rule version created (draft).",
61
- stability: "experimental",
62
- owners: ["@examples"],
63
- tags: ["knowledge"]
64
- },
65
- payload: KbRuleVersionCreatedPayload
41
+ var KbRuleVersionCreatedEvent = defineEvent({
42
+ meta: {
43
+ key: "kb.ruleVersion.created",
44
+ version: "1.0.0",
45
+ description: "Rule version created (draft).",
46
+ stability: "experimental",
47
+ owners: ["@examples"],
48
+ tags: ["knowledge"]
49
+ },
50
+ payload: KbRuleVersionCreatedPayload
66
51
  });
67
- const KbRuleVersionApprovedPayload = defineSchemaModel({
68
- name: "KbRuleVersionApprovedPayload",
69
- description: "Emitted when a rule version is approved.",
70
- fields: {
71
- ruleVersionId: {
72
- type: ScalarTypeEnum.String_unsecure(),
73
- isOptional: false
74
- },
75
- approver: {
76
- type: ScalarTypeEnum.String_unsecure(),
77
- isOptional: false
78
- }
79
- }
52
+ var KbRuleVersionApprovedPayload = defineSchemaModel({
53
+ name: "KbRuleVersionApprovedPayload",
54
+ description: "Emitted when a rule version is approved.",
55
+ fields: {
56
+ ruleVersionId: {
57
+ type: ScalarTypeEnum.String_unsecure(),
58
+ isOptional: false
59
+ },
60
+ approver: { type: ScalarTypeEnum.String_unsecure(), isOptional: false }
61
+ }
80
62
  });
81
- const KbRuleVersionApprovedEvent = defineEvent({
82
- meta: {
83
- key: "kb.ruleVersion.approved",
84
- version: "1.0.0",
85
- description: "Rule version approved (human verified).",
86
- stability: "experimental",
87
- owners: ["@examples"],
88
- tags: ["knowledge"]
89
- },
90
- payload: KbRuleVersionApprovedPayload
63
+ var KbRuleVersionApprovedEvent = defineEvent({
64
+ meta: {
65
+ key: "kb.ruleVersion.approved",
66
+ version: "1.0.0",
67
+ description: "Rule version approved (human verified).",
68
+ stability: "experimental",
69
+ owners: ["@examples"],
70
+ tags: ["knowledge"]
71
+ },
72
+ payload: KbRuleVersionApprovedPayload
91
73
  });
92
- const KbSnapshotPublishedPayload = defineSchemaModel({
93
- name: "KbSnapshotPublishedPayload",
94
- description: "Emitted when a KB snapshot is published.",
95
- fields: {
96
- snapshotId: {
97
- type: ScalarTypeEnum.String_unsecure(),
98
- isOptional: false
99
- },
100
- jurisdiction: {
101
- type: ScalarTypeEnum.String_unsecure(),
102
- isOptional: false
103
- },
104
- includedRuleVersionsCount: {
105
- type: ScalarTypeEnum.Int_unsecure(),
106
- isOptional: false
107
- }
108
- }
74
+ var KbSnapshotPublishedPayload = defineSchemaModel({
75
+ name: "KbSnapshotPublishedPayload",
76
+ description: "Emitted when a KB snapshot is published.",
77
+ fields: {
78
+ snapshotId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
79
+ jurisdiction: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
80
+ includedRuleVersionsCount: {
81
+ type: ScalarTypeEnum.Int_unsecure(),
82
+ isOptional: false
83
+ }
84
+ }
109
85
  });
110
- const KbSnapshotPublishedEvent = defineEvent({
111
- meta: {
112
- key: "kb.snapshot.published",
113
- version: "1.0.0",
114
- description: "KB snapshot published.",
115
- stability: "experimental",
116
- owners: ["@examples"],
117
- tags: ["knowledge"]
118
- },
119
- payload: KbSnapshotPublishedPayload
86
+ var KbSnapshotPublishedEvent = defineEvent({
87
+ meta: {
88
+ key: "kb.snapshot.published",
89
+ version: "1.0.0",
90
+ description: "KB snapshot published.",
91
+ stability: "experimental",
92
+ owners: ["@examples"],
93
+ tags: ["knowledge"]
94
+ },
95
+ payload: KbSnapshotPublishedPayload
120
96
  });
121
-
122
- //#endregion
123
- export { KbRuleVersionApprovedEvent, KbRuleVersionCreatedEvent, KbSnapshotPublishedEvent, KbSourceIngestedEvent };
124
- //# sourceMappingURL=events.js.map
97
+ export {
98
+ KbSourceIngestedEvent,
99
+ KbSnapshotPublishedEvent,
100
+ KbRuleVersionCreatedEvent,
101
+ KbRuleVersionApprovedEvent
102
+ };
package/dist/example.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
2
-
3
- //#region src/example.d.ts
4
- declare const example: _contractspec_lib_contracts0.ExampleSpec;
5
- //#endregion
6
- export { example as default };
1
+ declare const example: import("@contractspec/lib.contracts").ExampleSpec;
2
+ export default example;
7
3
  //# sourceMappingURL=example.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"example.d.ts","names":[],"sources":["../src/example.ts"],"mappings":";;;cAEM,OAAA,EA6BJ,4BAAA,CA7BW,WAAA"}
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,OAAO,mDA6BX,CAAC;AAEH,eAAe,OAAO,CAAC"}
package/dist/example.js CHANGED
@@ -1,48 +1,36 @@
1
+ // @bun
2
+ // src/example.ts
1
3
  import { defineExample } from "@contractspec/lib.contracts";
2
-
3
- //#region src/example.ts
4
- const example = defineExample({
5
- meta: {
6
- key: "versioned-knowledge-base",
7
- version: "1.0.0",
8
- title: "Versioned Knowledge Base",
9
- description: "Curated KB with immutable sources, reviewable rule versions, and published snapshots.",
10
- kind: "knowledge",
11
- visibility: "public",
12
- stability: "experimental",
13
- owners: ["@platform.core"],
14
- tags: [
15
- "knowledge",
16
- "versioning",
17
- "snapshots"
18
- ]
19
- },
20
- docs: { rootDocId: "docs.examples.versioned-knowledge-base" },
21
- entrypoints: {
22
- packageName: "@contractspec/example.versioned-knowledge-base",
23
- feature: "./feature",
24
- contracts: "./contracts",
25
- handlers: "./handlers",
26
- docs: "./docs"
27
- },
28
- surfaces: {
29
- templates: true,
30
- sandbox: {
31
- enabled: true,
32
- modes: [
33
- "markdown",
34
- "specs",
35
- "builder"
36
- ]
37
- },
38
- studio: {
39
- enabled: true,
40
- installable: true
41
- },
42
- mcp: { enabled: true }
43
- }
4
+ var example = defineExample({
5
+ meta: {
6
+ key: "versioned-knowledge-base",
7
+ version: "1.0.0",
8
+ title: "Versioned Knowledge Base",
9
+ description: "Curated KB with immutable sources, reviewable rule versions, and published snapshots.",
10
+ kind: "knowledge",
11
+ visibility: "public",
12
+ stability: "experimental",
13
+ owners: ["@platform.core"],
14
+ tags: ["knowledge", "versioning", "snapshots"]
15
+ },
16
+ docs: {
17
+ rootDocId: "docs.examples.versioned-knowledge-base"
18
+ },
19
+ entrypoints: {
20
+ packageName: "@contractspec/example.versioned-knowledge-base",
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
+ }
44
32
  });
45
-
46
- //#endregion
47
- export { example as default };
48
- //# sourceMappingURL=example.js.map
33
+ var example_default = example;
34
+ export {
35
+ example_default as default
36
+ };
@@ -1,2 +1,2 @@
1
- import { MemoryKbHandlers, MemoryKbStore, createMemoryKbHandlers, createMemoryKbStore } from "./memory.handlers.js";
2
- export { MemoryKbHandlers, MemoryKbStore, createMemoryKbHandlers, createMemoryKbStore };
1
+ export * from './memory.handlers';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -1,3 +1,116 @@
1
- import { createMemoryKbHandlers, createMemoryKbStore } from "./memory.handlers.js";
2
-
3
- export { createMemoryKbHandlers, createMemoryKbStore };
1
+ // @bun
2
+ // src/handlers/memory.handlers.ts
3
+ function createMemoryKbStore() {
4
+ return {
5
+ sources: new Map,
6
+ rules: new Map,
7
+ ruleVersions: new Map,
8
+ snapshots: new Map,
9
+ nextRuleVersionNumberByRuleId: new Map
10
+ };
11
+ }
12
+ function stableId(prefix, value) {
13
+ return `${prefix}_${value.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
14
+ }
15
+ function createMemoryKbHandlers(store) {
16
+ async function createRule(rule) {
17
+ store.rules.set(rule.id, rule);
18
+ return rule;
19
+ }
20
+ async function ingestSource(input) {
21
+ const id = stableId("src", `${input.jurisdiction}_${input.hash}`);
22
+ const doc = { id, ...input };
23
+ store.sources.set(id, doc);
24
+ return doc;
25
+ }
26
+ async function upsertRuleVersion(input) {
27
+ if (!input.sourceRefs.length) {
28
+ throw new Error("SOURCE_REFS_REQUIRED");
29
+ }
30
+ const rule = store.rules.get(input.ruleId);
31
+ if (!rule) {
32
+ throw new Error("RULE_NOT_FOUND");
33
+ }
34
+ const next = (store.nextRuleVersionNumberByRuleId.get(input.ruleId) ?? 0) + 1;
35
+ const id = stableId("rv", `${input.ruleId}_${next}`);
36
+ const ruleVersion = {
37
+ id,
38
+ ruleId: input.ruleId,
39
+ jurisdiction: rule.jurisdiction,
40
+ topicKey: rule.topicKey,
41
+ version: next.toString(),
42
+ content: input.content,
43
+ sourceRefs: input.sourceRefs,
44
+ status: "draft",
45
+ createdAt: new Date,
46
+ approvedAt: undefined,
47
+ approvedBy: undefined
48
+ };
49
+ store.ruleVersions.set(id, ruleVersion);
50
+ return ruleVersion;
51
+ }
52
+ async function approveRuleVersion(input) {
53
+ const existing = store.ruleVersions.get(input.ruleVersionId);
54
+ if (!existing) {
55
+ throw new Error("RULE_VERSION_NOT_FOUND");
56
+ }
57
+ const approved = {
58
+ ...existing,
59
+ status: "approved",
60
+ approvedBy: input.approver,
61
+ approvedAt: new Date
62
+ };
63
+ store.ruleVersions.set(approved.id, approved);
64
+ return approved;
65
+ }
66
+ async function publishSnapshot(input) {
67
+ const approved = [...store.ruleVersions.values()].filter((rv) => rv.status === "approved" && rv.jurisdiction === input.jurisdiction);
68
+ if (approved.length === 0) {
69
+ throw new Error("NO_APPROVED_RULES");
70
+ }
71
+ const includedRuleVersionIds = approved.map((rv) => rv.id).sort();
72
+ const id = stableId("snap", `${input.jurisdiction}_${input.asOfDate.toISOString().slice(0, 10)}_${includedRuleVersionIds.length}`);
73
+ const snapshot = {
74
+ id,
75
+ jurisdiction: input.jurisdiction,
76
+ asOfDate: input.asOfDate,
77
+ includedRuleVersionIds,
78
+ publishedAt: new Date
79
+ };
80
+ store.snapshots.set(id, snapshot);
81
+ return snapshot;
82
+ }
83
+ async function search(input) {
84
+ const snapshot = store.snapshots.get(input.snapshotId);
85
+ if (!snapshot) {
86
+ throw new Error("SNAPSHOT_NOT_FOUND");
87
+ }
88
+ if (snapshot.jurisdiction !== input.jurisdiction) {
89
+ throw new Error("JURISDICTION_MISMATCH");
90
+ }
91
+ const q = input.query.toLowerCase();
92
+ const tokens = q.split(/\s+/).map((t) => t.trim()).filter(Boolean);
93
+ const items = snapshot.includedRuleVersionIds.map((id) => store.ruleVersions.get(id)).filter((rv) => Boolean(rv)).filter((rv) => {
94
+ if (tokens.length === 0)
95
+ return true;
96
+ const hay = rv.content.toLowerCase();
97
+ return tokens.every((token) => hay.includes(token));
98
+ }).map((rv) => ({
99
+ ruleVersionId: rv.id,
100
+ excerpt: rv.content.slice(0, 120)
101
+ }));
102
+ return { items };
103
+ }
104
+ return {
105
+ createRule,
106
+ ingestSource,
107
+ upsertRuleVersion,
108
+ approveRuleVersion,
109
+ publishSnapshot,
110
+ search
111
+ };
112
+ }
113
+ export {
114
+ createMemoryKbStore,
115
+ createMemoryKbHandlers
116
+ };