@duckmind/dm-windows-x64 0.60.4 → 0.60.8
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/dm.exe +0 -0
- package/extensions/.dm-extensions.json +70 -123
- package/extensions/dm-9router-ext/src/index.js +410 -5
- package/extensions/dm-caveman/extensions/caveman.js +283 -12
- package/extensions/dm-cliproxy/index.js +182 -2
- package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
- package/extensions/dm-cliproxy/src/apply.js +228 -1
- package/extensions/dm-cliproxy/src/cache.js +42 -1
- package/extensions/dm-cliproxy/src/commands.js +50 -2
- package/extensions/dm-cliproxy/src/compat.js +81 -1
- package/extensions/dm-cliproxy/src/config.js +192 -2
- package/extensions/dm-cliproxy/src/conflicts.js +46 -1
- package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
- package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
- package/extensions/dm-cliproxy/src/log.js +23 -1
- package/extensions/dm-cliproxy/src/status-quota.js +77 -1
- package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
- package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
- package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
- package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
- package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
- package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
- package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
- package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
- package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
- package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
- package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
- package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
- package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
- package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
- package/extensions/dm-context/src/context.js +144 -1
- package/extensions/dm-context/src/index.js +339 -7
- package/extensions/dm-context/src/utils.js +9 -1
- package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
- package/extensions/dm-cua/index.js +75 -6
- package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
- package/extensions/dm-cua/src/browser-install.mjs +331 -2
- package/extensions/dm-fff/src/index.js +688 -12
- package/extensions/dm-fff/src/query.js +60 -1
- package/extensions/dm-goal/src/goal.js +894 -23
- package/extensions/dm-image2/index.js +103 -9
- package/extensions/dm-image2/src/image-lib.mjs +1275 -8
- package/extensions/dm-subagents/install.mjs +62 -8
- package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
- package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
- package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
- package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
- package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
- package/extensions/dm-subagents/src/agents/agents.js +1139 -11
- package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
- package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
- package/extensions/dm-subagents/src/agents/identity.js +29 -1
- package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
- package/extensions/dm-subagents/src/agents/skills.js +614 -6
- package/extensions/dm-subagents/src/extension/config.js +35 -2
- package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
- package/extensions/dm-subagents/src/extension/doctor.js +172 -15
- package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
- package/extensions/dm-subagents/src/extension/index.js +521 -359
- package/extensions/dm-subagents/src/extension/rpc.js +266 -7
- package/extensions/dm-subagents/src/extension/schemas.js +275 -1
- package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
- package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
- package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
- package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
- package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
- package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
- package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
- package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
- package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
- package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
- package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
- package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
- package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
- package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
- package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
- package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
- package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
- package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
- package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
- package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
- package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
- package/extensions/dm-subagents/src/shared/formatters.js +98 -7
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
- package/extensions/dm-subagents/src/shared/model-info.js +62 -1
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
- package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
- package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
- package/extensions/dm-subagents/src/shared/settings.js +198 -11
- package/extensions/dm-subagents/src/shared/status-format.js +53 -1
- package/extensions/dm-subagents/src/shared/types.js +184 -6
- package/extensions/dm-subagents/src/shared/utils.js +462 -2
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
- package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
- package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
- package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
- package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
- package/extensions/dm-subagents/src/tui/render.js +1542 -4
- package/extensions/dm-usage/index.js +1294 -9
- package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
- package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
- package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
- package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
- package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
- package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
- package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
- package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
- package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
- package/extensions/greedysearch-dm/bin/search.mjs +620 -540
- package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
- package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
- package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
- package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
- package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
- package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
- package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
- package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
- package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
- package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
- package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
- package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
- package/extensions/greedysearch-dm/index.js +123 -23
- package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
- package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
- package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
- package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
- package/extensions/greedysearch-dm/src/github.mjs +222 -7
- package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
- package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
- package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
- package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
- package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
- package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
- package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
- package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
- package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
- package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
- package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
- package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
- package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
- package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
- package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
- package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
- package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
- package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
- package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
- package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
- package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
- package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
- package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
- package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
- package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
- package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
- package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
- package/package.json +1 -1
|
@@ -1,11 +1,308 @@
|
|
|
1
|
-
import*as H from"node:fs";import*as U from"node:path";import*as V$ from"node:fs";import*as C from"node:path";var L$=[10,25,50,100,200,500,1000,2000,4000],U$=new Set(["EACCES","EBUSY","EPERM"]),p=typeof SharedArrayBuffer<"u"?new SharedArrayBuffer(4):void 0,u=p?new Int32Array(p):void 0;function M$($){if($<=0)return;if(u)try{Atomics.wait(u,0,0,$);return}catch{}let J=Date.now()+$;while(Date.now()<J);}function f$($){let J=$?.code;return typeof J==="string"&&U$.has(J)}function A$($,J,j,Z,W){for(let Q=0;;Q++)try{$.renameSync(J,j);return}catch(B){let O=Z[Q];if(O===void 0||!f$(B))throw B;W(O)}}function z$($={}){let J=$.fs??V$,j=$.now??Date.now,Z=$.pid??process.pid,W=$.random??Math.random,B=$.retryRenameErrors??process.platform==="win32"?$.retryDelaysMs??L$:[],O=$.wait??M$;return(K,V)=>{J.mkdirSync(C.dirname(K),{recursive:!0});let L=C.join(C.dirname(K),`.${C.basename(K)}.${Z}.${j()}.${W().toString(36).slice(2)}.tmp`);try{J.writeFileSync(L,JSON.stringify(V,null,2),"utf-8"),A$(J,L,K,B,O)}finally{J.rmSync(L,{force:!0})}}}var _=z$();import*as E from"node:os";import*as y from"node:path";function b($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function T$($){let J=$?.env??process.env,j=$&&Object.hasOwn($,"getuid")?$.getuid:process.getuid?.bind(process);if(typeof j==="function")return`uid-${j()}`;for(let B of["USERNAME","USER","LOGNAME"]){let O=J[B];if(O)return`user-${b(O)}`}let Z=$&&Object.hasOwn($,"userInfo")?$.userInfo:E.userInfo;try{let B=Z?.().username;if(B)return`user-${b(B)}`}catch{}let W=J.USERPROFILE??J.HOME;if(W)return`home-${b(W)}`;let Q=$&&Object.hasOwn($,"homedir")?$.homedir:E.homedir;try{let B=Q?.();if(B)return`home-${b(B)}`}catch{}return"shared"}var F=y.join(E.tmpdir(),`dm-subagents-${T$()}`),I=y.join(F,"async-subagent-results"),F$=y.join(F,"async-subagent-runs"),C$=y.join(F,"chain-runs"),jj=y.join(F,"artifacts");function _$($,J,j){if(typeof $!=="object"||$===null)return!1;let{start:Z,count:W,stepIndex:Q}=$;return typeof Z==="number"&&typeof W==="number"&&typeof Q==="number"&&Number.isInteger(Z)&&Number.isInteger(W)&&Number.isInteger(Q)&&Z>=0&&W>0&&Q>=0&&Q<j&&Z+W<=J}function r($,J,j){if(!Array.isArray($))return[];return $.filter((Z)=>_$(Z,J,j)).sort((Z,W)=>Z.stepIndex-W.stepIndex||Z.start-W.start)}import{randomUUID as x$}from"node:crypto";import*as M from"node:fs";import*as q from"node:path";import*as s from"node:path";var E$=128,y$=4;function k($){return typeof $==="string"&&$.length>0&&$.length<=E$&&!s.isAbsolute($)&&!$.includes("/")&&!$.includes("\\")&&!$.includes("..")}function l($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function i($,J){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function a($){if(!Array.isArray($))return[];return $.map((J)=>{if(!J||typeof J!=="object")return;let j=J;if(!k(j.runId))return;return{runId:j.runId,...l(j.stepIndex)!==void 0?{stepIndex:l(j.stepIndex)}:{},...i(j.agent,128)?{agent:i(j.agent,128)}:{}}}).filter((J)=>Boolean(J)).slice(0,y$)}import*as A from"node:path";import{fileURLToPath as e}from"node:url";import*as z from"node:os";import*as f from"node:path";var bj=f.join(z.homedir(),".config","mcp","mcp.json"),Ij={cursor:[f.join(z.homedir(),".cursor","mcp.json")],"claude-code":[f.join(z.homedir(),".claude","mcp.json"),f.join(z.homedir(),".claude.json"),f.join(z.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[f.join(z.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[f.join(z.homedir(),".codex","config.json")],windsurf:[f.join(z.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};import{Compile as xj}from"typebox/compile";function t($,J){let j=e($),Z=A.extname(j),W=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(Z)?Z:".ts";return A.join(A.dirname(j),`${J}${W}`)}function $$($){return A.basename(e($)).startsWith("dm-args.")}function N$($=import.meta.url){let J=$$($)?"subagent-prompt-runtime":A.join("..","runs","shared","subagent-prompt-runtime");return t($,J)}function R$($=import.meta.url){let J=$$($)?A.join("..","..","extension","fanout-child"):"fanout-child";return t($,J)}var rj=N$(),lj=R$();var j$=q.join(F,"nested-subagent-events");var D$="registry.json",h=65536,v=12,R=16,g=3;function x($){return k($)}function P$($,J){if(!x(J))throw Error(`${$} must be a non-empty safe id token.`)}function J$($,J){P$($,J)}function c($,J){let j=q.resolve($),Z=q.resolve(J);return Z===j||Z.startsWith(`${j}${q.sep}`)}function Q$($){return q.dirname(q.resolve($.eventSink))}function d($){if(J$("rootRunId",$.rootRunId),J$("capabilityToken",$.capabilityToken),!c(j$,$.eventSink))throw Error("Nested event sink is outside the subagent nested event root.");if(!c(j$,$.controlInbox))throw Error("Nested control inbox is outside the subagent nested event root.");if(Q$($)!==q.dirname(q.resolve($.controlInbox)))throw Error("Nested event sink and control inbox must share one route root.")}function W$($,J){if(!J.asyncDir)return;let j=q.resolve(J.asyncDir),Z=q.resolve(F,"nested-subagent-runs",$,J.id),W=q.relative(Z,j);return j===Z||!W.startsWith("..")&&!q.isAbsolute(W)?j:void 0}function X($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function Y($,J=512){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function w$($){if(!$||typeof $!=="object")return;let J=$,j=X(J.input),Z=X(J.output),W=X(J.total);return j!==void 0&&Z!==void 0&&W!==void 0?{input:j,output:Z,total:W}:void 0}function k$($){if(!$||typeof $!=="object")return;let J=$,j=X(J.inputTokens),Z=X(J.outputTokens),W=X(J.costUsd);return j!==void 0&&Z!==void 0&&W!==void 0?{inputTokens:j,outputTokens:Z,costUsd:W}:void 0}function D($){if(!$||typeof $!=="object")return;let J=$,j=X(J.maxTurns),Z=X(J.graceTurns),W=X(J.turnCount),Q=J.outcome==="within-budget"||J.outcome==="wrap-up-requested"||J.outcome==="exceeded"?J.outcome:void 0;if(j===void 0||Z===void 0||W===void 0||!Q)return;return{maxTurns:j,graceTurns:Z,turnCount:W,outcome:Q,...X(J.wrapUpRequestedAtTurn)!==void 0?{wrapUpRequestedAtTurn:X(J.wrapUpRequestedAtTurn)}:{},...X(J.exceededAtTurn)!==void 0?{exceededAtTurn:X(J.exceededAtTurn)}:{}}}function v$($,J){return $==="queued"||$==="running"||$==="complete"||$==="failed"||$==="paused"?$:J}function g$($,J){if(!$||typeof $!=="object")return;let j=$,Z=Y(j.agent,128);if(!Z)return;let W=j.status==="pending"||j.status==="running"||j.status==="complete"||j.status==="completed"||j.status==="failed"||j.status==="paused"?j.status:"pending";return{agent:Z,status:W,...Y(j.sessionFile,2048)?{sessionFile:Y(j.sessionFile,2048)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...X(j.lastActivityAt)!==void 0?{lastActivityAt:X(j.lastActivityAt)}:{},...Y(j.currentTool,128)?{currentTool:Y(j.currentTool,128)}:{},...X(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:X(j.currentToolStartedAt)}:{},...Y(j.currentPath,2048)?{currentPath:Y(j.currentPath,2048)}:{},...X(j.turnCount)!==void 0?{turnCount:X(j.turnCount)}:{},...X(j.toolCount)!==void 0?{toolCount:X(j.toolCount)}:{},...X(j.startedAt)!==void 0?{startedAt:X(j.startedAt)}:{},...X(j.endedAt)!==void 0?{endedAt:X(j.endedAt)}:{},...Y(j.error,1024)?{error:Y(j.error,1024)}:{},...j.timedOut===!0?{timedOut:!0}:{},...D(j.turnBudget)?{turnBudget:D(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...J<g&&Array.isArray(j.children)?{children:j.children.map((Q)=>P(Q,J+1)).filter((Q)=>Boolean(Q)).slice(0,R)}:{}}}function P($,J=0){if(!$||typeof $!=="object")return;let j=$;if(!x(j.id)||!x(j.parentRunId))return;let Z=a(j.path),W=Array.isArray(j.steps)?j.steps.map((O)=>g$(O,J+1)).filter((O)=>Boolean(O)).slice(0,v):void 0,Q=w$(j.totalTokens),B=k$(j.totalCost);return{id:j.id,parentRunId:j.parentRunId,...X(j.parentStepIndex)!==void 0?{parentStepIndex:X(j.parentStepIndex)}:{},...Y(j.parentAgent,128)?{parentAgent:Y(j.parentAgent,128)}:{},depth:Math.min(Math.max(0,X(j.depth)??0),g),path:Z,state:v$(j.state,"running"),...Y(j.asyncDir,2048)?{asyncDir:Y(j.asyncDir,2048)}:{},...X(j.pid)!==void 0&&X(j.pid)>0&&Number.isInteger(X(j.pid))?{pid:X(j.pid)}:{},...Y(j.sessionId,256)?{sessionId:Y(j.sessionId,256)}:{},...Y(j.sessionFile,2048)?{sessionFile:Y(j.sessionFile,2048)}:{},...Y(j.intercomTarget,256)?{intercomTarget:Y(j.intercomTarget,256)}:{},...Y(j.ownerIntercomTarget,256)?{ownerIntercomTarget:Y(j.ownerIntercomTarget,256)}:{},...Y(j.leafIntercomTarget,256)?{leafIntercomTarget:Y(j.leafIntercomTarget,256)}:{},...j.ownerState==="live"||j.ownerState==="gone"||j.ownerState==="unknown"?{ownerState:j.ownerState}:{},...Y(j.controlInbox,2048)?{controlInbox:Y(j.controlInbox,2048)}:{},...Y(j.capabilityToken,128)?{capabilityToken:Y(j.capabilityToken,128)}:{},...j.mode==="single"||j.mode==="parallel"||j.mode==="chain"?{mode:j.mode}:{},...Y(j.agent,128)?{agent:Y(j.agent,128)}:{},...Array.isArray(j.agents)?{agents:j.agents.map((O)=>Y(O,128)).filter((O)=>Boolean(O)).slice(0,v)}:{},...X(j.currentStep)!==void 0?{currentStep:X(j.currentStep)}:{},...X(j.chainStepCount)!==void 0?{chainStepCount:X(j.chainStepCount)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...X(j.lastActivityAt)!==void 0?{lastActivityAt:X(j.lastActivityAt)}:{},...Y(j.currentTool,128)?{currentTool:Y(j.currentTool,128)}:{},...X(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:X(j.currentToolStartedAt)}:{},...Y(j.currentPath,2048)?{currentPath:Y(j.currentPath,2048)}:{},...X(j.turnCount)!==void 0?{turnCount:X(j.turnCount)}:{},...X(j.toolCount)!==void 0?{toolCount:X(j.toolCount)}:{},...Q?{totalTokens:Q}:{},...B?{totalCost:B}:{},...X(j.startedAt)!==void 0?{startedAt:X(j.startedAt)}:{},...X(j.endedAt)!==void 0?{endedAt:X(j.endedAt)}:{},...X(j.lastUpdate)!==void 0?{lastUpdate:X(j.lastUpdate)}:{},...X(j.timeoutMs)!==void 0?{timeoutMs:X(j.timeoutMs)}:{},...X(j.deadlineAt)!==void 0?{deadlineAt:X(j.deadlineAt)}:{},...j.timedOut===!0?{timedOut:!0}:{},...D(j.turnBudget)?{turnBudget:D(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...Y(j.error,1024)?{error:Y(j.error,1024)}:{},...W&&W.length>0?{steps:W}:{},...J<g&&Array.isArray(j.children)?{children:j.children.map((O)=>P(O,J+1)).filter((O)=>Boolean(O)).slice(0,R)}:{}}}function m($,J){if(Buffer.byteLength($,"utf-8")>h)return;let j;try{j=JSON.parse($)}catch{return}if(!j||typeof j!=="object")return;let Z=j;if(Z.type!=="subagent.nested.started"&&Z.type!=="subagent.nested.updated"&&Z.type!=="subagent.nested.completed")return;if(Z.rootRunId!==J.rootRunId||Z.capabilityToken!==J.capabilityToken)return;if(!x(Z.parentRunId))return;let W=X(Z.ts);if(W===void 0)return;let Q=P(Z.child);if(!Q||Q.id===J.rootRunId)return;let B={...Q,controlInbox:J.controlInbox,capabilityToken:J.capabilityToken,ownerState:Q.ownerState??"unknown"};return{type:Z.type,ts:W,rootRunId:J.rootRunId,parentRunId:Z.parentRunId,...X(Z.parentStepIndex)!==void 0?{parentStepIndex:X(Z.parentStepIndex)}:{},capabilityToken:J.capabilityToken,child:B}}function c$($,J){if(!$.includes(`
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { writeAtomicJson } from "../../shared/atomic-json.js";
|
|
4
|
+
import { RESULTS_DIR } from "../../shared/types.js";
|
|
5
|
+
import { normalizeParallelGroups } from "./parallel-groups.js";
|
|
6
|
+
import { nestedSummaryFromAsyncStatus, projectNestedEvents, resolveNestedAsyncDir, writeNestedEvent } from "../shared/nested-events.js";
|
|
7
|
+
function getErrorMessage(error) {
|
|
8
|
+
return error instanceof Error ? error.message : String(error);
|
|
9
|
+
}
|
|
10
|
+
function readRunnerStartupDiagnostics(asyncDir) {
|
|
11
|
+
const stderrPath = path.join(asyncDir, "runner.stderr.log");
|
|
12
|
+
const maxBytes = 64 * 1024;
|
|
13
|
+
let content;
|
|
14
|
+
try {
|
|
15
|
+
const stat = fs.statSync(stderrPath);
|
|
16
|
+
if (stat.size <= 0)
|
|
17
|
+
return;
|
|
18
|
+
const fd = fs.openSync(stderrPath, "r");
|
|
19
|
+
try {
|
|
20
|
+
const bytesToRead = Math.min(stat.size, maxBytes);
|
|
21
|
+
const start = Math.max(0, stat.size - bytesToRead);
|
|
22
|
+
const buffer = Buffer.alloc(bytesToRead);
|
|
23
|
+
fs.readSync(fd, buffer, 0, bytesToRead, start);
|
|
24
|
+
content = buffer.toString("utf-8").trim();
|
|
25
|
+
} finally {
|
|
26
|
+
fs.closeSync(fd);
|
|
27
|
+
}
|
|
28
|
+
} catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!content)
|
|
32
|
+
return;
|
|
33
|
+
const lines = content.split(/\r?\n/).slice(-30).join(`
|
|
34
|
+
`);
|
|
35
|
+
return lines.length > 4000 ? `${lines.slice(-4000)}
|
|
36
|
+
[stderr tail truncated]` : lines;
|
|
37
|
+
}
|
|
38
|
+
function isNotFoundError(error) {
|
|
39
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
40
|
+
}
|
|
41
|
+
function appendJsonlBestEffort(filePath, payload) {
|
|
42
|
+
try {
|
|
43
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
44
|
+
fs.appendFileSync(filePath, `${JSON.stringify(payload)}
|
|
45
|
+
`, "utf-8");
|
|
46
|
+
} catch {}
|
|
47
|
+
}
|
|
48
|
+
function readStatusFile(asyncDir) {
|
|
49
|
+
const statusPath = path.join(asyncDir, "status.json");
|
|
50
|
+
let content;
|
|
51
|
+
try {
|
|
52
|
+
content = fs.readFileSync(statusPath, "utf-8");
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (isNotFoundError(error))
|
|
55
|
+
return null;
|
|
56
|
+
throw new Error(`Failed to read async status file '${statusPath}': ${getErrorMessage(error)}`, {
|
|
57
|
+
cause: error instanceof Error ? error : undefined
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(content);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
throw new Error(`Failed to parse async status file '${statusPath}': ${getErrorMessage(error)}`, {
|
|
64
|
+
cause: error instanceof Error ? error : undefined
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function readResultRepairData(resultPath) {
|
|
69
|
+
try {
|
|
70
|
+
const data = JSON.parse(fs.readFileSync(resultPath, "utf-8"));
|
|
71
|
+
const state = data.success ? "complete" : data.state === "paused" || data.exitCode === 0 ? "paused" : "failed";
|
|
72
|
+
return { state, ...Array.isArray(data.results) ? { results: data.results } : {} };
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (isNotFoundError(error))
|
|
75
|
+
return;
|
|
76
|
+
throw new Error(`Failed to read async result file '${resultPath}': ${getErrorMessage(error)}`, {
|
|
77
|
+
cause: error instanceof Error ? error : undefined
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function childState(overallState, child) {
|
|
82
|
+
if (child?.success === true)
|
|
83
|
+
return "complete";
|
|
84
|
+
if (child?.success === false)
|
|
85
|
+
return "failed";
|
|
86
|
+
return overallState;
|
|
87
|
+
}
|
|
88
|
+
function terminalStatusFromResult(status, resultPath, now) {
|
|
89
|
+
const repair = readResultRepairData(resultPath);
|
|
90
|
+
if (!repair)
|
|
91
|
+
return;
|
|
92
|
+
const steps = (status.steps ?? []).map((step, index) => {
|
|
93
|
+
if (step.status !== "running" && step.status !== "pending")
|
|
94
|
+
return step;
|
|
95
|
+
const child = repair.results?.[index];
|
|
96
|
+
const state = childState(repair.state, child);
|
|
97
|
+
return {
|
|
98
|
+
...step,
|
|
99
|
+
status: state === "complete" ? "complete" : state,
|
|
100
|
+
endedAt: step.endedAt ?? now,
|
|
101
|
+
durationMs: step.startedAt !== undefined && step.durationMs === undefined ? Math.max(0, now - step.startedAt) : step.durationMs,
|
|
102
|
+
exitCode: step.exitCode ?? (state === "complete" || state === "paused" ? 0 : 1),
|
|
103
|
+
error: state === "failed" ? step.error ?? child?.error : step.error,
|
|
104
|
+
sessionFile: step.sessionFile ?? child?.sessionFile,
|
|
105
|
+
model: step.model ?? child?.model,
|
|
106
|
+
attemptedModels: step.attemptedModels ?? child?.attemptedModels,
|
|
107
|
+
modelAttempts: step.modelAttempts ?? child?.modelAttempts
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
...status,
|
|
112
|
+
state: repair.state,
|
|
113
|
+
activityState: undefined,
|
|
114
|
+
lastUpdate: now,
|
|
115
|
+
endedAt: status.endedAt ?? now,
|
|
116
|
+
steps
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function buildStartedStatus(asyncDir, startedRun, now) {
|
|
120
|
+
const startedAt = startedRun.startedAt ?? now;
|
|
121
|
+
const agents = startedRun.agents?.length ? startedRun.agents : ["subagent"];
|
|
122
|
+
const chainStepCount = startedRun.chainStepCount;
|
|
123
|
+
const parallelGroups = chainStepCount !== undefined ? normalizeParallelGroups(startedRun.parallelGroups, agents.length, chainStepCount) : [];
|
|
124
|
+
return {
|
|
125
|
+
runId: startedRun.runId || path.basename(asyncDir),
|
|
126
|
+
...startedRun.sessionId ? { sessionId: startedRun.sessionId } : {},
|
|
127
|
+
mode: startedRun.mode ?? "single",
|
|
128
|
+
state: "running",
|
|
129
|
+
pid: startedRun.pid,
|
|
130
|
+
startedAt,
|
|
131
|
+
lastUpdate: now,
|
|
132
|
+
currentStep: 0,
|
|
133
|
+
...chainStepCount !== undefined ? { chainStepCount } : {},
|
|
134
|
+
...parallelGroups.length ? { parallelGroups } : {},
|
|
135
|
+
steps: agents.map((agent) => ({
|
|
136
|
+
agent,
|
|
137
|
+
status: "running",
|
|
138
|
+
startedAt
|
|
139
|
+
})),
|
|
140
|
+
...startedRun.sessionFile ? { sessionFile: startedRun.sessionFile } : {}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function buildFailedRepair(status, asyncDir, now, reason) {
|
|
144
|
+
const runId = status.runId || path.basename(asyncDir);
|
|
145
|
+
const pid = typeof status.pid === "number" ? status.pid : "unknown";
|
|
146
|
+
const baseMessage = reason ?? `Async runner process ${pid} exited or disappeared before writing a result. Marked run failed by stale-run reconciliation.`;
|
|
147
|
+
const diagnostics = readRunnerStartupDiagnostics(asyncDir);
|
|
148
|
+
const message = diagnostics ? `${baseMessage}
|
|
9
149
|
|
|
10
150
|
Runner stderr tail:
|
|
11
|
-
${
|
|
151
|
+
${diagnostics}` : baseMessage;
|
|
152
|
+
const steps = status.steps?.length ? status.steps : [{ agent: "subagent", status: "running" }];
|
|
153
|
+
const repairedSteps = steps.map((step) => step.status === "running" || step.status === "pending" ? {
|
|
154
|
+
...step,
|
|
155
|
+
status: "failed",
|
|
156
|
+
activityState: undefined,
|
|
157
|
+
endedAt: step.endedAt ?? now,
|
|
158
|
+
durationMs: step.startedAt !== undefined && step.durationMs === undefined ? Math.max(0, now - step.startedAt) : step.durationMs,
|
|
159
|
+
exitCode: step.exitCode ?? 1,
|
|
160
|
+
error: step.error ?? message
|
|
161
|
+
} : step);
|
|
162
|
+
const repairedStatus = {
|
|
163
|
+
...status,
|
|
164
|
+
state: "failed",
|
|
165
|
+
activityState: undefined,
|
|
166
|
+
lastUpdate: now,
|
|
167
|
+
endedAt: now,
|
|
168
|
+
steps: repairedSteps
|
|
169
|
+
};
|
|
170
|
+
const resultAgent = repairedSteps[status.currentStep ?? 0]?.agent ?? repairedSteps[0]?.agent ?? "subagent";
|
|
171
|
+
return {
|
|
172
|
+
status: repairedStatus,
|
|
173
|
+
message,
|
|
174
|
+
result: {
|
|
175
|
+
id: runId,
|
|
176
|
+
agent: resultAgent,
|
|
177
|
+
mode: status.mode,
|
|
178
|
+
success: false,
|
|
179
|
+
state: "failed",
|
|
180
|
+
summary: message,
|
|
181
|
+
results: repairedSteps.map((step) => ({
|
|
182
|
+
agent: step.agent,
|
|
183
|
+
output: step.status === "complete" || step.status === "completed" ? "" : message,
|
|
184
|
+
error: step.status === "complete" || step.status === "completed" ? undefined : step.error ?? message,
|
|
185
|
+
success: step.status === "complete" || step.status === "completed",
|
|
186
|
+
model: step.model,
|
|
187
|
+
attemptedModels: step.attemptedModels,
|
|
188
|
+
modelAttempts: step.modelAttempts,
|
|
189
|
+
sessionFile: step.sessionFile
|
|
190
|
+
})),
|
|
191
|
+
exitCode: 1,
|
|
192
|
+
timestamp: now,
|
|
193
|
+
durationMs: Math.max(0, now - status.startedAt),
|
|
194
|
+
asyncDir,
|
|
195
|
+
sessionId: status.sessionId,
|
|
196
|
+
sessionFile: status.sessionFile
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function writeFailedRepair(asyncDir, status, resultPath, now, reason) {
|
|
201
|
+
const repair = buildFailedRepair(status, asyncDir, now, reason);
|
|
202
|
+
writeAtomicJson(resultPath, repair.result);
|
|
203
|
+
writeAtomicJson(path.join(asyncDir, "status.json"), repair.status);
|
|
204
|
+
appendJsonlBestEffort(path.join(asyncDir, "events.jsonl"), {
|
|
205
|
+
type: "subagent.run.repaired_stale",
|
|
206
|
+
ts: now,
|
|
207
|
+
runId: repair.status.runId,
|
|
208
|
+
pid: status.pid,
|
|
209
|
+
resultPath,
|
|
210
|
+
message: repair.message
|
|
211
|
+
});
|
|
212
|
+
return { status: repair.status, repaired: true, resultPath, message: repair.message };
|
|
213
|
+
}
|
|
214
|
+
function terminal(state) {
|
|
215
|
+
return state === "complete" || state === "failed" || state === "paused";
|
|
216
|
+
}
|
|
217
|
+
function* nestedRuns(children) {
|
|
218
|
+
for (const child of children ?? []) {
|
|
219
|
+
yield child;
|
|
220
|
+
yield* nestedRuns(child.children);
|
|
221
|
+
yield* nestedRuns(child.steps?.flatMap((step) => step.children ?? []));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
export function reconcileNestedAsyncDescendants(route, options = {}) {
|
|
225
|
+
const registry = projectNestedEvents(route);
|
|
226
|
+
for (const run of nestedRuns(registry.children)) {
|
|
227
|
+
if (run.state !== "running" && run.state !== "queued")
|
|
228
|
+
continue;
|
|
229
|
+
const asyncDir = resolveNestedAsyncDir(route.rootRunId, run);
|
|
230
|
+
if (!asyncDir)
|
|
231
|
+
continue;
|
|
232
|
+
const result = reconcileAsyncRun(asyncDir, {
|
|
233
|
+
...options,
|
|
234
|
+
resultsDir: path.join(options.resultsDir ?? RESULTS_DIR, "nested", route.rootRunId)
|
|
235
|
+
});
|
|
236
|
+
const status = result.status;
|
|
237
|
+
if (!status)
|
|
238
|
+
continue;
|
|
239
|
+
if (!result.repaired && !terminal(status.state))
|
|
240
|
+
continue;
|
|
241
|
+
const ts = options.now?.() ?? Date.now();
|
|
242
|
+
writeNestedEvent(route, {
|
|
243
|
+
type: terminal(status.state) ? "subagent.nested.completed" : "subagent.nested.updated",
|
|
244
|
+
ts,
|
|
245
|
+
parentRunId: run.parentRunId,
|
|
246
|
+
parentStepIndex: run.parentStepIndex,
|
|
247
|
+
child: nestedSummaryFromAsyncStatus(status, asyncDir, {
|
|
248
|
+
id: run.id,
|
|
249
|
+
parentRunId: run.parentRunId,
|
|
250
|
+
parentStepIndex: run.parentStepIndex,
|
|
251
|
+
depth: run.depth,
|
|
252
|
+
path: run.path,
|
|
253
|
+
mode: run.mode,
|
|
254
|
+
ts
|
|
255
|
+
})
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function checkPidLiveness(pid, kill = process.kill) {
|
|
260
|
+
try {
|
|
261
|
+
kill(pid, 0);
|
|
262
|
+
return "alive";
|
|
263
|
+
} catch (error) {
|
|
264
|
+
const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
|
|
265
|
+
if (code === "ESRCH")
|
|
266
|
+
return "dead";
|
|
267
|
+
if (code === "EPERM")
|
|
268
|
+
return "unknown";
|
|
269
|
+
return "unknown";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
export function reconcileAsyncRun(asyncDir, options = {}) {
|
|
273
|
+
const now = options.now?.() ?? Date.now();
|
|
274
|
+
const status = readStatusFile(asyncDir);
|
|
275
|
+
const startedStatus = !status && options.startedRun ? buildStartedStatus(asyncDir, options.startedRun, now) : undefined;
|
|
276
|
+
const effectiveStatus = status ?? startedStatus;
|
|
277
|
+
if (!effectiveStatus)
|
|
278
|
+
return { status: null, repaired: false };
|
|
279
|
+
const runId = effectiveStatus.runId || path.basename(asyncDir);
|
|
280
|
+
const resultPath = path.join(options.resultsDir ?? RESULTS_DIR, `${runId}.json`);
|
|
281
|
+
if (fs.existsSync(resultPath)) {
|
|
282
|
+
const terminalStatus = effectiveStatus.state === "running" || effectiveStatus.state === "queued" ? terminalStatusFromResult(effectiveStatus, resultPath, now) : undefined;
|
|
283
|
+
if (terminalStatus) {
|
|
284
|
+
writeAtomicJson(path.join(asyncDir, "status.json"), terminalStatus);
|
|
285
|
+
return { status: terminalStatus, repaired: true, resultPath, message: "Existing async result file was used to repair stale running status." };
|
|
286
|
+
}
|
|
287
|
+
return { status: effectiveStatus, repaired: false, resultPath };
|
|
288
|
+
}
|
|
289
|
+
if (effectiveStatus.state !== "running" || typeof effectiveStatus.pid !== "number") {
|
|
290
|
+
return { status: status ?? null, repaired: false, resultPath };
|
|
291
|
+
}
|
|
292
|
+
if (!status) {
|
|
293
|
+
const startedAt = options.startedRun?.startedAt ?? effectiveStatus.startedAt;
|
|
294
|
+
if (now - startedAt < (options.missingStatusGraceMs ?? 1000)) {
|
|
295
|
+
return { status: null, repaired: false, resultPath };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const liveness = checkPidLiveness(effectiveStatus.pid, options.kill);
|
|
299
|
+
if (liveness !== "dead") {
|
|
300
|
+
const staleAfterMs = options.staleAlivePidMs ?? 24 * 60 * 60 * 1000;
|
|
301
|
+
const lastUpdate = effectiveStatus.lastUpdate ?? effectiveStatus.startedAt;
|
|
302
|
+
if (now - lastUpdate <= staleAfterMs)
|
|
303
|
+
return { status: status ?? null, repaired: false, resultPath };
|
|
304
|
+
const message = `Async runner process ${effectiveStatus.pid} still has a live PID, but status has not updated for ${now - lastUpdate}ms. Marked run failed by stale-run reconciliation because PID ownership cannot be verified.`;
|
|
305
|
+
return writeFailedRepair(asyncDir, effectiveStatus, resultPath, now, message);
|
|
306
|
+
}
|
|
307
|
+
return writeFailedRepair(asyncDir, effectiveStatus, resultPath, now);
|
|
308
|
+
}
|