@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,113 @@
1
+ /**
2
+ * Capsule manager implementation
3
+ *
4
+ * Manages capsule lifecycle with in-memory caching for fast lookup.
5
+ */
6
+ import { openCapsule, closeCapsule, getCapsule, getOpenCapsule } from './lifecycle.js';
7
+ /**
8
+ * Default capsule manager implementation
9
+ *
10
+ * Features:
11
+ * - In-memory cache for active capsules
12
+ * - Thread-safe operations (via synchronous store calls)
13
+ * - Automatic cache invalidation on close
14
+ */
15
+ export class CapsuleManager {
16
+ store;
17
+ activeCache;
18
+ constructor(store) {
19
+ this.store = store;
20
+ this.activeCache = new Map();
21
+ }
22
+ /**
23
+ * Open a new capsule
24
+ *
25
+ * @param options - Capsule creation options
26
+ * @returns The created capsule
27
+ * @throws Error if validation fails or duplicate open capsule exists
28
+ */
29
+ open(options) {
30
+ const capsule = openCapsule(this.store, options);
31
+ // Cache for fast lookup
32
+ this.activeCache.set(capsule.id, capsule);
33
+ return capsule;
34
+ }
35
+ /**
36
+ * Close an open capsule
37
+ *
38
+ * @param capsuleId - ID of capsule to close
39
+ * @param signals - Closure signals/metadata
40
+ * @returns The closed capsule
41
+ * @throws Error if capsule not found or already closed
42
+ */
43
+ close(capsuleId, signals) {
44
+ const capsule = closeCapsule(this.store, capsuleId, signals);
45
+ // Remove from active cache
46
+ this.activeCache.delete(capsuleId);
47
+ return capsule;
48
+ }
49
+ /**
50
+ * Get a capsule by ID
51
+ *
52
+ * Checks cache first, falls back to store.
53
+ *
54
+ * @param capsuleId - Capsule ID to lookup
55
+ * @returns Capsule or undefined if not found
56
+ */
57
+ get(capsuleId) {
58
+ // Check cache first
59
+ const cached = this.activeCache.get(capsuleId);
60
+ if (cached) {
61
+ return cached;
62
+ }
63
+ // Fall back to store
64
+ return getCapsule(this.store, capsuleId);
65
+ }
66
+ /**
67
+ * Get the open capsule for a scope (if any)
68
+ *
69
+ * Currently only supports session-scoped lookup.
70
+ *
71
+ * @param scopeIds - Partial scope to match
72
+ * @returns Open capsule or undefined
73
+ */
74
+ getOpen(scopeIds) {
75
+ // Only session-scoped lookup is supported for now
76
+ if (!scopeIds.sessionId) {
77
+ throw new Error('getOpen currently only supports sessionId lookup');
78
+ }
79
+ return getOpenCapsule(this.store, scopeIds.sessionId);
80
+ }
81
+ /**
82
+ * Notify that an observation was attached to a capsule
83
+ *
84
+ * Updates the cached capsule's observationIds if the capsule is in the cache.
85
+ *
86
+ * @param capsuleId - Capsule that received the observation
87
+ * @param observationId - Observation that was attached
88
+ */
89
+ notifyObservationAttached(capsuleId, observationId) {
90
+ const cached = this.activeCache.get(capsuleId);
91
+ if (cached) {
92
+ // Update the cached capsule's observationIds
93
+ cached.observationIds.push(observationId);
94
+ }
95
+ }
96
+ /**
97
+ * Clear the active capsule cache
98
+ *
99
+ * Useful for testing or manual cache invalidation.
100
+ */
101
+ clearCache() {
102
+ this.activeCache.clear();
103
+ }
104
+ /**
105
+ * Get count of cached active capsules
106
+ *
107
+ * Useful for debugging and monitoring.
108
+ */
109
+ getCacheSize() {
110
+ return this.activeCache.size;
111
+ }
112
+ }
113
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/capsule/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvF;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACjB,KAAK,CAAe;IACpB,WAAW,CAAmB;IAEtC,YAAY,KAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,OAA2B;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEjD,wBAAwB;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAE1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAa,EAAE,OAA6B;QAChD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE7D,2BAA2B;QAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,SAAa;QACf,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,qBAAqB;QACrB,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,QAA2B;QACjC,kDAAkD;QAClD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;OAOG;IACH,yBAAyB,CAAC,SAAa,EAAE,aAAiB;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,6CAA6C;YAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Capsule lifecycle types and interfaces
3
+ */
4
+ import type { ID, ScopeIds } from '../types/common.js';
5
+ import type { Capsule, CapsuleType } from '../types/capsule.js';
6
+ /**
7
+ * Options for opening a new capsule
8
+ */
9
+ export interface OpenCapsuleOptions {
10
+ /** Type of capsule (session, task, etc.) */
11
+ type: CapsuleType;
12
+ /** Human-readable intent/purpose */
13
+ intent: string;
14
+ /** Scope dimensions for isolation */
15
+ scopeIds: ScopeIds;
16
+ /** Optional pre-generated ID */
17
+ id?: ID;
18
+ }
19
+ /**
20
+ * Signals/metadata for closing a capsule
21
+ */
22
+ export interface CloseCapsuleSignals {
23
+ /** Reason for closure (completion, timeout, error, etc.) */
24
+ reason?: string;
25
+ /** Optional summary content to generate on close */
26
+ summaryContent?: string;
27
+ /** Confidence score for summary (0.0-1.0) */
28
+ summaryConfidence?: number;
29
+ /** Evidence observation IDs that support the summary */
30
+ evidenceRefs?: ID[];
31
+ }
32
+ /**
33
+ * Capsule manager interface
34
+ *
35
+ * Manages capsule lifecycle: opening, closing, and lookup
36
+ */
37
+ export interface CapsuleManager {
38
+ /**
39
+ * Open a new capsule
40
+ *
41
+ * @param options - Capsule creation options
42
+ * @returns The created capsule
43
+ * @throws Error if a capsule is already open for the same scope (session type)
44
+ */
45
+ open(options: OpenCapsuleOptions): Capsule;
46
+ /**
47
+ * Close an open capsule
48
+ *
49
+ * @param capsuleId - ID of capsule to close
50
+ * @param signals - Closure signals/metadata
51
+ * @returns The closed capsule
52
+ * @throws Error if capsule not found or already closed
53
+ */
54
+ close(capsuleId: ID, signals?: CloseCapsuleSignals): Capsule;
55
+ /**
56
+ * Get a capsule by ID
57
+ *
58
+ * @param capsuleId - Capsule ID to lookup
59
+ * @returns Capsule or undefined if not found
60
+ */
61
+ get(capsuleId: ID): Capsule | undefined;
62
+ /**
63
+ * Get the open capsule for a scope (if any)
64
+ *
65
+ * @param scopeIds - Partial scope to match
66
+ * @returns Open capsule or undefined
67
+ */
68
+ getOpen(scopeIds: Partial<ScopeIds>): Capsule | undefined;
69
+ /**
70
+ * Notify that an observation was attached to a capsule
71
+ *
72
+ * Updates any cached capsule state to include the new observation.
73
+ *
74
+ * @param capsuleId - Capsule that received the observation
75
+ * @param observationId - Observation that was attached
76
+ */
77
+ notifyObservationAttached(capsuleId: ID, observationId: ID): void;
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/capsule/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,WAAW,CAAC;IAElB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IAEf,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IAEnB,gCAAgC;IAChC,EAAE,CAAC,EAAE,EAAE,CAAC;CACT;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,wDAAwD;IACxD,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAE3C;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC;IAE7D;;;;;OAKG;IACH,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC;IAExC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;IAE1D;;;;;;;OAOG;IACH,yBAAyB,CAAC,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC;CACnE"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Capsule lifecycle types and interfaces
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/capsule/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Service-level export coordination
3
+ *
4
+ * Provides high-level export API for backup and portability.
5
+ * Builds on store-level export primitives from STORAGE-005.
6
+ */
7
+ import type { ScopeIds } from '../types/common.js';
8
+ import type { Observation, Capsule, Summary, Pin } from '../types/index.js';
9
+ /**
10
+ * Store interface for export operations
11
+ */
12
+ export interface ExportStore {
13
+ /**
14
+ * Export database to a dataset
15
+ */
16
+ exportDatabase(options?: {
17
+ scope?: Partial<ScopeIds>;
18
+ includeRedacted?: boolean;
19
+ limit?: number;
20
+ }): {
21
+ version: string;
22
+ exportedAt: number;
23
+ scope?: Partial<ScopeIds>;
24
+ observations: Observation[];
25
+ capsules: Capsule[];
26
+ summaries: Summary[];
27
+ pins: Pin[];
28
+ };
29
+ }
30
+ /**
31
+ * Export options
32
+ */
33
+ export interface ExportBundleOptions {
34
+ /** Optional scope filter */
35
+ scope?: Partial<ScopeIds>;
36
+ /** Include redacted observations (default: false) */
37
+ includeRedacted?: boolean;
38
+ /** Maximum observations to export */
39
+ limit?: number;
40
+ /** Bundle metadata */
41
+ metadata?: {
42
+ description?: string;
43
+ tags?: string[];
44
+ [key: string]: unknown;
45
+ };
46
+ }
47
+ /**
48
+ * Export bundle with metadata
49
+ */
50
+ export interface ExportBundle {
51
+ /** Bundle format version */
52
+ bundleVersion: string;
53
+ /** Export timestamp */
54
+ exportedAt: number;
55
+ /** Optional metadata */
56
+ metadata?: {
57
+ description?: string;
58
+ tags?: string[];
59
+ [key: string]: unknown;
60
+ };
61
+ /** Dataset with entities */
62
+ dataset: {
63
+ version: string;
64
+ exportedAt: number;
65
+ scope?: Partial<ScopeIds>;
66
+ observations: Observation[];
67
+ capsules: Capsule[];
68
+ summaries: Summary[];
69
+ pins: Pin[];
70
+ };
71
+ }
72
+ /**
73
+ * Export bundle statistics
74
+ */
75
+ export interface ExportStats {
76
+ observations: number;
77
+ capsules: number;
78
+ summaries: number;
79
+ pins: number;
80
+ totalSize: number;
81
+ }
82
+ /**
83
+ * Create an export bundle
84
+ *
85
+ * Coordinates export from store with optional metadata and validation.
86
+ *
87
+ * @param store - Export store
88
+ * @param options - Export options
89
+ * @returns Export bundle with dataset and metadata
90
+ */
91
+ export declare function createExportBundle(store: ExportStore, options?: ExportBundleOptions): ExportBundle;
92
+ /**
93
+ * Get statistics for an export bundle
94
+ *
95
+ * @param bundle - Export bundle
96
+ * @returns Statistics about bundle contents
97
+ */
98
+ export declare function getBundleStats(bundle: ExportBundle): ExportStats;
99
+ /**
100
+ * Validate export bundle structure
101
+ *
102
+ * @param bundle - Bundle to validate
103
+ * @returns Validation result with errors if any
104
+ */
105
+ export declare function validateBundle(bundle: unknown): {
106
+ valid: boolean;
107
+ errors: string[];
108
+ };
109
+ /**
110
+ * Serialize export bundle to JSON string
111
+ *
112
+ * @param bundle - Bundle to serialize
113
+ * @param pretty - Use pretty formatting (default: false)
114
+ * @returns JSON string
115
+ */
116
+ export declare function serializeBundle(bundle: ExportBundle, pretty?: boolean): string;
117
+ /**
118
+ * Deserialize export bundle from JSON string
119
+ *
120
+ * @param json - JSON string to parse
121
+ * @returns Parsed bundle
122
+ * @throws Error if JSON is invalid
123
+ */
124
+ export declare function deserializeBundle(json: string): ExportBundle;
125
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/export/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Service-level export coordination
3
+ *
4
+ * Provides high-level export API for backup and portability.
5
+ * Builds on store-level export primitives from STORAGE-005.
6
+ */
7
+ /**
8
+ * Create an export bundle
9
+ *
10
+ * Coordinates export from store with optional metadata and validation.
11
+ *
12
+ * @param store - Export store
13
+ * @param options - Export options
14
+ * @returns Export bundle with dataset and metadata
15
+ */
16
+ export function createExportBundle(store, options = {}) {
17
+ const { scope, includeRedacted = false, limit, metadata } = options;
18
+ // Export dataset from store
19
+ const dataset = store.exportDatabase({
20
+ scope,
21
+ includeRedacted,
22
+ limit,
23
+ });
24
+ // Create bundle with metadata
25
+ const bundle = {
26
+ bundleVersion: '1.0',
27
+ exportedAt: Date.now(),
28
+ dataset,
29
+ };
30
+ if (metadata) {
31
+ bundle.metadata = metadata;
32
+ }
33
+ return bundle;
34
+ }
35
+ /**
36
+ * Get statistics for an export bundle
37
+ *
38
+ * @param bundle - Export bundle
39
+ * @returns Statistics about bundle contents
40
+ */
41
+ export function getBundleStats(bundle) {
42
+ const { dataset } = bundle;
43
+ // Estimate size (JSON string length approximation)
44
+ const totalSize = JSON.stringify(bundle).length;
45
+ return {
46
+ observations: dataset.observations.length,
47
+ capsules: dataset.capsules.length,
48
+ summaries: dataset.summaries.length,
49
+ pins: dataset.pins.length,
50
+ totalSize,
51
+ };
52
+ }
53
+ /**
54
+ * Validate export bundle structure
55
+ *
56
+ * @param bundle - Bundle to validate
57
+ * @returns Validation result with errors if any
58
+ */
59
+ export function validateBundle(bundle) {
60
+ const errors = [];
61
+ if (!bundle || typeof bundle !== 'object') {
62
+ return { valid: false, errors: ['Bundle must be an object'] };
63
+ }
64
+ const b = bundle;
65
+ // Check bundle version
66
+ if (!b.bundleVersion || typeof b.bundleVersion !== 'string') {
67
+ errors.push('Missing or invalid bundleVersion');
68
+ }
69
+ else if (b.bundleVersion !== '1.0') {
70
+ errors.push(`Unsupported bundle version: ${b.bundleVersion}`);
71
+ }
72
+ // Check exportedAt
73
+ if (!b.exportedAt || typeof b.exportedAt !== 'number') {
74
+ errors.push('Missing or invalid exportedAt');
75
+ }
76
+ // Check dataset
77
+ if (!b.dataset || typeof b.dataset !== 'object') {
78
+ errors.push('Missing or invalid dataset');
79
+ }
80
+ else {
81
+ const ds = b.dataset;
82
+ if (!ds.version || typeof ds.version !== 'string') {
83
+ errors.push('Missing or invalid dataset.version');
84
+ }
85
+ if (!Array.isArray(ds.observations)) {
86
+ errors.push('dataset.observations must be an array');
87
+ }
88
+ if (!Array.isArray(ds.capsules)) {
89
+ errors.push('dataset.capsules must be an array');
90
+ }
91
+ if (!Array.isArray(ds.summaries)) {
92
+ errors.push('dataset.summaries must be an array');
93
+ }
94
+ if (!Array.isArray(ds.pins)) {
95
+ errors.push('dataset.pins must be an array');
96
+ }
97
+ }
98
+ return {
99
+ valid: errors.length === 0,
100
+ errors,
101
+ };
102
+ }
103
+ /**
104
+ * Serialize export bundle to JSON string
105
+ *
106
+ * @param bundle - Bundle to serialize
107
+ * @param pretty - Use pretty formatting (default: false)
108
+ * @returns JSON string
109
+ */
110
+ export function serializeBundle(bundle, pretty = false) {
111
+ return JSON.stringify(bundle, null, pretty ? 2 : 0);
112
+ }
113
+ /**
114
+ * Deserialize export bundle from JSON string
115
+ *
116
+ * @param json - JSON string to parse
117
+ * @returns Parsed bundle
118
+ * @throws Error if JSON is invalid
119
+ */
120
+ export function deserializeBundle(json) {
121
+ try {
122
+ const bundle = JSON.parse(json);
123
+ const validation = validateBundle(bundle);
124
+ if (!validation.valid) {
125
+ throw new Error(`Invalid bundle: ${validation.errors.join(', ')}`);
126
+ }
127
+ return bundle;
128
+ }
129
+ catch (err) {
130
+ if (err instanceof SyntaxError) {
131
+ throw new Error(`Invalid JSON: ${err.message}`);
132
+ }
133
+ throw err;
134
+ }
135
+ }
136
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/export/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Export/import coordination
3
+ *
4
+ * Service-level APIs for backup, portability, and data migration.
5
+ */
6
+ export * from './bundle.js';
7
+ export * from './restore.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Export/import coordination
3
+ *
4
+ * Service-level APIs for backup, portability, and data migration.
5
+ */
6
+ export * from './bundle.js';
7
+ export * from './restore.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Service-level import coordination
3
+ *
4
+ * Provides high-level import API for restoring from export bundles.
5
+ */
6
+ import type { ExportBundle } from './bundle.js';
7
+ import type { ScopeIds, Observation, Capsule, Summary, Pin } from '../types/index.js';
8
+ /**
9
+ * Store interface for import operations
10
+ */
11
+ export interface ImportStore {
12
+ /**
13
+ * Import dataset into database
14
+ */
15
+ importDatabase(dataset: {
16
+ version: string;
17
+ exportedAt: number;
18
+ scope?: Partial<ScopeIds>;
19
+ observations: Observation[];
20
+ capsules: Capsule[];
21
+ summaries: Summary[];
22
+ pins: Pin[];
23
+ }): {
24
+ observations: number;
25
+ capsules: number;
26
+ summaries: number;
27
+ pins: number;
28
+ errors: string[];
29
+ };
30
+ }
31
+ /**
32
+ * Import options
33
+ */
34
+ export interface ImportOptions {
35
+ /** Skip validation (default: false) */
36
+ skipValidation?: boolean;
37
+ /** Dry run (validate only, don't import) */
38
+ dryRun?: boolean;
39
+ }
40
+ /**
41
+ * Import result
42
+ */
43
+ export interface ImportResult {
44
+ /** Number of observations imported */
45
+ observations: number;
46
+ /** Number of capsules imported */
47
+ capsules: number;
48
+ /** Number of summaries imported */
49
+ summaries: number;
50
+ /** Number of pins imported */
51
+ pins: number;
52
+ /** Any errors encountered */
53
+ errors: string[];
54
+ /** Whether this was a dry run */
55
+ dryRun: boolean;
56
+ }
57
+ /**
58
+ * Restore from export bundle
59
+ *
60
+ * Coordinates import with validation and error handling.
61
+ *
62
+ * @param store - Import store
63
+ * @param bundle - Export bundle to restore
64
+ * @param options - Import options
65
+ * @returns Import result with counts and errors
66
+ */
67
+ export declare function restoreFromBundle(store: ImportStore, bundle: ExportBundle, options?: ImportOptions): ImportResult;
68
+ /**
69
+ * Merge multiple export bundles
70
+ *
71
+ * Combines datasets from multiple bundles into a single bundle.
72
+ * Useful for consolidating exports from different sources.
73
+ *
74
+ * @param bundles - Bundles to merge
75
+ * @param metadata - Optional metadata for merged bundle
76
+ * @returns Merged bundle
77
+ */
78
+ export declare function mergeBundles(bundles: ExportBundle[], metadata?: {
79
+ description?: string;
80
+ tags?: string[];
81
+ }): ExportBundle;
82
+ /**
83
+ * Compare two bundles for differences
84
+ *
85
+ * @param bundle1 - First bundle
86
+ * @param bundle2 - Second bundle
87
+ * @returns Difference summary
88
+ */
89
+ export declare function compareBundles(bundle1: ExportBundle, bundle2: ExportBundle): {
90
+ observations: {
91
+ added: number;
92
+ removed: number;
93
+ common: number;
94
+ };
95
+ capsules: {
96
+ added: number;
97
+ removed: number;
98
+ common: number;
99
+ };
100
+ summaries: {
101
+ added: number;
102
+ removed: number;
103
+ common: number;
104
+ };
105
+ pins: {
106
+ added: number;
107
+ removed: number;
108
+ common: number;
109
+ };
110
+ };
111
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/export/restore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1B,YAAY,EAAE,WAAW,EAAE,CAAC;QAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,IAAI,EAAE,GAAG,EAAE,CAAC;KACb,GAAG;QACF,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAqCd;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACnD,YAAY,CAgDd;AA0BD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB;IACD,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D,CAqBA"}