@remnic/core 1.1.15 → 1.1.16

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 (46) hide show
  1. package/dist/access-cli.js +2 -2
  2. package/dist/access-http.d.ts +1 -1
  3. package/dist/access-http.js +5 -5
  4. package/dist/access-mcp.d.ts +1 -1
  5. package/dist/access-mcp.js +4 -4
  6. package/dist/access-schema.d.ts +17 -3
  7. package/dist/access-schema.js +3 -1
  8. package/dist/{access-service-BCMine1s.d.ts → access-service-DZXc7qwR.d.ts} +11 -1
  9. package/dist/access-service.d.ts +1 -1
  10. package/dist/access-service.js +2 -2
  11. package/dist/{chunk-GSP6ZKOY.js → chunk-2OZ6GP27.js} +81 -18
  12. package/dist/chunk-2OZ6GP27.js.map +1 -0
  13. package/dist/{chunk-VWFIQOTJ.js → chunk-66H2DZYB.js} +8 -1
  14. package/dist/chunk-66H2DZYB.js.map +1 -0
  15. package/dist/{chunk-ZYRMKWVW.js → chunk-HJILHQOR.js} +4 -4
  16. package/dist/{chunk-HJ2WMBFB.js → chunk-MTYLGYOQ.js} +15 -4
  17. package/dist/chunk-MTYLGYOQ.js.map +1 -0
  18. package/dist/{chunk-BNATB54A.js → chunk-SK42SSAN.js} +3 -3
  19. package/dist/{chunk-5D2G67ZQ.js → chunk-Y2YBRCEF.js} +29 -3
  20. package/dist/chunk-Y2YBRCEF.js.map +1 -0
  21. package/dist/{cli-B71zQ6XK.d.ts → cli-kVwab1_L.d.ts} +1 -1
  22. package/dist/cli.d.ts +2 -2
  23. package/dist/cli.js +6 -6
  24. package/dist/index.d.ts +4 -4
  25. package/dist/index.js +8 -6
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  28. package/dist/offline-sync.d.ts +10 -1
  29. package/dist/offline-sync.js +3 -1
  30. package/dist/schemas.d.ts +22 -22
  31. package/dist/transfer/types.d.ts +12 -12
  32. package/package.json +1 -1
  33. package/src/access-http.test.ts +73 -0
  34. package/src/access-http.ts +15 -0
  35. package/src/access-schema.ts +12 -0
  36. package/src/access-service-namespace.test.ts +64 -1
  37. package/src/access-service.ts +44 -0
  38. package/src/index.ts +1 -0
  39. package/src/offline-sync.test.ts +125 -0
  40. package/src/offline-sync.ts +107 -18
  41. package/dist/chunk-5D2G67ZQ.js.map +0 -1
  42. package/dist/chunk-GSP6ZKOY.js.map +0 -1
  43. package/dist/chunk-HJ2WMBFB.js.map +0 -1
  44. package/dist/chunk-VWFIQOTJ.js.map +0 -1
  45. /package/dist/{chunk-ZYRMKWVW.js.map → chunk-HJILHQOR.js.map} +0 -0
  46. /package/dist/{chunk-BNATB54A.js.map → chunk-SK42SSAN.js.map} +0 -0
@@ -135,7 +135,7 @@ import "./chunk-PVGDJXVK.js";
135
135
  import "./chunk-NGAVDO7E.js";
136
136
  import {
137
137
  EngramAccessService
138
- } from "./chunk-5D2G67ZQ.js";
138
+ } from "./chunk-Y2YBRCEF.js";
139
139
  import "./chunk-ZKSK55RC.js";
140
140
  import "./chunk-WELDCG6C.js";
141
141
  import "./chunk-ZYVPLJ4T.js";
@@ -149,7 +149,7 @@ import "./chunk-MGKYQQYF.js";
149
149
  import "./chunk-GL6I6MEQ.js";
150
150
  import "./chunk-3APJ5EVB.js";
151
151
  import "./chunk-5UM2VJ6D.js";
152
- import "./chunk-GSP6ZKOY.js";
152
+ import "./chunk-2OZ6GP27.js";
153
153
  import "./chunk-65HQPW6O.js";
154
154
  import "./chunk-EIR5VLIH.js";
155
155
  import "./chunk-PCUKNJAZ.js";
@@ -1,5 +1,5 @@
1
1
  import { IncomingMessage } from 'node:http';
2
- import { E as EngramAccessService } from './access-service-BCMine1s.js';
2
+ import { E as EngramAccessService } from './access-service-DZXc7qwR.js';
3
3
  import { ResolvedIdentity } from './adapters/types.js';
4
4
  import { AdapterRegistry } from './adapters/registry.js';
5
5
  import './storage.js';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngramAccessHttpServer
3
- } from "./chunk-HJ2WMBFB.js";
3
+ } from "./chunk-MTYLGYOQ.js";
4
4
  import "./chunk-SEDEKFYQ.js";
5
5
  import "./chunk-6FC5EGNV.js";
6
6
  import "./chunk-3Y4P7RXM.js";
@@ -8,10 +8,10 @@ import "./chunk-6LVVDPJ4.js";
8
8
  import "./chunk-7MNMYOFP.js";
9
9
  import "./chunk-FKFMOY3N.js";
10
10
  import "./chunk-FAJ7FZYM.js";
11
- import "./chunk-BNATB54A.js";
11
+ import "./chunk-SK42SSAN.js";
12
12
  import "./chunk-C5BCH4ZS.js";
13
13
  import "./chunk-IQT3XTKW.js";
14
- import "./chunk-5D2G67ZQ.js";
14
+ import "./chunk-Y2YBRCEF.js";
15
15
  import "./chunk-ZKSK55RC.js";
16
16
  import "./chunk-WELDCG6C.js";
17
17
  import "./chunk-ZYVPLJ4T.js";
@@ -25,7 +25,7 @@ import "./chunk-MGKYQQYF.js";
25
25
  import "./chunk-GL6I6MEQ.js";
26
26
  import "./chunk-3APJ5EVB.js";
27
27
  import "./chunk-5UM2VJ6D.js";
28
- import "./chunk-GSP6ZKOY.js";
28
+ import "./chunk-2OZ6GP27.js";
29
29
  import "./chunk-65HQPW6O.js";
30
30
  import "./chunk-EIR5VLIH.js";
31
31
  import "./chunk-PCUKNJAZ.js";
@@ -71,7 +71,7 @@ import "./chunk-TVVEYCNW.js";
71
71
  import "./chunk-RFYAYKTD.js";
72
72
  import "./chunk-LBLXEFWK.js";
73
73
  import "./chunk-XKECPATV.js";
74
- import "./chunk-VWFIQOTJ.js";
74
+ import "./chunk-66H2DZYB.js";
75
75
  import "./chunk-QA2ZAPBU.js";
76
76
  import "./chunk-WEHSQBFR.js";
77
77
  import "./chunk-KNKUID7G.js";
@@ -1,5 +1,5 @@
1
1
  import { Readable, Writable } from 'node:stream';
2
- import { E as EngramAccessService } from './access-service-BCMine1s.js';
2
+ import { E as EngramAccessService } from './access-service-DZXc7qwR.js';
3
3
  import './storage.js';
4
4
  import './page-versioning.js';
5
5
  import './consolidation-operator.js';
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  EngramMcpServer
3
- } from "./chunk-BNATB54A.js";
3
+ } from "./chunk-SK42SSAN.js";
4
4
  import "./chunk-C5BCH4ZS.js";
5
5
  import "./chunk-IQT3XTKW.js";
6
- import "./chunk-5D2G67ZQ.js";
6
+ import "./chunk-Y2YBRCEF.js";
7
7
  import "./chunk-ZKSK55RC.js";
8
8
  import "./chunk-WELDCG6C.js";
9
9
  import "./chunk-ZYVPLJ4T.js";
@@ -17,7 +17,7 @@ import "./chunk-MGKYQQYF.js";
17
17
  import "./chunk-GL6I6MEQ.js";
18
18
  import "./chunk-3APJ5EVB.js";
19
19
  import "./chunk-5UM2VJ6D.js";
20
- import "./chunk-GSP6ZKOY.js";
20
+ import "./chunk-2OZ6GP27.js";
21
21
  import "./chunk-65HQPW6O.js";
22
22
  import "./chunk-EIR5VLIH.js";
23
23
  import "./chunk-PCUKNJAZ.js";
@@ -63,7 +63,7 @@ import "./chunk-TVVEYCNW.js";
63
63
  import "./chunk-RFYAYKTD.js";
64
64
  import "./chunk-LBLXEFWK.js";
65
65
  import "./chunk-XKECPATV.js";
66
- import "./chunk-VWFIQOTJ.js";
66
+ import "./chunk-66H2DZYB.js";
67
67
  import "./chunk-QA2ZAPBU.js";
68
68
  import "./chunk-WEHSQBFR.js";
69
69
  import "./chunk-KNKUID7G.js";
@@ -575,6 +575,19 @@ declare const offlineSyncApplyRequestSchema: z.ZodEffects<z.ZodObject<{
575
575
  namespace?: string | undefined;
576
576
  changeset?: unknown;
577
577
  }>;
578
+ declare const offlineSyncFilesRequestSchema: z.ZodObject<{
579
+ namespace: z.ZodOptional<z.ZodString>;
580
+ includeTranscripts: z.ZodOptional<z.ZodBoolean>;
581
+ paths: z.ZodArray<z.ZodString, "many">;
582
+ }, "strip", z.ZodTypeAny, {
583
+ paths: string[];
584
+ namespace?: string | undefined;
585
+ includeTranscripts?: boolean | undefined;
586
+ }, {
587
+ paths: string[];
588
+ namespace?: string | undefined;
589
+ includeTranscripts?: boolean | undefined;
590
+ }>;
578
591
  declare const actionConfidenceRequestSchema: z.ZodObject<{
579
592
  intendedAction: z.ZodEffects<z.ZodNullable<z.ZodOptional<z.ZodString>>, string | undefined, string | null | undefined>;
580
593
  confidence: z.ZodEffects<z.ZodNullable<z.ZodOptional<z.ZodNumber>>, number | undefined, number | null | undefined>;
@@ -743,9 +756,10 @@ type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;
743
756
  type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;
744
757
  type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;
745
758
  type OfflineSyncApplyRequest = z.infer<typeof offlineSyncApplyRequestSchema>;
759
+ type OfflineSyncFilesRequest = z.infer<typeof offlineSyncFilesRequestSchema>;
746
760
  type ActionConfidenceRequest = z.infer<typeof actionConfidenceRequestSchema>;
747
- type SchemaName = "recall" | "recallExplain" | "setCodingContext" | "observe" | "memoryStore" | "suggestionSubmit" | "reviewDisposition" | "trustZonePromote" | "trustZoneDemoSeed" | "lcmSearch" | "lcmCompactionFlush" | "lcmCompactionRecord" | "daySummary" | "capsuleExport" | "capsuleImport" | "capsuleList" | "offlineSyncApply" | "actionConfidence";
748
- type SchemaTypeFor<N extends SchemaName> = N extends "recall" ? RecallRequest : N extends "recallExplain" ? RecallExplainRequest : N extends "setCodingContext" ? SetCodingContextRequest : N extends "observe" ? ObserveRequest : N extends "memoryStore" ? MemoryStoreRequest : N extends "suggestionSubmit" ? SuggestionSubmitRequest : N extends "reviewDisposition" ? ReviewDispositionRequest : N extends "trustZonePromote" ? TrustZonePromoteRequest : N extends "trustZoneDemoSeed" ? TrustZoneDemoSeedRequest : N extends "lcmSearch" ? LcmSearchRequest : N extends "lcmCompactionFlush" ? LcmCompactionFlushRequest : N extends "lcmCompactionRecord" ? LcmCompactionRecordRequest : N extends "daySummary" ? DaySummaryRequest : N extends "capsuleExport" ? CapsuleExportRequest : N extends "capsuleImport" ? CapsuleImportRequest : N extends "capsuleList" ? CapsuleListRequest : N extends "offlineSyncApply" ? OfflineSyncApplyRequest : N extends "actionConfidence" ? ActionConfidenceRequest : never;
761
+ type SchemaName = "recall" | "recallExplain" | "setCodingContext" | "observe" | "memoryStore" | "suggestionSubmit" | "reviewDisposition" | "trustZonePromote" | "trustZoneDemoSeed" | "lcmSearch" | "lcmCompactionFlush" | "lcmCompactionRecord" | "daySummary" | "capsuleExport" | "capsuleImport" | "capsuleList" | "offlineSyncFiles" | "offlineSyncApply" | "actionConfidence";
762
+ type SchemaTypeFor<N extends SchemaName> = N extends "recall" ? RecallRequest : N extends "recallExplain" ? RecallExplainRequest : N extends "setCodingContext" ? SetCodingContextRequest : N extends "observe" ? ObserveRequest : N extends "memoryStore" ? MemoryStoreRequest : N extends "suggestionSubmit" ? SuggestionSubmitRequest : N extends "reviewDisposition" ? ReviewDispositionRequest : N extends "trustZonePromote" ? TrustZonePromoteRequest : N extends "trustZoneDemoSeed" ? TrustZoneDemoSeedRequest : N extends "lcmSearch" ? LcmSearchRequest : N extends "lcmCompactionFlush" ? LcmCompactionFlushRequest : N extends "lcmCompactionRecord" ? LcmCompactionRecordRequest : N extends "daySummary" ? DaySummaryRequest : N extends "capsuleExport" ? CapsuleExportRequest : N extends "capsuleImport" ? CapsuleImportRequest : N extends "capsuleList" ? CapsuleListRequest : N extends "offlineSyncFiles" ? OfflineSyncFilesRequest : N extends "offlineSyncApply" ? OfflineSyncApplyRequest : N extends "actionConfidence" ? ActionConfidenceRequest : never;
749
763
  /**
750
764
  * Validate a request body against the named schema.
751
765
  * Returns `{ success: true, data }` on pass or
@@ -759,4 +773,4 @@ declare function validateRequest<T = unknown>(schemaName: SchemaName, body: unkn
759
773
  error: SchemaValidationError;
760
774
  };
761
775
 
762
- export { type ActionConfidenceRequest, type CapsuleExportRequest, type CapsuleImportRequest, type CapsuleListRequest, type DaySummaryRequest, type LcmCompactionFlushRequest, type LcmCompactionRecordRequest, type LcmSearchRequest, type MemoryStoreRequest, type ObserveRequest, type OfflineSyncApplyRequest, type RecallExplainRequest, type RecallRequest, type ReviewDispositionRequest, type SchemaName, type SchemaTypeFor, type SchemaValidationError, type SetCodingContextRequest, type SuggestionSubmitRequest, type TrustZoneDemoSeedRequest, type TrustZonePromoteRequest, actionConfidenceRequestSchema, capsuleExportRequestSchema, capsuleImportRequestSchema, capsuleListRequestSchema, codingContextSchema, daySummaryRequestSchema, formatZodError, lcmCompactionFlushRequestSchema, lcmCompactionRecordRequestSchema, lcmSearchRequestSchema, memoryStoreRequestSchema, observeRequestSchema, offlineSyncApplyRequestSchema, recallDisclosureSchema, recallExplainRequestSchema, recallRequestSchema, reviewDispositionRequestSchema, setCodingContextRequestSchema, suggestionSubmitRequestSchema, tagMatchSchema, trustZoneDemoSeedRequestSchema, trustZonePromoteRequestSchema, validateRequest };
776
+ export { type ActionConfidenceRequest, type CapsuleExportRequest, type CapsuleImportRequest, type CapsuleListRequest, type DaySummaryRequest, type LcmCompactionFlushRequest, type LcmCompactionRecordRequest, type LcmSearchRequest, type MemoryStoreRequest, type ObserveRequest, type OfflineSyncApplyRequest, type OfflineSyncFilesRequest, type RecallExplainRequest, type RecallRequest, type ReviewDispositionRequest, type SchemaName, type SchemaTypeFor, type SchemaValidationError, type SetCodingContextRequest, type SuggestionSubmitRequest, type TrustZoneDemoSeedRequest, type TrustZonePromoteRequest, actionConfidenceRequestSchema, capsuleExportRequestSchema, capsuleImportRequestSchema, capsuleListRequestSchema, codingContextSchema, daySummaryRequestSchema, formatZodError, lcmCompactionFlushRequestSchema, lcmCompactionRecordRequestSchema, lcmSearchRequestSchema, memoryStoreRequestSchema, observeRequestSchema, offlineSyncApplyRequestSchema, offlineSyncFilesRequestSchema, recallDisclosureSchema, recallExplainRequestSchema, recallRequestSchema, reviewDispositionRequestSchema, setCodingContextRequestSchema, suggestionSubmitRequestSchema, tagMatchSchema, trustZoneDemoSeedRequestSchema, trustZonePromoteRequestSchema, validateRequest };
@@ -12,6 +12,7 @@ import {
12
12
  memoryStoreRequestSchema,
13
13
  observeRequestSchema,
14
14
  offlineSyncApplyRequestSchema,
15
+ offlineSyncFilesRequestSchema,
15
16
  recallDisclosureSchema,
16
17
  recallExplainRequestSchema,
17
18
  recallRequestSchema,
@@ -22,7 +23,7 @@ import {
22
23
  trustZoneDemoSeedRequestSchema,
23
24
  trustZonePromoteRequestSchema,
24
25
  validateRequest
25
- } from "./chunk-VWFIQOTJ.js";
26
+ } from "./chunk-66H2DZYB.js";
26
27
  import "./chunk-QA2ZAPBU.js";
27
28
  import "./chunk-WEHSQBFR.js";
28
29
  import "./chunk-KNKUID7G.js";
@@ -51,6 +52,7 @@ export {
51
52
  memoryStoreRequestSchema,
52
53
  observeRequestSchema,
53
54
  offlineSyncApplyRequestSchema,
55
+ offlineSyncFilesRequestSchema,
54
56
  recallDisclosureSchema,
55
57
  recallExplainRequestSchema,
56
58
  recallRequestSchema,
@@ -680,6 +680,12 @@ interface EngramAccessOfflineSyncSnapshotRequest {
680
680
  includeTranscripts?: boolean;
681
681
  includeContent?: boolean;
682
682
  }
683
+ interface EngramAccessOfflineSyncFilesRequest {
684
+ namespace?: string;
685
+ principal?: string;
686
+ includeTranscripts?: boolean;
687
+ paths: string[];
688
+ }
683
689
  interface EngramAccessOfflineSyncApplyRequest {
684
690
  namespace?: string;
685
691
  principal?: string;
@@ -688,6 +694,9 @@ interface EngramAccessOfflineSyncApplyRequest {
688
694
  interface EngramAccessOfflineSyncSnapshotResponse extends OfflineSyncSnapshot {
689
695
  namespace: string;
690
696
  }
697
+ interface EngramAccessOfflineSyncFilesResponse extends OfflineSyncSnapshot {
698
+ namespace: string;
699
+ }
691
700
  interface EngramAccessOfflineSyncApplyResponse extends OfflineSyncApplyChangesetResult {
692
701
  namespace: string;
693
702
  }
@@ -1535,6 +1544,7 @@ declare class EngramAccessService {
1535
1544
  principal?: string;
1536
1545
  }): Promise<EngramAccessCapsuleListResponse>;
1537
1546
  offlineSyncSnapshot(options?: EngramAccessOfflineSyncSnapshotRequest): Promise<EngramAccessOfflineSyncSnapshotResponse>;
1547
+ offlineSyncFiles(options: EngramAccessOfflineSyncFilesRequest): Promise<EngramAccessOfflineSyncFilesResponse>;
1538
1548
  offlineSyncApply(options: EngramAccessOfflineSyncApplyRequest): Promise<EngramAccessOfflineSyncApplyResponse>;
1539
1549
  /**
1540
1550
  * Return per-phase Dreams telemetry for the last N hours (default 24).
@@ -1559,4 +1569,4 @@ declare class EngramAccessService {
1559
1569
  }): Promise<DreamsRunResult>;
1560
1570
  }
1561
1571
 
1562
- export { type EngramAccessReviewDispositionResponse as $, type EngramAccessLcmCompactionFlushResponse as A, type EngramAccessLcmCompactionRecordRequest as B, type EngramAccessLcmCompactionRecordResponse as C, type EngramAccessLcmSearchRequest as D, EngramAccessService as E, type EngramAccessLcmSearchResponse as F, type EngramAccessLcmStatusResponse as G, type EngramAccessMaintenanceResponse as H, type EngramAccessMemoryBrowseRequest as I, type EngramAccessMemoryBrowseResponse as J, type EngramAccessMemoryRecord as K, type EngramAccessMemoryResponse as L, type EngramAccessMemoryStoreRequest as M, type EngramAccessMemorySummary as N, type EngramAccessObserveMessage as O, type PeerInteractionLogEntry as P, type EngramAccessObserveRequest as Q, type EngramAccessObserveResponse as R, type EngramAccessOfflineSyncApplyRequest as S, type EngramAccessOfflineSyncApplyResponse as T, type EngramAccessOfflineSyncSnapshotRequest as U, type EngramAccessOfflineSyncSnapshotResponse as V, type EngramAccessQualityResponse as W, type EngramAccessRecallExplainRequest as X, type EngramAccessRecallExplainResponse as Y, type EngramAccessRecallRequest as Z, type EngramAccessReviewDispositionRequest as _, type EngramAccessRecallResponse as a, type EngramAccessReviewQueueResponse as a0, type EngramAccessSetCodingContextRequest as a1, type EngramAccessSuggestionSubmitRequest as a2, type EngramAccessTimelineResponse as a3, type EngramAccessTrustZoneBrowseRequest as a4, type EngramAccessTrustZoneBrowseResponse as a5, type EngramAccessTrustZoneDemoSeedRequest as a6, type EngramAccessTrustZoneDemoSeedResponse as a7, type EngramAccessTrustZonePromoteRequest as a8, type EngramAccessTrustZonePromoteResponse as a9, type EngramAccessTrustZoneRecordSummary as aa, type EngramAccessTrustZoneStatusResponse as ab, type EngramAccessWriteEnvelope as ac, type EngramAccessWriteResponse as ad, shapeMemorySummary as ae, type Peer as b, type PeerProfile as c, EngramAccessInputError as d, PEER_ID_MAX_LENGTH as e, PEER_ID_PATTERN as f, type PeerKind as g, type PeerProfileFieldProvenance as h, type ProcedureStatsConfigSnapshot as i, type ProcedureStatsRecent as j, type ProcedureStatsReport as k, type ProcedureStatusCounts as l, computeProcedureStats as m, formatProcedureStatsText as n, ENGRAM_ACCESS_WRITE_SCHEMA_VERSION as o, type EngramAccessActionConfidenceRequest as p, type EngramAccessActionConfidenceResponse as q, type EngramAccessBriefingRequest as r, type EngramAccessBriefingResponse as s, type EngramAccessCapsuleListResponse as t, type EngramAccessDaySummaryRequest as u, type EngramAccessEntityListResponse as v, type EngramAccessEntityResponse as w, type EngramAccessEntitySummary as x, type EngramAccessHealthResponse as y, type EngramAccessLcmCompactionFlushRequest as z };
1572
+ export { type EngramAccessRecallRequest as $, type EngramAccessLcmCompactionFlushResponse as A, type EngramAccessLcmCompactionRecordRequest as B, type EngramAccessLcmCompactionRecordResponse as C, type EngramAccessLcmSearchRequest as D, EngramAccessService as E, type EngramAccessLcmSearchResponse as F, type EngramAccessLcmStatusResponse as G, type EngramAccessMaintenanceResponse as H, type EngramAccessMemoryBrowseRequest as I, type EngramAccessMemoryBrowseResponse as J, type EngramAccessMemoryRecord as K, type EngramAccessMemoryResponse as L, type EngramAccessMemoryStoreRequest as M, type EngramAccessMemorySummary as N, type EngramAccessObserveMessage as O, type PeerInteractionLogEntry as P, type EngramAccessObserveRequest as Q, type EngramAccessObserveResponse as R, type EngramAccessOfflineSyncApplyRequest as S, type EngramAccessOfflineSyncApplyResponse as T, type EngramAccessOfflineSyncFilesRequest as U, type EngramAccessOfflineSyncFilesResponse as V, type EngramAccessOfflineSyncSnapshotRequest as W, type EngramAccessOfflineSyncSnapshotResponse as X, type EngramAccessQualityResponse as Y, type EngramAccessRecallExplainRequest as Z, type EngramAccessRecallExplainResponse as _, type EngramAccessRecallResponse as a, type EngramAccessReviewDispositionRequest as a0, type EngramAccessReviewDispositionResponse as a1, type EngramAccessReviewQueueResponse as a2, type EngramAccessSetCodingContextRequest as a3, type EngramAccessSuggestionSubmitRequest as a4, type EngramAccessTimelineResponse as a5, type EngramAccessTrustZoneBrowseRequest as a6, type EngramAccessTrustZoneBrowseResponse as a7, type EngramAccessTrustZoneDemoSeedRequest as a8, type EngramAccessTrustZoneDemoSeedResponse as a9, type EngramAccessTrustZonePromoteRequest as aa, type EngramAccessTrustZonePromoteResponse as ab, type EngramAccessTrustZoneRecordSummary as ac, type EngramAccessTrustZoneStatusResponse as ad, type EngramAccessWriteEnvelope as ae, type EngramAccessWriteResponse as af, shapeMemorySummary as ag, type Peer as b, type PeerProfile as c, EngramAccessInputError as d, PEER_ID_MAX_LENGTH as e, PEER_ID_PATTERN as f, type PeerKind as g, type PeerProfileFieldProvenance as h, type ProcedureStatsConfigSnapshot as i, type ProcedureStatsRecent as j, type ProcedureStatsReport as k, type ProcedureStatusCounts as l, computeProcedureStats as m, formatProcedureStatsText as n, ENGRAM_ACCESS_WRITE_SCHEMA_VERSION as o, type EngramAccessActionConfidenceRequest as p, type EngramAccessActionConfidenceResponse as q, type EngramAccessBriefingRequest as r, type EngramAccessBriefingResponse as s, type EngramAccessCapsuleListResponse as t, type EngramAccessDaySummaryRequest as u, type EngramAccessEntityListResponse as v, type EngramAccessEntityResponse as w, type EngramAccessEntitySummary as x, type EngramAccessHealthResponse as y, type EngramAccessLcmCompactionFlushRequest as z };
@@ -1,5 +1,5 @@
1
1
  import './storage.js';
2
- export { o as ENGRAM_ACCESS_WRITE_SCHEMA_VERSION, p as EngramAccessActionConfidenceRequest, q as EngramAccessActionConfidenceResponse, r as EngramAccessBriefingRequest, s as EngramAccessBriefingResponse, t as EngramAccessCapsuleListResponse, u as EngramAccessDaySummaryRequest, v as EngramAccessEntityListResponse, w as EngramAccessEntityResponse, x as EngramAccessEntitySummary, y as EngramAccessHealthResponse, d as EngramAccessInputError, z as EngramAccessLcmCompactionFlushRequest, A as EngramAccessLcmCompactionFlushResponse, B as EngramAccessLcmCompactionRecordRequest, C as EngramAccessLcmCompactionRecordResponse, D as EngramAccessLcmSearchRequest, F as EngramAccessLcmSearchResponse, G as EngramAccessLcmStatusResponse, H as EngramAccessMaintenanceResponse, I as EngramAccessMemoryBrowseRequest, J as EngramAccessMemoryBrowseResponse, K as EngramAccessMemoryRecord, L as EngramAccessMemoryResponse, M as EngramAccessMemoryStoreRequest, N as EngramAccessMemorySummary, O as EngramAccessObserveMessage, Q as EngramAccessObserveRequest, R as EngramAccessObserveResponse, S as EngramAccessOfflineSyncApplyRequest, T as EngramAccessOfflineSyncApplyResponse, U as EngramAccessOfflineSyncSnapshotRequest, V as EngramAccessOfflineSyncSnapshotResponse, W as EngramAccessQualityResponse, X as EngramAccessRecallExplainRequest, Y as EngramAccessRecallExplainResponse, Z as EngramAccessRecallRequest, a as EngramAccessRecallResponse, _ as EngramAccessReviewDispositionRequest, $ as EngramAccessReviewDispositionResponse, a0 as EngramAccessReviewQueueResponse, E as EngramAccessService, a1 as EngramAccessSetCodingContextRequest, a2 as EngramAccessSuggestionSubmitRequest, a3 as EngramAccessTimelineResponse, a4 as EngramAccessTrustZoneBrowseRequest, a5 as EngramAccessTrustZoneBrowseResponse, a6 as EngramAccessTrustZoneDemoSeedRequest, a7 as EngramAccessTrustZoneDemoSeedResponse, a8 as EngramAccessTrustZonePromoteRequest, a9 as EngramAccessTrustZonePromoteResponse, aa as EngramAccessTrustZoneRecordSummary, ab as EngramAccessTrustZoneStatusResponse, ac as EngramAccessWriteEnvelope, ad as EngramAccessWriteResponse, ae as shapeMemorySummary } from './access-service-BCMine1s.js';
2
+ export { o as ENGRAM_ACCESS_WRITE_SCHEMA_VERSION, p as EngramAccessActionConfidenceRequest, q as EngramAccessActionConfidenceResponse, r as EngramAccessBriefingRequest, s as EngramAccessBriefingResponse, t as EngramAccessCapsuleListResponse, u as EngramAccessDaySummaryRequest, v as EngramAccessEntityListResponse, w as EngramAccessEntityResponse, x as EngramAccessEntitySummary, y as EngramAccessHealthResponse, d as EngramAccessInputError, z as EngramAccessLcmCompactionFlushRequest, A as EngramAccessLcmCompactionFlushResponse, B as EngramAccessLcmCompactionRecordRequest, C as EngramAccessLcmCompactionRecordResponse, D as EngramAccessLcmSearchRequest, F as EngramAccessLcmSearchResponse, G as EngramAccessLcmStatusResponse, H as EngramAccessMaintenanceResponse, I as EngramAccessMemoryBrowseRequest, J as EngramAccessMemoryBrowseResponse, K as EngramAccessMemoryRecord, L as EngramAccessMemoryResponse, M as EngramAccessMemoryStoreRequest, N as EngramAccessMemorySummary, O as EngramAccessObserveMessage, Q as EngramAccessObserveRequest, R as EngramAccessObserveResponse, S as EngramAccessOfflineSyncApplyRequest, T as EngramAccessOfflineSyncApplyResponse, U as EngramAccessOfflineSyncFilesRequest, V as EngramAccessOfflineSyncFilesResponse, W as EngramAccessOfflineSyncSnapshotRequest, X as EngramAccessOfflineSyncSnapshotResponse, Y as EngramAccessQualityResponse, Z as EngramAccessRecallExplainRequest, _ as EngramAccessRecallExplainResponse, $ as EngramAccessRecallRequest, a as EngramAccessRecallResponse, a0 as EngramAccessReviewDispositionRequest, a1 as EngramAccessReviewDispositionResponse, a2 as EngramAccessReviewQueueResponse, E as EngramAccessService, a3 as EngramAccessSetCodingContextRequest, a4 as EngramAccessSuggestionSubmitRequest, a5 as EngramAccessTimelineResponse, a6 as EngramAccessTrustZoneBrowseRequest, a7 as EngramAccessTrustZoneBrowseResponse, a8 as EngramAccessTrustZoneDemoSeedRequest, a9 as EngramAccessTrustZoneDemoSeedResponse, aa as EngramAccessTrustZonePromoteRequest, ab as EngramAccessTrustZonePromoteResponse, ac as EngramAccessTrustZoneRecordSummary, ad as EngramAccessTrustZoneStatusResponse, ae as EngramAccessWriteEnvelope, af as EngramAccessWriteResponse, ag as shapeMemorySummary } from './access-service-DZXc7qwR.js';
3
3
  import './recall-explain-renderer.js';
4
4
  import './types.js';
5
5
  import './recall-audit-anomaly.js';
@@ -3,7 +3,7 @@ import {
3
3
  EngramAccessInputError,
4
4
  EngramAccessService,
5
5
  shapeMemorySummary
6
- } from "./chunk-5D2G67ZQ.js";
6
+ } from "./chunk-Y2YBRCEF.js";
7
7
  import "./chunk-ZKSK55RC.js";
8
8
  import "./chunk-WELDCG6C.js";
9
9
  import "./chunk-ZYVPLJ4T.js";
@@ -17,7 +17,7 @@ import "./chunk-MGKYQQYF.js";
17
17
  import "./chunk-GL6I6MEQ.js";
18
18
  import "./chunk-3APJ5EVB.js";
19
19
  import "./chunk-5UM2VJ6D.js";
20
- import "./chunk-GSP6ZKOY.js";
20
+ import "./chunk-2OZ6GP27.js";
21
21
  import "./chunk-65HQPW6O.js";
22
22
  import "./chunk-EIR5VLIH.js";
23
23
  import "./chunk-PCUKNJAZ.js";
@@ -264,6 +264,19 @@ function shouldExcludeRelPath(relPosix, includeTranscripts) {
264
264
  function filterBaseFilesForMode(files, includeTranscripts) {
265
265
  return files.filter((file) => !shouldExcludeRelPath(file.path, includeTranscripts));
266
266
  }
267
+ async function readOfflineSyncFileRecord(options) {
268
+ const relPath = validateArchiveRelativePath(options.relPath, "offlineSyncFile.path");
269
+ const bytes = options.readFile ? await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath }) : await readFile(options.filePath);
270
+ const digest = sha256Buffer(bytes);
271
+ const st = await stat(options.filePath);
272
+ return {
273
+ path: relPath,
274
+ sha256: digest.sha256,
275
+ bytes: digest.bytes,
276
+ mtimeMs: st.mtimeMs,
277
+ ...options.includeContent ? { contentBase64: bytes.toString("base64") } : {}
278
+ };
279
+ }
267
280
  async function buildOfflineSyncSnapshot(options) {
268
281
  const rootAbs = path.resolve(options.root);
269
282
  const root = await prepareSafeArchiveRoot(rootAbs, "buildOfflineSyncSnapshot", "root");
@@ -282,16 +295,13 @@ async function buildOfflineSyncSnapshot(options) {
282
295
  continue;
283
296
  }
284
297
  if (!entry.isFile()) continue;
285
- const bytes = options.readFile ? await options.readFile({ root: root.abs, path: relPosix, filePath: abs }) : await readFile(abs);
286
- const digest = sha256Buffer(bytes);
287
- const st = await stat(abs);
288
- files.push({
289
- path: validateArchiveRelativePath(relPosix, "buildOfflineSyncSnapshot"),
290
- sha256: digest.sha256,
291
- bytes: digest.bytes,
292
- mtimeMs: st.mtimeMs,
293
- ...options.includeContent === true ? { contentBase64: bytes.toString("base64") } : {}
294
- });
298
+ files.push(await readOfflineSyncFileRecord({
299
+ root,
300
+ relPath: relPosix,
301
+ filePath: abs,
302
+ includeContent: options.includeContent === true,
303
+ readFile: options.readFile
304
+ }));
295
305
  }
296
306
  }
297
307
  await walk(root.abs);
@@ -304,6 +314,42 @@ async function buildOfflineSyncSnapshot(options) {
304
314
  files: files.sort(compareByPath)
305
315
  };
306
316
  }
317
+ async function buildOfflineSyncSnapshotForPaths(options) {
318
+ const rootAbs = path.resolve(options.root);
319
+ const root = await prepareSafeArchiveRoot(rootAbs, "buildOfflineSyncSnapshotForPaths", "root");
320
+ const includeTranscripts = options.includeTranscripts !== false;
321
+ const files = [];
322
+ const seen = /* @__PURE__ */ new Set();
323
+ for (const rawPath of options.paths) {
324
+ const relPath = normalizeRelativePath(rawPath, "paths[]");
325
+ if (seen.has(relPath)) continue;
326
+ seen.add(relPath);
327
+ if (shouldExcludeRelPath(relPath, includeTranscripts)) {
328
+ throw new Error(`offline sync snapshot path is excluded: ${relPath}`);
329
+ }
330
+ const filePath = await resolveSafeArchiveTarget(root, relPath);
331
+ const st = await lstat(filePath).catch((error) => {
332
+ if (error.code === "ENOENT") return null;
333
+ throw error;
334
+ });
335
+ if (!st || st.isSymbolicLink() || !st.isFile()) continue;
336
+ files.push(await readOfflineSyncFileRecord({
337
+ root,
338
+ relPath,
339
+ filePath,
340
+ includeContent: options.includeContent === true,
341
+ readFile: options.readFile
342
+ }));
343
+ }
344
+ return {
345
+ format: OFFLINE_SYNC_SNAPSHOT_FORMAT,
346
+ schemaVersion: 1,
347
+ createdAt: (options.now ?? /* @__PURE__ */ new Date()).toISOString(),
348
+ sourceId: normalizeSourceId(options.sourceId, "sourceId"),
349
+ includeTranscripts,
350
+ files: files.sort(compareByPath)
351
+ };
352
+ }
307
353
  async function buildOfflineSyncChangeset(options) {
308
354
  const includeTranscripts = options.includeTranscripts !== false;
309
355
  const base = byPath(filterBaseFilesForMode(
@@ -313,7 +359,7 @@ async function buildOfflineSyncChangeset(options) {
313
359
  const current = await buildOfflineSyncSnapshot({
314
360
  root: options.root,
315
361
  sourceId: options.sourceId,
316
- includeContent: true,
362
+ includeContent: false,
317
363
  includeTranscripts,
318
364
  now: options.now,
319
365
  readFile: options.readFile
@@ -324,11 +370,24 @@ async function buildOfflineSyncChangeset(options) {
324
370
  const baseEntry = base.get(relPath);
325
371
  const currentEntry = currentMap.get(relPath);
326
372
  if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {
373
+ const file = await buildOfflineSyncSnapshotForPaths({
374
+ root: options.root,
375
+ sourceId: options.sourceId,
376
+ paths: [relPath],
377
+ includeContent: true,
378
+ includeTranscripts,
379
+ now: options.now,
380
+ readFile: options.readFile
381
+ });
382
+ const record = file.files[0];
383
+ if (!record || typeof record.contentBase64 !== "string" || record.sha256 !== currentEntry.sha256) {
384
+ throw new Error(`offline sync file changed while building changeset: ${relPath}`);
385
+ }
327
386
  changes.push({
328
387
  type: "upsert",
329
388
  path: relPath,
330
389
  ...baseEntry ? { baseSha256: baseEntry.sha256 } : {},
331
- file: currentEntry
390
+ file: record
332
391
  });
333
392
  continue;
334
393
  }
@@ -359,13 +418,15 @@ function summarizeOfflineSyncChangeset(changeset) {
359
418
  };
360
419
  }
361
420
  async function applyOfflineSyncSnapshot(options) {
362
- const snapshot = normalizeOfflineSyncSnapshot(options.snapshot, { requireContent: true });
421
+ const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);
363
422
  const baseMap = byPath(filterBaseFilesForMode(
364
423
  normalizeFileStates(options.baseFiles),
365
424
  snapshot.includeTranscripts
366
425
  ));
367
426
  const incomingMap = byPath(snapshot.files);
368
- const incomingBuffers = verifyRecordContents(snapshot.files, "offline sync snapshot");
427
+ const incomingBuffers = verifyRecordContents(snapshot.files, "offline sync snapshot", {
428
+ requireContent: false
429
+ });
369
430
  const root = await ensureSyncRoot(options.root, "applyOfflineSyncSnapshot");
370
431
  const current = await buildOfflineSyncSnapshot({
371
432
  root: root.abs,
@@ -404,7 +465,7 @@ async function applyOfflineSyncSnapshot(options) {
404
465
  reason: "local_deleted_remote_modified",
405
466
  baseSha256: base.sha256,
406
467
  incomingSha256: incoming.sha256,
407
- incomingBuffer: incomingBuffers.get(relPath),
468
+ incomingBuffer: options.writeConflictCopies === false ? incomingBuffers.get(relPath) : requiredBuffer(incomingBuffers, relPath),
408
469
  writeConflictCopies: options.writeConflictCopies !== false,
409
470
  sourceId: snapshot.sourceId,
410
471
  writeFile: options.writeFile
@@ -437,7 +498,7 @@ async function applyOfflineSyncSnapshot(options) {
437
498
  baseSha256: base?.sha256,
438
499
  localSha256: currentEntry?.sha256,
439
500
  incomingSha256: incoming.sha256,
440
- incomingBuffer: incomingBuffers.get(relPath),
501
+ incomingBuffer: options.writeConflictCopies === false ? incomingBuffers.get(relPath) : requiredBuffer(incomingBuffers, relPath),
441
502
  writeConflictCopies: options.writeConflictCopies !== false,
442
503
  sourceId: snapshot.sourceId,
443
504
  writeFile: options.writeFile
@@ -575,10 +636,11 @@ async function applyOfflineSyncChangeset(options) {
575
636
  currentFiles: [...currentMap.values()].sort(compareByPath)
576
637
  };
577
638
  }
578
- function verifyRecordContents(records, context) {
639
+ function verifyRecordContents(records, context, options = {}) {
579
640
  const buffers = /* @__PURE__ */ new Map();
580
641
  for (const record of records) {
581
642
  if (typeof record.contentBase64 !== "string") {
643
+ if (options.requireContent === false) continue;
582
644
  throw new Error(`${context}: contentBase64 is required for ${record.path}`);
583
645
  }
584
646
  const buffer = Buffer.from(record.contentBase64, "base64");
@@ -755,6 +817,7 @@ export {
755
817
  normalizeOfflineSyncSnapshot,
756
818
  normalizeOfflineSyncChangeset,
757
819
  buildOfflineSyncSnapshot,
820
+ buildOfflineSyncSnapshotForPaths,
758
821
  buildOfflineSyncChangeset,
759
822
  summarizeOfflineSyncChangeset,
760
823
  applyOfflineSyncSnapshot,
@@ -766,4 +829,4 @@ export {
766
829
  normalizeOfflineSyncState,
767
830
  fileStatesFromSnapshot
768
831
  };
769
- //# sourceMappingURL=chunk-GSP6ZKOY.js.map
832
+ //# sourceMappingURL=chunk-2OZ6GP27.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline-sync.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n lstat,\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n DEFAULT_TRANSFER_EXCLUDE_DIRS,\n} from \"./transfer/exclusions.js\";\nimport {\n prepareSafeArchiveRoot,\n resolveSafeArchiveTarget,\n sha256Bytes,\n validateArchiveRelativePath,\n type SafeArchiveRoot,\n} from \"./transfer/fs-utils.js\";\nimport { parseFlexibleIsoTimestamp } from \"./utils/iso-timestamp.js\";\n\nexport const OFFLINE_SYNC_SNAPSHOT_FORMAT = \"remnic.offline-sync.snapshot.v1\";\nexport const OFFLINE_SYNC_CHANGESET_FORMAT = \"remnic.offline-sync.changeset.v1\";\nexport const OFFLINE_SYNC_STATE_VERSION = 1;\n\nexport interface OfflineSyncFileState {\n path: string;\n sha256: string;\n /** Byte length of the transferable content, after any readFile hook such as secure-store decryption. */\n bytes: number;\n mtimeMs: number;\n}\n\nexport interface OfflineSyncFileRecord extends OfflineSyncFileState {\n contentBase64?: string;\n}\n\nexport interface OfflineSyncSnapshot {\n format: typeof OFFLINE_SYNC_SNAPSHOT_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n files: OfflineSyncFileRecord[];\n}\n\nexport type OfflineSyncChange =\n | {\n type: \"upsert\";\n path: string;\n baseSha256?: string;\n file: OfflineSyncFileRecord & { contentBase64: string };\n }\n | {\n type: \"delete\";\n path: string;\n baseSha256: string;\n };\n\nexport interface OfflineSyncChangeset {\n format: typeof OFFLINE_SYNC_CHANGESET_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n changes: OfflineSyncChange[];\n}\n\nexport interface OfflineSyncState {\n version: typeof OFFLINE_SYNC_STATE_VERSION;\n remoteId: string;\n namespace?: string;\n includeTranscripts: boolean;\n lastSyncedAt: string;\n baseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncConflict {\n path: string;\n reason:\n | \"both_modified\"\n | \"local_deleted_remote_modified\"\n | \"local_modified_remote_deleted\"\n | \"remote_exists_for_local_create\"\n | \"remote_changed_for_local_update\"\n | \"remote_deleted_for_local_update\"\n | \"remote_changed_for_local_delete\";\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n conflictPath?: string;\n}\n\nexport interface OfflineSyncApplySnapshotResult {\n upserted: number;\n deleted: number;\n skipped: number;\n pendingLocal: number;\n conflicts: OfflineSyncConflict[];\n nextBaseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncApplyChangesetResult {\n appliedUpserts: number;\n appliedDeletes: number;\n skipped: number;\n conflicts: OfflineSyncConflict[];\n currentFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncChangesetSummary {\n upserts: number;\n deletes: number;\n total: number;\n}\n\nexport interface OfflineSyncFileTarget {\n root: string;\n path: string;\n filePath: string;\n}\n\nexport interface OfflineSyncFileWriteTarget extends OfflineSyncFileTarget {\n content: Buffer;\n}\n\ninterface OfflineSyncFileRecordOptions {\n root: SafeArchiveRoot;\n relPath: string;\n filePath: string;\n includeContent: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}\n\nconst SYNC_INTERNAL_DIR = \".offline-sync\";\nconst EXCLUDED_FILE_NAMES = new Set([\n \".sync-state.json\",\n]);\n\nconst EXCLUDED_REL_PATHS = new Set([\n \"state/fact-hashes.ready\",\n \"state/fact-hashes.txt\",\n]);\n\nconst EXCLUDED_FILE_PREFIXES = [\n \".remnic-sync.\",\n \".remnic-sync-state.\",\n];\n\nfunction hashText(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction sha256Buffer(buffer: Buffer): { sha256: string; bytes: number } {\n return sha256Bytes(buffer);\n}\n\nfunction compareByPath<T extends { path: string }>(left: T, right: T): number {\n return left.path.localeCompare(right.path);\n}\n\nfunction assertSha256(value: unknown, field: string): string {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/i.test(value)) {\n throw new Error(`${field} must be a 64-character sha256 hex string`);\n }\n return value.toLowerCase();\n}\n\nfunction assertNonNegativeInteger(value: unknown, field: string): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n !Number.isInteger(value) ||\n value < 0\n ) {\n throw new Error(`${field} must be a non-negative integer`);\n }\n return value;\n}\n\nfunction assertNonNegativeFinite(value: unknown, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative finite number`);\n }\n return value;\n}\n\nfunction assertBoolean(value: unknown, field: string): boolean {\n if (typeof value !== \"boolean\") {\n throw new Error(`${field} must be a boolean`);\n }\n return value;\n}\n\nfunction normalizeSourceId(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.length > 512) {\n throw new Error(`${field} must be a non-empty string no longer than 512 characters`);\n }\n return value.trim();\n}\n\nfunction normalizeFileState(input: unknown, fieldPrefix: string): OfflineSyncFileState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(`${fieldPrefix} must be an object`);\n }\n const obj = input as Record<string, unknown>;\n const relPath = normalizeRelativePath(obj.path, `${fieldPrefix}.path`);\n return {\n path: relPath,\n sha256: assertSha256(obj.sha256, `${fieldPrefix}.sha256`),\n bytes: assertNonNegativeInteger(obj.bytes, `${fieldPrefix}.bytes`),\n mtimeMs: assertNonNegativeFinite(obj.mtimeMs, `${fieldPrefix}.mtimeMs`),\n };\n}\n\nfunction normalizeFileRecord(\n input: unknown,\n fieldPrefix: string,\n requireContent: boolean,\n): OfflineSyncFileRecord {\n const state = normalizeFileState(input, fieldPrefix);\n const obj = input as Record<string, unknown>;\n const contentBase64 = obj.contentBase64;\n if (requireContent && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 is required`);\n }\n if (contentBase64 !== undefined && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 must be a base64 string`);\n }\n return {\n ...state,\n ...(contentBase64 !== undefined ? { contentBase64 } : {}),\n };\n}\n\nfunction normalizeFileStates(input: readonly unknown[] | undefined): OfflineSyncFileState[] {\n if (!input) return [];\n if (!Array.isArray(input)) {\n throw new Error(\"baseFiles must be an array\");\n }\n return input.map((entry, index) => normalizeFileState(entry, `baseFiles[${index}]`));\n}\n\nexport function normalizeOfflineSyncSnapshot(\n input: unknown,\n options: { requireContent?: boolean } = {},\n): OfflineSyncSnapshot {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync snapshot must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_SNAPSHOT_FORMAT) {\n throw new Error(`offline sync snapshot format must be ${OFFLINE_SYNC_SNAPSHOT_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync snapshot schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.files)) {\n throw new Error(\"offline sync snapshot files must be an array\");\n }\n const files = obj.files\n .map((entry, index) =>\n normalizeFileRecord(entry, `files[${index}]`, options.requireContent === true))\n .sort(compareByPath);\n assertUniquePaths(files, \"offline sync snapshot\");\n if (!includeTranscripts) {\n const transcriptPath = files.find((file) => file.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync snapshot includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = files.find((file) => shouldExcludeRelPath(file.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync snapshot contains excluded path: ${excludedPath}`);\n }\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n files,\n };\n}\n\nexport function normalizeOfflineSyncChangeset(input: unknown): OfflineSyncChangeset {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync changeset must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_CHANGESET_FORMAT) {\n throw new Error(`offline sync changeset format must be ${OFFLINE_SYNC_CHANGESET_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync changeset schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.changes)) {\n throw new Error(\"offline sync changeset changes must be an array\");\n }\n const changes = obj.changes.map((entry, index): OfflineSyncChange => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`changes[${index}] must be an object`);\n }\n const change = entry as Record<string, unknown>;\n const type = change.type;\n const relPath = normalizeRelativePath(change.path, `changes[${index}].path`);\n if (type === \"upsert\") {\n const file = normalizeFileRecord(\n change.file,\n `changes[${index}].file`,\n true,\n ) as OfflineSyncFileRecord & { contentBase64: string };\n if (file.path !== relPath) {\n throw new Error(`changes[${index}].file.path must match changes[${index}].path`);\n }\n const baseSha256 =\n change.baseSha256 === undefined\n ? undefined\n : assertSha256(change.baseSha256, `changes[${index}].baseSha256`);\n return {\n type: \"upsert\",\n path: relPath,\n ...(baseSha256 ? { baseSha256 } : {}),\n file,\n };\n }\n if (type === \"delete\") {\n return {\n type: \"delete\",\n path: relPath,\n baseSha256: assertSha256(change.baseSha256, `changes[${index}].baseSha256`),\n };\n }\n throw new Error(`changes[${index}].type must be \"upsert\" or \"delete\"`);\n });\n assertUniquePaths(changes, \"offline sync changeset\");\n if (!includeTranscripts) {\n const transcriptPath = changes.find((change) => change.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync changeset includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = changes.find((change) => shouldExcludeRelPath(change.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync changeset contains excluded path: ${excludedPath}`);\n }\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nfunction normalizeIsoString(input: unknown, field: string): string {\n if (typeof input !== \"string\" || input.trim().length === 0) {\n throw new Error(`${field} must be an ISO timestamp string`);\n }\n const parsed = parseFlexibleIsoTimestamp(input.trim());\n if (parsed === null) {\n throw new Error(`${field} must be a parseable ISO timestamp`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction normalizeRelativePath(input: unknown, field: string): string {\n if (typeof input !== \"string\") {\n throw new Error(`${field} must be a POSIX relative path string`);\n }\n return validateArchiveRelativePath(input, field);\n}\n\nfunction assertUniquePaths(entries: readonly { path: string }[], context: string): void {\n const seen = new Set<string>();\n for (const entry of entries) {\n const key = entry.path.toLowerCase();\n if (seen.has(key)) {\n throw new Error(`${context} contains duplicate path: ${entry.path}`);\n }\n seen.add(key);\n }\n}\n\nfunction shouldExcludeRelPath(relPosix: string, includeTranscripts: boolean): boolean {\n const parts = relPosix.split(\"/\");\n if (parts.some((part) => DEFAULT_TRANSFER_EXCLUDE_DIRS.has(part))) return true;\n if (parts.some((part) => part === SYNC_INTERNAL_DIR)) return true;\n if (EXCLUDED_REL_PATHS.has(relPosix)) return true;\n if (!includeTranscripts && parts[0] === \"transcripts\") return true;\n const basename = parts[parts.length - 1] ?? \"\";\n if (EXCLUDED_FILE_NAMES.has(basename)) return true;\n return EXCLUDED_FILE_PREFIXES.some((prefix) => basename.startsWith(prefix));\n}\n\nfunction filterBaseFilesForMode(\n files: readonly OfflineSyncFileState[],\n includeTranscripts: boolean,\n): OfflineSyncFileState[] {\n return files.filter((file) => !shouldExcludeRelPath(file.path, includeTranscripts));\n}\n\nasync function readOfflineSyncFileRecord(\n options: OfflineSyncFileRecordOptions,\n): Promise<OfflineSyncFileRecord> {\n const relPath = validateArchiveRelativePath(options.relPath, \"offlineSyncFile.path\");\n const bytes = options.readFile\n ? await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath })\n : await readFile(options.filePath);\n const digest = sha256Buffer(bytes);\n const st = await stat(options.filePath);\n return {\n path: relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n ...(options.includeContent ? { contentBase64: bytes.toString(\"base64\") } : {}),\n };\n}\n\nexport async function buildOfflineSyncSnapshot(options: {\n root: string;\n sourceId: string;\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<OfflineSyncSnapshot> {\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshot\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const files: OfflineSyncFileRecord[] = [];\n\n async function walk(dirAbs: string): Promise<void> {\n let entries = await readdir(dirAbs, { withFileTypes: true });\n entries = entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n const abs = path.join(dirAbs, entry.name);\n const relPosix = path.relative(root.abs, abs).split(path.sep).join(\"/\");\n if (shouldExcludeRelPath(relPosix, includeTranscripts)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n await walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath: relPosix,\n filePath: abs,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n }));\n }\n }\n\n await walk(root.abs);\n\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: files.sort(compareByPath),\n };\n}\n\nexport async function buildOfflineSyncSnapshotForPaths(options: {\n root: string;\n sourceId: string;\n paths: readonly string[];\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<OfflineSyncSnapshot> {\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshotForPaths\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const files: OfflineSyncFileRecord[] = [];\n const seen = new Set<string>();\n\n for (const rawPath of options.paths) {\n const relPath = normalizeRelativePath(rawPath, \"paths[]\");\n if (seen.has(relPath)) continue;\n seen.add(relPath);\n if (shouldExcludeRelPath(relPath, includeTranscripts)) {\n throw new Error(`offline sync snapshot path is excluded: ${relPath}`);\n }\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) continue;\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath,\n filePath,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n }));\n }\n\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: files.sort(compareByPath),\n };\n}\n\nexport async function buildOfflineSyncChangeset(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<OfflineSyncChangeset> {\n const includeTranscripts = options.includeTranscripts !== false;\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const current = await buildOfflineSyncSnapshot({\n root: options.root,\n sourceId: options.sourceId,\n includeContent: false,\n includeTranscripts,\n now: options.now,\n readFile: options.readFile,\n });\n const currentMap = byPath(current.files);\n const changes: OfflineSyncChange[] = [];\n\n for (const relPath of unionPaths(base, currentMap)) {\n const baseEntry = base.get(relPath);\n const currentEntry = currentMap.get(relPath);\n if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {\n const file = await buildOfflineSyncSnapshotForPaths({\n root: options.root,\n sourceId: options.sourceId,\n paths: [relPath],\n includeContent: true,\n includeTranscripts,\n now: options.now,\n readFile: options.readFile,\n });\n const record = file.files[0];\n if (!record || typeof record.contentBase64 !== \"string\" || record.sha256 !== currentEntry.sha256) {\n throw new Error(`offline sync file changed while building changeset: ${relPath}`);\n }\n changes.push({\n type: \"upsert\",\n path: relPath,\n ...(baseEntry ? { baseSha256: baseEntry.sha256 } : {}),\n file: record as OfflineSyncFileRecord & { contentBase64: string },\n });\n continue;\n }\n if (!currentEntry && baseEntry) {\n changes.push({\n type: \"delete\",\n path: relPath,\n baseSha256: baseEntry.sha256,\n });\n }\n }\n\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts: current.includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nexport function summarizeOfflineSyncChangeset(\n changeset: OfflineSyncChangeset,\n): OfflineSyncChangesetSummary {\n const upserts = changeset.changes.filter((change) => change.type === \"upsert\").length;\n const deletes = changeset.changes.filter((change) => change.type === \"delete\").length;\n return {\n upserts,\n deletes,\n total: changeset.changes.length,\n };\n}\n\nexport async function applyOfflineSyncSnapshot(options: {\n root: string;\n snapshot: unknown;\n baseFiles?: readonly OfflineSyncFileState[];\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>;\n}): Promise<OfflineSyncApplySnapshotResult> {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n const baseMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n snapshot.includeTranscripts,\n ));\n const incomingMap = byPath(snapshot.files);\n const incomingBuffers = verifyRecordContents(snapshot.files, \"offline sync snapshot\", {\n requireContent: false,\n });\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncSnapshot\");\n const current = await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: snapshot.includeTranscripts,\n readFile: options.readFile,\n });\n const currentMap = byPath(current.files);\n const nextBase = new Map(baseMap);\n const conflicts: OfflineSyncConflict[] = [];\n let upserted = 0;\n let deleted = 0;\n let skipped = 0;\n let pendingLocal = 0;\n\n for (const relPath of unionPaths(baseMap, incomingMap, currentMap)) {\n const base = baseMap.get(relPath);\n const incoming = incomingMap.get(relPath);\n const currentEntry = currentMap.get(relPath);\n\n if (incoming) {\n if (currentEntry?.sha256 === incoming.sha256) {\n nextBase.set(relPath, toFileState(incoming));\n skipped += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 !== base.sha256) {\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: \"local_deleted_remote_modified\",\n baseSha256: base.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: options.writeConflictCopies === false\n ? incomingBuffers.get(relPath)\n : requiredBuffer(incomingBuffers, relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n nextBase.set(relPath, base);\n continue;\n }\n if (!currentEntry && !base) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && currentEntry && currentEntry.sha256 === base.sha256) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: base ? \"both_modified\" : \"remote_exists_for_local_create\",\n baseSha256: base?.sha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: options.writeConflictCopies === false\n ? incomingBuffers.get(relPath)\n : requiredBuffer(incomingBuffers, relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n if (base) nextBase.set(relPath, base);\n continue;\n }\n\n if (!currentEntry) {\n nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n if (base && currentEntry.sha256 === base.sha256) {\n await deleteSafeFile(root, relPath, options.deleteFile);\n nextBase.delete(relPath);\n deleted += 1;\n continue;\n }\n if (base) {\n conflicts.push({\n path: relPath,\n reason: \"local_modified_remote_deleted\",\n baseSha256: base.sha256,\n localSha256: currentEntry.sha256,\n });\n nextBase.set(relPath, base);\n continue;\n }\n pendingLocal += 1;\n skipped += 1;\n }\n\n return {\n upserted,\n deleted,\n skipped,\n pendingLocal,\n conflicts,\n nextBaseFiles: [...nextBase.values()].sort(compareByPath),\n };\n}\n\nexport async function applyOfflineSyncChangeset(options: {\n root: string;\n changeset: unknown;\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>;\n}): Promise<OfflineSyncApplyChangesetResult> {\n let changeset: OfflineSyncChangeset;\n try {\n changeset = normalizeOfflineSyncChangeset(options.changeset);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n message.startsWith(\"offline sync\")\n ? message\n : `offline sync changeset invalid: ${message}`,\n );\n }\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncChangeset\");\n const records = changeset.changes\n .filter((change): change is Extract<OfflineSyncChange, { type: \"upsert\" }> => change.type === \"upsert\")\n .map((change) => change.file);\n const incomingBuffers = verifyRecordContents(records, \"offline sync changeset\");\n const current = await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: changeset.includeTranscripts,\n readFile: options.readFile,\n });\n const currentMap = byPath(current.files);\n const conflicts: OfflineSyncConflict[] = [];\n let appliedUpserts = 0;\n let appliedDeletes = 0;\n let skipped = 0;\n\n for (const change of changeset.changes) {\n const currentEntry = currentMap.get(change.path);\n if (change.type === \"upsert\") {\n if (currentEntry?.sha256 === change.file.sha256) {\n skipped += 1;\n continue;\n }\n if (!change.baseSha256) {\n if (!currentEntry) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: \"remote_exists_for_local_create\",\n localSha256: currentEntry.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n if (currentEntry?.sha256 === change.baseSha256) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: currentEntry ? \"remote_changed_for_local_update\" : \"remote_deleted_for_local_update\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n\n if (!currentEntry) {\n skipped += 1;\n continue;\n }\n if (currentEntry.sha256 === change.baseSha256) {\n await deleteSafeFile(root, change.path, options.deleteFile);\n currentMap.delete(change.path);\n appliedDeletes += 1;\n continue;\n }\n conflicts.push({\n path: change.path,\n reason: \"remote_changed_for_local_delete\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry.sha256,\n });\n }\n\n return {\n appliedUpserts,\n appliedDeletes,\n skipped,\n conflicts,\n currentFiles: [...currentMap.values()].sort(compareByPath),\n };\n}\n\nfunction verifyRecordContents(\n records: readonly OfflineSyncFileRecord[],\n context: string,\n options: { requireContent?: boolean } = {},\n): Map<string, Buffer> {\n const buffers = new Map<string, Buffer>();\n for (const record of records) {\n if (typeof record.contentBase64 !== \"string\") {\n if (options.requireContent === false) continue;\n throw new Error(`${context}: contentBase64 is required for ${record.path}`);\n }\n const buffer = Buffer.from(record.contentBase64, \"base64\");\n const digest = sha256Buffer(buffer);\n if (digest.sha256 !== record.sha256 || digest.bytes !== record.bytes) {\n throw new Error(\n `${context}: content checksum mismatch for ${record.path}`,\n );\n }\n buffers.set(record.path, buffer);\n }\n return buffers;\n}\n\nfunction requiredBuffer(buffers: Map<string, Buffer>, relPath: string): Buffer {\n const buffer = buffers.get(relPath);\n if (!buffer) {\n throw new Error(`missing decoded content for ${relPath}`);\n }\n return buffer;\n}\n\nasync function ensureSyncRoot(rootPath: string, errorPrefix: string): Promise<SafeArchiveRoot> {\n const rootAbs = path.resolve(rootPath);\n await mkdir(rootAbs, { recursive: true });\n return prepareSafeArchiveRoot(rootAbs, errorPrefix, \"root\");\n}\n\nfunction byPath<T extends OfflineSyncFileState>(files: readonly T[]): Map<string, T> {\n const out = new Map<string, T>();\n for (const file of files) {\n out.set(validateArchiveRelativePath(file.path, \"offlineSync\"), file);\n }\n return out;\n}\n\nfunction unionPaths(...maps: Array<Map<string, unknown>>): string[] {\n const paths = new Set<string>();\n for (const map of maps) {\n for (const key of map.keys()) paths.add(key);\n }\n return [...paths].sort();\n}\n\nfunction toFileState(file: OfflineSyncFileState): OfflineSyncFileState {\n return {\n path: file.path,\n sha256: file.sha256,\n bytes: file.bytes,\n mtimeMs: file.mtimeMs,\n };\n}\n\nasync function writeSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n content: Buffer,\n writeFileHook?: (target: OfflineSyncFileWriteTarget) => Promise<void>,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (writeFileHook) {\n await writeFileHook({ root: root.abs, path: relPath, filePath: target, content });\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, content);\n try {\n const targetStat = await lstat(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(`offline sync target is a symlink: ${relPath}`);\n }\n await rename(tmp, target);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nasync function deleteSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (deleteFile) {\n await deleteFile({ root: root.abs, path: relPath, filePath: target });\n return;\n }\n await unlink(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n });\n}\n\nasync function recordConflict(options: {\n root: SafeArchiveRoot;\n relPath: string;\n reason: OfflineSyncConflict[\"reason\"];\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n incomingBuffer?: Buffer;\n writeConflictCopies: boolean;\n sourceId: string;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n}): Promise<OfflineSyncConflict> {\n let conflictPath: string | undefined;\n if (options.writeConflictCopies && options.incomingBuffer) {\n const sourceHash = hashText(options.sourceId).slice(0, 12);\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n conflictPath = `${SYNC_INTERNAL_DIR}/conflicts/${stamp}-${sourceHash}/${options.relPath}`;\n await writeSafeFile(options.root, conflictPath, options.incomingBuffer, options.writeFile);\n }\n return {\n path: options.relPath,\n reason: options.reason,\n baseSha256: options.baseSha256,\n localSha256: options.localSha256,\n incomingSha256: options.incomingSha256,\n ...(conflictPath ? { conflictPath } : {}),\n };\n}\n\nexport function defaultOfflineSyncStatePath(\n memoryDir: string,\n remoteId: string,\n namespace?: string,\n): string {\n const key = hashText(`${remoteId}\\0${namespace ?? \"\"}`).slice(0, 16);\n return path.join(path.resolve(memoryDir), SYNC_INTERNAL_DIR, \"state\", `${key}.json`);\n}\n\nexport async function readOfflineSyncState(\n statePath: string,\n): Promise<OfflineSyncState | null> {\n let raw: string;\n try {\n raw = await readFile(path.resolve(statePath), \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n const parsed = JSON.parse(raw) as unknown;\n return normalizeOfflineSyncState(parsed);\n}\n\nexport async function writeOfflineSyncState(\n statePath: string,\n state: OfflineSyncState,\n): Promise<void> {\n const normalized = normalizeOfflineSyncState(state);\n const target = path.resolve(statePath);\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync-state.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf-8\");\n try {\n await rename(tmp, target);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nexport function offlineSyncStateFromSnapshot(options: {\n remoteId: string;\n namespace?: string;\n snapshot: OfflineSyncSnapshot;\n baseFiles?: readonly OfflineSyncFileState[];\n}): OfflineSyncState {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n return normalizeOfflineSyncState({\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: options.remoteId,\n namespace: options.namespace,\n includeTranscripts: snapshot.includeTranscripts,\n lastSyncedAt: new Date().toISOString(),\n baseFiles: options.baseFiles ?? snapshot.files.map(toFileState),\n });\n}\n\nexport function normalizeOfflineSyncState(input: unknown): OfflineSyncState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync state must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.version !== OFFLINE_SYNC_STATE_VERSION) {\n throw new Error(`offline sync state version must be ${OFFLINE_SYNC_STATE_VERSION}`);\n }\n const namespace =\n typeof obj.namespace === \"string\" && obj.namespace.trim().length > 0\n ? obj.namespace.trim()\n : undefined;\n const baseFiles = normalizeFileStates(obj.baseFiles as readonly unknown[] | undefined)\n .sort(compareByPath);\n assertUniquePaths(baseFiles, \"offline sync state\");\n return {\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: normalizeSourceId(obj.remoteId, \"remoteId\"),\n ...(namespace ? { namespace } : {}),\n includeTranscripts: assertBoolean(obj.includeTranscripts, \"includeTranscripts\"),\n lastSyncedAt: normalizeIsoString(obj.lastSyncedAt, \"lastSyncedAt\"),\n baseFiles,\n };\n}\n\nexport function fileStatesFromSnapshot(snapshot: OfflineSyncSnapshot): OfflineSyncFileState[] {\n return normalizeOfflineSyncSnapshot(snapshot).files.map(toFileState).sort(compareByPath);\n}\n"],"mappings":"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","names":[]}
@@ -253,6 +253,11 @@ var offlineSyncApplyRequestSchema = z.object({
253
253
  message: "changeset is required",
254
254
  path: ["changeset"]
255
255
  });
256
+ var offlineSyncFilesRequestSchema = z.object({
257
+ namespace: namespaceSchema,
258
+ includeTranscripts: z.boolean().optional(),
259
+ paths: z.array(z.string().trim().min(1, "path must be non-empty").max(4096)).max(5e3, "paths must contain 5000 or fewer entries")
260
+ });
256
261
  var nullableOptional = (schema) => schema.optional().nullable().transform((value) => value ?? void 0);
257
262
  var actionConfidenceRuleSchema = z.object({
258
263
  kind: z.enum(ACTION_CONFIDENCE_RULE_KINDS),
@@ -300,6 +305,7 @@ var schemas = {
300
305
  capsuleExport: capsuleExportRequestSchema,
301
306
  capsuleImport: capsuleImportRequestSchema,
302
307
  capsuleList: capsuleListRequestSchema,
308
+ offlineSyncFiles: offlineSyncFilesRequestSchema,
303
309
  offlineSyncApply: offlineSyncApplyRequestSchema,
304
310
  actionConfidence: actionConfidenceRequestSchema
305
311
  };
@@ -344,7 +350,8 @@ export {
344
350
  capsuleImportRequestSchema,
345
351
  capsuleListRequestSchema,
346
352
  offlineSyncApplyRequestSchema,
353
+ offlineSyncFilesRequestSchema,
347
354
  actionConfidenceRequestSchema,
348
355
  validateRequest
349
356
  };
350
- //# sourceMappingURL=chunk-VWFIQOTJ.js.map
357
+ //# sourceMappingURL=chunk-66H2DZYB.js.map