@ashx-j/lunr 0.2.11 → 0.2.13

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 (342) hide show
  1. package/CHANGELOG.md +13 -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 +1 -1
  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 +6 -7
  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 +7 -14
  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 +262 -161
  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 +80 -20
  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/zai-coding-cn.json +1 -1
  152. package/dist/catalog/providers/zai.json +1 -1
  153. package/dist/catalog/publication.json +3 -3
  154. package/dist/core/agent-session.d.ts +7 -1
  155. package/dist/core/agent-session.d.ts.map +1 -1
  156. package/dist/core/agent-session.js +34 -4
  157. package/dist/core/agent-session.js.map +1 -1
  158. package/dist/core/context-breakdown.d.ts +3 -1
  159. package/dist/core/context-breakdown.d.ts.map +1 -1
  160. package/dist/core/context-breakdown.js +5 -2
  161. package/dist/core/context-breakdown.js.map +1 -1
  162. package/dist/core/customize.d.ts +2 -0
  163. package/dist/core/customize.d.ts.map +1 -1
  164. package/dist/core/customize.js +6 -0
  165. package/dist/core/customize.js.map +1 -1
  166. package/dist/core/memory-cap.d.ts +4 -8
  167. package/dist/core/memory-cap.d.ts.map +1 -1
  168. package/dist/core/memory-cap.js +8 -8
  169. package/dist/core/memory-cap.js.map +1 -1
  170. package/dist/core/permissions.d.ts +2 -0
  171. package/dist/core/permissions.d.ts.map +1 -1
  172. package/dist/core/permissions.js +30 -14
  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 +1 -9
  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 +16 -5
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +37 -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.map +1 -1
  192. package/dist/core/swarm.js +13 -7
  193. package/dist/core/swarm.js.map +1 -1
  194. package/dist/core/system-prompt.d.ts +6 -4
  195. package/dist/core/system-prompt.d.ts.map +1 -1
  196. package/dist/core/system-prompt.js +38 -48
  197. package/dist/core/system-prompt.js.map +1 -1
  198. package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
  199. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  200. package/dist/core/usage-adapters/openai-codex.js +22 -17
  201. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  202. package/dist/core/usage-service.d.ts +10 -1
  203. package/dist/core/usage-service.d.ts.map +1 -1
  204. package/dist/core/usage-service.js +17 -6
  205. package/dist/core/usage-service.js.map +1 -1
  206. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  207. package/dist/gateway/agent-bridge.js +1 -4
  208. package/dist/gateway/agent-bridge.js.map +1 -1
  209. package/dist/gateway/cron.d.ts.map +1 -1
  210. package/dist/gateway/cron.js +1 -4
  211. package/dist/gateway/cron.js.map +1 -1
  212. package/dist/index.d.ts +1 -1
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js.map +1 -1
  215. package/dist/main.d.ts.map +1 -1
  216. package/dist/main.js +0 -5
  217. package/dist/main.js.map +1 -1
  218. package/dist/migrations.d.ts +2 -0
  219. package/dist/migrations.d.ts.map +1 -1
  220. package/dist/migrations.js +21 -0
  221. package/dist/migrations.js.map +1 -1
  222. package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
  223. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/settings-selector.js +122 -162
  225. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  226. package/dist/modes/interactive/components/usage-view.d.ts +1 -1
  227. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/usage-view.js +7 -4
  229. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  230. package/dist/modes/interactive/interactive-mode.d.ts +1 -2
  231. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  232. package/dist/modes/interactive/interactive-mode.js +55 -96
  233. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  234. package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
  235. package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
  236. package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
  237. package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
  238. package/docs/compaction.md +23 -23
  239. package/docs/containerization.md +24 -24
  240. package/docs/custom-provider.md +18 -18
  241. package/docs/development.md +16 -15
  242. package/docs/docs.json +6 -2
  243. package/docs/extensions.md +82 -80
  244. package/docs/features.md +102 -0
  245. package/docs/index.md +25 -19
  246. package/docs/json.md +7 -7
  247. package/docs/keybindings.md +4 -4
  248. package/docs/models.md +2 -2
  249. package/docs/packages.md +38 -42
  250. package/docs/prompt-templates.md +4 -4
  251. package/docs/providers.md +22 -10
  252. package/docs/quickstart.md +81 -46
  253. package/docs/rpc.md +7 -13
  254. package/docs/sdk.md +43 -41
  255. package/docs/security.md +18 -18
  256. package/docs/session-format.md +9 -9
  257. package/docs/sessions.md +13 -12
  258. package/docs/settings.md +63 -24
  259. package/docs/shell-aliases.md +2 -2
  260. package/docs/skills.md +21 -11
  261. package/docs/terminal-setup.md +5 -5
  262. package/docs/termux.md +7 -7
  263. package/docs/themes.md +12 -14
  264. package/docs/tmux.md +4 -4
  265. package/docs/tui.md +23 -23
  266. package/docs/usage.md +112 -87
  267. package/docs/windows.md +10 -2
  268. package/examples/README.md +3 -1
  269. package/examples/extensions/README.md +6 -6
  270. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  271. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  272. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  273. package/examples/extensions/doom-overlay/README.md +2 -2
  274. package/examples/extensions/gondolin/package-lock.json +2 -2
  275. package/examples/extensions/gondolin/package.json +1 -1
  276. package/examples/extensions/plan-mode/README.md +3 -1
  277. package/examples/extensions/sandbox/package-lock.json +2 -2
  278. package/examples/extensions/sandbox/package.json +1 -1
  279. package/examples/extensions/subagent/README.md +13 -11
  280. package/examples/extensions/todo.ts +2 -1
  281. package/examples/extensions/with-deps/package-lock.json +2 -2
  282. package/examples/extensions/with-deps/package.json +1 -1
  283. package/examples/sdk/README.md +9 -5
  284. package/package.json +6 -7
  285. package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
  286. package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
  287. package/dist/builtin-extensions/lunr-behavior.js +0 -213
  288. package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
  289. package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
  290. package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
  291. package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
  292. package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
  293. package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
  294. package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
  295. package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
  296. package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
  297. package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
  298. package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
  299. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
  300. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
  301. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
  302. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
  303. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
  304. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
  305. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
  306. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
  307. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
  308. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
  309. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
  310. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
  311. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
  312. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
  313. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
  314. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
  315. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
  316. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
  317. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
  318. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
  319. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
  320. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
  321. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
  322. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
  323. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
  324. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
  325. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
  326. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
  327. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
  328. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
  329. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
  330. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
  331. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
  332. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
  333. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
  334. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
  335. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
  336. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
  337. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
  338. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
  339. package/dist/core/behavior-preset.d.ts +0 -60
  340. package/dist/core/behavior-preset.d.ts.map +0 -1
  341. package/dist/core/behavior-preset.js +0 -257
  342. package/dist/core/behavior-preset.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.2.11",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.2.11",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.2.11",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,11 +1,11 @@
1
1
  # DOOM Overlay Demo
2
2
 
3
- Play DOOM as an overlay in pi. Demonstrates that the overlay system can handle real-time game rendering at 35 FPS.
3
+ Play DOOM as an overlay in lunR. Demonstrates that the overlay system can handle real-time game rendering at 35 FPS.
4
4
 
5
5
  ## Usage
6
6
 
7
7
  ```bash
8
- pi --extension ./examples/extensions/doom-overlay
8
+ lunr --extension ./examples/extensions/doom-overlay
9
9
  ```
10
10
 
11
11
  Then run:
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.2.11",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.2.11",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,4 +1,6 @@
1
- # Plan Mode Extension
1
+ # Plan Mode Extension (sample)
2
+
3
+ This is an **Extension API sample**, not lunR's product plan mode. lunR ships plan permission mode plus `present_plan`; see [docs/features.md](../../../docs/features.md).
2
4
 
3
5
  Read-only exploration mode for safe code analysis.
4
6
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "0.2.11",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.2.11",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,10 +1,12 @@
1
- # Subagent Example
1
+ # Subagent Example (sample)
2
+
3
+ This is an **Extension API sample**, not lunR's product subagent implementation. lunR ships baked-in subagents (always fresh; swarm gate for 3+ parallel). See [docs/features.md](../../../docs/features.md).
2
4
 
3
5
  Delegate tasks to specialized subagents with isolated context windows.
4
6
 
5
7
  ## Features
6
8
 
7
- - **Isolated context**: Each subagent runs in a separate `pi` process
9
+ - **Isolated context**: Each subagent runs in a separate `lunr` process
8
10
  - **Streaming output**: See tool calls and progress as they happen
9
11
  - **Parallel streaming**: All parallel tasks stream updates simultaneously
10
12
  - **Markdown rendering**: Final output rendered with proper formatting (expanded view)
@@ -35,20 +37,20 @@ From the repository root, symlink the files:
35
37
 
36
38
  ```bash
37
39
  # Symlink the extension (must be in a subdirectory with index.ts)
38
- mkdir -p ~/.pi/agent/extensions/subagent
39
- ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/index.ts" ~/.pi/agent/extensions/subagent/index.ts
40
- ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/agents.ts" ~/.pi/agent/extensions/subagent/agents.ts
40
+ mkdir -p ~/.lunr/agent/extensions/subagent
41
+ ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/index.ts" ~/.lunr/agent/extensions/subagent/index.ts
42
+ ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/agents.ts" ~/.lunr/agent/extensions/subagent/agents.ts
41
43
 
42
44
  # Symlink agents
43
- mkdir -p ~/.pi/agent/agents
45
+ mkdir -p ~/.lunr/agent/agents
44
46
  for f in packages/coding-agent/examples/extensions/subagent/agents/*.md; do
45
- ln -sf "$(pwd)/$f" ~/.pi/agent/agents/$(basename "$f")
47
+ ln -sf "$(pwd)/$f" ~/.lunr/agent/agents/$(basename "$f")
46
48
  done
47
49
 
48
50
  # Symlink workflow prompts
49
- mkdir -p ~/.pi/agent/prompts
51
+ mkdir -p ~/.lunr/agent/prompts
50
52
  for f in packages/coding-agent/examples/extensions/subagent/prompts/*.md; do
51
- ln -sf "$(pwd)/$f" ~/.pi/agent/prompts/$(basename "$f")
53
+ ln -sf "$(pwd)/$f" ~/.lunr/agent/prompts/$(basename "$f")
52
54
  done
53
55
  ```
54
56
 
@@ -58,7 +60,7 @@ This tool executes a separate `pi` subprocess with a delegated system prompt and
58
60
 
59
61
  **Project-local agents** (`.pi/agents/*.md`) are repo-controlled prompts that can instruct the model to read files, run bash commands, etc.
60
62
 
61
- **Default behavior:** Only loads **user-level agents** from `~/.pi/agent/agents`.
63
+ **Default behavior:** Only loads **user-level agents** from `~/.lunr/agent/agents`.
62
64
 
63
65
  To enable project-local agents, pass `agentScope: "both"` (or `"project"`). Only do this for repositories you trust.
64
66
 
@@ -138,7 +140,7 @@ System prompt for the agent goes here.
138
140
  ```
139
141
 
140
142
  **Locations:**
141
- - `~/.pi/agent/agents/*.md` - User-level (always loaded)
143
+ - `~/.lunr/agent/agents/*.md` - User-level (always loaded)
142
144
  - `.pi/agents/*.md` - Project-level (only with `agentScope: "project"` or `"both"`)
143
145
 
144
146
  Project agents override user agents with the same name when `agentScope: "both"`.
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Todo Extension - Demonstrates state management via session entries
2
+ * Todo Extension (sample) - Demonstrates state management via session entries.
3
+ * Not lunR's product todos (lunr-todos). See docs/features.md.
3
4
  *
4
5
  * This extension:
5
6
  * - Registers a `todo` tool for the LLM to manage todos
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.2.11",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.2.11",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,6 +1,6 @@
1
1
  # SDK Examples
2
2
 
3
- Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
3
+ Programmatic usage of `@ashx-j/lunr` via `createAgentSession()` and `createAgentSessionRuntime()`.
4
4
 
5
5
  The runtime example shows how to build a recreate function that closes over process-global fixed inputs and recreates cwd-bound services and sessions as the active session cwd changes.
6
6
 
@@ -15,7 +15,7 @@ The runtime example shows how to build a recreate function that closes over proc
15
15
  | `05-tools.ts` | Built-in tool allowlists |
16
16
  | `06-extensions.ts` | Logging, blocking, result modification |
17
17
  | `07-context-files.ts` | AGENTS.md context files |
18
- | `08-slash-commands.ts` | File-based slash commands |
18
+ | `08-prompt-templates.ts` | File-based prompt templates |
19
19
  | `09-api-keys-and-oauth.ts` | API key resolution, OAuth config |
20
20
  | `10-settings.ts` | Override compaction, retry, terminal settings |
21
21
  | `11-sessions.ts` | In-memory, persistent, continue, list sessions |
@@ -24,22 +24,26 @@ The runtime example shows how to build a recreate function that closes over proc
24
24
 
25
25
  ## Running
26
26
 
27
+ From this repo:
28
+
27
29
  ```bash
28
30
  cd packages/coding-agent
29
31
  npx tsx examples/sdk/01-minimal.ts
30
32
  ```
31
33
 
34
+ After a global install, examples live under `node_modules/@ashx-j/lunr/examples` (or `npm root -g` then `@ashx-j/lunr/examples`). Workspace TypeScript in this repo still imports `@earendil-works/pi-*`; published standalone consumers should import `@ashx-j/lunr`.
35
+
32
36
  ## Quick Reference
33
37
 
34
38
  ```typescript
35
- import { getModel } from "@earendil-works/pi-ai";
39
+ import { getModel } from "@ashx-j/lunr-ai";
36
40
  import {
37
41
  createAgentSession,
38
42
  DefaultResourceLoader,
39
43
  ModelRuntime,
40
44
  SessionManager,
41
45
  SettingsManager,
42
- } from "@earendil-works/pi-coding-agent";
46
+ } from "@ashx-j/lunr";
43
47
 
44
48
  const modelRuntime = await ModelRuntime.create();
45
49
 
@@ -107,7 +111,7 @@ await session.prompt("Hello");
107
111
  |--------|---------|-------------|
108
112
  | `modelRuntime` | Runtime using `agentDir/auth.json` and `models.json` | Canonical model and authentication runtime |
109
113
  | `cwd` | `process.cwd()` | Working directory |
110
- | `agentDir` | `~/.pi/agent` | Config directory |
114
+ | `agentDir` | `~/.lunr/agent` | Config directory |
111
115
  | `model` | From settings/first available | Model to use |
112
116
  | `thinkingLevel` | From settings/"off" | off, low, medium, high |
113
117
  | `tools` | `["read", "bash", "edit", "write"]` built-ins | Allowlist tool names across built-in, extension, and custom tools |
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ashx-j/lunr",
3
- "version": "0.2.11",
4
- "description": "Coding agent CLI with read, bash, edit, write tools and session management",
3
+ "version": "0.2.13",
4
+ "description": "lunR — terminal coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
7
7
  "name": "lunr",
@@ -25,22 +25,21 @@
25
25
  "dist",
26
26
  "docs",
27
27
  "examples",
28
- "containerization.md",
29
28
  "CHANGELOG.md"
30
29
  ],
31
30
  "scripts": {
32
31
  "clean": "shx rm -rf dist",
33
32
  "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js dist/rpc-entry.js && npm run copy-assets",
34
33
  "build:binary": "npm --prefix ../tui run build && npm --prefix ../ai run build && npm --prefix ../agent run build && npm run build && bun build --compile ./dist/bun/cli.js ./src/utils/image-resize-worker.ts --outfile dist/lunr && npm run copy-binary-assets",
35
- "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/ && shx mkdir -p dist/builtin-extensions/pi-subagents/agents && shx cp src/builtin-extensions/pi-subagents/agents/*.md dist/builtin-extensions/pi-subagents/agents/ && shx mkdir -p dist/builtin-extensions/lunr-skill-creator/skills/skill-creator && shx cp src/builtin-extensions/lunr-skill-creator/skills/skill-creator/SKILL.md dist/builtin-extensions/lunr-skill-creator/skills/skill-creator/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/",
34
+ "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/ && shx mkdir -p dist/builtin-extensions/lunr-skill-creator/skills/skill-creator && shx cp src/builtin-extensions/lunr-skill-creator/skills/skill-creator/SKILL.md dist/builtin-extensions/lunr-skill-creator/skills/skill-creator/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/",
36
35
  "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
37
36
  "test": "vitest --run",
38
37
  "shrinkwrap": "node ../../scripts/generate-coding-agent-shrinkwrap.mjs"
39
38
  },
40
39
  "dependencies": {
41
- "@ashx-j/lunr-agent": "^0.2.11",
42
- "@ashx-j/lunr-ai": "^0.2.11",
43
- "@ashx-j/lunr-tui": "^0.2.11",
40
+ "@ashx-j/lunr-agent": "^0.2.13",
41
+ "@ashx-j/lunr-ai": "^0.2.13",
42
+ "@ashx-j/lunr-tui": "^0.2.13",
44
43
  "@modelcontextprotocol/ext-apps": "^1.7.4",
45
44
  "@modelcontextprotocol/sdk": "1.30.0",
46
45
  "@mozilla/readability": "^0.6.0",
@@ -1,44 +0,0 @@
1
- /**
2
- * lunr-behavior — user-defined behavior rules file (~/.lunr/agent/behavior.md).
3
- *
4
- * Mirrors simple-pi-memory: one file, injected into the system prompt every
5
- * turn (before_agent_start), shares the existing `memoryCharCap` setting via
6
- * the `@lunr/memory-cap` bridge. Built-in presets (default/humanizer/concise)
7
- * skip the character cap; custom is capped. Tools: behavior_add, behavior_remove,
8
- * behavior_load.
9
- *
10
- * Unlike memory, behavior lines do NOT get a date prefix (plain append, dedup
11
- * on exact line). The file lives at ~/.lunr/agent/behavior.md (honors
12
- * PI_CODING_AGENT_DIR like ashxj-thinking does — NOT ~/.pi).
13
- *
14
- * Loaded by lunR via jiti — no build step, plain TypeScript. `// @ts-nocheck`
15
- * because the extension API types are declared inline (see simple-pi-memory).
16
- */
17
- interface ToolResult {
18
- content: {
19
- type: "text";
20
- text: string;
21
- }[];
22
- }
23
- interface ExtensionAPI {
24
- registerTool(tool: {
25
- name: string;
26
- label?: string;
27
- description: string;
28
- parameters: unknown;
29
- execute(toolCallId: string, params: Record<string, unknown>, signal: AbortSignal, onUpdate: unknown, ctx: unknown): Promise<ToolResult> | ToolResult;
30
- }): void;
31
- on(event: "before_agent_start", handler: (event: BeforeAgentStartEvent, ctx: unknown) => Promise<{
32
- systemPrompt?: string;
33
- } | void> | {
34
- systemPrompt?: string;
35
- } | void): void;
36
- }
37
- interface BeforeAgentStartEvent {
38
- type: "before_agent_start";
39
- prompt?: string;
40
- systemPrompt: string;
41
- }
42
- export default function (pi: ExtensionAPI): void;
43
- export {};
44
- //# sourceMappingURL=lunr-behavior.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lunr-behavior.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/lunr-behavior.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AAwEH,UAAU,UAAU;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C;AAED,UAAU,YAAY;IACrB,YAAY,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,OAAO,GACV,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,EAAE,CACD,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,CACR,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,OAAO,KACR,OAAO,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAC/E,IAAI,CAAC;CACR;AAED,UAAU,qBAAqB;IAC9B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACrB;AAiCD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CA8H/C","sourcesContent":["// @ts-nocheck\n/**\n * lunr-behavior — user-defined behavior rules file (~/.lunr/agent/behavior.md).\n *\n * Mirrors simple-pi-memory: one file, injected into the system prompt every\n * turn (before_agent_start), shares the existing `memoryCharCap` setting via\n * the `@lunr/memory-cap` bridge. Built-in presets (default/humanizer/concise)\n * skip the character cap; custom is capped. Tools: behavior_add, behavior_remove,\n * behavior_load.\n *\n * Unlike memory, behavior lines do NOT get a date prefix (plain append, dedup\n * on exact line). The file lives at ~/.lunr/agent/behavior.md (honors\n * PI_CODING_AGENT_DIR like ashxj-thinking does — NOT ~/.pi).\n *\n * Loaded by lunR via jiti — no build step, plain TypeScript. `// @ts-nocheck`\n * because the extension API types are declared inline (see simple-pi-memory).\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { Type } from \"@sinclair/typebox\";\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\nfunction behaviorDir(): string {\n\tconst envDir = process.env.PI_CODING_AGENT_DIR;\n\tif (envDir) {\n\t\tconst home = homedir();\n\t\tconst expanded =\n\t\t\tenvDir === \"~\"\n\t\t\t\t? home\n\t\t\t\t: envDir.startsWith(\"~/\") || (process.platform === \"win32\" && envDir.startsWith(\"~\\\\\"))\n\t\t\t\t\t? join(home, envDir.slice(2))\n\t\t\t\t\t: envDir;\n\t\treturn expanded;\n\t}\n\treturn join(homedir(), \".lunr\", \"agent\");\n}\n\nfunction behaviorFile(): string {\n\treturn join(behaviorDir(), \"behavior.md\");\n}\n\n// ---------------------------------------------------------------------------\n// memory-cap bridge (shared with simple-pi-memory)\n// ---------------------------------------------------------------------------\ninterface MemoryCapBridge {\n\tgetCharCap(): number;\n\tsetCharCap(cap: number): void;\n}\n\nfunction getCapBridge(): MemoryCapBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/memory-cap\")] as MemoryCapBridge | undefined;\n}\n\nconst DEFAULT_CHAR_CAP = 5000;\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return bridge.getCharCap();\n\treturn DEFAULT_CHAR_CAP;\n}\n\ninterface BehaviorPresetBridge {\n\tgetPreset(): string;\n\tisCapExempt(): boolean;\n\tsyncFromFile(fileText: string): string;\n}\n\nfunction getPresetBridge(): BehaviorPresetBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/behavior-preset\")] as\n\t\t| BehaviorPresetBridge\n\t\t| undefined;\n}\n\nfunction isCapExempt(): boolean {\n\treturn getPresetBridge()?.isCapExempt() ?? false;\n}\n\nfunction syncPresetFromFile(text: string): void {\n\tgetPresetBridge()?.syncFromFile(text);\n}\n\n// ---------------------------------------------------------------------------\n// Inline structural types\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n}\n\ninterface ExtensionAPI {\n\tregisterTool(tool: {\n\t\tname: string;\n\t\tlabel?: string;\n\t\tdescription: string;\n\t\tparameters: unknown;\n\t\texecute(\n\t\t\ttoolCallId: string,\n\t\t\tparams: Record<string, unknown>,\n\t\t\tsignal: AbortSignal,\n\t\t\tonUpdate: unknown,\n\t\t\tctx: unknown,\n\t\t): Promise<ToolResult> | ToolResult;\n\t}): void;\n\ton(\n\t\tevent: \"before_agent_start\",\n\t\thandler: (\n\t\t\tevent: BeforeAgentStartEvent,\n\t\t\tctx: unknown,\n\t\t) => Promise<{ systemPrompt?: string } | void> | { systemPrompt?: string } | void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tconst dir = behaviorDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction readBehavior(): string {\n\tconst file = behaviorFile();\n\tif (!existsSync(file)) return \"\";\n\treturn readFileSync(file, \"utf-8\");\n}\n\nfunction writeBehaviorRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(behaviorFile(), text, \"utf-8\");\n}\n\nfunction behaviorLines(): string[] {\n\tconst text = readBehavior();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nconst HEADER_COMMENT =\n\t\"<!-- lunR behavior rules — one rule per line. Edit freely or use the behavior tools. -->\\n\";\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject behavior rules into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tconst content = readBehavior();\n\t\tsyncPresetFromFile(content);\n\t\tif (!content.trim()) return; // inject nothing when empty\n\t\t// Strip the header comment from the injected text\n\t\tconst body = content\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((l) => !l.startsWith(\"<!--\"))\n\t\t\t.join(\"\\n\")\n\t\t\t.trimEnd();\n\t\tif (!body) return;\n\t\tconst block =\n\t\t\t\"\\n\\n## Behavior rules (user-defined; follow these; change them with the behavior tools)\\n\" + body;\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- behavior_add ---\n\tpi.registerTool({\n\t\tname: \"behavior_add\",\n\t\tlabel: \"Behavior Add\",\n\t\tdescription: [\n\t\t\t\"Add one behavior rule line to the behavior file (~/.lunr/agent/behavior.md).\",\n\t\t\t\"Each rule is a single line; no date prefix is added.\",\n\t\t\t\"Refuses if the line already exists (exact match) or if a custom behavior file is at the character cap. Built-in presets skip the cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The behavior rule text (one line).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst line = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!line) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"behavior_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = behaviorLines();\n\t\t\tif (lines.some((l) => l === line)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in behavior file (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst existing = readBehavior();\n\t\t\tconst baseText = existing.startsWith(HEADER_COMMENT)\n\t\t\t\t? existing.slice(HEADER_COMMENT.length)\n\t\t\t\t: existing;\n\t\t\tconst sep = baseText.trim().length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = HEADER_COMMENT + baseText.trimEnd() + sep + line + \"\\n\";\n\t\t\tif (!isCapExempt() && prospective.length > cap) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Behavior file full: ${existing.length}/${cap} chars. Remove a rule first (behavior_remove).`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\twriteBehaviorRaw(prospective);\n\t\t\tsyncPresetFromFile(prospective);\n\t\t\tconst capNote = isCapExempt() ? \"cap skipped (built-in preset)\" : `${prospective.length}/${cap} chars`;\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Added behavior rule (${capNote}): ${line}` }],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- behavior_remove ---\n\tpi.registerTool({\n\t\tname: \"behavior_remove\",\n\t\tlabel: \"Behavior Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one behavior rule by its exact line text, as shown by behavior_load.\",\n\t\t\t\"Deletes only an exact, full-line match.\",\n\t\t\t\"Returns 'not found' if no line matches exactly.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tline: Type.String({\n\t\t\t\tdescription: \"The exact behavior rule line to remove (verbatim).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst target = String(params.line ?? \"\").trim();\n\t\t\tif (!target) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"behavior_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = behaviorLines();\n\t\t\tconst remaining = lines.filter((l) => l !== target);\n\t\t\tif (remaining.length === lines.length) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Not found (no exact match): ${target}` }] };\n\t\t\t}\n\t\t\tconst next = HEADER_COMMENT + (remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\twriteBehaviorRaw(next);\n\t\t\tsyncPresetFromFile(next);\n\t\t\treturn { content: [{ type: \"text\", text: `Removed behavior rule: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- behavior_load ---\n\tpi.registerTool({\n\t\tname: \"behavior_load\",\n\t\tlabel: \"Behavior Load\",\n\t\tdescription: [\n\t\t\t\"Read the current behavior file and show all rules with the size/cap.\",\n\t\t\t\"Use this to re-read after editing the file by hand, or to inspect it.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({}),\n\t\tasync execute() {\n\t\t\tconst raw = readBehavior();\n\t\t\tsyncPresetFromFile(raw);\n\t\t\tconst cap = readCap();\n\t\t\tconst capNote = isCapExempt() ? `${raw.length} chars, cap skipped (built-in preset)` : `${raw.length}/${cap} chars`;\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Behavior file is empty (${capNote}).` }] };\n\t\t\t}\n\t\t\t// Strip header comment for display\n\t\t\tconst display = raw\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter((l) => !l.startsWith(\"<!--\"))\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trimEnd();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Behavior (${capNote}):\\n${display}` }],\n\t\t\t};\n\t\t},\n\t});\n}"]}
@@ -1,213 +0,0 @@
1
- // @ts-nocheck
2
- /**
3
- * lunr-behavior — user-defined behavior rules file (~/.lunr/agent/behavior.md).
4
- *
5
- * Mirrors simple-pi-memory: one file, injected into the system prompt every
6
- * turn (before_agent_start), shares the existing `memoryCharCap` setting via
7
- * the `@lunr/memory-cap` bridge. Built-in presets (default/humanizer/concise)
8
- * skip the character cap; custom is capped. Tools: behavior_add, behavior_remove,
9
- * behavior_load.
10
- *
11
- * Unlike memory, behavior lines do NOT get a date prefix (plain append, dedup
12
- * on exact line). The file lives at ~/.lunr/agent/behavior.md (honors
13
- * PI_CODING_AGENT_DIR like ashxj-thinking does — NOT ~/.pi).
14
- *
15
- * Loaded by lunR via jiti — no build step, plain TypeScript. `// @ts-nocheck`
16
- * because the extension API types are declared inline (see simple-pi-memory).
17
- */
18
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
19
- import { join } from "node:path";
20
- import { homedir } from "node:os";
21
- import { Type } from "@sinclair/typebox";
22
- // ---------------------------------------------------------------------------
23
- // Paths
24
- // ---------------------------------------------------------------------------
25
- function behaviorDir() {
26
- const envDir = process.env.PI_CODING_AGENT_DIR;
27
- if (envDir) {
28
- const home = homedir();
29
- const expanded = envDir === "~"
30
- ? home
31
- : envDir.startsWith("~/") || (process.platform === "win32" && envDir.startsWith("~\\"))
32
- ? join(home, envDir.slice(2))
33
- : envDir;
34
- return expanded;
35
- }
36
- return join(homedir(), ".lunr", "agent");
37
- }
38
- function behaviorFile() {
39
- return join(behaviorDir(), "behavior.md");
40
- }
41
- function getCapBridge() {
42
- return globalThis[Symbol.for("@lunr/memory-cap")];
43
- }
44
- const DEFAULT_CHAR_CAP = 5000;
45
- function readCap() {
46
- const bridge = getCapBridge();
47
- if (bridge)
48
- return bridge.getCharCap();
49
- return DEFAULT_CHAR_CAP;
50
- }
51
- function getPresetBridge() {
52
- return globalThis[Symbol.for("@lunr/behavior-preset")];
53
- }
54
- function isCapExempt() {
55
- return getPresetBridge()?.isCapExempt() ?? false;
56
- }
57
- function syncPresetFromFile(text) {
58
- getPresetBridge()?.syncFromFile(text);
59
- }
60
- // ---------------------------------------------------------------------------
61
- // Helpers
62
- // ---------------------------------------------------------------------------
63
- function ensureDir() {
64
- const dir = behaviorDir();
65
- if (!existsSync(dir))
66
- mkdirSync(dir, { recursive: true });
67
- }
68
- function readBehavior() {
69
- const file = behaviorFile();
70
- if (!existsSync(file))
71
- return "";
72
- return readFileSync(file, "utf-8");
73
- }
74
- function writeBehaviorRaw(text) {
75
- ensureDir();
76
- writeFileSync(behaviorFile(), text, "utf-8");
77
- }
78
- function behaviorLines() {
79
- const text = readBehavior();
80
- if (!text.trim())
81
- return [];
82
- return text.split("\n").filter((l) => l.trim().length > 0);
83
- }
84
- const HEADER_COMMENT = "<!-- lunR behavior rules — one rule per line. Edit freely or use the behavior tools. -->\n";
85
- // ---------------------------------------------------------------------------
86
- // Extension
87
- // ---------------------------------------------------------------------------
88
- export default function (pi) {
89
- // --- Inject behavior rules into the system prompt every turn ---
90
- pi.on("before_agent_start", async (event) => {
91
- const content = readBehavior();
92
- syncPresetFromFile(content);
93
- if (!content.trim())
94
- return; // inject nothing when empty
95
- // Strip the header comment from the injected text
96
- const body = content
97
- .split("\n")
98
- .filter((l) => !l.startsWith("<!--"))
99
- .join("\n")
100
- .trimEnd();
101
- if (!body)
102
- return;
103
- const block = "\n\n## Behavior rules (user-defined; follow these; change them with the behavior tools)\n" + body;
104
- return { systemPrompt: event.systemPrompt + block };
105
- });
106
- // --- behavior_add ---
107
- pi.registerTool({
108
- name: "behavior_add",
109
- label: "Behavior Add",
110
- description: [
111
- "Add one behavior rule line to the behavior file (~/.lunr/agent/behavior.md).",
112
- "Each rule is a single line; no date prefix is added.",
113
- "Refuses if the line already exists (exact match) or if a custom behavior file is at the character cap. Built-in presets skip the cap.",
114
- ].join("\n"),
115
- parameters: Type.Object({
116
- content: Type.String({
117
- description: "The behavior rule text (one line).",
118
- }),
119
- }),
120
- async execute(_id, params) {
121
- const line = String(params.content ?? "").replace(/[\r\n]+/g, " ").trim();
122
- if (!line) {
123
- return { content: [{ type: "text", text: "behavior_add: content is empty." }] };
124
- }
125
- const lines = behaviorLines();
126
- if (lines.some((l) => l === line)) {
127
- return { content: [{ type: "text", text: "Already in behavior file (not added)." }] };
128
- }
129
- const cap = readCap();
130
- const existing = readBehavior();
131
- const baseText = existing.startsWith(HEADER_COMMENT)
132
- ? existing.slice(HEADER_COMMENT.length)
133
- : existing;
134
- const sep = baseText.trim().length > 0 ? "\n" : "";
135
- const prospective = HEADER_COMMENT + baseText.trimEnd() + sep + line + "\n";
136
- if (!isCapExempt() && prospective.length > cap) {
137
- return {
138
- content: [
139
- {
140
- type: "text",
141
- text: `Behavior file full: ${existing.length}/${cap} chars. Remove a rule first (behavior_remove).`,
142
- },
143
- ],
144
- };
145
- }
146
- writeBehaviorRaw(prospective);
147
- syncPresetFromFile(prospective);
148
- const capNote = isCapExempt() ? "cap skipped (built-in preset)" : `${prospective.length}/${cap} chars`;
149
- return {
150
- content: [{ type: "text", text: `Added behavior rule (${capNote}): ${line}` }],
151
- };
152
- },
153
- });
154
- // --- behavior_remove ---
155
- pi.registerTool({
156
- name: "behavior_remove",
157
- label: "Behavior Remove",
158
- description: [
159
- "Remove one behavior rule by its exact line text, as shown by behavior_load.",
160
- "Deletes only an exact, full-line match.",
161
- "Returns 'not found' if no line matches exactly.",
162
- ].join("\n"),
163
- parameters: Type.Object({
164
- line: Type.String({
165
- description: "The exact behavior rule line to remove (verbatim).",
166
- }),
167
- }),
168
- async execute(_id, params) {
169
- const target = String(params.line ?? "").trim();
170
- if (!target) {
171
- return { content: [{ type: "text", text: "behavior_remove: line is empty." }] };
172
- }
173
- const lines = behaviorLines();
174
- const remaining = lines.filter((l) => l !== target);
175
- if (remaining.length === lines.length) {
176
- return { content: [{ type: "text", text: `Not found (no exact match): ${target}` }] };
177
- }
178
- const next = HEADER_COMMENT + (remaining.length > 0 ? remaining.join("\n") + "\n" : "");
179
- writeBehaviorRaw(next);
180
- syncPresetFromFile(next);
181
- return { content: [{ type: "text", text: `Removed behavior rule: ${target}` }] };
182
- },
183
- });
184
- // --- behavior_load ---
185
- pi.registerTool({
186
- name: "behavior_load",
187
- label: "Behavior Load",
188
- description: [
189
- "Read the current behavior file and show all rules with the size/cap.",
190
- "Use this to re-read after editing the file by hand, or to inspect it.",
191
- ].join("\n"),
192
- parameters: Type.Object({}),
193
- async execute() {
194
- const raw = readBehavior();
195
- syncPresetFromFile(raw);
196
- const cap = readCap();
197
- const capNote = isCapExempt() ? `${raw.length} chars, cap skipped (built-in preset)` : `${raw.length}/${cap} chars`;
198
- if (!raw.trim()) {
199
- return { content: [{ type: "text", text: `Behavior file is empty (${capNote}).` }] };
200
- }
201
- // Strip header comment for display
202
- const display = raw
203
- .split("\n")
204
- .filter((l) => !l.startsWith("<!--"))
205
- .join("\n")
206
- .trimEnd();
207
- return {
208
- content: [{ type: "text", text: `Behavior (${capNote}):\n${display}` }],
209
- };
210
- },
211
- });
212
- }
213
- //# sourceMappingURL=lunr-behavior.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lunr-behavior.js","sourceRoot":"","sources":["../../src/builtin-extensions/lunr-behavior.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lunr-behavior — user-defined behavior rules file (~/.lunr/agent/behavior.md).\n *\n * Mirrors simple-pi-memory: one file, injected into the system prompt every\n * turn (before_agent_start), shares the existing `memoryCharCap` setting via\n * the `@lunr/memory-cap` bridge. Built-in presets (default/humanizer/concise)\n * skip the character cap; custom is capped. Tools: behavior_add, behavior_remove,\n * behavior_load.\n *\n * Unlike memory, behavior lines do NOT get a date prefix (plain append, dedup\n * on exact line). The file lives at ~/.lunr/agent/behavior.md (honors\n * PI_CODING_AGENT_DIR like ashxj-thinking does — NOT ~/.pi).\n *\n * Loaded by lunR via jiti — no build step, plain TypeScript. `// @ts-nocheck`\n * because the extension API types are declared inline (see simple-pi-memory).\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { Type } from \"@sinclair/typebox\";\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\nfunction behaviorDir(): string {\n\tconst envDir = process.env.PI_CODING_AGENT_DIR;\n\tif (envDir) {\n\t\tconst home = homedir();\n\t\tconst expanded =\n\t\t\tenvDir === \"~\"\n\t\t\t\t? home\n\t\t\t\t: envDir.startsWith(\"~/\") || (process.platform === \"win32\" && envDir.startsWith(\"~\\\\\"))\n\t\t\t\t\t? join(home, envDir.slice(2))\n\t\t\t\t\t: envDir;\n\t\treturn expanded;\n\t}\n\treturn join(homedir(), \".lunr\", \"agent\");\n}\n\nfunction behaviorFile(): string {\n\treturn join(behaviorDir(), \"behavior.md\");\n}\n\n// ---------------------------------------------------------------------------\n// memory-cap bridge (shared with simple-pi-memory)\n// ---------------------------------------------------------------------------\ninterface MemoryCapBridge {\n\tgetCharCap(): number;\n\tsetCharCap(cap: number): void;\n}\n\nfunction getCapBridge(): MemoryCapBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/memory-cap\")] as MemoryCapBridge | undefined;\n}\n\nconst DEFAULT_CHAR_CAP = 5000;\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return bridge.getCharCap();\n\treturn DEFAULT_CHAR_CAP;\n}\n\ninterface BehaviorPresetBridge {\n\tgetPreset(): string;\n\tisCapExempt(): boolean;\n\tsyncFromFile(fileText: string): string;\n}\n\nfunction getPresetBridge(): BehaviorPresetBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/behavior-preset\")] as\n\t\t| BehaviorPresetBridge\n\t\t| undefined;\n}\n\nfunction isCapExempt(): boolean {\n\treturn getPresetBridge()?.isCapExempt() ?? false;\n}\n\nfunction syncPresetFromFile(text: string): void {\n\tgetPresetBridge()?.syncFromFile(text);\n}\n\n// ---------------------------------------------------------------------------\n// Inline structural types\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n}\n\ninterface ExtensionAPI {\n\tregisterTool(tool: {\n\t\tname: string;\n\t\tlabel?: string;\n\t\tdescription: string;\n\t\tparameters: unknown;\n\t\texecute(\n\t\t\ttoolCallId: string,\n\t\t\tparams: Record<string, unknown>,\n\t\t\tsignal: AbortSignal,\n\t\t\tonUpdate: unknown,\n\t\t\tctx: unknown,\n\t\t): Promise<ToolResult> | ToolResult;\n\t}): void;\n\ton(\n\t\tevent: \"before_agent_start\",\n\t\thandler: (\n\t\t\tevent: BeforeAgentStartEvent,\n\t\t\tctx: unknown,\n\t\t) => Promise<{ systemPrompt?: string } | void> | { systemPrompt?: string } | void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tconst dir = behaviorDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction readBehavior(): string {\n\tconst file = behaviorFile();\n\tif (!existsSync(file)) return \"\";\n\treturn readFileSync(file, \"utf-8\");\n}\n\nfunction writeBehaviorRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(behaviorFile(), text, \"utf-8\");\n}\n\nfunction behaviorLines(): string[] {\n\tconst text = readBehavior();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nconst HEADER_COMMENT =\n\t\"<!-- lunR behavior rules — one rule per line. Edit freely or use the behavior tools. -->\\n\";\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject behavior rules into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tconst content = readBehavior();\n\t\tsyncPresetFromFile(content);\n\t\tif (!content.trim()) return; // inject nothing when empty\n\t\t// Strip the header comment from the injected text\n\t\tconst body = content\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((l) => !l.startsWith(\"<!--\"))\n\t\t\t.join(\"\\n\")\n\t\t\t.trimEnd();\n\t\tif (!body) return;\n\t\tconst block =\n\t\t\t\"\\n\\n## Behavior rules (user-defined; follow these; change them with the behavior tools)\\n\" + body;\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- behavior_add ---\n\tpi.registerTool({\n\t\tname: \"behavior_add\",\n\t\tlabel: \"Behavior Add\",\n\t\tdescription: [\n\t\t\t\"Add one behavior rule line to the behavior file (~/.lunr/agent/behavior.md).\",\n\t\t\t\"Each rule is a single line; no date prefix is added.\",\n\t\t\t\"Refuses if the line already exists (exact match) or if a custom behavior file is at the character cap. Built-in presets skip the cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The behavior rule text (one line).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst line = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!line) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"behavior_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = behaviorLines();\n\t\t\tif (lines.some((l) => l === line)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in behavior file (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst existing = readBehavior();\n\t\t\tconst baseText = existing.startsWith(HEADER_COMMENT)\n\t\t\t\t? existing.slice(HEADER_COMMENT.length)\n\t\t\t\t: existing;\n\t\t\tconst sep = baseText.trim().length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = HEADER_COMMENT + baseText.trimEnd() + sep + line + \"\\n\";\n\t\t\tif (!isCapExempt() && prospective.length > cap) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Behavior file full: ${existing.length}/${cap} chars. Remove a rule first (behavior_remove).`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\twriteBehaviorRaw(prospective);\n\t\t\tsyncPresetFromFile(prospective);\n\t\t\tconst capNote = isCapExempt() ? \"cap skipped (built-in preset)\" : `${prospective.length}/${cap} chars`;\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Added behavior rule (${capNote}): ${line}` }],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- behavior_remove ---\n\tpi.registerTool({\n\t\tname: \"behavior_remove\",\n\t\tlabel: \"Behavior Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one behavior rule by its exact line text, as shown by behavior_load.\",\n\t\t\t\"Deletes only an exact, full-line match.\",\n\t\t\t\"Returns 'not found' if no line matches exactly.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tline: Type.String({\n\t\t\t\tdescription: \"The exact behavior rule line to remove (verbatim).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst target = String(params.line ?? \"\").trim();\n\t\t\tif (!target) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"behavior_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = behaviorLines();\n\t\t\tconst remaining = lines.filter((l) => l !== target);\n\t\t\tif (remaining.length === lines.length) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Not found (no exact match): ${target}` }] };\n\t\t\t}\n\t\t\tconst next = HEADER_COMMENT + (remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\twriteBehaviorRaw(next);\n\t\t\tsyncPresetFromFile(next);\n\t\t\treturn { content: [{ type: \"text\", text: `Removed behavior rule: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- behavior_load ---\n\tpi.registerTool({\n\t\tname: \"behavior_load\",\n\t\tlabel: \"Behavior Load\",\n\t\tdescription: [\n\t\t\t\"Read the current behavior file and show all rules with the size/cap.\",\n\t\t\t\"Use this to re-read after editing the file by hand, or to inspect it.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({}),\n\t\tasync execute() {\n\t\t\tconst raw = readBehavior();\n\t\t\tsyncPresetFromFile(raw);\n\t\t\tconst cap = readCap();\n\t\t\tconst capNote = isCapExempt() ? `${raw.length} chars, cap skipped (built-in preset)` : `${raw.length}/${cap} chars`;\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Behavior file is empty (${capNote}).` }] };\n\t\t\t}\n\t\t\t// Strip header comment for display\n\t\t\tconst display = raw\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter((l) => !l.startsWith(\"<!--\"))\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trimEnd();\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Behavior (${capNote}):\\n${display}` }],\n\t\t\t};\n\t\t},\n\t});\n}"]}