@caupulican/pi-adaptative 0.94.1 → 0.96.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 (369) hide show
  1. package/CHANGELOG.md +58 -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 +201 -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 +272 -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/extensions/tps/index.d.ts +3 -0
  16. package/dist/bundled-resources/extensions/tps/index.d.ts.map +1 -0
  17. package/dist/bundled-resources/extensions/tps/index.js +44 -0
  18. package/dist/bundled-resources/extensions/tps/index.js.map +1 -0
  19. package/dist/bundled-resources/extensions/tps/index.ts +48 -0
  20. package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
  21. package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
  22. package/dist/core/agent-session-services.d.ts.map +1 -1
  23. package/dist/core/agent-session-services.js +12 -3
  24. package/dist/core/agent-session-services.js.map +1 -1
  25. package/dist/core/agent-session.d.ts +11 -41
  26. package/dist/core/agent-session.d.ts.map +1 -1
  27. package/dist/core/agent-session.js +93 -160
  28. package/dist/core/agent-session.js.map +1 -1
  29. package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
  30. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  31. package/dist/core/autonomy/envelope-enforcement.js +26 -25
  32. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  33. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  34. package/dist/core/autonomy/lane-private-paths.js +2 -1
  35. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  36. package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
  37. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  38. package/dist/core/autonomy/lane-tool-surface.js +45 -30
  39. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  40. package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
  41. package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
  42. package/dist/core/autonomy/worker-session-private-scope.js +42 -0
  43. package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
  44. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
  45. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
  46. package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
  47. package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
  48. package/dist/core/background-lane-controller.d.ts +1 -1
  49. package/dist/core/background-lane-controller.d.ts.map +1 -1
  50. package/dist/core/background-lane-controller.js +1 -1
  51. package/dist/core/background-lane-controller.js.map +1 -1
  52. package/dist/core/background-tool-task-controller.d.ts +8 -2
  53. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  54. package/dist/core/background-tool-task-controller.js +10 -2
  55. package/dist/core/background-tool-task-controller.js.map +1 -1
  56. package/dist/core/compaction-controller.d.ts +3 -0
  57. package/dist/core/compaction-controller.d.ts.map +1 -1
  58. package/dist/core/compaction-controller.js +12 -1
  59. package/dist/core/compaction-controller.js.map +1 -1
  60. package/dist/core/cost-guard-controller.d.ts +37 -0
  61. package/dist/core/cost-guard-controller.d.ts.map +1 -0
  62. package/dist/core/cost-guard-controller.js +71 -0
  63. package/dist/core/cost-guard-controller.js.map +1 -0
  64. package/dist/core/cost-guard.d.ts +9 -4
  65. package/dist/core/cost-guard.d.ts.map +1 -1
  66. package/dist/core/cost-guard.js +7 -3
  67. package/dist/core/cost-guard.js.map +1 -1
  68. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  69. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  70. package/dist/core/delegation/worker-attempt-executor.js +0 -1
  71. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  72. package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
  73. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  74. package/dist/core/delegation/worker-authority-resolver.js +114 -55
  75. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  76. package/dist/core/delegation/worker-claim.d.ts +1 -2
  77. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  78. package/dist/core/delegation/worker-claim.js.map +1 -1
  79. package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
  80. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-delegation-controller.js +125 -40
  82. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  83. package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
  84. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  85. package/dist/core/delegation/worker-delegation-request.js +13 -19
  86. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  87. package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
  88. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  89. package/dist/core/delegation/worker-execution-policy.js +54 -39
  90. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  91. package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
  92. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  93. package/dist/core/delegation/worker-fleet-limits.js +7 -7
  94. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  95. package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
  96. package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
  97. package/dist/core/delegation/worker-machine-scope.js +38 -0
  98. package/dist/core/delegation/worker-machine-scope.js.map +1 -0
  99. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  100. package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
  101. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  102. package/dist/core/delegation/worker-runner.d.ts +5 -7
  103. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  104. package/dist/core/delegation/worker-runner.js +1 -4
  105. package/dist/core/delegation/worker-runner.js.map +1 -1
  106. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
  107. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  108. package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
  109. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  110. package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
  111. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  112. package/dist/core/durable-custom-message-turn-controller.js +38 -15
  113. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  114. package/dist/core/extension-binding-controller.d.ts +5 -1
  115. package/dist/core/extension-binding-controller.d.ts.map +1 -1
  116. package/dist/core/extension-binding-controller.js +15 -0
  117. package/dist/core/extension-binding-controller.js.map +1 -1
  118. package/dist/core/extension-import-authority.d.ts +3 -1
  119. package/dist/core/extension-import-authority.d.ts.map +1 -1
  120. package/dist/core/extension-import-authority.js +15 -0
  121. package/dist/core/extension-import-authority.js.map +1 -1
  122. package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
  123. package/dist/core/extensions/factory-runtime.js +5 -0
  124. package/dist/core/extensions/factory-runtime.js.map +1 -1
  125. package/dist/core/extensions/runner.d.ts.map +1 -1
  126. package/dist/core/extensions/runner.js +1 -0
  127. package/dist/core/extensions/runner.js.map +1 -1
  128. package/dist/core/extensions/types.d.ts +8 -4
  129. package/dist/core/extensions/types.d.ts.map +1 -1
  130. package/dist/core/extensions/types.js.map +1 -1
  131. package/dist/core/foreground-terminal-handoff-controller.d.ts +14 -0
  132. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  133. package/dist/core/foreground-terminal-handoff-controller.js +188 -72
  134. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  135. package/dist/core/goals/goal-session-controller.d.ts +2 -0
  136. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  137. package/dist/core/goals/goal-session-controller.js +8 -0
  138. package/dist/core/goals/goal-session-controller.js.map +1 -1
  139. package/dist/core/goals/goal-tool-core.d.ts +5 -4
  140. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  141. package/dist/core/goals/goal-tool-core.js +23 -19
  142. package/dist/core/goals/goal-tool-core.js.map +1 -1
  143. package/dist/core/keybindings.d.ts +2 -2
  144. package/dist/core/keybindings.d.ts.map +1 -1
  145. package/dist/core/keybindings.js +2 -2
  146. package/dist/core/keybindings.js.map +1 -1
  147. package/dist/core/learning/auto-learn-settings.d.ts +84 -0
  148. package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
  149. package/dist/core/learning/auto-learn-settings.js +66 -0
  150. package/dist/core/learning/auto-learn-settings.js.map +1 -0
  151. package/dist/core/learning/reflection-engine.d.ts +4 -0
  152. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  153. package/dist/core/learning/reflection-engine.js +48 -10
  154. package/dist/core/learning/reflection-engine.js.map +1 -1
  155. package/dist/core/local-prefix-warm-controller.d.ts +24 -0
  156. package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
  157. package/dist/core/local-prefix-warm-controller.js +79 -0
  158. package/dist/core/local-prefix-warm-controller.js.map +1 -0
  159. package/dist/core/memory/providers/file-store.d.ts +2 -0
  160. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  161. package/dist/core/memory/providers/file-store.js +71 -15
  162. package/dist/core/memory/providers/file-store.js.map +1 -1
  163. package/dist/core/memory/worker-memory-tools.d.ts +5 -0
  164. package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
  165. package/dist/core/memory/worker-memory-tools.js +5 -0
  166. package/dist/core/memory/worker-memory-tools.js.map +1 -0
  167. package/dist/core/model-capability.d.ts +7 -0
  168. package/dist/core/model-capability.d.ts.map +1 -1
  169. package/dist/core/model-capability.js +12 -0
  170. package/dist/core/model-capability.js.map +1 -1
  171. package/dist/core/model-registry.d.ts.map +1 -1
  172. package/dist/core/model-registry.js +2 -10
  173. package/dist/core/model-registry.js.map +1 -1
  174. package/dist/core/model-router-controller.d.ts +3 -2
  175. package/dist/core/model-router-controller.d.ts.map +1 -1
  176. package/dist/core/model-router-controller.js +3 -2
  177. package/dist/core/model-router-controller.js.map +1 -1
  178. package/dist/core/orchestration/contracts.d.ts +16 -12
  179. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  180. package/dist/core/orchestration/contracts.js +2 -2
  181. package/dist/core/orchestration/contracts.js.map +1 -1
  182. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  183. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  184. package/dist/core/orchestration/lane-tool-manifests.js +6 -1
  185. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  186. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  187. package/dist/core/orchestration/profile-registry.js +14 -0
  188. package/dist/core/orchestration/profile-registry.js.map +1 -1
  189. package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
  190. package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
  191. package/dist/core/orchestration/task-profile-writer.js +71 -59
  192. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  193. package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
  194. package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
  195. package/dist/core/orchestration/thinking-level-schema.js +19 -0
  196. package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
  197. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  198. package/dist/core/orchestration/worker-execution-contract.js +12 -5
  199. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  200. package/dist/core/profile-filter-controller.d.ts.map +1 -1
  201. package/dist/core/profile-filter-controller.js +5 -2
  202. package/dist/core/profile-filter-controller.js.map +1 -1
  203. package/dist/core/provider-prompt-contracts.d.ts +6 -5
  204. package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
  205. package/dist/core/provider-prompt-contracts.js +9 -11
  206. package/dist/core/provider-prompt-contracts.js.map +1 -1
  207. package/dist/core/provider-request-context-controller.d.ts +2 -0
  208. package/dist/core/provider-request-context-controller.d.ts.map +1 -1
  209. package/dist/core/provider-request-context-controller.js +10 -3
  210. package/dist/core/provider-request-context-controller.js.map +1 -1
  211. package/dist/core/reflection-controller.d.ts +56 -27
  212. package/dist/core/reflection-controller.d.ts.map +1 -1
  213. package/dist/core/reflection-controller.js +206 -117
  214. package/dist/core/reflection-controller.js.map +1 -1
  215. package/dist/core/resource-loader.d.ts.map +1 -1
  216. package/dist/core/resource-loader.js +6 -2
  217. package/dist/core/resource-loader.js.map +1 -1
  218. package/dist/core/risk-classifier.d.ts.map +1 -1
  219. package/dist/core/risk-classifier.js +22 -2
  220. package/dist/core/risk-classifier.js.map +1 -1
  221. package/dist/core/runtime-builder.d.ts +1 -0
  222. package/dist/core/runtime-builder.d.ts.map +1 -1
  223. package/dist/core/runtime-builder.js +25 -14
  224. package/dist/core/runtime-builder.js.map +1 -1
  225. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  226. package/dist/core/secrets/credential-exposure-guard.js +55 -10
  227. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  228. package/dist/core/session-role.d.ts +6 -8
  229. package/dist/core/session-role.d.ts.map +1 -1
  230. package/dist/core/session-role.js +8 -18
  231. package/dist/core/session-role.js.map +1 -1
  232. package/dist/core/settings-manager.d.ts +20 -16
  233. package/dist/core/settings-manager.d.ts.map +1 -1
  234. package/dist/core/settings-manager.js +75 -50
  235. package/dist/core/settings-manager.js.map +1 -1
  236. package/dist/core/skill-vault.d.ts +15 -0
  237. package/dist/core/skill-vault.d.ts.map +1 -1
  238. package/dist/core/skill-vault.js +79 -45
  239. package/dist/core/skill-vault.js.map +1 -1
  240. package/dist/core/skills.d.ts +3 -0
  241. package/dist/core/skills.d.ts.map +1 -1
  242. package/dist/core/skills.js +6 -6
  243. package/dist/core/skills.js.map +1 -1
  244. package/dist/core/system-prompt-builder.d.ts +3 -0
  245. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  246. package/dist/core/system-prompt-builder.js +73 -13
  247. package/dist/core/system-prompt-builder.js.map +1 -1
  248. package/dist/core/system-prompt.d.ts.map +1 -1
  249. package/dist/core/system-prompt.js +6 -2
  250. package/dist/core/system-prompt.js.map +1 -1
  251. package/dist/core/tool-capability-policy.d.ts +3 -0
  252. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  253. package/dist/core/tool-capability-policy.js +13 -2
  254. package/dist/core/tool-capability-policy.js.map +1 -1
  255. package/dist/core/toolkit/script-runner.d.ts +2 -1
  256. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  257. package/dist/core/toolkit/script-runner.js +10 -2
  258. package/dist/core/toolkit/script-runner.js.map +1 -1
  259. package/dist/core/tools/delegate-status.d.ts +1 -1
  260. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  261. package/dist/core/tools/delegate-status.js +1 -1
  262. package/dist/core/tools/delegate-status.js.map +1 -1
  263. package/dist/core/tools/delegate.d.ts +4 -15
  264. package/dist/core/tools/delegate.d.ts.map +1 -1
  265. package/dist/core/tools/delegate.js +111 -73
  266. package/dist/core/tools/delegate.js.map +1 -1
  267. package/dist/core/tools/goal.d.ts +3 -4
  268. package/dist/core/tools/goal.d.ts.map +1 -1
  269. package/dist/core/tools/goal.js +30 -23
  270. package/dist/core/tools/goal.js.map +1 -1
  271. package/dist/core/tools/orchestration-panel.d.ts +7 -0
  272. package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
  273. package/dist/core/tools/orchestration-panel.js +58 -9
  274. package/dist/core/tools/orchestration-panel.js.map +1 -1
  275. package/dist/core/tools/profile-writer.d.ts +2 -8
  276. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  277. package/dist/core/tools/profile-writer.js +6 -18
  278. package/dist/core/tools/profile-writer.js.map +1 -1
  279. package/dist/core/tools/run-toolkit-script.d.ts +1 -1
  280. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  281. package/dist/core/tools/run-toolkit-script.js +2 -2
  282. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  283. package/dist/core/tools/skill-audit.d.ts +28 -1
  284. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  285. package/dist/core/tools/skill-audit.js +56 -12
  286. package/dist/core/tools/skill-audit.js.map +1 -1
  287. package/dist/core/tools/skill.d.ts +12 -1
  288. package/dist/core/tools/skill.d.ts.map +1 -1
  289. package/dist/core/tools/skill.js +52 -0
  290. package/dist/core/tools/skill.js.map +1 -1
  291. package/dist/core/tools/skillify.d.ts.map +1 -1
  292. package/dist/core/tools/skillify.js +16 -7
  293. package/dist/core/tools/skillify.js.map +1 -1
  294. package/dist/core/tools/task-steps.d.ts.map +1 -1
  295. package/dist/core/tools/task-steps.js +2 -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/worktree-sync/codes.d.ts +1 -2
  302. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  303. package/dist/core/worktree-sync/codes.js +1 -2
  304. package/dist/core/worktree-sync/codes.js.map +1 -1
  305. package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
  306. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  307. package/dist/core/worktree-sync/lane-gate.js +5 -51
  308. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  309. package/dist/index.d.ts +5 -0
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +7 -0
  312. package/dist/index.js.map +1 -1
  313. package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
  314. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  315. package/dist/modes/interactive/auto-learn-controller.js +30 -207
  316. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  317. package/dist/modes/interactive/autonomy-commands.js +2 -2
  318. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  319. package/dist/modes/interactive/components/agents-overlay.d.ts +16 -4
  320. package/dist/modes/interactive/components/agents-overlay.d.ts.map +1 -1
  321. package/dist/modes/interactive/components/agents-overlay.js +108 -29
  322. package/dist/modes/interactive/components/agents-overlay.js.map +1 -1
  323. package/dist/modes/interactive/components/custom-message.js +17 -0
  324. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  325. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  326. package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
  327. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  328. package/dist/modes/interactive/components/footer.js +1 -1
  329. package/dist/modes/interactive/components/footer.js.map +1 -1
  330. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  331. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  332. package/dist/modes/interactive/components/settings-selector.js +150 -73
  333. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  334. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  335. package/dist/modes/interactive/interactive-mode.js +5 -4
  336. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  337. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  338. package/dist/modes/interactive/report-commands.js +8 -4
  339. package/dist/modes/interactive/report-commands.js.map +1 -1
  340. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  341. package/dist/modes/interactive/settings-selector-flow.js +10 -0
  342. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  343. package/docs/extensions.md +10 -0
  344. package/docs/harness-architecture.md +28 -32
  345. package/docs/index.md +2 -1
  346. package/docs/keybindings.md +2 -0
  347. package/docs/process-matrix.md +8 -6
  348. package/docs/resources.md +1 -1
  349. package/docs/settings.md +61 -51
  350. package/docs/task-steps.md +2 -0
  351. package/docs/tmux-agent-manager.md +48 -41
  352. package/docs/usage.md +1 -1
  353. package/docs/work-lifecycle.md +137 -0
  354. package/docs/worker-profiles.md +8 -6
  355. package/docs/worktree-sync.md +26 -20
  356. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  357. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  358. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  359. package/examples/extensions/sandbox/package-lock.json +2 -2
  360. package/examples/extensions/sandbox/package.json +1 -1
  361. package/examples/extensions/with-deps/package-lock.json +2 -2
  362. package/examples/extensions/with-deps/package.json +1 -1
  363. package/npm-shrinkwrap.json +12 -12
  364. package/package.json +4 -4
  365. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
  366. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
  367. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
  368. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
  369. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
@@ -1 +1 @@
1
- {"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { loadSkills, type Skill } from \"../skills.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst DUPLICATE_THRESHOLD = 0.55;\n\nconst STOPWORDS = new Set(\n\t\"the a an and or of for to with when use using from into this that skill task work working project agent agents code files file in on by as is are be do not should about\".split(\n\t\t\" \",\n\t),\n);\n\n/**\n * Tokenize text by lowercasing, removing non-alphanumeric chars (except hyphens and colons),\n * splitting on whitespace, and filtering out short tokens and stopwords.\n */\nexport function tokenize(text: string): string[] {\n\treturn [\n\t\t...new Set(\n\t\t\ttext\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9:-]+/g, \" \")\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((token) => token.length >= 3 && !STOPWORDS.has(token)),\n\t\t),\n\t];\n}\n\n/**\n * Calculate Jaccard similarity between two token sets.\n * Jaccard(A, B) = |A ∩ B| / |A ∪ B|\n */\nexport function jaccard(a: string[], b: string[]): number {\n\tif (a.length === 0 || b.length === 0) return 0;\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\tfor (const item of setA) if (setB.has(item)) intersection++;\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 0 : intersection / union;\n}\n\nexport interface SkillSummary {\n\tname: string;\n\tdescription: string;\n\tpath: string;\n\tscope: string;\n\tkeywords: string[];\n}\n\nexport interface SkillAuditReport {\n\tgeneratedAt: string;\n\tskills: SkillSummary[];\n\tnearDuplicates: Array<{\n\t\ta: string;\n\t\tb: string;\n\t\tsimilarity: number;\n\t\treason: string;\n\t}>;\n\tcompartmentWarnings: Array<{\n\t\tskill: string;\n\t\tpath: string;\n\t\treason: string;\n\t}>;\n\tnameCollisions: Array<{\n\t\tname: string;\n\t\tpaths: string[];\n\t}>;\n\trecommendations?: string[];\n}\n\n/**\n * Audit existing skills for overlap and compare against a draft skill.\n */\nexport function runSkillAudit(\n\tcwd: string,\n\tdraftSkill?: { name?: string; description?: string; body?: string },\n): SkillAuditReport {\n\t// Load existing skills\n\tconst result = loadSkills({\n\t\tcwd,\n\t\tagentDir: getAgentDir(),\n\t\tskillPaths: [],\n\t\tincludeDefaults: true,\n\t});\n\n\tconst skills: SkillSummary[] = result.skills.map((skill: Skill) => ({\n\t\tname: skill.name,\n\t\tdescription: skill.description,\n\t\tpath: skill.filePath,\n\t\tscope: skill.sourceInfo.scope ?? \"unknown\",\n\t\tkeywords: tokenize(`${skill.name} ${skill.description}`),\n\t}));\n\n\t// If a draft skill is provided, add it to the set for comparison\n\tif (draftSkill) {\n\t\tconst draftName = draftSkill.name || \"draft-skill\";\n\t\tconst draftDesc = draftSkill.description || \"\";\n\t\tskills.push({\n\t\t\tname: draftName,\n\t\t\tdescription: draftDesc,\n\t\t\tpath: \"[draft]\",\n\t\t\tscope: \"draft\",\n\t\t\tkeywords: tokenize(`${draftName} ${draftDesc} ${draftSkill.body || \"\"}`),\n\t\t});\n\t}\n\n\t// Find near-duplicates based on Jaccard similarity\n\tconst nearDuplicates: SkillAuditReport[\"nearDuplicates\"] = [];\n\tfor (let i = 0; i < skills.length; i++) {\n\t\tfor (let j = i + 1; j < skills.length; j++) {\n\t\t\tconst similarity = jaccard(skills[i].keywords, skills[j].keywords);\n\t\t\tif (similarity >= DUPLICATE_THRESHOLD) {\n\t\t\t\tconst reason =\n\t\t\t\t\tsimilarity >= 0.9\n\t\t\t\t\t\t? \"90%+ keyword overlap; merge/refine before adding another skill\"\n\t\t\t\t\t\t: \"high trigger/workflow overlap; review for dedup or compartmentalization\";\n\t\t\t\tnearDuplicates.push({\n\t\t\t\t\ta: skills[i].path,\n\t\t\t\t\tb: skills[j].path,\n\t\t\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tnearDuplicates.sort((a, b) => b.similarity - a.similarity);\n\n\t// Check for name collisions\n\tconst byName = new Map<string, string[]>();\n\tfor (const skill of skills) {\n\t\tconst existing = byName.get(skill.name) ?? [];\n\t\tbyName.set(skill.name, [...existing, skill.path]);\n\t}\n\tconst nameCollisions = [...byName.entries()]\n\t\t.filter(([, paths]) => paths.length > 1)\n\t\t.map(([name, paths]) => ({ name, paths }));\n\n\t// Build recommendations\n\tconst recommendations: string[] = [];\n\tif (draftSkill && nearDuplicates.length > 0) {\n\t\tconst draftNearDupes = nearDuplicates.filter((d) => d.a === \"[draft]\" || d.b === \"[draft]\");\n\t\tif (draftNearDupes.length > 0) {\n\t\t\trecommendations.push(\n\t\t\t\t`Draft skill has ${draftNearDupes.length} similar existing skill(s). Consider merging or refining the trigger/scope.`,\n\t\t\t);\n\t\t}\n\t}\n\tif (nameCollisions.length > 0) {\n\t\trecommendations.push(\n\t\t\t`Found ${nameCollisions.length} skill name collision(s). Resolve naming conflicts before deployment.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tgeneratedAt: new Date().toISOString(),\n\t\tskills: skills.filter((s) => s.path !== \"[draft]\"), // Don't include draft in final skill list\n\t\tnearDuplicates,\n\t\tcompartmentWarnings: [],\n\t\tnameCollisions,\n\t\trecommendations,\n\t};\n}\n\nconst skillAuditSchema = Type.Object({\n\tdraftName: Type.Optional(Type.String({ description: \"Name of the draft skill to audit\" })),\n\tdraftDescription: Type.Optional(Type.String({ description: \"Description of the draft skill\" })),\n\tdraftBody: Type.Optional(Type.String({ description: \"Body/content of the draft skill\" })),\n});\n\nexport type SkillAuditInput = Static<typeof skillAuditSchema>;\n\nexport interface SkillAuditToolDetails {\n\treportPath?: string;\n}\n\nexport interface SkillAuditToolOptions {}\n\nexport function createSkillAuditToolDefinition(\n\tcwd: string,\n\t_options?: SkillAuditToolOptions,\n): ToolDefinition<typeof skillAuditSchema, SkillAuditReport> {\n\treturn {\n\t\tname: \"skill_audit\",\n\t\tlabel: \"Skill Audit\",\n\t\tdescription:\n\t\t\t\"Check a draft/new skill for overlap with existing skills before creating it; flags near-duplicate triggers/descriptions via local Jaccard similarity. Read-only: does not write files.\",\n\t\tpromptSnippet: \"Audit skill for overlaps\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skill_audit to check draft skills for conflicts before creating them.\",\n\t\t\t\"Similarity >= 55% indicates potential dedup or compartmentalization work.\",\n\t\t],\n\t\tparameters: skillAuditSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ draftName, draftDescription, draftBody }: SkillAuditInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillAuditReport;\n\t\t}> {\n\t\t\tconst draftSkill =\n\t\t\t\tdraftName || draftDescription\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: draftName,\n\t\t\t\t\t\t\tdescription: draftDescription,\n\t\t\t\t\t\t\tbody: draftBody,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\n\t\t\tconst report = runSkillAudit(cwd, draftSkill);\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(\n\t\t\t\t`Skill audit: ${report.skills.length} skill(s), ${report.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (report.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlap warnings:\");\n\t\t\t\tfor (const item of report.nearDuplicates.slice(0, 8)) {\n\t\t\t\t\tconst aName = item.a.split(\"/\").pop() || item.a;\n\t\t\t\t\tconst bName = item.b.split(\"/\").pop() || item.b;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${aName} ↔ ${bName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of report.nameCollisions.slice(0, 8)) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} paths`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.recommendations && report.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of report.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nearDuplicates.length === 0 && report.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\nNo overlaps detected. This skill appears to be unique.\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillAuditTool(cwd: string, options?: SkillAuditToolOptions): AgentTool<typeof skillAuditSchema> {\n\treturn wrapToolDefinition(createSkillAuditToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { loadSkills, type Skill } from \"../skills.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst DUPLICATE_THRESHOLD = 0.55;\nexport const DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS = Object.freeze({\n\tmaxSkills: 256,\n\tmaxComparisonPairs: 32_768,\n\tmaxDraftFieldChars: 16_384,\n});\nexport const DEFAULT_WORKER_SKILL_AUDIT_MAX_SKILLS = DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS.maxSkills;\nexport const DEFAULT_WORKER_SKILL_AUDIT_MAX_COMPARISON_PAIRS = DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS.maxComparisonPairs;\nexport const DEFAULT_WORKER_SKILL_AUDIT_MAX_DRAFT_FIELD_CHARS = DEFAULT_BOUNDED_SKILL_AUDIT_LIMITS.maxDraftFieldChars;\n\nconst STOPWORDS = new Set(\n\t\"the a an and or of for to with when use using from into this that skill task work working project agent agents code files file in on by as is are be do not should about\".split(\n\t\t\" \",\n\t),\n);\n\n/**\n * Tokenize text by lowercasing, removing non-alphanumeric chars (except hyphens and colons),\n * splitting on whitespace, and filtering out short tokens and stopwords.\n */\nexport function tokenize(text: string): string[] {\n\treturn [\n\t\t...new Set(\n\t\t\ttext\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9:-]+/g, \" \")\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((token) => token.length >= 3 && !STOPWORDS.has(token)),\n\t\t),\n\t];\n}\n\n/**\n * Calculate Jaccard similarity between two token sets.\n * Jaccard(A, B) = |A ∩ B| / |A ∪ B|\n */\nexport function jaccard(a: string[], b: string[]): number {\n\tif (a.length === 0 || b.length === 0) return 0;\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\tfor (const item of setA) if (setB.has(item)) intersection++;\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 0 : intersection / union;\n}\n\nexport interface SkillSummary {\n\tname: string;\n\tdescription: string;\n\tpath: string;\n\tscope: string;\n\tkeywords: string[];\n}\n\nexport interface SkillAuditReport {\n\tgeneratedAt: string;\n\tskills: SkillSummary[];\n\tnearDuplicates: Array<{\n\t\ta: string;\n\t\tb: string;\n\t\tsimilarity: number;\n\t\treason: string;\n\t}>;\n\tcompartmentWarnings: Array<{\n\t\tskill: string;\n\t\tpath: string;\n\t\treason: string;\n\t}>;\n\tnameCollisions: Array<{\n\t\tname: string;\n\t\tpaths: string[];\n\t}>;\n\ttruncated?: boolean;\n\trecommendations?: string[];\n}\n\nexport interface SkillAuditRunOptions {\n\tsignal?: AbortSignal;\n\t/** Maximum number of host-provided skills considered by a bounded worker audit. */\n\tmaxSkills?: number;\n\t/** Maximum number of pair comparisons performed by a bounded worker audit. */\n\tmaxComparisonPairs?: number;\n\t/** Maximum characters accepted in each draft field before any discovery or comparison work. */\n\tmaxDraftFieldChars?: number;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n}\n\n/**\n * Audit existing skills for overlap and compare against a draft skill.\n */\nexport function runSkillAudit(\n\tcwd: string,\n\tdraftSkill?: { name?: string; description?: string; body?: string },\n\tprovidedSkills?: readonly Skill[],\n\tredactPath?: (path: string) => string,\n\trunOptions?: SkillAuditRunOptions,\n): SkillAuditReport {\n\tthrowIfAborted(runOptions?.signal);\n\tconst maxDraftFieldChars = runOptions?.maxDraftFieldChars;\n\tif (draftSkill && maxDraftFieldChars !== undefined) {\n\t\tfor (const [field, value] of [\n\t\t\t[\"draftName\", draftSkill.name],\n\t\t\t[\"draftDescription\", draftSkill.description],\n\t\t\t[\"draftBody\", draftSkill.body],\n\t\t] as const) {\n\t\t\tif (value !== undefined && value.length > maxDraftFieldChars) {\n\t\t\t\tthrow new Error(`skill_audit_draft_too_large:${field}`);\n\t\t\t}\n\t\t}\n\t}\n\t// Load existing skills\n\tconst skillsResult = providedSkills\n\t\t? { skills: providedSkills }\n\t\t: loadSkills({ cwd, agentDir: getAgentDir(), skillPaths: [], includeDefaults: true });\n\tconst maxSkills = runOptions?.maxSkills;\n\tconst sourceSkills =\n\t\tmaxSkills === undefined\n\t\t\t? skillsResult.skills\n\t\t\t: skillsResult.skills.slice(0, Math.max(0, maxSkills - (draftSkill ? 1 : 0)));\n\tlet truncated = sourceSkills.length < skillsResult.skills.length;\n\n\tconst skills: SkillSummary[] = sourceSkills.map((skill: Skill) => ({\n\t\tname: skill.name,\n\t\tdescription: skill.description,\n\t\tpath: redactPath?.(skill.filePath) ?? skill.filePath,\n\t\tscope: skill.sourceInfo.scope ?? \"unknown\",\n\t\tkeywords: tokenize(`${skill.name} ${skill.description}`),\n\t}));\n\n\t// If a draft skill is provided, add it to the set for comparison\n\tif (draftSkill) {\n\t\tthrowIfAborted(runOptions?.signal);\n\t\tconst draftName = draftSkill.name || \"draft-skill\";\n\t\tconst draftDesc = draftSkill.description || \"\";\n\t\tskills.push({\n\t\t\tname: draftName,\n\t\t\tdescription: draftDesc,\n\t\t\tpath: \"[draft]\",\n\t\t\tscope: \"draft\",\n\t\t\tkeywords: tokenize(`${draftName} ${draftDesc} ${draftSkill.body || \"\"}`),\n\t\t});\n\t}\n\n\t// Find near-duplicates based on Jaccard similarity\n\tconst nearDuplicates: SkillAuditReport[\"nearDuplicates\"] = [];\n\tlet comparisonPairs = 0;\n\tcomparisonLoop: for (let i = 0; i < skills.length; i++) {\n\t\tthrowIfAborted(runOptions?.signal);\n\t\tfor (let j = i + 1; j < skills.length; j++) {\n\t\t\tthrowIfAborted(runOptions?.signal);\n\t\t\tif (\n\t\t\t\trunOptions?.maxComparisonPairs !== undefined &&\n\t\t\t\tcomparisonPairs >= Math.max(0, runOptions.maxComparisonPairs)\n\t\t\t) {\n\t\t\t\ttruncated = true;\n\t\t\t\tbreak comparisonLoop;\n\t\t\t}\n\t\t\tcomparisonPairs++;\n\t\t\tconst similarity = jaccard(skills[i].keywords, skills[j].keywords);\n\t\t\tif (similarity >= DUPLICATE_THRESHOLD) {\n\t\t\t\tconst reason =\n\t\t\t\t\tsimilarity >= 0.9\n\t\t\t\t\t\t? \"90%+ keyword overlap; merge/refine before adding another skill\"\n\t\t\t\t\t\t: \"high trigger/workflow overlap; review for dedup or compartmentalization\";\n\t\t\t\tnearDuplicates.push({\n\t\t\t\t\ta: skills[i].path,\n\t\t\t\t\tb: skills[j].path,\n\t\t\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tnearDuplicates.sort((a, b) => b.similarity - a.similarity);\n\n\t// Check for name collisions\n\tconst byName = new Map<string, string[]>();\n\tfor (const skill of skills) {\n\t\tconst existing = byName.get(skill.name) ?? [];\n\t\tbyName.set(skill.name, [...existing, skill.path]);\n\t}\n\tconst nameCollisions = [...byName.entries()]\n\t\t.filter(([, paths]) => paths.length > 1)\n\t\t.map(([name, paths]) => ({ name, paths }));\n\n\t// Build recommendations\n\tconst recommendations: string[] = [];\n\tif (draftSkill && nearDuplicates.length > 0) {\n\t\tconst draftNearDupes = nearDuplicates.filter((d) => d.a === \"[draft]\" || d.b === \"[draft]\");\n\t\tif (draftNearDupes.length > 0) {\n\t\t\trecommendations.push(\n\t\t\t\t`Draft skill has ${draftNearDupes.length} similar existing skill(s). Consider merging or refining the trigger/scope.`,\n\t\t\t);\n\t\t}\n\t}\n\tif (nameCollisions.length > 0) {\n\t\trecommendations.push(\n\t\t\t`Found ${nameCollisions.length} skill name collision(s). Resolve naming conflicts before deployment.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tgeneratedAt: new Date().toISOString(),\n\t\tskills: skills.filter((s) => s.path !== \"[draft]\"), // Don't include draft in final skill list\n\t\tnearDuplicates,\n\t\tcompartmentWarnings: [],\n\t\tnameCollisions,\n\t\t...(truncated ? { truncated: true } : {}),\n\t\trecommendations,\n\t};\n}\n\nconst skillAuditSchema = Type.Object({\n\tdraftName: Type.Optional(Type.String({ description: \"Name of the draft skill to audit\" })),\n\tdraftDescription: Type.Optional(Type.String({ description: \"Description of the draft skill\" })),\n\tdraftBody: Type.Optional(Type.String({ description: \"Body/content of the draft skill\" })),\n});\n\nexport type SkillAuditInput = Static<typeof skillAuditSchema>;\n\nexport interface SkillAuditToolDetails {\n\treportPath?: string;\n}\n\nexport interface SkillAuditToolOptions {\n\t/** Host-owned metadata source. Omitted uses the foreground global discovery path. */\n\tgetSkills?: () => readonly Skill[];\n\t/** Redacts host paths in the structured report before they can reach a worker. */\n\tredactPath?: (path: string) => string;\n\t/** Optional host-enforced bounds used by worker adapters; foreground callers remain unbounded. */\n\tmaxSkills?: number;\n\tmaxComparisonPairs?: number;\n\tmaxDraftFieldChars?: number;\n}\n\nexport function createSkillAuditToolDefinition(\n\tcwd: string,\n\t_options?: SkillAuditToolOptions,\n): ToolDefinition<typeof skillAuditSchema, SkillAuditReport> {\n\tconst options = _options;\n\treturn {\n\t\tname: \"skill_audit\",\n\t\tlabel: \"Skill Audit\",\n\t\tdescription:\n\t\t\t\"Check a draft/new skill for overlap with existing skills before creating it; flags near-duplicate triggers/descriptions via local Jaccard similarity. Read-only: does not write files.\",\n\t\tpromptSnippet: \"Audit skill for overlaps\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skill_audit to check draft skills for conflicts before creating them.\",\n\t\t\t\"Similarity >= 55% indicates potential dedup or compartmentalization work.\",\n\t\t],\n\t\tparameters: skillAuditSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ draftName, draftDescription, draftBody }: SkillAuditInput,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillAuditReport;\n\t\t}> {\n\t\t\tconst draftSkill =\n\t\t\t\tdraftName || draftDescription\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: draftName,\n\t\t\t\t\t\t\tdescription: draftDescription,\n\t\t\t\t\t\t\tbody: draftBody,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\n\t\t\tconst report = runSkillAudit(cwd, draftSkill, options?.getSkills?.(), options?.redactPath, {\n\t\t\t\tsignal,\n\t\t\t\tmaxSkills: options?.maxSkills,\n\t\t\t\tmaxComparisonPairs: options?.maxComparisonPairs,\n\t\t\t\tmaxDraftFieldChars: options?.maxDraftFieldChars,\n\t\t\t});\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(\n\t\t\t\t`Skill audit: ${report.skills.length} skill(s), ${report.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (report.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlap warnings:\");\n\t\t\t\tfor (const item of report.nearDuplicates.slice(0, 8)) {\n\t\t\t\t\tconst aName = item.a.split(\"/\").pop() || item.a;\n\t\t\t\t\tconst bName = item.b.split(\"/\").pop() || item.b;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${aName} ↔ ${bName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of report.nameCollisions.slice(0, 8)) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} paths`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.recommendations && report.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of report.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nearDuplicates.length === 0 && report.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\nNo overlaps detected. This skill appears to be unique.\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillAuditTool(cwd: string, options?: SkillAuditToolOptions): AgentTool<typeof skillAuditSchema> {\n\treturn wrapToolDefinition(createSkillAuditToolDefinition(cwd, options));\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { type Static, Type } from "typebox";
2
2
  import type { ToolDefinition } from "../extensions/types.ts";
3
- import type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from "../skill-vault.ts";
3
+ import type { SkillLoadResult, SkillReadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from "../skill-vault.ts";
4
4
  declare const skillSchema: Type.TObject<{
5
5
  action: Type.TUnion<[Type.TLiteral<"search">, Type.TLiteral<"load">, Type.TLiteral<"unload">, Type.TLiteral<"status">]>;
6
6
  query: Type.TOptional<Type.TString>;
@@ -24,6 +24,17 @@ export type SkillToolDetails = {
24
24
  action: "status";
25
25
  result: SkillVaultStatus;
26
26
  };
27
+ export interface ReadOnlySkillBroker {
28
+ search(query: string): SkillSearchResult;
29
+ read(name: string): SkillReadResult;
30
+ }
31
+ declare const readOnlySkillSchema: Type.TObject<{
32
+ action: Type.TUnion<[Type.TLiteral<"search">, Type.TLiteral<"read">]>;
33
+ query: Type.TOptional<Type.TString>;
34
+ name: Type.TOptional<Type.TString>;
35
+ }>;
36
+ /** Worker-only read/search surface; it cannot load, unload, pin, or inspect vault slots. */
37
+ export declare function createReadOnlySkillToolDefinition(broker: ReadOnlySkillBroker): ToolDefinition<typeof readOnlySkillSchema>;
27
38
  /** One compact agent surface over the host-owned skill lifecycle. */
28
39
  export declare function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema>;
29
40
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH,QAAA,MAAM,WAAW;;;;;EAWhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAyBlD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CA8D9G"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EACX,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,MAAM,mBAAmB,CAAC;AAE3B,QAAA,MAAM,WAAW;;;;;EAWhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAElD,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;CACpC;AAED,QAAA,MAAM,mBAAmB;;;;EAOxB,CAAC;AAMF,4FAA4F;AAC5F,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,mBAAmB,GACzB,cAAc,CAAC,OAAO,mBAAmB,CAAC,CA2C5C;AAyBD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CA8D9G"}
@@ -5,6 +5,58 @@ const skillSchema = Type.Object({
5
5
  name: Type.Optional(Type.String({ description: "exact skill name; unload without it unloads all" })),
6
6
  pin: Type.Optional(Type.Boolean({ description: "protect from eviction while loaded; max 2" })),
7
7
  }, { additionalProperties: false });
8
+ const readOnlySkillSchema = Type.Object({
9
+ action: Type.Union([Type.Literal("search"), Type.Literal("read")], { description: "search | read" }),
10
+ query: Type.Optional(Type.String({ description: "search query" })),
11
+ name: Type.Optional(Type.String({ description: "exact skill name" })),
12
+ }, { additionalProperties: false });
13
+ function readText(result) {
14
+ return `skill: ${result.name}\n${result.description}\n\n${result.body}`;
15
+ }
16
+ /** Worker-only read/search surface; it cannot load, unload, pin, or inspect vault slots. */
17
+ export function createReadOnlySkillToolDefinition(broker) {
18
+ return {
19
+ name: "skill",
20
+ label: "Skill (read-only)",
21
+ description: "Search and read eligible skill guidance through a bounded host broker. This worker surface cannot mutate the skill vault.",
22
+ promptSnippet: "Search/read skill guidance.",
23
+ parameters: readOnlySkillSchema,
24
+ async execute(_toolCallId, input) {
25
+ if (input.action === "search") {
26
+ if (!input.query?.trim()) {
27
+ return {
28
+ content: [{ type: "text", text: "skill search requires query" }],
29
+ details: { action: "search", result: { candidates: [] } },
30
+ isError: true,
31
+ };
32
+ }
33
+ const result = broker.search(input.query);
34
+ return {
35
+ content: [{ type: "text", text: searchText(result) }],
36
+ details: { action: "search", result },
37
+ };
38
+ }
39
+ if (!input.name?.trim()) {
40
+ return {
41
+ content: [{ type: "text", text: "skill read requires exact name" }],
42
+ details: {
43
+ action: "read",
44
+ result: { ok: false, reason: "not_found", message: "Skill name is required." },
45
+ },
46
+ isError: true,
47
+ };
48
+ }
49
+ const result = broker.read(input.name.trim());
50
+ return {
51
+ content: [
52
+ { type: "text", text: result.ok ? readText(result) : `skill read failed: ${result.message}` },
53
+ ],
54
+ details: { action: "read", result },
55
+ ...(result.ok ? {} : { isError: true }),
56
+ };
57
+ },
58
+ };
59
+ }
8
60
  function searchText(result) {
9
61
  if (result.candidates.length === 0)
10
62
  return "skill search: no match";
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact skill name; unload without it unloads all\" })),\n\t\tpin: Type.Optional(Type.Boolean({ description: \"protect from eviction while loaded; max 2\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded: string[] } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction loadText(result: Extract<SkillLoadResult, { ok: true }>): string {\n\tconst pin = result.pinned ? \" (pinned)\" : \"\";\n\tconst evicted = result.evicted ? `; EVICTED: ${result.evicted.join(\", \")}` : \"\";\n\treturn `skill loaded_pending: ${result.name}${pin} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.slots.length === 0) return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\treturn result.slots\n\t\t.map((slot) => {\n\t\t\tconst pin = slot.pinned ? \" (pinned)\" : \"\";\n\t\t\treturn slot.state === \"loaded_pending\"\n\t\t\t\t? `skill state: loaded_pending, ${slot.name}${pin}, activates next request`\n\t\t\t\t: `skill state: active, ${slot.name}${pin}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill\",\n\t\tdescription:\n\t\t\t\"Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the oldest-loaded unpinned skill and reports it; pin protects up to 2 task-critical skills from eviction (they still expire idle). Host injects bodies transiently starting next request, expires idle; unload one name or all.\",\n\t\tpromptSnippet: \"Search/load skill.\",\n\t\tparameters: skillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tswitch (input.action) {\n\t\t\t\tcase \"search\": {\n\t\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\t\tconst result: SkillSearchResult = { candidates: [] };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst result = vault.search(input.query);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"load\": {\n\t\t\t\t\tconst result: SkillLoadResult = input.name?.trim()\n\t\t\t\t\t\t? vault.load(input.name.trim(), \"model\", input.pin === true)\n\t\t\t\t\t\t: { ok: false, reason: \"not_found\", message: \"skill load requires exact name\" };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: result.ok ? loadText(result) : `skill load failed: ${result.message}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"load\" as const, result },\n\t\t\t\t\t\tisError: !result.ok,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"unload\": {\n\t\t\t\t\tconst result = vault.unload(input.name?.trim() || undefined);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `skill unloaded: ${result.unloaded.length > 0 ? result.unloaded.join(\", \") : \"none\"}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"unload\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst result = vault.status();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: statusText(result) }],\n\t\t\t\t\t\tdetails: { action: \"status\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type {\n\tSkillLoadResult,\n\tSkillReadResult,\n\tSkillSearchResult,\n\tSkillVaultController,\n\tSkillVaultStatus,\n} from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact skill name; unload without it unloads all\" })),\n\t\tpin: Type.Optional(Type.Boolean({ description: \"protect from eviction while loaded; max 2\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded: string[] } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nexport interface ReadOnlySkillBroker {\n\tsearch(query: string): SkillSearchResult;\n\tread(name: string): SkillReadResult;\n}\n\nconst readOnlySkillSchema = Type.Object(\n\t{\n\t\taction: Type.Union([Type.Literal(\"search\"), Type.Literal(\"read\")], { description: \"search | read\" }),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact skill name\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nfunction readText(result: Extract<SkillReadResult, { ok: true }>): string {\n\treturn `skill: ${result.name}\\n${result.description}\\n\\n${result.body}`;\n}\n\n/** Worker-only read/search surface; it cannot load, unload, pin, or inspect vault slots. */\nexport function createReadOnlySkillToolDefinition(\n\tbroker: ReadOnlySkillBroker,\n): ToolDefinition<typeof readOnlySkillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill (read-only)\",\n\t\tdescription:\n\t\t\t\"Search and read eligible skill guidance through a bounded host broker. This worker surface cannot mutate the skill vault.\",\n\t\tpromptSnippet: \"Search/read skill guidance.\",\n\t\tparameters: readOnlySkillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tif (input.action === \"search\") {\n\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\tdetails: { action: \"search\", result: { candidates: [] } },\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst result = broker.search(input.query);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\tdetails: { action: \"search\", result },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!input.name?.trim()) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill read requires exact name\" }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction: \"read\",\n\t\t\t\t\t\tresult: { ok: false, reason: \"not_found\", message: \"Skill name is required.\" },\n\t\t\t\t\t},\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = broker.read(input.name.trim());\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\" as const, text: result.ok ? readText(result) : `skill read failed: ${result.message}` },\n\t\t\t\t],\n\t\t\t\tdetails: { action: \"read\", result },\n\t\t\t\t...(result.ok ? {} : { isError: true }),\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction loadText(result: Extract<SkillLoadResult, { ok: true }>): string {\n\tconst pin = result.pinned ? \" (pinned)\" : \"\";\n\tconst evicted = result.evicted ? `; EVICTED: ${result.evicted.join(\", \")}` : \"\";\n\treturn `skill loaded_pending: ${result.name}${pin} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.slots.length === 0) return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\treturn result.slots\n\t\t.map((slot) => {\n\t\t\tconst pin = slot.pinned ? \" (pinned)\" : \"\";\n\t\t\treturn slot.state === \"loaded_pending\"\n\t\t\t\t? `skill state: loaded_pending, ${slot.name}${pin}, activates next request`\n\t\t\t\t: `skill state: active, ${slot.name}${pin}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill\",\n\t\tdescription:\n\t\t\t\"Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the oldest-loaded unpinned skill and reports it; pin protects up to 2 task-critical skills from eviction (they still expire idle). Host injects bodies transiently starting next request, expires idle; unload one name or all.\",\n\t\tpromptSnippet: \"Search/load skill.\",\n\t\tparameters: skillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tswitch (input.action) {\n\t\t\t\tcase \"search\": {\n\t\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\t\tconst result: SkillSearchResult = { candidates: [] };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst result = vault.search(input.query);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"load\": {\n\t\t\t\t\tconst result: SkillLoadResult = input.name?.trim()\n\t\t\t\t\t\t? vault.load(input.name.trim(), \"model\", input.pin === true)\n\t\t\t\t\t\t: { ok: false, reason: \"not_found\", message: \"skill load requires exact name\" };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: result.ok ? loadText(result) : `skill load failed: ${result.message}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"load\" as const, result },\n\t\t\t\t\t\tisError: !result.ok,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"unload\": {\n\t\t\t\t\tconst result = vault.unload(input.name?.trim() || undefined);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `skill unloaded: ${result.unloaded.length > 0 ? result.unloaded.join(\", \") : \"none\"}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"unload\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst result = vault.status();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: statusText(result) }],\n\t\t\t\t\t\tdetails: { action: \"status\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"skillify.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,QAAA,MAAM,cAAc;;;;EAIlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,wBAAgB,4BAA4B,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CAAC,OAAO,cAAc,EAAE,cAAc,CAAC,CAqGvD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAE/G"}
1
+ {"version":3,"file":"skillify.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,QAAA,MAAM,cAAc;;;;EAMlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,wBAAgB,4BAA4B,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CAAC,OAAO,cAAc,EAAE,cAAc,CAAC,CA6GvD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAE/G"}
@@ -1,12 +1,15 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
3
  import { Type } from "typebox";
4
- import { validateSkillName } from "../skills.js";
4
+ import { MAX_ACTIVE_SKILL_BODY_BYTES } from "../skill-vault.js";
5
+ import { MAX_SKILL_DESCRIPTION_LENGTH, MAX_SKILL_NAME_LENGTH, validateSkillName } from "../skills.js";
5
6
  import { runSkillAudit } from "./skill-audit.js";
6
7
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
7
8
  const skillifySchema = Type.Object({
8
- name: Type.String({ description: "Skill name (lowercase, a-z 0-9 hyphens only, max 64 chars)" }),
9
- description: Type.String({ description: "Skill description (max 1024 chars)" }),
9
+ name: Type.String({
10
+ description: `Skill name (lowercase, a-z 0-9 hyphens only, max ${MAX_SKILL_NAME_LENGTH} chars)`,
11
+ }),
12
+ description: Type.String({ description: `Skill description (max ${MAX_SKILL_DESCRIPTION_LENGTH} chars)` }),
10
13
  body: Type.String({ description: "Skill body/implementation code" }),
11
14
  });
12
15
  export function createSkillifyToolDefinition(cwd, _options) {
@@ -31,11 +34,17 @@ export function createSkillifyToolDefinition(cwd, _options) {
31
34
  if (!description || description.trim() === "") {
32
35
  errors.push("description is required");
33
36
  }
34
- else if (description.length > 1024) {
35
- errors.push(`description exceeds 1024 characters (${description.length})`);
37
+ else if (description.length > MAX_SKILL_DESCRIPTION_LENGTH) {
38
+ errors.push(`description exceeds ${MAX_SKILL_DESCRIPTION_LENGTH} characters (${description.length})`);
36
39
  }
37
- // Run audit on the draft
38
- const audit = runSkillAudit(cwd, { name, description, body });
40
+ const bodyBytes = Buffer.byteLength(body, "utf8");
41
+ if (bodyBytes > MAX_ACTIVE_SKILL_BODY_BYTES) {
42
+ errors.push(`body exceeds ${MAX_ACTIVE_SKILL_BODY_BYTES} bytes (${bodyBytes})`);
43
+ }
44
+ // Do not tokenize an oversized draft; retain the existing-skill report for the proposal.
45
+ const audit = bodyBytes > MAX_ACTIVE_SKILL_BODY_BYTES
46
+ ? runSkillAudit(cwd)
47
+ : runSkillAudit(cwd, { name, description, body });
39
48
  const valid = errors.length === 0;
40
49
  const proposedPath = join(homedir(), ".pi", "agent", "skills", name, "SKILL.md");
41
50
  const report = {
@@ -1 +1 @@
1
- {"version":3,"file":"skillify.js","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { validateSkillName } from \"../skills.ts\";\nimport { runSkillAudit, type SkillAuditReport } from \"./skill-audit.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst skillifySchema = Type.Object({\n\tname: Type.String({ description: \"Skill name (lowercase, a-z 0-9 hyphens only, max 64 chars)\" }),\n\tdescription: Type.String({ description: \"Skill description (max 1024 chars)\" }),\n\tbody: Type.String({ description: \"Skill body/implementation code\" }),\n});\n\nexport type SkillifyInput = Static<typeof skillifySchema>;\n\nexport interface SkillifyReport {\n\tvalid: boolean;\n\terrors: string[];\n\taudit: SkillAuditReport;\n\tproposedPath: string;\n\tdraft: {\n\t\tname: string;\n\t\tdescription: string;\n\t\tbody: string;\n\t};\n}\n\nexport interface SkillifyToolDetails {\n\treport?: SkillifyReport;\n}\n\nexport interface SkillifyToolOptions {}\n\nexport function createSkillifyToolDefinition(\n\tcwd: string,\n\t_options?: SkillifyToolOptions,\n): ToolDefinition<typeof skillifySchema, SkillifyReport> {\n\treturn {\n\t\tname: \"skillify\",\n\t\tlabel: \"Skillify\",\n\t\tdescription:\n\t\t\t\"Validate a draft skill and audit for overlaps with existing skills. Pure analysis tool: generates a proposal with validation and audit report, but does NOT write files or activate the skill. Returns structured report with proposed install path.\",\n\t\tpromptSnippet: \"Validate and audit a draft skill\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skillify to validate and audit draft skills before creating them.\",\n\t\t\t\"When MEMORY.md holds a repeatable procedure, draft a skill from that procedure instead of leaving it as a fact.\",\n\t\t\t\"Fix validation errors (name format, description length) and review audit findings before proceeding.\",\n\t\t\t\"The tool returns a proposal only; persistent write and activation happen later.\",\n\t\t],\n\t\tparameters: skillifySchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ name, description, body }: SkillifyInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillifyReport;\n\t\t}> {\n\t\t\tconst errors: string[] = [];\n\n\t\t\t// Validate name\n\t\t\tconst nameErrors = validateSkillName(name);\n\t\t\terrors.push(...nameErrors);\n\n\t\t\t// Validate description\n\t\t\tif (!description || description.trim() === \"\") {\n\t\t\t\terrors.push(\"description is required\");\n\t\t\t} else if (description.length > 1024) {\n\t\t\t\terrors.push(`description exceeds 1024 characters (${description.length})`);\n\t\t\t}\n\n\t\t\t// Run audit on the draft\n\t\t\tconst audit = runSkillAudit(cwd, { name, description, body });\n\n\t\t\tconst valid = errors.length === 0;\n\t\t\tconst proposedPath = join(homedir(), \".pi\", \"agent\", \"skills\", name, \"SKILL.md\");\n\n\t\t\tconst report: SkillifyReport = {\n\t\t\t\tvalid,\n\t\t\t\terrors,\n\t\t\t\taudit,\n\t\t\t\tproposedPath,\n\t\t\t\tdraft: { name, description, body },\n\t\t\t};\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(`Skillify validation: ${valid ? \"✓ valid\" : \"✗ invalid\"}`);\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tlines.push(\"\\nValidation errors:\");\n\t\t\t\tfor (const err of errors) {\n\t\t\t\t\tlines.push(`- ${err}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\n\t\t\t\t`\\nAudit: ${audit.skills.length} existing skill(s), ${audit.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (audit.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlaps with existing skills:\");\n\t\t\t\tfor (const item of audit.nearDuplicates.slice(0, 5)) {\n\t\t\t\t\tconst otherPath = item.a === \"[draft]\" ? item.b : item.a;\n\t\t\t\t\tconst otherName = otherPath.split(\"/\").pop() || otherPath;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${otherName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of audit.nameCollisions) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} existing path(s)`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.recommendations && audit.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of audit.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (valid && audit.nearDuplicates.length === 0 && audit.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\n✓ Skill appears ready for creation.\");\n\t\t\t}\n\n\t\t\tlines.push(`\\nProposed install path: ${proposedPath}`);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillifyTool(cwd: string, options?: SkillifyToolOptions): AgentTool<typeof skillifySchema> {\n\treturn wrapToolDefinition(createSkillifyToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"skillify.js","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QACjB,WAAW,EAAE,oDAAoD,qBAAqB,SAAS;KAC/F,CAAC;IACF,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,4BAA4B,SAAS,EAAE,CAAC;IAC1G,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;CACpE,CAAC,CAAC;AAsBH,MAAM,UAAU,4BAA4B,CAC3C,GAAW,EACX,QAA8B;IAE9B,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EACV,sPAAsP;QACvP,aAAa,EAAE,kCAAkC;QACjD,gBAAgB,EAAE;YACjB,uEAAuE;YACvE,iHAAiH;YACjH,sGAAsG;YACtG,iFAAiF;SACjF;QACD,UAAU,EAAE,cAAc;QAC1B,KAAK,CAAC,OAAO,CACZ,WAAW,EACX,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAiB,EAC1C,OAAqB,EACrB,SAAU,EACV,IAAK;YAKL,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,gBAAgB;YAChB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAE3B,uBAAuB;YACvB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,WAAW,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,uBAAuB,4BAA4B,gBAAgB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YACvG,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,SAAS,GAAG,2BAA2B,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,gBAAgB,2BAA2B,WAAW,SAAS,GAAG,CAAC,CAAC;YACjF,CAAC;YAED,yFAAyF;YACzF,MAAM,KAAK,GACV,SAAS,GAAG,2BAA2B;gBACtC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAEpD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAEjF,MAAM,MAAM,GAAmB;gBAC9B,KAAK;gBACL,MAAM;gBACN,KAAK;gBACL,YAAY;gBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;aAClC,CAAC;YAEF,qCAAqC;YACrC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAEtE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACxB,CAAC;YACF,CAAC;YAED,KAAK,CAAC,IAAI,CACT,YAAY,KAAK,CAAC,MAAM,CAAC,MAAM,uBAAuB,KAAK,CAAC,cAAc,CAAC,MAAM,sBAAsB,CACvG,CAAC;YAEF,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACnD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBACzD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;oBAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACvF,CAAC;YACF,CAAC;YAED,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;YAED,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACxB,CAAC;YACF,CAAC;YAED,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACrD,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;YAEvD,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,OAAO,EAAE,MAAM;aACf,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,OAA6B;IAC5E,OAAO,kBAAkB,CAAC,4BAA4B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { MAX_ACTIVE_SKILL_BODY_BYTES } from \"../skill-vault.ts\";\nimport { MAX_SKILL_DESCRIPTION_LENGTH, MAX_SKILL_NAME_LENGTH, validateSkillName } from \"../skills.ts\";\nimport { runSkillAudit, type SkillAuditReport } from \"./skill-audit.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst skillifySchema = Type.Object({\n\tname: Type.String({\n\t\tdescription: `Skill name (lowercase, a-z 0-9 hyphens only, max ${MAX_SKILL_NAME_LENGTH} chars)`,\n\t}),\n\tdescription: Type.String({ description: `Skill description (max ${MAX_SKILL_DESCRIPTION_LENGTH} chars)` }),\n\tbody: Type.String({ description: \"Skill body/implementation code\" }),\n});\n\nexport type SkillifyInput = Static<typeof skillifySchema>;\n\nexport interface SkillifyReport {\n\tvalid: boolean;\n\terrors: string[];\n\taudit: SkillAuditReport;\n\tproposedPath: string;\n\tdraft: {\n\t\tname: string;\n\t\tdescription: string;\n\t\tbody: string;\n\t};\n}\n\nexport interface SkillifyToolDetails {\n\treport?: SkillifyReport;\n}\n\nexport interface SkillifyToolOptions {}\n\nexport function createSkillifyToolDefinition(\n\tcwd: string,\n\t_options?: SkillifyToolOptions,\n): ToolDefinition<typeof skillifySchema, SkillifyReport> {\n\treturn {\n\t\tname: \"skillify\",\n\t\tlabel: \"Skillify\",\n\t\tdescription:\n\t\t\t\"Validate a draft skill and audit for overlaps with existing skills. Pure analysis tool: generates a proposal with validation and audit report, but does NOT write files or activate the skill. Returns structured report with proposed install path.\",\n\t\tpromptSnippet: \"Validate and audit a draft skill\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skillify to validate and audit draft skills before creating them.\",\n\t\t\t\"When MEMORY.md holds a repeatable procedure, draft a skill from that procedure instead of leaving it as a fact.\",\n\t\t\t\"Fix validation errors (name format, description length) and review audit findings before proceeding.\",\n\t\t\t\"The tool returns a proposal only; persistent write and activation happen later.\",\n\t\t],\n\t\tparameters: skillifySchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ name, description, body }: SkillifyInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillifyReport;\n\t\t}> {\n\t\t\tconst errors: string[] = [];\n\n\t\t\t// Validate name\n\t\t\tconst nameErrors = validateSkillName(name);\n\t\t\terrors.push(...nameErrors);\n\n\t\t\t// Validate description\n\t\t\tif (!description || description.trim() === \"\") {\n\t\t\t\terrors.push(\"description is required\");\n\t\t\t} else if (description.length > MAX_SKILL_DESCRIPTION_LENGTH) {\n\t\t\t\terrors.push(`description exceeds ${MAX_SKILL_DESCRIPTION_LENGTH} characters (${description.length})`);\n\t\t\t}\n\n\t\t\tconst bodyBytes = Buffer.byteLength(body, \"utf8\");\n\t\t\tif (bodyBytes > MAX_ACTIVE_SKILL_BODY_BYTES) {\n\t\t\t\terrors.push(`body exceeds ${MAX_ACTIVE_SKILL_BODY_BYTES} bytes (${bodyBytes})`);\n\t\t\t}\n\n\t\t\t// Do not tokenize an oversized draft; retain the existing-skill report for the proposal.\n\t\t\tconst audit =\n\t\t\t\tbodyBytes > MAX_ACTIVE_SKILL_BODY_BYTES\n\t\t\t\t\t? runSkillAudit(cwd)\n\t\t\t\t\t: runSkillAudit(cwd, { name, description, body });\n\n\t\t\tconst valid = errors.length === 0;\n\t\t\tconst proposedPath = join(homedir(), \".pi\", \"agent\", \"skills\", name, \"SKILL.md\");\n\n\t\t\tconst report: SkillifyReport = {\n\t\t\t\tvalid,\n\t\t\t\terrors,\n\t\t\t\taudit,\n\t\t\t\tproposedPath,\n\t\t\t\tdraft: { name, description, body },\n\t\t\t};\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(`Skillify validation: ${valid ? \"✓ valid\" : \"✗ invalid\"}`);\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tlines.push(\"\\nValidation errors:\");\n\t\t\t\tfor (const err of errors) {\n\t\t\t\t\tlines.push(`- ${err}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\n\t\t\t\t`\\nAudit: ${audit.skills.length} existing skill(s), ${audit.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (audit.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlaps with existing skills:\");\n\t\t\t\tfor (const item of audit.nearDuplicates.slice(0, 5)) {\n\t\t\t\t\tconst otherPath = item.a === \"[draft]\" ? item.b : item.a;\n\t\t\t\t\tconst otherName = otherPath.split(\"/\").pop() || otherPath;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${otherName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of audit.nameCollisions) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} existing path(s)`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.recommendations && audit.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of audit.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (valid && audit.nearDuplicates.length === 0 && audit.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\n✓ Skill appears ready for creation.\");\n\t\t\t}\n\n\t\t\tlines.push(`\\nProposed install path: ${proposedPath}`);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillifyTool(cwd: string, options?: SkillifyToolOptions): AgentTool<typeof skillifySchema> {\n\treturn wrapToolDefinition(createSkillifyToolDefinition(cwd, options));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"task-steps.d.ts","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAgBN,KAAK,cAAc,EAGnB,MAAM,wBAAwB,CAAC;AAgEhC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACzC,iBAAiB,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAuKD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,cAAc,CA6J7F"}
1
+ {"version":3,"file":"task-steps.d.ts","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAgBN,KAAK,cAAc,EAGnB,MAAM,wBAAwB,CAAC;AAgEhC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACzC,iBAAiB,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAuKD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,cAAc,CA8J7F"}
@@ -218,10 +218,11 @@ export function createTaskStepsToolDefinition(deps) {
218
218
  promptSnippet: "Track multi-step session work.",
219
219
  promptGuidelines: [
220
220
  "Use for multi-step work; keep one in_progress step.",
221
+ "For project changes, establish Plan/Route before first mutation and link steps to the goal contract; task_steps owns execution detail, never a second outcome state.",
221
222
  "Batch transitions; work the first open step; record evidence/blockers; skip unchanged narration.",
222
223
  "intake keeps every item; link goal requirementIds.",
223
224
  "advance completes current, then starts next pending.",
224
- "Attach completed tool_task IDs as evidence; goal completion rejects open linked steps.",
225
+ "Attach completed tool_task IDs as evidence; goal completion rejects every open step.",
225
226
  "Before final, resolve or defer open work. goal owns outcomes; delegate owns workers.",
226
227
  ],
227
228
  parameters: taskStepsSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"task-steps.js","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { advanceTaskSteps } from \"../pipelines/increment.ts\";\nimport { MAX_PIPELINE_STAGE_ID_LENGTH } from \"../pipelines/types.ts\";\nimport {\n\taddTaskStep,\n\tclearTaskSteps,\n\tcompactTaskSteps,\n\tcreateTaskStepsState,\n\tfindOpenDuplicateStep,\n\tformatTaskSteps,\n\thasUnverifiedCompletedStep,\n\tMAX_TASK_STEP_PIPELINE_RUN_ID_LENGTH,\n\tMAX_TASK_STEPS,\n\tnormalizeTaskStepPipelineLink,\n\tresolveTaskStepSelector,\n\tsetTaskSteps,\n\ttype TaskStep,\n\ttype TaskStepInput,\n\tTaskStepsError,\n\ttype TaskStepsState,\n\ttype TaskStepUpdate,\n\tupdateTaskStep,\n} from \"../tasks/task-state.ts\";\nimport {\n\temptyOrchestrationCall,\n\tOrchestrationPanelComponent,\n\ttype OrchestrationPanelModel,\n\ttaskStepPanelRow,\n} from \"./orchestration-panel.ts\";\n\nconst statusSchema = Type.Union([\n\tType.Literal(\"pending\"),\n\tType.Literal(\"in_progress\"),\n\tType.Literal(\"completed\"),\n\tType.Literal(\"blocked\"),\n\tType.Literal(\"cancelled\"),\n]);\n\nconst prioritySchema = Type.Union([Type.Literal(\"low\"), Type.Literal(\"normal\"), Type.Literal(\"high\")]);\n\nfunction optionalTaskStepFields(requirementIdsDescription: string) {\n\treturn {\n\t\tstatus: Type.Optional(statusSchema),\n\t\tpriority: Type.Optional(prioritySchema),\n\t\towner: Type.Optional(Type.String({ maxLength: 200 })),\n\t\trequirementIds: Type.Optional(\n\t\t\tType.Array(Type.String({ minLength: 1, maxLength: 200 }), {\n\t\t\t\tmaxItems: 32,\n\t\t\t\tdescription: requirementIdsDescription,\n\t\t\t}),\n\t\t),\n\t\tpipelineRunId: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_TASK_STEP_PIPELINE_RUN_ID_LENGTH,\n\t\t\t\tdescription: \"Active pipeline run id this step advances. Supply together with pipelineStageId.\",\n\t\t\t}),\n\t\t),\n\t\tpipelineStageId: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_PIPELINE_STAGE_ID_LENGTH,\n\t\t\t\tdescription: \"Stage id in pipelineRunId this step advances. Supply both ids together.\",\n\t\t\t}),\n\t\t),\n\t\tclearPipelineLink: Type.Optional(\n\t\t\tType.Boolean({\n\t\t\t\tdescription: \"Remove both pipeline ids. Cannot be combined with pipelineRunId/pipelineStageId.\",\n\t\t\t}),\n\t\t),\n\t\tnote: Type.Optional(Type.String({ maxLength: 4_000 })),\n\t\tevidence: Type.Optional(Type.Array(Type.String({ minLength: 1, maxLength: 2_000 }), { maxItems: 32 })),\n\t};\n}\n\nconst stepInputSchema = Type.Object(\n\t{\n\t\tcontent: Type.String({ minLength: 1, maxLength: 2_000, description: \"Imperative task step text.\" }),\n\t\tactiveForm: Type.Optional(\n\t\t\tType.String({ minLength: 1, maxLength: 2_000, description: \"Short present-progress label for active UI.\" }),\n\t\t),\n\t\t...optionalTaskStepFields(\"Goal requirement ids this foreground step advances.\"),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst taskStepsSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"set\"),\n\t\t\t\tType.Literal(\"add\"),\n\t\t\t\tType.Literal(\"update\"),\n\t\t\t\tType.Literal(\"list\"),\n\t\t\t\tType.Literal(\"clear\"),\n\t\t\t\tType.Literal(\"compact\"),\n\t\t\t\tType.Literal(\"intake\"),\n\t\t\t\tType.Literal(\"advance\"),\n\t\t\t],\n\t\t\t{ description: \"Checklist action. Use list to read without mutation.\" },\n\t\t),\n\t\tsteps: Type.Optional(\n\t\t\tType.Array(stepInputSchema, {\n\t\t\t\tmaxItems: MAX_TASK_STEPS,\n\t\t\t\tdescription: \"Complete replacement list for set/intake. Intake preserves every supplied item in order.\",\n\t\t\t}),\n\t\t),\n\t\tid: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"For update: current/active, exact step id, unique id prefix, or unique content selector.\",\n\t\t\t}),\n\t\t),\n\t\tcontent: Type.Optional(Type.String({ minLength: 1, maxLength: 2_000 })),\n\t\tactiveForm: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t...optionalTaskStepFields(\"Goal requirement ids this foreground step advances; [] clears existing links.\"),\n\t\tclearCompleted: Type.Optional(\n\t\t\tType.Boolean({ description: \"For list: compact completed and cancelled steps before rendering.\" }),\n\t\t),\n\t\tshowCompleted: Type.Optional(Type.Boolean({ description: \"Include completed and cancelled steps in output.\" })),\n\t\tmaxItems: Type.Optional(Type.Integer({ minimum: 1, maximum: MAX_TASK_STEPS })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type TaskStepsToolInput = Static<typeof taskStepsSchema>;\nexport type TaskStepsAction = TaskStepsToolInput[\"action\"];\n\nexport interface TaskStepsToolDetails {\n\taction: TaskStepsAction;\n\tapplied: boolean;\n\terror?: string;\n\tstate?: TaskStepsState;\n\tstepCount?: number;\n\topenStepCount?: number;\n\tverificationNudgeNeeded?: boolean;\n\tshowCompleted?: boolean;\n\t/** Set when `add` was a no-op because an open step already carries this content. */\n\tduplicateOfStepId?: string;\n\t/** Step ids silently demoted to pending because another step became active in this call. */\n\tdemotedStepIds?: readonly string[];\n}\n\nexport interface TaskStepsToolDependencies {\n\tgetTaskStepsState: () => TaskStepsState | undefined;\n\tsaveTaskStepsState: (state: TaskStepsState) => void;\n\tgetActivePipelineScope?: () => { runId: string; stageIds: readonly string[] } | undefined;\n\tnow?: () => string;\n}\n\nfunction toTaskStepUpdate(input: TaskStepsToolInput): TaskStepUpdate {\n\treturn {\n\t\tcontent: input.content,\n\t\tactiveForm: input.activeForm,\n\t\tstatus: input.status,\n\t\tpriority: input.priority,\n\t\towner: input.owner,\n\t\trequirementIds: input.requirementIds,\n\t\tpipelineRunId: input.pipelineRunId,\n\t\tpipelineStageId: input.pipelineStageId,\n\t\tclearPipelineLink: input.clearPipelineLink,\n\t\tnote: input.note,\n\t\tevidence: input.evidence,\n\t};\n}\n\nfunction toTaskStepInput(input: TaskStepsToolInput): TaskStepInput {\n\treturn { ...toTaskStepUpdate(input), content: input.content ?? \"\" };\n}\n\nfunction validatePipelineLink(\n\tdeps: TaskStepsToolDependencies,\n\tpipelineRunId: string | undefined,\n\tpipelineStageId: string | undefined,\n\tclearPipelineLink = false,\n): void {\n\tconst { pipelineRunId: runId, pipelineStageId: stageId } = normalizeTaskStepPipelineLink(\n\t\tpipelineRunId,\n\t\tpipelineStageId,\n\t\tclearPipelineLink,\n\t);\n\tif (!runId || !stageId) return;\n\tconst active = deps.getActivePipelineScope?.();\n\tif (!active) throw new TaskStepsError(\"Task step pipeline linkage requires an active pipeline run.\");\n\tif (runId !== active.runId) {\n\t\tthrow new TaskStepsError(`Task step pipelineRunId must match active run '${active.runId}'.`);\n\t}\n\tif (!active.stageIds.includes(stageId)) {\n\t\tthrow new TaskStepsError(`Task step pipelineStageId '${stageId}' is not in active run '${active.runId}'.`);\n\t}\n}\n\nfunction validatePipelineInputs(deps: TaskStepsToolDependencies, inputs: readonly TaskStepInput[]): void {\n\tfor (const input of inputs) {\n\t\tvalidatePipelineLink(deps, input.pipelineRunId, input.pipelineStageId, input.clearPipelineLink);\n\t}\n}\n\nfunction counts(\n\tstate: TaskStepsState,\n): Pick<TaskStepsToolDetails, \"stepCount\" | \"openStepCount\" | \"verificationNudgeNeeded\"> {\n\tconst openStepCount = state.steps.filter(\n\t\t(step) => step.status !== \"completed\" && step.status !== \"cancelled\",\n\t).length;\n\treturn {\n\t\tstepCount: state.steps.length,\n\t\topenStepCount,\n\t\tverificationNudgeNeeded: hasUnverifiedCompletedStep(state),\n\t};\n}\n\n/** Ids (from `resultSteps`, index-aligned with `inputs`) whose status was set explicitly by the caller. */\nfunction explicitStatusStepIds(inputs: readonly TaskStepInput[], resultSteps: readonly TaskStep[]): Set<string> {\n\tconst ids = new Set<string>();\n\tinputs.forEach((stepInput, index) => {\n\t\tif (stepInput.status !== undefined) {\n\t\t\tconst id = resultSteps[index]?.id;\n\t\t\tif (id) ids.add(id);\n\t\t}\n\t});\n\treturn ids;\n}\n\n/**\n * Steps that were in_progress before this call and are pending after, excluding any step whose\n * new status was set explicitly by the caller (an explicit change is not a \"silent\" demotion).\n */\nfunction computeDemotedStepIds(\n\tbefore: TaskStepsState,\n\tafter: TaskStepsState,\n\texcludeIds: ReadonlySet<string>,\n): string[] {\n\tconst beforeActiveIds = new Set(before.steps.filter((step) => step.status === \"in_progress\").map((step) => step.id));\n\treturn after.steps\n\t\t.filter((step) => beforeActiveIds.has(step.id) && step.status === \"pending\" && !excludeIds.has(step.id))\n\t\t.map((step) => step.id);\n}\n\nfunction errorResult(action: TaskStepsAction, error: string, state?: TaskStepsState) {\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: `task_steps ${action} failed: ${error}` }],\n\t\tdetails: { action, applied: false, error, state, ...(state ? counts(state) : {}) } satisfies TaskStepsToolDetails,\n\t\tisError: true as const,\n\t};\n}\n\nfunction taskStepsPanelModel(details: TaskStepsToolDetails, expanded: boolean): OrchestrationPanelModel {\n\tconst state = details.state;\n\tif (!state) {\n\t\treturn {\n\t\t\tlabel: \"task steps\",\n\t\t\taction: details.action,\n\t\t\tstatus: details.error ? \"error\" : \"idle\",\n\t\t\temptyText: details.error ?? \"No checklist state.\",\n\t\t};\n\t}\n\tconst active = state.steps.filter((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.filter((step) => step.status === \"blocked\");\n\tconst pending = state.steps.filter((step) => step.status === \"pending\");\n\tconst completed = state.steps.filter((step) => step.status === \"completed\");\n\tconst cancelled = state.steps.filter((step) => step.status === \"cancelled\");\n\tconst open = [...active, ...blocked, ...pending];\n\tconst terminal = details.showCompleted ? [...completed, ...cancelled] : [];\n\tconst candidates = [...open, ...terminal];\n\tconst limit = expanded ? 24 : 8;\n\tconst rows = candidates.slice(0, limit).map(taskStepPanelRow);\n\tconst archivedDone = state.archive.completed + state.archive.cancelled;\n\tconst done = completed.length + state.archive.completed;\n\tconst summary = [\n\t\tactive.length ? `${active.length} working` : undefined,\n\t\t`${open.length} open`,\n\t\t`${done} done`,\n\t\tblocked.length ? `${blocked.length} blocked` : undefined,\n\t\tarchivedDone ? `${archivedDone} archived` : undefined,\n\t].filter((value): value is string => value !== undefined);\n\tconst notices = [];\n\tif (!details.showCompleted && completed.length + cancelled.length > 0) {\n\t\tnotices.push({\n\t\t\tstatus: \"info\" as const,\n\t\t\ttext: `${completed.length + cancelled.length} finished step${completed.length + cancelled.length === 1 ? \"\" : \"s\"} hidden`,\n\t\t});\n\t}\n\tif (details.duplicateOfStepId) {\n\t\tnotices.push({ status: \"info\" as const, text: \"Duplicate open step ignored.\" });\n\t}\n\tif (details.demotedStepIds?.length) {\n\t\tnotices.push({\n\t\t\tstatus: \"info\" as const,\n\t\t\ttext: `${details.demotedStepIds.length} previous working step${details.demotedStepIds.length === 1 ? \"\" : \"s\"} returned to pending.`,\n\t\t});\n\t}\n\tif (details.verificationNudgeNeeded) {\n\t\tnotices.push({ status: \"warning\" as const, text: \"Completed work still needs attached evidence.\" });\n\t}\n\tconst status = details.error\n\t\t? \"error\"\n\t\t: blocked.length > 0\n\t\t\t? \"warning\"\n\t\t\t: active.length > 0\n\t\t\t\t? \"running\"\n\t\t\t\t: open.length === 0 && state.steps.length > 0\n\t\t\t\t\t? \"success\"\n\t\t\t\t\t: \"idle\";\n\treturn {\n\t\tlabel: \"task steps\",\n\t\taction: details.action,\n\t\tstatus,\n\t\tsummary,\n\t\trows,\n\t\tnotices,\n\t\temptyText: state.steps.length === 0 ? \"No tracked steps.\" : \"All open steps are done.\",\n\t\thiddenRowCount: Math.max(0, candidates.length - rows.length),\n\t};\n}\n\nexport function createTaskStepsToolDefinition(deps: TaskStepsToolDependencies): ToolDefinition {\n\tconst now = deps.now ?? (() => new Date().toISOString());\n\treturn {\n\t\tname: \"task_steps\",\n\t\tlabel: \"Task Steps\",\n\t\tdescription:\n\t\t\t\"Track the session's ordered multi-step checklist with status, notes, and evidence. Use goal for durable outcomes and delegate for workers.\",\n\t\tpromptSnippet: \"Track multi-step session work.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use for multi-step work; keep one in_progress step.\",\n\t\t\t\"Batch transitions; work the first open step; record evidence/blockers; skip unchanged narration.\",\n\t\t\t\"intake keeps every item; link goal requirementIds.\",\n\t\t\t\"advance completes current, then starts next pending.\",\n\t\t\t\"Attach completed tool_task IDs as evidence; goal completion rejects open linked steps.\",\n\t\t\t\"Before final, resolve or defer open work. goal owns outcomes; delegate owns workers.\",\n\t\t],\n\t\tparameters: taskStepsSchema,\n\t\texecutionMode: \"sequential\",\n\t\trenderShell: \"self\",\n\t\trenderCall() {\n\t\t\treturn emptyOrchestrationCall();\n\t\t},\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tif (isPartial) return emptyOrchestrationCall();\n\t\t\tconst details = result.details as TaskStepsToolDetails | undefined;\n\t\t\tif (!details) {\n\t\t\t\treturn new OrchestrationPanelComponent(theme, {\n\t\t\t\t\tlabel: \"task steps\",\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\temptyText: \"No task-step details were returned.\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!expanded && details.applied) return emptyOrchestrationCall();\n\t\t\treturn new OrchestrationPanelComponent(theme, taskStepsPanelModel(details, expanded), expanded);\n\t\t},\n\t\tasync execute(_toolCallId, input: TaskStepsToolInput) {\n\t\t\tconst timestamp = now();\n\t\t\tconst current = deps.getTaskStepsState();\n\t\t\tconst before = current ?? createTaskStepsState(timestamp);\n\t\t\tlet state = before;\n\t\t\tlet duplicateStepId: string | undefined;\n\t\t\tlet demotedStepIds: readonly string[] = [];\n\t\t\ttry {\n\t\t\t\tswitch (input.action) {\n\t\t\t\t\tcase \"set\":\n\t\t\t\t\tcase \"intake\": {\n\t\t\t\t\t\tconst steps = input.steps;\n\t\t\t\t\t\tif (!steps) {\n\t\t\t\t\t\t\tconst error =\n\t\t\t\t\t\t\t\tinput.action === \"set\" ? \"set requires steps[].\" : \"intake requires a complete steps[] list.\";\n\t\t\t\t\t\t\treturn errorResult(input.action, error, current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalidatePipelineInputs(deps, steps);\n\t\t\t\t\t\tstate = setTaskSteps(state, steps, timestamp);\n\t\t\t\t\t\tdemotedStepIds = computeDemotedStepIds(before, state, explicitStatusStepIds(steps, state.steps));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\tvalidatePipelineLink(deps, input.pipelineRunId, input.pipelineStageId, input.clearPipelineLink);\n\t\t\t\t\t\tstate = addTaskStep(state, toTaskStepInput(input), timestamp);\n\t\t\t\t\t\tif (state === before) {\n\t\t\t\t\t\t\t// The reducer returned the unchanged state: an open step already carries this\n\t\t\t\t\t\t\t// content, so nothing was created. Name the existing step in the response.\n\t\t\t\t\t\t\tduplicateStepId = findOpenDuplicateStep(before.steps, input.content ?? \"\")?.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"update\": {\n\t\t\t\t\t\tif (!input.id?.trim())\n\t\t\t\t\t\t\treturn errorResult(input.action, \"update requires id or a unique selector.\", current);\n\t\t\t\t\t\tconst selected = resolveTaskStepSelector(before.steps, input.id);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinput.pipelineRunId !== undefined ||\n\t\t\t\t\t\t\tinput.pipelineStageId !== undefined ||\n\t\t\t\t\t\t\tinput.clearPipelineLink === true\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst clearingPipelineLink = input.clearPipelineLink === true;\n\t\t\t\t\t\t\tvalidatePipelineLink(\n\t\t\t\t\t\t\t\tdeps,\n\t\t\t\t\t\t\t\tclearingPipelineLink ? input.pipelineRunId : (input.pipelineRunId ?? selected.pipelineRunId),\n\t\t\t\t\t\t\t\tclearingPipelineLink\n\t\t\t\t\t\t\t\t\t? input.pipelineStageId\n\t\t\t\t\t\t\t\t\t: (input.pipelineStageId ?? selected.pipelineStageId),\n\t\t\t\t\t\t\t\tclearingPipelineLink,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstate = updateTaskStep(state, input.id, toTaskStepUpdate(input), timestamp);\n\t\t\t\t\t\t// Exclude the explicitly targeted step: its own status change was requested by\n\t\t\t\t\t\t// the caller, so it is never a \"silent\" demotion even if it moved to pending.\n\t\t\t\t\t\tdemotedStepIds = computeDemotedStepIds(before, state, new Set([selected.id]));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\tstate = clearTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"compact\":\n\t\t\t\t\t\tstate = compactTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"advance\": {\n\t\t\t\t\t\tconst advanced = advanceTaskSteps(before, timestamp);\n\t\t\t\t\t\tstate = advanced.state;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tif (input.clearCompleted) state = compactTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst isNoopDuplicateAdd = input.action === \"add\" && state === before;\n\t\t\t\tconst mutated = (input.action !== \"list\" || input.clearCompleted === true) && !isNoopDuplicateAdd;\n\t\t\t\tif (mutated) deps.saveTaskStepsState(state);\n\n\t\t\t\tconst stateCounts = counts(state);\n\t\t\t\tconst noticeLines: string[] = [];\n\t\t\t\tif (duplicateStepId) {\n\t\t\t\t\tnoticeLines.push(\n\t\t\t\t\t\t`Duplicate open step ignored; existing ${duplicateStepId} already tracks this content.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (demotedStepIds.length > 0) {\n\t\t\t\t\tnoticeLines.push(`Demoted to pending because another step became active: ${demotedStepIds.join(\", \")}.`);\n\t\t\t\t}\n\t\t\t\tif (stateCounts.verificationNudgeNeeded) {\n\t\t\t\t\tnoticeLines.push(\n\t\t\t\t\t\t\"Reminder: a completed step has no evidence attached; attach evidence via update before treating it as verified.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst notices = noticeLines.length > 0 ? `\\n${noticeLines.join(\"\\n\")}` : \"\";\n\n\t\t\t\tconst headerAction =\n\t\t\t\t\tinput.action === \"list\"\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: `task_steps ${input.action} ${duplicateStepId ? \"ignored (duplicate)\" : \"recorded\"}.\\n`;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `${headerAction}${formatTaskSteps(state, {\n\t\t\t\t\t\t\t\tincludeTerminal: input.showCompleted,\n\t\t\t\t\t\t\t\tmaxItems: input.maxItems,\n\t\t\t\t\t\t\t})}${notices}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction: input.action,\n\t\t\t\t\t\tapplied: true,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\t...stateCounts,\n\t\t\t\t\t\tshowCompleted: input.showCompleted,\n\t\t\t\t\t\tduplicateOfStepId: duplicateStepId,\n\t\t\t\t\t\tdemotedStepIds: demotedStepIds.length > 0 ? demotedStepIds : undefined,\n\t\t\t\t\t} satisfies TaskStepsToolDetails,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn errorResult(input.action, error instanceof Error ? error.message : String(error), current);\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"task-steps.js","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { advanceTaskSteps } from \"../pipelines/increment.ts\";\nimport { MAX_PIPELINE_STAGE_ID_LENGTH } from \"../pipelines/types.ts\";\nimport {\n\taddTaskStep,\n\tclearTaskSteps,\n\tcompactTaskSteps,\n\tcreateTaskStepsState,\n\tfindOpenDuplicateStep,\n\tformatTaskSteps,\n\thasUnverifiedCompletedStep,\n\tMAX_TASK_STEP_PIPELINE_RUN_ID_LENGTH,\n\tMAX_TASK_STEPS,\n\tnormalizeTaskStepPipelineLink,\n\tresolveTaskStepSelector,\n\tsetTaskSteps,\n\ttype TaskStep,\n\ttype TaskStepInput,\n\tTaskStepsError,\n\ttype TaskStepsState,\n\ttype TaskStepUpdate,\n\tupdateTaskStep,\n} from \"../tasks/task-state.ts\";\nimport {\n\temptyOrchestrationCall,\n\tOrchestrationPanelComponent,\n\ttype OrchestrationPanelModel,\n\ttaskStepPanelRow,\n} from \"./orchestration-panel.ts\";\n\nconst statusSchema = Type.Union([\n\tType.Literal(\"pending\"),\n\tType.Literal(\"in_progress\"),\n\tType.Literal(\"completed\"),\n\tType.Literal(\"blocked\"),\n\tType.Literal(\"cancelled\"),\n]);\n\nconst prioritySchema = Type.Union([Type.Literal(\"low\"), Type.Literal(\"normal\"), Type.Literal(\"high\")]);\n\nfunction optionalTaskStepFields(requirementIdsDescription: string) {\n\treturn {\n\t\tstatus: Type.Optional(statusSchema),\n\t\tpriority: Type.Optional(prioritySchema),\n\t\towner: Type.Optional(Type.String({ maxLength: 200 })),\n\t\trequirementIds: Type.Optional(\n\t\t\tType.Array(Type.String({ minLength: 1, maxLength: 200 }), {\n\t\t\t\tmaxItems: 32,\n\t\t\t\tdescription: requirementIdsDescription,\n\t\t\t}),\n\t\t),\n\t\tpipelineRunId: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_TASK_STEP_PIPELINE_RUN_ID_LENGTH,\n\t\t\t\tdescription: \"Active pipeline run id this step advances. Supply together with pipelineStageId.\",\n\t\t\t}),\n\t\t),\n\t\tpipelineStageId: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_PIPELINE_STAGE_ID_LENGTH,\n\t\t\t\tdescription: \"Stage id in pipelineRunId this step advances. Supply both ids together.\",\n\t\t\t}),\n\t\t),\n\t\tclearPipelineLink: Type.Optional(\n\t\t\tType.Boolean({\n\t\t\t\tdescription: \"Remove both pipeline ids. Cannot be combined with pipelineRunId/pipelineStageId.\",\n\t\t\t}),\n\t\t),\n\t\tnote: Type.Optional(Type.String({ maxLength: 4_000 })),\n\t\tevidence: Type.Optional(Type.Array(Type.String({ minLength: 1, maxLength: 2_000 }), { maxItems: 32 })),\n\t};\n}\n\nconst stepInputSchema = Type.Object(\n\t{\n\t\tcontent: Type.String({ minLength: 1, maxLength: 2_000, description: \"Imperative task step text.\" }),\n\t\tactiveForm: Type.Optional(\n\t\t\tType.String({ minLength: 1, maxLength: 2_000, description: \"Short present-progress label for active UI.\" }),\n\t\t),\n\t\t...optionalTaskStepFields(\"Goal requirement ids this foreground step advances.\"),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst taskStepsSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"set\"),\n\t\t\t\tType.Literal(\"add\"),\n\t\t\t\tType.Literal(\"update\"),\n\t\t\t\tType.Literal(\"list\"),\n\t\t\t\tType.Literal(\"clear\"),\n\t\t\t\tType.Literal(\"compact\"),\n\t\t\t\tType.Literal(\"intake\"),\n\t\t\t\tType.Literal(\"advance\"),\n\t\t\t],\n\t\t\t{ description: \"Checklist action. Use list to read without mutation.\" },\n\t\t),\n\t\tsteps: Type.Optional(\n\t\t\tType.Array(stepInputSchema, {\n\t\t\t\tmaxItems: MAX_TASK_STEPS,\n\t\t\t\tdescription: \"Complete replacement list for set/intake. Intake preserves every supplied item in order.\",\n\t\t\t}),\n\t\t),\n\t\tid: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"For update: current/active, exact step id, unique id prefix, or unique content selector.\",\n\t\t\t}),\n\t\t),\n\t\tcontent: Type.Optional(Type.String({ minLength: 1, maxLength: 2_000 })),\n\t\tactiveForm: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t...optionalTaskStepFields(\"Goal requirement ids this foreground step advances; [] clears existing links.\"),\n\t\tclearCompleted: Type.Optional(\n\t\t\tType.Boolean({ description: \"For list: compact completed and cancelled steps before rendering.\" }),\n\t\t),\n\t\tshowCompleted: Type.Optional(Type.Boolean({ description: \"Include completed and cancelled steps in output.\" })),\n\t\tmaxItems: Type.Optional(Type.Integer({ minimum: 1, maximum: MAX_TASK_STEPS })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type TaskStepsToolInput = Static<typeof taskStepsSchema>;\nexport type TaskStepsAction = TaskStepsToolInput[\"action\"];\n\nexport interface TaskStepsToolDetails {\n\taction: TaskStepsAction;\n\tapplied: boolean;\n\terror?: string;\n\tstate?: TaskStepsState;\n\tstepCount?: number;\n\topenStepCount?: number;\n\tverificationNudgeNeeded?: boolean;\n\tshowCompleted?: boolean;\n\t/** Set when `add` was a no-op because an open step already carries this content. */\n\tduplicateOfStepId?: string;\n\t/** Step ids silently demoted to pending because another step became active in this call. */\n\tdemotedStepIds?: readonly string[];\n}\n\nexport interface TaskStepsToolDependencies {\n\tgetTaskStepsState: () => TaskStepsState | undefined;\n\tsaveTaskStepsState: (state: TaskStepsState) => void;\n\tgetActivePipelineScope?: () => { runId: string; stageIds: readonly string[] } | undefined;\n\tnow?: () => string;\n}\n\nfunction toTaskStepUpdate(input: TaskStepsToolInput): TaskStepUpdate {\n\treturn {\n\t\tcontent: input.content,\n\t\tactiveForm: input.activeForm,\n\t\tstatus: input.status,\n\t\tpriority: input.priority,\n\t\towner: input.owner,\n\t\trequirementIds: input.requirementIds,\n\t\tpipelineRunId: input.pipelineRunId,\n\t\tpipelineStageId: input.pipelineStageId,\n\t\tclearPipelineLink: input.clearPipelineLink,\n\t\tnote: input.note,\n\t\tevidence: input.evidence,\n\t};\n}\n\nfunction toTaskStepInput(input: TaskStepsToolInput): TaskStepInput {\n\treturn { ...toTaskStepUpdate(input), content: input.content ?? \"\" };\n}\n\nfunction validatePipelineLink(\n\tdeps: TaskStepsToolDependencies,\n\tpipelineRunId: string | undefined,\n\tpipelineStageId: string | undefined,\n\tclearPipelineLink = false,\n): void {\n\tconst { pipelineRunId: runId, pipelineStageId: stageId } = normalizeTaskStepPipelineLink(\n\t\tpipelineRunId,\n\t\tpipelineStageId,\n\t\tclearPipelineLink,\n\t);\n\tif (!runId || !stageId) return;\n\tconst active = deps.getActivePipelineScope?.();\n\tif (!active) throw new TaskStepsError(\"Task step pipeline linkage requires an active pipeline run.\");\n\tif (runId !== active.runId) {\n\t\tthrow new TaskStepsError(`Task step pipelineRunId must match active run '${active.runId}'.`);\n\t}\n\tif (!active.stageIds.includes(stageId)) {\n\t\tthrow new TaskStepsError(`Task step pipelineStageId '${stageId}' is not in active run '${active.runId}'.`);\n\t}\n}\n\nfunction validatePipelineInputs(deps: TaskStepsToolDependencies, inputs: readonly TaskStepInput[]): void {\n\tfor (const input of inputs) {\n\t\tvalidatePipelineLink(deps, input.pipelineRunId, input.pipelineStageId, input.clearPipelineLink);\n\t}\n}\n\nfunction counts(\n\tstate: TaskStepsState,\n): Pick<TaskStepsToolDetails, \"stepCount\" | \"openStepCount\" | \"verificationNudgeNeeded\"> {\n\tconst openStepCount = state.steps.filter(\n\t\t(step) => step.status !== \"completed\" && step.status !== \"cancelled\",\n\t).length;\n\treturn {\n\t\tstepCount: state.steps.length,\n\t\topenStepCount,\n\t\tverificationNudgeNeeded: hasUnverifiedCompletedStep(state),\n\t};\n}\n\n/** Ids (from `resultSteps`, index-aligned with `inputs`) whose status was set explicitly by the caller. */\nfunction explicitStatusStepIds(inputs: readonly TaskStepInput[], resultSteps: readonly TaskStep[]): Set<string> {\n\tconst ids = new Set<string>();\n\tinputs.forEach((stepInput, index) => {\n\t\tif (stepInput.status !== undefined) {\n\t\t\tconst id = resultSteps[index]?.id;\n\t\t\tif (id) ids.add(id);\n\t\t}\n\t});\n\treturn ids;\n}\n\n/**\n * Steps that were in_progress before this call and are pending after, excluding any step whose\n * new status was set explicitly by the caller (an explicit change is not a \"silent\" demotion).\n */\nfunction computeDemotedStepIds(\n\tbefore: TaskStepsState,\n\tafter: TaskStepsState,\n\texcludeIds: ReadonlySet<string>,\n): string[] {\n\tconst beforeActiveIds = new Set(before.steps.filter((step) => step.status === \"in_progress\").map((step) => step.id));\n\treturn after.steps\n\t\t.filter((step) => beforeActiveIds.has(step.id) && step.status === \"pending\" && !excludeIds.has(step.id))\n\t\t.map((step) => step.id);\n}\n\nfunction errorResult(action: TaskStepsAction, error: string, state?: TaskStepsState) {\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: `task_steps ${action} failed: ${error}` }],\n\t\tdetails: { action, applied: false, error, state, ...(state ? counts(state) : {}) } satisfies TaskStepsToolDetails,\n\t\tisError: true as const,\n\t};\n}\n\nfunction taskStepsPanelModel(details: TaskStepsToolDetails, expanded: boolean): OrchestrationPanelModel {\n\tconst state = details.state;\n\tif (!state) {\n\t\treturn {\n\t\t\tlabel: \"task steps\",\n\t\t\taction: details.action,\n\t\t\tstatus: details.error ? \"error\" : \"idle\",\n\t\t\temptyText: details.error ?? \"No checklist state.\",\n\t\t};\n\t}\n\tconst active = state.steps.filter((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.filter((step) => step.status === \"blocked\");\n\tconst pending = state.steps.filter((step) => step.status === \"pending\");\n\tconst completed = state.steps.filter((step) => step.status === \"completed\");\n\tconst cancelled = state.steps.filter((step) => step.status === \"cancelled\");\n\tconst open = [...active, ...blocked, ...pending];\n\tconst terminal = details.showCompleted ? [...completed, ...cancelled] : [];\n\tconst candidates = [...open, ...terminal];\n\tconst limit = expanded ? 24 : 8;\n\tconst rows = candidates.slice(0, limit).map(taskStepPanelRow);\n\tconst archivedDone = state.archive.completed + state.archive.cancelled;\n\tconst done = completed.length + state.archive.completed;\n\tconst summary = [\n\t\tactive.length ? `${active.length} working` : undefined,\n\t\t`${open.length} open`,\n\t\t`${done} done`,\n\t\tblocked.length ? `${blocked.length} blocked` : undefined,\n\t\tarchivedDone ? `${archivedDone} archived` : undefined,\n\t].filter((value): value is string => value !== undefined);\n\tconst notices = [];\n\tif (!details.showCompleted && completed.length + cancelled.length > 0) {\n\t\tnotices.push({\n\t\t\tstatus: \"info\" as const,\n\t\t\ttext: `${completed.length + cancelled.length} finished step${completed.length + cancelled.length === 1 ? \"\" : \"s\"} hidden`,\n\t\t});\n\t}\n\tif (details.duplicateOfStepId) {\n\t\tnotices.push({ status: \"info\" as const, text: \"Duplicate open step ignored.\" });\n\t}\n\tif (details.demotedStepIds?.length) {\n\t\tnotices.push({\n\t\t\tstatus: \"info\" as const,\n\t\t\ttext: `${details.demotedStepIds.length} previous working step${details.demotedStepIds.length === 1 ? \"\" : \"s\"} returned to pending.`,\n\t\t});\n\t}\n\tif (details.verificationNudgeNeeded) {\n\t\tnotices.push({ status: \"warning\" as const, text: \"Completed work still needs attached evidence.\" });\n\t}\n\tconst status = details.error\n\t\t? \"error\"\n\t\t: blocked.length > 0\n\t\t\t? \"warning\"\n\t\t\t: active.length > 0\n\t\t\t\t? \"running\"\n\t\t\t\t: open.length === 0 && state.steps.length > 0\n\t\t\t\t\t? \"success\"\n\t\t\t\t\t: \"idle\";\n\treturn {\n\t\tlabel: \"task steps\",\n\t\taction: details.action,\n\t\tstatus,\n\t\tsummary,\n\t\trows,\n\t\tnotices,\n\t\temptyText: state.steps.length === 0 ? \"No tracked steps.\" : \"All open steps are done.\",\n\t\thiddenRowCount: Math.max(0, candidates.length - rows.length),\n\t};\n}\n\nexport function createTaskStepsToolDefinition(deps: TaskStepsToolDependencies): ToolDefinition {\n\tconst now = deps.now ?? (() => new Date().toISOString());\n\treturn {\n\t\tname: \"task_steps\",\n\t\tlabel: \"Task Steps\",\n\t\tdescription:\n\t\t\t\"Track the session's ordered multi-step checklist with status, notes, and evidence. Use goal for durable outcomes and delegate for workers.\",\n\t\tpromptSnippet: \"Track multi-step session work.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use for multi-step work; keep one in_progress step.\",\n\t\t\t\"For project changes, establish Plan/Route before first mutation and link steps to the goal contract; task_steps owns execution detail, never a second outcome state.\",\n\t\t\t\"Batch transitions; work the first open step; record evidence/blockers; skip unchanged narration.\",\n\t\t\t\"intake keeps every item; link goal requirementIds.\",\n\t\t\t\"advance completes current, then starts next pending.\",\n\t\t\t\"Attach completed tool_task IDs as evidence; goal completion rejects every open step.\",\n\t\t\t\"Before final, resolve or defer open work. goal owns outcomes; delegate owns workers.\",\n\t\t],\n\t\tparameters: taskStepsSchema,\n\t\texecutionMode: \"sequential\",\n\t\trenderShell: \"self\",\n\t\trenderCall() {\n\t\t\treturn emptyOrchestrationCall();\n\t\t},\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tif (isPartial) return emptyOrchestrationCall();\n\t\t\tconst details = result.details as TaskStepsToolDetails | undefined;\n\t\t\tif (!details) {\n\t\t\t\treturn new OrchestrationPanelComponent(theme, {\n\t\t\t\t\tlabel: \"task steps\",\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\temptyText: \"No task-step details were returned.\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!expanded && details.applied) return emptyOrchestrationCall();\n\t\t\treturn new OrchestrationPanelComponent(theme, taskStepsPanelModel(details, expanded), expanded);\n\t\t},\n\t\tasync execute(_toolCallId, input: TaskStepsToolInput) {\n\t\t\tconst timestamp = now();\n\t\t\tconst current = deps.getTaskStepsState();\n\t\t\tconst before = current ?? createTaskStepsState(timestamp);\n\t\t\tlet state = before;\n\t\t\tlet duplicateStepId: string | undefined;\n\t\t\tlet demotedStepIds: readonly string[] = [];\n\t\t\ttry {\n\t\t\t\tswitch (input.action) {\n\t\t\t\t\tcase \"set\":\n\t\t\t\t\tcase \"intake\": {\n\t\t\t\t\t\tconst steps = input.steps;\n\t\t\t\t\t\tif (!steps) {\n\t\t\t\t\t\t\tconst error =\n\t\t\t\t\t\t\t\tinput.action === \"set\" ? \"set requires steps[].\" : \"intake requires a complete steps[] list.\";\n\t\t\t\t\t\t\treturn errorResult(input.action, error, current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalidatePipelineInputs(deps, steps);\n\t\t\t\t\t\tstate = setTaskSteps(state, steps, timestamp);\n\t\t\t\t\t\tdemotedStepIds = computeDemotedStepIds(before, state, explicitStatusStepIds(steps, state.steps));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\tvalidatePipelineLink(deps, input.pipelineRunId, input.pipelineStageId, input.clearPipelineLink);\n\t\t\t\t\t\tstate = addTaskStep(state, toTaskStepInput(input), timestamp);\n\t\t\t\t\t\tif (state === before) {\n\t\t\t\t\t\t\t// The reducer returned the unchanged state: an open step already carries this\n\t\t\t\t\t\t\t// content, so nothing was created. Name the existing step in the response.\n\t\t\t\t\t\t\tduplicateStepId = findOpenDuplicateStep(before.steps, input.content ?? \"\")?.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"update\": {\n\t\t\t\t\t\tif (!input.id?.trim())\n\t\t\t\t\t\t\treturn errorResult(input.action, \"update requires id or a unique selector.\", current);\n\t\t\t\t\t\tconst selected = resolveTaskStepSelector(before.steps, input.id);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinput.pipelineRunId !== undefined ||\n\t\t\t\t\t\t\tinput.pipelineStageId !== undefined ||\n\t\t\t\t\t\t\tinput.clearPipelineLink === true\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst clearingPipelineLink = input.clearPipelineLink === true;\n\t\t\t\t\t\t\tvalidatePipelineLink(\n\t\t\t\t\t\t\t\tdeps,\n\t\t\t\t\t\t\t\tclearingPipelineLink ? input.pipelineRunId : (input.pipelineRunId ?? selected.pipelineRunId),\n\t\t\t\t\t\t\t\tclearingPipelineLink\n\t\t\t\t\t\t\t\t\t? input.pipelineStageId\n\t\t\t\t\t\t\t\t\t: (input.pipelineStageId ?? selected.pipelineStageId),\n\t\t\t\t\t\t\t\tclearingPipelineLink,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstate = updateTaskStep(state, input.id, toTaskStepUpdate(input), timestamp);\n\t\t\t\t\t\t// Exclude the explicitly targeted step: its own status change was requested by\n\t\t\t\t\t\t// the caller, so it is never a \"silent\" demotion even if it moved to pending.\n\t\t\t\t\t\tdemotedStepIds = computeDemotedStepIds(before, state, new Set([selected.id]));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\tstate = clearTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"compact\":\n\t\t\t\t\t\tstate = compactTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"advance\": {\n\t\t\t\t\t\tconst advanced = advanceTaskSteps(before, timestamp);\n\t\t\t\t\t\tstate = advanced.state;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tif (input.clearCompleted) state = compactTaskSteps(state, timestamp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst isNoopDuplicateAdd = input.action === \"add\" && state === before;\n\t\t\t\tconst mutated = (input.action !== \"list\" || input.clearCompleted === true) && !isNoopDuplicateAdd;\n\t\t\t\tif (mutated) deps.saveTaskStepsState(state);\n\n\t\t\t\tconst stateCounts = counts(state);\n\t\t\t\tconst noticeLines: string[] = [];\n\t\t\t\tif (duplicateStepId) {\n\t\t\t\t\tnoticeLines.push(\n\t\t\t\t\t\t`Duplicate open step ignored; existing ${duplicateStepId} already tracks this content.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (demotedStepIds.length > 0) {\n\t\t\t\t\tnoticeLines.push(`Demoted to pending because another step became active: ${demotedStepIds.join(\", \")}.`);\n\t\t\t\t}\n\t\t\t\tif (stateCounts.verificationNudgeNeeded) {\n\t\t\t\t\tnoticeLines.push(\n\t\t\t\t\t\t\"Reminder: a completed step has no evidence attached; attach evidence via update before treating it as verified.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst notices = noticeLines.length > 0 ? `\\n${noticeLines.join(\"\\n\")}` : \"\";\n\n\t\t\t\tconst headerAction =\n\t\t\t\t\tinput.action === \"list\"\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: `task_steps ${input.action} ${duplicateStepId ? \"ignored (duplicate)\" : \"recorded\"}.\\n`;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `${headerAction}${formatTaskSteps(state, {\n\t\t\t\t\t\t\t\tincludeTerminal: input.showCompleted,\n\t\t\t\t\t\t\t\tmaxItems: input.maxItems,\n\t\t\t\t\t\t\t})}${notices}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction: input.action,\n\t\t\t\t\t\tapplied: true,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\t...stateCounts,\n\t\t\t\t\t\tshowCompleted: input.showCompleted,\n\t\t\t\t\t\tduplicateOfStepId: duplicateStepId,\n\t\t\t\t\t\tdemotedStepIds: demotedStepIds.length > 0 ? demotedStepIds : undefined,\n\t\t\t\t\t} satisfies TaskStepsToolDetails,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn errorResult(input.action, error instanceof Error ? error.message : String(error), current);\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -34,7 +34,7 @@ export interface TmuxDispatchDeps {
34
34
  * a creation refusal aborts cleanly before any tmux/pane side effect ever runs -- never a
35
35
  * half-made lane, never a fabricated worktree. On success the dispatched agent's `cwd` is the new
36
36
  * lane worktree and it carries `worktreeLane` (threaded to the tmux extension's launch profile --
37
- * see `dispatch-grant.ts`'s `buildLaunchProfileFlags`). Absent dep -> existing byte-identical
37
+ * see `launch-profile.ts`'s `buildLaunchProfileFlags`). Absent dep -> existing byte-identical
38
38
  * `params.agents` (no `cwd`/`worktreeLane`), exactly as before this field existed.
39
39
  */
40
40
  createLaneWorktree?: (args: {
@@ -56,25 +56,13 @@ export interface TmuxDispatchDeps {
56
56
  */
57
57
  evaluateWorkerLaneRefusal?: () => LaneWorkerRefusal | undefined;
58
58
  }
59
- /**
60
- * Classify a `fire_task` launch failure into an honest, stable skip reason. For an UNATTENDED
61
- * caller (`ctx.hasUI === false`, always true from the goal/idle path) `authorizeLaunch`'s ONLY
62
- * refusal throw is the no-standing-grant error (`tmux-agent-manager/index.ts`'s `authorizeLaunch`,
63
- * message containing the stable phrase "no standing grant") -- matched here by substring since the
64
- * extension throws a plain `Error`, not a tagged error code (documented follow-up hardening, not
65
- * blocking). Every other thrown error (a bad jobId, a live session-name collision,
66
- * an environment failure) maps onto the generic `"tmux_dispatch_failed"` -- still surfaced through
67
- * the existing `dispatchSkipReason` contract, never a crash and never a silently-ignored failure.
68
- */
69
- export declare function classifyDispatchError(error: unknown): string;
70
59
  /**
71
60
  * Structurally dispatch ONE persistent tmux worker agent for a single goal requirement, by
72
61
  * invoking the SAME `tmux_agent_manager` `fire_task` tool call the model itself would make. Core
73
62
  * -- not model discretion -- decides WHEN this fires (the goal tool's `dispatchTarget:"tmux"`
74
- * routing gates the call); the launch itself always still goes through the extension's own
75
- * grant-gated `authorizeLaunch`, so an ungranted unattended call is honestly refused here (never a
76
- * silent launch, never a fabricated laneId) and the refusal is surfaced through the existing
77
- * `dispatchSkipReason` contract on the goal tool's response.
63
+ * routing gates the call). The extension derives an immutable child profile from the parent's
64
+ * admitted worker surface and reserves it durably before launch; no separate approval handshake is
65
+ * involved. Any launch failure is surfaced through the existing `dispatchSkipReason` contract.
78
66
  */
79
67
  export declare function dispatchTmuxWorker(deps: TmuxDispatchDeps, args: {
80
68
  requirementId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tmux-dispatch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tmux-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B;;;uCAGmC;IACnC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;IAChE;;0BAEsB;IACtB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;IAC/C;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACnE;;iDAE6C;IAC7C,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC;;;;;;;;;OASG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;KACtB,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;CAChE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG5D;AAaD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+EnD"}
1
+ {"version":3,"file":"tmux-dispatch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tmux-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B;;;uCAGmC;IACnC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;IAChE;;0BAEsB;IACtB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;IAC/C;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACnE;;iDAE6C;IAC7C,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC;;;;;;;;;OASG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;KACtB,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;CAChE;AAaD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+EnD"}