@code-yeongyu/senpi 2026.9.9 → 2026.9.10
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 +82 -1
- package/README.md +2 -0
- package/dist/beta/omo-local-update-worker.js.map +1 -1
- package/dist/beta/omo-local-update.d.ts.map +1 -1
- package/dist/brand-dir-migration.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/grok-neo-gate.js.map +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -19
- package/dist/config.js.map +1 -1
- package/dist/core/agent-abort-provenance.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +46 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +109 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-settled-delivery.d.ts.map +1 -1
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/brand.js.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/lifecycle.d.ts.map +1 -1
- package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/credential-pool/failover.d.ts.map +1 -1
- package/dist/core/credential-pool/rotation-stream.js.map +1 -1
- package/dist/core/credential-pool/state-store.d.ts +2 -2
- package/dist/core/credential-pool/state-store.d.ts.map +1 -1
- package/dist/core/credential-pool/state-store.js.map +1 -1
- package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
- package/dist/core/edited-assistant-message.d.ts +24 -0
- package/dist/core/edited-assistant-message.d.ts.map +1 -0
- package/dist/core/edited-assistant-message.js +57 -0
- package/dist/core/edited-assistant-message.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/extension.d.ts +3 -0
- package/dist/core/extensions/builtin/ask-user/extension.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/extension.js +47 -0
- package/dist/core/extensions/builtin/ask-user/extension.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/family.d.ts +8 -0
- package/dist/core/extensions/builtin/ask-user/family.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/family.js +6 -0
- package/dist/core/extensions/builtin/ask-user/family.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts +22 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.js +109 -0
- package/dist/core/extensions/builtin/ask-user/format.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/index.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/index.js +4 -0
- package/dist/core/extensions/builtin/ask-user/index.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/params.d.ts +27 -0
- package/dist/core/extensions/builtin/ask-user/params.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/params.js +78 -0
- package/dist/core/extensions/builtin/ask-user/params.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/pending.d.ts +58 -0
- package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/pending.js +130 -0
- package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/registry.d.ts +21 -0
- package/dist/core/extensions/builtin/ask-user/registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/registry.js +20 -0
- package/dist/core/extensions/builtin/ask-user/registry.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/render.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/render.js +25 -0
- package/dist/core/extensions/builtin/ask-user/render.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/resume.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/resume.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/resume.js +85 -0
- package/dist/core/extensions/builtin/ask-user/resume.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/schema.d.ts +40 -0
- package/dist/core/extensions/builtin/ask-user/schema.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/schema.js +102 -0
- package/dist/core/extensions/builtin/ask-user/schema.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/tool.d.ts +8 -0
- package/dist/core/extensions/builtin/ask-user/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/tool.js +195 -0
- package/dist/core/extensions/builtin/ask-user/tool.js.map +1 -0
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -1
- package/dist/core/extensions/builtin/btw/side-query.js.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +11 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +12 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/bounded-queue.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts +14 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js +42 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts +18 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js +105 -36
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/failover.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/refusal.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +4 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-convert.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/resume-admission.d.ts +7 -0
- package/dist/core/extensions/builtin/compaction/resume-admission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/resume-admission.js +7 -0
- package/dist/core/extensions/builtin/compaction/resume-admission.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.d.ts +23 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.js +99 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/summarization-retry.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.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/reload-deferral.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +57 -4
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.js +9 -6
- package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/wait-progress.js.map +1 -1
- package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +1 -0
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/help/panel.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/command-runner.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/dispatcher.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/plugin-loader.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/tool-adapter.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/params.d.ts +45 -0
- package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/params.js +81 -0
- package/dist/core/extensions/builtin/imagegen/params.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/paths.d.ts +10 -4
- package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/paths.js +43 -10
- package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +20 -0
- package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/reference-images.js +70 -0
- package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +58 -33
- package/dist/core/extensions/builtin/imagegen/tool.d.ts +15 -19
- package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/tool.js +74 -52
- package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +2 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -1
- package/dist/core/extensions/builtin/look-at/runner.js.map +1 -1
- package/dist/core/extensions/builtin/loop/command.js.map +1 -1
- package/dist/core/extensions/builtin/loop/cron-planner.js.map +1 -1
- package/dist/core/extensions/builtin/loop/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop/loopfile.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/scheduler.js.map +1 -1
- package/dist/core/extensions/builtin/loop/status.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/escalation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/escalation.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/active-set.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/callback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-errors.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-provider.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts +28 -28
- package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/elicitation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/elicitation.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/errors.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/guard/output-guard.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/log.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/reconnect.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +13 -6
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.js +43 -19
- package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +5 -3
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/inject.js +7 -4
- package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -1
- 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 +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +4 -4
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +4 -4
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -1
- package/dist/core/extensions/builtin/rules/commands.js.map +1 -1
- package/dist/core/extensions/builtin/rules/config.js.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-operations.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/leak-context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/token-grammar.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/message-update.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/stream-utils.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/watch.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +2 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +17 -8
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/notice/box.d.ts.map +1 -1
- package/dist/core/extensions/notice/box.js +13 -5
- package/dist/core/extensions/notice/box.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +11 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +23 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +76 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +182 -177
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +5 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lockfile-policy.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +150 -150
- package/dist/core/model-config-schema.d.ts.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +11 -7
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/retry-fallback/expansion.js.map +1 -1
- package/dist/core/retry-fallback/log.js.map +1 -1
- package/dist/core/retry-fallback/probe-scheduler.d.ts.map +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +24 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-log.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-resident-store.d.ts.map +1 -1
- package/dist/core/session-sidecar-store.d.ts.map +1 -1
- package/dist/core/session-summary-lru.d.ts.map +1 -1
- package/dist/core/session-work-barrier.d.ts.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +14 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-shapes.d.ts +7 -0
- package/dist/core/settings-shapes.d.ts.map +1 -1
- package/dist/core/settings-shapes.js +3 -1
- package/dist/core/settings-shapes.js.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bounded-realpath.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/read-classifiers.d.ts +17 -0
- package/dist/core/tools/read-classifiers.d.ts.map +1 -0
- package/dist/core/tools/read-classifiers.js +26 -0
- package/dist/core/tools/read-classifiers.js.map +1 -0
- package/dist/core/tools/read.d.ts +5 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +21 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tail-window.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write-result.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/huggingface.d.ts.map +1 -1
- package/dist/extensions/llama/huggingface.js.map +1 -1
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/from-source-config-guard.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/daemon/occupancy.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.js.map +1 -1
- package/dist/modes/app-server/daemon.js.map +1 -1
- package/dist/modes/app-server/protocol/collaboration-mode.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts +7 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts +8 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts +12 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts +13 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts +10 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js.map +1 -0
- package/dist/modes/app-server/protocol/index.d.ts +2 -0
- package/dist/modes/app-server/protocol/index.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/index.js.map +1 -1
- package/dist/modes/app-server/protocol/methods.d.ts +1 -0
- package/dist/modes/app-server/protocol/methods.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/methods.js +1 -0
- package/dist/modes/app-server/protocol/methods.js.map +1 -1
- package/dist/modes/app-server/rpc/errors.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +22 -6
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/search/fuzzy-files.js.map +1 -1
- package/dist/modes/app-server/search/fuzzy-search-service.d.ts.map +1 -1
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/app-server/server/approval-bridge.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-types.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-ui-context.d.ts +2 -1
- package/dist/modes/app-server/server/approval-ui-context.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-ui-context.js +9 -1
- package/dist/modes/app-server/server/approval-ui-context.js.map +1 -1
- package/dist/modes/app-server/server/catalogs.js.map +1 -1
- package/dist/modes/app-server/server/config.js.map +1 -1
- package/dist/modes/app-server/server/connection.d.ts.map +1 -1
- package/dist/modes/app-server/server/models.js.map +1 -1
- package/dist/modes/app-server/server/notifications.d.ts.map +1 -1
- package/dist/modes/app-server/server/notifications.js.map +1 -1
- package/dist/modes/app-server/server/server-core.d.ts.map +1 -1
- package/dist/modes/app-server/server/server-core.js.map +1 -1
- package/dist/modes/app-server/server/skills.js.map +1 -1
- package/dist/modes/app-server/server/user-input-bridge.d.ts +16 -0
- package/dist/modes/app-server/server/user-input-bridge.d.ts.map +1 -0
- package/dist/modes/app-server/server/user-input-bridge.js +142 -0
- package/dist/modes/app-server/server/user-input-bridge.js.map +1 -0
- package/dist/modes/app-server/server/user-input-types.d.ts +43 -0
- package/dist/modes/app-server/server/user-input-types.d.ts.map +1 -0
- package/dist/modes/app-server/server/user-input-types.js +51 -0
- package/dist/modes/app-server/server/user-input-types.js.map +1 -0
- package/dist/modes/app-server/threads/archive-state.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/mcp-wire-status.d.ts.map +1 -1
- package/dist/modes/app-server/threads/metadata-state.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-file-changes.js.map +1 -1
- package/dist/modes/app-server/threads/projection-message-items.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-turn-diff.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-web-search.js.map +1 -1
- package/dist/modes/app-server/threads/projection.d.ts.map +1 -1
- package/dist/modes/app-server/threads/registry.d.ts.map +1 -1
- package/dist/modes/app-server/threads/registry.js.map +1 -1
- package/dist/modes/app-server/threads/search-cache.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-log.d.ts.map +1 -1
- 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.js.map +1 -1
- package/dist/modes/app-server/threads/wire-thread.js.map +1 -1
- package/dist/modes/app-server/transports/unix-socket.d.ts.map +1 -1
- package/dist/modes/app-server/transports/unix-socket.js.map +1 -1
- package/dist/modes/app-server/transports/websocket.d.ts.map +1 -1
- package/dist/modes/app-server/turn-adapter.d.ts +3 -3
- package/dist/modes/app-server/turn-adapter.d.ts.map +1 -1
- package/dist/modes/app-server/turn-adapter.js +36 -5
- package/dist/modes/app-server/turn-adapter.js.map +1 -1
- package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts +39 -0
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-async-widget.js +82 -0
- package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts +21 -0
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-keys.js +115 -0
- package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-render.d.ts +17 -0
- package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-render.js +75 -0
- package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-state.d.ts +52 -0
- package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-state.js +134 -0
- package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts +50 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question.js +148 -0
- package/dist/modes/interactive/components/ask-user-question.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/continuity-notice.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -1
- package/dist/modes/interactive/components/render-signature.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/shortcut-overlay.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +4 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +17 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -1
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -1
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -1
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +6 -0
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +32 -3
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +35 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +413 -100
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/login-outcome.d.ts +20 -0
- package/dist/modes/interactive/login-outcome.d.ts.map +1 -0
- package/dist/modes/interactive/login-outcome.js +35 -0
- package/dist/modes/interactive/login-outcome.js.map +1 -0
- package/dist/modes/interactive/startup-tools.js.map +1 -1
- package/dist/modes/interactive/streaming-reveal-content.d.ts.map +1 -1
- package/dist/modes/interactive/streaming-reveal-content.js.map +1 -1
- package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.d.ts +7 -7
- package/dist/modes/interactive/tips/catalog/input-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js +5 -0
- package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/model-tips.d.ts +1 -1
- package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts +1 -1
- package/dist/modes/interactive/tips/scheduler.js.map +1 -1
- package/dist/modes/interactive/tips/working-tip.d.ts.map +1 -1
- package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -1
- package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +8 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/provider-native-rendering.d.ts.map +1 -1
- package/dist/modes/provider-native-rendering.js +35 -0
- package/dist/modes/provider-native-rendering.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +72 -1
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/connection-question-bridge.d.ts +18 -0
- package/dist/modes/rpc/connection-question-bridge.d.ts.map +1 -0
- package/dist/modes/rpc/connection-question-bridge.js +156 -0
- package/dist/modes/rpc/connection-question-bridge.js.map +1 -0
- package/dist/modes/rpc/custom-capability.d.ts +2 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +2 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/event-output-buffer.js.map +1 -1
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -1
- package/dist/modes/rpc/ownership-safe-lock.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +20 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +35 -3
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +103 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +6 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +4 -4
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +14 -8
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-fanout.d.ts +2 -0
- package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-fanout.js +25 -1
- package/dist/modes/rpc/session-event-fanout.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +7 -1
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +17 -4
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +11 -1
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-requests.js +1 -1
- package/dist/modes/rpc/session-worker-requests.js.map +1 -1
- package/dist/modes/rpc/session-worker.js +10 -2
- package/dist/modes/rpc/session-worker.js.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts +14 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.js +48 -2
- package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
- package/dist/modes/rpc/socket-ownership.js.map +1 -1
- package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/worker-session-registry.js +2 -1
- package/dist/modes/rpc/worker-session-registry.js.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/self-update-bootstrap.js.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/app-server.md +14 -0
- package/docs/extensions.md +28 -1
- package/docs/keybindings.md +1 -0
- package/docs/providers.md +1 -0
- package/docs/rpc.md +95 -3
- package/docs/settings.md +18 -0
- package/docs/skills.md +1 -1
- package/docs/tui.md +6 -0
- package/docs/usage.md +2 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +17 -2
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +35 -15
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +13 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +76 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -77
- package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/run-budget.ts +107 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-deadlines.ts +76 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +25 -14
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +47 -40
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +8 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -187
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +189 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +66 -56
- 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 +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/result.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts +36 -36
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -1
- 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 +4 -4
- package/node_modules/@earendil-works/pi-ai/README.md +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts +3 -1
- 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 +6 -2
- 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.js.map +1 -1
- 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/bedrock-converse-stream.lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
- 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.js.map +1 -1
- 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.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 +5 -0
- 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-images-edit.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +60 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +93 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js +96 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +3 -6
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +26 -119
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
- 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.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts +47 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js +126 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js +44 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -0
- 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 +26 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/model-capabilities.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +99 -66
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +34 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.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.generated.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -28
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.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/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.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/venice.json +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +20 -3
- 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/deferred-tools.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +3 -3
- package/node_modules/@earendil-works/pi-pty/dist/loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/quarantine.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session-bun.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +2 -2
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/alt-screen-flash.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
- 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/h-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/latex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
- 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.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/image-markers.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/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/paste-markers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-capabilities.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tmux-image-probe.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/node_modules/css-tree/cjs/data-patch.cjs +853 -5
- package/node_modules/css-tree/cjs/data.cjs +13598 -3
- package/node_modules/css-tree/cjs/version.cjs +1 -3
- package/node_modules/css-tree/lib/data-patch.js +853 -4
- package/node_modules/css-tree/lib/data.js +13598 -5
- package/node_modules/css-tree/lib/version.js +1 -5
- package/package.json +8 -8
- package/vendor/pi-client/client.d.ts.map +1 -1
- package/vendor/pi-client/client.js.map +1 -1
- package/vendor/pi-client/connection.d.ts.map +1 -1
- package/vendor/pi-client/connection.js.map +1 -1
- package/vendor/pi-client/errors.d.ts.map +1 -1
- package/vendor/pi-client/session-handle.d.ts.map +1 -1
- package/vendor/pi-client/state.d.ts.map +1 -1
- package/vendor/pi-protocol/cbor/decoder.js.map +1 -1
- package/vendor/pi-protocol/cbor/options.d.ts.map +1 -1
- package/vendor/pi-protocol/codec.d.ts.map +1 -1
- package/vendor/pi-protocol/codec.js.map +1 -1
- package/vendor/pi-protocol/framing.d.ts.map +1 -1
- package/vendor/pi-protocol/schemas.d.ts +678 -678
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure state machine behind the `/loop` extension.\n *\n * Everything time-related or timer-related is injected: a {@link LoopClock} supplies\n * `now`, and a {@link LoopTimerPort} owns the single armed timeout per loop. This module\n * performs NO I/O, never calls `setTimeout`/`Date.now`, and never persists anything\n * itself — the caller mirrors {@link LoopScheduler.getState} into the sidecar store. That\n * keeps every invariant below testable with a fake clock and zero real waiting.\n *\n * The load-bearing invariants:\n * - At most ONE queued or running tick per loop. A fire that lands while one is in flight\n * sets `coalescedFirePending` instead of enqueuing a second delivery, so a sleeping\n * laptop or a long turn can never produce a tick storm.\n * - `nextFireAt` is ALWAYS recomputed from `now`, never from the stale due time, so all\n * occurrences missed during sleep collapse into exactly one catch-up tick.\n * - 7-day expiry from `createdAt` is checked at arm, fire, re-entry and restore, is never\n * extended by a new wakeup, and no tick fires at or after it.\n * - At most {@link MAX_ACTIVE_LOOPS} active loops; a further creation returns a typed\n * rejection and leaves existing loops armed.\n * - A dispatched-tick budget (default {@link DEFAULT_MAX_TICKS}) ends the loop with\n * `tick_budget_exhausted` so a forgotten fast loop cannot spend without bound.\n * - Keepalive is a two-strike device on dynamic loops only, and a user abort PAUSES a\n * loop instead of ending it (and is never counted as a keepalive omission).\n * - Shutdown SUSPENDS: every senpi shutdown reason leaves the session resumable, so there\n * is deliberately no `session_closed` terminal reason.\n * - A provider/turn error is never terminal.\n */\n\nimport type {\n\tCronEntry,\n\tDeliveryId,\n\tDynamicCronEntry,\n\tEffectiveInterval,\n\tEpochMs,\n\tFixedCronEntry,\n\tLoopEndReason,\n\tLoopEntryFields,\n\tLoopId,\n\tLoopPayload,\n\tLoopState,\n\tPendingWakeup,\n\tRequestedInterval,\n\tWakeupId,\n} from \"./types.ts\";\nimport { LOOP_STATE_VERSION } from \"./types.ts\";\n\n/** Absolute lifetime of a loop, measured from `createdAt`. */\nexport const LOOP_EXPIRY_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Hard cap on simultaneously active loops per session. */\nexport const MAX_ACTIVE_LOOPS = 5;\n\n/** Fallback wakeup length when a dynamic iteration forgets to reschedule. */\nexport const DEFAULT_KEEPALIVE_SECONDS = 1200;\nexport const MIN_KEEPALIVE_SECONDS = 60;\nexport const MAX_KEEPALIVE_SECONDS = 3600;\nexport const KEEPALIVE_SECONDS_ENV = \"SENPI_LOOP_KEEPALIVE_SECONDS\";\n\n/** Dispatched-tick budget per loop. */\nexport const DEFAULT_MAX_TICKS = 2000;\nexport const MIN_MAX_TICKS = 1;\nexport const MAX_TICKS_ENV = \"SENPI_LOOP_MAX_TICKS\";\n\nexport interface LoopClock {\n\tnow(): EpochMs;\n}\n\n/**\n * Owns the ONE live timeout per loop. Implementations must apply the generation-counter\n * discipline of `cache-keepalive/index.ts`: re-arming a key replaces its previous\n * callback, and a cancelled callback must never run.\n */\nexport interface LoopTimerPort {\n\tarm(key: string, dueAt: EpochMs, callback: () => void): void;\n\tcancel(key: string): void;\n\tcancelAll(): void;\n}\n\nexport interface LoopIdFactory {\n\tloopId(): LoopId;\n\twakeupId(): WakeupId;\n\tdeliveryId(): DeliveryId;\n}\n\nexport interface LoopSchedulerDeps {\n\treadonly sessionId: string;\n\treadonly clock: LoopClock;\n\treadonly timers: LoopTimerPort;\n\treadonly ids: LoopIdFactory;\n\t/** Defaults to `process.env`; injected so tests never mutate the real environment. */\n\treadonly env?: Record<string, string | undefined>;\n\t/** Previously persisted state, e.g. on session start. */\n\treadonly initialState?: LoopState;\n\t/** Called after every state revision so the caller can persist it. */\n\treadonly onStateChanged?: (state: LoopState) => void;\n\t/**\n\t * Invoked when an armed timer fires. The owner is expected to run the due decision AND its\n\t * side effects (persist + dispatch). Without it the scheduler only advances its own state,\n\t * which would deliver a loop's first tick and then silently never recur.\n\t */\n\treadonly onFire?: (loopId: LoopId) => void;\n}\n\nexport interface CreateFixedRequest {\n\treadonly originalArgs: string;\n\treadonly reentryPrompt: string;\n\treadonly payload: LoopPayload;\n\treadonly requestedInterval: RequestedInterval;\n\treadonly effectiveInterval: EffectiveInterval;\n\treadonly cronExpression: string;\n\treadonly intervalMs: number;\n}\n\nexport interface CreateDynamicRequest {\n\treadonly originalArgs: string;\n\treadonly reentryPrompt: string;\n\treadonly payload: LoopPayload;\n}\n\n/** One dispatchable delivery. The caller turns this into a message; ticks never steer. */\nexport interface LoopTick {\n\treadonly loopId: LoopId;\n\treadonly deliveryId: DeliveryId;\n\t/** Occurrence this delivery represents; equal to the `now` it was decided at. */\n\treadonly scheduledForAt: EpochMs;\n\treadonly deliverAs: \"followUp\";\n\t/** True when this delivery drains a coalesced or recovered occurrence. */\n\treadonly coalesced: boolean;\n}\n\nexport type CreateRejectionReason = \"active_loop_cap\";\n\nexport type CreateResult =\n\t| { readonly ok: true; readonly loopId: LoopId; readonly supersededLoopId?: LoopId }\n\t| {\n\t\t\treadonly ok: false;\n\t\t\treadonly reason: CreateRejectionReason;\n\t\t\treadonly cap: number;\n\t\t\treadonly activeLoopIds: readonly LoopId[];\n\t\t\treadonly message: string;\n\t };\n\nexport type DueResult =\n\t| { readonly action: \"dispatch\"; readonly tick: LoopTick }\n\t| { readonly action: \"coalesce\" }\n\t| { readonly action: \"expire\" };\n\nexport type TickOutcome = \"completed\" | \"error\" | \"retrying\";\n\nexport interface TickSettledInput {\n\treadonly loopId: LoopId;\n\treadonly deliveryId: DeliveryId;\n\treadonly outcome: TickOutcome;\n}\n\nexport type SettledResult =\n\t| { readonly action: \"dispatch\"; readonly tick: LoopTick }\n\t| { readonly action: \"coalesce\" }\n\t| { readonly action: \"expire\" }\n\t| { readonly action: \"idle\" }\n\t| { readonly action: \"in_progress\" }\n\t| { readonly action: \"ended\"; readonly endReason: LoopEndReason }\n\t| { readonly action: \"ignored\" };\n\nexport interface ScheduleWakeupInput {\n\treadonly loopId: LoopId;\n\t/** Already clamped to `[60, 3600]` by the tool executor. */\n\treadonly delaySeconds: number;\n\treadonly requestedDelaySeconds: number;\n\treadonly reason: string;\n\treadonly prompt: string;\n\treadonly noop: boolean;\n}\n\nexport type ScheduleWakeupResult =\n\t| {\n\t\t\treadonly ok: true;\n\t\t\treadonly wakeupId: WakeupId;\n\t\t\treadonly replacedWakeupId?: WakeupId;\n\t\t\treadonly dueAt: EpochMs;\n\t\t\treadonly noopStreak: number;\n\t }\n\t| { readonly ok: false; readonly reason: \"unknown_loop\" | \"not_dynamic\" | \"ended\" | \"expired\" };\n\nexport type KeepaliveResult =\n\t| {\n\t\t\treadonly action: \"keepalive_armed\";\n\t\t\treadonly wakeupId: WakeupId;\n\t\t\treadonly delaySeconds: number;\n\t\t\treadonly dueAt: EpochMs;\n\t }\n\t| { readonly action: \"ended\"; readonly endReason: \"keepalive_exhausted\" | \"expired\" }\n\t| { readonly action: \"ignored\" };\n\nexport interface AbortResult {\n\treadonly action: \"paused\" | \"ignored\";\n}\n\nexport interface TargetedResult {\n\treadonly affectedLoopIds: readonly LoopId[];\n}\n\nexport interface ShutdownResult {\n\treadonly suspendedLoopIds: readonly LoopId[];\n}\n\nexport interface RestoreOptions {\n\t/**\n\t * Loops the caller knows the user paused explicitly, which must stay paused instead of\n\t * being re-armed. `phase: \"suspended\"` alone cannot express this: shutdown suspends too,\n\t * and the persisted state has no field distinguishing the two. Omit it and every\n\t * suspended loop is treated as shutdown-suspended and re-armed, per the plan's resume\n\t * rule.\n\t */\n\treadonly userPausedLoopIds?: readonly LoopId[];\n}\n\nexport interface RestoreResult {\n\treadonly recoveryTicks: readonly LoopTick[];\n\treadonly expiredLoopIds: readonly LoopId[];\n\treadonly rearmedLoopIds: readonly LoopId[];\n\t/** Loops left paused because {@link RestoreOptions.userPausedLoopIds} named them. */\n\treadonly stillPausedLoopIds: readonly LoopId[];\n}\n\nexport interface LoopScheduler {\n\tgetState(): LoopState;\n\t/** State revisions applied so far; lets callers assert atomic multi-entry mutations. */\n\treadonly mutationCount: number;\n\t/** Effective dispatched-tick budget after the env override and the minimum of 1. */\n\treadonly maxTicks: number;\n\t/** Effective keepalive fallback length in seconds after clamping. */\n\treadonly keepaliveSeconds: number;\n\t/** Delivery id of the queued/running tick of a loop, when one is in flight. */\n\tcurrentDeliveryId(loopId: LoopId): DeliveryId | undefined;\n\tcreateFixed(request: CreateFixedRequest): CreateResult;\n\tcreateDynamic(request: CreateDynamicRequest): CreateResult;\n\tonDue(loopId: LoopId, nowMs: EpochMs, sessionBusy: boolean): DueResult;\n\tonTickSettled(input: TickSettledInput): SettledResult;\n\tonScheduleWakeup(request: ScheduleWakeupInput): ScheduleWakeupResult;\n\tonTurnEndedWithoutSchedule(loopId: LoopId): KeepaliveResult;\n\tonUserAbort(loopId: LoopId): AbortResult;\n\tpause(target: LoopId | \"all\"): TargetedResult;\n\tresume(target: LoopId | \"all\"): TargetedResult;\n\tstop(target: LoopId | \"all\", detail: string): TargetedResult;\n\tonShutdown(): ShutdownResult;\n\trestore(nowMs: EpochMs, options?: RestoreOptions): RestoreResult;\n}\n\n/** Phases in which a loop already has a delivery in flight. */\nfunction isInFlight(entry: CronEntry): boolean {\n\treturn entry.phase === \"queued\" || entry.phase === \"running\";\n}\n\nfunction isActive(entry: CronEntry): boolean {\n\treturn entry.phase !== \"ended\";\n}\n\n/** Armed means the loop wants its timer running: not ended, not paused. */\nfunction isArmable(entry: CronEntry): boolean {\n\treturn entry.phase !== \"ended\" && entry.phase !== \"suspended\";\n}\n\n/**\n * THE coalescing rule: the next occurrence is always derived from the CURRENT time, never\n * from the stale due time. That is what makes every occurrence missed during laptop sleep,\n * a long turn, or a pause collapse into exactly one catch-up tick.\n */\nfunction nextOccurrenceAfter(nowMs: EpochMs, intervalMs: number): EpochMs {\n\treturn nowMs + intervalMs;\n}\n\ntype ActivePhase = Exclude<CronEntry[\"phase\"], \"ended\">;\n\n/** Fields any loop can carry into a non-terminal transition, regardless of kind. */\ntype SharedPatch = Partial<Omit<LoopEntryFields, \"id\" | \"createdAt\" | \"expiresAt\">>;\n\n/**\n * Rebuilds an entry in a non-terminal phase, dropping any terminal fields. Spreading an\n * `ended` entry and overriding `phase` would leave `endedAt`/`endReason` behind, which the\n * `LoopLifecycle` union forbids and the store parser rejects, so every non-terminal\n * transition goes through here.\n */\nfunction withPhase(entry: CronEntry, phase: ActivePhase, patch: SharedPatch = {}): CronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn rest.kind === \"fixed\"\n\t\t? { ...rest, ...patch, kind: \"fixed\", phase }\n\t\t: { ...rest, ...patch, kind: \"dynamic\", phase };\n}\n\n/** Non-terminal transition of a fixed loop, including its recomputed next occurrence. */\nfunction fixedWithPhase(\n\tentry: FixedCronEntry,\n\tphase: ActivePhase,\n\tpatch: SharedPatch & { nextFireAt?: EpochMs } = {},\n): FixedCronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn { ...rest, ...patch, kind: \"fixed\", phase };\n}\n\n/** Non-terminal transition of a dynamic loop, including its wakeup and keepalive fields. */\nfunction dynamicWithPhase(\n\tentry: DynamicCronEntry,\n\tphase: ActivePhase,\n\tpatch: SharedPatch & { pendingWakeup?: PendingWakeup | null; keepaliveCredit?: 0 | 1 } = {},\n): DynamicCronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn { ...rest, ...patch, kind: \"dynamic\", phase };\n}\n\nfunction readIntEnv(\n\tenv: Record<string, string | undefined>,\n\tname: string,\n\tfallback: number,\n\tmin: number,\n\tmax: number,\n): number {\n\tconst raw = env[name];\n\tif (raw === undefined || raw.trim().length === 0) return fallback;\n\tconst parsed = Number(raw.trim());\n\tif (!Number.isInteger(parsed)) return fallback;\n\treturn Math.min(max, Math.max(min, parsed));\n}\n\nexport function createLoopScheduler(deps: LoopSchedulerDeps): LoopScheduler {\n\tconst env = deps.env ?? process.env;\n\tconst keepaliveSeconds = readIntEnv(\n\t\tenv,\n\t\tKEEPALIVE_SECONDS_ENV,\n\t\tDEFAULT_KEEPALIVE_SECONDS,\n\t\tMIN_KEEPALIVE_SECONDS,\n\t\tMAX_KEEPALIVE_SECONDS,\n\t);\n\tconst maxTicks = readIntEnv(env, MAX_TICKS_ENV, DEFAULT_MAX_TICKS, MIN_MAX_TICKS, Number.MAX_SAFE_INTEGER);\n\n\tlet state: LoopState = deps.initialState ?? {\n\t\tversion: LOOP_STATE_VERSION,\n\t\tsessionId: deps.sessionId,\n\t\tentries: {},\n\t\tactiveDynamicId: null,\n\t\tupdatedAt: 0,\n\t};\n\tlet mutationCount = 0;\n\n\t/** In-memory only: which delivery each loop currently has in flight. */\n\tconst inFlightDeliveries = new Map<LoopId, DeliveryId>();\n\n\t/**\n\t * Applies one atomic state revision. Every transition in this module funnels through\n\t * here, so a multi-entry change (e.g. supersede + create) is a single revision and the\n\t * persistence callback observes no intermediate state.\n\t */\n\tfunction commit(update: (entries: Record<LoopId, CronEntry>) => LoopId | null | undefined): void {\n\t\tconst entries: Record<LoopId, CronEntry> = { ...state.entries };\n\t\tconst nextDynamicId = update(entries);\n\t\tstate = {\n\t\t\tversion: LOOP_STATE_VERSION,\n\t\t\tsessionId: state.sessionId,\n\t\t\tentries,\n\t\t\tactiveDynamicId: nextDynamicId === undefined ? state.activeDynamicId : nextDynamicId,\n\t\t\tupdatedAt: deps.clock.now(),\n\t\t};\n\t\tmutationCount += 1;\n\t\tdeps.onStateChanged?.(state);\n\t}\n\n\tfunction entryOf(loopId: LoopId): CronEntry | undefined {\n\t\treturn state.entries[loopId];\n\t}\n\n\tfunction activeIds(): LoopId[] {\n\t\treturn Object.values(state.entries)\n\t\t\t.filter(isActive)\n\t\t\t.map((entry) => entry.id);\n\t}\n\n\t/** Cancels the timer and clears any pending wakeup, then marks the loop ended. */\n\tfunction endEntry(\n\t\tentries: Record<LoopId, CronEntry>,\n\t\tentry: CronEntry,\n\t\tnowMs: EpochMs,\n\t\tendReason: LoopEndReason,\n\t\tendDetail?: string,\n\t): void {\n\t\tdeps.timers.cancel(entry.id);\n\t\tinFlightDeliveries.delete(entry.id);\n\t\tconst terminal = {\n\t\t\tphase: \"ended\" as const,\n\t\t\tendedAt: nowMs,\n\t\t\tendReason,\n\t\t\t...(endDetail === undefined ? {} : { endDetail }),\n\t\t};\n\t\tentries[entry.id] =\n\t\t\tentry.kind === \"fixed\" ? { ...entry, ...terminal } : { ...entry, ...terminal, pendingWakeup: null };\n\t}\n\n\t/**\n\t * Re-arms a loop's single timer, or ends it as `expired` when the next occurrence would\n\t * land at or after expiry. Returns the reason the loop ended, if it did.\n\t */\n\tfunction armEntry(\n\t\tentries: Record<LoopId, CronEntry>,\n\t\tentry: CronEntry,\n\t\tnowMs: EpochMs,\n\t\tonFire: (loopId: LoopId) => void,\n\t): LoopEndReason | undefined {\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\treturn \"expired\";\n\t\t}\n\t\tconst dueAt = entry.kind === \"fixed\" ? entry.nextFireAt : entry.pendingWakeup?.dueAt;\n\t\tif (dueAt === undefined) {\n\t\t\tdeps.timers.cancel(entry.id);\n\t\t\treturn undefined;\n\t\t}\n\t\tif (dueAt >= entry.expiresAt) {\n\t\t\t// A tick may never fire at or after expiry, so retire the loop now rather than\n\t\t\t// arming a timer that could only produce an illegal delivery.\n\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\treturn \"expired\";\n\t\t}\n\t\tdeps.timers.arm(entry.id, dueAt, () => onFire(entry.id));\n\t\treturn undefined;\n\t}\n\n\t/** Fire callback the timer port invokes; the extension re-enters through `onDue`. */\n\tlet fireHandler: (loopId: LoopId) => void = () => {};\n\tfunction onFire(loopId: LoopId): void {\n\t\tfireHandler(loopId);\n\t}\n\n\tfunction baseFields(nowMs: EpochMs, id: LoopId, request: CreateFixedRequest | CreateDynamicRequest) {\n\t\treturn {\n\t\t\tid,\n\t\t\toriginalArgs: request.originalArgs,\n\t\t\treentryPrompt: request.reentryPrompt,\n\t\t\tpayload: request.payload,\n\t\t\tcreatedAt: nowMs,\n\t\t\tlastFiredAt: null,\n\t\t\texpiresAt: nowMs + LOOP_EXPIRY_MS,\n\t\t\tlastScheduledForAt: null,\n\t\t\tcoalescedFirePending: false,\n\t\t\tqueuedForAt: null,\n\t\t\tnoopStreak: 0,\n\t\t\ttickCount: 0,\n\t\t\tsentinelDelivery: {\n\t\t\t\tautonomousPreambleDelivered: false,\n\t\t\t\tlastLoopFileDelivered: null,\n\t\t\t\tforceFullDelivery: false,\n\t\t\t},\n\t\t\twakeSources: [],\n\t\t};\n\t}\n\n\tfunction capRejection(): CreateResult {\n\t\tconst active = activeIds();\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"active_loop_cap\",\n\t\t\tcap: MAX_ACTIVE_LOOPS,\n\t\t\tactiveLoopIds: active,\n\t\t\tmessage:\n\t\t\t\t`At most ${MAX_ACTIVE_LOOPS} loops can be active at once. Active: ${active.join(\", \")}. ` +\n\t\t\t\t\"Stop one with `/loop stop <id>` or `/loop stop all` first.\",\n\t\t};\n\t}\n\n\tfunction createFixed(request: CreateFixedRequest): CreateResult {\n\t\tif (activeIds().length >= MAX_ACTIVE_LOOPS) return capRejection();\n\t\tconst nowMs = deps.clock.now();\n\t\tconst id = deps.ids.loopId();\n\t\tcommit((entries) => {\n\t\t\tconst entry: FixedCronEntry = {\n\t\t\t\t...baseFields(nowMs, id, request),\n\t\t\t\tkind: \"fixed\",\n\t\t\t\tphase: \"waiting\",\n\t\t\t\trequestedInterval: request.requestedInterval,\n\t\t\t\teffectiveInterval: request.effectiveInterval,\n\t\t\t\tcronExpression: request.cronExpression,\n\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, request.intervalMs),\n\t\t\t\tintervalMs: request.intervalMs,\n\t\t\t};\n\t\t\tentries[id] = entry;\n\t\t\t// Arm before the caller dispatches the immediate first tick, so a failing first\n\t\t\t// turn cannot silently lose the recurring schedule.\n\t\t\tarmEntry(entries, entry, nowMs, onFire);\n\t\t\treturn undefined;\n\t\t});\n\t\treturn { ok: true, loopId: id };\n\t}\n\n\tfunction createDynamic(request: CreateDynamicRequest): CreateResult {\n\t\tconst existingDynamicId = state.activeDynamicId;\n\t\tconst existing = existingDynamicId === null ? undefined : entryOf(existingDynamicId);\n\t\tconst supersedes = existing !== undefined && isActive(existing);\n\t\t// A superseded loop frees its slot, so it must not count against the cap.\n\t\tconst activeAfterSupersede = activeIds().filter((id) => !(supersedes && id === existingDynamicId));\n\t\tif (activeAfterSupersede.length >= MAX_ACTIVE_LOOPS) return capRejection();\n\n\t\tconst nowMs = deps.clock.now();\n\t\tconst id = deps.ids.loopId();\n\t\tcommit((entries) => {\n\t\t\tif (supersedes && existing !== undefined) {\n\t\t\t\tendEntry(entries, existing, nowMs, \"stopped\", \"superseded\");\n\t\t\t}\n\t\t\tconst entry: DynamicCronEntry = {\n\t\t\t\t...baseFields(nowMs, id, request),\n\t\t\t\tkind: \"dynamic\",\n\t\t\t\tphase: \"waiting\",\n\t\t\t\tpendingWakeup: null,\n\t\t\t\tkeepaliveCredit: 1,\n\t\t\t};\n\t\t\tentries[id] = entry;\n\t\t\treturn id;\n\t\t});\n\t\treturn supersedes && existingDynamicId !== null\n\t\t\t? { ok: true, loopId: id, supersededLoopId: existingDynamicId }\n\t\t\t: { ok: true, loopId: id };\n\t}\n\n\tfunction onDue(loopId: LoopId, nowMs: EpochMs, sessionBusy: boolean): DueResult {\n\t\tconst entry = entryOf(loopId);\n\t\tif (entry === undefined) return { action: \"coalesce\" };\n\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tif (entry.phase === \"ended\") return { action: \"coalesce\" };\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"expire\" };\n\t\t}\n\t\tif (entry.phase === \"ended\" || entry.phase === \"suspended\") return { action: \"coalesce\" };\n\t\tif (entry.tickCount >= maxTicks) return { action: \"coalesce\" };\n\n\t\tif (isInFlight(entry)) {\n\t\t\t// Invariant: one queued/running tick per loop. Extra occurrences collapse into a\n\t\t\t// single pending bit and the schedule still moves forward from `now`.\n\t\t\tcommit((entries) => {\n\t\t\t\tconst coalesced =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, entry.phase, {\n\t\t\t\t\t\t\t\tcoalescedFirePending: true,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, entry.phase, { coalescedFirePending: true });\n\t\t\t\tentries[loopId] = coalesced;\n\t\t\t\tarmEntry(entries, coalesced, nowMs, onFire);\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"coalesce\" };\n\t\t}\n\n\t\tconst deliveryId = deps.ids.deliveryId();\n\t\tconst tick: LoopTick = {\n\t\t\tloopId,\n\t\t\tdeliveryId,\n\t\t\tscheduledForAt: nowMs,\n\t\t\tdeliverAs: \"followUp\",\n\t\t\tcoalesced: entry.coalescedFirePending,\n\t\t};\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst dispatched = {\n\t\t\t\tlastFiredAt: nowMs,\n\t\t\t\tlastScheduledForAt: nowMs,\n\t\t\t\tqueuedForAt: nowMs,\n\t\t\t\tcoalescedFirePending: false,\n\t\t\t\ttickCount: entry.tickCount + 1,\n\t\t\t};\n\t\t\tconst phase = sessionBusy ? (\"queued\" as const) : (\"running\" as const);\n\t\t\tconst next =\n\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t? fixedWithPhase(entry, phase, {\n\t\t\t\t\t\t\t...dispatched,\n\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t})\n\t\t\t\t\t: dynamicWithPhase(entry, phase, { ...dispatched, pendingWakeup: null });\n\t\t\tentries[loopId] = next;\n\t\t\t// A dynamic loop has no schedule of its own; its next timer comes from\n\t\t\t// schedule_wakeup or the keepalive fallback.\n\t\t\tif (next.kind === \"fixed\") {\n\t\t\t\texpired = armEntry(entries, next, nowMs, onFire) === \"expired\";\n\t\t\t} else {\n\t\t\t\tdeps.timers.cancel(loopId);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tif (!expired) inFlightDeliveries.set(loopId, deliveryId);\n\t\treturn { action: \"dispatch\", tick };\n\t}\n\n\tfunction onTickSettled(input: TickSettledInput): SettledResult {\n\t\tconst entry = entryOf(input.loopId);\n\t\tif (entry === undefined) return { action: \"ignored\" };\n\t\tif (input.outcome === \"retrying\") return { action: \"in_progress\" };\n\t\tif (inFlightDeliveries.get(input.loopId) !== input.deliveryId) return { action: \"ignored\" };\n\t\tinFlightDeliveries.delete(input.loopId);\n\t\tif (entry.phase === \"ended\") return { action: \"ignored\" };\n\t\t// A user abort already paused this loop; settling must not resurrect it.\n\t\tif (entry.phase === \"suspended\") return { action: \"idle\" };\n\n\t\tconst nowMs = deps.clock.now();\n\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"expired\" };\n\t\t}\n\n\t\tif (entry.tickCount >= maxTicks) {\n\t\t\t// The budget bounds spend, not wall clock: expiry alone would let a `/loop 1m`\n\t\t\t// job reach thousands of model turns.\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"tick_budget_exhausted\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"tick_budget_exhausted\" };\n\t\t}\n\n\t\tif (entry.coalescedFirePending) {\n\t\t\t// Exactly one delivery drains the coalesced occurrence, however many were missed.\n\t\t\tcommit((entries) => {\n\t\t\t\tentries[input.loopId] = withPhase(entry, \"waiting\", { coalescedFirePending: false, queuedForAt: null });\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn onDue(input.loopId, nowMs, false);\n\t\t}\n\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst settled = withPhase(entry, \"waiting\", { queuedForAt: null });\n\t\t\tentries[input.loopId] = settled;\n\t\t\tif (settled.kind === \"fixed\") {\n\t\t\t\texpired = armEntry(entries, settled, nowMs, onFire) === \"expired\";\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn expired ? { action: \"ended\", endReason: \"expired\" } : { action: \"idle\" };\n\t}\n\n\tfunction onScheduleWakeup(request: ScheduleWakeupInput): ScheduleWakeupResult {\n\t\tconst entry = entryOf(request.loopId);\n\t\tif (entry === undefined) return { ok: false, reason: \"unknown_loop\" };\n\t\tif (entry.kind !== \"dynamic\") return { ok: false, reason: \"not_dynamic\" };\n\t\tif (entry.phase === \"ended\") return { ok: false, reason: \"ended\" };\n\n\t\tconst nowMs = deps.clock.now();\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { ok: false, reason: \"expired\" };\n\t\t}\n\n\t\tconst wakeupId = deps.ids.wakeupId();\n\t\tconst replacedWakeupId = entry.pendingWakeup?.id;\n\t\t// Expiry is absolute: a new wakeup never extends `expiresAt`.\n\t\tconst dueAt = nowMs + request.delaySeconds * 1000;\n\t\tconst wakeup: PendingWakeup = {\n\t\t\tid: wakeupId,\n\t\t\tloopId: entry.id,\n\t\t\tkind: \"dynamic\",\n\t\t\tsource: \"model\",\n\t\t\trequestedDelaySeconds: request.requestedDelaySeconds,\n\t\t\tdelaySeconds: request.delaySeconds,\n\t\t\tdueAt,\n\t\t\treason: request.reason,\n\t\t\tprompt: request.prompt,\n\t\t\tnoop: request.noop,\n\t\t\tcreatedAt: nowMs,\n\t\t};\n\t\tconst noopStreak = request.noop ? entry.noopStreak + 1 : 0;\n\t\tcommit((entries) => {\n\t\t\tconst scheduled = dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\tqueuedForAt: null,\n\t\t\t\tpendingWakeup: wakeup,\n\t\t\t\t// A successful model schedule restores the one-omission recovery budget.\n\t\t\t\tkeepaliveCredit: 1,\n\t\t\t\tnoopStreak,\n\t\t\t});\n\t\t\tentries[entry.id] = scheduled;\n\t\t\tarmEntry(entries, scheduled, nowMs, onFire);\n\t\t\treturn undefined;\n\t\t});\n\t\treturn replacedWakeupId === undefined\n\t\t\t? { ok: true, wakeupId, dueAt, noopStreak }\n\t\t\t: { ok: true, wakeupId, replacedWakeupId, dueAt, noopStreak };\n\t}\n\n\tfunction onTurnEndedWithoutSchedule(loopId: LoopId): KeepaliveResult {\n\t\tconst entry = entryOf(loopId);\n\t\tif (entry === undefined || entry.kind !== \"dynamic\") return { action: \"ignored\" };\n\t\t// Fixed loops re-arm from their own schedule, and a paused or ended loop has no\n\t\t// liveness to protect. A user abort lands here as `suspended`, which is exactly why\n\t\t// an abort can never be converted into a keepalive omission.\n\t\tif (entry.phase === \"ended\" || entry.phase === \"suspended\") return { action: \"ignored\" };\n\n\t\tconst nowMs = deps.clock.now();\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"expired\" };\n\t\t}\n\n\t\tif (entry.keepaliveCredit === 0) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"keepalive_exhausted\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"keepalive_exhausted\" };\n\t\t}\n\n\t\tconst wakeupId = deps.ids.wakeupId();\n\t\tconst dueAt = nowMs + keepaliveSeconds * 1000;\n\t\tconst wakeup: PendingWakeup = {\n\t\t\tid: wakeupId,\n\t\t\tloopId: entry.id,\n\t\t\tkind: \"dynamic\",\n\t\t\tsource: \"keepalive\",\n\t\t\trequestedDelaySeconds: keepaliveSeconds,\n\t\t\tdelaySeconds: keepaliveSeconds,\n\t\t\tdueAt,\n\t\t\treason: \"keepalive armed (model did not reschedule)\",\n\t\t\tprompt: entry.reentryPrompt,\n\t\t\tnoop: false,\n\t\t\tcreatedAt: nowMs,\n\t\t};\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst armed = dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\tqueuedForAt: null,\n\t\t\t\tpendingWakeup: wakeup,\n\t\t\t\tkeepaliveCredit: 0,\n\t\t\t});\n\t\t\tentries[entry.id] = armed;\n\t\t\texpired = armEntry(entries, armed, nowMs, onFire) === \"expired\";\n\t\t\treturn undefined;\n\t\t});\n\t\treturn expired\n\t\t\t? { action: \"ended\", endReason: \"expired\" }\n\t\t\t: { action: \"keepalive_armed\", wakeupId, delaySeconds: keepaliveSeconds, dueAt };\n\t}\n\n\tfunction pauseEntries(ids: readonly LoopId[]): LoopId[] {\n\t\tconst affected: LoopId[] = [];\n\t\tconst pausable = ids\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && isArmable(entry));\n\t\tif (pausable.length === 0) return affected;\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of pausable) {\n\t\t\t\tdeps.timers.cancel(entry.id);\n\t\t\t\tinFlightDeliveries.delete(entry.id);\n\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn affected;\n\t}\n\n\tfunction resolveTargets(target: LoopId | \"all\"): LoopId[] {\n\t\tif (target !== \"all\") return [target];\n\t\treturn Object.values(state.entries).map((entry) => entry.id);\n\t}\n\n\tfunction pause(target: LoopId | \"all\"): TargetedResult {\n\t\treturn { affectedLoopIds: pauseEntries(resolveTargets(target)) };\n\t}\n\n\tfunction onUserAbort(loopId: LoopId): AbortResult {\n\t\t// Esc is also how a user interrupts to steer, so an abort PAUSES the loop; the\n\t\t// schedule survives for `/loop resume` and is never a terminal state.\n\t\tconst affected = pauseEntries([loopId]);\n\t\treturn { action: affected.length > 0 ? \"paused\" : \"ignored\" };\n\t}\n\n\tfunction resume(target: LoopId | \"all\"): TargetedResult {\n\t\tconst nowMs = deps.clock.now();\n\t\tconst resumable = resolveTargets(target)\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && entry.phase === \"suspended\");\n\t\tif (resumable.length === 0) return { affectedLoopIds: [] };\n\t\tconst affected: LoopId[] = [];\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of resumable) {\n\t\t\t\t// The occurrence missed while paused is not replayed: the next fire is\n\t\t\t\t// recomputed from now, exactly as after a sleep.\n\t\t\t\tconst rearmed =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tpendingWakeup:\n\t\t\t\t\t\t\t\t\tentry.pendingWakeup === null\n\t\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t\t: { ...entry.pendingWakeup, dueAt: Math.max(entry.pendingWakeup.dueAt, nowMs) },\n\t\t\t\t\t\t\t});\n\t\t\t\tentries[entry.id] = rearmed;\n\t\t\t\tarmEntry(entries, rearmed, nowMs, onFire);\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn { affectedLoopIds: affected };\n\t}\n\n\tfunction stop(target: LoopId | \"all\", detail: string): TargetedResult {\n\t\tconst nowMs = deps.clock.now();\n\t\tconst stoppable = resolveTargets(target)\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && isActive(entry));\n\t\tif (stoppable.length === 0) return { affectedLoopIds: [] };\n\t\tconst affected: LoopId[] = [];\n\t\tlet clearDynamic = false;\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of stoppable) {\n\t\t\t\tendEntry(entries, entry, nowMs, \"stopped\", detail);\n\t\t\t\tif (entry.id === state.activeDynamicId) clearDynamic = true;\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn clearDynamic ? null : undefined;\n\t\t});\n\t\treturn { affectedLoopIds: affected };\n\t}\n\n\tfunction onShutdown(): ShutdownResult {\n\t\t// Every senpi shutdown reason (quit|reload|new|resume|fork) leaves the session\n\t\t// resumable, so shutdown SUSPENDS and emits no terminal reason.\n\t\tconst suspendable = Object.values(state.entries).filter(isArmable);\n\t\tdeps.timers.cancelAll();\n\t\tif (suspendable.length === 0) return { suspendedLoopIds: [] };\n\t\tconst suspended: LoopId[] = [];\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of suspendable) {\n\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\tsuspended.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tinFlightDeliveries.clear();\n\t\treturn { suspendedLoopIds: suspended };\n\t}\n\n\tfunction restore(nowMs: EpochMs, options: RestoreOptions = {}): RestoreResult {\n\t\tconst recoveryTicks: LoopTick[] = [];\n\t\tconst expiredLoopIds: LoopId[] = [];\n\t\tconst rearmedLoopIds: LoopId[] = [];\n\t\tconst stillPausedLoopIds: LoopId[] = [];\n\t\tconst userPaused = new Set(options.userPausedLoopIds ?? []);\n\t\t// A delivery this process still has in flight is NOT a crash remnant; only state\n\t\t// whose owning process is gone needs recovering.\n\t\tconst liveDeliveries = new Set(inFlightDeliveries.keys());\n\t\tdeps.timers.cancelAll();\n\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of Object.values(state.entries)) {\n\t\t\t\tif (entry.phase === \"ended\") continue;\n\t\t\t\t// A delivery this process still owns is in flight, not a crash remnant: leave it\n\t\t\t\t// alone so restore can never duplicate a tick that is already running.\n\t\t\t\tif (liveDeliveries.has(entry.id)) continue;\n\t\t\t\tif (userPaused.has(entry.id)) {\n\t\t\t\t\t// An explicit `/loop pause` outlives a restart: no timer, no recovery tick.\n\t\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\t\tstillPausedLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nowMs >= entry.expiresAt) {\n\t\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\t\texpiredLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// A crashed `starting`/`queued`/`running` remnant, a pending coalesced fire, and\n\t\t\t\t// an overdue occurrence all collapse into ONE recovery delivery per job.\n\t\t\t\tconst dueAt = entry.kind === \"fixed\" ? entry.nextFireAt : entry.pendingWakeup?.dueAt;\n\t\t\t\tconst overdue = dueAt !== undefined && dueAt <= nowMs;\n\t\t\t\tconst crashRemnant = isInFlight(entry) || entry.phase === \"starting\";\n\t\t\t\tconst needsRecovery = (overdue || crashRemnant || entry.coalescedFirePending) && entry.tickCount < maxTicks;\n\n\t\t\t\tconst recovered =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tcoalescedFirePending: false,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tcoalescedFirePending: false,\n\t\t\t\t\t\t\t\t// The one-shot wakeup is consumed by the recovery delivery.\n\t\t\t\t\t\t\t\tpendingWakeup: overdue ? null : entry.pendingWakeup,\n\t\t\t\t\t\t\t});\n\t\t\t\tentries[entry.id] = recovered;\n\t\t\t\tconst ended = armEntry(entries, recovered, nowMs, onFire);\n\t\t\t\tif (ended === \"expired\") {\n\t\t\t\t\texpiredLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (needsRecovery) {\n\t\t\t\t\tconst deliveryId = deps.ids.deliveryId();\n\t\t\t\t\trecoveryTicks.push({\n\t\t\t\t\t\tloopId: entry.id,\n\t\t\t\t\t\tdeliveryId,\n\t\t\t\t\t\tscheduledForAt: nowMs,\n\t\t\t\t\t\tdeliverAs: \"followUp\",\n\t\t\t\t\t\tcoalesced: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\trearmedLoopIds.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Recovery deliveries count as dispatched ticks and occupy the single in-flight slot.\n\t\t// One revision for all of them, so a persisting caller never sees a partial recovery.\n\t\tif (recoveryTicks.length > 0) {\n\t\t\tcommit((entries) => {\n\t\t\t\tfor (const tick of recoveryTicks) {\n\t\t\t\t\tconst entry = entries[tick.loopId];\n\t\t\t\t\tif (entry === undefined || entry.phase === \"ended\") continue;\n\t\t\t\t\tentries[tick.loopId] = withPhase(entry, \"queued\", {\n\t\t\t\t\t\tlastFiredAt: nowMs,\n\t\t\t\t\t\tlastScheduledForAt: nowMs,\n\t\t\t\t\t\tqueuedForAt: nowMs,\n\t\t\t\t\t\ttickCount: entry.tickCount + 1,\n\t\t\t\t\t});\n\t\t\t\t\tinFlightDeliveries.set(tick.loopId, tick.deliveryId);\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t}\n\n\t\treturn { recoveryTicks, expiredLoopIds, rearmedLoopIds, stillPausedLoopIds };\n\t}\n\n\tconst scheduler: LoopScheduler = {\n\t\tgetState: () => state,\n\t\tget mutationCount() {\n\t\t\treturn mutationCount;\n\t\t},\n\t\tmaxTicks,\n\t\tkeepaliveSeconds,\n\t\tcurrentDeliveryId: (loopId) => inFlightDeliveries.get(loopId),\n\t\tcreateFixed,\n\t\tcreateDynamic,\n\t\tonDue,\n\t\tonTickSettled,\n\t\tonScheduleWakeup,\n\t\tonTurnEndedWithoutSchedule,\n\t\tonUserAbort,\n\t\tpause,\n\t\tresume,\n\t\tstop,\n\t\tonShutdown,\n\t\trestore,\n\t};\n\n\t// The timer port fires with a loop id; the due decision is always re-derived from the\n\t// clock so a stale callback cannot dispatch a tick the state machine would refuse.\n\t// When an owner supplies `onFire` it performs the whole due step (persist + dispatch), so\n\t// calling `onDue` here as well would consume the occurrence and drop the delivery.\n\tfireHandler = (loopId) => {\n\t\tconst owner = deps.onFire;\n\t\tif (owner !== undefined) {\n\t\t\towner(loopId);\n\t\t\treturn;\n\t\t}\n\t\tscheduler.onDue(loopId, deps.clock.now(), false);\n\t};\n\n\treturn scheduler;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure state machine behind the `/loop` extension.\n *\n * Everything time-related or timer-related is injected: a {@link LoopClock} supplies\n * `now`, and a {@link LoopTimerPort} owns the single armed timeout per loop. This module\n * performs NO I/O, never calls `setTimeout`/`Date.now`, and never persists anything\n * itself — the caller mirrors {@link LoopScheduler.getState} into the sidecar store. That\n * keeps every invariant below testable with a fake clock and zero real waiting.\n *\n * The load-bearing invariants:\n * - At most ONE queued or running tick per loop. A fire that lands while one is in flight\n * sets `coalescedFirePending` instead of enqueuing a second delivery, so a sleeping\n * laptop or a long turn can never produce a tick storm.\n * - `nextFireAt` is ALWAYS recomputed from `now`, never from the stale due time, so all\n * occurrences missed during sleep collapse into exactly one catch-up tick.\n * - 7-day expiry from `createdAt` is checked at arm, fire, re-entry and restore, is never\n * extended by a new wakeup, and no tick fires at or after it.\n * - At most {@link MAX_ACTIVE_LOOPS} active loops; a further creation returns a typed\n * rejection and leaves existing loops armed.\n * - A dispatched-tick budget (default {@link DEFAULT_MAX_TICKS}) ends the loop with\n * `tick_budget_exhausted` so a forgotten fast loop cannot spend without bound.\n * - Keepalive is a two-strike device on dynamic loops only, and a user abort PAUSES a\n * loop instead of ending it (and is never counted as a keepalive omission).\n * - Shutdown SUSPENDS: every senpi shutdown reason leaves the session resumable, so there\n * is deliberately no `session_closed` terminal reason.\n * - A provider/turn error is never terminal.\n */\n\nimport type {\n\tCronEntry,\n\tDeliveryId,\n\tDynamicCronEntry,\n\tEffectiveInterval,\n\tEpochMs,\n\tFixedCronEntry,\n\tLoopEndReason,\n\tLoopEntryFields,\n\tLoopId,\n\tLoopPayload,\n\tLoopState,\n\tPendingWakeup,\n\tRequestedInterval,\n\tWakeupId,\n} from \"./types.ts\";\nimport { LOOP_STATE_VERSION } from \"./types.ts\";\n\n/** Absolute lifetime of a loop, measured from `createdAt`. */\nexport const LOOP_EXPIRY_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Hard cap on simultaneously active loops per session. */\nexport const MAX_ACTIVE_LOOPS = 5;\n\n/** Fallback wakeup length when a dynamic iteration forgets to reschedule. */\nexport const DEFAULT_KEEPALIVE_SECONDS = 1200;\nexport const MIN_KEEPALIVE_SECONDS = 60;\nexport const MAX_KEEPALIVE_SECONDS = 3600;\nexport const KEEPALIVE_SECONDS_ENV = \"SENPI_LOOP_KEEPALIVE_SECONDS\";\n\n/** Dispatched-tick budget per loop. */\nexport const DEFAULT_MAX_TICKS = 2000;\nexport const MIN_MAX_TICKS = 1;\nexport const MAX_TICKS_ENV = \"SENPI_LOOP_MAX_TICKS\";\n\nexport interface LoopClock {\n\tnow(): EpochMs;\n}\n\n/**\n * Owns the ONE live timeout per loop. Implementations must apply the generation-counter\n * discipline of `cache-keepalive/index.ts`: re-arming a key replaces its previous\n * callback, and a cancelled callback must never run.\n */\nexport interface LoopTimerPort {\n\tarm(key: string, dueAt: EpochMs, callback: () => void): void;\n\tcancel(key: string): void;\n\tcancelAll(): void;\n}\n\nexport interface LoopIdFactory {\n\tloopId(): LoopId;\n\twakeupId(): WakeupId;\n\tdeliveryId(): DeliveryId;\n}\n\nexport interface LoopSchedulerDeps {\n\treadonly sessionId: string;\n\treadonly clock: LoopClock;\n\treadonly timers: LoopTimerPort;\n\treadonly ids: LoopIdFactory;\n\t/** Defaults to `process.env`; injected so tests never mutate the real environment. */\n\treadonly env?: Record<string, string | undefined>;\n\t/** Previously persisted state, e.g. on session start. */\n\treadonly initialState?: LoopState;\n\t/** Called after every state revision so the caller can persist it. */\n\treadonly onStateChanged?: (state: LoopState) => void;\n\t/**\n\t * Invoked when an armed timer fires. The owner is expected to run the due decision AND its\n\t * side effects (persist + dispatch). Without it the scheduler only advances its own state,\n\t * which would deliver a loop's first tick and then silently never recur.\n\t */\n\treadonly onFire?: (loopId: LoopId) => void;\n}\n\nexport interface CreateFixedRequest {\n\treadonly originalArgs: string;\n\treadonly reentryPrompt: string;\n\treadonly payload: LoopPayload;\n\treadonly requestedInterval: RequestedInterval;\n\treadonly effectiveInterval: EffectiveInterval;\n\treadonly cronExpression: string;\n\treadonly intervalMs: number;\n}\n\nexport interface CreateDynamicRequest {\n\treadonly originalArgs: string;\n\treadonly reentryPrompt: string;\n\treadonly payload: LoopPayload;\n}\n\n/** One dispatchable delivery. The caller turns this into a message; ticks never steer. */\nexport interface LoopTick {\n\treadonly loopId: LoopId;\n\treadonly deliveryId: DeliveryId;\n\t/** Occurrence this delivery represents; equal to the `now` it was decided at. */\n\treadonly scheduledForAt: EpochMs;\n\treadonly deliverAs: \"followUp\";\n\t/** True when this delivery drains a coalesced or recovered occurrence. */\n\treadonly coalesced: boolean;\n}\n\nexport type CreateRejectionReason = \"active_loop_cap\";\n\nexport type CreateResult =\n\t| { readonly ok: true; readonly loopId: LoopId; readonly supersededLoopId?: LoopId }\n\t| {\n\t\t\treadonly ok: false;\n\t\t\treadonly reason: CreateRejectionReason;\n\t\t\treadonly cap: number;\n\t\t\treadonly activeLoopIds: readonly LoopId[];\n\t\t\treadonly message: string;\n\t };\n\nexport type DueResult =\n\t| { readonly action: \"dispatch\"; readonly tick: LoopTick }\n\t| { readonly action: \"coalesce\" }\n\t| { readonly action: \"expire\" };\n\nexport type TickOutcome = \"completed\" | \"error\" | \"retrying\";\n\nexport interface TickSettledInput {\n\treadonly loopId: LoopId;\n\treadonly deliveryId: DeliveryId;\n\treadonly outcome: TickOutcome;\n}\n\nexport type SettledResult =\n\t| { readonly action: \"dispatch\"; readonly tick: LoopTick }\n\t| { readonly action: \"coalesce\" }\n\t| { readonly action: \"expire\" }\n\t| { readonly action: \"idle\" }\n\t| { readonly action: \"in_progress\" }\n\t| { readonly action: \"ended\"; readonly endReason: LoopEndReason }\n\t| { readonly action: \"ignored\" };\n\nexport interface ScheduleWakeupInput {\n\treadonly loopId: LoopId;\n\t/** Already clamped to `[60, 3600]` by the tool executor. */\n\treadonly delaySeconds: number;\n\treadonly requestedDelaySeconds: number;\n\treadonly reason: string;\n\treadonly prompt: string;\n\treadonly noop: boolean;\n}\n\nexport type ScheduleWakeupResult =\n\t| {\n\t\t\treadonly ok: true;\n\t\t\treadonly wakeupId: WakeupId;\n\t\t\treadonly replacedWakeupId?: WakeupId;\n\t\t\treadonly dueAt: EpochMs;\n\t\t\treadonly noopStreak: number;\n\t }\n\t| { readonly ok: false; readonly reason: \"unknown_loop\" | \"not_dynamic\" | \"ended\" | \"expired\" };\n\nexport type KeepaliveResult =\n\t| {\n\t\t\treadonly action: \"keepalive_armed\";\n\t\t\treadonly wakeupId: WakeupId;\n\t\t\treadonly delaySeconds: number;\n\t\t\treadonly dueAt: EpochMs;\n\t }\n\t| { readonly action: \"ended\"; readonly endReason: \"keepalive_exhausted\" | \"expired\" }\n\t| { readonly action: \"ignored\" };\n\nexport interface AbortResult {\n\treadonly action: \"paused\" | \"ignored\";\n}\n\nexport interface TargetedResult {\n\treadonly affectedLoopIds: readonly LoopId[];\n}\n\nexport interface ShutdownResult {\n\treadonly suspendedLoopIds: readonly LoopId[];\n}\n\nexport interface RestoreOptions {\n\t/**\n\t * Loops the caller knows the user paused explicitly, which must stay paused instead of\n\t * being re-armed. `phase: \"suspended\"` alone cannot express this: shutdown suspends too,\n\t * and the persisted state has no field distinguishing the two. Omit it and every\n\t * suspended loop is treated as shutdown-suspended and re-armed, per the plan's resume\n\t * rule.\n\t */\n\treadonly userPausedLoopIds?: readonly LoopId[];\n}\n\nexport interface RestoreResult {\n\treadonly recoveryTicks: readonly LoopTick[];\n\treadonly expiredLoopIds: readonly LoopId[];\n\treadonly rearmedLoopIds: readonly LoopId[];\n\t/** Loops left paused because {@link RestoreOptions.userPausedLoopIds} named them. */\n\treadonly stillPausedLoopIds: readonly LoopId[];\n}\n\nexport interface LoopScheduler {\n\tgetState(): LoopState;\n\t/** State revisions applied so far; lets callers assert atomic multi-entry mutations. */\n\treadonly mutationCount: number;\n\t/** Effective dispatched-tick budget after the env override and the minimum of 1. */\n\treadonly maxTicks: number;\n\t/** Effective keepalive fallback length in seconds after clamping. */\n\treadonly keepaliveSeconds: number;\n\t/** Delivery id of the queued/running tick of a loop, when one is in flight. */\n\tcurrentDeliveryId(loopId: LoopId): DeliveryId | undefined;\n\tcreateFixed(request: CreateFixedRequest): CreateResult;\n\tcreateDynamic(request: CreateDynamicRequest): CreateResult;\n\tonDue(loopId: LoopId, nowMs: EpochMs, sessionBusy: boolean): DueResult;\n\tonTickSettled(input: TickSettledInput): SettledResult;\n\tonScheduleWakeup(request: ScheduleWakeupInput): ScheduleWakeupResult;\n\tonTurnEndedWithoutSchedule(loopId: LoopId): KeepaliveResult;\n\tonUserAbort(loopId: LoopId): AbortResult;\n\tpause(target: LoopId | \"all\"): TargetedResult;\n\tresume(target: LoopId | \"all\"): TargetedResult;\n\tstop(target: LoopId | \"all\", detail: string): TargetedResult;\n\tonShutdown(): ShutdownResult;\n\trestore(nowMs: EpochMs, options?: RestoreOptions): RestoreResult;\n}\n\n/** Phases in which a loop already has a delivery in flight. */\nfunction isInFlight(entry: CronEntry): boolean {\n\treturn entry.phase === \"queued\" || entry.phase === \"running\";\n}\n\nfunction isActive(entry: CronEntry): boolean {\n\treturn entry.phase !== \"ended\";\n}\n\n/** Armed means the loop wants its timer running: not ended, not paused. */\nfunction isArmable(entry: CronEntry): boolean {\n\treturn entry.phase !== \"ended\" && entry.phase !== \"suspended\";\n}\n\n/**\n * THE coalescing rule: the next occurrence is always derived from the CURRENT time, never\n * from the stale due time. That is what makes every occurrence missed during laptop sleep,\n * a long turn, or a pause collapse into exactly one catch-up tick.\n */\nfunction nextOccurrenceAfter(nowMs: EpochMs, intervalMs: number): EpochMs {\n\treturn nowMs + intervalMs;\n}\n\ntype ActivePhase = Exclude<CronEntry[\"phase\"], \"ended\">;\n\n/** Fields any loop can carry into a non-terminal transition, regardless of kind. */\ntype SharedPatch = Partial<Omit<LoopEntryFields, \"id\" | \"createdAt\" | \"expiresAt\">>;\n\n/**\n * Rebuilds an entry in a non-terminal phase, dropping any terminal fields. Spreading an\n * `ended` entry and overriding `phase` would leave `endedAt`/`endReason` behind, which the\n * `LoopLifecycle` union forbids and the store parser rejects, so every non-terminal\n * transition goes through here.\n */\nfunction withPhase(entry: CronEntry, phase: ActivePhase, patch: SharedPatch = {}): CronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn rest.kind === \"fixed\"\n\t\t? { ...rest, ...patch, kind: \"fixed\", phase }\n\t\t: { ...rest, ...patch, kind: \"dynamic\", phase };\n}\n\n/** Non-terminal transition of a fixed loop, including its recomputed next occurrence. */\nfunction fixedWithPhase(\n\tentry: FixedCronEntry,\n\tphase: ActivePhase,\n\tpatch: SharedPatch & { nextFireAt?: EpochMs } = {},\n): FixedCronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn { ...rest, ...patch, kind: \"fixed\", phase };\n}\n\n/** Non-terminal transition of a dynamic loop, including its wakeup and keepalive fields. */\nfunction dynamicWithPhase(\n\tentry: DynamicCronEntry,\n\tphase: ActivePhase,\n\tpatch: SharedPatch & { pendingWakeup?: PendingWakeup | null; keepaliveCredit?: 0 | 1 } = {},\n): DynamicCronEntry {\n\tconst { endedAt: _endedAt, endReason: _endReason, endDetail: _endDetail, ...rest } = entry;\n\treturn { ...rest, ...patch, kind: \"dynamic\", phase };\n}\n\nfunction readIntEnv(\n\tenv: Record<string, string | undefined>,\n\tname: string,\n\tfallback: number,\n\tmin: number,\n\tmax: number,\n): number {\n\tconst raw = env[name];\n\tif (raw === undefined || raw.trim().length === 0) return fallback;\n\tconst parsed = Number(raw.trim());\n\tif (!Number.isInteger(parsed)) return fallback;\n\treturn Math.min(max, Math.max(min, parsed));\n}\n\nexport function createLoopScheduler(deps: LoopSchedulerDeps): LoopScheduler {\n\tconst env = deps.env ?? process.env;\n\tconst keepaliveSeconds = readIntEnv(\n\t\tenv,\n\t\tKEEPALIVE_SECONDS_ENV,\n\t\tDEFAULT_KEEPALIVE_SECONDS,\n\t\tMIN_KEEPALIVE_SECONDS,\n\t\tMAX_KEEPALIVE_SECONDS,\n\t);\n\tconst maxTicks = readIntEnv(env, MAX_TICKS_ENV, DEFAULT_MAX_TICKS, MIN_MAX_TICKS, Number.MAX_SAFE_INTEGER);\n\n\tlet state: LoopState = deps.initialState ?? {\n\t\tversion: LOOP_STATE_VERSION,\n\t\tsessionId: deps.sessionId,\n\t\tentries: {},\n\t\tactiveDynamicId: null,\n\t\tupdatedAt: 0,\n\t};\n\tlet mutationCount = 0;\n\n\t/** In-memory only: which delivery each loop currently has in flight. */\n\tconst inFlightDeliveries = new Map<LoopId, DeliveryId>();\n\n\t/**\n\t * Applies one atomic state revision. Every transition in this module funnels through\n\t * here, so a multi-entry change (e.g. supersede + create) is a single revision and the\n\t * persistence callback observes no intermediate state.\n\t */\n\tfunction commit(update: (entries: Record<LoopId, CronEntry>) => LoopId | null | undefined): void {\n\t\tconst entries: Record<LoopId, CronEntry> = { ...state.entries };\n\t\tconst nextDynamicId = update(entries);\n\t\tstate = {\n\t\t\tversion: LOOP_STATE_VERSION,\n\t\t\tsessionId: state.sessionId,\n\t\t\tentries,\n\t\t\tactiveDynamicId: nextDynamicId === undefined ? state.activeDynamicId : nextDynamicId,\n\t\t\tupdatedAt: deps.clock.now(),\n\t\t};\n\t\tmutationCount += 1;\n\t\tdeps.onStateChanged?.(state);\n\t}\n\n\tfunction entryOf(loopId: LoopId): CronEntry | undefined {\n\t\treturn state.entries[loopId];\n\t}\n\n\tfunction activeIds(): LoopId[] {\n\t\treturn Object.values(state.entries)\n\t\t\t.filter(isActive)\n\t\t\t.map((entry) => entry.id);\n\t}\n\n\t/** Cancels the timer and clears any pending wakeup, then marks the loop ended. */\n\tfunction endEntry(\n\t\tentries: Record<LoopId, CronEntry>,\n\t\tentry: CronEntry,\n\t\tnowMs: EpochMs,\n\t\tendReason: LoopEndReason,\n\t\tendDetail?: string,\n\t): void {\n\t\tdeps.timers.cancel(entry.id);\n\t\tinFlightDeliveries.delete(entry.id);\n\t\tconst terminal = {\n\t\t\tphase: \"ended\" as const,\n\t\t\tendedAt: nowMs,\n\t\t\tendReason,\n\t\t\t...(endDetail === undefined ? {} : { endDetail }),\n\t\t};\n\t\tentries[entry.id] =\n\t\t\tentry.kind === \"fixed\" ? { ...entry, ...terminal } : { ...entry, ...terminal, pendingWakeup: null };\n\t}\n\n\t/**\n\t * Re-arms a loop's single timer, or ends it as `expired` when the next occurrence would\n\t * land at or after expiry. Returns the reason the loop ended, if it did.\n\t */\n\tfunction armEntry(\n\t\tentries: Record<LoopId, CronEntry>,\n\t\tentry: CronEntry,\n\t\tnowMs: EpochMs,\n\t\tonFire: (loopId: LoopId) => void,\n\t): LoopEndReason | undefined {\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\treturn \"expired\";\n\t\t}\n\t\tconst dueAt = entry.kind === \"fixed\" ? entry.nextFireAt : entry.pendingWakeup?.dueAt;\n\t\tif (dueAt === undefined) {\n\t\t\tdeps.timers.cancel(entry.id);\n\t\t\treturn undefined;\n\t\t}\n\t\tif (dueAt >= entry.expiresAt) {\n\t\t\t// A tick may never fire at or after expiry, so retire the loop now rather than\n\t\t\t// arming a timer that could only produce an illegal delivery.\n\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\treturn \"expired\";\n\t\t}\n\t\tdeps.timers.arm(entry.id, dueAt, () => onFire(entry.id));\n\t\treturn undefined;\n\t}\n\n\t/** Fire callback the timer port invokes; the extension re-enters through `onDue`. */\n\tlet fireHandler: (loopId: LoopId) => void = () => {};\n\tfunction onFire(loopId: LoopId): void {\n\t\tfireHandler(loopId);\n\t}\n\n\tfunction baseFields(nowMs: EpochMs, id: LoopId, request: CreateFixedRequest | CreateDynamicRequest) {\n\t\treturn {\n\t\t\tid,\n\t\t\toriginalArgs: request.originalArgs,\n\t\t\treentryPrompt: request.reentryPrompt,\n\t\t\tpayload: request.payload,\n\t\t\tcreatedAt: nowMs,\n\t\t\tlastFiredAt: null,\n\t\t\texpiresAt: nowMs + LOOP_EXPIRY_MS,\n\t\t\tlastScheduledForAt: null,\n\t\t\tcoalescedFirePending: false,\n\t\t\tqueuedForAt: null,\n\t\t\tnoopStreak: 0,\n\t\t\ttickCount: 0,\n\t\t\tsentinelDelivery: {\n\t\t\t\tautonomousPreambleDelivered: false,\n\t\t\t\tlastLoopFileDelivered: null,\n\t\t\t\tforceFullDelivery: false,\n\t\t\t},\n\t\t\twakeSources: [],\n\t\t};\n\t}\n\n\tfunction capRejection(): CreateResult {\n\t\tconst active = activeIds();\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"active_loop_cap\",\n\t\t\tcap: MAX_ACTIVE_LOOPS,\n\t\t\tactiveLoopIds: active,\n\t\t\tmessage:\n\t\t\t\t`At most ${MAX_ACTIVE_LOOPS} loops can be active at once. Active: ${active.join(\", \")}. ` +\n\t\t\t\t\"Stop one with `/loop stop <id>` or `/loop stop all` first.\",\n\t\t};\n\t}\n\n\tfunction createFixed(request: CreateFixedRequest): CreateResult {\n\t\tif (activeIds().length >= MAX_ACTIVE_LOOPS) return capRejection();\n\t\tconst nowMs = deps.clock.now();\n\t\tconst id = deps.ids.loopId();\n\t\tcommit((entries) => {\n\t\t\tconst entry: FixedCronEntry = {\n\t\t\t\t...baseFields(nowMs, id, request),\n\t\t\t\tkind: \"fixed\",\n\t\t\t\tphase: \"waiting\",\n\t\t\t\trequestedInterval: request.requestedInterval,\n\t\t\t\teffectiveInterval: request.effectiveInterval,\n\t\t\t\tcronExpression: request.cronExpression,\n\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, request.intervalMs),\n\t\t\t\tintervalMs: request.intervalMs,\n\t\t\t};\n\t\t\tentries[id] = entry;\n\t\t\t// Arm before the caller dispatches the immediate first tick, so a failing first\n\t\t\t// turn cannot silently lose the recurring schedule.\n\t\t\tarmEntry(entries, entry, nowMs, onFire);\n\t\t\treturn undefined;\n\t\t});\n\t\treturn { ok: true, loopId: id };\n\t}\n\n\tfunction createDynamic(request: CreateDynamicRequest): CreateResult {\n\t\tconst existingDynamicId = state.activeDynamicId;\n\t\tconst existing = existingDynamicId === null ? undefined : entryOf(existingDynamicId);\n\t\tconst supersedes = existing !== undefined && isActive(existing);\n\t\t// A superseded loop frees its slot, so it must not count against the cap.\n\t\tconst activeAfterSupersede = activeIds().filter((id) => !(supersedes && id === existingDynamicId));\n\t\tif (activeAfterSupersede.length >= MAX_ACTIVE_LOOPS) return capRejection();\n\n\t\tconst nowMs = deps.clock.now();\n\t\tconst id = deps.ids.loopId();\n\t\tcommit((entries) => {\n\t\t\tif (supersedes && existing !== undefined) {\n\t\t\t\tendEntry(entries, existing, nowMs, \"stopped\", \"superseded\");\n\t\t\t}\n\t\t\tconst entry: DynamicCronEntry = {\n\t\t\t\t...baseFields(nowMs, id, request),\n\t\t\t\tkind: \"dynamic\",\n\t\t\t\tphase: \"waiting\",\n\t\t\t\tpendingWakeup: null,\n\t\t\t\tkeepaliveCredit: 1,\n\t\t\t};\n\t\t\tentries[id] = entry;\n\t\t\treturn id;\n\t\t});\n\t\treturn supersedes && existingDynamicId !== null\n\t\t\t? { ok: true, loopId: id, supersededLoopId: existingDynamicId }\n\t\t\t: { ok: true, loopId: id };\n\t}\n\n\tfunction onDue(loopId: LoopId, nowMs: EpochMs, sessionBusy: boolean): DueResult {\n\t\tconst entry = entryOf(loopId);\n\t\tif (entry === undefined) return { action: \"coalesce\" };\n\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tif (entry.phase === \"ended\") return { action: \"coalesce\" };\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"expire\" };\n\t\t}\n\t\tif (entry.phase === \"ended\" || entry.phase === \"suspended\") return { action: \"coalesce\" };\n\t\tif (entry.tickCount >= maxTicks) return { action: \"coalesce\" };\n\n\t\tif (isInFlight(entry)) {\n\t\t\t// Invariant: one queued/running tick per loop. Extra occurrences collapse into a\n\t\t\t// single pending bit and the schedule still moves forward from `now`.\n\t\t\tcommit((entries) => {\n\t\t\t\tconst coalesced =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, entry.phase, {\n\t\t\t\t\t\t\t\tcoalescedFirePending: true,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, entry.phase, { coalescedFirePending: true });\n\t\t\t\tentries[loopId] = coalesced;\n\t\t\t\tarmEntry(entries, coalesced, nowMs, onFire);\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"coalesce\" };\n\t\t}\n\n\t\tconst deliveryId = deps.ids.deliveryId();\n\t\tconst tick: LoopTick = {\n\t\t\tloopId,\n\t\t\tdeliveryId,\n\t\t\tscheduledForAt: nowMs,\n\t\t\tdeliverAs: \"followUp\",\n\t\t\tcoalesced: entry.coalescedFirePending,\n\t\t};\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst dispatched = {\n\t\t\t\tlastFiredAt: nowMs,\n\t\t\t\tlastScheduledForAt: nowMs,\n\t\t\t\tqueuedForAt: nowMs,\n\t\t\t\tcoalescedFirePending: false,\n\t\t\t\ttickCount: entry.tickCount + 1,\n\t\t\t};\n\t\t\tconst phase = sessionBusy ? (\"queued\" as const) : (\"running\" as const);\n\t\t\tconst next =\n\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t? fixedWithPhase(entry, phase, {\n\t\t\t\t\t\t\t...dispatched,\n\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t})\n\t\t\t\t\t: dynamicWithPhase(entry, phase, { ...dispatched, pendingWakeup: null });\n\t\t\tentries[loopId] = next;\n\t\t\t// A dynamic loop has no schedule of its own; its next timer comes from\n\t\t\t// schedule_wakeup or the keepalive fallback.\n\t\t\tif (next.kind === \"fixed\") {\n\t\t\t\texpired = armEntry(entries, next, nowMs, onFire) === \"expired\";\n\t\t\t} else {\n\t\t\t\tdeps.timers.cancel(loopId);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tif (!expired) inFlightDeliveries.set(loopId, deliveryId);\n\t\treturn { action: \"dispatch\", tick };\n\t}\n\n\tfunction onTickSettled(input: TickSettledInput): SettledResult {\n\t\tconst entry = entryOf(input.loopId);\n\t\tif (entry === undefined) return { action: \"ignored\" };\n\t\tif (input.outcome === \"retrying\") return { action: \"in_progress\" };\n\t\tif (inFlightDeliveries.get(input.loopId) !== input.deliveryId) return { action: \"ignored\" };\n\t\tinFlightDeliveries.delete(input.loopId);\n\t\tif (entry.phase === \"ended\") return { action: \"ignored\" };\n\t\t// A user abort already paused this loop; settling must not resurrect it.\n\t\tif (entry.phase === \"suspended\") return { action: \"idle\" };\n\n\t\tconst nowMs = deps.clock.now();\n\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"expired\" };\n\t\t}\n\n\t\tif (entry.tickCount >= maxTicks) {\n\t\t\t// The budget bounds spend, not wall clock: expiry alone would let a `/loop 1m`\n\t\t\t// job reach thousands of model turns.\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"tick_budget_exhausted\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"tick_budget_exhausted\" };\n\t\t}\n\n\t\tif (entry.coalescedFirePending) {\n\t\t\t// Exactly one delivery drains the coalesced occurrence, however many were missed.\n\t\t\tcommit((entries) => {\n\t\t\t\tentries[input.loopId] = withPhase(entry, \"waiting\", { coalescedFirePending: false, queuedForAt: null });\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn onDue(input.loopId, nowMs, false);\n\t\t}\n\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst settled = withPhase(entry, \"waiting\", { queuedForAt: null });\n\t\t\tentries[input.loopId] = settled;\n\t\t\tif (settled.kind === \"fixed\") {\n\t\t\t\texpired = armEntry(entries, settled, nowMs, onFire) === \"expired\";\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn expired ? { action: \"ended\", endReason: \"expired\" } : { action: \"idle\" };\n\t}\n\n\tfunction onScheduleWakeup(request: ScheduleWakeupInput): ScheduleWakeupResult {\n\t\tconst entry = entryOf(request.loopId);\n\t\tif (entry === undefined) return { ok: false, reason: \"unknown_loop\" };\n\t\tif (entry.kind !== \"dynamic\") return { ok: false, reason: \"not_dynamic\" };\n\t\tif (entry.phase === \"ended\") return { ok: false, reason: \"ended\" };\n\n\t\tconst nowMs = deps.clock.now();\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { ok: false, reason: \"expired\" };\n\t\t}\n\n\t\tconst wakeupId = deps.ids.wakeupId();\n\t\tconst replacedWakeupId = entry.pendingWakeup?.id;\n\t\t// Expiry is absolute: a new wakeup never extends `expiresAt`.\n\t\tconst dueAt = nowMs + request.delaySeconds * 1000;\n\t\tconst wakeup: PendingWakeup = {\n\t\t\tid: wakeupId,\n\t\t\tloopId: entry.id,\n\t\t\tkind: \"dynamic\",\n\t\t\tsource: \"model\",\n\t\t\trequestedDelaySeconds: request.requestedDelaySeconds,\n\t\t\tdelaySeconds: request.delaySeconds,\n\t\t\tdueAt,\n\t\t\treason: request.reason,\n\t\t\tprompt: request.prompt,\n\t\t\tnoop: request.noop,\n\t\t\tcreatedAt: nowMs,\n\t\t};\n\t\tconst noopStreak = request.noop ? entry.noopStreak + 1 : 0;\n\t\tcommit((entries) => {\n\t\t\tconst scheduled = dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\tqueuedForAt: null,\n\t\t\t\tpendingWakeup: wakeup,\n\t\t\t\t// A successful model schedule restores the one-omission recovery budget.\n\t\t\t\tkeepaliveCredit: 1,\n\t\t\t\tnoopStreak,\n\t\t\t});\n\t\t\tentries[entry.id] = scheduled;\n\t\t\tarmEntry(entries, scheduled, nowMs, onFire);\n\t\t\treturn undefined;\n\t\t});\n\t\treturn replacedWakeupId === undefined\n\t\t\t? { ok: true, wakeupId, dueAt, noopStreak }\n\t\t\t: { ok: true, wakeupId, replacedWakeupId, dueAt, noopStreak };\n\t}\n\n\tfunction onTurnEndedWithoutSchedule(loopId: LoopId): KeepaliveResult {\n\t\tconst entry = entryOf(loopId);\n\t\tif (entry === undefined || entry.kind !== \"dynamic\") return { action: \"ignored\" };\n\t\t// Fixed loops re-arm from their own schedule, and a paused or ended loop has no\n\t\t// liveness to protect. A user abort lands here as `suspended`, which is exactly why\n\t\t// an abort can never be converted into a keepalive omission.\n\t\tif (entry.phase === \"ended\" || entry.phase === \"suspended\") return { action: \"ignored\" };\n\n\t\tconst nowMs = deps.clock.now();\n\t\tif (nowMs >= entry.expiresAt) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"expired\" };\n\t\t}\n\n\t\tif (entry.keepaliveCredit === 0) {\n\t\t\tcommit((entries) => {\n\t\t\t\tendEntry(entries, entry, nowMs, \"keepalive_exhausted\");\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\treturn { action: \"ended\", endReason: \"keepalive_exhausted\" };\n\t\t}\n\n\t\tconst wakeupId = deps.ids.wakeupId();\n\t\tconst dueAt = nowMs + keepaliveSeconds * 1000;\n\t\tconst wakeup: PendingWakeup = {\n\t\t\tid: wakeupId,\n\t\t\tloopId: entry.id,\n\t\t\tkind: \"dynamic\",\n\t\t\tsource: \"keepalive\",\n\t\t\trequestedDelaySeconds: keepaliveSeconds,\n\t\t\tdelaySeconds: keepaliveSeconds,\n\t\t\tdueAt,\n\t\t\treason: \"keepalive armed (model did not reschedule)\",\n\t\t\tprompt: entry.reentryPrompt,\n\t\t\tnoop: false,\n\t\t\tcreatedAt: nowMs,\n\t\t};\n\t\tlet expired = false;\n\t\tcommit((entries) => {\n\t\t\tconst armed = dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\tqueuedForAt: null,\n\t\t\t\tpendingWakeup: wakeup,\n\t\t\t\tkeepaliveCredit: 0,\n\t\t\t});\n\t\t\tentries[entry.id] = armed;\n\t\t\texpired = armEntry(entries, armed, nowMs, onFire) === \"expired\";\n\t\t\treturn undefined;\n\t\t});\n\t\treturn expired\n\t\t\t? { action: \"ended\", endReason: \"expired\" }\n\t\t\t: { action: \"keepalive_armed\", wakeupId, delaySeconds: keepaliveSeconds, dueAt };\n\t}\n\n\tfunction pauseEntries(ids: readonly LoopId[]): LoopId[] {\n\t\tconst affected: LoopId[] = [];\n\t\tconst pausable = ids\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && isArmable(entry));\n\t\tif (pausable.length === 0) return affected;\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of pausable) {\n\t\t\t\tdeps.timers.cancel(entry.id);\n\t\t\t\tinFlightDeliveries.delete(entry.id);\n\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn affected;\n\t}\n\n\tfunction resolveTargets(target: LoopId | \"all\"): LoopId[] {\n\t\tif (target !== \"all\") return [target];\n\t\treturn Object.values(state.entries).map((entry) => entry.id);\n\t}\n\n\tfunction pause(target: LoopId | \"all\"): TargetedResult {\n\t\treturn { affectedLoopIds: pauseEntries(resolveTargets(target)) };\n\t}\n\n\tfunction onUserAbort(loopId: LoopId): AbortResult {\n\t\t// Esc is also how a user interrupts to steer, so an abort PAUSES the loop; the\n\t\t// schedule survives for `/loop resume` and is never a terminal state.\n\t\tconst affected = pauseEntries([loopId]);\n\t\treturn { action: affected.length > 0 ? \"paused\" : \"ignored\" };\n\t}\n\n\tfunction resume(target: LoopId | \"all\"): TargetedResult {\n\t\tconst nowMs = deps.clock.now();\n\t\tconst resumable = resolveTargets(target)\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && entry.phase === \"suspended\");\n\t\tif (resumable.length === 0) return { affectedLoopIds: [] };\n\t\tconst affected: LoopId[] = [];\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of resumable) {\n\t\t\t\t// The occurrence missed while paused is not replayed: the next fire is\n\t\t\t\t// recomputed from now, exactly as after a sleep.\n\t\t\t\tconst rearmed =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tpendingWakeup:\n\t\t\t\t\t\t\t\t\tentry.pendingWakeup === null\n\t\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t\t: { ...entry.pendingWakeup, dueAt: Math.max(entry.pendingWakeup.dueAt, nowMs) },\n\t\t\t\t\t\t\t});\n\t\t\t\tentries[entry.id] = rearmed;\n\t\t\t\tarmEntry(entries, rearmed, nowMs, onFire);\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\treturn { affectedLoopIds: affected };\n\t}\n\n\tfunction stop(target: LoopId | \"all\", detail: string): TargetedResult {\n\t\tconst nowMs = deps.clock.now();\n\t\tconst stoppable = resolveTargets(target)\n\t\t\t.map((id) => entryOf(id))\n\t\t\t.filter((entry): entry is CronEntry => entry !== undefined && isActive(entry));\n\t\tif (stoppable.length === 0) return { affectedLoopIds: [] };\n\t\tconst affected: LoopId[] = [];\n\t\tlet clearDynamic = false;\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of stoppable) {\n\t\t\t\tendEntry(entries, entry, nowMs, \"stopped\", detail);\n\t\t\t\tif (entry.id === state.activeDynamicId) clearDynamic = true;\n\t\t\t\taffected.push(entry.id);\n\t\t\t}\n\t\t\treturn clearDynamic ? null : undefined;\n\t\t});\n\t\treturn { affectedLoopIds: affected };\n\t}\n\n\tfunction onShutdown(): ShutdownResult {\n\t\t// Every senpi shutdown reason (quit|reload|new|resume|fork) leaves the session\n\t\t// resumable, so shutdown SUSPENDS and emits no terminal reason.\n\t\tconst suspendable = Object.values(state.entries).filter(isArmable);\n\t\tdeps.timers.cancelAll();\n\t\tif (suspendable.length === 0) return { suspendedLoopIds: [] };\n\t\tconst suspended: LoopId[] = [];\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of suspendable) {\n\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\tsuspended.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tinFlightDeliveries.clear();\n\t\treturn { suspendedLoopIds: suspended };\n\t}\n\n\tfunction restore(nowMs: EpochMs, options: RestoreOptions = {}): RestoreResult {\n\t\tconst recoveryTicks: LoopTick[] = [];\n\t\tconst expiredLoopIds: LoopId[] = [];\n\t\tconst rearmedLoopIds: LoopId[] = [];\n\t\tconst stillPausedLoopIds: LoopId[] = [];\n\t\tconst userPaused = new Set(options.userPausedLoopIds ?? []);\n\t\t// A delivery this process still has in flight is NOT a crash remnant; only state\n\t\t// whose owning process is gone needs recovering.\n\t\tconst liveDeliveries = new Set(inFlightDeliveries.keys());\n\t\tdeps.timers.cancelAll();\n\n\t\tcommit((entries) => {\n\t\t\tfor (const entry of Object.values(state.entries)) {\n\t\t\t\tif (entry.phase === \"ended\") continue;\n\t\t\t\t// A delivery this process still owns is in flight, not a crash remnant: leave it\n\t\t\t\t// alone so restore can never duplicate a tick that is already running.\n\t\t\t\tif (liveDeliveries.has(entry.id)) continue;\n\t\t\t\tif (userPaused.has(entry.id)) {\n\t\t\t\t\t// An explicit `/loop pause` outlives a restart: no timer, no recovery tick.\n\t\t\t\t\tentries[entry.id] = withPhase(entry, \"suspended\", { queuedForAt: null });\n\t\t\t\t\tstillPausedLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nowMs >= entry.expiresAt) {\n\t\t\t\t\tendEntry(entries, entry, nowMs, \"expired\");\n\t\t\t\t\texpiredLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// A crashed `starting`/`queued`/`running` remnant, a pending coalesced fire, and\n\t\t\t\t// an overdue occurrence all collapse into ONE recovery delivery per job.\n\t\t\t\tconst dueAt = entry.kind === \"fixed\" ? entry.nextFireAt : entry.pendingWakeup?.dueAt;\n\t\t\t\tconst overdue = dueAt !== undefined && dueAt <= nowMs;\n\t\t\t\tconst crashRemnant = isInFlight(entry) || entry.phase === \"starting\";\n\t\t\t\tconst needsRecovery = (overdue || crashRemnant || entry.coalescedFirePending) && entry.tickCount < maxTicks;\n\n\t\t\t\tconst recovered =\n\t\t\t\t\tentry.kind === \"fixed\"\n\t\t\t\t\t\t? fixedWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tcoalescedFirePending: false,\n\t\t\t\t\t\t\t\tnextFireAt: nextOccurrenceAfter(nowMs, entry.intervalMs),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: dynamicWithPhase(entry, \"waiting\", {\n\t\t\t\t\t\t\t\tqueuedForAt: null,\n\t\t\t\t\t\t\t\tcoalescedFirePending: false,\n\t\t\t\t\t\t\t\t// The one-shot wakeup is consumed by the recovery delivery.\n\t\t\t\t\t\t\t\tpendingWakeup: overdue ? null : entry.pendingWakeup,\n\t\t\t\t\t\t\t});\n\t\t\t\tentries[entry.id] = recovered;\n\t\t\t\tconst ended = armEntry(entries, recovered, nowMs, onFire);\n\t\t\t\tif (ended === \"expired\") {\n\t\t\t\t\texpiredLoopIds.push(entry.id);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (needsRecovery) {\n\t\t\t\t\tconst deliveryId = deps.ids.deliveryId();\n\t\t\t\t\trecoveryTicks.push({\n\t\t\t\t\t\tloopId: entry.id,\n\t\t\t\t\t\tdeliveryId,\n\t\t\t\t\t\tscheduledForAt: nowMs,\n\t\t\t\t\t\tdeliverAs: \"followUp\",\n\t\t\t\t\t\tcoalesced: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\trearmedLoopIds.push(entry.id);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Recovery deliveries count as dispatched ticks and occupy the single in-flight slot.\n\t\t// One revision for all of them, so a persisting caller never sees a partial recovery.\n\t\tif (recoveryTicks.length > 0) {\n\t\t\tcommit((entries) => {\n\t\t\t\tfor (const tick of recoveryTicks) {\n\t\t\t\t\tconst entry = entries[tick.loopId];\n\t\t\t\t\tif (entry === undefined || entry.phase === \"ended\") continue;\n\t\t\t\t\tentries[tick.loopId] = withPhase(entry, \"queued\", {\n\t\t\t\t\t\tlastFiredAt: nowMs,\n\t\t\t\t\t\tlastScheduledForAt: nowMs,\n\t\t\t\t\t\tqueuedForAt: nowMs,\n\t\t\t\t\t\ttickCount: entry.tickCount + 1,\n\t\t\t\t\t});\n\t\t\t\t\tinFlightDeliveries.set(tick.loopId, tick.deliveryId);\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t}\n\n\t\treturn { recoveryTicks, expiredLoopIds, rearmedLoopIds, stillPausedLoopIds };\n\t}\n\n\tconst scheduler: LoopScheduler = {\n\t\tgetState: () => state,\n\t\tget mutationCount() {\n\t\t\treturn mutationCount;\n\t\t},\n\t\tmaxTicks,\n\t\tkeepaliveSeconds,\n\t\tcurrentDeliveryId: (loopId) => inFlightDeliveries.get(loopId),\n\t\tcreateFixed,\n\t\tcreateDynamic,\n\t\tonDue,\n\t\tonTickSettled,\n\t\tonScheduleWakeup,\n\t\tonTurnEndedWithoutSchedule,\n\t\tonUserAbort,\n\t\tpause,\n\t\tresume,\n\t\tstop,\n\t\tonShutdown,\n\t\trestore,\n\t};\n\n\t// The timer port fires with a loop id; the due decision is always re-derived from the\n\t// clock so a stale callback cannot dispatch a tick the state machine would refuse.\n\t// When an owner supplies `onFire` it performs the whole due step (persist + dispatch), so\n\t// calling `onDue` here as well would consume the occurrence and drop the delivery.\n\tfireHandler = (loopId) => {\n\t\tconst owner = deps.onFire;\n\t\tif (owner !== undefined) {\n\t\t\towner(loopId);\n\t\t\treturn;\n\t\t}\n\t\tscheduler.onDue(loopId, deps.clock.now(), false);\n\t};\n\n\treturn scheduler;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAkCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA4BpF;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,YAAY,CAAqB;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAkCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA4BpF;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAY,OAAO,EAAE,uBAAuB,EAG3C;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAK3B;IAED,OAAO,IAAI,IAAI,CAQd;IAED,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,IAAI;CAOZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAGN,wBAAwB,EAIxB,mCAAmC,EACnC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAqBN,KAAK,SAAS,EACd,KAAK,YAAY,EAQjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,qBAAsB,SAAQ,wBAAwB;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAGN,wBAAwB,EAIxB,mCAAmC,EACnC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAqBN,KAAK,SAAS,EACd,KAAK,YAAY,EAQjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,qBAAsB,SAAQ,wBAAwB;IAClE,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAGzD;CACD;AAED,qBAAa,gCAAiC,SAAQ,mCAAmC;IACxF,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAIvF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAE3D;AA8BD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAMhF;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAE1E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAIlG;AAED,wFAAwF;AACxF,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAE9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yCAAyC;AACzC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,6DAA6D;AAC7D,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAC5B,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC;AAEzD,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/detectors.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAWnD,MAAM,MAAM,kBAAkB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/G;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC5B,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AA6BvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CAUrG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CAgBnG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CA6B9F;AAkBD,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAuC;IAEtD,KAAK,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/detectors.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAWnD,MAAM,MAAM,kBAAkB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/G;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC5B,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AA6BvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CAUrG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CAgBnG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,kBAAkB,GAAG,SAAS,CA6B9F;AAkBD,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAuC;IAEtD,KAAK,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAmB5C;IAED,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,IAAI,CAItD;IAED,KAAK,IAAI,IAAI,CAEZ;CACD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAW/G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/escalation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,2BAA2B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACxF;IACA,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC1B,CAAC;AAcL,qBAAa,uBAAuB;IACnC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/escalation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,2BAA2B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACxF;IACA,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC1B,CAAC;AAcL,qBAAa,uBAAuB;IACnC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAOlE;IAED,aAAa,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAuBjD;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,2BAA2B,CA6B/D;IAED,KAAK,IAAI,IAAI,CAGZ;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/escalation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,mCAAmC,EAAE,MAAM,aAAa,CAAC;AAuBpG,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,OAAO,EAAW,CAAC;AAElD,MAAM,OAAO,uBAAuB;IAApC;QAEkB,aAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IA2E/D,CAAC;IAzEA,cAAc,CAAC,UAAkB,EAAE,MAAsB;QACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,SAAS,CAAC;QACnG,IAAI,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,aAAa,CAAC,SAA6B;QAC1C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,SAAS,CAAC;YACf,KAAK,OAAO;gBACX,OAAO;YACR,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/escalation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LoopGuardDetection } from \"./detectors.ts\";\nimport { IDENTICAL_BLOCK_NOTICE_THRESHOLD, IDENTICAL_HARD_STOP_BLOCK_THRESHOLD } from \"./policy.ts\";\nimport type { ToolCallRecord } from \"./tracker.ts\";\n\nexport type IdenticalEscalationDecision =\n\t| { readonly kind: \"allow\" }\n\t| { readonly kind: \"block\"; readonly toolName: string; readonly blockedCallCount: number }\n\t| {\n\t\t\treadonly kind: \"hardStop\";\n\t\t\treadonly toolName: string;\n\t\t\treadonly blockedCallCount: number;\n\t\t\treadonly announce: boolean;\n\t };\n\ninterface IdenticalLoopEpisode {\n\tfingerprint: string;\n\ttoolName: string;\n\tadmittedNoticeCount: number;\n\tactivateBlockAfterAttempt: boolean;\n\tblockActive: boolean;\n\tblockedCallCount: number;\n\thardStopAnnounced: boolean;\n}\n\nconst ALLOW_DECISION = { kind: \"allow\" } as const;\n\nexport class IdenticalLoopEscalation {\n\tprivate episode: IdenticalLoopEpisode | undefined;\n\tprivate readonly attempts = new Map<string, ToolCallRecord>();\n\n\tobserveAttempt(toolCallId: string, record: ToolCallRecord): boolean {\n\t\tconst patternChanged = this.episode !== undefined && this.episode.fingerprint !== record.signature;\n\t\tif (patternChanged) {\n\t\t\tthis.reset();\n\t\t}\n\t\tthis.attempts.set(toolCallId, record);\n\t\treturn patternChanged;\n\t}\n\n\tobserveNotice(detection: LoopGuardDetection): void {\n\t\tswitch (detection.kind) {\n\t\t\tcase \"similar\":\n\t\t\tcase \"cycle\":\n\t\t\t\treturn;\n\t\t\tcase \"identical\": {\n\t\t\t\tif (this.episode === undefined || this.episode.fingerprint !== detection.fingerprint) {\n\t\t\t\t\tthis.episode = {\n\t\t\t\t\t\tfingerprint: detection.fingerprint,\n\t\t\t\t\t\ttoolName: detection.toolName,\n\t\t\t\t\t\tadmittedNoticeCount: 0,\n\t\t\t\t\t\tactivateBlockAfterAttempt: false,\n\t\t\t\t\t\tblockActive: false,\n\t\t\t\t\t\tblockedCallCount: 0,\n\t\t\t\t\t\thardStopAnnounced: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthis.episode.admittedNoticeCount++;\n\t\t\t\tif (this.episode.admittedNoticeCount >= IDENTICAL_BLOCK_NOTICE_THRESHOLD) {\n\t\t\t\t\tthis.episode.activateBlockAfterAttempt = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfinishTurn(): void {\n\t\tthis.attempts.clear();\n\t}\n\n\tconsumeToolCall(toolCallId: string): IdenticalEscalationDecision {\n\t\tconst attempt = this.attempts.get(toolCallId);\n\t\tthis.attempts.delete(toolCallId);\n\t\tif (attempt === undefined || this.episode === undefined || this.episode.fingerprint !== attempt.signature) {\n\t\t\treturn ALLOW_DECISION;\n\t\t}\n\t\tif (!this.episode.blockActive) {\n\t\t\tif (this.episode.activateBlockAfterAttempt) {\n\t\t\t\tthis.episode.activateBlockAfterAttempt = false;\n\t\t\t\tthis.episode.blockActive = true;\n\t\t\t}\n\t\t\treturn ALLOW_DECISION;\n\t\t}\n\t\tthis.episode.blockedCallCount++;\n\t\tif (this.episode.blockedCallCount >= IDENTICAL_HARD_STOP_BLOCK_THRESHOLD) {\n\t\t\tconst announce = !this.episode.hardStopAnnounced;\n\t\t\tthis.episode.hardStopAnnounced = true;\n\t\t\treturn {\n\t\t\t\tkind: \"hardStop\",\n\t\t\t\ttoolName: this.episode.toolName,\n\t\t\t\tblockedCallCount: this.episode.blockedCallCount,\n\t\t\t\tannounce,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"block\",\n\t\t\ttoolName: this.episode.toolName,\n\t\t\tblockedCallCount: this.episode.blockedCallCount,\n\t\t};\n\t}\n\n\treset(): void {\n\t\tthis.episode = undefined;\n\t\tthis.attempts.clear();\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACN,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,iCAAiC,EACjC,6BAA6B,EAC7B,+BAA+B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEhE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAgB;IAC1D,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACjD,IAAI,uBAA2C,CAAC;IAChD,IAAI,wBAAwB,GAAG,KAAK,CAAC;IACrC,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,MAAM,2BAA2B,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC7D,IAAI,wBAAwB,KAAK,MAAM;YAAE,OAAO;QAChD,wBAAwB,GAAG,MAAM,CAAC;QAClC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE;YACxC,MAAM,EAAE,gCAAgC;YACxC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,yBAAyB,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC3D,IAAI,sBAAsB,KAAK,MAAM;YAAE,OAAO;QAC9C,sBAAsB,GAAG,MAAM,CAAC;QAChC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE;YAC9C,MAAM,EAAE,gCAAgC;YACxC,MAAM;SACN,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,uBAAuB,GAAG,SAAS,CAAC;QACpC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACnC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,EAAE,CAAC,uBAAuB,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,CAAC;IACjF,EAAE,CAAC,uBAAuB,CAAC,iCAAiC,EAAE,yBAAyB,CAAC,CAAC;IAEzF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,KAAK,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,cAAc,EAAE,CAAC;YACpB,uBAAuB,GAAG,SAAS,CAAC;YACpC,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACnC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO;QACpC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACpC,EAAE,CAAC,WAAW,CACb;YACC,UAAU,EAAE,6BAA6B;YACzC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC;YAC1C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,SAAS;SAClB,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,UAAU,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,OAAO;gBACX,OAAO,SAAS,CAAC;YAClB,KAAK,OAAO;gBACX,OAAO;oBACN,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC;oBAC/E,SAAS,EAAE,KAAK;iBAChB,CAAC;YACH,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACN,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,iCAAiC,EACjC,6BAA6B,EAC7B,+BAA+B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEhE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAgB;IAC1D,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACjD,IAAI,uBAA2C,CAAC;IAChD,IAAI,wBAAwB,GAAG,KAAK,CAAC;IACrC,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,MAAM,2BAA2B,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC7D,IAAI,wBAAwB,KAAK,MAAM;YAAE,OAAO;QAChD,wBAAwB,GAAG,MAAM,CAAC;QAClC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE;YACxC,MAAM,EAAE,gCAAgC;YACxC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,yBAAyB,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC3D,IAAI,sBAAsB,KAAK,MAAM;YAAE,OAAO;QAC9C,sBAAsB,GAAG,MAAM,CAAC;QAChC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE;YAC9C,MAAM,EAAE,gCAAgC;YACxC,MAAM;SACN,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,uBAAuB,GAAG,SAAS,CAAC;QACpC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACnC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,EAAE,CAAC,uBAAuB,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,CAAC;IACjF,EAAE,CAAC,uBAAuB,CAAC,iCAAiC,EAAE,yBAAyB,CAAC,CAAC;IAEzF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,KAAK,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,cAAc,EAAE,CAAC;YACpB,uBAAuB,GAAG,SAAS,CAAC;YACpC,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACnC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO;QACpC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACpC,EAAE,CAAC,WAAW,CACb;YACC,UAAU,EAAE,6BAA6B;YACzC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC;YAC1C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,SAAS;SAClB,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,UAAU,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,OAAO;gBACX,OAAO,SAAS,CAAC;YAClB,KAAK,OAAO;gBACX,OAAO;oBACN,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC;oBAC/E,SAAS,EAAE,KAAK;iBAChB,CAAC;YACH,KAAK,UAAU,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;gBAC5F,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;gBACxD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACvB,EAAE,CAAC,WAAW,CACb;wBACC,UAAU,EAAE,iCAAiC;wBAC7C,OAAO,EAAE,OAAO;wBAChB,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE;4BACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;4BAC3B,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;yBAC3C;qBACD,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAC1C,CAAC;oBACF,IAAI,GAAG,CAAC,KAAK;wBAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACjD,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAC7C,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpB,OAAO;oBACN,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC;oBAC/E,SAAS,EAAE,KAAK;iBAChB,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACzB,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACnC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QAC3B,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,uBAAuB,GAAG,SAAS,CAAC;QACpC,EAAE,CAAC,WAAW,CACb;YACC,UAAU,EAAE,+BAA+B;YAC3C,OAAO,EAAE,2BAA2B,CAAC,QAAQ,CAAC;YAC9C,OAAO,EAAE,KAAK;SACd,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { CONTINUATION_HOLD_STATE_EVENT, WAKE_SOURCE_STATE_EVENT } from \"../monitor-state-event.ts\";\nimport { detectLoop, NoticeGate } from \"./detectors.ts\";\nimport { IdenticalLoopEscalation } from \"./escalation.ts\";\nimport {\n\tbuildLoopGuardBlockReason,\n\tbuildLoopGuardHardStopSteer,\n\tbuildLoopGuardHardStopWarning,\n\tbuildLoopGuardReminder,\n\tLOOP_GUARD_ESCALATION_CUSTOM_TYPE,\n\tLOOP_GUARD_NOTICE_CUSTOM_TYPE,\n\tLOOP_GUARD_RECOVERY_CUSTOM_TYPE,\n} from \"./notice.ts\";\nimport { renderLoopGuardEscalation, renderLoopGuardNotice } from \"./renderer.ts\";\nimport { ToolCallTracker } from \"./tracker.ts\";\n\nconst LOOP_GUARD_HARD_STOP_WAKE_SOURCE = \"loop-guard-hard-stop\";\n\nexport default function loopGuardExtension(pi: ExtensionAPI): void {\n\tconst tracker = new ToolCallTracker();\n\tconst gate = new NoticeGate();\n\tconst escalation = new IdenticalLoopEscalation();\n\tlet pendingRecoveryToolName: string | undefined;\n\tlet recoveryWakeSourceActive = false;\n\tlet continuationHoldActive = false;\n\n\tconst setRecoveryWakeSourceActive = (active: boolean): void => {\n\t\tif (recoveryWakeSourceActive === active) return;\n\t\trecoveryWakeSourceActive = active;\n\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\tsource: LOOP_GUARD_HARD_STOP_WAKE_SOURCE,\n\t\t\tactiveCount: active ? 1 : 0,\n\t\t});\n\t};\n\n\tconst setContinuationHoldActive = (active: boolean): void => {\n\t\tif (continuationHoldActive === active) return;\n\t\tcontinuationHoldActive = active;\n\t\tpi.events?.emit(CONTINUATION_HOLD_STATE_EVENT, {\n\t\t\tsource: LOOP_GUARD_HARD_STOP_WAKE_SOURCE,\n\t\t\tactive,\n\t\t});\n\t};\n\n\tconst reset = (): void => {\n\t\ttracker.reset();\n\t\tgate.reset();\n\t\tescalation.reset();\n\t\tpendingRecoveryToolName = undefined;\n\t\tsetRecoveryWakeSourceActive(false);\n\t\tsetContinuationHoldActive(false);\n\t};\n\n\tpi.registerMessageRenderer(LOOP_GUARD_NOTICE_CUSTOM_TYPE, renderLoopGuardNotice);\n\tpi.registerMessageRenderer(LOOP_GUARD_ESCALATION_CUSTOM_TYPE, renderLoopGuardEscalation);\n\n\tpi.on(\"session_start\", () => reset());\n\tpi.on(\"session_shutdown\", () => reset());\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source !== \"extension\") reset();\n\t});\n\n\tpi.on(\"tool_execution_start\", (event) => {\n\t\tconst record = tracker.record(event.toolName, event.args);\n\t\tconst patternChanged = escalation.observeAttempt(event.toolCallId, record);\n\t\tif (patternChanged) {\n\t\t\tpendingRecoveryToolName = undefined;\n\t\t\tsetRecoveryWakeSourceActive(false);\n\t\t\tsetContinuationHoldActive(false);\n\t\t}\n\t\tconst detection = detectLoop(tracker.records, gate);\n\t\tif (detection === undefined) return;\n\t\tescalation.observeNotice(detection);\n\t\tpi.sendMessage(\n\t\t\t{\n\t\t\t\tcustomType: LOOP_GUARD_NOTICE_CUSTOM_TYPE,\n\t\t\t\tcontent: buildLoopGuardReminder(detection),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: detection,\n\t\t\t},\n\t\t\t{ triggerTurn: false, deliverAs: \"steer\" },\n\t\t);\n\t});\n\n\tpi.on(\"turn_end\", () => {\n\t\tescalation.finishTurn();\n\t});\n\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tconst decision = escalation.consumeToolCall(event.toolCallId);\n\t\tswitch (decision.kind) {\n\t\t\tcase \"allow\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"block\":\n\t\t\t\treturn {\n\t\t\t\t\tblock: true,\n\t\t\t\t\treason: buildLoopGuardBlockReason(decision.toolName, decision.blockedCallCount),\n\t\t\t\t\tterminate: false,\n\t\t\t\t};\n\t\t\tcase \"hardStop\": {\n\t\t\t\tconst warning = buildLoopGuardHardStopWarning(decision.toolName, decision.blockedCallCount);\n\t\t\t\tsetRecoveryWakeSourceActive(true);\n\t\t\t\tif (!decision.announce) setContinuationHoldActive(true);\n\t\t\t\tif (decision.announce) {\n\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustomType: LOOP_GUARD_ESCALATION_CUSTOM_TYPE,\n\t\t\t\t\t\t\tcontent: warning,\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\ttoolName: decision.toolName,\n\t\t\t\t\t\t\t\tblockedCallCount: decision.blockedCallCount,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ triggerTurn: false, deliverAs: \"steer\" },\n\t\t\t\t\t);\n\t\t\t\t\tif (ctx.hasUI) ctx.ui.notify(warning, \"warning\");\n\t\t\t\t\tpendingRecoveryToolName = decision.toolName;\n\t\t\t\t}\n\t\t\t\tctx.abort(\"system\");\n\t\t\t\treturn {\n\t\t\t\t\tblock: true,\n\t\t\t\t\treason: buildLoopGuardBlockReason(decision.toolName, decision.blockedCallCount),\n\t\t\t\t\tterminate: false,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t});\n\n\tpi.on(\"agent_start\", () => {\n\t\tsetRecoveryWakeSourceActive(false);\n\t\tsetContinuationHoldActive(false);\n\t});\n\n\tpi.on(\"agent_settled\", () => {\n\t\tconst toolName = pendingRecoveryToolName;\n\t\tif (toolName === undefined) return;\n\t\tpendingRecoveryToolName = undefined;\n\t\tpi.sendMessage(\n\t\t\t{\n\t\t\t\tcustomType: LOOP_GUARD_RECOVERY_CUSTOM_TYPE,\n\t\t\t\tcontent: buildLoopGuardHardStopSteer(toolName),\n\t\t\t\tdisplay: false,\n\t\t\t},\n\t\t\t{ triggerTurn: true },\n\t\t);\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notice.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/notice.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC;AACjE,MAAM,CAAC,MAAM,iCAAiC,GAAG,uBAAuB,CAAC;AACzE,MAAM,CAAC,MAAM,+BAA+B,GAAG,qBAAqB,CAAC;AASrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,gBAAwB;IACnF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,CAAC,CAAC,0LAA0L;QAC5L,CAAC,CAAC,oHAAoH,CAAC;IACxH,OAAO;QACN,oCAAoC,gBAAgB,SAAS,QAAQ,uEAAuE;QAC5I,QAAQ;KACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,QAAgB,EAAE,gBAAwB;IACvF,OAAO,kDAAkD,gBAAgB,sBAAsB,QAAQ,GAAG,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,OAAO;QACN,uEAAuE,QAAQ,kDAAkD;QACjI,oHAAoH;KACpH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IACnE,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"notice.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/notice.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC;AACjE,MAAM,CAAC,MAAM,iCAAiC,GAAG,uBAAuB,CAAC;AACzE,MAAM,CAAC,MAAM,+BAA+B,GAAG,qBAAqB,CAAC;AASrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,gBAAwB;IACnF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,CAAC,CAAC,0LAA0L;QAC5L,CAAC,CAAC,oHAAoH,CAAC;IACxH,OAAO;QACN,oCAAoC,gBAAgB,SAAS,QAAQ,uEAAuE;QAC5I,QAAQ;KACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,QAAgB,EAAE,gBAAwB;IACvF,OAAO,kDAAkD,gBAAgB,sBAAsB,QAAQ,GAAG,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,OAAO;QACN,uEAAuE,QAAQ,kDAAkD;QACjI,oHAAoH;KACpH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IACnE,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW,EAAE,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;YACtC,OAAO;gBACN,mBAAmB;gBACnB,mDAAmD,QAAQ,MAAM,KAAK,oPAAoP;gBAC1T,+DAA+D;gBAC/D,mJAAmJ;gBACnJ,kIAAkI;gBAClI,iBAAiB,QAAQ,oCAAoC;gBAC7D,oBAAoB;aACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YAChB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YAC7C,OAAO;gBACN,mBAAmB;gBACnB,qDAAqD,KAAK,eAAe,QAAQ,0BAA0B,OAAO,mKAAmK;gBACrR,oMAAoM;gBACpM,uJAAuJ;gBACvJ,iJAAiJ;gBACjJ,oBAAoB;aACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACd,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;YAChD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO;gBACN,mBAAmB;gBACnB,sFAAsF,OAAO,KAAK,KAAK,kBAAkB,MAAM,uJAAuJ;gBACtR,kKAAkK;gBAClK,sMAAsM;gBACtM,yKAAyK;gBACzK,oBAAoB;aACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACF,CAAC;AACF,CAAC","sourcesContent":["import type { LoopGuardDetection } from \"./detectors.ts\";\n\nexport const LOOP_GUARD_NOTICE_CUSTOM_TYPE = \"loop-guard:notice\";\nexport const LOOP_GUARD_ESCALATION_CUSTOM_TYPE = \"loop-guard:escalation\";\nexport const LOOP_GUARD_RECOVERY_CUSTOM_TYPE = \"loop-guard:recovery\";\n\nexport type LoopGuardNoticeDetails = LoopGuardDetection;\n\nexport interface LoopGuardEscalationDetails {\n\treadonly toolName: string;\n\treadonly blockedCallCount: number;\n}\n\nconst POLLING_TOOL_NAMES = new Set([\"bash_output\", \"task_output\"]);\n\nexport function buildLoopGuardBlockReason(toolName: string, blockedCallCount: number): string {\n\tconst recovery = POLLING_TOOL_NAMES.has(toolName)\n\t\t? \"Stop polling this target. If you need to wait for a change, arm a monitor or rely on a completion notification when this mode supports it; otherwise re-plan or choose a different tool.\"\n\t\t: \"Reuse the existing result, stop repeating this call, and re-plan from the current goal or choose a different tool.\";\n\treturn [\n\t\t`Loop guard blocked repeated call ${blockedCallCount} to \\`${toolName}\\` with arguments that already triggered two identical-call warnings.`,\n\t\trecovery,\n\t].join(\" \");\n}\n\nexport function buildLoopGuardHardStopWarning(toolName: string, blockedCallCount: number): string {\n\treturn `Loop guard interrupted the turn after blocking ${blockedCallCount} repeated calls to ${toolName}.`;\n}\n\nexport function buildLoopGuardHardStopSteer(toolName: string): string {\n\treturn [\n\t\t`The loop guard stopped the previous turn because you kept calling \\`${toolName}\\` with arguments that had already been blocked.`,\n\t\t\"Do not repeat that call. Re-plan from the current goal and use a different tool or deliberately changed arguments.\",\n\t].join(\" \");\n}\n\nexport function buildLoopGuardReminder(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\": {\n\t\t\tconst { toolName, count } = detection;\n\t\t\treturn [\n\t\t\t\t`<system-reminder>`,\n\t\t\t\t`LOOP GUARD - IDENTICAL TOOL CALLS: you called \\`${toolName}\\` ${count} times in a row with the EXACT same arguments. This is the tool-call stream, not consecutive text - another tool ran between these calls and it changed nothing about your plan. Re-issuing the same call returns the same result. Snap out of it:`,\n\t\t\t\t`- reuse the result you already received from this exact call;`,\n\t\t\t\t`- if you were re-checking for new output or state, switch to the monitor/watch tool or change one parameter deliberately (filter, offset, query);`,\n\t\t\t\t`- if nothing is actually changing, stop calling this tool, state what is blocking you, and try a different tool or ask the user.`,\n\t\t\t\t`Do not call \\`${toolName}\\` again with identical arguments.`,\n\t\t\t\t`</system-reminder>`,\n\t\t\t].join(\"\\n\");\n\t\t}\n\t\tcase \"similar\": {\n\t\t\tconst { toolName, count, similarity } = detection;\n\t\t\tconst percent = Math.round(similarity * 100);\n\t\t\treturn [\n\t\t\t\t`<system-reminder>`,\n\t\t\t\t`LOOP GUARD - NEAR-IDENTICAL TOOL CALLS: your last ${count} calls to \\`${toolName}\\` had arguments about ${percent}% identical (bigram similarity over canonical args). This may be legitimate batch work - or it may be a lazy loop that only LOOKS like progress. Attention check:`,\n\t\t\t\t`- if these calls target genuinely different inputs (distinct files, queries, offsets), continue deliberately - but consider batching or widening the scope instead of one call per tiny variation;`,\n\t\t\t\t`- if you are scanning output incrementally (reads, peeks, polls), widen the window once or use the monitor/watch tool rather than nudging parameters;`,\n\t\t\t\t`- if the results keep saying the same thing, change strategy now - a different tool, a wider query, or asking the user beats a sixth near-copy.`,\n\t\t\t\t`</system-reminder>`,\n\t\t\t].join(\"\\n\");\n\t\t}\n\t\tcase \"cycle\": {\n\t\t\tconst { period, count, cycleTools } = detection;\n\t\t\tconst pattern = cycleTools.join(\" -> \");\n\t\t\treturn [\n\t\t\t\t`<system-reminder>`,\n\t\t\t\t`LOOP GUARD - REPEATING TOOL-CALL PATTERN: your recent tool calls repeat the cycle [${pattern}] ${count} times (period ${period}), with other calls possibly interleaved between repetitions. A fixed rotation usually means waiting, guessing, or searching without a discriminator:`,\n\t\t\t\t`- if this is a wait/poll rotation (spawn then peek, write then check), replace the rotation with the monitor/watch tool and react to the decisive event instead;`,\n\t\t\t\t`- if this is a search rotation, change ONE axis decisively: broader query, different tool, or a different source - repeating the same rotation at the same parameters will not find new information;`,\n\t\t\t\t`- if the cycle is genuinely progressing (each rotation moves distinct work forward), keep going - but say what each rotation accomplished so the next rotation can end.`,\n\t\t\t\t`</system-reminder>`,\n\t\t\t].join(\"\\n\");\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,MAAM,CAAC,MAAM,qBAAqB,GAAwC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE;IAC3G,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;AAClG,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAgD,qBAAqB,CAC1G,CAAC,OAAO,EAAE,EAAE;IACX,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO;QACN,KAAK,EAAE,oCAAoC,OAAO,CAAC,QAAQ,GAAG;QAC9D,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,+CAA+C,OAAO,CAAC,gBAAgB,8BAA8B;QAC1G,YAAY,EAAE,4FAA4F;KAC1G,CAAC;AACH,CAAC,CACD,CAAC;AAEF,SAAS,SAAS,CAAC,SAA6B;IAC/C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,mCAAmC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QACrF,KAAK,SAAS;YACb,OAAO,wCAAwC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QAC1F,KAAK,OAAO;YACX,OAAO,qCAAqC,SAAS,CAAC,KAAK,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC;IAC7F,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,SAA6B;IAC7C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,8FAA8F,CAAC;QACvG,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,MAAM,CAAC,MAAM,qBAAqB,GAAwC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE;IAC3G,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;AAClG,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAgD,qBAAqB,CAC1G,CAAC,OAAO,EAAE,EAAE;IACX,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO;QACN,KAAK,EAAE,oCAAoC,OAAO,CAAC,QAAQ,GAAG;QAC9D,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,+CAA+C,OAAO,CAAC,gBAAgB,8BAA8B;QAC1G,YAAY,EAAE,4FAA4F;KAC1G,CAAC;AACH,CAAC,CACD,CAAC;AAEF,SAAS,SAAS,CAAC,SAA6B;IAC/C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,mCAAmC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QACrF,KAAK,SAAS;YACb,OAAO,wCAAwC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QAC1F,KAAK,OAAO;YACX,OAAO,qCAAqC,SAAS,CAAC,KAAK,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC;IAC7F,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,SAA6B;IAC7C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,8FAA8F,CAAC;QACvG,KAAK,SAAS,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YACvD,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;QACjH,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,oBAAoB,OAAO,sEAAsE,CAAC;QAC1G,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,SAA6B;IAClD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,QAAQ,SAAS,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,sDAAsD,CAAC;QAC9G,KAAK,SAAS;YACb,OAAO,QAAQ,SAAS,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,oCAAoC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,mBAAmB,CAAC;QACrJ,KAAK,OAAO;YACX,OAAO,SAAS,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,KAAK,yCAAyC,CAAC;IAClH,CAAC;AACF,CAAC","sourcesContent":["import { noticeMessageRenderer } from \"../../notice/index.ts\";\nimport type { MessageRenderer } from \"../../types.ts\";\nimport type { LoopGuardDetection } from \"./detectors.ts\";\nimport type { LoopGuardEscalationDetails } from \"./notice.ts\";\n\nexport const renderLoopGuardNotice: MessageRenderer<LoopGuardDetection> = noticeMessageRenderer((message) => {\n\tconst details = message.details;\n\tif (details === undefined) return undefined;\n\treturn { title: titleLine(details), why: whyLine(details), expandedLine: expandedLine(details) };\n});\n\nexport const renderLoopGuardEscalation: MessageRenderer<LoopGuardEscalationDetails> = noticeMessageRenderer(\n\t(message) => {\n\t\tconst details = message.details;\n\t\tif (details === undefined) return undefined;\n\t\treturn {\n\t\t\ttitle: `! Loop guard · turn interrupted (${details.toolName})`,\n\t\t\ttone: \"error\",\n\t\t\twhy: `The agent ignored two warnings and repeated ${details.blockedCallCount} calls after blocking began.`,\n\t\t\texpandedLine: \"A user-role recovery message was queued and the active turn was stopped by a system abort.\",\n\t\t};\n\t},\n);\n\nfunction titleLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `⚠ Loop guard · identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"similar\":\n\t\t\treturn `⚠ Loop guard · near-identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"cycle\":\n\t\t\treturn `⚠ Loop guard · repeating pattern ×${detection.count} (period ${detection.period})`;\n\t}\n}\n\nfunction whyLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn \"Same tool, same arguments, again. The agent was told to reuse the result or change the call.\";\n\t\tcase \"similar\": {\n\t\t\tconst percent = Math.round(detection.similarity * 100);\n\t\t\treturn `Argument similarity ~${percent}%. The agent was told to verify this is distinct work, not a lazy loop.`;\n\t\t}\n\t\tcase \"cycle\": {\n\t\t\tconst pattern = detection.cycleTools.join(\" -> \");\n\t\t\treturn `Tool-call cycle [${pattern}]. The agent was told to break the rotation or justify the progress.`;\n\t\t}\n\t}\n}\n\nfunction expandedLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive identical calls when the reminder fired`;\n\t\tcase \"similar\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive same-tool calls at ~${Math.round(detection.similarity * 100)}% args similarity`;\n\t\tcase \"cycle\":\n\t\t\treturn `cycle ${detection.cycleTools.join(\" -> \")} · ${detection.count} full repetitions in the tracked window`;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/tracker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEtD;AAgBD,qBAAa,eAAe;IAC3B,OAAO,CAAC,KAAK,CAAwB;IAErC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc;
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/tracker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEtD;AAgBD,qBAAa,eAAe;IAC3B,OAAO,CAAC,KAAK,CAAwB;IAErC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CAQtD;IAED,IAAI,OAAO,IAAI,SAAS,cAAc,EAAE,CAEvC;IAED,KAAK,IAAI,IAAI,CAEZ;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-set.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/active-set.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gCAAgC,CAC/C,EAA4E,EAC5E,KAA2D,EAC3D,
|
|
1
|
+
{"version":3,"file":"active-set.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/active-set.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gCAAgC,CAC/C,EAA4E,EAC5E,KAA2D,EAC3D,mBAAmB,GAAsB,EAAE,CAAC,cAAc,EAAE;IAE5D,MAAM,WAAW,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC1F,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import type { TSchema } from \"typebox\";\nimport type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\n\nexport function registerToolsPreservingActiveSet<TParams extends TSchema, TDetails, TState>(\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\ttools: readonly ToolDefinition<TParams, TDetails, TState>[],\n\tintendedActiveTools: readonly string[] = pi.getActiveTools(),\n): void {\n\tconst intendedSet = [...intendedActiveTools];\n\tfor (const tool of [...tools].sort((left, right) => left.name.localeCompare(right.name))) {\n\t\tpi.registerTool(tool);\n\t}\n\tpi.setActiveTools(intendedSet);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/callback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAKD,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,qBAAqB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,eAAe,CAAC,CAwB1B;AASD,qBAAa,sBAAsB;;
|
|
1
|
+
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/callback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAKD,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,qBAAqB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,eAAe,CAAC,CAwB1B;AASD,qBAAa,sBAAsB;;IAUlC,YAAY,OAAO,EAAE,qBAAqB,EAEzC;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAOK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CA2B7B;IAED,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAGrC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3B;CAkED"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-errors.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/oauth-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/D,MAAM,MAAM,gBAAgB,GACzB,kBAAkB,GAClB,YAAY,GACZ,eAAe,GACf,WAAW,GACX,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,UAAU,GACV,aAAa,CAAC;AAEjB,qBAAa,cAAe,SAAQ,SAAS;IAC5C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-errors.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/oauth-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/D,MAAM,MAAM,gBAAgB,GACzB,kBAAkB,GAClB,YAAY,GACZ,eAAe,GACf,WAAW,GACX,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,UAAU,GACV,aAAa,CAAC;AAEjB,qBAAa,cAAe,SAAQ,SAAS;IAC5C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,YAAY,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,EAKtF;CACD;AAgBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKtD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-errors.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/oauth-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,cAAc,CAAC;AAe/D,MAAM,OAAO,cAAe,SAAQ,SAAS;IAI5C,YAAY,SAA2B,EAAE,OAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth-errors.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/oauth-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,cAAc,CAAC;AAe/D,MAAM,OAAO,cAAe,SAAQ,SAAS;IAI5C,YAAY,SAA2B,EAAE,OAAe,EAAE,OAAO,GAAoB,EAAE;QACtF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;CACD;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAmB;IAChD,kBAAkB;IAClB,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,UAAU;IACV,aAAa;CACb,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAClH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,yBAAyB,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhG,MAAM,UAAU,cAAc,CAAC,KAAc;IAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IACnD,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC1G,CAAC;AAED,0EAA0E;AAC1E,SAAS,cAAc,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAI,KAAiC,CAAC,SAAS,CAAC;IAC1D,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACpE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import { AuthError, type McpErrorOptions } from \"../errors.ts\";\n\n// Distinguishes terminal auth failures (drop credentials, require re-auth) from\n// transient ones (retry, keep credentials) and specific refusals.\nexport type OAuthFailureKind =\n\t| \"s256_unsupported\"\n\t| \"needs_auth\"\n\t| \"invalid_grant\"\n\t| \"transient\"\n\t| \"state_mismatch\"\n\t| \"expired_code\"\n\t| \"no_verifier\"\n\t| \"headless\"\n\t| \"missing_env\";\n\nexport class OAuthFlowError extends AuthError {\n\treadonly oauthKind: OAuthFailureKind;\n\treadonly terminal: boolean;\n\n\tconstructor(oauthKind: OAuthFailureKind, message: string, options: McpErrorOptions = {}) {\n\t\tsuper(message, options);\n\t\tthis.name = \"OAuthFlowError\";\n\t\tthis.oauthKind = oauthKind;\n\t\tthis.terminal = TERMINAL_KINDS.has(oauthKind);\n\t}\n}\n\nconst TERMINAL_KINDS = new Set<OAuthFailureKind>([\n\t\"s256_unsupported\",\n\t\"needs_auth\",\n\t\"invalid_grant\",\n\t\"state_mismatch\",\n\t\"expired_code\",\n\t\"no_verifier\",\n\t\"headless\",\n\t\"missing_env\",\n]);\n\nconst TERMINAL_OAUTH_CODES = new Set([\"invalid_grant\", \"invalid_token\", \"invalid_client\", \"unauthorized_client\"]);\nconst TRANSIENT_OAUTH_CODES = new Set([\"temporarily_unavailable\", \"server_error\", \"slow_down\"]);\n\nexport function isInvalidGrant(error: unknown): boolean {\n\tconst code = oauthErrorCode(error);\n\tif (code !== undefined) return TERMINAL_OAUTH_CODES.has(code);\n\tconst text = errorText(error).toLowerCase();\n\treturn text.includes(\"invalid_grant\") || text.includes(\"invalid_token\");\n}\n\nexport function isTransientTokenError(error: unknown): boolean {\n\tif (isInvalidGrant(error)) return false;\n\tconst code = oauthErrorCode(error);\n\tif (code !== undefined && TRANSIENT_OAUTH_CODES.has(code)) return true;\n\tconst text = errorText(error).toLowerCase();\n\treturn /\\b(?:500|502|503|504)\\b/.test(text) || text.includes(\"econnrefused\") || text.includes(\"network\");\n}\n\n// SDK OAuth errors expose a machine-readable `errorCode` (RFC 6749 §5.2).\nfunction oauthErrorCode(error: unknown): string | undefined {\n\tif (typeof error !== \"object\" || error === null) return undefined;\n\tconst code = (error as { errorCode?: unknown }).errorCode;\n\treturn typeof code === \"string\" ? code : undefined;\n}\n\nfunction errorText(error: unknown): string {\n\tif (error instanceof Error) return `${error.name} ${error.message}`;\n\treturn String(error);\n}\n"]}
|