@caupulican/pi-adaptative 0.80.86 → 0.80.89

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 (353) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/dist/core/agent-session.d.ts +412 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +2053 -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/brain-curator.d.ts +88 -0
  55. package/dist/core/context/brain-curator.d.ts.map +1 -0
  56. package/dist/core/context/brain-curator.js +192 -0
  57. package/dist/core/context/brain-curator.js.map +1 -0
  58. package/dist/core/context/context-artifacts.d.ts +94 -0
  59. package/dist/core/context/context-artifacts.d.ts.map +1 -0
  60. package/dist/core/context/context-artifacts.js +307 -0
  61. package/dist/core/context/context-artifacts.js.map +1 -0
  62. package/dist/core/context/context-audit.d.ts +66 -0
  63. package/dist/core/context/context-audit.d.ts.map +1 -0
  64. package/dist/core/context/context-audit.js +173 -0
  65. package/dist/core/context/context-audit.js.map +1 -0
  66. package/dist/core/context/context-composition.d.ts +122 -0
  67. package/dist/core/context/context-composition.d.ts.map +1 -0
  68. package/dist/core/context/context-composition.js +163 -0
  69. package/dist/core/context/context-composition.js.map +1 -0
  70. package/dist/core/context/context-item.d.ts +117 -0
  71. package/dist/core/context/context-item.d.ts.map +1 -0
  72. package/dist/core/context/context-item.js +36 -0
  73. package/dist/core/context/context-item.js.map +1 -0
  74. package/dist/core/context/context-prompt-enforcement.d.ts +86 -0
  75. package/dist/core/context/context-prompt-enforcement.d.ts.map +1 -0
  76. package/dist/core/context/context-prompt-enforcement.js +168 -0
  77. package/dist/core/context/context-prompt-enforcement.js.map +1 -0
  78. package/dist/core/context/context-prompt-policy.d.ts +90 -0
  79. package/dist/core/context/context-prompt-policy.d.ts.map +1 -0
  80. package/dist/core/context/context-prompt-policy.js +73 -0
  81. package/dist/core/context/context-prompt-policy.js.map +1 -0
  82. package/dist/core/context/context-retention.d.ts +36 -0
  83. package/dist/core/context/context-retention.d.ts.map +1 -0
  84. package/dist/core/context/context-retention.js +108 -0
  85. package/dist/core/context/context-retention.js.map +1 -0
  86. package/dist/core/context/context-store.d.ts +37 -0
  87. package/dist/core/context/context-store.d.ts.map +1 -0
  88. package/dist/core/context/context-store.js +45 -0
  89. package/dist/core/context/context-store.js.map +1 -0
  90. package/dist/core/context/memory-diagnostics.d.ts +50 -0
  91. package/dist/core/context/memory-diagnostics.d.ts.map +1 -0
  92. package/dist/core/context/memory-diagnostics.js +43 -0
  93. package/dist/core/context/memory-diagnostics.js.map +1 -0
  94. package/dist/core/context/memory-index-store.d.ts +28 -0
  95. package/dist/core/context/memory-index-store.d.ts.map +1 -0
  96. package/dist/core/context/memory-index-store.js +38 -0
  97. package/dist/core/context/memory-index-store.js.map +1 -0
  98. package/dist/core/context/memory-prompt-block.d.ts +34 -0
  99. package/dist/core/context/memory-prompt-block.d.ts.map +1 -0
  100. package/dist/core/context/memory-prompt-block.js +58 -0
  101. package/dist/core/context/memory-prompt-block.js.map +1 -0
  102. package/dist/core/context/memory-provider-contract.d.ts +114 -0
  103. package/dist/core/context/memory-provider-contract.d.ts.map +1 -0
  104. package/dist/core/context/memory-provider-contract.js +121 -0
  105. package/dist/core/context/memory-provider-contract.js.map +1 -0
  106. package/dist/core/context/memory-retrieval.d.ts +27 -0
  107. package/dist/core/context/memory-retrieval.d.ts.map +1 -0
  108. package/dist/core/context/memory-retrieval.js +91 -0
  109. package/dist/core/context/memory-retrieval.js.map +1 -0
  110. package/dist/core/context/okf-memory-provider.d.ts +26 -0
  111. package/dist/core/context/okf-memory-provider.d.ts.map +1 -0
  112. package/dist/core/context/okf-memory-provider.js +154 -0
  113. package/dist/core/context/okf-memory-provider.js.map +1 -0
  114. package/dist/core/context/okf-memory.d.ts +42 -0
  115. package/dist/core/context/okf-memory.d.ts.map +1 -0
  116. package/dist/core/context/okf-memory.js +175 -0
  117. package/dist/core/context/okf-memory.js.map +1 -0
  118. package/dist/core/context/policy-engine.d.ts +66 -0
  119. package/dist/core/context/policy-engine.d.ts.map +1 -0
  120. package/dist/core/context/policy-engine.js +171 -0
  121. package/dist/core/context/policy-engine.js.map +1 -0
  122. package/dist/core/context/policy-types.d.ts +102 -0
  123. package/dist/core/context/policy-types.d.ts.map +1 -0
  124. package/dist/core/context/policy-types.js +7 -0
  125. package/dist/core/context/policy-types.js.map +1 -0
  126. package/dist/core/context/sqlite-runtime-index.d.ts +19 -0
  127. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -0
  128. package/dist/core/context/sqlite-runtime-index.js +344 -0
  129. package/dist/core/context/sqlite-runtime-index.js.map +1 -0
  130. package/dist/core/context/storage-authority.d.ts +20 -0
  131. package/dist/core/context/storage-authority.d.ts.map +1 -0
  132. package/dist/core/context/storage-authority.js +51 -0
  133. package/dist/core/context/storage-authority.js.map +1 -0
  134. package/dist/core/context/tool-output-packer.d.ts +75 -0
  135. package/dist/core/context/tool-output-packer.d.ts.map +1 -0
  136. package/dist/core/context/tool-output-packer.js +77 -0
  137. package/dist/core/context/tool-output-packer.js.map +1 -0
  138. package/dist/core/context-gc.d.ts +13 -0
  139. package/dist/core/context-gc.d.ts.map +1 -1
  140. package/dist/core/context-gc.js +6 -0
  141. package/dist/core/context-gc.js.map +1 -1
  142. package/dist/core/cost/session-usage.d.ts +20 -0
  143. package/dist/core/cost/session-usage.d.ts.map +1 -0
  144. package/dist/core/cost/session-usage.js +164 -0
  145. package/dist/core/cost/session-usage.js.map +1 -0
  146. package/dist/core/delegation/session-worker-result.d.ts +10 -0
  147. package/dist/core/delegation/session-worker-result.d.ts.map +1 -0
  148. package/dist/core/delegation/session-worker-result.js +36 -0
  149. package/dist/core/delegation/session-worker-result.js.map +1 -0
  150. package/dist/core/delegation/worker-result.d.ts +9 -0
  151. package/dist/core/delegation/worker-result.d.ts.map +1 -0
  152. package/dist/core/delegation/worker-result.js +152 -0
  153. package/dist/core/delegation/worker-result.js.map +1 -0
  154. package/dist/core/delegation/worker-runner.d.ts +58 -0
  155. package/dist/core/delegation/worker-runner.d.ts.map +1 -0
  156. package/dist/core/delegation/worker-runner.js +188 -0
  157. package/dist/core/delegation/worker-runner.js.map +1 -0
  158. package/dist/core/extensions/builtin.d.ts +5 -1
  159. package/dist/core/extensions/builtin.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin.js +23 -1
  161. package/dist/core/extensions/builtin.js.map +1 -1
  162. package/dist/core/footer-data-provider.d.ts +5 -1
  163. package/dist/core/footer-data-provider.d.ts.map +1 -1
  164. package/dist/core/footer-data-provider.js +13 -0
  165. package/dist/core/footer-data-provider.js.map +1 -1
  166. package/dist/core/goals/goal-continuation-controller.d.ts +22 -0
  167. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -0
  168. package/dist/core/goals/goal-continuation-controller.js +88 -0
  169. package/dist/core/goals/goal-continuation-controller.js.map +1 -0
  170. package/dist/core/goals/goal-continuation-defaults.d.ts +10 -0
  171. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -0
  172. package/dist/core/goals/goal-continuation-defaults.js +10 -0
  173. package/dist/core/goals/goal-continuation-defaults.js.map +1 -0
  174. package/dist/core/goals/goal-continuation-prompt.d.ts +18 -0
  175. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -0
  176. package/dist/core/goals/goal-continuation-prompt.js +141 -0
  177. package/dist/core/goals/goal-continuation-prompt.js.map +1 -0
  178. package/dist/core/goals/goal-runtime-snapshot.d.ts +19 -0
  179. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -0
  180. package/dist/core/goals/goal-runtime-snapshot.js +23 -0
  181. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -0
  182. package/dist/core/goals/goal-state.d.ts +87 -0
  183. package/dist/core/goals/goal-state.d.ts.map +1 -0
  184. package/dist/core/goals/goal-state.js +259 -0
  185. package/dist/core/goals/goal-state.js.map +1 -0
  186. package/dist/core/goals/goal-tool-core.d.ts +66 -0
  187. package/dist/core/goals/goal-tool-core.d.ts.map +1 -0
  188. package/dist/core/goals/goal-tool-core.js +146 -0
  189. package/dist/core/goals/goal-tool-core.js.map +1 -0
  190. package/dist/core/goals/session-goal-state.d.ts +10 -0
  191. package/dist/core/goals/session-goal-state.d.ts.map +1 -0
  192. package/dist/core/goals/session-goal-state.js +35 -0
  193. package/dist/core/goals/session-goal-state.js.map +1 -0
  194. package/dist/core/learning/learning-audit.d.ts +45 -0
  195. package/dist/core/learning/learning-audit.d.ts.map +1 -0
  196. package/dist/core/learning/learning-audit.js +139 -0
  197. package/dist/core/learning/learning-audit.js.map +1 -0
  198. package/dist/core/learning/learning-gate.d.ts +29 -0
  199. package/dist/core/learning/learning-gate.d.ts.map +1 -0
  200. package/dist/core/learning/learning-gate.js +150 -0
  201. package/dist/core/learning/learning-gate.js.map +1 -0
  202. package/dist/core/learning/session-learning-decision.d.ts +10 -0
  203. package/dist/core/learning/session-learning-decision.d.ts.map +1 -0
  204. package/dist/core/learning/session-learning-decision.js +36 -0
  205. package/dist/core/learning/session-learning-decision.js.map +1 -0
  206. package/dist/core/model-capability.d.ts +41 -0
  207. package/dist/core/model-capability.d.ts.map +1 -0
  208. package/dist/core/model-capability.js +101 -0
  209. package/dist/core/model-capability.js.map +1 -0
  210. package/dist/core/model-router/config-diagnostics.d.ts.map +1 -1
  211. package/dist/core/model-router/config-diagnostics.js +1 -0
  212. package/dist/core/model-router/config-diagnostics.js.map +1 -1
  213. package/dist/core/model-router/intent-classifier.d.ts +2 -0
  214. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  215. package/dist/core/model-router/intent-classifier.js +154 -9
  216. package/dist/core/model-router/intent-classifier.js.map +1 -1
  217. package/dist/core/model-router/route-judge.d.ts +54 -0
  218. package/dist/core/model-router/route-judge.d.ts.map +1 -0
  219. package/dist/core/model-router/route-judge.js +128 -0
  220. package/dist/core/model-router/route-judge.js.map +1 -0
  221. package/dist/core/model-router/status.d.ts +4 -1
  222. package/dist/core/model-router/status.d.ts.map +1 -1
  223. package/dist/core/model-router/status.js +30 -6
  224. package/dist/core/model-router/status.js.map +1 -1
  225. package/dist/core/model-router/tool-escalation.d.ts +4 -6
  226. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  227. package/dist/core/model-router/tool-escalation.js +1 -1
  228. package/dist/core/model-router/tool-escalation.js.map +1 -1
  229. package/dist/core/models/fitness-store.d.ts +40 -0
  230. package/dist/core/models/fitness-store.d.ts.map +1 -0
  231. package/dist/core/models/fitness-store.js +61 -0
  232. package/dist/core/models/fitness-store.js.map +1 -0
  233. package/dist/core/profile-registry.d.ts.map +1 -1
  234. package/dist/core/profile-registry.js +1 -1
  235. package/dist/core/profile-registry.js.map +1 -1
  236. package/dist/core/prompt-templates.d.ts +2 -0
  237. package/dist/core/prompt-templates.d.ts.map +1 -1
  238. package/dist/core/prompt-templates.js +12 -4
  239. package/dist/core/prompt-templates.js.map +1 -1
  240. package/dist/core/research/automata-provider.d.ts +5 -0
  241. package/dist/core/research/automata-provider.d.ts.map +1 -0
  242. package/dist/core/research/automata-provider.js +15 -0
  243. package/dist/core/research/automata-provider.js.map +1 -0
  244. package/dist/core/research/evidence-bundle.d.ts +10 -0
  245. package/dist/core/research/evidence-bundle.d.ts.map +1 -0
  246. package/dist/core/research/evidence-bundle.js +116 -0
  247. package/dist/core/research/evidence-bundle.js.map +1 -0
  248. package/dist/core/research/model-fitness.d.ts +82 -0
  249. package/dist/core/research/model-fitness.d.ts.map +1 -0
  250. package/dist/core/research/model-fitness.js +308 -0
  251. package/dist/core/research/model-fitness.js.map +1 -0
  252. package/dist/core/research/research-gate.d.ts +11 -0
  253. package/dist/core/research/research-gate.d.ts.map +1 -0
  254. package/dist/core/research/research-gate.js +82 -0
  255. package/dist/core/research/research-gate.js.map +1 -0
  256. package/dist/core/research/research-runner.d.ts +59 -0
  257. package/dist/core/research/research-runner.d.ts.map +1 -0
  258. package/dist/core/research/research-runner.js +155 -0
  259. package/dist/core/research/research-runner.js.map +1 -0
  260. package/dist/core/research/session-evidence-bundle.d.ts +11 -0
  261. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -0
  262. package/dist/core/research/session-evidence-bundle.js +55 -0
  263. package/dist/core/research/session-evidence-bundle.js.map +1 -0
  264. package/dist/core/resource-loader.d.ts.map +1 -1
  265. package/dist/core/resource-loader.js +4 -0
  266. package/dist/core/resource-loader.js.map +1 -1
  267. package/dist/core/settings-manager.d.ts +160 -4
  268. package/dist/core/settings-manager.d.ts.map +1 -1
  269. package/dist/core/settings-manager.js +304 -9
  270. package/dist/core/settings-manager.js.map +1 -1
  271. package/dist/core/skills.d.ts +4 -0
  272. package/dist/core/skills.d.ts.map +1 -1
  273. package/dist/core/skills.js +18 -6
  274. package/dist/core/skills.js.map +1 -1
  275. package/dist/core/slash-commands.d.ts.map +1 -1
  276. package/dist/core/slash-commands.js +10 -1
  277. package/dist/core/slash-commands.js.map +1 -1
  278. package/dist/core/toolkit/script-registry.d.ts +34 -0
  279. package/dist/core/toolkit/script-registry.d.ts.map +1 -0
  280. package/dist/core/toolkit/script-registry.js +71 -0
  281. package/dist/core/toolkit/script-registry.js.map +1 -0
  282. package/dist/core/toolkit/script-runner.d.ts +28 -0
  283. package/dist/core/toolkit/script-runner.d.ts.map +1 -0
  284. package/dist/core/toolkit/script-runner.js +48 -0
  285. package/dist/core/toolkit/script-runner.js.map +1 -0
  286. package/dist/core/tools/artifact-retrieve.d.ts +23 -0
  287. package/dist/core/tools/artifact-retrieve.d.ts.map +1 -0
  288. package/dist/core/tools/artifact-retrieve.js +110 -0
  289. package/dist/core/tools/artifact-retrieve.js.map +1 -0
  290. package/dist/core/tools/delegate.d.ts +32 -0
  291. package/dist/core/tools/delegate.d.ts.map +1 -0
  292. package/dist/core/tools/delegate.js +60 -0
  293. package/dist/core/tools/delegate.js.map +1 -0
  294. package/dist/core/tools/fff-search-backend.d.ts +103 -0
  295. package/dist/core/tools/fff-search-backend.d.ts.map +1 -0
  296. package/dist/core/tools/fff-search-backend.js +151 -0
  297. package/dist/core/tools/fff-search-backend.js.map +1 -0
  298. package/dist/core/tools/find.d.ts +21 -1
  299. package/dist/core/tools/find.d.ts.map +1 -1
  300. package/dist/core/tools/find.js +183 -10
  301. package/dist/core/tools/find.js.map +1 -1
  302. package/dist/core/tools/goal.d.ts +35 -0
  303. package/dist/core/tools/goal.d.ts.map +1 -0
  304. package/dist/core/tools/goal.js +122 -0
  305. package/dist/core/tools/goal.js.map +1 -0
  306. package/dist/core/tools/grep.d.ts +21 -1
  307. package/dist/core/tools/grep.d.ts.map +1 -1
  308. package/dist/core/tools/grep.js +272 -27
  309. package/dist/core/tools/grep.js.map +1 -1
  310. package/dist/core/tools/index.d.ts +4 -1
  311. package/dist/core/tools/index.d.ts.map +1 -1
  312. package/dist/core/tools/index.js +9 -0
  313. package/dist/core/tools/index.js.map +1 -1
  314. package/dist/core/tools/model-fitness.d.ts +30 -0
  315. package/dist/core/tools/model-fitness.d.ts.map +1 -0
  316. package/dist/core/tools/model-fitness.js +38 -0
  317. package/dist/core/tools/model-fitness.js.map +1 -0
  318. package/dist/core/tools/run-toolkit-script.d.ts +24 -0
  319. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -0
  320. package/dist/core/tools/run-toolkit-script.js +103 -0
  321. package/dist/core/tools/run-toolkit-script.js.map +1 -0
  322. package/dist/core/tools/search-router.d.ts +75 -0
  323. package/dist/core/tools/search-router.d.ts.map +1 -0
  324. package/dist/core/tools/search-router.js +85 -0
  325. package/dist/core/tools/search-router.js.map +1 -0
  326. package/dist/modes/interactive/components/fitness-role-selector.d.ts +13 -0
  327. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -0
  328. package/dist/modes/interactive/components/fitness-role-selector.js +65 -0
  329. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -0
  330. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/footer.js +18 -16
  332. package/dist/modes/interactive/components/footer.js.map +1 -1
  333. package/dist/modes/interactive/components/settings-selector.d.ts +16 -1
  334. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/settings-selector.js +555 -11
  336. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  337. package/dist/modes/interactive/interactive-mode.d.ts +9 -0
  338. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +308 -39
  340. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  341. package/dist/utils/tools-manager.d.ts +2 -0
  342. package/dist/utils/tools-manager.d.ts.map +1 -1
  343. package/dist/utils/tools-manager.js +154 -2
  344. package/dist/utils/tools-manager.js.map +1 -1
  345. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  346. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  347. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  348. package/examples/extensions/sandbox/package-lock.json +2 -2
  349. package/examples/extensions/sandbox/package.json +1 -1
  350. package/examples/extensions/with-deps/package-lock.json +2 -2
  351. package/examples/extensions/with-deps/package.json +1 -1
  352. package/npm-shrinkwrap.json +368 -12
  353. package/package.json +5 -4
@@ -1,6 +1,6 @@
1
1
  import { Container, getCapabilities, getKeybindings, Input, SelectList, SettingsList, Spacer, Text, } from "@caupulican/pi-tui";
2
2
  import { formatHttpIdleTimeoutMs, HTTP_IDLE_TIMEOUT_CHOICES } from "../../../core/http-dispatcher.js";
3
- import { DEFAULT_AUTONOMY_MAX_STALL_TURNS } from "../../../core/settings-manager.js";
3
+ import { DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE, DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS, DEFAULT_AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES, DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS, DEFAULT_AUTONOMY_MAX_STALL_TURNS, DEFAULT_RESEARCH_LANE_ENABLED, DEFAULT_RESEARCH_LANE_IDLE_DELAY_MS, DEFAULT_RESEARCH_LANE_MAX_RUNS_PER_SESSION, DEFAULT_RESEARCH_LANE_MAX_USD, DEFAULT_RESEARCH_LANE_MAX_WALL_CLOCK_MS, DEFAULT_WORKER_DELEGATION_ENABLED, DEFAULT_WORKER_DELEGATION_MAX_USD, DEFAULT_WORKER_DELEGATION_MAX_WALL_CLOCK_MS, } from "../../../core/settings-manager.js";
4
4
  import { getSelectListTheme, getSettingsListTheme, theme } from "../theme/theme.js";
5
5
  import { DynamicBorder } from "./dynamic-border.js";
6
6
  import { keyDisplayText } from "./keybinding-hints.js";
@@ -19,7 +19,27 @@ const THINKING_DESCRIPTIONS = {
19
19
  xhigh: "Maximum reasoning (~32k tokens)",
20
20
  };
21
21
  const AUTONOMY_MODES = ["off", "safe", "balanced", "full"];
22
- const AUTONOMY_MAX_STALL_TURN_VALUES = ["0", "5", "10", "20", "30", "50"];
22
+ const AUTONOMY_GOAL_CONTINUE_TURN_VALUES = ["1", "3", "5", "10", "20"];
23
+ const AUTONOMY_MAX_STALL_TURN_VALUES = ["0", "5", "10", "20", "30", "50", "100"];
24
+ const AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTE_VALUES = ["0", "15", "30", "60", "120", "240", "480", "1440"];
25
+ const AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS_VALUES = ["0", "250", "1000", "5000", "30000", "60000"];
26
+ const RESEARCH_LANE_MAX_USD_VALUES = ["0.05", "0.1", "0.25", "0.5", "1", "2"];
27
+ const RESEARCH_LANE_MAX_WALL_CLOCK_MS_VALUES = ["0", "30000", "60000", "120000", "300000", "600000"];
28
+ const RESEARCH_LANE_IDLE_DELAY_MS_VALUES = ["0", "250", "1000", "5000", "30000", "60000"];
29
+ const RESEARCH_LANE_MAX_RUNS_PER_SESSION_VALUES = ["0", "1", "3", "5", "10", "25", "50"];
30
+ const CONTEXT_POLICY_PRESERVE_RECENT_MESSAGES_VALUES = ["2", "4", "8", "16", "32"];
31
+ const CONTEXT_POLICY_MIN_CHARS_VALUES = ["300", "600", "1200", "2400", "4800"];
32
+ const CONTEXT_POLICY_ENFORCEMENT_DEFAULTS = {
33
+ enabled: false,
34
+ preserveRecentMessages: 8,
35
+ minChars: 1200,
36
+ };
37
+ const CONTEXT_MEMORY_RETRIEVAL_MAX_RESULTS_VALUES = ["1", "3", "5", "10", "20"];
38
+ const CONTEXT_MEMORY_RETRIEVAL_DEFAULTS = {
39
+ enabled: false,
40
+ maxResults: 5,
41
+ includeInPrompt: false,
42
+ };
23
43
  const AUTO_LEARN_DEFAULTS = {
24
44
  model: "active",
25
45
  longSessionMessages: 32,
@@ -61,20 +81,65 @@ function autonomyModeValue(settings) {
61
81
  }
62
82
  function autonomySummary(settings) {
63
83
  const mode = autonomyModeValue(settings);
64
- const rounds = settings.maxStallTurns ?? DEFAULT_AUTONOMY_MAX_STALL_TURNS;
84
+ const turns = settings.goalContinueTurns ?? DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS;
85
+ const stall = settings.maxStallTurns ?? DEFAULT_AUTONOMY_MAX_STALL_TURNS;
86
+ const autoContinue = settings.goalAutoContinue ?? DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE;
65
87
  const modeLabel = mode === "full" ? "standing autonomy" : mode;
66
- return `${modeLabel}, ${rounds} rounds`;
88
+ return `${modeLabel}, ${turns} turns, stall ${stall}, auto ${autoContinue ? "on" : "off"}`;
89
+ }
90
+ function autonomyGoalContinueTurnsValue(settings) {
91
+ return String(settings.goalContinueTurns ?? DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS);
67
92
  }
68
93
  function autonomyMaxStallTurnsValue(settings) {
69
- const rounds = settings.maxStallTurns ?? DEFAULT_AUTONOMY_MAX_STALL_TURNS;
70
- return String(rounds);
94
+ return String(settings.maxStallTurns ?? DEFAULT_AUTONOMY_MAX_STALL_TURNS);
95
+ }
96
+ function autonomyGoalContinueMaxWallClockMinutesValue(settings) {
97
+ return String(settings.goalContinueMaxWallClockMinutes ?? DEFAULT_AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES);
98
+ }
99
+ function autonomyGoalAutoContinueValue(settings) {
100
+ return String(settings.goalAutoContinue ?? DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE);
101
+ }
102
+ function autonomyGoalAutoContinueDelayMsValue(settings) {
103
+ return String(settings.goalAutoContinueDelayMs ?? DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS);
104
+ }
105
+ function researchLaneSummary(settings) {
106
+ if (!(settings.enabled ?? DEFAULT_RESEARCH_LANE_ENABLED))
107
+ return "disabled";
108
+ const maxUsd = settings.maxUsd ?? DEFAULT_RESEARCH_LANE_MAX_USD;
109
+ const maxRuns = settings.maxRunsPerSession ?? DEFAULT_RESEARCH_LANE_MAX_RUNS_PER_SESSION;
110
+ return `enabled ($${maxUsd}/pass, ${maxRuns} runs/session)`;
111
+ }
112
+ function contextCurationSummary(settings) {
113
+ if (!settings.enabled)
114
+ return "disabled";
115
+ return `on · ${settings.model ?? "no model"} · ${settings.maxJobsPerTurn ?? 4} jobs/turn`;
116
+ }
117
+ function workerDelegationSummary(settings) {
118
+ if (!(settings.enabled ?? DEFAULT_WORKER_DELEGATION_ENABLED))
119
+ return "disabled";
120
+ const maxUsd = settings.maxUsd ?? DEFAULT_WORKER_DELEGATION_MAX_USD;
121
+ return `enabled ($${maxUsd}/worker)`;
71
122
  }
72
123
  function autoLearnSummary(settings) {
73
124
  return settings.enabled ? `enabled (${autoLearnModelValue(settings)})` : "disabled";
74
125
  }
126
+ function contextPolicyEnforcementSummary(settings) {
127
+ if (!(settings.enabled ?? CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.enabled))
128
+ return "disabled";
129
+ const preserve = settings.preserveRecentMessages ?? CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.preserveRecentMessages;
130
+ const minChars = settings.minChars ?? CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.minChars;
131
+ return `enabled (preserve ${preserve}, min ${minChars} chars)`;
132
+ }
133
+ function contextMemoryRetrievalSummary(settings) {
134
+ if (!(settings.enabled ?? CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.enabled))
135
+ return "disabled";
136
+ const maxResults = settings.maxResults ?? CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.maxResults;
137
+ const includeInPrompt = settings.includeInPrompt ?? CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.includeInPrompt;
138
+ return `enabled (max ${maxResults} results${includeInPrompt ? ", in prompt" : ""})`;
139
+ }
75
140
  function modelRouterSummary(settings) {
76
141
  const state = settings.enabled ? "enabled" : "disabled";
77
- return `${state} · cheap: ${optionalStringValue(settings.cheapModel)} · expensive: ${optionalStringValue(settings.expensiveModel)} · learn: ${optionalStringValue(settings.learningModel, "active")}`;
142
+ return `${state} · cheap: ${optionalStringValue(settings.cheapModel)} · medium: ${optionalStringValue(settings.mediumModel)} · expensive: ${optionalStringValue(settings.expensiveModel)} · learn: ${optionalStringValue(settings.learningModel, "active")}`;
78
143
  }
79
144
  function buildAutoLearnModelOptions(settings, configuredModelOptions, currentModelPattern) {
80
145
  const currentValue = autoLearnModelValue(settings);
@@ -305,6 +370,10 @@ class AutonomySettingsSubmenu extends Container {
305
370
  this.state = {
306
371
  mode: autonomyModeValue(settings),
307
372
  maxStallTurns: settings.maxStallTurns ?? DEFAULT_AUTONOMY_MAX_STALL_TURNS,
373
+ goalContinueTurns: settings.goalContinueTurns ?? DEFAULT_AUTONOMY_GOAL_CONTINUE_TURNS,
374
+ goalContinueMaxWallClockMinutes: settings.goalContinueMaxWallClockMinutes ?? DEFAULT_AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTES,
375
+ goalAutoContinue: settings.goalAutoContinue ?? DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE,
376
+ goalAutoContinueDelayMs: settings.goalAutoContinueDelayMs ?? DEFAULT_AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS,
308
377
  };
309
378
  this.scope = scope;
310
379
  const items = [
@@ -323,12 +392,40 @@ class AutonomySettingsSubmenu extends Container {
323
392
  values: AUTONOMY_MODES,
324
393
  },
325
394
  {
326
- id: "autonomy-goal-loop-rounds",
327
- label: "Goal loop rounds",
328
- description: "Maximum provider rounds in one foreground goal loop before Pi stops continuing",
395
+ id: "autonomy-goal-auto-continue",
396
+ label: "Goal auto-continue",
397
+ description: "Inject bounded continuation prompts when Pi becomes idle with an active open goal",
398
+ currentValue: autonomyGoalAutoContinueValue(this.state),
399
+ values: ["true", "false"],
400
+ },
401
+ {
402
+ id: "autonomy-goal-continue-turns",
403
+ label: "Goal turns",
404
+ description: "Maximum continuation prompts in one idle or explicit goal loop",
405
+ currentValue: autonomyGoalContinueTurnsValue(this.state),
406
+ values: AUTONOMY_GOAL_CONTINUE_TURN_VALUES,
407
+ },
408
+ {
409
+ id: "autonomy-max-stall-turns",
410
+ label: "Goal stall limit",
411
+ description: "Maximum no-progress rounds before Pi stops continuing and asks the user",
329
412
  currentValue: autonomyMaxStallTurnsValue(this.state),
330
413
  values: AUTONOMY_MAX_STALL_TURN_VALUES,
331
414
  },
415
+ {
416
+ id: "autonomy-goal-wall-clock-minutes",
417
+ label: "Goal max minutes",
418
+ description: "Wall-clock budget per goal continuation loop; 0 disables the time budget",
419
+ currentValue: autonomyGoalContinueMaxWallClockMinutesValue(this.state),
420
+ values: AUTONOMY_GOAL_CONTINUE_MAX_WALL_CLOCK_MINUTE_VALUES,
421
+ },
422
+ {
423
+ id: "autonomy-goal-auto-continue-delay-ms",
424
+ label: "Goal delay ms",
425
+ description: "Delay before idle auto-continuation starts; 0 starts immediately after idle",
426
+ currentValue: autonomyGoalAutoContinueDelayMsValue(this.state),
427
+ values: AUTONOMY_GOAL_AUTO_CONTINUE_DELAY_MS_VALUES,
428
+ },
332
429
  ];
333
430
  this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
334
431
  switch (id) {
@@ -338,9 +435,247 @@ class AutonomySettingsSubmenu extends Container {
338
435
  case "autonomy-mode":
339
436
  this.state = { ...this.state, mode: newValue };
340
437
  break;
341
- case "autonomy-goal-loop-rounds":
438
+ case "autonomy-goal-auto-continue":
439
+ this.state = { ...this.state, goalAutoContinue: newValue === "true" };
440
+ break;
441
+ case "autonomy-goal-continue-turns":
442
+ this.state = { ...this.state, goalContinueTurns: Number(newValue) };
443
+ break;
444
+ case "autonomy-max-stall-turns":
342
445
  this.state = { ...this.state, maxStallTurns: Number(newValue) };
343
446
  break;
447
+ case "autonomy-goal-wall-clock-minutes":
448
+ this.state = { ...this.state, goalContinueMaxWallClockMinutes: Number(newValue) };
449
+ break;
450
+ case "autonomy-goal-auto-continue-delay-ms":
451
+ this.state = { ...this.state, goalAutoContinueDelayMs: Number(newValue) };
452
+ break;
453
+ default:
454
+ return;
455
+ }
456
+ onChange({ ...this.state }, this.scope);
457
+ }, onCancel);
458
+ this.addChild(this.settingsList);
459
+ }
460
+ handleInput(data) {
461
+ this.settingsList.handleInput(data);
462
+ }
463
+ }
464
+ class ResearchLaneSettingsSubmenu extends Container {
465
+ settingsList;
466
+ state;
467
+ scope;
468
+ constructor(settings, onChange, onCancel, scope = "global") {
469
+ super();
470
+ this.state = {
471
+ ...settings,
472
+ enabled: settings.enabled ?? DEFAULT_RESEARCH_LANE_ENABLED,
473
+ maxUsd: settings.maxUsd ?? DEFAULT_RESEARCH_LANE_MAX_USD,
474
+ maxWallClockMs: settings.maxWallClockMs ?? DEFAULT_RESEARCH_LANE_MAX_WALL_CLOCK_MS,
475
+ idleDelayMs: settings.idleDelayMs ?? DEFAULT_RESEARCH_LANE_IDLE_DELAY_MS,
476
+ maxRunsPerSession: settings.maxRunsPerSession ?? DEFAULT_RESEARCH_LANE_MAX_RUNS_PER_SESSION,
477
+ };
478
+ this.scope = scope;
479
+ const items = [
480
+ {
481
+ id: "research-lane-scope",
482
+ label: "Save scope",
483
+ description: "Save these research-lane settings globally or in the current project's .pi/settings.json",
484
+ currentValue: this.scope,
485
+ values: ["global", "project"],
486
+ },
487
+ {
488
+ id: "research-lane-enabled",
489
+ label: "Enabled",
490
+ description: "Run bounded, read-only background research when idle with an active goal (requires autonomy mode on)",
491
+ currentValue: String(this.state.enabled),
492
+ values: ["true", "false"],
493
+ },
494
+ {
495
+ id: "research-lane-max-usd",
496
+ label: "Budget per pass",
497
+ description: "USD budget per research pass; breaches mark the lane budget_exhausted in diagnostics",
498
+ currentValue: String(this.state.maxUsd),
499
+ values: RESEARCH_LANE_MAX_USD_VALUES,
500
+ },
501
+ {
502
+ id: "research-lane-max-wall-clock-ms",
503
+ label: "Max milliseconds",
504
+ description: "Wall-clock budget per research pass; 0 disables the time budget",
505
+ currentValue: String(this.state.maxWallClockMs),
506
+ values: RESEARCH_LANE_MAX_WALL_CLOCK_MS_VALUES,
507
+ },
508
+ {
509
+ id: "research-lane-idle-delay-ms",
510
+ label: "Idle delay ms",
511
+ description: "Delay before idle-triggered research starts; 0 starts immediately after idle",
512
+ currentValue: String(this.state.idleDelayMs),
513
+ values: RESEARCH_LANE_IDLE_DELAY_MS_VALUES,
514
+ },
515
+ {
516
+ id: "research-lane-max-runs-per-session",
517
+ label: "Runs per session",
518
+ description: "Maximum idle-triggered research passes per session; explicit /autonomy research is uncapped",
519
+ currentValue: String(this.state.maxRunsPerSession),
520
+ values: RESEARCH_LANE_MAX_RUNS_PER_SESSION_VALUES,
521
+ },
522
+ ];
523
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
524
+ switch (id) {
525
+ case "research-lane-scope":
526
+ this.scope = newValue;
527
+ break;
528
+ case "research-lane-enabled":
529
+ this.state = { ...this.state, enabled: newValue === "true" };
530
+ break;
531
+ case "research-lane-max-usd":
532
+ this.state = { ...this.state, maxUsd: Number(newValue) };
533
+ break;
534
+ case "research-lane-max-wall-clock-ms":
535
+ this.state = { ...this.state, maxWallClockMs: Number(newValue) };
536
+ break;
537
+ case "research-lane-idle-delay-ms":
538
+ this.state = { ...this.state, idleDelayMs: Number(newValue) };
539
+ break;
540
+ case "research-lane-max-runs-per-session":
541
+ this.state = { ...this.state, maxRunsPerSession: Number(newValue) };
542
+ break;
543
+ default:
544
+ return;
545
+ }
546
+ onChange({ ...this.state }, this.scope);
547
+ }, onCancel);
548
+ this.addChild(this.settingsList);
549
+ }
550
+ handleInput(data) {
551
+ this.settingsList.handleInput(data);
552
+ }
553
+ }
554
+ class ContextCurationSettingsSubmenu extends Container {
555
+ settingsList;
556
+ state;
557
+ scope;
558
+ constructor(settings, modelOptions, onChange, onCancel, scope = "global") {
559
+ super();
560
+ this.state = {
561
+ ...settings,
562
+ enabled: settings.enabled ?? false,
563
+ maxJobsPerTurn: settings.maxJobsPerTurn ?? 4,
564
+ };
565
+ this.scope = scope;
566
+ const modelValues = ["(unset)", ...(modelOptions ?? []).map((option) => option.value).filter(Boolean)];
567
+ const items = [
568
+ {
569
+ id: "context-curation-scope",
570
+ label: "Save scope",
571
+ description: "Save these curation settings globally or in the current project's .pi/settings.json",
572
+ currentValue: this.scope,
573
+ values: ["global", "project"],
574
+ },
575
+ {
576
+ id: "context-curation-enabled",
577
+ label: "Enabled",
578
+ description: "Local brain curator: digests GC-packed stubs and scores stale-chunk relevance. Requires a digest-fit local model (run /fitness <model>).",
579
+ currentValue: String(this.state.enabled),
580
+ values: ["true", "false"],
581
+ },
582
+ {
583
+ id: "context-curation-model",
584
+ label: "Curator model",
585
+ description: "Local model that runs curation jobs; refused until it passes the digest fitness probe on this host",
586
+ currentValue: this.state.model ?? "(unset)",
587
+ values: modelValues,
588
+ },
589
+ {
590
+ id: "context-curation-max-jobs",
591
+ label: "Max jobs per turn",
592
+ description: "Curation jobs drained per turn (each is one small local completion)",
593
+ currentValue: String(this.state.maxJobsPerTurn),
594
+ values: ["1", "2", "4", "8", "16"],
595
+ },
596
+ ];
597
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
598
+ switch (id) {
599
+ case "context-curation-scope":
600
+ this.scope = newValue;
601
+ break;
602
+ case "context-curation-enabled":
603
+ this.state = { ...this.state, enabled: newValue === "true" };
604
+ break;
605
+ case "context-curation-model":
606
+ this.state = { ...this.state, model: newValue === "(unset)" ? undefined : newValue };
607
+ break;
608
+ case "context-curation-max-jobs":
609
+ this.state = { ...this.state, maxJobsPerTurn: Number(newValue) };
610
+ break;
611
+ default:
612
+ return;
613
+ }
614
+ onChange({ ...this.state }, this.scope);
615
+ }, onCancel);
616
+ this.addChild(this.settingsList);
617
+ }
618
+ handleInput(data) {
619
+ this.settingsList.handleInput(data);
620
+ }
621
+ }
622
+ class WorkerDelegationSettingsSubmenu extends Container {
623
+ settingsList;
624
+ state;
625
+ scope;
626
+ constructor(settings, onChange, onCancel, scope = "global") {
627
+ super();
628
+ this.state = {
629
+ ...settings,
630
+ enabled: settings.enabled ?? DEFAULT_WORKER_DELEGATION_ENABLED,
631
+ maxUsd: settings.maxUsd ?? DEFAULT_WORKER_DELEGATION_MAX_USD,
632
+ maxWallClockMs: settings.maxWallClockMs ?? DEFAULT_WORKER_DELEGATION_MAX_WALL_CLOCK_MS,
633
+ };
634
+ this.scope = scope;
635
+ const items = [
636
+ {
637
+ id: "worker-delegation-scope",
638
+ label: "Save scope",
639
+ description: "Save these delegation settings globally or in the current project's .pi/settings.json",
640
+ currentValue: this.scope,
641
+ values: ["global", "project"],
642
+ },
643
+ {
644
+ id: "worker-delegation-enabled",
645
+ label: "Enabled",
646
+ description: "Allow the delegate tool to run bounded, read-only scout workers on a cheap model lane",
647
+ currentValue: String(this.state.enabled),
648
+ values: ["true", "false"],
649
+ },
650
+ {
651
+ id: "worker-delegation-max-usd",
652
+ label: "Budget per worker",
653
+ description: "USD budget per delegated worker; breaches mark the lane budget_exhausted in diagnostics",
654
+ currentValue: String(this.state.maxUsd),
655
+ values: RESEARCH_LANE_MAX_USD_VALUES,
656
+ },
657
+ {
658
+ id: "worker-delegation-max-wall-clock-ms",
659
+ label: "Max milliseconds",
660
+ description: "Wall-clock budget per delegated worker; 0 disables the time budget",
661
+ currentValue: String(this.state.maxWallClockMs),
662
+ values: RESEARCH_LANE_MAX_WALL_CLOCK_MS_VALUES,
663
+ },
664
+ ];
665
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
666
+ switch (id) {
667
+ case "worker-delegation-scope":
668
+ this.scope = newValue;
669
+ break;
670
+ case "worker-delegation-enabled":
671
+ this.state = { ...this.state, enabled: newValue === "true" };
672
+ break;
673
+ case "worker-delegation-max-usd":
674
+ this.state = { ...this.state, maxUsd: Number(newValue) };
675
+ break;
676
+ case "worker-delegation-max-wall-clock-ms":
677
+ this.state = { ...this.state, maxWallClockMs: Number(newValue) };
678
+ break;
344
679
  default:
345
680
  return;
346
681
  }
@@ -500,6 +835,132 @@ class AutoLearnSettingsSubmenu extends Container {
500
835
  this.settingsList.handleInput(data);
501
836
  }
502
837
  }
838
+ class ContextPolicyEnforcementSettingsSubmenu extends Container {
839
+ settingsList;
840
+ state;
841
+ scope;
842
+ constructor(settings, onChange, onCancel, scope = "global") {
843
+ super();
844
+ this.state = { ...settings };
845
+ this.scope = scope;
846
+ const items = [
847
+ {
848
+ id: "context-policy-scope",
849
+ label: "Save scope",
850
+ description: "Save this context/prompt-policy configuration globally or in the current project's .pi/settings.json",
851
+ currentValue: this.scope,
852
+ values: ["global", "project"],
853
+ },
854
+ {
855
+ id: "context-policy-enabled",
856
+ label: "Prompt policy enforcement",
857
+ description: "Opt-in: stub stale artifact-backed grep/find output in the model-visible prompt only. Never touches transcript/session history. Requires the artifact_retrieve tool to be active this turn (not configurable here -- it's a runtime fact, not a setting).",
858
+ currentValue: booleanSettingValue(this.state.enabled, CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.enabled),
859
+ values: ["false", "true"],
860
+ },
861
+ {
862
+ id: "context-policy-preserve-recent-messages",
863
+ label: "Preserve recent messages",
864
+ description: "Never stub a tool result within this many of the most recent messages",
865
+ currentValue: numberSettingValue(this.state.preserveRecentMessages, CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.preserveRecentMessages),
866
+ values: CONTEXT_POLICY_PRESERVE_RECENT_MESSAGES_VALUES,
867
+ },
868
+ {
869
+ id: "context-policy-min-chars",
870
+ label: "Minimum chars before stubbing",
871
+ description: "Only stub a tool result whose original provider-visible text is at least this many characters",
872
+ currentValue: numberSettingValue(this.state.minChars, CONTEXT_POLICY_ENFORCEMENT_DEFAULTS.minChars),
873
+ values: CONTEXT_POLICY_MIN_CHARS_VALUES,
874
+ },
875
+ ];
876
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
877
+ switch (id) {
878
+ case "context-policy-scope":
879
+ this.scope = newValue;
880
+ break;
881
+ case "context-policy-enabled":
882
+ this.state = { ...this.state, enabled: newValue === "true" };
883
+ break;
884
+ case "context-policy-preserve-recent-messages":
885
+ this.state = { ...this.state, preserveRecentMessages: parseInt(newValue, 10) };
886
+ break;
887
+ case "context-policy-min-chars":
888
+ this.state = { ...this.state, minChars: parseInt(newValue, 10) };
889
+ break;
890
+ default:
891
+ return;
892
+ }
893
+ onChange({ ...this.state }, this.scope);
894
+ }, onCancel);
895
+ this.addChild(this.settingsList);
896
+ }
897
+ handleInput(data) {
898
+ this.settingsList.handleInput(data);
899
+ }
900
+ }
901
+ class ContextMemoryRetrievalSettingsSubmenu extends Container {
902
+ settingsList;
903
+ state;
904
+ scope;
905
+ constructor(settings, onChange, onCancel, scope = "global") {
906
+ super();
907
+ this.state = { ...settings };
908
+ this.scope = scope;
909
+ const items = [
910
+ {
911
+ id: "context-memory-scope",
912
+ label: "Save scope",
913
+ description: "Save this local memory-retrieval configuration globally or in the current project's .pi/settings.json",
914
+ currentValue: this.scope,
915
+ values: ["global", "project"],
916
+ },
917
+ {
918
+ id: "context-memory-enabled",
919
+ label: "Local memory retrieval",
920
+ description: "Opt-in: each turn, search local Pi OKF memory documents (under <agent dir>/okf-memory) for evidence related to the latest message. By default this is observe-only (recorded for inspection only). Enable 'Include in prompt' below to also surface a bounded, source-labeled evidence block to the model. Local-only; never queries an external provider.",
921
+ currentValue: booleanSettingValue(this.state.enabled, CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.enabled),
922
+ values: ["false", "true"],
923
+ },
924
+ {
925
+ id: "context-memory-max-results",
926
+ label: "Max results",
927
+ description: "Maximum number of memory items to retrieve per query (1-20)",
928
+ currentValue: numberSettingValue(this.state.maxResults, CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.maxResults),
929
+ values: CONTEXT_MEMORY_RETRIEVAL_MAX_RESULTS_VALUES,
930
+ },
931
+ {
932
+ id: "context-memory-include-in-prompt",
933
+ label: "Include in prompt",
934
+ description: "Opt-in, requires 'Local memory retrieval' enabled above: surfaces retrieved memory as a bounded, source-labeled, untrusted-evidence block in the model prompt only -- never the transcript, never treated as an instruction or rule. Default off.",
935
+ currentValue: booleanSettingValue(this.state.includeInPrompt, CONTEXT_MEMORY_RETRIEVAL_DEFAULTS.includeInPrompt),
936
+ values: ["false", "true"],
937
+ },
938
+ ];
939
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
940
+ switch (id) {
941
+ case "context-memory-scope":
942
+ this.scope = newValue;
943
+ break;
944
+ case "context-memory-enabled":
945
+ this.state = { ...this.state, enabled: newValue === "true" };
946
+ break;
947
+ case "context-memory-max-results":
948
+ this.state = { ...this.state, maxResults: parseInt(newValue, 10) };
949
+ break;
950
+ case "context-memory-include-in-prompt":
951
+ this.state = { ...this.state, includeInPrompt: newValue === "true" };
952
+ break;
953
+ default:
954
+ return;
955
+ }
956
+ onChange({ ...this.state }, this.scope);
957
+ }, onCancel);
958
+ this.addChild(this.settingsList);
959
+ }
960
+ handleInput(data) {
961
+ this.settingsList.handleInput(data);
962
+ }
963
+ }
503
964
  class ModelRouterSettingsSubmenu extends Container {
504
965
  settingsList;
505
966
  state;
@@ -519,6 +980,13 @@ class ModelRouterSettingsSubmenu extends Container {
519
980
  includeActive: false,
520
981
  unsetDescription: "Clear cheap routing model; research turns fall back to the active session model",
521
982
  });
983
+ const mediumModelOptions = buildModelRouterRoleModelOptions({
984
+ currentValue: this.state.mediumModel,
985
+ configuredModelOptions: modelOptions,
986
+ currentModelPattern,
987
+ includeActive: false,
988
+ unsetDescription: "Clear medium routing model; implementation turns fall back according to router policy",
989
+ });
522
990
  const expensiveModelOptions = buildModelRouterRoleModelOptions({
523
991
  currentValue: this.state.expensiveModel,
524
992
  configuredModelOptions: modelOptions,
@@ -570,6 +1038,27 @@ class ModelRouterSettingsSubmenu extends Container {
570
1038
  customEmptyValue: MODEL_ROUTER_UNSET_MODEL_VALUE,
571
1039
  }),
572
1040
  },
1041
+ {
1042
+ id: "model-router-medium",
1043
+ label: "Medium model",
1044
+ description: "Pick the model for normal scoped implementation, edits, tests, and mechanical refactors",
1045
+ currentValue: optionalStringValue(this.state.mediumModel),
1046
+ submenu: (_currentValue, done) => new ModelSelectionSubmenu(mediumModelOptions, this.state.mediumModel ?? MODEL_ROUTER_UNSET_MODEL_VALUE, (value) => {
1047
+ this.state = {
1048
+ ...this.state,
1049
+ mediumModel: value === MODEL_ROUTER_UNSET_MODEL_VALUE ? undefined : value,
1050
+ };
1051
+ onChange({ ...this.state }, this.scope);
1052
+ done(optionalStringValue(this.state.mediumModel));
1053
+ }, () => done(), {
1054
+ title: "Medium / Implementation Model",
1055
+ description: "Choose from models available through configured subscription/API accounts. Type to filter; manual is fallback.",
1056
+ customTitle: "Custom Medium / Implementation Model",
1057
+ customDescription: "Enter a provider/model pattern from pi --list-models.",
1058
+ customEmptyHint: "empty clears the setting",
1059
+ customEmptyValue: MODEL_ROUTER_UNSET_MODEL_VALUE,
1060
+ }),
1061
+ },
573
1062
  {
574
1063
  id: "model-router-expensive",
575
1064
  label: "Expensive model",
@@ -719,8 +1208,13 @@ export class SettingsSelectorComponent extends Container {
719
1208
  let currentWarnings = { ...config.warnings };
720
1209
  let currentSelfModification = { ...config.selfModification };
721
1210
  let currentAutonomy = { ...config.autonomy };
1211
+ let currentResearchLane = { ...config.researchLane };
1212
+ let currentContextCuration = { ...config.contextCuration };
1213
+ let currentWorkerDelegation = { ...config.workerDelegation };
722
1214
  let currentModelRouter = { ...config.modelRouter };
723
1215
  let currentAutoLearn = { ...config.autoLearn };
1216
+ let currentContextPolicyEnforcement = { ...config.contextPolicyEnforcement };
1217
+ let currentContextMemoryRetrieval = { ...config.contextMemoryRetrieval };
724
1218
  const items = [
725
1219
  {
726
1220
  id: "autocompact",
@@ -819,6 +1313,36 @@ export class SettingsSelectorComponent extends Container {
819
1313
  callbacks.onAutonomyChange(settings, scope);
820
1314
  }, () => done(autonomySummary(currentAutonomy)), config.autonomyScope ?? "global"),
821
1315
  },
1316
+ {
1317
+ id: "research-lane",
1318
+ label: "Research Lane",
1319
+ description: "Opt-in autonomous read-only research: bounded background passes that produce evidence bundles for active goals",
1320
+ currentValue: researchLaneSummary(currentResearchLane),
1321
+ submenu: (_currentValue, done) => new ResearchLaneSettingsSubmenu(currentResearchLane, (settings, scope) => {
1322
+ currentResearchLane = { ...settings };
1323
+ callbacks.onResearchLaneChange(settings, scope);
1324
+ }, () => done(researchLaneSummary(currentResearchLane)), config.researchLaneScope ?? "global"),
1325
+ },
1326
+ {
1327
+ id: "worker-delegation",
1328
+ label: "Worker Delegation",
1329
+ description: "Opt-in bounded scout-worker delegation: the delegate tool runs read-only workers on a cheap model lane",
1330
+ currentValue: workerDelegationSummary(currentWorkerDelegation),
1331
+ submenu: (_currentValue, done) => new WorkerDelegationSettingsSubmenu(currentWorkerDelegation, (settings, scope) => {
1332
+ currentWorkerDelegation = { ...settings };
1333
+ callbacks.onWorkerDelegationChange(settings, scope);
1334
+ }, () => done(workerDelegationSummary(currentWorkerDelegation)), config.workerDelegationScope ?? "global"),
1335
+ },
1336
+ {
1337
+ id: "context-curation",
1338
+ label: "Context Curation",
1339
+ description: "Opt-in local brain curator: digests GC-packed context stubs and scores stale-chunk relevance in small local-model jobs",
1340
+ currentValue: contextCurationSummary(currentContextCuration),
1341
+ submenu: (_currentValue, done) => new ContextCurationSettingsSubmenu(currentContextCuration, config.autoLearnModelOptions, (settings, scope) => {
1342
+ currentContextCuration = { ...settings };
1343
+ callbacks.onContextCurationChange(settings, scope);
1344
+ }, () => done(contextCurationSummary(currentContextCuration)), config.contextCurationScope ?? "global"),
1345
+ },
822
1346
  {
823
1347
  id: "model-router",
824
1348
  label: "Model Router",
@@ -839,6 +1363,26 @@ export class SettingsSelectorComponent extends Container {
839
1363
  callbacks.onAutoLearnChange(settings, scope);
840
1364
  }, () => done(autoLearnSummary(currentAutoLearn)), config.autoLearnScope ?? "global"),
841
1365
  },
1366
+ {
1367
+ id: "context-policy-enforcement",
1368
+ label: "Context / Prompt Policy",
1369
+ description: "Opt-in artifact-stub prompt-policy enforcement: stubs stale artifact-backed tool output in the model-visible prompt only, never the transcript. Requires the artifact_retrieve tool to be active.",
1370
+ currentValue: contextPolicyEnforcementSummary(currentContextPolicyEnforcement),
1371
+ submenu: (_currentValue, done) => new ContextPolicyEnforcementSettingsSubmenu(currentContextPolicyEnforcement, (settings, scope) => {
1372
+ currentContextPolicyEnforcement = { ...settings };
1373
+ callbacks.onContextPolicyEnforcementChange(settings, scope);
1374
+ }, () => done(contextPolicyEnforcementSummary(currentContextPolicyEnforcement)), config.contextPolicyEnforcementScope ?? "global"),
1375
+ },
1376
+ {
1377
+ id: "context-memory-retrieval",
1378
+ label: "Context / Memory Retrieval",
1379
+ description: "Opt-in local memory retrieval: searches local Pi OKF memory documents each turn and records source-labeled evidence for inspection. Prompt inclusion is off by default and only occurs when 'Include in prompt' is enabled. Never queries an external provider.",
1380
+ currentValue: contextMemoryRetrievalSummary(currentContextMemoryRetrieval),
1381
+ submenu: (_currentValue, done) => new ContextMemoryRetrievalSettingsSubmenu(currentContextMemoryRetrieval, (settings, scope) => {
1382
+ currentContextMemoryRetrieval = { ...settings };
1383
+ callbacks.onContextMemoryRetrievalChange(settings, scope);
1384
+ }, () => done(contextMemoryRetrievalSummary(currentContextMemoryRetrieval)), config.contextMemoryRetrievalScope ?? "global"),
1385
+ },
842
1386
  {
843
1387
  id: "warnings",
844
1388
  label: "Warnings",