@caupulican/pi-adaptative 0.80.86 → 0.80.88

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 (337) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/dist/core/agent-session.d.ts +377 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +1791 -41
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/autonomy/approval-gate.d.ts +4 -0
  7. package/dist/core/autonomy/approval-gate.d.ts.map +1 -0
  8. package/dist/core/autonomy/approval-gate.js +27 -0
  9. package/dist/core/autonomy/approval-gate.js.map +1 -0
  10. package/dist/core/autonomy/bounded-completion.d.ts +27 -0
  11. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -0
  12. package/dist/core/autonomy/bounded-completion.js +44 -0
  13. package/dist/core/autonomy/bounded-completion.js.map +1 -0
  14. package/dist/core/autonomy/contracts.d.ts +129 -0
  15. package/dist/core/autonomy/contracts.d.ts.map +1 -0
  16. package/dist/core/autonomy/contracts.js +2 -0
  17. package/dist/core/autonomy/contracts.js.map +1 -0
  18. package/dist/core/autonomy/gates.d.ts +15 -0
  19. package/dist/core/autonomy/gates.d.ts.map +1 -0
  20. package/dist/core/autonomy/gates.js +205 -0
  21. package/dist/core/autonomy/gates.js.map +1 -0
  22. package/dist/core/autonomy/lane-tracker.d.ts +48 -0
  23. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -0
  24. package/dist/core/autonomy/lane-tracker.js +125 -0
  25. package/dist/core/autonomy/lane-tracker.js.map +1 -0
  26. package/dist/core/autonomy/path-scope.d.ts +9 -0
  27. package/dist/core/autonomy/path-scope.d.ts.map +1 -0
  28. package/dist/core/autonomy/path-scope.js +122 -0
  29. package/dist/core/autonomy/path-scope.js.map +1 -0
  30. package/dist/core/autonomy/risk-assessment.d.ts +3 -0
  31. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -0
  32. package/dist/core/autonomy/risk-assessment.js +122 -0
  33. package/dist/core/autonomy/risk-assessment.js.map +1 -0
  34. package/dist/core/autonomy/session-lane-record.d.ts +10 -0
  35. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -0
  36. package/dist/core/autonomy/session-lane-record.js +36 -0
  37. package/dist/core/autonomy/session-lane-record.js.map +1 -0
  38. package/dist/core/autonomy/status.d.ts +40 -0
  39. package/dist/core/autonomy/status.d.ts.map +1 -0
  40. package/dist/core/autonomy/status.js +107 -0
  41. package/dist/core/autonomy/status.js.map +1 -0
  42. package/dist/core/autonomy/subagent-prompt.d.ts +21 -0
  43. package/dist/core/autonomy/subagent-prompt.d.ts.map +1 -0
  44. package/dist/core/autonomy/subagent-prompt.js +28 -0
  45. package/dist/core/autonomy/subagent-prompt.js.map +1 -0
  46. package/dist/core/autonomy/telemetry-events.d.ts +18 -0
  47. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -0
  48. package/dist/core/autonomy/telemetry-events.js +60 -0
  49. package/dist/core/autonomy/telemetry-events.js.map +1 -0
  50. package/dist/core/context/artifact-retrieval.d.ts +49 -0
  51. package/dist/core/context/artifact-retrieval.d.ts.map +1 -0
  52. package/dist/core/context/artifact-retrieval.js +49 -0
  53. package/dist/core/context/artifact-retrieval.js.map +1 -0
  54. package/dist/core/context/context-artifacts.d.ts +94 -0
  55. package/dist/core/context/context-artifacts.d.ts.map +1 -0
  56. package/dist/core/context/context-artifacts.js +307 -0
  57. package/dist/core/context/context-artifacts.js.map +1 -0
  58. package/dist/core/context/context-audit.d.ts +66 -0
  59. package/dist/core/context/context-audit.d.ts.map +1 -0
  60. package/dist/core/context/context-audit.js +173 -0
  61. package/dist/core/context/context-audit.js.map +1 -0
  62. package/dist/core/context/context-item.d.ts +117 -0
  63. package/dist/core/context/context-item.d.ts.map +1 -0
  64. package/dist/core/context/context-item.js +36 -0
  65. package/dist/core/context/context-item.js.map +1 -0
  66. package/dist/core/context/context-prompt-enforcement.d.ts +73 -0
  67. package/dist/core/context/context-prompt-enforcement.d.ts.map +1 -0
  68. package/dist/core/context/context-prompt-enforcement.js +153 -0
  69. package/dist/core/context/context-prompt-enforcement.js.map +1 -0
  70. package/dist/core/context/context-prompt-policy.d.ts +90 -0
  71. package/dist/core/context/context-prompt-policy.d.ts.map +1 -0
  72. package/dist/core/context/context-prompt-policy.js +73 -0
  73. package/dist/core/context/context-prompt-policy.js.map +1 -0
  74. package/dist/core/context/context-retention.d.ts +36 -0
  75. package/dist/core/context/context-retention.d.ts.map +1 -0
  76. package/dist/core/context/context-retention.js +108 -0
  77. package/dist/core/context/context-retention.js.map +1 -0
  78. package/dist/core/context/context-store.d.ts +37 -0
  79. package/dist/core/context/context-store.d.ts.map +1 -0
  80. package/dist/core/context/context-store.js +45 -0
  81. package/dist/core/context/context-store.js.map +1 -0
  82. package/dist/core/context/memory-diagnostics.d.ts +50 -0
  83. package/dist/core/context/memory-diagnostics.d.ts.map +1 -0
  84. package/dist/core/context/memory-diagnostics.js +43 -0
  85. package/dist/core/context/memory-diagnostics.js.map +1 -0
  86. package/dist/core/context/memory-index-store.d.ts +28 -0
  87. package/dist/core/context/memory-index-store.d.ts.map +1 -0
  88. package/dist/core/context/memory-index-store.js +38 -0
  89. package/dist/core/context/memory-index-store.js.map +1 -0
  90. package/dist/core/context/memory-prompt-block.d.ts +34 -0
  91. package/dist/core/context/memory-prompt-block.d.ts.map +1 -0
  92. package/dist/core/context/memory-prompt-block.js +58 -0
  93. package/dist/core/context/memory-prompt-block.js.map +1 -0
  94. package/dist/core/context/memory-provider-contract.d.ts +114 -0
  95. package/dist/core/context/memory-provider-contract.d.ts.map +1 -0
  96. package/dist/core/context/memory-provider-contract.js +121 -0
  97. package/dist/core/context/memory-provider-contract.js.map +1 -0
  98. package/dist/core/context/memory-retrieval.d.ts +27 -0
  99. package/dist/core/context/memory-retrieval.d.ts.map +1 -0
  100. package/dist/core/context/memory-retrieval.js +91 -0
  101. package/dist/core/context/memory-retrieval.js.map +1 -0
  102. package/dist/core/context/okf-memory-provider.d.ts +26 -0
  103. package/dist/core/context/okf-memory-provider.d.ts.map +1 -0
  104. package/dist/core/context/okf-memory-provider.js +154 -0
  105. package/dist/core/context/okf-memory-provider.js.map +1 -0
  106. package/dist/core/context/okf-memory.d.ts +42 -0
  107. package/dist/core/context/okf-memory.d.ts.map +1 -0
  108. package/dist/core/context/okf-memory.js +175 -0
  109. package/dist/core/context/okf-memory.js.map +1 -0
  110. package/dist/core/context/policy-engine.d.ts +66 -0
  111. package/dist/core/context/policy-engine.d.ts.map +1 -0
  112. package/dist/core/context/policy-engine.js +171 -0
  113. package/dist/core/context/policy-engine.js.map +1 -0
  114. package/dist/core/context/policy-types.d.ts +102 -0
  115. package/dist/core/context/policy-types.d.ts.map +1 -0
  116. package/dist/core/context/policy-types.js +7 -0
  117. package/dist/core/context/policy-types.js.map +1 -0
  118. package/dist/core/context/sqlite-runtime-index.d.ts +19 -0
  119. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -0
  120. package/dist/core/context/sqlite-runtime-index.js +344 -0
  121. package/dist/core/context/sqlite-runtime-index.js.map +1 -0
  122. package/dist/core/context/storage-authority.d.ts +20 -0
  123. package/dist/core/context/storage-authority.d.ts.map +1 -0
  124. package/dist/core/context/storage-authority.js +51 -0
  125. package/dist/core/context/storage-authority.js.map +1 -0
  126. package/dist/core/context/tool-output-packer.d.ts +75 -0
  127. package/dist/core/context/tool-output-packer.d.ts.map +1 -0
  128. package/dist/core/context/tool-output-packer.js +77 -0
  129. package/dist/core/context/tool-output-packer.js.map +1 -0
  130. package/dist/core/cost/session-usage.d.ts +20 -0
  131. package/dist/core/cost/session-usage.d.ts.map +1 -0
  132. package/dist/core/cost/session-usage.js +164 -0
  133. package/dist/core/cost/session-usage.js.map +1 -0
  134. package/dist/core/delegation/session-worker-result.d.ts +10 -0
  135. package/dist/core/delegation/session-worker-result.d.ts.map +1 -0
  136. package/dist/core/delegation/session-worker-result.js +36 -0
  137. package/dist/core/delegation/session-worker-result.js.map +1 -0
  138. package/dist/core/delegation/worker-result.d.ts +9 -0
  139. package/dist/core/delegation/worker-result.d.ts.map +1 -0
  140. package/dist/core/delegation/worker-result.js +152 -0
  141. package/dist/core/delegation/worker-result.js.map +1 -0
  142. package/dist/core/delegation/worker-runner.d.ts +58 -0
  143. package/dist/core/delegation/worker-runner.d.ts.map +1 -0
  144. package/dist/core/delegation/worker-runner.js +188 -0
  145. package/dist/core/delegation/worker-runner.js.map +1 -0
  146. package/dist/core/extensions/builtin.d.ts +5 -1
  147. package/dist/core/extensions/builtin.d.ts.map +1 -1
  148. package/dist/core/extensions/builtin.js +23 -1
  149. package/dist/core/extensions/builtin.js.map +1 -1
  150. package/dist/core/footer-data-provider.d.ts +5 -1
  151. package/dist/core/footer-data-provider.d.ts.map +1 -1
  152. package/dist/core/footer-data-provider.js +13 -0
  153. package/dist/core/footer-data-provider.js.map +1 -1
  154. package/dist/core/goals/goal-continuation-controller.d.ts +22 -0
  155. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -0
  156. package/dist/core/goals/goal-continuation-controller.js +88 -0
  157. package/dist/core/goals/goal-continuation-controller.js.map +1 -0
  158. package/dist/core/goals/goal-continuation-defaults.d.ts +10 -0
  159. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -0
  160. package/dist/core/goals/goal-continuation-defaults.js +10 -0
  161. package/dist/core/goals/goal-continuation-defaults.js.map +1 -0
  162. package/dist/core/goals/goal-continuation-prompt.d.ts +18 -0
  163. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -0
  164. package/dist/core/goals/goal-continuation-prompt.js +141 -0
  165. package/dist/core/goals/goal-continuation-prompt.js.map +1 -0
  166. package/dist/core/goals/goal-runtime-snapshot.d.ts +19 -0
  167. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -0
  168. package/dist/core/goals/goal-runtime-snapshot.js +23 -0
  169. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -0
  170. package/dist/core/goals/goal-state.d.ts +87 -0
  171. package/dist/core/goals/goal-state.d.ts.map +1 -0
  172. package/dist/core/goals/goal-state.js +259 -0
  173. package/dist/core/goals/goal-state.js.map +1 -0
  174. package/dist/core/goals/goal-tool-core.d.ts +66 -0
  175. package/dist/core/goals/goal-tool-core.d.ts.map +1 -0
  176. package/dist/core/goals/goal-tool-core.js +146 -0
  177. package/dist/core/goals/goal-tool-core.js.map +1 -0
  178. package/dist/core/goals/session-goal-state.d.ts +10 -0
  179. package/dist/core/goals/session-goal-state.d.ts.map +1 -0
  180. package/dist/core/goals/session-goal-state.js +35 -0
  181. package/dist/core/goals/session-goal-state.js.map +1 -0
  182. package/dist/core/learning/learning-audit.d.ts +45 -0
  183. package/dist/core/learning/learning-audit.d.ts.map +1 -0
  184. package/dist/core/learning/learning-audit.js +139 -0
  185. package/dist/core/learning/learning-audit.js.map +1 -0
  186. package/dist/core/learning/learning-gate.d.ts +29 -0
  187. package/dist/core/learning/learning-gate.d.ts.map +1 -0
  188. package/dist/core/learning/learning-gate.js +150 -0
  189. package/dist/core/learning/learning-gate.js.map +1 -0
  190. package/dist/core/learning/session-learning-decision.d.ts +10 -0
  191. package/dist/core/learning/session-learning-decision.d.ts.map +1 -0
  192. package/dist/core/learning/session-learning-decision.js +36 -0
  193. package/dist/core/learning/session-learning-decision.js.map +1 -0
  194. package/dist/core/model-capability.d.ts +41 -0
  195. package/dist/core/model-capability.d.ts.map +1 -0
  196. package/dist/core/model-capability.js +101 -0
  197. package/dist/core/model-capability.js.map +1 -0
  198. package/dist/core/model-router/config-diagnostics.d.ts.map +1 -1
  199. package/dist/core/model-router/config-diagnostics.js +1 -0
  200. package/dist/core/model-router/config-diagnostics.js.map +1 -1
  201. package/dist/core/model-router/intent-classifier.d.ts +2 -0
  202. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  203. package/dist/core/model-router/intent-classifier.js +154 -9
  204. package/dist/core/model-router/intent-classifier.js.map +1 -1
  205. package/dist/core/model-router/route-judge.d.ts +54 -0
  206. package/dist/core/model-router/route-judge.d.ts.map +1 -0
  207. package/dist/core/model-router/route-judge.js +128 -0
  208. package/dist/core/model-router/route-judge.js.map +1 -0
  209. package/dist/core/model-router/status.d.ts +4 -1
  210. package/dist/core/model-router/status.d.ts.map +1 -1
  211. package/dist/core/model-router/status.js +30 -6
  212. package/dist/core/model-router/status.js.map +1 -1
  213. package/dist/core/model-router/tool-escalation.d.ts +4 -6
  214. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  215. package/dist/core/model-router/tool-escalation.js +1 -1
  216. package/dist/core/model-router/tool-escalation.js.map +1 -1
  217. package/dist/core/models/fitness-store.d.ts +40 -0
  218. package/dist/core/models/fitness-store.d.ts.map +1 -0
  219. package/dist/core/models/fitness-store.js +61 -0
  220. package/dist/core/models/fitness-store.js.map +1 -0
  221. package/dist/core/profile-registry.d.ts.map +1 -1
  222. package/dist/core/profile-registry.js +1 -1
  223. package/dist/core/profile-registry.js.map +1 -1
  224. package/dist/core/prompt-templates.d.ts +2 -0
  225. package/dist/core/prompt-templates.d.ts.map +1 -1
  226. package/dist/core/prompt-templates.js +12 -4
  227. package/dist/core/prompt-templates.js.map +1 -1
  228. package/dist/core/research/automata-provider.d.ts +5 -0
  229. package/dist/core/research/automata-provider.d.ts.map +1 -0
  230. package/dist/core/research/automata-provider.js +15 -0
  231. package/dist/core/research/automata-provider.js.map +1 -0
  232. package/dist/core/research/evidence-bundle.d.ts +10 -0
  233. package/dist/core/research/evidence-bundle.d.ts.map +1 -0
  234. package/dist/core/research/evidence-bundle.js +116 -0
  235. package/dist/core/research/evidence-bundle.js.map +1 -0
  236. package/dist/core/research/model-fitness.d.ts +79 -0
  237. package/dist/core/research/model-fitness.d.ts.map +1 -0
  238. package/dist/core/research/model-fitness.js +257 -0
  239. package/dist/core/research/model-fitness.js.map +1 -0
  240. package/dist/core/research/research-gate.d.ts +11 -0
  241. package/dist/core/research/research-gate.d.ts.map +1 -0
  242. package/dist/core/research/research-gate.js +82 -0
  243. package/dist/core/research/research-gate.js.map +1 -0
  244. package/dist/core/research/research-runner.d.ts +59 -0
  245. package/dist/core/research/research-runner.d.ts.map +1 -0
  246. package/dist/core/research/research-runner.js +155 -0
  247. package/dist/core/research/research-runner.js.map +1 -0
  248. package/dist/core/research/session-evidence-bundle.d.ts +11 -0
  249. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -0
  250. package/dist/core/research/session-evidence-bundle.js +55 -0
  251. package/dist/core/research/session-evidence-bundle.js.map +1 -0
  252. package/dist/core/resource-loader.d.ts.map +1 -1
  253. package/dist/core/resource-loader.js +4 -0
  254. package/dist/core/resource-loader.js.map +1 -1
  255. package/dist/core/settings-manager.d.ts +147 -4
  256. package/dist/core/settings-manager.d.ts.map +1 -1
  257. package/dist/core/settings-manager.js +285 -9
  258. package/dist/core/settings-manager.js.map +1 -1
  259. package/dist/core/skills.d.ts +4 -0
  260. package/dist/core/skills.d.ts.map +1 -1
  261. package/dist/core/skills.js +18 -6
  262. package/dist/core/skills.js.map +1 -1
  263. package/dist/core/slash-commands.d.ts.map +1 -1
  264. package/dist/core/slash-commands.js +4 -0
  265. package/dist/core/slash-commands.js.map +1 -1
  266. package/dist/core/toolkit/script-registry.d.ts +34 -0
  267. package/dist/core/toolkit/script-registry.d.ts.map +1 -0
  268. package/dist/core/toolkit/script-registry.js +71 -0
  269. package/dist/core/toolkit/script-registry.js.map +1 -0
  270. package/dist/core/toolkit/script-runner.d.ts +28 -0
  271. package/dist/core/toolkit/script-runner.d.ts.map +1 -0
  272. package/dist/core/toolkit/script-runner.js +48 -0
  273. package/dist/core/toolkit/script-runner.js.map +1 -0
  274. package/dist/core/tools/artifact-retrieve.d.ts +23 -0
  275. package/dist/core/tools/artifact-retrieve.d.ts.map +1 -0
  276. package/dist/core/tools/artifact-retrieve.js +110 -0
  277. package/dist/core/tools/artifact-retrieve.js.map +1 -0
  278. package/dist/core/tools/delegate.d.ts +32 -0
  279. package/dist/core/tools/delegate.d.ts.map +1 -0
  280. package/dist/core/tools/delegate.js +60 -0
  281. package/dist/core/tools/delegate.js.map +1 -0
  282. package/dist/core/tools/fff-search-backend.d.ts +103 -0
  283. package/dist/core/tools/fff-search-backend.d.ts.map +1 -0
  284. package/dist/core/tools/fff-search-backend.js +151 -0
  285. package/dist/core/tools/fff-search-backend.js.map +1 -0
  286. package/dist/core/tools/find.d.ts +21 -1
  287. package/dist/core/tools/find.d.ts.map +1 -1
  288. package/dist/core/tools/find.js +183 -10
  289. package/dist/core/tools/find.js.map +1 -1
  290. package/dist/core/tools/goal.d.ts +35 -0
  291. package/dist/core/tools/goal.d.ts.map +1 -0
  292. package/dist/core/tools/goal.js +122 -0
  293. package/dist/core/tools/goal.js.map +1 -0
  294. package/dist/core/tools/grep.d.ts +21 -1
  295. package/dist/core/tools/grep.d.ts.map +1 -1
  296. package/dist/core/tools/grep.js +272 -27
  297. package/dist/core/tools/grep.js.map +1 -1
  298. package/dist/core/tools/index.d.ts +4 -1
  299. package/dist/core/tools/index.d.ts.map +1 -1
  300. package/dist/core/tools/index.js +9 -0
  301. package/dist/core/tools/index.js.map +1 -1
  302. package/dist/core/tools/model-fitness.d.ts +30 -0
  303. package/dist/core/tools/model-fitness.d.ts.map +1 -0
  304. package/dist/core/tools/model-fitness.js +38 -0
  305. package/dist/core/tools/model-fitness.js.map +1 -0
  306. package/dist/core/tools/run-toolkit-script.d.ts +24 -0
  307. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -0
  308. package/dist/core/tools/run-toolkit-script.js +103 -0
  309. package/dist/core/tools/run-toolkit-script.js.map +1 -0
  310. package/dist/core/tools/search-router.d.ts +75 -0
  311. package/dist/core/tools/search-router.d.ts.map +1 -0
  312. package/dist/core/tools/search-router.js +85 -0
  313. package/dist/core/tools/search-router.js.map +1 -0
  314. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/footer.js +18 -16
  316. package/dist/modes/interactive/components/footer.js.map +1 -1
  317. package/dist/modes/interactive/components/settings-selector.d.ts +13 -1
  318. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/settings-selector.js +471 -11
  320. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  321. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  322. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  323. package/dist/modes/interactive/interactive-mode.js +217 -39
  324. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  325. package/dist/utils/tools-manager.d.ts +2 -0
  326. package/dist/utils/tools-manager.d.ts.map +1 -1
  327. package/dist/utils/tools-manager.js +154 -2
  328. package/dist/utils/tools-manager.js.map +1 -1
  329. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  330. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  331. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  332. package/examples/extensions/sandbox/package-lock.json +2 -2
  333. package/examples/extensions/sandbox/package.json +1 -1
  334. package/examples/extensions/with-deps/package-lock.json +2 -2
  335. package/examples/extensions/with-deps/package.json +1 -1
  336. package/npm-shrinkwrap.json +368 -12
  337. package/package.json +5 -4
@@ -6,11 +6,47 @@ import { basename, dirname, join, relative, resolve, sep } from "path";
6
6
  import lockfile from "proper-lockfile";
7
7
  import { CONFIG_DIR_NAME, getAgentDir, getProfilesDir } from "../config.js";
8
8
  import { normalizePath, resolvePath } from "../utils/paths.js";
9
+ import { DEFAULT_GOAL_AUTO_CONTINUE, DEFAULT_GOAL_AUTO_CONTINUE_DELAY_MS, DEFAULT_GOAL_CONTINUE_MAX_STALL_TURNS, DEFAULT_GOAL_CONTINUE_MAX_TURNS, DEFAULT_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES, MAX_GOAL_AUTO_CONTINUE_DELAY_MS, MAX_GOAL_CONTINUE_MAX_STALL_TURNS, MAX_GOAL_CONTINUE_MAX_TURNS, MAX_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES, } from "./goals/goal-continuation-defaults.js";
9
10
  import { DEFAULT_HTTP_IDLE_TIMEOUT_MS, parseHttpIdleTimeoutMs } from "./http-dispatcher.js";
10
11
  import { ProfileRegistry } from "./profile-registry.js";
11
12
  import { mergeResourceProfileMap } from "./resource-profile-blocks.js";
12
13
  import { validateSkillName } from "./skills.js";
13
- export const DEFAULT_AUTONOMY_MAX_STALL_TURNS = 20;
14
+ export const MEMORY_RETRIEVAL_MAX_RESULTS_MIN = 1;
15
+ export const MEMORY_RETRIEVAL_MAX_RESULTS_MAX = 20;
16
+ const MEMORY_RETRIEVAL_MAX_RESULTS_DEFAULT = 5;
17
+ function clampMemoryRetrievalMaxResults(value) {
18
+ return Math.min(MEMORY_RETRIEVAL_MAX_RESULTS_MAX, Math.max(MEMORY_RETRIEVAL_MAX_RESULTS_MIN, Math.trunc(value)));
19
+ }
20
+ export const DEFAULT_AUTONOMY_MAX_STALL_TURNS = DEFAULT_GOAL_CONTINUE_MAX_STALL_TURNS;
21
+ export const DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS = DEFAULT_GOAL_CONTINUE_MAX_TURNS;
22
+ export const DEFAULT_AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES = DEFAULT_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES;
23
+ export const DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE = DEFAULT_GOAL_AUTO_CONTINUE;
24
+ export const DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS = DEFAULT_GOAL_AUTO_CONTINUE_DELAY_MS;
25
+ export const DEFAULT_RESEARCH_LANE_ENABLED = false;
26
+ export const DEFAULT_RESEARCH_LANE_MAX_USD = 0.25;
27
+ export const DEFAULT_RESEARCH_LANE_MAX_SOURCES = 8;
28
+ export const DEFAULT_RESEARCH_LANE_MAX_FINDINGS = 10;
29
+ export const DEFAULT_RESEARCH_LANE_MAX_WALL_CLOCK_MS = 120_000;
30
+ export const DEFAULT_RESEARCH_LANE_IDLE_DELAY_MS = 0;
31
+ export const DEFAULT_RESEARCH_LANE_MAX_RUNS_PER_SESSION = 10;
32
+ export const MAX_RESEARCH_LANE_MAX_USD = 5;
33
+ export const MAX_RESEARCH_LANE_MAX_SOURCES = 32;
34
+ export const MAX_RESEARCH_LANE_MAX_FINDINGS = 50;
35
+ export const MAX_RESEARCH_LANE_MAX_WALL_CLOCK_MS = 3_600_000;
36
+ export const MAX_RESEARCH_LANE_IDLE_DELAY_MS = 300_000;
37
+ export const MAX_RESEARCH_LANE_MAX_RUNS_PER_SESSION = 100;
38
+ export const DEFAULT_WORKER_DELEGATION_ENABLED = false;
39
+ export const DEFAULT_WORKER_DELEGATION_MAX_USD = 0.5;
40
+ export const DEFAULT_WORKER_DELEGATION_MAX_WALL_CLOCK_MS = 120_000;
41
+ export const MAX_WORKER_DELEGATION_MAX_USD = 5;
42
+ export const MAX_WORKER_DELEGATION_MAX_WALL_CLOCK_MS = 3_600_000;
43
+ export const DEFAULT_LEARNING_POLICY_ENABLED = false;
44
+ export const DEFAULT_LEARNING_POLICY_AUTO_APPLY_ENABLED = false;
45
+ export const DEFAULT_LEARNING_POLICY_CONFIDENCE_THRESHOLD = 90;
46
+ export const DEFAULT_LEARNING_POLICY_MIN_OBSERVATIONS = 2;
47
+ export const DEFAULT_LEARNING_POLICY_ALLOWED_AUTO_APPLY_LAYERS = ["memory"];
48
+ export const DEFAULT_LEARNING_POLICY_REFLECTION_SOURCE_CONFIDENCE = 50;
49
+ export const DEFAULT_MODEL_CAPABILITY_MODE = "auto";
14
50
  /** Deep merge settings: project/overrides take precedence, nested objects merge recursively */
15
51
  function deepMergeSettings(base, overrides) {
16
52
  const result = { ...base };
@@ -145,6 +181,20 @@ function parseTimeoutSetting(value, settingName) {
145
181
  }
146
182
  return undefined;
147
183
  }
184
+ function sanitizeIntegerSetting(value, fallback, min, max) {
185
+ if (typeof value !== "number" || !Number.isInteger(value))
186
+ return fallback;
187
+ if (value < min || value > max)
188
+ return fallback;
189
+ return value;
190
+ }
191
+ function sanitizeNumberSetting(value, fallback, min, max) {
192
+ if (typeof value !== "number" || !Number.isFinite(value))
193
+ return fallback;
194
+ if (value < min || value > max)
195
+ return fallback;
196
+ return value;
197
+ }
148
198
  const VALID_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
149
199
  function isThinkingLevel(value) {
150
200
  return typeof value === "string" && VALID_THINKING_LEVELS.includes(value);
@@ -185,7 +235,7 @@ function normalizeModelRouterSettings(value) {
185
235
  const settings = {};
186
236
  if (typeof input.enabled === "boolean")
187
237
  settings.enabled = input.enabled;
188
- for (const key of ["cheapModel", "expensiveModel", "learningModel"]) {
238
+ for (const key of ["cheapModel", "mediumModel", "expensiveModel", "learningModel"]) {
189
239
  const candidate = input[key];
190
240
  if (typeof candidate !== "string")
191
241
  continue;
@@ -579,11 +629,24 @@ export class SettingsManager {
579
629
  const profileFilter = {};
580
630
  const seenProfiles = new Set();
581
631
  const registry = this.getProfileRegistry();
582
- for (const profileName of this.getActiveResourceProfileNames()) {
632
+ const activeProfileNames = this.getActiveResourceProfileNames();
633
+ let kindMentionedByProfile = false;
634
+ for (const profileName of activeProfileNames) {
583
635
  if (seenProfiles.has(profileName))
584
636
  continue;
585
637
  seenProfiles.add(profileName);
586
- appendFilter(profileFilter, registry.getProfile(profileName)?.resources[kind]);
638
+ const kindFilter = registry.getProfile(profileName)?.resources[kind];
639
+ if (kindFilter && ((kindFilter.allow?.length ?? 0) > 0 || (kindFilter.block?.length ?? 0) > 0)) {
640
+ kindMentionedByProfile = true;
641
+ }
642
+ appendFilter(profileFilter, kindFilter);
643
+ }
644
+ // Strict UAC: an active profile set is the COMPLETE grant. An authority-bearing kind that no
645
+ // active profile explicitly mentions is denied outright — grant-all must be said out loud
646
+ // via `allow: ["*"]`. Themes are exempt (cosmetic, no authority). With no active profile,
647
+ // behavior is unchanged: profiles are the opt-in least-privilege boundary.
648
+ if (activeProfileNames.length > 0 && kind !== "themes" && !kindMentionedByProfile) {
649
+ return { allow: [], block: ["*"] };
587
650
  }
588
651
  const filter = mergeResourceProfileFilters(legacyFilter, profileFilter);
589
652
  return {
@@ -1354,6 +1417,8 @@ export class SettingsManager {
1354
1417
  merged.enabled = router.enabled;
1355
1418
  if (router.cheapModel !== undefined)
1356
1419
  merged.cheapModel = router.cheapModel;
1420
+ if (router.mediumModel !== undefined)
1421
+ merged.mediumModel = router.mediumModel;
1357
1422
  if (router.expensiveModel !== undefined)
1358
1423
  merged.expensiveModel = router.expensiveModel;
1359
1424
  if (router.learningModel !== undefined)
@@ -1366,22 +1431,31 @@ export class SettingsManager {
1366
1431
  const settings = {
1367
1432
  enabled: this.settings.modelRouter?.enabled ?? false,
1368
1433
  cheapModel: this.settings.modelRouter?.cheapModel?.trim() || undefined,
1434
+ mediumModel: this.settings.modelRouter?.mediumModel?.trim() || undefined,
1369
1435
  expensiveModel: this.settings.modelRouter?.expensiveModel?.trim() || undefined,
1370
1436
  learningModel: this.settings.modelRouter?.learningModel?.trim() || undefined,
1437
+ judgeEnabled: this.settings.modelRouter?.judgeEnabled ?? true,
1438
+ judgeModel: this.settings.modelRouter?.judgeModel?.trim() || undefined,
1371
1439
  };
1372
1440
  return {
1373
1441
  enabled: profileSettings?.enabled ?? settings.enabled,
1374
1442
  cheapModel: profileSettings?.cheapModel?.trim() || settings.cheapModel,
1443
+ mediumModel: profileSettings?.mediumModel?.trim() || settings.mediumModel,
1375
1444
  expensiveModel: profileSettings?.expensiveModel?.trim() || settings.expensiveModel,
1376
1445
  learningModel: profileSettings?.learningModel?.trim() || settings.learningModel,
1446
+ judgeEnabled: profileSettings?.judgeEnabled ?? settings.judgeEnabled,
1447
+ judgeModel: profileSettings?.judgeModel?.trim() || settings.judgeModel,
1377
1448
  };
1378
1449
  }
1379
1450
  setModelRouterSettings(settings, scope = "global") {
1380
1451
  const normalized = {
1381
1452
  enabled: settings.enabled ?? false,
1382
1453
  cheapModel: settings.cheapModel?.trim() || undefined,
1454
+ mediumModel: settings.mediumModel?.trim() || undefined,
1383
1455
  expensiveModel: settings.expensiveModel?.trim() || undefined,
1384
1456
  learningModel: settings.learningModel?.trim() || undefined,
1457
+ judgeEnabled: settings.judgeEnabled ?? true,
1458
+ judgeModel: settings.judgeModel?.trim() || undefined,
1385
1459
  };
1386
1460
  if (scope === "project") {
1387
1461
  const projectSettings = structuredClone(this.projectSettings);
@@ -1439,6 +1513,10 @@ export class SettingsManager {
1439
1513
  preserveRecentPages: this.settings.contextGc?.semanticMemory?.preserveRecentPages ?? 1,
1440
1514
  minChars: this.settings.contextGc?.semanticMemory?.minChars ?? 900,
1441
1515
  markers: this.settings.contextGc?.semanticMemory?.markers ?? [
1516
+ // Generic recall-page marker the bundled default provider (transcript-recall)
1517
+ // emits; must be present here because a non-empty settings list fully replaces
1518
+ // the context-gc code default that already includes it.
1519
+ "<memory_context",
1442
1520
  "<automata_context",
1443
1521
  "<automata_response",
1444
1522
  "<automata_query",
@@ -1452,6 +1530,49 @@ export class SettingsManager {
1452
1530
  },
1453
1531
  };
1454
1532
  }
1533
+ getContextPromptEnforcementSettings() {
1534
+ return {
1535
+ enabled: this.settings.contextPolicy?.enforcement?.enabled ?? false,
1536
+ preserveRecentMessages: this.settings.contextPolicy?.enforcement?.preserveRecentMessages ?? 8,
1537
+ minChars: this.settings.contextPolicy?.enforcement?.minChars ?? 1200,
1538
+ };
1539
+ }
1540
+ setContextPromptEnforcementSettings(settings, scope = "global") {
1541
+ if (scope === "project") {
1542
+ const projectSettings = structuredClone(this.projectSettings);
1543
+ projectSettings.contextPolicy = { ...projectSettings.contextPolicy, enforcement: { ...settings } };
1544
+ this.markProjectModified("contextPolicy");
1545
+ this.saveProjectSettings(projectSettings);
1546
+ return;
1547
+ }
1548
+ this.globalSettings.contextPolicy = { ...this.globalSettings.contextPolicy, enforcement: { ...settings } };
1549
+ this.markModified("contextPolicy");
1550
+ this.save();
1551
+ }
1552
+ getMemoryRetrievalSettings() {
1553
+ return {
1554
+ enabled: this.settings.contextPolicy?.memory?.enabled ?? false,
1555
+ maxResults: clampMemoryRetrievalMaxResults(this.settings.contextPolicy?.memory?.maxResults ?? MEMORY_RETRIEVAL_MAX_RESULTS_DEFAULT),
1556
+ includeInPrompt: this.settings.contextPolicy?.memory?.includeInPrompt ?? false,
1557
+ };
1558
+ }
1559
+ setMemoryRetrievalSettings(settings, scope = "global") {
1560
+ const normalized = {
1561
+ enabled: settings.enabled,
1562
+ maxResults: settings.maxResults === undefined ? undefined : clampMemoryRetrievalMaxResults(settings.maxResults),
1563
+ includeInPrompt: settings.includeInPrompt,
1564
+ };
1565
+ if (scope === "project") {
1566
+ const projectSettings = structuredClone(this.projectSettings);
1567
+ projectSettings.contextPolicy = { ...projectSettings.contextPolicy, memory: normalized };
1568
+ this.markProjectModified("contextPolicy");
1569
+ this.saveProjectSettings(projectSettings);
1570
+ return;
1571
+ }
1572
+ this.globalSettings.contextPolicy = { ...this.globalSettings.contextPolicy, memory: normalized };
1573
+ this.markModified("contextPolicy");
1574
+ this.save();
1575
+ }
1455
1576
  getBranchSummarySettings() {
1456
1577
  return {
1457
1578
  reserveTokens: this.settings.branchSummary?.reserveTokens ?? 16384,
@@ -1798,11 +1919,25 @@ export class SettingsManager {
1798
1919
  }
1799
1920
  getAutonomySettings() {
1800
1921
  const mode = this.settings.autonomy?.mode;
1801
- const configuredRounds = this.settings.autonomy?.maxStallTurns;
1802
- const maxStallTurns = typeof configuredRounds === "number" && Number.isInteger(configuredRounds) && configuredRounds >= 0
1803
- ? configuredRounds
1804
- : DEFAULT_AUTONOMY_MAX_STALL_TURNS;
1805
- return { mode: mode === "safe" || mode === "balanced" || mode === "full" ? mode : "off", maxStallTurns };
1922
+ const configuredMaxStallTurns = this.settings.autonomy?.maxStallTurns;
1923
+ const configuredGoalContinueTurns = this.settings.autonomy?.goalContinueTurns;
1924
+ const configuredGoalContinueMaxWallClockMinutes = this.settings.autonomy?.goalContinueMaxWallClockMinutes;
1925
+ const configuredGoalAutoContinue = this.settings.autonomy?.goalAutoContinue;
1926
+ const configuredGoalAutoContinueDelayMs = this.settings.autonomy?.goalAutoContinueDelayMs;
1927
+ const maxStallTurns = sanitizeIntegerSetting(configuredMaxStallTurns, DEFAULT_AUTONOMY_MAX_STALL_TURNS, 0, MAX_GOAL_CONTINUE_MAX_STALL_TURNS);
1928
+ const goalContinueTurns = sanitizeIntegerSetting(configuredGoalContinueTurns, DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS, 1, MAX_GOAL_CONTINUE_MAX_TURNS);
1929
+ const goalContinueMaxWallClockMinutes = sanitizeIntegerSetting(configuredGoalContinueMaxWallClockMinutes, DEFAULT_AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES, 0, MAX_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES);
1930
+ const goalAutoContinueDelayMs = sanitizeIntegerSetting(configuredGoalAutoContinueDelayMs, DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS, 0, MAX_GOAL_AUTO_CONTINUE_DELAY_MS);
1931
+ return {
1932
+ mode: mode === "safe" || mode === "balanced" || mode === "full" ? mode : "off",
1933
+ maxStallTurns,
1934
+ goalContinueTurns,
1935
+ goalContinueMaxWallClockMinutes,
1936
+ goalAutoContinue: typeof configuredGoalAutoContinue === "boolean"
1937
+ ? configuredGoalAutoContinue
1938
+ : DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE,
1939
+ goalAutoContinueDelayMs,
1940
+ };
1806
1941
  }
1807
1942
  setAutonomySettings(settings, scope = "global") {
1808
1943
  if (scope === "project") {
@@ -1816,6 +1951,147 @@ export class SettingsManager {
1816
1951
  this.markModified("autonomy");
1817
1952
  this.save();
1818
1953
  }
1954
+ getResearchLaneSettings() {
1955
+ const configured = this.settings.researchLane ?? {};
1956
+ const resolved = {
1957
+ enabled: typeof configured.enabled === "boolean" ? configured.enabled : DEFAULT_RESEARCH_LANE_ENABLED,
1958
+ maxUsd: sanitizeNumberSetting(configured.maxUsd, DEFAULT_RESEARCH_LANE_MAX_USD, 0, MAX_RESEARCH_LANE_MAX_USD),
1959
+ maxSources: sanitizeIntegerSetting(configured.maxSources, DEFAULT_RESEARCH_LANE_MAX_SOURCES, 1, MAX_RESEARCH_LANE_MAX_SOURCES),
1960
+ maxFindings: sanitizeIntegerSetting(configured.maxFindings, DEFAULT_RESEARCH_LANE_MAX_FINDINGS, 1, MAX_RESEARCH_LANE_MAX_FINDINGS),
1961
+ maxWallClockMs: sanitizeIntegerSetting(configured.maxWallClockMs, DEFAULT_RESEARCH_LANE_MAX_WALL_CLOCK_MS, 0, MAX_RESEARCH_LANE_MAX_WALL_CLOCK_MS),
1962
+ idleDelayMs: sanitizeIntegerSetting(configured.idleDelayMs, DEFAULT_RESEARCH_LANE_IDLE_DELAY_MS, 0, MAX_RESEARCH_LANE_IDLE_DELAY_MS),
1963
+ maxRunsPerSession: sanitizeIntegerSetting(configured.maxRunsPerSession, DEFAULT_RESEARCH_LANE_MAX_RUNS_PER_SESSION, 0, MAX_RESEARCH_LANE_MAX_RUNS_PER_SESSION),
1964
+ };
1965
+ if (typeof configured.model === "string" && configured.model.trim().length > 0) {
1966
+ resolved.model = configured.model;
1967
+ }
1968
+ if (typeof configured.profile === "string" && configured.profile.trim().length > 0) {
1969
+ resolved.profile = configured.profile;
1970
+ }
1971
+ if (typeof configured.systemPrompt === "string" && configured.systemPrompt.trim().length > 0) {
1972
+ resolved.systemPrompt = configured.systemPrompt;
1973
+ }
1974
+ return resolved;
1975
+ }
1976
+ setResearchLaneSettings(settings, scope = "global") {
1977
+ if (scope === "project") {
1978
+ const projectSettings = structuredClone(this.projectSettings);
1979
+ projectSettings.researchLane = { ...settings };
1980
+ this.markProjectModified("researchLane");
1981
+ this.saveProjectSettings(projectSettings);
1982
+ return;
1983
+ }
1984
+ this.globalSettings.researchLane = { ...settings };
1985
+ this.markModified("researchLane");
1986
+ this.save();
1987
+ }
1988
+ getWorkerDelegationSettings() {
1989
+ const configured = this.settings.workerDelegation ?? {};
1990
+ const resolved = {
1991
+ enabled: typeof configured.enabled === "boolean" ? configured.enabled : DEFAULT_WORKER_DELEGATION_ENABLED,
1992
+ maxUsd: sanitizeNumberSetting(configured.maxUsd, DEFAULT_WORKER_DELEGATION_MAX_USD, 0, MAX_WORKER_DELEGATION_MAX_USD),
1993
+ maxWallClockMs: sanitizeIntegerSetting(configured.maxWallClockMs, DEFAULT_WORKER_DELEGATION_MAX_WALL_CLOCK_MS, 0, MAX_WORKER_DELEGATION_MAX_WALL_CLOCK_MS),
1994
+ };
1995
+ if (typeof configured.model === "string" && configured.model.trim().length > 0) {
1996
+ resolved.model = configured.model;
1997
+ }
1998
+ if (typeof configured.profile === "string" && configured.profile.trim().length > 0) {
1999
+ resolved.profile = configured.profile;
2000
+ }
2001
+ if (typeof configured.systemPrompt === "string" && configured.systemPrompt.trim().length > 0) {
2002
+ resolved.systemPrompt = configured.systemPrompt;
2003
+ }
2004
+ return resolved;
2005
+ }
2006
+ setWorkerDelegationSettings(settings, scope = "global") {
2007
+ if (scope === "project") {
2008
+ const projectSettings = structuredClone(this.projectSettings);
2009
+ projectSettings.workerDelegation = { ...settings };
2010
+ this.markProjectModified("workerDelegation");
2011
+ this.saveProjectSettings(projectSettings);
2012
+ return;
2013
+ }
2014
+ this.globalSettings.workerDelegation = { ...settings };
2015
+ this.markModified("workerDelegation");
2016
+ this.save();
2017
+ }
2018
+ getLearningPolicySettings() {
2019
+ const configured = this.settings.learningPolicy ?? {};
2020
+ const allowedLayers = Array.isArray(configured.allowedAutoApplyLayers)
2021
+ ? configured.allowedAutoApplyLayers.filter((layer) => typeof layer === "string" &&
2022
+ ["memory", "skill", "prompt", "extension", "tool", "script", "settings", "source"].includes(layer))
2023
+ : [...DEFAULT_LEARNING_POLICY_ALLOWED_AUTO_APPLY_LAYERS];
2024
+ return {
2025
+ enabled: typeof configured.enabled === "boolean" ? configured.enabled : DEFAULT_LEARNING_POLICY_ENABLED,
2026
+ autoApplyEnabled: typeof configured.autoApplyEnabled === "boolean"
2027
+ ? configured.autoApplyEnabled
2028
+ : DEFAULT_LEARNING_POLICY_AUTO_APPLY_ENABLED,
2029
+ confidenceThreshold: sanitizeIntegerSetting(configured.confidenceThreshold, DEFAULT_LEARNING_POLICY_CONFIDENCE_THRESHOLD, 0, 100),
2030
+ minObservations: sanitizeIntegerSetting(configured.minObservations, DEFAULT_LEARNING_POLICY_MIN_OBSERVATIONS, 0, 100),
2031
+ allowedAutoApplyLayers: allowedLayers,
2032
+ requireRollbackPlan: typeof configured.requireRollbackPlan === "boolean" ? configured.requireRollbackPlan : true,
2033
+ reflectionSourceConfidence: sanitizeIntegerSetting(configured.reflectionSourceConfidence, DEFAULT_LEARNING_POLICY_REFLECTION_SOURCE_CONFIDENCE, 0, 100),
2034
+ };
2035
+ }
2036
+ getToolkitScripts() {
2037
+ const configured = this.settings.toolkit?.scripts;
2038
+ if (!Array.isArray(configured))
2039
+ return [];
2040
+ return configured.filter((script) => Boolean(script) &&
2041
+ typeof script.name === "string" &&
2042
+ script.name.length > 0 &&
2043
+ typeof script.description === "string" &&
2044
+ typeof script.path === "string" &&
2045
+ (script.runner === "uv" || script.runner === "powershell" || script.runner === "bash"));
2046
+ }
2047
+ setToolkitSettings(settings, scope = "global") {
2048
+ if (scope === "project") {
2049
+ const projectSettings = structuredClone(this.projectSettings);
2050
+ projectSettings.toolkit = { ...settings };
2051
+ this.markProjectModified("toolkit");
2052
+ this.saveProjectSettings(projectSettings);
2053
+ return;
2054
+ }
2055
+ this.globalSettings.toolkit = { ...settings };
2056
+ this.markModified("toolkit");
2057
+ this.save();
2058
+ }
2059
+ getModelCapabilitySettings() {
2060
+ const configured = this.settings.modelCapability?.mode;
2061
+ const mode = configured === "auto" ||
2062
+ configured === "off" ||
2063
+ configured === "full" ||
2064
+ configured === "lean" ||
2065
+ configured === "minimal" ||
2066
+ configured === "chat"
2067
+ ? configured
2068
+ : DEFAULT_MODEL_CAPABILITY_MODE;
2069
+ return { mode };
2070
+ }
2071
+ setModelCapabilitySettings(settings, scope = "global") {
2072
+ if (scope === "project") {
2073
+ const projectSettings = structuredClone(this.projectSettings);
2074
+ projectSettings.modelCapability = { ...settings };
2075
+ this.markProjectModified("modelCapability");
2076
+ this.saveProjectSettings(projectSettings);
2077
+ return;
2078
+ }
2079
+ this.globalSettings.modelCapability = { ...settings };
2080
+ this.markModified("modelCapability");
2081
+ this.save();
2082
+ }
2083
+ setLearningPolicySettings(settings, scope = "global") {
2084
+ if (scope === "project") {
2085
+ const projectSettings = structuredClone(this.projectSettings);
2086
+ projectSettings.learningPolicy = { ...settings };
2087
+ this.markProjectModified("learningPolicy");
2088
+ this.saveProjectSettings(projectSettings);
2089
+ return;
2090
+ }
2091
+ this.globalSettings.learningPolicy = { ...settings };
2092
+ this.markModified("learningPolicy");
2093
+ this.save();
2094
+ }
1819
2095
  getAutoLearnSettings() {
1820
2096
  const settings = this.settings.autoLearn ?? {};
1821
2097
  return {