mixdog 1.2.5 → 1.3.0
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/LICENSES/simple-icons-CC0-1.0.txt +30 -0
- package/NOTICE.md +19 -0
- package/package.json +4 -1
- package/scripts/check-model-recommendations.mjs +89 -0
- package/scripts/gate-local.mjs +7 -0
- package/scripts/lib/gate-scheduler.mjs +2 -2
- package/scripts/lib/isolated-test-env.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +5 -14
- package/scripts/provider-pingpong-live.mjs +9 -9
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +5 -4
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +17 -0
- package/src/defaults/skills/browser-use/SKILL.md +7 -1
- package/src/defaults/skills/computer-use/SKILL.md +3 -1
- package/src/defaults/skills/memory-management/SKILL.md +4 -1
- package/src/defaults/skills/setup/references/actions.md +11 -4
- package/src/defaults/skills/setup-guide/SKILL.md +175 -0
- package/src/defaults/skills/setup-guide/model-recommendations.json +333 -0
- package/src/defaults/skills/visualize/SKILL.md +3 -2
- package/src/lib/rules-builder.cjs +56 -7
- package/src/output-styles/common.md +22 -6
- package/src/output-styles/detailed.md +7 -5
- package/src/output-styles/minimal.md +7 -3
- package/src/output-styles/simple.md +2 -3
- package/src/rules/agent/AGENT.md +7 -1
- package/src/rules/agent-mode/AGENT_MODE.md +24 -0
- package/src/rules/agent-mode/MIXY.md +21 -0
- package/src/rules/agent-mode/ROUTINE.md +6 -0
- package/src/rules/lead/LEAD.md +9 -4
- package/src/rules/shared/10-tool-workflow.md +2 -1
- package/src/rules/shared/60-verification.md +4 -5
- package/src/rules/shared/70-delivery.md +3 -0
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -1
- package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +86 -0
- package/src/runtime/agent/orchestrator/config.mjs +6 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +77 -14
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +182 -13
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +5 -3
- package/src/runtime/agent/orchestrator/internal-agents.mjs +10 -0
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +215 -0
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +58 -64
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +10 -1
- package/src/runtime/agent/orchestrator/mcp/client.mjs +122 -15
- package/src/runtime/agent/orchestrator/mcp/oauth-account.mjs +97 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +2 -3
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +49 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +59 -9
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +32 -7
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +45 -6
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +195 -6
- package/src/runtime/agent/orchestrator/mcp/server-connectors.mjs +17 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +41 -19
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +11 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/catalog-deadline.mjs +163 -0
- package/src/runtime/agent/orchestrator/providers/catalog-failures.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +38 -14
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +100 -26
- package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +24 -0
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +49 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +17 -12
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +45 -16
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-connect.mjs +196 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +74 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-login.mjs +194 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-tokens.mjs +353 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +293 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +33 -100
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +23 -14
- package/src/runtime/agent/orchestrator/providers/registry.mjs +41 -27
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +98 -4
- package/src/runtime/agent/orchestrator/runtime-core/context-status-shape.mjs +4 -0
- package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +6 -4
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +15 -8
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +12 -6
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +32 -5
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +50 -20
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/agent-home.d.mts +4 -0
- package/src/runtime/agent/orchestrator/session/agent-home.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/agent-mode.mjs +62 -0
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +15 -3
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +31 -0
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +241 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +162 -0
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +641 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +74 -13
- package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +102 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +8 -2
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +165 -0
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +221 -0
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +195 -0
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +167 -0
- package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +39 -2
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +82 -33
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +11 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +13 -3
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +10 -7
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -22
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +44 -16
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -5
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +81 -34
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +39 -4
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -5
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +55 -8
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +58 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +32 -5
- package/src/runtime/agent/orchestrator/session/request-fork.mjs +47 -0
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +70 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +277 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/side-question.mjs +5 -43
- package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +73 -6
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +40 -0
- package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-header.mjs +36 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +258 -43
- package/src/runtime/agent/orchestrator/session/store-record-strict-scan.mjs +325 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +84 -21
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -12
- package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +46 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +46 -30
- package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +144 -45
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +32 -13
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +364 -38
- package/src/runtime/agent/orchestrator/session/store.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/task-wait-control.mjs +43 -12
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +23 -6
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +44 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +12 -6
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +13 -7
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/bashism-rewrite.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +40 -7
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +37 -34
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -0
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +29 -27
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +28 -11
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +12 -3
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +203 -101
- package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +90 -41
- package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +17 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-delivery.mjs +199 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +12 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +165 -39
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +113 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +19 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +25 -7
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +12 -5
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +61 -22
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +32 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +193 -19
- package/src/runtime/agent/orchestrator/tools/builtin/shell-direct-exe.mjs +57 -7
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +123 -32
- package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +26 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +13 -28
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +90 -11
- package/src/runtime/agent/orchestrator/tools/builtin/wait-budgets.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +54 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +22 -28
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +11 -7
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +126 -9
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +15 -6
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +64 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +10 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promotion-results.mjs +13 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +104 -55
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +39 -23
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/office-extract.mjs +11 -9
- package/src/runtime/browser-bridge/client.mjs +24 -0
- package/src/runtime/channels/lib/scheduler.mjs +40 -12
- package/src/runtime/channels/lib/schedules-db.mjs +71 -12
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +36 -16
- package/src/runtime/channels/lib/webhook.mjs +0 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +100 -10
- package/src/runtime/channels/lib/worker-main.mjs +17 -20
- package/src/runtime/computer-bridge/client.mjs +28 -1
- package/src/runtime/connectors/gmail-app-password.mjs +690 -0
- package/src/runtime/connectors/google-mcp.mjs +446 -0
- package/src/runtime/memory/lib/core-memory-access.mjs +69 -0
- package/src/runtime/memory/lib/core-memory-file.mjs +16 -8
- package/src/runtime/memory/lib/core-memory-index.mjs +15 -9
- package/src/runtime/memory/lib/core-memory-management.mjs +10 -4
- package/src/runtime/memory/lib/core-memory-store.mjs +53 -30
- package/src/runtime/memory/lib/core-memory-uniqueness.mjs +10 -6
- package/src/runtime/memory/lib/embedding-tokenizer.mjs +32 -18
- package/src/runtime/memory/lib/http-router/session-routes.mjs +3 -2
- package/src/runtime/memory/lib/memory-action-handlers/core-actions.mjs +44 -14
- package/src/runtime/memory/lib/memory-schema/core-and-meta.mjs +11 -0
- package/src/runtime/memory/lib/memory.mjs +7 -1
- package/src/runtime/memory/lib/query-core-recall.mjs +9 -1
- package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -1
- package/src/runtime/memory/lib/tool-call-handler.mjs +9 -5
- package/src/runtime/memory/tool-defs.mjs +5 -0
- package/src/runtime/office/authoring/pptx-script-normalize.mjs +11 -8
- package/src/runtime/office/core/tabular.mjs +1 -1
- package/src/runtime/office/design/library/design-template-inspect.mjs +7 -4
- package/src/runtime/office/portable/docx-formatting.mjs +1 -1
- package/src/runtime/office/portable/docx-runs.mjs +1 -1
- package/src/runtime/office/portable/docx-tracked-edits.mjs +2 -2
- package/src/runtime/office/portable/portable-docx-edits.mjs +11 -10
- package/src/runtime/office/portable/portable-docx-operations.mjs +21 -17
- package/src/runtime/office/portable/portable-docx-parts.mjs +15 -9
- package/src/runtime/office/portable/portable-docx-styles.mjs +4 -1
- package/src/runtime/office/portable/portable-docx-xml.mjs +9 -9
- package/src/runtime/office/portable/portable-opc.mjs +27 -13
- package/src/runtime/office/portable/portable-pivot.mjs +3 -3
- package/src/runtime/office/portable/portable-pptx-chart.mjs +3 -3
- package/src/runtime/office/portable/portable-pptx-charts.mjs +24 -18
- package/src/runtime/office/portable/portable-pptx-core.mjs +5 -5
- package/src/runtime/office/portable/portable-pptx-deck.mjs +8 -4
- package/src/runtime/office/portable/portable-pptx-package.mjs +7 -4
- package/src/runtime/office/portable/portable-pptx-shapes.mjs +18 -9
- package/src/runtime/office/portable/portable-sheet-parts.mjs +9 -3
- package/src/runtime/office/portable/portable-sheet-xml.mjs +5 -5
- package/src/runtime/office/portable/portable-xlsx-charts.mjs +4 -1
- package/src/runtime/office/portable/portable-xlsx-drawings.mjs +10 -6
- package/src/runtime/office/portable/portable-xlsx-operations.mjs +8 -5
- package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +1 -1
- package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +11 -7
- package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +6 -3
- package/src/runtime/office/portable/portable-xml.mjs +1 -1
- package/src/runtime/shared/agent-avatar-sprites.mjs +445 -0
- package/src/runtime/shared/agent-avatar.d.mts +64 -0
- package/src/runtime/shared/agent-avatar.mjs +320 -0
- package/src/runtime/shared/agent-route-config.d.mts +3 -0
- package/src/runtime/shared/agent-route-config.mjs +16 -0
- package/src/runtime/shared/atomic-file.mjs +36 -14
- package/src/runtime/shared/background-tasks.mjs +60 -20
- package/src/runtime/shared/child-spawn-gate.mjs +26 -16
- package/src/runtime/shared/config.mjs +8 -11
- package/src/runtime/shared/connector-accounts.mjs +15 -0
- package/src/runtime/shared/connector-catalog.d.mts +52 -0
- package/src/runtime/shared/connector-catalog.mjs +230 -0
- package/src/runtime/shared/connector-triggers.d.mts +3 -0
- package/src/runtime/shared/connector-triggers.mjs +43 -0
- package/src/runtime/shared/file-lock.mjs +7 -1
- package/src/runtime/shared/file-permissions-worker.mjs +38 -0
- package/src/runtime/shared/file-permissions.d.mts +19 -4
- package/src/runtime/shared/file-permissions.mjs +310 -4
- package/src/runtime/shared/git-runner-worker.mjs +6 -78
- package/src/runtime/shared/google-oauth-client.mjs +24 -0
- package/src/runtime/shared/held-request-host.d.mts +12 -0
- package/src/runtime/shared/held-request-host.mjs +71 -0
- package/src/runtime/shared/llm/http-agent.mjs +7 -3
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +10 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +2 -0
- package/src/runtime/shared/llm/usage-ledger-import.mjs +32 -3
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +12 -5
- package/src/runtime/shared/llm/usage-ledger-worker.mjs +1 -1
- package/src/runtime/shared/llm/usage-ledger.mjs +20 -5
- package/src/runtime/shared/memory-snapshot.mjs +5 -1
- package/src/runtime/shared/notify-trace.mjs +8 -1
- package/src/runtime/shared/plain-preview.d.mts +1 -0
- package/src/runtime/shared/plain-preview.mjs +28 -0
- package/src/runtime/shared/pristine-execution-contract.json +5 -1
- package/src/runtime/shared/process-runner-worker.mjs +7 -0
- package/src/runtime/shared/process-runner.mjs +38 -0
- package/src/runtime/shared/provider-accounts.mjs +2 -1
- package/src/runtime/shared/provider-api-key.mjs +0 -1
- package/src/runtime/shared/read-row-numbers.mjs +1 -1
- package/src/runtime/shared/resource-admission.mjs +60 -18
- package/src/runtime/shared/routine-limits.d.mts +11 -0
- package/src/runtime/shared/routine-limits.mjs +21 -0
- package/src/runtime/shared/routine-trigger.d.mts +10 -0
- package/src/runtime/shared/routine-trigger.mjs +44 -0
- package/src/runtime/shared/run-child.mjs +84 -0
- package/src/runtime/shared/schedule-model-ref.mjs +9 -10
- package/src/runtime/shared/session-activity-signal.mjs +23 -0
- package/src/runtime/shared/shell-output-summary.mjs +23 -0
- package/src/runtime/shared/singleton-owner.mjs +126 -42
- package/src/runtime/shared/slow-span.mjs +4 -12
- package/src/runtime/shared/statusline/statusline-segments.mjs +13 -1
- package/src/runtime/shared/tool-output-limit.mjs +4 -2
- package/src/runtime/shared/tool-output-marker.mjs +58 -0
- package/src/runtime/shared/transcript-metadata.mjs +10 -0
- package/src/runtime/shared/turn-changes.mjs +0 -8
- package/src/runtime/shared/usage-readout-totals.mjs +56 -0
- package/src/runtime/shared/user-data-guard.mjs +131 -34
- package/src/runtime/shared/worktrees/activity-gate.mjs +33 -8
- package/src/runtime/shared/worktrees/git-head.mjs +20 -2
- package/src/runtime/shared/worktrees/lock.mjs +3 -2
- package/src/runtime/terminal-bridge/tool-defs.mjs +1 -1
- package/src/runtime/tidy/runners/biome.mjs +3 -1
- package/src/runtime/tidy/shadow.mjs +2 -1
- package/src/runtime/web-search/index.mjs +5 -7
- package/src/runtime/web-search/lib/formatter.mjs +42 -6
- package/src/runtime/web-search/tool-defs.mjs +6 -1
- package/src/session-runtime/agent-home-delivery.mjs +459 -0
- package/src/session-runtime/agent-profile-changes.mjs +21 -0
- package/src/session-runtime/agent-room-delivery.mjs +92 -0
- package/src/session-runtime/agent-task-sessions.mjs +200 -0
- package/src/session-runtime/boot/apis.mjs +50 -18
- package/src/session-runtime/boot/facade.mjs +5 -8
- package/src/session-runtime/boot/infrastructure.mjs +28 -17
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/channel-config-api.mjs +53 -5
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +36 -20
- package/src/session-runtime/cwd-plugins/plugin-status.mjs +6 -1
- package/src/session-runtime/held-requests.mjs +228 -0
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +121 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +31 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +31 -2
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -0
- package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +4 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +11 -4
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +3 -3
- package/src/session-runtime/lifecycle/shared.mjs +25 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +2 -0
- package/src/session-runtime/lifecycle/teardown.mjs +5 -2
- package/src/session-runtime/lifecycle-api.mjs +3 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +8 -0
- package/src/session-runtime/mcp-glue/server-input.mjs +3 -0
- package/src/session-runtime/mcp-oauth-login.mjs +112 -15
- package/src/session-runtime/model-route/set-route.mjs +14 -3
- package/src/session-runtime/owned-automation-run.mjs +229 -0
- package/src/session-runtime/provider-auth/login.mjs +10 -6
- package/src/session-runtime/provider-auth/setup.mjs +19 -2
- package/src/session-runtime/provider-catalog-cache.mjs +101 -25
- package/src/session-runtime/provider-models/catalog-load.mjs +14 -3
- package/src/session-runtime/provider-models/row-hydration.mjs +4 -0
- package/src/session-runtime/provider-models.mjs +76 -10
- package/src/session-runtime/provider-readiness.mjs +4 -0
- package/src/session-runtime/resource-api.mjs +5 -0
- package/src/session-runtime/resource-mcp-api.mjs +107 -13
- package/src/session-runtime/resource-skills-api.mjs +12 -0
- package/src/session-runtime/room-member-gate.mjs +48 -0
- package/src/session-runtime/routine-home-turn.mjs +156 -0
- package/src/session-runtime/routine-owner.mjs +48 -0
- package/src/session-runtime/schedule-session-run.mjs +30 -64
- package/src/session-runtime/services/agent-tool/close-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +10 -0
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +10 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +13 -4
- package/src/session-runtime/services/agent-tool/notify.mjs +15 -4
- package/src/session-runtime/services/agent-tool/restart-notify.mjs +134 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/deferred-spawn.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +19 -4
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +2 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -1
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +8 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +4 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +44 -10
- package/src/session-runtime/services/agent-tool.mjs +20 -0
- package/src/session-runtime/services/channel-admin.mjs +93 -24
- package/src/session-runtime/services/memory-access.mjs +37 -0
- package/src/session-runtime/services/provider-admin.mjs +166 -59
- package/src/session-runtime/services/schedule-access.mjs +91 -0
- package/src/session-runtime/services/usage-dashboard-model.mjs +2 -2
- package/src/session-runtime/services/usage-dashboard.mjs +27 -69
- package/src/session-runtime/session-create/session-options.mjs +34 -7
- package/src/session-runtime/session-hooks.mjs +16 -8
- package/src/session-runtime/setup-tool/executor.mjs +68 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +72 -14
- package/src/session-runtime/setup-tool/settings-contract.mjs +8 -6
- package/src/session-runtime/setup-tool/tool-defs.mjs +8 -0
- package/src/session-runtime/skills-api.mjs +16 -1
- package/src/session-runtime/tool-policy-refresh.mjs +238 -29
- package/src/session-runtime/turn/session-ops.mjs +10 -3
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +11 -2
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +3 -0
- package/src/session-runtime/usage-stats-api.mjs +6 -1
- package/src/session-runtime/webhook-session-run.mjs +49 -67
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +239 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +556 -22
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +11 -1
- package/src/session-runtime/workflow-agents-api.mjs +4 -1
- package/src/standalone/channel-transport/http-routes.mjs +10 -9
- package/src/standalone/daemon-agent-control.mjs +1 -8
- package/src/standalone/daemon-desktop-runtime.mjs +20 -7
- package/src/standalone/daemon-owner.mjs +117 -25
- package/src/standalone/daemon-session-control.mjs +11 -2
- package/src/standalone/daemon.mjs +61 -17
- package/src/standalone/session-call-cache.mjs +6 -0
- package/src/standalone/session-protocol.mjs +28 -1
- package/src/standalone/session-service/retention/busy.mjs +7 -2
- package/src/standalone/session-service/session-calls/session-turns.mjs +9 -0
- package/src/standalone/session-service.mjs +19 -0
- package/src/standalone/session-transport/routes.mjs +7 -6
- package/src/tui/app/model-options.mjs +39 -2
- package/src/tui/app/model-picker.mjs +16 -2
- package/src/tui/app/provider-setup-picker.mjs +1 -2
- package/src/tui/app/slash-commands.mjs +20 -0
- package/src/tui/dist/index.mjs +487 -128
- package/src/tui/session/context-state.mjs +6 -1
- package/src/tui/session/notice-surface.mjs +35 -4
- package/src/tui/session/notice-text.mjs +0 -1
- package/src/tui/session/queue-helpers.mjs +2 -1
- package/src/tui/session/session-api/extensions.mjs +4 -0
- package/src/tui/session/session-api/intake/submission.mjs +12 -13
- package/src/tui/session/session-api/integrations.mjs +9 -5
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +13 -3
- package/src/tui/session/session-api/lifecycle.mjs +17 -1
- package/src/tui/session/session-api/routes.mjs +48 -3
- package/src/tui/session/session-flow/drain.mjs +20 -3
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -1
- package/src/tui/session/session-flow/queue/take-entries.mjs +3 -2
- package/src/tui/session/session-flow/steering.mjs +104 -24
- package/src/tui/session/session-flow.mjs +2 -0
- package/src/tui/session/tool-approval.mjs +26 -5
- package/src/tui/session/transcript-intake.mjs +6 -2
- package/src/tui/session/transcript-spill.mjs +5 -1
- package/src/tui/session/tui-steering-persist.mjs +65 -42
- package/src/tui/session/turn-live-call.mjs +56 -0
- package/src/tui/session/turn-stream.mjs +33 -0
- package/src/tui/session/turn.mjs +50 -7
- package/src/ui/statusline.mjs +1 -6
- package/src/ui/streaming-markdown-heal.mjs +24 -7
- package/src/vendor/statusline/bin/statusline-route.mjs +0 -1
- package/src/vendor/statusline/src/gateway/route-meta.mjs +0 -1
- package/src/workflows/default/WORKFLOW.md +9 -13
- package/src/session-runtime/automation-agents.mjs +0 -94
- package/src/session-runtime/automation-workflow.mjs +0 -59
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.33",
|
|
3
3
|
"_comment": "Synced from immutable graph-v release assets.",
|
|
4
4
|
"assets": {
|
|
5
5
|
"darwin-arm64": {
|
|
6
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
7
|
-
"sha256": "
|
|
6
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-darwin-arm64",
|
|
7
|
+
"sha256": "8637d61493eddca3eee80620a64e737f12eead44ea899ad19a18966a3843ff3a"
|
|
8
8
|
},
|
|
9
9
|
"darwin-x64": {
|
|
10
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
11
|
-
"sha256": "
|
|
10
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-darwin-x64",
|
|
11
|
+
"sha256": "49ce311687c3df7e7080ecb7694219c9b51bbbb272864aa43d2102a8baa83550"
|
|
12
12
|
},
|
|
13
13
|
"linux-arm64": {
|
|
14
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
15
|
-
"sha256": "
|
|
14
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-linux-arm64",
|
|
15
|
+
"sha256": "2e2a4ea6dccc5b33f583040b0ee6e8d47f93a1e879eb17343acd0b2f9838696f"
|
|
16
16
|
},
|
|
17
17
|
"linux-x64": {
|
|
18
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
19
|
-
"sha256": "
|
|
18
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-linux-x64",
|
|
19
|
+
"sha256": "2cd1caa7f39e183d6fb6f7764f49e9a0643863d137c2bfb5f40bb7ac616c8d73"
|
|
20
20
|
},
|
|
21
21
|
"win32-arm64": {
|
|
22
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
23
|
-
"sha256": "
|
|
22
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-win32-arm64.exe",
|
|
23
|
+
"sha256": "592dfa7e95e1e91424c7467e74f35d09758de502be403b7d229444b435600392"
|
|
24
24
|
},
|
|
25
25
|
"win32-x64": {
|
|
26
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
27
|
-
"sha256": "
|
|
26
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-win32-x64.exe",
|
|
27
|
+
"sha256": "0ed17859a39f0160421865f3a3486ce53957b836ee164d606434519b85b90830"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -27,14 +27,14 @@ export function unregisterOwnedShellTree(jobId, entry) {
|
|
|
27
27
|
if (ownedTrees.get(key) === entry) ownedTrees.delete(key);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
export function
|
|
34
|
-
const owner = String(ownerSessionId
|
|
30
|
+
/** Prepare the kill of every registered tree — of one owner, or of all when
|
|
31
|
+
* `ownerSessionId` is null (runtime shutdown) — and unregister them. Returns
|
|
32
|
+
* the snapshots still pending (empty when all were complete). */
|
|
33
|
+
export function prepareOwnedShellTreeKills(ownerSessionId = null) {
|
|
34
|
+
const owner = ownerSessionId == null ? null : String(ownerSessionId).trim();
|
|
35
35
|
const pending = [];
|
|
36
36
|
for (const [jobId, entry] of [...ownedTrees]) {
|
|
37
|
-
if (String(entry.ownerSessionId || '') !== owner) continue;
|
|
37
|
+
if (owner !== null && String(entry.ownerSessionId || '') !== owner) continue;
|
|
38
38
|
let ready;
|
|
39
39
|
try {
|
|
40
40
|
ready = entry.prepareKill();
|
|
@@ -44,6 +44,15 @@ export function cancelOwnedShellTrees(ownerSessionId) {
|
|
|
44
44
|
if (ready !== true) pending.push(Promise.resolve(ready).catch(() => false));
|
|
45
45
|
unregisterOwnedShellTree(jobId, entry);
|
|
46
46
|
}
|
|
47
|
+
return pending;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Cancel every shell tree of one owner session. Synchronous (the native
|
|
51
|
+
* cancel's own result) when every snapshot is already complete; otherwise a
|
|
52
|
+
* promise that sends the cancel once the snapshots land or the bound passes. */
|
|
53
|
+
export function cancelOwnedShellTrees(ownerSessionId) {
|
|
54
|
+
const owner = String(ownerSessionId || '').trim();
|
|
55
|
+
const pending = prepareOwnedShellTreeKills(owner);
|
|
47
56
|
if (pending.length === 0) return cancelNativeTasks({ ownerSessionId: owner });
|
|
48
57
|
let result = null;
|
|
49
58
|
const send = () => {
|
|
@@ -32,6 +32,9 @@ export const TERMINATION_RECHECK_MS = 5_000;
|
|
|
32
32
|
// read is not abandoned — a snapshot that lands later is still absorbed.
|
|
33
33
|
export const PROCESS_TABLE_READ_BOUND_MS = 2_000;
|
|
34
34
|
|
|
35
|
+
// Kill-and-observe rounds of a survivor kill before it reports what is left.
|
|
36
|
+
const KILL_ROUNDS = 3;
|
|
37
|
+
|
|
35
38
|
/** Resolve `promise`'s value, or `onTimeout` once `ms` elapse first. The
|
|
36
39
|
* bound's timer is cleared whichever side wins. */
|
|
37
40
|
export function withinBound(promise, ms, onTimeout) {
|
|
@@ -169,24 +172,53 @@ export function createProcessTreeTracker({ pid, members = [], exitObserved = fal
|
|
|
169
172
|
};
|
|
170
173
|
}
|
|
171
174
|
|
|
175
|
+
/** Terminate every identity the last observation found alive (console hosts
|
|
176
|
+
* excepted: they are witnesses, never workers). These are processes of a tree
|
|
177
|
+
* that was KILLED — they escaped its process group (setsid, job control, a
|
|
178
|
+
* double fork that kept its parent link) or outlived the root on Windows —
|
|
179
|
+
* so the kill is not finished while they run. Windows: taskkill /T /F;
|
|
180
|
+
* POSIX: SIGTERM, then SIGKILL after a short grace. */
|
|
181
|
+
function sweepLiveIdentities(tracker) {
|
|
182
|
+
const targets = tracker.live
|
|
183
|
+
.filter((entry) => entry.token != null && !CONSOLE_HOST.test(entry.name))
|
|
184
|
+
.map((entry) => entry.pid);
|
|
185
|
+
return targets.length > 0 ? killProcessTrees(targets) : Promise.resolve();
|
|
186
|
+
}
|
|
187
|
+
|
|
172
188
|
/** One observation loop: observe now, then every `intervalMs` until the tree
|
|
173
189
|
* is confirmed gone, then run `onTerminated` once. 'running', 'unknown', a
|
|
174
190
|
* failed or unanswered (by the next cadence tick) observation and a failing
|
|
175
191
|
* `onTerminated` all re-check on the same cadence; the first pass that is not
|
|
176
192
|
* 'gone' calls `onUnconfirmed` once. The returned stop() clears the pending
|
|
177
193
|
* timer; nothing else (listener, timer) outlives the loop. Nothing in it ever
|
|
178
|
-
* releases on time alone.
|
|
194
|
+
* releases on time alone.
|
|
195
|
+
*
|
|
196
|
+
* `sweep` (a killed tree): a pass that finds captured identities alive
|
|
197
|
+
* terminates them and observes again in the same pass, so a cancellation
|
|
198
|
+
* ends with the tree gone instead of a held folder over live processes.
|
|
199
|
+
*
|
|
200
|
+
* `ownerClosed`: once the owning session has closed and the root has
|
|
201
|
+
* exited, a tree without a complete pre-kill snapshot is observed after
|
|
202
|
+
* exit (what is still linked to the root) instead of answering 'unknown'
|
|
203
|
+
* forever — no one is left to release it, and the close must end in a
|
|
204
|
+
* definitive state. `onSurvivors(pids)` reports the pids a pass that is
|
|
205
|
+
* not 'gone' found alive, whenever that set changes, so out-of-process
|
|
206
|
+
* readers can tell a live hold from a stale one. */
|
|
179
207
|
export function watchTermination({
|
|
180
208
|
tracker,
|
|
181
209
|
rootExited = () => true,
|
|
182
210
|
onTerminated,
|
|
183
211
|
onUnconfirmed = null,
|
|
212
|
+
onSurvivors = null,
|
|
213
|
+
ownerClosed = null,
|
|
184
214
|
releaseRequested = null,
|
|
185
215
|
intervalMs = TERMINATION_RECHECK_MS,
|
|
216
|
+
sweep = false,
|
|
186
217
|
}) {
|
|
187
218
|
let timer = null;
|
|
188
219
|
let stopped = false;
|
|
189
220
|
let reportedUnconfirmed = false;
|
|
221
|
+
let survivorKey = null;
|
|
190
222
|
const stop = () => {
|
|
191
223
|
stopped = true;
|
|
192
224
|
if (timer) clearTimeout(timer);
|
|
@@ -202,10 +234,22 @@ export function watchTermination({
|
|
|
202
234
|
if (releaseRequested?.()) state = 'gone';
|
|
203
235
|
else
|
|
204
236
|
try {
|
|
237
|
+
if (!tracker.complete && rootExited() && ownerClosed?.()) tracker.acceptExitObservation();
|
|
205
238
|
observation = tracker.observe({ rootExited: rootExited() });
|
|
206
239
|
observation.catch(() => {});
|
|
207
240
|
// A pass that has not answered by the next cadence tick is unknown.
|
|
208
241
|
state = await withinBound(observation, intervalMs, 'unknown');
|
|
242
|
+
if (state === 'running' && sweep && !stopped) {
|
|
243
|
+
await withinBound(
|
|
244
|
+
sweepLiveIdentities(tracker).catch(() => {}),
|
|
245
|
+
intervalMs,
|
|
246
|
+
null
|
|
247
|
+
);
|
|
248
|
+
await observation.catch(() => {});
|
|
249
|
+
observation = tracker.observe({ rootExited: rootExited() });
|
|
250
|
+
observation.catch(() => {});
|
|
251
|
+
state = await withinBound(observation, intervalMs, 'unknown');
|
|
252
|
+
}
|
|
209
253
|
} catch {
|
|
210
254
|
state = 'unknown';
|
|
211
255
|
}
|
|
@@ -218,6 +262,18 @@ export function watchTermination({
|
|
|
218
262
|
/* presentation only */
|
|
219
263
|
}
|
|
220
264
|
}
|
|
265
|
+
if (state !== 'gone' && onSurvivors) {
|
|
266
|
+
const pids = tracker.live.map((entry) => entry.pid);
|
|
267
|
+
const key = pids.join(',');
|
|
268
|
+
if (key !== survivorKey) {
|
|
269
|
+
survivorKey = key;
|
|
270
|
+
try {
|
|
271
|
+
onSurvivors(pids);
|
|
272
|
+
} catch {
|
|
273
|
+
/* presentation only */
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
221
277
|
if (state === 'gone') {
|
|
222
278
|
try {
|
|
223
279
|
await onTerminated();
|
|
@@ -365,7 +421,13 @@ export async function killShellDescendants(handle) {
|
|
|
365
421
|
.map((entry) => entry.pid);
|
|
366
422
|
await killProcessTrees(targets).catch(() => {});
|
|
367
423
|
const tracker = trackerFor(handle);
|
|
368
|
-
|
|
424
|
+
let state = await tracker.observe({ rootExited: true });
|
|
425
|
+
// What the first kill missed (a child forked meanwhile, a slow exit) is
|
|
426
|
+
// found by the re-observation itself and killed in the next round.
|
|
427
|
+
for (let round = 1; state === 'running' && round < KILL_ROUNDS; round += 1) {
|
|
428
|
+
await sweepLiveIdentities(tracker).catch(() => {});
|
|
429
|
+
state = await tracker.observe({ rootExited: true });
|
|
430
|
+
}
|
|
369
431
|
return { terminated: state === 'gone', survivors: tracker.live.map((entry) => entry.pid) };
|
|
370
432
|
} catch {
|
|
371
433
|
return { terminated: false, survivors: [...handle.watchPids] };
|
|
@@ -60,6 +60,14 @@ export async function promoteWithRetry(
|
|
|
60
60
|
*/
|
|
61
61
|
export function killAfterFailedPromotion(run, reason, promotionFailure) {
|
|
62
62
|
run.autoBackgrounded = false;
|
|
63
|
+
// The command finished while it was being promoted (the spawn server
|
|
64
|
+
// releases a foreground task's record at its exit, so the promotion found
|
|
65
|
+
// none): report that completion. Killing the exited root would have no
|
|
66
|
+
// pre-kill snapshot and hold the workspace as unconfirmed for good.
|
|
67
|
+
if (run.child.exitCode != null || run.child.signalCode != null) {
|
|
68
|
+
if (run.promotionClose) void run.settle(...run.promotionClose);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
63
71
|
if (reason === 'timeout') {
|
|
64
72
|
run.timedOut = true;
|
|
65
73
|
treeKillForceSettle(run, 'timeout');
|
|
@@ -75,8 +83,8 @@ export function killAfterFailedPromotion(run, reason, promotionFailure) {
|
|
|
75
83
|
}
|
|
76
84
|
|
|
77
85
|
/**
|
|
78
|
-
* The promoted job leaves foreground admission: its lease is RELEASED
|
|
79
|
-
*
|
|
86
|
+
* The promoted job leaves foreground admission: its lease is RELEASED. A
|
|
87
|
+
* long-lived server must never
|
|
80
88
|
* hold a foreground slot for its whole life; background jobs are not counted
|
|
81
89
|
* against any cap (session/runtime close stops them via shutdownShellJobs).
|
|
82
90
|
*/
|
|
@@ -13,7 +13,18 @@ import {
|
|
|
13
13
|
} from '../shell-run-state.mjs';
|
|
14
14
|
|
|
15
15
|
const BACKGROUND_GUIDANCE =
|
|
16
|
-
'
|
|
16
|
+
'Its result is delivered automatically when it finishes; use task wait only if you need it now.';
|
|
17
|
+
|
|
18
|
+
function backgroundVerb(reason, secs) {
|
|
19
|
+
if (reason === 'timeout') return `moved to background at timeout after ${secs}s`;
|
|
20
|
+
if (reason === 'input') return `moved to background on new user input after ${secs}s`;
|
|
21
|
+
if (reason === 'notification') {
|
|
22
|
+
return `moved to background after ${secs}s because a notification arrived (delivered to you now)`;
|
|
23
|
+
}
|
|
24
|
+
if (reason === 'interrupt') return `moved to background on interrupt after ${secs}s`;
|
|
25
|
+
if (reason === 'background') return 'started in the background';
|
|
26
|
+
return `moved to background after the ${secs}s hold`;
|
|
27
|
+
}
|
|
17
28
|
|
|
18
29
|
export function promotedSpillPaths(taskOutput) {
|
|
19
30
|
return {
|
|
@@ -89,8 +100,7 @@ export function resolveBackgrounded(run, { jobId, reason, remainingBackgroundTim
|
|
|
89
100
|
// frame alive and could later kill an unrelated, already-returned job.
|
|
90
101
|
detachAbortHandler(run);
|
|
91
102
|
const secs = Math.max(0, Math.round(elapsedSinceStart(run) / 1000));
|
|
92
|
-
const verb =
|
|
93
|
-
reason === 'timeout' ? `moved to background at timeout after ${secs}s` : `auto-backgrounded after ${secs}s`;
|
|
103
|
+
const verb = backgroundVerb(reason, secs);
|
|
94
104
|
run.resolveResult(
|
|
95
105
|
new ExecResult({
|
|
96
106
|
...capturedFields(run, capture),
|
|
@@ -8,6 +8,8 @@ import { unregisterOwnedShellTree } from './owned-shell-trees.mjs';
|
|
|
8
8
|
import {
|
|
9
9
|
adoptShellWorkspaceAdmission,
|
|
10
10
|
clearTerminationHold,
|
|
11
|
+
isShellOwnerSessionClosed,
|
|
12
|
+
noteShellJobSurvivors,
|
|
11
13
|
registerTerminationHold,
|
|
12
14
|
takeReleaseRequest,
|
|
13
15
|
} from '../builtin/lib/shell-job-records.mjs';
|
|
@@ -56,8 +58,12 @@ export function releaseAdmissionOnConfirmedTermination(run, { markNow = true } =
|
|
|
56
58
|
run.stopTerminationWatch = watchTermination({
|
|
57
59
|
tracker: run.terminationTracker,
|
|
58
60
|
rootExited: () => child.exitCode != null || child.signalCode != null,
|
|
61
|
+
// A killed run is not over while processes it started still run.
|
|
62
|
+
sweep: run.killed === true,
|
|
59
63
|
onTerminated: release,
|
|
60
64
|
onUnconfirmed: markNow ? null : () => keepTerminationUnconfirmedRecord(run),
|
|
65
|
+
onSurvivors: (pids) => void noteShellJobSurvivors(run.foregroundRecordId, pids),
|
|
66
|
+
ownerClosed: () => isShellOwnerSessionClosed(run.foregroundRecordInput?.ownerSessionId),
|
|
61
67
|
releaseRequested: () => takeReleaseRequest(run.foregroundRecordId),
|
|
62
68
|
});
|
|
63
69
|
}
|
|
@@ -162,6 +168,8 @@ export function createSettle(run, releasePromotedCapture) {
|
|
|
162
168
|
if (run.settled) return;
|
|
163
169
|
if (run.ownedTree) unregisterOwnedShellTree(run.foregroundRecordId, run.ownedTree);
|
|
164
170
|
if (run.autoBackgrounded) {
|
|
171
|
+
// A failed promotion settles the run with this close instead.
|
|
172
|
+
run.promotionClose = [exitCode, signal];
|
|
165
173
|
releasePromotedCapture();
|
|
166
174
|
return;
|
|
167
175
|
}
|
|
@@ -30,7 +30,9 @@ export function registerForegroundOwnedTree(run, ownerSessionId) {
|
|
|
30
30
|
run.killed = true;
|
|
31
31
|
run.ownerCancelled = true;
|
|
32
32
|
run.killCause = run.killCause || 'session-close';
|
|
33
|
-
|
|
33
|
+
// Always a fresh read: an earlier one predates what the run started
|
|
34
|
+
// since. Pending, the kill is sent at the snapshot bound regardless.
|
|
35
|
+
return capturePreKill(run);
|
|
34
36
|
},
|
|
35
37
|
};
|
|
36
38
|
registerOwnedShellTree(run.foregroundRecordId, run.ownedTree);
|
|
@@ -102,6 +104,9 @@ export function createShellRun({ abortSignal, resolve, jobId = null }) {
|
|
|
102
104
|
// `settled`: whichever transition wins first wins for good.
|
|
103
105
|
autoBackgrounded: false,
|
|
104
106
|
autoBackgroundJobId: null,
|
|
107
|
+
// [exitCode, signal] of a 'close' that arrived while promotion was in
|
|
108
|
+
// flight; a promotion that then fails settles the run with it.
|
|
109
|
+
promotionClose: null,
|
|
105
110
|
autoBgTimer: null,
|
|
106
111
|
killUnconfirmed: false,
|
|
107
112
|
child: null,
|
|
@@ -829,7 +829,7 @@ function unifiedUpdateHunks(sourceLines, section, displayPath, { fuzzy, rejectPa
|
|
|
829
829
|
const loc = resolveV4AHunkPosition(sourceLines, hunk, nextSearchLine, { fuzzy });
|
|
830
830
|
if (loc.skip) continue;
|
|
831
831
|
if (loc.error) {
|
|
832
|
-
const msg = `${loc.error.replace(/^V4A hunk /, `V4A hunk ${section.path}: `)}`;
|
|
832
|
+
const msg = `${loc.error.replace(/^V4A hunk /, () => `V4A hunk ${section.path}: `)}`;
|
|
833
833
|
if (rejectPartial) throw new Error(msg);
|
|
834
834
|
if (rejectedHunks) rejectedHunks.push({ file: section.path, hunk, reason: msg });
|
|
835
835
|
continue;
|
|
@@ -288,6 +288,7 @@ async function settleQueuedPromotion(jobId) {
|
|
|
288
288
|
function queueSaturatedAsTask(run, saturation, spec) {
|
|
289
289
|
const queuedAbort = new AbortController();
|
|
290
290
|
const taskId = run.foregroundRecordId;
|
|
291
|
+
let promotedJobId = null;
|
|
291
292
|
let task;
|
|
292
293
|
try {
|
|
293
294
|
task = startBackgroundTask({
|
|
@@ -301,10 +302,15 @@ function queueSaturatedAsTask(run, saturation, spec) {
|
|
|
301
302
|
input: { command: spec.command, cwd: spec.cwd },
|
|
302
303
|
meta: { task_id: taskId, stdout: null, stderr: null, cwd: spec.cwd, timeoutMs: spec.backgroundDeadlineMs || 0 },
|
|
303
304
|
resultType: 'shell_task_result',
|
|
305
|
+
// While the command runs in the foreground, its abort handler snapshots
|
|
306
|
+
// the tree before it kills. A native kill sent here as well would end
|
|
307
|
+
// the root first: the snapshot then misses the tree and the workspace
|
|
308
|
+
// stays held as unconfirmed forever. Only a promoted job is killed here.
|
|
304
309
|
cancel: () => {
|
|
305
310
|
queuedAbort.abort();
|
|
311
|
+
if (!promotedJobId) return;
|
|
306
312
|
try {
|
|
307
|
-
killShellJob(
|
|
313
|
+
killShellJob(promotedJobId);
|
|
308
314
|
} catch {}
|
|
309
315
|
},
|
|
310
316
|
run: async () => {
|
|
@@ -313,11 +319,23 @@ function queueSaturatedAsTask(run, saturation, spec) {
|
|
|
313
319
|
jobId: taskId,
|
|
314
320
|
abortSignal: queuedAbort.signal,
|
|
315
321
|
admissionWaitMs: 0,
|
|
316
|
-
// The call already returned: nobody renders live progress
|
|
322
|
+
// The call already returned: nobody renders live progress, and no
|
|
323
|
+
// hold remains for user input to end.
|
|
324
|
+
wakeSignal: null,
|
|
317
325
|
onProgress: null,
|
|
318
326
|
onOutputTail: null,
|
|
319
327
|
});
|
|
320
|
-
if (result.backgrounded && result.jobId)
|
|
328
|
+
if (result.backgrounded && result.jobId) {
|
|
329
|
+
promotedJobId = result.jobId;
|
|
330
|
+
// Promotion detached the abort handler: a cancel that landed during
|
|
331
|
+
// the handoff reaches the promoted job here.
|
|
332
|
+
if (queuedAbort.signal.aborted) {
|
|
333
|
+
try {
|
|
334
|
+
killShellJob(promotedJobId);
|
|
335
|
+
} catch {}
|
|
336
|
+
}
|
|
337
|
+
return settleQueuedPromotion(promotedJobId);
|
|
338
|
+
}
|
|
321
339
|
const output = [result.stdout, result.stderr].filter(Boolean).join('\n');
|
|
322
340
|
if (result.exitCode !== 0) {
|
|
323
341
|
throw new Error(`exit code ${result.exitCode ?? result.signal ?? 'unknown'}${output ? `\n${output}` : ''}`);
|
|
@@ -465,7 +483,27 @@ const promotable = (run, backgroundOnTimeout) =>
|
|
|
465
483
|
run.child?.exitCode == null &&
|
|
466
484
|
run.child?.signalCode == null;
|
|
467
485
|
|
|
468
|
-
|
|
486
|
+
// New user input or a queued task notification during the hold moves a
|
|
487
|
+
// still-running command to the background at once (never a kill): the call
|
|
488
|
+
// returns to the agent loop, which delivers it at the next boundary.
|
|
489
|
+
function armInputWake(run, wakeSignal, fireAutoBackground) {
|
|
490
|
+
if (!wakeSignal) return;
|
|
491
|
+
const onWake = () => {
|
|
492
|
+
const reason = wakeSignal.reason === 'notification' ? 'notification' : 'input';
|
|
493
|
+
if (promotable(run, true)) fireAutoBackground({ reason });
|
|
494
|
+
};
|
|
495
|
+
if (wakeSignal.aborted) {
|
|
496
|
+
onWake();
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
wakeSignal.addEventListener('abort', onWake, { once: true });
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function armDeadlines(
|
|
503
|
+
run,
|
|
504
|
+
{ timeoutMs, autoBackgroundMs, autoBackgroundReason, backgroundOnTimeout, abortSignal },
|
|
505
|
+
fireAutoBackground
|
|
506
|
+
) {
|
|
469
507
|
if (timeoutMs > 0) {
|
|
470
508
|
run.timer = setTimeout(() => {
|
|
471
509
|
// Promote-on-timeout: if the caller allows backgrounding and the child
|
|
@@ -490,7 +528,7 @@ function armDeadlines(run, { timeoutMs, autoBackgroundMs, backgroundOnTimeout, a
|
|
|
490
528
|
(timeoutMs <= 0 || autoBackgroundMs < timeoutMs)
|
|
491
529
|
) {
|
|
492
530
|
run.autoBgTimer = setTimeout(() => {
|
|
493
|
-
fireAutoBackground();
|
|
531
|
+
fireAutoBackground({ reason: autoBackgroundReason || 'threshold' });
|
|
494
532
|
}, autoBackgroundMs);
|
|
495
533
|
if (run.autoBgTimer.unref) run.autoBgTimer.unref();
|
|
496
534
|
}
|
|
@@ -525,7 +563,11 @@ export function execShellCommand(options) {
|
|
|
525
563
|
cwd,
|
|
526
564
|
timeoutMs,
|
|
527
565
|
abortSignal,
|
|
566
|
+
// Aborted when new user input should end the hold (task-wait-control).
|
|
567
|
+
wakeSignal = null,
|
|
528
568
|
autoBackgroundMs,
|
|
569
|
+
// 'background' for an explicit background start; the hold otherwise.
|
|
570
|
+
autoBackgroundReason = 'threshold',
|
|
529
571
|
onProgress,
|
|
530
572
|
onOutputTail,
|
|
531
573
|
clientHostPid,
|
|
@@ -547,60 +589,67 @@ export function execShellCommand(options) {
|
|
|
547
589
|
// The user approved this call's elevation 'ask' decision (runtime-set).
|
|
548
590
|
elevationApproved = false,
|
|
549
591
|
} = options;
|
|
550
|
-
return new Promise(
|
|
592
|
+
return new Promise((resolve) => {
|
|
551
593
|
const run = createShellRun({ abortSignal, resolve, jobId });
|
|
552
|
-
//
|
|
553
|
-
// unhandled rejection
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
594
|
+
// A throw inside this async body is NOT routed to the Promise — it becomes
|
|
595
|
+
// an unhandled rejection while the awaiting caller hangs forever. Every
|
|
596
|
+
// path below therefore has to settle the run itself, including the
|
|
597
|
+
// unexpected one.
|
|
598
|
+
void (async () => {
|
|
599
|
+
try {
|
|
600
|
+
const spawned = await admitAndSpawn(
|
|
601
|
+
run,
|
|
602
|
+
{
|
|
603
|
+
admission,
|
|
604
|
+
shell,
|
|
605
|
+
shellArg,
|
|
606
|
+
shellArgs,
|
|
607
|
+
command,
|
|
608
|
+
env,
|
|
609
|
+
cwd,
|
|
610
|
+
abortSignal,
|
|
611
|
+
directArgv,
|
|
612
|
+
execScript,
|
|
613
|
+
elevationApproved,
|
|
614
|
+
ownerSessionId,
|
|
615
|
+
clientHostPid,
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
admissionWaitMs,
|
|
619
|
+
onSaturated: (err) => backgroundOnTimeout && queueSaturatedAsTask(run, err, options),
|
|
620
|
+
}
|
|
621
|
+
);
|
|
622
|
+
if (!spawned) return;
|
|
623
|
+
|
|
624
|
+
// Pre-aborted signal: kill immediately if the abort already fired
|
|
625
|
+
// before spawn returned (synchronous reentry from a parent abort), so
|
|
626
|
+
// the child doesn't run for the full timeoutMs window.
|
|
627
|
+
if (abortSignal?.aborted) {
|
|
628
|
+
treeKillForceSettle(run, 'cancellation');
|
|
629
|
+
}
|
|
630
|
+
attachOutputCapture(run);
|
|
631
|
+
const releasePromotedCapture = createPromotedCaptureRelease(run);
|
|
632
|
+
run.settle = createSettle(run, releasePromotedCapture);
|
|
633
|
+
attachChildExit(run, releasePromotedCapture);
|
|
634
|
+
const fireAutoBackground = createAutoBackground({
|
|
635
|
+
run,
|
|
564
636
|
command,
|
|
565
|
-
env,
|
|
566
637
|
cwd,
|
|
567
|
-
abortSignal,
|
|
568
|
-
directArgv,
|
|
569
|
-
execScript,
|
|
570
|
-
elevationApproved,
|
|
571
|
-
ownerSessionId,
|
|
572
638
|
clientHostPid,
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
639
|
+
ownerSessionId,
|
|
640
|
+
promotedTimeoutMs,
|
|
641
|
+
backgroundDeadlineMs,
|
|
642
|
+
});
|
|
643
|
+
armDeadlines(
|
|
644
|
+
run,
|
|
645
|
+
{ timeoutMs, autoBackgroundMs, autoBackgroundReason, backgroundOnTimeout, abortSignal },
|
|
646
|
+
fireAutoBackground
|
|
647
|
+
);
|
|
648
|
+
armInputWake(run, wakeSignal, fireAutoBackground);
|
|
649
|
+
armProgressTimers(run, { onProgress, onOutputTail });
|
|
650
|
+
} catch (err) {
|
|
651
|
+
settleSetupFailure(run, err);
|
|
586
652
|
}
|
|
587
|
-
|
|
588
|
-
const releasePromotedCapture = createPromotedCaptureRelease(run);
|
|
589
|
-
run.settle = createSettle(run, releasePromotedCapture);
|
|
590
|
-
attachChildExit(run, releasePromotedCapture);
|
|
591
|
-
const fireAutoBackground = createAutoBackground({
|
|
592
|
-
run,
|
|
593
|
-
command,
|
|
594
|
-
cwd,
|
|
595
|
-
clientHostPid,
|
|
596
|
-
ownerSessionId,
|
|
597
|
-
promotedTimeoutMs,
|
|
598
|
-
backgroundDeadlineMs,
|
|
599
|
-
});
|
|
600
|
-
armDeadlines(run, { timeoutMs, autoBackgroundMs, backgroundOnTimeout, abortSignal }, fireAutoBackground);
|
|
601
|
-
armProgressTimers(run, { onProgress, onOutputTail });
|
|
602
|
-
} catch (err) {
|
|
603
|
-
settleSetupFailure(run, err);
|
|
604
|
-
}
|
|
653
|
+
})();
|
|
605
654
|
});
|
|
606
655
|
}
|
|
@@ -273,6 +273,8 @@ export function isBlockedCommand(command) {
|
|
|
273
273
|
return decoded !== null && _blockedText(decoded);
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
const WMIC_PROCESS_COMMAND_RE = /^\s*(?:&\s*)?(?:cmd(?:\.exe)?\s+\/c\s+["']?)?(?:\S*[\\/])?wmic(?:\.exe)?\s+process\b/i;
|
|
277
|
+
|
|
276
278
|
const WMIC_PROCESS_DEFAULT_FIELDS = Object.freeze([
|
|
277
279
|
'ProcessId',
|
|
278
280
|
'Name',
|
|
@@ -336,8 +338,11 @@ export function maybeRewriteWmicProcessCommand(command) {
|
|
|
336
338
|
// silently drop surrounding `cd`, pipes, `&&`/`;` segments. For composite
|
|
337
339
|
// commands containing wmic, return null so the caller falls back to other
|
|
338
340
|
// policy handling instead of dropping context.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
+
// Only a command that IS a wmic call is rewritten. The words `wmic process`
|
|
342
|
+
// inside a search pattern, a commit message or a file being written are text:
|
|
343
|
+
// replacing that whole command would discard it.
|
|
344
|
+
if (!WMIC_PROCESS_COMMAND_RE.test(text)) return null;
|
|
345
|
+
if (/[|&;]|\$\(|`/.test(text)) return null;
|
|
341
346
|
if (!/\bget\b/i.test(text)) {
|
|
342
347
|
return {
|
|
343
348
|
error:
|