@molecule/api-ai-tools 1.10.2 → 1.10.4
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/README.md +177 -3
- package/dist/command-position.d.ts.map +1 -1
- package/dist/command-position.js +86 -14
- package/dist/cut-run.d.ts +9 -1
- package/dist/cut-run.d.ts.map +1 -1
- package/dist/cut-run.js +19 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/inline-script.d.ts +49 -0
- package/dist/inline-script.d.ts.map +1 -0
- package/dist/inline-script.js +115 -0
- package/dist/no-test-run.d.ts +3 -1
- package/dist/no-test-run.d.ts.map +1 -1
- package/dist/no-test-run.js +114 -3
- package/dist/schemas.js +2 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +192 -78
- package/dist/trace-artifacts.d.ts +55 -0
- package/dist/trace-artifacts.d.ts.map +1 -1
- package/dist/trace-artifacts.js +259 -9
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utilities.d.ts +34 -0
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +56 -0
- package/package.json +1 -1
package/dist/tools.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { posix } from 'path';
|
|
10
10
|
import { commandCutRun, CUT_AT_BUDGET, cutRunSentence, suiteRunExitCode, suiteSummary, } from './cut-run.js';
|
|
11
11
|
import { addChangeSpan, changedSpan, countLines, renderEditExcerpt, renderSmallFile, } from './edit-excerpt.js';
|
|
12
|
+
import { INLINE_SCRIPT_BUDGET_MS, inlineLocalScriptCommand, inlineScriptRunawaySentence, } from './inline-script.js';
|
|
12
13
|
import { guardToolExecute, missingParamError, ToolInputError } from './input-normalizer.js';
|
|
13
14
|
import { diffLineCount } from './line-diff.js';
|
|
14
15
|
import { pipelineExitCodeNote } from './pipeline-exit-note.js';
|
|
@@ -54,6 +55,49 @@ const inlineFailuresByTask = new Set();
|
|
|
54
55
|
* resolves the failing test's `file:line` against the wrong suite.
|
|
55
56
|
*/
|
|
56
57
|
const runByTask = new Map();
|
|
58
|
+
/**
|
|
59
|
+
* The background task ids each backend launched. Every map above is keyed by task id alone and is
|
|
60
|
+
* shared by every project this process serves, so a task is only ever read as THIS project's when
|
|
61
|
+
* this backend started it or its files are in this project's sandbox ({@link ownedTaskIds}).
|
|
62
|
+
* Without that, a sleep in one project was held for a walk running in another's sandbox, and its
|
|
63
|
+
* note carried that project's command (xr-molecule-flash-m208 +12:00, waiting on m207's walk).
|
|
64
|
+
*/
|
|
65
|
+
const launchedByBackend = new WeakMap();
|
|
66
|
+
/** A task id this tool minted — the only shape a /tmp path is ever built from. */
|
|
67
|
+
const TASK_ID = /^mol-bg-[a-z0-9]+-[a-z0-9]+$/;
|
|
68
|
+
/**
|
|
69
|
+
* Which of `ids` are this project's tasks: launched through this backend, or with the files a
|
|
70
|
+
* launch writes (`/tmp/<id>.sh`, `.log`, `.pid`) present in this backend's sandbox — the second
|
|
71
|
+
* answer survives an API restart, which empties process memory but not the sandbox.
|
|
72
|
+
*
|
|
73
|
+
* @param backend - The project's execution backend.
|
|
74
|
+
* @param ids - Candidate task ids.
|
|
75
|
+
* @returns The owned subset, or null when none is known to be owned and the sandbox could not answer.
|
|
76
|
+
*/
|
|
77
|
+
async function ownedTaskIds(backend, ids) {
|
|
78
|
+
const launched = launchedByBackend.get(backend);
|
|
79
|
+
const owned = new Set(ids.filter((id) => launched?.has(id)));
|
|
80
|
+
const rest = [...new Set(ids)].filter((id) => !owned.has(id) && TASK_ID.test(id));
|
|
81
|
+
if (!rest.length)
|
|
82
|
+
return owned;
|
|
83
|
+
let stdout;
|
|
84
|
+
try {
|
|
85
|
+
const r = await backend.run(`for i in ${rest.join(' ')}; do ` +
|
|
86
|
+
`{ [ -e /tmp/$i.sh ] || [ -e /tmp/$i.log ] || [ -e /tmp/$i.pid ]; } && echo "MOL_OWN_TASK $i"; ` +
|
|
87
|
+
`done; echo MOL_OWN_TASKS_END`, { timeout: 5_000 });
|
|
88
|
+
stdout = String(r.stdout ?? '');
|
|
89
|
+
}
|
|
90
|
+
catch (_error) {
|
|
91
|
+
// The sandbox did not answer: only what this backend launched is known to be its own.
|
|
92
|
+
return owned.size ? owned : null;
|
|
93
|
+
}
|
|
94
|
+
if (!stdout.includes('MOL_OWN_TASKS_END'))
|
|
95
|
+
return owned.size ? owned : null;
|
|
96
|
+
for (const m of stdout.matchAll(/^MOL_OWN_TASK (\S+)$/gm))
|
|
97
|
+
if (rest.includes(m[1]))
|
|
98
|
+
owned.add(m[1]);
|
|
99
|
+
return owned;
|
|
100
|
+
}
|
|
57
101
|
/**
|
|
58
102
|
* Why a finished suite run's result carries no exit code: the code a pipeline reports is its last
|
|
59
103
|
* stage's, and a stage after the runner (or a code of 0 beside a failure in the tally) is not the
|
|
@@ -461,9 +505,15 @@ function runningNote(clauses) {
|
|
|
461
505
|
* caller attaches as `outputSoFar`; null when no task answers this command.
|
|
462
506
|
*/
|
|
463
507
|
async function backgroundTaskState(backend, command, seconds, ceilingMs) {
|
|
464
|
-
|
|
465
|
-
|
|
508
|
+
// Only this project's tasks: the registry holds every project's, newest last. Bounded, because
|
|
509
|
+
// each candidate is one test in the ownership probe.
|
|
510
|
+
const recent = [...runByTask.keys()].slice(-64);
|
|
511
|
+
if (!recent.length)
|
|
512
|
+
return null;
|
|
513
|
+
const owned = await ownedTaskIds(backend, recent);
|
|
514
|
+
if (!owned?.size)
|
|
466
515
|
return null;
|
|
516
|
+
const ids = recent.filter((id) => owned.has(id));
|
|
467
517
|
const exitCodeOf = async (id) => {
|
|
468
518
|
try {
|
|
469
519
|
const raw = await backend.readFile(`/tmp/${id}.exit`);
|
|
@@ -548,12 +598,18 @@ async function backgroundTaskState(backend, command, seconds, ceilingMs) {
|
|
|
548
598
|
}
|
|
549
599
|
import { suiteCommandTarget } from './suite-overlap.js';
|
|
550
600
|
import { diagnosisTraceCommand } from './trace-artifacts.js';
|
|
551
|
-
import { checkBlockedCommand, declaredBudgetSeconds, DEFAULT_SEARCH_EXCLUDED_DIRS, directoryReadHint, earlyReturnCause, emptyCallError, failureCausesNote, findPathArgs, findPatternArgs, fusedLine, htmlOutline, isCommandTimeout, isEnvFilePath, isOutsideRoot, isPlaywrightRunCommand, isSuiteRunCommand,
|
|
601
|
+
import { BRACE_GLOB_HINT, checkBlockedCommand, declaredBudgetSeconds, DEFAULT_SEARCH_EXCLUDED_DIRS, directoryReadHint, earlyReturnCause, emptyCallError, expandBraceGlob, failureCausesNote, findPathArgs, findPatternArgs, fusedLine, htmlOutline, isCommandTimeout, isEnvFilePath, isOutsideRoot, isPlaywrightRunCommand, isSuiteRunCommand, linesWithinSerialized, literalDirPrefix, logShowsInlineFailureBodies, MAX_BATCH_READ_FILES, MAX_FIND_RESULTS, MAX_HTML_INLINE_CHARS, MAX_OUTPUT_SIZE, MAX_READ_CALL_CHARS, MAX_READ_RETURN_CHARS, MAX_READ_SIZE, MAX_SEARCH_CONTEXT_LINES, MAX_SEARCH_RESULTS, MAX_WRITE_SIZE, outputIsWithheldUntilExit, outputRedirectTarget, parseCheckCommand, parseCheckProblem, pathArgError, printsOnlySource, READ_RESULT_ENVELOPE_CHARS, redactSecrets, redactSecretsInCode, repeatedSuiteRunError, repeatingFailure, repeatingFailureNote, resolvePath, RUNNING_FAILURE_LINES, runningCauseCommand, runningOutputSliceCommand, searchTimeoutError, serializedChars, shellQuote, sliceLines, SMALL_FILE_WHOLE_CHARS, streamingBackgroundCommand, stripControlChars, suiteRunBudgetCommand, suiteRunConfigCommand, suiteRunPipelinePlacement, suiteRunPriorityLaunch, TOOL_RESULT_CHARS, truncateMiddle, universalCause, whitespaceTolerantReplace, withoutSuiteTimeout, } from './utilities.js';
|
|
552
602
|
/**
|
|
553
603
|
* How long exec_command waits for a command it backgrounded only because the
|
|
554
604
|
* command asked for more than the tool's ceiling, before handing back a task id.
|
|
555
605
|
*/
|
|
556
606
|
const OVER_CEILING_GRACE_MS = 45_000;
|
|
607
|
+
/**
|
|
608
|
+
* How close to this tool's ceiling an executor-written bound has to be before it is read as the
|
|
609
|
+
* ceiling written down rather than a budget for the walk: `timeout 290` beside a 290 s ceiling.
|
|
610
|
+
* The slack covers the rounding an executor does (`timeout 300` for a 290 s budget).
|
|
611
|
+
*/
|
|
612
|
+
const CEILING_FITTED_SLACK_SECONDS = 30;
|
|
557
613
|
/**
|
|
558
614
|
* The machine-readable mark on a result whose run carried the supplied suite's own settings
|
|
559
615
|
* ({@link ToolBuildConfig.suiteBudget}) — the flags and derived config actually written, every
|
|
@@ -615,61 +671,40 @@ export const SUITE_OVER_BUDGET_ADVICE = 'A test suite is not a bigger unit to sp
|
|
|
615
671
|
*/
|
|
616
672
|
const SEARCH_TIMEOUT_MS = 10_000;
|
|
617
673
|
/**
|
|
618
|
-
* The
|
|
619
|
-
*
|
|
620
|
-
*
|
|
621
|
-
|
|
674
|
+
* The include-glob error. It keeps the original character-rule sentence and
|
|
675
|
+
* names the accepted multi-extension form, so a refusal teaches the syntax
|
|
676
|
+
* rather than only reporting that the value was wrong.
|
|
677
|
+
*/
|
|
678
|
+
const INCLUDE_GLOB_ERROR = 'Invalid include glob pattern. Allowed: alphanumeric and @ * ? . _ - / [ ] ( ), ' +
|
|
679
|
+
BRACE_GLOB_HINT;
|
|
680
|
+
/**
|
|
681
|
+
* The `find_files` pattern error. Same shape as {@link INCLUDE_GLOB_ERROR} —
|
|
682
|
+
* the brace sentence is shared, so a brace refusal reads the same in both
|
|
683
|
+
* search tools — with the route-directory note this tool has always carried.
|
|
622
684
|
*/
|
|
623
|
-
const
|
|
685
|
+
const FIND_PATTERN_ERROR = 'Invalid pattern. Allowed: alphanumeric and @ * ? . _ - / [ ] ( ) ' +
|
|
686
|
+
'(brackets/parens support Next.js route dirs like [id] or (group)), ' +
|
|
687
|
+
BRACE_GLOB_HINT;
|
|
624
688
|
/**
|
|
625
|
-
*
|
|
626
|
-
*
|
|
627
|
-
*
|
|
628
|
-
* `grep --include` has no brace expansion of its own (the shell that would do it
|
|
629
|
-
* is never involved — the pattern is `shellQuote`d first), so the group has to
|
|
630
|
-
* be expanded here and each alternative passed as its own `--include`. The
|
|
631
|
-
* m189 run wrote the everyday `*.{ts,tsx,yml,json,md}` and the search was
|
|
632
|
-
* refused outright, costing a round trip and pushing the agent to a narrower
|
|
633
|
-
* search.
|
|
689
|
+
* The `find` predicate for one or more expanded patterns, ORed inside parens
|
|
690
|
+
* when a brace group expanded to more than one.
|
|
634
691
|
*
|
|
635
|
-
*
|
|
636
|
-
*
|
|
637
|
-
* pattern must still pass {@link isValidGlob} — so a shell metacharacter in any
|
|
638
|
-
* alternative (`*.{ts,$(rm)}`) is refused exactly as a bare one is.
|
|
639
|
-
*
|
|
640
|
-
* @param pattern - The user-supplied `include` value.
|
|
641
|
-
* @returns Every pattern to pass to grep, or null when the value is not
|
|
642
|
-
* accepted (the caller reports the include-glob error).
|
|
692
|
+
* @param patterns - Patterns, each already accepted by the glob character rule.
|
|
693
|
+
* @returns A predicate list for `find`.
|
|
643
694
|
*/
|
|
644
|
-
function
|
|
645
|
-
|
|
646
|
-
if (open === -1)
|
|
647
|
-
return isValidGlob(pattern) ? [pattern] : null;
|
|
648
|
-
const close = pattern.indexOf('}', open + 1);
|
|
649
|
-
if (close === -1)
|
|
650
|
-
return null;
|
|
651
|
-
// One level only: a second `{` before the close or a second `}` after it is a
|
|
652
|
-
// nested/malformed group, not an alternative.
|
|
653
|
-
const nextOpen = pattern.indexOf('{', open + 1);
|
|
654
|
-
if (nextOpen !== -1 && nextOpen < close)
|
|
655
|
-
return null;
|
|
656
|
-
if (pattern.indexOf('}', close + 1) !== -1)
|
|
657
|
-
return null;
|
|
658
|
-
const alternatives = pattern.slice(open + 1, close).split(',');
|
|
659
|
-
if (alternatives.length > MAX_INCLUDE_BRACE_ALTERNATIVES)
|
|
660
|
-
return null;
|
|
661
|
-
if (alternatives.some((alt) => alt.length === 0))
|
|
662
|
-
return null;
|
|
663
|
-
const expanded = alternatives.map((alt) => `${pattern.slice(0, open)}${alt}${pattern.slice(close + 1)}`);
|
|
664
|
-
return expanded.every((p) => isValidGlob(p)) ? expanded : null;
|
|
695
|
+
function findArgsForPatterns(patterns) {
|
|
696
|
+
return joinFindArgs(patterns.map((p) => findPatternArgs(p)));
|
|
665
697
|
}
|
|
666
698
|
/**
|
|
667
|
-
*
|
|
668
|
-
*
|
|
669
|
-
*
|
|
699
|
+
* Join `find` predicates into one, parenthesising an OR when a brace group
|
|
700
|
+
* expanded to more than one alternative.
|
|
701
|
+
*
|
|
702
|
+
* @param args - One predicate expansion per alternative.
|
|
703
|
+
* @returns The predicate text.
|
|
670
704
|
*/
|
|
671
|
-
|
|
672
|
-
|
|
705
|
+
function joinFindArgs(args) {
|
|
706
|
+
return args.length === 1 ? args[0] : `\\( ${args.join(' -o ')} \\)`;
|
|
707
|
+
}
|
|
673
708
|
/**
|
|
674
709
|
* The share of its budget a command must use before the "you asked for more than
|
|
675
710
|
* this tool's ceiling" note is worth attaching. Below it the clamp changed nothing
|
|
@@ -915,7 +950,7 @@ function packageCatalog(path) {
|
|
|
915
950
|
* @returns Array of AITool objects ready to pass to an AI provider
|
|
916
951
|
*/
|
|
917
952
|
export function buildTools(backend, config) {
|
|
918
|
-
const { include, exclude, pathGuards = true, symlinkGuards = false, redactSecrets: doRedact = true, blockDangerousCommands = false, blockCommand, execTimeoutMs = 120_000, commandBudgetMs, overCeilingGraceMs = OVER_CEILING_GRACE_MS, searchExcludedDirs, outlineLargeHtml, excludedTestTitles, requiredSuiteEnv, onAfterWrite, onFileDiff, onFileChange, } = config ?? {};
|
|
953
|
+
const { include, exclude, pathGuards = true, symlinkGuards = false, redactSecrets: doRedact = true, blockDangerousCommands = false, blockCommand, execTimeoutMs = 120_000, commandBudgetMs, overCeilingGraceMs = OVER_CEILING_GRACE_MS, searchExcludedDirs, outlineLargeHtml, excludedTestTitles, requiredSuiteEnv, suiteRunMs, onAfterWrite, onFileDiff, onFileChange, } = config ?? {};
|
|
919
954
|
const root = backend.projectRoot;
|
|
920
955
|
// A host-filesystem backend with escape guards off is the combination the
|
|
921
956
|
// audit flagged: `pathGuards` off lets `..` paths out of the workspace,
|
|
@@ -2262,7 +2297,7 @@ export function buildTools(backend, config) {
|
|
|
2262
2297
|
: 0;
|
|
2263
2298
|
// `--include` has no brace expansion inside the quoted grep argument, so
|
|
2264
2299
|
// a brace group is expanded here and grep gets one --include per pattern.
|
|
2265
|
-
const includes = include ?
|
|
2300
|
+
const includes = include ? expandBraceGlob(include) : [];
|
|
2266
2301
|
if (includes === null)
|
|
2267
2302
|
return { error: INCLUDE_GLOB_ERROR };
|
|
2268
2303
|
const symlinkErr = await checkSymlink(path);
|
|
@@ -2339,11 +2374,12 @@ export function buildTools(backend, config) {
|
|
|
2339
2374
|
return {
|
|
2340
2375
|
error: 'find_files requires a non-empty "pattern" argument (a filename or glob, e.g. "*.tsx" or "index.ts").',
|
|
2341
2376
|
};
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2377
|
+
// `find` has no brace expansion either — the pattern is shell-quoted
|
|
2378
|
+
// before it reaches it — so `*.{ts,tsx}` expands here into one predicate
|
|
2379
|
+
// per alternative (xr-molecule-flash-m199).
|
|
2380
|
+
const patterns = expandBraceGlob(pattern);
|
|
2381
|
+
if (patterns === null)
|
|
2382
|
+
return { error: FIND_PATTERN_ERROR };
|
|
2347
2383
|
const symlinkErr = await checkSymlink(path);
|
|
2348
2384
|
if (symlinkErr)
|
|
2349
2385
|
return { error: symlinkErr };
|
|
@@ -2355,9 +2391,12 @@ export function buildTools(backend, config) {
|
|
|
2355
2391
|
// the model meant answered a `list_files` instantly (xr-molecule-flash-m94).
|
|
2356
2392
|
// A bare first segment (`helpers/*`) is left alone on purpose: it means "any
|
|
2357
2393
|
// `helpers/` below the root" (xr-molecule-flash-m77, see literalDirPrefix).
|
|
2358
|
-
|
|
2394
|
+
// Brace alternatives may each name a directory (`{src/a,src/b}/*.ts`),
|
|
2395
|
+
// so a narrowing prefix is used only when every expansion agrees on it.
|
|
2396
|
+
const prefixes = patterns.map((p) => literalDirPrefix(p));
|
|
2397
|
+
const prefixDir = prefixes.every((p) => p === prefixes[0]) ? prefixes[0] : null;
|
|
2359
2398
|
let findRoot = path;
|
|
2360
|
-
let findArgs =
|
|
2399
|
+
let findArgs = findArgsForPatterns(patterns);
|
|
2361
2400
|
let missingPrefix;
|
|
2362
2401
|
try {
|
|
2363
2402
|
if (prefixDir) {
|
|
@@ -2369,7 +2408,7 @@ export function buildTools(backend, config) {
|
|
|
2369
2408
|
findRoot = candidate;
|
|
2370
2409
|
// The remainder keeps the `-path` form: `*` crosses `/`, so a `.d.ts`
|
|
2371
2410
|
// in `dist/utilities/` is still found (see findPathArgs).
|
|
2372
|
-
findArgs = findPathArgs(
|
|
2411
|
+
findArgs = joinFindArgs(patterns.map((p) => findPathArgs(p.replace(/^(?:\.?\/)+/, '').slice(prefixDir.length + 1))));
|
|
2373
2412
|
}
|
|
2374
2413
|
else {
|
|
2375
2414
|
missingPrefix = `"${candidate}" does not exist; searched all of ${path}.`;
|
|
@@ -2624,10 +2663,44 @@ export function buildTools(backend, config) {
|
|
|
2624
2663
|
// this tool's ceiling — and in the background the ceiling no longer applies, so the
|
|
2625
2664
|
// `timeout N` the executor wrote to fit it is the only bound left, and it kills the
|
|
2626
2665
|
// walk mid-run with no tally (X1 xr-molecule-flash-m143 +24:45). Lift it from the
|
|
2627
|
-
// statement that runs the suite.
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2666
|
+
// statement that runs the suite.
|
|
2667
|
+
//
|
|
2668
|
+
// A run the EXECUTOR detached itself is lifted too when its bound is not a bound for
|
|
2669
|
+
// the walk: a number no larger than this tool's ceiling is the ceiling written down
|
|
2670
|
+
// (`timeout 290` beside a 290 s ceiling), and a number shorter than the whole walk the
|
|
2671
|
+
// consumer measured kills it just the same (xr-molecule-flash-m200: a deployed walk
|
|
2672
|
+
// killed at test 103 of 138 by `timeout 290` beside a 290 s ceiling). A bound that is a
|
|
2673
|
+
// real budget for the walk is kept (`timeout 900`).
|
|
2674
|
+
let wholeRunMs = null;
|
|
2675
|
+
let lifted = { command, seconds: null };
|
|
2676
|
+
if (overCeiling && input.run_in_background !== true) {
|
|
2677
|
+
lifted = withoutSuiteTimeout(command);
|
|
2678
|
+
}
|
|
2679
|
+
else if (input.run_in_background === true && isSuiteRunCommand(command)) {
|
|
2680
|
+
const candidate = withoutSuiteTimeout(command);
|
|
2681
|
+
if (candidate.seconds !== null && candidate.seconds > 0) {
|
|
2682
|
+
let measured = null;
|
|
2683
|
+
try {
|
|
2684
|
+
measured = (await suiteRunMs?.(command, cwd)) ?? null;
|
|
2685
|
+
}
|
|
2686
|
+
catch (_error) {
|
|
2687
|
+
// A consumer's reading that fails changes nothing: the ceiling rule still runs.
|
|
2688
|
+
measured = null;
|
|
2689
|
+
}
|
|
2690
|
+
const fitsCeiling = ceilingSeconds > 0 &&
|
|
2691
|
+
candidate.seconds <= ceilingSeconds + CEILING_FITTED_SLACK_SECONDS;
|
|
2692
|
+
const shorterThanWalk = measured !== null &&
|
|
2693
|
+
Number.isFinite(measured) &&
|
|
2694
|
+
measured > 0 &&
|
|
2695
|
+
candidate.seconds * 1000 < measured;
|
|
2696
|
+
if (fitsCeiling || shorterThanWalk) {
|
|
2697
|
+
lifted = candidate;
|
|
2698
|
+
// The duration is named only when it is what justifies the lift: a measured walk
|
|
2699
|
+
// shorter than the bound says nothing about why a ceiling-sized bound goes.
|
|
2700
|
+
wholeRunMs = shorterThanWalk ? measured : null;
|
|
2701
|
+
}
|
|
2702
|
+
}
|
|
2703
|
+
}
|
|
2631
2704
|
if (lifted.seconds !== null)
|
|
2632
2705
|
command = lifted.command;
|
|
2633
2706
|
// Keep the log growing while it runs (see streamingBackgroundCommand):
|
|
@@ -2649,9 +2722,13 @@ export function buildTools(backend, config) {
|
|
|
2649
2722
|
streaming.changes.unshift(traced.change);
|
|
2650
2723
|
// Said once, in the result that also hands back the task id or the run's output.
|
|
2651
2724
|
if (lifted.seconds !== null) {
|
|
2652
|
-
streaming.changes.unshift(
|
|
2653
|
-
|
|
2654
|
-
|
|
2725
|
+
streaming.changes.unshift(wholeRunMs !== null
|
|
2726
|
+
? `Dropped your \`timeout ${lifted.seconds}\` from the suite run: a whole walk takes ` +
|
|
2727
|
+
`~${durationText(wholeRunMs)} and runs in the background, where it is bounded by ` +
|
|
2728
|
+
'`wait_for_task` and the turn’s deadline — the bound would only have killed the walk.'
|
|
2729
|
+
: `Dropped your \`timeout ${lifted.seconds}\` from the suite run: in the background it ` +
|
|
2730
|
+
'is bounded by `wait_for_task` and the turn’s deadline, not by this tool’s ' +
|
|
2731
|
+
'ceiling, so the bound you wrote would only have killed the walk.');
|
|
2655
2732
|
}
|
|
2656
2733
|
// A whole-suite run starves the sandbox it shares with the app and with
|
|
2657
2734
|
// every command the executor sends next, so it starts at lower CPU and
|
|
@@ -2670,6 +2747,9 @@ export function buildTools(backend, config) {
|
|
|
2670
2747
|
// given it, so the command says nothing about what the log will carry. A wait reads the
|
|
2671
2748
|
// log itself (see inlineFailuresByTask).
|
|
2672
2749
|
runByTask.set(id, { command: streaming.command, cwd });
|
|
2750
|
+
const launched = launchedByBackend.get(backend) ?? new Set();
|
|
2751
|
+
launched.add(id);
|
|
2752
|
+
launchedByBackend.set(backend, launched);
|
|
2673
2753
|
await backend.writeFile(script, `${streaming.command}\n`);
|
|
2674
2754
|
// The clock the grace return below reports a stopped run against: the command is
|
|
2675
2755
|
// started here, and how long it ran is what a stop at its own bound is read from.
|
|
@@ -2808,7 +2888,16 @@ export function buildTools(backend, config) {
|
|
|
2808
2888
|
// overrun is stopped there, the whole process group, and everything
|
|
2809
2889
|
// printed until then comes back with exit code 124 — instead of an outer
|
|
2810
2890
|
// timeout discarding the run and its output together.
|
|
2811
|
-
|
|
2891
|
+
// An inline interpreter program that only reads and writes local files (a `python3`
|
|
2892
|
+
// heredoc, `node -e`) finishes in milliseconds or never ends — xr-molecule-flash-m200
|
|
2893
|
+
// (+03:45) burned 291 s on a backtracking `re.findall` over a minified CSS file, then was
|
|
2894
|
+
// told to "run it in the background", which only moves the hang. It gets a short budget
|
|
2895
|
+
// instead of the build budget, and a cut says what it is (inline-script.ts).
|
|
2896
|
+
const inlineScript = inlineLocalScriptCommand(command);
|
|
2897
|
+
const toolCeilingMs = inlineScript === null
|
|
2898
|
+
? commandBudgetMs
|
|
2899
|
+
: Math.min(commandBudgetMs ?? INLINE_SCRIPT_BUDGET_MS, INLINE_SCRIPT_BUDGET_MS);
|
|
2900
|
+
const budgetSeconds = toolCeilingMs ? Math.max(1, Math.round(toolCeilingMs / 1000)) : 0;
|
|
2812
2901
|
// A requested budget is honored DOWNWARD only. The model used to send
|
|
2813
2902
|
// `timeout: 900000` for a test suite, the field was not declared so it
|
|
2814
2903
|
// was silently dropped, and the command was killed at the ceiling with
|
|
@@ -2816,10 +2905,13 @@ export function buildTools(backend, config) {
|
|
|
2816
2905
|
// before the overrun message could teach anything (X0 R83/R84). Now the
|
|
2817
2906
|
// ceiling is reported the FIRST time a larger one is asked for.
|
|
2818
2907
|
const requestedMs = Number(input.timeout);
|
|
2819
|
-
const wantsMore =
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2908
|
+
const wantsMore = inlineScript === null &&
|
|
2909
|
+
Number.isFinite(requestedMs) &&
|
|
2910
|
+
requestedMs > 0 &&
|
|
2911
|
+
requestedMs > (toolCeilingMs ?? 0);
|
|
2912
|
+
const effectiveBudgetMs = Number.isFinite(requestedMs) && requestedMs > 0 && toolCeilingMs
|
|
2913
|
+
? Math.min(requestedMs, toolCeilingMs)
|
|
2914
|
+
: toolCeilingMs;
|
|
2823
2915
|
const startedAt = Date.now();
|
|
2824
2916
|
const result = await backend.run(command, {
|
|
2825
2917
|
cwd,
|
|
@@ -2883,11 +2975,13 @@ export function buildTools(backend, config) {
|
|
|
2883
2975
|
? ' — and a pipe through tail/head holds everything back until the command ends, so it printed nothing: run it without the pipe (use a line reporter and let the output stream)'
|
|
2884
2976
|
: ''}. `
|
|
2885
2977
|
: '') +
|
|
2886
|
-
(
|
|
2887
|
-
?
|
|
2888
|
-
:
|
|
2889
|
-
?
|
|
2890
|
-
:
|
|
2978
|
+
(inlineScript !== null
|
|
2979
|
+
? inlineScriptRunawaySentence(inlineScript, cut.seconds)
|
|
2980
|
+
: startsServerProgram(command)
|
|
2981
|
+
? SERVER_OVER_BUDGET_ADVICE
|
|
2982
|
+
: isSuiteRunCommand(command)
|
|
2983
|
+
? SUITE_OVER_BUDGET_ADVICE
|
|
2984
|
+
: SPLIT_WORK_ADVICE),
|
|
2891
2985
|
};
|
|
2892
2986
|
}
|
|
2893
2987
|
// A pipeline reports its LAST stage's code: `tsc | head` says 0 beside a printed type
|
|
@@ -2969,6 +3063,26 @@ export function buildTools(backend, config) {
|
|
|
2969
3063
|
// server-side costs no round trip and no context.
|
|
2970
3064
|
async wait_for_task(input) {
|
|
2971
3065
|
const taskId = typeof input.taskId === 'string' ? input.taskId.trim() : '';
|
|
3066
|
+
// An id another project launched is not this project's to wait on — its files are in that
|
|
3067
|
+
// project's sandbox, so a wait here would poll for an exit file that never appears, and its
|
|
3068
|
+
// wait time would count against that project's own stuck clock (xr-molecule-flash-m208
|
|
3069
|
+
// +12:00 waited ~5 min on m207's walk). Answered at once, before any per-task state is read.
|
|
3070
|
+
if (TASK_ID.test(taskId)) {
|
|
3071
|
+
const owned = await ownedTaskIds(backend, [taskId]);
|
|
3072
|
+
if (owned && !owned.has(taskId)) {
|
|
3073
|
+
const recent = [...runByTask.keys()].slice(-64);
|
|
3074
|
+
const mine = (await ownedTaskIds(backend, recent)) ?? new Set();
|
|
3075
|
+
const list = recent.filter((id) => mine.has(id)).reverse();
|
|
3076
|
+
return {
|
|
3077
|
+
taskId,
|
|
3078
|
+
status: 'unknown',
|
|
3079
|
+
note: `No background task \`${taskId}\` was started in this project — ` +
|
|
3080
|
+
(list.length
|
|
3081
|
+
? `the ids this project launched are: ${list.map((id) => `\`${id}\``).join(', ')}.`
|
|
3082
|
+
: 'this project has launched no background task.'),
|
|
3083
|
+
};
|
|
3084
|
+
}
|
|
3085
|
+
}
|
|
2972
3086
|
// Where a task writes its own output is process memory; the task is not.
|
|
2973
3087
|
// An API process swapped mid-run (a release, a patch, a crash) leaves the
|
|
2974
3088
|
// command running in the sandbox with nothing left that remembers the file
|
|
@@ -223,6 +223,39 @@ export interface TraceReadContradiction {
|
|
|
223
223
|
/** The later GET of the same resource (`GET /api/profiles/x`). */
|
|
224
224
|
read: TraceRequest;
|
|
225
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* A visibility failure whose locator RESOLVED: Playwright calls an element with a zero-size box
|
|
228
|
+
* "hidden" even when it is painted, so the useful fact is why the box is empty. The trace's own
|
|
229
|
+
* failure snapshot carries the element's children — read here, never guessed.
|
|
230
|
+
*/
|
|
231
|
+
export interface TraceHiddenBox {
|
|
232
|
+
/** The locator the assertion printed (`locator('a.navbar-brand')`), or the element it names. */
|
|
233
|
+
locator: string;
|
|
234
|
+
/** The element's tag, lowercased (`a`). */
|
|
235
|
+
tag: string;
|
|
236
|
+
/** The element's own inline style, when the snapshot carries one. */
|
|
237
|
+
style?: string;
|
|
238
|
+
/**
|
|
239
|
+
* The `<img>` the element wraps when that image is its only element child and the element has
|
|
240
|
+
* no text of its own: the size the box would collapse to.
|
|
241
|
+
*/
|
|
242
|
+
image?: {
|
|
243
|
+
/** The image's `src`, bounded. */
|
|
244
|
+
src?: string;
|
|
245
|
+
/** Its `width` attribute. */
|
|
246
|
+
width?: string;
|
|
247
|
+
/** Its `height` attribute. */
|
|
248
|
+
height?: string;
|
|
249
|
+
/** Its inline `style`. */
|
|
250
|
+
style?: string;
|
|
251
|
+
/** Its `class`. */
|
|
252
|
+
className?: string;
|
|
253
|
+
/** Its `alt` text. */
|
|
254
|
+
alt?: string;
|
|
255
|
+
};
|
|
256
|
+
/** True when the element has no text and no element children at all. */
|
|
257
|
+
empty?: true;
|
|
258
|
+
}
|
|
226
259
|
/** What one trace says: the test it belongs to, the requests it made, and its console lines. */
|
|
227
260
|
export interface TraceArtifact {
|
|
228
261
|
/** The failure's spec file, relative to the run's directory, when the trace names one. */
|
|
@@ -308,6 +341,13 @@ export interface TraceArtifact {
|
|
|
308
341
|
* and on traces read before this field existed.
|
|
309
342
|
*/
|
|
310
343
|
readContradiction?: TraceReadContradiction;
|
|
344
|
+
/**
|
|
345
|
+
* A visibility failure whose locator RESOLVED into an empty box — Playwright's "hidden" — with
|
|
346
|
+
* the element's children read from the failure snapshot ({@link TraceHiddenBox}). The note uses
|
|
347
|
+
* it to name why the box is empty (an `<img>` with no CSS size, a textless element) instead of
|
|
348
|
+
* leaving the run to probe computed styles (xr-molecule-flash-m197).
|
|
349
|
+
*/
|
|
350
|
+
hiddenBox?: TraceHiddenBox;
|
|
311
351
|
}
|
|
312
352
|
/** How many traces one read reports, newest first. */
|
|
313
353
|
export declare const MAX_TRACE_ARTIFACTS = 12;
|
|
@@ -486,6 +526,21 @@ export interface TraceRunReport {
|
|
|
486
526
|
* @returns True when the path names a credential exchange.
|
|
487
527
|
*/
|
|
488
528
|
export declare function isCredentialExchangePath(path: string, authEndpoints?: readonly string[]): boolean;
|
|
529
|
+
/**
|
|
530
|
+
* The sentence a "hidden" visibility failure earns when the trace proved WHY the box is empty.
|
|
531
|
+
*
|
|
532
|
+
* Playwright calls an element with a zero-size box hidden even when it is painted, so the answer
|
|
533
|
+
* is in the element's children. `a.navbar-brand` on xr-molecule-flash-m197 was 0×4 px because its
|
|
534
|
+
* only child was `<img src="/conduit-logo.svg" height="26">`: an SVG with a `viewBox` and no
|
|
535
|
+
* width/height has no intrinsic size, and the `height` attribute loses to Tailwind's preflight
|
|
536
|
+
* (`img { max-width: 100%; height: auto }`), which the scaffold's own `index.css` imports. The
|
|
537
|
+
* note said only "the cause is in the page", and the run spent over four minutes rasterising an
|
|
538
|
+
* SVG to PNG. Only what the snapshot shows is claimed ({@link TraceHiddenBox}).
|
|
539
|
+
*
|
|
540
|
+
* @param items - The traces {@link parseTraceArtifacts} read.
|
|
541
|
+
* @returns The sentence, or null when no failure carries a hidden-box reading.
|
|
542
|
+
*/
|
|
543
|
+
export declare function hiddenBoxNote(items: readonly TraceArtifact[]): string | null;
|
|
489
544
|
/**
|
|
490
545
|
* The note a failed suite run's result carries: what each failing test's page actually sent, and
|
|
491
546
|
* what came back.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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"}
|