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.
@@ -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: /\b(eyJ)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g
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|type|hover|focus|check|uncheck|text), value?, name?, exact?."
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(+state), ms, text, url, load, fn."
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|keydown|keyup), text?, key?."
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 isPlainObject2 = /* @__PURE__ */ __name4((value3) => typeof value3 === "object" && value3 !== null && !Array.isArray(value3), "isPlainObject");
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) => isPlainObject2(value3) && Object.values(value3).every((entry) => isCount(entry)), "isLimits");
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: isPlainObject2,
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 (!isPlainObject2(value3)) return "event must be an object";
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 (!isPlainObject2(value3)) return "logContext must be an object";
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 isPlainObject3(v) {
16151
+ function isPlainObject4(v) {
16002
16152
  return typeof v === "object" && v !== null && !Array.isArray(v);
16003
16153
  }
16004
- __name(isPlainObject3, "isPlainObject");
16005
- __name5(isPlainObject3, "isPlainObject");
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) && isPlainObject3(value22)) {
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]],