@cortexkit/opencode-magic-context 0.14.2 → 0.15.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.
@@ -308,6 +308,24 @@ export interface MagicContextConfig {
308
308
  /** Minimum user message length in characters (skip short prompts). */
309
309
  min_prompt_chars: number;
310
310
  };
311
+ /**
312
+ * Age-tier caveman compression for long user/assistant text parts.
313
+ *
314
+ * Only active when `ctx_reduce_enabled: false`. Buckets eligible
315
+ * (outside-protected-tail) messages into four age tiers by tag
316
+ * position — oldest 20% → ultra, next 20% → full, next 20% → lite,
317
+ * newest 40% → untouched — and rewrites the text part in place.
318
+ * Always compresses from the original source (source_contents), so
319
+ * tier shifts produce the same result as if the target depth were
320
+ * applied directly to the original text.
321
+ *
322
+ * Disabled by default because it rewrites agent-visible history.
323
+ */
324
+ caveman_text_compression: {
325
+ enabled: boolean;
326
+ /** Text parts shorter than this (characters) are left untouched. */
327
+ min_chars: number;
328
+ };
311
329
  };
312
330
  embedding: EmbeddingConfig;
313
331
  memory: {
@@ -511,6 +529,10 @@ export declare const MagicContextConfigSchema: z.ZodPipe<z.ZodObject<{
511
529
  score_threshold: z.ZodDefault<z.ZodNumber>;
512
530
  min_prompt_chars: z.ZodDefault<z.ZodNumber>;
513
531
  }, z.core.$strip>>;
532
+ caveman_text_compression: z.ZodDefault<z.ZodObject<{
533
+ enabled: z.ZodDefault<z.ZodBoolean>;
534
+ min_chars: z.ZodDefault<z.ZodNumber>;
535
+ }, z.core.$strip>>;
514
536
  }, z.core.$strip>>;
515
537
  memory: z.ZodDefault<z.ZodObject<{
516
538
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -626,6 +648,10 @@ export declare const MagicContextConfigSchema: z.ZodPipe<z.ZodObject<{
626
648
  score_threshold: number;
627
649
  min_prompt_chars: number;
628
650
  };
651
+ caveman_text_compression: {
652
+ enabled: boolean;
653
+ min_chars: number;
654
+ };
629
655
  };
630
656
  memory: {
631
657
  enabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"magic-context.d.ts","sourceRoot":"","sources":["../../../src/config/schema/magic-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,6BAA6B,QAAS,CAAC;AACpD,eAAO,MAAM,oCAAoC,KAAK,CAAC;AACvD,eAAO,MAAM,4BAA4B,SAAU,CAAC;AACpD,eAAO,MAAM,iCAAiC,OAAO,CAAC;AACtD,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AACvE,0EAA0E;AAC1E,eAAO,MAAM,wCAAwC,OAAO,CAAC;AAC7D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,8BAA8B,SAAU,CAAC;AACtD;8FAC8F;AAC9F,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAC/D;;yFAEyF;AACzF,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD;+EAC+E;AAC/E,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMlE,CAAC;AAEF,eAAO,MAAM,aAAa,iFAMhB,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;;EAAwB,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,qBAAqB,EAAE,YAAY,EAK/C,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2C/B,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAIpB,CAAC;AACd,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC;AAE/E;;;;2CAI2C;AAC3C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAKrB,CAAC;AACd,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC;AA2BjF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;GAmBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB;;oFAEgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvF;;uGAEmG;IACnG,wBAAwB,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAClC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,yBAAyB,EAAE,MAAM,CAAC;QAClC,kBAAkB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,YAAY,EAAE;QACV;+EACuE;QACvE,kBAAkB,EAAE,OAAO,CAAC;QAC5B;;+DAEuD;QACvD,mBAAmB,EAAE;YACjB,OAAO,EAAE,OAAO,CAAC;YACjB,8CAA8C;YAC9C,UAAU,EAAE,MAAM,CAAC;YACnB,mEAAmE;YACnE,WAAW,EAAE,MAAM,CAAC;SACvB,CAAC;QACF;;;uDAG+C;QAC/C,WAAW,EAAE;YACT,OAAO,EAAE,OAAO,CAAC;YACjB,qEAAqE;YACrE,eAAe,EAAE,MAAM,CAAC;YACxB,sEAAsE;YACtE,gBAAgB,EAAE,MAAM,CAAC;SAC5B,CAAC;KACL,CAAC;IACF,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,uBAAuB,EAAE,MAAM,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC;QACtB,mCAAmC,EAAE,MAAM,CAAC;KAC/C,CAAC;IACF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkM/B,CAAC"}
1
+ {"version":3,"file":"magic-context.d.ts","sourceRoot":"","sources":["../../../src/config/schema/magic-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage-db.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkBtC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA6UrD;AAsHD,wBAAgB,YAAY,IAAI,QAAQ,CAsCvC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAEzD;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAUpC;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"storage-db.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkBtC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAoVrD;AAsHD,wBAAgB,YAAY,IAAI,QAAQ,CAsCvC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAEzD;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAUpC;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -3,6 +3,14 @@ import type { TagEntry } from "./types";
3
3
  export declare function insertTag(db: Database, sessionId: string, messageId: string, type: TagEntry["type"], byteSize: number, tagNumber: number, reasoningByteSize?: number, toolName?: string | null, inputByteSize?: number): number;
4
4
  export declare function updateTagStatus(db: Database, sessionId: string, tagId: number, status: TagEntry["status"]): void;
5
5
  export declare function updateTagDropMode(db: Database, sessionId: string, tagNumber: number, dropMode: TagEntry["dropMode"]): void;
6
+ /**
7
+ * Set the caveman compression depth for a tag.
8
+ *
9
+ * Only message tags are expected to receive non-zero depth; callers enforce
10
+ * that. Persisted so later transform passes and restarts can resume without
11
+ * re-compressing text that already matches its target age-tier depth.
12
+ */
13
+ export declare function updateCavemanDepth(db: Database, sessionId: string, tagNumber: number, depth: number): void;
6
14
  export declare function updateTagMessageId(db: Database, sessionId: string, tagId: number, messageId: string): void;
7
15
  export declare function deleteTagsByMessageId(db: Database, sessionId: string, messageId: string): number[];
8
16
  export declare function getMaxTagNumberBySession(db: Database, sessionId: string): number;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-tags.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0JxC,wBAAgB,SAAS,CACrB,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,iBAAiB,GAAE,MAAU,EAC7B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,aAAa,GAAE,MAAU,GAC1B,MAAM,CAaR;AAED,wBAAgB,eAAe,CAC3B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,iBAAiB,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC/B,IAAI,CAEN;AAED,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAClB,IAAI,CAEN;AAED,wBAAgB,qBAAqB,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAClB,MAAM,EAAE,CAoBV;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,CAS5E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAY1F;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAapF"}
1
+ {"version":3,"file":"storage-tags.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAiKxC,wBAAgB,SAAS,CACrB,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,iBAAiB,GAAE,MAAU,EAC7B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,aAAa,GAAE,MAAU,GAC1B,MAAM,CAaR;AAED,wBAAgB,eAAe,CAC3B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,iBAAiB,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC/B,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACd,IAAI,CAMN;AAED,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAClB,IAAI,CAEN;AAED,wBAAgB,qBAAqB,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAClB,MAAM,EAAE,CAoBV;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,CAS5E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAY1F;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAapF"}
@@ -6,5 +6,5 @@ export { clearDetectedContextLimit, clearEmergencyRecovery, clearHistorianFailur
6
6
  export { addNote, deleteNote, dismissNote, getNotes, getPendingSmartNotes, getReadySmartNotes, getSessionNotes, getSmartNotes, markNoteChecked, markNoteReady, type Note, type NoteStatus, type NoteType, replaceAllSessionNotes, updateNote, } from "./storage-notes";
7
7
  export { clearPendingOps, getPendingOps, queuePendingOp, removePendingOp, } from "./storage-ops";
8
8
  export { getSourceContents, replaceSourceContent, saveSourceContent, } from "./storage-source";
9
- export { deleteTagsByMessageId, getMaxTagNumberBySession, getTagById, getTagsBySession, getTopNBySize, insertTag, updateTagDropMode, updateTagMessageId, updateTagStatus, } from "./storage-tags";
9
+ export { deleteTagsByMessageId, getMaxTagNumberBySession, getTagById, getTagsBySession, getTopNBySize, insertTag, updateCavemanDepth, updateTagDropMode, updateTagMessageId, updateTagStatus, } from "./storage-tags";
10
10
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,KAAK,WAAW,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,EACpB,oBAAoB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,KAAK,eAAe,EACpB,aAAa,EACb,2BAA2B,EAC3B,mBAAmB,EACnB,YAAY,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,EAChC,gCAAgC,EAChC,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,iBAAiB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,OAAO,EACP,UAAU,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,sBAAsB,EACtB,UAAU,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAClB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,KAAK,WAAW,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,EACpB,oBAAoB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,KAAK,eAAe,EACpB,aAAa,EACb,2BAA2B,EAC3B,mBAAmB,EACnB,YAAY,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,EAChC,gCAAgC,EAChC,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,iBAAiB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,OAAO,EACP,UAAU,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,sBAAsB,EACtB,UAAU,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAClB,MAAM,gBAAgB,CAAC"}
@@ -9,6 +9,14 @@ export interface TagEntry {
9
9
  byteSize: number;
10
10
  reasoningByteSize: number;
11
11
  sessionId: string;
12
+ /**
13
+ * Caveman compression depth applied to this tag's text part. 0 = none,
14
+ * 1 = lite, 2 = full, 3 = ultra. Only meaningful for `type: "message"`;
15
+ * tool/file tags stay at 0. Used by experimental age-tier caveman
16
+ * heuristic to avoid re-compressing text that already matches the
17
+ * target depth for its age band.
18
+ */
19
+ cavemanDepth: number;
12
20
  }
13
21
  export interface PendingOp {
14
22
  id: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B,EAAE,MAAM,CAAC;IACrC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B,EAAE,MAAM,CAAC;IACrC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Age-tier caveman text compression for long user/assistant text parts.
3
+ *
4
+ * Two entry points:
5
+ *
6
+ * 1. `applyCavemanCleanup` — runs ONLY on cache-busting heuristic passes
7
+ * (execute / flush / force-materialize) and is the only path that may
8
+ * INCREASE `tags.caveman_depth`. Computes age tiers (20/20/20/40),
9
+ * persists the new depth, and applies the compressed text in place.
10
+ *
11
+ * 2. `replayCavemanCompression` — runs on EVERY transform pass (defer too)
12
+ * and re-applies the persisted depth to message text without ever
13
+ * increasing it. This exists because `tagMessages` restores
14
+ * `textPart.text = source_contents.content` (the pristine original) on
15
+ * every pass; without a replay step the compressed text would oscillate
16
+ * between compressed (post-execute) and original (defer), which would
17
+ * bust the provider prompt cache on every turn.
18
+ *
19
+ * Partitioning: eligible tags (message-type, active, byte_size >= threshold,
20
+ * tag_number <= protected cutoff) are sorted by tag_number ascending, then
21
+ * bucketed 20/20/20/40:
22
+ * - oldest 20% → ultra
23
+ * - next 20% → full
24
+ * - next 20% → lite
25
+ * - newest 40% → untouched
26
+ *
27
+ * Source-of-truth invariant: compression is ALWAYS computed from the
28
+ * pristine original (`source_contents.content`), never from an already-
29
+ * cavemaned intermediate. So repeated tier shifts converge identically to
30
+ * direct compression at the target depth, and the replay path can produce
31
+ * the exact same output as the original execute pass.
32
+ *
33
+ * Persisted state:
34
+ * - tags.caveman_depth records the applied depth
35
+ * - source_contents.content is unchanged (remains the pristine original)
36
+ * - message-part text holds the cavemaned result visible to the agent
37
+ */
38
+ import type { ContextDatabase } from "../../features/magic-context/storage";
39
+ import type { TagEntry } from "../../features/magic-context/types";
40
+ import type { TagTarget } from "./tag-messages";
41
+ export interface CavemanCleanupConfig {
42
+ enabled: boolean;
43
+ minChars: number;
44
+ }
45
+ export interface CavemanCleanupResult {
46
+ compressedToLite: number;
47
+ compressedToFull: number;
48
+ compressedToUltra: number;
49
+ }
50
+ /**
51
+ * Compute target caveman depth for a tag by its position in the sorted
52
+ * eligible list. Visible for testing.
53
+ */
54
+ export declare function computeTargetDepth(positionIndex: number, totalEligible: number): number;
55
+ /**
56
+ * Apply age-tier caveman compression to eligible message tags.
57
+ *
58
+ * Preconditions: caller has already acquired the DB transaction context for
59
+ * this heuristic pass (or this function opens its own). Caller is expected
60
+ * to gate on `ctx_reduce_enabled === false` and `config.enabled === true`.
61
+ */
62
+ export declare function applyCavemanCleanup(sessionId: string, db: ContextDatabase, targets: Map<number, TagTarget>, tags: TagEntry[], config: CavemanCleanupConfig & {
63
+ protectedTags: number;
64
+ }): CavemanCleanupResult;
65
+ /**
66
+ * Re-apply persisted caveman compression on every transform pass (defer
67
+ * included). This is the cache-stability counterpart to applyCavemanCleanup.
68
+ *
69
+ * Why this exists: tagMessages restores `textPart.text = source_contents.content`
70
+ * (the pristine original) for every existing tag on every pass. Without this
71
+ * replay step, a tag compressed during an execute pass would revert to its
72
+ * original text on the next defer pass. Anthropic's prompt cache hashes the
73
+ * full message prefix, so an oscillating tag would bust cache on every turn
74
+ * after compression first runs.
75
+ *
76
+ * Mirrors the pattern used by replayClearedReasoning / replayStrippedInline
77
+ * for typed reasoning. Pure read \u2014 never increases caveman_depth, never
78
+ * mutates the database. Only execute/flush passes (via applyCavemanCleanup)
79
+ * can deepen the depth.
80
+ *
81
+ * Idempotent: cavemanCompress is deterministic over (originalText, level),
82
+ * so calling this on every pass produces the exact same text the original
83
+ * execute pass produced.
84
+ */
85
+ export declare function replayCavemanCompression(sessionId: string, db: ContextDatabase, targets: Map<number, TagTarget>, tags: TagEntry[]): number;
86
+ //# sourceMappingURL=caveman-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caveman-cleanup.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/caveman-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAahD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAOvF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,IAAI,EAAE,QAAQ,EAAE,EAChB,MAAM,EAAE,oBAAoB,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzD,oBAAoB,CAoGtB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CACpC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,IAAI,EAAE,QAAQ,EAAE,GACjB,MAAM,CA0CR"}
@@ -1,14 +1,22 @@
1
1
  import type { ContextDatabase } from "../../features/magic-context/storage";
2
2
  import type { TagEntry } from "../../features/magic-context/types";
3
+ import { type CavemanCleanupConfig } from "./caveman-cleanup";
3
4
  import type { MessageLike, TagTarget } from "./tag-messages";
4
5
  export declare function applyHeuristicCleanup(sessionId: string, db: ContextDatabase, targets: Map<number, TagTarget>, messageTagNumbers: Map<MessageLike, number>, config: {
5
6
  autoDropToolAge: number;
6
7
  dropToolStructure: boolean;
7
8
  protectedTags: number;
8
9
  dropAllTools?: boolean;
10
+ /**
11
+ * Age-tier caveman text compression settings. Only honored when the
12
+ * session is running with ctx_reduce_enabled=false — caller is
13
+ * responsible for zeroing this out when ctx_reduce is on.
14
+ */
15
+ caveman?: CavemanCleanupConfig;
9
16
  }, preloadedTags?: TagEntry[]): {
10
17
  droppedTools: number;
11
18
  deduplicatedTools: number;
12
19
  droppedInjections: number;
20
+ compressedTextTags: number;
13
21
  };
14
22
  //# sourceMappingURL=heuristic-cleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"heuristic-cleanup.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/heuristic-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAO5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAe7D,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,EAC3C,MAAM,EAAE;IACJ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,aAAa,CAAC,EAAE,QAAQ,EAAE,GAC3B;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAqIhF"}
1
+ {"version":3,"file":"heuristic-cleanup.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/heuristic-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAO5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEnF,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAe7D,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,EAC3C,MAAM,EAAE;IACJ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAClC,EACD,aAAa,CAAC,EAAE,QAAQ,EAAE,GAC3B;IACC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC9B,CAsJA"}
@@ -65,6 +65,10 @@ export interface MagicContextDeps {
65
65
  score_threshold: number;
66
66
  min_prompt_chars: number;
67
67
  };
68
+ caveman_text_compression?: {
69
+ enabled: boolean;
70
+ min_chars: number;
71
+ };
68
72
  };
69
73
  };
70
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/hook.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt-hash.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/system-prompt-hash.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,KAAK,eAAe,EAGvB,MAAM,sCAAsC,CAAC;AAiB9C;;;;;GAKG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE;IACR,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACnD,GACF,IAAI,CAKN;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAChD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,kFAAkF;IAClF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,2DAA2D;IAC3D,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,yFAAyF;IACzF,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C,GAAG;IACA,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,CA8RA"}
1
+ {"version":3,"file":"system-prompt-hash.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/system-prompt-hash.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,KAAK,eAAe,EAGvB,MAAM,sCAAsC,CAAC;AAiB9C;;;;;GAKG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE;IACR,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACnD,GACF,IAAI,CAKN;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAChD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,kFAAkF;IAClF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,2DAA2D;IAC3D,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,yFAAyF;IACzF,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C,GAAG;IACA,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,CA0SA"}
@@ -32,5 +32,17 @@ export interface TagMessagesResult {
32
32
  /** Whether recent assistant messages contain git commit hash patterns */
33
33
  hasRecentCommit: boolean;
34
34
  }
35
- export declare function tagMessages(sessionId: string, messages: MessageLike[], tagger: Tagger, db: ContextDatabase): TagMessagesResult;
35
+ export interface TagMessagesOptions {
36
+ /**
37
+ * When true, skip injecting §N§ prefix into message text/tool output parts.
38
+ * DB-level tag records are still created normally — this flag only affects
39
+ * whether the agent-visible part content gets the tag prefix. Used when
40
+ * `ctx_reduce_enabled: false` so agents don't see tag markers they can't
41
+ * act on. Subagents also set this flag (they are always treated as
42
+ * ctx_reduce_enabled=false). Cache-safe: skipping is consistent across
43
+ * passes, so message shape stays stable.
44
+ */
45
+ skipPrefixInjection?: boolean;
46
+ }
47
+ export declare function tagMessages(sessionId: string, messages: MessageLike[], tagger: Tagger, db: ContextDatabase, options?: TagMessagesOptions): TagMessagesResult;
36
48
  //# sourceMappingURL=tag-messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tag-messages.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/tag-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAYlE,OAAO,EAGH,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,iBAAiB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,SAAS,GAAG;IACpB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,WAAW,CAAC;CACzB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,kBAAkB,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzD,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yEAAyE;IACzE,eAAe,EAAE,OAAO,CAAC;CAC5B;AAkED,wBAAgB,WAAW,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,eAAe,GACpB,iBAAiB,CAuPnB"}
1
+ {"version":3,"file":"tag-messages.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/tag-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAYlE,OAAO,EAGH,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,iBAAiB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,SAAS,GAAG;IACpB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,WAAW,CAAC;CACzB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,kBAAkB,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzD,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yEAAyE;IACzE,eAAe,EAAE,OAAO,CAAC;CAC5B;AAkED,MAAM,WAAW,kBAAkB;IAC/B;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,WAAW,CACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,eAAe,EACnB,OAAO,GAAE,kBAAuB,GACjC,iBAAiB,CA4PnB"}
@@ -68,6 +68,15 @@ interface RunPostTransformPhaseArgs {
68
68
  embeddingEnabled: boolean;
69
69
  gitCommitsEnabled: boolean;
70
70
  };
71
+ /**
72
+ * Age-tier caveman compression (experimental). Only honored when
73
+ * ctx_reduce_enabled is false. Caller is responsible for zeroing this
74
+ * out when ctx_reduce is on. Passed through to `applyHeuristicCleanup`.
75
+ */
76
+ cavemanTextCompression?: {
77
+ enabled: boolean;
78
+ minChars: number;
79
+ };
71
80
  }
72
81
  export declare function runPostTransformPhase(args: RunPostTransformPhaseArgs): Promise<void>;
73
82
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"transform-postprocess-phase.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/transform-postprocess-phase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-postprocess-phase.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/transform-postprocess-phase.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,eAAe,EAKpB,aAAa,EAIhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAQhF,OAAO,EAEH,KAAK,4BAA4B,EAEpC,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAc7C,OAAO,EAEH,KAAK,WAAW,EAEhB,KAAK,SAAS,EAEjB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,yBAAyB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,kBAAkB,EAAE,GAAG,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC3F,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,iBAAiB,EAAE,SAAS,GAAG,OAAO,CAAC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,mBAAmB,CAAC;IACrC,MAAM,EAAE,CACJ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EACzD,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,OAAO,aAAa,EAC5B,aAAa,CAAC,EAAE,QAAQ,EAAE,EAC1B,qBAAqB,CAAC,EAAE,MAAM,EAC9B,oBAAoB,CAAC,EAAE,WAAW,KACjC,YAAY,GAAG,IAAI,CAAC;IACzB,2BAA2B,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACjE,4BAA4B,EAAE,OAAO,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B,EAAE,MAAM,CAAC;IACvC,mBAAmB,EAAE,OAAO,CAAC;IAC7B;;;;;;;;;OASG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;2DACuD;IACvD,UAAU,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF;;;;OAIG;IACH,sBAAsB,CAAC,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;CACL;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4gB1F"}
@@ -28,6 +28,14 @@ export interface TransformDeps {
28
28
  db: ContextDatabase;
29
29
  nudgePlacements: NudgePlacementStore;
30
30
  protectedTags: number;
31
+ /**
32
+ * Primary-session ctx_reduce setting. When false, tag prefix injection is
33
+ * skipped for ALL sessions (primary + subagent). When true, primary sessions
34
+ * get prefixes but subagent sessions still skip (subagents are always
35
+ * treated as ctx_reduce_enabled=false). See tag-messages.ts for the gate.
36
+ * Defaults to true when omitted (preserves legacy behavior for tests).
37
+ */
38
+ ctxReduceEnabled?: boolean;
31
39
  autoDropToolAge: number;
32
40
  dropToolStructure?: boolean;
33
41
  clearReasoningAge: number;
@@ -90,6 +98,17 @@ export interface TransformDeps {
90
98
  embeddingEnabled: boolean;
91
99
  gitCommitsEnabled: boolean;
92
100
  };
101
+ /**
102
+ * Experimental age-tier caveman text compression — rewrites long
103
+ * user/assistant text parts with progressively aggressive caveman
104
+ * rules based on their position in the eligible tag window. Only
105
+ * honored when `ctx_reduce_enabled: false` (transform zeroes this
106
+ * out when ctx_reduce is on so the postprocess path stays unaware).
107
+ */
108
+ cavemanTextCompression?: {
109
+ enabled: boolean;
110
+ minChars: number;
111
+ };
93
112
  }
94
113
  export declare function createTransform(deps: TransformDeps): (_input: Record<string, never>, output: {
95
114
  messages: unknown[];
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/transform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/transform.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14215,11 +14215,16 @@ var init_magic_context = __esm(() => {
14215
14215
  enabled: exports_external.boolean().default(false),
14216
14216
  score_threshold: exports_external.number().min(0.3).max(0.95).default(0.55),
14217
14217
  min_prompt_chars: exports_external.number().min(5).max(500).default(20)
14218
- }).default({ enabled: false, score_threshold: 0.55, min_prompt_chars: 20 })
14218
+ }).default({ enabled: false, score_threshold: 0.55, min_prompt_chars: 20 }),
14219
+ caveman_text_compression: exports_external.object({
14220
+ enabled: exports_external.boolean().default(false),
14221
+ min_chars: exports_external.number().min(100).max(1e4).default(500)
14222
+ }).default({ enabled: false, min_chars: 500 })
14219
14223
  }).default({
14220
14224
  temporal_awareness: false,
14221
14225
  git_commit_indexing: { enabled: false, since_days: 365, max_commits: 2000 },
14222
- auto_search: { enabled: false, score_threshold: 0.55, min_prompt_chars: 20 }
14226
+ auto_search: { enabled: false, score_threshold: 0.55, min_prompt_chars: 20 },
14227
+ caveman_text_compression: { enabled: false, min_chars: 500 }
14223
14228
  }),
14224
14229
  memory: exports_external.object({
14225
14230
  enabled: exports_external.boolean().default(true),
@@ -150849,6 +150854,7 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
150849
150854
  ensureColumn(db, "tags", "drop_mode", "TEXT DEFAULT 'full'");
150850
150855
  ensureColumn(db, "tags", "tool_name", "TEXT");
150851
150856
  ensureColumn(db, "tags", "input_byte_size", "INTEGER DEFAULT 0");
150857
+ ensureColumn(db, "tags", "caveman_depth", "INTEGER DEFAULT 0");
150852
150858
  ensureColumn(db, "session_meta", "system_prompt_tokens", "INTEGER DEFAULT 0");
150853
150859
  ensureColumn(db, "session_meta", "compaction_marker_state", "TEXT DEFAULT ''");
150854
150860
  ensureColumn(db, "session_meta", "key_files", "TEXT DEFAULT ''");
@@ -151577,7 +151583,8 @@ function toTagEntry(row) {
151577
151583
  inputByteSize: row.input_byte_size ?? 0,
151578
151584
  byteSize: row.byte_size,
151579
151585
  reasoningByteSize: row.reasoning_byte_size ?? 0,
151580
- sessionId: row.session_id
151586
+ sessionId: row.session_id,
151587
+ cavemanDepth: typeof row.caveman_depth === "number" && Number.isFinite(row.caveman_depth) ? row.caveman_depth : 0
151581
151588
  };
151582
151589
  }
151583
151590
  function isTagNumberRow(row) {
@@ -151605,6 +151612,9 @@ function updateTagStatus(db, sessionId, tagId, status) {
151605
151612
  function updateTagDropMode(db, sessionId, tagNumber, dropMode) {
151606
151613
  getUpdateTagDropModeStatement(db).run(dropMode, sessionId, tagNumber);
151607
151614
  }
151615
+ function updateCavemanDepth(db, sessionId, tagNumber, depth) {
151616
+ db.prepare("UPDATE tags SET caveman_depth = ? WHERE session_id = ? AND tag_number = ?").run(depth, sessionId, tagNumber);
151617
+ }
151608
151618
  function updateTagMessageId(db, sessionId, tagId, messageId) {
151609
151619
  getUpdateTagMessageIdStatement(db).run(messageId, sessionId, tagId);
151610
151620
  }
@@ -151624,14 +151634,14 @@ function getMaxTagNumberBySession(db, sessionId) {
151624
151634
  return isMaxTagNumberRow(row) ? row.max_tag_number : 0;
151625
151635
  }
151626
151636
  function getTagsBySession(db, sessionId) {
151627
- const rows = db.prepare("SELECT id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number FROM tags WHERE session_id = ? ORDER BY tag_number ASC, id ASC").all(sessionId).filter(isTagRow);
151637
+ const rows = db.prepare("SELECT id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number, caveman_depth FROM tags WHERE session_id = ? ORDER BY tag_number ASC, id ASC").all(sessionId).filter(isTagRow);
151628
151638
  return rows.map(toTagEntry);
151629
151639
  }
151630
151640
  function getTopNBySize(db, sessionId, n) {
151631
151641
  if (n <= 0) {
151632
151642
  return [];
151633
151643
  }
151634
- const rows = db.prepare("SELECT id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number FROM tags WHERE session_id = ? AND status = 'active' ORDER BY byte_size DESC, tag_number ASC LIMIT ?").all(sessionId, n).filter(isTagRow);
151644
+ const rows = db.prepare("SELECT id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number, caveman_depth FROM tags WHERE session_id = ? AND status = 'active' ORDER BY byte_size DESC, tag_number ASC LIMIT ?").all(sessionId, n).filter(isTagRow);
151635
151645
  return rows.map(toTagEntry);
151636
151646
  }
151637
151647
  var insertTagStatements, updateTagStatusStatements, updateTagDropModeStatements, updateTagMessageIdStatements, getTagNumbersByMessageIdStatements, deleteTagsByMessageIdStatements, getMaxTagNumberBySessionStatements;
@@ -153602,108 +153612,6 @@ var init_note_nudger = __esm(() => {
153602
153612
  lastDeliveredAt = new Map;
153603
153613
  });
153604
153614
 
153605
- // src/features/magic-context/memory/embedding-backfill.ts
153606
- async function ensureMemoryEmbeddings(args) {
153607
- if (!isEmbeddingEnabled()) {
153608
- return args.existingEmbeddings;
153609
- }
153610
- const missingMemories = args.memories.filter((memory) => !args.existingEmbeddings.has(memory.id));
153611
- if (missingMemories.length === 0) {
153612
- return args.existingEmbeddings;
153613
- }
153614
- try {
153615
- const embeddings = await embedBatch(missingMemories.map((memory) => memory.content));
153616
- const modelId = getEmbeddingModelId();
153617
- const staged = new Map;
153618
- args.db.transaction(() => {
153619
- for (const [index, memory] of missingMemories.entries()) {
153620
- const embedding = embeddings[index];
153621
- if (!embedding) {
153622
- continue;
153623
- }
153624
- saveEmbedding(args.db, memory.id, embedding, modelId);
153625
- staged.set(memory.id, embedding);
153626
- }
153627
- })();
153628
- for (const [id, embedding] of staged) {
153629
- args.existingEmbeddings.set(id, embedding);
153630
- }
153631
- } catch (error48) {
153632
- log("[magic-context] failed to backfill memory embeddings:", error48);
153633
- }
153634
- return args.existingEmbeddings;
153635
- }
153636
- var init_embedding_backfill = __esm(() => {
153637
- init_logger();
153638
- init_embedding();
153639
- init_storage_memory_embeddings();
153640
- });
153641
-
153642
- // src/features/magic-context/memory/promotion.ts
153643
- function isPromotableCategory(category) {
153644
- return PROMOTABLE_CATEGORIES.some((promotableCategory) => promotableCategory === category);
153645
- }
153646
- function resolveExpiresAt(category) {
153647
- const ttl = CATEGORY_DEFAULT_TTL[category];
153648
- return ttl === undefined ? null : Date.now() + ttl;
153649
- }
153650
- function promoteSessionFactsToMemory(db, sessionId, projectPath, facts) {
153651
- for (const fact of facts) {
153652
- if (!isPromotableCategory(fact.category)) {
153653
- continue;
153654
- }
153655
- try {
153656
- const normalizedHash = computeNormalizedHash(fact.content);
153657
- const existingMemory = getMemoryByHash(db, projectPath, fact.category, normalizedHash);
153658
- if (existingMemory) {
153659
- updateMemorySeenCount(db, existingMemory.id);
153660
- continue;
153661
- }
153662
- const memoryInput = {
153663
- projectPath,
153664
- category: fact.category,
153665
- content: fact.content,
153666
- sourceSessionId: sessionId,
153667
- sourceType: "historian",
153668
- expiresAt: resolveExpiresAt(fact.category)
153669
- };
153670
- const memory = insertMemory(db, memoryInput);
153671
- embedAndStoreMemory(db, sessionId, memory.id, memory.content);
153672
- } catch (error48) {
153673
- sessionLog(sessionId, `memory promotion failed for fact "${fact.content.slice(0, 60)}":`, error48);
153674
- }
153675
- }
153676
- }
153677
- async function embedAndStoreMemory(db, sessionId, memoryId, content) {
153678
- try {
153679
- const embedding = await embedText(content);
153680
- if (embedding) {
153681
- saveEmbedding(db, memoryId, embedding, getEmbeddingModelId());
153682
- }
153683
- } catch (error48) {
153684
- sessionLog(sessionId, `memory embedding failed for memory ${memoryId}:`, error48);
153685
- }
153686
- }
153687
- var init_promotion = __esm(() => {
153688
- init_logger();
153689
- init_constants();
153690
- init_embedding();
153691
- init_storage_memory();
153692
- init_storage_memory_embeddings();
153693
- });
153694
- // src/features/magic-context/memory/index.ts
153695
- var init_memory = __esm(() => {
153696
- init_project_identity();
153697
- init_promotion();
153698
- init_constants();
153699
- init_embedding();
153700
- init_embedding_backfill();
153701
- init_embedding_cache();
153702
- init_storage_memory();
153703
- init_storage_memory_embeddings();
153704
- init_storage_memory_fts();
153705
- });
153706
-
153707
153615
  // src/hooks/magic-context/caveman.ts
153708
153616
  function protectRegions(text) {
153709
153617
  const preserved = [];
@@ -153936,6 +153844,108 @@ var init_caveman = __esm(() => {
153936
153844
  };
153937
153845
  });
153938
153846
 
153847
+ // src/features/magic-context/memory/embedding-backfill.ts
153848
+ async function ensureMemoryEmbeddings(args) {
153849
+ if (!isEmbeddingEnabled()) {
153850
+ return args.existingEmbeddings;
153851
+ }
153852
+ const missingMemories = args.memories.filter((memory) => !args.existingEmbeddings.has(memory.id));
153853
+ if (missingMemories.length === 0) {
153854
+ return args.existingEmbeddings;
153855
+ }
153856
+ try {
153857
+ const embeddings = await embedBatch(missingMemories.map((memory) => memory.content));
153858
+ const modelId = getEmbeddingModelId();
153859
+ const staged = new Map;
153860
+ args.db.transaction(() => {
153861
+ for (const [index, memory] of missingMemories.entries()) {
153862
+ const embedding = embeddings[index];
153863
+ if (!embedding) {
153864
+ continue;
153865
+ }
153866
+ saveEmbedding(args.db, memory.id, embedding, modelId);
153867
+ staged.set(memory.id, embedding);
153868
+ }
153869
+ })();
153870
+ for (const [id, embedding] of staged) {
153871
+ args.existingEmbeddings.set(id, embedding);
153872
+ }
153873
+ } catch (error48) {
153874
+ log("[magic-context] failed to backfill memory embeddings:", error48);
153875
+ }
153876
+ return args.existingEmbeddings;
153877
+ }
153878
+ var init_embedding_backfill = __esm(() => {
153879
+ init_logger();
153880
+ init_embedding();
153881
+ init_storage_memory_embeddings();
153882
+ });
153883
+
153884
+ // src/features/magic-context/memory/promotion.ts
153885
+ function isPromotableCategory(category) {
153886
+ return PROMOTABLE_CATEGORIES.some((promotableCategory) => promotableCategory === category);
153887
+ }
153888
+ function resolveExpiresAt(category) {
153889
+ const ttl = CATEGORY_DEFAULT_TTL[category];
153890
+ return ttl === undefined ? null : Date.now() + ttl;
153891
+ }
153892
+ function promoteSessionFactsToMemory(db, sessionId, projectPath, facts) {
153893
+ for (const fact of facts) {
153894
+ if (!isPromotableCategory(fact.category)) {
153895
+ continue;
153896
+ }
153897
+ try {
153898
+ const normalizedHash = computeNormalizedHash(fact.content);
153899
+ const existingMemory = getMemoryByHash(db, projectPath, fact.category, normalizedHash);
153900
+ if (existingMemory) {
153901
+ updateMemorySeenCount(db, existingMemory.id);
153902
+ continue;
153903
+ }
153904
+ const memoryInput = {
153905
+ projectPath,
153906
+ category: fact.category,
153907
+ content: fact.content,
153908
+ sourceSessionId: sessionId,
153909
+ sourceType: "historian",
153910
+ expiresAt: resolveExpiresAt(fact.category)
153911
+ };
153912
+ const memory = insertMemory(db, memoryInput);
153913
+ embedAndStoreMemory(db, sessionId, memory.id, memory.content);
153914
+ } catch (error48) {
153915
+ sessionLog(sessionId, `memory promotion failed for fact "${fact.content.slice(0, 60)}":`, error48);
153916
+ }
153917
+ }
153918
+ }
153919
+ async function embedAndStoreMemory(db, sessionId, memoryId, content) {
153920
+ try {
153921
+ const embedding = await embedText(content);
153922
+ if (embedding) {
153923
+ saveEmbedding(db, memoryId, embedding, getEmbeddingModelId());
153924
+ }
153925
+ } catch (error48) {
153926
+ sessionLog(sessionId, `memory embedding failed for memory ${memoryId}:`, error48);
153927
+ }
153928
+ }
153929
+ var init_promotion = __esm(() => {
153930
+ init_logger();
153931
+ init_constants();
153932
+ init_embedding();
153933
+ init_storage_memory();
153934
+ init_storage_memory_embeddings();
153935
+ });
153936
+ // src/features/magic-context/memory/index.ts
153937
+ var init_memory = __esm(() => {
153938
+ init_project_identity();
153939
+ init_promotion();
153940
+ init_constants();
153941
+ init_embedding();
153942
+ init_embedding_backfill();
153943
+ init_embedding_cache();
153944
+ init_storage_memory();
153945
+ init_storage_memory_embeddings();
153946
+ init_storage_memory_fts();
153947
+ });
153948
+
153939
153949
  // src/hooks/magic-context/compartment-runner-compressor.ts
153940
153950
  function cavemanLevelForDepth(outputDepth) {
153941
153951
  if (outputDepth <= 1)
@@ -166518,6 +166528,120 @@ init_compartment_storage();
166518
166528
  init_project_identity();
166519
166529
  init_storage();
166520
166530
  init_logger();
166531
+
166532
+ // src/hooks/magic-context/caveman-cleanup.ts
166533
+ init_storage();
166534
+ init_shared();
166535
+ init_caveman();
166536
+ var DEPTH_UNTOUCHED = 0;
166537
+ var DEPTH_LITE = 1;
166538
+ var DEPTH_FULL = 2;
166539
+ var DEPTH_ULTRA = 3;
166540
+ var DEPTH_TO_LEVEL = {
166541
+ [DEPTH_LITE]: "lite",
166542
+ [DEPTH_FULL]: "full",
166543
+ [DEPTH_ULTRA]: "ultra"
166544
+ };
166545
+ function computeTargetDepth(positionIndex, totalEligible) {
166546
+ if (totalEligible <= 0)
166547
+ return DEPTH_UNTOUCHED;
166548
+ const fraction = positionIndex / totalEligible;
166549
+ if (fraction < 0.2)
166550
+ return DEPTH_ULTRA;
166551
+ if (fraction < 0.4)
166552
+ return DEPTH_FULL;
166553
+ if (fraction < 0.6)
166554
+ return DEPTH_LITE;
166555
+ return DEPTH_UNTOUCHED;
166556
+ }
166557
+ function applyCavemanCleanup(sessionId, db, targets, tags, config2) {
166558
+ const result = {
166559
+ compressedToLite: 0,
166560
+ compressedToFull: 0,
166561
+ compressedToUltra: 0
166562
+ };
166563
+ if (!config2.enabled)
166564
+ return result;
166565
+ const maxTag = tags.reduce((max, t) => Math.max(max, t.tagNumber), 0);
166566
+ const protectedCutoff = maxTag - config2.protectedTags;
166567
+ const eligible = tags.filter((tag) => tag.type === "message" && tag.status === "active" && tag.tagNumber <= protectedCutoff && tag.byteSize >= config2.minChars).sort((a, b) => a.tagNumber - b.tagNumber);
166568
+ if (eligible.length === 0)
166569
+ return result;
166570
+ const tagsNeedingCompression = eligible.filter((tag, index) => {
166571
+ const target = targets.get(tag.tagNumber);
166572
+ if (!target || !target.getContent || !target.setContent)
166573
+ return false;
166574
+ const targetDepth = computeTargetDepth(index, eligible.length);
166575
+ return targetDepth > tag.cavemanDepth;
166576
+ });
166577
+ if (tagsNeedingCompression.length === 0)
166578
+ return result;
166579
+ const originalByTag = getSourceContents(db, sessionId, tagsNeedingCompression.map((t) => t.tagNumber));
166580
+ const positionByTag = new Map;
166581
+ for (let i = 0;i < eligible.length; i += 1) {
166582
+ positionByTag.set(eligible[i].tagNumber, i);
166583
+ }
166584
+ db.transaction(() => {
166585
+ for (const tag of tagsNeedingCompression) {
166586
+ const originalText = originalByTag.get(tag.tagNumber);
166587
+ if (typeof originalText !== "string" || originalText.length === 0)
166588
+ continue;
166589
+ const positionIndex = positionByTag.get(tag.tagNumber) ?? 0;
166590
+ const targetDepth = computeTargetDepth(positionIndex, eligible.length);
166591
+ if (targetDepth <= tag.cavemanDepth)
166592
+ continue;
166593
+ const level = DEPTH_TO_LEVEL[targetDepth];
166594
+ if (!level)
166595
+ continue;
166596
+ const compressed = cavemanCompress(originalText, level);
166597
+ if (compressed.length === 0)
166598
+ continue;
166599
+ const target = targets.get(tag.tagNumber);
166600
+ if (!target)
166601
+ continue;
166602
+ target.setContent(compressed);
166603
+ updateCavemanDepth(db, sessionId, tag.tagNumber, targetDepth);
166604
+ if (targetDepth === DEPTH_LITE)
166605
+ result.compressedToLite += 1;
166606
+ else if (targetDepth === DEPTH_FULL)
166607
+ result.compressedToFull += 1;
166608
+ else if (targetDepth === DEPTH_ULTRA)
166609
+ result.compressedToUltra += 1;
166610
+ }
166611
+ })();
166612
+ const total = result.compressedToLite + result.compressedToFull + result.compressedToUltra;
166613
+ if (total > 0) {
166614
+ sessionLog(sessionId, `caveman cleanup: compressed ${total} text tags (lite=${result.compressedToLite}, full=${result.compressedToFull}, ultra=${result.compressedToUltra})`);
166615
+ }
166616
+ return result;
166617
+ }
166618
+ function replayCavemanCompression(sessionId, db, targets, tags) {
166619
+ const compressedTags = tags.filter((tag) => tag.type === "message" && tag.status === "active" && tag.cavemanDepth > 0 && targets.has(tag.tagNumber));
166620
+ if (compressedTags.length === 0)
166621
+ return 0;
166622
+ const originalByTag = getSourceContents(db, sessionId, compressedTags.map((t) => t.tagNumber));
166623
+ let replayed = 0;
166624
+ for (const tag of compressedTags) {
166625
+ const originalText = originalByTag.get(tag.tagNumber);
166626
+ if (typeof originalText !== "string" || originalText.length === 0)
166627
+ continue;
166628
+ const level = DEPTH_TO_LEVEL[tag.cavemanDepth];
166629
+ if (!level)
166630
+ continue;
166631
+ const compressed = cavemanCompress(originalText, level);
166632
+ if (compressed.length === 0)
166633
+ continue;
166634
+ const target = targets.get(tag.tagNumber);
166635
+ if (!target)
166636
+ continue;
166637
+ if (target.setContent(compressed)) {
166638
+ replayed += 1;
166639
+ }
166640
+ }
166641
+ return replayed;
166642
+ }
166643
+
166644
+ // src/hooks/magic-context/transform.ts
166521
166645
  init_compartment_runner();
166522
166646
 
166523
166647
  // src/hooks/magic-context/image-token-estimate.ts
@@ -167875,7 +167999,8 @@ function extractToolTagMetadata(part) {
167875
167999
  inputByteSize: estimateInputByteSize(input)
167876
168000
  };
167877
168001
  }
167878
- function tagMessages(sessionId, messages, tagger, db) {
168002
+ function tagMessages(sessionId, messages, tagger, db, options = {}) {
168003
+ const skipPrefixInjection = options.skipPrefixInjection === true;
167879
168004
  const targets = new Map;
167880
168005
  const reasoningByMessage = new Map;
167881
168006
  const messageTagNumbers = new Map;
@@ -167949,7 +168074,9 @@ function tagMessages(sessionId, messages, tagger, db) {
167949
168074
  }
167950
168075
  }
167951
168076
  messageTagNumbers.set(message, Math.max(messageTagNumbers.get(message) ?? 0, tagId));
167952
- textPart.text = prependTag(tagId, textPart.text);
168077
+ if (!skipPrefixInjection) {
168078
+ textPart.text = prependTag(tagId, textPart.text);
168079
+ }
167953
168080
  targets.set(tagId, {
167954
168081
  message,
167955
168082
  setContent: (content) => {
@@ -167976,7 +168103,9 @@ function tagMessages(sessionId, messages, tagger, db) {
167976
168103
  const { toolName, inputByteSize } = extractToolTagMetadata(toolPart);
167977
168104
  const tagId = tagger.assignTag(sessionId, toolPart.callID, "tool", byteSize(toolPart.state.output), db, reasoningBytes, toolName, inputByteSize);
167978
168105
  messageTagNumbers.set(message, Math.max(messageTagNumbers.get(message) ?? 0, tagId));
167979
- toolPart.state.output = prependTag(tagId, toolPart.state.output);
168106
+ if (!skipPrefixInjection) {
168107
+ toolPart.state.output = prependTag(tagId, toolPart.state.output);
168108
+ }
167980
168109
  toolTagByCallId.set(toolPart.callID, tagId);
167981
168110
  if (thinkingParts.length > 0 && !toolThinkingByCallId.has(toolPart.callID)) {
167982
168111
  toolThinkingByCallId.set(toolPart.callID, thinkingParts);
@@ -168922,7 +169051,16 @@ function applyHeuristicCleanup(sessionId, db, targets, messageTagNumbers, config
168922
169051
  if (droppedTools > 0 || deduplicatedTools > 0 || droppedInjections > 0) {
168923
169052
  sessionLog(sessionId, `heuristic cleanup: dropped ${droppedTools} tool tags, deduplicated ${deduplicatedTools} tool calls, dropped ${droppedInjections} system injections`);
168924
169053
  }
168925
- return { droppedTools, deduplicatedTools, droppedInjections };
169054
+ let compressedTextTags = 0;
169055
+ if (config2.caveman?.enabled) {
169056
+ const cavemanResult = applyCavemanCleanup(sessionId, db, targets, tags, {
169057
+ enabled: true,
169058
+ minChars: config2.caveman.minChars,
169059
+ protectedTags: config2.protectedTags
169060
+ });
169061
+ compressedTextTags = cavemanResult.compressedToLite + cavemanResult.compressedToFull + cavemanResult.compressedToUltra;
169062
+ }
169063
+ return { droppedTools, deduplicatedTools, droppedInjections, compressedTextTags };
168926
169064
  }
168927
169065
  function extractToolInfo(part) {
168928
169066
  if (part.type === "tool" && typeof part.tool === "string" && DEDUP_SAFE_TOOLS.has(part.tool)) {
@@ -168994,7 +169132,7 @@ async function runPostTransformPhase(args) {
168994
169132
  const hasPendingUserOps = pendingOps.length > 0;
168995
169133
  const shouldApplyPendingOps = (args.schedulerDecision === "execute" || isExplicitFlush || forceMaterialization) && (!compartmentRunning || emergencyBypassCompartmentGate);
168996
169134
  const isCacheBustingPass = isExplicitFlush || shouldApplyPendingOps;
168997
- const shouldRunHeuristics = args.fullFeatureMode && (!compartmentRunning || emergencyBypassCompartmentGate) && (isExplicitFlush || forceMaterialization || args.schedulerDecision === "execute" && !alreadyRanThisTurn);
169135
+ const shouldRunHeuristics = (!compartmentRunning || emergencyBypassCompartmentGate) && (isExplicitFlush || forceMaterialization || args.schedulerDecision === "execute" && !alreadyRanThisTurn);
168998
169136
  if (shouldRunHeuristics) {
168999
169137
  const reason = isExplicitFlush ? "explicit_flush" : forceMaterialization ? `force_materialization (${args.contextUsage.percentage.toFixed(1)}% >= ${args.forceMaterializationPercentage}%)` : `scheduler_execute (pendingOps=${pendingOps.length}, scheduler=${args.schedulerDecision})`;
169000
169138
  sessionLog(args.sessionId, `heuristics WILL RUN \u2014 reason=${reason}, context=${args.contextUsage.percentage.toFixed(1)}%, turn=${args.currentTurnId}`);
@@ -169024,16 +169162,21 @@ async function runPostTransformPhase(args) {
169024
169162
  }
169025
169163
  if (shouldRunHeuristics) {
169026
169164
  const t5 = performance.now();
169165
+ const cavemanConfig = args.cavemanTextCompression?.enabled ? {
169166
+ enabled: true,
169167
+ minChars: args.cavemanTextCompression.minChars
169168
+ } : undefined;
169027
169169
  const cleanup = applyHeuristicCleanup(args.sessionId, args.db, args.targets, args.messageTagNumbers, {
169028
169170
  autoDropToolAge: args.autoDropToolAge,
169029
169171
  dropToolStructure: args.dropToolStructure,
169030
169172
  protectedTags: args.protectedTags,
169031
- dropAllTools: forceMaterialization
169173
+ dropAllTools: forceMaterialization,
169174
+ caveman: cavemanConfig
169032
169175
  }, args.tags);
169033
- if (cleanup.droppedTools > 0 || cleanup.deduplicatedTools > 0 || cleanup.droppedInjections > 0) {
169176
+ if (cleanup.droppedTools > 0 || cleanup.deduplicatedTools > 0 || cleanup.droppedInjections > 0 || cleanup.compressedTextTags > 0) {
169034
169177
  didMutateFromPendingOperations = true;
169035
169178
  }
169036
- logTransformTiming(args.sessionId, "applyHeuristicCleanup", t5, `droppedTools=${cleanup.droppedTools} deduplicatedTools=${cleanup.deduplicatedTools} droppedInjections=${cleanup.droppedInjections}`);
169179
+ logTransformTiming(args.sessionId, "applyHeuristicCleanup", t5, `droppedTools=${cleanup.droppedTools} deduplicatedTools=${cleanup.deduplicatedTools} droppedInjections=${cleanup.droppedInjections} compressedTextTags=${cleanup.compressedTextTags}`);
169037
169180
  if (args.watermark > 0) {
169038
169181
  const t6 = performance.now();
169039
169182
  truncateErroredTools(args.messages, args.watermark, args.messageTagNumbers);
@@ -169179,7 +169322,7 @@ async function runPostTransformPhase(args) {
169179
169322
  } else {
169180
169323
  args.nudgePlacements.clear(args.sessionId);
169181
169324
  }
169182
- const stickyNoteNudge = getStickyNoteNudge(args.db, args.sessionId);
169325
+ const stickyNoteNudge = args.fullFeatureMode ? getStickyNoteNudge(args.db, args.sessionId) : null;
169183
169326
  if (stickyNoteNudge) {
169184
169327
  const reinjected = appendReminderToUserMessageById(args.messages, stickyNoteNudge.messageId, stickyNoteNudge.text);
169185
169328
  if (!reinjected) {
@@ -169191,7 +169334,7 @@ async function runPostTransformPhase(args) {
169191
169334
  }
169192
169335
  }
169193
169336
  }
169194
- const deferredNoteText = peekNoteNudgeText(args.db, args.sessionId, args.currentTurnId, args.projectPath);
169337
+ const deferredNoteText = args.fullFeatureMode ? peekNoteNudgeText(args.db, args.sessionId, args.currentTurnId, args.projectPath) : null;
169195
169338
  if (deferredNoteText) {
169196
169339
  const noteInstruction = `
169197
169340
 
@@ -169476,7 +169619,11 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so ma
169476
169619
  try {
169477
169620
  const t0 = performance.now();
169478
169621
  deps.tagger.initFromDb(sessionId, db);
169479
- const result = tagMessages(sessionId, messages, deps.tagger, db);
169622
+ const ctxReduceEnabledEffective = deps.ctxReduceEnabled !== false;
169623
+ const skipPrefixInjection = !ctxReduceEnabledEffective || reducedMode;
169624
+ const result = tagMessages(sessionId, messages, deps.tagger, db, {
169625
+ skipPrefixInjection
169626
+ });
169480
169627
  targets = result.targets;
169481
169628
  reasoningByMessage = result.reasoningByMessage;
169482
169629
  messageTagNumbers = result.messageTagNumbers;
@@ -169525,6 +169672,14 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so ma
169525
169672
  }
169526
169673
  logTransformTiming(sessionId, "replayReasoningClearing", tReplay);
169527
169674
  }
169675
+ if (!deps.ctxReduceEnabled && !reducedMode && deps.cavemanTextCompression?.enabled) {
169676
+ const tCavemanReplay = performance.now();
169677
+ const replayedCaveman = replayCavemanCompression(sessionId, db, targets, tags);
169678
+ if (replayedCaveman > 0) {
169679
+ sessionLog(sessionId, `caveman replay: re-applied ${replayedCaveman} text tags`);
169680
+ }
169681
+ logTransformTiming(sessionId, "replayCavemanCompression", tCavemanReplay);
169682
+ }
169528
169683
  const t4 = performance.now();
169529
169684
  const strippedClearedReasoning = stripClearedReasoning(messages, skipTypedReasoningCleanup);
169530
169685
  logTransformTiming(sessionId, "stripClearedReasoning", t4, `strippedParts=${strippedClearedReasoning}`);
@@ -169614,7 +169769,8 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so ma
169614
169769
  hasRecentReduceCall,
169615
169770
  skipTypedReasoningCleanup,
169616
169771
  projectPath: deps.projectPath,
169617
- autoSearch: deps.autoSearch
169772
+ autoSearch: deps.autoSearch,
169773
+ cavemanTextCompression: deps.ctxReduceEnabled === false && !reducedMode ? deps.cavemanTextCompression : undefined
169618
169774
  });
169619
169775
  logTransformTiming(sessionId, "postTransformPhase", tPostProcess);
169620
169776
  const msgTokens = getMessageTokensCache(sessionId);
@@ -170590,13 +170746,21 @@ function createSystemPromptHashHandler(deps) {
170590
170746
  const sessionId = input.sessionID;
170591
170747
  if (!sessionId)
170592
170748
  return;
170749
+ let sessionMetaEarly;
170750
+ try {
170751
+ sessionMetaEarly = getOrCreateSessionMeta(deps.db, sessionId);
170752
+ } catch (error48) {
170753
+ sessionLog(sessionId, "system-prompt-hash session meta load failed:", error48);
170754
+ }
170755
+ const isSubagentSession = sessionMetaEarly?.isSubagent === true;
170756
+ const effectiveCtxReduceEnabled = isSubagentSession ? false : deps.ctxReduceEnabled;
170593
170757
  const fullPrompt = output.system.join(`
170594
170758
  `);
170595
170759
  if (fullPrompt.length > 0 && !fullPrompt.includes(MAGIC_CONTEXT_MARKER)) {
170596
170760
  const detectedAgent = detectAgentFromSystemPrompt(fullPrompt);
170597
- const guidance = buildMagicContextSection(detectedAgent, deps.protectedTags, deps.ctxReduceEnabled, deps.dreamerEnabled, deps.dropToolStructure, deps.experimentalTemporalAwareness);
170761
+ const guidance = buildMagicContextSection(detectedAgent, deps.protectedTags, effectiveCtxReduceEnabled, deps.dreamerEnabled, deps.dropToolStructure, deps.experimentalTemporalAwareness);
170598
170762
  output.system.push(guidance);
170599
- sessionLog(sessionId, `injected ${detectedAgent ?? "generic"} guidance into system prompt`);
170763
+ sessionLog(sessionId, `injected ${detectedAgent ?? "generic"} guidance into system prompt (ctxReduce=${effectiveCtxReduceEnabled}, subagent=${isSubagentSession})`);
170600
170764
  }
170601
170765
  const isCacheBusting = deps.flushedSessions.has(sessionId);
170602
170766
  if (shouldInjectDocs) {
@@ -170845,6 +171009,7 @@ function createMagicContextHook(deps) {
170845
171009
  db,
170846
171010
  nudgePlacements,
170847
171011
  protectedTags: deps.config.protected_tags,
171012
+ ctxReduceEnabled,
170848
171013
  autoDropToolAge: deps.config.auto_drop_tool_age ?? 100,
170849
171014
  dropToolStructure: deps.config.drop_tool_structure ?? true,
170850
171015
  clearReasoningAge: deps.config.clear_reasoning_age ?? 50,
@@ -170887,6 +171052,10 @@ function createMagicContextHook(deps) {
170887
171052
  memoryEnabled: deps.config.memory?.enabled !== false,
170888
171053
  embeddingEnabled: deps.config.embedding?.provider !== "off",
170889
171054
  gitCommitsEnabled: deps.config.experimental?.git_commit_indexing?.enabled === true
171055
+ } : undefined,
171056
+ cavemanTextCompression: ctxReduceEnabled === false && deps.config.experimental?.caveman_text_compression?.enabled === true ? {
171057
+ enabled: true,
171058
+ minChars: deps.config.experimental.caveman_text_compression.min_chars ?? 500
170890
171059
  } : undefined
170891
171060
  });
170892
171061
  const eventHandler = createEventHandler2({
@@ -1 +1 @@
1
- {"version":3,"file":"create-session-hooks.d.ts","sourceRoot":"","sources":["../../../src/plugin/hooks/create-session-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAU7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;CACtC;;;;;;qBAmD4gD,CAAC;;;;;;;;;;;;qBAbz+C,CAAC;mBAAyB,CAAC;iBAChD,CAAX;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAYokmB,CAAC;;;;;;EADlomB"}
1
+ {"version":3,"file":"create-session-hooks.d.ts","sourceRoot":"","sources":["../../../src/plugin/hooks/create-session-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAU7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;CACtC;;;;;;qBAmD4gD,CAAC;;;;;;;;;;;;qBAbz+C,CAAC;mBAAyB,CAAC;iBAChD,CAAX;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAYi0nB,CAAC;;;;;;EAD/3nB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-magic-context",
3
- "version": "0.14.2",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "description": "OpenCode plugin for Magic Context — cross-session memory and context management",
6
6
  "main": "dist/index.js",