@molecule/api-ai-tools 1.11.1 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1325,6 +1325,72 @@ export function statementArgumentEnd(command, start, end) {
1325
1325
  at -= 1;
1326
1326
  return at;
1327
1327
  }
1328
+ /**
1329
+ * Where a statement's own text ends, and whether it leaves a group open.
1330
+ *
1331
+ * A statement can be written inside a subshell or a brace group, and the tokenizer attaches an
1332
+ * adjacent closer to its last word because no separator comes between them: `( … | tail -25)`
1333
+ * parses its last stage as `tail` with the argument `-25)`. {@link LocatedCommandSegment.end}
1334
+ * therefore says one past the `)`, and a caller cutting that stage out of the command takes the
1335
+ * group's closer with it — the rewritten command is then `( … 2>&1`, which no shell parses
1336
+ * (xr-molecule-flash-m418 +23:31: a heredoc config plus a parenthesized Playwright pipeline came
1337
+ * back as `end of file unexpected` from the background runner).
1338
+ *
1339
+ * The parse's own group depths answer which closers belong to an enclosing group: the depth a
1340
+ * statement was written at is its first character's depth (an opener is recorded at the depth
1341
+ * BEFORE it opens), and every character of that statement's own words is at that depth or deeper.
1342
+ * A closer at a LOWER depth closes a group opened before the statement, so it is not the
1343
+ * statement's text. A character inside a quote (`-1`) is literal text and stops the walk: `grep
1344
+ * 'a)b'` ends on its own quote, not on a closer.
1345
+ *
1346
+ * The same depths answer the other dangerous cut: a stage that OPENS a group it does not close
1347
+ * (`| { cat` when the `}` follows a `;`) has its closer outside the stage, so dropping the stage
1348
+ * alone leaves that closer dangling.
1349
+ *
1350
+ * @param command - The shell command.
1351
+ * @param start - The statement's first character ({@link LocatedCommandSegment.start}).
1352
+ * @param end - One past the statement's last character ({@link LocatedCommandSegment.end}).
1353
+ * @returns The offset of the first character that is not the statement's own text, and whether
1354
+ * the statement leaves a group it opened still open; null when it cannot be placed in this
1355
+ * command.
1356
+ */
1357
+ export function statementBoundary(command, start, end) {
1358
+ if (typeof command !== 'string')
1359
+ return null;
1360
+ if (start === null || end === null)
1361
+ return null;
1362
+ if (!Number.isInteger(start) || !Number.isInteger(end))
1363
+ return null;
1364
+ if (start < 0 || end > command.length || end < start)
1365
+ return null;
1366
+ const part = splitSegments(command).find((candidate) => candidate.start === start && candidate.start + candidate.text.length === end);
1367
+ const enclosing = part?.depths[0];
1368
+ if (part === undefined || enclosing === undefined)
1369
+ return null;
1370
+ let at = part.text.length;
1371
+ while (at > 0) {
1372
+ const depth = part.depths[at - 1];
1373
+ if (depth === undefined || depth < 0 || depth >= enclosing)
1374
+ break;
1375
+ at -= 1;
1376
+ }
1377
+ // Whitespace before the closer is not part of the statement's last word either.
1378
+ while (at > 0 && /\s/.test(part.text[at - 1] ?? ''))
1379
+ at -= 1;
1380
+ // The group state where the statement's own text stops: a group opened here and never closed
1381
+ // puts its closer after the statement, in a later stage or statement.
1382
+ let trailing = enclosing;
1383
+ let deepest = enclosing;
1384
+ for (let i = 0; i < at; i += 1) {
1385
+ const depth = part.depths[i];
1386
+ if (depth === undefined || depth < 0)
1387
+ continue;
1388
+ trailing = depth;
1389
+ if (depth > deepest)
1390
+ deepest = depth;
1391
+ }
1392
+ return { textEnd: start + at, leavesGroupOpen: deepest > enclosing && trailing > enclosing };
1393
+ }
1328
1394
  /**
1329
1395
  * {@link locatedCommandSegments}'s recursion, so a `sh -c '<command>'` is opened as far as
1330
1396
  * {@link MAX_NESTING} allows. A nested statement's offsets are cleared: they are positions in
package/dist/index.d.ts CHANGED
@@ -70,6 +70,11 @@
70
70
  * as a broken tool and routes around, taking its verification with it. Use
71
71
  * `guardAITool` to give tools built elsewhere the same treatment, passing
72
72
  * `redactError` so a thrown message is masked by your own redactor.
73
+ * - **Defer occasional tools** with `createDeferredToolCatalog`: pass your current
74
+ * permission-filtered tools and a small initial name set, offer `catalog.select()`
75
+ * to the model, and execute `catalog.loader` like any other tool. Loading only
76
+ * exposes schemas, never grants permission or runs a tool. Persist its loaded
77
+ * names with `onLoad` to keep them available across turns and compaction.
73
78
  * - **Scope the tool set per agent** with `include`/`exclude` — a read-only agent
74
79
  * should not receive `write_file`/`exec_command`.
75
80
  * - Outputs are size-capped (`MAX_READ_SIZE`, `MAX_OUTPUT_SIZE`, …) and searches
@@ -142,11 +147,13 @@ export * from './line-diff.js';
142
147
  export * from './no-test-run.js';
143
148
  export * from './output-filter.js';
144
149
  export * from './pipeline-exit-note.js';
150
+ export * from './playwright-report.js';
145
151
  export * from './schemas.js';
146
152
  export * from './server-command.js';
147
153
  export * from './sleep-peek.js';
148
154
  export * from './suite-overlap.js';
149
155
  export * from './system-prompt.js';
156
+ export * from './tool-catalog.js';
150
157
  export * from './tools.js';
151
158
  export * from './trace-artifacts.js';
152
159
  export * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkIG;AAEH,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuIG;AAEH,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -70,6 +70,11 @@
70
70
  * as a broken tool and routes around, taking its verification with it. Use
71
71
  * `guardAITool` to give tools built elsewhere the same treatment, passing
72
72
  * `redactError` so a thrown message is masked by your own redactor.
73
+ * - **Defer occasional tools** with `createDeferredToolCatalog`: pass your current
74
+ * permission-filtered tools and a small initial name set, offer `catalog.select()`
75
+ * to the model, and execute `catalog.loader` like any other tool. Loading only
76
+ * exposes schemas, never grants permission or runs a tool. Persist its loaded
77
+ * names with `onLoad` to keep them available across turns and compaction.
73
78
  * - **Scope the tool set per agent** with `include`/`exclude` — a read-only agent
74
79
  * should not receive `write_file`/`exec_command`.
75
80
  * - Outputs are size-capped (`MAX_READ_SIZE`, `MAX_OUTPUT_SIZE`, …) and searches
@@ -142,11 +147,13 @@ export * from './line-diff.js';
142
147
  export * from './no-test-run.js';
143
148
  export * from './output-filter.js';
144
149
  export * from './pipeline-exit-note.js';
150
+ export * from './playwright-report.js';
145
151
  export * from './schemas.js';
146
152
  export * from './server-command.js';
147
153
  export * from './sleep-peek.js';
148
154
  export * from './suite-overlap.js';
149
155
  export * from './system-prompt.js';
156
+ export * from './tool-catalog.js';
150
157
  export * from './tools.js';
151
158
  export * from './trace-artifacts.js';
152
159
  export * from './types.js';
@@ -0,0 +1,210 @@
1
+ /**
2
+ * The standard Playwright machine report, kept beside a run's log instead of inferred from it.
3
+ *
4
+ * The execution wrapper already puts a background suite on Playwright's `list` reporter and
5
+ * preserves a file reporter the executor named ({@link ./utilities.js} `withPlaywrightRunReport`,
6
+ * `streamingBackgroundCommand`). That log is text: which failure a trace, a route or a locator
7
+ * belongs to has to be reconstructed from printed headings, and a mis-join reads one failing
8
+ * test's evidence as another's (xr-molecule-flash-m411). Playwright already writes the answer down
9
+ * itself — its built-in `json` reporter records every test's own identity (project, file, line,
10
+ * column, title path, status, retries) and every attachment the runner saved for THAT test, path
11
+ * included.
12
+ *
13
+ * So the wrapper adds the `json` reporter to a run it already rewrites, sends its output to a
14
+ * per-run file with the reporter's own `PLAYWRIGHT_JSON_OUTPUT_FILE` option, and this module turns
15
+ * that file into a small, bounded record on the tool result ({@link PlaywrightRunReport}). The
16
+ * whole file stays where it was written, so full evidence has a path; the record carries only what
17
+ * a diagnosis needs.
18
+ *
19
+ * Honesty rules, which every reader below follows:
20
+ *
21
+ * - A missing, empty, truncated or wrongly shaped file is NOT "the run failed nothing": it is
22
+ * `missing` / `malformed`, and a record that parsed but is not a whole run (`errors` present, no
23
+ * `suites`) is `partial`. Only a record with the runner's own stats and suite tree is `complete`.
24
+ * - The record never carries a pass/fail verdict and must never be read as one. Suite selection,
25
+ * retries, budgets and the platform's own proof decisions stay exactly where they were.
26
+ * - Nothing here parses console output, and nothing reads a report the executor asked for itself
27
+ * (a `json` reporter already named on the command, or a `PLAYWRIGHT_JSON_OUTPUT_FILE` the command
28
+ * sets): the executor's own artifact is theirs.
29
+ *
30
+ * @module
31
+ */
32
+ /**
33
+ * The environment variable Playwright's built-in `json` reporter takes its output path from
34
+ * (`resolveOutputFile("JSON", …)`), resolved against the runner's own working directory. An
35
+ * absolute path is used here, so the file lands in the run's scratch area whatever directory the
36
+ * suite runs from.
37
+ */
38
+ export declare const PLAYWRIGHT_REPORT_ENV = "PLAYWRIGHT_JSON_OUTPUT_FILE";
39
+ /** The file name a background task's report is written to, beside its own log. */
40
+ export declare const PLAYWRIGHT_REPORT_SUFFIX = ".playwright.json";
41
+ /**
42
+ * How big a report may be before this module refuses to summarize it. The file stays readable at
43
+ * its path; the record only says so. A whole 139-test suite's report is well under a megabyte; a
44
+ * report past this is not one a tool result should carry.
45
+ */
46
+ export declare const MAX_REPORT_PARSE_CHARS = 8000000;
47
+ /** How many failing tests a record lists before the rest are counted in `omittedFailures`. */
48
+ export declare const MAX_REPORTED_FAILURES = 12;
49
+ /** How many attachments one failing test keeps in the record (`trace` first). */
50
+ export declare const MAX_REPORTED_ATTACHMENTS = 4;
51
+ /** How much of one failure's own error text the record keeps. */
52
+ export declare const MAX_REPORTED_ERROR_CHARS = 400;
53
+ /**
54
+ * How much of a report this module could account for.
55
+ *
56
+ * - `complete` — the runner's stats and its suite tree both parsed: every test entry is present.
57
+ * - `partial` — a report was written but is not a whole run (Playwright's own `errors` are present,
58
+ * the suite tree is missing, or the file is past {@link MAX_REPORT_PARSE_CHARS}). What is listed
59
+ * is real; what is missing must be read at {@link PlaywrightRunReport.path}.
60
+ * - `malformed` — the file exists but is not a Playwright JSON report (truncated, wrong shape).
61
+ * Nothing in it may be treated as runner data.
62
+ * - `missing` — the run left no report (killed before `onEnd`, not a run this wrapper rewrote, or
63
+ * the file was removed). Nothing may be inferred from its absence.
64
+ */
65
+ export type PlaywrightReportStatus = 'complete' | 'partial' | 'malformed' | 'missing';
66
+ /** One artifact the runner saved for one test, as the report records it. */
67
+ export interface PlaywrightReportAttachment {
68
+ /** The attachment's name (`trace`, `screenshot`, …). */
69
+ name: string;
70
+ /** Its media type, when the runner recorded one. */
71
+ contentType: string | null;
72
+ /** Where the runner saved it, as the report wrote the path. */
73
+ path: string;
74
+ }
75
+ /**
76
+ * One failing (or flaky) test's identity and evidence, as the runner recorded them.
77
+ *
78
+ * The identity fields are Playwright's own — never reconstructed from printed headings — so a
79
+ * reader can tell exactly which test an attachment belongs to.
80
+ */
81
+ export interface PlaywrightReportTest {
82
+ /** The spec's stable id, when the report carries one. */
83
+ id: string | null;
84
+ /** The Playwright project the test ran in. */
85
+ project: string | null;
86
+ /** The spec file, relative to the config's root directory as the report writes it. */
87
+ file: string;
88
+ /** The test's declaration line. */
89
+ line: number;
90
+ /** The test's declaration column. */
91
+ column: number;
92
+ /** The full title path (`['describe', …, 'test title']`), empty when none is readable. */
93
+ titlePath: string[];
94
+ /** The test's own title (the last entry of {@link titlePath}). */
95
+ title: string;
96
+ /** Playwright's outcome for the test: `unexpected`, `flaky`, `skipped` or `expected`. */
97
+ status: string;
98
+ /** How many attempts the runner made (1 when it was not retried). */
99
+ attempts: number;
100
+ /** The retry index of the attempt whose evidence is reported (0 when not retried). */
101
+ retry: number;
102
+ /** That attempt's own duration, in milliseconds. */
103
+ durationMs: number;
104
+ /** That attempt's error message, bounded and redacted, or null. */
105
+ error: string | null;
106
+ /** The artifacts the runner saved for THAT attempt — `trace` first. */
107
+ attachments: PlaywrightReportAttachment[];
108
+ }
109
+ /** The runner's own tally, read straight from the report. Never a verdict this module derives. */
110
+ export interface PlaywrightReportStats {
111
+ /** Tests that ended as expected. */
112
+ expected: number;
113
+ /** Tests the runner skipped. */
114
+ skipped: number;
115
+ /** Tests that did not end as expected. */
116
+ unexpected: number;
117
+ /** Tests that failed and then passed on a retry. */
118
+ flaky: number;
119
+ /** The run's own duration, in milliseconds. */
120
+ durationMs: number;
121
+ }
122
+ /**
123
+ * What one run's standard machine report says, bounded for a tool result.
124
+ *
125
+ * A reader that needs evidence this record does not carry reads {@link path} in the sandbox.
126
+ */
127
+ export interface PlaywrightRunReport {
128
+ /** How much of the report was read — see {@link PlaywrightReportStatus}. */
129
+ status: PlaywrightReportStatus;
130
+ /** Where the report file is, for the full evidence. Always the runner's own file. */
131
+ path: string;
132
+ /** One short phrase saying why a record is not `complete`, when it is not. */
133
+ reason?: string;
134
+ /** The runner's tally, or null when the report did not carry one. */
135
+ stats: PlaywrightReportStats | null;
136
+ /** The failing and flaky tests, in report order, bounded by {@link MAX_REPORTED_FAILURES}. */
137
+ failures: PlaywrightReportTest[];
138
+ /** How many failing tests did not fit the bound above. */
139
+ omittedFailures: number;
140
+ }
141
+ /**
142
+ * The report statuses for which the report's own per-test identities and attachments may be used.
143
+ *
144
+ * `partial` is included because a partial report's suite tree, where it parsed, is still the
145
+ * runner's own record of which test owns which attachment; `malformed` and `missing` are not,
146
+ * because nothing about them is runner data.
147
+ *
148
+ * @param status - One record's {@link PlaywrightReportStatus}.
149
+ * @returns True when the record's tests and attachments are the runner's own.
150
+ */
151
+ export declare function reportCarriesIdentities(status: PlaywrightReportStatus): boolean;
152
+ /**
153
+ * The attachment paths a stored test record carries, `trace` first.
154
+ *
155
+ * @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
156
+ * @returns Every saved path the record can prove, in its own order.
157
+ */
158
+ export declare function reportTestAttachmentPaths(test: PlaywrightReportTest): string[];
159
+ /**
160
+ * The directory a test result's own artifacts were saved in, or null when the report names none.
161
+ *
162
+ * Playwright writes one directory per test attempt under the run's `outputDir`, and every artifact
163
+ * of that attempt — `trace.zip` included — sits in it. The directory is therefore the exact
164
+ * ownership mark for a trace: two tests' traces are never in one another's directory. A damaged
165
+ * record whose attachment entries carry no path answers null, so nothing is claimed from it.
166
+ *
167
+ * @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
168
+ * @returns The posix-normalized directory, or null.
169
+ */
170
+ export declare function reportTestArtifactDir(test: PlaywrightReportTest): string | null;
171
+ /**
172
+ * Summarize one Playwright `json` report into the bounded record a tool result carries.
173
+ *
174
+ * Pure text in, record out: the caller reads the file (and decides whether it may), so this is
175
+ * testable against genuine reports and against malformed controls alike.
176
+ *
177
+ * @param text - The report file's text, exactly as written.
178
+ * @param options - Where the file is, and the consumer's redactor for error text.
179
+ * @param options.path - The report file's path, carried on the record for full evidence.
180
+ * @param options.sanitize - Redactor applied to error text (defaults to the identity).
181
+ * @returns The bounded record; never a verdict.
182
+ */
183
+ export declare function summarizePlaywrightReport(text: string, options: {
184
+ path: string;
185
+ sanitize?: (text: string) => string;
186
+ }): PlaywrightRunReport;
187
+ /**
188
+ * The report path a command was launched with, when it is the one this platform sets.
189
+ *
190
+ * Read back from the launched script (and from a completed task's own command) so a record written
191
+ * before an API restart is still found: the path is the task's own id derived by
192
+ * {@link playwrightReportPathFor}, never a path parsed out of the executor's command.
193
+ *
194
+ * @param command - The command as it was launched.
195
+ * @param expectedPath - The one path this task's report may be at.
196
+ * @returns True when the command sets {@link PLAYWRIGHT_REPORT_ENV} to that exact path.
197
+ */
198
+ export declare function commandWritesReportTo(command: string, expectedPath: string): boolean;
199
+ /**
200
+ * The report file a background task's own scratch files live beside.
201
+ *
202
+ * Derived from the task id, never from the command: the id is unique per launch, so two runs can
203
+ * never read one another's report, and the path survives a process restart the same way the task's
204
+ * log and exit file do.
205
+ *
206
+ * @param taskId - The `mol-bg-…` handle the launch returned.
207
+ * @returns The report file's absolute path.
208
+ */
209
+ export declare function playwrightReportPathFor(taskId: string): string;
210
+ //# sourceMappingURL=playwright-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-report.d.ts","sourceRoot":"","sources":["../src/playwright-report.ts"],"names":[],"mappings":"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"}