@ashx-j/lunr 0.2.10 → 0.2.12

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 (344) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +211 -236
  3. package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
  4. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-tui.js +28 -11
  6. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  7. package/dist/builtin-extensions/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +0 -2
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  12. package/dist/builtin-extensions/lunr-cron.js +7 -2
  13. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
  16. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
  18. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
  20. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +7 -8
  23. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +10 -18
  27. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
  29. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
  31. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
  33. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
  35. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
  37. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
  40. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
  42. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
  44. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
  56. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
  58. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
  61. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
  63. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
  65. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
  67. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
  69. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +269 -167
  71. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
  73. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
  74. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
  75. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
  76. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
  77. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
  78. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
  79. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
  80. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
  82. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
  83. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
  84. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  85. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  86. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
  87. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  88. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
  89. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  90. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  91. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
  92. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  93. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  94. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  95. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
  96. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  97. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
  98. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
  99. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
  100. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
  101. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
  102. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
  104. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
  105. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +82 -21
  106. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
  108. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  109. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
  110. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
  112. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  113. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
  114. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  115. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
  116. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  118. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
  120. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
  122. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
  124. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
  125. package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
  126. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  127. package/dist/builtin-extensions/simple-pi-memory.js +41 -17
  128. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  129. package/dist/catalog/models.json +1 -1
  130. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  131. package/dist/catalog/providers/azure-openai-responses.json +1 -1
  132. package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
  133. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  134. package/dist/catalog/providers/fireworks.json +1 -1
  135. package/dist/catalog/providers/github-copilot.json +1 -1
  136. package/dist/catalog/providers/huggingface.json +1 -1
  137. package/dist/catalog/providers/minimax-cn.json +1 -1
  138. package/dist/catalog/providers/minimax.json +1 -1
  139. package/dist/catalog/providers/mistral.json +1 -1
  140. package/dist/catalog/providers/nvidia.json +1 -1
  141. package/dist/catalog/providers/openai.json +1 -1
  142. package/dist/catalog/providers/opencode-go.json +1 -1
  143. package/dist/catalog/providers/opencode.json +1 -1
  144. package/dist/catalog/providers/openrouter.json +1 -1
  145. package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
  146. package/dist/catalog/providers/qwen-cloud.json +1 -1
  147. package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
  148. package/dist/catalog/providers/qwen-token-plan.json +1 -1
  149. package/dist/catalog/providers/together.json +1 -1
  150. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  151. package/dist/catalog/providers/xai.json +1 -1
  152. package/dist/catalog/providers/zai-coding-cn.json +1 -1
  153. package/dist/catalog/providers/zai.json +1 -1
  154. package/dist/catalog/publication.json +3 -3
  155. package/dist/core/agent-session.d.ts +7 -1
  156. package/dist/core/agent-session.d.ts.map +1 -1
  157. package/dist/core/agent-session.js +36 -6
  158. package/dist/core/agent-session.js.map +1 -1
  159. package/dist/core/customize.d.ts +2 -0
  160. package/dist/core/customize.d.ts.map +1 -1
  161. package/dist/core/customize.js +6 -0
  162. package/dist/core/customize.js.map +1 -1
  163. package/dist/core/memory-cap.d.ts +4 -8
  164. package/dist/core/memory-cap.d.ts.map +1 -1
  165. package/dist/core/memory-cap.js +8 -8
  166. package/dist/core/memory-cap.js.map +1 -1
  167. package/dist/core/models-store.d.ts.map +1 -1
  168. package/dist/core/models-store.js +13 -1
  169. package/dist/core/models-store.js.map +1 -1
  170. package/dist/core/permissions.d.ts +11 -0
  171. package/dist/core/permissions.d.ts.map +1 -1
  172. package/dist/core/permissions.js +90 -34
  173. package/dist/core/permissions.js.map +1 -1
  174. package/dist/core/plan-mode.d.ts.map +1 -1
  175. package/dist/core/plan-mode.js +50 -16
  176. package/dist/core/plan-mode.js.map +1 -1
  177. package/dist/core/rollback.d.ts.map +1 -1
  178. package/dist/core/rollback.js +1 -1
  179. package/dist/core/rollback.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +9 -5
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +24 -10
  183. package/dist/core/settings-manager.js.map +1 -1
  184. package/dist/core/slash-commands.d.ts.map +1 -1
  185. package/dist/core/slash-commands.js +1 -5
  186. package/dist/core/slash-commands.js.map +1 -1
  187. package/dist/core/subagent-permission-inherit.d.ts +34 -22
  188. package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
  189. package/dist/core/subagent-permission-inherit.js +37 -80
  190. package/dist/core/subagent-permission-inherit.js.map +1 -1
  191. package/dist/core/swarm.d.ts +17 -4
  192. package/dist/core/swarm.d.ts.map +1 -1
  193. package/dist/core/swarm.js +48 -10
  194. package/dist/core/swarm.js.map +1 -1
  195. package/dist/core/system-prompt.d.ts +6 -4
  196. package/dist/core/system-prompt.d.ts.map +1 -1
  197. package/dist/core/system-prompt.js +38 -48
  198. package/dist/core/system-prompt.js.map +1 -1
  199. package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
  200. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  201. package/dist/core/usage-adapters/openai-codex.js +22 -17
  202. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  203. package/dist/core/usage-service.d.ts +10 -1
  204. package/dist/core/usage-service.d.ts.map +1 -1
  205. package/dist/core/usage-service.js +17 -6
  206. package/dist/core/usage-service.js.map +1 -1
  207. package/dist/gateway/agent-bridge.d.ts +1 -1
  208. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  209. package/dist/gateway/agent-bridge.js +12 -5
  210. package/dist/gateway/agent-bridge.js.map +1 -1
  211. package/dist/gateway/commands.d.ts.map +1 -1
  212. package/dist/gateway/commands.js +2 -1
  213. package/dist/gateway/commands.js.map +1 -1
  214. package/dist/gateway/cron.d.ts +4 -1
  215. package/dist/gateway/cron.d.ts.map +1 -1
  216. package/dist/gateway/cron.js +18 -12
  217. package/dist/gateway/cron.js.map +1 -1
  218. package/dist/gateway/router.d.ts +1 -1
  219. package/dist/gateway/router.d.ts.map +1 -1
  220. package/dist/gateway/router.js.map +1 -1
  221. package/dist/main.d.ts.map +1 -1
  222. package/dist/main.js +0 -5
  223. package/dist/main.js.map +1 -1
  224. package/dist/migrations.d.ts +2 -0
  225. package/dist/migrations.d.ts.map +1 -1
  226. package/dist/migrations.js +21 -0
  227. package/dist/migrations.js.map +1 -1
  228. package/dist/modes/interactive/components/settings-selector.d.ts +4 -3
  229. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  230. package/dist/modes/interactive/components/settings-selector.js +21 -77
  231. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  232. package/dist/modes/interactive/components/usage-view.d.ts +1 -1
  233. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  234. package/dist/modes/interactive/components/usage-view.js +7 -4
  235. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  236. package/dist/modes/interactive/interactive-mode.d.ts +1 -2
  237. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  238. package/dist/modes/interactive/interactive-mode.js +39 -93
  239. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  240. package/docs/compaction.md +23 -23
  241. package/docs/containerization.md +24 -24
  242. package/docs/custom-provider.md +18 -18
  243. package/docs/development.md +16 -15
  244. package/docs/docs.json +6 -2
  245. package/docs/extensions.md +82 -80
  246. package/docs/features.md +102 -0
  247. package/docs/index.md +25 -19
  248. package/docs/json.md +7 -7
  249. package/docs/keybindings.md +4 -4
  250. package/docs/models.md +2 -2
  251. package/docs/packages.md +38 -42
  252. package/docs/prompt-templates.md +4 -4
  253. package/docs/providers.md +22 -10
  254. package/docs/quickstart.md +81 -46
  255. package/docs/rpc.md +7 -13
  256. package/docs/sdk.md +43 -41
  257. package/docs/security.md +18 -18
  258. package/docs/session-format.md +9 -9
  259. package/docs/sessions.md +13 -12
  260. package/docs/settings.md +62 -24
  261. package/docs/shell-aliases.md +2 -2
  262. package/docs/skills.md +11 -11
  263. package/docs/terminal-setup.md +5 -5
  264. package/docs/termux.md +7 -7
  265. package/docs/themes.md +12 -14
  266. package/docs/tmux.md +4 -4
  267. package/docs/tui.md +23 -23
  268. package/docs/usage.md +112 -87
  269. package/docs/windows.md +10 -2
  270. package/examples/README.md +3 -1
  271. package/examples/extensions/README.md +6 -6
  272. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  273. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  274. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  275. package/examples/extensions/doom-overlay/README.md +2 -2
  276. package/examples/extensions/gondolin/package-lock.json +2 -2
  277. package/examples/extensions/gondolin/package.json +1 -1
  278. package/examples/extensions/plan-mode/README.md +3 -1
  279. package/examples/extensions/sandbox/package-lock.json +2 -2
  280. package/examples/extensions/sandbox/package.json +1 -1
  281. package/examples/extensions/subagent/README.md +13 -11
  282. package/examples/extensions/todo.ts +2 -1
  283. package/examples/extensions/with-deps/package-lock.json +2 -2
  284. package/examples/extensions/with-deps/package.json +1 -1
  285. package/examples/sdk/README.md +9 -5
  286. package/package.json +6 -7
  287. package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
  288. package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
  289. package/dist/builtin-extensions/lunr-behavior.js +0 -213
  290. package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
  291. package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
  292. package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
  293. package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
  294. package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
  295. package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
  296. package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
  297. package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
  298. package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
  299. package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
  300. package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
  301. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
  302. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
  303. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
  304. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
  305. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
  306. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
  307. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
  308. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
  309. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
  310. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
  311. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
  312. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
  313. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
  314. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
  315. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
  316. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
  317. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
  318. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
  319. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
  320. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
  321. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
  322. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
  323. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
  324. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
  325. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
  326. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
  327. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
  328. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
  329. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
  330. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
  331. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
  332. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
  333. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
  334. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
  335. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
  336. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
  337. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
  338. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
  339. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
  340. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
  341. package/dist/core/behavior-preset.d.ts +0 -60
  342. package/dist/core/behavior-preset.d.ts.map +0 -1
  343. package/dist/core/behavior-preset.js +0 -257
  344. package/dist/core/behavior-preset.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n\targumentHint?: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{ name: \"model\", description: \"Select model (opens selector UI)\", argumentHint: \"<provider/model>\" },\n\t{ name: \"refresh\", description: \"Refresh model lists for all providers\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"title\", description: \"Set session display name (alias of /name)\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"usage\", description: \"Show token totals, context, and plan usage\" },\n\t{ name: \"context\", description: \"Show estimated context window breakdown\" },\n\t{\n\t\tname: \"plan\",\n\t\tdescription: \"Switch to plan permission mode, or /plan <task> to plan a task\",\n\t\targumentHint: \"[on|off|status|<task>]\",\n\t},\n\t{\n\t\tname: \"mode\",\n\t\tdescription: \"Set permission mode: manual, yolo, plan, or auto\",\n\t\targumentHint: \"[manual|yolo|plan|auto]\",\n\t},\n\t{ name: \"manual\", description: \"Activate manual permission mode (approve every action)\" },\n\t{ name: \"yolo\", description: \"Activate YOLO permission mode (auto-approve tools)\" },\n\t{ name: \"auto\", description: \"Activate auto permission mode (fully autonomous, no questions)\" },\n\t{ name: \"processes\", description: \"View and manage background processes started this session\" },\n\t{ name: \"rollback\", description: \"Undo the last turn's file changes and rewind the conversation\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"undo\", description: \"Rewind the last turn (same session; /redo restores)\" },\n\t{ name: \"edit\", description: \"Rewind the last turn and put its text in the chat box\" },\n\t{ name: \"redo\", description: \"Restore a turn undone with /undo\" },\n\t{ name: \"trust\", description: \"Save project trust decision for future sessions\" },\n\t{ name: \"login\", description: \"Configure provider authentication\", argumentHint: \"<provider>\" },\n\t{ name: \"auth\", description: \"Configure provider authentication (alias of /login)\", argumentHint: \"<provider>\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"deauth\", description: \"Remove provider authentication (alias of /logout)\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"init\", description: \"Generate a starter AGENTS.md for this project\" },\n\t{ name: \"swarm\", description: \"Orchestrate parallel subagents for a complex task\", argumentHint: \"<task>\" },\n\t{\n\t\tname: \"research\",\n\t\tdescription: \"Deep research with cited sources\",\n\t\targumentHint: \"[--depth N] [--breadth N] <question>\",\n\t},\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"sessions\", description: \"Browse and resume sessions\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, themes, and context files\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n\t{ name: \"exit\", description: `Quit ${APP_NAME} (alias of /quit)` },\n];\n"]}
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n\targumentHint?: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{ name: \"model\", description: \"Select model (opens selector UI)\", argumentHint: \"<provider/model>\" },\n\t{ name: \"refresh\", description: \"Refresh model lists for all providers\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"title\", description: \"Set session display name (alias of /name)\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"usage\", description: \"Show token totals, context, and plan usage\" },\n\t{ name: \"fast\", description: \"Toggle OpenAI Codex subscription Fast mode\", argumentHint: \"[on|off|status]\" },\n\t{ name: \"context\", description: \"Show estimated context window breakdown\" },\n\t{\n\t\tname: \"plan\",\n\t\tdescription: \"Switch to plan permission mode, or /plan <task> to plan a task\",\n\t\targumentHint: \"[on|off|status|<task>]\",\n\t},\n\t{\n\t\tname: \"mode\",\n\t\tdescription: \"Set permission mode: manual, yolo, plan, or auto\",\n\t\targumentHint: \"[manual|yolo|plan|auto]\",\n\t},\n\t{ name: \"manual\", description: \"Activate manual permission mode (approve every action)\" },\n\t{ name: \"yolo\", description: \"Activate YOLO permission mode (auto-approve tools)\" },\n\t{ name: \"auto\", description: \"Activate auto permission mode (fully autonomous, no questions)\" },\n\t{ name: \"processes\", description: \"View and manage background processes started this session\" },\n\t{ name: \"rollback\", description: \"Undo the last turn's file changes and rewind the conversation\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"undo\", description: \"Rewind the last turn (same session; /redo restores)\" },\n\t{ name: \"edit\", description: \"Rewind the last turn and put its text in the chat box\" },\n\t{ name: \"redo\", description: \"Restore a turn undone with /undo\" },\n\t{ name: \"trust\", description: \"Save project trust decision for future sessions\" },\n\t{ name: \"login\", description: \"Configure provider authentication\", argumentHint: \"<provider>\" },\n\t{ name: \"auth\", description: \"Configure provider authentication (alias of /login)\", argumentHint: \"<provider>\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"deauth\", description: \"Remove provider authentication (alias of /logout)\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"init\", description: \"Generate a starter AGENTS.md for this project\" },\n\t{ name: \"swarm\", description: \"Orchestrate parallel subagents for a complex task\", argumentHint: \"<task>\" },\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"sessions\", description: \"Browse and resume sessions\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, themes, and context files\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n\t{ name: \"exit\", description: `Quit ${APP_NAME} (alias of /quit)` },\n];\n"]}
@@ -1,38 +1,50 @@
1
1
  /**
2
- * lunr: parent-delegated children inherit a snapshot of the parent's permission
3
- * mode. Plan parents may only launch read-only agents. Any other parent mode
4
- * (or a missing/unknown snapshot on a real child) runs the child in auto so
5
- * writes can finish without a TUI approval channel.
2
+ * lunR: parent-delegated children inherit an explicit permission level, not a
3
+ * named agent role. The parent process resolves the requested level against
4
+ * its own mode, then snapshots that resolved child permission into the child
5
+ * environment. Full maps to child runtime Auto; read-only maps to Plan.
6
6
  *
7
7
  * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and
8
8
  * stay fail-closed.
9
9
  */
10
10
  import { type PermissionMode } from "./permissions.ts";
11
11
  export declare const SUBAGENT_CHILD_ENV = "PI_SUBAGENT_CHILD";
12
+ export declare const SUBAGENT_CHILD_PERMISSION_ENV = "PI_SUBAGENT_CHILD_PERMISSION";
13
+ /** @deprecated Replaced by SUBAGENT_CHILD_PERMISSION_ENV. Kept so leftover env is ignored. */
12
14
  export declare const SUBAGENT_PARENT_PERMISSION_MODE_ENV = "PI_SUBAGENT_PARENT_PERMISSION_MODE";
13
- export declare const PLAN_MODE_WRITE_SPAWN_ERROR = "Cannot launch write-capable subagents in plan mode. Only read-only agents are allowed.";
15
+ export type ChildPermission = "full" | "read-only";
16
+ export declare const PLAN_MODE_WRITE_SPAWN_ERROR = "Cannot launch a full-access child in plan mode. Relaunch with permissions: \"read-only\".";
14
17
  export declare function isSubagentChildProcess(env?: NodeJS.ProcessEnv): boolean;
15
18
  export declare function parseParentPermissionMode(value: string | undefined): PermissionMode | undefined;
16
- /** Child mode for a real `PI_SUBAGENT_CHILD=1` process. Missing/unknown → auto. */
17
- export declare function resolveChildPermissionMode(parentMode: string | undefined): PermissionMode;
19
+ export declare function parseChildPermission(value: string | undefined): ChildPermission | undefined;
20
+ /** Omitted permissions resolve to full. Unknown values are rejected by the schema/executor. */
21
+ export declare function resolveRequestedChildPermission(requested?: string): ChildPermission;
22
+ export declare function resolveChildRuntimePermissionMode(childPermission: string | undefined): PermissionMode;
18
23
  export declare function snapshotParentPermissionMode(sessionId?: string): PermissionMode;
24
+ export interface ResolvedChildPermissions {
25
+ ok: true;
26
+ requested: ChildPermission;
27
+ effective: ChildPermission;
28
+ }
29
+ export interface RejectedChildPermissions {
30
+ ok: false;
31
+ requested: ChildPermission;
32
+ error: string;
33
+ }
19
34
  /**
20
- * Apply the inherited child mode before any tool call. No-op for non-child
21
- * processes so `lunr -p` stays fail-closed.
35
+ * Resolve the child's permission level before spawn.
36
+ *
37
+ * Parent mode Requested Result
38
+ * Manual/YOLO/Auto omitted Full
39
+ * Manual/YOLO/Auto full Full
40
+ * Manual/YOLO/Auto read-only Read-only
41
+ * Plan read-only Read-only
42
+ * Plan full / omitted Reject (omission resolves to full)
22
43
  */
23
- export declare function applyInheritedSubagentPermissions(env?: NodeJS.ProcessEnv): PermissionMode | undefined;
24
- export declare function agentBasename(name: string): string;
44
+ export declare function resolveChildPermissions(parentMode: string | undefined, requested?: string): ResolvedChildPermissions | RejectedChildPermissions;
25
45
  /**
26
- * Writer agents fail spawn in plan mode. Known read-only names are allowed
27
- * even if their roster lists `write`. Unknown agents are writers when the
28
- * resolved tool list is unrestricted or contains a mutating tool. `bash` alone
29
- * does not count (inspection agents keep it).
46
+ * Apply the resolved child permission before any tool call. No-op for non-child
47
+ * processes so `lunr -p` stays fail-closed.
30
48
  */
31
- export declare function isWriteCapableSubagent(agentName: string, tools?: string[]): boolean;
32
- export declare function planModeWriteSpawnError(parentMode: string | undefined, agents: ReadonlyArray<{
33
- name: string;
34
- tools?: string[];
35
- }>): string | undefined;
36
- /** Drop mutating tools from a plan child's `--tools` list. Leave `bash`. */
37
- export declare function filterToolsForInheritedChild(tools: string[] | undefined, parentMode: string | undefined): string[] | undefined;
49
+ export declare function applyInheritedSubagentPermissions(env?: NodeJS.ProcessEnv): PermissionMode | undefined;
38
50
  //# sourceMappingURL=subagent-permission-inherit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-permission-inherit.d.ts","sourceRoot":"","sources":["../../src/core/subagent-permission-inherit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AAE5F,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AAExF,eAAO,MAAM,2BAA2B,2FACiD,CAAC;AAoC1F,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEpF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAG/F;AAED,qFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAEzF;AAED,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAE/E;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,GAAG,SAAS,CAKlH;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAQD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAKnF;AAED,wBAAgB,uBAAuB,CACtC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GACvD,MAAM,GAAG,SAAS,CAMpB;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,EAAE,GAAG,SAAS,CAGtB","sourcesContent":["/**\n * lunr: parent-delegated children inherit a snapshot of the parent's permission\n * mode. Plan parents may only launch read-only agents. Any other parent mode\n * (or a missing/unknown snapshot on a real child) runs the child in auto so\n * writes can finish without a TUI approval channel.\n *\n * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and\n * stay fail-closed.\n */\n\nimport { getPermissionMode, type PermissionMode, resetPermissions } from \"./permissions.ts\";\n\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\n\nexport const PLAN_MODE_WRITE_SPAWN_ERROR =\n\t\"Cannot launch write-capable subagents in plan mode. Only read-only agents are allowed.\";\n\n/** Known writer basenames. Packaged names use `package.local`. */\nconst WRITE_CAPABLE_AGENT_BASENAMES = new Set([\"worker\", \"delegate\", \"editor\"]);\n\n/**\n * Known research/review agents. Their roster may still list `write` for\n * scratch files; plan mode keeps those tools blocked instead of failing spawn.\n */\nconst READ_ONLY_AGENT_BASENAMES = new Set([\n\t\"scout\",\n\t\"reviewer\",\n\t\"researcher\",\n\t\"research\",\n\t\"status\",\n\t\"oracle\",\n\t\"planner\",\n\t\"context-builder\",\n\t\"deep-researcher\",\n\t\"research-writer\",\n]);\n\n/** Tools that make an unknown/custom agent write-capable at spawn time. */\nconst WRITE_CAPABLE_TOOLS = new Set([\n\t\"edit\",\n\t\"write\",\n\t\"behavior_add\",\n\t\"behavior_remove\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"cron\",\n\t\"code_rewrite\",\n]);\n\nconst PLAN_STRIP_TOOLS = new Set(WRITE_CAPABLE_TOOLS);\n\nexport function isSubagentChildProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[SUBAGENT_CHILD_ENV] === \"1\";\n}\n\nexport function parseParentPermissionMode(value: string | undefined): PermissionMode | undefined {\n\tif (value === \"manual\" || value === \"yolo\" || value === \"plan\" || value === \"auto\") return value;\n\treturn undefined;\n}\n\n/** Child mode for a real `PI_SUBAGENT_CHILD=1` process. Missing/unknown → auto. */\nexport function resolveChildPermissionMode(parentMode: string | undefined): PermissionMode {\n\treturn parseParentPermissionMode(parentMode) === \"plan\" ? \"plan\" : \"auto\";\n}\n\nexport function snapshotParentPermissionMode(sessionId?: string): PermissionMode {\n\treturn getPermissionMode(sessionId);\n}\n\n/**\n * Apply the inherited child mode before any tool call. No-op for non-child\n * processes so `lunr -p` stays fail-closed.\n */\nexport function applyInheritedSubagentPermissions(env: NodeJS.ProcessEnv = process.env): PermissionMode | undefined {\n\tif (!isSubagentChildProcess(env)) return undefined;\n\tconst childMode = resolveChildPermissionMode(env[SUBAGENT_PARENT_PERMISSION_MODE_ENV]);\n\tresetPermissions(childMode);\n\treturn childMode;\n}\n\nexport function agentBasename(name: string): string {\n\tconst trimmed = name.trim();\n\tconst dot = trimmed.lastIndexOf(\".\");\n\treturn (dot >= 0 ? trimmed.slice(dot + 1) : trimmed).toLowerCase();\n}\n\nfunction isWriteCapableByName(name: string): boolean {\n\tconst base = agentBasename(name);\n\tif (WRITE_CAPABLE_AGENT_BASENAMES.has(base)) return true;\n\treturn base.endsWith(\"-editor\") || base.endsWith(\"_editor\");\n}\n\n/**\n * Writer agents fail spawn in plan mode. Known read-only names are allowed\n * even if their roster lists `write`. Unknown agents are writers when the\n * resolved tool list is unrestricted or contains a mutating tool. `bash` alone\n * does not count (inspection agents keep it).\n */\nexport function isWriteCapableSubagent(agentName: string, tools?: string[]): boolean {\n\tif (isWriteCapableByName(agentName)) return true;\n\tif (READ_ONLY_AGENT_BASENAMES.has(agentBasename(agentName))) return false;\n\tif (!tools || tools.length === 0) return true;\n\treturn tools.some((tool) => WRITE_CAPABLE_TOOLS.has(tool));\n}\n\nexport function planModeWriteSpawnError(\n\tparentMode: string | undefined,\n\tagents: ReadonlyArray<{ name: string; tools?: string[] }>,\n): string | undefined {\n\tif (parseParentPermissionMode(parentMode) !== \"plan\") return undefined;\n\tif (agents.some((agent) => isWriteCapableSubagent(agent.name, agent.tools))) {\n\t\treturn PLAN_MODE_WRITE_SPAWN_ERROR;\n\t}\n\treturn undefined;\n}\n\n/** Drop mutating tools from a plan child's `--tools` list. Leave `bash`. */\nexport function filterToolsForInheritedChild(\n\ttools: string[] | undefined,\n\tparentMode: string | undefined,\n): string[] | undefined {\n\tif (!tools || parseParentPermissionMode(parentMode) !== \"plan\") return tools;\n\treturn tools.filter((tool) => !PLAN_STRIP_TOOLS.has(tool));\n}\n"]}
1
+ {"version":3,"file":"subagent-permission-inherit.d.ts","sourceRoot":"","sources":["../../src/core/subagent-permission-inherit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AAE5F,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAC5E,8FAA8F;AAC9F,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AAExF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;AAEnD,eAAO,MAAM,2BAA2B,8FACkD,CAAC;AAE3F,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEpF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAG/F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAG3F;AAED,+FAA+F;AAC/F,wBAAgB,+BAA+B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe,CAEnF;AAED,wBAAgB,iCAAiC,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAErG;AAED,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAE/E;AAED,MAAM,WAAW,wBAAwB;IACxC,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACxC,EAAE,EAAE,KAAK,CAAC;IACV,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACtC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,MAAM,GAChB,wBAAwB,GAAG,wBAAwB,CAMrD;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,GAAG,SAAS,CAKlH","sourcesContent":["/**\n * lunR: parent-delegated children inherit an explicit permission level, not a\n * named agent role. The parent process resolves the requested level against\n * its own mode, then snapshots that resolved child permission into the child\n * environment. Full maps to child runtime Auto; read-only maps to Plan.\n *\n * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and\n * stay fail-closed.\n */\n\nimport { getPermissionMode, type PermissionMode, resetPermissions } from \"./permissions.ts\";\n\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\n/** @deprecated Replaced by SUBAGENT_CHILD_PERMISSION_ENV. Kept so leftover env is ignored. */\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\n\nexport type ChildPermission = \"full\" | \"read-only\";\n\nexport const PLAN_MODE_WRITE_SPAWN_ERROR =\n\t'Cannot launch a full-access child in plan mode. Relaunch with permissions: \"read-only\".';\n\nexport function isSubagentChildProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[SUBAGENT_CHILD_ENV] === \"1\";\n}\n\nexport function parseParentPermissionMode(value: string | undefined): PermissionMode | undefined {\n\tif (value === \"manual\" || value === \"yolo\" || value === \"plan\" || value === \"auto\") return value;\n\treturn undefined;\n}\n\nexport function parseChildPermission(value: string | undefined): ChildPermission | undefined {\n\tif (value === \"full\" || value === \"read-only\") return value;\n\treturn undefined;\n}\n\n/** Omitted permissions resolve to full. Unknown values are rejected by the schema/executor. */\nexport function resolveRequestedChildPermission(requested?: string): ChildPermission {\n\treturn requested === \"read-only\" ? \"read-only\" : \"full\";\n}\n\nexport function resolveChildRuntimePermissionMode(childPermission: string | undefined): PermissionMode {\n\treturn parseChildPermission(childPermission) === \"read-only\" ? \"plan\" : \"auto\";\n}\n\nexport function snapshotParentPermissionMode(sessionId?: string): PermissionMode {\n\treturn getPermissionMode(sessionId);\n}\n\nexport interface ResolvedChildPermissions {\n\tok: true;\n\trequested: ChildPermission;\n\teffective: ChildPermission;\n}\n\nexport interface RejectedChildPermissions {\n\tok: false;\n\trequested: ChildPermission;\n\terror: string;\n}\n\n/**\n * Resolve the child's permission level before spawn.\n *\n * Parent mode Requested Result\n * Manual/YOLO/Auto omitted Full\n * Manual/YOLO/Auto full Full\n * Manual/YOLO/Auto read-only Read-only\n * Plan read-only Read-only\n * Plan full / omitted Reject (omission resolves to full)\n */\nexport function resolveChildPermissions(\n\tparentMode: string | undefined,\n\trequested?: string,\n): ResolvedChildPermissions | RejectedChildPermissions {\n\tconst requestedPermission = resolveRequestedChildPermission(requested);\n\tif (parseParentPermissionMode(parentMode) === \"plan\" && requestedPermission === \"full\") {\n\t\treturn { ok: false, requested: requestedPermission, error: PLAN_MODE_WRITE_SPAWN_ERROR };\n\t}\n\treturn { ok: true, requested: requestedPermission, effective: requestedPermission };\n}\n\n/**\n * Apply the resolved child permission before any tool call. No-op for non-child\n * processes so `lunr -p` stays fail-closed.\n */\nexport function applyInheritedSubagentPermissions(env: NodeJS.ProcessEnv = process.env): PermissionMode | undefined {\n\tif (!isSubagentChildProcess(env)) return undefined;\n\tconst childMode = resolveChildRuntimePermissionMode(env[SUBAGENT_CHILD_PERMISSION_ENV]);\n\tresetPermissions(childMode);\n\treturn childMode;\n}\n"]}
@@ -1,46 +1,18 @@
1
1
  /**
2
- * lunr: parent-delegated children inherit a snapshot of the parent's permission
3
- * mode. Plan parents may only launch read-only agents. Any other parent mode
4
- * (or a missing/unknown snapshot on a real child) runs the child in auto so
5
- * writes can finish without a TUI approval channel.
2
+ * lunR: parent-delegated children inherit an explicit permission level, not a
3
+ * named agent role. The parent process resolves the requested level against
4
+ * its own mode, then snapshots that resolved child permission into the child
5
+ * environment. Full maps to child runtime Auto; read-only maps to Plan.
6
6
  *
7
7
  * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and
8
8
  * stay fail-closed.
9
9
  */
10
10
  import { getPermissionMode, resetPermissions } from "./permissions.js";
11
11
  export const SUBAGENT_CHILD_ENV = "PI_SUBAGENT_CHILD";
12
+ export const SUBAGENT_CHILD_PERMISSION_ENV = "PI_SUBAGENT_CHILD_PERMISSION";
13
+ /** @deprecated Replaced by SUBAGENT_CHILD_PERMISSION_ENV. Kept so leftover env is ignored. */
12
14
  export const SUBAGENT_PARENT_PERMISSION_MODE_ENV = "PI_SUBAGENT_PARENT_PERMISSION_MODE";
13
- export const PLAN_MODE_WRITE_SPAWN_ERROR = "Cannot launch write-capable subagents in plan mode. Only read-only agents are allowed.";
14
- /** Known writer basenames. Packaged names use `package.local`. */
15
- const WRITE_CAPABLE_AGENT_BASENAMES = new Set(["worker", "delegate", "editor"]);
16
- /**
17
- * Known research/review agents. Their roster may still list `write` for
18
- * scratch files; plan mode keeps those tools blocked instead of failing spawn.
19
- */
20
- const READ_ONLY_AGENT_BASENAMES = new Set([
21
- "scout",
22
- "reviewer",
23
- "researcher",
24
- "research",
25
- "status",
26
- "oracle",
27
- "planner",
28
- "context-builder",
29
- "deep-researcher",
30
- "research-writer",
31
- ]);
32
- /** Tools that make an unknown/custom agent write-capable at spawn time. */
33
- const WRITE_CAPABLE_TOOLS = new Set([
34
- "edit",
35
- "write",
36
- "behavior_add",
37
- "behavior_remove",
38
- "memory_add",
39
- "memory_remove",
40
- "cron",
41
- "code_rewrite",
42
- ]);
43
- const PLAN_STRIP_TOOLS = new Set(WRITE_CAPABLE_TOOLS);
15
+ export const PLAN_MODE_WRITE_SPAWN_ERROR = 'Cannot launch a full-access child in plan mode. Relaunch with permissions: "read-only".';
44
16
  export function isSubagentChildProcess(env = process.env) {
45
17
  return env[SUBAGENT_CHILD_ENV] === "1";
46
18
  }
@@ -49,62 +21,47 @@ export function parseParentPermissionMode(value) {
49
21
  return value;
50
22
  return undefined;
51
23
  }
52
- /** Child mode for a real `PI_SUBAGENT_CHILD=1` process. Missing/unknown → auto. */
53
- export function resolveChildPermissionMode(parentMode) {
54
- return parseParentPermissionMode(parentMode) === "plan" ? "plan" : "auto";
24
+ export function parseChildPermission(value) {
25
+ if (value === "full" || value === "read-only")
26
+ return value;
27
+ return undefined;
28
+ }
29
+ /** Omitted permissions resolve to full. Unknown values are rejected by the schema/executor. */
30
+ export function resolveRequestedChildPermission(requested) {
31
+ return requested === "read-only" ? "read-only" : "full";
32
+ }
33
+ export function resolveChildRuntimePermissionMode(childPermission) {
34
+ return parseChildPermission(childPermission) === "read-only" ? "plan" : "auto";
55
35
  }
56
36
  export function snapshotParentPermissionMode(sessionId) {
57
37
  return getPermissionMode(sessionId);
58
38
  }
59
39
  /**
60
- * Apply the inherited child mode before any tool call. No-op for non-child
40
+ * Resolve the child's permission level before spawn.
41
+ *
42
+ * Parent mode Requested Result
43
+ * Manual/YOLO/Auto omitted Full
44
+ * Manual/YOLO/Auto full Full
45
+ * Manual/YOLO/Auto read-only Read-only
46
+ * Plan read-only Read-only
47
+ * Plan full / omitted Reject (omission resolves to full)
48
+ */
49
+ export function resolveChildPermissions(parentMode, requested) {
50
+ const requestedPermission = resolveRequestedChildPermission(requested);
51
+ if (parseParentPermissionMode(parentMode) === "plan" && requestedPermission === "full") {
52
+ return { ok: false, requested: requestedPermission, error: PLAN_MODE_WRITE_SPAWN_ERROR };
53
+ }
54
+ return { ok: true, requested: requestedPermission, effective: requestedPermission };
55
+ }
56
+ /**
57
+ * Apply the resolved child permission before any tool call. No-op for non-child
61
58
  * processes so `lunr -p` stays fail-closed.
62
59
  */
63
60
  export function applyInheritedSubagentPermissions(env = process.env) {
64
61
  if (!isSubagentChildProcess(env))
65
62
  return undefined;
66
- const childMode = resolveChildPermissionMode(env[SUBAGENT_PARENT_PERMISSION_MODE_ENV]);
63
+ const childMode = resolveChildRuntimePermissionMode(env[SUBAGENT_CHILD_PERMISSION_ENV]);
67
64
  resetPermissions(childMode);
68
65
  return childMode;
69
66
  }
70
- export function agentBasename(name) {
71
- const trimmed = name.trim();
72
- const dot = trimmed.lastIndexOf(".");
73
- return (dot >= 0 ? trimmed.slice(dot + 1) : trimmed).toLowerCase();
74
- }
75
- function isWriteCapableByName(name) {
76
- const base = agentBasename(name);
77
- if (WRITE_CAPABLE_AGENT_BASENAMES.has(base))
78
- return true;
79
- return base.endsWith("-editor") || base.endsWith("_editor");
80
- }
81
- /**
82
- * Writer agents fail spawn in plan mode. Known read-only names are allowed
83
- * even if their roster lists `write`. Unknown agents are writers when the
84
- * resolved tool list is unrestricted or contains a mutating tool. `bash` alone
85
- * does not count (inspection agents keep it).
86
- */
87
- export function isWriteCapableSubagent(agentName, tools) {
88
- if (isWriteCapableByName(agentName))
89
- return true;
90
- if (READ_ONLY_AGENT_BASENAMES.has(agentBasename(agentName)))
91
- return false;
92
- if (!tools || tools.length === 0)
93
- return true;
94
- return tools.some((tool) => WRITE_CAPABLE_TOOLS.has(tool));
95
- }
96
- export function planModeWriteSpawnError(parentMode, agents) {
97
- if (parseParentPermissionMode(parentMode) !== "plan")
98
- return undefined;
99
- if (agents.some((agent) => isWriteCapableSubagent(agent.name, agent.tools))) {
100
- return PLAN_MODE_WRITE_SPAWN_ERROR;
101
- }
102
- return undefined;
103
- }
104
- /** Drop mutating tools from a plan child's `--tools` list. Leave `bash`. */
105
- export function filterToolsForInheritedChild(tools, parentMode) {
106
- if (!tools || parseParentPermissionMode(parentMode) !== "plan")
107
- return tools;
108
- return tools.filter((tool) => !PLAN_STRIP_TOOLS.has(tool));
109
- }
110
67
  //# sourceMappingURL=subagent-permission-inherit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-permission-inherit.js","sourceRoot":"","sources":["../../src/core/subagent-permission-inherit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunr: parent-delegated children inherit a snapshot of the parent's permission\n * mode. Plan parents may only launch read-only agents. Any other parent mode\n * (or a missing/unknown snapshot on a real child) runs the child in auto so\n * writes can finish without a TUI approval channel.\n *\n * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and\n * stay fail-closed.\n */\n\nimport { getPermissionMode, type PermissionMode, resetPermissions } from \"./permissions.ts\";\n\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\n\nexport const PLAN_MODE_WRITE_SPAWN_ERROR =\n\t\"Cannot launch write-capable subagents in plan mode. Only read-only agents are allowed.\";\n\n/** Known writer basenames. Packaged names use `package.local`. */\nconst WRITE_CAPABLE_AGENT_BASENAMES = new Set([\"worker\", \"delegate\", \"editor\"]);\n\n/**\n * Known research/review agents. Their roster may still list `write` for\n * scratch files; plan mode keeps those tools blocked instead of failing spawn.\n */\nconst READ_ONLY_AGENT_BASENAMES = new Set([\n\t\"scout\",\n\t\"reviewer\",\n\t\"researcher\",\n\t\"research\",\n\t\"status\",\n\t\"oracle\",\n\t\"planner\",\n\t\"context-builder\",\n\t\"deep-researcher\",\n\t\"research-writer\",\n]);\n\n/** Tools that make an unknown/custom agent write-capable at spawn time. */\nconst WRITE_CAPABLE_TOOLS = new Set([\n\t\"edit\",\n\t\"write\",\n\t\"behavior_add\",\n\t\"behavior_remove\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"cron\",\n\t\"code_rewrite\",\n]);\n\nconst PLAN_STRIP_TOOLS = new Set(WRITE_CAPABLE_TOOLS);\n\nexport function isSubagentChildProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[SUBAGENT_CHILD_ENV] === \"1\";\n}\n\nexport function parseParentPermissionMode(value: string | undefined): PermissionMode | undefined {\n\tif (value === \"manual\" || value === \"yolo\" || value === \"plan\" || value === \"auto\") return value;\n\treturn undefined;\n}\n\n/** Child mode for a real `PI_SUBAGENT_CHILD=1` process. Missing/unknown → auto. */\nexport function resolveChildPermissionMode(parentMode: string | undefined): PermissionMode {\n\treturn parseParentPermissionMode(parentMode) === \"plan\" ? \"plan\" : \"auto\";\n}\n\nexport function snapshotParentPermissionMode(sessionId?: string): PermissionMode {\n\treturn getPermissionMode(sessionId);\n}\n\n/**\n * Apply the inherited child mode before any tool call. No-op for non-child\n * processes so `lunr -p` stays fail-closed.\n */\nexport function applyInheritedSubagentPermissions(env: NodeJS.ProcessEnv = process.env): PermissionMode | undefined {\n\tif (!isSubagentChildProcess(env)) return undefined;\n\tconst childMode = resolveChildPermissionMode(env[SUBAGENT_PARENT_PERMISSION_MODE_ENV]);\n\tresetPermissions(childMode);\n\treturn childMode;\n}\n\nexport function agentBasename(name: string): string {\n\tconst trimmed = name.trim();\n\tconst dot = trimmed.lastIndexOf(\".\");\n\treturn (dot >= 0 ? trimmed.slice(dot + 1) : trimmed).toLowerCase();\n}\n\nfunction isWriteCapableByName(name: string): boolean {\n\tconst base = agentBasename(name);\n\tif (WRITE_CAPABLE_AGENT_BASENAMES.has(base)) return true;\n\treturn base.endsWith(\"-editor\") || base.endsWith(\"_editor\");\n}\n\n/**\n * Writer agents fail spawn in plan mode. Known read-only names are allowed\n * even if their roster lists `write`. Unknown agents are writers when the\n * resolved tool list is unrestricted or contains a mutating tool. `bash` alone\n * does not count (inspection agents keep it).\n */\nexport function isWriteCapableSubagent(agentName: string, tools?: string[]): boolean {\n\tif (isWriteCapableByName(agentName)) return true;\n\tif (READ_ONLY_AGENT_BASENAMES.has(agentBasename(agentName))) return false;\n\tif (!tools || tools.length === 0) return true;\n\treturn tools.some((tool) => WRITE_CAPABLE_TOOLS.has(tool));\n}\n\nexport function planModeWriteSpawnError(\n\tparentMode: string | undefined,\n\tagents: ReadonlyArray<{ name: string; tools?: string[] }>,\n): string | undefined {\n\tif (parseParentPermissionMode(parentMode) !== \"plan\") return undefined;\n\tif (agents.some((agent) => isWriteCapableSubagent(agent.name, agent.tools))) {\n\t\treturn PLAN_MODE_WRITE_SPAWN_ERROR;\n\t}\n\treturn undefined;\n}\n\n/** Drop mutating tools from a plan child's `--tools` list. Leave `bash`. */\nexport function filterToolsForInheritedChild(\n\ttools: string[] | undefined,\n\tparentMode: string | undefined,\n): string[] | undefined {\n\tif (!tools || parseParentPermissionMode(parentMode) !== \"plan\") return tools;\n\treturn tools.filter((tool) => !PLAN_STRIP_TOOLS.has(tool));\n}\n"]}
1
+ {"version":3,"file":"subagent-permission-inherit.js","sourceRoot":"","sources":["../../src/core/subagent-permission-inherit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAuB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,6BAA6B,GAAG,8BAA8B,CAAC;AAC5E,8FAA8F;AAC9F,MAAM,CAAC,MAAM,mCAAmC,GAAG,oCAAoC,CAAC;AAIxF,MAAM,CAAC,MAAM,2BAA2B,GACvC,yFAAyF,CAAC;AAE3F,MAAM,UAAU,sBAAsB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAW;IACrF,OAAO,GAAG,CAAC,kBAAkB,CAAC,KAAK,GAAG,CAAC;AAAA,CACvC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAyB,EAA8B;IAChG,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACjG,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAyB,EAA+B;IAC5F,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,+FAA+F;AAC/F,MAAM,UAAU,+BAA+B,CAAC,SAAkB,EAAmB;IACpF,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,CACxD;AAED,MAAM,UAAU,iCAAiC,CAAC,eAAmC,EAAkB;IACtG,OAAO,oBAAoB,CAAC,eAAe,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,CAC/E;AAED,MAAM,UAAU,4BAA4B,CAAC,SAAkB,EAAkB;IAChF,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAAA,CACpC;AAcD;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACtC,UAA8B,EAC9B,SAAkB,EACoC;IACtD,MAAM,mBAAmB,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,yBAAyB,CAAC,UAAU,CAAC,KAAK,MAAM,IAAI,mBAAmB,KAAK,MAAM,EAAE,CAAC;QACxF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AAAA,CACpF;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAA8B;IACnH,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,SAAS,GAAG,iCAAiC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACxF,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AAAA,CACjB","sourcesContent":["/**\n * lunR: parent-delegated children inherit an explicit permission level, not a\n * named agent role. The parent process resolves the requested level against\n * its own mode, then snapshots that resolved child permission into the child\n * environment. Full maps to child runtime Auto; read-only maps to Plan.\n *\n * Ordinary `lunr -p`, cron, and gateway headless sessions are not children and\n * stay fail-closed.\n */\n\nimport { getPermissionMode, type PermissionMode, resetPermissions } from \"./permissions.ts\";\n\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\n/** @deprecated Replaced by SUBAGENT_CHILD_PERMISSION_ENV. Kept so leftover env is ignored. */\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\n\nexport type ChildPermission = \"full\" | \"read-only\";\n\nexport const PLAN_MODE_WRITE_SPAWN_ERROR =\n\t'Cannot launch a full-access child in plan mode. Relaunch with permissions: \"read-only\".';\n\nexport function isSubagentChildProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[SUBAGENT_CHILD_ENV] === \"1\";\n}\n\nexport function parseParentPermissionMode(value: string | undefined): PermissionMode | undefined {\n\tif (value === \"manual\" || value === \"yolo\" || value === \"plan\" || value === \"auto\") return value;\n\treturn undefined;\n}\n\nexport function parseChildPermission(value: string | undefined): ChildPermission | undefined {\n\tif (value === \"full\" || value === \"read-only\") return value;\n\treturn undefined;\n}\n\n/** Omitted permissions resolve to full. Unknown values are rejected by the schema/executor. */\nexport function resolveRequestedChildPermission(requested?: string): ChildPermission {\n\treturn requested === \"read-only\" ? \"read-only\" : \"full\";\n}\n\nexport function resolveChildRuntimePermissionMode(childPermission: string | undefined): PermissionMode {\n\treturn parseChildPermission(childPermission) === \"read-only\" ? \"plan\" : \"auto\";\n}\n\nexport function snapshotParentPermissionMode(sessionId?: string): PermissionMode {\n\treturn getPermissionMode(sessionId);\n}\n\nexport interface ResolvedChildPermissions {\n\tok: true;\n\trequested: ChildPermission;\n\teffective: ChildPermission;\n}\n\nexport interface RejectedChildPermissions {\n\tok: false;\n\trequested: ChildPermission;\n\terror: string;\n}\n\n/**\n * Resolve the child's permission level before spawn.\n *\n * Parent mode Requested Result\n * Manual/YOLO/Auto omitted Full\n * Manual/YOLO/Auto full Full\n * Manual/YOLO/Auto read-only Read-only\n * Plan read-only Read-only\n * Plan full / omitted Reject (omission resolves to full)\n */\nexport function resolveChildPermissions(\n\tparentMode: string | undefined,\n\trequested?: string,\n): ResolvedChildPermissions | RejectedChildPermissions {\n\tconst requestedPermission = resolveRequestedChildPermission(requested);\n\tif (parseParentPermissionMode(parentMode) === \"plan\" && requestedPermission === \"full\") {\n\t\treturn { ok: false, requested: requestedPermission, error: PLAN_MODE_WRITE_SPAWN_ERROR };\n\t}\n\treturn { ok: true, requested: requestedPermission, effective: requestedPermission };\n}\n\n/**\n * Apply the resolved child permission before any tool call. No-op for non-child\n * processes so `lunr -p` stays fail-closed.\n */\nexport function applyInheritedSubagentPermissions(env: NodeJS.ProcessEnv = process.env): PermissionMode | undefined {\n\tif (!isSubagentChildProcess(env)) return undefined;\n\tconst childMode = resolveChildRuntimePermissionMode(env[SUBAGENT_CHILD_PERMISSION_ENV]);\n\tresetPermissions(childMode);\n\treturn childMode;\n}\n"]}
@@ -9,10 +9,10 @@ export declare function buildSwarmPrompt(task: string): string;
9
9
  * lunR: agent-swarm auto-activation gate helpers.
10
10
  *
11
11
  * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents
12
- * in a single `subagent` tool call, that counts as an auto-activated agent swarm
13
- * and requires user approval in every permission mode except `auto` (see
14
- * core/permissions.ts). An explicit /swarm turn is pre-approved because the user
15
- * already asked for the swarm.
12
+ * in one `subagent` `tasks`/`chain.parallel` call, or that many same-turn SINGLE
13
+ * `subagent` calls, that counts as an auto-activated agent swarm and requires
14
+ * user approval in every permission mode except `auto` (see core/permissions.ts).
15
+ * An explicit /swarm turn is pre-approved because the user already asked for the swarm.
16
16
  */
17
17
  /** Parallel-subagent count above which the swarm approval gate engages. */
18
18
  export declare const SWARM_APPROVAL_THRESHOLD = 2;
@@ -23,6 +23,19 @@ export declare const SWARM_APPROVAL_THRESHOLD = 2;
23
23
  * Dynamic `expand` fan-out has no static count and is not gated.
24
24
  */
25
25
  export declare function effectiveSwarmCount(args: Record<string, unknown>): number;
26
+ interface AssistantMessageLike {
27
+ content?: ReadonlyArray<{
28
+ type?: string;
29
+ name?: string;
30
+ arguments?: unknown;
31
+ }>;
32
+ }
33
+ /**
34
+ * Parallel subagent count for the swarm gate. Uses this call's `tasks` / chain
35
+ * `parallel` blocks, plus every other same-turn SINGLE `subagent` call so three
36
+ * sibling singles still trip the >2 approval gate.
37
+ */
38
+ export declare function effectiveSwarmCountForTurn(args: Record<string, unknown>, assistantMessage?: AssistantMessageLike): number;
26
39
  interface BranchEntryLike {
27
40
  type: string;
28
41
  message?: {
@@ -1 +1 @@
1
- {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/core/swarm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAED;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAO1C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAED,UAAU,eAAe;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/C;AAaD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAO/E","sourcesContent":["/**\n * lunR: reusable swarm prompt builder.\n *\n * Moved out of interactive-mode so the gateway can decompose tasks across\n * parallel subagents the same way the TUI does.\n */\n\nexport function buildSwarmPrompt(task: string): string {\n\treturn `[SWARM MODE] Task: ${task}\nAct as an orchestrator. 1) Decompose into 3-8 independent subtasks. 2) Launch them\nin ONE parallel subagent call (async:false), picking an agent + model tier per\nsubtask (prefer scout for exploration, worker for implementation, reviewer for\nverification). 3) Synthesize the results and report. Rules: max 8 concurrent\nsubagents; no nested fan-out; if a subtask fails, retry once with the heavy tier\nbefore giving up on it; keep your final report under 100 lines with per-subtask\nstatus.`;\n}\n\n/**\n * lunR: agent-swarm auto-activation gate helpers.\n *\n * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents\n * in a single `subagent` tool call, that counts as an auto-activated agent swarm\n * and requires user approval in every permission mode except `auto` (see\n * core/permissions.ts). An explicit /swarm turn is pre-approved because the user\n * already asked for the swarm.\n */\n\n/** Parallel-subagent count above which the swarm approval gate engages. */\nexport const SWARM_APPROVAL_THRESHOLD = 2;\n\nfunction countEntry(item: unknown): number {\n\tconst count = item && typeof item === \"object\" ? (item as { count?: unknown }).count : undefined;\n\treturn typeof count === \"number\" && Number.isInteger(count) && count >= 1 ? count : 1;\n}\n\n/**\n * Effective number of parallel subagents a `subagent` tool call will launch:\n * the `tasks` array (with `count` multipliers) plus any `chain` step `parallel`\n * fan-out blocks. Sequential chain steps and single-agent calls count as 0.\n * Dynamic `expand` fan-out has no static count and is not gated.\n */\nexport function effectiveSwarmCount(args: Record<string, unknown>): number {\n\tlet total = 0;\n\tif (Array.isArray(args.tasks)) {\n\t\tfor (const task of args.tasks) total += countEntry(task);\n\t}\n\tif (Array.isArray(args.chain)) {\n\t\tfor (const step of args.chain) {\n\t\t\tconst parallel = step && typeof step === \"object\" ? (step as { parallel?: unknown }).parallel : undefined;\n\t\t\tif (Array.isArray(parallel)) {\n\t\t\t\tfor (const child of parallel) total += countEntry(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n\ninterface BranchEntryLike {\n\ttype: string;\n\tmessage?: { role?: string; content?: unknown };\n}\n\nfunction messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c) => c && typeof c === \"object\" && (c as { type?: unknown }).type === \"text\")\n\t\t\t.map((c) => String((c as { text?: unknown }).text ?? \"\"))\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * True when the current turn started from an explicit /swarm prompt (the most\n * recent user message carries the literal `[SWARM MODE]` prefix). Both the TUI\n * and the gateway inject the same buildSwarmPrompt text, so this works on both\n * surfaces without extra state.\n */\nexport function isExplicitSwarmTurn(branch: readonly BranchEntryLike[]): boolean {\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst entry = branch[i];\n\t\tif (entry.type !== \"message\" || entry.message?.role !== \"user\") continue;\n\t\treturn messageText(entry.message.content).startsWith(\"[SWARM MODE]\");\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/core/swarm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAe1C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAaD,UAAU,oBAAoB;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,gBAAgB,CAAC,EAAE,oBAAoB,GACrC,MAAM,CAYR;AAED,UAAU,eAAe;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/C;AAaD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAO/E","sourcesContent":["/**\n * lunR: reusable swarm prompt builder.\n *\n * Moved out of interactive-mode so the gateway can decompose tasks across\n * parallel subagents the same way the TUI does.\n */\n\nexport function buildSwarmPrompt(task: string): string {\n\treturn `[SWARM MODE] Task: ${task}\nAct as an orchestrator. 1) Decompose into 3-8 independent subtasks. 2) Launch them\nin ONE parallel subagent call (async:false) as generic children, each with task,\ndescription, and permissions (\"full\" or \"read-only\"; omit permissions for full).\nUse read-only children for inspection/review and full children only when edits\nare required. Pick a model tier per subtask. 3) Synthesize the results and report.\nRules: max 8 concurrent children; no nested fan-out; if a subtask fails, retry\nonce with the heavy tier before giving up on it; keep your final report under\n100 lines with per-subtask status.`;\n}\n\n/**\n * lunR: agent-swarm auto-activation gate helpers.\n *\n * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents\n * in one `subagent` `tasks`/`chain.parallel` call, or that many same-turn SINGLE\n * `subagent` calls, that counts as an auto-activated agent swarm and requires\n * user approval in every permission mode except `auto` (see core/permissions.ts).\n * An explicit /swarm turn is pre-approved because the user already asked for the swarm.\n */\n\n/** Parallel-subagent count above which the swarm approval gate engages. */\nexport const SWARM_APPROVAL_THRESHOLD = 2;\n\nfunction countEntry(item: unknown): number {\n\tconst count = item && typeof item === \"object\" ? (item as { count?: unknown }).count : undefined;\n\treturn typeof count === \"number\" && Number.isInteger(count) && count >= 1 ? count : 1;\n}\n\nfunction isManagementCall(args: Record<string, unknown>): boolean {\n\treturn typeof args.action === \"string\" && args.action.length > 0;\n}\n\nfunction isAsyncDetached(args: Record<string, unknown>): boolean {\n\treturn args.async === true && args.clarify !== true;\n}\n\n/**\n * Effective number of parallel subagents a `subagent` tool call will launch:\n * the `tasks` array (with `count` multipliers) plus any `chain` step `parallel`\n * fan-out blocks. Sequential chain steps and single-agent calls count as 0.\n * Dynamic `expand` fan-out has no static count and is not gated.\n */\nexport function effectiveSwarmCount(args: Record<string, unknown>): number {\n\tlet total = 0;\n\tif (Array.isArray(args.tasks)) {\n\t\tfor (const task of args.tasks) total += countEntry(task);\n\t}\n\tif (Array.isArray(args.chain)) {\n\t\tfor (const step of args.chain) {\n\t\t\tconst parallel = step && typeof step === \"object\" ? (step as { parallel?: unknown }).parallel : undefined;\n\t\t\tif (Array.isArray(parallel)) {\n\t\t\t\tfor (const child of parallel) total += countEntry(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n\nfunction siblingSingleCount(args: Record<string, unknown>): number {\n\tif (isManagementCall(args) || isAsyncDetached(args)) return 0;\n\tif (Array.isArray(args.tasks) || Array.isArray(args.chain)) return 0;\n\treturn typeof args.task === \"string\" &&\n\t\targs.task.length > 0 &&\n\t\ttypeof args.description === \"string\" &&\n\t\targs.description.length > 0\n\t\t? 1\n\t\t: 0;\n}\n\ninterface AssistantMessageLike {\n\tcontent?: ReadonlyArray<{ type?: string; name?: string; arguments?: unknown }>;\n}\n\n/**\n * Parallel subagent count for the swarm gate. Uses this call's `tasks` / chain\n * `parallel` blocks, plus every other same-turn SINGLE `subagent` call so three\n * sibling singles still trip the >2 approval gate.\n */\nexport function effectiveSwarmCountForTurn(\n\targs: Record<string, unknown>,\n\tassistantMessage?: AssistantMessageLike,\n): number {\n\tconst own = effectiveSwarmCount(args);\n\tconst siblingSingles = (assistantMessage?.content ?? []).reduce((total, block) => {\n\t\tif (block.type !== \"toolCall\" || block.name !== \"subagent\") return total;\n\t\tconst siblingArgs =\n\t\t\tblock.arguments && typeof block.arguments === \"object\" && !Array.isArray(block.arguments)\n\t\t\t\t? (block.arguments as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tif (!siblingArgs) return total;\n\t\treturn total + siblingSingleCount(siblingArgs);\n\t}, 0);\n\treturn Math.max(own, siblingSingles);\n}\n\ninterface BranchEntryLike {\n\ttype: string;\n\tmessage?: { role?: string; content?: unknown };\n}\n\nfunction messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c) => c && typeof c === \"object\" && (c as { type?: unknown }).type === \"text\")\n\t\t\t.map((c) => String((c as { text?: unknown }).text ?? \"\"))\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * True when the current turn started from an explicit /swarm prompt (the most\n * recent user message carries the literal `[SWARM MODE]` prefix). Both the TUI\n * and the gateway inject the same buildSwarmPrompt text, so this works on both\n * surfaces without extra state.\n */\nexport function isExplicitSwarmTurn(branch: readonly BranchEntryLike[]): boolean {\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst entry = branch[i];\n\t\tif (entry.type !== \"message\" || entry.message?.role !== \"user\") continue;\n\t\treturn messageText(entry.message.content).startsWith(\"[SWARM MODE]\");\n\t}\n\treturn false;\n}\n"]}
@@ -7,21 +7,22 @@
7
7
  export function buildSwarmPrompt(task) {
8
8
  return `[SWARM MODE] Task: ${task}
9
9
  Act as an orchestrator. 1) Decompose into 3-8 independent subtasks. 2) Launch them
10
- in ONE parallel subagent call (async:false), picking an agent + model tier per
11
- subtask (prefer scout for exploration, worker for implementation, reviewer for
12
- verification). 3) Synthesize the results and report. Rules: max 8 concurrent
13
- subagents; no nested fan-out; if a subtask fails, retry once with the heavy tier
14
- before giving up on it; keep your final report under 100 lines with per-subtask
15
- status.`;
10
+ in ONE parallel subagent call (async:false) as generic children, each with task,
11
+ description, and permissions ("full" or "read-only"; omit permissions for full).
12
+ Use read-only children for inspection/review and full children only when edits
13
+ are required. Pick a model tier per subtask. 3) Synthesize the results and report.
14
+ Rules: max 8 concurrent children; no nested fan-out; if a subtask fails, retry
15
+ once with the heavy tier before giving up on it; keep your final report under
16
+ 100 lines with per-subtask status.`;
16
17
  }
17
18
  /**
18
19
  * lunR: agent-swarm auto-activation gate helpers.
19
20
  *
20
21
  * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents
21
- * in a single `subagent` tool call, that counts as an auto-activated agent swarm
22
- * and requires user approval in every permission mode except `auto` (see
23
- * core/permissions.ts). An explicit /swarm turn is pre-approved because the user
24
- * already asked for the swarm.
22
+ * in one `subagent` `tasks`/`chain.parallel` call, or that many same-turn SINGLE
23
+ * `subagent` calls, that counts as an auto-activated agent swarm and requires
24
+ * user approval in every permission mode except `auto` (see core/permissions.ts).
25
+ * An explicit /swarm turn is pre-approved because the user already asked for the swarm.
25
26
  */
26
27
  /** Parallel-subagent count above which the swarm approval gate engages. */
27
28
  export const SWARM_APPROVAL_THRESHOLD = 2;
@@ -29,6 +30,12 @@ function countEntry(item) {
29
30
  const count = item && typeof item === "object" ? item.count : undefined;
30
31
  return typeof count === "number" && Number.isInteger(count) && count >= 1 ? count : 1;
31
32
  }
33
+ function isManagementCall(args) {
34
+ return typeof args.action === "string" && args.action.length > 0;
35
+ }
36
+ function isAsyncDetached(args) {
37
+ return args.async === true && args.clarify !== true;
38
+ }
32
39
  /**
33
40
  * Effective number of parallel subagents a `subagent` tool call will launch:
34
41
  * the `tasks` array (with `count` multipliers) plus any `chain` step `parallel`
@@ -52,6 +59,37 @@ export function effectiveSwarmCount(args) {
52
59
  }
53
60
  return total;
54
61
  }
62
+ function siblingSingleCount(args) {
63
+ if (isManagementCall(args) || isAsyncDetached(args))
64
+ return 0;
65
+ if (Array.isArray(args.tasks) || Array.isArray(args.chain))
66
+ return 0;
67
+ return typeof args.task === "string" &&
68
+ args.task.length > 0 &&
69
+ typeof args.description === "string" &&
70
+ args.description.length > 0
71
+ ? 1
72
+ : 0;
73
+ }
74
+ /**
75
+ * Parallel subagent count for the swarm gate. Uses this call's `tasks` / chain
76
+ * `parallel` blocks, plus every other same-turn SINGLE `subagent` call so three
77
+ * sibling singles still trip the >2 approval gate.
78
+ */
79
+ export function effectiveSwarmCountForTurn(args, assistantMessage) {
80
+ const own = effectiveSwarmCount(args);
81
+ const siblingSingles = (assistantMessage?.content ?? []).reduce((total, block) => {
82
+ if (block.type !== "toolCall" || block.name !== "subagent")
83
+ return total;
84
+ const siblingArgs = block.arguments && typeof block.arguments === "object" && !Array.isArray(block.arguments)
85
+ ? block.arguments
86
+ : undefined;
87
+ if (!siblingArgs)
88
+ return total;
89
+ return total + siblingSingleCount(siblingArgs);
90
+ }, 0);
91
+ return Math.max(own, siblingSingles);
92
+ }
55
93
  function messageText(content) {
56
94
  if (typeof content === "string")
57
95
  return content;
@@ -1 +1 @@
1
- {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/core/swarm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAU;IACtD,OAAO,sBAAsB,IAAI;;;;;;;QAO1B,CAAC;AAAA,CACR;AAED;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C,SAAS,UAAU,CAAC,IAAa,EAAU;IAC1C,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CACtF;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA6B,EAAU;IAC1E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1G,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAOD,SAAS,WAAW,CAAC,OAAgB,EAAU;IAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAwB,CAAC,IAAI,KAAK,MAAM,CAAC;aACtF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAwB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;aACxD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC;AAAA,CACV;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC,EAAW;IAChF,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM;YAAE,SAAS;QACzE,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb","sourcesContent":["/**\n * lunR: reusable swarm prompt builder.\n *\n * Moved out of interactive-mode so the gateway can decompose tasks across\n * parallel subagents the same way the TUI does.\n */\n\nexport function buildSwarmPrompt(task: string): string {\n\treturn `[SWARM MODE] Task: ${task}\nAct as an orchestrator. 1) Decompose into 3-8 independent subtasks. 2) Launch them\nin ONE parallel subagent call (async:false), picking an agent + model tier per\nsubtask (prefer scout for exploration, worker for implementation, reviewer for\nverification). 3) Synthesize the results and report. Rules: max 8 concurrent\nsubagents; no nested fan-out; if a subtask fails, retry once with the heavy tier\nbefore giving up on it; keep your final report under 100 lines with per-subtask\nstatus.`;\n}\n\n/**\n * lunR: agent-swarm auto-activation gate helpers.\n *\n * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents\n * in a single `subagent` tool call, that counts as an auto-activated agent swarm\n * and requires user approval in every permission mode except `auto` (see\n * core/permissions.ts). An explicit /swarm turn is pre-approved because the user\n * already asked for the swarm.\n */\n\n/** Parallel-subagent count above which the swarm approval gate engages. */\nexport const SWARM_APPROVAL_THRESHOLD = 2;\n\nfunction countEntry(item: unknown): number {\n\tconst count = item && typeof item === \"object\" ? (item as { count?: unknown }).count : undefined;\n\treturn typeof count === \"number\" && Number.isInteger(count) && count >= 1 ? count : 1;\n}\n\n/**\n * Effective number of parallel subagents a `subagent` tool call will launch:\n * the `tasks` array (with `count` multipliers) plus any `chain` step `parallel`\n * fan-out blocks. Sequential chain steps and single-agent calls count as 0.\n * Dynamic `expand` fan-out has no static count and is not gated.\n */\nexport function effectiveSwarmCount(args: Record<string, unknown>): number {\n\tlet total = 0;\n\tif (Array.isArray(args.tasks)) {\n\t\tfor (const task of args.tasks) total += countEntry(task);\n\t}\n\tif (Array.isArray(args.chain)) {\n\t\tfor (const step of args.chain) {\n\t\t\tconst parallel = step && typeof step === \"object\" ? (step as { parallel?: unknown }).parallel : undefined;\n\t\t\tif (Array.isArray(parallel)) {\n\t\t\t\tfor (const child of parallel) total += countEntry(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n\ninterface BranchEntryLike {\n\ttype: string;\n\tmessage?: { role?: string; content?: unknown };\n}\n\nfunction messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c) => c && typeof c === \"object\" && (c as { type?: unknown }).type === \"text\")\n\t\t\t.map((c) => String((c as { text?: unknown }).text ?? \"\"))\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * True when the current turn started from an explicit /swarm prompt (the most\n * recent user message carries the literal `[SWARM MODE]` prefix). Both the TUI\n * and the gateway inject the same buildSwarmPrompt text, so this works on both\n * surfaces without extra state.\n */\nexport function isExplicitSwarmTurn(branch: readonly BranchEntryLike[]): boolean {\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst entry = branch[i];\n\t\tif (entry.type !== \"message\" || entry.message?.role !== \"user\") continue;\n\t\treturn messageText(entry.message.content).startsWith(\"[SWARM MODE]\");\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/core/swarm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lunR: reusable swarm prompt builder.\n *\n * Moved out of interactive-mode so the gateway can decompose tasks across\n * parallel subagents the same way the TUI does.\n */\n\nexport function buildSwarmPrompt(task: string): string {\n\treturn `[SWARM MODE] Task: ${task}\nAct as an orchestrator. 1) Decompose into 3-8 independent subtasks. 2) Launch them\nin ONE parallel subagent call (async:false) as generic children, each with task,\ndescription, and permissions (\"full\" or \"read-only\"; omit permissions for full).\nUse read-only children for inspection/review and full children only when edits\nare required. Pick a model tier per subtask. 3) Synthesize the results and report.\nRules: max 8 concurrent children; no nested fan-out; if a subtask fails, retry\nonce with the heavy tier before giving up on it; keep your final report under\n100 lines with per-subtask status.`;\n}\n\n/**\n * lunR: agent-swarm auto-activation gate helpers.\n *\n * When the model launches more than SWARM_APPROVAL_THRESHOLD parallel subagents\n * in one `subagent` `tasks`/`chain.parallel` call, or that many same-turn SINGLE\n * `subagent` calls, that counts as an auto-activated agent swarm and requires\n * user approval in every permission mode except `auto` (see core/permissions.ts).\n * An explicit /swarm turn is pre-approved because the user already asked for the swarm.\n */\n\n/** Parallel-subagent count above which the swarm approval gate engages. */\nexport const SWARM_APPROVAL_THRESHOLD = 2;\n\nfunction countEntry(item: unknown): number {\n\tconst count = item && typeof item === \"object\" ? (item as { count?: unknown }).count : undefined;\n\treturn typeof count === \"number\" && Number.isInteger(count) && count >= 1 ? count : 1;\n}\n\nfunction isManagementCall(args: Record<string, unknown>): boolean {\n\treturn typeof args.action === \"string\" && args.action.length > 0;\n}\n\nfunction isAsyncDetached(args: Record<string, unknown>): boolean {\n\treturn args.async === true && args.clarify !== true;\n}\n\n/**\n * Effective number of parallel subagents a `subagent` tool call will launch:\n * the `tasks` array (with `count` multipliers) plus any `chain` step `parallel`\n * fan-out blocks. Sequential chain steps and single-agent calls count as 0.\n * Dynamic `expand` fan-out has no static count and is not gated.\n */\nexport function effectiveSwarmCount(args: Record<string, unknown>): number {\n\tlet total = 0;\n\tif (Array.isArray(args.tasks)) {\n\t\tfor (const task of args.tasks) total += countEntry(task);\n\t}\n\tif (Array.isArray(args.chain)) {\n\t\tfor (const step of args.chain) {\n\t\t\tconst parallel = step && typeof step === \"object\" ? (step as { parallel?: unknown }).parallel : undefined;\n\t\t\tif (Array.isArray(parallel)) {\n\t\t\t\tfor (const child of parallel) total += countEntry(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn total;\n}\n\nfunction siblingSingleCount(args: Record<string, unknown>): number {\n\tif (isManagementCall(args) || isAsyncDetached(args)) return 0;\n\tif (Array.isArray(args.tasks) || Array.isArray(args.chain)) return 0;\n\treturn typeof args.task === \"string\" &&\n\t\targs.task.length > 0 &&\n\t\ttypeof args.description === \"string\" &&\n\t\targs.description.length > 0\n\t\t? 1\n\t\t: 0;\n}\n\ninterface AssistantMessageLike {\n\tcontent?: ReadonlyArray<{ type?: string; name?: string; arguments?: unknown }>;\n}\n\n/**\n * Parallel subagent count for the swarm gate. Uses this call's `tasks` / chain\n * `parallel` blocks, plus every other same-turn SINGLE `subagent` call so three\n * sibling singles still trip the >2 approval gate.\n */\nexport function effectiveSwarmCountForTurn(\n\targs: Record<string, unknown>,\n\tassistantMessage?: AssistantMessageLike,\n): number {\n\tconst own = effectiveSwarmCount(args);\n\tconst siblingSingles = (assistantMessage?.content ?? []).reduce((total, block) => {\n\t\tif (block.type !== \"toolCall\" || block.name !== \"subagent\") return total;\n\t\tconst siblingArgs =\n\t\t\tblock.arguments && typeof block.arguments === \"object\" && !Array.isArray(block.arguments)\n\t\t\t\t? (block.arguments as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tif (!siblingArgs) return total;\n\t\treturn total + siblingSingleCount(siblingArgs);\n\t}, 0);\n\treturn Math.max(own, siblingSingles);\n}\n\ninterface BranchEntryLike {\n\ttype: string;\n\tmessage?: { role?: string; content?: unknown };\n}\n\nfunction messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c) => c && typeof c === \"object\" && (c as { type?: unknown }).type === \"text\")\n\t\t\t.map((c) => String((c as { text?: unknown }).text ?? \"\"))\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * True when the current turn started from an explicit /swarm prompt (the most\n * recent user message carries the literal `[SWARM MODE]` prefix). Both the TUI\n * and the gateway inject the same buildSwarmPrompt text, so this works on both\n * surfaces without extra state.\n */\nexport function isExplicitSwarmTurn(branch: readonly BranchEntryLike[]): boolean {\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst entry = branch[i];\n\t\tif (entry.type !== \"message\" || entry.message?.role !== \"user\") continue;\n\t\treturn messageText(entry.message.content).startsWith(\"[SWARM MODE]\");\n\t}\n\treturn false;\n}\n"]}
@@ -5,11 +5,13 @@ import { type Skill } from "./skills.ts";
5
5
  export interface BuildSystemPromptOptions {
6
6
  /** Custom system prompt (replaces default). */
7
7
  customPrompt?: string;
8
- /** Tools to include in prompt. Default: [read, bash, edit, write] */
8
+ /** Current model in provider/id form. */
9
+ modelSlug?: string;
10
+ /** Active tools; used to decide whether read-dependent skill metadata is visible. */
9
11
  selectedTools?: string[];
10
- /** Optional one-line tool snippets keyed by tool name. */
12
+ /** Legacy extension metadata retained for API compatibility; tool definitions are sent separately. */
11
13
  toolSnippets?: Record<string, string>;
12
- /** Additional guideline bullets appended to the default system prompt guidelines. */
14
+ /** Legacy extension metadata retained for API compatibility; not appended to the default prompt. */
13
15
  promptGuidelines?: string[];
14
16
  /** Text to append to system prompt. */
15
17
  appendSystemPrompt?: string;
@@ -23,6 +25,6 @@ export interface BuildSystemPromptOptions {
23
25
  /** Pre-loaded skills. */
24
26
  skills?: Skill[];
25
27
  }
26
- /** Build the system prompt with tools, guidelines, and context */
28
+ /** Build the base system prompt and append configured context. */
27
29
  export declare function buildSystemPrompt(options: BuildSystemPromptOptions): string;
28
30
  //# sourceMappingURL=system-prompt.d.ts.map