@code-yeongyu/senpi 2026.7.25 → 2026.7.26
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 +81 -0
- package/README.md +1 -1
- package/dist/beta/omo-local-update.d.ts +207 -0
- package/dist/beta/omo-local-update.d.ts.map +1 -0
- package/dist/beta/omo-local-update.js +708 -0
- package/dist/beta/omo-local-update.js.map +1 -0
- package/dist/cli/args.d.ts +4 -16
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -25
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/grok-neo-gate.d.ts +12 -0
- package/dist/cli/grok-neo-gate.d.ts.map +1 -0
- package/dist/cli/grok-neo-gate.js +18 -0
- package/dist/cli/grok-neo-gate.js.map +1 -0
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +33 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +22 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +202 -58
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -2
- package/dist/core/auth-providers.js +2 -2
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +30 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +20 -17
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js +3 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/format.js +9 -2
- package/dist/core/extensions/builtin/goal/format.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +38 -23
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.js +141 -0
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +66 -181
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/transitions.js +45 -0
- package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.js +2 -2
- package/dist/core/extensions/builtin/goal/types.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +2 -0
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.js +24 -12
- package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +0 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +8 -5
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +32 -0
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.js +1 -1
- package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +30 -14
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.js +16 -2
- package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +2 -1
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +99 -48
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.js +2 -4
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +12 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +12 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +25 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +0 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +32 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +91 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-resolver.d.ts +10 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +13 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +19 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +13 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +7 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +13 -0
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js +5 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -35
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -13
- 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 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +9 -2
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/timings.d.ts +7 -2
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +11 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -0
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/inspector-policy.d.ts +22 -0
- package/dist/inspector-policy.d.ts.map +1 -0
- package/dist/inspector-policy.js +84 -0
- package/dist/inspector-policy.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +1 -0
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/threads/goal-handlers.js +4 -2
- package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.js +1 -0
- package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
- package/dist/modes/app-server/threads/handlers.d.ts +1 -0
- package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js +2 -0
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
- package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
- package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turns.js +47 -3
- package/dist/modes/app-server/threads/turns.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +9 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +29 -4
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +43 -17
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
- package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
- package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
- package/dist/modes/interactive/grok/chrome.d.ts +51 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome.js +105 -0
- package/dist/modes/interactive/grok/chrome.js.map +1 -0
- package/dist/modes/interactive/grok/footer.d.ts +14 -0
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
- package/dist/modes/interactive/grok/footer.js +27 -0
- package/dist/modes/interactive/grok/footer.js.map +1 -0
- package/dist/modes/interactive/grok/input-card.d.ts +9 -0
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/input-card.js +30 -0
- package/dist/modes/interactive/grok/input-card.js.map +1 -0
- package/dist/modes/interactive/grok/palette.d.ts +145 -0
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
- package/dist/modes/interactive/grok/palette.js +92 -0
- package/dist/modes/interactive/grok/palette.js.map +1 -0
- package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
- package/dist/modes/interactive/grok/tool-row.js +26 -0
- package/dist/modes/interactive/grok/tool-row.js.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.js +30 -0
- package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +117 -54
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/grok-day.json +77 -0
- package/dist/modes/interactive/theme/grok-night.json +93 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +3 -3
- package/dist/modes/rpc/connection-handler.js +6 -6
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +6 -7
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +6 -7
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.js +5 -5
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/senpi +2 -0
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +2 -2
- package/docs/grok-neo.md +77 -0
- package/docs/keybindings.md +0 -1
- package/docs/settings.md +14 -3
- package/docs/terminal-tools.md +6 -3
- package/docs/usage.md +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +6 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +210 -26
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +39 -20
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +8 -8
- package/dist/cli/neo/build-argv.d.ts +0 -19
- package/dist/cli/neo/build-argv.d.ts.map +0 -1
- package/dist/cli/neo/build-argv.js +0 -84
- package/dist/cli/neo/build-argv.js.map +0 -1
- package/dist/cli/neo/daemon-launch.d.ts +0 -25
- package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
- package/dist/cli/neo/daemon-launch.js +0 -97
- package/dist/cli/neo/daemon-launch.js.map +0 -1
- package/dist/cli/neo/gate.d.ts +0 -15
- package/dist/cli/neo/gate.d.ts.map +0 -1
- package/dist/cli/neo/gate.js +0 -21
- package/dist/cli/neo/gate.js.map +0 -1
- package/dist/cli/neo/launch.d.ts +0 -24
- package/dist/cli/neo/launch.d.ts.map +0 -1
- package/dist/cli/neo/launch.js +0 -66
- package/dist/cli/neo/launch.js.map +0 -1
- package/dist/cli/neo/platform.d.ts +0 -38
- package/dist/cli/neo/platform.d.ts.map +0 -1
- package/dist/cli/neo/platform.js +0 -54
- package/dist/cli/neo/platform.js.map +0 -1
- package/dist/cli/neo/resolve-binary.d.ts +0 -39
- package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
- package/dist/cli/neo/resolve-binary.js +0 -66
- package/dist/cli/neo/resolve-binary.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
- package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.js +0 -36
- package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
- package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
- package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
- package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
- package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
- package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.js +0 -37
- package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
- package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
- package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
- package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.js +0 -2
- package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
- package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
- package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.js +0 -267
- package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
- package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
- package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
- package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.js +0 -209
- package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
- package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
- package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.js +0 -92
- package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
- package/docs/neo.md +0 -111
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/prompt.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAyCzB,CAAC;AAEb,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;EAMrC,qBAAqB;;;;;;;CAOtB,CAAC","sourcesContent":["// Adapted from oh-my-pi's todo prompt (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nexport const TODO_TOOL_DESCRIPTION = `**Tasks referenced by verbatim content string, NEVER an auto-generated ID — no \"task-1\"/\"task-N\" exists. Pass the content text in the task field.**\n\nOn each completion the earliest still-open task (in phase order) auto-promotes to in_progress.\nCompleting tasks out of phase order can move this pointer **back** to an earlier phase — expected; completed tasks are never reverted.\n\n## Operations\n\n| op | Required fields | Effect |\n|---|---|---|\n| init | list: [{phase, items: string[]}] | Initialize full list (replaces existing) |\n| init | items: string[] | Flattened single-phase init |\n| start | task | Mark in progress |\n| done | task or phase | Mark completed |\n| drop | task or phase | Mark abandoned |\n| rm | task or phase (optional) | Remove task or phase; omit both to clear |\n| append | phase?, items: string[] | Append tasks to phase; lazily creates phase |\n| view | — | Read-only: echo list |\n\nExample: {\"op\":\"init\",\"list\":[{\"phase\":\"Setup\",\"items\":[\"Survey code\",\"Write tests\"]}]}\n\n## Anatomy\n- **Task content**: 5–10 words; what, not how. Unique identifier.\n- **Phase name**: short noun phrase (e.g. Foundation, Auth, Verification). Unique identifier. NEVER prefix 1., A), Phase 1:.\n\n## Rules\n- Mark tasks done immediately after finishing. Complete phases in order.\n- NEVER make a todo call your turn's only tool call — batch it with the real work: init with the first reads/edits, each done/start with the next action. Solo todo turns waste a round trip.\n- Blocked? append a task to the active phase, or drop.\n- Keep task/phase strings stable once introduced.\n- Lost the exact task text? view echoes the list — NEVER guess from memory. done/start/drop take the task's EXACT text — copy it verbatim from the latest todo result, never re-type from memory.\n\n## When to create a list\n- Task requires 3+ distinct steps\n- User explicitly requests one\n- User provides a set of tasks\n- New instructions arrive mid-task — capture before proceeding\n\n<critical>\nUser hands you a multi-step plan — phased todo, numbered/bulleted checklist, or \"N bugs/items/tasks\":\n- You MUST init the list with EVERY item as its own task before working.\n- Enumerate all; NEVER summarize into fewer tasks, sample \"the important ones\", drop items, or track the rest from memory.\n</critical>`;\n\nexport const TASK_MANAGEMENT_SECTION = `\n<Task_Management>\n## Todo Management (CRITICAL)\n\nUse the todo tool for multi-step work. It is one operation at a time: initialize a phased list, then start, complete, abandon, append, remove, or view tasks by their exact content. The earliest open task auto-promotes after each completion.\n\n${TODO_TOOL_DESCRIPTION}\n\n## Evidence\n- File edit: inspect the changed files and diagnostics.\n- Build command: require exit code 0.\n- Test run: require passing output, or state the pre-existing failure.\n</Task_Management>\n`;\n"]}
|
|
@@ -17,6 +17,7 @@ export type TodoToolDetails = {
|
|
|
17
17
|
op?: TodoOperation;
|
|
18
18
|
phases: TodoPhase[];
|
|
19
19
|
storage: "session" | "memory";
|
|
20
|
+
corrections?: string[];
|
|
20
21
|
completedTasks?: TodoCompletionTransition[];
|
|
21
22
|
};
|
|
22
23
|
export type TodoStateEntry = {
|
|
@@ -49,14 +50,14 @@ export declare function normalizeInProgressTask(phases: TodoPhase[]): void;
|
|
|
49
50
|
/** Return the active task, preferring an in-progress item over the first pending item. */
|
|
50
51
|
export declare function nextActionableTask(phases: readonly TodoPhase[]): TodoItem | undefined;
|
|
51
52
|
export declare function getCompletionTransitions(previous: readonly TodoPhase[], updated: readonly TodoPhase[]): TodoCompletionTransition[];
|
|
52
|
-
export declare function resolveTaskOrError(phases: TodoPhase[], content: string | undefined, errors: string[]): TaskHit | undefined;
|
|
53
|
-
export declare function resolvePhaseOrError(phases: TodoPhase[], name: string | undefined, errors: string[]): TodoPhase | undefined;
|
|
54
|
-
export declare function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoItem[];
|
|
55
|
-
export declare function initPhases(entry: TodoOpEntry, errors: string[]): TodoPhase[];
|
|
56
|
-
export declare function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
|
|
57
|
-
export declare function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
|
|
58
|
-
export declare function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[];
|
|
59
|
-
export declare function applyParams(phases: TodoPhase[], params: TodoOpEntry): {
|
|
53
|
+
export declare function resolveTaskOrError(phases: TodoPhase[], content: string | undefined, errors: string[], corrections?: string[]): TaskHit | undefined;
|
|
54
|
+
export declare function resolvePhaseOrError(phases: TodoPhase[], name: string | undefined, errors: string[], corrections?: string[]): TodoPhase | undefined;
|
|
55
|
+
export declare function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoItem[];
|
|
56
|
+
export declare function initPhases(entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
|
|
57
|
+
export declare function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
|
|
58
|
+
export declare function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
|
|
59
|
+
export declare function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[];
|
|
60
|
+
export declare function applyParams(phases: TodoPhase[], params: TodoOpEntry, corrections?: string[]): {
|
|
60
61
|
phases: TodoPhase[];
|
|
61
62
|
errors: string[];
|
|
62
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// Copyright (c) 2025-2026 Can Bölük
|
|
4
4
|
// https://github.com/can1357/oh-my-pi
|
|
5
5
|
import { stripAnsi } from "../../../../utils/ansi.js";
|
|
6
|
+
import { fuzzyResolvePhase, fuzzyResolveTask } from "./fuzzy-match.js";
|
|
6
7
|
export const TODO_STATE_ENTRY_TYPE = "senpi.todo-state";
|
|
7
8
|
export const DEFAULT_INIT_PHASE = "Tasks";
|
|
8
9
|
function isRecord(value) {
|
|
@@ -136,46 +137,86 @@ export function getCompletionTransitions(previous, updated) {
|
|
|
136
137
|
}
|
|
137
138
|
return transitions;
|
|
138
139
|
}
|
|
139
|
-
export function resolveTaskOrError(phases, content, errors) {
|
|
140
|
+
export function resolveTaskOrError(phases, content, errors, corrections) {
|
|
140
141
|
if (!content) {
|
|
141
142
|
errors.push("Missing task content");
|
|
142
143
|
return undefined;
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
|
|
145
|
+
if (!corrections) {
|
|
146
|
+
const hit = findTaskByContent(phases, content);
|
|
147
|
+
if (!hit) {
|
|
148
|
+
if (/^task-\d+$/.test(content)) {
|
|
149
|
+
errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);
|
|
153
|
+
const hint = totalTasks === 0 ? " (todo list is empty — was it replaced or not yet created?)" : "";
|
|
154
|
+
errors.push(`Task "${content}" not found${hint}`);
|
|
155
|
+
}
|
|
148
156
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
157
|
+
return hit;
|
|
158
|
+
}
|
|
159
|
+
const resolution = fuzzyResolveTask(phases, content);
|
|
160
|
+
if (resolution.hit) {
|
|
161
|
+
if (resolution.corrected) {
|
|
162
|
+
corrections.push(`[auto-matched] task "${content}" -> "${resolution.hit.task.content}" — pass the exact text from the previous todo result next time`);
|
|
153
163
|
}
|
|
164
|
+
return resolution.hit;
|
|
154
165
|
}
|
|
155
|
-
|
|
166
|
+
const exactMatches = phases.flatMap((phase) => phase.tasks.filter((task) => task.content === content).map((task) => ({ task, phase })));
|
|
167
|
+
if (exactMatches.length > 1) {
|
|
168
|
+
const phaseNames = [...new Set(exactMatches.map((match) => match.phase.name))].map((name) => `"${name}"`);
|
|
169
|
+
errors.push(`Task "${content}" is ambiguous: duplicate task text exists in phases ${phaseNames.join(", ")}. Use /todo edit to make the task text unique.`);
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
if (/^task-\d+$/.test(content)) {
|
|
173
|
+
errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`);
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
const totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);
|
|
177
|
+
const hint = totalTasks === 0 ? " (todo list is empty — was it replaced or not yet created?)" : "";
|
|
178
|
+
const suggestion = resolution.suggestion ? ` Did you mean "${resolution.suggestion}"?` : "";
|
|
179
|
+
errors.push(`Task "${content}" not found${hint}${suggestion}`);
|
|
180
|
+
return undefined;
|
|
156
181
|
}
|
|
157
|
-
export function resolvePhaseOrError(phases, name, errors) {
|
|
182
|
+
export function resolvePhaseOrError(phases, name, errors, corrections) {
|
|
158
183
|
if (!name) {
|
|
159
184
|
errors.push("Missing phase name");
|
|
160
185
|
return undefined;
|
|
161
186
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
187
|
+
if (!corrections) {
|
|
188
|
+
const phase = findPhaseByName(phases, name);
|
|
189
|
+
if (!phase)
|
|
190
|
+
errors.push(`Phase "${name}" not found`);
|
|
191
|
+
return phase;
|
|
192
|
+
}
|
|
193
|
+
const resolution = fuzzyResolvePhase(phases, name);
|
|
194
|
+
if (resolution.hit) {
|
|
195
|
+
if (resolution.corrected) {
|
|
196
|
+
corrections.push(`[auto-matched] phase "${name}" -> "${resolution.hit.name}" — pass the exact text from the previous todo result next time`);
|
|
197
|
+
}
|
|
198
|
+
return resolution.hit;
|
|
199
|
+
}
|
|
200
|
+
if (phases.filter((phase) => phase.name === name).length > 1) {
|
|
201
|
+
errors.push(`Phase "${name}" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`);
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const suggestion = resolution.suggestion ? ` Did you mean "${resolution.suggestion}"?` : "";
|
|
205
|
+
errors.push(`Phase "${name}" not found${suggestion}`);
|
|
206
|
+
return undefined;
|
|
166
207
|
}
|
|
167
|
-
export function getTaskTargets(phases, entry, errors) {
|
|
208
|
+
export function getTaskTargets(phases, entry, errors, corrections) {
|
|
168
209
|
if (entry.task) {
|
|
169
|
-
const hit = resolveTaskOrError(phases, entry.task, errors);
|
|
210
|
+
const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
|
|
170
211
|
return hit ? [hit.task] : [];
|
|
171
212
|
}
|
|
172
213
|
if (entry.phase) {
|
|
173
|
-
const phase = resolvePhaseOrError(phases, entry.phase, errors);
|
|
214
|
+
const phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);
|
|
174
215
|
return phase ? [...phase.tasks] : [];
|
|
175
216
|
}
|
|
176
217
|
return phases.flatMap((phase) => phase.tasks);
|
|
177
218
|
}
|
|
178
|
-
export function initPhases(entry, errors) {
|
|
219
|
+
export function initPhases(entry, errors, corrections) {
|
|
179
220
|
const list = entry.list ??
|
|
180
221
|
(entry.items && entry.items.length > 0
|
|
181
222
|
? [{ phase: entry.phase ?? DEFAULT_INIT_PHASE, items: entry.items }]
|
|
@@ -184,30 +225,33 @@ export function initPhases(entry, errors) {
|
|
|
184
225
|
errors.push("Missing list for init operation");
|
|
185
226
|
return [];
|
|
186
227
|
}
|
|
187
|
-
const
|
|
228
|
+
const phases = [];
|
|
229
|
+
const phasesByName = new Map();
|
|
188
230
|
const seenTasks = new Set();
|
|
189
231
|
for (const listEntry of list) {
|
|
190
|
-
if (seenPhases.has(listEntry.phase))
|
|
191
|
-
errors.push(`Duplicate phase "${listEntry.phase}" in init list`);
|
|
192
|
-
seenPhases.add(listEntry.phase);
|
|
193
232
|
if (listEntry.items.length === 0)
|
|
194
233
|
errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);
|
|
234
|
+
let phase = phasesByName.get(listEntry.phase);
|
|
235
|
+
if (phase) {
|
|
236
|
+
corrections?.push(`[auto-corrected] merged duplicate phase "${listEntry.phase}" in init list`);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
phase = { name: listEntry.phase, tasks: [] };
|
|
240
|
+
phasesByName.set(listEntry.phase, phase);
|
|
241
|
+
phases.push(phase);
|
|
242
|
+
}
|
|
195
243
|
for (const content of listEntry.items) {
|
|
196
|
-
if (seenTasks.has(content))
|
|
197
|
-
|
|
244
|
+
if (seenTasks.has(content)) {
|
|
245
|
+
corrections?.push(`[auto-corrected] kept first duplicate task "${content}" in init list`);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
198
248
|
seenTasks.add(content);
|
|
249
|
+
phase.tasks.push({ content, status: "pending" });
|
|
199
250
|
}
|
|
200
251
|
}
|
|
201
|
-
return
|
|
202
|
-
name: listEntry.phase,
|
|
203
|
-
tasks: listEntry.items.map((content) => ({ content, status: "pending" })),
|
|
204
|
-
}));
|
|
252
|
+
return phases;
|
|
205
253
|
}
|
|
206
|
-
export function appendItems(phases, entry, errors) {
|
|
207
|
-
if (!entry.phase) {
|
|
208
|
-
errors.push("Missing phase name for append operation");
|
|
209
|
-
return phases;
|
|
210
|
-
}
|
|
254
|
+
export function appendItems(phases, entry, errors, corrections) {
|
|
211
255
|
if (!entry.items || entry.items.length === 0) {
|
|
212
256
|
errors.push("Missing items for append operation");
|
|
213
257
|
return phases;
|
|
@@ -223,25 +267,32 @@ export function appendItems(phases, entry, errors) {
|
|
|
223
267
|
}
|
|
224
268
|
if (hasDuplicate)
|
|
225
269
|
return phases;
|
|
226
|
-
let
|
|
270
|
+
let phaseName = entry.phase;
|
|
271
|
+
if (!phaseName) {
|
|
272
|
+
const activeTask = nextActionableTask(phases);
|
|
273
|
+
const activePhase = activeTask ? phases.find((phase) => phase.tasks.includes(activeTask)) : undefined;
|
|
274
|
+
phaseName = activePhase?.name ?? phases[phases.length - 1]?.name ?? DEFAULT_INIT_PHASE;
|
|
275
|
+
corrections?.push(`[auto-corrected] append had no phase; used "${phaseName}"`);
|
|
276
|
+
}
|
|
277
|
+
let phase = findPhaseByName(phases, phaseName);
|
|
227
278
|
if (!phase) {
|
|
228
|
-
phase = { name:
|
|
279
|
+
phase = { name: phaseName, tasks: [] };
|
|
229
280
|
phases.push(phase);
|
|
230
281
|
}
|
|
231
282
|
for (const content of entry.items)
|
|
232
283
|
phase.tasks.push({ content, status: "pending" });
|
|
233
284
|
return phases;
|
|
234
285
|
}
|
|
235
|
-
export function removeTasks(phases, entry, errors) {
|
|
286
|
+
export function removeTasks(phases, entry, errors, corrections) {
|
|
236
287
|
if (entry.task) {
|
|
237
|
-
const hit = resolveTaskOrError(phases, entry.task, errors);
|
|
288
|
+
const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
|
|
238
289
|
if (!hit)
|
|
239
290
|
return phases;
|
|
240
291
|
hit.phase.tasks = hit.phase.tasks.filter((candidate) => candidate !== hit.task);
|
|
241
292
|
return phases;
|
|
242
293
|
}
|
|
243
294
|
if (entry.phase) {
|
|
244
|
-
const phase = resolvePhaseOrError(phases, entry.phase, errors);
|
|
295
|
+
const phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);
|
|
245
296
|
if (!phase)
|
|
246
297
|
return phases;
|
|
247
298
|
phase.tasks = [];
|
|
@@ -251,12 +302,12 @@ export function removeTasks(phases, entry, errors) {
|
|
|
251
302
|
phase.tasks = [];
|
|
252
303
|
return phases;
|
|
253
304
|
}
|
|
254
|
-
export function applyEntry(phases, entry, errors) {
|
|
305
|
+
export function applyEntry(phases, entry, errors, corrections) {
|
|
255
306
|
switch (entry.op) {
|
|
256
307
|
case "init":
|
|
257
|
-
return initPhases(entry, errors);
|
|
308
|
+
return initPhases(entry, errors, corrections);
|
|
258
309
|
case "start": {
|
|
259
|
-
const hit = resolveTaskOrError(phases, entry.task, errors);
|
|
310
|
+
const hit = resolveTaskOrError(phases, entry.task, errors, corrections);
|
|
260
311
|
if (!hit)
|
|
261
312
|
return phases;
|
|
262
313
|
for (const phase of phases) {
|
|
@@ -269,27 +320,27 @@ export function applyEntry(phases, entry, errors) {
|
|
|
269
320
|
return phases;
|
|
270
321
|
}
|
|
271
322
|
case "done":
|
|
272
|
-
for (const task of getTaskTargets(phases, entry, errors))
|
|
323
|
+
for (const task of getTaskTargets(phases, entry, errors, corrections))
|
|
273
324
|
task.status = "completed";
|
|
274
325
|
return phases;
|
|
275
326
|
case "drop":
|
|
276
|
-
for (const task of getTaskTargets(phases, entry, errors))
|
|
327
|
+
for (const task of getTaskTargets(phases, entry, errors, corrections))
|
|
277
328
|
task.status = "abandoned";
|
|
278
329
|
return phases;
|
|
279
330
|
case "rm":
|
|
280
|
-
return removeTasks(phases, entry, errors);
|
|
331
|
+
return removeTasks(phases, entry, errors, corrections);
|
|
281
332
|
case "append":
|
|
282
|
-
return appendItems(phases, entry, errors);
|
|
333
|
+
return appendItems(phases, entry, errors, corrections);
|
|
283
334
|
case "view":
|
|
284
335
|
return phases;
|
|
285
336
|
}
|
|
286
337
|
}
|
|
287
|
-
export function applyParams(phases, params) {
|
|
338
|
+
export function applyParams(phases, params, corrections) {
|
|
288
339
|
if (params.op === "view")
|
|
289
340
|
return { phases, errors: [] };
|
|
290
341
|
const original = clonePhases(phases);
|
|
291
342
|
const errors = [];
|
|
292
|
-
const next = applyEntry(phases, params, errors);
|
|
343
|
+
const next = applyEntry(phases, params, errors, corrections);
|
|
293
344
|
if (errors.length > 0)
|
|
294
345
|
return { phases: original, errors };
|
|
295
346
|
normalizeInProgressTask(next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { stripAnsi } from \"../../../../utils/ansi.ts\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\n\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"abandoned\";\n\nexport type TodoOperation = \"init\" | \"start\" | \"done\" | \"rm\" | \"drop\" | \"append\" | \"view\";\n\nexport type TodoItem = {\n\tcontent: string;\n\tstatus: TodoStatus;\n};\n\nexport type TodoPhase = {\n\tname: string;\n\ttasks: TodoItem[];\n};\n\nexport type TodoCompletionTransition = {\n\tphase: string;\n\tcontent: string;\n};\n\nexport type TodoToolDetails = {\n\top?: TodoOperation;\n\tphases: TodoPhase[];\n\tstorage: \"session\" | \"memory\";\n\tcompletedTasks?: TodoCompletionTransition[];\n};\n\nexport type TodoStateEntry = {\n\tschema: \"v2\";\n\tphases: TodoPhase[];\n};\n\nexport const TODO_STATE_ENTRY_TYPE = \"senpi.todo-state\";\nexport const DEFAULT_INIT_PHASE = \"Tasks\";\n\ntype TodoPhaseInput = {\n\tphase: string;\n\titems: string[];\n};\n\nexport type TodoOpEntry = {\n\top: TodoOperation;\n\tlist?: TodoPhaseInput[];\n\ttask?: string;\n\tphase?: string;\n\titems?: string[];\n};\n\ntype TaskHit = {\n\ttask: TodoItem;\n\tphase: TodoPhase;\n};\n\ntype BranchEntry = SessionEntry;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isTodoStatus(value: unknown): value is TodoStatus {\n\treturn value === \"pending\" || value === \"in_progress\" || value === \"completed\" || value === \"abandoned\";\n}\n\nfunction parseTodoStatus(value: unknown): TodoStatus | undefined {\n\tif (value === \"cancelled\") return \"abandoned\";\n\treturn isTodoStatus(value) ? value : undefined;\n}\n\nfunction parseTodoItem(value: unknown, options?: { lenient?: boolean }): TodoItem | undefined {\n\tif (!isRecord(value) || typeof value.content !== \"string\") return undefined;\n\tconst status = parseTodoStatus(value.status) ?? (options?.lenient ? \"pending\" : undefined);\n\treturn status ? { content: value.content, status } : undefined;\n}\n\nfunction parseTodoPhase(value: unknown): TodoPhase | undefined {\n\tif (!isRecord(value) || typeof value.name !== \"string\" || !Array.isArray(value.tasks)) return undefined;\n\tconst tasks: TodoItem[] = [];\n\tfor (const task of value.tasks) {\n\t\tconst parsed = parseTodoItem(task);\n\t\tif (!parsed) return undefined;\n\t\ttasks.push(parsed);\n\t}\n\treturn { name: value.name, tasks };\n}\n\nfunction parsePhases(value: unknown): TodoPhase[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst phases: TodoPhase[] = [];\n\tfor (const phase of value) {\n\t\tconst parsed = parseTodoPhase(phase);\n\t\tif (!parsed) return undefined;\n\t\tphases.push(parsed);\n\t}\n\treturn phases;\n}\n\nfunction parseLegacyTodos(value: unknown): TodoPhase[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst tasks: TodoItem[] = [];\n\tfor (const todo of value) {\n\t\t// Legacy todowrite persisted arbitrary status strings (e.g. \"blocked\").\n\t\t// Preserve those entries instead of dropping the whole list: unknown\n\t\t// statuses become \"pending\" so the task survives migration as open work.\n\t\tconst parsed = parseTodoItem(todo, { lenient: true });\n\t\tif (!parsed) return undefined;\n\t\ttasks.push(parsed);\n\t}\n\treturn [{ name: DEFAULT_INIT_PHASE, tasks }];\n}\n\nfunction readTodoPayload(value: unknown): TodoPhase[] | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (value.schema === \"v2\") return parsePhases(value.phases);\n\tif (Array.isArray(value.phases)) return parsePhases(value.phases);\n\tif (Array.isArray(value.todos)) return parseLegacyTodos(value.todos);\n\treturn undefined;\n}\n\nexport function findTaskByContent(phases: TodoPhase[], content: string): TaskHit | undefined {\n\tfor (const phase of phases) {\n\t\tconst task = phase.tasks.find((candidate) => candidate.content === content);\n\t\tif (task) return { task, phase };\n\t}\n\treturn undefined;\n}\n\nexport function findPhaseByName(phases: TodoPhase[], name: string): TodoPhase | undefined {\n\treturn phases.find((phase) => phase.name === name);\n}\n\nexport function cloneTask(task: TodoItem): TodoItem {\n\treturn { content: task.content, status: task.status };\n}\n\nexport function clonePhases(phases: readonly TodoPhase[]): TodoPhase[] {\n\treturn phases.map((phase) => ({ name: phase.name, tasks: phase.tasks.map(cloneTask) }));\n}\n\nexport function normalizeInProgressTask(phases: TodoPhase[]): void {\n\tconst orderedTasks = phases.flatMap((phase) => phase.tasks);\n\tif (orderedTasks.length === 0) return;\n\n\tconst inProgressTasks = orderedTasks.filter((task) => task.status === \"in_progress\");\n\tif (inProgressTasks.length > 1) {\n\t\tfor (const task of inProgressTasks.slice(1)) task.status = \"pending\";\n\t}\n\n\tif (inProgressTasks.length > 0) return;\n\n\tconst firstPendingTask = orderedTasks.find((task) => task.status === \"pending\");\n\tif (firstPendingTask) firstPendingTask.status = \"in_progress\";\n}\n\n/** Return the active task, preferring an in-progress item over the first pending item. */\nexport function nextActionableTask(phases: readonly TodoPhase[]): TodoItem | undefined {\n\tlet firstPending: TodoItem | undefined;\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.status === \"in_progress\") return task;\n\t\t\tif (!firstPending && task.status === \"pending\") firstPending = task;\n\t\t}\n\t}\n\treturn firstPending;\n}\n\nexport function getCompletionTransitions(\n\tprevious: readonly TodoPhase[],\n\tupdated: readonly TodoPhase[],\n): TodoCompletionTransition[] {\n\tconst previousStatuses = new Map<string, TodoStatus>();\n\tfor (const phase of previous) {\n\t\tfor (const task of phase.tasks) previousStatuses.set(`${phase.name}\\u0000${task.content}`, task.status);\n\t}\n\n\tconst transitions: TodoCompletionTransition[] = [];\n\tfor (const phase of updated) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.status !== \"completed\") continue;\n\t\t\tconst previousStatus = previousStatuses.get(`${phase.name}\\u0000${task.content}`);\n\t\t\tif (previousStatus && previousStatus !== \"completed\") {\n\t\t\t\ttransitions.push({ phase: phase.name, content: task.content });\n\t\t\t}\n\t\t}\n\t}\n\treturn transitions;\n}\n\nexport function resolveTaskOrError(\n\tphases: TodoPhase[],\n\tcontent: string | undefined,\n\terrors: string[],\n): TaskHit | undefined {\n\tif (!content) {\n\t\terrors.push(\"Missing task content\");\n\t\treturn undefined;\n\t}\n\tconst hit = findTaskByContent(phases, content);\n\tif (!hit) {\n\t\tif (/^task-\\d+$/.test(content)) {\n\t\t\terrors.push(\n\t\t\t\t`Task \"${content}\" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\t\tconst hint = totalTasks === 0 ? \" (todo list is empty — was it replaced or not yet created?)\" : \"\";\n\t\t\terrors.push(`Task \"${content}\" not found${hint}`);\n\t\t}\n\t}\n\treturn hit;\n}\n\nexport function resolvePhaseOrError(\n\tphases: TodoPhase[],\n\tname: string | undefined,\n\terrors: string[],\n): TodoPhase | undefined {\n\tif (!name) {\n\t\terrors.push(\"Missing phase name\");\n\t\treturn undefined;\n\t}\n\tconst phase = findPhaseByName(phases, name);\n\tif (!phase) errors.push(`Phase \"${name}\" not found`);\n\treturn phase;\n}\n\nexport function getTaskTargets(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoItem[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors);\n\t\treturn hit ? [hit.task] : [];\n\t}\n\tif (entry.phase) {\n\t\tconst phase = resolvePhaseOrError(phases, entry.phase, errors);\n\t\treturn phase ? [...phase.tasks] : [];\n\t}\n\treturn phases.flatMap((phase) => phase.tasks);\n}\n\nexport function initPhases(entry: TodoOpEntry, errors: string[]): TodoPhase[] {\n\tconst list =\n\t\tentry.list ??\n\t\t(entry.items && entry.items.length > 0\n\t\t\t? [{ phase: entry.phase ?? DEFAULT_INIT_PHASE, items: entry.items }]\n\t\t\t: undefined);\n\tif (!list) {\n\t\terrors.push(\"Missing list for init operation\");\n\t\treturn [];\n\t}\n\n\tconst seenPhases = new Set<string>();\n\tconst seenTasks = new Set<string>();\n\tfor (const listEntry of list) {\n\t\tif (seenPhases.has(listEntry.phase)) errors.push(`Duplicate phase \"${listEntry.phase}\" in init list`);\n\t\tseenPhases.add(listEntry.phase);\n\t\tif (listEntry.items.length === 0) errors.push(`Phase \"${listEntry.phase}\" has no tasks in init list`);\n\t\tfor (const content of listEntry.items) {\n\t\t\tif (seenTasks.has(content)) errors.push(`Duplicate task \"${content}\" in init list`);\n\t\t\tseenTasks.add(content);\n\t\t}\n\t}\n\n\treturn list.map((listEntry) => ({\n\t\tname: listEntry.phase,\n\t\ttasks: listEntry.items.map((content) => ({ content, status: \"pending\" })),\n\t}));\n}\n\nexport function appendItems(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[] {\n\tif (!entry.phase) {\n\t\terrors.push(\"Missing phase name for append operation\");\n\t\treturn phases;\n\t}\n\tif (!entry.items || entry.items.length === 0) {\n\t\terrors.push(\"Missing items for append operation\");\n\t\treturn phases;\n\t}\n\n\tconst seen = new Set<string>();\n\tlet hasDuplicate = false;\n\tfor (const content of entry.items) {\n\t\tif (seen.has(content) || findTaskByContent(phases, content)) {\n\t\t\terrors.push(`Task \"${content}\" already exists`);\n\t\t\thasDuplicate = true;\n\t\t}\n\t\tseen.add(content);\n\t}\n\tif (hasDuplicate) return phases;\n\n\tlet phase = findPhaseByName(phases, entry.phase);\n\tif (!phase) {\n\t\tphase = { name: entry.phase, tasks: [] };\n\t\tphases.push(phase);\n\t}\n\n\tfor (const content of entry.items) phase.tasks.push({ content, status: \"pending\" });\n\treturn phases;\n}\n\nexport function removeTasks(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors);\n\t\tif (!hit) return phases;\n\t\thit.phase.tasks = hit.phase.tasks.filter((candidate) => candidate !== hit.task);\n\t\treturn phases;\n\t}\n\tif (entry.phase) {\n\t\tconst phase = resolvePhaseOrError(phases, entry.phase, errors);\n\t\tif (!phase) return phases;\n\t\tphase.tasks = [];\n\t\treturn phases;\n\t}\n\tfor (const phase of phases) phase.tasks = [];\n\treturn phases;\n}\n\nexport function applyEntry(phases: TodoPhase[], entry: TodoOpEntry, errors: string[]): TodoPhase[] {\n\tswitch (entry.op) {\n\t\tcase \"init\":\n\t\t\treturn initPhases(entry, errors);\n\t\tcase \"start\": {\n\t\t\tconst hit = resolveTaskOrError(phases, entry.task, errors);\n\t\t\tif (!hit) return phases;\n\t\t\tfor (const phase of phases) {\n\t\t\t\tfor (const candidate of phase.tasks) {\n\t\t\t\t\tif (candidate.status === \"in_progress\" && candidate !== hit.task) candidate.status = \"pending\";\n\t\t\t\t}\n\t\t\t}\n\t\t\thit.task.status = \"in_progress\";\n\t\t\treturn phases;\n\t\t}\n\t\tcase \"done\":\n\t\t\tfor (const task of getTaskTargets(phases, entry, errors)) task.status = \"completed\";\n\t\t\treturn phases;\n\t\tcase \"drop\":\n\t\t\tfor (const task of getTaskTargets(phases, entry, errors)) task.status = \"abandoned\";\n\t\t\treturn phases;\n\t\tcase \"rm\":\n\t\t\treturn removeTasks(phases, entry, errors);\n\t\tcase \"append\":\n\t\t\treturn appendItems(phases, entry, errors);\n\t\tcase \"view\":\n\t\t\treturn phases;\n\t}\n}\n\nexport function applyParams(phases: TodoPhase[], params: TodoOpEntry): { phases: TodoPhase[]; errors: string[] } {\n\tif (params.op === \"view\") return { phases, errors: [] };\n\tconst original = clonePhases(phases);\n\tconst errors: string[] = [];\n\tconst next = applyEntry(phases, params, errors);\n\tif (errors.length > 0) return { phases: original, errors };\n\tnormalizeInProgressTask(next);\n\treturn { phases: next, errors };\n}\n\nexport function applyOpsToPhases(\n\tcurrentPhases: readonly TodoPhase[],\n\tops: readonly TodoOpEntry[],\n): { phases: TodoPhase[]; errors: string[] } {\n\tconst errors: string[] = [];\n\tlet next = clonePhases(currentPhases);\n\tfor (const op of ops) next = applyEntry(next, op, errors);\n\tif (errors.length > 0) return { phases: clonePhases(currentPhases), errors };\n\tnormalizeInProgressTask(next);\n\treturn { phases: next, errors };\n}\n\nexport function formatSummary(phases: readonly TodoPhase[], errors: readonly string[], readOnly = false): string {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\tif (tasks.length === 0) {\n\t\tif (errors.length > 0) return `Errors: ${errors.join(\"; \")}`;\n\t\treturn readOnly ? \"Todo list is empty.\" : \"Todo list cleared.\";\n\t}\n\n\tconst remainingByPhase = phases\n\t\t.map((phase) => ({\n\t\t\tname: phase.name,\n\t\t\ttasks: phase.tasks.filter((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t\t}))\n\t\t.filter((phase) => phase.tasks.length > 0);\n\tconst remainingTasks = remainingByPhase.flatMap((phase) =>\n\t\tphase.tasks.map((task) => ({ ...task, phase: phase.name })),\n\t);\n\n\tlet currentIdx = phases.findIndex((phase) =>\n\t\tphase.tasks.some((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t);\n\tif (currentIdx === -1) currentIdx = phases.length - 1;\n\tconst current = phases[currentIdx];\n\tconst done = current.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\n\tconst lines: string[] = [];\n\tif (errors.length > 0) lines.push(`Errors: ${errors.join(\"; \")}`);\n\tif (remainingTasks.length === 0) {\n\t\tlines.push(\"Remaining items: none.\");\n\t} else {\n\t\tlines.push(`Remaining items (${remainingTasks.length}):`);\n\t\tfor (const task of remainingTasks) lines.push(` - ${task.content} [${task.status}] (${task.phase})`);\n\t}\n\n\tconst closedAll = tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\tconst workedAhead = phases.some(\n\t\t(phase, index) =>\n\t\t\tindex > currentIdx && phase.tasks.some((task) => task.status === \"completed\" || task.status === \"abandoned\"),\n\t);\n\tlines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`);\n\tlines.push(\n\t\t`Active phase ${currentIdx + 1}/${phases.length} \"${current.name}\" (${done}/${current.tasks.length})${\n\t\t\tworkedAhead\n\t\t\t\t? \" — earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).\"\n\t\t\t\t: \".\"\n\t\t}`,\n\t);\n\tfor (const phase of phases) {\n\t\tlines.push(` ${phase.name}:`);\n\t\tfor (const task of phase.tasks) {\n\t\t\tconst checkbox = task.status === \"completed\" ? \"[X]\" : \"[ ]\";\n\t\t\tconst tag = task.status === \"in_progress\" ? \" (in progress)\" : task.status === \"abandoned\" ? \" (dropped)\" : \"\";\n\t\t\tlines.push(` - ${checkbox} ${task.content}${tag}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"abandoned\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"abandoned\" || status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nfunction getActivePhase(phases: readonly TodoPhase[]): TodoPhase | undefined {\n\tconst activeTask = nextActionableTask(phases);\n\tif (!activeTask) return undefined;\n\treturn phases.find((phase) => phase.tasks.includes(activeTask));\n}\n\nexport function getTodoWidgetLines(phases: readonly TodoPhase[]): string[] | undefined {\n\tconst activePhase = getActivePhase(phases);\n\tif (!activePhase) return undefined;\n\treturn [\n\t\t\"Todo\",\n\t\tsanitizeTodoText(activePhase.name),\n\t\t...activePhase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t];\n}\n\nexport function getTodoResultLines(phases: readonly TodoPhase[]): string[] {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\treturn [\n\t\t`${tasks.filter(isIncompleteTodo).length} todos`,\n\t\t...phases.flatMap((phase) => [\n\t\t\t`${sanitizeTodoText(phase.name)}:`,\n\t\t\t...phase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t\t]),\n\t];\n}\n\nexport function isTodoItem(value: unknown): value is TodoItem {\n\treturn parseTodoItem(value) !== undefined;\n}\n\nexport function isTodoItemArray(value: unknown): value is TodoItem[] {\n\treturn Array.isArray(value) && value.every(isTodoItem);\n}\n\nexport function isTodoPhase(value: unknown): value is TodoPhase {\n\treturn parseTodoPhase(value) !== undefined;\n}\n\nexport function isTodoPhaseArray(value: unknown): value is TodoPhase[] {\n\treturn Array.isArray(value) && value.every(isTodoPhase);\n}\n\nexport function getLatestPhasesFromBranchEntries(entries: BranchEntry[]): TodoPhase[] {\n\tlet phases: TodoPhase[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"custom\" && entry.customType === TODO_STATE_ENTRY_TYPE) {\n\t\t\tconst parsed = readTodoPayload(entry.data);\n\t\t\tif (parsed) phases = clonePhases(parsed);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"message\" || !isRecord(entry.message)) continue;\n\t\tif (entry.message.role !== \"toolResult\") continue;\n\t\tif (entry.message.toolName !== \"todo\" && entry.message.toolName !== \"todowrite\") continue;\n\n\t\tconst parsed = readTodoPayload(entry.message.details);\n\t\tif (parsed) phases = clonePhases(parsed);\n\t}\n\n\treturn phases;\n}\n\n/** Compatibility reader for callers that still expect the old flat array. */\nexport function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[] {\n\treturn getLatestPhasesFromBranchEntries(entries).flatMap((phase) => phase.tasks.map(cloneTask));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { stripAnsi } from \"../../../../utils/ansi.ts\";\nimport type { SessionEntry } from \"../../../session-manager.ts\";\nimport { fuzzyResolvePhase, fuzzyResolveTask } from \"./fuzzy-match.ts\";\n\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"abandoned\";\n\nexport type TodoOperation = \"init\" | \"start\" | \"done\" | \"rm\" | \"drop\" | \"append\" | \"view\";\n\nexport type TodoItem = {\n\tcontent: string;\n\tstatus: TodoStatus;\n};\n\nexport type TodoPhase = {\n\tname: string;\n\ttasks: TodoItem[];\n};\n\nexport type TodoCompletionTransition = {\n\tphase: string;\n\tcontent: string;\n};\n\nexport type TodoToolDetails = {\n\top?: TodoOperation;\n\tphases: TodoPhase[];\n\tstorage: \"session\" | \"memory\";\n\tcorrections?: string[];\n\tcompletedTasks?: TodoCompletionTransition[];\n};\n\nexport type TodoStateEntry = {\n\tschema: \"v2\";\n\tphases: TodoPhase[];\n};\n\nexport const TODO_STATE_ENTRY_TYPE = \"senpi.todo-state\";\nexport const DEFAULT_INIT_PHASE = \"Tasks\";\n\ntype TodoPhaseInput = {\n\tphase: string;\n\titems: string[];\n};\n\nexport type TodoOpEntry = {\n\top: TodoOperation;\n\tlist?: TodoPhaseInput[];\n\ttask?: string;\n\tphase?: string;\n\titems?: string[];\n};\n\ntype TaskHit = {\n\ttask: TodoItem;\n\tphase: TodoPhase;\n};\n\ntype BranchEntry = SessionEntry;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isTodoStatus(value: unknown): value is TodoStatus {\n\treturn value === \"pending\" || value === \"in_progress\" || value === \"completed\" || value === \"abandoned\";\n}\n\nfunction parseTodoStatus(value: unknown): TodoStatus | undefined {\n\tif (value === \"cancelled\") return \"abandoned\";\n\treturn isTodoStatus(value) ? value : undefined;\n}\n\nfunction parseTodoItem(value: unknown, options?: { lenient?: boolean }): TodoItem | undefined {\n\tif (!isRecord(value) || typeof value.content !== \"string\") return undefined;\n\tconst status = parseTodoStatus(value.status) ?? (options?.lenient ? \"pending\" : undefined);\n\treturn status ? { content: value.content, status } : undefined;\n}\n\nfunction parseTodoPhase(value: unknown): TodoPhase | undefined {\n\tif (!isRecord(value) || typeof value.name !== \"string\" || !Array.isArray(value.tasks)) return undefined;\n\tconst tasks: TodoItem[] = [];\n\tfor (const task of value.tasks) {\n\t\tconst parsed = parseTodoItem(task);\n\t\tif (!parsed) return undefined;\n\t\ttasks.push(parsed);\n\t}\n\treturn { name: value.name, tasks };\n}\n\nfunction parsePhases(value: unknown): TodoPhase[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst phases: TodoPhase[] = [];\n\tfor (const phase of value) {\n\t\tconst parsed = parseTodoPhase(phase);\n\t\tif (!parsed) return undefined;\n\t\tphases.push(parsed);\n\t}\n\treturn phases;\n}\n\nfunction parseLegacyTodos(value: unknown): TodoPhase[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst tasks: TodoItem[] = [];\n\tfor (const todo of value) {\n\t\t// Legacy todowrite persisted arbitrary status strings (e.g. \"blocked\").\n\t\t// Preserve those entries instead of dropping the whole list: unknown\n\t\t// statuses become \"pending\" so the task survives migration as open work.\n\t\tconst parsed = parseTodoItem(todo, { lenient: true });\n\t\tif (!parsed) return undefined;\n\t\ttasks.push(parsed);\n\t}\n\treturn [{ name: DEFAULT_INIT_PHASE, tasks }];\n}\n\nfunction readTodoPayload(value: unknown): TodoPhase[] | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (value.schema === \"v2\") return parsePhases(value.phases);\n\tif (Array.isArray(value.phases)) return parsePhases(value.phases);\n\tif (Array.isArray(value.todos)) return parseLegacyTodos(value.todos);\n\treturn undefined;\n}\n\nexport function findTaskByContent(phases: TodoPhase[], content: string): TaskHit | undefined {\n\tfor (const phase of phases) {\n\t\tconst task = phase.tasks.find((candidate) => candidate.content === content);\n\t\tif (task) return { task, phase };\n\t}\n\treturn undefined;\n}\n\nexport function findPhaseByName(phases: TodoPhase[], name: string): TodoPhase | undefined {\n\treturn phases.find((phase) => phase.name === name);\n}\n\nexport function cloneTask(task: TodoItem): TodoItem {\n\treturn { content: task.content, status: task.status };\n}\n\nexport function clonePhases(phases: readonly TodoPhase[]): TodoPhase[] {\n\treturn phases.map((phase) => ({ name: phase.name, tasks: phase.tasks.map(cloneTask) }));\n}\n\nexport function normalizeInProgressTask(phases: TodoPhase[]): void {\n\tconst orderedTasks = phases.flatMap((phase) => phase.tasks);\n\tif (orderedTasks.length === 0) return;\n\n\tconst inProgressTasks = orderedTasks.filter((task) => task.status === \"in_progress\");\n\tif (inProgressTasks.length > 1) {\n\t\tfor (const task of inProgressTasks.slice(1)) task.status = \"pending\";\n\t}\n\n\tif (inProgressTasks.length > 0) return;\n\n\tconst firstPendingTask = orderedTasks.find((task) => task.status === \"pending\");\n\tif (firstPendingTask) firstPendingTask.status = \"in_progress\";\n}\n\n/** Return the active task, preferring an in-progress item over the first pending item. */\nexport function nextActionableTask(phases: readonly TodoPhase[]): TodoItem | undefined {\n\tlet firstPending: TodoItem | undefined;\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.status === \"in_progress\") return task;\n\t\t\tif (!firstPending && task.status === \"pending\") firstPending = task;\n\t\t}\n\t}\n\treturn firstPending;\n}\n\nexport function getCompletionTransitions(\n\tprevious: readonly TodoPhase[],\n\tupdated: readonly TodoPhase[],\n): TodoCompletionTransition[] {\n\tconst previousStatuses = new Map<string, TodoStatus>();\n\tfor (const phase of previous) {\n\t\tfor (const task of phase.tasks) previousStatuses.set(`${phase.name}\\u0000${task.content}`, task.status);\n\t}\n\n\tconst transitions: TodoCompletionTransition[] = [];\n\tfor (const phase of updated) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.status !== \"completed\") continue;\n\t\t\tconst previousStatus = previousStatuses.get(`${phase.name}\\u0000${task.content}`);\n\t\t\tif (previousStatus && previousStatus !== \"completed\") {\n\t\t\t\ttransitions.push({ phase: phase.name, content: task.content });\n\t\t\t}\n\t\t}\n\t}\n\treturn transitions;\n}\n\nexport function resolveTaskOrError(\n\tphases: TodoPhase[],\n\tcontent: string | undefined,\n\terrors: string[],\n\tcorrections?: string[],\n): TaskHit | undefined {\n\tif (!content) {\n\t\terrors.push(\"Missing task content\");\n\t\treturn undefined;\n\t}\n\tif (!corrections) {\n\t\tconst hit = findTaskByContent(phases, content);\n\t\tif (!hit) {\n\t\t\tif (/^task-\\d+$/.test(content)) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Task \"${content}\" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\t\t\tconst hint = totalTasks === 0 ? \" (todo list is empty — was it replaced or not yet created?)\" : \"\";\n\t\t\t\terrors.push(`Task \"${content}\" not found${hint}`);\n\t\t\t}\n\t\t}\n\t\treturn hit;\n\t}\n\n\tconst resolution = fuzzyResolveTask(phases, content);\n\tif (resolution.hit) {\n\t\tif (resolution.corrected) {\n\t\t\tcorrections.push(\n\t\t\t\t`[auto-matched] task \"${content}\" -> \"${resolution.hit.task.content}\" — pass the exact text from the previous todo result next time`,\n\t\t\t);\n\t\t}\n\t\treturn resolution.hit;\n\t}\n\n\tconst exactMatches = phases.flatMap((phase) =>\n\t\tphase.tasks.filter((task) => task.content === content).map((task) => ({ task, phase })),\n\t);\n\tif (exactMatches.length > 1) {\n\t\tconst phaseNames = [...new Set(exactMatches.map((match) => match.phase.name))].map((name) => `\"${name}\"`);\n\t\terrors.push(\n\t\t\t`Task \"${content}\" is ambiguous: duplicate task text exists in phases ${phaseNames.join(\", \")}. Use /todo edit to make the task text unique.`,\n\t\t);\n\t\treturn undefined;\n\t}\n\tif (/^task-\\d+$/.test(content)) {\n\t\terrors.push(\n\t\t\t`Task \"${content}\" not found. Tasks are referenced by content, not by IDs — pass the task's full text from the previous result.`,\n\t\t);\n\t\treturn undefined;\n\t}\n\tconst totalTasks = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\tconst hint = totalTasks === 0 ? \" (todo list is empty — was it replaced or not yet created?)\" : \"\";\n\tconst suggestion = resolution.suggestion ? ` Did you mean \"${resolution.suggestion}\"?` : \"\";\n\terrors.push(`Task \"${content}\" not found${hint}${suggestion}`);\n\treturn undefined;\n}\n\nexport function resolvePhaseOrError(\n\tphases: TodoPhase[],\n\tname: string | undefined,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase | undefined {\n\tif (!name) {\n\t\terrors.push(\"Missing phase name\");\n\t\treturn undefined;\n\t}\n\tif (!corrections) {\n\t\tconst phase = findPhaseByName(phases, name);\n\t\tif (!phase) errors.push(`Phase \"${name}\" not found`);\n\t\treturn phase;\n\t}\n\n\tconst resolution = fuzzyResolvePhase(phases, name);\n\tif (resolution.hit) {\n\t\tif (resolution.corrected) {\n\t\t\tcorrections.push(\n\t\t\t\t`[auto-matched] phase \"${name}\" -> \"${resolution.hit.name}\" — pass the exact text from the previous todo result next time`,\n\t\t\t);\n\t\t}\n\t\treturn resolution.hit;\n\t}\n\tif (phases.filter((phase) => phase.name === name).length > 1) {\n\t\terrors.push(\n\t\t\t`Phase \"${name}\" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`,\n\t\t);\n\t\treturn undefined;\n\t}\n\tconst suggestion = resolution.suggestion ? ` Did you mean \"${resolution.suggestion}\"?` : \"\";\n\terrors.push(`Phase \"${name}\" not found${suggestion}`);\n\treturn undefined;\n}\n\nexport function getTaskTargets(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoItem[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\n\t\treturn hit ? [hit.task] : [];\n\t}\n\tif (entry.phase) {\n\t\tconst phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);\n\t\treturn phase ? [...phase.tasks] : [];\n\t}\n\treturn phases.flatMap((phase) => phase.tasks);\n}\n\nexport function initPhases(entry: TodoOpEntry, errors: string[], corrections?: string[]): TodoPhase[] {\n\tconst list =\n\t\tentry.list ??\n\t\t(entry.items && entry.items.length > 0\n\t\t\t? [{ phase: entry.phase ?? DEFAULT_INIT_PHASE, items: entry.items }]\n\t\t\t: undefined);\n\tif (!list) {\n\t\terrors.push(\"Missing list for init operation\");\n\t\treturn [];\n\t}\n\n\tconst phases: TodoPhase[] = [];\n\tconst phasesByName = new Map<string, TodoPhase>();\n\tconst seenTasks = new Set<string>();\n\tfor (const listEntry of list) {\n\t\tif (listEntry.items.length === 0) errors.push(`Phase \"${listEntry.phase}\" has no tasks in init list`);\n\t\tlet phase = phasesByName.get(listEntry.phase);\n\t\tif (phase) {\n\t\t\tcorrections?.push(`[auto-corrected] merged duplicate phase \"${listEntry.phase}\" in init list`);\n\t\t} else {\n\t\t\tphase = { name: listEntry.phase, tasks: [] };\n\t\t\tphasesByName.set(listEntry.phase, phase);\n\t\t\tphases.push(phase);\n\t\t}\n\t\tfor (const content of listEntry.items) {\n\t\t\tif (seenTasks.has(content)) {\n\t\t\t\tcorrections?.push(`[auto-corrected] kept first duplicate task \"${content}\" in init list`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tseenTasks.add(content);\n\t\t\tphase.tasks.push({ content, status: \"pending\" });\n\t\t}\n\t}\n\n\treturn phases;\n}\n\nexport function appendItems(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\n\tif (!entry.items || entry.items.length === 0) {\n\t\terrors.push(\"Missing items for append operation\");\n\t\treturn phases;\n\t}\n\n\tconst seen = new Set<string>();\n\tlet hasDuplicate = false;\n\tfor (const content of entry.items) {\n\t\tif (seen.has(content) || findTaskByContent(phases, content)) {\n\t\t\terrors.push(`Task \"${content}\" already exists`);\n\t\t\thasDuplicate = true;\n\t\t}\n\t\tseen.add(content);\n\t}\n\tif (hasDuplicate) return phases;\n\n\tlet phaseName = entry.phase;\n\tif (!phaseName) {\n\t\tconst activeTask = nextActionableTask(phases);\n\t\tconst activePhase = activeTask ? phases.find((phase) => phase.tasks.includes(activeTask)) : undefined;\n\t\tphaseName = activePhase?.name ?? phases[phases.length - 1]?.name ?? DEFAULT_INIT_PHASE;\n\t\tcorrections?.push(`[auto-corrected] append had no phase; used \"${phaseName}\"`);\n\t}\n\n\tlet phase = findPhaseByName(phases, phaseName);\n\tif (!phase) {\n\t\tphase = { name: phaseName, tasks: [] };\n\t\tphases.push(phase);\n\t}\n\n\tfor (const content of entry.items) phase.tasks.push({ content, status: \"pending\" });\n\treturn phases;\n}\n\nexport function removeTasks(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\n\tif (entry.task) {\n\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\n\t\tif (!hit) return phases;\n\t\thit.phase.tasks = hit.phase.tasks.filter((candidate) => candidate !== hit.task);\n\t\treturn phases;\n\t}\n\tif (entry.phase) {\n\t\tconst phase = resolvePhaseOrError(phases, entry.phase, errors, corrections);\n\t\tif (!phase) return phases;\n\t\tphase.tasks = [];\n\t\treturn phases;\n\t}\n\tfor (const phase of phases) phase.tasks = [];\n\treturn phases;\n}\n\nexport function applyEntry(\n\tphases: TodoPhase[],\n\tentry: TodoOpEntry,\n\terrors: string[],\n\tcorrections?: string[],\n): TodoPhase[] {\n\tswitch (entry.op) {\n\t\tcase \"init\":\n\t\t\treturn initPhases(entry, errors, corrections);\n\t\tcase \"start\": {\n\t\t\tconst hit = resolveTaskOrError(phases, entry.task, errors, corrections);\n\t\t\tif (!hit) return phases;\n\t\t\tfor (const phase of phases) {\n\t\t\t\tfor (const candidate of phase.tasks) {\n\t\t\t\t\tif (candidate.status === \"in_progress\" && candidate !== hit.task) candidate.status = \"pending\";\n\t\t\t\t}\n\t\t\t}\n\t\t\thit.task.status = \"in_progress\";\n\t\t\treturn phases;\n\t\t}\n\t\tcase \"done\":\n\t\t\tfor (const task of getTaskTargets(phases, entry, errors, corrections)) task.status = \"completed\";\n\t\t\treturn phases;\n\t\tcase \"drop\":\n\t\t\tfor (const task of getTaskTargets(phases, entry, errors, corrections)) task.status = \"abandoned\";\n\t\t\treturn phases;\n\t\tcase \"rm\":\n\t\t\treturn removeTasks(phases, entry, errors, corrections);\n\t\tcase \"append\":\n\t\t\treturn appendItems(phases, entry, errors, corrections);\n\t\tcase \"view\":\n\t\t\treturn phases;\n\t}\n}\n\nexport function applyParams(\n\tphases: TodoPhase[],\n\tparams: TodoOpEntry,\n\tcorrections?: string[],\n): { phases: TodoPhase[]; errors: string[] } {\n\tif (params.op === \"view\") return { phases, errors: [] };\n\tconst original = clonePhases(phases);\n\tconst errors: string[] = [];\n\tconst next = applyEntry(phases, params, errors, corrections);\n\tif (errors.length > 0) return { phases: original, errors };\n\tnormalizeInProgressTask(next);\n\treturn { phases: next, errors };\n}\n\nexport function applyOpsToPhases(\n\tcurrentPhases: readonly TodoPhase[],\n\tops: readonly TodoOpEntry[],\n): { phases: TodoPhase[]; errors: string[] } {\n\tconst errors: string[] = [];\n\tlet next = clonePhases(currentPhases);\n\tfor (const op of ops) next = applyEntry(next, op, errors);\n\tif (errors.length > 0) return { phases: clonePhases(currentPhases), errors };\n\tnormalizeInProgressTask(next);\n\treturn { phases: next, errors };\n}\n\nexport function formatSummary(phases: readonly TodoPhase[], errors: readonly string[], readOnly = false): string {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\tif (tasks.length === 0) {\n\t\tif (errors.length > 0) return `Errors: ${errors.join(\"; \")}`;\n\t\treturn readOnly ? \"Todo list is empty.\" : \"Todo list cleared.\";\n\t}\n\n\tconst remainingByPhase = phases\n\t\t.map((phase) => ({\n\t\t\tname: phase.name,\n\t\t\ttasks: phase.tasks.filter((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t\t}))\n\t\t.filter((phase) => phase.tasks.length > 0);\n\tconst remainingTasks = remainingByPhase.flatMap((phase) =>\n\t\tphase.tasks.map((task) => ({ ...task, phase: phase.name })),\n\t);\n\n\tlet currentIdx = phases.findIndex((phase) =>\n\t\tphase.tasks.some((task) => task.status === \"pending\" || task.status === \"in_progress\"),\n\t);\n\tif (currentIdx === -1) currentIdx = phases.length - 1;\n\tconst current = phases[currentIdx];\n\tconst done = current.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\n\tconst lines: string[] = [];\n\tif (errors.length > 0) lines.push(`Errors: ${errors.join(\"; \")}`);\n\tif (remainingTasks.length === 0) {\n\t\tlines.push(\"Remaining items: none.\");\n\t} else {\n\t\tlines.push(`Remaining items (${remainingTasks.length}):`);\n\t\tfor (const task of remainingTasks) lines.push(` - ${task.content} [${task.status}] (${task.phase})`);\n\t}\n\n\tconst closedAll = tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\tconst workedAhead = phases.some(\n\t\t(phase, index) =>\n\t\t\tindex > currentIdx && phase.tasks.some((task) => task.status === \"completed\" || task.status === \"abandoned\"),\n\t);\n\tlines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`);\n\tlines.push(\n\t\t`Active phase ${currentIdx + 1}/${phases.length} \"${current.name}\" (${done}/${current.tasks.length})${\n\t\t\tworkedAhead\n\t\t\t\t? \" — earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).\"\n\t\t\t\t: \".\"\n\t\t}`,\n\t);\n\tfor (const phase of phases) {\n\t\tlines.push(` ${phase.name}:`);\n\t\tfor (const task of phase.tasks) {\n\t\t\tconst checkbox = task.status === \"completed\" ? \"[X]\" : \"[ ]\";\n\t\t\tconst tag = task.status === \"in_progress\" ? \" (in progress)\" : task.status === \"abandoned\" ? \" (dropped)\" : \"\";\n\t\t\tlines.push(` - ${checkbox} ${task.content}${tag}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function sanitizeTodoText(text: string): string {\n\treturn stripAnsi(text)\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function isTerminalTodoStatus(status: string): boolean {\n\treturn status === \"completed\" || status === \"abandoned\" || status === \"cancelled\";\n}\n\nexport function isIncompleteTodo(todo: TodoItem): boolean {\n\treturn !isTerminalTodoStatus(todo.status);\n}\n\nexport function getTodoMarker(status: string): string {\n\tif (status === \"completed\") return \"[✓]\";\n\tif (status === \"in_progress\") return \"[•]\";\n\tif (status === \"abandoned\" || status === \"cancelled\") return \"[×]\";\n\treturn \"[ ]\";\n}\n\nfunction getActivePhase(phases: readonly TodoPhase[]): TodoPhase | undefined {\n\tconst activeTask = nextActionableTask(phases);\n\tif (!activeTask) return undefined;\n\treturn phases.find((phase) => phase.tasks.includes(activeTask));\n}\n\nexport function getTodoWidgetLines(phases: readonly TodoPhase[]): string[] | undefined {\n\tconst activePhase = getActivePhase(phases);\n\tif (!activePhase) return undefined;\n\treturn [\n\t\t\"Todo\",\n\t\tsanitizeTodoText(activePhase.name),\n\t\t...activePhase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t];\n}\n\nexport function getTodoResultLines(phases: readonly TodoPhase[]): string[] {\n\tconst tasks = phases.flatMap((phase) => phase.tasks);\n\treturn [\n\t\t`${tasks.filter(isIncompleteTodo).length} todos`,\n\t\t...phases.flatMap((phase) => [\n\t\t\t`${sanitizeTodoText(phase.name)}:`,\n\t\t\t...phase.tasks.map((todo) => `${getTodoMarker(todo.status)} ${sanitizeTodoText(todo.content)}`),\n\t\t]),\n\t];\n}\n\nexport function isTodoItem(value: unknown): value is TodoItem {\n\treturn parseTodoItem(value) !== undefined;\n}\n\nexport function isTodoItemArray(value: unknown): value is TodoItem[] {\n\treturn Array.isArray(value) && value.every(isTodoItem);\n}\n\nexport function isTodoPhase(value: unknown): value is TodoPhase {\n\treturn parseTodoPhase(value) !== undefined;\n}\n\nexport function isTodoPhaseArray(value: unknown): value is TodoPhase[] {\n\treturn Array.isArray(value) && value.every(isTodoPhase);\n}\n\nexport function getLatestPhasesFromBranchEntries(entries: BranchEntry[]): TodoPhase[] {\n\tlet phases: TodoPhase[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"custom\" && entry.customType === TODO_STATE_ENTRY_TYPE) {\n\t\t\tconst parsed = readTodoPayload(entry.data);\n\t\t\tif (parsed) phases = clonePhases(parsed);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== \"message\" || !isRecord(entry.message)) continue;\n\t\tif (entry.message.role !== \"toolResult\") continue;\n\t\tif (entry.message.toolName !== \"todo\" && entry.message.toolName !== \"todowrite\") continue;\n\n\t\tconst parsed = readTodoPayload(entry.message.details);\n\t\tif (parsed) phases = clonePhases(parsed);\n\t}\n\n\treturn phases;\n}\n\n/** Compatibility reader for callers that still expect the old flat array. */\nexport function getLatestTodosFromBranchEntries(entries: BranchEntry[]): TodoItem[] {\n\treturn getLatestPhasesFromBranchEntries(entries).flatMap((phase) => phase.tasks.map(cloneTask));\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { Type } from "typebox";
|
|
|
2
2
|
import type { ExtensionAPI, ExtensionContext } from "../../../types.ts";
|
|
3
3
|
import { type TodoPhase } from "../state.ts";
|
|
4
4
|
export declare const TODO_PARAMS_SCHEMA: Type.TObject<{
|
|
5
|
-
op: Type.TUnion<[Type.TLiteral<"init">, Type.TLiteral<"start">, Type.TLiteral<"done">, Type.TLiteral<"rm">, Type.TLiteral<"drop">, Type.TLiteral<"append">, Type.TLiteral<"view">]
|
|
5
|
+
op: Type.TOptional<Type.TUnion<[Type.TLiteral<"init">, Type.TLiteral<"start">, Type.TLiteral<"done">, Type.TLiteral<"rm">, Type.TLiteral<"drop">, Type.TLiteral<"append">, Type.TLiteral<"view">]>>;
|
|
6
6
|
list: Type.TOptional<Type.TArray<Type.TObject<{
|
|
7
7
|
phase: Type.TString;
|
|
8
8
|
items: Type.TArray<Type.TString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAEX,YAAY,EACZ,gBAAgB,EAIhB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAEX,YAAY,EACZ,gBAAgB,EAIhB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAYN,KAAK,SAAS,EAGd,MAAM,aAAa,CAAC;AAuBrB,eAAO,MAAM,kBAAkB;;;;;;;;;EAU7B,CAAC;AAIH,KAAK,aAAa,GAAG;IACpB,gBAAgB,EAAE,MAAM,SAAS,EAAE,CAAC;IACpC,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AA4CF,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0B/D;AAyID,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAyEjF"}
|