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/api-exports.d.ts +191 -35
- package/dist/api-exports.js +321 -23
- package/dist/api-exports.js.map +1 -1
- package/dist/index.js +598 -66
- package/dist/index.js.map +1 -1
- package/dist/voice/test/index.d.ts +18 -18
- package/dist/workflow-builder.js +177 -17
- package/dist/workflow-builder.js.map +1 -1
- package/docs/README.md +3 -3
- package/docs/api/Agents.md +51 -9
- package/docs/api/Data.md +51 -0
- package/docs/api/Workflows.md +1 -0
- package/docs/workflows/schedules.md +1 -1
- package/package.json +1 -1
- package/template/package.json +1 -1
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
|
|
4234
|
-
const date =
|
|
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 (!
|
|
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 (!
|
|
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:
|
|
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|
|
|
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(
|
|
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
|
|
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
|
-
|
|
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) =>
|
|
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:
|
|
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
|
|
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) &&
|
|
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(
|
|
19380
|
-
__name6(
|
|
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
|
|
23773
|
-
const icon =
|
|
23774
|
-
const label2 =
|
|
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
|
|
23783
|
-
const icon =
|
|
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
|
|
35225
|
+
const failure3 = err;
|
|
35042
35226
|
const guardText = /* @__PURE__ */ __name((e) => typeof e.text === "string" ? e.text.replace(/^\[plugin [^\]]*\]\s*/, "") : "", "guardText");
|
|
35043
|
-
const guard =
|
|
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
|
|
50250
|
-
controller.abort(
|
|
50251
|
-
reject(
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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,
|
|
52897
|
-
if (
|
|
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
|
|
60230
|
+
function isPlainObject5(value3) {
|
|
59931
60231
|
return typeof value3 === "object" && value3 !== null && !Array.isArray(value3);
|
|
59932
60232
|
}
|
|
59933
|
-
__name(
|
|
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:
|
|
59940
|
-
preprocessorsById:
|
|
59941
|
-
postprocessorsById:
|
|
59942
|
-
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 ?
|
|
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 (
|
|
65807
|
-
|
|
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 ?
|
|
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 =
|
|
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 ${
|
|
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 ${
|
|
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
|
-
|
|
89407
|
-
|
|
89408
|
-
|
|
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
|
|
90292
|
+
function printJson6(value3) {
|
|
89779
90293
|
console.log(JSON.stringify(value3, null, 2));
|
|
89780
90294
|
}
|
|
89781
|
-
__name(
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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.
|