@animalabs/context-manager 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/src/blob-manager.d.ts +37 -0
  2. package/dist/src/blob-manager.d.ts.map +1 -0
  3. package/dist/src/blob-manager.js +128 -0
  4. package/dist/src/blob-manager.js.map +1 -0
  5. package/dist/src/context-log.d.ts +99 -0
  6. package/dist/src/context-log.d.ts.map +1 -0
  7. package/dist/src/context-log.js +277 -0
  8. package/dist/src/context-log.js.map +1 -0
  9. package/dist/src/context-manager.d.ts +245 -0
  10. package/dist/src/context-manager.d.ts.map +1 -0
  11. package/dist/src/context-manager.js +553 -0
  12. package/dist/src/context-manager.js.map +1 -0
  13. package/dist/src/index.d.ts +12 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +12 -0
  16. package/dist/src/index.js.map +1 -0
  17. package/dist/src/message-store.d.ts +135 -0
  18. package/dist/src/message-store.d.ts.map +1 -0
  19. package/dist/src/message-store.js +372 -0
  20. package/dist/src/message-store.js.map +1 -0
  21. package/dist/src/strategies/autobiographical.d.ts +199 -0
  22. package/dist/src/strategies/autobiographical.d.ts.map +1 -0
  23. package/dist/src/strategies/autobiographical.js +1122 -0
  24. package/dist/src/strategies/autobiographical.js.map +1 -0
  25. package/dist/src/strategies/index.d.ts +3 -0
  26. package/dist/src/strategies/index.d.ts.map +1 -0
  27. package/dist/src/strategies/index.js +3 -0
  28. package/dist/src/strategies/index.js.map +1 -0
  29. package/dist/src/strategies/knowledge.d.ts +46 -0
  30. package/dist/src/strategies/knowledge.d.ts.map +1 -0
  31. package/dist/src/strategies/knowledge.js +270 -0
  32. package/dist/src/strategies/knowledge.js.map +1 -0
  33. package/dist/src/strategies/passthrough.d.ts +17 -0
  34. package/dist/src/strategies/passthrough.d.ts.map +1 -0
  35. package/dist/src/strategies/passthrough.js +69 -0
  36. package/dist/src/strategies/passthrough.js.map +1 -0
  37. package/dist/src/types/context.d.ts +108 -0
  38. package/dist/src/types/context.d.ts.map +1 -0
  39. package/dist/src/types/context.js +2 -0
  40. package/dist/src/types/context.js.map +1 -0
  41. package/dist/src/types/index.d.ts +5 -0
  42. package/dist/src/types/index.d.ts.map +1 -0
  43. package/dist/src/types/index.js +2 -0
  44. package/dist/src/types/index.js.map +1 -0
  45. package/dist/src/types/message.d.ts +129 -0
  46. package/dist/src/types/message.d.ts.map +1 -0
  47. package/dist/src/types/message.js +2 -0
  48. package/dist/src/types/message.js.map +1 -0
  49. package/dist/src/types/strategy.d.ts +233 -0
  50. package/dist/src/types/strategy.d.ts.map +1 -0
  51. package/dist/src/types/strategy.js +32 -0
  52. package/dist/src/types/strategy.js.map +1 -0
  53. package/dist/test/autobiographical.test.d.ts +2 -0
  54. package/dist/test/autobiographical.test.d.ts.map +1 -0
  55. package/dist/test/autobiographical.test.js +46 -0
  56. package/dist/test/autobiographical.test.js.map +1 -0
  57. package/dist/test/head-window-reset.test.d.ts +17 -0
  58. package/dist/test/head-window-reset.test.d.ts.map +1 -0
  59. package/dist/test/head-window-reset.test.js +342 -0
  60. package/dist/test/head-window-reset.test.js.map +1 -0
  61. package/dist/test/integration.test.d.ts +2 -0
  62. package/dist/test/integration.test.d.ts.map +1 -0
  63. package/dist/test/integration.test.js +1341 -0
  64. package/dist/test/integration.test.js.map +1 -0
  65. package/dist/test/knowledge.test.d.ts +2 -0
  66. package/dist/test/knowledge.test.d.ts.map +1 -0
  67. package/dist/test/knowledge.test.js +617 -0
  68. package/dist/test/knowledge.test.js.map +1 -0
  69. package/dist/tsconfig.tsbuildinfo +1 -0
  70. package/package.json +48 -0
  71. package/src/blob-manager.ts +155 -0
  72. package/src/context-log.ts +342 -0
  73. package/src/context-manager.ts +726 -0
  74. package/src/index.ts +50 -0
  75. package/src/message-store.ts +479 -0
  76. package/src/strategies/autobiographical.ts +1355 -0
  77. package/src/strategies/index.ts +2 -0
  78. package/src/strategies/knowledge.ts +336 -0
  79. package/src/strategies/passthrough.ts +98 -0
  80. package/src/types/context.ts +119 -0
  81. package/src/types/index.ts +42 -0
  82. package/src/types/message.ts +140 -0
  83. package/src/types/strategy.ts +282 -0
@@ -0,0 +1,37 @@
1
+ import type { JsStore } from '@animalabs/chronicle';
2
+ import type { ContentBlock } from '@animalabs/membrane';
3
+ import type { StoredContentBlock } from './types/index.js';
4
+ /**
5
+ * Manages blob storage for media content.
6
+ * Extracts base64 data from content blocks and stores them in Chronicle's blob storage.
7
+ * Resolves blob references back to inline content on retrieval.
8
+ */
9
+ export declare class BlobManager {
10
+ private store;
11
+ constructor(store: JsStore);
12
+ /**
13
+ * Extract blobs from content blocks and return references.
14
+ * Replaces inline base64 data with blob references.
15
+ */
16
+ extractBlobs(content: ContentBlock[]): StoredContentBlock[];
17
+ /**
18
+ * Resolve blob references back to inline content.
19
+ */
20
+ resolveBlobs(content: StoredContentBlock[]): ContentBlock[];
21
+ private extractBlobFromBlock;
22
+ private extractFromImage;
23
+ private extractFromDocument;
24
+ private extractFromAudio;
25
+ private extractFromVideo;
26
+ private storeBase64;
27
+ private resolveBlobInBlock;
28
+ /**
29
+ * Check if a content block contains media that would be stored as a blob.
30
+ */
31
+ static hasStorableMedia(block: ContentBlock): boolean;
32
+ /**
33
+ * Estimate the storage size of media content.
34
+ */
35
+ static estimateMediaSize(block: ContentBlock): number;
36
+ }
37
+ //# sourceMappingURL=blob-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-manager.d.ts","sourceRoot":"","sources":["../../src/blob-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAiB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;;GAIG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,OAAO;IAElC;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,kBAAkB,EAAE;IAI3D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE;IAI3D,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAarD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;CAetD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Manages blob storage for media content.
3
+ * Extracts base64 data from content blocks and stores them in Chronicle's blob storage.
4
+ * Resolves blob references back to inline content on retrieval.
5
+ */
6
+ export class BlobManager {
7
+ store;
8
+ constructor(store) {
9
+ this.store = store;
10
+ }
11
+ /**
12
+ * Extract blobs from content blocks and return references.
13
+ * Replaces inline base64 data with blob references.
14
+ */
15
+ extractBlobs(content) {
16
+ return content.map((block) => this.extractBlobFromBlock(block));
17
+ }
18
+ /**
19
+ * Resolve blob references back to inline content.
20
+ */
21
+ resolveBlobs(content) {
22
+ return content.map((block) => this.resolveBlobInBlock(block));
23
+ }
24
+ extractBlobFromBlock(block) {
25
+ switch (block.type) {
26
+ case 'image':
27
+ return this.extractFromImage(block);
28
+ case 'document':
29
+ return this.extractFromDocument(block);
30
+ case 'audio':
31
+ return this.extractFromAudio(block);
32
+ case 'video':
33
+ return this.extractFromVideo(block);
34
+ default:
35
+ // Other block types pass through unchanged
36
+ return block;
37
+ }
38
+ }
39
+ extractFromImage(block) {
40
+ if (block.source.type === 'url') {
41
+ // URL sources don't need blob storage - pass through unchanged
42
+ return block;
43
+ }
44
+ const ref = this.storeBase64(block.source, 'image');
45
+ return { type: 'blob_ref', ref };
46
+ }
47
+ extractFromDocument(block) {
48
+ const ref = this.storeBase64(block.source, 'document');
49
+ return { type: 'blob_ref', ref };
50
+ }
51
+ extractFromAudio(block) {
52
+ const ref = this.storeBase64(block.source, 'audio');
53
+ return { type: 'blob_ref', ref };
54
+ }
55
+ extractFromVideo(block) {
56
+ const ref = this.storeBase64(block.source, 'video');
57
+ return { type: 'blob_ref', ref };
58
+ }
59
+ storeBase64(source, originalType) {
60
+ const buffer = Buffer.from(source.data, 'base64');
61
+ const hash = this.store.storeBlob(buffer, source.mediaType);
62
+ return {
63
+ hash,
64
+ mediaType: source.mediaType,
65
+ originalType,
66
+ };
67
+ }
68
+ resolveBlobInBlock(block) {
69
+ if (block.type !== 'blob_ref') {
70
+ return block;
71
+ }
72
+ const { ref } = block;
73
+ const buffer = this.store.getBlob(ref.hash);
74
+ if (!buffer) {
75
+ throw new Error(`Blob not found: ${ref.hash}`);
76
+ }
77
+ const data = buffer.toString('base64');
78
+ const source = {
79
+ type: 'base64',
80
+ data,
81
+ mediaType: ref.mediaType,
82
+ };
83
+ switch (ref.originalType) {
84
+ case 'image':
85
+ return { type: 'image', source };
86
+ case 'document':
87
+ return { type: 'document', source };
88
+ case 'audio':
89
+ return { type: 'audio', source };
90
+ case 'video':
91
+ return { type: 'video', source };
92
+ }
93
+ }
94
+ /**
95
+ * Check if a content block contains media that would be stored as a blob.
96
+ */
97
+ static hasStorableMedia(block) {
98
+ switch (block.type) {
99
+ case 'image':
100
+ return block.source.type === 'base64';
101
+ case 'document':
102
+ case 'audio':
103
+ case 'video':
104
+ return true;
105
+ default:
106
+ return false;
107
+ }
108
+ }
109
+ /**
110
+ * Estimate the storage size of media content.
111
+ */
112
+ static estimateMediaSize(block) {
113
+ switch (block.type) {
114
+ case 'image':
115
+ if (block.source.type === 'base64') {
116
+ return Math.ceil(block.source.data.length * 0.75); // base64 -> bytes
117
+ }
118
+ return 0;
119
+ case 'document':
120
+ case 'audio':
121
+ case 'video':
122
+ return Math.ceil(block.source.data.length * 0.75);
123
+ default:
124
+ return 0;
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=blob-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-manager.js","sourceRoot":"","sources":["../../src/blob-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import type { JsStore } from '@animalabs/chronicle';
2
+ import type { ContentBlock } from '@animalabs/membrane';
3
+ import type { MessageId, ContextEntry, SourceRelation, ContextLogView } from './types/index.js';
4
+ /**
5
+ * Wrapper around Chronicle append_log state for context log storage.
6
+ * The context log is a materialized, editable working set derived from the message store.
7
+ *
8
+ * Supports namespacing for multi-agent scenarios where each agent has its own context log
9
+ * but shares the same message store.
10
+ */
11
+ export declare class ContextLog {
12
+ private store;
13
+ private blobManager;
14
+ private sourceToIndices;
15
+ private tokenEstimator;
16
+ private stateId;
17
+ constructor(store: JsStore, options?: {
18
+ estimator?: (text: string) => number;
19
+ /** Namespace for multi-agent support. Creates state ID: `{namespace}/context` */
20
+ namespace?: string;
21
+ });
22
+ /**
23
+ * Register the context log state in Chronicle.
24
+ * Should be called once when setting up the store.
25
+ *
26
+ * @param store The Chronicle store
27
+ * @param namespace Optional namespace for multi-agent support
28
+ */
29
+ static register(store: JsStore, namespace?: string): void;
30
+ private rebuildSourceIndex;
31
+ /**
32
+ * Append a new entry to the context log.
33
+ */
34
+ append(participant: string, content: ContentBlock[], sourceMessageId?: MessageId, sourceRelation?: SourceRelation, cacheMarker?: boolean): ContextEntry;
35
+ /**
36
+ * Edit an entry's content at a specific index.
37
+ */
38
+ edit(index: number, content: ContentBlock[]): void;
39
+ /**
40
+ * Remove an entry at a specific index.
41
+ */
42
+ remove(index: number): void;
43
+ /**
44
+ * Remove a range of entries.
45
+ */
46
+ removeRange(start: number, end: number): void;
47
+ /**
48
+ * Replace the entire context log with new entries.
49
+ * Useful for strategies that rebuild the context.
50
+ */
51
+ replaceAll(entries: Array<{
52
+ participant: string;
53
+ content: ContentBlock[];
54
+ sourceMessageId?: MessageId;
55
+ sourceRelation?: SourceRelation;
56
+ cacheMarker?: boolean;
57
+ }>): ContextEntry[];
58
+ /**
59
+ * Get an entry by index.
60
+ */
61
+ get(index: number): ContextEntry | null;
62
+ /**
63
+ * Get all entries.
64
+ */
65
+ getAll(): ContextEntry[];
66
+ /**
67
+ * Get entries from a specific index.
68
+ */
69
+ getFrom(index: number): ContextEntry[];
70
+ /**
71
+ * Get the last N entries.
72
+ */
73
+ getTail(count: number): ContextEntry[];
74
+ /**
75
+ * Get the total number of entries.
76
+ */
77
+ length(): number;
78
+ /**
79
+ * Find all entries that reference a specific source message.
80
+ */
81
+ findBySource(sourceMessageId: MessageId): ContextEntry[];
82
+ /**
83
+ * Get the source relation for entries referencing a message.
84
+ */
85
+ getSourceRelation(sourceMessageId: MessageId): Map<number, SourceRelation | undefined>;
86
+ /**
87
+ * Estimate tokens for an entry.
88
+ */
89
+ estimateTokens(entry: ContextEntry): number;
90
+ private estimateBlockTokens;
91
+ /**
92
+ * Create a read-only view of the log for strategies.
93
+ */
94
+ createView(): ContextLogView;
95
+ private getAllInternal;
96
+ private getInternal;
97
+ private internalToEntry;
98
+ }
99
+ //# sourceMappingURL=context-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-log.d.ts","sourceRoot":"","sources":["../../src/context-log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAK1B;;;;;;GAMG;AACH,qBAAa,UAAU;IAOnB,OAAO,CAAC,KAAK;IANf,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,OAAO,CAAS;gBAGd,KAAK,EAAE,OAAO,EACtB,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;QACrC,iFAAiF;QACjF,SAAS,CAAC,EAAE,MAAM,CAAC;KACf;IAUR;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAUzD,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,MAAM,CACJ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,YAAY,EAAE,EACvB,eAAe,CAAC,EAAE,SAAS,EAC3B,cAAc,CAAC,EAAE,cAAc,EAC/B,WAAW,CAAC,EAAE,OAAO,GACpB,YAAY;IAgCf;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAelD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU3B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAK7C;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,YAAY,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,SAAS,CAAC;QAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC,GAAG,YAAY,EAAE;IAsBnB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQvC;;OAEG;IACH,MAAM,IAAI,YAAY,EAAE;IAIxB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAItC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAKtC;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,YAAY,CAAC,eAAe,EAAE,SAAS,GAAG,YAAY,EAAE;IAgBxD;;OAEG;IACH,iBAAiB,CAAC,eAAe,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IAgBtF;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAQ3C,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,UAAU,IAAI,cAAc;IAU5B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,277 @@
1
+ import { BlobManager } from './blob-manager.js';
2
+ const DEFAULT_CONTEXT_STATE_ID = 'context';
3
+ /**
4
+ * Wrapper around Chronicle append_log state for context log storage.
5
+ * The context log is a materialized, editable working set derived from the message store.
6
+ *
7
+ * Supports namespacing for multi-agent scenarios where each agent has its own context log
8
+ * but shares the same message store.
9
+ */
10
+ export class ContextLog {
11
+ store;
12
+ blobManager;
13
+ sourceToIndices = new Map();
14
+ tokenEstimator;
15
+ stateId;
16
+ constructor(store, options = {}) {
17
+ this.store = store;
18
+ this.stateId = options.namespace
19
+ ? `${options.namespace}/context`
20
+ : DEFAULT_CONTEXT_STATE_ID;
21
+ this.blobManager = new BlobManager(store);
22
+ this.tokenEstimator = options.estimator ?? defaultTokenEstimator;
23
+ this.rebuildSourceIndex();
24
+ }
25
+ /**
26
+ * Register the context log state in Chronicle.
27
+ * Should be called once when setting up the store.
28
+ *
29
+ * @param store The Chronicle store
30
+ * @param namespace Optional namespace for multi-agent support
31
+ */
32
+ static register(store, namespace) {
33
+ const stateId = namespace ? `${namespace}/context` : DEFAULT_CONTEXT_STATE_ID;
34
+ store.registerState({
35
+ id: stateId,
36
+ strategy: 'append_log',
37
+ deltaSnapshotEvery: 50,
38
+ fullSnapshotEvery: 10,
39
+ });
40
+ }
41
+ rebuildSourceIndex() {
42
+ this.sourceToIndices.clear();
43
+ const entries = this.getAllInternal();
44
+ for (let i = 0; i < entries.length; i++) {
45
+ const entry = entries[i];
46
+ if (entry.sourceMessageId) {
47
+ const set = this.sourceToIndices.get(entry.sourceMessageId) ?? new Set();
48
+ set.add(i);
49
+ this.sourceToIndices.set(entry.sourceMessageId, set);
50
+ }
51
+ }
52
+ }
53
+ /**
54
+ * Append a new entry to the context log.
55
+ */
56
+ append(participant, content, sourceMessageId, sourceRelation, cacheMarker) {
57
+ const storedContent = this.blobManager.extractBlobs(content);
58
+ const index = this.length();
59
+ const internal = {
60
+ index,
61
+ sourceMessageId,
62
+ sourceRelation,
63
+ participant,
64
+ content: storedContent,
65
+ cacheMarker,
66
+ };
67
+ this.store.appendToStateJson(this.stateId, internal);
68
+ // Update source index
69
+ if (sourceMessageId) {
70
+ const set = this.sourceToIndices.get(sourceMessageId) ?? new Set();
71
+ set.add(index);
72
+ this.sourceToIndices.set(sourceMessageId, set);
73
+ }
74
+ return {
75
+ index,
76
+ sourceMessageId,
77
+ sourceRelation,
78
+ participant,
79
+ content,
80
+ cacheMarker,
81
+ };
82
+ }
83
+ /**
84
+ * Edit an entry's content at a specific index.
85
+ */
86
+ edit(index, content) {
87
+ const internal = this.getInternal(index);
88
+ if (!internal) {
89
+ throw new Error(`Context entry not found at index: ${index}`);
90
+ }
91
+ const storedContent = this.blobManager.extractBlobs(content);
92
+ const updated = {
93
+ ...internal,
94
+ content: storedContent,
95
+ };
96
+ this.store.editStateItem(this.stateId, index, Buffer.from(JSON.stringify(updated)));
97
+ }
98
+ /**
99
+ * Remove an entry at a specific index.
100
+ */
101
+ remove(index) {
102
+ const internal = this.getInternal(index);
103
+ if (!internal) {
104
+ throw new Error(`Context entry not found at index: ${index}`);
105
+ }
106
+ this.store.redactStateItems(this.stateId, index, index + 1);
107
+ this.rebuildSourceIndex();
108
+ }
109
+ /**
110
+ * Remove a range of entries.
111
+ */
112
+ removeRange(start, end) {
113
+ this.store.redactStateItems(this.stateId, start, end);
114
+ this.rebuildSourceIndex();
115
+ }
116
+ /**
117
+ * Replace the entire context log with new entries.
118
+ * Useful for strategies that rebuild the context.
119
+ */
120
+ replaceAll(entries) {
121
+ // Clear existing entries
122
+ const len = this.length();
123
+ if (len > 0) {
124
+ this.store.redactStateItems(this.stateId, 0, len);
125
+ }
126
+ // Add new entries
127
+ const result = [];
128
+ for (const entry of entries) {
129
+ result.push(this.append(entry.participant, entry.content, entry.sourceMessageId, entry.sourceRelation, entry.cacheMarker));
130
+ }
131
+ return result;
132
+ }
133
+ /**
134
+ * Get an entry by index.
135
+ */
136
+ get(index) {
137
+ const internal = this.getInternal(index);
138
+ if (!internal) {
139
+ return null;
140
+ }
141
+ return this.internalToEntry(internal);
142
+ }
143
+ /**
144
+ * Get all entries.
145
+ */
146
+ getAll() {
147
+ return this.getAllInternal().map((internal) => this.internalToEntry(internal));
148
+ }
149
+ /**
150
+ * Get entries from a specific index.
151
+ */
152
+ getFrom(index) {
153
+ return this.getAll().slice(index);
154
+ }
155
+ /**
156
+ * Get the last N entries.
157
+ */
158
+ getTail(count) {
159
+ const all = this.getAll();
160
+ return all.slice(Math.max(0, all.length - count));
161
+ }
162
+ /**
163
+ * Get the total number of entries.
164
+ */
165
+ length() {
166
+ return this.store.getStateLen(this.stateId) ?? 0;
167
+ }
168
+ /**
169
+ * Find all entries that reference a specific source message.
170
+ */
171
+ findBySource(sourceMessageId) {
172
+ const indices = this.sourceToIndices.get(sourceMessageId);
173
+ if (!indices) {
174
+ return [];
175
+ }
176
+ const entries = [];
177
+ for (const index of indices) {
178
+ const entry = this.get(index);
179
+ if (entry) {
180
+ entries.push(entry);
181
+ }
182
+ }
183
+ return entries;
184
+ }
185
+ /**
186
+ * Get the source relation for entries referencing a message.
187
+ */
188
+ getSourceRelation(sourceMessageId) {
189
+ const result = new Map();
190
+ const indices = this.sourceToIndices.get(sourceMessageId);
191
+ if (!indices) {
192
+ return result;
193
+ }
194
+ for (const index of indices) {
195
+ const entry = this.get(index);
196
+ if (entry) {
197
+ result.set(index, entry.sourceRelation);
198
+ }
199
+ }
200
+ return result;
201
+ }
202
+ /**
203
+ * Estimate tokens for an entry.
204
+ */
205
+ estimateTokens(entry) {
206
+ let tokens = 0;
207
+ for (const block of entry.content) {
208
+ tokens += this.estimateBlockTokens(block);
209
+ }
210
+ return tokens;
211
+ }
212
+ estimateBlockTokens(block) {
213
+ switch (block.type) {
214
+ case 'text':
215
+ return this.tokenEstimator(block.text);
216
+ case 'thinking':
217
+ return this.tokenEstimator(block.thinking);
218
+ case 'tool_use':
219
+ return this.tokenEstimator(JSON.stringify(block.input)) + 20;
220
+ case 'tool_result':
221
+ if (!block.content)
222
+ return 0;
223
+ if (typeof block.content === 'string') {
224
+ return this.tokenEstimator(block.content);
225
+ }
226
+ return block.content.reduce((sum, b) => sum + this.estimateBlockTokens(b), 0);
227
+ case 'image':
228
+ return block.tokenEstimate ?? 1000;
229
+ case 'document':
230
+ case 'audio':
231
+ case 'video':
232
+ return 1000;
233
+ default:
234
+ return 0;
235
+ }
236
+ }
237
+ /**
238
+ * Create a read-only view of the log for strategies.
239
+ */
240
+ createView() {
241
+ return {
242
+ getAll: () => this.getAll(),
243
+ getFrom: (index) => this.getFrom(index),
244
+ getTail: (count) => this.getTail(count),
245
+ length: () => this.length(),
246
+ estimateTokens: (entry) => this.estimateTokens(entry),
247
+ };
248
+ }
249
+ getAllInternal() {
250
+ const state = this.store.getStateJson(this.stateId);
251
+ if (!state || !Array.isArray(state)) {
252
+ return [];
253
+ }
254
+ return state;
255
+ }
256
+ getInternal(index) {
257
+ const all = this.getAllInternal();
258
+ return all[index] ?? null;
259
+ }
260
+ internalToEntry(internal) {
261
+ return {
262
+ index: internal.index,
263
+ sourceMessageId: internal.sourceMessageId,
264
+ sourceRelation: internal.sourceRelation,
265
+ participant: internal.participant,
266
+ content: this.blobManager.resolveBlobs(internal.content),
267
+ cacheMarker: internal.cacheMarker,
268
+ };
269
+ }
270
+ }
271
+ /**
272
+ * Default token estimator: chars / 4
273
+ */
274
+ function defaultTokenEstimator(text) {
275
+ return Math.ceil(text.length / 4);
276
+ }
277
+ //# sourceMappingURL=context-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-log.js","sourceRoot":"","sources":["../../src/context-log.ts"],"names":[],"mappings":"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"}