@cortexkit/opencode-magic-context 0.49.0 → 0.49.1

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 (195) hide show
  1. package/dist/{announcement-fp14dw0n.js → announcement-hdbkt8v5.js} +1 -1
  2. package/dist/auto-search-worker.js +3 -3
  3. package/dist/config/{mural-model-deprecation.d.ts → deprecated-config.d.ts} +4 -1
  4. package/dist/config/deprecated-config.d.ts.map +1 -0
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/project-security.d.ts +2 -2
  7. package/dist/config/schema/magic-context.d.ts +4 -4
  8. package/dist/config/schema/magic-context.d.ts.map +1 -1
  9. package/dist/{conflict-warning-hook-kzx4dmk1.js → conflict-warning-hook-asnt6hfc.js} +3 -3
  10. package/dist/{context-nj5f293n.js → context-tfyhtdcs.js} +111 -45
  11. package/dist/{derive-budgets-qz5rrr08.js → derive-budgets-j4ry8j8n.js} +1 -1
  12. package/dist/{embedding-backfill-aetxv1vt.js → embedding-backfill-wyc3ykyf.js} +7 -7
  13. package/dist/embedding-worker-process.js +30 -0
  14. package/dist/embedding-worker.js +5 -5
  15. package/dist/features/magic-context/dreamer/task-registry.d.ts +2 -3
  16. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  17. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +8 -1
  18. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -1
  19. package/dist/features/magic-context/memory/embedding-worker-process.d.ts +2 -0
  20. package/dist/features/magic-context/memory/embedding-worker-process.d.ts.map +1 -0
  21. package/dist/features/magic-context/memory/onnx-telemetry.d.ts +3 -0
  22. package/dist/features/magic-context/memory/onnx-telemetry.d.ts.map +1 -0
  23. package/dist/features/magic-context/overflow-detection.d.ts +1 -2
  24. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  25. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  26. package/dist/features/magic-context/transform-decision-log.d.ts +1 -1
  27. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  28. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts +1 -0
  29. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  30. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  31. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +1 -0
  32. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  34. package/dist/hooks/magic-context/hook.d.ts +1 -0
  35. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  36. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/lkg-measured-request.d.ts +3 -1
  38. package/dist/hooks/magic-context/lkg-measured-request.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/lkg-persist.d.ts +8 -14
  40. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts +62 -0
  42. package/dist/hooks/magic-context/lkg-recovery-fence.d.ts.map +1 -0
  43. package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts +38 -0
  44. package/dist/hooks/magic-context/lkg-recovery-prefix.d.ts.map +1 -0
  45. package/dist/hooks/magic-context/lkg-replay.d.ts +3 -1
  46. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/opaque-thinking.d.ts +12 -0
  49. package/dist/hooks/magic-context/opaque-thinking.d.ts.map +1 -0
  50. package/dist/hooks/magic-context/pass-outcome.d.ts +2 -2
  51. package/dist/hooks/magic-context/pending-materialization.d.ts +8 -0
  52. package/dist/hooks/magic-context/pending-materialization.d.ts.map +1 -0
  53. package/dist/hooks/magic-context/read-session-db.d.ts +3 -0
  54. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  56. package/dist/hooks/magic-context/rust-mode-transform.d.ts +1 -0
  57. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/strip-content.d.ts +5 -2
  59. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/system-date-refresh.d.ts +29 -0
  61. package/dist/hooks/magic-context/system-date-refresh.d.ts.map +1 -0
  62. package/dist/hooks/magic-context/system-prompt-dates.d.ts +6 -0
  63. package/dist/hooks/magic-context/system-prompt-dates.d.ts.map +1 -0
  64. package/dist/hooks/magic-context/system-prompt-delivery.d.ts +47 -0
  65. package/dist/hooks/magic-context/system-prompt-delivery.d.ts.map +1 -0
  66. package/dist/hooks/magic-context/system-prompt-hash.d.ts +4 -0
  67. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/tag-messages.d.ts +8 -0
  69. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +2 -0
  71. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  72. package/dist/hooks/magic-context/transform.d.ts +6 -0
  73. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  74. package/dist/{index-9qjqq45k.js → index-0pjvpfkf.js} +21 -1
  75. package/dist/index-6m7rdv7y.js +733 -0
  76. package/dist/{index-1r0k9js3.js → index-6tfxmc4n.js} +10 -10
  77. package/dist/{index-gzcmtmar.js → index-7w18gg78.js} +25 -1
  78. package/dist/{index-nm6a8xpd.js → index-att4bfan.js} +1 -1
  79. package/dist/{index-ezmszwbd.js → index-eypn4ba6.js} +7 -4
  80. package/dist/{index-ha87j7a8.js → index-fdtkt5r1.js} +6 -6
  81. package/dist/{index-kp5qe690.js → index-fg00p1cg.js} +38 -36
  82. package/dist/{index-1bc61ans.js → index-fvnzcnww.js} +44 -1
  83. package/dist/index-gbmqa9x9.js +1170 -0
  84. package/dist/{index-pxwp2hjk.js → index-gzky5rva.js} +30 -53
  85. package/dist/{index-kq57tdf0.js → index-k6xvbj2e.js} +255 -1075
  86. package/dist/{index-0w56v4fm.js → index-mw7c950g.js} +1 -1
  87. package/dist/{index-1g30axtz.js → index-p0n5ryq8.js} +82 -900
  88. package/dist/{index-b7mv1jx3.js → index-p1hnwfd8.js} +1 -1
  89. package/dist/{index-peshmj6h.js → index-r2zcs71c.js} +6 -4
  90. package/dist/{index-kmpvemph.js → index-rafsaxac.js} +2 -2
  91. package/dist/{index-stbr4ce6.js → index-s7fc0fkn.js} +1 -1
  92. package/dist/{index-hj2q50k0.js → index-sfhndpcb.js} +463 -6
  93. package/dist/index-sv0bb7vg.js +6972 -0
  94. package/dist/{index-57mrqed8.js → index-w23dh319.js} +17 -258
  95. package/dist/{index-9rt53q79.js → index-xgrwmj82.js} +1 -1
  96. package/dist/{index-h2py7207.js → index-xnanvj3w.js} +765 -1255
  97. package/dist/{index-2jcbj7r1.js → index-zfzdpeq2.js} +2269 -3802
  98. package/dist/{index-s4j7t92z.js → index-zg8yq4ya.js} +29 -744
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +209 -61
  101. package/dist/{message-index-bounded-h0mrd4pr.js → message-index-bounded-hqktkhdy.js} +7 -6
  102. package/dist/migration-worker.js +6 -5
  103. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -1
  104. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  105. package/dist/plugin/messages-transform.d.ts.map +1 -1
  106. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  107. package/dist/{project-embedding-registry-rtt0djyb.js → project-embedding-registry-0gv3h6y8.js} +6 -6
  108. package/dist/raw-ordinal-warmup-worker.js +1 -1
  109. package/dist/{read-session-chunk-ty89v75e.js → read-session-chunk-5mh0bh8y.js} +5 -4
  110. package/dist/{recomp-orchestrator-4f1yyd1q.js → recomp-orchestrator-kpkhkjhq.js} +20 -19
  111. package/dist/{search-pz4f4wge.js → search-p9w39qv4.js} +15 -14
  112. package/dist/{send-session-notification-38cd5dqt.js → send-session-notification-xffh3bbe.js} +2 -2
  113. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  114. package/dist/shared/storage-file-mutex.d.ts +9 -0
  115. package/dist/shared/storage-file-mutex.d.ts.map +1 -0
  116. package/dist/shared/storage-permissions.d.ts +6 -0
  117. package/dist/shared/storage-permissions.d.ts.map +1 -1
  118. package/dist/shared/window-geometry.d.ts +9 -66
  119. package/dist/shared/window-geometry.d.ts.map +1 -1
  120. package/dist/standalone-plugin-marker.d.ts +8 -0
  121. package/dist/standalone-plugin-marker.d.ts.map +1 -0
  122. package/dist/tools/ctx-reduce/constants.d.ts +1 -2
  123. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  124. package/dist/tools/ctx-reduce/tools.d.ts +1 -1
  125. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
  126. package/dist/{transform-postprocess-phase-tck4g20s.js → transform-postprocess-phase-481j5a7z.js} +20 -19
  127. package/dist/v2/auto-search-worker.js +3 -3
  128. package/dist/v2/{context-crbt6p1y.js → context-gsdtha5v.js} +873 -2122
  129. package/dist/v2/{derive-budgets-fgej9j46.js → derive-budgets-enckmg7y.js} +2 -2
  130. package/dist/v2/{embedding-backfill-ph1qfyn3.js → embedding-backfill-dbvjbcmm.js} +8 -9
  131. package/dist/v2/embedding-worker-process.js +29 -0
  132. package/dist/v2/embedding-worker.js +3 -4
  133. package/dist/v2/hooks/context.d.ts.map +1 -1
  134. package/dist/v2/hooks/copied-tag-notation.d.ts +19 -0
  135. package/dist/v2/hooks/copied-tag-notation.d.ts.map +1 -0
  136. package/dist/v2/hooks/payload.d.ts.map +1 -1
  137. package/dist/v2/hooks/system-prompt-response.d.ts +5 -0
  138. package/dist/v2/hooks/system-prompt-response.d.ts.map +1 -0
  139. package/dist/v2/{message-index-bounded-xwqdywxg.js → message-index-bounded-p6v0n8qh.js} +8 -7
  140. package/dist/v2/migration-worker.js +6 -5
  141. package/dist/v2/{project-embedding-registry-d6m7tyxr.js → project-embedding-registry-nyq7z8y6.js} +7 -8
  142. package/dist/v2/raw-ordinal-warmup-worker.js +2 -2
  143. package/dist/v2/{read-session-chunk-8p5mdryx.js → read-session-chunk-fhyfe4qa.js} +6 -5
  144. package/dist/v2/{recomp-orchestrator-ckfgt6wq.js → recomp-orchestrator-5xy7w136.js} +22 -22
  145. package/dist/v2/{search-ym8rehhz.js → search-j7bakcwa.js} +17 -17
  146. package/dist/v2/{send-session-notification-5m0yapqx.js → send-session-notification-f6v698r5.js} +2 -2
  147. package/dist/v2/{server-jvxzm1jy.js → server-1fszbabv.js} +28 -28
  148. package/dist/v2/{server-3j4d00kf.js → server-2htmbqbv.js} +25 -1
  149. package/dist/v2/{server-c5rrgrcd.js → server-4c7jt8gq.js} +25 -1
  150. package/dist/v2/{server-ycw9qqcy.js → server-4enr7s6x.js} +1 -1
  151. package/dist/v2/{server-v4mewb78.js → server-6tcrjfw8.js} +1 -1
  152. package/dist/v2/{server-x4hscabv.js → server-7spkq1y6.js} +2257 -3746
  153. package/dist/v2/{server-sa8jvrfc.js → server-7vkj6zhb.js} +29 -744
  154. package/dist/v2/{server-xwz4dqh9.js → server-8xmq9h3f.js} +30 -53
  155. package/dist/v2/{server-1tk82krw.js → server-bgzy0phk.js} +463 -6
  156. package/dist/v2/server-c7n2ftng.js +6860 -0
  157. package/dist/v2/server-cvgn49tr.js +733 -0
  158. package/dist/v2/{server-zm570tr2.js → server-cw6521wn.js} +232 -7
  159. package/dist/v2/{server-pj4pjv02.js → server-czb2rkpk.js} +21 -1
  160. package/dist/v2/{server-19zjmn02.js → server-d6g4whc2.js} +20 -14
  161. package/dist/v2/{server-1bc61ans.js → server-fvnzcnww.js} +44 -1
  162. package/dist/v2/{server-w32kmdez.js → server-kh958yj8.js} +3 -3
  163. package/dist/v2/{server-q4ph9bwn.js → server-mqvtz7wz.js} +7 -7
  164. package/dist/v2/{server-2s6ayq3t.js → server-ras2sxnc.js} +133 -13
  165. package/dist/v2/{server-ss95ky04.js → server-s2st631p.js} +1 -1
  166. package/dist/v2/{server-2s9qz6n7.js → server-t528t8qm.js} +1 -1
  167. package/dist/v2/{server-8k2agx29.js → server-vb7pbd9p.js} +17 -258
  168. package/dist/v2/{server-zp53y8js.js → server-zbxjj2mz.js} +2 -2
  169. package/dist/v2/server.d.ts.map +1 -1
  170. package/dist/v2/server.js +149 -5
  171. package/dist/v2/{storage-tags-8vw924zn.js → storage-tags-5yxrvkaf.js} +1 -1
  172. package/dist/v2/{wrapup-orchestrator-a7efxaax.js → wrapup-orchestrator-yem5422s.js} +28 -28
  173. package/dist/{wrapup-orchestrator-barbc6h9.js → wrapup-orchestrator-xvrr27ws.js} +21 -20
  174. package/package.json +4 -4
  175. package/src/config/{mural-model-deprecation.ts → deprecated-config.ts} +19 -0
  176. package/src/config/index.test.ts +15 -37
  177. package/src/config/index.ts +2 -3
  178. package/src/config/project-security.ts +3 -3
  179. package/src/config/schema/magic-context.ts +11 -7
  180. package/src/features/magic-context/dreamer/task-registry.ts +2 -3
  181. package/src/shared/models-dev-cache.ts +1 -7
  182. package/src/shared/sqlite-640-review.test.ts +5 -1
  183. package/src/shared/storage-file-mutex-review.test.ts +162 -0
  184. package/src/shared/storage-file-mutex.ts +130 -0
  185. package/src/shared/storage-permissions.ts +46 -0
  186. package/src/shared/window-geometry.test.ts +102 -236
  187. package/src/shared/window-geometry.ts +23 -413
  188. package/dist/config/mural-model-deprecation.d.ts.map +0 -1
  189. package/dist/index-2jgwttpt.js +0 -3269
  190. package/dist/index-mfkzp7qj.js +0 -229
  191. package/dist/v2/server-4ez8mntn.js +0 -3213
  192. package/dist/v2/server-mfkzp7qj.js +0 -229
  193. package/src/shared/__fixtures__/window-overlay.v1.json +0 -337
  194. /package/dist/{index-2pp04pmg.js → index-69vas84q.js} +0 -0
  195. /package/dist/v2/{index-2pp04pmg.js → index-69vas84q.js} +0 -0
@@ -1,180 +1,13 @@
1
- import { afterEach, describe, expect, test } from "bun:test";
2
- import { readFileSync, rmSync, writeFileSync } from "node:fs";
3
- import { tmpdir } from "node:os";
4
- import { join } from "node:path";
1
+ import { describe, expect, test } from "bun:test";
5
2
  import { resolveLimit, resolveOutputReserve } from "./models-dev-cache";
6
- import { createTestTempDirFromPath } from "./test-temp-dir";
7
3
  import {
8
4
  applyProvenInputFloor,
9
5
  deriveWindowGeometry,
10
6
  formatCompactTokens,
11
7
  formatWindowDerivationLine,
12
- parseWindowOverlay,
13
8
  placeholderFilteredOutput,
14
- readWindowOverlayFile,
15
- resolveWindowOverlayFacts,
16
- scalarizeFact,
17
- type WindowOverlay,
18
- type WindowOverlayFact,
19
9
  } from "./window-geometry";
20
10
 
21
- const fixture = JSON.parse(
22
- readFileSync(new URL("./__fixtures__/window-overlay.v1.json", import.meta.url), "utf8"),
23
- ) as unknown;
24
- const parsedFixture = parseWindowOverlay(fixture).overlay as WindowOverlay;
25
- const tempDirs: string[] = [];
26
-
27
- function fact(
28
- value: WindowOverlayFact["value"],
29
- overrides: Partial<WindowOverlayFact> = {},
30
- ): WindowOverlayFact {
31
- return {
32
- value,
33
- grade: "measured",
34
- units: "provider",
35
- boundary: "Observed",
36
- source_ref: "test",
37
- observed_at: "2026-08-13T00:00:00Z",
38
- ...overrides,
39
- };
40
- }
41
-
42
- function overlay(
43
- provider: string,
44
- model: string,
45
- facts: Record<string, WindowOverlayFact>,
46
- ): WindowOverlay {
47
- return {
48
- schema: "fusiform-window-overlay/v1",
49
- generated_at: "2026-08-13T00:00:00Z",
50
- minted_provider_ids: [],
51
- cells: [{ provider_id: provider, model_id: model, facts }],
52
- };
53
- }
54
-
55
- afterEach(() => {
56
- for (const path of tempDirs.splice(0)) rmSync(path, { recursive: true, force: true });
57
- });
58
-
59
- describe("Fusiform overlay v1", () => {
60
- test("scalarizes every tagged union conservatively", () => {
61
- expect(scalarizeFact({ kind: "stated", value: 272_000 })).toBe(272_000);
62
- expect(scalarizeFact({ kind: "bracket", at_least: 340_000, below: 372_001 })).toBe(340_000);
63
- expect(scalarizeFact({ kind: "bracket", below: 372_001 })).toBeUndefined();
64
- expect(scalarizeFact({ kind: "unknown", why: "never_measured" })).toBeUndefined();
65
- });
66
-
67
- test("preserves a half-open bracket and derives exactly from at_least", () => {
68
- const halfOpen = parseWindowOverlay({
69
- schema: "fusiform-window-overlay/v1",
70
- generated_at: "2026-08-13T00:00:00Z",
71
- minted_provider_ids: [],
72
- cells: [
73
- {
74
- provider_id: "openai-chatgpt-oauth",
75
- model_id: "gpt-5.6-sol",
76
- facts: {
77
- "window.advertised": fact({ kind: "stated", value: 272_000 }),
78
- "window.enforced": fact({ kind: "bracket", at_least: 340_000 }),
79
- },
80
- },
81
- ],
82
- }).overlay;
83
- const parsedValue = halfOpen?.cells[0]?.facts["window.enforced"]?.value;
84
- expect(parsedValue).toEqual({ kind: "bracket", at_least: 340_000 });
85
- expect(parsedValue && "below" in parsedValue).toBe(false);
86
- const halfOpenResult = deriveWindowGeometry(
87
- "openai-chatgpt-oauth",
88
- "gpt-5.6-sol",
89
- { context: 272_000, output: 128_000 },
90
- {
91
- overlay: resolveWindowOverlayFacts("openai-chatgpt-oauth", "gpt-5.6-sol", halfOpen),
92
- },
93
- );
94
- const statedResult = deriveWindowGeometry(
95
- "openai-chatgpt-oauth",
96
- "gpt-5.6-sol",
97
- { context: 272_000, output: 128_000 },
98
- {
99
- overlay: resolveWindowOverlayFacts(
100
- "openai-chatgpt-oauth",
101
- "gpt-5.6-sol",
102
- overlay("openai-chatgpt-oauth", "gpt-5.6-sol", {
103
- "window.enforced": fact({ kind: "stated", value: 340_000 }),
104
- }),
105
- ),
106
- },
107
- );
108
- expect(halfOpenResult).toEqual(statedResult);
109
- });
110
-
111
- test("specific cells override wildcard facts per fact", () => {
112
- const data: WindowOverlay = {
113
- schema: "fusiform-window-overlay/v1",
114
- generated_at: "2026-08-13T00:00:00Z",
115
- minted_provider_ids: [],
116
- cells: [
117
- {
118
- provider_id: "ollama-cloud",
119
- model_id: "*",
120
- facts: {
121
- "output.enforced": fact({ kind: "stated", value: 65_536 }),
122
- geometry: fact({ kind: "stated", value: "shared_upfront" }),
123
- },
124
- },
125
- {
126
- provider_id: "ollama-cloud",
127
- model_id: "deepseek-v4",
128
- facts: {
129
- "output.enforced": fact({ kind: "stated", value: 32_000 }),
130
- },
131
- },
132
- ],
133
- };
134
- const facts = resolveWindowOverlayFacts("ollama-cloud", "deepseek-v4", data)?.facts;
135
- expect(scalarizeFact(facts?.["output.enforced"]?.value as never)).toBe(32_000);
136
- expect(facts?.geometry?.value).toEqual({ kind: "stated", value: "shared_upfront" });
137
- });
138
-
139
- test("refuses an unrecognized schema before considering familiar cells", () => {
140
- const v2 = {
141
- ...(fixture as Record<string, unknown>),
142
- schema: "fusiform-window-overlay/v2",
143
- };
144
- const parsed = parseWindowOverlay(v2);
145
- expect(parsed.overlay).toBeUndefined();
146
- expect(parsed.refusal).toContain("unrecognized schema");
147
- });
148
-
149
- test("skips bad cells once and keeps valid cells", () => {
150
- const badCell = {
151
- provider_id: "bad",
152
- model_id: "model",
153
- facts: { "window.enforced": { value: { kind: "stated", value: 1_000_000 } } },
154
- };
155
- const parsed = parseWindowOverlay({
156
- ...(fixture as Record<string, unknown>),
157
- cells: [badCell, ...(fixture as { cells: unknown[] }).cells],
158
- });
159
- expect(parsed.badCells).toBe(1);
160
- expect(parsed.overlay?.cells.length).toBe(parsedFixture.cells.length);
161
- });
162
-
163
- test("a missing file is silent and a bad file logs one summary", () => {
164
- const dir = createTestTempDirFromPath(join(tmpdir(), "window-overlay-test-"));
165
- tempDirs.push(dir);
166
- const logs: string[] = [];
167
- expect(
168
- readWindowOverlayFile(join(dir, "missing.json"), (message) => logs.push(message)),
169
- ).toBeUndefined();
170
- expect(logs).toEqual([]);
171
- const path = join(dir, "bad.json");
172
- writeFileSync(path, JSON.stringify({ ...(fixture as object), schema: "v2" }));
173
- expect(readWindowOverlayFile(path, (message) => logs.push(message))).toBeUndefined();
174
- expect(logs).toHaveLength(1);
175
- });
176
- });
177
-
178
11
  describe("window geometry", () => {
179
12
  test("filters placeholders independently in both directions", () => {
180
13
  expect(placeholderFilteredOutput(0, 1_000_000)).toBeUndefined();
@@ -190,63 +23,106 @@ describe("window geometry", () => {
190
23
  ).toBe(300_000);
191
24
  });
192
25
 
193
- test("fixture table yields the 65% execution bases from the spec", () => {
26
+ test("preserves catalog geometry for representative models", () => {
194
27
  const cases = [
195
- ["openai-chatgpt-oauth", "gpt-5.6", 272_000, 128_000, 200_200],
196
- ["anthropic", "claude-opus-5", 1_000_000, 128_000, 629_200],
197
- // Producer batch downgraded google's geometry to considered-unknown
198
- // (Google's docs contradict the separate-quota reading), so the
199
- // derivation demotes to shared_upfront and reserves OpenCode's
200
- // actual request cap B = min(65_536, 32_000):
201
- // floor(0.65 * (1_048_576 - 32_000)) — not the no-reserve 681_574.
202
- ["google", "gemini-3.5-flash", 1_048_576, 65_536, 660_774],
203
- ["xai", "grok-4.6", 500_000, 500_000, 304_200],
204
- ["ollama-cloud", "deepseek-v4-flash", 1_048_576, 384_000, 660_774],
205
- ["moonshotai", "kimi-k3", 1_048_576, 1_048_576, 660_774],
206
- ] as const;
207
- for (const [provider, model, context, output, expectedExecute] of cases) {
208
- const result = deriveWindowGeometry(
209
- provider,
210
- model,
211
- { context, output },
212
- {
213
- overlay: resolveWindowOverlayFacts(provider, model, parsedFixture),
28
+ {
29
+ provider: "openai",
30
+ model: "gpt-4o",
31
+ limit: { context: 128_000, output: 16_384 },
32
+ expected: {
33
+ usableSoft: 111_616,
34
+ usableHard: 111_616,
35
+ geometry: "shared_upfront",
36
+ derivation: {
37
+ window: 128_000,
38
+ reserve: 16_384,
39
+ reserveSource: "output_catalog",
40
+ geometry: "shared_upfront",
41
+ windowSource: "catalog",
42
+ absoluteWall: 128_000,
43
+ },
214
44
  },
215
- );
216
- expect(Math.floor((result?.usableSoft ?? 0) * 0.65)).toBe(expectedExecute);
217
- }
218
- });
219
-
220
- test("grok derives from geometry, window, and default output without an enforced output", () => {
221
- const facts = resolveWindowOverlayFacts("xai", "grok-4.6", parsedFixture);
222
- expect(facts?.facts["output.enforced"]).toBeUndefined();
223
- const result = deriveWindowGeometry(
224
- "xai",
225
- "grok-4.6",
226
- { context: 500_000, output: 500_000 },
227
- { overlay: facts },
228
- );
229
- expect(result?.geometry).toBe("shared_truncating");
230
- expect(result?.usableSoft).toBe(468_000);
231
- });
232
-
233
- test("kimi reserves its default output instead of placeholder advertised output", () => {
234
- const result = deriveWindowGeometry(
235
- "moonshotai",
236
- "kimi-k3",
237
- { context: 1_048_576, output: 1_048_576 },
45
+ },
238
46
  {
239
- overlay: resolveWindowOverlayFacts("moonshotai", "kimi-k3", parsedFixture),
47
+ provider: "anthropic",
48
+ model: "claude-3-7-sonnet",
49
+ limit: { context: 200_000, output: 64_000 },
50
+ expected: {
51
+ usableSoft: 150_000,
52
+ usableHard: 195_904,
53
+ geometry: "shared_truncating",
54
+ derivation: {
55
+ window: 200_000,
56
+ reserve: 50_000,
57
+ reserveSource: "output_catalog",
58
+ geometry: "shared_truncating",
59
+ windowSource: "catalog",
60
+ absoluteWall: 200_000,
61
+ },
62
+ },
240
63
  },
241
- );
242
- expect(result?.derivation.reserve).toBe(32_000);
243
- expect(result?.usableSoft).toBe(1_016_576);
64
+ {
65
+ provider: "google",
66
+ model: "gemini-2.5-pro",
67
+ limit: { context: 1_000_000, output: 65_536 },
68
+ expected: {
69
+ usableSoft: 1_000_000,
70
+ usableHard: 1_000_000,
71
+ geometry: "separate",
72
+ derivation: {
73
+ window: 1_000_000,
74
+ reserve: 0,
75
+ reserveSource: "none",
76
+ geometry: "separate",
77
+ windowSource: "catalog",
78
+ absoluteWall: 1_000_000,
79
+ },
80
+ },
81
+ },
82
+ {
83
+ provider: "xai",
84
+ model: "grok-3",
85
+ limit: { context: 131_072, output: 32_768 },
86
+ expected: {
87
+ usableSoft: 98_304,
88
+ usableHard: 126_976,
89
+ geometry: "shared_truncating",
90
+ derivation: {
91
+ window: 131_072,
92
+ reserve: 32_768,
93
+ reserveSource: "output_catalog",
94
+ geometry: "shared_truncating",
95
+ windowSource: "catalog",
96
+ absoluteWall: 131_072,
97
+ },
98
+ },
99
+ },
100
+ {
101
+ provider: "openai-codex",
102
+ model: "gpt-5.6-sol",
103
+ limit: { context: 272_000, output: 128_000 },
104
+ expected: {
105
+ usableSoft: 204_000,
106
+ usableHard: 240_000,
107
+ geometry: "shared_upfront",
108
+ derivation: {
109
+ window: 272_000,
110
+ reserve: 68_000,
111
+ reserveSource: "output_catalog",
112
+ geometry: "shared_upfront",
113
+ windowSource: "catalog",
114
+ absoluteWall: 272_000,
115
+ },
116
+ },
117
+ },
118
+ ] as const;
119
+
120
+ for (const { provider, model, limit, expected } of cases) {
121
+ expect(deriveWindowGeometry(provider, model, limit)).toEqual(expected);
122
+ }
244
123
  });
245
124
 
246
- test("output_reserve forms override a pre-carved input and overlay output facts", () => {
247
- const data = overlay("openai-codex", "gpt-5.6-sol", {
248
- "output.enforced": fact({ kind: "stated", value: 68_000 }),
249
- });
125
+ test("output_reserve forms override a pre-carved input and catalog output", () => {
250
126
  const cases = [
251
127
  16_384,
252
128
  { default: 16_384 },
@@ -259,7 +135,6 @@ describe("window geometry", () => {
259
135
  "gpt-5.6-sol",
260
136
  { context: 400_000, input: 272_000, output: 128_000 },
261
137
  {
262
- overlay: resolveWindowOverlayFacts("openai-codex", "gpt-5.6-sol", data),
263
138
  outputReserveOverride: resolveOutputReserve(
264
139
  "openai-codex",
265
140
  "gpt-5.6-sol",
@@ -276,27 +151,18 @@ describe("window geometry", () => {
276
151
  }
277
152
  });
278
153
 
279
- test("provider hook wins over overlay, while overlay beats catalog", () => {
280
- const data = overlay("provider", "model", {
281
- "window.enforced": fact({ kind: "stated", value: 300_000 }),
282
- "output.enforced": fact({ kind: "stated", value: 20_000 }),
154
+ test("provider hook overrides catalog limits field by field", () => {
155
+ const catalog = deriveWindowGeometry("provider", "model", {
156
+ context: 200_000,
157
+ output: 10_000,
283
158
  });
284
- const overlayOnly = deriveWindowGeometry(
285
- "provider",
286
- "model",
287
- { context: 200_000, output: 10_000 },
288
- { overlay: resolveWindowOverlayFacts("provider", "model", data) },
289
- );
290
159
  const hooked = deriveWindowGeometry(
291
160
  "provider",
292
161
  "model",
293
162
  { context: 200_000, output: 10_000 },
294
- {
295
- overlay: resolveWindowOverlayFacts("provider", "model", data),
296
- providerLimit: { context: 400_000, output: 30_000 },
297
- },
163
+ { providerLimit: { context: 400_000, output: 30_000 } },
298
164
  );
299
- expect(overlayOnly?.derivation.window).toBe(300_000);
165
+ expect(catalog?.derivation.window).toBe(200_000);
300
166
  expect(hooked?.derivation.window).toBe(400_000);
301
167
  expect(hooked?.derivation.reserve).toBe(30_000);
302
168
  });
@@ -360,7 +226,7 @@ describe("window geometry", () => {
360
226
  expect(logs[0]).toContain("clamped");
361
227
  });
362
228
 
363
- test("keeps no-overlay usableSoft byte-identical to legacy resolveLimit", () => {
229
+ test("catalog usableSoft matches the legacy resolver", () => {
364
230
  const corpus = [
365
231
  ["openai", "real", { context: 200_000, output: 32_000 }],
366
232
  ["openai", "zero", { context: 200_000, output: 0 }],