@caupulican/pi-adaptative 0.85.3 → 0.85.8

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 (411) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/bun/cli.d.ts +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +1 -0
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/core/agent-session-runtime.d.ts +1 -1
  7. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  8. package/dist/core/agent-session-runtime.js +1 -1
  9. package/dist/core/agent-session-runtime.js.map +1 -1
  10. package/dist/core/agent-session-services.d.ts.map +1 -1
  11. package/dist/core/agent-session-services.js +2 -0
  12. package/dist/core/agent-session-services.js.map +1 -1
  13. package/dist/core/agent-session.d.ts +12 -8
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +82 -88
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/auth-guidance.d.ts.map +1 -1
  18. package/dist/core/auth-guidance.js +3 -0
  19. package/dist/core/auth-guidance.js.map +1 -1
  20. package/dist/core/auth-storage.d.ts +2 -2
  21. package/dist/core/auth-storage.d.ts.map +1 -1
  22. package/dist/core/auth-storage.js +2 -2
  23. package/dist/core/auth-storage.js.map +1 -1
  24. package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
  25. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  26. package/dist/core/autonomy/lane-tool-surface.js +4 -3
  27. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  28. package/dist/core/background-lane-controller.d.ts +4 -0
  29. package/dist/core/background-lane-controller.d.ts.map +1 -1
  30. package/dist/core/background-lane-controller.js +2 -0
  31. package/dist/core/background-lane-controller.js.map +1 -1
  32. package/dist/core/background-tool-task-controller.d.ts +12 -7
  33. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  34. package/dist/core/background-tool-task-controller.js +55 -19
  35. package/dist/core/background-tool-task-controller.js.map +1 -1
  36. package/dist/core/bash-executor.js +2 -2
  37. package/dist/core/bash-executor.js.map +1 -1
  38. package/dist/core/bedrock-scope.d.ts +26 -0
  39. package/dist/core/bedrock-scope.d.ts.map +1 -0
  40. package/dist/core/bedrock-scope.js +178 -0
  41. package/dist/core/bedrock-scope.js.map +1 -0
  42. package/dist/core/billing-failover-controller.d.ts +2 -2
  43. package/dist/core/billing-failover-controller.d.ts.map +1 -1
  44. package/dist/core/billing-failover-controller.js +1 -1
  45. package/dist/core/billing-failover-controller.js.map +1 -1
  46. package/dist/core/compaction-controller.d.ts +8 -2
  47. package/dist/core/compaction-controller.d.ts.map +1 -1
  48. package/dist/core/compaction-controller.js +73 -3
  49. package/dist/core/compaction-controller.js.map +1 -1
  50. package/dist/core/compaction-support.d.ts +2 -2
  51. package/dist/core/compaction-support.d.ts.map +1 -1
  52. package/dist/core/compaction-support.js +9 -1
  53. package/dist/core/compaction-support.js.map +1 -1
  54. package/dist/core/context/artifact-retrieval.d.ts +1 -1
  55. package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
  56. package/dist/core/context/artifact-retrieval.js +1 -1
  57. package/dist/core/context/artifact-retrieval.js.map +1 -1
  58. package/dist/core/context/context-artifacts.d.ts +6 -6
  59. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  60. package/dist/core/context/context-artifacts.js +151 -63
  61. package/dist/core/context/context-artifacts.js.map +1 -1
  62. package/dist/core/context/context-composition.js +1 -1
  63. package/dist/core/context/context-composition.js.map +1 -1
  64. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  65. package/dist/core/context/context-store-retention.js +5 -2
  66. package/dist/core/context/context-store-retention.js.map +1 -1
  67. package/dist/core/context/file-store-memory-provider.js +1 -1
  68. package/dist/core/context/file-store-memory-provider.js.map +1 -1
  69. package/dist/core/context/tool-output-packer.d.ts +1 -1
  70. package/dist/core/context/tool-output-packer.d.ts.map +1 -1
  71. package/dist/core/context/tool-output-packer.js +1 -1
  72. package/dist/core/context/tool-output-packer.js.map +1 -1
  73. package/dist/core/context-gc.d.ts.map +1 -1
  74. package/dist/core/context-gc.js +7 -5
  75. package/dist/core/context-gc.js.map +1 -1
  76. package/dist/core/context-pipeline.d.ts +2 -2
  77. package/dist/core/context-pipeline.d.ts.map +1 -1
  78. package/dist/core/context-pipeline.js +8 -4
  79. package/dist/core/context-pipeline.js.map +1 -1
  80. package/dist/core/cost/cost-summary.d.ts +1 -1
  81. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  82. package/dist/core/cost/cost-summary.js +1 -1
  83. package/dist/core/cost/cost-summary.js.map +1 -1
  84. package/dist/core/cost/daily-usage.d.ts +1 -1
  85. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  86. package/dist/core/cost/daily-usage.js +2 -2
  87. package/dist/core/cost/daily-usage.js.map +1 -1
  88. package/dist/core/cost/session-usage.d.ts +1 -1
  89. package/dist/core/cost/session-usage.d.ts.map +1 -1
  90. package/dist/core/cost/session-usage.js +1 -1
  91. package/dist/core/cost/session-usage.js.map +1 -1
  92. package/dist/core/delegation/worker-actions.js +1 -1
  93. package/dist/core/delegation/worker-actions.js.map +1 -1
  94. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  95. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  96. package/dist/core/delegation/worker-attempt-executor.js +3 -2
  97. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  98. package/dist/core/delegation/worker-conversation-store.d.ts +2 -1
  99. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
  100. package/dist/core/delegation/worker-conversation-store.js +3 -2
  101. package/dist/core/delegation/worker-conversation-store.js.map +1 -1
  102. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  103. package/dist/core/delegation/worker-delegation-controller.js +6 -0
  104. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  105. package/dist/core/extensions/builtin.d.ts +2 -2
  106. package/dist/core/extensions/builtin.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin.js +2 -2
  108. package/dist/core/extensions/builtin.js.map +1 -1
  109. package/dist/core/extensions/bundled-virtual-modules.d.ts +2 -0
  110. package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
  111. package/dist/core/extensions/bundled-virtual-modules.js +129 -0
  112. package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
  113. package/dist/core/extensions/factory-runtime.d.ts +22 -0
  114. package/dist/core/extensions/factory-runtime.d.ts.map +1 -0
  115. package/dist/core/extensions/factory-runtime.js +334 -0
  116. package/dist/core/extensions/factory-runtime.js.map +1 -0
  117. package/dist/core/extensions/index.d.ts +1 -1
  118. package/dist/core/extensions/index.d.ts.map +1 -1
  119. package/dist/core/extensions/index.js +1 -1
  120. package/dist/core/extensions/index.js.map +1 -1
  121. package/dist/core/extensions/lifecycle.d.ts +13 -0
  122. package/dist/core/extensions/lifecycle.d.ts.map +1 -0
  123. package/dist/core/extensions/lifecycle.js +52 -0
  124. package/dist/core/extensions/lifecycle.js.map +1 -0
  125. package/dist/core/extensions/loader.d.ts +3 -24
  126. package/dist/core/extensions/loader.d.ts.map +1 -1
  127. package/dist/core/extensions/loader.js +21 -528
  128. package/dist/core/extensions/loader.js.map +1 -1
  129. package/dist/core/extensions/virtual-modules.d.ts +51 -0
  130. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  131. package/dist/core/extensions/virtual-modules.js +59 -0
  132. package/dist/core/extensions/virtual-modules.js.map +1 -0
  133. package/dist/core/foreground-recovery-controller.d.ts +26 -2
  134. package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
  135. package/dist/core/foreground-recovery-controller.js +112 -3
  136. package/dist/core/foreground-recovery-controller.js.map +1 -1
  137. package/dist/core/foreground-terminal-handoff-controller.d.ts +27 -0
  138. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -0
  139. package/dist/core/foreground-terminal-handoff-controller.js +56 -0
  140. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -0
  141. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  142. package/dist/core/goal-loop-controller.js +5 -0
  143. package/dist/core/goal-loop-controller.js.map +1 -1
  144. package/dist/core/goals/compact-goal-context.d.ts +1 -1
  145. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  146. package/dist/core/goals/compact-goal-context.js +1 -1
  147. package/dist/core/goals/compact-goal-context.js.map +1 -1
  148. package/dist/core/goals/goal-auto-continue-controller.d.ts +3 -0
  149. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
  150. package/dist/core/goals/goal-auto-continue-controller.js +28 -7
  151. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
  152. package/dist/core/goals/goal-session-controller.d.ts +1 -1
  153. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  154. package/dist/core/goals/goal-session-controller.js +1 -1
  155. package/dist/core/goals/goal-session-controller.js.map +1 -1
  156. package/dist/core/http-dispatcher.d.ts +1 -1
  157. package/dist/core/http-dispatcher.d.ts.map +1 -1
  158. package/dist/core/http-dispatcher.js +1 -1
  159. package/dist/core/http-dispatcher.js.map +1 -1
  160. package/dist/core/human-input-controller.d.ts +9 -0
  161. package/dist/core/human-input-controller.d.ts.map +1 -1
  162. package/dist/core/human-input-controller.js +60 -5
  163. package/dist/core/human-input-controller.js.map +1 -1
  164. package/dist/core/human-input.d.ts +12 -0
  165. package/dist/core/human-input.d.ts.map +1 -1
  166. package/dist/core/human-input.js +59 -12
  167. package/dist/core/human-input.js.map +1 -1
  168. package/dist/core/index.d.ts +3 -2
  169. package/dist/core/index.d.ts.map +1 -1
  170. package/dist/core/index.js +2 -1
  171. package/dist/core/index.js.map +1 -1
  172. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  173. package/dist/core/local-runtime-controller.js +15 -9
  174. package/dist/core/local-runtime-controller.js.map +1 -1
  175. package/dist/core/memory/providers/file-store.d.ts +1 -0
  176. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  177. package/dist/core/memory/providers/file-store.js +253 -126
  178. package/dist/core/memory/providers/file-store.js.map +1 -1
  179. package/dist/core/memory/providers/user-memory-archive.js +1 -1
  180. package/dist/core/memory/providers/user-memory-archive.js.map +1 -1
  181. package/dist/core/model-capability.d.ts +15 -1
  182. package/dist/core/model-capability.d.ts.map +1 -1
  183. package/dist/core/model-capability.js +24 -1
  184. package/dist/core/model-capability.js.map +1 -1
  185. package/dist/core/model-registry.d.ts +7 -1
  186. package/dist/core/model-registry.d.ts.map +1 -1
  187. package/dist/core/model-registry.js +22 -1
  188. package/dist/core/model-registry.js.map +1 -1
  189. package/dist/core/model-resolver.d.ts +1 -1
  190. package/dist/core/model-resolver.d.ts.map +1 -1
  191. package/dist/core/model-resolver.js +1 -1
  192. package/dist/core/model-resolver.js.map +1 -1
  193. package/dist/core/model-router-controller.d.ts +6 -6
  194. package/dist/core/model-router-controller.d.ts.map +1 -1
  195. package/dist/core/model-router-controller.js +6 -6
  196. package/dist/core/model-router-controller.js.map +1 -1
  197. package/dist/core/model-selection-controller.js +1 -1
  198. package/dist/core/model-selection-controller.js.map +1 -1
  199. package/dist/core/model-tool-protocol.d.ts +1 -1
  200. package/dist/core/model-tool-protocol.d.ts.map +1 -1
  201. package/dist/core/model-tool-protocol.js +1 -1
  202. package/dist/core/model-tool-protocol.js.map +1 -1
  203. package/dist/core/models/context-sizing.d.ts +1 -0
  204. package/dist/core/models/context-sizing.d.ts.map +1 -1
  205. package/dist/core/models/context-sizing.js +4 -1
  206. package/dist/core/models/context-sizing.js.map +1 -1
  207. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  208. package/dist/core/models/default-model-suggestions.js +20 -10
  209. package/dist/core/models/default-model-suggestions.js.map +1 -1
  210. package/dist/core/models/llamacpp-runtime.d.ts +39 -11
  211. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
  212. package/dist/core/models/llamacpp-runtime.js +87 -31
  213. package/dist/core/models/llamacpp-runtime.js.map +1 -1
  214. package/dist/core/models/local-execution-planner.d.ts +24 -0
  215. package/dist/core/models/local-execution-planner.d.ts.map +1 -0
  216. package/dist/core/models/local-execution-planner.js +119 -0
  217. package/dist/core/models/local-execution-planner.js.map +1 -0
  218. package/dist/core/models/local-inference-profile.d.ts +34 -0
  219. package/dist/core/models/local-inference-profile.d.ts.map +1 -0
  220. package/dist/core/models/local-inference-profile.js +74 -0
  221. package/dist/core/models/local-inference-profile.js.map +1 -0
  222. package/dist/core/models/local-runtime.d.ts +23 -4
  223. package/dist/core/models/local-runtime.d.ts.map +1 -1
  224. package/dist/core/models/local-runtime.js +12 -9
  225. package/dist/core/models/local-runtime.js.map +1 -1
  226. package/dist/core/models/managed-ollama-model.d.ts +26 -0
  227. package/dist/core/models/managed-ollama-model.d.ts.map +1 -0
  228. package/dist/core/models/managed-ollama-model.js +59 -0
  229. package/dist/core/models/managed-ollama-model.js.map +1 -0
  230. package/dist/core/models/model-ref.js +11 -11
  231. package/dist/core/models/model-ref.js.map +1 -1
  232. package/dist/core/models/prism-llamacpp-lifecycle.d.ts +10 -20
  233. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
  234. package/dist/core/models/prism-llamacpp-lifecycle.js +11 -31
  235. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
  236. package/dist/core/models/prism-llamacpp-server-probe.d.ts +10 -0
  237. package/dist/core/models/prism-llamacpp-server-probe.d.ts.map +1 -0
  238. package/dist/core/models/prism-llamacpp-server-probe.js +36 -0
  239. package/dist/core/models/prism-llamacpp-server-probe.js.map +1 -0
  240. package/dist/core/models/runtime-arbiter.d.ts +3 -0
  241. package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
  242. package/dist/core/models/runtime-arbiter.js +2 -1
  243. package/dist/core/models/runtime-arbiter.js.map +1 -1
  244. package/dist/core/orchestration/model-binding.d.ts +1 -1
  245. package/dist/core/orchestration/model-binding.d.ts.map +1 -1
  246. package/dist/core/orchestration/model-binding.js +1 -1
  247. package/dist/core/orchestration/model-binding.js.map +1 -1
  248. package/dist/core/orchestration/task-profile-writer.js +1 -1
  249. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  250. package/dist/core/process-matrix/runtime.d.ts +15 -1
  251. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  252. package/dist/core/process-matrix/runtime.js +55 -34
  253. package/dist/core/process-matrix/runtime.js.map +1 -1
  254. package/dist/core/reflection-controller.d.ts +4 -3
  255. package/dist/core/reflection-controller.d.ts.map +1 -1
  256. package/dist/core/reflection-controller.js +2 -2
  257. package/dist/core/reflection-controller.js.map +1 -1
  258. package/dist/core/research/model-fitness-controller.js +1 -1
  259. package/dist/core/research/model-fitness-controller.js.map +1 -1
  260. package/dist/core/research/research-lane-controller.d.ts +2 -2
  261. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  262. package/dist/core/research/research-lane-controller.js +15 -6
  263. package/dist/core/research/research-lane-controller.js.map +1 -1
  264. package/dist/core/resource-loader.d.ts +10 -19
  265. package/dist/core/resource-loader.d.ts.map +1 -1
  266. package/dist/core/resource-loader.js +8 -70
  267. package/dist/core/resource-loader.js.map +1 -1
  268. package/dist/core/runtime-builder.d.ts +5 -1
  269. package/dist/core/runtime-builder.d.ts.map +1 -1
  270. package/dist/core/runtime-builder.js +50 -7
  271. package/dist/core/runtime-builder.js.map +1 -1
  272. package/dist/core/scout-controller.d.ts +4 -3
  273. package/dist/core/scout-controller.d.ts.map +1 -1
  274. package/dist/core/scout-controller.js +2 -1
  275. package/dist/core/scout-controller.js.map +1 -1
  276. package/dist/core/sdk.d.ts +2 -2
  277. package/dist/core/sdk.d.ts.map +1 -1
  278. package/dist/core/sdk.js +13 -11
  279. package/dist/core/sdk.js.map +1 -1
  280. package/dist/core/security/context-threat-scanner.d.ts +14 -0
  281. package/dist/core/security/context-threat-scanner.d.ts.map +1 -0
  282. package/dist/core/security/context-threat-scanner.js +71 -0
  283. package/dist/core/security/context-threat-scanner.js.map +1 -0
  284. package/dist/core/session-supervision-runtime.d.ts +4 -1
  285. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  286. package/dist/core/session-supervision-runtime.js +49 -11
  287. package/dist/core/session-supervision-runtime.js.map +1 -1
  288. package/dist/core/settings-manager.d.ts +13 -0
  289. package/dist/core/settings-manager.d.ts.map +1 -1
  290. package/dist/core/settings-manager.js +60 -1
  291. package/dist/core/settings-manager.js.map +1 -1
  292. package/dist/core/system-prompt-builder.d.ts +5 -2
  293. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  294. package/dist/core/system-prompt-builder.js +22 -10
  295. package/dist/core/system-prompt-builder.js.map +1 -1
  296. package/dist/core/system-prompt.d.ts +3 -0
  297. package/dist/core/system-prompt.d.ts.map +1 -1
  298. package/dist/core/system-prompt.js +181 -55
  299. package/dist/core/system-prompt.js.map +1 -1
  300. package/dist/core/tool-protocol-controller.d.ts.map +1 -1
  301. package/dist/core/tool-protocol-controller.js +5 -3
  302. package/dist/core/tool-protocol-controller.js.map +1 -1
  303. package/dist/core/tool-recovery-logger.js +1 -1
  304. package/dist/core/tool-recovery-logger.js.map +1 -1
  305. package/dist/core/tools/artifact-retrieve.js +1 -1
  306. package/dist/core/tools/artifact-retrieve.js.map +1 -1
  307. package/dist/core/tools/bash.d.ts +2 -2
  308. package/dist/core/tools/bash.d.ts.map +1 -1
  309. package/dist/core/tools/bash.js +16 -4
  310. package/dist/core/tools/bash.js.map +1 -1
  311. package/dist/core/tools/edit-diff.d.ts +2 -0
  312. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  313. package/dist/core/tools/edit-diff.js +9 -1
  314. package/dist/core/tools/edit-diff.js.map +1 -1
  315. package/dist/core/tools/edit.d.ts +5 -8
  316. package/dist/core/tools/edit.d.ts.map +1 -1
  317. package/dist/core/tools/edit.js +88 -55
  318. package/dist/core/tools/edit.js.map +1 -1
  319. package/dist/core/tools/extensionify-runtime.d.ts +44 -0
  320. package/dist/core/tools/extensionify-runtime.d.ts.map +1 -0
  321. package/dist/core/tools/extensionify-runtime.js +115 -0
  322. package/dist/core/tools/extensionify-runtime.js.map +1 -0
  323. package/dist/core/tools/extensionify.d.ts +9 -30
  324. package/dist/core/tools/extensionify.d.ts.map +1 -1
  325. package/dist/core/tools/extensionify.js +10 -140
  326. package/dist/core/tools/extensionify.js.map +1 -1
  327. package/dist/core/tools/file-mutation-intent.d.ts +42 -15
  328. package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
  329. package/dist/core/tools/file-mutation-intent.js +271 -77
  330. package/dist/core/tools/file-mutation-intent.js.map +1 -1
  331. package/dist/core/tools/find.d.ts +1 -1
  332. package/dist/core/tools/find.d.ts.map +1 -1
  333. package/dist/core/tools/find.js +1 -1
  334. package/dist/core/tools/find.js.map +1 -1
  335. package/dist/core/tools/index.d.ts +3 -5
  336. package/dist/core/tools/index.d.ts.map +1 -1
  337. package/dist/core/tools/index.js +8 -44
  338. package/dist/core/tools/index.js.map +1 -1
  339. package/dist/core/tools/ls.d.ts +1 -1
  340. package/dist/core/tools/ls.d.ts.map +1 -1
  341. package/dist/core/tools/ls.js +1 -1
  342. package/dist/core/tools/ls.js.map +1 -1
  343. package/dist/core/tools/output-accumulator.d.ts +1 -1
  344. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  345. package/dist/core/tools/output-accumulator.js +1 -1
  346. package/dist/core/tools/output-accumulator.js.map +1 -1
  347. package/dist/core/tools/render-utils.js +1 -1
  348. package/dist/core/tools/render-utils.js.map +1 -1
  349. package/dist/core/tools/search-command-guard.d.ts +8 -0
  350. package/dist/core/tools/search-command-guard.d.ts.map +1 -1
  351. package/dist/core/tools/search-command-guard.js +54 -0
  352. package/dist/core/tools/search-command-guard.js.map +1 -1
  353. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  354. package/dist/core/tools/shell-contract-router.js +9 -4
  355. package/dist/core/tools/shell-contract-router.js.map +1 -1
  356. package/dist/core/tools/shell-session.d.ts.map +1 -1
  357. package/dist/core/tools/shell-session.js +6 -4
  358. package/dist/core/tools/shell-session.js.map +1 -1
  359. package/dist/core/tools/tool-definition-factory.d.ts +32 -0
  360. package/dist/core/tools/tool-definition-factory.d.ts.map +1 -0
  361. package/dist/core/tools/tool-definition-factory.js +55 -0
  362. package/dist/core/tools/tool-definition-factory.js.map +1 -0
  363. package/dist/core/tools/write.d.ts +5 -10
  364. package/dist/core/tools/write.d.ts.map +1 -1
  365. package/dist/core/tools/write.js +92 -73
  366. package/dist/core/tools/write.js.map +1 -1
  367. package/dist/core/util/atomic-file.d.ts.map +1 -1
  368. package/dist/core/util/atomic-file.js +79 -32
  369. package/dist/core/util/atomic-file.js.map +1 -1
  370. package/dist/index.d.ts +3 -2
  371. package/dist/index.d.ts.map +1 -1
  372. package/dist/index.js +3 -2
  373. package/dist/index.js.map +1 -1
  374. package/dist/main.d.ts +2 -0
  375. package/dist/main.d.ts.map +1 -1
  376. package/dist/main.js +24 -18
  377. package/dist/main.js.map +1 -1
  378. package/dist/modes/interactive/auth-dialogs-controller.d.ts +6 -0
  379. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  380. package/dist/modes/interactive/auth-dialogs-controller.js +59 -12
  381. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  382. package/dist/modes/interactive/auto-learn-controller.js +1 -1
  383. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  384. package/dist/modes/interactive/components/tool-execution.js +1 -1
  385. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  386. package/dist/modes/interactive/interactive-event-controller.js +1 -1
  387. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  388. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  389. package/dist/modes/interactive/interactive-mode.js +1 -1
  390. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  391. package/dist/modes/interactive/local-model-commands.d.ts +1 -1
  392. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  393. package/dist/modes/interactive/local-model-commands.js +51 -8
  394. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  395. package/dist/utils/child-process.js +1 -1
  396. package/dist/utils/child-process.js.map +1 -1
  397. package/docs/providers.md +34 -10
  398. package/docs/tool-boundary-performance-roadmap-2026-08-02.md +21 -18
  399. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  400. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  401. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  402. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  403. package/examples/extensions/minimal-mode.ts +1 -1
  404. package/examples/extensions/prompt-customizer.ts +2 -2
  405. package/examples/extensions/sandbox/package-lock.json +2 -2
  406. package/examples/extensions/sandbox/package.json +1 -1
  407. package/examples/extensions/ssh.ts +17 -0
  408. package/examples/extensions/with-deps/package-lock.json +2 -2
  409. package/examples/extensions/with-deps/package.json +1 -1
  410. package/npm-shrinkwrap.json +240 -260
  411. package/package.json +9 -7
@@ -0,0 +1,178 @@
1
+ import { discoverBedrockInferenceProfiles, probeBedrockModelAccess, } from "@caupulican/pi-ai/bedrock-provider";
2
+ export const BEDROCK_PROVIDER_ID = "amazon-bedrock";
3
+ const BEDROCK_MODEL_FAMILIES = ["sonnet", "opus", "haiku", "fable"];
4
+ const MODEL_VERSION_COLLATOR = new Intl.Collator("en", { numeric: true, sensitivity: "base" });
5
+ export function isUnscopedBedrockProxy(env = process.env) {
6
+ return env.AWS_BEDROCK_SKIP_AUTH === "1" && Boolean(env.AWS_ENDPOINT_URL_BEDROCK_RUNTIME?.trim());
7
+ }
8
+ function normalizeRegion(region) {
9
+ const normalized = region.trim().toLowerCase();
10
+ if (!/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/.test(normalized)) {
11
+ throw new Error("AWS region must be an explicit valid region name.");
12
+ }
13
+ return normalized;
14
+ }
15
+ function normalizeProfile(profile) {
16
+ if (profile === undefined)
17
+ return undefined;
18
+ const normalized = profile.trim();
19
+ if (!normalized || normalized.length > 256 || /[\u0000-\u001f\u007f]/.test(normalized)) {
20
+ throw new Error("AWS profile must be a non-empty printable name of at most 256 characters.");
21
+ }
22
+ return normalized;
23
+ }
24
+ function regionInferencePrefix(region) {
25
+ if (region.startsWith("us-gov-"))
26
+ return "us-gov";
27
+ if (region.startsWith("us-"))
28
+ return "us";
29
+ if (region.startsWith("eu-"))
30
+ return "eu";
31
+ if (region.startsWith("ap-"))
32
+ return "apac";
33
+ return "global";
34
+ }
35
+ function modelRegionPrefix(modelId) {
36
+ const marker = ".anthropic.";
37
+ const markerIndex = modelId.indexOf(marker);
38
+ if (markerIndex >= 0)
39
+ return modelId.slice(0, markerIndex);
40
+ return modelId.startsWith("anthropic.") ? undefined : "foreign";
41
+ }
42
+ function regionRank(modelId, preferredPrefix, trustDiscovery) {
43
+ const prefix = modelRegionPrefix(modelId);
44
+ if (prefix === preferredPrefix)
45
+ return 0;
46
+ if (prefix === "global")
47
+ return 1;
48
+ if (prefix === undefined)
49
+ return 2;
50
+ return trustDiscovery && prefix !== "foreign" ? 3 : undefined;
51
+ }
52
+ function isAnthropicBedrockModel(model) {
53
+ return (model.provider === BEDROCK_PROVIDER_ID && (model.id.startsWith("anthropic.") || model.id.includes(".anthropic.")));
54
+ }
55
+ /** Choose one current model per Claude tier, preferring the region's inference-profile prefix. */
56
+ export function selectBedrockTierModelIds(models, discoveredModelIds, region) {
57
+ const normalizedRegion = normalizeRegion(region);
58
+ const preferredPrefix = regionInferencePrefix(normalizedRegion);
59
+ const discovered = discoveredModelIds ? new Set(discoveredModelIds) : undefined;
60
+ const candidates = models.filter((model) => isAnthropicBedrockModel(model) && (!discovered || discovered.has(model.id)));
61
+ const selected = [];
62
+ for (const family of BEDROCK_MODEL_FAMILIES) {
63
+ const familyCandidates = candidates
64
+ .map((model) => ({
65
+ model,
66
+ rank: regionRank(model.id, preferredPrefix, discovered !== undefined),
67
+ }))
68
+ .filter((candidate) => candidate.rank !== undefined && candidate.model.id.toLowerCase().includes(`claude-${family}`))
69
+ .sort((a, b) => a.rank - b.rank ||
70
+ MODEL_VERSION_COLLATOR.compare(b.model.name, a.model.name) ||
71
+ MODEL_VERSION_COLLATOR.compare(b.model.id, a.model.id));
72
+ if (familyCandidates[0])
73
+ selected.push(familyCandidates[0].model.id);
74
+ }
75
+ return selected;
76
+ }
77
+ function connection(request) {
78
+ const region = normalizeRegion(request.region);
79
+ const profile = normalizeProfile(request.profile);
80
+ return {
81
+ region,
82
+ ...(profile ? { profile } : {}),
83
+ ...(request.signal ? { signal: request.signal } : {}),
84
+ };
85
+ }
86
+ function noVerifiedModelsError(result) {
87
+ const details = result.failures
88
+ .slice(0, 4)
89
+ .map((failure) => `${failure.modelId}: ${failure.reason}`)
90
+ .join("; ");
91
+ return new Error(`No Anthropic Bedrock model passed runtime verification${details ? ` (${details})` : ""}.`);
92
+ }
93
+ export async function verifyBedrockScope(request, modelRegistry, dependencies = {}) {
94
+ const normalized = connection(request);
95
+ const env = dependencies.env ?? process.env;
96
+ const bearerToken = request.credentialMode === "profile" ? undefined : env.AWS_BEARER_TOKEN_BEDROCK?.trim();
97
+ const models = modelRegistry.getAll();
98
+ let candidates;
99
+ let verification;
100
+ if (bearerToken) {
101
+ candidates = selectBedrockTierModelIds(models, undefined, normalized.region);
102
+ verification = "runtime";
103
+ }
104
+ else {
105
+ const discover = dependencies.discoverInferenceProfiles ?? discoverBedrockInferenceProfiles;
106
+ const discovery = await discover(normalized);
107
+ candidates = selectBedrockTierModelIds(models, discovery.inferenceProfileIds, normalized.region);
108
+ verification = "identity+control-plane+runtime";
109
+ }
110
+ if (candidates.length === 0) {
111
+ throw new Error(`No catalogued Anthropic inference profiles were discovered in ${normalized.region}.`);
112
+ }
113
+ const probe = dependencies.probeModelAccess ?? probeBedrockModelAccess;
114
+ const result = await probe({
115
+ ...normalized,
116
+ modelIds: candidates,
117
+ ...(bearerToken ? { bearerToken } : {}),
118
+ });
119
+ if (result.verifiedModelIds.length === 0)
120
+ throw noVerifiedModelsError(result);
121
+ return {
122
+ region: normalized.region,
123
+ ...(normalized.profile ? { profile: normalized.profile } : {}),
124
+ modelIds: result.verifiedModelIds,
125
+ verifiedAt: (dependencies.now ?? (() => new Date()))().toISOString(),
126
+ verification,
127
+ };
128
+ }
129
+ function scopeMatchesEnvironment(scope, env) {
130
+ const environmentRegion = env.AWS_REGION?.trim().toLowerCase();
131
+ if (environmentRegion && environmentRegion !== scope.region)
132
+ return false;
133
+ const environmentProfile = env.AWS_PROFILE?.trim();
134
+ return environmentProfile === undefined || environmentProfile === scope.profile;
135
+ }
136
+ function scopedModelIds(scope, modelRegistry) {
137
+ const modelIds = new Set(scope.modelIds);
138
+ for (const model of modelRegistry.getAll()) {
139
+ if (model.provider !== BEDROCK_PROVIDER_ID)
140
+ continue;
141
+ const applicationProfile = model.id.match(/^arn:[^:]+:bedrock:([^:]+):[^:]*:application-inference-profile\//i);
142
+ if (applicationProfile?.[1]?.toLowerCase() === scope.region)
143
+ modelIds.add(model.id);
144
+ }
145
+ return [...modelIds];
146
+ }
147
+ export function getActiveBedrockScope(settingsManager, env = process.env) {
148
+ const scope = settingsManager.getBedrockScopeSettings();
149
+ return scope && scopeMatchesEnvironment(scope, env) ? scope : undefined;
150
+ }
151
+ /** Bind persisted evidence to both provider visibility and the SDK's exact request environment. */
152
+ export function bindSavedBedrockScope(settingsManager, modelRegistry, env = process.env) {
153
+ if (isUnscopedBedrockProxy(env)) {
154
+ modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, undefined);
155
+ return undefined;
156
+ }
157
+ const scope = getActiveBedrockScope(settingsManager, env);
158
+ if (!scope) {
159
+ modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, []);
160
+ return undefined;
161
+ }
162
+ if (!env.AWS_REGION?.trim())
163
+ env.AWS_REGION = scope.region;
164
+ if (scope.profile && !env.AWS_PROFILE?.trim())
165
+ env.AWS_PROFILE = scope.profile;
166
+ modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));
167
+ return scope;
168
+ }
169
+ export function activateVerifiedBedrockScope(settingsManager, modelRegistry, scope, env = process.env) {
170
+ settingsManager.setBedrockScopeSettings(scope);
171
+ env.AWS_REGION = scope.region;
172
+ if (scope.profile)
173
+ env.AWS_PROFILE = scope.profile;
174
+ else
175
+ delete env.AWS_PROFILE;
176
+ modelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));
177
+ }
178
+ //# sourceMappingURL=bedrock-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock-scope.js","sourceRoot":"","sources":["../../src/core/bedrock-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@caupulican/pi-ai\";\nimport {\n\ttype BedrockModelProbeResult,\n\tdiscoverBedrockInferenceProfiles,\n\tprobeBedrockModelAccess,\n} from \"@caupulican/pi-ai/bedrock-provider\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { BedrockScopeSettings, SettingsManager } from \"./settings-manager.ts\";\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\nconst BEDROCK_MODEL_FAMILIES = [\"sonnet\", \"opus\", \"haiku\", \"fable\"] as const;\nconst MODEL_VERSION_COLLATOR = new Intl.Collator(\"en\", { numeric: true, sensitivity: \"base\" });\n\nexport function isUnscopedBedrockProxy(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env.AWS_BEDROCK_SKIP_AUTH === \"1\" && Boolean(env.AWS_ENDPOINT_URL_BEDROCK_RUNTIME?.trim());\n}\n\nexport interface BedrockScopeVerificationRequest {\n\tregion: string;\n\tprofile?: string;\n\tsignal?: AbortSignal;\n\tcredentialMode?: \"profile\" | \"ambient\";\n}\n\nexport interface BedrockScopeVerificationDependencies {\n\tenv?: NodeJS.ProcessEnv;\n\tdiscoverInferenceProfiles?: typeof discoverBedrockInferenceProfiles;\n\tprobeModelAccess?: typeof probeBedrockModelAccess;\n\tnow?: () => Date;\n}\n\nfunction normalizeRegion(region: string): string {\n\tconst normalized = region.trim().toLowerCase();\n\tif (!/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/.test(normalized)) {\n\t\tthrow new Error(\"AWS region must be an explicit valid region name.\");\n\t}\n\treturn normalized;\n}\n\nfunction normalizeProfile(profile: string | undefined): string | undefined {\n\tif (profile === undefined) return undefined;\n\tconst normalized = profile.trim();\n\tif (!normalized || normalized.length > 256 || /[\\u0000-\\u001f\\u007f]/.test(normalized)) {\n\t\tthrow new Error(\"AWS profile must be a non-empty printable name of at most 256 characters.\");\n\t}\n\treturn normalized;\n}\n\nfunction regionInferencePrefix(region: string): string {\n\tif (region.startsWith(\"us-gov-\")) return \"us-gov\";\n\tif (region.startsWith(\"us-\")) return \"us\";\n\tif (region.startsWith(\"eu-\")) return \"eu\";\n\tif (region.startsWith(\"ap-\")) return \"apac\";\n\treturn \"global\";\n}\n\nfunction modelRegionPrefix(modelId: string): string | undefined {\n\tconst marker = \".anthropic.\";\n\tconst markerIndex = modelId.indexOf(marker);\n\tif (markerIndex >= 0) return modelId.slice(0, markerIndex);\n\treturn modelId.startsWith(\"anthropic.\") ? undefined : \"foreign\";\n}\n\nfunction regionRank(modelId: string, preferredPrefix: string, trustDiscovery: boolean): number | undefined {\n\tconst prefix = modelRegionPrefix(modelId);\n\tif (prefix === preferredPrefix) return 0;\n\tif (prefix === \"global\") return 1;\n\tif (prefix === undefined) return 2;\n\treturn trustDiscovery && prefix !== \"foreign\" ? 3 : undefined;\n}\n\nfunction isAnthropicBedrockModel(model: Model<Api>): boolean {\n\treturn (\n\t\tmodel.provider === BEDROCK_PROVIDER_ID && (model.id.startsWith(\"anthropic.\") || model.id.includes(\".anthropic.\"))\n\t);\n}\n\n/** Choose one current model per Claude tier, preferring the region's inference-profile prefix. */\nexport function selectBedrockTierModelIds(\n\tmodels: readonly Model<Api>[],\n\tdiscoveredModelIds: readonly string[] | undefined,\n\tregion: string,\n): string[] {\n\tconst normalizedRegion = normalizeRegion(region);\n\tconst preferredPrefix = regionInferencePrefix(normalizedRegion);\n\tconst discovered = discoveredModelIds ? new Set(discoveredModelIds) : undefined;\n\tconst candidates = models.filter(\n\t\t(model) => isAnthropicBedrockModel(model) && (!discovered || discovered.has(model.id)),\n\t);\n\tconst selected: string[] = [];\n\tfor (const family of BEDROCK_MODEL_FAMILIES) {\n\t\tconst familyCandidates = candidates\n\t\t\t.map((model) => ({\n\t\t\t\tmodel,\n\t\t\t\trank: regionRank(model.id, preferredPrefix, discovered !== undefined),\n\t\t\t}))\n\t\t\t.filter(\n\t\t\t\t(candidate): candidate is { model: Model<Api>; rank: number } =>\n\t\t\t\t\tcandidate.rank !== undefined && candidate.model.id.toLowerCase().includes(`claude-${family}`),\n\t\t\t)\n\t\t\t.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\ta.rank - b.rank ||\n\t\t\t\t\tMODEL_VERSION_COLLATOR.compare(b.model.name, a.model.name) ||\n\t\t\t\t\tMODEL_VERSION_COLLATOR.compare(b.model.id, a.model.id),\n\t\t\t);\n\t\tif (familyCandidates[0]) selected.push(familyCandidates[0].model.id);\n\t}\n\treturn selected;\n}\n\nfunction connection(request: BedrockScopeVerificationRequest): BedrockScopeVerificationRequest {\n\tconst region = normalizeRegion(request.region);\n\tconst profile = normalizeProfile(request.profile);\n\treturn {\n\t\tregion,\n\t\t...(profile ? { profile } : {}),\n\t\t...(request.signal ? { signal: request.signal } : {}),\n\t};\n}\n\nfunction noVerifiedModelsError(result: BedrockModelProbeResult): Error {\n\tconst details = result.failures\n\t\t.slice(0, 4)\n\t\t.map((failure) => `${failure.modelId}: ${failure.reason}`)\n\t\t.join(\"; \");\n\treturn new Error(`No Anthropic Bedrock model passed runtime verification${details ? ` (${details})` : \"\"}.`);\n}\n\nexport async function verifyBedrockScope(\n\trequest: BedrockScopeVerificationRequest,\n\tmodelRegistry: ModelRegistry,\n\tdependencies: BedrockScopeVerificationDependencies = {},\n): Promise<BedrockScopeSettings> {\n\tconst normalized = connection(request);\n\tconst env = dependencies.env ?? process.env;\n\tconst bearerToken = request.credentialMode === \"profile\" ? undefined : env.AWS_BEARER_TOKEN_BEDROCK?.trim();\n\tconst models = modelRegistry.getAll();\n\tlet candidates: string[];\n\tlet verification: BedrockScopeSettings[\"verification\"];\n\n\tif (bearerToken) {\n\t\tcandidates = selectBedrockTierModelIds(models, undefined, normalized.region);\n\t\tverification = \"runtime\";\n\t} else {\n\t\tconst discover = dependencies.discoverInferenceProfiles ?? discoverBedrockInferenceProfiles;\n\t\tconst discovery = await discover(normalized);\n\t\tcandidates = selectBedrockTierModelIds(models, discovery.inferenceProfileIds, normalized.region);\n\t\tverification = \"identity+control-plane+runtime\";\n\t}\n\tif (candidates.length === 0) {\n\t\tthrow new Error(`No catalogued Anthropic inference profiles were discovered in ${normalized.region}.`);\n\t}\n\n\tconst probe = dependencies.probeModelAccess ?? probeBedrockModelAccess;\n\tconst result = await probe({\n\t\t...normalized,\n\t\tmodelIds: candidates,\n\t\t...(bearerToken ? { bearerToken } : {}),\n\t});\n\tif (result.verifiedModelIds.length === 0) throw noVerifiedModelsError(result);\n\n\treturn {\n\t\tregion: normalized.region,\n\t\t...(normalized.profile ? { profile: normalized.profile } : {}),\n\t\tmodelIds: result.verifiedModelIds,\n\t\tverifiedAt: (dependencies.now ?? (() => new Date()))().toISOString(),\n\t\tverification,\n\t};\n}\n\nfunction scopeMatchesEnvironment(scope: BedrockScopeSettings, env: NodeJS.ProcessEnv): boolean {\n\tconst environmentRegion = env.AWS_REGION?.trim().toLowerCase();\n\tif (environmentRegion && environmentRegion !== scope.region) return false;\n\tconst environmentProfile = env.AWS_PROFILE?.trim();\n\treturn environmentProfile === undefined || environmentProfile === scope.profile;\n}\n\nfunction scopedModelIds(scope: BedrockScopeSettings, modelRegistry: ModelRegistry): string[] {\n\tconst modelIds = new Set(scope.modelIds);\n\tfor (const model of modelRegistry.getAll()) {\n\t\tif (model.provider !== BEDROCK_PROVIDER_ID) continue;\n\t\tconst applicationProfile = model.id.match(/^arn:[^:]+:bedrock:([^:]+):[^:]*:application-inference-profile\\//i);\n\t\tif (applicationProfile?.[1]?.toLowerCase() === scope.region) modelIds.add(model.id);\n\t}\n\treturn [...modelIds];\n}\n\nexport function getActiveBedrockScope(\n\tsettingsManager: SettingsManager,\n\tenv: NodeJS.ProcessEnv = process.env,\n): BedrockScopeSettings | undefined {\n\tconst scope = settingsManager.getBedrockScopeSettings();\n\treturn scope && scopeMatchesEnvironment(scope, env) ? scope : undefined;\n}\n\n/** Bind persisted evidence to both provider visibility and the SDK's exact request environment. */\nexport function bindSavedBedrockScope(\n\tsettingsManager: SettingsManager,\n\tmodelRegistry: ModelRegistry,\n\tenv: NodeJS.ProcessEnv = process.env,\n): BedrockScopeSettings | undefined {\n\tif (isUnscopedBedrockProxy(env)) {\n\t\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, undefined);\n\t\treturn undefined;\n\t}\n\tconst scope = getActiveBedrockScope(settingsManager, env);\n\tif (!scope) {\n\t\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, []);\n\t\treturn undefined;\n\t}\n\tif (!env.AWS_REGION?.trim()) env.AWS_REGION = scope.region;\n\tif (scope.profile && !env.AWS_PROFILE?.trim()) env.AWS_PROFILE = scope.profile;\n\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));\n\treturn scope;\n}\n\nexport function activateVerifiedBedrockScope(\n\tsettingsManager: SettingsManager,\n\tmodelRegistry: ModelRegistry,\n\tscope: BedrockScopeSettings,\n\tenv: NodeJS.ProcessEnv = process.env,\n): void {\n\tsettingsManager.setBedrockScopeSettings(scope);\n\tenv.AWS_REGION = scope.region;\n\tif (scope.profile) env.AWS_PROFILE = scope.profile;\n\telse delete env.AWS_PROFILE;\n\tmodelRegistry.setProviderModelScope(BEDROCK_PROVIDER_ID, scopedModelIds(scope, modelRegistry));\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { Agent } from "@caupulican/pi-agent-core";
2
- import { type ClassifiedError, classifyFailure } from "@caupulican/pi-agent-core";
1
+ import type { Agent } from "@caupulican/pi-agent-core/agent";
2
+ import { type ClassifiedError, classifyFailure } from "@caupulican/pi-agent-core/reliability";
3
3
  import type { AssistantMessage } from "@caupulican/pi-ai";
4
4
  import type { ModelRegistry } from "./model-registry.ts";
5
5
  import type { ModelRouterFailoverStatus } from "./model-router/status.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"billing-failover-controller.d.ts","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,KAAK,EAAO,gBAAgB,EAAS,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAM1E,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMhC;IAED,QAAQ,IAAI,MAAM,EAAE,CAEnB;CACD;AAED,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,yBAAyB,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,CAAC,IAAI,EAAE;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;CACT;AAED,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,IAAI,EAAE,6BAA6B,EAE9C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED,iBAAiB,IAAI,MAAM,EAAE,CAE5B;IAED,aAAa,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,SAAS,IAAI,yBAAyB,CAErC;IAEK,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBpG;CACD"}
1
+ {"version":3,"file":"billing-failover-controller.d.ts","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,KAAK,EAAO,gBAAgB,EAAS,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAM1E,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMhC;IAED,QAAQ,IAAI,MAAM,EAAE,CAEnB;CACD;AAED,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,yBAAyB,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,CAAC,IAAI,EAAE;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;CACT;AAED,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,IAAI,EAAE,6BAA6B,EAE9C;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED,iBAAiB,IAAI,MAAM,EAAE,CAE5B;IAED,aAAa,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,SAAS,IAAI,yBAAyB,CAErC;IAEK,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBpG;CACD"}
@@ -1,4 +1,4 @@
1
- import { classifyFailure } from "@caupulican/pi-agent-core";
1
+ import { classifyFailure } from "@caupulican/pi-agent-core/reliability";
2
2
  import { decideBillingFailover } from "./billing-failover.js";
3
3
  const DEFAULT_MODEL_PER_PROVIDER = {
4
4
  "openai-codex": "gpt-5.6-sol",
@@ -1 +1 @@
1
- {"version":3,"file":"billing-failover-controller.js","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Agent } from \"@caupulican/pi-agent-core\";\nimport { type ClassifiedError, classifyFailure } from \"@caupulican/pi-agent-core\";\nimport type { Api, AssistantMessage, Model } from \"@caupulican/pi-ai\";\nimport { decideBillingFailover } from \"./billing-failover.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { ModelRouterFailoverStatus } from \"./model-router/status.ts\";\n\nconst DEFAULT_MODEL_PER_PROVIDER: Record<string, string> = {\n\t\"openai-codex\": \"gpt-5.6-sol\",\n};\n\nexport class ExhaustedProviderRegistry {\n\tprivate readonly exhausted = new Map<string, number | undefined>();\n\n\tmarkExhausted(ref: string, until?: number): void {\n\t\tthis.exhausted.set(ref, until);\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\tconst until = this.exhausted.get(ref);\n\t\tif (until === undefined) return this.exhausted.has(ref);\n\t\tif (Date.now() < until) return true;\n\t\tthis.exhausted.delete(ref);\n\t\treturn false;\n\t}\n\n\tsnapshot(): string[] {\n\t\treturn [...this.exhausted.keys()].filter((ref) => this.isExhausted(ref));\n\t}\n}\n\nexport interface BillingFailoverControllerDeps {\n\tagent: Agent;\n\tmodelRegistry: ModelRegistry;\n\temit(event: { type: \"warning\"; message: string }): void;\n\texhausted: ExhaustedProviderRegistry;\n\tsubscriptionHop?: boolean;\n\trecordFailure?(args: {\n\t\tprovider?: string;\n\t\tmodelId?: string;\n\t\tmessage: string;\n\t\tclassified: ReturnType<typeof classifyFailure>;\n\t}): void;\n}\n\nexport class BillingFailoverController {\n\tprivate readonly deps: BillingFailoverControllerDeps;\n\tprivate lastNotice: string | undefined;\n\n\tconstructor(deps: BillingFailoverControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\treturn this.deps.exhausted.isExhausted(ref);\n\t}\n\n\tsnapshotExhausted(): string[] {\n\t\treturn this.deps.exhausted.snapshot();\n\t}\n\n\tgetLastNotice(): string | undefined {\n\t\treturn this.lastNotice;\n\t}\n\n\tgetStatus(): ModelRouterFailoverStatus {\n\t\treturn { exhausted: this.snapshotExhausted(), lastNotice: this.lastNotice };\n\t}\n\n\tasync handleAssistantError(message: AssistantMessage, classified?: ClassifiedError): Promise<boolean> {\n\t\tif (message.stopReason !== \"error\") return false;\n\t\tclassified ??= classifyFailure({ message: message.errorMessage ?? \"\", provider: message.provider });\n\t\tif (classified.reason !== \"billing_or_quota\") return false;\n\t\tconst failedModel = this.deps.modelRegistry.find(message.provider, message.model) ?? this.deps.agent.state.model;\n\t\tconst failedRef = `${failedModel.provider}/${failedModel.id}`;\n\t\tthis.deps.exhausted.markExhausted(failedRef, expiryFromRetryAfter(classified.retryAfterMs));\n\n\t\tconst defaultModelId = DEFAULT_MODEL_PER_PROVIDER[failedModel.provider];\n\t\tconst hop = defaultModelId ? this.deps.modelRegistry.find(failedModel.provider, defaultModelId) : undefined;\n\t\tconst action = decideBillingFailover({\n\t\t\tfailedModel: { provider: failedModel.provider, id: failedModel.id },\n\t\t\tbillingClass: this.deps.modelRegistry.isUsingOAuth(failedModel) ? \"subscription\" : \"metered\",\n\t\t\tproviderDefaultModelId: defaultModelId,\n\t\t\thopResolvesWithAuth: Boolean(hop && this.deps.modelRegistry.hasConfiguredAuth(hop)),\n\t\t\thopExhausted: hop ? this.deps.exhausted.isExhausted(`${hop.provider}/${hop.id}`) : false,\n\t\t\tsubscriptionHop: this.deps.subscriptionHop,\n\t\t});\n\t\tif (action.action === \"failover\") {\n\t\t\tthis.deps.agent.state.model = hop as Model<Api>;\n\t\t}\n\t\tthis.lastNotice = action.notice;\n\t\tthis.deps.emit({ type: \"warning\", message: action.notice });\n\t\treturn true;\n\t}\n}\n\nfunction expiryFromRetryAfter(retryAfterMs: number | undefined): number | undefined {\n\treturn retryAfterMs === undefined ? undefined : Date.now() + retryAfterMs;\n}\n"]}
1
+ {"version":3,"file":"billing-failover-controller.js","sourceRoot":"","sources":["../../src/core/billing-failover-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Agent } from \"@caupulican/pi-agent-core/agent\";\nimport { type ClassifiedError, classifyFailure } from \"@caupulican/pi-agent-core/reliability\";\nimport type { Api, AssistantMessage, Model } from \"@caupulican/pi-ai\";\nimport { decideBillingFailover } from \"./billing-failover.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport type { ModelRouterFailoverStatus } from \"./model-router/status.ts\";\n\nconst DEFAULT_MODEL_PER_PROVIDER: Record<string, string> = {\n\t\"openai-codex\": \"gpt-5.6-sol\",\n};\n\nexport class ExhaustedProviderRegistry {\n\tprivate readonly exhausted = new Map<string, number | undefined>();\n\n\tmarkExhausted(ref: string, until?: number): void {\n\t\tthis.exhausted.set(ref, until);\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\tconst until = this.exhausted.get(ref);\n\t\tif (until === undefined) return this.exhausted.has(ref);\n\t\tif (Date.now() < until) return true;\n\t\tthis.exhausted.delete(ref);\n\t\treturn false;\n\t}\n\n\tsnapshot(): string[] {\n\t\treturn [...this.exhausted.keys()].filter((ref) => this.isExhausted(ref));\n\t}\n}\n\nexport interface BillingFailoverControllerDeps {\n\tagent: Agent;\n\tmodelRegistry: ModelRegistry;\n\temit(event: { type: \"warning\"; message: string }): void;\n\texhausted: ExhaustedProviderRegistry;\n\tsubscriptionHop?: boolean;\n\trecordFailure?(args: {\n\t\tprovider?: string;\n\t\tmodelId?: string;\n\t\tmessage: string;\n\t\tclassified: ReturnType<typeof classifyFailure>;\n\t}): void;\n}\n\nexport class BillingFailoverController {\n\tprivate readonly deps: BillingFailoverControllerDeps;\n\tprivate lastNotice: string | undefined;\n\n\tconstructor(deps: BillingFailoverControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tisExhausted(ref: string): boolean {\n\t\treturn this.deps.exhausted.isExhausted(ref);\n\t}\n\n\tsnapshotExhausted(): string[] {\n\t\treturn this.deps.exhausted.snapshot();\n\t}\n\n\tgetLastNotice(): string | undefined {\n\t\treturn this.lastNotice;\n\t}\n\n\tgetStatus(): ModelRouterFailoverStatus {\n\t\treturn { exhausted: this.snapshotExhausted(), lastNotice: this.lastNotice };\n\t}\n\n\tasync handleAssistantError(message: AssistantMessage, classified?: ClassifiedError): Promise<boolean> {\n\t\tif (message.stopReason !== \"error\") return false;\n\t\tclassified ??= classifyFailure({ message: message.errorMessage ?? \"\", provider: message.provider });\n\t\tif (classified.reason !== \"billing_or_quota\") return false;\n\t\tconst failedModel = this.deps.modelRegistry.find(message.provider, message.model) ?? this.deps.agent.state.model;\n\t\tconst failedRef = `${failedModel.provider}/${failedModel.id}`;\n\t\tthis.deps.exhausted.markExhausted(failedRef, expiryFromRetryAfter(classified.retryAfterMs));\n\n\t\tconst defaultModelId = DEFAULT_MODEL_PER_PROVIDER[failedModel.provider];\n\t\tconst hop = defaultModelId ? this.deps.modelRegistry.find(failedModel.provider, defaultModelId) : undefined;\n\t\tconst action = decideBillingFailover({\n\t\t\tfailedModel: { provider: failedModel.provider, id: failedModel.id },\n\t\t\tbillingClass: this.deps.modelRegistry.isUsingOAuth(failedModel) ? \"subscription\" : \"metered\",\n\t\t\tproviderDefaultModelId: defaultModelId,\n\t\t\thopResolvesWithAuth: Boolean(hop && this.deps.modelRegistry.hasConfiguredAuth(hop)),\n\t\t\thopExhausted: hop ? this.deps.exhausted.isExhausted(`${hop.provider}/${hop.id}`) : false,\n\t\t\tsubscriptionHop: this.deps.subscriptionHop,\n\t\t});\n\t\tif (action.action === \"failover\") {\n\t\t\tthis.deps.agent.state.model = hop as Model<Api>;\n\t\t}\n\t\tthis.lastNotice = action.notice;\n\t\tthis.deps.emit({ type: \"warning\", message: action.notice });\n\t\treturn true;\n\t}\n}\n\nfunction expiryFromRetryAfter(retryAfterMs: number | undefined): number | undefined {\n\treturn retryAfterMs === undefined ? undefined : Date.now() + retryAfterMs;\n}\n"]}
@@ -1,5 +1,7 @@
1
- import type { Agent, AgentMessage, ThinkingLevel } from "@caupulican/pi-agent-core";
2
- import { type CompactionResult, type CompactionSettings, type SessionManager } from "@caupulican/pi-agent-core/node";
1
+ import type { Agent } from "@caupulican/pi-agent-core/agent";
2
+ import { type CompactionResult, type CompactionSettings } from "@caupulican/pi-agent-core/compaction/compaction";
3
+ import { type SessionManager } from "@caupulican/pi-agent-core/session";
4
+ import type { AgentMessage, ThinkingLevel } from "@caupulican/pi-agent-core/types";
3
5
  import type { Api, AssistantMessage, Model } from "@caupulican/pi-ai";
4
6
  import type { ExtensionRunner } from "./extensions/index.ts";
5
7
  import type { FailureCorpusRecorder } from "./failure-corpus.ts";
@@ -72,6 +74,7 @@ export declare class CompactionController {
72
74
  private autoAbortController;
73
75
  private autoRunPromise;
74
76
  private overflowRecoveryAttempted;
77
+ private ineffectiveThresholdFrontier;
75
78
  private readonly deps;
76
79
  constructor(deps: CompactionControllerDeps);
77
80
  private buildCompactionInstructions;
@@ -85,6 +88,9 @@ export declare class CompactionController {
85
88
  measureLiveContextTokens(): number;
86
89
  runAuto(reason: AutoCompactionReason, willRetry: boolean): Promise<boolean>;
87
90
  private runAutoOnce;
91
+ private shouldDeferThresholdRetry;
92
+ private recordThresholdFrontier;
93
+ private emitIneffectiveThresholdSkip;
88
94
  compactWithRetry(run: () => Promise<CompactionResult>, signal: AbortSignal, provider?: string): Promise<CompactionResult>;
89
95
  private findLastAssistantMessage;
90
96
  private getExtensionCompaction;
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-controller.d.ts","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAe,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEjG,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAQvB,KAAK,cAAc,EAEnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAC;AACzF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,WAAW,CAAC;AAI5D,KAAK,yBAAyB,GAC3B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,oBAAoB,CAAA;CAAE,GACrE;IACA,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,oBAAoB,CAAC;IACxC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,kBAAkB,IAAI,kBAAkB,CAAC;IACzC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAClG,mBAAmB,CAClB,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,EAC3B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvG,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAAC;IACzC,oBAAoB,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,SAAS,CAAC;IACvG,kBAAkB,IAAI,MAAM,CAAC;IAC7B,kBAAkB,IAAI,eAAe,CAAC;IACtC,WAAW,IAAI,OAAO,CAAC;IACvB,eAAe,IAAI,IAAI,CAAC;IACxB,cAAc,IAAI,IAAI,CAAC;IACvB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC7C,4BAA4B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC/D,cAAc,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IACxF,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,sBAAsB,IAAI,IAAI,CAAC;IAC/B,gBAAgB,IAAI,qBAAqB,CAAC;IAC1C,wBAAwB,IAAI,MAAM,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,gBAAgB,CACf,GAAG,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EACpC,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE;IACxD,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC5E,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBb;AAED,gGAAgG;AAChG,qBAAa,oBAAoB;IAChC,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAEhD,YAAY,IAAI,EAAE,wBAAwB,EAEzC;YAEa,2BAA2B;IAUzC,SAAS,IAAI,OAAO,CAMnB;IAED,qBAAqB,IAAI,IAAI,CAE5B;IAED,KAAK,IAAI,IAAI,CAGZ;IAED,8BAA8B,IAAI,IAAI,CA0BrC;IAEK,kCAAkC,CACvC,QAAQ,EAAE,YAAY,EAAE,EACxB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,GAC5D,OAAO,CAAC,OAAO,CAAC,CAiBlB;IAEK,OAAO,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6IpE;IAEK,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEzF;IAED,wBAAwB,IAAI,MAAM,CAWjC;IAED,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAe1E;YAEa,WAAW;IA6JnB,gBAAgB,CACrB,GAAG,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EACpC,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;IAED,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;YAkBtB,WAAW;CAuBzB"}
1
+ {"version":3,"file":"compaction-controller.d.ts","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
- import { classifyFailure, computeRetryDelayMs, DEFAULT_RETRY_POLICY, sleepAbortable } from "@caupulican/pi-agent-core";
2
- import { calculateContextTokens, compact, createDeterministicCompaction, estimateContextTokens, getLatestCompactionEntry, prepareCompaction, runCompactionLoop, shouldCompact, } from "@caupulican/pi-agent-core/node";
3
- import { isContextOverflow } from "@caupulican/pi-ai";
1
+ import { calculateContextTokens, compact, createDeterministicCompaction, estimateContextTokens, prepareCompaction, shouldCompact, } from "@caupulican/pi-agent-core/compaction/compaction";
2
+ import { runCompactionLoop } from "@caupulican/pi-agent-core/compaction/loop";
3
+ import { classifyFailure, computeRetryDelayMs, DEFAULT_RETRY_POLICY, sleepAbortable, } from "@caupulican/pi-agent-core/reliability";
4
+ import { getLatestCompactionEntry } from "@caupulican/pi-agent-core/session";
5
+ import { isContextOverflow } from "@caupulican/pi-ai/overflow";
4
6
  import { formatNoModelSelectedMessage } from "./auth-guidance.js";
5
7
  import { wrapUntrustedText } from "./security/untrusted-boundary.js";
6
8
  const COMPACTION_RETRY_PREPARATION_OPTIONS = { allowTrailingCompactionAsPrevious: true };
9
+ const INEFFECTIVE_THRESHOLD_SKIP_REASON = "previous auto-compaction did not restore headroom; waiting for materially new compactable history";
7
10
  export async function runCompactionWithRetry(options) {
8
11
  const retrySettings = options.getRetrySettings();
9
12
  const maxAttempts = retrySettings.enabled ? Math.max(1, retrySettings.maxRetries + 1) : 1;
@@ -100,12 +103,17 @@ export class CompactionController {
100
103
  const projectedTokens = this.deps.estimateCurrentContextTokens(projectedMessages);
101
104
  if (!shouldCompact(projectedTokens, contextWindow, settings, triggerTokens))
102
105
  return false;
106
+ if (this.shouldDeferThresholdRetry(projectedTokens, model, settings)) {
107
+ this.emitIneffectiveThresholdSkip();
108
+ return false;
109
+ }
103
110
  const latestBefore = getLatestCompactionEntry(this.deps.sessionManager.getBranch())?.id;
104
111
  await this.deps.runAutoCompaction("threshold", false);
105
112
  const latestAfter = getLatestCompactionEntry(this.deps.sessionManager.getBranch())?.id;
106
113
  return Boolean(latestAfter && latestAfter !== latestBefore);
107
114
  }
108
115
  async compact(customInstructions) {
116
+ this.ineffectiveThresholdFrontier = undefined;
109
117
  this.deps.disconnectAgent();
110
118
  await this.deps.abortForeground();
111
119
  this.manualAbortController = new AbortController();
@@ -279,6 +287,10 @@ export class CompactionController {
279
287
  }
280
288
  }
281
289
  if (shouldCompact(contextTokens, contextWindow, settings, model?.autoCompactionTriggerTokens)) {
290
+ if (model && this.shouldDeferThresholdRetry(contextTokens, model, settings)) {
291
+ this.emitIneffectiveThresholdSkip();
292
+ return false;
293
+ }
282
294
  return this.deps.runAutoCompaction("threshold", false);
283
295
  }
284
296
  return false;
@@ -413,6 +425,10 @@ export class CompactionController {
413
425
  const result = outcome.kind === "success" ? outcome.result : lastCompaction;
414
426
  if (!result)
415
427
  throw new Error("Auto-compaction succeeded without a result");
428
+ if (reason === "threshold")
429
+ this.recordThresholdFrontier(model, settings, margin);
430
+ else
431
+ this.ineffectiveThresholdFrontier = undefined;
416
432
  this.deps.emit({ type: "compaction_end", reason, result, aborted: false, willRetry });
417
433
  if (willRetry) {
418
434
  const messages = this.deps.agent.state.messages;
@@ -439,6 +455,60 @@ export class CompactionController {
439
455
  return hadQueuedMessages || this.deps.agent.hasQueuedMessages();
440
456
  }
441
457
  }
458
+ shouldDeferThresholdRetry(contextTokens, model, settings) {
459
+ const frontier = this.ineffectiveThresholdFrontier;
460
+ if (!frontier)
461
+ return false;
462
+ if (frontier.provider !== model.provider ||
463
+ frontier.modelId !== model.id ||
464
+ frontier.contextWindow !== model.contextWindow ||
465
+ frontier.autoCompactionTriggerTokens !== model.autoCompactionTriggerTokens ||
466
+ frontier.reserveTokens !== settings.reserveTokens ||
467
+ frontier.keepRecentTokens !== settings.keepRecentTokens ||
468
+ frontier.triggerPercent !== settings.triggerPercent ||
469
+ contextTokens < frontier.tokensAfter ||
470
+ contextTokens >= frontier.retryAtTokens) {
471
+ this.ineffectiveThresholdFrontier = undefined;
472
+ return false;
473
+ }
474
+ return true;
475
+ }
476
+ recordThresholdFrontier(model, settings, margin) {
477
+ try {
478
+ const tokensAfter = this.deps.measureLiveContextTokens();
479
+ if (!Number.isFinite(tokensAfter) ||
480
+ !shouldCompact(tokensAfter + margin, model.contextWindow, settings, model.autoCompactionTriggerTokens)) {
481
+ this.ineffectiveThresholdFrontier = undefined;
482
+ return;
483
+ }
484
+ const minimumGrowth = Math.max(1, margin, Math.floor(settings.keepRecentTokens / 2));
485
+ this.ineffectiveThresholdFrontier = {
486
+ provider: model.provider,
487
+ modelId: model.id,
488
+ contextWindow: model.contextWindow,
489
+ autoCompactionTriggerTokens: model.autoCompactionTriggerTokens,
490
+ reserveTokens: settings.reserveTokens,
491
+ keepRecentTokens: settings.keepRecentTokens,
492
+ triggerPercent: settings.triggerPercent,
493
+ tokensAfter,
494
+ retryAtTokens: Math.min(Number.MAX_SAFE_INTEGER, tokensAfter + minimumGrowth),
495
+ };
496
+ }
497
+ catch {
498
+ this.ineffectiveThresholdFrontier = undefined;
499
+ }
500
+ }
501
+ emitIneffectiveThresholdSkip() {
502
+ this.deps.emit({ type: "compaction_start", reason: "threshold" });
503
+ this.deps.emit({
504
+ type: "compaction_end",
505
+ reason: "threshold",
506
+ result: undefined,
507
+ aborted: false,
508
+ willRetry: false,
509
+ skipReason: INEFFECTIVE_THRESHOLD_SKIP_REASON,
510
+ });
511
+ }
442
512
  async compactWithRetry(run, signal, provider) {
443
513
  return runCompactionWithRetry({
444
514
  run,