@eddacraft/kindling-core 0.1.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 (103) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +187 -0
  3. package/dist/capsule/index.d.ts +10 -0
  4. package/dist/capsule/index.d.ts.map +1 -0
  5. package/dist/capsule/index.js +10 -0
  6. package/dist/capsule/index.js.map +1 -0
  7. package/dist/capsule/lifecycle.d.ts +63 -0
  8. package/dist/capsule/lifecycle.d.ts.map +1 -0
  9. package/dist/capsule/lifecycle.js +108 -0
  10. package/dist/capsule/lifecycle.js.map +1 -0
  11. package/dist/capsule/manager.d.ts +79 -0
  12. package/dist/capsule/manager.d.ts.map +1 -0
  13. package/dist/capsule/manager.js +113 -0
  14. package/dist/capsule/manager.js.map +1 -0
  15. package/dist/capsule/types.d.ts +79 -0
  16. package/dist/capsule/types.d.ts.map +1 -0
  17. package/dist/capsule/types.js +5 -0
  18. package/dist/capsule/types.js.map +1 -0
  19. package/dist/export/bundle.d.ts +125 -0
  20. package/dist/export/bundle.d.ts.map +1 -0
  21. package/dist/export/bundle.js +136 -0
  22. package/dist/export/bundle.js.map +1 -0
  23. package/dist/export/index.d.ts +8 -0
  24. package/dist/export/index.d.ts.map +1 -0
  25. package/dist/export/index.js +8 -0
  26. package/dist/export/index.js.map +1 -0
  27. package/dist/export/restore.d.ts +111 -0
  28. package/dist/export/restore.d.ts.map +1 -0
  29. package/dist/export/restore.js +149 -0
  30. package/dist/export/restore.js.map +1 -0
  31. package/dist/index.d.ts +12 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +18 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/retrieval/index.d.ts +8 -0
  36. package/dist/retrieval/index.d.ts.map +1 -0
  37. package/dist/retrieval/index.js +8 -0
  38. package/dist/retrieval/index.js.map +1 -0
  39. package/dist/retrieval/orchestrator.d.ts +50 -0
  40. package/dist/retrieval/orchestrator.d.ts.map +1 -0
  41. package/dist/retrieval/orchestrator.js +86 -0
  42. package/dist/retrieval/orchestrator.js.map +1 -0
  43. package/dist/retrieval/tiering.d.ts +76 -0
  44. package/dist/retrieval/tiering.d.ts.map +1 -0
  45. package/dist/retrieval/tiering.js +122 -0
  46. package/dist/retrieval/tiering.js.map +1 -0
  47. package/dist/service/index.d.ts +6 -0
  48. package/dist/service/index.d.ts.map +1 -0
  49. package/dist/service/index.js +5 -0
  50. package/dist/service/index.js.map +1 -0
  51. package/dist/service/kindling-service.d.ts +219 -0
  52. package/dist/service/kindling-service.d.ts.map +1 -0
  53. package/dist/service/kindling-service.js +260 -0
  54. package/dist/service/kindling-service.js.map +1 -0
  55. package/dist/types/capsule.d.ts +80 -0
  56. package/dist/types/capsule.d.ts.map +1 -0
  57. package/dist/types/capsule.js +33 -0
  58. package/dist/types/capsule.js.map +1 -0
  59. package/dist/types/common.d.ts +56 -0
  60. package/dist/types/common.d.ts.map +1 -0
  61. package/dist/types/common.js +16 -0
  62. package/dist/types/common.js.map +1 -0
  63. package/dist/types/index.d.ts +17 -0
  64. package/dist/types/index.d.ts.map +1 -0
  65. package/dist/types/index.js +11 -0
  66. package/dist/types/index.js.map +1 -0
  67. package/dist/types/observation.d.ts +60 -0
  68. package/dist/types/observation.d.ts.map +1 -0
  69. package/dist/types/observation.js +27 -0
  70. package/dist/types/observation.js.map +1 -0
  71. package/dist/types/pin.d.ts +65 -0
  72. package/dist/types/pin.d.ts.map +1 -0
  73. package/dist/types/pin.js +26 -0
  74. package/dist/types/pin.js.map +1 -0
  75. package/dist/types/retrieval.d.ts +81 -0
  76. package/dist/types/retrieval.d.ts.map +1 -0
  77. package/dist/types/retrieval.js +5 -0
  78. package/dist/types/retrieval.js.map +1 -0
  79. package/dist/types/summary.d.ts +49 -0
  80. package/dist/types/summary.d.ts.map +1 -0
  81. package/dist/types/summary.js +13 -0
  82. package/dist/types/summary.js.map +1 -0
  83. package/dist/validation/capsule.d.ts +18 -0
  84. package/dist/validation/capsule.d.ts.map +1 -0
  85. package/dist/validation/capsule.js +143 -0
  86. package/dist/validation/capsule.js.map +1 -0
  87. package/dist/validation/index.d.ts +8 -0
  88. package/dist/validation/index.d.ts.map +1 -0
  89. package/dist/validation/index.js +8 -0
  90. package/dist/validation/index.js.map +1 -0
  91. package/dist/validation/observation.d.ts +18 -0
  92. package/dist/validation/observation.d.ts.map +1 -0
  93. package/dist/validation/observation.js +110 -0
  94. package/dist/validation/observation.js.map +1 -0
  95. package/dist/validation/pin.d.ts +16 -0
  96. package/dist/validation/pin.d.ts.map +1 -0
  97. package/dist/validation/pin.js +116 -0
  98. package/dist/validation/pin.js.map +1 -0
  99. package/dist/validation/summary.d.ts +16 -0
  100. package/dist/validation/summary.d.ts.map +1 -0
  101. package/dist/validation/summary.js +117 -0
  102. package/dist/validation/summary.js.map +1 -0
  103. package/package.json +55 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Observation validation
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { ok, err, isObservationKind, } from '../types/index.js';
6
+ /**
7
+ * Validate and normalize an observation input
8
+ *
9
+ * Auto-generates:
10
+ * - id (if not provided)
11
+ * - ts (if not provided)
12
+ * - redacted (defaults to false)
13
+ * - provenance (defaults to empty object)
14
+ *
15
+ * @param input - Observation input to validate
16
+ * @returns Result containing validated Observation or validation errors
17
+ */
18
+ export function validateObservation(input) {
19
+ const errors = [];
20
+ // Type check
21
+ if (typeof input !== 'object' || input === null) {
22
+ return err([{ field: 'input', message: 'Input must be an object' }]);
23
+ }
24
+ const data = input;
25
+ // Validate kind (required)
26
+ if (!data.kind) {
27
+ errors.push({ field: 'kind', message: 'kind is required' });
28
+ }
29
+ else if (!isObservationKind(data.kind)) {
30
+ errors.push({
31
+ field: 'kind',
32
+ message: `Invalid observation kind: ${data.kind}`,
33
+ value: data.kind,
34
+ });
35
+ }
36
+ // Validate content (required, non-empty string)
37
+ if (!data.content) {
38
+ errors.push({ field: 'content', message: 'content is required' });
39
+ }
40
+ else if (typeof data.content !== 'string') {
41
+ errors.push({
42
+ field: 'content',
43
+ message: 'content must be a string',
44
+ value: typeof data.content,
45
+ });
46
+ }
47
+ else if (data.content.trim().length === 0) {
48
+ errors.push({ field: 'content', message: 'content cannot be empty' });
49
+ }
50
+ // Validate scopeIds (required)
51
+ if (!data.scopeIds) {
52
+ errors.push({ field: 'scopeIds', message: 'scopeIds is required' });
53
+ }
54
+ else if (typeof data.scopeIds !== 'object' || data.scopeIds === null) {
55
+ errors.push({
56
+ field: 'scopeIds',
57
+ message: 'scopeIds must be an object',
58
+ });
59
+ }
60
+ // Validate provenance (optional, must be object)
61
+ if (data.provenance !== undefined) {
62
+ if (typeof data.provenance !== 'object' || data.provenance === null || Array.isArray(data.provenance)) {
63
+ errors.push({
64
+ field: 'provenance',
65
+ message: 'provenance must be an object',
66
+ });
67
+ }
68
+ }
69
+ // Validate ts (optional, must be positive number)
70
+ if (data.ts !== undefined) {
71
+ if (typeof data.ts !== 'number') {
72
+ errors.push({
73
+ field: 'ts',
74
+ message: 'ts must be a number',
75
+ value: typeof data.ts,
76
+ });
77
+ }
78
+ else if (data.ts < 0) {
79
+ errors.push({
80
+ field: 'ts',
81
+ message: 'ts must be non-negative',
82
+ value: data.ts,
83
+ });
84
+ }
85
+ }
86
+ // Validate redacted (optional, must be boolean)
87
+ if (data.redacted !== undefined && typeof data.redacted !== 'boolean') {
88
+ errors.push({
89
+ field: 'redacted',
90
+ message: 'redacted must be a boolean',
91
+ value: typeof data.redacted,
92
+ });
93
+ }
94
+ // Return errors if any
95
+ if (errors.length > 0) {
96
+ return err(errors);
97
+ }
98
+ // Construct validated observation with defaults
99
+ const observation = {
100
+ id: data.id || randomUUID(),
101
+ kind: data.kind,
102
+ content: data.content,
103
+ provenance: data.provenance || {},
104
+ ts: data.ts || Date.now(),
105
+ scopeIds: data.scopeIds,
106
+ redacted: data.redacted || false,
107
+ };
108
+ return ok(observation);
109
+ }
110
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../../src/validation/observation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Pin validation
3
+ */
4
+ import type { Pin, ValidationError, Result } from '../types/index.js';
5
+ /**
6
+ * Validate and normalize a pin input
7
+ *
8
+ * Auto-generates:
9
+ * - id (if not provided)
10
+ * - createdAt (if not provided)
11
+ *
12
+ * @param input - Pin input to validate
13
+ * @returns Result containing validated Pin or validation errors
14
+ */
15
+ export declare function validatePin(input: unknown): Result<Pin, ValidationError[]>;
16
+ //# sourceMappingURL=pin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../../src/validation/pin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,eAAe,EACf,MAAM,EACP,MAAM,mBAAmB,CAAC;AAO3B;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,CAwG1E"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Pin validation
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { ok, err, isPinTargetType, } from '../types/index.js';
6
+ /**
7
+ * Validate and normalize a pin input
8
+ *
9
+ * Auto-generates:
10
+ * - id (if not provided)
11
+ * - createdAt (if not provided)
12
+ *
13
+ * @param input - Pin input to validate
14
+ * @returns Result containing validated Pin or validation errors
15
+ */
16
+ export function validatePin(input) {
17
+ const errors = [];
18
+ // Type check
19
+ if (typeof input !== 'object' || input === null) {
20
+ return err([{ field: 'input', message: 'Input must be an object' }]);
21
+ }
22
+ const data = input;
23
+ // Validate targetType (required)
24
+ if (!data.targetType) {
25
+ errors.push({ field: 'targetType', message: 'targetType is required' });
26
+ }
27
+ else if (!isPinTargetType(data.targetType)) {
28
+ errors.push({
29
+ field: 'targetType',
30
+ message: `Invalid pin target type: ${data.targetType}`,
31
+ value: data.targetType,
32
+ });
33
+ }
34
+ // Validate targetId (required, non-empty string)
35
+ if (!data.targetId) {
36
+ errors.push({ field: 'targetId', message: 'targetId is required' });
37
+ }
38
+ else if (typeof data.targetId !== 'string') {
39
+ errors.push({
40
+ field: 'targetId',
41
+ message: 'targetId must be a string',
42
+ value: typeof data.targetId,
43
+ });
44
+ }
45
+ else if (data.targetId.trim().length === 0) {
46
+ errors.push({ field: 'targetId', message: 'targetId cannot be empty' });
47
+ }
48
+ // Validate scopeIds (required)
49
+ if (!data.scopeIds) {
50
+ errors.push({ field: 'scopeIds', message: 'scopeIds is required' });
51
+ }
52
+ else if (typeof data.scopeIds !== 'object' || data.scopeIds === null) {
53
+ errors.push({
54
+ field: 'scopeIds',
55
+ message: 'scopeIds must be an object',
56
+ });
57
+ }
58
+ // Validate reason (optional, must be string)
59
+ if (data.reason !== undefined && typeof data.reason !== 'string') {
60
+ errors.push({
61
+ field: 'reason',
62
+ message: 'reason must be a string',
63
+ value: typeof data.reason,
64
+ });
65
+ }
66
+ // Validate createdAt (optional, must be positive number)
67
+ if (data.createdAt !== undefined) {
68
+ if (typeof data.createdAt !== 'number') {
69
+ errors.push({
70
+ field: 'createdAt',
71
+ message: 'createdAt must be a number',
72
+ value: typeof data.createdAt,
73
+ });
74
+ }
75
+ else if (data.createdAt < 0) {
76
+ errors.push({
77
+ field: 'createdAt',
78
+ message: 'createdAt must be non-negative',
79
+ value: data.createdAt,
80
+ });
81
+ }
82
+ }
83
+ // Validate expiresAt (optional, must be positive number)
84
+ if (data.expiresAt !== undefined) {
85
+ if (typeof data.expiresAt !== 'number') {
86
+ errors.push({
87
+ field: 'expiresAt',
88
+ message: 'expiresAt must be a number',
89
+ value: typeof data.expiresAt,
90
+ });
91
+ }
92
+ else if (data.expiresAt < 0) {
93
+ errors.push({
94
+ field: 'expiresAt',
95
+ message: 'expiresAt must be non-negative',
96
+ value: data.expiresAt,
97
+ });
98
+ }
99
+ }
100
+ // Return errors if any
101
+ if (errors.length > 0) {
102
+ return err(errors);
103
+ }
104
+ // Construct validated pin with defaults
105
+ const pin = {
106
+ id: data.id || randomUUID(),
107
+ targetType: data.targetType,
108
+ targetId: data.targetId,
109
+ reason: data.reason,
110
+ createdAt: data.createdAt || Date.now(),
111
+ expiresAt: data.expiresAt,
112
+ scopeIds: data.scopeIds,
113
+ };
114
+ return ok(pin);
115
+ }
116
+ //# sourceMappingURL=pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin.js","sourceRoot":"","sources":["../../src/validation/pin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Summary validation
3
+ */
4
+ import type { Summary, ValidationError, Result } from '../types/index.js';
5
+ /**
6
+ * Validate and normalize a summary input
7
+ *
8
+ * Auto-generates:
9
+ * - id (if not provided)
10
+ * - createdAt (if not provided)
11
+ *
12
+ * @param input - Summary input to validate
13
+ * @returns Result containing validated Summary or validation errors
14
+ */
15
+ export declare function validateSummary(input: unknown): Result<Summary, ValidationError[]>;
16
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/validation/summary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,MAAM,EACP,MAAM,mBAAmB,CAAC;AAO3B;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAqGlF"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Summary validation
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { ok, err, isValidConfidence, } from '../types/index.js';
6
+ /**
7
+ * Validate and normalize a summary input
8
+ *
9
+ * Auto-generates:
10
+ * - id (if not provided)
11
+ * - createdAt (if not provided)
12
+ *
13
+ * @param input - Summary input to validate
14
+ * @returns Result containing validated Summary or validation errors
15
+ */
16
+ export function validateSummary(input) {
17
+ const errors = [];
18
+ // Type check
19
+ if (typeof input !== 'object' || input === null) {
20
+ return err([{ field: 'input', message: 'Input must be an object' }]);
21
+ }
22
+ const data = input;
23
+ // Validate capsuleId (required, non-empty string)
24
+ if (!data.capsuleId) {
25
+ errors.push({ field: 'capsuleId', message: 'capsuleId is required' });
26
+ }
27
+ else if (typeof data.capsuleId !== 'string') {
28
+ errors.push({
29
+ field: 'capsuleId',
30
+ message: 'capsuleId must be a string',
31
+ value: typeof data.capsuleId,
32
+ });
33
+ }
34
+ else if (data.capsuleId.trim().length === 0) {
35
+ errors.push({ field: 'capsuleId', message: 'capsuleId cannot be empty' });
36
+ }
37
+ // Validate content (required, non-empty string)
38
+ if (!data.content) {
39
+ errors.push({ field: 'content', message: 'content is required' });
40
+ }
41
+ else if (typeof data.content !== 'string') {
42
+ errors.push({
43
+ field: 'content',
44
+ message: 'content must be a string',
45
+ value: typeof data.content,
46
+ });
47
+ }
48
+ else if (data.content.trim().length === 0) {
49
+ errors.push({ field: 'content', message: 'content cannot be empty' });
50
+ }
51
+ // Validate confidence (required, must be 0.0-1.0)
52
+ if (data.confidence === undefined || data.confidence === null) {
53
+ errors.push({ field: 'confidence', message: 'confidence is required' });
54
+ }
55
+ else if (typeof data.confidence !== 'number') {
56
+ errors.push({
57
+ field: 'confidence',
58
+ message: 'confidence must be a number',
59
+ value: typeof data.confidence,
60
+ });
61
+ }
62
+ else if (!isValidConfidence(data.confidence)) {
63
+ errors.push({
64
+ field: 'confidence',
65
+ message: 'confidence must be between 0.0 and 1.0',
66
+ value: data.confidence,
67
+ });
68
+ }
69
+ // Validate evidenceRefs (required, must be array of strings)
70
+ if (!data.evidenceRefs) {
71
+ errors.push({ field: 'evidenceRefs', message: 'evidenceRefs is required' });
72
+ }
73
+ else if (!Array.isArray(data.evidenceRefs)) {
74
+ errors.push({
75
+ field: 'evidenceRefs',
76
+ message: 'evidenceRefs must be an array',
77
+ });
78
+ }
79
+ else if (!data.evidenceRefs.every((id) => typeof id === 'string')) {
80
+ errors.push({
81
+ field: 'evidenceRefs',
82
+ message: 'evidenceRefs must contain only strings',
83
+ });
84
+ }
85
+ // Validate createdAt (optional, must be positive number)
86
+ if (data.createdAt !== undefined) {
87
+ if (typeof data.createdAt !== 'number') {
88
+ errors.push({
89
+ field: 'createdAt',
90
+ message: 'createdAt must be a number',
91
+ value: typeof data.createdAt,
92
+ });
93
+ }
94
+ else if (data.createdAt < 0) {
95
+ errors.push({
96
+ field: 'createdAt',
97
+ message: 'createdAt must be non-negative',
98
+ value: data.createdAt,
99
+ });
100
+ }
101
+ }
102
+ // Return errors if any
103
+ if (errors.length > 0) {
104
+ return err(errors);
105
+ }
106
+ // Construct validated summary with defaults
107
+ const summary = {
108
+ id: data.id || randomUUID(),
109
+ capsuleId: data.capsuleId,
110
+ content: data.content,
111
+ confidence: data.confidence,
112
+ createdAt: data.createdAt || Date.now(),
113
+ evidenceRefs: data.evidenceRefs,
114
+ };
115
+ return ok(summary);
116
+ }
117
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/validation/summary.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@eddacraft/kindling-core",
3
+ "version": "0.1.0",
4
+ "description": "Core domain model and orchestration for Kindling - local memory engine for AI-assisted development",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [
18
+ "kindling",
19
+ "ai",
20
+ "memory",
21
+ "context",
22
+ "llm",
23
+ "agent",
24
+ "observations",
25
+ "capsules",
26
+ "retrieval"
27
+ ],
28
+ "author": "EddaCraft <hello@eddacraft.ai>",
29
+ "homepage": "https://github.com/EddaCraft/kindling/tree/main/packages/kindling-core#readme",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/EddaCraft/kindling.git",
33
+ "directory": "packages/kindling-core"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/EddaCraft/kindling/issues"
37
+ },
38
+ "license": "Apache-2.0",
39
+ "devDependencies": {
40
+ "@types/node": "^20.11.0",
41
+ "typescript": "^5.3.0",
42
+ "vitest": "^3.2.4"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc --build",
49
+ "test": "vitest run",
50
+ "test:watch": "vitest",
51
+ "type-check": "tsc --noEmit",
52
+ "lint": "eslint src",
53
+ "clean": "rm -rf dist"
54
+ }
55
+ }