@caupulican/pi-adaptative 0.94.0 → 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 (371) hide show
  1. package/CHANGELOG.md +55 -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-paths.d.ts +2 -0
  18. package/dist/core/agent-paths.d.ts.map +1 -1
  19. package/dist/core/agent-paths.js +7 -0
  20. package/dist/core/agent-paths.js.map +1 -1
  21. package/dist/core/agent-session.d.ts +11 -41
  22. package/dist/core/agent-session.d.ts.map +1 -1
  23. package/dist/core/agent-session.js +98 -161
  24. package/dist/core/agent-session.js.map +1 -1
  25. package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
  26. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  27. package/dist/core/autonomy/envelope-enforcement.js +26 -25
  28. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  29. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  30. package/dist/core/autonomy/lane-private-paths.js +2 -1
  31. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  32. package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
  33. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  34. package/dist/core/autonomy/lane-tool-surface.js +45 -30
  35. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  36. package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
  37. package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
  38. package/dist/core/autonomy/worker-session-private-scope.js +42 -0
  39. package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
  40. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
  41. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
  42. package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
  43. package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
  44. package/dist/core/background-lane-controller.d.ts +9 -1
  45. package/dist/core/background-lane-controller.d.ts.map +1 -1
  46. package/dist/core/background-lane-controller.js +76 -6
  47. package/dist/core/background-lane-controller.js.map +1 -1
  48. package/dist/core/background-tool-task-controller.d.ts +23 -2
  49. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  50. package/dist/core/background-tool-task-controller.js +132 -17
  51. package/dist/core/background-tool-task-controller.js.map +1 -1
  52. package/dist/core/context/long-term-memory-trigger.d.ts +3 -1
  53. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  54. package/dist/core/context/long-term-memory-trigger.js +1 -1
  55. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  56. package/dist/core/context/okf-memory-provider.d.ts +3 -0
  57. package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
  58. package/dist/core/context/okf-memory-provider.js +66 -31
  59. package/dist/core/context/okf-memory-provider.js.map +1 -1
  60. package/dist/core/context/okf-memory.d.ts +18 -1
  61. package/dist/core/context/okf-memory.d.ts.map +1 -1
  62. package/dist/core/context/okf-memory.js +48 -0
  63. package/dist/core/context/okf-memory.js.map +1 -1
  64. package/dist/core/cost-guard-controller.d.ts +37 -0
  65. package/dist/core/cost-guard-controller.d.ts.map +1 -0
  66. package/dist/core/cost-guard-controller.js +71 -0
  67. package/dist/core/cost-guard-controller.js.map +1 -0
  68. package/dist/core/cost-guard.d.ts +9 -4
  69. package/dist/core/cost-guard.d.ts.map +1 -1
  70. package/dist/core/cost-guard.js +7 -3
  71. package/dist/core/cost-guard.js.map +1 -1
  72. package/dist/core/delegation/worker-agent-control.d.ts +4 -0
  73. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  74. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  75. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  76. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  77. package/dist/core/delegation/worker-attempt-executor.js +0 -1
  78. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  79. package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
  80. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-authority-resolver.js +114 -55
  82. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  83. package/dist/core/delegation/worker-claim.d.ts +1 -2
  84. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  85. package/dist/core/delegation/worker-claim.js.map +1 -1
  86. package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
  87. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  88. package/dist/core/delegation/worker-delegation-controller.js +125 -40
  89. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  90. package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
  91. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  92. package/dist/core/delegation/worker-delegation-request.js +13 -19
  93. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  94. package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
  95. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  96. package/dist/core/delegation/worker-execution-policy.js +54 -39
  97. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  98. package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
  99. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  100. package/dist/core/delegation/worker-fleet-limits.js +7 -7
  101. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  102. package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
  103. package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
  104. package/dist/core/delegation/worker-machine-scope.js +38 -0
  105. package/dist/core/delegation/worker-machine-scope.js.map +1 -0
  106. package/dist/core/delegation/worker-notification-coordinator.d.ts +10 -0
  107. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  108. package/dist/core/delegation/worker-notification-coordinator.js +69 -3
  109. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  110. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  111. package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
  112. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  113. package/dist/core/delegation/worker-runner.d.ts +5 -7
  114. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  115. package/dist/core/delegation/worker-runner.js +1 -4
  116. package/dist/core/delegation/worker-runner.js.map +1 -1
  117. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
  118. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  119. package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
  120. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  121. package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
  122. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  123. package/dist/core/durable-custom-message-turn-controller.js +38 -15
  124. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  125. package/dist/core/extension-binding-controller.d.ts +5 -1
  126. package/dist/core/extension-binding-controller.d.ts.map +1 -1
  127. package/dist/core/extension-binding-controller.js +15 -0
  128. package/dist/core/extension-binding-controller.js.map +1 -1
  129. package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
  130. package/dist/core/extensions/factory-runtime.js +5 -0
  131. package/dist/core/extensions/factory-runtime.js.map +1 -1
  132. package/dist/core/extensions/runner.d.ts.map +1 -1
  133. package/dist/core/extensions/runner.js +1 -0
  134. package/dist/core/extensions/runner.js.map +1 -1
  135. package/dist/core/extensions/types.d.ts +8 -4
  136. package/dist/core/extensions/types.d.ts.map +1 -1
  137. package/dist/core/extensions/types.js.map +1 -1
  138. package/dist/core/foreground-terminal-handoff-controller.d.ts +31 -0
  139. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  140. package/dist/core/foreground-terminal-handoff-controller.js +239 -55
  141. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  142. package/dist/core/goals/goal-session-controller.d.ts +2 -0
  143. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  144. package/dist/core/goals/goal-session-controller.js +8 -0
  145. package/dist/core/goals/goal-session-controller.js.map +1 -1
  146. package/dist/core/goals/goal-tool-core.d.ts +5 -4
  147. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  148. package/dist/core/goals/goal-tool-core.js +23 -19
  149. package/dist/core/goals/goal-tool-core.js.map +1 -1
  150. package/dist/core/learning/auto-learn-settings.d.ts +84 -0
  151. package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
  152. package/dist/core/learning/auto-learn-settings.js +66 -0
  153. package/dist/core/learning/auto-learn-settings.js.map +1 -0
  154. package/dist/core/learning/learning-audit.d.ts +5 -1
  155. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  156. package/dist/core/learning/learning-audit.js +32 -1
  157. package/dist/core/learning/learning-audit.js.map +1 -1
  158. package/dist/core/learning/reflection-engine.d.ts +24 -0
  159. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  160. package/dist/core/learning/reflection-engine.js +104 -8
  161. package/dist/core/learning/reflection-engine.js.map +1 -1
  162. package/dist/core/local-prefix-warm-controller.d.ts +24 -0
  163. package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
  164. package/dist/core/local-prefix-warm-controller.js +79 -0
  165. package/dist/core/local-prefix-warm-controller.js.map +1 -0
  166. package/dist/core/memory/okf-project-memory-store.d.ts +28 -0
  167. package/dist/core/memory/okf-project-memory-store.d.ts.map +1 -0
  168. package/dist/core/memory/okf-project-memory-store.js +111 -0
  169. package/dist/core/memory/okf-project-memory-store.js.map +1 -0
  170. package/dist/core/memory/providers/file-store.d.ts +44 -1
  171. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  172. package/dist/core/memory/providers/file-store.js +341 -24
  173. package/dist/core/memory/providers/file-store.js.map +1 -1
  174. package/dist/core/memory/worker-memory-tools.d.ts +5 -0
  175. package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
  176. package/dist/core/memory/worker-memory-tools.js +5 -0
  177. package/dist/core/memory/worker-memory-tools.js.map +1 -0
  178. package/dist/core/memory-controller.d.ts +10 -1
  179. package/dist/core/memory-controller.d.ts.map +1 -1
  180. package/dist/core/memory-controller.js +72 -8
  181. package/dist/core/memory-controller.js.map +1 -1
  182. package/dist/core/model-capability.d.ts +7 -0
  183. package/dist/core/model-capability.d.ts.map +1 -1
  184. package/dist/core/model-capability.js +12 -0
  185. package/dist/core/model-capability.js.map +1 -1
  186. package/dist/core/model-registry.d.ts.map +1 -1
  187. package/dist/core/model-registry.js +2 -10
  188. package/dist/core/model-registry.js.map +1 -1
  189. package/dist/core/model-router-controller.d.ts +3 -2
  190. package/dist/core/model-router-controller.d.ts.map +1 -1
  191. package/dist/core/model-router-controller.js +3 -2
  192. package/dist/core/model-router-controller.js.map +1 -1
  193. package/dist/core/orchestration/contracts.d.ts +16 -12
  194. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  195. package/dist/core/orchestration/contracts.js +2 -2
  196. package/dist/core/orchestration/contracts.js.map +1 -1
  197. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  198. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  199. package/dist/core/orchestration/lane-tool-manifests.js +6 -1
  200. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  201. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  202. package/dist/core/orchestration/profile-registry.js +14 -0
  203. package/dist/core/orchestration/profile-registry.js.map +1 -1
  204. package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
  205. package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
  206. package/dist/core/orchestration/task-profile-writer.js +71 -59
  207. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  208. package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
  209. package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
  210. package/dist/core/orchestration/thinking-level-schema.js +19 -0
  211. package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
  212. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  213. package/dist/core/orchestration/worker-execution-contract.js +12 -5
  214. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  215. package/dist/core/provider-prompt-contracts.d.ts +1 -4
  216. package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
  217. package/dist/core/provider-prompt-contracts.js +13 -29
  218. package/dist/core/provider-prompt-contracts.js.map +1 -1
  219. package/dist/core/provider-request-context-controller.d.ts +2 -0
  220. package/dist/core/provider-request-context-controller.d.ts.map +1 -1
  221. package/dist/core/provider-request-context-controller.js +10 -3
  222. package/dist/core/provider-request-context-controller.js.map +1 -1
  223. package/dist/core/reflection-controller.d.ts +63 -27
  224. package/dist/core/reflection-controller.d.ts.map +1 -1
  225. package/dist/core/reflection-controller.js +300 -132
  226. package/dist/core/reflection-controller.js.map +1 -1
  227. package/dist/core/runtime-builder.d.ts +1 -0
  228. package/dist/core/runtime-builder.d.ts.map +1 -1
  229. package/dist/core/runtime-builder.js +25 -14
  230. package/dist/core/runtime-builder.js.map +1 -1
  231. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  232. package/dist/core/secrets/credential-exposure-guard.js +55 -10
  233. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  234. package/dist/core/session-role.d.ts +6 -8
  235. package/dist/core/session-role.d.ts.map +1 -1
  236. package/dist/core/session-role.js +8 -18
  237. package/dist/core/session-role.js.map +1 -1
  238. package/dist/core/settings-manager.d.ts +13 -16
  239. package/dist/core/settings-manager.d.ts.map +1 -1
  240. package/dist/core/settings-manager.js +53 -50
  241. package/dist/core/settings-manager.js.map +1 -1
  242. package/dist/core/skill-vault.d.ts +15 -0
  243. package/dist/core/skill-vault.d.ts.map +1 -1
  244. package/dist/core/skill-vault.js +79 -45
  245. package/dist/core/skill-vault.js.map +1 -1
  246. package/dist/core/skills.d.ts +3 -0
  247. package/dist/core/skills.d.ts.map +1 -1
  248. package/dist/core/skills.js +6 -6
  249. package/dist/core/skills.js.map +1 -1
  250. package/dist/core/system-prompt-builder.d.ts +2 -0
  251. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  252. package/dist/core/system-prompt-builder.js +52 -12
  253. package/dist/core/system-prompt-builder.js.map +1 -1
  254. package/dist/core/system-prompt.js +1 -1
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/tool-capability-policy.d.ts +3 -0
  257. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  258. package/dist/core/tool-capability-policy.js +13 -2
  259. package/dist/core/tool-capability-policy.js.map +1 -1
  260. package/dist/core/toolkit/script-runner.d.ts +2 -1
  261. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  262. package/dist/core/toolkit/script-runner.js +10 -2
  263. package/dist/core/toolkit/script-runner.js.map +1 -1
  264. package/dist/core/tools/delegate-status.d.ts +3 -1
  265. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  266. package/dist/core/tools/delegate-status.js +5 -1
  267. package/dist/core/tools/delegate-status.js.map +1 -1
  268. package/dist/core/tools/delegate.d.ts +4 -13
  269. package/dist/core/tools/delegate.d.ts.map +1 -1
  270. package/dist/core/tools/delegate.js +173 -73
  271. package/dist/core/tools/delegate.js.map +1 -1
  272. package/dist/core/tools/goal.d.ts +3 -4
  273. package/dist/core/tools/goal.d.ts.map +1 -1
  274. package/dist/core/tools/goal.js +24 -7
  275. package/dist/core/tools/goal.js.map +1 -1
  276. package/dist/core/tools/profile-writer.d.ts +2 -8
  277. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  278. package/dist/core/tools/profile-writer.js +6 -18
  279. package/dist/core/tools/profile-writer.js.map +1 -1
  280. package/dist/core/tools/run-toolkit-script.d.ts +1 -1
  281. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  282. package/dist/core/tools/run-toolkit-script.js +2 -2
  283. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  284. package/dist/core/tools/skill-audit.d.ts +28 -1
  285. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  286. package/dist/core/tools/skill-audit.js +56 -12
  287. package/dist/core/tools/skill-audit.js.map +1 -1
  288. package/dist/core/tools/skill.d.ts +12 -1
  289. package/dist/core/tools/skill.d.ts.map +1 -1
  290. package/dist/core/tools/skill.js +52 -0
  291. package/dist/core/tools/skill.js.map +1 -1
  292. package/dist/core/tools/skillify.d.ts.map +1 -1
  293. package/dist/core/tools/skillify.js +16 -7
  294. package/dist/core/tools/skillify.js.map +1 -1
  295. package/dist/core/tools/task-steps.js +1 -1
  296. package/dist/core/tools/task-steps.js.map +1 -1
  297. package/dist/core/tools/tmux-dispatch.d.ts +4 -16
  298. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  299. package/dist/core/tools/tmux-dispatch.js +5 -20
  300. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  301. package/dist/core/tools/tool-task.d.ts +1 -0
  302. package/dist/core/tools/tool-task.d.ts.map +1 -1
  303. package/dist/core/tools/tool-task.js +13 -8
  304. package/dist/core/tools/tool-task.js.map +1 -1
  305. package/dist/core/util/atomic-file.d.ts +2 -0
  306. package/dist/core/util/atomic-file.d.ts.map +1 -1
  307. package/dist/core/util/atomic-file.js +4 -0
  308. package/dist/core/util/atomic-file.js.map +1 -1
  309. package/dist/core/worktree-sync/codes.d.ts +1 -2
  310. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  311. package/dist/core/worktree-sync/codes.js +1 -2
  312. package/dist/core/worktree-sync/codes.js.map +1 -1
  313. package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
  314. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  315. package/dist/core/worktree-sync/lane-gate.js +5 -51
  316. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  317. package/dist/index.d.ts +5 -0
  318. package/dist/index.d.ts.map +1 -1
  319. package/dist/index.js +7 -0
  320. package/dist/index.js.map +1 -1
  321. package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
  322. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  323. package/dist/modes/interactive/auto-learn-controller.js +32 -207
  324. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  325. package/dist/modes/interactive/autonomy-commands.js +2 -2
  326. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  327. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  328. package/dist/modes/interactive/components/activity-lane.js +12 -23
  329. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  330. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/custom-message.js +142 -1
  332. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  333. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  334. package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
  335. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  336. package/dist/modes/interactive/components/footer.js +1 -1
  337. package/dist/modes/interactive/components/footer.js.map +1 -1
  338. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  339. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  340. package/dist/modes/interactive/components/settings-selector.js +150 -73
  341. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  342. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  343. package/dist/modes/interactive/report-commands.js +8 -4
  344. package/dist/modes/interactive/report-commands.js.map +1 -1
  345. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  346. package/dist/modes/interactive/settings-selector-flow.js +10 -0
  347. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  348. package/docs/extensions.md +8 -0
  349. package/docs/harness-architecture.md +28 -32
  350. package/docs/index.md +1 -1
  351. package/docs/process-matrix.md +8 -6
  352. package/docs/resources.md +1 -1
  353. package/docs/settings.md +61 -51
  354. package/docs/tmux-agent-manager.md +47 -40
  355. package/docs/usage.md +1 -1
  356. package/docs/worker-profiles.md +8 -6
  357. package/docs/worktree-sync.md +26 -20
  358. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  359. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  360. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  361. package/examples/extensions/sandbox/package-lock.json +2 -2
  362. package/examples/extensions/sandbox/package.json +1 -1
  363. package/examples/extensions/with-deps/package-lock.json +2 -2
  364. package/examples/extensions/with-deps/package.json +1 -1
  365. package/npm-shrinkwrap.json +12 -12
  366. package/package.json +4 -4
  367. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
  368. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
  369. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
  370. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
  371. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
@@ -1,148 +1,243 @@
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";
16
13
  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";
16
+ import { PI_OKF_TYPES } from "./context/okf-memory.js";
17
+ import { isCurrentSessionReflectionEnabled, resolveAutoLearnSettings } from "./learning/auto-learn-settings.js";
19
18
  import { APPLY_WRITE_REFUSED_REASON_CODE, appendLearningAuditSnapshot, contradictionsForReflectionWrite, getLearningAuditSnapshots, proposalFromReflectionWrite, rollbackPlanForReflectionWrite, } from "./learning/learning-audit.js";
20
19
  import { evaluateLearningDecision } from "./learning/learning-gate.js";
21
20
  import { ObservationStore, observationKey } from "./learning/observation-store.js";
22
21
  import { decideDemand, ReflectionEngine, } from "./learning/reflection-engine.js";
23
- import { analyzeReflectionTurn, boundReflectionSemanticText, reflectionTriggerPriority, } from "./learning/reflection-turn-analysis.js";
24
- import { resolveCliModel } from "./model-resolver.js";
22
+ import { analyzeReflectionTurn } from "./learning/reflection-turn-analysis.js";
25
23
  import { registerInFlightWork } from "./reload-blockers.js";
26
- import { runSkillAudit } from "./tools/skill-audit.js";
24
+ import { DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS, runSkillAudit } from "./tools/skill-audit.js";
27
25
  // reasonCode when an automatic skill promotion is blocked by an overlap with an existing skill
28
26
  // (skill_audit's similarity threshold) and routed to a consolidation proposal instead of a blind write.
29
27
  export const SKILL_OVERLAP_CONSOLIDATION_REASON_CODE = "skill_overlap_consolidation_proposed";
30
28
  // reasonCode when the overlap audit itself fails — the promotion is held (not written unaudited)
31
29
  // rather than silently skipping the check.
32
30
  export const SKILL_AUDIT_UNAVAILABLE_REASON_CODE = "skill_audit_unavailable";
33
- const REFLECTION_MIN_INTERVAL_MS = 45_000;
34
- const REFLECTION_PENDING_MAX_CHARS = 12_000;
35
- 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
+ }
74
+ function parseOkfRollbackTarget(target) {
75
+ if (!target)
76
+ return undefined;
77
+ const separator = target.indexOf("\0");
78
+ if (separator <= 0 || separator === target.length - 1)
79
+ return undefined;
80
+ const type = target.slice(0, separator);
81
+ if (!PI_OKF_TYPES.includes(type))
82
+ return undefined;
83
+ return { type: type, title: target.slice(separator + 1) };
84
+ }
36
85
  export class ReflectionController {
37
86
  constructor(deps) {
38
- this.pendingTurns = [];
39
- this.scheduledDigests = new Set();
40
- this.lastScheduledPassAt = 0;
87
+ this.cueStateCacheInitialized = false;
41
88
  this.deps = deps;
89
+ this.unsubscribeSettingsChanges = deps.getSettingsManager().subscribeChanges(() => {
90
+ this.synchronizeCurrentTurnCueWithSettings();
91
+ });
92
+ this.synchronizeCurrentTurnCueWithSettings();
42
93
  }
43
- /** Analyze once, schedule bounded background reflection when warranted, and return filtered turn text for sync hooks. */
44
- scheduleFromTurn(messages, contextHeadroomPct) {
45
- const settings = this.deps.getSettingsManager().getAutoLearnSettings();
46
- const analysis = analyzeReflectionTurn(messages, settings.complexTaskToolCalls ?? 12);
47
- const enabled = settings.enabled !== false &&
48
- settings.reflectionReview !== false &&
49
- process.env.PI_NATIVE_REFLECTION !== "0" &&
50
- process.env.PI_AUTO_LEARN_CHILD !== "1" &&
51
- !this.deps.isChildSession() &&
52
- !this.deps.isDisposed();
53
- if (!enabled || analysis.trigger === "none" || this.scheduledDigests.has(analysis.digest))
54
- return analysis;
55
- this.scheduledDigests.add(analysis.digest);
56
- while (this.scheduledDigests.size > REFLECTION_DIGEST_HISTORY_SIZE) {
57
- const oldest = this.scheduledDigests.values().next().value;
58
- 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)
59
111
  break;
60
- this.scheduledDigests.delete(oldest);
61
- }
62
- this.pendingTurns.push({ analysis, contextHeadroomPct });
63
- let pendingChars = this.pendingTurns.reduce((total, turn) => total + turn.analysis.recentTurnText.length, 0);
64
- while (this.pendingTurns.length > 1 && pendingChars > REFLECTION_PENDING_MAX_CHARS) {
65
- 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;
66
120
  }
67
- this.schedulePendingPass();
68
- 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;
128
+ }
129
+ persistCurrentTurnCueState(state) {
130
+ this.deps.getSessionManager().appendCustomEntry(CURRENT_TURN_REFLECTION_STATE_CUSTOM_TYPE, state);
131
+ this.cueStateCache = state;
132
+ this.cueStateCacheInitialized = true;
69
133
  }
70
- schedulePendingPass() {
71
- if (this.activeScheduledPass || this.scheduledTimer || this.pendingTurns.length === 0 || this.deps.isDisposed()) {
134
+ synchronizeCurrentTurnCueWithSettings() {
135
+ if (this.isAutomaticReflectionEnabled())
72
136
  return;
73
- }
74
- const delay = Math.max(0, REFLECTION_MIN_INTERVAL_MS - (Date.now() - this.lastScheduledPassAt));
75
- if (delay > 0) {
76
- this.scheduledTimer = setTimeout(() => {
77
- this.scheduledTimer = undefined;
78
- this.startPendingPass();
79
- }, delay);
80
- this.scheduledTimer.unref?.();
137
+ const current = this.getCurrentTurnCueState();
138
+ if (current?.status !== "pending")
81
139
  return;
82
- }
83
- this.startPendingPass();
140
+ this.persistCurrentTurnCueState({
141
+ ...current,
142
+ revision: current.revision + 1,
143
+ status: "dismissed",
144
+ updatedAt: new Date().toISOString(),
145
+ });
84
146
  }
85
- startPendingPass() {
86
- if (this.activeScheduledPass || this.pendingTurns.length === 0 || this.deps.isDisposed())
87
- return;
88
- const turns = this.pendingTurns.splice(0);
89
- const trigger = turns.reduce((selected, turn) => reflectionTriggerPriority(turn.analysis.trigger) > reflectionTriggerPriority(selected)
90
- ? turn.analysis.trigger
91
- : selected, "none");
92
- const recentTurnText = boundReflectionSemanticText(turns.map((turn) => turn.analysis.recentTurnText).join("\n---\n"), REFLECTION_PENDING_MAX_CHARS);
93
- const reportDigest = createHash("sha256")
94
- .update(turns.map((turn) => turn.analysis.digest).join("\0"))
95
- .digest("hex")
96
- .slice(0, 24);
97
- const settings = this.deps.getSettingsManager().getAutoLearnSettings();
98
- let model;
99
- if (settings.model && settings.model !== "active") {
100
- const resolved = resolveCliModel({ cliModel: settings.model, modelRegistry: this.deps.getModelRegistry() });
101
- if (resolved.model && this.deps.getModelRegistry().hasConfiguredAuth(resolved.model))
102
- 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;
103
155
  }
104
- const toolCallCount = turns.reduce((total, turn) => total + turn.analysis.toolCallCount, 0);
105
- const contextHeadroomPct = Math.min(...turns.map((turn) => turn.contextHeadroomPct));
106
- this.lastScheduledPassAt = Date.now();
107
- this.activeScheduledPass = (async () => {
108
- try {
109
- await this.runReflectionPass({
110
- signals: {
111
- trigger,
112
- toolCallCount,
113
- hadCorrection: turns.some((turn) => turn.analysis.hadCorrection),
114
- contextHeadroomPct,
115
- usefulLately: 0,
116
- },
117
- recentTurnText,
118
- reportId: `reflection:${reportDigest}`,
119
- model,
120
- thinkingLevel: settings.thinkingLevel ?? "low",
121
- explicitUserMemoryInstruction: turns.every((turn) => turn.analysis.explicitUserMemoryInstruction),
122
- });
123
- }
124
- catch {
125
- // Best-effort background learning must never disrupt the foreground turn.
126
- }
127
- finally {
128
- this.activeScheduledPass = undefined;
129
- this.schedulePendingPass();
130
- }
131
- })();
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;
132
181
  }
133
- cancelScheduled() {
134
- if (this.scheduledTimer)
135
- clearTimeout(this.scheduledTimer);
136
- this.scheduledTimer = undefined;
137
- 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
+ };
138
231
  }
139
- async waitForActivePass() {
140
- while (this.activeScheduledPass)
141
- 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);
142
237
  }
143
238
  /**
144
- * Run an LLM completion fully ISOLATED from the main session the load-bearing primitive for
145
- * 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.
146
241
  *
147
242
  * Isolation invariants (audited by codex): builds fresh context (no main history), defaults to no
148
243
  * tools, and passes **no real `sessionId`** — only a deterministic SYNTHETIC cache-affinity key
@@ -151,8 +246,8 @@ export class ReflectionController {
151
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
152
247
  * foreground tool registry. Mirrors `generateSummary()`'s one-shot mechanics otherwise.
153
248
  *
154
- * Returns the result even on an error/aborted stop reason (callers e.g. a background reflection
155
- * 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.
156
251
  */
157
252
  async runIsolatedCompletion(opts) {
158
253
  if (opts.maxTurns !== undefined && (!Number.isSafeInteger(opts.maxTurns) || opts.maxTurns <= 0)) {
@@ -358,10 +453,10 @@ export class ReflectionController {
358
453
  }
359
454
  }
360
455
  /**
361
- * Native end-of-loop reflection pass (R2). Demand-gates (zero-I/O), and when warranted runs the
362
- * {@link ReflectionEngine} via an isolated completion ({@link runIsolatedCompletion}), applies the
363
- * resulting memory writes through the bundled `memory` tool, and accounts the reflection's token
364
- * 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.
365
460
  *
366
461
  * Returns `null` when the gate skips (or in a child session, which must not learn). The whole pass
367
462
  * is best-effort: a model/parse error yields no writes, never throws into the caller.
@@ -392,8 +487,13 @@ export class ReflectionController {
392
487
  const result = await new ReflectionEngine().reflect({
393
488
  recentTurnText: input.recentTurnText,
394
489
  // Read memory FRESH (not the prefix-cache-frozen system-prompt block) so confront-before-write
395
- // sees writes made earlier this session.
396
- existingMemory: this.deps.getMemoryManager().buildSystemPromptBlockFresh() || "",
490
+ // sees writes made earlier this session, including bounded structured OKF records.
491
+ existingMemory: [
492
+ this.deps.getMemoryManager().buildSystemPromptBlockFresh(),
493
+ this.deps.getFreshOkfMemoryForReflection(),
494
+ ]
495
+ .filter((block) => block.trim().length > 0)
496
+ .join("\n\n"),
397
497
  plan,
398
498
  complete,
399
499
  });
@@ -418,7 +518,7 @@ export class ReflectionController {
418
518
  writeIndex += 1;
419
519
  const proposalId = `${input.reportId ?? "reflection"}-w${writeIndex}`;
420
520
  const proposal = proposalFromReflectionWrite(write, proposalId);
421
- const rollback = rollbackPlanForReflectionWrite(write);
521
+ const plannedRollback = rollbackPlanForReflectionWrite(write);
422
522
  let observations = 1;
423
523
  if (policy.enabled) {
424
524
  try {
@@ -523,8 +623,10 @@ export class ReflectionController {
523
623
  // throwing. Capture that outcome instead of assuming "decision.kind === apply" means it landed
524
624
  // — otherwise a refused write leaves a phantom "apply" audit whose rollback later fails
525
625
  // not-found (or, worse, misfires against whatever now occupies that text).
526
- const applied = decision.kind === "apply" && !skillPromotionBlock ? await this._applyReflectionWrite(write, signal) : false;
527
- const writeFailed = decision.kind === "apply" && !skillPromotionBlock && !applied;
626
+ const applyResult = decision.kind === "apply" && !skillPromotionBlock
627
+ ? await this._applyReflectionWrite(write, signal)
628
+ : { applied: false };
629
+ const writeFailed = decision.kind === "apply" && !skillPromotionBlock && !applyResult.applied;
528
630
  if (decision.kind !== "no-op") {
529
631
  auditSequence += 1;
530
632
  appendLearningAuditSnapshot(this.deps.getSessionManager(), {
@@ -547,7 +649,9 @@ export class ReflectionController {
547
649
  decision,
548
650
  // No rollback plan on a failed apply or a held/proposed promotion — nothing durable
549
651
  // landed in either case, so there is nothing to undo.
550
- rollback: skillPromotionBlock || writeFailed ? undefined : rollback,
652
+ rollback: decision.kind === "apply" && !skillPromotionBlock && !writeFailed
653
+ ? (applyResult.rollback ?? plannedRollback)
654
+ : undefined,
551
655
  createdAt: new Date().toISOString(),
552
656
  });
553
657
  }
@@ -590,7 +694,7 @@ export class ReflectionController {
590
694
  case "memory_remove": {
591
695
  if (!rollback.target)
592
696
  return { ok: false, reason: "missing_rollback_target" };
593
- if (!(await this._applyReflectionWrite({ kind: "memory_remove", target: rollback.target }))) {
697
+ if (!(await this._applyReflectionWrite({ kind: "memory_remove", target: rollback.target })).applied) {
594
698
  return { ok: false, reason: "rollback_apply_failed" };
595
699
  }
596
700
  break;
@@ -604,7 +708,7 @@ export class ReflectionController {
604
708
  target: rollback.target,
605
709
  text: rollback.previous,
606
710
  });
607
- if (!applied)
711
+ if (!applied.applied)
608
712
  return { ok: false, reason: "rollback_apply_failed" };
609
713
  break;
610
714
  }
@@ -616,6 +720,36 @@ export class ReflectionController {
616
720
  section: "MEMORY",
617
721
  text: rollback.previous,
618
722
  });
723
+ if (!applied.applied)
724
+ return { ok: false, reason: "rollback_apply_failed" };
725
+ break;
726
+ }
727
+ case "okf_remove": {
728
+ const target = parseOkfRollbackTarget(rollback.target);
729
+ if (!target)
730
+ return { ok: false, reason: "missing_rollback_target" };
731
+ const applied = await this.deps.rollbackStructuredReflectionWrite({
732
+ ...target,
733
+ expectedDigest: rollback.expectedDigest,
734
+ removeRecord: true,
735
+ });
736
+ if (!applied)
737
+ return { ok: false, reason: "rollback_apply_failed" };
738
+ break;
739
+ }
740
+ case "okf_organize": {
741
+ if (!rollback.target || rollback.previous === undefined) {
742
+ return { ok: false, reason: "missing_rollback_target" };
743
+ }
744
+ const target = parseOkfRollbackTarget(rollback.target);
745
+ if (!target)
746
+ return { ok: false, reason: "missing_rollback_target" };
747
+ const applied = await this.deps.rollbackStructuredReflectionWrite({
748
+ ...target,
749
+ expectedDigest: rollback.expectedDigest,
750
+ sourceText: rollback.previous,
751
+ removeRecord: rollback.removeOkf === true,
752
+ });
619
753
  if (!applied)
620
754
  return { ok: false, reason: "rollback_apply_failed" };
621
755
  break;
@@ -657,7 +791,35 @@ export class ReflectionController {
657
791
  const promoted = this._promoteReflectionSkill(write.name, write.description, write.body);
658
792
  if (promoted)
659
793
  this.deps.refreshLiveSkills?.();
660
- return promoted;
794
+ return { applied: promoted };
795
+ }
796
+ if (write.kind === "okf_add" || write.kind === "okf_organize") {
797
+ try {
798
+ const result = await this.deps.applyStructuredReflectionWrite(write, signal);
799
+ if (!result.applied || result.digest === undefined)
800
+ return { applied: false };
801
+ return {
802
+ applied: true,
803
+ rollback: write.kind === "okf_add"
804
+ ? {
805
+ kind: "okf_remove",
806
+ target: `${write.type}\0${write.title}`,
807
+ expectedDigest: result.digest,
808
+ instructions: "Remove only the exact structured OKF record created by this reflection.",
809
+ }
810
+ : {
811
+ kind: "okf_organize",
812
+ target: `${write.type}\0${write.title}`,
813
+ previous: write.sourceText,
814
+ expectedDigest: result.digest,
815
+ removeOkf: result.created,
816
+ instructions: "Restore the exact hot-memory source first, then remove only the OKF record created by this reflection.",
817
+ },
818
+ };
819
+ }
820
+ catch {
821
+ return { applied: false };
822
+ }
661
823
  }
662
824
  const memTool = this.deps
663
825
  .getMemoryManager()
@@ -665,7 +827,7 @@ export class ReflectionController {
665
827
  .find((t) => t.name === "memory");
666
828
  const exec = memTool?.execute;
667
829
  if (!exec)
668
- return false;
830
+ return { applied: false };
669
831
  const run = (params) => exec("reflection", params, signal, undefined, undefined);
670
832
  if (write.kind === "memory_add") {
671
833
  try {
@@ -674,11 +836,11 @@ export class ReflectionController {
674
836
  target: write.section === "USER" ? "user" : "memory",
675
837
  content: write.text,
676
838
  });
677
- return res?.details?.success === true;
839
+ return { applied: res?.details?.success === true };
678
840
  }
679
841
  catch {
680
842
  // best-effort; reflection writes must never throw into the turn loop
681
- return false;
843
+ return { applied: false };
682
844
  }
683
845
  }
684
846
  // replace / remove carry no target file — try MEMORY.md, then USER.md. The memory tool reports
@@ -692,16 +854,16 @@ export class ReflectionController {
692
854
  : { action: "remove", target, oldContent: write.target };
693
855
  const res = await run(params);
694
856
  if (res?.details?.success === true)
695
- return true; // applied
857
+ return { applied: true }; // applied
696
858
  if (!/not found/i.test(String(res?.details?.error ?? "")))
697
- return false; // real failure — don't misapply
859
+ return { applied: false }; // real failure
698
860
  // substring simply absent from this file — try the next target
699
861
  }
700
862
  catch {
701
863
  // defensive: if the tool ever does throw, try the next target
702
864
  }
703
865
  }
704
- return false;
866
+ return { applied: false };
705
867
  }
706
868
  /**
707
869
  * The same skill_audit overlap check the model-invoked `skillify` tool enforces
@@ -716,7 +878,13 @@ export class ReflectionController {
716
878
  _checkSkillPromotionOverlap(write) {
717
879
  try {
718
880
  const cwd = this.deps.getCwd?.() ?? process.cwd();
719
- 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
+ }
720
888
  const overlap = audit.nearDuplicates.find((d) => d.a === "[draft]" || d.b === "[draft]");
721
889
  if (!overlap)
722
890
  return undefined;