@cortexkit/opencode-magic-context 0.46.0 → 0.47.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 (215) hide show
  1. package/dist/auto-search-worker.js +115 -0
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/live-run-config.d.ts.map +1 -1
  4. package/dist/config/migrate-config-location.d.ts.map +1 -1
  5. package/dist/config/schema/magic-context.d.ts +15 -7
  6. package/dist/config/schema/magic-context.d.ts.map +1 -1
  7. package/dist/{conflict-warning-hook-7fj2b9jw.js → conflict-warning-hook-z44ynfz7.js} +5 -4
  8. package/dist/{context-8dkpszy5.js → context-wq4ffwyb.js} +164 -37
  9. package/dist/{derive-budgets-7nj7r1rv.js → derive-budgets-ke12jnnh.js} +1 -1
  10. package/dist/embedding-worker.js +2 -2
  11. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  12. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  13. package/dist/features/magic-context/overflow-detection.d.ts +2 -0
  14. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  15. package/dist/features/magic-context/project-embedding-registry.d.ts +7 -0
  16. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  17. package/dist/features/magic-context/search.d.ts +2 -0
  18. package/dist/features/magic-context/search.d.ts.map +1 -1
  19. package/dist/features/magic-context/session-project-storage.d.ts +8 -2
  20. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  21. package/dist/features/magic-context/storage-historian-runs.d.ts +2 -5
  22. package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -1
  23. package/dist/features/magic-context/storage-meta-persisted.d.ts +12 -0
  24. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  25. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  26. package/dist/features/magic-context/storage-tags.d.ts +7 -2
  27. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  28. package/dist/features/magic-context/storage.d.ts +1 -0
  29. package/dist/features/magic-context/storage.d.ts.map +1 -1
  30. package/dist/features/magic-context/transform-decision-log.d.ts +3 -1
  31. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  32. package/dist/hooks/magic-context/active-anthropic-turn.d.ts +8 -0
  33. package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -0
  34. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts +2 -0
  36. package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts.map +1 -0
  37. package/dist/hooks/magic-context/auto-search-deadline.d.ts +7 -0
  38. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts +3 -0
  40. package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts.map +1 -0
  41. package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts +2 -0
  42. package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts.map +1 -0
  43. package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts +2 -0
  44. package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts.map +1 -0
  45. package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts +4 -0
  46. package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts.map +1 -0
  47. package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts +3 -0
  48. package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts.map +1 -0
  49. package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
  50. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts +4 -0
  52. package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts.map +1 -0
  53. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +69 -0
  54. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -0
  55. package/dist/hooks/magic-context/auto-search-worker.d.ts +2 -0
  56. package/dist/hooks/magic-context/auto-search-worker.d.ts.map +1 -0
  57. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  58. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -5
  59. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  60. package/dist/hooks/magic-context/compartment-runner.d.ts +2 -1
  61. package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/compartment-trigger.d.ts +3 -1
  63. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/event-handler.d.ts +1 -1
  65. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  66. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  67. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +2 -0
  69. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  71. package/dist/hooks/magic-context/historian-drain-gate.d.ts +11 -0
  72. package/dist/hooks/magic-context/historian-drain-gate.d.ts.map +1 -0
  73. package/dist/hooks/magic-context/hook.d.ts +2 -1
  74. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  75. package/dist/hooks/magic-context/latest-assistant-turn.d.ts +25 -0
  76. package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -0
  77. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +61 -0
  78. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -0
  79. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  80. package/dist/hooks/magic-context/opencode-proven-floor.d.ts +6 -0
  81. package/dist/hooks/magic-context/opencode-proven-floor.d.ts.map +1 -0
  82. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  83. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  84. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  85. package/dist/hooks/magic-context/reasoning-budget-status.d.ts +15 -0
  86. package/dist/hooks/magic-context/reasoning-budget-status.d.ts.map +1 -0
  87. package/dist/hooks/magic-context/reasoning-budget.d.ts +40 -0
  88. package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -0
  89. package/dist/hooks/magic-context/reasoning-removal.d.ts +6 -6
  90. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -1
  91. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  92. package/dist/hooks/magic-context/sentinel.d.ts +4 -0
  93. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  94. package/dist/hooks/magic-context/strip-content.d.ts +7 -3
  95. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  96. package/dist/hooks/magic-context/tag-messages.d.ts +13 -0
  97. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  98. package/dist/hooks/magic-context/tool-drop-target.d.ts +5 -0
  99. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  100. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +3 -28
  101. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  102. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +28 -6
  103. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  104. package/dist/hooks/magic-context/transform.d.ts +3 -1
  105. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  106. package/dist/{index-0d3g3461.js → index-0c82743p.js} +2 -1
  107. package/dist/{index-e2dtv0ra.js → index-5a2r0p9f.js} +3 -3
  108. package/dist/{index-p821bjdb.js → index-6d9e1m08.js} +4726 -11050
  109. package/dist/{index-majxda46.js → index-6wkcswft.js} +1 -1
  110. package/dist/index-92bp57hg.js +2063 -0
  111. package/dist/{index-sfnj6h8h.js → index-9pk9exrb.js} +3 -3
  112. package/dist/{index-7qw742ev.js → index-adwfkpex.js} +5 -24
  113. package/dist/{index-3h0ybwah.js → index-bb36vgr3.js} +80 -12
  114. package/dist/{index-k4404na5.js → index-cwf6s3ay.js} +1072 -2422
  115. package/dist/index-fnn5pjtt.js +6554 -0
  116. package/dist/{index-j7fvnjye.js → index-gg8j07zz.js} +1 -1
  117. package/dist/{index-yasgb8ej.js → index-m5fe6jch.js} +9 -3
  118. package/dist/{v2/server-g0fjrkta.js → index-rrbbspwh.js} +42 -27
  119. package/dist/index-rrrsepyw.js +3464 -0
  120. package/dist/{index-qr6r7akd.js → index-w2t4ah5j.js} +950 -502
  121. package/dist/{v2/server-fg34g6a5.js → index-wx8a6bw3.js} +48 -8
  122. package/dist/{index-r5hmbx3t.js → index-x3kwrmqk.js} +146 -3571
  123. package/dist/index-yr3zj7e7.js +23 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +624 -65
  126. package/dist/{message-time-backfill-68gj6t3e.js → message-time-backfill-r5epkzj3.js} +1 -1
  127. package/dist/migration-worker.js +7 -5
  128. package/dist/plugin/dream-timer.d.ts.map +1 -1
  129. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  130. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  131. package/dist/plugin/host-stall-profiler-report.d.ts +67 -0
  132. package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -0
  133. package/dist/plugin/host-stall-profiler.d.ts +96 -0
  134. package/dist/plugin/host-stall-profiler.d.ts.map +1 -0
  135. package/dist/plugin/messages-transform.d.ts +21 -6
  136. package/dist/plugin/messages-transform.d.ts.map +1 -1
  137. package/dist/{read-session-chunk-egz7r68d.js → read-session-chunk-4jey7hpt.js} +4 -4
  138. package/dist/{recomp-orchestrator-ejq7ex5d.js → recomp-orchestrator-rervg6q4.js} +13 -10
  139. package/dist/{send-session-notification-dyw42dtr.js → send-session-notification-0m68ms3n.js} +4 -3
  140. package/dist/shared/auto-search-lifecycle.d.ts +7 -0
  141. package/dist/shared/auto-search-lifecycle.d.ts.map +1 -0
  142. package/dist/shared/historian-tool-expansions.d.ts +1 -1
  143. package/dist/shared/historian-tool-expansions.d.ts.map +1 -1
  144. package/dist/shared/historian-tool-template.d.ts +2 -2
  145. package/dist/shared/historian-tool-template.d.ts.map +1 -1
  146. package/dist/shared/sqlite.d.ts +16 -1
  147. package/dist/shared/sqlite.d.ts.map +1 -1
  148. package/dist/shared/status-view.d.ts.map +1 -1
  149. package/dist/shared/window-geometry.d.ts +4 -0
  150. package/dist/shared/window-geometry.d.ts.map +1 -1
  151. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  152. package/dist/{transform-postprocess-phase-tz3pat2p.js → transform-postprocess-phase-z5hzpsxv.js} +13 -10
  153. package/dist/v2/auto-search-worker.js +115 -0
  154. package/dist/v2/{context-8vgtb6sz.js → context-14v1hr8b.js} +4918 -5760
  155. package/dist/v2/{derive-budgets-kdgp4s3r.js → derive-budgets-nc9avxz8.js} +2 -2
  156. package/dist/v2/embedding-worker.js +3 -3
  157. package/dist/v2/hidden-child-native.d.ts +7 -0
  158. package/dist/v2/hidden-child-native.d.ts.map +1 -1
  159. package/dist/v2/hidden-child-record.d.ts +8 -0
  160. package/dist/v2/hidden-child-record.d.ts.map +1 -1
  161. package/dist/v2/hidden-completion.d.ts.map +1 -1
  162. package/dist/v2/hooks/context.d.ts.map +1 -1
  163. package/dist/v2/hooks/dream-trigger.d.ts +15 -1
  164. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  165. package/dist/v2/hooks/hidden-child.d.ts +54 -3
  166. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  167. package/dist/v2/hooks/types.d.ts +12 -1
  168. package/dist/v2/hooks/types.d.ts.map +1 -1
  169. package/dist/v2/{message-time-backfill-r6qkem1x.js → message-time-backfill-1f9tzvcs.js} +1 -1
  170. package/dist/v2/migration-worker.js +7 -5
  171. package/dist/v2/{read-session-chunk-8vjp6581.js → read-session-chunk-gyyv7w2r.js} +4 -4
  172. package/dist/v2/{recomp-orchestrator-5xj0yzyk.js → recomp-orchestrator-42vjba7p.js} +17 -14
  173. package/dist/v2/{send-session-notification-qs0j78v6.js → send-session-notification-c0wtscea.js} +5 -4
  174. package/dist/v2/server-3trjk1hx.js +6360 -0
  175. package/dist/v2/{server-xtp687da.js → server-50hvkg3v.js} +9 -3
  176. package/dist/v2/{server-y8maxeft.js → server-cpepxy2q.js} +2 -1
  177. package/dist/v2/server-d0sraw7m.js +3403 -0
  178. package/dist/v2/server-e0c1b7a7.js +2063 -0
  179. package/dist/v2/{server-mcfawjgc.js → server-efhwzx05.js} +5 -24
  180. package/dist/v2/{server-3n4q9xme.js → server-fcdehk1s.js} +1 -1
  181. package/dist/{index-q4yp4b52.js → v2/server-fq7kq32k.js} +42 -27
  182. package/dist/v2/{server-vnh7r35f.js → server-nf82q6pt.js} +2459 -8603
  183. package/dist/v2/{server-frbm99q5.js → server-njt3np1k.js} +99 -3465
  184. package/dist/v2/{server-qp5hx1ad.js → server-nm9n3aqq.js} +107 -12
  185. package/dist/v2/{server-p2en78c8.js → server-rz514f14.js} +7 -2
  186. package/dist/v2/{server-wvjvfhck.js → server-vd4e7174.js} +1 -1
  187. package/dist/{index-fg34g6a5.js → v2/server-wx8a6bw3.js} +48 -8
  188. package/dist/v2/{server-4663ejam.js → server-y10vbq6y.js} +1 -1
  189. package/dist/v2/server-yr3zj7e7.js +23 -0
  190. package/dist/v2/server.js +5 -5
  191. package/dist/v2/{wrapup-orchestrator-r5t1pyj8.js → wrapup-orchestrator-nbz854vc.js} +16 -13
  192. package/dist/wrapup-orchestrator-b2dztrar.js +29 -0
  193. package/package.json +6 -5
  194. package/src/config/index.ts +6 -0
  195. package/src/config/live-run-config.test.ts +37 -1
  196. package/src/config/live-run-config.ts +28 -0
  197. package/src/config/migrate-config-location.ts +10 -3
  198. package/src/config/schema/magic-context.test.ts +4 -3
  199. package/src/config/schema/magic-context.ts +23 -6
  200. package/src/shared/auto-search-lifecycle.ts +27 -0
  201. package/src/shared/historian-tool-defaults.json +6 -6
  202. package/src/shared/historian-tool-expansions.ts +65 -8
  203. package/src/shared/historian-tool-preview-defaults.json +13 -0
  204. package/src/shared/historian-tool-template.ts +48 -14
  205. package/src/shared/sqlite-640-review-r2.test.ts +136 -0
  206. package/src/shared/sqlite-640-review.test.ts +183 -0
  207. package/src/shared/sqlite-acquisition-routing.test.ts +18 -0
  208. package/src/shared/sqlite.ts +84 -14
  209. package/src/shared/status-view.test.ts +6 -1
  210. package/src/shared/status-view.ts +15 -1
  211. package/src/shared/tag-transcript.ts +6 -0
  212. package/src/shared/window-geometry.ts +10 -0
  213. package/dist/wrapup-orchestrator-kw3x3myw.js +0 -26
  214. /package/dist/{index-en1k8h8m.js → index-5prbx026.js} +0 -0
  215. /package/dist/v2/{index-en1k8h8m.js → index-5prbx026.js} +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  clearEmergencyRecovery,
8
8
  dropSlot,
9
9
  executeContextRecomp
10
- } from "./index-p821bjdb.js";
10
+ } from "./index-6d9e1m08.js";
11
11
 
12
12
  // src/hooks/magic-context/recomp-orchestrator.ts
13
13
  function resolveLiveModelKey(liveSessionState, sessionId) {
@@ -2,7 +2,7 @@ import {
2
2
  toolTemplateError,
3
3
  DEFAULT_PROTECTED_TOOLS,
4
4
  mergeProtectedTools
5
- } from "./index-q4yp4b52.js";
5
+ } from "./index-rrbbspwh.js";
6
6
  import {
7
7
  getHarness,
8
8
  getMagicContextStorageDir
@@ -5473,6 +5473,7 @@ var AgentMetadataSchema = AgentOverrideConfigSchema.pick({
5473
5473
  maxTokens: true
5474
5474
  });
5475
5475
  var DreamerConfigSchema = AgentMetadataSchema.extend({
5476
+ disable: boolean2().optional().describe("Disable this agent"),
5476
5477
  runner: _enum(["broca", "host"]).optional().describe(`Which side runs the dreamer completions the Rust module routes (classify-memories) in Rust transform mode: "host" runs them on this process's carrier, "broca" routes them to the Broca module. When unset, historian.runner applies, and when that is unset too the harness decides the same way it does for the historian. User-level config only.`),
5477
5478
  opencode: DreamerOpenCodeHarnessBlockSchema.optional(),
5478
5479
  pi: DreamerPiHarnessBlockSchema.optional(),
@@ -5488,7 +5489,7 @@ var HistorianConfigSchema = AgentMetadataSchema.extend({
5488
5489
  ctx.addIssue({ code: "custom", message: error });
5489
5490
  }),
5490
5491
  literal(false)
5491
- ])).optional().describe('Readable historian tool expansions, keyed by exact host tool name. Templates override built-in defaults; false disables an expansion. Supports ${input.path}, ${output.path}, bare ${output}, array [N], [*].field, .each("${field}"), .join("separator"), .count and final .truncate(N). Missing fields are empty; placeholders default to 300 characters, lists to 10 elements, expansions to 1000 characters. Valid in user and project config; affects historian/recomp and verbose ctx_expand only, never the wire or default ctx_expand transcript.'),
5492
+ ])).optional().describe('Readable historian tool expansions, keyed by exact host tool name. Templates override built-in defaults; false disables an expansion. Supports ${input.path}, ${output.path}, bare ${output}, array [N], [*].field, .each("${field}"), .join("separator"), .count and final .truncate(N). Missing fields are empty. Historian text and lists have no implicit caps; explicit .truncate(N) keeps complete sentences and marks omitted characters, or emits only the marker if no sentence fits. When the ctx_expand history-recovery tool is called in verbose mode, its tool-call previews retain their original built-in templates and limits (300 characters per placeholder, 10 list elements, 1000 characters per expansion). Valid in user and project config; never changes the wire or default ctx_expand transcript.'),
5492
5493
  opencode: OpenCodeHarnessBlockSchema.optional(),
5493
5494
  pi: PiHarnessBlockSchema.optional(),
5494
5495
  omp: OmpHarnessBlockSchema.optional(),
@@ -5640,7 +5641,11 @@ var MagicContextConfigSchema = object({
5640
5641
  }).catchall(number2().min(5000).max(2000000)).optional().describe("Absolute token thresholds per model. When matched, overrides execute_threshold_percentage for that model. Accepts `default` for all models or per-model keys. Values above 90% × context_limit are clamped with a warning log. Min 5_000, max 2_000_000."),
5641
5642
  protected_tokens: number2().int().min(PROTECTED_TOKENS_MIN).max(1e6).optional().describe("Positive integer token floor to protect from automatic reclaim (min: 4_000, max: 1_000_000). When omitted, the derived default is clamp(round(0.05 × usableSoft), min(16_000, round(0.08 × usableSoft)), 64_000)."),
5642
5643
  protected_tags: unknown().optional().describe("Deprecated: number of recent tags to protect. Ignored for behaviour; use protected_tokens instead.").meta({ deprecated: true }),
5643
- clear_reasoning_age: number2().min(10).default(50).describe("Clear reasoning/thinking blocks older than N tags (default: 50)"),
5644
+ clear_reasoning_age: unknown().optional().describe("Deprecated and ignored. Use keep_reasoning_tokens instead.").meta({ deprecated: true }),
5645
+ keep_reasoning_tokens: union([
5646
+ number2().int().min(0).max(1e6),
5647
+ object({ default: number2().int().min(0).max(1e6).optional() }).catchall(number2().int().min(0).max(1e6))
5648
+ ]).optional().describe("Reasoning tokens to keep on rebuilding passes. Number or per-model object; exact, shorter model keys, provider/*, then default. Omitted: fixed 10,000. 0 removes all eligible historical reasoning; newest and exempt steps always stay."),
5644
5649
  history_budget_percentage: number2().min(0.05).max(0.5).default(DEFAULT_HISTORY_BUDGET_PERCENTAGE).describe("Fraction of usable context (context_limit × execute_threshold) reserved for the session history block (default: 0.15)"),
5645
5650
  historian_timeout_ms: number2().min(60000).default(DEFAULT_HISTORIAN_TIMEOUT_MS).describe("Timeout for each historian prompt call in both TypeScript and Rust transform modes, in milliseconds (default: 600000)"),
5646
5651
  commit_cluster_trigger: object({
@@ -5739,6 +5744,7 @@ var LIVE_RELOAD_CONFIG_PATHS = [
5739
5744
  "commit_cluster_trigger.enabled",
5740
5745
  "commit_cluster_trigger.min_clusters",
5741
5746
  "memory.auto_promote",
5747
+ "dreamer.disable",
5742
5748
  "dreamer.maxTokens",
5743
5749
  "dreamer.opencode.model",
5744
5750
  "dreamer.opencode.fallback_models",
@@ -1,3 +1,18 @@
1
+ // src/shared/protected-tools-policy.ts
2
+ var DEFAULT_PROTECTED_TOOLS = {
3
+ todowrite: 1,
4
+ ctx_reduce: 3
5
+ };
6
+ function normalizeProtectedToolName(name) {
7
+ return (name ?? "").toLowerCase().replace(/^mcp_/, "");
8
+ }
9
+ function mergeProtectedTools(...maps) {
10
+ return Object.fromEntries([DEFAULT_PROTECTED_TOOLS, ...maps].flatMap((map) => Object.entries(map ?? {}).map(([name, count]) => [
11
+ normalizeProtectedToolName(name),
12
+ count
13
+ ])));
14
+ }
15
+
1
16
  // src/shared/historian-tool-template.ts
2
17
  class Parser {
3
18
  source;
@@ -77,7 +92,7 @@ class Parser {
77
92
  } else
78
93
  break;
79
94
  }
80
- const expression = { steps, cap: 300 };
95
+ const expression = { steps };
81
96
  if (this.take(".each(")) {
82
97
  if (relative)
83
98
  return this.error();
@@ -144,9 +159,23 @@ function compiled(source) {
144
159
  function oneLine(value) {
145
160
  return value.replace(/[\r\n\u2028\u2029]+/g, " ");
146
161
  }
147
- function truncate(value, cap) {
162
+ function truncate(value, cap, legacyPreview = false) {
148
163
  const chars = Array.from(oneLine(value));
149
- return chars.length > cap ? `${chars.slice(0, cap).join("")}…` : chars.join("");
164
+ if (cap === undefined || chars.length <= cap)
165
+ return chars.join("");
166
+ if (legacyPreview)
167
+ return `${chars.slice(0, cap).join("")}…`;
168
+ let end = 0;
169
+ for (let i = 0;i < Math.min(cap, chars.length); i++) {
170
+ if (!".!?。!?".includes(chars[i]))
171
+ continue;
172
+ let next = i + 1;
173
+ while (next < chars.length && `"'”’)]`.includes(chars[next]))
174
+ next++;
175
+ if (next <= cap && ("。!?".includes(chars[i]) || next === chars.length || /[ \t]/.test(chars[next])))
176
+ end = next;
177
+ }
178
+ return `${end ? `${chars.slice(0, end).join("")} ` : ""}[… ${chars.length - end} more characters]`;
150
179
  }
151
180
  function scalar(value) {
152
181
  if (value === undefined)
@@ -163,10 +192,11 @@ function compactJson(value) {
163
192
  function field(value, key) {
164
193
  return value !== null && typeof value === "object" && !Array.isArray(value) && Object.hasOwn(value, key) ? value[key] : undefined;
165
194
  }
166
- function render(nodes, root) {
195
+ function render(nodes, root, legacyPreview) {
167
196
  return nodes.map((node) => {
168
197
  if (typeof node === "string")
169
198
  return node;
199
+ const cap = node.cap ?? (legacyPreview ? 300 : undefined);
170
200
  let value = root;
171
201
  let list = false;
172
202
  for (const step of node.steps) {
@@ -180,19 +210,19 @@ function render(nodes, root) {
180
210
  }
181
211
  }
182
212
  if (node.count)
183
- return truncate(Array.isArray(value) ? String(value.length) : "", node.cap);
213
+ return truncate(Array.isArray(value) ? String(value.length) : "", cap, legacyPreview);
184
214
  if (node.each || list || node.join !== undefined) {
185
215
  if (!Array.isArray(value))
186
216
  return "";
187
- const elements = value.slice(0, 10).map((item) => truncate(node.each ? render(node.each, item) : scalar(item), 300));
188
- if (value.length > 10)
217
+ const elements = value.slice(0, legacyPreview ? 10 : undefined).map((item) => truncate(node.each ? render(node.each, item, legacyPreview) : scalar(item), legacyPreview ? 300 : undefined, legacyPreview));
218
+ if (legacyPreview && value.length > 10)
189
219
  elements.push(`… +${value.length - 10} more`);
190
- return truncate(elements.join(node.join ?? (node.each ? "; " : ", ")), node.cap);
220
+ return truncate(elements.join(node.join ?? (node.each ? "; " : ", ")), cap, legacyPreview);
191
221
  }
192
- return truncate(scalar(value), node.cap);
222
+ return truncate(scalar(value), cap, legacyPreview);
193
223
  }).join("");
194
224
  }
195
- function renderToolTemplate(source, input, output) {
225
+ function renderToolTemplate(source, input, output, legacyPreview = false) {
196
226
  const nodes = compiled(source);
197
227
  if (!nodes)
198
228
  return null;
@@ -207,23 +237,8 @@ function renderToolTemplate(source, input, output) {
207
237
  }
208
238
  }
209
239
  const root = { input, output: structured };
210
- const bareOutputNodes = nodes.map((node) => typeof node !== "string" && node.steps.length === 1 && ("field" in node.steps[0]) && node.steps[0].field === "output" && !node.each && !node.count && node.join === undefined ? truncate(text ?? "", node.cap) : node);
211
- return truncate(render(bareOutputNodes, root), 1000);
212
- }
213
-
214
- // src/shared/protected-tools-policy.ts
215
- var DEFAULT_PROTECTED_TOOLS = {
216
- todowrite: 1,
217
- ctx_reduce: 3
218
- };
219
- function normalizeProtectedToolName(name) {
220
- return (name ?? "").toLowerCase().replace(/^mcp_/, "");
221
- }
222
- function mergeProtectedTools(...maps) {
223
- return Object.fromEntries([DEFAULT_PROTECTED_TOOLS, ...maps].flatMap((map) => Object.entries(map ?? {}).map(([name, count]) => [
224
- normalizeProtectedToolName(name),
225
- count
226
- ])));
240
+ const bareOutputNodes = nodes.map((node) => typeof node !== "string" && node.steps.length === 1 && ("field" in node.steps[0]) && node.steps[0].field === "output" && !node.each && !node.count && node.join === undefined ? truncate(text ?? "", node.cap ?? (legacyPreview ? 300 : undefined), legacyPreview) : node);
241
+ return truncate(render(bareOutputNodes, root, legacyPreview), legacyPreview ? 1000 : undefined, legacyPreview);
227
242
  }
228
243
 
229
244
  export { toolTemplateError, renderToolTemplate, DEFAULT_PROTECTED_TOOLS, normalizeProtectedToolName, mergeProtectedTools };