@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.
- package/CHANGELOG.md +13 -0
- package/README.md +211 -236
- package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +28 -11
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +0 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +6 -7
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +262 -161
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +41 -17
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/amazon-bedrock.json +1 -1
- package/dist/catalog/providers/azure-openai-responses.json +1 -1
- package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
- package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
- package/dist/catalog/providers/fireworks.json +1 -1
- package/dist/catalog/providers/github-copilot.json +1 -1
- package/dist/catalog/providers/huggingface.json +1 -1
- package/dist/catalog/providers/minimax-cn.json +1 -1
- package/dist/catalog/providers/minimax.json +1 -1
- package/dist/catalog/providers/mistral.json +1 -1
- package/dist/catalog/providers/nvidia.json +1 -1
- package/dist/catalog/providers/openai.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/opencode.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
- package/dist/catalog/providers/qwen-cloud.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/providers/together.json +1 -1
- package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
- package/dist/catalog/providers/zai-coding-cn.json +1 -1
- package/dist/catalog/providers/zai.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/core/agent-session.d.ts +7 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +34 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +3 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +5 -2
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +6 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/memory-cap.d.ts +4 -8
- package/dist/core/memory-cap.d.ts.map +1 -1
- package/dist/core/memory-cap.js +8 -8
- package/dist/core/memory-cap.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -0
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +30 -14
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +1 -9
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +1 -1
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/settings-manager.d.ts +16 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +37 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-permission-inherit.d.ts +34 -22
- package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
- package/dist/core/subagent-permission-inherit.js +37 -80
- package/dist/core/subagent-permission-inherit.js.map +1 -1
- package/dist/core/swarm.d.ts.map +1 -1
- package/dist/core/swarm.js +13 -7
- package/dist/core/swarm.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +38 -48
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +22 -17
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-service.d.ts +10 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +17 -6
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +1 -4
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +1 -4
- package/dist/gateway/cron.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +21 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +122 -162
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +7 -4
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +55 -96
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
- package/docs/compaction.md +23 -23
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +18 -18
- package/docs/development.md +16 -15
- package/docs/docs.json +6 -2
- package/docs/extensions.md +82 -80
- package/docs/features.md +102 -0
- package/docs/index.md +25 -19
- package/docs/json.md +7 -7
- package/docs/keybindings.md +4 -4
- package/docs/models.md +2 -2
- package/docs/packages.md +38 -42
- package/docs/prompt-templates.md +4 -4
- package/docs/providers.md +22 -10
- package/docs/quickstart.md +81 -46
- package/docs/rpc.md +7 -13
- package/docs/sdk.md +43 -41
- package/docs/security.md +18 -18
- package/docs/session-format.md +9 -9
- package/docs/sessions.md +13 -12
- package/docs/settings.md +63 -24
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +21 -11
- package/docs/terminal-setup.md +5 -5
- package/docs/termux.md +7 -7
- package/docs/themes.md +12 -14
- package/docs/tmux.md +4 -4
- package/docs/tui.md +23 -23
- package/docs/usage.md +112 -87
- package/docs/windows.md +10 -2
- package/examples/README.md +3 -1
- package/examples/extensions/README.md +6 -6
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/README.md +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plan-mode/README.md +3 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +13 -11
- package/examples/extensions/todo.ts +2 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/README.md +9 -5
- package/package.json +6 -7
- package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
- package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-behavior.js +0 -213
- package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
- package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
- package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
- package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
- package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
- package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
- package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
- package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
- package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
- package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
- package/dist/core/behavior-preset.d.ts +0 -60
- package/dist/core/behavior-preset.d.ts.map +0 -1
- package/dist/core/behavior-preset.js +0 -257
- 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.
|
|
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.
|
|
9
|
+
"version": "0.2.13",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.52.0"
|
|
12
12
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# DOOM Overlay Demo
|
|
2
2
|
|
|
3
|
-
Play DOOM as an overlay in
|
|
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
|
-
|
|
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.
|
|
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.
|
|
9
|
+
"version": "0.2.13",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@earendil-works/gondolin": "0.12.0"
|
|
12
12
|
}
|
|
@@ -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.
|
|
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.
|
|
9
|
+
"version": "0.2.13",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sandbox-runtime": "^0.0.26"
|
|
12
12
|
}
|
|
@@ -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 `
|
|
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 ~/.
|
|
39
|
-
ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/index.ts" ~/.
|
|
40
|
-
ln -sf "$(pwd)/packages/coding-agent/examples/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 ~/.
|
|
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" ~/.
|
|
47
|
+
ln -sf "$(pwd)/$f" ~/.lunr/agent/agents/$(basename "$f")
|
|
46
48
|
done
|
|
47
49
|
|
|
48
50
|
# Symlink workflow prompts
|
|
49
|
-
mkdir -p ~/.
|
|
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" ~/.
|
|
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 `~/.
|
|
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
|
-
- `~/.
|
|
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.
|
|
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.
|
|
9
|
+
"version": "0.2.13",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ms": "^2.1.3"
|
|
12
12
|
},
|
package/examples/sdk/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SDK Examples
|
|
2
2
|
|
|
3
|
-
Programmatic usage of
|
|
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-
|
|
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 "@
|
|
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 "@
|
|
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` | `~/.
|
|
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.
|
|
4
|
-
"description": "
|
|
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/
|
|
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.
|
|
42
|
-
"@ashx-j/lunr-ai": "^0.2.
|
|
43
|
-
"@ashx-j/lunr-tui": "^0.2.
|
|
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}"]}
|