@code-yeongyu/senpi 2026.8.29 → 2026.8.30-2
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 +122 -0
- package/dist/core/agent-session.d.ts +45 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +329 -29
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +155 -37
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/compaction-execution.d.ts +14 -0
- package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
- package/dist/core/compaction/compaction-execution.js +121 -0
- package/dist/core/compaction/compaction-execution.js.map +1 -0
- package/dist/core/compaction/compaction-settings.d.ts +17 -0
- package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
- package/dist/core/compaction/compaction-settings.js +17 -0
- package/dist/core/compaction/compaction-settings.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +13 -26
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +7 -136
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
- package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
- package/dist/core/compaction/ideal-compaction-settings.js +7 -0
- package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
- package/dist/core/compaction-settings-access.d.ts +19 -0
- package/dist/core/compaction-settings-access.d.ts.map +1 -0
- package/dist/core/compaction-settings-access.js +10 -0
- package/dist/core/compaction-settings-access.js.map +1 -0
- package/dist/core/compaction-settings-resolver.d.ts +22 -0
- package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
- package/dist/core/compaction-settings-resolver.js +46 -0
- package/dist/core/compaction-settings-resolver.js.map +1 -0
- package/dist/core/credential-accounts.d.ts.map +1 -1
- package/dist/core/credential-accounts.js +23 -9
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
- package/dist/core/credential-pool/env-slots.js +2 -0
- package/dist/core/credential-pool/env-slots.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js +28 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +163 -48
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
- package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle.js +13 -2
- package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +121 -147
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +2 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
- package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
- package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts +56 -0
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js +136 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/policy.d.ts +5 -2
- package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.js +43 -26
- package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
- package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +22 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +7 -196
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +18 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +18 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +36 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js +92 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
- package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
- package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.js +31 -3
- package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
- package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
- package/dist/core/model-resolver.js +2 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +10 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +15 -85
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +15 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-public-types.d.ts +11 -0
- package/dist/core/settings-public-types.d.ts.map +1 -0
- package/dist/core/settings-public-types.js +2 -0
- package/dist/core/settings-public-types.js.map +1 -0
- package/dist/core/settings-shapes.d.ts +36 -0
- package/dist/core/settings-shapes.d.ts.map +1 -0
- package/dist/core/settings-shapes.js +2 -0
- package/dist/core/settings-shapes.js.map +1 -0
- package/dist/core/shared-host-policy.d.ts +6 -0
- package/dist/core/shared-host-policy.d.ts.map +1 -0
- package/dist/core/shared-host-policy.js +7 -0
- package/dist/core/shared-host-policy.js.map +1 -0
- package/dist/core/terminal-settings.d.ts +22 -0
- package/dist/core/terminal-settings.d.ts.map +1 -0
- package/dist/core/terminal-settings.js +2 -0
- package/dist/core/terminal-settings.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +97 -15
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +8 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +76 -34
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -5
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +7 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +34 -8
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts +2 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/chrome.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +121 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +336 -65
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +7 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +114 -2
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +8 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +145 -49
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts +19 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +79 -15
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +96 -25
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts +2 -0
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +23 -12
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +6 -4
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +10 -4
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +47 -10
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js +66 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +86 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-binding.d.ts +1 -0
- package/dist/modes/rpc/session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/session-binding.js +21 -1
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +1 -0
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +2 -0
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +54 -7
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
- package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
- package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +10 -2
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +58 -4
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
- package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
- package/dist/modes/rpc/socket-event-fanout.js +84 -0
- package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
- package/docs/rpc.md +18 -2
- package/docs/settings.md +34 -0
- package/docs/windows.md +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +50 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
- 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 +40 -20
- 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/types.d.ts +3 -3
- 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/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- 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 +67 -38
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.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/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +7 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
- package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +19 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -258,20 +258,22 @@ function rewriteDeclaration(code, declarationStart, start, end, keyword) {
|
|
|
258
258
|
const preserveDeclaration = source.includes("//") || source.includes("/*");
|
|
259
259
|
for (const [segmentStart, segmentEnd] of splitDeclarators(code, start, end)) {
|
|
260
260
|
const segment = code.slice(segmentStart, segmentEnd);
|
|
261
|
-
if (!segment.trim())
|
|
261
|
+
if (!segment.trim()) return undefined;
|
|
262
262
|
const initializerStart = findTopLevelEquals(segment);
|
|
263
263
|
if (initializerStart < 0 && keyword === "const") return undefined;
|
|
264
264
|
const pattern = trimPattern(initializerStart < 0 ? segment : segment.slice(0, initializerStart));
|
|
265
265
|
const bindings = [];
|
|
266
266
|
collectPatternNames(pattern, bindings);
|
|
267
267
|
if (bindings.length === 0) return undefined;
|
|
268
|
+
if (preserveDeclaration) {
|
|
269
|
+
for (const name of bindings) assignments.push(`globalThis[${JSON.stringify(name)}] = ${name};`);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
268
272
|
const target = rewriteBindingPattern(pattern);
|
|
269
273
|
if (target === undefined) return undefined;
|
|
270
274
|
const initializer = initializerStart < 0 ? "undefined" : segment.slice(initializerStart + 1).trim();
|
|
271
|
-
const [assignmentInitializer, comment] = splitTrailingLineComment(initializer);
|
|
272
|
-
const assignmentComment = preserveDeclaration ? "" : comment;
|
|
273
275
|
assignments.push(
|
|
274
|
-
`${target.startsWith("{") || target.startsWith("[") ?
|
|
276
|
+
`${target.startsWith("{") || target.startsWith("[") ? `;(${target} = ${initializer})` : `${target} = ${initializer}`};`,
|
|
275
277
|
);
|
|
276
278
|
}
|
|
277
279
|
if (assignments.length === 0) return undefined;
|
|
@@ -408,6 +410,7 @@ function splitDeclarators(code, start, end) {
|
|
|
408
410
|
if (!/\s/u.test(char)) canStartRegex = isExpressionOperator(char) || char === "(" || char === "[" || char === "{";
|
|
409
411
|
}
|
|
410
412
|
if (segmentStart < end && code.slice(segmentStart, end).trim() !== ";") ranges.push([segmentStart, end - (code[end - 1] === ";" ? 1 : 0)]);
|
|
413
|
+
else if (ranges.length > 0 && code.slice(segmentStart, end).trim() !== ";") ranges.push([end, end]);
|
|
411
414
|
return ranges;
|
|
412
415
|
}
|
|
413
416
|
|
|
@@ -501,51 +504,9 @@ function applyTextEdits(code, edits) {
|
|
|
501
504
|
return output;
|
|
502
505
|
}
|
|
503
506
|
|
|
504
|
-
function splitTrailingLineComment(source) {
|
|
505
|
-
let canStartRegex = true;
|
|
506
|
-
for (let index = 0; index < source.length; index += 1) {
|
|
507
|
-
const char = source[index];
|
|
508
|
-
const next = source[index + 1];
|
|
509
|
-
if (char === "/" && next === "/") return [source.slice(0, index).trimEnd(), source.slice(index)];
|
|
510
|
-
if (char === "/" && next === "*") {
|
|
511
|
-
index = skipBlockComment(source, index) - 1;
|
|
512
|
-
continue;
|
|
513
|
-
}
|
|
514
|
-
if (char === "'" || char === '"') {
|
|
515
|
-
index = skipQuotedLiteral(source, index) - 1;
|
|
516
|
-
canStartRegex = false;
|
|
517
|
-
continue;
|
|
518
|
-
}
|
|
519
|
-
if (char === "`") {
|
|
520
|
-
index = skipTemplateLiteral(source, index) - 1;
|
|
521
|
-
canStartRegex = false;
|
|
522
|
-
continue;
|
|
523
|
-
}
|
|
524
|
-
if (char === "/" && canStartRegex) {
|
|
525
|
-
index = skipRegexLiteral(source, index) - 1;
|
|
526
|
-
canStartRegex = false;
|
|
527
|
-
continue;
|
|
528
|
-
}
|
|
529
|
-
if (isIdentifierStart(char)) {
|
|
530
|
-
const end = readIdentifier(source, index);
|
|
531
|
-
canStartRegex = REGEX_PREFIX_KEYWORDS.has(source.slice(index, end));
|
|
532
|
-
index = end - 1;
|
|
533
|
-
continue;
|
|
534
|
-
}
|
|
535
|
-
if (isDecimalDigit(char)) {
|
|
536
|
-
index = skipNumberLiteral(source, index) - 1;
|
|
537
|
-
canStartRegex = false;
|
|
538
|
-
continue;
|
|
539
|
-
}
|
|
540
|
-
if (!/\s/u.test(char)) canStartRegex = isExpressionOperator(char) || char === "(" || char === "[" || char === "{";
|
|
541
|
-
}
|
|
542
|
-
return [source, ""];
|
|
543
|
-
}
|
|
544
|
-
|
|
545
507
|
function trimPattern(source) {
|
|
546
508
|
let start = 0;
|
|
547
|
-
|
|
548
|
-
while (start < end) {
|
|
509
|
+
while (start < source.length) {
|
|
549
510
|
if (/\s/u.test(source[start])) {
|
|
550
511
|
start += 1;
|
|
551
512
|
continue;
|
|
@@ -560,12 +521,30 @@ function trimPattern(source) {
|
|
|
560
521
|
}
|
|
561
522
|
break;
|
|
562
523
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
const
|
|
567
|
-
if (
|
|
568
|
-
|
|
524
|
+
let end = start;
|
|
525
|
+
for (let index = start; index < source.length; index += 1) {
|
|
526
|
+
const char = source[index];
|
|
527
|
+
const next = source[index + 1];
|
|
528
|
+
if (/\s/u.test(char)) continue;
|
|
529
|
+
if (char === "/" && next === "/") {
|
|
530
|
+
index = skipLineComment(source, index) - 1;
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (char === "/" && next === "*") {
|
|
534
|
+
index = skipBlockComment(source, index) - 1;
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
if (char === "'" || char === '"') {
|
|
538
|
+
index = skipQuotedLiteral(source, index) - 1;
|
|
539
|
+
end = index + 1;
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
if (char === "`") {
|
|
543
|
+
index = skipTemplateLiteral(source, index) - 1;
|
|
544
|
+
end = index + 1;
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
end = index + 1;
|
|
569
548
|
}
|
|
570
549
|
return source.slice(start, end);
|
|
571
550
|
}
|
|
@@ -733,66 +712,136 @@ function captureLastExpression(code) {
|
|
|
733
712
|
return `${head}return ${tail.replace(/;+$/u, "")};`;
|
|
734
713
|
}
|
|
735
714
|
|
|
715
|
+
const LABEL_PREFIX_RE = /^[\p{ID_Start}$_][\p{ID_Continue}\u200c\u200d$]*\s*:/u;
|
|
716
|
+
|
|
736
717
|
function isStatementOnly(source) {
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
718
|
+
if (
|
|
719
|
+
/^(?:const|let|var|if|for|while|switch|try|catch|finally|class|function|import|export|throw|return|do|break|continue|debugger)\b/u.test(
|
|
720
|
+
source,
|
|
721
|
+
)
|
|
722
|
+
)
|
|
723
|
+
return true;
|
|
724
|
+
return LABEL_PREFIX_RE.test(source);
|
|
740
725
|
}
|
|
741
726
|
|
|
727
|
+
const CONTROL_PAREN_KEYWORDS = new Set(["catch", "for", "if", "switch", "while", "with"]);
|
|
728
|
+
|
|
742
729
|
function findLastTopLevelStatementStart(code) {
|
|
743
730
|
let start = 0;
|
|
744
731
|
let round = 0;
|
|
745
732
|
let square = 0;
|
|
746
733
|
let curly = 0;
|
|
747
|
-
let
|
|
748
|
-
let
|
|
749
|
-
let
|
|
750
|
-
|
|
734
|
+
let canStartRegex = true;
|
|
735
|
+
let lastSignificant = "";
|
|
736
|
+
let pendingControlParen = false;
|
|
737
|
+
const controlParens = [];
|
|
751
738
|
for (let index = 0; index < code.length; index += 1) {
|
|
752
739
|
const char = code[index];
|
|
753
740
|
const next = code[index + 1];
|
|
754
|
-
if (
|
|
755
|
-
|
|
741
|
+
if (char === "/" && next === "/") {
|
|
742
|
+
index = skipLineComment(code, index) - 1;
|
|
756
743
|
continue;
|
|
757
744
|
}
|
|
758
|
-
if (
|
|
759
|
-
|
|
760
|
-
blockComment = false;
|
|
761
|
-
index += 1;
|
|
762
|
-
}
|
|
745
|
+
if (char === "/" && next === "*") {
|
|
746
|
+
index = skipBlockComment(code, index) - 1;
|
|
763
747
|
continue;
|
|
764
748
|
}
|
|
765
|
-
if (
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
} else if (char === quote) {
|
|
771
|
-
quote = "";
|
|
772
|
-
}
|
|
749
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
750
|
+
index = (char === "`" ? skipTemplateLiteral(code, index) : skipQuotedLiteral(code, index)) - 1;
|
|
751
|
+
canStartRegex = false;
|
|
752
|
+
lastSignificant = char;
|
|
753
|
+
pendingControlParen = false;
|
|
773
754
|
continue;
|
|
774
755
|
}
|
|
775
|
-
if (char === "/" &&
|
|
776
|
-
|
|
777
|
-
|
|
756
|
+
if (char === "/" && canStartRegex) {
|
|
757
|
+
index = skipRegexLiteral(code, index) - 1;
|
|
758
|
+
canStartRegex = false;
|
|
759
|
+
lastSignificant = char;
|
|
760
|
+
pendingControlParen = false;
|
|
778
761
|
continue;
|
|
779
762
|
}
|
|
780
|
-
if (char
|
|
781
|
-
|
|
782
|
-
index
|
|
763
|
+
if (isIdentifierStart(char)) {
|
|
764
|
+
const end = readIdentifier(code, index);
|
|
765
|
+
const token = code.slice(index, end);
|
|
766
|
+
canStartRegex = REGEX_PREFIX_KEYWORDS.has(token);
|
|
767
|
+
pendingControlParen = CONTROL_PAREN_KEYWORDS.has(token);
|
|
768
|
+
lastSignificant = code[end - 1];
|
|
769
|
+
index = end - 1;
|
|
783
770
|
continue;
|
|
784
771
|
}
|
|
785
|
-
if (char
|
|
786
|
-
|
|
772
|
+
if (isDecimalDigit(char)) {
|
|
773
|
+
index = skipNumberLiteral(code, index) - 1;
|
|
774
|
+
canStartRegex = false;
|
|
775
|
+
lastSignificant = char;
|
|
776
|
+
pendingControlParen = false;
|
|
787
777
|
continue;
|
|
788
778
|
}
|
|
789
|
-
if (char === "(")
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
779
|
+
if (char === "(") {
|
|
780
|
+
round += 1;
|
|
781
|
+
controlParens.push(pendingControlParen);
|
|
782
|
+
pendingControlParen = false;
|
|
783
|
+
canStartRegex = true;
|
|
784
|
+
lastSignificant = char;
|
|
785
|
+
continue;
|
|
786
|
+
}
|
|
787
|
+
if (char === ")") {
|
|
788
|
+
round = Math.max(0, round - 1);
|
|
789
|
+
canStartRegex = controlParens.pop() === true;
|
|
790
|
+
lastSignificant = char;
|
|
791
|
+
continue;
|
|
792
|
+
}
|
|
793
|
+
if (char === "[" || char === "{") {
|
|
794
|
+
if (char === "[") square += 1;
|
|
795
|
+
else curly += 1;
|
|
796
|
+
canStartRegex = true;
|
|
797
|
+
lastSignificant = char;
|
|
798
|
+
pendingControlParen = false;
|
|
799
|
+
continue;
|
|
800
|
+
}
|
|
801
|
+
if (char === "]" || char === "}") {
|
|
802
|
+
if (char === "]") square = Math.max(0, square - 1);
|
|
803
|
+
else curly = Math.max(0, curly - 1);
|
|
804
|
+
canStartRegex = false;
|
|
805
|
+
lastSignificant = char;
|
|
806
|
+
pendingControlParen = false;
|
|
807
|
+
continue;
|
|
808
|
+
}
|
|
809
|
+
if (char === ";" && round === 0 && square === 0 && curly === 0) {
|
|
810
|
+
const nextIndex = nextSignificantIndex(code, index + 1);
|
|
811
|
+
if (nextIndex < code.length && !isContinuationKeyword(code, nextIndex)) start = nextIndex;
|
|
812
|
+
canStartRegex = true;
|
|
813
|
+
lastSignificant = char;
|
|
814
|
+
pendingControlParen = false;
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
817
|
+
if (isLineTerminator(char) && round === 0 && square === 0 && curly === 0) {
|
|
818
|
+
if (!canStartRegex) {
|
|
819
|
+
const nextIndex = nextSignificantIndex(code, index + 1);
|
|
820
|
+
if (nextIndex < code.length && !isStatementContinuation(code, nextIndex, lastSignificant)) start = nextIndex;
|
|
821
|
+
}
|
|
822
|
+
canStartRegex = true;
|
|
823
|
+
continue;
|
|
824
|
+
}
|
|
825
|
+
if (!/\s/u.test(char)) {
|
|
826
|
+
canStartRegex = isExpressionOperator(char) || char === ",";
|
|
827
|
+
lastSignificant = char;
|
|
828
|
+
pendingControlParen = false;
|
|
829
|
+
}
|
|
796
830
|
}
|
|
797
831
|
return start;
|
|
798
832
|
}
|
|
833
|
+
|
|
834
|
+
const STATEMENT_CONTINUATION_KEYWORDS = new Set(["catch", "else", "finally"]);
|
|
835
|
+
|
|
836
|
+
function isContinuationKeyword(code, index) {
|
|
837
|
+
if (!isIdentifierStart(code[index])) return false;
|
|
838
|
+
return STATEMENT_CONTINUATION_KEYWORDS.has(code.slice(index, readIdentifier(code, index)));
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
function isStatementContinuation(code, index, previousChar) {
|
|
842
|
+
const char = code[index];
|
|
843
|
+
if (char === "(" || char === "[" || char === "`") return previousChar !== "}" && previousChar !== "";
|
|
844
|
+
if (char === "!" || char === "~") return false;
|
|
845
|
+
if (char !== undefined && isDeclarationContinuation(char)) return true;
|
|
846
|
+
return isContinuationKeyword(code, index);
|
|
847
|
+
}
|
|
@@ -163,7 +163,7 @@ tool_schema(name?) → dict
|
|
|
163
163
|
completion(prompt, model?="default", system?=None, schema?=None) → str | dict
|
|
164
164
|
Oneshot, stateless (no history/tools). \`model\`: \`"smol"\` fast | \`"default"\` session | \`"slow"\` most capable. \`schema\` (JSON-Schema) → structured output, parsed object.
|
|
165
165
|
{{#if spawns}}agent(prompt, agent?="{{spawnDefaultAgent}}", model?=None, label?=None, schema?=None, handle?=False) → str | dict
|
|
166
|
-
Run a subagent → final output. \`agent\` picks another discovered agent; omit it to use \`{{spawnDefaultAgent}}\`. \`schema\` as in completion(). Background via \`local://\` files named in the prompt. \`handle\` →
|
|
166
|
+
Run a subagent → final output. \`agent\` picks another discovered agent; omit it to use \`{{spawnDefaultAgent}}\`. \`schema\` as in completion(). Background via \`local://\` files named in the prompt. \`handle\` → workflow node dict { text, output, handle: \`agent://<id>\`, id, agent } (parsed under \`data\` when \`schema\` set).
|
|
167
167
|
{{#if js}} JS: options are ONE trailing object — agent(prompt, { agent, schema, handle }).
|
|
168
168
|
{{/if}}{{/if}}parallel(thunks) → list
|
|
169
169
|
Thunks through a bounded pool (wide as a \`task\` batch — don't pre-shrink), input order kept; returns when all finish, a throwing thunk propagates.
|
|
@@ -176,14 +176,14 @@ phase(title) → None
|
|
|
176
176
|
\`\`\`
|
|
177
177
|
</prelude>
|
|
178
178
|
{{#if spawns}}
|
|
179
|
-
<
|
|
180
|
-
|
|
179
|
+
<workflow>
|
|
180
|
+
Define the workflow spec IN CODE: partition the work into logically distinct steps, one node per step, then wire them as acyclic waves — never hand-author the graph as a single opaque call.
|
|
181
181
|
- **Name nodes.** Capture each \`agent(…, {{#if py}}handle=True{{/if}}{{#if js}}{ handle: true }{{/if}}{{#if jl}}handle=true{{/if}})\` result; carries \`handle\` (\`agent://<id>\`) + \`output\`.
|
|
182
182
|
- **Wire edges by reference.** Put an upstream node's \`handle\`/\`output\` in the dependent stage's prompt — large transcript never re-inlined. Bulk: \`write("local://<name>.md", …)\`, pass the URI.
|
|
183
183
|
- **\`pipeline(items, *stages)\` = staged waves**, barrier between stages (every item clears stage N before any enters N+1). **\`parallel(thunks)\` = one wave** of independent nodes.
|
|
184
184
|
- **Isolate failure.** A raising node re-raises the lowest-index error, aborts its wave; wrap risky nodes in try/except so a failure degrades only its dependent subtree, independent branches finish.
|
|
185
185
|
- **Acyclic only.** A node never waits on its own descendant.
|
|
186
|
-
</
|
|
186
|
+
</workflow>
|
|
187
187
|
{{/if}}
|
|
188
188
|
|
|
189
189
|
<critical>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodejs.d.ts","sourceRoot":"","sources":["../../../src/harness/env/nodejs.ts"],"names":[],"mappings":"AAoBA,OAAO,EACN,KAAK,YAAY,EACjB,cAAc,EAEd,SAAS,EACT,KAAK,QAAQ,EAGb,KAAK,MAAM,EACX,KAAK,gBAAgB,EAErB,MAAM,aAAa,CAAC;AA6NrB;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAgBxF;AA4BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,WAA8B,GAAG,IAAI,CAKrG;
|
|
1
|
+
{"version":3,"file":"nodejs.d.ts","sourceRoot":"","sources":["../../../src/harness/env/nodejs.ts"],"names":[],"mappings":"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"}
|
|
@@ -362,6 +362,7 @@ function waitForChildProcess(child) {
|
|
|
362
362
|
child.once("close", onClose);
|
|
363
363
|
});
|
|
364
364
|
}
|
|
365
|
+
const NORMAL_CALLBACK_SETTLEMENT_TIMEOUT_MS = 5_000;
|
|
365
366
|
export class NodeExecutionEnv {
|
|
366
367
|
constructor(options) {
|
|
367
368
|
this.activeChildPids = new Set();
|
|
@@ -399,6 +400,7 @@ export class NodeExecutionEnv {
|
|
|
399
400
|
let settled = false;
|
|
400
401
|
let timedOut = false;
|
|
401
402
|
let callbackError;
|
|
403
|
+
const callbackPromises = new Set();
|
|
402
404
|
let child;
|
|
403
405
|
let timeoutId;
|
|
404
406
|
const onAbort = () => {
|
|
@@ -458,29 +460,47 @@ export class NodeExecutionEnv {
|
|
|
458
460
|
}
|
|
459
461
|
child.stdout?.setEncoding("utf8");
|
|
460
462
|
child.stderr?.setEncoding("utf8");
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
463
|
+
const handleChunk = (chunk, callback, append) => {
|
|
464
|
+
append(chunk);
|
|
465
|
+
if (callback === undefined)
|
|
466
|
+
return;
|
|
467
|
+
const callbackPromise = Promise.resolve()
|
|
468
|
+
.then(() => callback(chunk))
|
|
469
|
+
.catch((error) => {
|
|
470
|
+
if (!callbackError) {
|
|
471
|
+
const cause = toError(error);
|
|
472
|
+
callbackError = new ExecutionError("callback_error", cause.message, error);
|
|
473
|
+
onAbort();
|
|
474
|
+
}
|
|
475
|
+
throw error;
|
|
476
|
+
});
|
|
477
|
+
callbackPromises.add(callbackPromise);
|
|
478
|
+
void callbackPromise.then(() => callbackPromises.delete(callbackPromise), () => callbackPromises.delete(callbackPromise));
|
|
479
|
+
};
|
|
480
|
+
child.stdout?.on("data", (chunk) => handleChunk(chunk, options?.onStdout, (value) => (stdout += value)));
|
|
481
|
+
child.stderr?.on("data", (chunk) => handleChunk(chunk, options?.onStderr, (value) => (stderr += value)));
|
|
482
|
+
void waitForChildProcess(child).then(async (code) => {
|
|
483
|
+
// Normal command completion must not be held hostage by an observer that
|
|
484
|
+
// never settles. Abort completion uses the shorter cancellation path above;
|
|
485
|
+
// this generous bound preserves slow, legitimate callbacks without hanging
|
|
486
|
+
// the execution forever.
|
|
487
|
+
const callbacksSettled = Promise.allSettled([...callbackPromises]);
|
|
488
|
+
let callbackTimeout;
|
|
489
|
+
const callbackBound = new Promise((resolve) => {
|
|
490
|
+
callbackTimeout = setTimeout(() => resolve(false), NORMAL_CALLBACK_SETTLEMENT_TIMEOUT_MS);
|
|
491
|
+
callbackTimeout.unref?.();
|
|
492
|
+
});
|
|
474
493
|
try {
|
|
475
|
-
|
|
494
|
+
const settled = await Promise.race([callbacksSettled.then(() => true), callbackBound]);
|
|
495
|
+
if (!settled && !callbackError) {
|
|
496
|
+
settle(err(new ExecutionError("callback_error", "Output callback did not settle within 5000ms")));
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
476
499
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
onAbort();
|
|
500
|
+
finally {
|
|
501
|
+
if (callbackTimeout)
|
|
502
|
+
clearTimeout(callbackTimeout);
|
|
481
503
|
}
|
|
482
|
-
});
|
|
483
|
-
void waitForChildProcess(child).then((code) => {
|
|
484
504
|
if (callbackError) {
|
|
485
505
|
settle(err(callbackError));
|
|
486
506
|
return;
|