mixdog 0.9.37 → 0.9.39
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/package.json +9 -4
- package/scripts/abort-recovery-test.mjs +43 -2
- package/scripts/agent-tag-reuse-smoke.mjs +146 -6
- package/scripts/agent-terminal-reap-test.mjs +127 -0
- package/scripts/agent-trace-io-test.mjs +69 -0
- package/scripts/code-graph-disk-hit-test.mjs +224 -0
- package/scripts/dispatch-persist-recovery-test.mjs +141 -0
- package/scripts/execution-completion-dedup-test.mjs +157 -0
- package/scripts/execution-pending-resume-kick-test.mjs +57 -2
- package/scripts/execution-resume-esc-integration-test.mjs +174 -0
- package/scripts/explore-bench.mjs +101 -8
- package/scripts/explore-prompt-policy-test.mjs +156 -11
- package/scripts/find-fuzzy-hidden-test.mjs +122 -0
- package/scripts/internal-comms-bench-test.mjs +226 -0
- package/scripts/internal-comms-bench.mjs +185 -58
- package/scripts/internal-comms-smoke.mjs +171 -23
- package/scripts/live-worker-smoke.mjs +38 -2
- package/scripts/memory-cycle-routing-test.mjs +111 -0
- package/scripts/memory-rule-contract-test.mjs +93 -0
- package/scripts/notify-completion-mirror-test.mjs +73 -0
- package/scripts/output-style-smoke.mjs +2 -2
- package/scripts/rg-runner-test.mjs +240 -0
- package/scripts/routing-corpus-test.mjs +349 -0
- package/scripts/routing-corpus.mjs +211 -32
- package/scripts/session-orphan-sweep-test.mjs +83 -0
- package/scripts/session-sweep.mjs +266 -0
- package/scripts/steering-drain-buckets-test.mjs +179 -0
- package/scripts/tool-smoke.mjs +21 -13
- package/scripts/tool-tui-presentation-test.mjs +202 -0
- package/src/agents/heavy-worker/AGENT.md +10 -7
- package/src/agents/reviewer/AGENT.md +6 -4
- package/src/agents/worker/AGENT.md +7 -5
- package/src/rules/agent/00-common.md +4 -4
- package/src/rules/agent/00-core.md +11 -14
- package/src/rules/agent/20-skip-protocol.md +3 -3
- package/src/rules/agent/30-explorer.md +56 -48
- package/src/rules/agent/40-cycle1-agent.md +15 -24
- package/src/rules/agent/41-cycle2-agent.md +33 -57
- package/src/rules/agent/42-cycle3-agent.md +28 -42
- package/src/rules/lead/01-general.md +7 -10
- package/src/rules/lead/lead-brief.md +11 -14
- package/src/rules/lead/lead-tool.md +6 -5
- package/src/rules/shared/01-tool.md +44 -41
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +37 -1
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +20 -5
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +31 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +13 -7
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +21 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +6 -6
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +17 -38
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +119 -3
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +17 -8
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +270 -78
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +18 -52
- package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +123 -0
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +41 -2
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store.mjs +339 -63
- package/src/runtime/agent/orchestrator/stall-policy.mjs +37 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +25 -20
- package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +118 -53
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +106 -29
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +8 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +33 -2
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +151 -64
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +37 -13
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +84 -49
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +172 -23
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +3 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +68 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +17 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +24 -10
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +4 -7
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +1 -0
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +4 -4
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +4 -3
- package/src/runtime/memory/lib/memory-cycle3.mjs +12 -2
- package/src/runtime/shared/tool-primitives.mjs +4 -1
- package/src/runtime/shared/tool-status.mjs +27 -0
- package/src/runtime/shared/tool-surface.mjs +6 -3
- package/src/session-runtime/config-helpers.mjs +14 -0
- package/src/session-runtime/context-status.mjs +1 -0
- package/src/session-runtime/effort.mjs +6 -2
- package/src/session-runtime/model-recency.mjs +5 -2
- package/src/session-runtime/provider-models.mjs +3 -3
- package/src/session-runtime/runtime-core.mjs +78 -10
- package/src/session-runtime/tool-catalog.mjs +34 -0
- package/src/session-runtime/warmup-schedulers.mjs +7 -1
- package/src/standalone/agent-tool/notify.mjs +13 -0
- package/src/standalone/agent-tool.mjs +45 -69
- package/src/standalone/explore-tool.mjs +6 -7
- package/src/tui/App.jsx +31 -0
- package/src/tui/app/model-options.mjs +5 -3
- package/src/tui/app/model-picker.mjs +12 -24
- package/src/tui/app/transcript-window.mjs +1 -0
- package/src/tui/components/ToolExecution.jsx +11 -6
- package/src/tui/components/TranscriptItem.jsx +1 -1
- package/src/tui/components/tool-execution/surface-detail.mjs +24 -10
- package/src/tui/components/tool-execution/text-format.mjs +10 -19
- package/src/tui/dist/index.mjs +533 -143
- package/src/tui/engine/agent-job-feed.mjs +153 -16
- package/src/tui/engine/agent-response-tail.mjs +68 -0
- package/src/tui/engine/notification-plan.mjs +16 -0
- package/src/tui/engine/queue-helpers.mjs +8 -0
- package/src/tui/engine/session-api.mjs +8 -2
- package/src/tui/engine/session-flow.mjs +34 -2
- package/src/tui/engine/tool-card-results.mjs +54 -32
- package/src/tui/engine/tool-result-status.mjs +75 -21
- package/src/tui/engine/turn.mjs +83 -43
- package/src/tui/engine.mjs +63 -2
- package/src/workflows/bench/WORKFLOW.md +25 -35
- package/src/workflows/default/WORKFLOW.md +38 -32
- package/src/workflows/solo/WORKFLOW.md +19 -22
- package/scripts/_jitter-fuzz.mjs +0 -44410
- package/scripts/_jitter-fuzz2.mjs +0 -44400
- package/scripts/_jitter-probe.mjs +0 -44397
- package/scripts/_jp2.mjs +0 -45614
|
@@ -86,7 +86,7 @@ function statusCopy(name, label, count, doneCount, pending, isError, args = {})
|
|
|
86
86
|
// dropping the pad just normalizes the spacing.
|
|
87
87
|
return formatToolActionHeader(name, args, { pending, count });
|
|
88
88
|
}
|
|
89
|
-
export function ToolExecution({ name, args, result, rawResult, isError, errorCount, callErrorCount, expanded, columns = 80, attached = false, count = 1, completedCount = 0, startedAt = 0, completedAt = 0, aggregate = false, categories = {}, doneCategories = null, headerFinalized = true, deferredDisplayReady = false }) {
|
|
89
|
+
export function ToolExecution({ name, args, result, rawResult, isError, errorCount, callErrorCount, exitErrorCount, expanded, columns = 80, attached = false, count = 1, completedCount = 0, startedAt = 0, completedAt = 0, aggregate = false, categories = {}, doneCategories = null, headerFinalized = true, deferredDisplayReady = false, agentResponseAggregate = false }) {
|
|
90
90
|
const rowWidth = Math.max(1, Number(columns || 80));
|
|
91
91
|
const groupCount = Math.max(1, Number(count || 1));
|
|
92
92
|
const doneCount = Math.max(0, Math.min(groupCount, Number(completedCount || (result == null ? 0 : groupCount))));
|
|
@@ -138,6 +138,9 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
138
138
|
// paint the dot red. Fall back to 0 (never `isError`) when the engine did not
|
|
139
139
|
// supply a call-error count so a result failure can't leak into the dot.
|
|
140
140
|
const callFailedCount = clampFailureCount(callErrorCount, groupCount, false);
|
|
141
|
+
// Shell command-exits (ran, non-zero exit). Counted separately so the dot
|
|
142
|
+
// paints the neutral warning "Exit" color instead of red or green success.
|
|
143
|
+
const exitFailedCount = clampFailureCount(exitErrorCount, groupCount, false);
|
|
141
144
|
const displayGroupCount = groupCount;
|
|
142
145
|
const displayCategories = normalizeCountMap(categories || {});
|
|
143
146
|
// In the DONE state, count only successful calls: error-terminated calls are
|
|
@@ -212,7 +215,7 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
212
215
|
const aggregateTerminalStatus = pending
|
|
213
216
|
? 'running'
|
|
214
217
|
: (resultTerminalStatus(rt) || (isError || failedCount > 0 ? 'failed' : 'completed'));
|
|
215
|
-
const dotColor = toolStatusColor({ pending, groupCount, callFailedCount, terminalStatus: aggregateTerminalStatus });
|
|
218
|
+
const dotColor = toolStatusColor({ pending, groupCount, callFailedCount, exitFailedCount, terminalStatus: aggregateTerminalStatus });
|
|
216
219
|
const dotText = pending && !blinkOn ? ' ' : TURN_MARKER;
|
|
217
220
|
const gutter = 2;
|
|
218
221
|
const showHeaderExpandHint = hasRawResult;
|
|
@@ -310,7 +313,7 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
310
313
|
const firstResultLine = hasDisplayResult ? String(lines[0] ?? '') : '';
|
|
311
314
|
const firstResultLineClipped = hasDisplayBody && stringWidth(firstResultLine) > maxResultChars;
|
|
312
315
|
const hasHiddenDetail = !pending && hasDisplayBody && (totalLines > 1 || firstResultLineClipped || Boolean(resultSummary));
|
|
313
|
-
const shellStatus = isShellSurface ? shellDisplayStatus({ pending, failedCount, isError, result: displayedResultText }) : '';
|
|
316
|
+
const shellStatus = isShellSurface ? shellDisplayStatus({ pending, failedCount, exitFailedCount, isError, result: displayedResultText }) : '';
|
|
314
317
|
const shellElapsed = isShellSurface ? (shellResultElapsed(displayedResultText) || elapsed) : '';
|
|
315
318
|
const backgroundElapsed = backgroundMeta
|
|
316
319
|
? backgroundTaskElapsed(backgroundMeta, elapsed)
|
|
@@ -384,7 +387,9 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
384
387
|
const showRawResult = expanded && (hasDisplayBody || hasRawResult)
|
|
385
388
|
&& (!isBackgroundMetadataResult || hasRawResult);
|
|
386
389
|
const detailLines = showRawResult
|
|
387
|
-
? (
|
|
390
|
+
? (agentResponseAggregate && hasRawResult
|
|
391
|
+
? stripLeadingStatusMarkerLines(rawRt.split('\n'))
|
|
392
|
+
: (hasDisplayBody ? lines : (rawRt ? stripLeadingStatusMarkerLines(rawRt.split('\n')) : [])))
|
|
388
393
|
: (collapsedDetail ? [collapsedDetail] : []);
|
|
389
394
|
const isPendingPlaceholderDetail = !showRawResult && Boolean(pendingDetailPlaceholder);
|
|
390
395
|
const detailColor = isPendingPlaceholderDetail ? theme.subtle : theme.text;
|
|
@@ -426,7 +431,7 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
426
431
|
const keepAgentDetail = (isError || agentFailureText) && !(agentHeaderFailure && !agentSurfaceBrief);
|
|
427
432
|
visibleDetailLines = keepAgentDetail ? [agentDetailLine] : [];
|
|
428
433
|
}
|
|
429
|
-
const finalStatusColor = toolStatusColor({ pending, groupCount, callFailedCount, terminalStatus });
|
|
434
|
+
const finalStatusColor = toolStatusColor({ pending, groupCount, callFailedCount, exitFailedCount, terminalStatus });
|
|
430
435
|
const dotColor = finalStatusColor;
|
|
431
436
|
// Agent surface cards use directional markers: `←` for requests going OUT
|
|
432
437
|
// (spawn/send/etc.) and `→` for the response coming back IN. Background
|
|
@@ -446,7 +451,7 @@ export function ToolExecution({ name, args, result, rawResult, isError, errorCou
|
|
|
446
451
|
const markerText = isDirectionalMarker ? `${markerGlyph} ` : markerGlyph;
|
|
447
452
|
const dotText = pending && !blinkOn ? ' ' : markerText;
|
|
448
453
|
let labelText;
|
|
449
|
-
if (isAgentResponse) labelText = agentResponseTitle(parsedArgs);
|
|
454
|
+
if (isAgentResponse) labelText = agentResponseTitle(parsedArgs, displayGroupCount);
|
|
450
455
|
else if (isBackgroundResponse) labelText = backgroundTaskResultTitle(normalizedName, backgroundMeta || parsedArgs);
|
|
451
456
|
else if (isBackgroundMetadataResult) labelText = backgroundTaskActionTitle(normalizedName, backgroundMeta);
|
|
452
457
|
else if (isShellSurface) labelText = shellHeader(shellStatus, displayGroupCount);
|
|
@@ -77,7 +77,7 @@ export const Item = React.memo(function Item({ item, prevKind, columns, toolOutp
|
|
|
77
77
|
node = <ToolHookDenialCard item={item} columns={columns} />;
|
|
78
78
|
break;
|
|
79
79
|
}
|
|
80
|
-
node = <ToolExecution name={item.name} args={item.args} result={item.result} rawResult={item.rawResult} isError={item.isError} errorCount={item.errorCount} callErrorCount={item.callErrorCount} expanded={toolOutputExpanded || item.expanded} columns={columns} attached={false} count={item.count} completedCount={item.completedCount} startedAt={item.startedAt} completedAt={item.completedAt} aggregate={item.aggregate} categories={item.categories} doneCategories={item.doneCategories} headerFinalized={item.headerFinalized} deferredDisplayReady={item.deferredDisplayReady} />;
|
|
80
|
+
node = <ToolExecution name={item.name} args={item.args} result={item.result} rawResult={item.rawResult} isError={item.isError} errorCount={item.errorCount} callErrorCount={item.callErrorCount} exitErrorCount={item.exitErrorCount} expanded={toolOutputExpanded || item.expanded} columns={columns} attached={false} count={item.count} completedCount={item.completedCount} startedAt={item.startedAt} completedAt={item.completedAt} aggregate={item.aggregate} categories={item.categories} doneCategories={item.doneCategories} headerFinalized={item.headerFinalized} deferredDisplayReady={item.deferredDisplayReady} agentResponseAggregate={item.agentResponseAggregate} />;
|
|
81
81
|
break;
|
|
82
82
|
}
|
|
83
83
|
case 'notice':
|
|
@@ -21,11 +21,18 @@ export function isShellTool(normalizedName, label = '') {
|
|
|
21
21
|
return n === 'shell' || n === 'bash' || n === 'bash_session' || n === 'shell_command' || n === 'job_wait' || l === 'run';
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export function shellDisplayStatus({ pending = false, failedCount = 0, isError = false, result = '' } = {}) {
|
|
24
|
+
export function shellDisplayStatus({ pending = false, failedCount = 0, exitFailedCount = 0, isError = false, result = '' } = {}) {
|
|
25
25
|
const status = shellResultStatus(result);
|
|
26
26
|
if (pending || /^(running|pending|queued)$/.test(status)) return 'running';
|
|
27
27
|
if (/^cancel/.test(status)) return 'cancelled';
|
|
28
|
-
if (/^(failed|error|killed|timeout)$/.test(status)
|
|
28
|
+
if (/^(failed|error|killed|timeout)$/.test(status)) return 'failed';
|
|
29
|
+
// A command that RAN but exited non-zero is a command-exit, not a real
|
|
30
|
+
// failure: render the neutral "Exit" state unless there is ALSO a real
|
|
31
|
+
// tool-call/result failure in the group.
|
|
32
|
+
const realFailed = Math.max(0, Number(failedCount) - Number(exitFailedCount));
|
|
33
|
+
if (realFailed > 0) return 'failed';
|
|
34
|
+
if (Number(exitFailedCount) > 0) return 'exit';
|
|
35
|
+
if (isError || failedCount > 0) return 'failed';
|
|
29
36
|
return 'completed';
|
|
30
37
|
}
|
|
31
38
|
|
|
@@ -98,7 +105,9 @@ export function joinActionAgent(action, agent) {
|
|
|
98
105
|
return agent ? `${action} ${agent}` : action;
|
|
99
106
|
}
|
|
100
107
|
|
|
101
|
-
export function agentResponseTitle(args) {
|
|
108
|
+
export function agentResponseTitle(args, count = 1) {
|
|
109
|
+
const total = Math.max(1, Number(count) || 1);
|
|
110
|
+
if (total > 1) return `Responses ${total} agents`;
|
|
102
111
|
const name = titleizeAgentName(args?.agent || args?.subagent_type || args?.name || '');
|
|
103
112
|
// The agent + model identify the responder; the response summary itself
|
|
104
113
|
// is hidden in the collapsed card (ctrl+o expand still shows the full body).
|
|
@@ -392,14 +401,19 @@ export function clampFailureCount(errorCount, groupCount, isError) {
|
|
|
392
401
|
// cancelled -> theme.warning
|
|
393
402
|
// The RED/orange failure color is driven ONLY by real tool-call errors
|
|
394
403
|
// (`callFailedCount` — backend isError / error toolKind), NOT by command/result
|
|
395
|
-
// failures like a
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
export function toolStatusColor({ pending, groupCount, callFailedCount = 0, terminalStatus = '' }) {
|
|
404
|
+
// failures like a `[status: failed]` result. A shell command-exit
|
|
405
|
+
// (`exitFailedCount`) is its own distinct neutral state: warning color, never
|
|
406
|
+
// red. `terminalStatus` is still consulted so a cancelled card stays warning.
|
|
407
|
+
export function toolStatusColor({ pending, groupCount, callFailedCount = 0, exitFailedCount = 0, terminalStatus = '' }) {
|
|
399
408
|
if (pending) return theme.text;
|
|
400
409
|
const status = normalizeTerminalStatus(terminalStatus);
|
|
401
410
|
if (status === 'cancelled') return theme.warning;
|
|
402
|
-
if (
|
|
403
|
-
if (
|
|
404
|
-
|
|
411
|
+
if (status === 'denied') return theme.warning;
|
|
412
|
+
if (callFailedCount > 0) {
|
|
413
|
+
if (groupCount > 1 && callFailedCount < groupCount) return theme.mixdogOrange || theme.warning;
|
|
414
|
+
return theme.error;
|
|
415
|
+
}
|
|
416
|
+
// Command-exit(s) with no real tool-call failure: distinct warning state.
|
|
417
|
+
if (exitFailedCount > 0) return theme.warning;
|
|
418
|
+
return theme.success;
|
|
405
419
|
}
|
|
@@ -8,6 +8,10 @@ import { displayWidth } from '../../display-width.mjs';
|
|
|
8
8
|
import { theme } from '../../theme.mjs';
|
|
9
9
|
import { formatElapsed } from '../../time-format.mjs';
|
|
10
10
|
import stripAnsi from 'strip-ansi';
|
|
11
|
+
import {
|
|
12
|
+
normalizeToolTerminalStatus,
|
|
13
|
+
toolResultTerminalStatus,
|
|
14
|
+
} from '../../../runtime/shared/tool-status.mjs';
|
|
11
15
|
|
|
12
16
|
export const MIN_RESULT_LINE_CHARS = 24;
|
|
13
17
|
// Hard cap for the collapsed result detail row (the second line under the ⎿
|
|
@@ -108,37 +112,24 @@ export function shellResultStatus(value) {
|
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
export function normalizeTerminalStatus(value) {
|
|
111
|
-
|
|
112
|
-
if (!raw) return '';
|
|
113
|
-
if (/^(running|pending|queued|in_progress|in-progress)$/.test(raw)) return 'running';
|
|
114
|
-
if (/^(completed|complete|done|success|succeeded|ok)$/.test(raw)) return 'completed';
|
|
115
|
-
if (/^(failed|fail|error|errored|timeout|timed_out|killed)$/.test(raw)) return 'failed';
|
|
116
|
-
if (/^(cancelled|canceled|cancel)$/.test(raw)) return 'cancelled';
|
|
117
|
-
return '';
|
|
115
|
+
return normalizeToolTerminalStatus(value);
|
|
118
116
|
}
|
|
119
117
|
|
|
120
118
|
export function displayTerminalStatus(value) {
|
|
119
|
+
// 'exit' is a shell-only pseudo-status (command RAN but exited non-zero); it
|
|
120
|
+
// is intentionally NOT a normalized terminal status so it never colors red.
|
|
121
|
+
if (String(value || '').trim().toLowerCase() === 'exit') return 'Exit';
|
|
121
122
|
const status = normalizeTerminalStatus(value);
|
|
122
123
|
if (status === 'running') return 'Running';
|
|
123
124
|
if (status === 'completed') return 'Finished';
|
|
124
125
|
if (status === 'failed') return 'Failed';
|
|
125
126
|
if (status === 'cancelled') return 'Cancelled';
|
|
127
|
+
if (status === 'denied') return 'Denied';
|
|
126
128
|
return '';
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
export function resultTerminalStatus(value) {
|
|
130
|
-
|
|
131
|
-
const tagged = text.match(/<status[^>]*>([\s\S]*?)<\/status>/i)?.[1]?.trim();
|
|
132
|
-
if (tagged) return normalizeTerminalStatus(tagged);
|
|
133
|
-
const bracketed = text.match(/^\[status:\s*([^\]]*)\]/mi)?.[1]?.trim();
|
|
134
|
-
if (bracketed) return normalizeTerminalStatus(bracketed);
|
|
135
|
-
// Loose inline `status: x` / `state: x` matches are a last-resort fallback —
|
|
136
|
-
// prefer the engine-controlled `<status>` tag or `[status: …]` marker above.
|
|
137
|
-
// A loose match can false-positive on prose that happens to start with
|
|
138
|
-
// "status:" (rare, but shellResultStatus below already owns real shell
|
|
139
|
-
// output parsing; this fallback stays narrow and unchanged in behavior).
|
|
140
|
-
const inline = text.match(/^(?:status|state):\s*([^\s·,;]+)/mi)?.[1]?.trim();
|
|
141
|
-
return normalizeTerminalStatus(inline);
|
|
132
|
+
return toolResultTerminalStatus(value);
|
|
142
133
|
}
|
|
143
134
|
|
|
144
135
|
const LEADING_STATUS_MARKER_LINE_RE = /^\[status:\s*[^\]]*\]\s*$/i;
|