@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,8 +1,8 @@
1
1
  /**
2
2
  * simple-memory — a minimal one-file memory extension for pi.
3
3
  *
4
- * One memory file (~/.lunr/simple-memory/memory.md), one memory per line.
5
- * Loaded into the system prompt every turn (before_agent_start); never truncated.
4
+ * One memory file (~/.lunr/simple-memory/memory.md), one durable fact per line.
5
+ * Loaded into the system prompt every turn while agent memory is enabled.
6
6
  * Tools: memory_add, memory_remove, memory_load.
7
7
  * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).
8
8
  *
@@ -26,30 +26,44 @@ import { getAgentDir } from "../config.js";
26
26
  // lunr: was join(homedir(), ".pi", "simple-memory") — leaked lunr memory into a
27
27
  // real pi install's ~/.pi. Now a sibling of the lunr agent dir (~/.lunr/simple-memory).
28
28
  // Old files are copied over by the core startup migration (migrations.ts).
29
- const BASE_DIR = join(dirname(getAgentDir()), "simple-memory");
30
- const MEMORY_FILE = join(BASE_DIR, "memory.md");
31
- const CONFIG_FILE = join(BASE_DIR, "config.json");
29
+ function baseDir() {
30
+ return join(dirname(getAgentDir()), "simple-memory");
31
+ }
32
+ function memoryFile() {
33
+ return join(baseDir(), "memory.md");
34
+ }
35
+ function configFile() {
36
+ return join(baseDir(), "config.json");
37
+ }
32
38
  const DEFAULT_CHAR_CAP = 5000;
33
39
  const MIN_CHAR_CAP = 1;
34
40
  const MAX_CHAR_CAP = 30000;
35
41
  function getCapBridge() {
36
42
  return globalThis[Symbol.for("@lunr/memory-cap")];
37
43
  }
44
+ function isMemoryEnabled() {
45
+ return getCapBridge()?.isEnabled() ?? true;
46
+ }
47
+ function disabledResult() {
48
+ return { content: [{ type: "text", text: "Agent memory is disabled in /settings." }] };
49
+ }
38
50
  // ---------------------------------------------------------------------------
39
51
  // Helpers
40
52
  // ---------------------------------------------------------------------------
41
53
  function ensureDir() {
42
- if (!existsSync(BASE_DIR))
43
- mkdirSync(BASE_DIR, { recursive: true });
54
+ const dir = baseDir();
55
+ if (!existsSync(dir))
56
+ mkdirSync(dir, { recursive: true });
44
57
  }
45
58
  function readMemory() {
46
- if (!existsSync(MEMORY_FILE))
59
+ const file = memoryFile();
60
+ if (!existsSync(file))
47
61
  return "";
48
- return readFileSync(MEMORY_FILE, "utf-8");
62
+ return readFileSync(file, "utf-8");
49
63
  }
50
64
  function writeMemoryRaw(text) {
51
65
  ensureDir();
52
- writeFileSync(MEMORY_FILE, text, "utf-8");
66
+ writeFileSync(memoryFile(), text, "utf-8");
53
67
  }
54
68
  // Non-empty lines, in order. Normalizes the file (drops blank lines).
55
69
  function memoryLines() {
@@ -72,10 +86,11 @@ function readCap() {
72
86
  const bridge = getCapBridge();
73
87
  if (bridge)
74
88
  return clampCap(bridge.getCharCap());
75
- if (!existsSync(CONFIG_FILE))
89
+ const file = configFile();
90
+ if (!existsSync(file))
76
91
  return DEFAULT_CHAR_CAP;
77
92
  try {
78
- const cfg = JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
93
+ const cfg = JSON.parse(readFileSync(file, "utf-8"));
79
94
  if (typeof cfg.charCap === "number" && Number.isFinite(cfg.charCap)) {
80
95
  return clampCap(cfg.charCap);
81
96
  }
@@ -92,7 +107,7 @@ function writeCap(cap) {
92
107
  return;
93
108
  }
94
109
  ensureDir();
95
- writeFileSync(CONFIG_FILE, JSON.stringify({ charCap: cap }, null, 2), "utf-8");
110
+ writeFileSync(configFile(), JSON.stringify({ charCap: cap }, null, 2), "utf-8");
96
111
  }
97
112
  function todayStamp() {
98
113
  const d = new Date();
@@ -109,10 +124,12 @@ function stripDate(line) {
109
124
  export default function (pi) {
110
125
  // --- Inject memory into the system prompt every turn ---
111
126
  pi.on("before_agent_start", async (event) => {
127
+ if (!isMemoryEnabled())
128
+ return;
112
129
  const mem = readMemory();
113
130
  if (!mem.trim())
114
131
  return; // inject nothing when empty
115
- const block = "\n\n## Memory (durable facts about the user; apply these; change them with the memory tools)\n" +
132
+ const block = "\n\n## Memory (durable facts; apply these; change them only with the memory tools)\n" +
116
133
  mem.trimEnd();
117
134
  return { systemPrompt: event.systemPrompt + block };
118
135
  });
@@ -121,7 +138,8 @@ export default function (pi) {
121
138
  name: "memory_add",
122
139
  label: "Memory Add",
123
140
  description: [
124
- "Add one durable memory about the user (a fact, preference, or decision).",
141
+ "Add one durable fact about the user or their environment.",
142
+ "Store only established facts and stable preferences, never behavior instructions, task state, transcripts, guesses, or secrets.",
125
143
  "Each memory is a single line; a [YYYY-MM-DD] date prefix is added automatically.",
126
144
  "An optional #tag improves readability (e.g. #preference).",
127
145
  "Refuses if the content already exists (exact match) or if the file is at the character cap.",
@@ -132,6 +150,8 @@ export default function (pi) {
132
150
  }),
133
151
  }),
134
152
  async execute(_id, params) {
153
+ if (!isMemoryEnabled())
154
+ return disabledResult();
135
155
  const content = String(params.content ?? "").replace(/[\r\n]+/g, " ").trim();
136
156
  if (!content) {
137
157
  return { content: [{ type: "text", text: "memory_add: content is empty." }] };
@@ -178,6 +198,8 @@ export default function (pi) {
178
198
  }),
179
199
  }),
180
200
  async execute(_id, params) {
201
+ if (!isMemoryEnabled())
202
+ return disabledResult();
181
203
  const target = String(params.line ?? "").trim();
182
204
  if (!target) {
183
205
  return { content: [{ type: "text", text: "memory_remove: line is empty." }] };
@@ -197,10 +219,12 @@ export default function (pi) {
197
219
  label: "Memory Load",
198
220
  description: [
199
221
  "Read the current memory file and show all memories with the size/cap.",
200
- "Use this to re-read memory after editing the file by hand, or to inspect it.",
222
+ "Use this to inspect durable facts before adding, correcting, or removing one.",
201
223
  ].join("\n"),
202
224
  parameters: Type.Object({}),
203
225
  async execute() {
226
+ if (!isMemoryEnabled())
227
+ return disabledResult();
204
228
  const raw = readMemory();
205
229
  const cap = readCap();
206
230
  if (!raw.trim()) {
@@ -228,7 +252,7 @@ export default function (pi) {
228
252
  return;
229
253
  }
230
254
  if (n < readMemory().length) {
231
- ctx.ui.notify(`Your memory file already exceeds this character cap. Edit memory file at ${MEMORY_FILE}`, "warning");
255
+ ctx.ui.notify(`Your memory file already exceeds this character cap: ${memoryFile()}`, "warning");
232
256
  return;
233
257
  }
234
258
  writeCap(n);
@@ -1 +1 @@
1
- {"version":3,"file":"simple-pi-memory.js","sourceRoot":"","sources":["../../src/builtin-extensions/simple-pi-memory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * simple-memory — a minimal one-file memory extension for pi.\n *\n * One memory file (~/.lunr/simple-memory/memory.md), one memory per line.\n * Loaded into the system prompt every turn (before_agent_start); never truncated.\n * Tools: memory_add, memory_remove, memory_load.\n * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).\n *\n * Loaded by pi via jiti — no build step, plain TypeScript.\n *\n * Types are declared inline (see the batxj-thinking extension for why:\n * pi-coding-agent's index.d.ts re-exports from internal .d.ts files with\n * subpath imports that fail under `tsc --noEmit index.ts`). `Type` is a\n * runtime value imported from @sinclair/typebox (a peer dependency) for tool\n * parameter schemas.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\n// lunr: concrete core-module import (never the package barrel) — resolves the\n// memory dir next to the lunr agent dir instead of the hardcoded ~/.pi below.\nimport { getAgentDir } from \"../config.js\";\n\n// ---------------------------------------------------------------------------\n// Paths and config\n// ---------------------------------------------------------------------------\n// lunr: was join(homedir(), \".pi\", \"simple-memory\") — leaked lunr memory into a\n// real pi install's ~/.pi. Now a sibling of the lunr agent dir (~/.lunr/simple-memory).\n// Old files are copied over by the core startup migration (migrations.ts).\nconst BASE_DIR = join(dirname(getAgentDir()), \"simple-memory\");\nconst MEMORY_FILE = join(BASE_DIR, \"memory.md\");\nconst CONFIG_FILE = join(BASE_DIR, \"config.json\");\n\nconst DEFAULT_CHAR_CAP = 5000;\nconst MIN_CHAR_CAP = 1;\nconst MAX_CHAR_CAP = 30000;\n\n// lunr: inside lunR the cap lives in lunR settings, exposed by core on\n// globalThis under Symbol.for(\"@lunr/memory-cap\") (registered from main.ts).\n// The config.json fallback below only matters when no bridge exists.\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\n// ---------------------------------------------------------------------------\n// Inline structural types (self-contained for `tsc --noEmit index.ts`)\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n\tdetails?: Record<string, unknown>;\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\tregisterCommand(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler(args: string, ctx: CommandContext): Promise<void> | void;\n\t\t},\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) =>\n\t\t\t| Promise<{ systemPrompt?: string } | void>\n\t\t\t| { systemPrompt?: string }\n\t\t\t| void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\ninterface CommandContext {\n\tmode: string;\n\tui: {\n\t\tnotify(message: string, level?: \"info\" | \"warning\" | \"error\"): void;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tif (!existsSync(BASE_DIR)) mkdirSync(BASE_DIR, { recursive: true });\n}\n\nfunction readMemory(): string {\n\tif (!existsSync(MEMORY_FILE)) return \"\";\n\treturn readFileSync(MEMORY_FILE, \"utf-8\");\n}\n\nfunction writeMemoryRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(MEMORY_FILE, text, \"utf-8\");\n}\n\n// Non-empty lines, in order. Normalizes the file (drops blank lines).\nfunction memoryLines(): string[] {\n\tconst text = readMemory();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nfunction clampCap(n: number): number {\n\tif (!Number.isFinite(n)) return DEFAULT_CHAR_CAP;\n\tn = Math.trunc(n);\n\tif (n < MIN_CHAR_CAP) return MIN_CHAR_CAP;\n\tif (n > MAX_CHAR_CAP) return MAX_CHAR_CAP;\n\treturn n;\n}\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return clampCap(bridge.getCharCap());\n\tif (!existsSync(CONFIG_FILE)) return DEFAULT_CHAR_CAP;\n\ttry {\n\t\tconst cfg = JSON.parse(readFileSync(CONFIG_FILE, \"utf-8\"));\n\t\tif (typeof cfg.charCap === \"number\" && Number.isFinite(cfg.charCap)) {\n\t\t\treturn clampCap(cfg.charCap);\n\t\t}\n\t} catch {\n\t\t// corrupt config — fall back to default\n\t}\n\treturn DEFAULT_CHAR_CAP;\n}\n\nfunction writeCap(cap: number): void {\n\tconst bridge = getCapBridge();\n\tif (bridge) {\n\t\tbridge.setCharCap(clampCap(cap));\n\t\treturn;\n\t}\n\tensureDir();\n\twriteFileSync(CONFIG_FILE, JSON.stringify({ charCap: cap }, null, 2), \"utf-8\");\n}\n\nfunction todayStamp(): string {\n\tconst d = new Date();\n\tconst p = (x: number) => String(x).padStart(2, \"0\");\n\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n// Strip a leading \"[YYYY-MM-DD] \" date prefix so dedup compares bare content.\nfunction stripDate(line: string): string {\n\treturn line.replace(/^\\[\\d{4}-\\d{2}-\\d{2}\\]\\s*/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject memory into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tconst mem = readMemory();\n\t\tif (!mem.trim()) return; // inject nothing when empty\n\t\tconst block =\n\t\t\t\"\\n\\n## Memory (durable facts about the user; apply these; change them with the memory tools)\\n\" +\n\t\t\tmem.trimEnd();\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- memory_add ---\n\tpi.registerTool({\n\t\tname: \"memory_add\",\n\t\tlabel: \"Memory Add\",\n\t\tdescription: [\n\t\t\t\"Add one durable memory about the user (a fact, preference, or decision).\",\n\t\t\t\"Each memory is a single line; a [YYYY-MM-DD] date prefix is added automatically.\",\n\t\t\t\"An optional #tag improves readability (e.g. #preference).\",\n\t\t\t\"Refuses if the content already exists (exact match) or if the file is at the character cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The memory text (one line). You may include a #tag.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst content = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!content) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\t// exact-content dedup (compare bare content, ignoring the date prefix)\n\t\t\tif (lines.some((l) => stripDate(l) === content)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in memory (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst newLine = `[${todayStamp()}] ${content}`;\n\t\t\tconst sep = lines.length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = lines.join(\"\\n\") + sep + newLine + \"\\n\";\n\t\t\tif (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: `Memory full: ${readMemory().length}/${cap} chars. Remove a memory first (memory_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\twriteMemoryRaw(prospective);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Added memory (${prospective.length}/${cap} chars): ${newLine}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- memory_remove ---\n\tpi.registerTool({\n\t\tname: \"memory_remove\",\n\t\tlabel: \"Memory Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one memory by its exact line text, as shown by memory_load.\",\n\t\t\t\"Deletes only an exact, full-line match (including the date prefix).\",\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 memory line to remove (verbatim, including the date prefix).\",\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: \"memory_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\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\twriteMemoryRaw(remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\treturn { content: [{ type: \"text\", text: `Removed memory: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- memory_load ---\n\tpi.registerTool({\n\t\tname: \"memory_load\",\n\t\tlabel: \"Memory Load\",\n\t\tdescription: [\n\t\t\t\"Read the current memory file and show all memories with the size/cap.\",\n\t\t\t\"Use this to re-read memory 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 = readMemory();\n\t\t\tconst cap = readCap();\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Memory is empty (0/${cap} chars).` }] };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Memory (${raw.length}/${cap} chars):\\n${raw.trimEnd()}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- /memory-char-cap command ---\n\tpi.registerCommand(\"memory-char-cap\", {\n\t\tdescription: \"View or set the memory character cap (1..30000). Default 5000.\",\n\t\thandler(args, ctx) {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tctx.ui.notify(`Memory character cap: ${readCap()}`, \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst n = Number(trimmed);\n\t\t\tif (!Number.isFinite(n) || !Number.isInteger(n) || n < MIN_CHAR_CAP || n > MAX_CHAR_CAP) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid cap. Must be an integer between ${MIN_CHAR_CAP} and ${MAX_CHAR_CAP}.`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (n < readMemory().length) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Your memory file already exceeds this character cap. Edit memory file at ${MEMORY_FILE}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twriteCap(n);\n\t\t\tctx.ui.notify(`Memory character cap set to ${n}.`, \"info\");\n\t\t},\n\t});\n}"]}
1
+ {"version":3,"file":"simple-pi-memory.js","sourceRoot":"","sources":["../../src/builtin-extensions/simple-pi-memory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * simple-memory — a minimal one-file memory extension for pi.\n *\n * One memory file (~/.lunr/simple-memory/memory.md), one durable fact per line.\n * Loaded into the system prompt every turn while agent memory is enabled.\n * Tools: memory_add, memory_remove, memory_load.\n * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).\n *\n * Loaded by pi via jiti — no build step, plain TypeScript.\n *\n * Types are declared inline (see the batxj-thinking extension for why:\n * pi-coding-agent's index.d.ts re-exports from internal .d.ts files with\n * subpath imports that fail under `tsc --noEmit index.ts`). `Type` is a\n * runtime value imported from @sinclair/typebox (a peer dependency) for tool\n * parameter schemas.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\n// lunr: concrete core-module import (never the package barrel) — resolves the\n// memory dir next to the lunr agent dir instead of the hardcoded ~/.pi below.\nimport { getAgentDir } from \"../config.js\";\n\n// ---------------------------------------------------------------------------\n// Paths and config\n// ---------------------------------------------------------------------------\n// lunr: was join(homedir(), \".pi\", \"simple-memory\") — leaked lunr memory into a\n// real pi install's ~/.pi. Now a sibling of the lunr agent dir (~/.lunr/simple-memory).\n// Old files are copied over by the core startup migration (migrations.ts).\nfunction baseDir(): string {\n\treturn join(dirname(getAgentDir()), \"simple-memory\");\n}\n\nfunction memoryFile(): string {\n\treturn join(baseDir(), \"memory.md\");\n}\n\nfunction configFile(): string {\n\treturn join(baseDir(), \"config.json\");\n}\n\nconst DEFAULT_CHAR_CAP = 5000;\nconst MIN_CHAR_CAP = 1;\nconst MAX_CHAR_CAP = 30000;\n\n// lunr: inside lunR the cap lives in lunR settings, exposed by core on\n// globalThis under Symbol.for(\"@lunr/memory-cap\") (registered from main.ts).\n// The config.json fallback below only matters when no bridge exists.\ninterface MemoryCapBridge {\n\tisEnabled(): boolean;\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\nfunction isMemoryEnabled(): boolean {\n\treturn getCapBridge()?.isEnabled() ?? true;\n}\n\nfunction disabledResult(): ToolResult {\n\treturn { content: [{ type: \"text\", text: \"Agent memory is disabled in /settings.\" }] };\n}\n\n// ---------------------------------------------------------------------------\n// Inline structural types (self-contained for `tsc --noEmit index.ts`)\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n\tdetails?: Record<string, unknown>;\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\tregisterCommand(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler(args: string, ctx: CommandContext): Promise<void> | void;\n\t\t},\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) =>\n\t\t\t| Promise<{ systemPrompt?: string } | void>\n\t\t\t| { systemPrompt?: string }\n\t\t\t| void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\ninterface CommandContext {\n\tmode: string;\n\tui: {\n\t\tnotify(message: string, level?: \"info\" | \"warning\" | \"error\"): void;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tconst dir = baseDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction readMemory(): string {\n\tconst file = memoryFile();\n\tif (!existsSync(file)) return \"\";\n\treturn readFileSync(file, \"utf-8\");\n}\n\nfunction writeMemoryRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(memoryFile(), text, \"utf-8\");\n}\n\n// Non-empty lines, in order. Normalizes the file (drops blank lines).\nfunction memoryLines(): string[] {\n\tconst text = readMemory();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nfunction clampCap(n: number): number {\n\tif (!Number.isFinite(n)) return DEFAULT_CHAR_CAP;\n\tn = Math.trunc(n);\n\tif (n < MIN_CHAR_CAP) return MIN_CHAR_CAP;\n\tif (n > MAX_CHAR_CAP) return MAX_CHAR_CAP;\n\treturn n;\n}\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return clampCap(bridge.getCharCap());\n\tconst file = configFile();\n\tif (!existsSync(file)) return DEFAULT_CHAR_CAP;\n\ttry {\n\t\tconst cfg = JSON.parse(readFileSync(file, \"utf-8\"));\n\t\tif (typeof cfg.charCap === \"number\" && Number.isFinite(cfg.charCap)) {\n\t\t\treturn clampCap(cfg.charCap);\n\t\t}\n\t} catch {\n\t\t// corrupt config — fall back to default\n\t}\n\treturn DEFAULT_CHAR_CAP;\n}\n\nfunction writeCap(cap: number): void {\n\tconst bridge = getCapBridge();\n\tif (bridge) {\n\t\tbridge.setCharCap(clampCap(cap));\n\t\treturn;\n\t}\n\tensureDir();\n\twriteFileSync(configFile(), JSON.stringify({ charCap: cap }, null, 2), \"utf-8\");\n}\n\nfunction todayStamp(): string {\n\tconst d = new Date();\n\tconst p = (x: number) => String(x).padStart(2, \"0\");\n\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n// Strip a leading \"[YYYY-MM-DD] \" date prefix so dedup compares bare content.\nfunction stripDate(line: string): string {\n\treturn line.replace(/^\\[\\d{4}-\\d{2}-\\d{2}\\]\\s*/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject memory into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tif (!isMemoryEnabled()) return;\n\t\tconst mem = readMemory();\n\t\tif (!mem.trim()) return; // inject nothing when empty\n\t\tconst block =\n\t\t\t\"\\n\\n## Memory (durable facts; apply these; change them only with the memory tools)\\n\" +\n\t\t\tmem.trimEnd();\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- memory_add ---\n\tpi.registerTool({\n\t\tname: \"memory_add\",\n\t\tlabel: \"Memory Add\",\n\t\tdescription: [\n\t\t\t\"Add one durable fact about the user or their environment.\",\n\t\t\t\"Store only established facts and stable preferences, never behavior instructions, task state, transcripts, guesses, or secrets.\",\n\t\t\t\"Each memory is a single line; a [YYYY-MM-DD] date prefix is added automatically.\",\n\t\t\t\"An optional #tag improves readability (e.g. #preference).\",\n\t\t\t\"Refuses if the content already exists (exact match) or if the file is at the character cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The memory text (one line). You may include a #tag.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst content = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!content) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\t// exact-content dedup (compare bare content, ignoring the date prefix)\n\t\t\tif (lines.some((l) => stripDate(l) === content)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in memory (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst newLine = `[${todayStamp()}] ${content}`;\n\t\t\tconst sep = lines.length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = lines.join(\"\\n\") + sep + newLine + \"\\n\";\n\t\t\tif (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: `Memory full: ${readMemory().length}/${cap} chars. Remove a memory first (memory_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\twriteMemoryRaw(prospective);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Added memory (${prospective.length}/${cap} chars): ${newLine}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- memory_remove ---\n\tpi.registerTool({\n\t\tname: \"memory_remove\",\n\t\tlabel: \"Memory Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one memory by its exact line text, as shown by memory_load.\",\n\t\t\t\"Deletes only an exact, full-line match (including the date prefix).\",\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 memory line to remove (verbatim, including the date prefix).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst target = String(params.line ?? \"\").trim();\n\t\t\tif (!target) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\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\twriteMemoryRaw(remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\treturn { content: [{ type: \"text\", text: `Removed memory: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- memory_load ---\n\tpi.registerTool({\n\t\tname: \"memory_load\",\n\t\tlabel: \"Memory Load\",\n\t\tdescription: [\n\t\t\t\"Read the current memory file and show all memories with the size/cap.\",\n\t\t\t\"Use this to inspect durable facts before adding, correcting, or removing one.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({}),\n\t\tasync execute() {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst raw = readMemory();\n\t\t\tconst cap = readCap();\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Memory is empty (0/${cap} chars).` }] };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Memory (${raw.length}/${cap} chars):\\n${raw.trimEnd()}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- /memory-char-cap command ---\n\tpi.registerCommand(\"memory-char-cap\", {\n\t\tdescription: \"View or set the memory character cap (1..30000). Default 5000.\",\n\t\thandler(args, ctx) {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tctx.ui.notify(`Memory character cap: ${readCap()}`, \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst n = Number(trimmed);\n\t\t\tif (!Number.isFinite(n) || !Number.isInteger(n) || n < MIN_CHAR_CAP || n > MAX_CHAR_CAP) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid cap. Must be an integer between ${MIN_CHAR_CAP} and ${MAX_CHAR_CAP}.`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (n < readMemory().length) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Your memory file already exceeds this character cap: ${memoryFile()}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twriteCap(n);\n\t\t\tctx.ui.notify(`Memory character cap set to ${n}.`, \"info\");\n\t\t},\n\t});\n}\n"]}