lua-cli 3.49.2 → 3.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.
- package/dist/api-exports.d.ts +163 -16
- package/dist/api-exports.js +303 -23
- package/dist/api-exports.js.map +1 -1
- package/dist/index.js +316 -38
- package/dist/index.js.map +1 -1
- package/dist/workflow-builder.js +167 -17
- package/dist/workflow-builder.js.map +1 -1
- package/docs/README.md +3 -3
- package/docs/api/Agents.md +51 -9
- package/docs/api/Data.md +51 -0
- package/docs/api/Workflows.md +1 -0
- package/docs/workflows/schedules.md +1 -1
- package/package.json +3 -3
- package/template/package.json +1 -1
package/dist/workflow-builder.js
CHANGED
|
@@ -1707,7 +1707,14 @@ var SUPERVISION_OPS = {
|
|
|
1707
1707
|
* the target (`snapshot.jobs[]`) so the promote activates and schedules it. Mongo-only marker write; EventBridge stays
|
|
1708
1708
|
* on the post-promote reconcile. Release-class: needs `register-job` AND `release` on the grant, from a signed step.
|
|
1709
1709
|
*/
|
|
1710
|
-
"jobs.register": "register-job"
|
|
1710
|
+
"jobs.register": "register-job",
|
|
1711
|
+
// [SW]
|
|
1712
|
+
/**
|
|
1713
|
+
* SW — `Agents.secrets(id).put(collection, key, value)`: write ONE secret row into the TARGET's own Data, in a
|
|
1714
|
+
* collection the grant names in `secretWriteCollections` (deny by default), keyed by `data._pk`. The value never
|
|
1715
|
+
* comes back: the answer is `{ ok, id, fingerprint }`, and the audit row carries the fingerprint only.
|
|
1716
|
+
*/
|
|
1717
|
+
"secrets.put": "act"
|
|
1711
1718
|
};
|
|
1712
1719
|
function isSupervisionOp(op) {
|
|
1713
1720
|
return typeof op === "string" && Object.prototype.hasOwnProperty.call(SUPERVISION_OPS, op);
|
|
@@ -1906,6 +1913,12 @@ var SUPERVISION_OPS_WAVE2 = {
|
|
|
1906
1913
|
gate: "register-job",
|
|
1907
1914
|
targeted: true,
|
|
1908
1915
|
item: "JR"
|
|
1916
|
+
},
|
|
1917
|
+
/** SW — `Agents.secrets(id).put(collection, key, value)`: one secret row in a `secretWriteCollections` collection. */
|
|
1918
|
+
"secrets.put": {
|
|
1919
|
+
gate: "act",
|
|
1920
|
+
targeted: true,
|
|
1921
|
+
item: "SW"
|
|
1909
1922
|
}
|
|
1910
1923
|
};
|
|
1911
1924
|
var SUPERVISION_WATCHDOG_OPS = {
|
|
@@ -4073,6 +4086,12 @@ var SECRET_LITERAL_PATTERNS = [
|
|
|
4073
4086
|
{
|
|
4074
4087
|
re: /\b(npm_)[A-Za-z0-9]{36}\b/g
|
|
4075
4088
|
},
|
|
4089
|
+
// Linear personal API keys (`lin_api_` + 40) and OAuth access / refresh tokens (`lin_oauth_` + 64 hex,
|
|
4090
|
+
// `lin_refresh_`): the fleet's Engineering Manager hands OAuth tokens to agents in a prompt + tool call, and
|
|
4091
|
+
// both landed verbatim in `vmExecutionLogs` (2026-10-11).
|
|
4092
|
+
{
|
|
4093
|
+
re: /\b(lin_(?:api|oauth|refresh)_)[A-Za-z0-9]{16,}/g
|
|
4094
|
+
},
|
|
4076
4095
|
{
|
|
4077
4096
|
re: /\b(sk-ant-)[A-Za-z0-9_-]{16,}/g
|
|
4078
4097
|
},
|
|
@@ -4091,11 +4110,16 @@ var SECRET_LITERAL_PATTERNS = [
|
|
|
4091
4110
|
{
|
|
4092
4111
|
re: /\b(ya29\.)[A-Za-z0-9_-]{20,}/g
|
|
4093
4112
|
},
|
|
4113
|
+
// 2026-10-11: `(?<![A-Za-z0-9_-])`, not `\b` — with `\b` every `eyJ` after a `-` / `_` started an attempt that
|
|
4114
|
+
// ran the first segment to the end of the run and failed on the missing `.`, so `eyJabcdefgh-` × 1 MB took
|
|
4115
|
+
// ~115 s (quadratic). Now a run of segment characters admits at most one attempt.
|
|
4094
4116
|
{
|
|
4095
|
-
re:
|
|
4117
|
+
re: /(?<![A-Za-z0-9_-])(eyJ)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g
|
|
4096
4118
|
},
|
|
4119
|
+
// 2026-10-11: the body stops at the next `-----BEGIN ` — a lazy `[\s\S]*?` let every unterminated BEGIN scan to the
|
|
4120
|
+
// end of the text (quadratic on a repeated header with no END). A key whose END follows is matched as before.
|
|
4097
4121
|
{
|
|
4098
|
-
re: /(-----BEGIN [A-Z ]*PRIVATE KEY-----)[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g
|
|
4122
|
+
re: /(-----BEGIN [A-Z ]*PRIVATE KEY-----)(?:(?!-----BEGIN )[\s\S])*?-----END [A-Z ]*PRIVATE KEY-----/g
|
|
4099
4123
|
},
|
|
4100
4124
|
// `https://x-access-token:<token>@github.com/…` (the git credential shape the pod scrubbed already)
|
|
4101
4125
|
{
|
|
@@ -4103,7 +4127,7 @@ var SECRET_LITERAL_PATTERNS = [
|
|
|
4103
4127
|
suffix: true
|
|
4104
4128
|
}
|
|
4105
4129
|
];
|
|
4106
|
-
var SECRET_NAME = "(?:authorization|proxy-authorization|x-api-key|x-wf-[a-z-]*key|x-internal-auth|api[_-]?key|apikey|access[_-]?key|secret[_-]?key|private[_-]?key|client[_-]?secret|secret|password|passwd|pwd|passphrase|token|credentials?)";
|
|
4130
|
+
var SECRET_NAME = "(?:access[_-]?token|refresh[_-]?token|id[_-]?token|auth[_-]?token|authorization|proxy-authorization|x-api-key|x-wf-[a-z-]*key|x-internal-auth|api[_-]?key|apikey|access[_-]?key|secret[_-]?key|private[_-]?key|client[_-]?secret|secret|password|passwd|pwd|passphrase|token|credentials?)";
|
|
4107
4131
|
var SECRET_PAIR_PATTERNS = [
|
|
4108
4132
|
// `Authorization: Bearer x`, `x-api-key: x`, `AWS_SECRET_ACCESS_KEY=x`, `SVC_JOB_KEY=x`, `"apiKey": "x"`,
|
|
4109
4133
|
// `FOO_TOKEN=x`, `secretKey=x`, `password=x`. Groups: the char before the name, the name, the separator
|
|
@@ -4262,6 +4286,38 @@ function scrubStepErrorMessage(raw) {
|
|
|
4262
4286
|
}
|
|
4263
4287
|
__name(scrubStepErrorMessage, "scrubStepErrorMessage");
|
|
4264
4288
|
__name4(scrubStepErrorMessage, "scrubStepErrorMessage");
|
|
4289
|
+
var SCRUB_DEEP_MAX_DEPTH = 12;
|
|
4290
|
+
function scrubSecretsDeep(value3, options = {}) {
|
|
4291
|
+
return scrubDeep(value3, 0, /* @__PURE__ */ new WeakSet(), options.text !== false);
|
|
4292
|
+
}
|
|
4293
|
+
__name(scrubSecretsDeep, "scrubSecretsDeep");
|
|
4294
|
+
__name4(scrubSecretsDeep, "scrubSecretsDeep");
|
|
4295
|
+
function isPlainObject2(v) {
|
|
4296
|
+
if (!v || typeof v !== "object") return false;
|
|
4297
|
+
const proto = Object.getPrototypeOf(v);
|
|
4298
|
+
return proto === Object.prototype || proto === null;
|
|
4299
|
+
}
|
|
4300
|
+
__name(isPlainObject2, "isPlainObject2");
|
|
4301
|
+
__name4(isPlainObject2, "isPlainObject");
|
|
4302
|
+
function scrubDeep(value3, depth, seen, text2) {
|
|
4303
|
+
if (typeof value3 === "string") return text2 ? scrubSecretText(value3) : value3;
|
|
4304
|
+
if (!value3 || typeof value3 !== "object") return value3;
|
|
4305
|
+
if (!Array.isArray(value3) && !isPlainObject2(value3)) return value3;
|
|
4306
|
+
if (depth >= SCRUB_DEEP_MAX_DEPTH || seen.has(value3)) return REDACTED_PLACEHOLDER;
|
|
4307
|
+
seen.add(value3);
|
|
4308
|
+
try {
|
|
4309
|
+
if (Array.isArray(value3)) return value3.map((v) => scrubDeep(v, depth + 1, seen, text2));
|
|
4310
|
+
const out = {};
|
|
4311
|
+
for (const [k, v] of Object.entries(value3)) {
|
|
4312
|
+
out[k] = isWorkflowSecretKey(k) && v !== null && v !== void 0 && typeof v !== "boolean" ? REDACTED_PLACEHOLDER : scrubDeep(v, depth + 1, seen, text2);
|
|
4313
|
+
}
|
|
4314
|
+
return out;
|
|
4315
|
+
} finally {
|
|
4316
|
+
seen.delete(value3);
|
|
4317
|
+
}
|
|
4318
|
+
}
|
|
4319
|
+
__name(scrubDeep, "scrubDeep");
|
|
4320
|
+
__name4(scrubDeep, "scrubDeep");
|
|
4265
4321
|
var TEST_SESSION_ID_PATTERN = /^tsn_[0-9a-f-]{36}$/;
|
|
4266
4322
|
function isTestSessionId(value3) {
|
|
4267
4323
|
return typeof value3 === "string" && TEST_SESSION_ID_PATTERN.test(value3);
|
|
@@ -4437,6 +4493,89 @@ function supervisionAccessBindingViolation(merged) {
|
|
|
4437
4493
|
}
|
|
4438
4494
|
__name(supervisionAccessBindingViolation, "supervisionAccessBindingViolation");
|
|
4439
4495
|
__name4(supervisionAccessBindingViolation, "supervisionAccessBindingViolation");
|
|
4496
|
+
var SUPERVISED_SECRET_LIMITS = {
|
|
4497
|
+
/** Fields in `value` (the `_pk` field included). */
|
|
4498
|
+
maxFields: 32,
|
|
4499
|
+
/** One string field's length. */
|
|
4500
|
+
maxStringLength: 8192,
|
|
4501
|
+
/** The canonical JSON of the whole row. */
|
|
4502
|
+
maxBytes: 16384
|
|
4503
|
+
};
|
|
4504
|
+
var SUPERVISED_SECRET_NAME_RE = /^[A-Za-z0-9_.:-]{1,128}$/;
|
|
4505
|
+
var SUPERVISED_SECRET_FIELD_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
4506
|
+
var SUPERVISED_SECRET_KEY_FIELD = "_pk";
|
|
4507
|
+
var SUPERVISED_SECRET_ERRORS = {
|
|
4508
|
+
BAD_ARGS: "supervision_secret_bad_args",
|
|
4509
|
+
NOT_GRANTED: "supervision_secret_write_not_granted",
|
|
4510
|
+
/** A collection named for secret writes is write-only for the supervisor: `data.get` / `data.query` refuse it. */
|
|
4511
|
+
WRITE_ONLY: "supervision_secret_collection_write_only"
|
|
4512
|
+
};
|
|
4513
|
+
function canonicalSupervisedSecretJson(row) {
|
|
4514
|
+
const sorted = {};
|
|
4515
|
+
for (const k of Object.keys(row).sort()) sorted[k] = row[k];
|
|
4516
|
+
return JSON.stringify(sorted);
|
|
4517
|
+
}
|
|
4518
|
+
__name(canonicalSupervisedSecretJson, "canonicalSupervisedSecretJson");
|
|
4519
|
+
__name4(canonicalSupervisedSecretJson, "canonicalSupervisedSecretJson");
|
|
4520
|
+
function validateSupervisedSecretPut(args) {
|
|
4521
|
+
const bad = /* @__PURE__ */ __name4((message) => ({
|
|
4522
|
+
ok: false,
|
|
4523
|
+
code: SUPERVISED_SECRET_ERRORS.BAD_ARGS,
|
|
4524
|
+
message
|
|
4525
|
+
}), "bad");
|
|
4526
|
+
const collection = args?.collection;
|
|
4527
|
+
if (typeof collection !== "string" || !SUPERVISED_SECRET_NAME_RE.test(collection) || collection.startsWith("__")) {
|
|
4528
|
+
return bad("collection must be an explicit collection name (letters, digits, _ . : -; at most 128)");
|
|
4529
|
+
}
|
|
4530
|
+
const key = args?.key;
|
|
4531
|
+
if (typeof key !== "string" || !SUPERVISED_SECRET_NAME_RE.test(key)) {
|
|
4532
|
+
return bad("key must be an explicit row key (letters, digits, _ . : -; at most 128)");
|
|
4533
|
+
}
|
|
4534
|
+
const value3 = args?.value;
|
|
4535
|
+
if (!value3 || typeof value3 !== "object" || Array.isArray(value3) || Object.getPrototypeOf(value3) !== Object.prototype) {
|
|
4536
|
+
return bad("value must be a plain object of scalar fields");
|
|
4537
|
+
}
|
|
4538
|
+
const fields = Object.keys(value3);
|
|
4539
|
+
const row = {};
|
|
4540
|
+
for (const field of fields) {
|
|
4541
|
+
if (!SUPERVISED_SECRET_FIELD_RE.test(field)) {
|
|
4542
|
+
return bad("value field names must be plain identifiers (no $ prefix, no dots; at most 64 characters)");
|
|
4543
|
+
}
|
|
4544
|
+
const v = value3[field];
|
|
4545
|
+
if (typeof v === "string") {
|
|
4546
|
+
if (v.length > SUPERVISED_SECRET_LIMITS.maxStringLength) {
|
|
4547
|
+
return bad(`value.${field} is longer than ${SUPERVISED_SECRET_LIMITS.maxStringLength} characters`);
|
|
4548
|
+
}
|
|
4549
|
+
} else if (typeof v === "number") {
|
|
4550
|
+
if (!Number.isFinite(v)) return bad(`value.${field} must be a finite number`);
|
|
4551
|
+
} else if (typeof v !== "boolean" && v !== null) {
|
|
4552
|
+
return bad(`value.${field} must be a string, a finite number, a boolean or null (no nesting)`);
|
|
4553
|
+
}
|
|
4554
|
+
row[field] = v;
|
|
4555
|
+
}
|
|
4556
|
+
if (Object.prototype.hasOwnProperty.call(row, SUPERVISED_SECRET_KEY_FIELD) && row[SUPERVISED_SECRET_KEY_FIELD] !== key) {
|
|
4557
|
+
return bad(`value.${SUPERVISED_SECRET_KEY_FIELD}, when present, must equal key`);
|
|
4558
|
+
}
|
|
4559
|
+
row[SUPERVISED_SECRET_KEY_FIELD] = key;
|
|
4560
|
+
if (Object.keys(row).length > SUPERVISED_SECRET_LIMITS.maxFields) {
|
|
4561
|
+
return bad(`value has more than ${SUPERVISED_SECRET_LIMITS.maxFields} fields`);
|
|
4562
|
+
}
|
|
4563
|
+
if (Object.keys(row).length < 2) return bad("value must carry at least one field besides _pk");
|
|
4564
|
+
const bytes = new TextEncoder().encode(canonicalSupervisedSecretJson(row)).byteLength;
|
|
4565
|
+
if (bytes > SUPERVISED_SECRET_LIMITS.maxBytes) {
|
|
4566
|
+
return bad(`value is larger than ${SUPERVISED_SECRET_LIMITS.maxBytes} bytes`);
|
|
4567
|
+
}
|
|
4568
|
+
return {
|
|
4569
|
+
ok: true,
|
|
4570
|
+
input: {
|
|
4571
|
+
collection,
|
|
4572
|
+
key,
|
|
4573
|
+
row
|
|
4574
|
+
}
|
|
4575
|
+
};
|
|
4576
|
+
}
|
|
4577
|
+
__name(validateSupervisedSecretPut, "validateSupervisedSecretPut");
|
|
4578
|
+
__name4(validateSupervisedSecretPut, "validateSupervisedSecretPut");
|
|
4440
4579
|
var CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY = "connectionAssignment";
|
|
4441
4580
|
var CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS = 1200;
|
|
4442
4581
|
var CONNECTION_HANDOVER_LIMITS = {
|
|
@@ -6779,7 +6918,7 @@ var BROWSER_COMMANDS = [
|
|
|
6779
6918
|
},
|
|
6780
6919
|
{
|
|
6781
6920
|
name: "find",
|
|
6782
|
-
description: "Act by semantic locator. Args: by(role|text|label|placeholder|alt|title|testid), query, action(click|fill|
|
|
6921
|
+
description: "Act by semantic locator. Args: by(role|text|label|placeholder|alt|title|testid), query, action(click|fill|hover|check|text), value?, name?, exact?."
|
|
6783
6922
|
},
|
|
6784
6923
|
// AI fallbacks
|
|
6785
6924
|
{
|
|
@@ -6793,7 +6932,7 @@ var BROWSER_COMMANDS = [
|
|
|
6793
6932
|
// wait
|
|
6794
6933
|
{
|
|
6795
6934
|
name: "wait",
|
|
6796
|
-
description: "Wait for a condition. Provide one of: selector(
|
|
6935
|
+
description: "Wait for a condition. Provide one of: selector (waits until it is visible), ms, text, url, load, fn."
|
|
6797
6936
|
},
|
|
6798
6937
|
// tabs / frames
|
|
6799
6938
|
{
|
|
@@ -6828,7 +6967,7 @@ var BROWSER_COMMANDS = [
|
|
|
6828
6967
|
},
|
|
6829
6968
|
{
|
|
6830
6969
|
name: "set",
|
|
6831
|
-
description: "Configure the browser. Args: setting(viewport|device|geo|headers|credentials|media), args[]."
|
|
6970
|
+
description: "Configure the browser. Args: setting(viewport|device|geo|headers|credentials|media|offline), args[]."
|
|
6832
6971
|
},
|
|
6833
6972
|
// files / clipboard
|
|
6834
6973
|
{
|
|
@@ -6872,7 +7011,7 @@ var BROWSER_COMMANDS = [
|
|
|
6872
7011
|
},
|
|
6873
7012
|
{
|
|
6874
7013
|
name: "keyboard",
|
|
6875
|
-
description: "Low-level keyboard at focus. Args: action(type|inserttext
|
|
7014
|
+
description: "Low-level keyboard at focus. Args: action(type|inserttext), text. Use press for single keys and chords."
|
|
6876
7015
|
},
|
|
6877
7016
|
{
|
|
6878
7017
|
name: "state",
|
|
@@ -7570,9 +7709,9 @@ var BROWSER_LOG_TEXT_MAX_CHARS = 64 * 1024;
|
|
|
7570
7709
|
var isString = /* @__PURE__ */ __name4((value3) => typeof value3 === "string", "isString");
|
|
7571
7710
|
var isBoolean = /* @__PURE__ */ __name4((value3) => typeof value3 === "boolean", "isBoolean");
|
|
7572
7711
|
var isCount = /* @__PURE__ */ __name4((value3) => typeof value3 === "number" && Number.isFinite(value3) && value3 >= 0, "isCount");
|
|
7573
|
-
var
|
|
7712
|
+
var isPlainObject3 = /* @__PURE__ */ __name4((value3) => typeof value3 === "object" && value3 !== null && !Array.isArray(value3), "isPlainObject");
|
|
7574
7713
|
var oneOf = /* @__PURE__ */ __name4((values) => (value3) => typeof value3 === "string" && values.includes(value3), "oneOf");
|
|
7575
|
-
var isLimits = /* @__PURE__ */ __name4((value3) =>
|
|
7714
|
+
var isLimits = /* @__PURE__ */ __name4((value3) => isPlainObject3(value3) && Object.values(value3).every((entry) => isCount(entry)), "isLimits");
|
|
7576
7715
|
var EVENT_SHAPES = {
|
|
7577
7716
|
"session.opened": {
|
|
7578
7717
|
required: {
|
|
@@ -7592,7 +7731,7 @@ var EVENT_SHAPES = {
|
|
|
7592
7731
|
ok: isBoolean
|
|
7593
7732
|
},
|
|
7594
7733
|
optional: {
|
|
7595
|
-
args:
|
|
7734
|
+
args: isPlainObject3,
|
|
7596
7735
|
urlBefore: isString,
|
|
7597
7736
|
urlAfter: isString,
|
|
7598
7737
|
resultBytes: isCount,
|
|
@@ -7697,7 +7836,7 @@ function describeFieldViolation(key, value3, check) {
|
|
|
7697
7836
|
__name(describeFieldViolation, "describeFieldViolation");
|
|
7698
7837
|
__name4(describeFieldViolation, "describeFieldViolation");
|
|
7699
7838
|
function describeBrowserLogEventViolation(value3) {
|
|
7700
|
-
if (!
|
|
7839
|
+
if (!isPlainObject3(value3)) return "event must be an object";
|
|
7701
7840
|
const event = value3;
|
|
7702
7841
|
const base = describeBaseViolation(event);
|
|
7703
7842
|
if (base) return base;
|
|
@@ -7721,7 +7860,7 @@ __name(isBrowserLogEvent, "isBrowserLogEvent");
|
|
|
7721
7860
|
__name4(isBrowserLogEvent, "isBrowserLogEvent");
|
|
7722
7861
|
function describeBrowserLogContextViolation(value3) {
|
|
7723
7862
|
if (value3 === void 0) return void 0;
|
|
7724
|
-
if (!
|
|
7863
|
+
if (!isPlainObject3(value3)) return "logContext must be an object";
|
|
7725
7864
|
for (const [key, entry] of Object.entries(value3)) {
|
|
7726
7865
|
if (!BROWSER_LOG_CONTEXT_KEYS.includes(key)) return `logContext.${key} is not allowed`;
|
|
7727
7866
|
if (entry === void 0) continue;
|
|
@@ -13349,6 +13488,17 @@ function maskMcpServerHeaders(server) {
|
|
|
13349
13488
|
}
|
|
13350
13489
|
__name(maskMcpServerHeaders, "maskMcpServerHeaders");
|
|
13351
13490
|
__name4(maskMcpServerHeaders, "maskMcpServerHeaders");
|
|
13491
|
+
var SHARED_DATA_OWNER_PREFIX = "shared:";
|
|
13492
|
+
function sharedDataOwnerKey(collectionId) {
|
|
13493
|
+
return `${SHARED_DATA_OWNER_PREFIX}${collectionId}`;
|
|
13494
|
+
}
|
|
13495
|
+
__name(sharedDataOwnerKey, "sharedDataOwnerKey");
|
|
13496
|
+
__name4(sharedDataOwnerKey, "sharedDataOwnerKey");
|
|
13497
|
+
function isSharedDataOwnerKey(agentId2) {
|
|
13498
|
+
return typeof agentId2 === "string" && agentId2.startsWith(SHARED_DATA_OWNER_PREFIX);
|
|
13499
|
+
}
|
|
13500
|
+
__name(isSharedDataOwnerKey, "isSharedDataOwnerKey");
|
|
13501
|
+
__name4(isSharedDataOwnerKey, "isSharedDataOwnerKey");
|
|
13352
13502
|
|
|
13353
13503
|
// ../workflow-graph/dist/index.mjs
|
|
13354
13504
|
import { createHash } from "crypto";
|
|
@@ -15998,11 +16148,11 @@ function isConditionalJoinId(stepId) {
|
|
|
15998
16148
|
}
|
|
15999
16149
|
__name(isConditionalJoinId, "isConditionalJoinId");
|
|
16000
16150
|
__name5(isConditionalJoinId, "isConditionalJoinId");
|
|
16001
|
-
function
|
|
16151
|
+
function isPlainObject4(v) {
|
|
16002
16152
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
16003
16153
|
}
|
|
16004
|
-
__name(
|
|
16005
|
-
__name5(
|
|
16154
|
+
__name(isPlainObject4, "isPlainObject");
|
|
16155
|
+
__name5(isPlainObject4, "isPlainObject");
|
|
16006
16156
|
function leafValue(row) {
|
|
16007
16157
|
if (row.status === "completed") return row.output === void 0 ? null : row.output;
|
|
16008
16158
|
return continuedFailureValue(row.error, row.killReason);
|
|
@@ -16025,7 +16175,7 @@ function deriveRunOutput(steps) {
|
|
|
16025
16175
|
if (leaves.length === 1) {
|
|
16026
16176
|
const leaf = leaves[0];
|
|
16027
16177
|
const value22 = leafValue(leaf);
|
|
16028
|
-
if (isConditionalJoinId(leaf.stepId) &&
|
|
16178
|
+
if (isConditionalJoinId(leaf.stepId) && isPlainObject4(value22)) {
|
|
16029
16179
|
const keys = Object.keys(value22);
|
|
16030
16180
|
if (keys.length === 1) return {
|
|
16031
16181
|
output: value22[keys[0]],
|