lua-cli 3.49.2 → 3.51.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/index.js CHANGED
@@ -2668,6 +2668,31 @@ function scrubProviderMessage(raw, max = PROVIDER_MESSAGE_MAX_CHARS) {
2668
2668
  function scrubStepErrorMessage(raw) {
2669
2669
  return scrubProviderMessage(raw, ERROR_MESSAGE_MAX_CHARS);
2670
2670
  }
2671
+ function scrubSecretsDeep(value3, options = {}) {
2672
+ return scrubDeep(value3, 0, /* @__PURE__ */ new WeakSet(), options.text !== false);
2673
+ }
2674
+ function isPlainObject2(v) {
2675
+ if (!v || typeof v !== "object") return false;
2676
+ const proto = Object.getPrototypeOf(v);
2677
+ return proto === Object.prototype || proto === null;
2678
+ }
2679
+ function scrubDeep(value3, depth, seen, text2) {
2680
+ if (typeof value3 === "string") return text2 ? scrubSecretText(value3) : value3;
2681
+ if (!value3 || typeof value3 !== "object") return value3;
2682
+ if (!Array.isArray(value3) && !isPlainObject2(value3)) return value3;
2683
+ if (depth >= SCRUB_DEEP_MAX_DEPTH || seen.has(value3)) return REDACTED_PLACEHOLDER;
2684
+ seen.add(value3);
2685
+ try {
2686
+ if (Array.isArray(value3)) return value3.map((v) => scrubDeep(v, depth + 1, seen, text2));
2687
+ const out = {};
2688
+ for (const [k, v] of Object.entries(value3)) {
2689
+ out[k] = isWorkflowSecretKey(k) && v !== null && v !== void 0 && typeof v !== "boolean" ? REDACTED_PLACEHOLDER : scrubDeep(v, depth + 1, seen, text2);
2690
+ }
2691
+ return out;
2692
+ } finally {
2693
+ seen.delete(value3);
2694
+ }
2695
+ }
2671
2696
  function isTestSessionId(value3) {
2672
2697
  return typeof value3 === "string" && TEST_SESSION_ID_PATTERN.test(value3);
2673
2698
  }
@@ -2792,6 +2817,68 @@ function supervisionAccessBindingViolation(merged) {
2792
2817
  }
2793
2818
  return null;
2794
2819
  }
2820
+ function canonicalSupervisedSecretJson(row2) {
2821
+ const sorted = {};
2822
+ for (const k of Object.keys(row2).sort()) sorted[k] = row2[k];
2823
+ return JSON.stringify(sorted);
2824
+ }
2825
+ function validateSupervisedSecretPut(args2) {
2826
+ const bad = /* @__PURE__ */ __name3((message) => ({
2827
+ ok: false,
2828
+ code: SUPERVISED_SECRET_ERRORS.BAD_ARGS,
2829
+ message
2830
+ }), "bad");
2831
+ const collection = args2?.collection;
2832
+ if (typeof collection !== "string" || !SUPERVISED_SECRET_NAME_RE.test(collection) || collection.startsWith("__")) {
2833
+ return bad("collection must be an explicit collection name (letters, digits, _ . : -; at most 128)");
2834
+ }
2835
+ const key = args2?.key;
2836
+ if (typeof key !== "string" || !SUPERVISED_SECRET_NAME_RE.test(key)) {
2837
+ return bad("key must be an explicit row key (letters, digits, _ . : -; at most 128)");
2838
+ }
2839
+ const value3 = args2?.value;
2840
+ if (!value3 || typeof value3 !== "object" || Array.isArray(value3) || Object.getPrototypeOf(value3) !== Object.prototype) {
2841
+ return bad("value must be a plain object of scalar fields");
2842
+ }
2843
+ const fields = Object.keys(value3);
2844
+ const row2 = {};
2845
+ for (const field of fields) {
2846
+ if (!SUPERVISED_SECRET_FIELD_RE.test(field)) {
2847
+ return bad("value field names must be plain identifiers (no $ prefix, no dots; at most 64 characters)");
2848
+ }
2849
+ const v = value3[field];
2850
+ if (typeof v === "string") {
2851
+ if (v.length > SUPERVISED_SECRET_LIMITS.maxStringLength) {
2852
+ return bad(`value.${field} is longer than ${SUPERVISED_SECRET_LIMITS.maxStringLength} characters`);
2853
+ }
2854
+ } else if (typeof v === "number") {
2855
+ if (!Number.isFinite(v)) return bad(`value.${field} must be a finite number`);
2856
+ } else if (typeof v !== "boolean" && v !== null) {
2857
+ return bad(`value.${field} must be a string, a finite number, a boolean or null (no nesting)`);
2858
+ }
2859
+ row2[field] = v;
2860
+ }
2861
+ if (Object.prototype.hasOwnProperty.call(row2, SUPERVISED_SECRET_KEY_FIELD) && row2[SUPERVISED_SECRET_KEY_FIELD] !== key) {
2862
+ return bad(`value.${SUPERVISED_SECRET_KEY_FIELD}, when present, must equal key`);
2863
+ }
2864
+ row2[SUPERVISED_SECRET_KEY_FIELD] = key;
2865
+ if (Object.keys(row2).length > SUPERVISED_SECRET_LIMITS.maxFields) {
2866
+ return bad(`value has more than ${SUPERVISED_SECRET_LIMITS.maxFields} fields`);
2867
+ }
2868
+ if (Object.keys(row2).length < 2) return bad("value must carry at least one field besides _pk");
2869
+ const bytes = new TextEncoder().encode(canonicalSupervisedSecretJson(row2)).byteLength;
2870
+ if (bytes > SUPERVISED_SECRET_LIMITS.maxBytes) {
2871
+ return bad(`value is larger than ${SUPERVISED_SECRET_LIMITS.maxBytes} bytes`);
2872
+ }
2873
+ return {
2874
+ ok: true,
2875
+ input: {
2876
+ collection,
2877
+ key,
2878
+ row: row2
2879
+ }
2880
+ };
2881
+ }
2795
2882
  function hasFormatCharacters(text2) {
2796
2883
  return FORMAT_CHARS.test(text2);
2797
2884
  }
@@ -4230,8 +4317,8 @@ function normalizeWorkItems(items) {
4230
4317
  if (item.needsAction !== void 0 && typeof item.needsAction !== "boolean") {
4231
4318
  throw new Error(`Work item ${index}: \`needsAction\` must be a boolean`);
4232
4319
  }
4233
- const when3 = item.updatedAt;
4234
- const date = when3 instanceof Date ? when3 : typeof when3 === "string" ? new Date(when3) : null;
4320
+ const when4 = item.updatedAt;
4321
+ const date = when4 instanceof Date ? when4 : typeof when4 === "string" ? new Date(when4) : null;
4235
4322
  if (!date || Number.isNaN(date.getTime())) {
4236
4323
  throw new Error(`Work item ${index}: \`updatedAt\` must be a valid date`);
4237
4324
  }
@@ -4677,7 +4764,7 @@ function describeFieldViolation(key, value3, check) {
4677
4764
  return void 0;
4678
4765
  }
4679
4766
  function describeBrowserLogEventViolation(value3) {
4680
- if (!isPlainObject2(value3)) return "event must be an object";
4767
+ if (!isPlainObject3(value3)) return "event must be an object";
4681
4768
  const event = value3;
4682
4769
  const base = describeBaseViolation(event);
4683
4770
  if (base) return base;
@@ -4697,7 +4784,7 @@ function isBrowserLogEvent(value3) {
4697
4784
  }
4698
4785
  function describeBrowserLogContextViolation(value3) {
4699
4786
  if (value3 === void 0) return void 0;
4700
- if (!isPlainObject2(value3)) return "logContext must be an object";
4787
+ if (!isPlainObject3(value3)) return "logContext must be an object";
4701
4788
  for (const [key, entry] of Object.entries(value3)) {
4702
4789
  if (!BROWSER_LOG_CONTEXT_KEYS.includes(key)) return `logContext.${key} is not allowed`;
4703
4790
  if (entry === void 0) continue;
@@ -5703,6 +5790,13 @@ function luaClientMetricLabels(client2) {
5703
5790
  client_attribution: canonical2?.attribution ?? "unknown"
5704
5791
  };
5705
5792
  }
5793
+ function webAppPreviewSessionBinding(webAppId, previewId) {
5794
+ const binding = `${webAppId}--p-${previewId}`;
5795
+ if (!WEB_APP_ID_PATTERN.test(binding)) {
5796
+ throw new Error(`Web app preview session binding does not fit WEB_APP_ID_PATTERN: ${binding.length} characters`);
5797
+ }
5798
+ return binding;
5799
+ }
5706
5800
  function parseEffectiveAuthorization(value3) {
5707
5801
  const parsed = EffectiveAuthorizationSchema.safeParse(value3);
5708
5802
  return parsed.success ? parsed.data : void 0;
@@ -7529,7 +7623,13 @@ function maskMcpServerHeaders(server) {
7529
7623
  headersSet: headerNames.length > 0
7530
7624
  };
7531
7625
  }
7532
- var __defProp3, __name3, PLUMBING_THREAD_CHANNELS, CHANNEL_CONVERSATION_CHANNELS, HIDDEN_THREAD_CHANNELS, CHOICE_PERSON_TURN_CHANNELS, CHOICE_REPLAY_CLIENT_CAPABILITIES, CHOICE_REPLAY_CLIENT_SURFACES, DECISION_PROVIDERS, DECISION_FALLBACK_PROVIDERS, OPENROUTER_DIRECT_VENDORS, OPENROUTER_NEEDS_MODEL_MESSAGE, DECISION_QUESTION_TYPES, DECISION_NAME_PATTERN, DECISION_SANDBOX_SITE_HEADER, DECISION_SANDBOX_PRIMITIVE_HEADER, DECISION_SANDBOX_TOOL_SEPARATOR, DECISION_LIMITS, DECISION_ERROR_CODES, DECISION_INACTIVE_CODE, MAX_NAME_CHARS, InstructionsSchema, NameSchema, OddsQuestionSchema, ChoiceQuestionSchema, ScoreQuestionSchema, DecisionQuestionSchema, DecisionOptionsSchema, DecisionQuestionsSchema, DecisionDefinitionSchema, DecisionDefinitionWriteSchema, INTEGRATION_PASSTHROUGH_READ_METHODS, URL_REINTERPRETED_PATH_CHARACTERS, PERCENT_ENCODED_DOT, PERCENT_ESCAPE, DECODED_PATH_SEPARATORS, DECODED_LEADING_SEPARATOR, MAX_PERCENT_DECODE_ROUNDS, URL_RESOLUTION_PROBE_BASE, PLATFORM_INVOCATION_CALLERS, MESSAGING_CHANNELS, VOICE_CHANNELS, TURN_CATEGORIES, AGENT_TOOL_CATEGORIES, count, AnthropicSseUsageReader, SUPERVISION_OPS, SUPERVISION_OPS_WAVE2, SUPERVISION_WATCHDOG_OPS, SUPERVISION_WATCHDOG_ERRORS, SUPERVISION_ROLLBACK_REFUSAL_CODES, SUPERVISION_ROLLBACK_LINEAGE_MAX, SUPERVISION_UNTARGETED_OPS, SUPERVISED_WORKFLOW_VERSIONS_MAX, SUPERVISION_EVENT_KINDS, AGENT_PROVISIONING_LIMITS, AGENT_PROVISIONING_APPROVAL_PAYLOAD_KEY, AGENT_PROVISIONING_ERRORS, PROVISIONED_SUPERVISION_ACTIONS, isNonEmptyString, uniqueStrings, sameSet, AGENT_PROVISIONING_APPROVAL_CARD_MAX_CHARS, APPROVAL_PAYLOAD_MEMBERS, AGENT_CONNECTION_POLICIES, AGENT_CONNECTION_POLICY_DEFAULT, AGENT_CONNECTION_MOUNT_MODES, AGENT_CONNECTION_GOVERNANCE_ERRORS, AGENT_CONNECTION_OPERATION_RULES_MAX, AGENT_CONNECTION_OPERATION_PATTERN_MAX_LENGTH, OPERATION_RULE_METHODS, PATH_SEPARATOR, PATH_SINGLE_SEGMENT_WILDCARD, PATH_REST_WILDCARD, METHOD_OVERRIDE_HEADER_NAMES, METHOD_OVERRIDE_QUERY_NAMES, ODATA_BATCH_SEGMENT, GOOGLE_BATCH_FIRST_SEGMENT, CONNECTION_CHECK_RESULTS, CONNECTION_CHECK_CATALOGUE_V1, CONNECTION_CHECK_NAME_PATTERN, CONNECTION_CHECK_NAME_MAX, CONNECT_OUTCOME_STATUSES, SECRET_TEST_RESULTS, SECRET_DATADOG_REGIONS, SECRET_PROVIDER_CATALOGUE_V1, SECRET_TEST_MAX_RESPONSE_BYTES, SECRET_ENV_KEY_PATTERN, SECRET_REQUEST_ERRORS, SECRET_OUTCOME_STATUSES, CLIENT_OUTCOME_TURNS_MAX, SHORT_TEXT_MAX, SLUG_MAX, shortText, optionalShortText, CONNECTION_REQUEST_TERMINAL_STATES, CONNECTION_USE_ORIGINS, AGENT_CONNECTION_OPERATION_LIMITS_BOUNDS, CURRENCY_CODE, LIMITS_KEYS, CAPS_KEYS, EXCLUSIONS_KEYS, EMAIL_IN_TEXT, MAX_EXCLUSION_DEPTH, PROJECTION_PARAMETER_KEYS, CHANNEL_PARAMETER_KEYS, GMAIL_SYSTEM_LABEL_IDS, ZERO_DECIMAL_CURRENCIES, THREE_DECIMAL_CURRENCIES, DECIMAL_AMOUNT, REDACTED_PLACEHOLDER, PROVIDER_MESSAGE_MAX_CHARS, ERROR_MESSAGE_MAX_CHARS, SECRET_LITERAL_PATTERNS, SECRET_NAME, SECRET_PAIR_PATTERNS, GROUP_COUNT, WORKFLOW_SECRET_KEY_RE, WORKFLOW_RESERVED_SECRET_KEYS, SCRUB_INPUT_MAX_CHARS, SCRUB_CUT_BACKOFF_CHARS, TEST_SESSION_ID_PATTERN, TEST_SESSION_COLLECTION_PREFIX, TEST_EFFECT_BODY_MAX_BYTES, TEST_EFFECT_DROPPED_HEADERS, EVAL_CREDITS_PER_1K_TOKENS, EVAL_RESERVED_TOOL_ID_PREFIXES, CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY, CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS, CONNECTION_HANDOVER_LIMITS, MEMBERS, FORMAT_CHARS, oneLine, boundedString, AGENT_METRIC_NAME_PATTERN, AGENT_METRIC_LIMITS, AGENT_OBJECTIVE_ERRORS, CHANGE_LEASE_TTL_MINUTES_MIN, CHANGE_LEASE_TTL_MINUTES_MAX, CHANGE_LEASE_REASON_MAX, CHANGE_LEASE_ERRORS, AGENT_CONFIG_SET_LIMITS, SECRET_ENV_KEY_SUFFIXES, DEFAULT_OWNER_DEPARTURE_POLICY, AGENT_LIFECYCLE_ERRORS, USER_COST_COUNTER_TTL_SECONDS, USER_COST_ATTRIBUTION_CHANNELS, CALLER_DEDUPE_KEY_MAX, FOLLOW_UP_IDEMPOTENCY_TTL_SECONDS, THREAD_FOLLOW_UP_LIMITS, THREAD_FOLLOW_UP_ERRORS, PROGRESS_UPDATE_LIMITS, PAUSABLE_CAPABILITY_KINDS, UNIFIED_CATCH_UP_MAX_WINDOW_HOURS, UNIFIED_CATCH_UP_EVENTS, UNIFIED_CATCH_UP_FILTERABLE_OBJECT_TYPES, AGENT_NEVER_RULES_MAX, AGENT_NEVER_RULE_FIELD_MAX, AGENT_NEVER_RULE_INPUT_MATCH_MAX, NEVER_RULE_ID_PATTERN, NEVER_RULE_HTTP_METHODS, TEMPLATE_DISTRIBUTION_MODES, TAKEOVER_MAX_IDLE_MINUTES, MINUTES_PER_DAY, DEFAULT_IDLE_RELEASE_MINUTES, FALLBACK_IDLE_RELEASE_MINUTES, VARIATION_SELECTORS, SLACK_EMOJI_NAMES, SLACK_SHORTCODE, PLAIN_EMAIL_ADDRESS, DOMAIN, UNSAFE_TEXT, SLACK_CONVERSATION_ID, CHANNEL_SETTING_GROUPS, THREAD_SCOPING_NOUN, TAKEOVER_CHANNEL_TYPES, EMAIL_SETTINGS, SLACK_SETTING_DEFAULTS, SLACK_REACTION_MAX, SLACK_INTRO_MAX, SLACK_EXAMPLE_PROMPTS_MAX, SLACK_EXAMPLE_PROMPT_MAX, SLACK_SUPPORT_CONTACT_MAX, SLACK_SETTINGS, CHANNEL_SETTINGS, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_STANDING_START_TOOLS, REVIEWABLE_MCP_SEND_TOOL_SUFFIX, MCP_TOOL_READ_VERB_RE, MCP_DRAFT_CREATE_VERBS, NON_INTERACTIVE_CHANNELS, RICH_PARTS_MESSAGE_ID_PREFIX, SCREENSHOT_MESSAGE_ID_PREFIX, WORK_ITEMS_KEY, MAX_WORK_ITEMS, LIMITS, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, SERVER_TRIGGERED_BROWSER_SOURCES, BROWSER_FALLBACKS, DEFAULT_BROWSER_FALLBACK, PROXY_COUNTRY_CODE, BROWSER_LOG_CONTENT_MODES, DEFAULT_BROWSER_LOG_CONTENT, BROWSER_SCREENSHOT_POLICIES, DEFAULT_BROWSER_SCREENSHOT_POLICY, BROWSER_ENGINES, BROWSER_PROFILE_NAME_PATTERN, BROWSER_LIMIT_KEYS, BROWSER_LIMIT_MAX, BROWSER_EXECUTE_METHOD, BROWSER_GLOBAL_METHODS, BROWSER_EXECUTE_DEFAULT_TIMEOUT_MS, BROWSER_EXECUTE_MAX_TIMEOUT_MS, LOG_FIELDS_MAX_KEYS, LOG_FIELD_MAX_VALUE_BYTES, LOG_FIELDS_MAX_BYTES, LOG_FIELD_KEY_PATTERN, LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS, LOG_FIELDS_CLAMPED_KEY, LOG_FIELD_ARRAY_COUNT_SUFFIX, LuaLogFieldsError, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, BROWSER_READ_FORMATS, BROWSER_READ_DEFAULT_TIMEOUT_MS, BROWSER_READ_MIN_TIMEOUT_MS, BROWSER_READ_MAX_TIMEOUT_MS, BROWSER_READ_MAX_CONTENT_CHARS, BROWSER_READ_DEFAULT_SELECTOR, BROWSER_READ_MATCH_SEPARATOR, BROWSER_READ_LOGIN_BLOCKER, BROWSER_ERROR_NAME, HTTP_STATUS_FAILURE, LOGIN_PATH_SEGMENTS, LOGIN_HOST_LABELS, AGENT_LOG_SOURCES, AGENT_LOG_ENVIRONMENTS, AGENT_LOG_FIELDS_MAX_WIRE_KEYS, BROWSER_LOG_EVENT_KINDS, BROWSER_LOG_ENGINES, BROWSER_SESSION_OPEN_REASONS, BROWSER_BLOCK_KINDS, BROWSER_WALL_KINDS, BROWSER_WALL_NEXT_ACTIONS, BROWSER_CONFIRM_DECISIONS, BROWSER_SESSION_CLOSE_REASONS, BROWSER_LOG_CONTEXT_KEYS, BROWSER_LOG_ID_MAX_CHARS, BROWSER_LOG_TEXT_MAX_CHARS, isString, isBoolean, isCount, isPlainObject2, oneOf, isLimits, EVENT_SHAPES, BASE_KEYS, BROWSER_WORKER_SESSION_ID_SEPARATOR, BROWSER_WORKER_BLOCK_REASON_MAX_CHARS, WORKFLOW_RETRY_BACKOFFS, WORKFLOW_RETRY_MIN_ATTEMPTS, WORKFLOW_RETRY_POLICY_KEYS, WORKFLOW_RETRY_MAX_ATTEMPTS, WORKFLOW_RETRY_ENGINE_KEYS, WORKFLOW_JOB_RESOURCES, WORKFLOW_SIDE_EFFECTS, WORKFLOW_AGENT_EFFORTS, WORKFLOW_MODEL_CLASSES, WORKFLOW_TASK_CLASSES, WORKFLOW_MODEL_TRAITS, WORKFLOW_MODEL_REASON_MAX_LENGTH, WORKFLOW_MODELS_COMPOSE_MODES, WORKFLOW_MODELS_PIN_MODES, WORKFLOW_MODELS_FALLBACK_MODES, WORKFLOW_MODELS_CONSENT_ACTIONS_MIN, WORKFLOW_DEFAULT_TASK_CLASS_MAP, WORKFLOW_MODELS_MAX_CLASS_DEFAULT, WORKFLOW_AUTONOMY_FORMS, WORKFLOW_AUTONOMY_NUMERIC_KEYS, WORKFLOW_AUTONOMY_ENVELOPE_KEYS, WORKFLOW_AUTONOMY_ENABLED_DEFAULT, WORKFLOW_AUTONOMY_DEFAULTS, WORKFLOW_AUTONOMY_CEILINGS, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_ENV, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_CEILING, WORKFLOW_AUTONOMY_FORMS_DEFAULT, WORKFLOW_AUTONOMY_MIN_VALUE, WORKFLOW_JOB_RANGES, WORKFLOW_JOB_RANGE_MEMBERS, WORKFLOW_SINGLE_STEP_TYPES, WORKFLOW_HITL_ENTRY_TYPES, WORKFLOW_ARM_ENTRY_TYPES, WORKFLOW_HITL_ARM_CONTAINERS, WORKFLOW_GRAPH_ENTRY_STEP_KINDS, WORKFLOW_ARM_ENTRY_STEP_KINDS, WORKFLOW_BUDGET_MAX_DURATION_SECONDS, MODEL_ID_BYOK_PROVIDERS, MODEL_CLASS_REF_PREFIX, MODEL_SNAPSHOT_SUFFIX, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, PLATFORM_FALLBACK_MODEL_SOURCE, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, LOG_DRAIN_TYPES_PHASE1, LOG_DRAIN_TYPES_PHASE2, LOG_DRAIN_TYPES_IMPLEMENTED, LOG_DRAIN_FORMATS, LOG_DRAIN_SEVERITIES, LOG_DRAIN_SOURCES, LOG_DRAIN_CONTENT_SOURCES, LOG_DRAIN_DEFAULT_SOURCES, LOG_DRAIN_MAX_PER_ORG, LOG_DRAIN_MAX_PER_ORG_ENTERPRISE, LOG_DRAIN_DATADOG_SITES, LOG_DRAIN_NEWRELIC_SITES, LOG_DRAIN_ENDPOINT_TEMPLATES, LOG_DRAIN_PRESET_SITES, LOG_DRAIN_BUCKET_NAME_PATTERN, LOG_DRAIN_BUCKET_HOST_PATTERNS, LOG_DRAIN_PRESET_HOST_SUFFIXES, DRAIN_CONTENT_ACK_ERROR_CODE, DRAIN_CONTENT_ACK_FIELD, DrainContentAckRequiredError, LOG_DRAIN_PRESET_PATHS, PRESET_SEGMENT_RE, LOG_DRAIN_QUOTAS, LOG_DRAIN_QUOTA_WARN_RATIO, LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO, LOG_DRAIN_QUOTA_DROP_INFO_RATIO, LOG_DRAIN_QUOTA_PAUSE_RATIO, LOG_EXPORT_SOURCES, LOG_EXPORT_MAX_WINDOW_DAYS, LOG_EXPORT_MAX_WINDOW_MS, LOG_EXPORT_URL_TTL_SECONDS, LOG_EXPORT_FILE_RETENTION_DAYS, LOG_EXPORT_FILE_RETENTION_MS, LOG_EXPORT_PART_MAX_BYTES, LOG_DRAIN_NOTICE_RATE_LIMIT_MS, LOG_DRAIN_VERIFICATION_STALE_MS, LOG_DRAIN_DIGEST_INTERVAL_MS, LOG_DRAIN_DIGEST_MAX_ENTRIES, LOG_DRAIN_NOTICE_ERROR_MAX_CHARS, LOG_DRAIN_USAGE_LINE_ITEM, LOG_DRAIN_BYTES_PER_GIB, DEFAULT_LOG_DRAIN_PLAN_CONFIG, TIERS, LOG_CURSOR_MAX_LENGTH, LOG_CURSOR_MAX_ID_LENGTH, LOG_RELATIVE_TIME_PATTERN, LOG_ISO_TIME_PATTERN, RELATIVE_UNIT_MS, CORE_DRAINING_CODE, CORE_DRAINING_DEFAULT_RETRY_MS, CORE_DRAINING_MAX_RETRY_MS, VoiceNameSchema, PluginProviderSchema, RealtimeProviderSchema, PluginClassSchema, ModelDescriptorSchema, InferenceModelSchema, PluginModelSchema, RealtimeModelSchema, LuaVoiceModelSchema, TurnDetectionSchema, InterruptionSchema, BuiltinAudioClipSchema, AudioConfigSchema, BackgroundAudioEntrySchema, BackgroundAudioSchema, LuaVoiceConfigInnerSchema, LuaVoiceConfigSchema, LuaVoiceRefSchema, EventType, LUA_JOB_DEFAULT_TIMEOUT_SECONDS, LUA_JOB_MIN_TIMEOUT_SECONDS, LUA_JOB_MAX_TIMEOUT_SECONDS, KEYS, MAX_BODY_BYTES, MAX_ID_LENGTH, UTC_ISO, TEMPLATE_TRIGGER_URL_ENV_PREFIX, TEMPLATE_INSTALL_POLICY_PER_WORKSPACE_VALUES, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, TYPED_API_KEY, IdSchema, SESSION_AUTH_TIME_MAX_S, PrincipalDescriptorSchema, ActorDescriptorSchema, PrincipalOwnerSchema, CredentialLifecycleSchema, GeneralCredentialDescriptorSchema, DeviceCredentialDescriptorSchema, GeneralPrincipalContextSchema, DeviceCredentialPrincipalContextSchema, RawPrincipalContextSchema, PrincipalContextSchema, DeviceCredentialClaimSchema, LUA_CLIENT_HEADER, LUA_CLIENT_APPS, SEMVER_PATTERN, WEB_RELEASE_PATTERN, CLIENT_HEADER_PATTERN, LUA_SESSION_ID_CLAIM, SESSION_REVOKED_CODE, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema, SYSTEM_USER_PREFIX, WORKFLOW_RUN_IN_FLIGHT, WORKFLOW_RUN_IDLE, WORKFLOW_RUN_TERMINAL, WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_GATE_KINDS, WORKFLOW_STEP_STATUSES, WORKFLOW_STEP_IN_FLIGHT, WORKFLOW_SIGNAL_EVENT_SITES, ARCHIVE_WINDOW_MARGIN_DAYS, WORKFLOW_ORG_PURGING_TTL_S, WORKFLOW_ORG_PURGE_FORCE_AFTER_MS, IDEMPOTENCY_HOLDING_STATUSES, WORKFLOW_SCHEDULED_RUN_ID_PREFIX, CLOUD_TASK_RUN_ID_PREFIX, WORKFLOW_SCHEDULE_KEY_MAX, WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX, WORKFLOW_OPERATION_ID_PREFIX, WORKFLOW_JOURNAL_PROTOCOL_VERSION, WORKFLOW_CONNECTION_KEY_RE, WORKFLOW_AGENT_APP_CONNECTION_PREFIX, WORKFLOW_JOB_MODEL_SOURCE_LABELS, WORKFLOW_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_SIGNAL_NAME_RE, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, SCHEDULE_HEALTH_NOTIFY_CHANNELS, SCHEDULE_HEALTH_DEFAULT_NOTIFY, SCHEDULE_HEALTH_LIMITS, KNOWN_KEYS, WORKFLOW_GOAL_JUDGE_SELF, APPROVAL_ARGS_MAX_CHARS, APPROVAL_ARG_STRING_MAX_CHARS, APPROVAL_ARGS_SUMMARY_MAX_CHARS, MAX_DEPTH, MAX_KEYS, MAX_ITEMS, MAX_NODES, MAX_KEY_CHARS, KEY_SCRUB_INPUT_MAX_CHARS, STRING_SCRUB_INPUT_MAX_CHARS, ELLIPSIS, SKIP, SCRUB_SECRETS_BEFORE_PERSIST_ENV, PERSIST_SCRUB_MAX_CHARS, PERSIST_SCRUB_REF_MAX_CHARS, WORKFLOW_AUDIT_EVENTS, WORKFLOW_AUDIT_METADATA_MAX_BYTES, INDENT, WRAP_WIDTH, NOUNS, GET_TOOL_NAMES, PREAMBLE, WORKFLOW_APPROVAL_OUTPUT_DECISIONS, WORKFLOW_APPROVAL_OUTPUT_SCHEMA, JSON_FENCE_RE, DEFAULT_ON_AGENT_FEATURES, SUBAGENT_PER_KEY_FLAG_ENV, PER_KEY_FLAG_VALUES, ONBOARDING_FLOW_KEY, ONBOARDING_SCHEMA_VERSION, id, copy, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingTemplateSectionSchema, onboardingInstallScreenSchema, onboardingResultScreenSchema, onboardingConnectScreenSchema, onboardingTemplateContentSchema, onboardingUnavailableOutcomeSchema, onboardingFlowSchema, onboardingActorSchema, onboardingEditorSchema, onboardingPublicationSummarySchema, onboardingValidationIssueSchema, onboardingValidationResponseSchema, onboardingAssetSchema, onboardingPublicAssetSchema, getOnboardingConfigResponseSchema, saveOnboardingDraftRequestSchema, validateOnboardingRequestSchema, publishOnboardingRequestSchema, rollbackOnboardingRequestSchema, onboardingTemplateCatalogItemSchema, getPublishedOnboardingResponseSchema, WEB_ROUTE_PROTOCOL_VERSION, WEB_ROUTE_METHODS, WEB_ROUTE_REQUEST_HEADER_ALLOWLIST, WEB_ROUTE_RESPONSE_HEADER_ALLOWLIST, WEB_ROUTE_MAX_WALL_MS, WEB_ROUTE_MAX_REQUEST_BODY_BYTES, WEB_ROUTE_MAX_RESPONSE_BYTES, WEB_APP_NAME_PATTERN, WEB_APP_ENTRY_HTML_MAX_CHARS, WEB_APP_MAX_ASSETS, WEB_APP_ASSET_PATH_PATTERN, WEB_APP_ASSET_PATH_MAX_CHARS, WEB_APP_MAX_ROUTES, WEB_APP_MAX_ASSET_BYTES, WEB_APP_CSP_NONCE_PLACEHOLDER, EVIDENCE_SESSION_IDLE_MS, EVIDENCE_MIN_CONVERSATIONS, EVIDENCE_LOW_CONFIDENCE_N, EVIDENCE_SNIPPET_MAX_CHARS, EVIDENCE_EXAMPLES_PER_ITEM, EVIDENCE_SHOWN_ITEMS, EVIDENCE_LATENCY_BOUNDS_MS, EVIDENCE_WORD_BOUNDS, BAD_CONVERSATION_REASONS, ATTACHMENT_LINES, REVIEW_VERDICT_REASON_ORDER, ENV_TEMPLATE_SECRET_KEY_RE, CONNECTION_SEND_NOT_ALLOWED, CONNECTION_RECIPIENT_NOT_ALLOWED, NOT_SEND, PLAIN_ADDRESS, RecipientSet, MCP_MESSAGING_CREATE, MCP_CALENDAR_EVENT_WRITE, REPLY_KEYS, DEDICATED_MAIL_SLUGS, FULL_SUITE_SLUGS, WELL_KNOWN_MAIL_FOLDERS, MEMBER_KEYS, CANONICAL_ORIGIN, CANONICAL_PREFIX, STRICT_BASE64, GMAIL_PREFIX, GMAIL_MESSAGES_SEND, GMAIL_DRAFTS_SEND, GOOGLE_BATCH, GRAPH_VERSION, GRAPH_PRINCIPAL, GRAPH_SEND_MAIL, GRAPH_MESSAGE_ACTION, GRAPH_OWNER, GRAPH_EVENTS, GRAPH_EVENT_COLLECTION, GRAPH_EVENT_ID, GRAPH_EVENT_ITEM, GRAPH_EVENT_ACTION, GRAPH_BATCH, GRAPH_TEAMS_MESSAGE, GRAPH_ACTIVITY_NOTIFICATION, GRAPH_GROUP_CONVERSATION, GCAL_EVENTS, GRAPH_READ_KEYS, MALFORMED_POLICY, BILLING_REJECTION_TEXT_CREDITS, BILLING_REJECTION_TEXT_SEAT, BILLING_REJECTION_TEXT_USER_QUOTA, CUSTOM_MCP_CONNECTION_ID_PREFIX, CUSTOM_MCP_SOURCE, CUSTOM_MCP_TRANSPORT, CUSTOM_MCP_CONNECTION_ID_PATTERN, customMcpConnectionIdSchema, CONNECTION_BACKED_MCP_SOURCES, CUSTOM_MCP_REFERENCE_ID_PATTERN, customMcpReferenceIdSchema, CUSTOM_MCP_AUTH_KINDS, customMcpAuthKindSchema, CUSTOM_MCP_OAUTH_REGISTRATIONS, customMcpOAuthRegistrationSchema, CUSTOM_MCP_HEALTH_STATES, customMcpHealthStateSchema, CUSTOM_MCP_FAILURE_STEPS, customMcpFailureStepSchema, CUSTOM_MCP_CONNECT_STEPS, customMcpConnectStepSchema, customMcpFailureCodeSchema, WORKFLOW_KEY_MAX_LENGTH, CUSTOM_MCP_URL_MAX_LENGTH, CUSTOM_MCP_DISPLAY_NAME_MAX_LENGTH, CUSTOM_MCP_MAX_HEADERS, CUSTOM_MCP_HEADER_NAME_MAX_LENGTH, CUSTOM_MCP_HEADER_VALUE_MAX_LENGTH, CUSTOM_MCP_MAX_TOOLS, CUSTOM_MCP_TOOL_NAME_MAX_LENGTH, CUSTOM_MCP_TOOL_TEXT_MAX_LENGTH, CUSTOM_MCP_MIN_TIMEOUT_MS, CUSTOM_MCP_MAX_TIMEOUT_MS, CUSTOM_MCP_OAUTH_PENDING_TTL_MS, isoDateTime, agentId, nonNegativeInt, customMcpUrlInputSchema, customMcpDisplayNameSchema, customMcpTimeoutSchema, CUSTOM_MCP_RESERVED_HEADER_NAMES, HEADER_NAME, HEADER_VALUE_FORBIDDEN, customMcpHeaderNameSchema, headerValue, customMcpHeadersSchema, customMcpHeadersPatchSchema, customMcpToolNameSchema, customMcpToolSchema, customMcpServerInfoSchema, customMcpToolSelectionSchema, customMcpToolsResponseSchema, customMcpFailureSchema, customMcpHealthSchema, customMcpErrorBodySchema, customMcpConnectionBlockSchema, customMcpConnectionViewSchema, customMcpConnectionResponseSchema, customMcpProbeBodySchema, customMcpOAuthDiscoverySchema, customMcpProbeResponseSchema, createFields, mountAgentField, customMcpCreateAgentBodySchema, customMcpCreateUserBodySchema, customMcpOAuthClientSchema, startFields, customMcpOAuthStartAgentBodySchema, customMcpOAuthStartUserBodySchema, customMcpOAuthStartResponseSchema, nonce, customMcpOAuthSuccessRedirectQuerySchema, CUSTOM_MCP_OAUTH_CALLBACK_ERRORS, customMcpOAuthFailureRedirectQuerySchema, customMcpOAuthFinalizeBodySchema, customMcpCimdDocumentSchema, customMcpPatchBodySchema, customMcpCredentialRequestSchema, customMcpCredentialAuthSchema, customMcpCredentialResponseSchema, CUSTOM_MCP_CREDENTIAL_ERRORS, customMcpCredentialErrorBodySchema, customMcpHealthReportSchema, customMcpProbeRequestSchema, customMcpProbeResultSchema, customMcpOriginUrlSchema, customMcpServerProjectionSchema, customMcpMountUpsertBodySchema;
7626
+ function sharedDataOwnerKey(collectionId) {
7627
+ return `${SHARED_DATA_OWNER_PREFIX}${collectionId}`;
7628
+ }
7629
+ function isSharedDataOwnerKey(agentId2) {
7630
+ return typeof agentId2 === "string" && agentId2.startsWith(SHARED_DATA_OWNER_PREFIX);
7631
+ }
7632
+ var __defProp3, __name3, PLUMBING_THREAD_CHANNELS, CHANNEL_CONVERSATION_CHANNELS, HIDDEN_THREAD_CHANNELS, CHOICE_PERSON_TURN_CHANNELS, CHOICE_REPLAY_CLIENT_CAPABILITIES, CHOICE_REPLAY_CLIENT_SURFACES, DECISION_PROVIDERS, DECISION_FALLBACK_PROVIDERS, OPENROUTER_DIRECT_VENDORS, OPENROUTER_NEEDS_MODEL_MESSAGE, DECISION_QUESTION_TYPES, DECISION_NAME_PATTERN, DECISION_SANDBOX_SITE_HEADER, DECISION_SANDBOX_PRIMITIVE_HEADER, DECISION_SANDBOX_TOOL_SEPARATOR, DECISION_LIMITS, DECISION_ERROR_CODES, DECISION_INACTIVE_CODE, MAX_NAME_CHARS, InstructionsSchema, NameSchema, OddsQuestionSchema, ChoiceQuestionSchema, ScoreQuestionSchema, DecisionQuestionSchema, DecisionOptionsSchema, DecisionQuestionsSchema, DecisionDefinitionSchema, DecisionDefinitionWriteSchema, INTEGRATION_PASSTHROUGH_READ_METHODS, URL_REINTERPRETED_PATH_CHARACTERS, PERCENT_ENCODED_DOT, PERCENT_ESCAPE, DECODED_PATH_SEPARATORS, DECODED_LEADING_SEPARATOR, MAX_PERCENT_DECODE_ROUNDS, URL_RESOLUTION_PROBE_BASE, PLATFORM_INVOCATION_CALLERS, MESSAGING_CHANNELS, VOICE_CHANNELS, TURN_CATEGORIES, AGENT_TOOL_CATEGORIES, count, AnthropicSseUsageReader, SUPERVISION_OPS, SUPERVISION_OPS_WAVE2, SUPERVISION_WATCHDOG_OPS, SUPERVISION_WATCHDOG_ERRORS, SUPERVISION_ROLLBACK_REFUSAL_CODES, SUPERVISION_ROLLBACK_LINEAGE_MAX, SUPERVISION_UNTARGETED_OPS, SUPERVISED_WORKFLOW_VERSIONS_MAX, SUPERVISION_EVENT_KINDS, AGENT_PROVISIONING_LIMITS, AGENT_PROVISIONING_APPROVAL_PAYLOAD_KEY, AGENT_PROVISIONING_ERRORS, PROVISIONED_SUPERVISION_ACTIONS, isNonEmptyString, uniqueStrings, sameSet, AGENT_PROVISIONING_APPROVAL_CARD_MAX_CHARS, APPROVAL_PAYLOAD_MEMBERS, AGENT_CONNECTION_POLICIES, AGENT_CONNECTION_POLICY_DEFAULT, AGENT_CONNECTION_MOUNT_MODES, AGENT_CONNECTION_GOVERNANCE_ERRORS, AGENT_CONNECTION_OPERATION_RULES_MAX, AGENT_CONNECTION_OPERATION_PATTERN_MAX_LENGTH, OPERATION_RULE_METHODS, PATH_SEPARATOR, PATH_SINGLE_SEGMENT_WILDCARD, PATH_REST_WILDCARD, METHOD_OVERRIDE_HEADER_NAMES, METHOD_OVERRIDE_QUERY_NAMES, ODATA_BATCH_SEGMENT, GOOGLE_BATCH_FIRST_SEGMENT, CONNECTION_CHECK_RESULTS, CONNECTION_CHECK_CATALOGUE_V1, CONNECTION_CHECK_NAME_PATTERN, CONNECTION_CHECK_NAME_MAX, CONNECT_OUTCOME_STATUSES, SECRET_TEST_RESULTS, SECRET_DATADOG_REGIONS, SECRET_PROVIDER_CATALOGUE_V1, SECRET_TEST_MAX_RESPONSE_BYTES, SECRET_ENV_KEY_PATTERN, SECRET_REQUEST_ERRORS, SECRET_OUTCOME_STATUSES, CLIENT_OUTCOME_TURNS_MAX, SHORT_TEXT_MAX, SLUG_MAX, shortText, optionalShortText, CONNECTION_REQUEST_TERMINAL_STATES, CONNECTION_USE_ORIGINS, AGENT_CONNECTION_OPERATION_LIMITS_BOUNDS, CURRENCY_CODE, LIMITS_KEYS, CAPS_KEYS, EXCLUSIONS_KEYS, EMAIL_IN_TEXT, MAX_EXCLUSION_DEPTH, PROJECTION_PARAMETER_KEYS, CHANNEL_PARAMETER_KEYS, GMAIL_SYSTEM_LABEL_IDS, ZERO_DECIMAL_CURRENCIES, THREE_DECIMAL_CURRENCIES, DECIMAL_AMOUNT, REDACTED_PLACEHOLDER, PROVIDER_MESSAGE_MAX_CHARS, ERROR_MESSAGE_MAX_CHARS, SECRET_LITERAL_PATTERNS, SECRET_NAME, SECRET_PAIR_PATTERNS, GROUP_COUNT, WORKFLOW_SECRET_KEY_RE, WORKFLOW_RESERVED_SECRET_KEYS, SCRUB_INPUT_MAX_CHARS, SCRUB_CUT_BACKOFF_CHARS, SCRUB_DEEP_MAX_DEPTH, TEST_SESSION_ID_PATTERN, TEST_SESSION_COLLECTION_PREFIX, TEST_EFFECT_BODY_MAX_BYTES, TEST_EFFECT_DROPPED_HEADERS, EVAL_CREDITS_PER_1K_TOKENS, EVAL_RESERVED_TOOL_ID_PREFIXES, SUPERVISED_SECRET_LIMITS, SUPERVISED_SECRET_NAME_RE, SUPERVISED_SECRET_FIELD_RE, SUPERVISED_SECRET_KEY_FIELD, SUPERVISED_SECRET_ERRORS, CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY, CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS, CONNECTION_HANDOVER_LIMITS, MEMBERS, FORMAT_CHARS, oneLine, boundedString, AGENT_METRIC_NAME_PATTERN, AGENT_METRIC_LIMITS, AGENT_OBJECTIVE_ERRORS, CHANGE_LEASE_TTL_MINUTES_MIN, CHANGE_LEASE_TTL_MINUTES_MAX, CHANGE_LEASE_REASON_MAX, CHANGE_LEASE_ERRORS, AGENT_CONFIG_SET_LIMITS, SECRET_ENV_KEY_SUFFIXES, DEFAULT_OWNER_DEPARTURE_POLICY, AGENT_LIFECYCLE_ERRORS, USER_COST_COUNTER_TTL_SECONDS, USER_COST_ATTRIBUTION_CHANNELS, CALLER_DEDUPE_KEY_MAX, FOLLOW_UP_IDEMPOTENCY_TTL_SECONDS, THREAD_FOLLOW_UP_LIMITS, THREAD_FOLLOW_UP_ERRORS, PROGRESS_UPDATE_LIMITS, PAUSABLE_CAPABILITY_KINDS, UNIFIED_CATCH_UP_MAX_WINDOW_HOURS, UNIFIED_CATCH_UP_EVENTS, UNIFIED_CATCH_UP_FILTERABLE_OBJECT_TYPES, AGENT_NEVER_RULES_MAX, AGENT_NEVER_RULE_FIELD_MAX, AGENT_NEVER_RULE_INPUT_MATCH_MAX, NEVER_RULE_ID_PATTERN, NEVER_RULE_HTTP_METHODS, TEMPLATE_DISTRIBUTION_MODES, TAKEOVER_MAX_IDLE_MINUTES, MINUTES_PER_DAY, DEFAULT_IDLE_RELEASE_MINUTES, FALLBACK_IDLE_RELEASE_MINUTES, VARIATION_SELECTORS, SLACK_EMOJI_NAMES, SLACK_SHORTCODE, PLAIN_EMAIL_ADDRESS, DOMAIN, UNSAFE_TEXT, SLACK_CONVERSATION_ID, CHANNEL_SETTING_GROUPS, THREAD_SCOPING_NOUN, TAKEOVER_CHANNEL_TYPES, EMAIL_SETTINGS, SLACK_SETTING_DEFAULTS, SLACK_REACTION_MAX, SLACK_INTRO_MAX, SLACK_EXAMPLE_PROMPTS_MAX, SLACK_EXAMPLE_PROMPT_MAX, SLACK_SUPPORT_CONTACT_MAX, SLACK_SETTINGS, CHANNEL_SETTINGS, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_STANDING_START_TOOLS, REVIEWABLE_MCP_SEND_TOOL_SUFFIX, MCP_TOOL_READ_VERB_RE, MCP_DRAFT_CREATE_VERBS, NON_INTERACTIVE_CHANNELS, RICH_PARTS_MESSAGE_ID_PREFIX, SCREENSHOT_MESSAGE_ID_PREFIX, WORK_ITEMS_KEY, MAX_WORK_ITEMS, LIMITS, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, SERVER_TRIGGERED_BROWSER_SOURCES, BROWSER_FALLBACKS, DEFAULT_BROWSER_FALLBACK, PROXY_COUNTRY_CODE, BROWSER_LOG_CONTENT_MODES, DEFAULT_BROWSER_LOG_CONTENT, BROWSER_SCREENSHOT_POLICIES, DEFAULT_BROWSER_SCREENSHOT_POLICY, BROWSER_ENGINES, BROWSER_PROFILE_NAME_PATTERN, BROWSER_LIMIT_KEYS, BROWSER_LIMIT_MAX, BROWSER_EXECUTE_METHOD, BROWSER_GLOBAL_METHODS, BROWSER_EXECUTE_DEFAULT_TIMEOUT_MS, BROWSER_EXECUTE_MAX_TIMEOUT_MS, LOG_FIELDS_MAX_KEYS, LOG_FIELD_MAX_VALUE_BYTES, LOG_FIELDS_MAX_BYTES, LOG_FIELD_KEY_PATTERN, LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS, LOG_FIELDS_CLAMPED_KEY, LOG_FIELD_ARRAY_COUNT_SUFFIX, LuaLogFieldsError, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, BROWSER_READ_FORMATS, BROWSER_READ_DEFAULT_TIMEOUT_MS, BROWSER_READ_MIN_TIMEOUT_MS, BROWSER_READ_MAX_TIMEOUT_MS, BROWSER_READ_MAX_CONTENT_CHARS, BROWSER_READ_DEFAULT_SELECTOR, BROWSER_READ_MATCH_SEPARATOR, BROWSER_READ_LOGIN_BLOCKER, BROWSER_ERROR_NAME, HTTP_STATUS_FAILURE, LOGIN_PATH_SEGMENTS, LOGIN_HOST_LABELS, AGENT_LOG_SOURCES, AGENT_LOG_ENVIRONMENTS, AGENT_LOG_FIELDS_MAX_WIRE_KEYS, BROWSER_LOG_EVENT_KINDS, BROWSER_LOG_ENGINES, BROWSER_SESSION_OPEN_REASONS, BROWSER_BLOCK_KINDS, BROWSER_WALL_KINDS, BROWSER_WALL_NEXT_ACTIONS, BROWSER_CONFIRM_DECISIONS, BROWSER_SESSION_CLOSE_REASONS, BROWSER_LOG_CONTEXT_KEYS, BROWSER_LOG_ID_MAX_CHARS, BROWSER_LOG_TEXT_MAX_CHARS, isString, isBoolean, isCount, isPlainObject3, oneOf, isLimits, EVENT_SHAPES, BASE_KEYS, BROWSER_WORKER_SESSION_ID_SEPARATOR, BROWSER_WORKER_BLOCK_REASON_MAX_CHARS, WORKFLOW_RETRY_BACKOFFS, WORKFLOW_RETRY_MIN_ATTEMPTS, WORKFLOW_RETRY_POLICY_KEYS, WORKFLOW_RETRY_MAX_ATTEMPTS, WORKFLOW_RETRY_ENGINE_KEYS, WORKFLOW_JOB_RESOURCES, WORKFLOW_SIDE_EFFECTS, WORKFLOW_AGENT_EFFORTS, WORKFLOW_MODEL_CLASSES, WORKFLOW_TASK_CLASSES, WORKFLOW_MODEL_TRAITS, WORKFLOW_MODEL_REASON_MAX_LENGTH, WORKFLOW_MODELS_COMPOSE_MODES, WORKFLOW_MODELS_PIN_MODES, WORKFLOW_MODELS_FALLBACK_MODES, WORKFLOW_MODELS_CONSENT_ACTIONS_MIN, WORKFLOW_DEFAULT_TASK_CLASS_MAP, WORKFLOW_MODELS_MAX_CLASS_DEFAULT, WORKFLOW_AUTONOMY_FORMS, WORKFLOW_AUTONOMY_NUMERIC_KEYS, WORKFLOW_AUTONOMY_ENVELOPE_KEYS, WORKFLOW_AUTONOMY_ENABLED_DEFAULT, WORKFLOW_AUTONOMY_DEFAULTS, WORKFLOW_AUTONOMY_CEILINGS, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_ENV, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_CEILING, WORKFLOW_AUTONOMY_FORMS_DEFAULT, WORKFLOW_AUTONOMY_MIN_VALUE, WORKFLOW_JOB_RANGES, WORKFLOW_JOB_RANGE_MEMBERS, WORKFLOW_SINGLE_STEP_TYPES, WORKFLOW_HITL_ENTRY_TYPES, WORKFLOW_ARM_ENTRY_TYPES, WORKFLOW_HITL_ARM_CONTAINERS, WORKFLOW_GRAPH_ENTRY_STEP_KINDS, WORKFLOW_ARM_ENTRY_STEP_KINDS, WORKFLOW_BUDGET_MAX_DURATION_SECONDS, MODEL_ID_BYOK_PROVIDERS, MODEL_CLASS_REF_PREFIX, MODEL_SNAPSHOT_SUFFIX, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, PLATFORM_FALLBACK_MODEL_SOURCE, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, LOG_DRAIN_TYPES_PHASE1, LOG_DRAIN_TYPES_PHASE2, LOG_DRAIN_TYPES_IMPLEMENTED, LOG_DRAIN_FORMATS, LOG_DRAIN_SEVERITIES, LOG_DRAIN_SOURCES, LOG_DRAIN_CONTENT_SOURCES, LOG_DRAIN_DEFAULT_SOURCES, LOG_DRAIN_MAX_PER_ORG, LOG_DRAIN_MAX_PER_ORG_ENTERPRISE, LOG_DRAIN_DATADOG_SITES, LOG_DRAIN_NEWRELIC_SITES, LOG_DRAIN_ENDPOINT_TEMPLATES, LOG_DRAIN_PRESET_SITES, LOG_DRAIN_BUCKET_NAME_PATTERN, LOG_DRAIN_BUCKET_HOST_PATTERNS, LOG_DRAIN_PRESET_HOST_SUFFIXES, DRAIN_CONTENT_ACK_ERROR_CODE, DRAIN_CONTENT_ACK_FIELD, DrainContentAckRequiredError, LOG_DRAIN_PRESET_PATHS, PRESET_SEGMENT_RE, LOG_DRAIN_QUOTAS, LOG_DRAIN_QUOTA_WARN_RATIO, LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO, LOG_DRAIN_QUOTA_DROP_INFO_RATIO, LOG_DRAIN_QUOTA_PAUSE_RATIO, LOG_EXPORT_SOURCES, LOG_EXPORT_MAX_WINDOW_DAYS, LOG_EXPORT_MAX_WINDOW_MS, LOG_EXPORT_URL_TTL_SECONDS, LOG_EXPORT_FILE_RETENTION_DAYS, LOG_EXPORT_FILE_RETENTION_MS, LOG_EXPORT_PART_MAX_BYTES, LOG_DRAIN_NOTICE_RATE_LIMIT_MS, LOG_DRAIN_VERIFICATION_STALE_MS, LOG_DRAIN_DIGEST_INTERVAL_MS, LOG_DRAIN_DIGEST_MAX_ENTRIES, LOG_DRAIN_NOTICE_ERROR_MAX_CHARS, LOG_DRAIN_USAGE_LINE_ITEM, LOG_DRAIN_BYTES_PER_GIB, DEFAULT_LOG_DRAIN_PLAN_CONFIG, TIERS, LOG_CURSOR_MAX_LENGTH, LOG_CURSOR_MAX_ID_LENGTH, LOG_RELATIVE_TIME_PATTERN, LOG_ISO_TIME_PATTERN, RELATIVE_UNIT_MS, CORE_DRAINING_CODE, CORE_DRAINING_DEFAULT_RETRY_MS, CORE_DRAINING_MAX_RETRY_MS, VoiceNameSchema, PluginProviderSchema, RealtimeProviderSchema, PluginClassSchema, ModelDescriptorSchema, InferenceModelSchema, PluginModelSchema, RealtimeModelSchema, LuaVoiceModelSchema, TurnDetectionSchema, InterruptionSchema, BuiltinAudioClipSchema, AudioConfigSchema, BackgroundAudioEntrySchema, BackgroundAudioSchema, LuaVoiceConfigInnerSchema, LuaVoiceConfigSchema, LuaVoiceRefSchema, EventType, LUA_JOB_DEFAULT_TIMEOUT_SECONDS, LUA_JOB_MIN_TIMEOUT_SECONDS, LUA_JOB_MAX_TIMEOUT_SECONDS, KEYS, MAX_BODY_BYTES, MAX_ID_LENGTH, UTC_ISO, TEMPLATE_TRIGGER_URL_ENV_PREFIX, TEMPLATE_INSTALL_POLICY_PER_WORKSPACE_VALUES, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, TYPED_API_KEY, IdSchema, SESSION_AUTH_TIME_MAX_S, PrincipalDescriptorSchema, ActorDescriptorSchema, PrincipalOwnerSchema, CredentialLifecycleSchema, GeneralCredentialDescriptorSchema, DeviceCredentialDescriptorSchema, GeneralPrincipalContextSchema, DeviceCredentialPrincipalContextSchema, RawPrincipalContextSchema, PrincipalContextSchema, DeviceCredentialClaimSchema, LUA_CLIENT_HEADER, LUA_CLIENT_APPS, SEMVER_PATTERN, WEB_RELEASE_PATTERN, CLIENT_HEADER_PATTERN, LUA_SESSION_ID_CLAIM, WEB_APP_ID_PATTERN, SESSION_REVOKED_CODE, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema, SYSTEM_USER_PREFIX, WORKFLOW_RUN_IN_FLIGHT, WORKFLOW_RUN_IDLE, WORKFLOW_RUN_TERMINAL, WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_GATE_KINDS, WORKFLOW_STEP_STATUSES, WORKFLOW_STEP_IN_FLIGHT, WORKFLOW_SIGNAL_EVENT_SITES, ARCHIVE_WINDOW_MARGIN_DAYS, WORKFLOW_ORG_PURGING_TTL_S, WORKFLOW_ORG_PURGE_FORCE_AFTER_MS, IDEMPOTENCY_HOLDING_STATUSES, WORKFLOW_SCHEDULED_RUN_ID_PREFIX, CLOUD_TASK_RUN_ID_PREFIX, WORKFLOW_SCHEDULE_KEY_MAX, WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX, WORKFLOW_OPERATION_ID_PREFIX, WORKFLOW_JOURNAL_PROTOCOL_VERSION, WORKFLOW_CONNECTION_KEY_RE, WORKFLOW_AGENT_APP_CONNECTION_PREFIX, WORKFLOW_JOB_MODEL_SOURCE_LABELS, WORKFLOW_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_SIGNAL_NAME_RE, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, SCHEDULE_HEALTH_NOTIFY_CHANNELS, SCHEDULE_HEALTH_DEFAULT_NOTIFY, SCHEDULE_HEALTH_LIMITS, KNOWN_KEYS, WORKFLOW_GOAL_JUDGE_SELF, APPROVAL_ARGS_MAX_CHARS, APPROVAL_ARG_STRING_MAX_CHARS, APPROVAL_ARGS_SUMMARY_MAX_CHARS, MAX_DEPTH, MAX_KEYS, MAX_ITEMS, MAX_NODES, MAX_KEY_CHARS, KEY_SCRUB_INPUT_MAX_CHARS, STRING_SCRUB_INPUT_MAX_CHARS, ELLIPSIS, SKIP, SCRUB_SECRETS_BEFORE_PERSIST_ENV, PERSIST_SCRUB_MAX_CHARS, PERSIST_SCRUB_REF_MAX_CHARS, WORKFLOW_AUDIT_EVENTS, WORKFLOW_AUDIT_METADATA_MAX_BYTES, INDENT, WRAP_WIDTH, NOUNS, GET_TOOL_NAMES, PREAMBLE, WORKFLOW_APPROVAL_OUTPUT_DECISIONS, WORKFLOW_APPROVAL_OUTPUT_SCHEMA, JSON_FENCE_RE, DEFAULT_ON_AGENT_FEATURES, SUBAGENT_PER_KEY_FLAG_ENV, PER_KEY_FLAG_VALUES, ONBOARDING_FLOW_KEY, ONBOARDING_SCHEMA_VERSION, id, copy, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingTemplateSectionSchema, onboardingInstallScreenSchema, onboardingResultScreenSchema, onboardingConnectScreenSchema, onboardingTemplateContentSchema, onboardingUnavailableOutcomeSchema, onboardingFlowSchema, onboardingActorSchema, onboardingEditorSchema, onboardingPublicationSummarySchema, onboardingValidationIssueSchema, onboardingValidationResponseSchema, onboardingAssetSchema, onboardingPublicAssetSchema, getOnboardingConfigResponseSchema, saveOnboardingDraftRequestSchema, validateOnboardingRequestSchema, publishOnboardingRequestSchema, rollbackOnboardingRequestSchema, onboardingTemplateCatalogItemSchema, getPublishedOnboardingResponseSchema, WEB_ROUTE_PROTOCOL_VERSION, WEB_ROUTE_METHODS, WEB_ROUTE_REQUEST_HEADER_ALLOWLIST, WEB_ROUTE_RESPONSE_HEADER_ALLOWLIST, WEB_ROUTE_MAX_WALL_MS, WEB_ROUTE_MAX_REQUEST_BODY_BYTES, WEB_ROUTE_MAX_RESPONSE_BYTES, WEB_APP_NAME_PATTERN, WEB_APP_TITLE_MAX_CHARS, WEB_APP_ENTRY_HTML_MAX_CHARS, WEB_APP_MAX_ASSETS, WEB_APP_ASSET_PATH_PATTERN, WEB_APP_ASSET_PATH_MAX_CHARS, WEB_APP_MAX_ROUTES, WEB_APP_MAX_ASSET_BYTES, WEB_APP_CSP_NONCE_PLACEHOLDER, EVIDENCE_SESSION_IDLE_MS, EVIDENCE_MIN_CONVERSATIONS, EVIDENCE_LOW_CONFIDENCE_N, EVIDENCE_SNIPPET_MAX_CHARS, EVIDENCE_EXAMPLES_PER_ITEM, EVIDENCE_SHOWN_ITEMS, EVIDENCE_LATENCY_BOUNDS_MS, EVIDENCE_WORD_BOUNDS, BAD_CONVERSATION_REASONS, ATTACHMENT_LINES, REVIEW_VERDICT_REASON_ORDER, ENV_TEMPLATE_SECRET_KEY_RE, CONNECTION_SEND_NOT_ALLOWED, CONNECTION_RECIPIENT_NOT_ALLOWED, NOT_SEND, PLAIN_ADDRESS, RecipientSet, MCP_MESSAGING_CREATE, MCP_CALENDAR_EVENT_WRITE, REPLY_KEYS, DEDICATED_MAIL_SLUGS, FULL_SUITE_SLUGS, WELL_KNOWN_MAIL_FOLDERS, MEMBER_KEYS, CANONICAL_ORIGIN, CANONICAL_PREFIX, STRICT_BASE64, GMAIL_PREFIX, GMAIL_MESSAGES_SEND, GMAIL_DRAFTS_SEND, GOOGLE_BATCH, GRAPH_VERSION, GRAPH_PRINCIPAL, GRAPH_SEND_MAIL, GRAPH_MESSAGE_ACTION, GRAPH_OWNER, GRAPH_EVENTS, GRAPH_EVENT_COLLECTION, GRAPH_EVENT_ID, GRAPH_EVENT_ITEM, GRAPH_EVENT_ACTION, GRAPH_BATCH, GRAPH_TEAMS_MESSAGE, GRAPH_ACTIVITY_NOTIFICATION, GRAPH_GROUP_CONVERSATION, GCAL_EVENTS, GRAPH_READ_KEYS, MALFORMED_POLICY, BILLING_REJECTION_TEXT_CREDITS, BILLING_REJECTION_TEXT_SEAT, BILLING_REJECTION_TEXT_USER_QUOTA, CUSTOM_MCP_CONNECTION_ID_PREFIX, CUSTOM_MCP_SOURCE, CUSTOM_MCP_TRANSPORT, CUSTOM_MCP_CONNECTION_ID_PATTERN, customMcpConnectionIdSchema, CONNECTION_BACKED_MCP_SOURCES, CUSTOM_MCP_REFERENCE_ID_PATTERN, customMcpReferenceIdSchema, CUSTOM_MCP_AUTH_KINDS, customMcpAuthKindSchema, CUSTOM_MCP_OAUTH_REGISTRATIONS, customMcpOAuthRegistrationSchema, CUSTOM_MCP_HEALTH_STATES, customMcpHealthStateSchema, CUSTOM_MCP_FAILURE_STEPS, customMcpFailureStepSchema, CUSTOM_MCP_CONNECT_STEPS, customMcpConnectStepSchema, customMcpFailureCodeSchema, WORKFLOW_KEY_MAX_LENGTH, CUSTOM_MCP_URL_MAX_LENGTH, CUSTOM_MCP_DISPLAY_NAME_MAX_LENGTH, CUSTOM_MCP_MAX_HEADERS, CUSTOM_MCP_HEADER_NAME_MAX_LENGTH, CUSTOM_MCP_HEADER_VALUE_MAX_LENGTH, CUSTOM_MCP_MAX_TOOLS, CUSTOM_MCP_TOOL_NAME_MAX_LENGTH, CUSTOM_MCP_TOOL_TEXT_MAX_LENGTH, CUSTOM_MCP_MIN_TIMEOUT_MS, CUSTOM_MCP_MAX_TIMEOUT_MS, CUSTOM_MCP_OAUTH_PENDING_TTL_MS, isoDateTime, agentId, nonNegativeInt, customMcpUrlInputSchema, customMcpDisplayNameSchema, customMcpTimeoutSchema, CUSTOM_MCP_RESERVED_HEADER_NAMES, HEADER_NAME, HEADER_VALUE_FORBIDDEN, customMcpHeaderNameSchema, headerValue, customMcpHeadersSchema, customMcpHeadersPatchSchema, customMcpToolNameSchema, customMcpToolSchema, customMcpServerInfoSchema, customMcpToolSelectionSchema, customMcpToolsResponseSchema, customMcpFailureSchema, customMcpHealthSchema, customMcpErrorBodySchema, customMcpConnectionBlockSchema, customMcpConnectionViewSchema, customMcpConnectionResponseSchema, customMcpProbeBodySchema, customMcpOAuthDiscoverySchema, customMcpProbeResponseSchema, createFields, mountAgentField, customMcpCreateAgentBodySchema, customMcpCreateUserBodySchema, customMcpOAuthClientSchema, startFields, customMcpOAuthStartAgentBodySchema, customMcpOAuthStartUserBodySchema, customMcpOAuthStartResponseSchema, nonce, customMcpOAuthSuccessRedirectQuerySchema, CUSTOM_MCP_OAUTH_CALLBACK_ERRORS, customMcpOAuthFailureRedirectQuerySchema, customMcpOAuthFinalizeBodySchema, customMcpCimdDocumentSchema, customMcpPatchBodySchema, customMcpCredentialRequestSchema, customMcpCredentialAuthSchema, customMcpCredentialResponseSchema, CUSTOM_MCP_CREDENTIAL_ERRORS, customMcpCredentialErrorBodySchema, customMcpHealthReportSchema, customMcpProbeRequestSchema, customMcpProbeResultSchema, customMcpOriginUrlSchema, customMcpServerProjectionSchema, customMcpMountUpsertBodySchema, SHARED_DATA_NAME_RE, SHARED_DATA_OWNER_PREFIX, SHARED_DATA_ERRORS;
7533
7633
  var init_dist = __esm({
7534
7634
  "../shared-types/dist/index.mjs"() {
7535
7635
  "use strict";
@@ -7991,7 +8091,14 @@ var init_dist = __esm({
7991
8091
  * the target (`snapshot.jobs[]`) so the promote activates and schedules it. Mongo-only marker write; EventBridge stays
7992
8092
  * on the post-promote reconcile. Release-class: needs `register-job` AND `release` on the grant, from a signed step.
7993
8093
  */
7994
- "jobs.register": "register-job"
8094
+ "jobs.register": "register-job",
8095
+ // [SW]
8096
+ /**
8097
+ * SW — `Agents.secrets(id).put(collection, key, value)`: write ONE secret row into the TARGET's own Data, in a
8098
+ * collection the grant names in `secretWriteCollections` (deny by default), keyed by `data._pk`. The value never
8099
+ * comes back: the answer is `{ ok, id, fingerprint }`, and the audit row carries the fingerprint only.
8100
+ */
8101
+ "secrets.put": "act"
7995
8102
  };
7996
8103
  __name(isSupervisionOp, "isSupervisionOp");
7997
8104
  __name3(isSupervisionOp, "isSupervisionOp");
@@ -8187,6 +8294,12 @@ var init_dist = __esm({
8187
8294
  gate: "register-job",
8188
8295
  targeted: true,
8189
8296
  item: "JR"
8297
+ },
8298
+ /** SW — `Agents.secrets(id).put(collection, key, value)`: one secret row in a `secretWriteCollections` collection. */
8299
+ "secrets.put": {
8300
+ gate: "act",
8301
+ targeted: true,
8302
+ item: "SW"
8190
8303
  }
8191
8304
  };
8192
8305
  SUPERVISION_WATCHDOG_OPS = {
@@ -8874,6 +8987,12 @@ var init_dist = __esm({
8874
8987
  {
8875
8988
  re: /\b(npm_)[A-Za-z0-9]{36}\b/g
8876
8989
  },
8990
+ // Linear personal API keys (`lin_api_` + 40) and OAuth access / refresh tokens (`lin_oauth_` + 64 hex,
8991
+ // `lin_refresh_`): the fleet's Engineering Manager hands OAuth tokens to agents in a prompt + tool call, and
8992
+ // both landed verbatim in `vmExecutionLogs` (2026-10-11).
8993
+ {
8994
+ re: /\b(lin_(?:api|oauth|refresh)_)[A-Za-z0-9]{16,}/g
8995
+ },
8877
8996
  {
8878
8997
  re: /\b(sk-ant-)[A-Za-z0-9_-]{16,}/g
8879
8998
  },
@@ -8892,11 +9011,16 @@ var init_dist = __esm({
8892
9011
  {
8893
9012
  re: /\b(ya29\.)[A-Za-z0-9_-]{20,}/g
8894
9013
  },
9014
+ // 2026-10-11: `(?<![A-Za-z0-9_-])`, not `\b` — with `\b` every `eyJ` after a `-` / `_` started an attempt that
9015
+ // ran the first segment to the end of the run and failed on the missing `.`, so `eyJabcdefgh-` × 1 MB took
9016
+ // ~115 s (quadratic). Now a run of segment characters admits at most one attempt.
8895
9017
  {
8896
- re: /\b(eyJ)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g
9018
+ re: /(?<![A-Za-z0-9_-])(eyJ)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g
8897
9019
  },
9020
+ // 2026-10-11: the body stops at the next `-----BEGIN ` — a lazy `[\s\S]*?` let every unterminated BEGIN scan to the
9021
+ // end of the text (quadratic on a repeated header with no END). A key whose END follows is matched as before.
8898
9022
  {
8899
- re: /(-----BEGIN [A-Z ]*PRIVATE KEY-----)[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g
9023
+ re: /(-----BEGIN [A-Z ]*PRIVATE KEY-----)(?:(?!-----BEGIN )[\s\S])*?-----END [A-Z ]*PRIVATE KEY-----/g
8900
9024
  },
8901
9025
  // `https://x-access-token:<token>@github.com/…` (the git credential shape the pod scrubbed already)
8902
9026
  {
@@ -8904,7 +9028,7 @@ var init_dist = __esm({
8904
9028
  suffix: true
8905
9029
  }
8906
9030
  ];
8907
- 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?)";
9031
+ 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?)";
8908
9032
  SECRET_PAIR_PATTERNS = [
8909
9033
  // `Authorization: Bearer x`, `x-api-key: x`, `AWS_SECRET_ACCESS_KEY=x`, `SVC_JOB_KEY=x`, `"apiKey": "x"`,
8910
9034
  // `FOO_TOKEN=x`, `secretKey=x`, `password=x`. Groups: the char before the name, the name, the separator
@@ -8980,6 +9104,13 @@ var init_dist = __esm({
8980
9104
  __name3(scrubProviderMessage, "scrubProviderMessage");
8981
9105
  __name(scrubStepErrorMessage, "scrubStepErrorMessage");
8982
9106
  __name3(scrubStepErrorMessage, "scrubStepErrorMessage");
9107
+ SCRUB_DEEP_MAX_DEPTH = 12;
9108
+ __name(scrubSecretsDeep, "scrubSecretsDeep");
9109
+ __name3(scrubSecretsDeep, "scrubSecretsDeep");
9110
+ __name(isPlainObject2, "isPlainObject2");
9111
+ __name3(isPlainObject2, "isPlainObject");
9112
+ __name(scrubDeep, "scrubDeep");
9113
+ __name3(scrubDeep, "scrubDeep");
8983
9114
  TEST_SESSION_ID_PATTERN = /^tsn_[0-9a-f-]{36}$/;
8984
9115
  __name(isTestSessionId, "isTestSessionId");
8985
9116
  __name3(isTestSessionId, "isTestSessionId");
@@ -9031,6 +9162,27 @@ var init_dist = __esm({
9031
9162
  __name3(sameSupervisionAccessFields, "sameSupervisionAccessFields");
9032
9163
  __name(supervisionAccessBindingViolation, "supervisionAccessBindingViolation");
9033
9164
  __name3(supervisionAccessBindingViolation, "supervisionAccessBindingViolation");
9165
+ SUPERVISED_SECRET_LIMITS = {
9166
+ /** Fields in `value` (the `_pk` field included). */
9167
+ maxFields: 32,
9168
+ /** One string field's length. */
9169
+ maxStringLength: 8192,
9170
+ /** The canonical JSON of the whole row. */
9171
+ maxBytes: 16384
9172
+ };
9173
+ SUPERVISED_SECRET_NAME_RE = /^[A-Za-z0-9_.:-]{1,128}$/;
9174
+ SUPERVISED_SECRET_FIELD_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
9175
+ SUPERVISED_SECRET_KEY_FIELD = "_pk";
9176
+ SUPERVISED_SECRET_ERRORS = {
9177
+ BAD_ARGS: "supervision_secret_bad_args",
9178
+ NOT_GRANTED: "supervision_secret_write_not_granted",
9179
+ /** A collection named for secret writes is write-only for the supervisor: `data.get` / `data.query` refuse it. */
9180
+ WRITE_ONLY: "supervision_secret_collection_write_only"
9181
+ };
9182
+ __name(canonicalSupervisedSecretJson, "canonicalSupervisedSecretJson");
9183
+ __name3(canonicalSupervisedSecretJson, "canonicalSupervisedSecretJson");
9184
+ __name(validateSupervisedSecretPut, "validateSupervisedSecretPut");
9185
+ __name3(validateSupervisedSecretPut, "validateSupervisedSecretPut");
9034
9186
  CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY = "connectionAssignment";
9035
9187
  CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS = 1200;
9036
9188
  CONNECTION_HANDOVER_LIMITS = {
@@ -9910,7 +10062,7 @@ var init_dist = __esm({
9910
10062
  },
9911
10063
  {
9912
10064
  name: "find",
9913
- 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?."
10065
+ description: "Act by semantic locator. Args: by(role|text|label|placeholder|alt|title|testid), query, action(click|fill|hover|check|text), value?, name?, exact?."
9914
10066
  },
9915
10067
  // AI fallbacks
9916
10068
  {
@@ -9924,7 +10076,7 @@ var init_dist = __esm({
9924
10076
  // wait
9925
10077
  {
9926
10078
  name: "wait",
9927
- description: "Wait for a condition. Provide one of: selector(+state), ms, text, url, load, fn."
10079
+ description: "Wait for a condition. Provide one of: selector (waits until it is visible), ms, text, url, load, fn."
9928
10080
  },
9929
10081
  // tabs / frames
9930
10082
  {
@@ -9959,7 +10111,7 @@ var init_dist = __esm({
9959
10111
  },
9960
10112
  {
9961
10113
  name: "set",
9962
- description: "Configure the browser. Args: setting(viewport|device|geo|headers|credentials|media), args[]."
10114
+ description: "Configure the browser. Args: setting(viewport|device|geo|headers|credentials|media|offline), args[]."
9963
10115
  },
9964
10116
  // files / clipboard
9965
10117
  {
@@ -10003,7 +10155,7 @@ var init_dist = __esm({
10003
10155
  },
10004
10156
  {
10005
10157
  name: "keyboard",
10006
- description: "Low-level keyboard at focus. Args: action(type|inserttext|keydown|keyup), text?, key?."
10158
+ description: "Low-level keyboard at focus. Args: action(type|inserttext), text. Use press for single keys and chords."
10007
10159
  },
10008
10160
  {
10009
10161
  name: "state",
@@ -10318,9 +10470,9 @@ var init_dist = __esm({
10318
10470
  isString = /* @__PURE__ */ __name3((value3) => typeof value3 === "string", "isString");
10319
10471
  isBoolean = /* @__PURE__ */ __name3((value3) => typeof value3 === "boolean", "isBoolean");
10320
10472
  isCount = /* @__PURE__ */ __name3((value3) => typeof value3 === "number" && Number.isFinite(value3) && value3 >= 0, "isCount");
10321
- isPlainObject2 = /* @__PURE__ */ __name3((value3) => typeof value3 === "object" && value3 !== null && !Array.isArray(value3), "isPlainObject");
10473
+ isPlainObject3 = /* @__PURE__ */ __name3((value3) => typeof value3 === "object" && value3 !== null && !Array.isArray(value3), "isPlainObject");
10322
10474
  oneOf = /* @__PURE__ */ __name3((values) => (value3) => typeof value3 === "string" && values.includes(value3), "oneOf");
10323
- isLimits = /* @__PURE__ */ __name3((value3) => isPlainObject2(value3) && Object.values(value3).every((entry) => isCount(entry)), "isLimits");
10475
+ isLimits = /* @__PURE__ */ __name3((value3) => isPlainObject3(value3) && Object.values(value3).every((entry) => isCount(entry)), "isLimits");
10324
10476
  EVENT_SHAPES = {
10325
10477
  "session.opened": {
10326
10478
  required: {
@@ -10340,7 +10492,7 @@ var init_dist = __esm({
10340
10492
  ok: isBoolean
10341
10493
  },
10342
10494
  optional: {
10343
- args: isPlainObject2,
10495
+ args: isPlainObject3,
10344
10496
  urlBefore: isString,
10345
10497
  urlAfter: isString,
10346
10498
  resultBytes: isCount,
@@ -11619,6 +11771,9 @@ This text is who you are for this person. As you learn them, their name, their w
11619
11771
  __name(luaClientMetricLabels, "luaClientMetricLabels");
11620
11772
  __name3(luaClientMetricLabels, "luaClientMetricLabels");
11621
11773
  LUA_SESSION_ID_CLAIM = "luaSessionId";
11774
+ WEB_APP_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
11775
+ __name(webAppPreviewSessionBinding, "webAppPreviewSessionBinding");
11776
+ __name3(webAppPreviewSessionBinding, "webAppPreviewSessionBinding");
11622
11777
  SESSION_REVOKED_CODE = "SESSION_REVOKED";
11623
11778
  AUTHZ_PROJECTION_VERSION = 1;
11624
11779
  ProjectedScopeSchema = z4.string().min(1).max(128);
@@ -12548,6 +12703,7 @@ listed here; never invent a target.`;
12548
12703
  __name(isWebRouteInput, "isWebRouteInput");
12549
12704
  __name3(isWebRouteInput, "isWebRouteInput");
12550
12705
  WEB_APP_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
12706
+ WEB_APP_TITLE_MAX_CHARS = 80;
12551
12707
  WEB_APP_ENTRY_HTML_MAX_CHARS = 256 * 1024;
12552
12708
  WEB_APP_MAX_ASSETS = 1e3;
12553
12709
  WEB_APP_ASSET_PATH_PATTERN = /^assets\/(?!.*\.\.)[A-Za-z0-9._\-/]+$/;
@@ -13361,6 +13517,23 @@ listed here; never invent a target.`;
13361
13517
  }).strict();
13362
13518
  __name(maskMcpServerHeaders, "maskMcpServerHeaders");
13363
13519
  __name3(maskMcpServerHeaders, "maskMcpServerHeaders");
13520
+ SHARED_DATA_NAME_RE = /^[A-Za-z0-9_.-]{1,128}$/;
13521
+ SHARED_DATA_OWNER_PREFIX = "shared:";
13522
+ __name(sharedDataOwnerKey, "sharedDataOwnerKey");
13523
+ __name3(sharedDataOwnerKey, "sharedDataOwnerKey");
13524
+ __name(isSharedDataOwnerKey, "isSharedDataOwnerKey");
13525
+ __name3(isSharedDataOwnerKey, "isSharedDataOwnerKey");
13526
+ SHARED_DATA_ERRORS = {
13527
+ /** Not in the ACL for this access, the collection does not exist, or it belongs to another org: one answer. */
13528
+ FORBIDDEN: "shared_data_forbidden",
13529
+ /** A test session may read a shared collection but never write it (no shadow namespace for shared rows). */
13530
+ TEST_SESSION_WRITE_REFUSED: "shared_data_test_session_write_refused",
13531
+ /** `lua test` / offline runs have no server-side ACL to consult. */
13532
+ UNAVAILABLE_OFFLINE: "shared_data_unavailable_offline",
13533
+ /** A private Data route was called with a shared-collection owner key. */
13534
+ RESERVED_OWNER_KEY: "shared_data_reserved_owner_key",
13535
+ INVALID_NAME: "shared_data_invalid_name"
13536
+ };
13364
13537
  }
13365
13538
  });
13366
13539
 
@@ -17365,7 +17538,7 @@ function resolvePlacements(calls) {
17365
17538
  function isConditionalJoinId(stepId) {
17366
17539
  return CONDITIONAL_JOIN_ID.test(stepId);
17367
17540
  }
17368
- function isPlainObject3(v) {
17541
+ function isPlainObject4(v) {
17369
17542
  return typeof v === "object" && v !== null && !Array.isArray(v);
17370
17543
  }
17371
17544
  function leafValue(row2) {
@@ -17386,7 +17559,7 @@ function deriveRunOutput(steps) {
17386
17559
  if (leaves.length === 1) {
17387
17560
  const leaf = leaves[0];
17388
17561
  const value22 = leafValue(leaf);
17389
- if (isConditionalJoinId(leaf.stepId) && isPlainObject3(value22)) {
17562
+ if (isConditionalJoinId(leaf.stepId) && isPlainObject4(value22)) {
17390
17563
  const keys = Object.keys(value22);
17391
17564
  if (keys.length === 1) return {
17392
17565
  output: value22[keys[0]],
@@ -19376,8 +19549,8 @@ var init_dist2 = __esm({
19376
19549
  CONDITIONAL_JOIN_ID = /^conditional@\d+\.join$/;
19377
19550
  __name(isConditionalJoinId, "isConditionalJoinId");
19378
19551
  __name6(isConditionalJoinId, "isConditionalJoinId");
19379
- __name(isPlainObject3, "isPlainObject");
19380
- __name6(isPlainObject3, "isPlainObject");
19552
+ __name(isPlainObject4, "isPlainObject");
19553
+ __name6(isPlainObject4, "isPlainObject");
19381
19554
  __name(leafValue, "leafValue");
19382
19555
  __name6(leafValue, "leafValue");
19383
19556
  __name(runOutputLeaves, "runOutputLeaves");
@@ -23769,9 +23942,9 @@ function writeTip(message) {
23769
23942
  }
23770
23943
  function writeNextStep(opts) {
23771
23944
  if (hintsDisabled()) return;
23772
- const when3 = opts.when ?? "success";
23773
- const icon = when3 === "error" ? "\u{1F4A1}" : when3 === "partial" ? "\u26A0\uFE0F " : "\u2728";
23774
- const label2 = when3 === "success" ? "Tip" : "Diagnose";
23945
+ const when4 = opts.when ?? "success";
23946
+ const icon = when4 === "error" ? "\u{1F4A1}" : when4 === "partial" ? "\u26A0\uFE0F " : "\u2728";
23947
+ const label2 = when4 === "success" ? "Tip" : "Diagnose";
23775
23948
  const rationale = opts.rationale?.trim();
23776
23949
  const tail = rationale ? ` ${rationale}${/[.!?]$/.test(rationale) ? "" : "."}` : "";
23777
23950
  writeInfo(`${icon} ${label2}: run \`${opts.command}\`${tail}`);
@@ -23779,8 +23952,8 @@ function writeNextStep(opts) {
23779
23952
  function writeHintBlock(opts) {
23780
23953
  if (hintsDisabled()) return;
23781
23954
  const validLines = opts.lines.filter((l) => l.command && l.command.trim().length > 0);
23782
- const when3 = opts.when ?? "success";
23783
- const icon = when3 === "error" ? "\u{1F4A1}" : when3 === "partial" ? "\u26A0\uFE0F " : "\u2728";
23955
+ const when4 = opts.when ?? "success";
23956
+ const icon = when4 === "error" ? "\u{1F4A1}" : when4 === "partial" ? "\u26A0\uFE0F " : "\u2728";
23784
23957
  if (validLines.length === 0) {
23785
23958
  writeInfo(`${icon} ${opts.headline}`);
23786
23959
  return;
@@ -34176,11 +34349,14 @@ var init_web_app_plugin = __esm({
34176
34349
  const pagesRoot = typeof pages?.root === "string" ? pages.root : pagesNode && Node19.isObjectLiteralExpression(pagesNode) ? extractStringProperty(pagesNode, "root") : void 0;
34177
34350
  const { routes, unreadable, duplicates, files } = readRoutes(config);
34178
34351
  const sourceFile = config.getSourceFile();
34352
+ const title = extractStringProperty(config, "title");
34179
34353
  return {
34180
34354
  kind: this.kind,
34181
34355
  ...common,
34182
34356
  metadata: {
34183
34357
  pattern,
34358
+ title,
34359
+ titleUnreadable: hasProperty(config, "title") && title === void 0,
34184
34360
  pagesRoot,
34185
34361
  spa: typeof pages?.spa === "boolean" ? pages.spa : void 0,
34186
34362
  nav: Array.isArray(pages?.nav) ? pages.nav : void 0,
@@ -34221,6 +34397,11 @@ var init_web_app_plugin = __esm({
34221
34397
  if (metadata.name && !WEB_APP_NAME_PATTERN.test(metadata.name)) {
34222
34398
  errors.push(validationError(`Web app name must match ${WEB_APP_NAME_PATTERN} (lower-case letters, digits, dashes)`, at));
34223
34399
  }
34400
+ if (meta.titleUnreadable) {
34401
+ errors.push(validationError("Web app `title` must be a compile-time string (the display name the shells show)", at));
34402
+ } else if (meta.title !== void 0 && (!meta.title.trim() || meta.title.length > WEB_APP_TITLE_MAX_CHARS)) {
34403
+ errors.push(validationError(`Web app \`title\` must be non-empty and at most ${WEB_APP_TITLE_MAX_CHARS} characters`, at));
34404
+ }
34224
34405
  if (!meta.pagesRoot) {
34225
34406
  errors.push(validationError("Web app `pages.root` must be a string literal naming the Vite project directory", at));
34226
34407
  }
@@ -34327,6 +34508,9 @@ var init_web_app_plugin = __esm({
34327
34508
  return {
34328
34509
  ...this.baseManifestFields(compiled),
34329
34510
  kind: "web-app",
34511
+ ...meta.title?.trim() ? {
34512
+ title: meta.title.trim()
34513
+ } : {},
34330
34514
  pagesRoot: meta.pagesRoot ?? ".",
34331
34515
  spa: meta.spa !== false,
34332
34516
  nav: meta.nav ?? [],
@@ -35038,9 +35222,9 @@ export function defineWebApp(config) {
35038
35222
  logLevel: this.options.debug ? "debug" : "silent"
35039
35223
  });
35040
35224
  } catch (err) {
35041
- const failure2 = err;
35225
+ const failure3 = err;
35042
35226
  const guardText = /* @__PURE__ */ __name((e) => typeof e.text === "string" ? e.text.replace(/^\[plugin [^\]]*\]\s*/, "") : "", "guardText");
35043
- const guard = failure2?.errors?.find((e) => COMPILE_GUARD_CODES.some((c) => guardText(e).startsWith(c)));
35227
+ const guard = failure3?.errors?.find((e) => COMPILE_GUARD_CODES.some((c) => guardText(e).startsWith(c)));
35044
35228
  if (guard) {
35045
35229
  const at = guard.location ? ` (${guard.location.file}:${guard.location.line}:${guard.location.column + 1})` : "";
35046
35230
  throw new Error(`${guardText(guard)}${at}`);
@@ -38789,6 +38973,49 @@ var init_data_entry_instance = __esm({
38789
38973
  }
38790
38974
  });
38791
38975
 
38976
+ // src/api/shared-data.offline.ts
38977
+ function assertSharedName(name) {
38978
+ if (typeof name !== "string" || !SHARED_DATA_NAME_RE.test(name)) {
38979
+ throw new SharedDataError(SHARED_DATA_ERRORS.INVALID_NAME, "Data.shared(name): name must be 1-128 of [A-Za-z0-9_.-]");
38980
+ }
38981
+ }
38982
+ function offlineSharedData(name) {
38983
+ assertSharedName(name);
38984
+ const refuse = /* @__PURE__ */ __name(async () => {
38985
+ throw new SharedDataError(SHARED_DATA_ERRORS.UNAVAILABLE_OFFLINE, `Data.shared('${name}') is only available to a deployed agent (the org ACL is checked on the platform); it is not available in local test runs`);
38986
+ }, "refuse");
38987
+ return {
38988
+ collections: refuse,
38989
+ create: refuse,
38990
+ get: refuse,
38991
+ getEntry: refuse,
38992
+ update: refuse,
38993
+ patch: refuse,
38994
+ increment: refuse,
38995
+ search: refuse,
38996
+ delete: refuse
38997
+ };
38998
+ }
38999
+ var SharedDataError;
39000
+ var init_shared_data_offline = __esm({
39001
+ "src/api/shared-data.offline.ts"() {
39002
+ "use strict";
39003
+ init_dist();
39004
+ SharedDataError = class extends Error {
39005
+ static {
39006
+ __name(this, "SharedDataError");
39007
+ }
39008
+ code;
39009
+ name = "SharedDataError";
39010
+ constructor(code, message) {
39011
+ super(message), this.code = code;
39012
+ }
39013
+ };
39014
+ __name(assertSharedName, "assertSharedName");
39015
+ __name(offlineSharedData, "offlineSharedData");
39016
+ }
39017
+ });
39018
+
38792
39019
  // src/api/custom.data.api.service.ts
38793
39020
  var CustomDataApi;
38794
39021
  var init_custom_data_api_service = __esm({
@@ -38797,6 +39024,7 @@ var init_custom_data_api_service = __esm({
38797
39024
  init_http_client();
38798
39025
  init_custom_data();
38799
39026
  init_data_entry_instance();
39027
+ init_shared_data_offline();
38800
39028
  CustomDataApi = class extends HttpClient {
38801
39029
  static {
38802
39030
  __name(this, "CustomDataApi");
@@ -38997,6 +39225,10 @@ var init_custom_data_api_service = __esm({
38997
39225
  }
38998
39226
  throw new Error(response.error?.message || "Failed to delete custom data entry");
38999
39227
  }
39228
+ /** Org-shared Data. Local runs have no org ACL to consult, so every call of the handle rejects (offline). */
39229
+ shared(name) {
39230
+ return offlineSharedData(name);
39231
+ }
39000
39232
  };
39001
39233
  }
39002
39234
  });
@@ -39733,7 +39965,7 @@ var init_agents_api_service = __esm({
39733
39965
  if (op === "lease.acquire" || op === "lease.release") {
39734
39966
  refuse("supervision_offline_unsupported", `${op} is not available offline; run it on the platform`);
39735
39967
  }
39736
- if (op === "lifecycle.archive" || op === "lifecycle.delete" || op === "config.set" || op === "secrets.attach") {
39968
+ if (op === "lifecycle.archive" || op === "lifecycle.delete" || op === "config.set" || op === "secrets.attach" || op === "secrets.put") {
39737
39969
  refuse("supervision_offline_unsupported", `${op} is not available offline; run it on the platform`);
39738
39970
  }
39739
39971
  if (op === "agents.directory" || op === "access.request" || op === "access.requests" || op === "access.cancel") {
@@ -39785,7 +40017,9 @@ var init_agents_api_service = __esm({
39785
40017
  return runSummary(await get(`/workflows/${id2}/runs/${encodeURIComponent(String(args2.runId ?? ""))}`));
39786
40018
  case "versions.list":
39787
40019
  return get(`/developer/agents/${id2}/versions${q({
39788
- limit: args2.limit
40020
+ limit: args2.limit,
40021
+ status: Array.isArray(args2.status) ? args2.status.join(",") : args2.status,
40022
+ offset: args2.offset
39789
40023
  })}`);
39790
40024
  case "versions.get":
39791
40025
  return get(`/developer/agents/${id2}/versions/${encodeURIComponent(String(args2.version))}`);
@@ -40660,10 +40894,32 @@ function createWorkflowsRuntime(getApi) {
40660
40894
  assertBoundAgent(api, agentId2, "goals.close");
40661
40895
  return unwrap(await api.closeGoal(goalId, opts), "Workflows.goals.close");
40662
40896
  }
40897
+ },
40898
+ // Lua Apps — off the platform (`lua apps dev`, `lua test webapp`) a route runs as you, so the viewer IS the
40899
+ // CLI's own credential; on the platform the sandbox global routes these through the gateway-sealed viewer.
40900
+ viewer: {
40901
+ async decideApproval(runId, approvalId, decision) {
40902
+ const api = viewerApi(await getApi(), decision.agentId);
40903
+ return unwrap(await api.resolveApproval(runId, approvalId, {
40904
+ decision: decision.decision,
40905
+ ...decision.note !== void 0 ? {
40906
+ note: decision.note
40907
+ } : {},
40908
+ ...decision.expectedFingerprint !== void 0 ? {
40909
+ expectedFingerprint: decision.expectedFingerprint
40910
+ } : {}
40911
+ }), "Workflows.viewer.decideApproval");
40912
+ },
40913
+ async resume(runId, stepId, resumeData, opts = {}) {
40914
+ const api = viewerApi(await getApi(), opts.agentId);
40915
+ return unwrap(await api.resumeRun(runId, stepId, {
40916
+ resumeData
40917
+ }), "Workflows.viewer.resume");
40918
+ }
40663
40919
  }
40664
40920
  };
40665
40921
  }
40666
- var WORKFLOW_START_MAX_WAIT_SECONDS, WORKFLOW_START_CLIENT_DEADLINE_SLACK_MS, CONTROL_UNAVAILABLE_HINT, WorkflowApiError, WORKFLOWS_RUNTIME_MEMBERS, unwrap, isWorkflowIdShaped, assertBoundAgent, pathId, WorkflowApi;
40922
+ var WORKFLOW_START_MAX_WAIT_SECONDS, WORKFLOW_START_CLIENT_DEADLINE_SLACK_MS, CONTROL_UNAVAILABLE_HINT, WorkflowApiError, WORKFLOWS_RUNTIME_MEMBERS, unwrap, isWorkflowIdShaped, viewerApi, assertBoundAgent, pathId, WorkflowApi;
40667
40923
  var init_workflow_api_service = __esm({
40668
40924
  "src/api/workflow.api.service.ts"() {
40669
40925
  "use strict";
@@ -40710,6 +40966,7 @@ var init_workflow_api_service = __esm({
40710
40966
  return res.data;
40711
40967
  }, "unwrap");
40712
40968
  isWorkflowIdShaped = /* @__PURE__ */ __name((v) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v) || /^wfc?_[A-Za-z0-9]/.test(v), "isWorkflowIdShaped");
40969
+ viewerApi = /* @__PURE__ */ __name((api, agentId2) => agentId2 && agentId2 !== api.agentId ? api.forAgent(agentId2) : api, "viewerApi");
40713
40970
  assertBoundAgent = /* @__PURE__ */ __name((api, agentId2, member) => {
40714
40971
  if (agentId2 && agentId2 !== api.agentId) {
40715
40972
  throw new WorkflowApiError("FORBIDDEN", `Workflows.${member}: goals are scoped to the bound agent ${api.agentId}`, 403);
@@ -40717,7 +40974,7 @@ var init_workflow_api_service = __esm({
40717
40974
  }, "assertBoundAgent");
40718
40975
  pathId = /* @__PURE__ */ __name((id2) => encodeURIComponent(id2), "pathId");
40719
40976
  __name(createWorkflowsRuntime, "createWorkflowsRuntime");
40720
- WorkflowApi = class extends HttpClient {
40977
+ WorkflowApi = class _WorkflowApi extends HttpClient {
40721
40978
  static {
40722
40979
  __name(this, "WorkflowApi");
40723
40980
  }
@@ -40728,6 +40985,10 @@ var init_workflow_api_service = __esm({
40728
40985
  this.credential = credential;
40729
40986
  this.agentId = agentId2;
40730
40987
  }
40988
+ /** The same client and credential, bound to another agent's workflow tree (`Workflows.viewer` with `agentId`). */
40989
+ forAgent(agentId2) {
40990
+ return new _WorkflowApi(this.baseUrl, this.credential, agentId2);
40991
+ }
40731
40992
  /** PRO-1434 (main sync): auth rides the renewable request credential — resolve a current bearer per call. */
40732
40993
  async auth() {
40733
40994
  return {
@@ -48692,7 +48953,20 @@ function buildSupervisionAgentsApi(call2) {
48692
48953
  secrets: /* @__PURE__ */ __name10((agentId2) => ({
48693
48954
  attach: /* @__PURE__ */ __name10((requestIds) => call2("secrets.attach", agentId2, {
48694
48955
  requestIds: copyList(requestIds)
48695
- }), "attach")
48956
+ }), "attach"),
48957
+ /**
48958
+ * SW — write ONE secret row into `agentId`'s own Data: the row of `collection` whose `_pk` is `key`, replaced
48959
+ * whole by `value` (flat: string / number / boolean / null fields), created when absent. Needs `act` and the
48960
+ * collection in the grant's `secretWriteCollections`. Answers `{ ok, id, fingerprint }`, never the value; call it
48961
+ * from code (a workflow step, a job), so the secret never passes through a model.
48962
+ */
48963
+ put: /* @__PURE__ */ __name10((collection, key, value3) => call2("secrets.put", agentId2, {
48964
+ collection,
48965
+ key,
48966
+ value: value3 && typeof value3 === "object" && !Array.isArray(value3) ? {
48967
+ ...value3
48968
+ } : value3
48969
+ }), "put")
48696
48970
  }), "secrets")
48697
48971
  };
48698
48972
  }
@@ -50246,9 +50520,9 @@ async function runWorkflowLocallyInner(rawOpts) {
50246
50520
  fn(controller.signal),
50247
50521
  new Promise((_, reject) => {
50248
50522
  timer = setTimeout(() => {
50249
- const failure2 = new StepFailure("TIMEOUT", `step "${stepId}" exceeded its ${wallMs / 1e3} s wall`);
50250
- controller.abort(failure2);
50251
- reject(failure2);
50523
+ const failure3 = new StepFailure("TIMEOUT", `step "${stepId}" exceeded its ${wallMs / 1e3} s wall`);
50524
+ controller.abort(failure3);
50525
+ reject(failure3);
50252
50526
  }, wallMs);
50253
50527
  })
50254
50528
  ]);
@@ -51193,7 +51467,7 @@ async function runWorkflowLocallyInner(rawOpts) {
51193
51467
  ...rows3.values()
51194
51468
  ].filter((r) => r.status === "pending");
51195
51469
  if (stuck.length) {
51196
- const failure2 = {
51470
+ const failure3 = {
51197
51471
  code: "FRONTIER_STALLED",
51198
51472
  message: `no ready step; pending: ${stuck.map((r) => r.stepId).join(", ")}`
51199
51473
  };
@@ -51202,7 +51476,7 @@ async function runWorkflowLocallyInner(rawOpts) {
51202
51476
  return {
51203
51477
  status: "failed",
51204
51478
  exitCode: 4,
51205
- error: failure2,
51479
+ error: failure3,
51206
51480
  ledger,
51207
51481
  timeline
51208
51482
  };
@@ -51216,7 +51490,7 @@ async function runWorkflowLocallyInner(rawOpts) {
51216
51490
  if (opts.schemas?.output) {
51217
51491
  const issues = validateJsonSchema(opts.schemas.output, output);
51218
51492
  if (issues.length) {
51219
- const failure2 = {
51493
+ const failure3 = {
51220
51494
  code: "OUTPUT_SCHEMA_INVALID",
51221
51495
  message: `run output does not match outputSchema: ${issues.join("; ")}`
51222
51496
  };
@@ -51225,7 +51499,7 @@ async function runWorkflowLocallyInner(rawOpts) {
51225
51499
  return {
51226
51500
  status: "failed",
51227
51501
  exitCode: 4,
51228
- error: failure2,
51502
+ error: failure3,
51229
51503
  ledger,
51230
51504
  timeline
51231
51505
  };
@@ -52519,6 +52793,22 @@ var WebAppApi = class extends HttpClient {
52519
52793
  code
52520
52794
  }, {});
52521
52795
  }
52796
+ /** Open a preview of one pushed version (`latest` by default), or get the open one for that version. */
52797
+ async openPreview(webAppId, input) {
52798
+ return this.httpPostOnce(`/developer/web-apps/${this.agentId}/${webAppId}/previews`, input, {});
52799
+ }
52800
+ async listPreviews(webAppId) {
52801
+ const query = webAppId ? `?webAppId=${encodeURIComponent(webAppId)}` : "";
52802
+ return this.httpGet(`/developer/web-apps/${this.agentId}/previews${query}`, {});
52803
+ }
52804
+ /** End a preview: its copy of the data and its recorded effects are deleted. */
52805
+ async closePreview(previewId) {
52806
+ return this.httpPost(`/developer/web-apps/${this.agentId}/previews/${encodeURIComponent(previewId)}/close`, {}, {});
52807
+ }
52808
+ async previewEffects(previewId, after) {
52809
+ const query = after !== void 0 ? `?after=${after}` : "";
52810
+ return this.httpGet(`/developer/web-apps/${this.agentId}/previews/${encodeURIComponent(previewId)}/effects${query}`, {});
52811
+ }
52522
52812
  };
52523
52813
 
52524
52814
  // src/primitives/web-app.handler.ts
@@ -52746,6 +53036,9 @@ var WebAppHandler = class extends BaseVersionedHandler {
52746
53036
  const app = primitive;
52747
53037
  return {
52748
53038
  name: app.name,
53039
+ ...app.title ? {
53040
+ title: app.title
53041
+ } : {},
52749
53042
  ...app.description ? {
52750
53043
  description: app.description
52751
53044
  } : {},
@@ -52893,8 +53186,8 @@ var DecisionHandler = class extends BaseVersionedHandler {
52893
53186
  }
52894
53187
  return revivedLine(stale.name, record ? "was deleted on the server" : "no longer exists on the server", reused);
52895
53188
  }
52896
- async replaceStaleEntry(apiKey, agentId2, name, manifest, failure2) {
52897
- if (failure2.statusCode !== 409 || failure2.code !== DECISION_INACTIVE_CODE) return null;
53189
+ async replaceStaleEntry(apiKey, agentId2, name, manifest, failure3) {
53190
+ if (failure3.statusCode !== 409 || failure3.code !== DECISION_INACTIVE_CODE) return null;
52898
53191
  const api = this.getApi(apiKey, agentId2);
52899
53192
  const namesake = (await this.fetchFromServer(api))?.find((item) => item.name === name && isLive(item));
52900
53193
  const primitive = findPrimitive(manifest, name, PrimitiveKind.DECISION);
@@ -53422,6 +53715,7 @@ async function handleDevRequest(req, ctx) {
53422
53715
  app: {
53423
53716
  id: "local",
53424
53717
  name: ctx.app.name,
53718
+ title: ctx.app.title || ctx.app.branding?.name || void 0,
53425
53719
  description: ctx.app.description,
53426
53720
  version: "0.0.0-dev",
53427
53721
  deployment: 0
@@ -53798,6 +54092,12 @@ var ALIAS_MAP = {
53798
54092
  ],
53799
54093
  aliases: lowerKeys({
53800
54094
  skills: "skill",
54095
+ // Lua Apps: a web app's route executions are logged as `web-route`.
54096
+ webapp: "web-route",
54097
+ webapps: "web-route",
54098
+ "web-app": "web-route",
54099
+ "web-apps": "web-route",
54100
+ "web-routes": "web-route",
53801
54101
  jobs: "job",
53802
54102
  webhooks: "webhook",
53803
54103
  preprocessors: "preprocessor",
@@ -59927,19 +60227,19 @@ init_cli();
59927
60227
  init_constants();
59928
60228
  import { readFileSync as readFileSync12, writeFileSync as writeFileSync9, mkdirSync as mkdirSync7 } from "fs";
59929
60229
  import { dirname as dirname6 } from "path";
59930
- function isPlainObject4(value3) {
60230
+ function isPlainObject5(value3) {
59931
60231
  return typeof value3 === "object" && value3 !== null && !Array.isArray(value3);
59932
60232
  }
59933
- __name(isPlainObject4, "isPlainObject");
60233
+ __name(isPlainObject5, "isPlainObject");
59934
60234
  function readStore2() {
59935
60235
  try {
59936
60236
  const raw = readFileSync12(SANDBOX_STORAGE_FILE, "utf8");
59937
60237
  const parsed = JSON.parse(raw);
59938
60238
  return {
59939
- skillsById: isPlainObject4(parsed.skillsById) ? parsed.skillsById : {},
59940
- preprocessorsById: isPlainObject4(parsed.preprocessorsById) ? parsed.preprocessorsById : {},
59941
- postprocessorsById: isPlainObject4(parsed.postprocessorsById) ? parsed.postprocessorsById : {},
59942
- devicesById: isPlainObject4(parsed.devicesById) ? parsed.devicesById : {}
60239
+ skillsById: isPlainObject5(parsed.skillsById) ? parsed.skillsById : {},
60240
+ preprocessorsById: isPlainObject5(parsed.preprocessorsById) ? parsed.preprocessorsById : {},
60241
+ postprocessorsById: isPlainObject5(parsed.postprocessorsById) ? parsed.postprocessorsById : {},
60242
+ devicesById: isPlainObject5(parsed.devicesById) ? parsed.devicesById : {}
59943
60243
  };
59944
60244
  } catch {
59945
60245
  return {
@@ -65407,7 +65707,9 @@ var ENTITY_SOURCES = /* @__PURE__ */ new Set([
65407
65707
  "webhook",
65408
65708
  "preprocessor",
65409
65709
  "postprocessor",
65410
- "device"
65710
+ "device",
65711
+ // Lua Apps: route executions, one entity per web app (`--type webapp --name <app>`).
65712
+ "web-route"
65411
65713
  ]);
65412
65714
  var NON_ENTITY_SOURCES = new Set(ALL_VALID_SOURCES.filter((s) => !ENTITY_SOURCES.has(s)));
65413
65715
  var FOLLOW_POLL_MS = 2e3;
@@ -65536,7 +65838,7 @@ function renderLogEntry(log, isLast) {
65536
65838
  const icon = getLogIcon(log.subType, logSource);
65537
65839
  const color = getLogColor(log.subType, logSource);
65538
65840
  console.log(color(`${icon} [${timestamp}] ${log.subType.toUpperCase()}`));
65539
- const capitalizedType = logSource ? capitalize(logSource) : "Item";
65841
+ const capitalizedType = logSource ? sourceLabel(logSource) : "Item";
65540
65842
  if (logSource === "user_message" || logSource === "agent_response" || logSource === "agent_error") {
65541
65843
  if (channel) {
65542
65844
  console.log(chalk2.gray(` Channel: ${channel}`));
@@ -65635,6 +65937,10 @@ async function fetchEntitiesByType(apiKey, agentId2, type) {
65635
65937
  const res = await new DeviceApi(BASE_URLS.API, apiKey, agentId2).getDevices();
65636
65938
  return res.data?.devices || [];
65637
65939
  }
65940
+ case "web-route": {
65941
+ const res = await new WebAppApi(BASE_URLS.API, apiKey, agentId2).getWebApps();
65942
+ return res.data?.webApps || [];
65943
+ }
65638
65944
  default:
65639
65945
  return [];
65640
65946
  }
@@ -65803,10 +66109,14 @@ async function nonInteractiveLogs(logsApi, agentId2, apiKey, options) {
65803
66109
  throw CliError.usage(`--name is not applicable for ${filters.logSource} type`, `Usage: lua logs --type ${filters.logSource} (no --name needed)`);
65804
66110
  }
65805
66111
  const entityId = await resolveEntityId(apiKey, agentId2, filters.logSource, options.name);
65806
- if (!entityId) {
65807
- throw CliError.notFound(`${capitalize(filters.logSource ?? "")} "${options.name}" not found`);
66112
+ if (entityId) {
66113
+ filters.primitiveId = entityId;
66114
+ } else if (filters.logSource === "web-route") {
66115
+ writeInfo(`\u2139\uFE0F No web app named "${options.name}" on the agent now; showing logs recorded under that name.`);
66116
+ filters.primitiveName = options.name;
66117
+ } else {
66118
+ throw CliError.notFound(`${sourceLabel(filters.logSource ?? "")} "${options.name}" not found`);
65808
66119
  }
65809
- filters.primitiveId = entityId;
65810
66120
  }
65811
66121
  if (options.userId) {
65812
66122
  filters.userId = options.userId;
@@ -65838,7 +66148,7 @@ async function nonInteractiveLogs(logsApi, agentId2, apiKey, options) {
65838
66148
  pagination: data.pagination
65839
66149
  }, null, 2));
65840
66150
  } else {
65841
- const typeLabel = options.type ? capitalize(options.type) : "All";
66151
+ const typeLabel = options.type ? sourceLabel(options.type) : "All";
65842
66152
  displayLogsCore(data.logs, data.pagination, `\u{1F4CA} ${typeLabel} Logs`);
65843
66153
  writeHintBlock({
65844
66154
  headline: "If you see errors:",
@@ -65925,6 +66235,10 @@ async function filterAndShowLogsInteractive(logsApi, agentId2, apiKey) {
65925
66235
  name: "Devices",
65926
66236
  value: "device"
65927
66237
  },
66238
+ {
66239
+ name: "Web Apps",
66240
+ value: "web-route"
66241
+ },
65928
66242
  new inquirer9.Separator(),
65929
66243
  {
65930
66244
  name: "\u{1F4AC} User Messages",
@@ -65989,10 +66303,10 @@ async function filterAndShowLogsInteractive(logsApi, agentId2, apiKey) {
65989
66303
  continue;
65990
66304
  }
65991
66305
  const entitySource = filterType;
65992
- const capitalizedType = capitalize(entitySource);
66306
+ const capitalizedType = sourceLabel(entitySource);
65993
66307
  const items = await fetchEntitiesByType(apiKey, agentId2, entitySource);
65994
66308
  if (items.length === 0) {
65995
- writeInfo(`\u2139\uFE0F No ${entitySource}s found for this agent.
66309
+ writeInfo(`\u2139\uFE0F No ${capitalizedType.toLowerCase()}s found for this agent.
65996
66310
  `);
65997
66311
  continue;
65998
66312
  }
@@ -66000,7 +66314,7 @@ async function filterAndShowLogsInteractive(logsApi, agentId2, apiKey) {
66000
66314
  {
66001
66315
  type: "list",
66002
66316
  name: "selectedId",
66003
- message: `Select a ${entitySource}:`,
66317
+ message: `Select a ${capitalizedType.toLowerCase()}:`,
66004
66318
  choices: [
66005
66319
  {
66006
66320
  name: `All ${capitalizedType}s`,
@@ -66127,6 +66441,10 @@ function capitalize(str3) {
66127
66441
  return str3.charAt(0).toUpperCase() + str3.slice(1);
66128
66442
  }
66129
66443
  __name(capitalize, "capitalize");
66444
+ function sourceLabel(source) {
66445
+ return source === "web-route" ? "Web app" : capitalize(source);
66446
+ }
66447
+ __name(sourceLabel, "sourceLabel");
66130
66448
  function getLogIcon(subType, logSource) {
66131
66449
  if (logSource === "user_message") {
66132
66450
  return "\u{1F4AC}";
@@ -89401,12 +89719,22 @@ function forgetWebAppInYaml(webAppId, name) {
89401
89719
  return true;
89402
89720
  }
89403
89721
  __name(forgetWebAppInYaml, "forgetWebAppInYaml");
89722
+ var EXIT_1_CODES = /* @__PURE__ */ new Set([
89723
+ "NO_EMAIL_ON_ACCOUNT",
89724
+ "WEB_APP_DELETE_CODE_EMAIL_FAILED"
89725
+ ]);
89726
+ var isExit1Code = /* @__PURE__ */ __name((code) => code !== void 0 && (code.startsWith("WEB_APP_DELETE_CODE_") || EXIT_1_CODES.has(code)), "isExit1Code");
89404
89727
  function failure(response, fallback) {
89405
89728
  const code = response.error?.code;
89406
- return new CliError("api", `${response.error?.message ?? fallback}${code ? ` (${code})` : ""}`, {
89407
- statusCode: response.error?.statusCode,
89408
- serverCode: code
89409
- });
89729
+ const message = `${response.error?.message ?? fallback}${code ? ` (${code})` : ""}`;
89730
+ const status = response.error?.statusCode;
89731
+ if (isExit1Code(code) && status !== 401 && status !== 403) {
89732
+ return new CliError("api", message, {
89733
+ statusCode: status,
89734
+ serverCode: code
89735
+ });
89736
+ }
89737
+ return CliError.fromStatus(status, message, void 0, apiErrorDetail(response.error));
89410
89738
  }
89411
89739
  __name(failure, "failure");
89412
89740
  function printPreview(p) {
@@ -89525,6 +89853,192 @@ async function appsDeleteCommand(name, opts = {}) {
89525
89853
  }
89526
89854
  __name(appsDeleteCommand, "appsDeleteCommand");
89527
89855
 
89856
+ // src/commands/apps-preview.ts
89857
+ init_dist();
89858
+ init_cli();
89859
+ init_write_info();
89860
+ init_files();
89861
+ init_cli_error();
89862
+ init_analytics();
89863
+ init_request_credential();
89864
+ init_constants();
89865
+ var PREVIEW_ID = /^[a-z2-7]{8}$/;
89866
+ var TTL_MAX_HOURS = 168;
89867
+ var DISPLAY_MAX = 200;
89868
+ var EFFECT_PAGES_MAX = 20;
89869
+ function forTerminal(value3, max = DISPLAY_MAX) {
89870
+ const text2 = String(value3 ?? "").replace(/[\u0000-\u001f\u007f-\u009f]/g, " ");
89871
+ return text2.length > max ? `${text2.slice(0, max - 1)}\u2026` : text2;
89872
+ }
89873
+ __name(forTerminal, "forTerminal");
89874
+ function printJson5(value3) {
89875
+ console.log(
89876
+ // eslint-disable-next-line no-control-regex
89877
+ JSON.stringify(value3, null, 2).replace(/[\u007f-\u009f]/g, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`)
89878
+ );
89879
+ }
89880
+ __name(printJson5, "printJson");
89881
+ function parseTtlHours(raw) {
89882
+ const m = /^(\d+(?:\.\d+)?)(h|d)?$/i.exec(raw.trim());
89883
+ const hours = m ? Number(m[1]) * (m[2]?.toLowerCase() === "d" ? 24 : 1) : NaN;
89884
+ if (!Number.isFinite(hours) || hours <= 0 || hours > TTL_MAX_HOURS) {
89885
+ throw CliError.usage(`--ttl takes hours (24, 24h) or days (2d), at most ${TTL_MAX_HOURS} hours; got ${JSON.stringify(raw)}.`);
89886
+ }
89887
+ return hours;
89888
+ }
89889
+ __name(parseTtlHours, "parseTtlHours");
89890
+ function failure2(response, fallback) {
89891
+ const code = response.error?.code;
89892
+ const message = forTerminal(response.error?.message ?? fallback);
89893
+ return CliError.fromStatus(response.error?.statusCode, `${message}${code ? ` (${forTerminal(code, 80)})` : ""}`, void 0, apiErrorDetail(response.error));
89894
+ }
89895
+ __name(failure2, "failure");
89896
+ function when3(iso) {
89897
+ const d = new Date(iso);
89898
+ return Number.isNaN(d.getTime()) ? forTerminal(iso, 40) : d.toLocaleString("en-GB", {
89899
+ day: "numeric",
89900
+ month: "short",
89901
+ hour: "2-digit",
89902
+ minute: "2-digit"
89903
+ });
89904
+ }
89905
+ __name(when3, "when");
89906
+ function printOpened(p) {
89907
+ writeSuccess(`${p.created === false ? "\u2705 Open preview of" : "\u2705 Preview of"} ${forTerminal(p.name)} ${forTerminal(p.version)} (until ${when3(p.expiresAt)})`);
89908
+ writeInfo(` Open: ${forTerminal(p.openUrl, 500)}`);
89909
+ writeInfo(" Data writes go to a copy that is deleted when the preview ends; emails and messages are recorded, not sent; fetch calls fail (TEST_EGRESS_BLOCKED).");
89910
+ writeInfo(" Anyone who can edit this agent can open the link.");
89911
+ const id2 = forTerminal(p.id, 16);
89912
+ writeInfo(` End it now: lua apps preview --close ${id2} \xB7 What it recorded: lua apps preview --effects ${id2}`);
89913
+ }
89914
+ __name(printOpened, "printOpened");
89915
+ var TARGET_KEYS = [
89916
+ "url",
89917
+ "to",
89918
+ "channel",
89919
+ "tool",
89920
+ "collection"
89921
+ ];
89922
+ var RECIPIENT_KEYS = [
89923
+ "email",
89924
+ "phoneNumber",
89925
+ "userId",
89926
+ "conversationId"
89927
+ ];
89928
+ function effectTarget(request2) {
89929
+ const req = request2 && typeof request2 === "object" ? request2 : {};
89930
+ if (typeof req.surface === "string" && req.surface) {
89931
+ return typeof req.code === "string" && req.code ? `${req.surface} (${req.code})` : req.surface;
89932
+ }
89933
+ for (const key of TARGET_KEYS) {
89934
+ const value3 = req[key];
89935
+ if (typeof value3 === "string" && value3) return value3;
89936
+ if (value3 && typeof value3 === "object") {
89937
+ const to = value3;
89938
+ const hit = RECIPIENT_KEYS.map((k) => to[k]).find((v) => typeof v === "string" && v !== "");
89939
+ if (hit) return hit;
89940
+ }
89941
+ }
89942
+ return "";
89943
+ }
89944
+ __name(effectTarget, "effectTarget");
89945
+ function describeEffect(e) {
89946
+ const target = effectTarget(e.request);
89947
+ const site = e.site ? ` (${forTerminal(e.site, 40)})` : "";
89948
+ return ` #${forTerminal(e.seq, 12)} ${forTerminal(e.kind, 40)}${site}${target ? ` ${forTerminal(target)}` : ""} ${when3(e.at)}`;
89949
+ }
89950
+ __name(describeEffect, "describeEffect");
89951
+ async function appsPreviewCommand(name, opts = {}) {
89952
+ return withErrorHandling(async () => {
89953
+ const modes = [
89954
+ opts.list,
89955
+ opts.close,
89956
+ opts.effects
89957
+ ].filter((m) => m !== void 0 && m !== false).length;
89958
+ if (modes > 1) throw CliError.usage("Use one of --list, --close <id> or --effects <id> at a time.");
89959
+ if (modes === 0 && !name) {
89960
+ throw CliError.usage("Name the web app to preview.", "lua apps preview <name> \xB7 lua apps preview --list");
89961
+ }
89962
+ if (name && !WEB_APP_NAME_PATTERN.test(name)) throw CliError.usage(`${JSON.stringify(name)} is not a web app name.`);
89963
+ for (const id2 of [
89964
+ opts.close,
89965
+ opts.effects
89966
+ ]) {
89967
+ if (id2 !== void 0 && !PREVIEW_ID.test(id2)) {
89968
+ throw CliError.usage(`${JSON.stringify(id2)} is not a preview id (8 characters, as \`--list\` shows).`);
89969
+ }
89970
+ }
89971
+ const ttlHours = opts.ttl !== void 0 ? parseTtlHours(opts.ttl) : void 0;
89972
+ const agentId2 = opts.agent ?? readYamlConfig()?.agent?.agentId;
89973
+ if (!agentId2) throw CliError.usage("No agent: run this in an agent project, or pass --agent <agentId>.");
89974
+ const api = new WebAppApi(BASE_URLS.API, await resolveRequestCredential(), agentId2);
89975
+ const findApp = /* @__PURE__ */ __name(async (appName) => {
89976
+ const list = await api.getWebApps();
89977
+ if (!list.success) throw failure2(list, "Could not list the web apps of the agent.");
89978
+ const app2 = list.data?.webApps.find((a) => a.name === appName);
89979
+ if (!app2) throw CliError.notFound(`No web app named ${JSON.stringify(appName)} on agent ${agentId2}.`, `Push it first: lua push webapp --name ${appName}`);
89980
+ return app2;
89981
+ }, "findApp");
89982
+ if (opts.list) {
89983
+ const res2 = await api.listPreviews(name ? (await findApp(name)).id : void 0);
89984
+ if (!res2.success || !res2.data) throw failure2(res2, "Could not list the previews.");
89985
+ if (opts.json) return printJson5(res2.data.previews);
89986
+ if (!res2.data.previews.length) return writeInfo(`No open previews ${name ? `of ${name}` : "on this agent"}.`);
89987
+ for (const p of res2.data.previews) {
89988
+ writeInfo(` ${forTerminal(p.id, 16)} ${forTerminal(p.name)} ${forTerminal(p.version)} until ${when3(p.expiresAt)} ${forTerminal(p.openUrl, 500)}`);
89989
+ }
89990
+ return;
89991
+ }
89992
+ if (opts.close) {
89993
+ const res2 = await api.closePreview(opts.close);
89994
+ if (!res2.success) throw failure2(res2, "Could not end the preview.");
89995
+ if (opts.json) return printJson5(res2.data);
89996
+ writeSuccess(`\u2705 Preview ${opts.close} ended; its copy of the data and its recorded effects are deleted.`);
89997
+ trackEvent("cli_apps_preview_closed", {});
89998
+ return;
89999
+ }
90000
+ if (opts.effects) {
90001
+ const effects = [];
90002
+ let after;
90003
+ for (let page = 0; page < EFFECT_PAGES_MAX; page++) {
90004
+ const res2 = await api.previewEffects(opts.effects, after);
90005
+ if (!res2.success || !res2.data) throw failure2(res2, "Could not read what the preview recorded.");
90006
+ effects.push(...res2.data.effects);
90007
+ after = res2.data.nextAfter;
90008
+ if (after === void 0) break;
90009
+ }
90010
+ const truncated = after !== void 0;
90011
+ const cut2 = `Only the first ${effects.length} recorded effects are shown; the preview recorded more.`;
90012
+ if (opts.json) {
90013
+ if (truncated) console.error(cut2);
90014
+ return printJson5(effects);
90015
+ }
90016
+ if (!effects.length) return writeInfo("The preview has recorded nothing so far: no email or message.");
90017
+ writeInfo(`Recorded instead of sent (${effects.length}${truncated ? "+" : ""}):`);
90018
+ for (const e of effects) writeInfo(describeEffect(e));
90019
+ if (truncated) writeInfo(cut2);
90020
+ return;
90021
+ }
90022
+ const app = await findApp(name);
90023
+ const res = await api.openPreview(app.id, {
90024
+ ...opts.version ? {
90025
+ version: opts.version
90026
+ } : {},
90027
+ ...ttlHours !== void 0 ? {
90028
+ ttlHours
90029
+ } : {}
90030
+ });
90031
+ if (!res.success || !res.data) throw failure2(res, "Could not open the preview.");
90032
+ if (opts.json) return printJson5(res.data);
90033
+ printOpened(res.data);
90034
+ trackEvent("cli_apps_preview_opened", {
90035
+ created: res.data.created !== false,
90036
+ withVersion: Boolean(opts.version)
90037
+ });
90038
+ }, "apps preview");
90039
+ }
90040
+ __name(appsPreviewCommand, "appsPreviewCommand");
90041
+
89528
90042
  // src/commands/browser.ts
89529
90043
  init_cli();
89530
90044
  init_hints();
@@ -89775,10 +90289,10 @@ async function browserContextOf(options) {
89775
90289
  };
89776
90290
  }
89777
90291
  __name(browserContextOf, "browserContextOf");
89778
- function printJson5(value3) {
90292
+ function printJson6(value3) {
89779
90293
  console.log(JSON.stringify(value3, null, 2));
89780
90294
  }
89781
- __name(printJson5, "printJson");
90295
+ __name(printJson6, "printJson");
89782
90296
  function logsHint() {
89783
90297
  writeNextStep({
89784
90298
  command: BROWSER_LOGS_HINT,
@@ -89811,7 +90325,7 @@ async function runBrowserRead(ctx, url, options) {
89811
90325
  json: !!options.json
89812
90326
  });
89813
90327
  if (options.json) {
89814
- printJson5(output);
90328
+ printJson6(output);
89815
90329
  return output;
89816
90330
  }
89817
90331
  if (output.error) {
@@ -89906,7 +90420,7 @@ async function runBrowserTask(ctx, task, options, out = terminalRunOutput()) {
89906
90420
  environment: ctx.environment,
89907
90421
  json: !!options.json
89908
90422
  });
89909
- if (options.json) printJson5({
90423
+ if (options.json) printJson6({
89910
90424
  id: view.id,
89911
90425
  status: "cancelled",
89912
90426
  cancelled
@@ -89932,7 +90446,7 @@ async function runBrowserTask(ctx, task, options, out = terminalRunOutput()) {
89932
90446
  json: !!options.json
89933
90447
  });
89934
90448
  if (options.json) {
89935
- printJson5(view);
90449
+ printJson6(view);
89936
90450
  return {
89937
90451
  view,
89938
90452
  cancelled: false
@@ -90353,6 +90867,8 @@ Examples:
90353
90867
  $ lua logs --type skill --name mySkill --limit 10 Skill-specific logs
90354
90868
  $ lua logs --type job --name healthCheck --json JSON output for CI
90355
90869
  $ lua logs --type mcp View MCP tool execution logs
90870
+ $ lua logs --type webapp --name ops-dashboard A web app's route runs (console output, errors)
90871
+ $ lua logs --execution-id <id> One route call (the id is in X-Lua-Execution-Id)
90356
90872
  $ lua logs --user-id user-123 View all logs for a user
90357
90873
  $ lua logs --user-id user-123 --json > user-logs.json Export user logs
90358
90874
  $ lua logs --channel integration:lua_crm Isolate one integration's wake-up turns
@@ -90974,9 +91490,25 @@ Examples:
90974
91490
  $ lua version delete v3 --ci Refused: needs --force (usage error, exit 2)
90975
91491
  $ lua version delete v3 --ci --force Delete non-interactively
90976
91492
  `).action((version, opts) => versionDeleteCommand(version, opts));
90977
- const appsGroup = program2.command("apps").description("\u{1F5A5}\uFE0F Create, develop and delete web apps of this agent");
91493
+ const appsGroup = program2.command("apps").description("\u{1F5A5}\uFE0F Create, develop, preview and delete web apps of this agent");
90978
91494
  appsGroup.command("new <name>").description("Scaffold a web app in src/apps/<name> (routes + a Vite/React page) and list it on the agent").action((name) => appsNewCommand(name));
90979
91495
  appsGroup.command("dev <name>").description("Run a web app locally: pages on Vite with hot reload, routes in the local sandbox as you").option("--port <port>", "Port for the dev server (default: Vite's)").action((name, opts) => appsDevCommand(name, opts));
91496
+ appsGroup.command("preview [name]").description("Open a pushed web app version before it is live (a temporary copy of the data, nothing sent)").option("--version <version>", "The pushed version to open, or 'latest' (default)").option("--ttl <hours>", "How long the preview lives: hours (24, 24h) or days (2d), at most 168 hours (default 24)").option("--list", "List the previews that have not ended: of the agent, or of the web app you name").option("--close <id>", "End a preview now: its copy of the data and its recorded effects are deleted").option("--effects <id>", "What the preview recorded instead of sending (emails, messages)").option("--agent <agentId>", "The agent the web app belongs to (default: this project\u2019s agent)").option("--json", "Print JSON").addHelpText("after", `
91497
+ A preview opens in Lua Workspace from the link it prints, on its own address.
91498
+ Its routes write to a copy of the agent's data that is deleted when the
91499
+ preview ends; emails and messages are recorded, not sent, and fetch calls
91500
+ fail with TEST_EGRESS_BLOCKED. Anyone who can edit the agent can open the link. Opening a preview of a
91501
+ version that already has an open one gives you that one. --json prints the
91502
+ server's data unchanged (control characters escaped), for scripts.
91503
+
91504
+ Examples:
91505
+ $ lua apps preview ops-dashboard Preview the latest push
91506
+ $ lua apps preview ops-dashboard --version 1.0.4 --ttl 2d
91507
+ $ lua apps preview --list Every open preview on the agent
91508
+ $ lua apps preview ops-dashboard --list Only that app's
91509
+ $ lua apps preview --effects p7k2m3xq
91510
+ $ lua apps preview --close p7k2m3xq
91511
+ `).action((name, opts) => appsPreviewCommand(name, opts));
90980
91512
  appsGroup.command("delete <name>").description("Delete a web app for good (confirmed by a code emailed to you)").option("--agent <agentId>", "The agent the web app belongs to (default: this project\u2019s agent)").option("--code <code>", "The 6-digit code from the email (non-interactive second step)").addHelpText("after", `
90981
91513
  Permanent: the web app and every version of it are removed, the live agent
90982
91514
  version stops listing it, and no rollback brings it back. Agent data stays.