@kenkaiiii/ggcoder 5.68.1 → 5.70.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 (120) hide show
  1. package/dist/app-sidecar.js +37 -11
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/cli.js +17 -19
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/acceptance-checks.d.ts +48 -0
  6. package/dist/core/acceptance-checks.js +144 -0
  7. package/dist/core/acceptance-checks.js.map +1 -0
  8. package/dist/core/agent-session.d.ts +26 -0
  9. package/dist/core/agent-session.js +121 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/agents.d.ts +6 -5
  12. package/dist/core/agents.js.map +1 -1
  13. package/dist/core/bundled-agents.js +1 -3
  14. package/dist/core/bundled-agents.js.map +1 -1
  15. package/dist/core/cache-diagnostics.d.ts +6 -0
  16. package/dist/core/cache-diagnostics.js +31 -0
  17. package/dist/core/cache-diagnostics.js.map +1 -1
  18. package/dist/core/cache-expiry.d.ts +87 -0
  19. package/dist/core/cache-expiry.js +111 -0
  20. package/dist/core/cache-expiry.js.map +1 -0
  21. package/dist/core/compaction/compactor.js +78 -48
  22. package/dist/core/compaction/compactor.js.map +1 -1
  23. package/dist/core/destructive-git-guard.d.ts +27 -0
  24. package/dist/core/destructive-git-guard.js +94 -54
  25. package/dist/core/destructive-git-guard.js.map +1 -1
  26. package/dist/core/injection-detect.d.ts +38 -0
  27. package/dist/core/injection-detect.js +232 -0
  28. package/dist/core/injection-detect.js.map +1 -0
  29. package/dist/core/mcp/client.d.ts +72 -0
  30. package/dist/core/mcp/client.js +264 -41
  31. package/dist/core/mcp/client.js.map +1 -1
  32. package/dist/core/mcp/store.d.ts +6 -1
  33. package/dist/core/mcp/store.js +12 -1
  34. package/dist/core/mcp/store.js.map +1 -1
  35. package/dist/core/mcp/types.d.ts +18 -0
  36. package/dist/core/model-unavailable.d.ts +14 -0
  37. package/dist/core/model-unavailable.js +23 -0
  38. package/dist/core/model-unavailable.js.map +1 -0
  39. package/dist/core/node-debugger.d.ts +148 -0
  40. package/dist/core/node-debugger.js +642 -0
  41. package/dist/core/node-debugger.js.map +1 -0
  42. package/dist/core/persistent-shell.d.ts +58 -6
  43. package/dist/core/persistent-shell.js +331 -49
  44. package/dist/core/persistent-shell.js.map +1 -1
  45. package/dist/core/process-manager.d.ts +14 -0
  46. package/dist/core/process-manager.js +61 -0
  47. package/dist/core/process-manager.js.map +1 -1
  48. package/dist/core/progress/git-xp.js +8 -14
  49. package/dist/core/progress/git-xp.js.map +1 -1
  50. package/dist/core/subagent-manager.d.ts +20 -5
  51. package/dist/core/subagent-manager.js +22 -8
  52. package/dist/core/subagent-manager.js.map +1 -1
  53. package/dist/core/subagent-receipt.d.ts +54 -0
  54. package/dist/core/subagent-receipt.js +276 -0
  55. package/dist/core/subagent-receipt.js.map +1 -0
  56. package/dist/core/subagent-turn-record.d.ts +2 -0
  57. package/dist/core/subagent-turn-record.js.map +1 -1
  58. package/dist/core/test-impact.d.ts +73 -0
  59. package/dist/core/test-impact.js +467 -0
  60. package/dist/core/test-impact.js.map +1 -0
  61. package/dist/core/thinking-level.d.ts +1 -1
  62. package/dist/core/thinking-level.js +1 -1
  63. package/dist/core/thinking-level.js.map +1 -1
  64. package/dist/core/verification-gate.d.ts +2 -0
  65. package/dist/core/verification-gate.js +4 -0
  66. package/dist/core/verification-gate.js.map +1 -1
  67. package/dist/core/verification-snapshot.js +3 -5
  68. package/dist/core/verification-snapshot.js.map +1 -1
  69. package/dist/core/workspace-guard.d.ts +18 -7
  70. package/dist/core/workspace-guard.js +227 -60
  71. package/dist/core/workspace-guard.js.map +1 -1
  72. package/dist/interactive.js +2 -1
  73. package/dist/interactive.js.map +1 -1
  74. package/dist/modes/subagent-worker-mode.js +34 -6
  75. package/dist/modes/subagent-worker-mode.js.map +1 -1
  76. package/dist/test-support/keep-alive.d.ts +14 -0
  77. package/dist/test-support/keep-alive.js +17 -0
  78. package/dist/test-support/keep-alive.js.map +1 -0
  79. package/dist/tools/bash.d.ts +10 -1
  80. package/dist/tools/bash.js +78 -7
  81. package/dist/tools/bash.js.map +1 -1
  82. package/dist/tools/debug.d.ts +54 -0
  83. package/dist/tools/debug.js +233 -0
  84. package/dist/tools/debug.js.map +1 -0
  85. package/dist/tools/index.d.ts +13 -2
  86. package/dist/tools/index.js +41 -6
  87. package/dist/tools/index.js.map +1 -1
  88. package/dist/tools/prompt-hints.js +2 -0
  89. package/dist/tools/prompt-hints.js.map +1 -1
  90. package/dist/tools/read.js +3 -2
  91. package/dist/tools/read.js.map +1 -1
  92. package/dist/tools/subagent-control.js +44 -8
  93. package/dist/tools/subagent-control.js.map +1 -1
  94. package/dist/tools/subagent-shared.d.ts +29 -8
  95. package/dist/tools/subagent-shared.js +45 -14
  96. package/dist/tools/subagent-shared.js.map +1 -1
  97. package/dist/tools/subagent.d.ts +8 -2
  98. package/dist/tools/subagent.js +28 -10
  99. package/dist/tools/subagent.js.map +1 -1
  100. package/dist/tools/task-output.js +3 -2
  101. package/dist/tools/task-output.js.map +1 -1
  102. package/dist/tools/tool-tiers.d.ts +2 -2
  103. package/dist/tools/tool-tiers.js +3 -2
  104. package/dist/tools/tool-tiers.js.map +1 -1
  105. package/dist/tools/truncate.d.ts +21 -0
  106. package/dist/tools/truncate.js +187 -0
  107. package/dist/tools/truncate.js.map +1 -1
  108. package/dist/tools/ui-adopt.js +2 -0
  109. package/dist/tools/ui-adopt.js.map +1 -1
  110. package/dist/utils/git.d.ts +77 -0
  111. package/dist/utils/git.js +285 -21
  112. package/dist/utils/git.js.map +1 -1
  113. package/dist/utils/github-ci.js +2 -1
  114. package/dist/utils/github-ci.js.map +1 -1
  115. package/dist/utils/github.js +11 -9
  116. package/dist/utils/github.js.map +1 -1
  117. package/dist/utils/process.d.ts +20 -0
  118. package/dist/utils/process.js +98 -0
  119. package/dist/utils/process.js.map +1 -1
  120. package/package.json +4 -4
@@ -1,11 +1,12 @@
1
1
  import { BUNDLED_AGENTS } from "./bundled-agents.js";
2
2
  /**
3
- * Which model a sub-agent runs on.
3
+ * Which model a sub-agent runs on. Every sub-agent runs at the LOWEST thinking
4
+ * level of that model (never off), whatever the parent uses.
4
5
  *
5
- * - `"inherit"` (default) — the parent's model, so a delegated task is not
6
- * silently downgraded.
7
- * - `"fast"` — the provider's cheap tier (`getFastModel`), for genuinely
8
- * mechanical recon.
6
+ * - `"inherit"` (default) — the parent's model, so a delegated task is never
7
+ * moved to a weaker model.
8
+ * - `"fast"` — legacy alias of `"inherit"`, still accepted so older agent files
9
+ * load. It no longer swaps in a cheaper model.
9
10
  * - any other string — an explicit model id.
10
11
  */
11
12
  export type AgentModelPreference = "inherit" | "fast" | (string & {});
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA2BrD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC1D,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB,EAAE,MAAc;IACvE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3E,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,iDAAiD,EAAE;YACvE,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,MAAM;YACN,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAGpC;IACC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,wCAAwC;IACxC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/C,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,GAAW,EACX,MAA4B;IAE5B,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAA4B;IAC3E,8EAA8E;IAC9E,8DAA8D;IAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,2EAA2E;IAC3E,2CAA2C;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,kDAAkD,EAAE;YACxE,IAAI;YACJ,MAAM;YACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SAC/B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;SAChD,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,KAAK,GAAqC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;IAC1E,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IACxD,MAAM,OAAO,GACX,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAElG,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AAC5E,CAAC;AAED,8DAA8D;AAC9D,sEAAsE;AACtE,iGAAiG;AACjG,8DAA8D;AAC9D,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"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"}
@@ -201,9 +201,7 @@ export const BUNDLED_AGENTS = [
201
201
  name: "owl",
202
202
  description: 'Use for read-only questions about THIS repository: "where is X implemented", "what calls Y", "how does module Z fit together", tracing a data flow or mapping a directory. Never edits and never uses the web.',
203
203
  tools: ["read", "grep", "find", "ls", "code_search", "source_path"],
204
- // Structural recon is mechanical pattern work; the cheap tier handles it
205
- // well and keeps wide fan-out affordable.
206
- model: "fast",
204
+ model: "inherit",
207
205
  // Conventions and style rules don't change where a symbol is defined, and
208
206
  // skipping them keeps recon fast (matching Claude Code's Explore agent).
209
207
  context: "none",
@@ -1 +1 @@
1
- {"version":3,"file":"bundled-agents.js","sourceRoot":"","sources":["../../src/core/bundled-agents.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;8DAgB2C,CAAC;AAE/D,MAAM,UAAU,GAAG;;;;;;;;;;;;;8GAa2F,CAAC;AAE/G,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;+EAcqD,CAAC;AAEhF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA8CqD,CAAC;AAE5E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iHAyC0F,CAAC;AAElH,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAsC6D,CAAC;AAErF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,6RAA6R;QAC/R,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC;QAC5F,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,gNAAgN;QAClN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC;QACnE,yEAAyE;QACzE,0CAA0C;QAC1C,KAAK,EAAE,MAAM;QACb,0EAA0E;QAC1E,yEAAyE;QACzE,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,+RAA+R;QACjS,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,aAAa;YACb,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,iBAAiB;QAC/B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,iWAAiW;QACnW,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC;QAC7E,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,qMAAqM;QACvM,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC;QACvF,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,kNAAkN;QACpN,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,MAAM;YACN,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;CACF,CAAC"}
1
+ {"version":3,"file":"bundled-agents.js","sourceRoot":"","sources":["../../src/core/bundled-agents.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;8DAgB2C,CAAC;AAE/D,MAAM,UAAU,GAAG;;;;;;;;;;;;;8GAa2F,CAAC;AAE/G,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;+EAcqD,CAAC;AAEhF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA8CqD,CAAC;AAE5E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iHAyC0F,CAAC;AAElH,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAsC6D,CAAC;AAErF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,6RAA6R;QAC/R,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC;QAC5F,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EACT,gNAAgN;QAClN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC;QACnE,KAAK,EAAE,SAAS;QAChB,0EAA0E;QAC1E,yEAAyE;QACzE,OAAO,EAAE,MAAM;QACf,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,+RAA+R;QACjS,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,aAAa;YACb,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,iBAAiB;QAC/B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,iWAAiW;QACnW,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC;QAC7E,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,qMAAqM;QACvM,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC;QACvF,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,kNAAkN;QACpN,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,aAAa;YACb,MAAM;YACN,WAAW;YACX,YAAY;YACZ,UAAU;SACX;QACD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE,SAAS;KAClB;CACF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { CacheRetention, PreparedContext, Usage } from "@kenkaiiii/gg-ai";
2
+ import { type CacheTouch } from "./cache-expiry.js";
2
3
  export interface CacheRequestObservation {
3
4
  provider: string;
4
5
  model: string;
@@ -50,6 +51,11 @@ export declare class CacheDiagnostics {
50
51
  private freedTokens;
51
52
  private requests;
52
53
  private reportedCache;
54
+ private lastTouch;
55
+ /** Last successful cache-using request (real turn or prewarm), or null. */
56
+ lastCacheTouch(): CacheTouch | null;
57
+ /** Record a successful cache-using request that bypassed prepare/complete (prewarm). */
58
+ noteCacheTouch(touch: CacheTouch): void;
53
59
  reset(): void;
54
60
  discardAttempt(): void;
55
61
  noteEdit(edit: HistoryEdit, freedTokens?: number): void;
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { resolveCacheTtl } from "./cache-expiry.js";
2
3
  /** Digests never leave this instance. Canonical object keys avoid spurious edits on resume. */
3
4
  function digest(value) {
4
5
  const json = JSON.stringify(value, (_key, item) => item !== null && typeof item === "object" && !Array.isArray(item)
@@ -8,6 +9,13 @@ function digest(value) {
8
9
  .update(json ?? "null")
9
10
  .digest("hex");
10
11
  }
12
+ /** Route fields the session passes as `route`; read structurally, never digested. */
13
+ function routeField(route, key) {
14
+ if (!route || typeof route !== "object")
15
+ return undefined;
16
+ const value = route[key];
17
+ return typeof value === "string" && value ? value : undefined;
18
+ }
11
19
  function signedThinkingCount(message) {
12
20
  if (message.role !== "assistant" || !Array.isArray(message.content))
13
21
  return 0;
@@ -28,7 +36,17 @@ export class CacheDiagnostics {
28
36
  freedTokens = 0;
29
37
  requests = 0;
30
38
  reportedCache = false;
39
+ lastTouch = null;
40
+ /** Last successful cache-using request (real turn or prewarm), or null. */
41
+ lastCacheTouch() {
42
+ return this.lastTouch;
43
+ }
44
+ /** Record a successful cache-using request that bypassed prepare/complete (prewarm). */
45
+ noteCacheTouch(touch) {
46
+ this.lastTouch = { ...touch };
47
+ }
31
48
  reset() {
49
+ this.lastTouch = null;
32
50
  this.completed = undefined;
33
51
  this.pending = undefined;
34
52
  this.edits.clear();
@@ -56,6 +74,16 @@ export class CacheDiagnostics {
56
74
  route: digest({ provider: input.provider, model: input.model, route: input.route }),
57
75
  imagesDropped: context.imagesBefore - context.imagesAfter,
58
76
  at: input.at,
77
+ touch: (() => {
78
+ const policy = resolveCacheTtl({
79
+ provider: input.provider,
80
+ model: input.model,
81
+ cacheRetention: input.cacheRetention,
82
+ baseUrl: routeField(input.route, "baseUrl"),
83
+ accountId: routeField(input.route, "accountId"),
84
+ });
85
+ return policy ? { provider: input.provider, model: input.model, policy } : null;
86
+ })(),
59
87
  };
60
88
  let unchanged = 0;
61
89
  if (previous) {
@@ -143,6 +171,9 @@ export class CacheDiagnostics {
143
171
  ? Math.max(0, Math.min(promptTokens(previous.usage), promptTokens(usage)) - cacheRead)
144
172
  : null;
145
173
  this.completed = { ...snapshot, usage: { ...usage } };
174
+ // The provider refreshes the cached prefix when the request is processed, so
175
+ // the TTL clock restarts at the request's start time.
176
+ this.lastTouch = snapshot.touch ? { ...snapshot.touch, at: snapshot.at } : null;
146
177
  this.pending = undefined;
147
178
  this.edits.clear();
148
179
  this.freedTokens = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"cache-diagnostics.js","sourceRoot":"","sources":["../../src/core/cache-diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache-diagnostics.js","sourceRoot":"","sources":["../../src/core/cache-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { CacheRetention } from "@kenkaiiii/gg-ai";
2
+ /**
3
+ * Cold-prompt-cache detection (mirrors langchain-ai/deepagents#6477's
4
+ * `cold_cache.py`): providers keep the conversation prefix cached only for a
5
+ * TTL, so after a break the next message re-reads the whole context uncached.
6
+ *
7
+ * Every TTL below is derived from what gg-ai actually puts on the wire — never
8
+ * from a provider's marketing maximum we did not request. A provider/route we
9
+ * cannot pin to a request-side TTL returns `null` (no warning) rather than a
10
+ * guess.
11
+ */
12
+ export interface CacheTtlPolicy {
13
+ ttlMs: number;
14
+ /**
15
+ * `expired`: the TTL is a documented/requested *maximum* — past it the entry
16
+ * is gone. `may_be_cold`: the TTL is a guaranteed *minimum* (GPT-5.6+ `30m`),
17
+ * so past it the prefix may still be warm.
18
+ */
19
+ confidence: "expired" | "may_be_cold";
20
+ /** Where the number comes from, for logs/diagnostics. */
21
+ source: string;
22
+ }
23
+ export interface CacheTtlInput {
24
+ provider: string;
25
+ model: string;
26
+ cacheRetention: CacheRetention;
27
+ baseUrl?: string;
28
+ /** OpenAI OAuth (ChatGPT/Codex) routes carry an account id. */
29
+ accountId?: string;
30
+ }
31
+ /** Resolve the cache TTL our provider code requests for this route. */
32
+ export declare function resolveCacheTtl(input: CacheTtlInput): CacheTtlPolicy | null;
33
+ /**
34
+ * Prefix size below which the notice is not worth an interruption. At 40k
35
+ * tokens a cold Anthropic re-read (1.25x write vs 0.1x cached read) costs ~12x
36
+ * the warm request, roughly a dime on Sonnet-class pricing; below that the delta
37
+ * is pennies — and compacting first itself re-reads the whole context once, so
38
+ * on small chats "Compact first" saves nothing.
39
+ */
40
+ export declare const CACHE_EXPIRY_NOTICE_MIN_TOKENS = 40000;
41
+ export interface CacheTouch {
42
+ at: number;
43
+ provider: string;
44
+ model: string;
45
+ policy: CacheTtlPolicy;
46
+ }
47
+ export interface CacheExpiryStatus {
48
+ /** Owning session, so clients can key "dismissed once per expiry per chat". */
49
+ sessionId?: string;
50
+ provider: string;
51
+ ttlMs: number;
52
+ confidence: CacheTtlPolicy["confidence"];
53
+ ttlSource: string;
54
+ /** Last successful cache-using request (real turn or prewarm), epoch ms. */
55
+ lastRequestAt: number | null;
56
+ /** When the cached prefix lapses/lapsed, epoch ms; null when age is unknown. */
57
+ expiresAt: number | null;
58
+ expired: boolean;
59
+ /**
60
+ * `idle`: TTL passed. `age_unknown`: resumed/reset session with no request in
61
+ * this process. `identity_changed`: provider/model switched since the last
62
+ * request, so the old prefix cannot be reused.
63
+ */
64
+ reason: "idle" | "age_unknown" | "identity_changed" | null;
65
+ /** Tokens the next request would re-read (the current context). */
66
+ prefixTokens: number;
67
+ minTokens: number;
68
+ /** expired AND prefixTokens >= minTokens: worth showing the notice. */
69
+ notable: boolean;
70
+ /** No authoritative pricing exists in GG (turn metric cost is "unavailable"). */
71
+ estimatedExtraCostUsd: null;
72
+ }
73
+ export interface AssessCacheExpiryInput {
74
+ /** Policy for the route the NEXT request will take. */
75
+ current: {
76
+ provider: string;
77
+ model: string;
78
+ policy: CacheTtlPolicy | null;
79
+ };
80
+ lastTouch: CacheTouch | null;
81
+ now: number;
82
+ prefixTokens: number;
83
+ /** False for an empty chat — nothing to re-read. */
84
+ hasHistory: boolean;
85
+ minTokens?: number;
86
+ }
87
+ export declare function assessCacheExpiry(input: AssessCacheExpiryInput): CacheExpiryStatus | null;
@@ -0,0 +1,111 @@
1
+ const MINUTE = 60_000;
2
+ /** Resolve the cache TTL our provider code requests for this route. */
3
+ export function resolveCacheTtl(input) {
4
+ if (input.cacheRetention === "none")
5
+ return null;
6
+ if (input.provider === "anthropic") {
7
+ // gg-ai/src/providers/transform.ts `toAnthropicCacheControl`: "long" sends
8
+ // `ttl: "1h"` only on the first-party endpoint; everything else sends a bare
9
+ // `{type: "ephemeral"}`, which is Anthropic's 5-minute default.
10
+ const firstParty = !input.baseUrl || input.baseUrl.includes("api.anthropic.com");
11
+ if (input.cacheRetention === "long" && firstParty) {
12
+ return {
13
+ ttlMs: 60 * MINUTE,
14
+ confidence: "expired",
15
+ source: "anthropic cache_control ttl=1h (transform.ts toAnthropicCacheControl)",
16
+ };
17
+ }
18
+ return {
19
+ ttlMs: 5 * MINUTE,
20
+ confidence: "expired",
21
+ source: "anthropic cache_control ephemeral default 5m (transform.ts toAnthropicCacheControl)",
22
+ };
23
+ }
24
+ if (input.provider === "openai") {
25
+ if (input.accountId) {
26
+ // gg-ai/src/providers/openai-codex.ts: the Codex backend rejects
27
+ // prompt_cache_retention; "Cache TTL on Codex is controlled server-side
28
+ // (~5-10 min in-memory)". Use the upper bound so we only warn once the
29
+ // entry is surely gone.
30
+ return {
31
+ ttlMs: 10 * MINUTE,
32
+ confidence: "expired",
33
+ source: "codex server-side in-memory cache ~5-10m (openai-codex.ts)",
34
+ };
35
+ }
36
+ if (input.model.startsWith("gpt-5.6") || input.model.startsWith("gpt-6")) {
37
+ // gg-ai/src/providers/openai.ts sends prompt_cache_options.ttl = "30m";
38
+ // OpenAI documents 30 minutes as a guaranteed minimum.
39
+ return {
40
+ ttlMs: 30 * MINUTE,
41
+ confidence: "may_be_cold",
42
+ source: "openai prompt_cache_options ttl=30m (openai.ts)",
43
+ };
44
+ }
45
+ if (input.cacheRetention === "long") {
46
+ // gg-ai/src/providers/openai.ts sends prompt_cache_retention = "24h".
47
+ return {
48
+ ttlMs: 24 * 60 * MINUTE,
49
+ confidence: "expired",
50
+ source: "openai prompt_cache_retention=24h (openai.ts)",
51
+ };
52
+ }
53
+ // No retention param sent → OpenAI's default in-memory retention, which
54
+ // its prompt-caching guide documents as up to one hour (a maximum).
55
+ return {
56
+ ttlMs: 60 * MINUTE,
57
+ confidence: "expired",
58
+ source: "openai default in_memory retention, max 1h (no param sent by openai.ts)",
59
+ };
60
+ }
61
+ // Other providers (Gemini, GLM, Moonshot, OpenRouter, local, …): we request
62
+ // no TTL and have no documented window to anchor a warning on.
63
+ return null;
64
+ }
65
+ /**
66
+ * Prefix size below which the notice is not worth an interruption. At 40k
67
+ * tokens a cold Anthropic re-read (1.25x write vs 0.1x cached read) costs ~12x
68
+ * the warm request, roughly a dime on Sonnet-class pricing; below that the delta
69
+ * is pennies — and compacting first itself re-reads the whole context once, so
70
+ * on small chats "Compact first" saves nothing.
71
+ */
72
+ export const CACHE_EXPIRY_NOTICE_MIN_TOKENS = 40_000;
73
+ export function assessCacheExpiry(input) {
74
+ const { current, lastTouch, now } = input;
75
+ if (!input.hasHistory || !current.policy)
76
+ return null;
77
+ const minTokens = input.minTokens ?? CACHE_EXPIRY_NOTICE_MIN_TOKENS;
78
+ const prefixTokens = Math.max(0, Math.round(input.prefixTokens));
79
+ let reason = null;
80
+ let expiresAt = null;
81
+ // The entry lives by the TTL it was WRITTEN with, not the current setting.
82
+ let policy = current.policy;
83
+ if (!lastTouch) {
84
+ reason = "age_unknown";
85
+ }
86
+ else if (lastTouch.provider !== current.provider || lastTouch.model !== current.model) {
87
+ reason = "identity_changed";
88
+ }
89
+ else {
90
+ policy = lastTouch.policy;
91
+ expiresAt = lastTouch.at + policy.ttlMs;
92
+ if (now >= expiresAt)
93
+ reason = "idle";
94
+ }
95
+ const expired = reason !== null;
96
+ return {
97
+ provider: current.provider,
98
+ ttlMs: policy.ttlMs,
99
+ confidence: policy.confidence,
100
+ ttlSource: policy.source,
101
+ lastRequestAt: lastTouch?.at ?? null,
102
+ expiresAt,
103
+ expired,
104
+ reason,
105
+ prefixTokens,
106
+ minTokens,
107
+ notable: expired && prefixTokens >= minTokens,
108
+ estimatedExtraCostUsd: null,
109
+ };
110
+ }
111
+ //# sourceMappingURL=cache-expiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-expiry.js","sourceRoot":"","sources":["../../src/core/cache-expiry.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { stream, } from "@kenkaiiii/gg-ai";
2
2
  import { estimateConversationTokens, estimateMessageTokens } from "./token-estimator.js";
3
3
  import { findLatestHumanQuery, selectQueryAwareContext } from "./query-aware-selector.js";
4
- import { getSummaryModel, getContextWindow } from "../model-registry.js";
4
+ import { getSummaryModel, getContextWindow, getModel } from "../model-registry.js";
5
+ import { isModelUnavailableFailure } from "../model-unavailable.js";
5
6
  import { kimiCodingHeaders, isKimiCodingEndpoint } from "../oauth/kimi.js";
6
7
  import { log } from "../logger.js";
7
8
  /**
@@ -955,13 +956,10 @@ export async function compact(messages, options) {
955
956
  // after generation, so every message that could be removed must be represented.
956
957
  const summarizationSource = messages.slice(1);
957
958
  const fileOps = extractFileOperations(summarizationSource);
958
- // Pick the appropriate model for summarization
959
+ // The cheaper summary model goes first (see getSummaryModel). The ACTIVE
960
+ // model is the fallback when the provider rejects it — retired upstream, or
961
+ // not on the user's plan — which the registry cannot know in advance.
959
962
  const summaryModel = getSummaryModel(options.provider, options.model);
960
- const summaryContextWindow = getContextWindow(summaryModel.id, {
961
- provider: options.provider,
962
- accountId: options.accountId,
963
- });
964
- const summaryOutputTokens = Math.min(summaryModel.maxOutputTokens, resolveSummaryOutputTokens(summaryContextWindow));
965
963
  const previousSummary = findLatestPreviousSummary(summarizationSource);
966
964
  // Carry the prior tracked edits forward as DATA, not as prose the summarizer
967
965
  // has to re-transcribe. Their originating tool calls were collapsed by an
@@ -981,10 +979,8 @@ export async function compact(messages, options) {
981
979
  ...extractFailingTests(summarizationSource),
982
980
  ], carriedTests.omitted);
983
981
  const classifiedMessages = classifyMessagesForSummary(summarizationSource);
984
- // Budget: summary model context - output tokens - system/user prompt overhead (~1K).
985
982
  // Prior compacted memory is pinned separately, never presented as a fresh human turn.
986
983
  const promptOverhead = 1000;
987
- const tokenBudget = summaryContextWindow - summaryOutputTokens - promptOverhead;
988
984
  const previousSummaryMessage = previousSummary
989
985
  ? {
990
986
  role: "user",
@@ -995,27 +991,6 @@ export async function compact(messages, options) {
995
991
  ? estimateMessageTokens(previousSummaryMessage)
996
992
  : 0;
997
993
  const query = findLatestHumanQuery(summarizationSource);
998
- const contextSelection = selectQueryAwareContext(classifiedMessages, query, Math.max(0, tokenBudget - previousSummaryTokens), { fallback: selectMessagesInBudget });
999
- const selectedMessages = contextSelection.messages;
1000
- log("INFO", "compaction", `Summarizing ${middleMessages.length} messages`, {
1001
- summaryModel: summaryModel.id,
1002
- summaryContextWindow: String(summaryContextWindow),
1003
- tokenBudget: String(tokenBudget),
1004
- preparedMessages: String(classifiedMessages.length),
1005
- selectedMessages: String(selectedMessages.length + (previousSummaryMessage ? 1 : 0)),
1006
- droppedMessages: String(contextSelection.droppedMessages),
1007
- selectedTokens: String(contextSelection.selectedTokens),
1008
- selectionStrategy: contextSelection.strategy,
1009
- queryTerms: String(contextSelection.queryTerms),
1010
- ...(contextSelection.fallbackReason
1011
- ? { selectionFallback: contextSelection.fallbackReason }
1012
- : {}),
1013
- previousSummary: String(!!previousSummaryMessage),
1014
- summaryOutputTokens: String(summaryOutputTokens),
1015
- filesModified: String(fileOps.modified.size),
1016
- filesModifiedCarried: String(carriedSummary.files.length),
1017
- recentKept: String(recentMessages.length),
1018
- });
1019
994
  // Add plan preservation and summary-update instructions when applicable.
1020
995
  const planPreservation = options.approvedPlanPath
1021
996
  ? `\n\n### APPROVED PLAN PRESERVATION\n` +
@@ -1039,21 +1014,59 @@ export async function compact(messages, options) {
1039
1014
  "evidence completed, reversed, or made irrelevant. Never concatenate, never emit an 'update since " +
1040
1015
  "the previous summary' section, and never restate a fact in both old and new wording."
1041
1016
  : "";
1042
- const summaryMessages = [
1043
- {
1044
- role: "system",
1045
- content: COMPACTION_SYSTEM_PROMPT + planPreservation + focusDirective + updateInstruction,
1046
- },
1047
- ...(previousSummaryMessage ? [previousSummaryMessage] : []),
1048
- ...selectedMessages,
1049
- { role: "user", content: COMPACTION_USER_PROMPT },
1050
- ];
1051
- log("INFO", "compaction", `Calling summary LLM`, {
1052
- provider: options.provider,
1053
- model: summaryModel.id,
1054
- messageCount: String(summaryMessages.length),
1055
- hasApiKey: String(!!options.apiKey),
1056
- });
1017
+ /**
1018
+ * Size and assemble the summary request for one model. Re-run when the
1019
+ * request moves to the active model, whose context window may be smaller.
1020
+ */
1021
+ const prepareSummaryRequest = (modelId) => {
1022
+ const contextWindow = getContextWindow(modelId, {
1023
+ provider: options.provider,
1024
+ accountId: options.accountId,
1025
+ });
1026
+ const outputTokens = Math.min(getModel(modelId)?.maxOutputTokens ?? Number.POSITIVE_INFINITY, resolveSummaryOutputTokens(contextWindow));
1027
+ // Budget: summary model context - output tokens - system/user prompt overhead (~1K).
1028
+ const tokenBudget = contextWindow - outputTokens - promptOverhead;
1029
+ const contextSelection = selectQueryAwareContext(classifiedMessages, query, Math.max(0, tokenBudget - previousSummaryTokens), { fallback: selectMessagesInBudget });
1030
+ const selectedMessages = contextSelection.messages;
1031
+ log("INFO", "compaction", `Summarizing ${middleMessages.length} messages`, {
1032
+ summaryModel: modelId,
1033
+ summaryContextWindow: String(contextWindow),
1034
+ tokenBudget: String(tokenBudget),
1035
+ preparedMessages: String(classifiedMessages.length),
1036
+ selectedMessages: String(selectedMessages.length + (previousSummaryMessage ? 1 : 0)),
1037
+ droppedMessages: String(contextSelection.droppedMessages),
1038
+ selectedTokens: String(contextSelection.selectedTokens),
1039
+ selectionStrategy: contextSelection.strategy,
1040
+ queryTerms: String(contextSelection.queryTerms),
1041
+ ...(contextSelection.fallbackReason
1042
+ ? { selectionFallback: contextSelection.fallbackReason }
1043
+ : {}),
1044
+ previousSummary: String(!!previousSummaryMessage),
1045
+ summaryOutputTokens: String(outputTokens),
1046
+ filesModified: String(fileOps.modified.size),
1047
+ filesModifiedCarried: String(carriedSummary.files.length),
1048
+ recentKept: String(recentMessages.length),
1049
+ });
1050
+ const summaryMessages = [
1051
+ {
1052
+ role: "system",
1053
+ content: COMPACTION_SYSTEM_PROMPT + planPreservation + focusDirective + updateInstruction,
1054
+ },
1055
+ ...(previousSummaryMessage ? [previousSummaryMessage] : []),
1056
+ ...selectedMessages,
1057
+ { role: "user", content: COMPACTION_USER_PROMPT },
1058
+ ];
1059
+ log("INFO", "compaction", `Calling summary LLM`, {
1060
+ provider: options.provider,
1061
+ model: modelId,
1062
+ messageCount: String(summaryMessages.length),
1063
+ hasApiKey: String(!!options.apiKey),
1064
+ });
1065
+ return { modelId, outputTokens, contextSelection, selectedMessages, summaryMessages };
1066
+ };
1067
+ let request = prepareSummaryRequest(summaryModel.id);
1068
+ // Only a DIFFERENT model can rescue a rejected one.
1069
+ let canFallBackToActiveModel = summaryModel.id !== options.model;
1057
1070
  // Retry empty successful responses only. Transport failures and timeouts use
1058
1071
  // the deterministic fallback immediately; replaying the same large request
1059
1072
  // adds long UI stalls and can leave several expensive requests in flight.
@@ -1066,9 +1079,9 @@ export async function compact(messages, options) {
1066
1079
  try {
1067
1080
  const result = stream({
1068
1081
  provider: options.provider,
1069
- model: summaryModel.id,
1070
- messages: summaryMessages,
1071
- maxTokens: summaryOutputTokens,
1082
+ model: request.modelId,
1083
+ messages: request.summaryMessages,
1084
+ maxTokens: request.outputTokens,
1072
1085
  apiKey: options.apiKey,
1073
1086
  accountId: options.accountId,
1074
1087
  projectId: options.projectId,
@@ -1112,6 +1125,20 @@ export async function compact(messages, options) {
1112
1125
  if (options.signal?.aborted || (err instanceof Error && err.name === "AbortError")) {
1113
1126
  throw err;
1114
1127
  }
1128
+ if (canFallBackToActiveModel && isModelUnavailableFailure(err)) {
1129
+ // The cheaper model was rejected outright: summarize on the model the
1130
+ // session is already using, instead of dropping to the much weaker
1131
+ // extractive fallback.
1132
+ canFallBackToActiveModel = false;
1133
+ log("WARN", "compaction", `Summary model unavailable — retrying on the active model`, {
1134
+ summaryModel: request.modelId,
1135
+ activeModel: options.model,
1136
+ error: err instanceof Error ? err.message : String(err),
1137
+ });
1138
+ request = prepareSummaryRequest(options.model);
1139
+ attempt--; // A rejected model is not one of the empty-response retries.
1140
+ continue;
1141
+ }
1115
1142
  log("WARN", "compaction", err instanceof SummaryTimeoutError
1116
1143
  ? `Summary LLM call timed out after ${SUMMARY_ATTEMPT_TIMEOUT_MS}ms — using fallback`
1117
1144
  : `Summary LLM call failed: ${err instanceof Error ? err.message : String(err)}`, { attempt: String(attempt), timeoutMs: String(SUMMARY_ATTEMPT_TIMEOUT_MS) });
@@ -1122,6 +1149,9 @@ export async function compact(messages, options) {
1122
1149
  attemptController.abort();
1123
1150
  }
1124
1151
  }
1152
+ // Report the selection of the request that actually ran (the active model's
1153
+ // after a fallback).
1154
+ const { contextSelection, selectedMessages } = request;
1125
1155
  // Fallback: preserve prior compacted memory and append a fresh extractive update.
1126
1156
  if (summaryText.length === 0) {
1127
1157
  log("WARN", "compaction", `All summary attempts failed — using fallback extractive summary`);