@cortexkit/opencode-magic-context 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
## What is Magic Context?
|
|
29
29
|
|
|
30
|
-
Your agent should never stop working to manage its own context. Magic Context is an OpenCode plugin that handles
|
|
30
|
+
Your agent should never stop working to manage its own context. Magic Context is an OpenCode plugin that handles context and memory management entirely in the background:
|
|
31
31
|
|
|
32
32
|
**1.** Transparent context compaction via a background historian — the main agent keeps working while a separate model compresses older conversation. All operations are **cache-aware** and deferred to avoid wasting cached prefixes.
|
|
33
33
|
|
|
@@ -17,12 +17,21 @@ export type NoteNudgeTrigger = "historian_complete" | "commit_detected" | "todos
|
|
|
17
17
|
/**
|
|
18
18
|
* Signal that a trigger event occurred. Call from hook layer when any of the 3 triggers fire.
|
|
19
19
|
*/
|
|
20
|
-
export declare function onNoteTrigger(sessionId: string,
|
|
20
|
+
export declare function onNoteTrigger(sessionId: string, trigger: NoteNudgeTrigger): void;
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* Peek at whether a note nudge should be injected during this transform pass.
|
|
23
23
|
* Returns the nudge text if yes, null if no.
|
|
24
|
-
*
|
|
25
|
-
|
|
24
|
+
* Does NOT clear triggerPending — call markNoteNudgeDelivered() after successful placement.
|
|
25
|
+
*/
|
|
26
|
+
export declare function peekNoteNudgeText(db: Database, sessionId: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Mark the note nudge as delivered after successful placement.
|
|
29
|
+
* Only call after appendReminderToLatestUserMessage returns a truthy anchor.
|
|
30
|
+
*/
|
|
31
|
+
export declare function markNoteNudgeDelivered(sessionId: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Legacy wrapper — peek + mark in one call.
|
|
34
|
+
* Kept for existing tests; prefer peekNoteNudgeText + markNoteNudgeDelivered in production.
|
|
26
35
|
*/
|
|
27
36
|
export declare function getNoteNudgeText(db: Database, sessionId: string): string | null;
|
|
28
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note-nudger.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/note-nudger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"note-nudger.d.ts","sourceRoot":"","sources":["../../../src/hooks/magic-context/note-nudger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAoB3F;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAIhF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAehF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAK9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3D"}
|
|
@@ -1 +1 @@
|
|
|
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,EAIpB,aAAa,EAGhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAOhF,OAAO,EACH,KAAK,4BAA4B,EAEpC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAa7C,OAAO,EAEH,KAAK,WAAW,EAGnB,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;QAAE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC,CAAC;IACnE,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,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;CAChC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,
|
|
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,EAIpB,aAAa,EAGhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAOhF,OAAO,EACH,KAAK,4BAA4B,EAEpC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAa7C,OAAO,EAEH,KAAK,WAAW,EAGnB,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;QAAE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC,CAAC;IACnE,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,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;CAChC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAuT3E"}
|
package/dist/index.js
CHANGED
|
@@ -18323,22 +18323,30 @@ function getState(sessionId) {
|
|
|
18323
18323
|
}
|
|
18324
18324
|
return state;
|
|
18325
18325
|
}
|
|
18326
|
-
function onNoteTrigger(sessionId,
|
|
18326
|
+
function onNoteTrigger(sessionId, trigger) {
|
|
18327
18327
|
const state = getState(sessionId);
|
|
18328
18328
|
state.triggerPending = true;
|
|
18329
|
+
sessionLog(sessionId, `note-nudge: trigger fired (${trigger}), triggerPending=true`);
|
|
18329
18330
|
}
|
|
18330
|
-
function
|
|
18331
|
+
function peekNoteNudgeText(db, sessionId) {
|
|
18331
18332
|
const state = getState(sessionId);
|
|
18332
18333
|
if (!state.triggerPending)
|
|
18333
18334
|
return null;
|
|
18334
18335
|
const notes = getSessionNotes(db, sessionId);
|
|
18335
|
-
if (notes.length === 0)
|
|
18336
|
+
if (notes.length === 0) {
|
|
18337
|
+
sessionLog(sessionId, "note-nudge: triggerPending but no notes found, skipping");
|
|
18336
18338
|
return null;
|
|
18337
|
-
|
|
18338
|
-
|
|
18339
|
+
}
|
|
18340
|
+
sessionLog(sessionId, `note-nudge: delivering nudge for ${notes.length} notes`);
|
|
18339
18341
|
const plural = notes.length === 1 ? "note" : "notes";
|
|
18340
18342
|
return `You have ${notes.length} deferred ${plural}. Review with ctx_note read \u2014 some may be actionable now.`;
|
|
18341
18343
|
}
|
|
18344
|
+
function markNoteNudgeDelivered(sessionId) {
|
|
18345
|
+
const state = getState(sessionId);
|
|
18346
|
+
state.triggerPending = false;
|
|
18347
|
+
state.nudgeDelivered = true;
|
|
18348
|
+
sessionLog(sessionId, "note-nudge: marked delivered");
|
|
18349
|
+
}
|
|
18342
18350
|
function clearNoteNudgeState(sessionId) {
|
|
18343
18351
|
stateBySession.delete(sessionId);
|
|
18344
18352
|
}
|
|
@@ -21176,15 +21184,18 @@ function runPostTransformPhase(args) {
|
|
|
21176
21184
|
reinjectNudgeAtAnchor(args.messages, existing.nudgeText, args.nudgePlacements, args.sessionId);
|
|
21177
21185
|
}
|
|
21178
21186
|
}
|
|
21179
|
-
|
|
21180
|
-
|
|
21181
|
-
|
|
21187
|
+
} else {
|
|
21188
|
+
args.nudgePlacements.clear(args.sessionId);
|
|
21189
|
+
}
|
|
21190
|
+
const deferredNoteText = peekNoteNudgeText(args.db, args.sessionId);
|
|
21191
|
+
if (deferredNoteText) {
|
|
21192
|
+
const noteInstruction = `
|
|
21182
21193
|
|
|
21183
21194
|
<instruction name="deferred_notes">${deferredNoteText}</instruction>`;
|
|
21184
|
-
|
|
21195
|
+
const anchored = appendReminderToLatestUserMessage(args.messages, noteInstruction);
|
|
21196
|
+
if (anchored) {
|
|
21197
|
+
markNoteNudgeDelivered(args.sessionId);
|
|
21185
21198
|
}
|
|
21186
|
-
} else {
|
|
21187
|
-
args.nudgePlacements.clear(args.sessionId);
|
|
21188
21199
|
}
|
|
21189
21200
|
}
|
|
21190
21201
|
|
package/package.json
CHANGED