@cortexkit/opencode-magic-context 0.37.0 → 0.38.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 (94) hide show
  1. package/README.md +2 -0
  2. package/dist/{derive-budgets-0f8xpyw2.js → derive-budgets-da4yg3tz.js} +1 -1
  3. package/dist/features/magic-context/dreamer/classify-prompt.d.ts +5 -1
  4. package/dist/features/magic-context/dreamer/classify-prompt.d.ts.map +1 -1
  5. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  6. package/dist/features/magic-context/dreamer/manifest-parser.d.ts +8 -0
  7. package/dist/features/magic-context/dreamer/manifest-parser.d.ts.map +1 -1
  8. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts +7 -1
  9. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts.map +1 -1
  10. package/dist/features/magic-context/dreamer/map-memories.d.ts +18 -0
  11. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  12. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -0
  13. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  14. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  15. package/dist/features/magic-context/dreamer/verify-prompt.d.ts +5 -1
  16. package/dist/features/magic-context/dreamer/verify-prompt.d.ts.map +1 -1
  17. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  18. package/dist/features/magic-context/fail-closed-block.d.ts +6 -1
  19. package/dist/features/magic-context/fail-closed-block.d.ts.map +1 -1
  20. package/dist/features/magic-context/reclaim-protection.d.ts +13 -0
  21. package/dist/features/magic-context/reclaim-protection.d.ts.map +1 -0
  22. package/dist/features/magic-context/storage-db.d.ts +6 -1
  23. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  24. package/dist/features/magic-context/storage-meta-persisted.d.ts +7 -6
  25. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  26. package/dist/features/magic-context/storage-tags.d.ts +13 -5
  27. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  28. package/dist/hooks/auto-update-checker/checker.d.ts +8 -1
  29. package/dist/hooks/auto-update-checker/checker.d.ts.map +1 -1
  30. package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
  31. package/dist/hooks/magic-context/channel2-cycle.d.ts +16 -0
  32. package/dist/hooks/magic-context/channel2-cycle.d.ts.map +1 -0
  33. package/dist/hooks/magic-context/channel2-delivery.d.ts +3 -9
  34. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/command-handler.d.ts +2 -0
  36. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts +33 -103
  38. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/execute-status.d.ts +2 -1
  42. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/fold-execution-gate.d.ts +2 -0
  44. package/dist/hooks/magic-context/fold-execution-gate.d.ts.map +1 -0
  45. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/live-session-state.d.ts +3 -0
  48. package/dist/hooks/magic-context/live-session-state.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/rust-mode-transform.d.ts +4 -2
  50. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/strip-content.d.ts +10 -8
  52. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/supersession-reclaim.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +78 -0
  56. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -0
  57. package/dist/hooks/magic-context/tool-reclaim.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +3 -0
  59. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  61. package/dist/{index-q0t189ay.js → index-9zhhvr4w.js} +27 -35
  62. package/dist/{index-0ze9p983.js → index-mmvhrqqb.js} +1428 -191
  63. package/dist/index.js +604 -763
  64. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  65. package/dist/plugin/messages-transform.d.ts.map +1 -1
  66. package/dist/plugin/rpc-handlers.d.ts +2 -0
  67. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  68. package/dist/{recomp-orchestrator-c3ff16k7.js → recomp-orchestrator-jsde4ygw.js} +2 -2
  69. package/dist/shared/models-dev-cache.d.ts +2 -0
  70. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  71. package/dist/shared/rpc-server.d.ts.map +1 -1
  72. package/dist/shared/rpc-types.d.ts +15 -0
  73. package/dist/shared/rpc-types.d.ts.map +1 -1
  74. package/dist/shared/rpc-utils.d.ts +9 -0
  75. package/dist/shared/rpc-utils.d.ts.map +1 -1
  76. package/dist/shared/tail-hygiene-status.d.ts +15 -0
  77. package/dist/shared/tail-hygiene-status.d.ts.map +1 -0
  78. package/dist/shared/window-geometry.d.ts +3 -2
  79. package/dist/shared/window-geometry.d.ts.map +1 -1
  80. package/package.json +3 -1
  81. package/src/config/schema/magic-context.ts +2 -2
  82. package/src/shared/models-dev-cache.test.ts +25 -0
  83. package/src/shared/models-dev-cache.ts +5 -4
  84. package/src/shared/rpc-server.ts +1 -0
  85. package/src/shared/rpc-types.ts +16 -0
  86. package/src/shared/rpc-utils.test.ts +25 -0
  87. package/src/shared/rpc-utils.ts +80 -0
  88. package/src/shared/tail-hygiene-status.ts +57 -0
  89. package/src/shared/window-geometry.test.ts +34 -1
  90. package/src/shared/window-geometry.ts +37 -40
  91. package/src/tui/index.tsx +11 -1
  92. package/src/tui/slots/sidebar-content.tsx +17 -5
  93. package/src/tui-compiled/index.tsx +311 -289
  94. package/src/tui-compiled/slots/sidebar-content.tsx +316 -287
@@ -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;AAO7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,wBAAwB;;;;;;;;;mBAE3C,CAAC;aAA2B,CAAC;aACtD,CAAC;eAA6B,CAAC;;;;;;;;;;;;;;;;;;;;;;;2BAyF+llB,CAAC;;;;eAA6iB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA7E1rmB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;;;;;;;;;qBAqE8tJ,CAAC;iBAA2B,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;;;;;;;;qBAA/sE,CAAC;mBAAyB,CAAC;iBAAuB,CAAC;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAAmh8D,CAAC;;;;;;;;;EAvC7shE;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;;;;;;;;;qBA+B8tJ,CAAC;iBAA2B,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;;;;;;;;qBAA/sE,CAAC;mBAAyB,CAAC;iBAAuB,CAAC;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAAmh8D,CAAC;;;;;;;;;GAD7shE"}
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;AAO7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,wBAAwB;;;;;;;;;mBAE3C,CAAC;aAA2B,CAAC;aACtD,CAAC;eAA6B,CAAC;;;;;;;;;;;;;;;;;;;;;;;2BAyF+llB,CAAC;;;;eAA6iB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA7E1rmB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;;;;;;;;;qBAqE+wJ,CAAC;iBAA2B,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;;;;;;;;qBAArxE,CAAC;mBAAyB,CAAC;iBAAuB,CAAC;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAAyx8D,CAAC;;;;;;;;;EAvC97hE;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,YAAY,EAAE,wBAAwB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;;;;;;;;;qBA+B+wJ,CAAC;iBAA2B,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;;;;;;;;qBAArxE,CAAC;mBAAyB,CAAC;iBAAuB,CAAC;iBAAuB,CAAC;0BAAc,CAAC;uBAAiB,CAAC;;;;;;0BAAyx8D,CAAC;;;;;;;;;GAD97hE"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages-transform.d.ts","sourceRoot":"","sources":["../../src/plugin/messages-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,oBAAoB,EAI5B,MAAM,6CAA6C,CAAC;AAqBrD,KAAK,gBAAgB,GAAG;IACpB,IAAI,EAAE,OAAO,kBAAkB,EAAE,OAAO,CAAC;IACzC,KAAK,EAAE,OAAO,kBAAkB,EAAE,IAAI,EAAE,CAAC;CAC5C,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAEhE,KAAK,0BAA0B,GAAG;IAC9B,sCAAsC,CAAC,EAAE,CACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5B,MAAM,EAAE,uBAAuB,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB,GAAG,IAAI,CAAC;AAMT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACjD,YAAY,EAAE,0BAA0B,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,0BAA0B,CAAC;IACnD,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuLjG"}
1
+ {"version":3,"file":"messages-transform.d.ts","sourceRoot":"","sources":["../../src/plugin/messages-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,oBAAoB,EAI5B,MAAM,6CAA6C,CAAC;AAqBrD,KAAK,gBAAgB,GAAG;IACpB,IAAI,EAAE,OAAO,kBAAkB,EAAE,OAAO,CAAC;IACzC,KAAK,EAAE,OAAO,kBAAkB,EAAE,IAAI,EAAE,CAAC;CAC5C,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAEhE,KAAK,0BAA0B,GAAG;IAC9B,sCAAsC,CAAC,EAAE,CACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5B,MAAM,EAAE,uBAAuB,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB,GAAG,IAAI,CAAC;AAiCT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACjD,YAAY,EAAE,0BAA0B,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,0BAA0B,CAAC;IACnD,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgMjG"}
@@ -4,11 +4,13 @@ import type { LiveSessionState } from "../hooks/magic-context/live-session-state
4
4
  import type { RustModeModuleClient } from "../hooks/magic-context/rust-mode-transform";
5
5
  import type { MagicContextRpcServer } from "../shared/rpc-server";
6
6
  import type { SidebarSnapshot, StatusDetail } from "../shared/rpc-types";
7
+ import { type WireTailHygieneBaseline } from "../shared/tail-hygiene-status";
7
8
  export interface RustSessionStatus {
8
9
  usage?: {
9
10
  current_total_input_tokens?: number;
10
11
  context_limit_tokens?: number;
11
12
  };
13
+ tail_hygiene?: WireTailHygieneBaseline | null;
12
14
  boundary_present?: boolean;
13
15
  coverage_ordinal?: number | null;
14
16
  compartment_count?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-handlers.d.ts","sourceRoot":"","sources":["../../src/plugin/rpc-handlers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAWzE,OAAO,EACH,KAAK,eAAe,IAAI,QAAQ,EAGnC,MAAM,mCAAmC,CAAC;AAmB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAQlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAavF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAe,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUtF,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE;QAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AA2GD,wBAAgB,oBAAoB,CAChC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAK9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,eAAe,CAgWjB;AAED;gFACgF;AAChF,wBAAgB,+BAA+B,CAC3C,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,wBAAgB,iBAAiB,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,YAAY,CAiOd;AA4BD;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,qBAAqB,EAChC,IAAI,EAAE;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C,GACF,IAAI,CA2PN"}
1
+ {"version":3,"file":"rpc-handlers.d.ts","sourceRoot":"","sources":["../../src/plugin/rpc-handlers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAWzE,OAAO,EACH,KAAK,eAAe,IAAI,QAAQ,EAGnC,MAAM,mCAAmC,CAAC;AAmB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAQlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAavF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAe,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAEH,KAAK,uBAAuB,EAC/B,MAAM,+BAA+B,CAAC;AAUvC,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE;QAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AA2GD,wBAAgB,oBAAoB,CAChC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAK9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,eAAe,CAsWjB;AAED;gFACgF;AAChF,wBAAgB,+BAA+B,CAC3C,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,wBAAgB,iBAAiB,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,YAAY,CAAC,EAAE,iBAAiB,EAChC,iBAAiB,UAAO,GACzB,YAAY,CAiOd;AA4BD;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,qBAAqB,EAChC,IAAI,EAAE;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C,GACF,IAAI,CA2PN"}
@@ -9,8 +9,8 @@ import {
9
9
  setRecompNote,
10
10
  setRecompStarting,
11
11
  setRecompTerminal
12
- } from "./index-0ze9p983.js";
13
- import"./index-q0t189ay.js";
12
+ } from "./index-mmvhrqqb.js";
13
+ import"./index-9zhhvr4w.js";
14
14
  import"./index-td9depx5.js";
15
15
  import"./index-4cz5nfxf.js";
16
16
  import"./index-crke4z5j.js";
@@ -50,6 +50,8 @@ export interface ModelLimit {
50
50
  input?: number;
51
51
  output?: number;
52
52
  }
53
+ /** Resolve the user-tier output reservation for one runtime model. */
54
+ export declare function resolveOutputReserve(providerID: string, modelID: string, config?: OutputReserveConfig | undefined): number | undefined;
53
55
  /** Set the user-tier reservation override shared by every resolved-limit consumer. */
54
56
  export declare function setOutputReserveConfig(config: OutputReserveConfig | undefined): void;
55
57
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"models-dev-cache.d.ts","sourceRoot":"","sources":["../../src/shared/models-dev-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models-dev-cache.d.ts","sourceRoot":"","sources":["../../src/shared/models-dev-cache.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-server.ts"],"names":[],"mappings":"AAuBA,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AA8CxF;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,oEAAoE;IACpE,OAAO,CAAC,OAAO,CAAsC;IAMrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAE7C,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKjD,sCAAsC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIjD,6DAA6D;IACvD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAqG9B,6EAA6E;IAC7E,IAAI,IAAI,IAAI;IAuBZ,OAAO,CAAC,uBAAuB;IAgB/B;+CAC2C;YAC7B,WAAW;IAyDzB;wFACoF;IACpF,OAAO,CAAC,eAAe;CA8H1B"}
1
+ {"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-server.ts"],"names":[],"mappings":"AAuBA,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AA8CxF;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,oEAAoE;IACpE,OAAO,CAAC,OAAO,CAAsC;IAMrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAE7C,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKjD,sCAAsC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIjD,6DAA6D;IACvD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAsG9B,6EAA6E;IAC7E,IAAI,IAAI,IAAI;IAuBZ,OAAO,CAAC,uBAAuB;IAgB/B;+CAC2C;YAC7B,WAAW;IAyDzB;wFACoF;IACpF,OAAO,CAAC,eAAe;CA8H1B"}
@@ -4,6 +4,19 @@
4
4
  */
5
5
  import type { DreamTaskBacklogMap, DreamTaskProgress } from "../features/magic-context/dreamer/task-registry";
6
6
  import type { LoggerDiagnostics } from "./logger";
7
+ export interface TailHygieneStatus {
8
+ /** Tokens in active, non-protected tail content that the agent can reclaim. */
9
+ u: number;
10
+ /** Tokens in rendered-tail content eligible for hygiene accounting in the same scan. */
11
+ t: number;
12
+ /** Reclaimable-to-eligible token ratio, clamped to 0–1 and shared by both nudge mechanisms. */
13
+ severity: number;
14
+ /** False until a fresh scan runs after existing tail content changes, preventing stale measurements. */
15
+ evaluable: boolean;
16
+ generationInvalidated: boolean;
17
+ baselineGeneration: number;
18
+ computedAt: number;
19
+ }
7
20
  export interface SidebarSnapshot {
8
21
  sessionId: string;
9
22
  usagePercentage: number;
@@ -73,6 +86,8 @@ export interface SidebarSnapshot {
73
86
  * shows this as "Tool Definitions".
74
87
  */
75
88
  toolDefinitionTokens: number;
89
+ /** Persisted reclaimable (U) and eligible (T) token counts used by both nudge mechanisms. */
90
+ tailHygiene?: TailHygieneStatus;
76
91
  /**
77
92
  * Effective execute-threshold percentage for this session's active model,
78
93
  * after per-model resolution and the tokens→percentage conversion (when
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-types.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rpc-types.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-types.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  import { execFileSync } from "node:child_process";
2
2
  import { readFileSync } from "node:fs";
3
+ export type ProcessKind = "OpenCode server" | "OpenCode instance (TUI/CLI)" | "Pi" | "process";
3
4
  export interface RpcPortFileRecord {
4
5
  port: number;
5
6
  pid: number;
6
7
  started_at: number;
8
+ /** Optional producer-provided kind; older records omit it. */
9
+ kind?: string;
10
+ /** Compatibility with discovery records that used the harness name. */
11
+ harness?: string;
7
12
  /**
8
13
  * Per-process bearer token. The server requires it on all non-health RPC
9
14
  * calls so a random local process or browser-origin script that merely
@@ -35,6 +40,10 @@ export type PidLiveness = "alive" | "dead" | "inconclusive";
35
40
  * `kill(pid, 0)` with EPERM even when the PID does not exist outside their view.
36
41
  */
37
42
  export declare function isPidAlive(pid: number): PidLiveness;
43
+ /** Reuse the platform-gated command probes used by PID identity checks. */
44
+ export declare function readProcessCommand(pid: number): string | null;
45
+ /** Classify a process command without changing the liveness decision. */
46
+ export declare function classifyProcessKind(command: string | null | undefined): ProcessKind;
38
47
  /**
39
48
  * Verify that a live PID still belongs to the process that wrote a port record.
40
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-utils.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,sCAAsC;AACtC,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,GAAG,SAAc,EACjB,UAAU,CAAC,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CASnD;AAkKD;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;AAEnF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,uBAAuB,CAwBzF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC7C,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAClC,uBAAuB,CAAC,EAAE,OAAO,YAAY,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB,GAAG,IAAI,CAQP;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD;AAmBD,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,CAgD3D;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,SAAI,GAAG,iBAAiB,GAAG,IAAI,CA2B3F"}
1
+ {"version":3,"file":"rpc-utils.d.ts","sourceRoot":"","sources":["../../src/shared/rpc-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,6BAA6B,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,sCAAsC;AACtC,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,GAAG,SAAc,EACjB,UAAU,CAAC,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CASnD;AA6JD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7D;AA6CD,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAgBnF;AAOD;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;AAEnF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,uBAAuB,CAwBzF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC7C,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAClC,uBAAuB,CAAC,EAAE,OAAO,YAAY,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB,GAAG,IAAI,CAQP;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD;AAmBD,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,CAgD3D;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,SAAI,GAAG,iBAAiB,GAAG,IAAI,CA6B3F"}
@@ -0,0 +1,15 @@
1
+ import type { Channel1State } from "../hooks/magic-context/ctx-reduce-nudge";
2
+ import type { TailHygieneStatus } from "./rpc-types";
3
+ export interface WireTailHygieneBaseline {
4
+ u?: number;
5
+ t?: number;
6
+ severity?: number;
7
+ evaluable?: boolean;
8
+ generation_invalidated?: boolean;
9
+ baseline_generation?: number;
10
+ computed_at_ms?: number;
11
+ }
12
+ /** Normalize either renderer authority's persisted baseline without dropping valid zeros. */
13
+ export declare function resolveTailHygieneStatus(tsBaseline: Channel1State | undefined, rustBaseline?: WireTailHygieneBaseline | null): TailHygieneStatus | undefined;
14
+ export declare function formatTailHygiene(status: TailHygieneStatus): string;
15
+ //# sourceMappingURL=tail-hygiene-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail-hygiene-status.d.ts","sourceRoot":"","sources":["../../src/shared/tail-hygiene-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACpC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,aAAa,GAAG,SAAS,EACrC,YAAY,CAAC,EAAE,uBAAuB,GAAG,IAAI,GAC9C,iBAAiB,GAAG,SAAS,CA6B/B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAInE"}
@@ -1,4 +1,4 @@
1
- import type { ModelLimit, OutputReserveConfig } from "./models-dev-cache";
1
+ import type { ModelLimit } from "./models-dev-cache";
2
2
  export declare const WINDOW_OVERLAY_SCHEMA = "fusiform-window-overlay/v1";
3
3
  export declare const PROMPT_WALL_MARGIN = 4096;
4
4
  export declare const PI_OUTPUT_FLOOR = 4096;
@@ -61,7 +61,8 @@ export interface DeriveWindowGeometryOptions {
61
61
  overlay?: ResolvedWindowOverlayFacts;
62
62
  /** A provider/auth hook has higher precedence than the overlay, field by field. */
63
63
  providerLimit?: ModelLimit;
64
- reserveConfig?: OutputReserveConfig;
64
+ /** Resolved user override; higher precedence than catalog, overlay, and geometry defaults. */
65
+ outputReserveOverride?: number;
65
66
  harness?: "opencode" | "pi";
66
67
  /** Detected overflow remains the final downward cap regardless of other sources. */
67
68
  contextCap?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"window-geometry.d.ts","sourceRoot":"","sources":["../../src/shared/window-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"window-geometry.d.ts","sourceRoot":"","sources":["../../src/shared/window-geometry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/opencode-magic-context",
3
- "version": "0.37.0",
3
+ "version": "0.38.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",
@@ -63,6 +63,8 @@
63
63
  "zod": "^4.1.8"
64
64
  },
65
65
  "devDependencies": {
66
+ "@ai-sdk/anthropic": "3.0.82",
67
+ "@ai-sdk/openai-compatible": "2.0.41",
66
68
  "@biomejs/biome": "^2.5.1",
67
69
  "@types/better-sqlite3": "^7.6.13",
68
70
  "@types/bun": "^1.3.10",
@@ -721,7 +721,7 @@ export const MagicContextConfigSchema = z
721
721
  ])
722
722
  .optional()
723
723
  .describe(
724
- 'User-only output-token reservation override. Number or per-model object ({ default: 16384, "provider/model": 8192 }); 0 disables reservation. When unset, Magic Context reserves the catalog output limit (capped at 25% of context) for shared-window providers and keeps proven separate-quota Google/Gemini windows unchanged.',
724
+ 'User-only output-token reservation override. Number or per-model object ({ default: 16384, "provider/model": 8192 }); 0 disables reservation. Takes precedence over every derived source: an explicit value here always wins against catalog output limits, provider window-geometry facts, and the 25%-of-context fallback (usable window = context window minus this reserve). When unset, Magic Context reserves the catalog output limit (capped at 25% of context) for shared-window providers and keeps proven separate-quota Google/Gemini windows unchanged.',
725
725
  ),
726
726
  models: z
727
727
  .object({
@@ -946,7 +946,7 @@ export const MagicContextConfigSchema = z
946
946
  .boolean()
947
947
  .default(false)
948
948
  .describe(
949
- "Content-aware reclaim of provably-superseded tool output, layered on the existing execute-pass auto-drop. When on: superseded todowrite (keep newest 1), spent ctx_reduce (keep newest 5), and zero-value meta (bash_status, bash_kill, ctx_note read/dismiss) outputs are dropped; older edits to a file are compressed to a filePath-preserving marker while the newest edit per file stays full. Only acts on passes already busting the cache, so it never originates a cache bust. Honors the protected-tag reserve. Experimental: opt-in, default off until cache stability is proven; when off the wire is byte-identical to the positional-only reclaim. Requires a restart.",
949
+ "Content-aware reclaim of provably-superseded tool output, layered on the existing execute-pass auto-drop. When on: superseded todowrite (keep newest 1), spent ctx_reduce (keep newest 3), and zero-value meta (bash_status, bash_kill, ctx_note read/dismiss) outputs are dropped; older edits to a file are compressed to a filePath-preserving marker while the newest edit per file stays full. Only acts on passes already busting the cache, so it never originates a cache bust. Honors the protected-tag reserve. Experimental: opt-in, default off until cache stability is proven; when off the wire is byte-identical to the positional-only reclaim. Requires a restart.",
950
950
  ),
951
951
  caveman_text_compression: z
952
952
  .object({
@@ -7,6 +7,7 @@ import {
7
7
  getModelsDevCacheState,
8
8
  getSdkContextLimit,
9
9
  getSdkInputLimit,
10
+ getSdkWindowGeometry,
10
11
  refreshModelLimitsAfterAuthOnce,
11
12
  refreshModelLimitsFromApi,
12
13
  resetAuthRewarmLatchForTest,
@@ -148,6 +149,30 @@ describe("models-dev-cache (SDK-only)", () => {
148
149
  clearModelsDevCache();
149
150
  });
150
151
 
152
+ test("honors the reporter's default output_reserve on the SDK geometry path", async () => {
153
+ await refreshModelLimitsFromApi(
154
+ makeClient([
155
+ {
156
+ id: "openai-codex",
157
+ models: {
158
+ "gpt-5.6-sol": {
159
+ limit: { context: 400_000, input: 272_000, output: 128_000 },
160
+ },
161
+ },
162
+ },
163
+ ]),
164
+ );
165
+ setOutputReserveConfig({ default: 16_384 });
166
+
167
+ const geometry = getSdkWindowGeometry("openai-codex", "gpt-5.6-sol");
168
+ expect(geometry?.usableSoft).toBe(272_000 - 16_384);
169
+ expect(geometry?.derivation).toMatchObject({
170
+ window: 272_000,
171
+ reserve: 16_384,
172
+ reserveSource: "output_config",
173
+ });
174
+ });
175
+
151
176
  test("resolves from the SDK and prefers limit.input over limit.context", async () => {
152
177
  // github-copilot / codex shape: input is the max prompt, context the total
153
178
  // window. Pressure math must use the input cap (OpenCode's own overflow.ts
@@ -211,10 +211,11 @@ function modelKeyLookupOrder(providerID: string, modelID: string): string[] {
211
211
  return [...new Set(candidates)];
212
212
  }
213
213
 
214
- function configuredOutputReserve(
215
- config: OutputReserveConfig | undefined,
214
+ /** Resolve the user-tier output reservation for one runtime model. */
215
+ export function resolveOutputReserve(
216
216
  providerID: string,
217
217
  modelID: string,
218
+ config: OutputReserveConfig | undefined = outputReserveConfig,
218
219
  ): number | undefined {
219
220
  if (typeof config === "number")
220
221
  return Number.isFinite(config) && config >= 0 ? config : undefined;
@@ -259,7 +260,7 @@ export function resolveLimit(
259
260
  if (input !== undefined && (context === undefined || input < context)) return input;
260
261
  if (context === undefined) return undefined;
261
262
 
262
- const configuredReserve = configuredOutputReserve(reserveConfig, providerID, modelID);
263
+ const configuredReserve = resolveOutputReserve(providerID, modelID, reserveConfig);
263
264
  let reserve: number;
264
265
  if (configuredReserve !== undefined) {
265
266
  reserve = configuredReserve;
@@ -523,7 +524,7 @@ export function getSdkWindowGeometry(
523
524
  },
524
525
  {
525
526
  overlay: resolveWindowOverlayFacts(providerID, modelID, getWindowOverlay()),
526
- reserveConfig: outputReserveConfig,
527
+ outputReserveOverride: resolveOutputReserve(providerID, modelID),
527
528
  harness: options?.harness ?? "opencode",
528
529
  contextCap:
529
530
  promptOnlyDetected === undefined && isFinitePositive(detectedContextLimit)
@@ -185,6 +185,7 @@ export class MagicContextRpcServer {
185
185
  port: this.port,
186
186
  pid: process.pid,
187
187
  started_at: this.startedAt,
188
+ kind: "OpenCode server",
188
189
  token: this.token,
189
190
  instance_id: this.instanceId,
190
191
  }),
@@ -9,6 +9,20 @@ import type {
9
9
  } from "../features/magic-context/dreamer/task-registry";
10
10
  import type { LoggerDiagnostics } from "./logger";
11
11
 
12
+ export interface TailHygieneStatus {
13
+ /** Tokens in active, non-protected tail content that the agent can reclaim. */
14
+ u: number;
15
+ /** Tokens in rendered-tail content eligible for hygiene accounting in the same scan. */
16
+ t: number;
17
+ /** Reclaimable-to-eligible token ratio, clamped to 0–1 and shared by both nudge mechanisms. */
18
+ severity: number;
19
+ /** False until a fresh scan runs after existing tail content changes, preventing stale measurements. */
20
+ evaluable: boolean;
21
+ generationInvalidated: boolean;
22
+ baselineGeneration: number;
23
+ computedAt: number;
24
+ }
25
+
12
26
  export interface SidebarSnapshot {
13
27
  sessionId: string;
14
28
  usagePercentage: number;
@@ -78,6 +92,8 @@ export interface SidebarSnapshot {
78
92
  * shows this as "Tool Definitions".
79
93
  */
80
94
  toolDefinitionTokens: number;
95
+ /** Persisted reclaimable (U) and eligible (T) token counts used by both nudge mechanisms. */
96
+ tailHygiene?: TailHygieneStatus;
81
97
  /**
82
98
  * Effective execute-threshold percentage for this session's active model,
83
99
  * after per-model resolution and the tokens→percentage conversion (when
@@ -6,6 +6,7 @@ import type { readFileSync } from "node:fs";
6
6
  import {
7
7
  __resetRpcIdentityTestHooks,
8
8
  __setRpcIdentityTestHooks,
9
+ classifyProcessKind,
9
10
  discoverLivePiProcessIds,
10
11
  inspectLivePiProcesses,
11
12
  isPidAlive,
@@ -54,6 +55,30 @@ afterEach(() => {
54
55
  __resetRpcIdentityTestHooks();
55
56
  });
56
57
 
58
+ describe("classifyProcessKind", () => {
59
+ test("classifies OpenCode server, OpenCode instance, Pi, and unknown commands", () => {
60
+ expect(classifyProcessKind("/usr/local/bin/opencode serve --hostname 127.0.0.1")).toBe(
61
+ "OpenCode server",
62
+ );
63
+ expect(classifyProcessKind("node /opt/opencode/bin/opencode --continue")).toBe(
64
+ "OpenCode instance (TUI/CLI)",
65
+ );
66
+ expect(
67
+ classifyProcessKind(
68
+ "bun /workspace/node_modules/@mariozechner/pi-coding-agent/dist/cli.js",
69
+ ),
70
+ ).toBe("Pi");
71
+ expect(classifyProcessKind("/usr/bin/other --flag")).toBe("process");
72
+ expect(classifyProcessKind(null)).toBe("process");
73
+ });
74
+
75
+ test("recognizes serve flags and Windows-style executable paths", () => {
76
+ expect(classifyProcessKind("opencode --serve=true")).toBe("OpenCode server");
77
+ expect(classifyProcessKind("C:\\Tools\\opencode.exe")).toBe("OpenCode instance (TUI/CLI)");
78
+ expect(classifyProcessKind("pi.cmd --model test")).toBe("Pi");
79
+ });
80
+ });
81
+
57
82
  describe("discoverLivePiProcessIds", () => {
58
83
  test("finds Pi-family harness commands while excluding the current process", () => {
59
84
  __setRpcIdentityTestHooks({
@@ -3,10 +3,16 @@ import { createHash } from "node:crypto";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
 
6
+ export type ProcessKind = "OpenCode server" | "OpenCode instance (TUI/CLI)" | "Pi" | "process";
7
+
6
8
  export interface RpcPortFileRecord {
7
9
  port: number;
8
10
  pid: number;
9
11
  started_at: number;
12
+ /** Optional producer-provided kind; older records omit it. */
13
+ kind?: string;
14
+ /** Compatibility with discovery records that used the harness name. */
15
+ harness?: string;
10
16
  /**
11
17
  * Per-process bearer token. The server requires it on all non-health RPC
12
18
  * calls so a random local process or browser-origin script that merely
@@ -224,6 +230,78 @@ function readPsProcessCommand(pid: number): string | null {
224
230
  }
225
231
  }
226
232
 
233
+ /** Reuse the platform-gated command probes used by PID identity checks. */
234
+ export function readProcessCommand(pid: number): string | null {
235
+ if (!Number.isInteger(pid) || pid <= 0) return null;
236
+ return rpcIdentityPlatform === "linux"
237
+ ? readLinuxProcessCommand(pid)
238
+ : rpcIdentityPlatform === "win32"
239
+ ? (readWindowsProcess(pid).command ?? null)
240
+ : readPsProcessCommand(pid);
241
+ }
242
+
243
+ function executableName(token: string | undefined): string {
244
+ return (
245
+ (token ?? "")
246
+ .replace(/^['"]|['"]$/g, "")
247
+ .split("/")
248
+ .at(-1) ?? ""
249
+ );
250
+ }
251
+
252
+ function commandTokens(command: string): string[] {
253
+ return command
254
+ .toLowerCase()
255
+ .replaceAll("\\", "/")
256
+ .replaceAll("\u0000", " ")
257
+ .split(/\s+/)
258
+ .map((token) => token.replace(/^['"]|['"]$/g, ""))
259
+ .filter(Boolean);
260
+ }
261
+
262
+ function commandHasOpenCodeExecutable(tokens: readonly string[]): number {
263
+ return tokens.findIndex((token) => {
264
+ const executable = executableName(token).replace(/\.(?:exe|cmd)$/, "");
265
+ return executable === "opencode" || executable.endsWith("/opencode");
266
+ });
267
+ }
268
+
269
+ function commandHasPiExecutable(tokens: readonly string[]): boolean {
270
+ for (let index = 0; index < tokens.length; index += 1) {
271
+ const executable = executableName(tokens[index]).replace(/\.(?:exe|cmd)$/, "");
272
+ if (["pi", "omp", "oh-my-pi"].includes(executable)) return true;
273
+ if (["node", "bun", "deno"].includes(executable)) {
274
+ const script = executableName(tokens[index + 1]).replace(/\.(?:exe|cmd)$/, "");
275
+ if (
276
+ ["pi", "pi.js", "pi.mjs", "pi.cjs"].includes(script) ||
277
+ tokens[index + 1]?.includes("pi-coding-agent")
278
+ ) {
279
+ return true;
280
+ }
281
+ }
282
+ }
283
+ return false;
284
+ }
285
+
286
+ /** Classify a process command without changing the liveness decision. */
287
+ export function classifyProcessKind(command: string | null | undefined): ProcessKind {
288
+ if (!command) return "process";
289
+ const tokens = commandTokens(command);
290
+ const openCodeIndex = commandHasOpenCodeExecutable(tokens);
291
+ if (openCodeIndex >= 0) {
292
+ const args = tokens.slice(openCodeIndex + 1);
293
+ if (
294
+ args.some(
295
+ (token) => token === "serve" || token === "--serve" || token.startsWith("--serve="),
296
+ )
297
+ ) {
298
+ return "OpenCode server";
299
+ }
300
+ return "OpenCode instance (TUI/CLI)";
301
+ }
302
+ return commandHasPiExecutable(tokens) ? "Pi" : "process";
303
+ }
304
+
227
305
  function commandLooksLikeOpenCode(command: string): boolean {
228
306
  const normalized = command.toLowerCase();
229
307
  return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
@@ -394,6 +472,8 @@ export function parseRpcPortFile(content: string, fallbackPid = 0): RpcPortFileR
394
472
  port,
395
473
  pid,
396
474
  started_at: Number.isFinite(startedAt) ? startedAt : 0,
475
+ kind: typeof parsed.kind === "string" ? parsed.kind : undefined,
476
+ harness: typeof parsed.harness === "string" ? parsed.harness : undefined,
397
477
  token: typeof parsed.token === "string" ? parsed.token : undefined,
398
478
  instance_id:
399
479
  typeof parsed.instance_id === "string" ? parsed.instance_id : undefined,
@@ -0,0 +1,57 @@
1
+ import type { Channel1State } from "../hooks/magic-context/ctx-reduce-nudge";
2
+ import type { TailHygieneStatus } from "./rpc-types";
3
+
4
+ export interface WireTailHygieneBaseline {
5
+ u?: number;
6
+ t?: number;
7
+ severity?: number;
8
+ evaluable?: boolean;
9
+ generation_invalidated?: boolean;
10
+ baseline_generation?: number;
11
+ computed_at_ms?: number;
12
+ }
13
+
14
+ function finiteNumber(value: unknown, fallback = 0): number {
15
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
16
+ }
17
+
18
+ /** Normalize either renderer authority's persisted baseline without dropping valid zeros. */
19
+ export function resolveTailHygieneStatus(
20
+ tsBaseline: Channel1State | undefined,
21
+ rustBaseline?: WireTailHygieneBaseline | null,
22
+ ): TailHygieneStatus | undefined {
23
+ if (rustBaseline !== undefined && rustBaseline !== null) {
24
+ const t = Math.max(0, finiteNumber(rustBaseline.t));
25
+ const u = Math.min(t, Math.max(0, finiteNumber(rustBaseline.u)));
26
+ return {
27
+ u,
28
+ t,
29
+ severity: Math.min(
30
+ 1,
31
+ Math.max(0, finiteNumber(rustBaseline.severity, u / Math.max(t, 1))),
32
+ ),
33
+ evaluable: rustBaseline.evaluable === true,
34
+ generationInvalidated: rustBaseline.generation_invalidated === true,
35
+ baselineGeneration: Math.max(0, finiteNumber(rustBaseline.baseline_generation)),
36
+ computedAt: Math.max(0, finiteNumber(rustBaseline.computed_at_ms)),
37
+ };
38
+ }
39
+ if (tsBaseline === undefined) return undefined;
40
+ const t = Math.max(0, tsBaseline.baselineT + tsBaseline.turnDeltaT);
41
+ const u = Math.min(t, Math.max(0, tsBaseline.baselineU + tsBaseline.turnDeltaU));
42
+ return {
43
+ u,
44
+ t,
45
+ severity: Math.min(1, Math.max(0, u / Math.max(t, 1))),
46
+ evaluable: tsBaseline.evaluable && !tsBaseline.generationInvalidated,
47
+ generationInvalidated: tsBaseline.generationInvalidated,
48
+ baselineGeneration: Math.max(0, tsBaseline.baselineGeneration),
49
+ computedAt: Math.max(0, tsBaseline.computedAt),
50
+ };
51
+ }
52
+
53
+ export function formatTailHygiene(status: TailHygieneStatus): string {
54
+ const percentage = (status.severity * 100).toFixed(1);
55
+ const state = status.evaluable ? "" : " · held until baseline refresh";
56
+ return `${percentage}% · ${status.u.toLocaleString()} / ${status.t.toLocaleString()} tok${state}`;
57
+ }