@krapht/ork 1.0.0-alpha.4 → 1.0.0-alpha.6
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/dist/{__build_info__-1i1IwLg7.mjs → __build_info__-CxH89h1r.mjs} +2 -2
- package/dist/bin.mjs +54 -224
- package/dist/{clean-B1zPxq6A.mjs → clean-BbrkMQQi.mjs} +1 -1
- package/dist/{completion-BY-frez8.mjs → completion-BeS2NCgO.mjs} +5 -5
- package/dist/{context-CD5TCD1D.mjs → context-CHV6aTs7.mjs} +3 -3
- package/dist/{decide-CBhYcjwI.mjs → decide-Cnt7o3ya.mjs} +3 -3
- package/dist/{find-BgZjVKhv.mjs → find-Dy2H5IvT.mjs} +1 -1
- package/dist/{format-Creyq4U3.mjs → format-OL0E1AjA.mjs} +223 -17
- package/dist/{in-a-run-CsSBQQ2q.mjs → in-a-run-emTc-kZI.mjs} +1 -1
- package/dist/{limits-D_HxH0CK.mjs → limits-TxTnWxix.mjs} +1 -1
- package/dist/{list-CzzpVEpM.mjs → list-P5CfcoWx.mjs} +1 -1
- package/dist/{mcp-DYmQt372.mjs → mcp-qUwFT9yi.mjs} +6 -6
- package/dist/{output-CuivUcDa.mjs → output-CjOPL8W0.mjs} +9 -6
- package/dist/{pause-W6MzQqg8.mjs → pause-CBSAxtTp.mjs} +4 -4
- package/dist/{relay-CsdoZUXJ.mjs → relay-UgK1Cp9a.mjs} +2 -2
- package/dist/{remove-DLfDjBdF.mjs → remove-ccycC3vI.mjs} +3 -3
- package/dist/{send-Bw2FI_Sv.mjs → send-B39-Xeo7.mjs} +3 -3
- package/dist/{src-CrYCkU9J.mjs → src-5-sCA7cY.mjs} +50 -19
- package/dist/{src-Bc9yaAiZ.mjs → src-8nec4uoe.mjs} +14 -7
- package/dist/{src-BRB5EQyC.mjs → src-DG4dyBqm.mjs} +61 -20
- package/dist/{src-CsjumY1t.mjs → src-jyCJE1kd.mjs} +26 -12
- package/dist/ui/THIRD_PARTY_LICENSES.txt +594 -0
- package/dist/ui/assets/app-C1DAgdU2.js +75 -0
- package/dist/ui/assets/app-Dt_tjFj6.css +1 -0
- package/dist/ui/assets/{index-UEC5ZLYw.js → index-BZKXPhht.js} +3 -3
- package/dist/ui/assets/theme-CdXvqTQ6.js +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/{ui-wX050aH1.mjs → ui-DmJWLgxL.mjs} +4 -4
- package/dist/{usage-C96RDH-G.mjs → usage-Bh1lVioA.mjs} +5 -5
- package/dist/{watch-vdRobJil.mjs → watch-C_vcsn_g.mjs} +6 -6
- package/dist/{workflows-B28q8zMY.mjs → workflows-lpexsAYt.mjs} +3 -3
- package/dist/{worktrees-CKDRkl6b.mjs → worktrees-D4bVVKfY.mjs} +10 -4
- package/package.json +1 -1
- package/dist/ui/assets/app-BNT0SuIz.css +0 -1
- package/dist/ui/assets/app-m9Gfrg_S.js +0 -67
- package/dist/ui/assets/theme-3xH5jxKs.js +0 -1
|
@@ -661,6 +661,7 @@ const HumanGateNodeSchema = z.strictObject({
|
|
|
661
661
|
...base,
|
|
662
662
|
...notifyFields,
|
|
663
663
|
question: z.string(),
|
|
664
|
+
document: z.string().optional(),
|
|
664
665
|
options: z.array(DecisionOptionSchema).min(2),
|
|
665
666
|
recommended: z.string().optional(),
|
|
666
667
|
timeout: DurationSchema.optional(),
|
|
@@ -3601,6 +3602,26 @@ const writePlugin = (stack, dir, description) => {
|
|
|
3601
3602
|
}
|
|
3602
3603
|
return dir;
|
|
3603
3604
|
};
|
|
3605
|
+
// ../core/src/store/mask.ts
|
|
3606
|
+
/**
|
|
3607
|
+
* @file Masks secrets before anything is stored: tokens and keys in common
|
|
3608
|
+
* formats, anywhere in an event's strings. The store and feedback records use
|
|
3609
|
+
* the same patterns; the terminal is not masked (it is the user's own).
|
|
3610
|
+
*/
|
|
3611
|
+
const PATTERNS = [
|
|
3612
|
+
/sk-ant-[\w-]{20,}/gu,
|
|
3613
|
+
/\bgh[opsur]_[A-Za-z0-9]{20,}/gu,
|
|
3614
|
+
/\bgithub_pat_\w{20,}/gu,
|
|
3615
|
+
/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/gu,
|
|
3616
|
+
/\bxox[abprs]-[\w-]{10,}/gu,
|
|
3617
|
+
/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/gu,
|
|
3618
|
+
/(?<=\bbearer\s+)[\w.~+/-]{20,}=*/giu,
|
|
3619
|
+
/(?<=aws_secret_access_key\s*[=:]\s*)\S+/giu
|
|
3620
|
+
];
|
|
3621
|
+
const MASK = "[masked]";
|
|
3622
|
+
const maskSecrets = (text) => PATTERNS.reduce((out, pattern) => out.replaceAll(pattern, MASK), text);
|
|
3623
|
+
/** A `JSON.stringify` replacer that masks every string. */
|
|
3624
|
+
const maskReplacer = (_key, value) => typeof value === "string" ? maskSecrets(value) : value;
|
|
3604
3625
|
// ../core/src/control/socket.ts
|
|
3605
3626
|
/**
|
|
3606
3627
|
* @file The per-run local socket (`~/.ork/sockets/<run>.sock`): the fast path
|
|
@@ -4223,27 +4244,39 @@ const stringify$1 = (value) => {
|
|
|
4223
4244
|
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
4224
4245
|
return JSON.stringify(value);
|
|
4225
4246
|
};
|
|
4226
|
-
const
|
|
4227
|
-
|
|
4247
|
+
const isContainer = (value) => value !== null && typeof value === "object";
|
|
4248
|
+
const depthOf = (value) => isContainer(value) ? 1 + Math.max(0, ...Object.values(value).map((item) => depthOf(item))) : 0;
|
|
4249
|
+
/** Keeps a multi-line value inside its list item or `key:` line. */
|
|
4250
|
+
const hang = (text) => text.replaceAll("\n", "\n ");
|
|
4251
|
+
/** A value at most two levels deep as Markdown list items and `key: value`. */
|
|
4252
|
+
const listed$2 = (value) => {
|
|
4253
|
+
if (!isContainer(value)) return stringify$1(value);
|
|
4254
|
+
if (Array.isArray(value)) return value.map((item) => `- ${hang(listed$2(item))}`).join("\n");
|
|
4255
|
+
return Object.entries(value).map(([key, item]) => isContainer(item) ? `${key}:\n ${hang(listed$2(item))}` : `${key}: ${hang(stringify$1(item))}`).join("\n");
|
|
4256
|
+
};
|
|
4228
4257
|
/**
|
|
4229
|
-
*
|
|
4230
|
-
*
|
|
4231
|
-
*
|
|
4258
|
+
* A value as a person reads it: Markdown, never a line of raw JSON. `before` is
|
|
4259
|
+
* the text so far: a list or object starts on its own line, after a blank one
|
|
4260
|
+
* when text shares its line.
|
|
4232
4261
|
*/
|
|
4233
|
-
const
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
const
|
|
4262
|
+
const readableText = (value, before) => {
|
|
4263
|
+
if (!isContainer(value)) return stringify$1(value);
|
|
4264
|
+
if (depthOf(value) <= 2) {
|
|
4265
|
+
const list = listed$2(value);
|
|
4266
|
+
return list === "" || before === "" || before.endsWith("\n") ? list : `\n\n${list}`;
|
|
4267
|
+
}
|
|
4268
|
+
const code = JSON.stringify(value, void 0, 2).replaceAll(/^/gmu, " ");
|
|
4269
|
+
return before === "" || before.endsWith("\n\n") ? code : `\n\n${code}`;
|
|
4270
|
+
};
|
|
4271
|
+
/**
|
|
4272
|
+
* Fills a parsed template. `readable` is for text a person reads (a gate's
|
|
4273
|
+
* `question` and `document`); scripts and prompts keep JSON (ADR-047).
|
|
4274
|
+
*/
|
|
4275
|
+
const renderTemplate = (parts, scope, { readable = false } = {}) => parts.reduce((text, part) => {
|
|
4276
|
+
if (typeof part === "string") return text + part;
|
|
4277
|
+
const value = evaluate(part.expr, scope);
|
|
4278
|
+
return text + (readable ? readableText(value, text) : stringify$1(value));
|
|
4279
|
+
}, "");
|
|
4247
4280
|
// ../core/src/feedback/fingerprint.ts
|
|
4248
4281
|
/**
|
|
4249
4282
|
* @file Feedback fingerprints: records about the same thing (same target, kind,
|
|
@@ -5893,6 +5926,7 @@ const TEMPLATE_FIELDS = [
|
|
|
5893
5926
|
"command",
|
|
5894
5927
|
"cwd",
|
|
5895
5928
|
"question",
|
|
5929
|
+
"document",
|
|
5896
5930
|
"workflow",
|
|
5897
5931
|
"project",
|
|
5898
5932
|
"ref"
|
|
@@ -6491,6 +6525,8 @@ const createOwnership = (hooks) => {
|
|
|
6491
6525
|
if (accepted.length > 0) {
|
|
6492
6526
|
const problem = await hooks.checkpoint();
|
|
6493
6527
|
if (problem !== null) notes.push(`Your uncommitted work could not be committed (${problem}); the children started from your branch's last commit.`);
|
|
6528
|
+
const released = hooks.releaseClaims().map((r) => `\`${r}\``);
|
|
6529
|
+
if (released.length > 0) notes.push(`Your claims on ${released.join(", ")} were released while your children worked; claim again before you edit.`);
|
|
6494
6530
|
}
|
|
6495
6531
|
hooks.lend();
|
|
6496
6532
|
try {
|
|
@@ -6642,6 +6678,11 @@ const nodeContext = (deps, activation, cwd, round) => {
|
|
|
6642
6678
|
runChild: deps.runChild,
|
|
6643
6679
|
isRunning: (other) => deps.running.has(other),
|
|
6644
6680
|
checkpoint: () => options.workspace?.checkpoint(id) ?? Promise.resolve(null),
|
|
6681
|
+
releaseClaims: () => {
|
|
6682
|
+
const held = context.claims?.held() ?? [];
|
|
6683
|
+
for (const resource of held) context.claims?.release(resource);
|
|
6684
|
+
return held;
|
|
6685
|
+
},
|
|
6645
6686
|
lend: deps.slots.release,
|
|
6646
6687
|
reclaim: deps.slots.take
|
|
6647
6688
|
});
|
|
@@ -13140,4 +13181,4 @@ const createWorkspace = (options) => {
|
|
|
13140
13181
|
close
|
|
13141
13182
|
};
|
|
13142
13183
|
};
|
|
13143
|
-
export { text as $, isToolNode as $n,
|
|
13184
|
+
export { text as $, isToolNode as $n, evaluate as $t, gitOk as A, projectRootOf as An, runScope as At, linkNodes as B, readDocument as Bn, serversIn as Bt, workflowTextHash as C, placeFiles as Cn, walkChecks as Ct, inspectProject as D, shownPath as Dn, userMessageText as Dt, BRANCH_PREFIX as E, runDirOf as En, MESSAGE_LIMIT as Et, declaredProblem as F, writePlainFile as Fn, PROJECT_FILE as Ft, requestContinue as G, EdgeInputSchema as Gn, planPost as Gt, tellNode as H, parseWorkflow as Hn, FEEDBACK_SEVERITIES as Ht, createCalls as I, skillsIn as In, gitRulesOf as It, tellLiveRun as J, expandEdge as Jn, publishPost as Jt, requestPause as K, WorkflowSchema as Kn, runGh as Kt, addressOf as L, WorkflowEditSchema as Ln, loadProject as Lt, clearGitLocalEnv as M, estimateTokens as Mn, envReadsOf as Mt, parseInputPairs as N, guardedBase as Nn, nodeSays as Nt, removeWorktree as O, workflowDirOf as On, heldTimeout as Ot, resolveInputs as P, plainPathInside as Pn, declaredOutputOf as Pt, inTransaction as Q, isClaudeNode as Qn, targetOf as Qt, endLink as R, applyEdits as Rn, MCP_FILE as Rt, readProjectTriggers as S, newProjectId as Sn, checkWorkflowText as St, watchingPid as T, projectsHome as Tn, startRun as Tt, unlinkNodes as U, serializeWorkflow as Un, FEEDBACK_TARGETS as Ut, peerOf as V, renderJsonSchema as Vn, FEEDBACK_KINDS as Vt, flattenTree as W, markValue as Wn, DISCUSSIONS as Wt, usageQueries as X, NodeSchema as Xn, fingerprint as Xt, backfillUsage as Y, settingsOf as Yn, createFeedback as Yt, eventOf as Z, beforeOf as Zn, normalizeTitle as Zt, lateTriggers as _, catalogAgent as _n, runStatus as _t, limitsNow as a, socketRoom as an, integrationFor as ar, DETACHED_ENV as at, triggerStanding as b, hasInRepoFiles as bn, processAlive as bt, usd as c, maskSecrets as cn, CLAUDE_DRIVERS as cr, explainWorkflowText as ct, runningRunIds as d, planMoveInto as dn, experimentsOn as dr, namingNoDriver as dt, parseTemplate as en, programsRunBy as er, adoptedCalls as et, runningScript as f, linkTools as fn, knownExperiments as fr, sessionDriver as ft, parseVersion as g, deleteAgent as gn, pausedOf as gt, isNewer as h, createAgent as hn, liveStatus as ht, NOT_STARTED as i, socketPath as in, TOOL_PREFIX as ir, replayLoopAnswers as it, lines as j, LESSON_CAP_TOKENS as jn, calledWorkflows as jt, git as k, inside as kn, scriptContactsOf as kt, planUpgrade as l, planAgentMigration as ln, firstLine as lr, explainSession as lt, compareVersions as m, toolsInUse as mn, reportSchemaFor as mt, resolveBase as n, readCondition as nn, timeoutMs as nr, resumable as nt, limitsReport as o, wakeRun as on, AGENT_TOOL_LAYOUTS as or, detachRun as ot, detectInstaller as p, toolLinks as pn, parseReport as pt, requestStop as q, CheckReportSchema as qn, sendPost as qt, capsHere as r, serveRun as rn, INTEGRATIONS as rr, createReplay as rt, planReason as s, maskReplacer as sn, ORK_LAYOUT as sr, followEvents as st, createWorkspace as t, renderTemplate as tn, NodeIdSchema as tr, detachResume as tt, releaseNotes as u, applySteps as un, EXPERIMENTS as ur, planNodeSession as ut, triggersReport as v, loadAgents as vn, runTree as vt, takeWatchLock as w, placeFor as wn, walkSummary as wt, declaredTriggers as x, inRepoPlace as xn, stillTheSameProcess as xt, createWatcher as y, PROJECT_MODES as yn, ownProcessStart as yt, endLinksOf as z, newWorkflowText as zn, mcpNotText as zt };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { B as linkNodes, Bn as readDocument, Cn as placeFiles, Ct as walkChecks, En as runDirOf, G as requestContinue, Gn as EdgeInputSchema, Gt as planPost, Hn as parseWorkflow, In as skillsIn, J as tellLiveRun, Jn as expandEdge, K as requestPause, Kt as runGh, Ln as WorkflowEditSchema, Nt as nodeSays, On as workflowDirOf, Rn as applyEdits, St as checkWorkflowText, U as unlinkNodes, Vn as renderJsonSchema, Wt as DISCUSSIONS, Xn as NodeSchema, _t as runStatus, bt as processAlive, ct as explainWorkflowText, d as runningRunIds, f as runningScript, gt as pausedOf, ht as liveStatus,
|
|
2
|
-
import { C as feedbackActions, S as placeOf$1, _ as previewPost, a as registryShown, b as acceptItem, c as checkDue, f as readUpdateCache, g as nodeSession, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, w as openFixRun, x as lessonPlaceOf, y as recordNote } from "./__build_info__-
|
|
3
|
-
import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-
|
|
4
|
-
import { n as newRunId, t as findRun } from "./find-
|
|
5
|
-
import { c as openStore, l as storePath, s as nodeOf } from "./output-
|
|
1
|
+
import { B as linkNodes, Bn as readDocument, Cn as placeFiles, Ct as walkChecks, En as runDirOf, G as requestContinue, Gn as EdgeInputSchema, Gt as planPost, Hn as parseWorkflow, In as skillsIn, J as tellLiveRun, Jn as expandEdge, K as requestPause, Kt as runGh, Ln as WorkflowEditSchema, Nt as nodeSays, On as workflowDirOf, Rn as applyEdits, St as checkWorkflowText, U as unlinkNodes, Vn as renderJsonSchema, Wt as DISCUSSIONS, Xn as NodeSchema, _t as runStatus, bt as processAlive, ct as explainWorkflowText, d as runningRunIds, f as runningScript, gt as pausedOf, ht as liveStatus, jn as LESSON_CAP_TOKENS, kn as inside, l as planUpgrade, nn as readCondition, nt as resumable, o as limitsReport, ot as detachRun, p as detectInstaller, q as requestStop, qt as sendPost, r as capsHere, st as followEvents, tt as detachResume, u as releaseNotes, v as triggersReport, vn as loadAgents, vt as runTree, wn as placeFor, wt as walkSummary, zn as newWorkflowText } from "./src-DG4dyBqm.mjs";
|
|
2
|
+
import { C as feedbackActions, S as placeOf$1, _ as previewPost, a as registryShown, b as acceptItem, c as checkDue, f as readUpdateCache, g as nodeSession, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, w as openFixRun, x as lessonPlaceOf, y as recordNote } from "./__build_info__-CxH89h1r.mjs";
|
|
3
|
+
import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-Cnt7o3ya.mjs";
|
|
4
|
+
import { n as newRunId, t as findRun } from "./find-Dy2H5IvT.mjs";
|
|
5
|
+
import { c as openStore, l as storePath, s as nodeOf } from "./output-CjOPL8W0.mjs";
|
|
6
6
|
import { n as usageReport } from "./report-DK4LGqwF.mjs";
|
|
7
|
-
import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-
|
|
8
|
-
import { a as readWorktrees, c as planLine, i as projectHead, l as removeRefusal, n as lostWork, o as labelOf, r as planRemove, s as mergeStateOf, t as applyRemove, u as stateParts } from "./remove-
|
|
7
|
+
import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-BbrkMQQi.mjs";
|
|
8
|
+
import { a as readWorktrees, c as planLine, i as projectHead, l as removeRefusal, n as lostWork, o as labelOf, r as planRemove, s as mergeStateOf, t as applyRemove, u as stateParts } from "./remove-ccycC3vI.mjs";
|
|
9
9
|
import path from "node:path";
|
|
10
10
|
import { z } from "zod";
|
|
11
11
|
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
@@ -349,7 +349,9 @@ const EventsQuerySchema = z.strictObject({
|
|
|
349
349
|
});
|
|
350
350
|
const DecisionsQuerySchema = z.strictObject({
|
|
351
351
|
run: z.string().min(1).optional(),
|
|
352
|
-
project: z.string().min(1).optional()
|
|
352
|
+
project: z.string().min(1).optional(),
|
|
353
|
+
/** Only runs of this workflow, by name; ANDed with `run` or `project`. */
|
|
354
|
+
workflow: z.string().min(1).optional()
|
|
353
355
|
});
|
|
354
356
|
/** An answer: the option, and what the person said with it, if anything. */
|
|
355
357
|
const AnswerSchema = z.strictObject({
|
|
@@ -483,7 +485,8 @@ const STREAMS = {
|
|
|
483
485
|
run: "/api/runs/:id/stream",
|
|
484
486
|
/**
|
|
485
487
|
* `runs`, `decisions`, `version`, each when it changes; `?project=` keeps
|
|
486
|
-
* one
|
|
488
|
+
* one, `?workflow=` narrows `decisions` to that workflow's. `upgrade`: the
|
|
489
|
+
* upgrade's output, then `end` (contract-update.ts).
|
|
487
490
|
*/
|
|
488
491
|
overview: "/api/stream",
|
|
489
492
|
upgrade: "/api/upgrade/stream"
|
|
@@ -1625,10 +1628,17 @@ const readRoutes = (context) => ({
|
|
|
1625
1628
|
return ok(query.limit === void 0 ? newest : newest.slice(0, query.limit));
|
|
1626
1629
|
},
|
|
1627
1630
|
decisions: ({ query }) => {
|
|
1628
|
-
|
|
1631
|
+
const workflow = query.workflow === void 0 ? {} : { workflow: query.workflow };
|
|
1632
|
+
if (query.run === void 0) return ok(pendingDecisions(context.store, {
|
|
1633
|
+
...workflow,
|
|
1634
|
+
...query.project === void 0 ? {} : { project: projectRoot(context, query.project) }
|
|
1635
|
+
}));
|
|
1629
1636
|
const found = runOf(context, query.run);
|
|
1630
1637
|
if (!found.ok) return found.refusal;
|
|
1631
|
-
return ok(pendingDecisions(context.store, {
|
|
1638
|
+
return ok(pendingDecisions(context.store, {
|
|
1639
|
+
...workflow,
|
|
1640
|
+
runId: found.run.id
|
|
1641
|
+
}));
|
|
1632
1642
|
},
|
|
1633
1643
|
decision: ({ params }) => {
|
|
1634
1644
|
const found = context.store.decision(params.id);
|
|
@@ -2869,6 +2879,7 @@ const runStream = async (context, req, res, url, id, shutdown) => {
|
|
|
2869
2879
|
const overviewStream = (context, res, url, shutdown) => {
|
|
2870
2880
|
const key = url.searchParams.get("project");
|
|
2871
2881
|
const root = key === null ? void 0 : projectOf(context, key)?.root ?? key;
|
|
2882
|
+
const workflow = url.searchParams.get("workflow");
|
|
2872
2883
|
const stream = openEventStream(res);
|
|
2873
2884
|
const last = {
|
|
2874
2885
|
runs: "",
|
|
@@ -2881,7 +2892,10 @@ const overviewStream = (context, res, url, shutdown) => {
|
|
|
2881
2892
|
...filter,
|
|
2882
2893
|
limit: OVERVIEW_RUNS
|
|
2883
2894
|
}).map((run) => viewOf$2(context, run));
|
|
2884
|
-
const decisions = pendingDecisions(context.store,
|
|
2895
|
+
const decisions = pendingDecisions(context.store, {
|
|
2896
|
+
...filter,
|
|
2897
|
+
...workflow === null ? {} : { workflow }
|
|
2898
|
+
});
|
|
2885
2899
|
for (const [name, value] of [
|
|
2886
2900
|
["runs", runs],
|
|
2887
2901
|
["decisions", decisions],
|