@caupulican/pi-adaptative 0.94.1 → 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +173 -293
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +247 -392
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
  13. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
  14. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
  15. package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
  16. package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
  17. package/dist/core/agent-session.d.ts +11 -41
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +93 -160
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
  22. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  23. package/dist/core/autonomy/envelope-enforcement.js +26 -25
  24. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  25. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  26. package/dist/core/autonomy/lane-private-paths.js +2 -1
  27. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  28. package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
  29. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  30. package/dist/core/autonomy/lane-tool-surface.js +45 -30
  31. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  32. package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
  33. package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
  34. package/dist/core/autonomy/worker-session-private-scope.js +42 -0
  35. package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
  36. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
  37. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
  38. package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
  39. package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
  40. package/dist/core/background-lane-controller.d.ts +1 -1
  41. package/dist/core/background-lane-controller.d.ts.map +1 -1
  42. package/dist/core/background-lane-controller.js +1 -1
  43. package/dist/core/background-lane-controller.js.map +1 -1
  44. package/dist/core/background-tool-task-controller.d.ts +8 -2
  45. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  46. package/dist/core/background-tool-task-controller.js +10 -2
  47. package/dist/core/background-tool-task-controller.js.map +1 -1
  48. package/dist/core/cost-guard-controller.d.ts +37 -0
  49. package/dist/core/cost-guard-controller.d.ts.map +1 -0
  50. package/dist/core/cost-guard-controller.js +71 -0
  51. package/dist/core/cost-guard-controller.js.map +1 -0
  52. package/dist/core/cost-guard.d.ts +9 -4
  53. package/dist/core/cost-guard.d.ts.map +1 -1
  54. package/dist/core/cost-guard.js +7 -3
  55. package/dist/core/cost-guard.js.map +1 -1
  56. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  57. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  58. package/dist/core/delegation/worker-attempt-executor.js +0 -1
  59. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  60. package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
  61. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  62. package/dist/core/delegation/worker-authority-resolver.js +114 -55
  63. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  64. package/dist/core/delegation/worker-claim.d.ts +1 -2
  65. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  66. package/dist/core/delegation/worker-claim.js.map +1 -1
  67. package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
  68. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  69. package/dist/core/delegation/worker-delegation-controller.js +125 -40
  70. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  71. package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
  72. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  73. package/dist/core/delegation/worker-delegation-request.js +13 -19
  74. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  75. package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
  76. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  77. package/dist/core/delegation/worker-execution-policy.js +54 -39
  78. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  79. package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
  80. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-fleet-limits.js +7 -7
  82. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  83. package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
  84. package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
  85. package/dist/core/delegation/worker-machine-scope.js +38 -0
  86. package/dist/core/delegation/worker-machine-scope.js.map +1 -0
  87. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  88. package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
  89. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  90. package/dist/core/delegation/worker-runner.d.ts +5 -7
  91. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  92. package/dist/core/delegation/worker-runner.js +1 -4
  93. package/dist/core/delegation/worker-runner.js.map +1 -1
  94. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
  95. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  96. package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
  97. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  98. package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
  99. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  100. package/dist/core/durable-custom-message-turn-controller.js +38 -15
  101. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  102. package/dist/core/extension-binding-controller.d.ts +5 -1
  103. package/dist/core/extension-binding-controller.d.ts.map +1 -1
  104. package/dist/core/extension-binding-controller.js +15 -0
  105. package/dist/core/extension-binding-controller.js.map +1 -1
  106. package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
  107. package/dist/core/extensions/factory-runtime.js +5 -0
  108. package/dist/core/extensions/factory-runtime.js.map +1 -1
  109. package/dist/core/extensions/runner.d.ts.map +1 -1
  110. package/dist/core/extensions/runner.js +1 -0
  111. package/dist/core/extensions/runner.js.map +1 -1
  112. package/dist/core/extensions/types.d.ts +8 -4
  113. package/dist/core/extensions/types.d.ts.map +1 -1
  114. package/dist/core/extensions/types.js.map +1 -1
  115. package/dist/core/foreground-terminal-handoff-controller.d.ts +14 -0
  116. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  117. package/dist/core/foreground-terminal-handoff-controller.js +188 -72
  118. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  119. package/dist/core/goals/goal-session-controller.d.ts +2 -0
  120. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  121. package/dist/core/goals/goal-session-controller.js +8 -0
  122. package/dist/core/goals/goal-session-controller.js.map +1 -1
  123. package/dist/core/goals/goal-tool-core.d.ts +5 -4
  124. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  125. package/dist/core/goals/goal-tool-core.js +23 -19
  126. package/dist/core/goals/goal-tool-core.js.map +1 -1
  127. package/dist/core/learning/auto-learn-settings.d.ts +84 -0
  128. package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
  129. package/dist/core/learning/auto-learn-settings.js +66 -0
  130. package/dist/core/learning/auto-learn-settings.js.map +1 -0
  131. package/dist/core/learning/reflection-engine.d.ts +4 -0
  132. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  133. package/dist/core/learning/reflection-engine.js +48 -10
  134. package/dist/core/learning/reflection-engine.js.map +1 -1
  135. package/dist/core/local-prefix-warm-controller.d.ts +24 -0
  136. package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
  137. package/dist/core/local-prefix-warm-controller.js +79 -0
  138. package/dist/core/local-prefix-warm-controller.js.map +1 -0
  139. package/dist/core/memory/providers/file-store.d.ts +2 -0
  140. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  141. package/dist/core/memory/providers/file-store.js +71 -15
  142. package/dist/core/memory/providers/file-store.js.map +1 -1
  143. package/dist/core/memory/worker-memory-tools.d.ts +5 -0
  144. package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
  145. package/dist/core/memory/worker-memory-tools.js +5 -0
  146. package/dist/core/memory/worker-memory-tools.js.map +1 -0
  147. package/dist/core/model-capability.d.ts +7 -0
  148. package/dist/core/model-capability.d.ts.map +1 -1
  149. package/dist/core/model-capability.js +12 -0
  150. package/dist/core/model-capability.js.map +1 -1
  151. package/dist/core/model-registry.d.ts.map +1 -1
  152. package/dist/core/model-registry.js +2 -10
  153. package/dist/core/model-registry.js.map +1 -1
  154. package/dist/core/model-router-controller.d.ts +3 -2
  155. package/dist/core/model-router-controller.d.ts.map +1 -1
  156. package/dist/core/model-router-controller.js +3 -2
  157. package/dist/core/model-router-controller.js.map +1 -1
  158. package/dist/core/orchestration/contracts.d.ts +16 -12
  159. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  160. package/dist/core/orchestration/contracts.js +2 -2
  161. package/dist/core/orchestration/contracts.js.map +1 -1
  162. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  163. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  164. package/dist/core/orchestration/lane-tool-manifests.js +6 -1
  165. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  166. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  167. package/dist/core/orchestration/profile-registry.js +14 -0
  168. package/dist/core/orchestration/profile-registry.js.map +1 -1
  169. package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
  170. package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
  171. package/dist/core/orchestration/task-profile-writer.js +71 -59
  172. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  173. package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
  174. package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
  175. package/dist/core/orchestration/thinking-level-schema.js +19 -0
  176. package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
  177. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  178. package/dist/core/orchestration/worker-execution-contract.js +12 -5
  179. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  180. package/dist/core/provider-prompt-contracts.d.ts +1 -4
  181. package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
  182. package/dist/core/provider-prompt-contracts.js +4 -10
  183. package/dist/core/provider-prompt-contracts.js.map +1 -1
  184. package/dist/core/provider-request-context-controller.d.ts +2 -0
  185. package/dist/core/provider-request-context-controller.d.ts.map +1 -1
  186. package/dist/core/provider-request-context-controller.js +10 -3
  187. package/dist/core/provider-request-context-controller.js.map +1 -1
  188. package/dist/core/reflection-controller.d.ts +56 -27
  189. package/dist/core/reflection-controller.d.ts.map +1 -1
  190. package/dist/core/reflection-controller.js +206 -117
  191. package/dist/core/reflection-controller.js.map +1 -1
  192. package/dist/core/runtime-builder.d.ts +1 -0
  193. package/dist/core/runtime-builder.d.ts.map +1 -1
  194. package/dist/core/runtime-builder.js +25 -14
  195. package/dist/core/runtime-builder.js.map +1 -1
  196. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  197. package/dist/core/secrets/credential-exposure-guard.js +55 -10
  198. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  199. package/dist/core/session-role.d.ts +6 -8
  200. package/dist/core/session-role.d.ts.map +1 -1
  201. package/dist/core/session-role.js +8 -18
  202. package/dist/core/session-role.js.map +1 -1
  203. package/dist/core/settings-manager.d.ts +13 -16
  204. package/dist/core/settings-manager.d.ts.map +1 -1
  205. package/dist/core/settings-manager.js +53 -50
  206. package/dist/core/settings-manager.js.map +1 -1
  207. package/dist/core/skill-vault.d.ts +15 -0
  208. package/dist/core/skill-vault.d.ts.map +1 -1
  209. package/dist/core/skill-vault.js +79 -45
  210. package/dist/core/skill-vault.js.map +1 -1
  211. package/dist/core/skills.d.ts +3 -0
  212. package/dist/core/skills.d.ts.map +1 -1
  213. package/dist/core/skills.js +6 -6
  214. package/dist/core/skills.js.map +1 -1
  215. package/dist/core/system-prompt-builder.d.ts +2 -0
  216. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  217. package/dist/core/system-prompt-builder.js +52 -12
  218. package/dist/core/system-prompt-builder.js.map +1 -1
  219. package/dist/core/system-prompt.js +1 -1
  220. package/dist/core/system-prompt.js.map +1 -1
  221. package/dist/core/tool-capability-policy.d.ts +3 -0
  222. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  223. package/dist/core/tool-capability-policy.js +13 -2
  224. package/dist/core/tool-capability-policy.js.map +1 -1
  225. package/dist/core/toolkit/script-runner.d.ts +2 -1
  226. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  227. package/dist/core/toolkit/script-runner.js +10 -2
  228. package/dist/core/toolkit/script-runner.js.map +1 -1
  229. package/dist/core/tools/delegate-status.d.ts +1 -1
  230. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  231. package/dist/core/tools/delegate-status.js +1 -1
  232. package/dist/core/tools/delegate-status.js.map +1 -1
  233. package/dist/core/tools/delegate.d.ts +4 -15
  234. package/dist/core/tools/delegate.d.ts.map +1 -1
  235. package/dist/core/tools/delegate.js +111 -73
  236. package/dist/core/tools/delegate.js.map +1 -1
  237. package/dist/core/tools/goal.d.ts +3 -4
  238. package/dist/core/tools/goal.d.ts.map +1 -1
  239. package/dist/core/tools/goal.js +24 -7
  240. package/dist/core/tools/goal.js.map +1 -1
  241. package/dist/core/tools/profile-writer.d.ts +2 -8
  242. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  243. package/dist/core/tools/profile-writer.js +6 -18
  244. package/dist/core/tools/profile-writer.js.map +1 -1
  245. package/dist/core/tools/run-toolkit-script.d.ts +1 -1
  246. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  247. package/dist/core/tools/run-toolkit-script.js +2 -2
  248. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  249. package/dist/core/tools/skill-audit.d.ts +28 -1
  250. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  251. package/dist/core/tools/skill-audit.js +56 -12
  252. package/dist/core/tools/skill-audit.js.map +1 -1
  253. package/dist/core/tools/skill.d.ts +12 -1
  254. package/dist/core/tools/skill.d.ts.map +1 -1
  255. package/dist/core/tools/skill.js +52 -0
  256. package/dist/core/tools/skill.js.map +1 -1
  257. package/dist/core/tools/skillify.d.ts.map +1 -1
  258. package/dist/core/tools/skillify.js +16 -7
  259. package/dist/core/tools/skillify.js.map +1 -1
  260. package/dist/core/tools/task-steps.js +1 -1
  261. package/dist/core/tools/task-steps.js.map +1 -1
  262. package/dist/core/tools/tmux-dispatch.d.ts +4 -16
  263. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  264. package/dist/core/tools/tmux-dispatch.js +5 -20
  265. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  266. package/dist/core/worktree-sync/codes.d.ts +1 -2
  267. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  268. package/dist/core/worktree-sync/codes.js +1 -2
  269. package/dist/core/worktree-sync/codes.js.map +1 -1
  270. package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
  271. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  272. package/dist/core/worktree-sync/lane-gate.js +5 -51
  273. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  274. package/dist/index.d.ts +5 -0
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +7 -0
  277. package/dist/index.js.map +1 -1
  278. package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
  279. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  280. package/dist/modes/interactive/auto-learn-controller.js +30 -207
  281. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  282. package/dist/modes/interactive/autonomy-commands.js +2 -2
  283. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  284. package/dist/modes/interactive/components/custom-message.js +17 -0
  285. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  286. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
  288. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  289. package/dist/modes/interactive/components/footer.js +1 -1
  290. package/dist/modes/interactive/components/footer.js.map +1 -1
  291. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  292. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  293. package/dist/modes/interactive/components/settings-selector.js +150 -73
  294. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  295. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  296. package/dist/modes/interactive/report-commands.js +8 -4
  297. package/dist/modes/interactive/report-commands.js.map +1 -1
  298. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  299. package/dist/modes/interactive/settings-selector-flow.js +10 -0
  300. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  301. package/docs/extensions.md +8 -0
  302. package/docs/harness-architecture.md +28 -32
  303. package/docs/index.md +1 -1
  304. package/docs/process-matrix.md +8 -6
  305. package/docs/resources.md +1 -1
  306. package/docs/settings.md +61 -51
  307. package/docs/tmux-agent-manager.md +47 -40
  308. package/docs/usage.md +1 -1
  309. package/docs/worker-profiles.md +8 -6
  310. package/docs/worktree-sync.md +26 -20
  311. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  312. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  313. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  314. package/examples/extensions/sandbox/package-lock.json +2 -2
  315. package/examples/extensions/sandbox/package.json +1 -1
  316. package/examples/extensions/with-deps/package-lock.json +2 -2
  317. package/examples/extensions/with-deps/package.json +1 -1
  318. package/npm-shrinkwrap.json +12 -12
  319. package/package.json +4 -4
  320. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
  321. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
  322. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
  323. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
  324. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
@@ -1,15 +1,12 @@
1
1
  /**
2
- * Native reflection + learning-write controller.
2
+ * Root-session reflection cue + explicit learning-write controller.
3
3
  *
4
- * Extracted verbatim from agent-session.ts (god-file decomposition). Owns the end-of-loop reflection
5
- * pass (R2), the isolated-completion primitive it runs on, and the learning-apply/rollback path that
6
- * turns reflection writes into gated, audited durable memory/skill changes. It mutates NO session
7
- * fields — every durable effect goes through the bundled memory tool, the session log (via deps), or
8
- * the skills dir; the whole pass is best-effort and never throws into the turn loop. Reads live
9
- * session state (model/agent/registry/memory/settings) through narrow deps accessors rather than the
10
- * whole AgentSession.
4
+ * Automatic reflection is a hidden cue in the root orchestrator's ordinary provider turn. This
5
+ * controller never schedules an automatic provider request. The isolated completion and structured
6
+ * reflection pass remain explicit compatibility/application seams for owner-invoked callers. Every
7
+ * durable effect goes through the bundled memory tool, the session log (via deps), or the skills dir.
11
8
  */
12
- import { createHash } from "node:crypto";
9
+ import { randomUUID } from "node:crypto";
13
10
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
14
11
  import { join } from "node:path";
15
12
  import { runAgentLoop, startAgentProviderRequest } from "@caupulican/pi-agent-core/agent-loop";
@@ -17,23 +14,63 @@ import { resolveModelThinkingLevel } from "@caupulican/pi-ai/models";
17
14
  import { computeLaneAffinityKey, DEFAULT_ISOLATED_LANE_KIND, } from "./agent-session-contracts.js";
18
15
  import { AUTONOMY_TELEMETRY_EVENT_TYPES } from "./autonomy/telemetry-events.js";
19
16
  import { PI_OKF_TYPES } from "./context/okf-memory.js";
17
+ import { isCurrentSessionReflectionEnabled, resolveAutoLearnSettings } from "./learning/auto-learn-settings.js";
20
18
  import { APPLY_WRITE_REFUSED_REASON_CODE, appendLearningAuditSnapshot, contradictionsForReflectionWrite, getLearningAuditSnapshots, proposalFromReflectionWrite, rollbackPlanForReflectionWrite, } from "./learning/learning-audit.js";
21
19
  import { evaluateLearningDecision } from "./learning/learning-gate.js";
22
20
  import { ObservationStore, observationKey } from "./learning/observation-store.js";
23
21
  import { decideDemand, ReflectionEngine, } from "./learning/reflection-engine.js";
24
- import { analyzeReflectionTurn, boundReflectionSemanticText, reflectionTriggerPriority, } from "./learning/reflection-turn-analysis.js";
25
- import { resolveCliModel } from "./model-resolver.js";
22
+ import { analyzeReflectionTurn } from "./learning/reflection-turn-analysis.js";
26
23
  import { registerInFlightWork } from "./reload-blockers.js";
27
- import { runSkillAudit } from "./tools/skill-audit.js";
24
+ import { DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS, runSkillAudit } from "./tools/skill-audit.js";
28
25
  // reasonCode when an automatic skill promotion is blocked by an overlap with an existing skill
29
26
  // (skill_audit's similarity threshold) and routed to a consolidation proposal instead of a blind write.
30
27
  export const SKILL_OVERLAP_CONSOLIDATION_REASON_CODE = "skill_overlap_consolidation_proposed";
31
28
  // reasonCode when the overlap audit itself fails — the promotion is held (not written unaudited)
32
29
  // rather than silently skipping the check.
33
30
  export const SKILL_AUDIT_UNAVAILABLE_REASON_CODE = "skill_audit_unavailable";
34
- const REFLECTION_MIN_INTERVAL_MS = 45_000;
35
- const REFLECTION_PENDING_MAX_CHARS = 12_000;
36
- const REFLECTION_DIGEST_HISTORY_SIZE = 64;
31
+ export const CURRENT_TURN_REFLECTION_CUSTOM_TYPE = "reflection_cue";
32
+ export const CURRENT_TURN_REFLECTION_STATE_CUSTOM_TYPE = "reflection_cue_state";
33
+ const CURRENT_TURN_REFLECTION_CUE = [
34
+ "Root reflection contract for this current turn:",
35
+ "- Decide during this same turn whether the request or resulting evidence warrants durable learning.",
36
+ "- When warranted, confront existing memory first, then use this root session's memory or skill tools now.",
37
+ "- Do not defer reflection, request another model turn, call an isolated completion, or launch a background learner or worker for reflection.",
38
+ "- When nothing durable is warranted, continue normally and do not mention this cue.",
39
+ ].join("\n");
40
+ const CURRENT_TURN_REFLECTION_TRIGGERS = new Set([
41
+ "root-turn",
42
+ "complex",
43
+ "corrective",
44
+ "durable",
45
+ "session-end",
46
+ ]);
47
+ function parseCurrentTurnReflectionCueState(value) {
48
+ if (!value || typeof value !== "object")
49
+ return undefined;
50
+ const candidate = value;
51
+ if (candidate.version !== 1 ||
52
+ typeof candidate.revision !== "number" ||
53
+ !Number.isSafeInteger(candidate.revision) ||
54
+ candidate.revision < 1 ||
55
+ typeof candidate.cueId !== "string" ||
56
+ (candidate.status !== "pending" && candidate.status !== "consumed" && candidate.status !== "dismissed") ||
57
+ !Array.isArray(candidate.triggers) ||
58
+ candidate.triggers.length === 0 ||
59
+ candidate.triggers.some((trigger) => !CURRENT_TURN_REFLECTION_TRIGGERS.has(trigger)) ||
60
+ typeof candidate.createdAt !== "string" ||
61
+ typeof candidate.updatedAt !== "string") {
62
+ return undefined;
63
+ }
64
+ return {
65
+ version: 1,
66
+ revision: candidate.revision,
67
+ cueId: candidate.cueId,
68
+ status: candidate.status,
69
+ triggers: [...new Set(candidate.triggers)],
70
+ createdAt: candidate.createdAt,
71
+ updatedAt: candidate.updatedAt,
72
+ };
73
+ }
37
74
  function parseOkfRollbackTarget(target) {
38
75
  if (!target)
39
76
  return undefined;
@@ -47,114 +84,160 @@ function parseOkfRollbackTarget(target) {
47
84
  }
48
85
  export class ReflectionController {
49
86
  constructor(deps) {
50
- this.pendingTurns = [];
51
- this.scheduledDigests = new Set();
52
- this.lastScheduledPassAt = 0;
87
+ this.cueStateCacheInitialized = false;
53
88
  this.deps = deps;
89
+ this.unsubscribeSettingsChanges = deps.getSettingsManager().subscribeChanges(() => {
90
+ this.synchronizeCurrentTurnCueWithSettings();
91
+ });
92
+ this.synchronizeCurrentTurnCueWithSettings();
54
93
  }
55
- /** Analyze once, schedule bounded background reflection when warranted, and return filtered turn text for sync hooks. */
56
- scheduleFromTurn(messages, contextHeadroomPct) {
57
- const settings = this.deps.getSettingsManager().getAutoLearnSettings();
58
- const analysis = analyzeReflectionTurn(messages, settings.complexTaskToolCalls ?? 12);
59
- const enabled = settings.enabled !== false &&
60
- settings.reflectionReview !== false &&
61
- process.env.PI_NATIVE_REFLECTION !== "0" &&
62
- process.env.PI_AUTO_LEARN_CHILD !== "1" &&
63
- !this.deps.isChildSession() &&
64
- !this.deps.isDisposed();
65
- if (!enabled || analysis.trigger === "none" || this.scheduledDigests.has(analysis.digest))
66
- return analysis;
67
- this.scheduledDigests.add(analysis.digest);
68
- while (this.scheduledDigests.size > REFLECTION_DIGEST_HISTORY_SIZE) {
69
- const oldest = this.scheduledDigests.values().next().value;
70
- if (typeof oldest !== "string")
94
+ dispose() {
95
+ this.unsubscribeSettingsChanges();
96
+ }
97
+ isAutomaticReflectionEnabled() {
98
+ const settingsManager = this.deps.getSettingsManager();
99
+ const settings = resolveAutoLearnSettings(settingsManager.getAutonomySettings().mode, settingsManager.getAutoLearnSettings());
100
+ return isCurrentSessionReflectionEnabled(settings) && !this.deps.isChildSession() && !this.deps.isDisposed();
101
+ }
102
+ /** Latest durable cue snapshot on the active session branch; custom state never enters model context. */
103
+ getCurrentTurnCueState() {
104
+ if (this.cueStateCacheInitialized)
105
+ return this.cueStateCache;
106
+ const sessionManager = this.deps.getSessionManager();
107
+ let fromId;
108
+ while (true) {
109
+ const entry = sessionManager.getLatestCustomEntryOnBranch(CURRENT_TURN_REFLECTION_STATE_CUSTOM_TYPE, fromId);
110
+ if (!entry)
71
111
  break;
72
- this.scheduledDigests.delete(oldest);
73
- }
74
- this.pendingTurns.push({ analysis, contextHeadroomPct });
75
- let pendingChars = this.pendingTurns.reduce((total, turn) => total + turn.analysis.recentTurnText.length, 0);
76
- while (this.pendingTurns.length > 1 && pendingChars > REFLECTION_PENDING_MAX_CHARS) {
77
- pendingChars -= this.pendingTurns.shift()?.analysis.recentTurnText.length ?? 0;
112
+ const state = parseCurrentTurnReflectionCueState(entry.data);
113
+ if (state) {
114
+ this.cueStateCache = state;
115
+ break;
116
+ }
117
+ if (!entry.parentId)
118
+ break;
119
+ fromId = entry.parentId;
78
120
  }
79
- this.schedulePendingPass();
80
- return analysis;
121
+ this.cueStateCacheInitialized = true;
122
+ return this.cueStateCache;
123
+ }
124
+ /** Branch/session navigation invalidates the lazy latest-state index; ordinary appends do not. */
125
+ invalidateCurrentTurnCueStateCache() {
126
+ this.cueStateCacheInitialized = false;
127
+ this.cueStateCache = undefined;
81
128
  }
82
- schedulePendingPass() {
83
- if (this.activeScheduledPass || this.scheduledTimer || this.pendingTurns.length === 0 || this.deps.isDisposed()) {
129
+ persistCurrentTurnCueState(state) {
130
+ this.deps.getSessionManager().appendCustomEntry(CURRENT_TURN_REFLECTION_STATE_CUSTOM_TYPE, state);
131
+ this.cueStateCache = state;
132
+ this.cueStateCacheInitialized = true;
133
+ }
134
+ synchronizeCurrentTurnCueWithSettings() {
135
+ if (this.isAutomaticReflectionEnabled())
84
136
  return;
85
- }
86
- const delay = Math.max(0, REFLECTION_MIN_INTERVAL_MS - (Date.now() - this.lastScheduledPassAt));
87
- if (delay > 0) {
88
- this.scheduledTimer = setTimeout(() => {
89
- this.scheduledTimer = undefined;
90
- this.startPendingPass();
91
- }, delay);
92
- this.scheduledTimer.unref?.();
137
+ const current = this.getCurrentTurnCueState();
138
+ if (current?.status !== "pending")
93
139
  return;
94
- }
95
- this.startPendingPass();
140
+ this.persistCurrentTurnCueState({
141
+ ...current,
142
+ revision: current.revision + 1,
143
+ status: "dismissed",
144
+ updatedAt: new Date().toISOString(),
145
+ });
96
146
  }
97
- startPendingPass() {
98
- if (this.activeScheduledPass || this.pendingTurns.length === 0 || this.deps.isDisposed())
99
- return;
100
- const turns = this.pendingTurns.splice(0);
101
- const trigger = turns.reduce((selected, turn) => reflectionTriggerPriority(turn.analysis.trigger) > reflectionTriggerPriority(selected)
102
- ? turn.analysis.trigger
103
- : selected, "none");
104
- const recentTurnText = boundReflectionSemanticText(turns.map((turn) => turn.analysis.recentTurnText).join("\n---\n"), REFLECTION_PENDING_MAX_CHARS);
105
- const reportDigest = createHash("sha256")
106
- .update(turns.map((turn) => turn.analysis.digest).join("\0"))
107
- .digest("hex")
108
- .slice(0, 24);
109
- const settings = this.deps.getSettingsManager().getAutoLearnSettings();
110
- let model;
111
- if (settings.model && settings.model !== "active") {
112
- const resolved = resolveCliModel({ cliModel: settings.model, modelRegistry: this.deps.getModelRegistry() });
113
- if (resolved.model && this.deps.getModelRegistry().hasConfiguredAuth(resolved.model))
114
- model = resolved.model;
147
+ /**
148
+ * Persist one logical pending cue. Repeated triggers merge into the existing pending snapshot;
149
+ * they never append competing pending cues or retain raw transcript text.
150
+ */
151
+ queueCurrentTurnCue(trigger) {
152
+ if (!this.isAutomaticReflectionEnabled()) {
153
+ this.synchronizeCurrentTurnCueWithSettings();
154
+ return false;
115
155
  }
116
- const toolCallCount = turns.reduce((total, turn) => total + turn.analysis.toolCallCount, 0);
117
- const contextHeadroomPct = Math.min(...turns.map((turn) => turn.contextHeadroomPct));
118
- this.lastScheduledPassAt = Date.now();
119
- this.activeScheduledPass = (async () => {
120
- try {
121
- await this.runReflectionPass({
122
- signals: {
123
- trigger,
124
- toolCallCount,
125
- hadCorrection: turns.some((turn) => turn.analysis.hadCorrection),
126
- contextHeadroomPct,
127
- usefulLately: 0,
128
- },
129
- recentTurnText,
130
- reportId: `reflection:${reportDigest}`,
131
- model,
132
- thinkingLevel: settings.thinkingLevel ?? "low",
133
- explicitUserMemoryInstruction: turns.every((turn) => turn.analysis.explicitUserMemoryInstruction),
134
- });
135
- }
136
- catch {
137
- // Best-effort background learning must never disrupt the foreground turn.
138
- }
139
- finally {
140
- this.activeScheduledPass = undefined;
141
- this.schedulePendingPass();
142
- }
143
- })();
156
+ const current = this.getCurrentTurnCueState();
157
+ const updatedAt = new Date().toISOString();
158
+ if (current?.status === "pending") {
159
+ if (current.triggers.includes(trigger))
160
+ return false;
161
+ const next = {
162
+ ...current,
163
+ revision: current.revision + 1,
164
+ triggers: [...current.triggers, trigger],
165
+ updatedAt,
166
+ };
167
+ this.persistCurrentTurnCueState(next);
168
+ return true;
169
+ }
170
+ const next = {
171
+ version: 1,
172
+ revision: 1,
173
+ cueId: randomUUID(),
174
+ status: "pending",
175
+ triggers: [trigger],
176
+ createdAt: updatedAt,
177
+ updatedAt,
178
+ };
179
+ this.persistCurrentTurnCueState(next);
180
+ return true;
144
181
  }
145
- cancelScheduled() {
146
- if (this.scheduledTimer)
147
- clearTimeout(this.scheduledTimer);
148
- this.scheduledTimer = undefined;
149
- this.pendingTurns.length = 0;
182
+ /**
183
+ * Preview one transient provider-only cue. Discarded/replanned previews do nothing; the accepted
184
+ * provider-plan commit closes exactly the captured cue id + revision.
185
+ */
186
+ previewCurrentTurnCue() {
187
+ const current = this.getCurrentTurnCueState();
188
+ if (current?.status !== "pending" || !this.isAutomaticReflectionEnabled())
189
+ return undefined;
190
+ const cueId = current.cueId;
191
+ const revision = current.revision;
192
+ const message = {
193
+ role: "custom",
194
+ customType: CURRENT_TURN_REFLECTION_CUSTOM_TYPE,
195
+ content: `${CURRENT_TURN_REFLECTION_CUE}\n- Pending evidence classes: ${current.triggers.join(", ")}.`,
196
+ display: false,
197
+ details: {
198
+ version: 1,
199
+ scope: "root-current-turn",
200
+ automaticProviderRequests: 0,
201
+ cueId: current.cueId,
202
+ triggers: current.triggers,
203
+ },
204
+ timestamp: Date.now(),
205
+ };
206
+ const isCurrent = () => {
207
+ const latest = this.getCurrentTurnCueState();
208
+ return (this.isAutomaticReflectionEnabled() &&
209
+ latest?.status === "pending" &&
210
+ latest.cueId === cueId &&
211
+ latest.revision === revision);
212
+ };
213
+ return {
214
+ message,
215
+ isCurrent,
216
+ commit: () => {
217
+ if (!isCurrent())
218
+ throw new Error("Reflection cue changed before provider-plan commit");
219
+ const latest = this.getCurrentTurnCueState();
220
+ if (!latest)
221
+ throw new Error("Reflection cue disappeared before provider-plan commit");
222
+ const next = {
223
+ ...latest,
224
+ revision: latest.revision + 1,
225
+ status: "consumed",
226
+ updatedAt: new Date().toISOString(),
227
+ };
228
+ this.persistCurrentTurnCueState(next);
229
+ },
230
+ };
150
231
  }
151
- async waitForActivePass() {
152
- while (this.activeScheduledPass)
153
- await this.activeScheduledPass;
232
+ /** Pure completed-turn projection used only by deterministic memory synchronization. */
233
+ analyzeCompletedTurn(messages) {
234
+ const settingsManager = this.deps.getSettingsManager();
235
+ const settings = resolveAutoLearnSettings(settingsManager.getAutonomySettings().mode, settingsManager.getAutoLearnSettings());
236
+ return analyzeReflectionTurn(messages, settings.complexTaskToolCalls);
154
237
  }
155
238
  /**
156
- * Run an LLM completion fully ISOLATED from the main session the load-bearing primitive for
157
- * reflection and bounded child lanes (adaptive-agent design §6c/§7).
239
+ * Run an explicit LLM completion fully ISOLATED from the main session for bounded host-owned
240
+ * consumers. Automatic reflection never reaches this primitive.
158
241
  *
159
242
  * Isolation invariants (audited by codex): builds fresh context (no main history), defaults to no
160
243
  * tools, and passes **no real `sessionId`** — only a deterministic SYNTHETIC cache-affinity key
@@ -163,8 +246,8 @@ export class ReflectionController {
163
246
  * and applies a turn bound only when its owner explicitly supplies one. It cannot mutate `agent.state.messages`, append session entries, or touch the
164
247
  * foreground tool registry. Mirrors `generateSummary()`'s one-shot mechanics otherwise.
165
248
  *
166
- * Returns the result even on an error/aborted stop reason (callers e.g. a background reflection
167
- * microtask — decide whether to act); it does not throw on a model-level error.
249
+ * Returns the result even on an error/aborted stop reason; the explicit caller decides whether to
250
+ * act, and a model-level error is returned rather than thrown.
168
251
  */
169
252
  async runIsolatedCompletion(opts) {
170
253
  if (opts.maxTurns !== undefined && (!Number.isSafeInteger(opts.maxTurns) || opts.maxTurns <= 0)) {
@@ -370,10 +453,10 @@ export class ReflectionController {
370
453
  }
371
454
  }
372
455
  /**
373
- * Native end-of-loop reflection pass (R2). Demand-gates (zero-I/O), and when warranted runs the
374
- * {@link ReflectionEngine} via an isolated completion ({@link runIsolatedCompletion}), applies the
375
- * resulting memory writes through the bundled `memory` tool, and accounts the reflection's token
376
- * cost via the cost-aggregation surface so it stays visible and net-negative-auditable.
456
+ * Explicit compatibility/application seam for an owner-invoked structured reflection pass. This
457
+ * method can make an isolated provider request, so automatic current-turn reflection never calls
458
+ * it. Demand-gates (zero-I/O), applies resulting writes through the bundled `memory` tool, and
459
+ * accounts the explicitly requested pass through the spawned-usage surface.
377
460
  *
378
461
  * Returns `null` when the gate skips (or in a child session, which must not learn). The whole pass
379
462
  * is best-effort: a model/parse error yields no writes, never throws into the caller.
@@ -795,7 +878,13 @@ export class ReflectionController {
795
878
  _checkSkillPromotionOverlap(write) {
796
879
  try {
797
880
  const cwd = this.deps.getCwd?.() ?? process.cwd();
798
- const audit = runSkillAudit(cwd, write);
881
+ const audit = runSkillAudit(cwd, write, this.deps.getSkillsForAudit?.(), undefined, DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS);
882
+ if (audit.truncated) {
883
+ return {
884
+ reasonCode: SKILL_AUDIT_UNAVAILABLE_REASON_CODE,
885
+ note: "skill overlap audit exceeded its bounded universe; promotion held rather than written unaudited",
886
+ };
887
+ }
799
888
  const overlap = audit.nearDuplicates.find((d) => d.a === "[draft]" || d.b === "[draft]");
800
889
  if (!overlap)
801
890
  return undefined;