@remnic/core 9.6.6 → 9.6.7

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 (63) hide show
  1. package/dist/access-admin-ops-surface.d.ts +2 -2
  2. package/dist/access-admin-ops-surface.js +1 -1
  3. package/dist/access-boundary.d.ts +2 -2
  4. package/dist/access-boundary.js +2 -2
  5. package/dist/access-cli.js +9 -9
  6. package/dist/access-http.d.ts +2 -2
  7. package/dist/access-http.js +6 -6
  8. package/dist/access-identity-continuity-surface.d.ts +1 -1
  9. package/dist/access-identity-continuity-surface.js +1 -1
  10. package/dist/access-lcm-surface.d.ts +2 -2
  11. package/dist/access-lcm-surface.js +1 -1
  12. package/dist/access-mcp.d.ts +2 -2
  13. package/dist/access-mcp.js +5 -5
  14. package/dist/access-observe-write-surface.d.ts +2 -2
  15. package/dist/access-observe-write-surface.js +1 -1
  16. package/dist/access-operations-batch.js +3 -3
  17. package/dist/access-operations.d.ts +2 -2
  18. package/dist/access-operations.js +4 -4
  19. package/dist/access-recall-surface.d.ts +2 -2
  20. package/dist/access-recall-surface.js +1 -1
  21. package/dist/{access-service-DVrdUFNx.d.ts → access-service-DK7s3wMj.d.ts} +1 -1
  22. package/dist/access-service.d.ts +2 -2
  23. package/dist/access-service.js +1 -1
  24. package/dist/access-surface-catalog.d.ts +2 -2
  25. package/dist/bootstrap.d.ts +1 -1
  26. package/dist/{chunk-N56UNLQ6.js → chunk-D3YEDDCC.js} +3 -3
  27. package/dist/{chunk-BQUE75AB.js → chunk-I7PEZK2A.js} +8 -8
  28. package/dist/chunk-I7PEZK2A.js.map +1 -0
  29. package/dist/{chunk-DKEBBOBM.js → chunk-KD6PBCXP.js} +4 -4
  30. package/dist/{chunk-TML6D45I.js → chunk-KJ3QGI63.js} +3 -3
  31. package/dist/{chunk-F5NN5J7O.js → chunk-L6NW2XSU.js} +3 -3
  32. package/dist/{chunk-MVAQLXM2.js → chunk-OP47QBUR.js} +3 -17
  33. package/dist/chunk-OP47QBUR.js.map +1 -0
  34. package/dist/{chunk-R5OGPRLF.js → chunk-RSS3CZV7.js} +2 -2
  35. package/dist/{chunk-5MH5NF3U.js → chunk-U4CWMKN6.js} +3 -3
  36. package/dist/chunk-U4CWMKN6.js.map +1 -0
  37. package/dist/{chunk-J7NJZPWW.js → chunk-ZZYLM6KQ.js} +3 -3
  38. package/dist/{chunk-J7NJZPWW.js.map → chunk-ZZYLM6KQ.js.map} +1 -1
  39. package/dist/{cli-Dzh-d4Y3.d.ts → cli-CLSdmOVU.d.ts} +5 -86
  40. package/dist/cli.d.ts +8 -8
  41. package/dist/cli.js +8 -8
  42. package/dist/explicit-capture.d.ts +1 -1
  43. package/dist/index.d.ts +4 -4
  44. package/dist/index.js +9 -9
  45. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  46. package/dist/operator-toolkit.d.ts +33 -31
  47. package/dist/operator-toolkit.js +1 -1
  48. package/dist/{orchestrator-DiFog4aM.d.ts → orchestrator-BzXGNHco.d.ts} +95 -142
  49. package/dist/orchestrator.d.ts +2 -2
  50. package/dist/orchestrator.js +9 -9
  51. package/package.json +2 -2
  52. package/src/access-admin-ops-surface.ts +2 -2
  53. package/src/cli.ts +8 -65
  54. package/src/operator-toolkit.ts +37 -35
  55. package/src/orchestrator.ts +0 -68
  56. package/dist/chunk-5MH5NF3U.js.map +0 -1
  57. package/dist/chunk-BQUE75AB.js.map +0 -1
  58. package/dist/chunk-MVAQLXM2.js.map +0 -1
  59. /package/dist/{chunk-N56UNLQ6.js.map → chunk-D3YEDDCC.js.map} +0 -0
  60. /package/dist/{chunk-DKEBBOBM.js.map → chunk-KD6PBCXP.js.map} +0 -0
  61. /package/dist/{chunk-TML6D45I.js.map → chunk-KJ3QGI63.js.map} +0 -0
  62. /package/dist/{chunk-F5NN5J7O.js.map → chunk-L6NW2XSU.js.map} +0 -0
  63. /package/dist/{chunk-R5OGPRLF.js.map → chunk-RSS3CZV7.js.map} +0 -0
@@ -612,6 +612,100 @@ declare function locateTranscriptPath(hitPath: string): {
612
612
  date: string;
613
613
  } | null;
614
614
 
615
+ /**
616
+ * Conversation index coordinator — extracted from the orchestrator (issue #1526).
617
+ *
618
+ * Owns the conversation-index subsystem: semantic recall over past
619
+ * conversations, plus the build / update / rebuild / inspect / health
620
+ * lifecycle of the on-disk chunk store and its pluggable search backend
621
+ * (qmd or faiss). Behavior-preserving move from orchestrator.ts — no logic
622
+ * changes; the orchestrator constructs one instance and keeps thin
623
+ * delegating methods so existing call sites and tests that exercise the
624
+ * private API continue to work.
625
+ *
626
+ * The backend and transcript are read through getters (not captured at
627
+ * construction) so that post-construction reassignment of the orchestrator's
628
+ * live fields — exercised by the conversation-index integration tests and by
629
+ * backend swap-in at deferred-init time — is honored. This mirrors the
630
+ * TierMigrationCoordinator accessor pattern.
631
+ */
632
+
633
+ /**
634
+ * Coordinator for the conversation-index subsystem.
635
+ *
636
+ * Holds the per-session last-update timestamps (previously an orchestrator
637
+ * field) and delegates chunk building / persistence / embedding to the
638
+ * configured backend.
639
+ */
640
+ declare class ConversationIndexCoordinator {
641
+ private readonly config;
642
+ private readonly getTranscript;
643
+ private readonly getBackend;
644
+ private readonly indexDir;
645
+ private readonly lastUpdateAtMs;
646
+ constructor(options: {
647
+ config: PluginConfig;
648
+ getTranscript: () => TranscriptManager;
649
+ getBackend: () => ConversationIndexBackend | undefined;
650
+ indexDir: string;
651
+ });
652
+ /** Semantic recall over past-conversation chunks (fail-open: empty on miss). */
653
+ search(retrievalQuery: string, topK: number): Promise<ConversationSearchResult[]>;
654
+ /** Render conversation-recall search hits as a budgeted markdown section. */
655
+ formatRecallSection(results: ConversationSearchResult[], maxChars: number): string | null;
656
+ /** Recursively count `.md` chunk documents under a directory. */
657
+ countChunkDocs(dir: string): Promise<number>;
658
+ /** Read recent transcript entries and chunk them for indexing. */
659
+ buildChunks(sessionKey?: string, hours?: number): Promise<ConversationChunk[]>;
660
+ getHealth(): Promise<{
661
+ enabled: boolean;
662
+ backend: "qmd" | "faiss";
663
+ status: "ok" | "degraded" | "disabled";
664
+ chunkDocCount: number;
665
+ lastUpdateAt: string | null;
666
+ qmdAvailable?: boolean;
667
+ faiss?: {
668
+ ok: boolean;
669
+ status: "ok" | "degraded" | "error";
670
+ indexPath: string;
671
+ message?: string;
672
+ manifest?: {
673
+ version: number;
674
+ modelId: string;
675
+ normalizedModelId: string;
676
+ dimension: number;
677
+ chunkCount: number;
678
+ updatedAt: string;
679
+ lastSuccessfulRebuildAt: string;
680
+ };
681
+ };
682
+ }>;
683
+ inspect(): Promise<ConversationIndexBackendInspection & {
684
+ enabled: boolean;
685
+ chunkDocCount: number;
686
+ lastUpdateAt: string | null;
687
+ }>;
688
+ update(sessionKey: string, hours?: number, opts?: {
689
+ embed?: boolean;
690
+ enforceMinInterval?: boolean;
691
+ }): Promise<{
692
+ chunks: number;
693
+ skipped: boolean;
694
+ reason?: string;
695
+ retryAfterMs?: number;
696
+ embedded?: boolean;
697
+ }>;
698
+ rebuild(sessionKey?: string, hours?: number, opts?: {
699
+ embed?: boolean;
700
+ }): Promise<{
701
+ chunks: number;
702
+ skipped: boolean;
703
+ reason?: string;
704
+ embedded?: boolean;
705
+ rebuilt?: boolean;
706
+ }>;
707
+ }
708
+
615
709
  /**
616
710
  * Tier migration coordinator — extracted from the orchestrator (issue #1526).
617
711
  *
@@ -1023,100 +1117,6 @@ declare class RecallResultFormatter {
1023
1117
  } | null>;
1024
1118
  }
1025
1119
 
1026
- /**
1027
- * Conversation index coordinator — extracted from the orchestrator (issue #1526).
1028
- *
1029
- * Owns the conversation-index subsystem: semantic recall over past
1030
- * conversations, plus the build / update / rebuild / inspect / health
1031
- * lifecycle of the on-disk chunk store and its pluggable search backend
1032
- * (qmd or faiss). Behavior-preserving move from orchestrator.ts — no logic
1033
- * changes; the orchestrator constructs one instance and keeps thin
1034
- * delegating methods so existing call sites and tests that exercise the
1035
- * private API continue to work.
1036
- *
1037
- * The backend and transcript are read through getters (not captured at
1038
- * construction) so that post-construction reassignment of the orchestrator's
1039
- * live fields — exercised by the conversation-index integration tests and by
1040
- * backend swap-in at deferred-init time — is honored. This mirrors the
1041
- * TierMigrationCoordinator accessor pattern.
1042
- */
1043
-
1044
- /**
1045
- * Coordinator for the conversation-index subsystem.
1046
- *
1047
- * Holds the per-session last-update timestamps (previously an orchestrator
1048
- * field) and delegates chunk building / persistence / embedding to the
1049
- * configured backend.
1050
- */
1051
- declare class ConversationIndexCoordinator {
1052
- private readonly config;
1053
- private readonly getTranscript;
1054
- private readonly getBackend;
1055
- private readonly indexDir;
1056
- private readonly lastUpdateAtMs;
1057
- constructor(options: {
1058
- config: PluginConfig;
1059
- getTranscript: () => TranscriptManager;
1060
- getBackend: () => ConversationIndexBackend | undefined;
1061
- indexDir: string;
1062
- });
1063
- /** Semantic recall over past-conversation chunks (fail-open: empty on miss). */
1064
- search(retrievalQuery: string, topK: number): Promise<ConversationSearchResult[]>;
1065
- /** Render conversation-recall search hits as a budgeted markdown section. */
1066
- formatRecallSection(results: ConversationSearchResult[], maxChars: number): string | null;
1067
- /** Recursively count `.md` chunk documents under a directory. */
1068
- countChunkDocs(dir: string): Promise<number>;
1069
- /** Read recent transcript entries and chunk them for indexing. */
1070
- buildChunks(sessionKey?: string, hours?: number): Promise<ConversationChunk[]>;
1071
- getHealth(): Promise<{
1072
- enabled: boolean;
1073
- backend: "qmd" | "faiss";
1074
- status: "ok" | "degraded" | "disabled";
1075
- chunkDocCount: number;
1076
- lastUpdateAt: string | null;
1077
- qmdAvailable?: boolean;
1078
- faiss?: {
1079
- ok: boolean;
1080
- status: "ok" | "degraded" | "error";
1081
- indexPath: string;
1082
- message?: string;
1083
- manifest?: {
1084
- version: number;
1085
- modelId: string;
1086
- normalizedModelId: string;
1087
- dimension: number;
1088
- chunkCount: number;
1089
- updatedAt: string;
1090
- lastSuccessfulRebuildAt: string;
1091
- };
1092
- };
1093
- }>;
1094
- inspect(): Promise<ConversationIndexBackendInspection & {
1095
- enabled: boolean;
1096
- chunkDocCount: number;
1097
- lastUpdateAt: string | null;
1098
- }>;
1099
- update(sessionKey: string, hours?: number, opts?: {
1100
- embed?: boolean;
1101
- enforceMinInterval?: boolean;
1102
- }): Promise<{
1103
- chunks: number;
1104
- skipped: boolean;
1105
- reason?: string;
1106
- retryAfterMs?: number;
1107
- embedded?: boolean;
1108
- }>;
1109
- rebuild(sessionKey?: string, hours?: number, opts?: {
1110
- embed?: boolean;
1111
- }): Promise<{
1112
- chunks: number;
1113
- skipped: boolean;
1114
- reason?: string;
1115
- embedded?: boolean;
1116
- rebuilt?: boolean;
1117
- }>;
1118
- }
1119
-
1120
1120
  /**
1121
1121
  * Recall rerank coordinator — extracted from the orchestrator (issue #1526).
1122
1122
  *
@@ -2628,34 +2628,6 @@ declare class Orchestrator {
2628
2628
  }): Promise<boolean>;
2629
2629
  private searchConversationRecallResults;
2630
2630
  private formatConversationRecallSection;
2631
- getConversationIndexHealth(): Promise<{
2632
- enabled: boolean;
2633
- backend: "qmd" | "faiss";
2634
- status: "ok" | "degraded" | "disabled";
2635
- chunkDocCount: number;
2636
- lastUpdateAt: string | null;
2637
- qmdAvailable?: boolean;
2638
- faiss?: {
2639
- ok: boolean;
2640
- status: "ok" | "degraded" | "error";
2641
- indexPath: string;
2642
- message?: string;
2643
- manifest?: {
2644
- version: number;
2645
- modelId: string;
2646
- normalizedModelId: string;
2647
- dimension: number;
2648
- chunkCount: number;
2649
- updatedAt: string;
2650
- lastSuccessfulRebuildAt: string;
2651
- };
2652
- };
2653
- }>;
2654
- inspectConversationIndex(): Promise<ConversationIndexBackendInspection & {
2655
- enabled: boolean;
2656
- chunkDocCount: number;
2657
- lastUpdateAt: string | null;
2658
- }>;
2659
2631
  getRecoverySummary(sessionKey?: string): Promise<{
2660
2632
  generatedAt: string;
2661
2633
  sessionKey?: string;
@@ -2665,25 +2637,6 @@ declare class Orchestrator {
2665
2637
  brokenChains: number;
2666
2638
  checkpointHealthy: boolean;
2667
2639
  }>;
2668
- updateConversationIndex(sessionKey: string, hours?: number, opts?: {
2669
- embed?: boolean;
2670
- enforceMinInterval?: boolean;
2671
- }): Promise<{
2672
- chunks: number;
2673
- skipped: boolean;
2674
- reason?: string;
2675
- retryAfterMs?: number;
2676
- embedded?: boolean;
2677
- }>;
2678
- rebuildConversationIndex(sessionKey?: string, hours?: number, opts?: {
2679
- embed?: boolean;
2680
- }): Promise<{
2681
- chunks: number;
2682
- skipped: boolean;
2683
- reason?: string;
2684
- embedded?: boolean;
2685
- rebuilt?: boolean;
2686
- }>;
2687
2640
  private validateLocalLlmModel;
2688
2641
  recall(prompt: string, sessionKey?: string, options?: RecallInvocationOptions): Promise<string>;
2689
2642
  /**
@@ -3032,4 +2985,4 @@ declare class Orchestrator {
3032
2985
  private readArchivedMemoriesForNamespaces;
3033
2986
  }
3034
2987
 
3035
- export { type QmdRecallSnapshot as $, memoryStatusForMode as A, resolveSpeaker as B, resolveSyncDates as C, DEFAULT_SELF_NAME as D, sanitizeSessionKeyForFilename as E, saveSpeakerRegistry as F, type GraphRecallSnapshot as G, speakerRegistryKey as H, type IntentDebugSnapshot as I, speakersFilePath as J, syncWearableSource as K, wearableDayTag as L, wearableSourceLabel as M, writeDailyDigestMemory as N, Orchestrator as O, type PatternReinforcementResult as P, type BulkImportBatchIngestResult as Q, type ResolvedScopeProfilePlan as R, type ScopeProfileLayerResolution as S, TierMigrationCoordinator as T, BulkImportBatchPartialFailureError as U, COMPACTION_SIGNAL_MAX_AGE_MS as V, WearablesService as W, type DaySummaryGatherOptions as X, type ExtractionRunResult as Y, type GraphRecallRankedResult as Z, type GraphRecallShadowComparison as _, type ScopeProfilePromotionResolution as a, type QueryAwarePrefilter as a0, type RecallInvocationOptions as a1, type RecallModeDecision as a2, appendMemoryToGraphContext as a3, applyQueryAwareCandidateFilter as a4, blendGraphExpandedRecallScore as a5, buildCompressionGuidelinesMarkdown as a6, buildMemoryPathById as a7, computeArtifactCandidateFetchLimit as a8, computeArtifactRecallLimit as a9, splitTurnsBySourceValidAt as aA, summarizeGraphShadowComparison as aB, targetSourceValidAtSortMs as aC, throwIfRecallAborted as aD, tokenizeRecallQuery as aE, utcDateKeysForLocalDay as aF, computeQmdHybridFetchLimit as aa, deriveTopicsFromExtraction as ab, filterHourlySummaryMarkdownForLocalDay as ac, filterRecallCandidates as ad, formatDateInTimeZone as ae, graphPathRelativeToStorage as af, hasIdentityRecoveryIntent as ag, isArtifactMemoryPath as ah, lifecycleRecallScoreAdjustment as ai, mapRecallSourceToXrayServedBy as aj, mergeArtifactRecallCandidates as ak, mergeGraphExpandedResults as al, normalizeIanaTimeZone as am, parseFiniteDate as an, parseGraphRecallRankedResults as ao, parseMemoryIntentSnapshot as ap, parseQmdRecallResults as aq, qmdStartupCollectionCheckWithTimeout as ar, raceRecallAbort as as, resolveEffectiveIdentityInjectionMode as at, resolveEffectiveRecallMode as au, resolvePersistedMemoryRelativePath as av, resolveRecallModeDecision as aw, resolveRecallModeDecisionAsync as ax, resolveRecentThreadMemoryPaths as ay, shouldFilterLifecycleRecallCandidate as az, type SpeakerRegistry as b, type ResolvedSpeaker as c, type SpeakerOverride as d, WEARABLE_SOURCE_PREFIX as e, type WearableDayTranscriptView as f, type WearableMemoryGenDeps as g, type WearableMemoryGenResult as h, type WearableMemorySearchResult as i, type WearableMemoryWriter as j, type WearableSearchBackend as k, type WearableStorageIo as l, type WearableSyncDeps as m, type WearableSyncOptions as n, type WearableTranscriptSearchResult as o, type WearablesServiceDeps as p, buildExtractionTurns as q, dateInTimezone as r, defaultTimezone as s, defaultWorkspaceDir as t, distinctSpeakerLabels as u, emptySpeakerRegistry as v, generateWearableMemories as w, importNativeMemories as x, loadSpeakerRegistry as y, locateTranscriptPath as z };
2988
+ export { type GraphRecallShadowComparison as $, memoryStatusForMode as A, resolveSpeaker as B, ConversationIndexCoordinator as C, DEFAULT_SELF_NAME as D, resolveSyncDates as E, sanitizeSessionKeyForFilename as F, type GraphRecallSnapshot as G, saveSpeakerRegistry as H, type IntentDebugSnapshot as I, speakerRegistryKey as J, speakersFilePath as K, syncWearableSource as L, wearableDayTag as M, wearableSourceLabel as N, Orchestrator as O, type PatternReinforcementResult as P, writeDailyDigestMemory as Q, type ResolvedScopeProfilePlan as R, type ScopeProfileLayerResolution as S, TierMigrationCoordinator as T, type BulkImportBatchIngestResult as U, BulkImportBatchPartialFailureError as V, WearablesService as W, COMPACTION_SIGNAL_MAX_AGE_MS as X, type DaySummaryGatherOptions as Y, type ExtractionRunResult as Z, type GraphRecallRankedResult as _, type ScopeProfilePromotionResolution as a, type QmdRecallSnapshot as a0, type QueryAwarePrefilter as a1, type RecallInvocationOptions as a2, type RecallModeDecision as a3, appendMemoryToGraphContext as a4, applyQueryAwareCandidateFilter as a5, blendGraphExpandedRecallScore as a6, buildCompressionGuidelinesMarkdown as a7, buildMemoryPathById as a8, computeArtifactCandidateFetchLimit as a9, shouldFilterLifecycleRecallCandidate as aA, splitTurnsBySourceValidAt as aB, summarizeGraphShadowComparison as aC, targetSourceValidAtSortMs as aD, throwIfRecallAborted as aE, tokenizeRecallQuery as aF, utcDateKeysForLocalDay as aG, computeArtifactRecallLimit as aa, computeQmdHybridFetchLimit as ab, deriveTopicsFromExtraction as ac, filterHourlySummaryMarkdownForLocalDay as ad, filterRecallCandidates as ae, formatDateInTimeZone as af, graphPathRelativeToStorage as ag, hasIdentityRecoveryIntent as ah, isArtifactMemoryPath as ai, lifecycleRecallScoreAdjustment as aj, mapRecallSourceToXrayServedBy as ak, mergeArtifactRecallCandidates as al, mergeGraphExpandedResults as am, normalizeIanaTimeZone as an, parseFiniteDate as ao, parseGraphRecallRankedResults as ap, parseMemoryIntentSnapshot as aq, parseQmdRecallResults as ar, qmdStartupCollectionCheckWithTimeout as as, raceRecallAbort as at, resolveEffectiveIdentityInjectionMode as au, resolveEffectiveRecallMode as av, resolvePersistedMemoryRelativePath as aw, resolveRecallModeDecision as ax, resolveRecallModeDecisionAsync as ay, resolveRecentThreadMemoryPaths as az, type SpeakerRegistry as b, type ResolvedSpeaker as c, type SpeakerOverride as d, WEARABLE_SOURCE_PREFIX as e, type WearableDayTranscriptView as f, type WearableMemoryGenDeps as g, type WearableMemoryGenResult as h, type WearableMemorySearchResult as i, type WearableMemoryWriter as j, type WearableSearchBackend as k, type WearableStorageIo as l, type WearableSyncDeps as m, type WearableSyncOptions as n, type WearableTranscriptSearchResult as o, type WearablesServiceDeps as p, buildExtractionTurns as q, dateInTimezone as r, defaultTimezone as s, defaultWorkspaceDir as t, distinctSpeakerLabels as u, emptySpeakerRegistry as v, generateWearableMemories as w, importNativeMemories as x, loadSpeakerRegistry as y, locateTranscriptPath as z };
@@ -8,7 +8,7 @@ import './summarizer.js';
8
8
  import './local-llm.js';
9
9
  import './fallback-llm.js';
10
10
  import './orchestration/maintenance.js';
11
- export { Q as BulkImportBatchIngestResult, U as BulkImportBatchPartialFailureError, V as COMPACTION_SIGNAL_MAX_AGE_MS, X as DaySummaryGatherOptions, Y as ExtractionRunResult, Z as GraphRecallRankedResult, _ as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, $ as QmdRecallSnapshot, a0 as QueryAwarePrefilter, a1 as RecallInvocationOptions, a2 as RecallModeDecision, a3 as appendMemoryToGraphContext, a4 as applyQueryAwareCandidateFilter, a5 as blendGraphExpandedRecallScore, a6 as buildCompressionGuidelinesMarkdown, a7 as buildMemoryPathById, a8 as computeArtifactCandidateFetchLimit, a9 as computeArtifactRecallLimit, aa as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, ab as deriveTopicsFromExtraction, ac as filterHourlySummaryMarkdownForLocalDay, ad as filterRecallCandidates, ae as formatDateInTimeZone, af as graphPathRelativeToStorage, ag as hasIdentityRecoveryIntent, ah as isArtifactMemoryPath, ai as lifecycleRecallScoreAdjustment, aj as mapRecallSourceToXrayServedBy, ak as mergeArtifactRecallCandidates, al as mergeGraphExpandedResults, am as normalizeIanaTimeZone, an as parseFiniteDate, ao as parseGraphRecallRankedResults, ap as parseMemoryIntentSnapshot, aq as parseQmdRecallResults, ar as qmdStartupCollectionCheckWithTimeout, as as raceRecallAbort, at as resolveEffectiveIdentityInjectionMode, au as resolveEffectiveRecallMode, av as resolvePersistedMemoryRelativePath, aw as resolveRecallModeDecision, ax as resolveRecallModeDecisionAsync, ay as resolveRecentThreadMemoryPaths, E as sanitizeSessionKeyForFilename, az as shouldFilterLifecycleRecallCandidate, aA as splitTurnsBySourceValidAt, aB as summarizeGraphShadowComparison, aC as targetSourceValidAtSortMs, aD as throwIfRecallAborted, aE as tokenizeRecallQuery, aF as utcDateKeysForLocalDay } from './orchestrator-DiFog4aM.js';
11
+ export { U as BulkImportBatchIngestResult, V as BulkImportBatchPartialFailureError, X as COMPACTION_SIGNAL_MAX_AGE_MS, Y as DaySummaryGatherOptions, Z as ExtractionRunResult, _ as GraphRecallRankedResult, $ as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, a0 as QmdRecallSnapshot, a1 as QueryAwarePrefilter, a2 as RecallInvocationOptions, a3 as RecallModeDecision, a4 as appendMemoryToGraphContext, a5 as applyQueryAwareCandidateFilter, a6 as blendGraphExpandedRecallScore, a7 as buildCompressionGuidelinesMarkdown, a8 as buildMemoryPathById, a9 as computeArtifactCandidateFetchLimit, aa as computeArtifactRecallLimit, ab as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, ac as deriveTopicsFromExtraction, ad as filterHourlySummaryMarkdownForLocalDay, ae as filterRecallCandidates, af as formatDateInTimeZone, ag as graphPathRelativeToStorage, ah as hasIdentityRecoveryIntent, ai as isArtifactMemoryPath, aj as lifecycleRecallScoreAdjustment, ak as mapRecallSourceToXrayServedBy, al as mergeArtifactRecallCandidates, am as mergeGraphExpandedResults, an as normalizeIanaTimeZone, ao as parseFiniteDate, ap as parseGraphRecallRankedResults, aq as parseMemoryIntentSnapshot, ar as parseQmdRecallResults, as as qmdStartupCollectionCheckWithTimeout, at as raceRecallAbort, au as resolveEffectiveIdentityInjectionMode, av as resolveEffectiveRecallMode, aw as resolvePersistedMemoryRelativePath, ax as resolveRecallModeDecision, ay as resolveRecallModeDecisionAsync, az as resolveRecentThreadMemoryPaths, F as sanitizeSessionKeyForFilename, aA as shouldFilterLifecycleRecallCandidate, aB as splitTurnsBySourceValidAt, aC as summarizeGraphShadowComparison, aD as targetSourceValidAtSortMs, aE as throwIfRecallAborted, aF as tokenizeRecallQuery, aG as utcDateKeysForLocalDay } from './orchestrator-BzXGNHco.js';
12
12
  export { formatCompressionGuidelinesForRecall } from './orchestration/compression-guideline-coordinator.js';
13
13
  import './live-connectors-runner.js';
14
14
  import './model-registry.js';
@@ -23,7 +23,6 @@ import './replay/types.js';
23
23
  import './types-DDUDgd7T.js';
24
24
  import './lcm/engine.js';
25
25
  import './semantic-consolidation-BTShF2Fo.js';
26
- import './conversation-index/backend.js';
27
26
  import './catalog-9WanSGtt.js';
28
27
  import './namespaces/search.js';
29
28
  import './shared-context/manager.js';
@@ -59,6 +58,7 @@ import './work-product-ledger.js';
59
58
  import './trust-score-stage.js';
60
59
  import './trust-score.js';
61
60
  import './conversation-index/chunker.js';
61
+ import './conversation-index/backend.js';
62
62
  import './faiss-adapter-BHecI1fF.js';
63
63
  import './runtime/child-process.js';
64
64
  import './capabilities.js';
@@ -43,7 +43,7 @@ import {
43
43
  throwIfRecallAborted,
44
44
  tokenizeRecallQuery,
45
45
  utcDateKeysForLocalDay
46
- } from "./chunk-MVAQLXM2.js";
46
+ } from "./chunk-OP47QBUR.js";
47
47
  import "./chunk-J3XHPFEU.js";
48
48
  import "./chunk-JODHPNLN.js";
49
49
  import "./chunk-I74SUMNI.js";
@@ -125,7 +125,7 @@ import "./chunk-Q6IP2ARR.js";
125
125
  import "./chunk-6HEM6HTQ.js";
126
126
  import "./chunk-O2EL7EGG.js";
127
127
  import "./chunk-FVTLSFWU.js";
128
- import "./chunk-BQUE75AB.js";
128
+ import "./chunk-I7PEZK2A.js";
129
129
  import "./chunk-MMACM5G2.js";
130
130
  import "./chunk-54BGIBCR.js";
131
131
  import "./chunk-H4CKS5B2.js";
@@ -169,7 +169,7 @@ import "./chunk-GQGDRLDM.js";
169
169
  import "./chunk-SFQ6QNL7.js";
170
170
  import "./chunk-3T74IZB3.js";
171
171
  import "./chunk-33JBK2XP.js";
172
- import "./chunk-5MH5NF3U.js";
172
+ import "./chunk-U4CWMKN6.js";
173
173
  import "./chunk-VHJARF5R.js";
174
174
  import "./chunk-JZKR6ZAV.js";
175
175
  import "./chunk-23G3T2Q5.js";
@@ -216,7 +216,7 @@ import "./chunk-G6NKALRN.js";
216
216
  import "./chunk-OO42R444.js";
217
217
  import "./chunk-K6MV3TRQ.js";
218
218
  import "./chunk-OADWQ5CR.js";
219
- import "./chunk-DKEBBOBM.js";
219
+ import "./chunk-KD6PBCXP.js";
220
220
  import "./chunk-V7IZKJI3.js";
221
221
  import "./chunk-SEDEKFYQ.js";
222
222
  import "./chunk-RKNJBZ55.js";
@@ -225,13 +225,13 @@ import "./chunk-RSUYKGGZ.js";
225
225
  import "./chunk-42NQ7AVG.js";
226
226
  import "./chunk-TMSXWOBZ.js";
227
227
  import "./chunk-7RXCMVFQ.js";
228
- import "./chunk-F5NN5J7O.js";
228
+ import "./chunk-L6NW2XSU.js";
229
229
  import "./chunk-IC2TCZJ2.js";
230
230
  import "./chunk-D24OXEPB.js";
231
231
  import "./chunk-5RUE3GHQ.js";
232
- import "./chunk-N56UNLQ6.js";
232
+ import "./chunk-D3YEDDCC.js";
233
233
  import "./chunk-UPSAT4PY.js";
234
- import "./chunk-TML6D45I.js";
234
+ import "./chunk-KJ3QGI63.js";
235
235
  import "./chunk-HLTAPHZZ.js";
236
236
  import "./chunk-YF6FMLBT.js";
237
237
  import "./chunk-KQDNAXOM.js";
@@ -239,9 +239,9 @@ import "./chunk-PRTA6444.js";
239
239
  import "./chunk-35NN3ZFA.js";
240
240
  import "./chunk-FTYDWKO6.js";
241
241
  import "./chunk-T4WDJPEZ.js";
242
- import "./chunk-R5OGPRLF.js";
242
+ import "./chunk-RSS3CZV7.js";
243
243
  import "./chunk-D7FOKIY5.js";
244
- import "./chunk-J7NJZPWW.js";
244
+ import "./chunk-ZZYLM6KQ.js";
245
245
  import "./chunk-GDASG7NC.js";
246
246
  import "./chunk-GDB4J2H3.js";
247
247
  import "./chunk-CYWCKFCL.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.6.6",
3
+ "version": "9.6.7",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3000,7 +3000,7 @@
3000
3000
  "core"
3001
3001
  ],
3002
3002
  "peerDependencies": {
3003
- "@remnic/coding-graph": "^9.6.6"
3003
+ "@remnic/coding-graph": "^9.6.7"
3004
3004
  },
3005
3005
  "peerDependenciesMeta": {
3006
3006
  "@remnic/coding-graph": {
@@ -257,7 +257,7 @@ export class AccessAdminOpsSurface {
257
257
  }
258
258
 
259
259
  if (sessionKey) {
260
- const result = await this.deps.orchestrator.updateConversationIndex(
260
+ const result = await this.deps.orchestrator.conversationIndexCoordinator.update(
261
261
  sessionKey,
262
262
  hours,
263
263
  { embed: request.embed },
@@ -282,7 +282,7 @@ export class AccessAdminOpsSurface {
282
282
  let embeddedRuns = 0;
283
283
 
284
284
  for (const sessionKey of sessionKeys) {
285
- const result = await this.deps.orchestrator.updateConversationIndex(
285
+ const result = await this.deps.orchestrator.conversationIndexCoordinator.update(
286
286
  sessionKey,
287
287
  hours,
288
288
  { embed: request.embed },
package/src/cli.ts CHANGED
@@ -4,6 +4,7 @@ import { access, lstat, readFile, readdir, realpath, unlink } from "node:fs/prom
4
4
  import { createHash } from "node:crypto";
5
5
  import type { Readable, Writable } from "node:stream";
6
6
  import type { Orchestrator } from "./orchestrator.js";
7
+ import type { ConversationIndexCoordinator } from "./orchestration/conversation-index-coordinator.js";
7
8
  import { resolveNamespaceCapabilities,
8
9
  resolveMemoryLifecycleCapabilities,
9
10
  resolveIdentityContinuityCapabilities,
@@ -607,68 +608,10 @@ interface TailscaleHelperLike {
607
608
  }
608
609
 
609
610
  export interface ConversationIndexHealthCliOrchestrator {
610
- getConversationIndexHealth(): Promise<{
611
- enabled: boolean;
612
- backend: "qmd" | "faiss";
613
- status: "ok" | "degraded" | "disabled";
614
- chunkDocCount: number;
615
- lastUpdateAt: string | null;
616
- qmdAvailable?: boolean;
617
- faiss?: {
618
- ok: boolean;
619
- status: "ok" | "degraded" | "error";
620
- indexPath: string;
621
- message?: string;
622
- manifest?: {
623
- version: number;
624
- modelId: string;
625
- normalizedModelId: string;
626
- dimension: number;
627
- chunkCount: number;
628
- updatedAt: string;
629
- lastSuccessfulRebuildAt: string;
630
- };
631
- };
632
- }>;
633
- inspectConversationIndex(): Promise<{
634
- enabled: boolean;
635
- backend: "qmd" | "faiss";
636
- status: "ok" | "degraded" | "disabled";
637
- available: boolean;
638
- indexPath: string;
639
- supportsIncrementalUpdate: boolean;
640
- message?: string;
641
- chunkDocCount: number;
642
- lastUpdateAt: string | null;
643
- metadata: {
644
- chunkCount: number | null;
645
- qmdAvailable?: boolean;
646
- debugStatus?: string;
647
- hasIndex?: boolean;
648
- hasMetadata?: boolean;
649
- hasManifest?: boolean;
650
- manifest?: {
651
- version: number;
652
- modelId: string;
653
- normalizedModelId: string;
654
- dimension: number;
655
- chunkCount: number;
656
- updatedAt: string;
657
- lastSuccessfulRebuildAt: string;
658
- };
659
- };
660
- }>;
661
- rebuildConversationIndex(
662
- sessionKey?: string,
663
- hours?: number,
664
- opts?: { embed?: boolean },
665
- ): Promise<{
666
- chunks: number;
667
- skipped: boolean;
668
- reason?: string;
669
- embedded?: boolean;
670
- rebuilt?: boolean;
671
- }>;
611
+ conversationIndexCoordinator: Pick<
612
+ ConversationIndexCoordinator,
613
+ "getHealth" | "inspect" | "rebuild"
614
+ >;
672
615
  }
673
616
 
674
617
  export interface GraphHealthCliCommandOptions {
@@ -1222,13 +1165,13 @@ export async function runConversationIndexHealthCliCommand(
1222
1165
  };
1223
1166
  };
1224
1167
  }> {
1225
- return orchestrator.getConversationIndexHealth();
1168
+ return orchestrator.conversationIndexCoordinator.getHealth();
1226
1169
  }
1227
1170
 
1228
1171
  export async function runConversationIndexInspectCliCommand(
1229
1172
  orchestrator: ConversationIndexHealthCliOrchestrator,
1230
1173
  ) {
1231
- return orchestrator.inspectConversationIndex();
1174
+ return orchestrator.conversationIndexCoordinator.inspect();
1232
1175
  }
1233
1176
 
1234
1177
  export async function runConversationIndexRebuildCliCommand(
@@ -1239,7 +1182,7 @@ export async function runConversationIndexRebuildCliCommand(
1239
1182
  embed?: boolean;
1240
1183
  },
1241
1184
  ) {
1242
- return orchestrator.rebuildConversationIndex(
1185
+ return orchestrator.conversationIndexCoordinator.rebuild(
1243
1186
  options.sessionKey,
1244
1187
  options.hours,
1245
1188
  { embed: options.embed },
@@ -116,40 +116,42 @@ function formatUnknownError(error: unknown): string {
116
116
  }
117
117
 
118
118
  interface ConversationIndexLike {
119
- getConversationIndexHealth(): Promise<{
120
- enabled: boolean;
121
- backend: "qmd" | "faiss";
122
- status: "ok" | "degraded" | "disabled";
123
- chunkDocCount: number;
124
- lastUpdateAt: string | null;
125
- qmdAvailable?: boolean;
126
- faiss?: {
127
- ok: boolean;
128
- status: "ok" | "degraded" | "error";
129
- indexPath: string;
130
- message?: string;
131
- manifest?: {
132
- version: number;
133
- modelId: string;
134
- normalizedModelId: string;
135
- dimension: number;
136
- chunkCount: number;
137
- updatedAt: string;
138
- lastSuccessfulRebuildAt: string;
119
+ conversationIndexCoordinator: {
120
+ getHealth(): Promise<{
121
+ enabled: boolean;
122
+ backend: "qmd" | "faiss";
123
+ status: "ok" | "degraded" | "disabled";
124
+ chunkDocCount: number;
125
+ lastUpdateAt: string | null;
126
+ qmdAvailable?: boolean;
127
+ faiss?: {
128
+ ok: boolean;
129
+ status: "ok" | "degraded" | "error";
130
+ indexPath: string;
131
+ message?: string;
132
+ manifest?: {
133
+ version: number;
134
+ modelId: string;
135
+ normalizedModelId: string;
136
+ dimension: number;
137
+ chunkCount: number;
138
+ updatedAt: string;
139
+ lastSuccessfulRebuildAt: string;
140
+ };
139
141
  };
140
- };
141
- }>;
142
- rebuildConversationIndex(
143
- sessionKey?: string,
144
- hours?: number,
145
- opts?: { embed?: boolean },
146
- ): Promise<{
147
- chunks: number;
148
- skipped: boolean;
149
- reason?: string;
150
- embedded?: boolean;
151
- rebuilt?: boolean;
152
- }>;
142
+ }>;
143
+ rebuild(
144
+ sessionKey?: string,
145
+ hours?: number,
146
+ opts?: { embed?: boolean },
147
+ ): Promise<{
148
+ chunks: number;
149
+ skipped: boolean;
150
+ reason?: string;
151
+ embedded?: boolean;
152
+ rebuilt?: boolean;
153
+ }>;
154
+ };
153
155
  }
154
156
 
155
157
  export interface OperatorToolkitOrchestrator extends ConversationIndexLike {
@@ -1240,7 +1242,7 @@ export async function runOperatorDoctor(options: OperatorDoctorOptions): Promise
1240
1242
  },
1241
1243
  });
1242
1244
 
1243
- const conversationIndex = await options.orchestrator.getConversationIndexHealth();
1245
+ const conversationIndex = await options.orchestrator.conversationIndexCoordinator.getHealth();
1244
1246
  checks.push({
1245
1247
  key: "conversation_index",
1246
1248
  status: conversationIndex.status === "ok"
@@ -2277,7 +2279,7 @@ export async function runOperatorInventory(options: OperatorInventoryOptions): P
2277
2279
  reviewQueue = 0;
2278
2280
  }
2279
2281
  }
2280
- const conversationIndex = await options.orchestrator.getConversationIndexHealth();
2282
+ const conversationIndex = await options.orchestrator.conversationIndexCoordinator.getHealth();
2281
2283
  const nativeKnowledgeStatus = await summarizeNativeKnowledgeStatus(config);
2282
2284
 
2283
2285
  return {