donobu 5.48.0 → 5.50.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.
@@ -197,6 +197,7 @@ export declare const FlowMetadataSchema: z.ZodObject<{
197
197
  branch: z.ZodOptional<z.ZodString>;
198
198
  dirty: z.ZodOptional<z.ZodBoolean>;
199
199
  }, z.core.$loose>>;
200
+ runId: z.ZodOptional<z.ZodString>;
200
201
  }, z.core.$loose>>;
201
202
  }, z.core.$loose>;
202
203
  export type FlowMetadata = z.infer<typeof FlowMetadataSchema>;
@@ -38,6 +38,7 @@ export declare const ProvenanceSchema: z.ZodObject<{
38
38
  branch: z.ZodOptional<z.ZodString>;
39
39
  dirty: z.ZodOptional<z.ZodBoolean>;
40
40
  }, z.core.$loose>>;
41
+ runId: z.ZodOptional<z.ZodString>;
41
42
  }, z.core.$loose>;
42
43
  export type Provenance = z.infer<typeof ProvenanceSchema>;
43
44
  //# sourceMappingURL=Provenance.d.ts.map
@@ -55,6 +55,15 @@ exports.ProvenanceSchema = v4_1.z
55
55
  'no CI markers were detected.'),
56
56
  git: exports.GitProvenanceSchema.optional().describe('Git working-tree context at creation time. Absent when the CWD is ' +
57
57
  'not a git repo or `git` is unavailable.'),
58
+ runId: v4_1.z
59
+ .string()
60
+ .optional()
61
+ .describe('Stable identifier for the CI/CD invocation (or local test run) that ' +
62
+ 'produced this flow. Read verbatim from the DONOBU_RUN_ID environment ' +
63
+ 'variable, which the test runner is responsible for setting (so every ' +
64
+ 'flow in the same run shares it and it differs across runs). Absent ' +
65
+ 'for flows created before runId capture, or by a run that did not set ' +
66
+ 'DONOBU_RUN_ID.'),
58
67
  })
59
68
  .loose();
60
69
  //# sourceMappingURL=Provenance.js.map
@@ -156,6 +156,7 @@ export declare const SuiteMetadataSchema: z.ZodObject<{
156
156
  branch: z.ZodOptional<z.ZodString>;
157
157
  dirty: z.ZodOptional<z.ZodBoolean>;
158
158
  }, z.core.$loose>>;
159
+ runId: z.ZodOptional<z.ZodString>;
159
160
  }, z.core.$loose>>;
160
161
  }, z.core.$loose>;
161
162
  export type SuiteMetadata = z.infer<typeof SuiteMetadataSchema>;
@@ -159,6 +159,7 @@ export declare const TestMetadataSchema: z.ZodObject<{
159
159
  branch: z.ZodOptional<z.ZodString>;
160
160
  dirty: z.ZodOptional<z.ZodBoolean>;
161
161
  }, z.core.$loose>>;
162
+ runId: z.ZodOptional<z.ZodString>;
162
163
  }, z.core.$loose>>;
163
164
  }, z.core.$loose>;
164
165
  export type TestMetadata = z.infer<typeof TestMetadataSchema>;
@@ -340,6 +341,7 @@ export declare const TestListItemSchema: z.ZodObject<{
340
341
  branch: z.ZodOptional<z.ZodString>;
341
342
  dirty: z.ZodOptional<z.ZodBoolean>;
342
343
  }, z.core.$loose>>;
344
+ runId: z.ZodOptional<z.ZodString>;
343
345
  }, z.core.$loose>>;
344
346
  flowCount: z.ZodNumber;
345
347
  latestFlow: z.ZodNullable<z.ZodObject<{
@@ -528,6 +530,7 @@ export declare const TestListItemSchema: z.ZodObject<{
528
530
  branch: z.ZodOptional<z.ZodString>;
529
531
  dirty: z.ZodOptional<z.ZodBoolean>;
530
532
  }, z.core.$loose>>;
533
+ runId: z.ZodOptional<z.ZodString>;
531
534
  }, z.core.$loose>>;
532
535
  }, z.core.$loose>>;
533
536
  }, z.core.$loose>;
@@ -688,6 +691,7 @@ export declare const TestListItemPaginatedResultSchema: z.ZodObject<{
688
691
  branch: z.ZodOptional<z.ZodString>;
689
692
  dirty: z.ZodOptional<z.ZodBoolean>;
690
693
  }, z.core.$loose>>;
694
+ runId: z.ZodOptional<z.ZodString>;
691
695
  }, z.core.$loose>>;
692
696
  flowCount: z.ZodNumber;
693
697
  latestFlow: z.ZodNullable<z.ZodObject<{
@@ -876,6 +880,7 @@ export declare const TestListItemPaginatedResultSchema: z.ZodObject<{
876
880
  branch: z.ZodOptional<z.ZodString>;
877
881
  dirty: z.ZodOptional<z.ZodBoolean>;
878
882
  }, z.core.$loose>>;
883
+ runId: z.ZodOptional<z.ZodString>;
879
884
  }, z.core.$loose>>;
880
885
  }, z.core.$loose>>;
881
886
  }, z.core.$loose>>;
@@ -1722,7 +1722,7 @@ function renderHtml(report, triage, outputDir) {
1722
1722
  </div>
1723
1723
  </div>
1724
1724
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1725
- ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1725
+ ${test.tags.map((t) => `<span class="test-tag" data-copy-tag="${esc(t)}" title="Click to copy"><span class="tag-label">${esc(t)}</span><span class="tag-copy-glyph"><svg viewBox="0 0 24 24"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg></span></span>`).join('')}
1726
1726
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1727
1727
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1728
1728
  </div>
@@ -1870,7 +1870,13 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1870
1870
  .copy-flow-id .check-icon{color:#22c55e}
1871
1871
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1872
1872
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1873
- .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1873
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;transition:background .15s,border-color .15s}
1874
+ .test-tag:hover{background:rgba(255,127,58,.16);border-color:rgba(255,127,58,.45)}
1875
+ .tag-copy-glyph{display:inline-flex;align-items:center;width:0;margin-left:0;opacity:0;overflow:hidden;transition:width .15s,opacity .15s,margin-left .15s}
1876
+ .test-tag:hover .tag-copy-glyph,.test-tag.copied .tag-copy-glyph{width:11px;margin-left:4px;opacity:.75}
1877
+ .tag-copy-glyph svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
1878
+ .test-tag.copied{color:#22c55e;border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.12)}
1879
+ .test-tag.copied .tag-copy-glyph{opacity:1}
1874
1880
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1875
1881
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1876
1882
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -2540,6 +2546,10 @@ details.ai-invocation[open]>summary .native-step-chevron{transform:rotate(90deg)
2540
2546
  // Copy buttons (flow ID + JSON + inline text via data-copy-text)
2541
2547
  var copyTextBtn=e.target.closest('.copy-text[data-copy-text]');
2542
2548
  if(copyTextBtn){e.stopPropagation();e.preventDefault();navigator.clipboard.writeText(copyTextBtn.getAttribute('data-copy-text'));var copyTextSvg=copyTextBtn.innerHTML;copyTextBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){copyTextBtn.innerHTML=copyTextSvg},2000);return}
2549
+ // Tag chip: click anywhere on the chip copies its tag text. The hover glyph
2550
+ // briefly becomes a check; stopPropagation keeps the card from expanding.
2551
+ var tagChip=e.target.closest('.test-tag[data-copy-tag]');
2552
+ if(tagChip){e.stopPropagation();navigator.clipboard.writeText(tagChip.getAttribute('data-copy-tag'));var glyph=tagChip.querySelector('.tag-copy-glyph');if(glyph){var glyphSvg=glyph.innerHTML;glyph.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';tagChip.classList.add('copied');setTimeout(function(){glyph.innerHTML=glyphSvg;tagChip.classList.remove('copied')},1500)}return}
2543
2553
  var flowBtn=e.target.closest('.copy-flow-id');
2544
2554
  if(flowBtn){e.stopPropagation();navigator.clipboard.writeText(flowBtn.getAttribute('data-flow-id'));var copySvg=flowBtn.innerHTML;flowBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){flowBtn.innerHTML=copySvg},2000);return}
2545
2555
  var jsonBtn=e.target.closest('.copy-json');
@@ -96,6 +96,7 @@ function buildProvenance(source) {
96
96
  hostname,
97
97
  ci: isCode ? detectCi() : undefined,
98
98
  git: isCode ? detectGit() : undefined,
99
+ runId: process.env.DONOBU_RUN_ID,
99
100
  };
100
101
  }
101
102
  //# sourceMappingURL=buildProvenance.js.map
@@ -197,6 +197,7 @@ export declare const FlowMetadataSchema: z.ZodObject<{
197
197
  branch: z.ZodOptional<z.ZodString>;
198
198
  dirty: z.ZodOptional<z.ZodBoolean>;
199
199
  }, z.core.$loose>>;
200
+ runId: z.ZodOptional<z.ZodString>;
200
201
  }, z.core.$loose>>;
201
202
  }, z.core.$loose>;
202
203
  export type FlowMetadata = z.infer<typeof FlowMetadataSchema>;
@@ -38,6 +38,7 @@ export declare const ProvenanceSchema: z.ZodObject<{
38
38
  branch: z.ZodOptional<z.ZodString>;
39
39
  dirty: z.ZodOptional<z.ZodBoolean>;
40
40
  }, z.core.$loose>>;
41
+ runId: z.ZodOptional<z.ZodString>;
41
42
  }, z.core.$loose>;
42
43
  export type Provenance = z.infer<typeof ProvenanceSchema>;
43
44
  //# sourceMappingURL=Provenance.d.ts.map
@@ -55,6 +55,15 @@ exports.ProvenanceSchema = v4_1.z
55
55
  'no CI markers were detected.'),
56
56
  git: exports.GitProvenanceSchema.optional().describe('Git working-tree context at creation time. Absent when the CWD is ' +
57
57
  'not a git repo or `git` is unavailable.'),
58
+ runId: v4_1.z
59
+ .string()
60
+ .optional()
61
+ .describe('Stable identifier for the CI/CD invocation (or local test run) that ' +
62
+ 'produced this flow. Read verbatim from the DONOBU_RUN_ID environment ' +
63
+ 'variable, which the test runner is responsible for setting (so every ' +
64
+ 'flow in the same run shares it and it differs across runs). Absent ' +
65
+ 'for flows created before runId capture, or by a run that did not set ' +
66
+ 'DONOBU_RUN_ID.'),
58
67
  })
59
68
  .loose();
60
69
  //# sourceMappingURL=Provenance.js.map
@@ -156,6 +156,7 @@ export declare const SuiteMetadataSchema: z.ZodObject<{
156
156
  branch: z.ZodOptional<z.ZodString>;
157
157
  dirty: z.ZodOptional<z.ZodBoolean>;
158
158
  }, z.core.$loose>>;
159
+ runId: z.ZodOptional<z.ZodString>;
159
160
  }, z.core.$loose>>;
160
161
  }, z.core.$loose>;
161
162
  export type SuiteMetadata = z.infer<typeof SuiteMetadataSchema>;
@@ -159,6 +159,7 @@ export declare const TestMetadataSchema: z.ZodObject<{
159
159
  branch: z.ZodOptional<z.ZodString>;
160
160
  dirty: z.ZodOptional<z.ZodBoolean>;
161
161
  }, z.core.$loose>>;
162
+ runId: z.ZodOptional<z.ZodString>;
162
163
  }, z.core.$loose>>;
163
164
  }, z.core.$loose>;
164
165
  export type TestMetadata = z.infer<typeof TestMetadataSchema>;
@@ -340,6 +341,7 @@ export declare const TestListItemSchema: z.ZodObject<{
340
341
  branch: z.ZodOptional<z.ZodString>;
341
342
  dirty: z.ZodOptional<z.ZodBoolean>;
342
343
  }, z.core.$loose>>;
344
+ runId: z.ZodOptional<z.ZodString>;
343
345
  }, z.core.$loose>>;
344
346
  flowCount: z.ZodNumber;
345
347
  latestFlow: z.ZodNullable<z.ZodObject<{
@@ -528,6 +530,7 @@ export declare const TestListItemSchema: z.ZodObject<{
528
530
  branch: z.ZodOptional<z.ZodString>;
529
531
  dirty: z.ZodOptional<z.ZodBoolean>;
530
532
  }, z.core.$loose>>;
533
+ runId: z.ZodOptional<z.ZodString>;
531
534
  }, z.core.$loose>>;
532
535
  }, z.core.$loose>>;
533
536
  }, z.core.$loose>;
@@ -688,6 +691,7 @@ export declare const TestListItemPaginatedResultSchema: z.ZodObject<{
688
691
  branch: z.ZodOptional<z.ZodString>;
689
692
  dirty: z.ZodOptional<z.ZodBoolean>;
690
693
  }, z.core.$loose>>;
694
+ runId: z.ZodOptional<z.ZodString>;
691
695
  }, z.core.$loose>>;
692
696
  flowCount: z.ZodNumber;
693
697
  latestFlow: z.ZodNullable<z.ZodObject<{
@@ -876,6 +880,7 @@ export declare const TestListItemPaginatedResultSchema: z.ZodObject<{
876
880
  branch: z.ZodOptional<z.ZodString>;
877
881
  dirty: z.ZodOptional<z.ZodBoolean>;
878
882
  }, z.core.$loose>>;
883
+ runId: z.ZodOptional<z.ZodString>;
879
884
  }, z.core.$loose>>;
880
885
  }, z.core.$loose>>;
881
886
  }, z.core.$loose>>;
@@ -1722,7 +1722,7 @@ function renderHtml(report, triage, outputDir) {
1722
1722
  </div>
1723
1723
  </div>
1724
1724
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1725
- ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1725
+ ${test.tags.map((t) => `<span class="test-tag" data-copy-tag="${esc(t)}" title="Click to copy"><span class="tag-label">${esc(t)}</span><span class="tag-copy-glyph"><svg viewBox="0 0 24 24"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg></span></span>`).join('')}
1726
1726
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1727
1727
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1728
1728
  </div>
@@ -1870,7 +1870,13 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1870
1870
  .copy-flow-id .check-icon{color:#22c55e}
1871
1871
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1872
1872
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1873
- .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1873
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;transition:background .15s,border-color .15s}
1874
+ .test-tag:hover{background:rgba(255,127,58,.16);border-color:rgba(255,127,58,.45)}
1875
+ .tag-copy-glyph{display:inline-flex;align-items:center;width:0;margin-left:0;opacity:0;overflow:hidden;transition:width .15s,opacity .15s,margin-left .15s}
1876
+ .test-tag:hover .tag-copy-glyph,.test-tag.copied .tag-copy-glyph{width:11px;margin-left:4px;opacity:.75}
1877
+ .tag-copy-glyph svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
1878
+ .test-tag.copied{color:#22c55e;border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.12)}
1879
+ .test-tag.copied .tag-copy-glyph{opacity:1}
1874
1880
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1875
1881
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1876
1882
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -2540,6 +2546,10 @@ details.ai-invocation[open]>summary .native-step-chevron{transform:rotate(90deg)
2540
2546
  // Copy buttons (flow ID + JSON + inline text via data-copy-text)
2541
2547
  var copyTextBtn=e.target.closest('.copy-text[data-copy-text]');
2542
2548
  if(copyTextBtn){e.stopPropagation();e.preventDefault();navigator.clipboard.writeText(copyTextBtn.getAttribute('data-copy-text'));var copyTextSvg=copyTextBtn.innerHTML;copyTextBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){copyTextBtn.innerHTML=copyTextSvg},2000);return}
2549
+ // Tag chip: click anywhere on the chip copies its tag text. The hover glyph
2550
+ // briefly becomes a check; stopPropagation keeps the card from expanding.
2551
+ var tagChip=e.target.closest('.test-tag[data-copy-tag]');
2552
+ if(tagChip){e.stopPropagation();navigator.clipboard.writeText(tagChip.getAttribute('data-copy-tag'));var glyph=tagChip.querySelector('.tag-copy-glyph');if(glyph){var glyphSvg=glyph.innerHTML;glyph.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';tagChip.classList.add('copied');setTimeout(function(){glyph.innerHTML=glyphSvg;tagChip.classList.remove('copied')},1500)}return}
2543
2553
  var flowBtn=e.target.closest('.copy-flow-id');
2544
2554
  if(flowBtn){e.stopPropagation();navigator.clipboard.writeText(flowBtn.getAttribute('data-flow-id'));var copySvg=flowBtn.innerHTML;flowBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){flowBtn.innerHTML=copySvg},2000);return}
2545
2555
  var jsonBtn=e.target.closest('.copy-json');
@@ -96,6 +96,7 @@ function buildProvenance(source) {
96
96
  hostname,
97
97
  ci: isCode ? detectCi() : undefined,
98
98
  git: isCode ? detectGit() : undefined,
99
+ runId: process.env.DONOBU_RUN_ID,
99
100
  };
100
101
  }
101
102
  //# sourceMappingURL=buildProvenance.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "5.48.0",
3
+ "version": "5.50.0",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",