lua-cli 3.54.0 → 3.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -862,6 +862,8 @@ import { z as z5 } from "zod";
862
862
  import { z as z6 } from "zod";
863
863
  import { z as z7 } from "zod";
864
864
  import { z as z8 } from "zod";
865
+ import { z as z9 } from "zod";
866
+ import { z as z10 } from "zod";
865
867
  function isChannelConversationChannel(channel) {
866
868
  return !!channel && CHANNEL_CONVERSATION_CHANNELS.includes(channel);
867
869
  }
@@ -4263,7 +4265,7 @@ function mergeRichPartMirrorMessages(messages, sameTurnGroup) {
4263
4265
  break;
4264
4266
  }
4265
4267
  if (folded) continue;
4266
- const content = message.content.filter((part) => part.type !== "data-lua-tool-step");
4268
+ const content = message.content.filter((part) => part.type !== "data-lua-tool-step" && part.type !== "data-lua-reasoning-time" && part.type !== "data-lua-reply-timing");
4267
4269
  if (content.length === 0) continue;
4268
4270
  if (content.length !== message.content.length) {
4269
4271
  merged.push({
@@ -4319,6 +4321,57 @@ function foldRichPartsIntoMessages(messages, records, makeMessage, sameTurnGroup
4319
4321
  while (next < synthetic.length) combined.push(synthetic[next++].message);
4320
4322
  return mergeRichPartMirrorMessages(combined, sameTurnGroup);
4321
4323
  }
4324
+ function readStoredReplyVersion(metadata) {
4325
+ const md = metadata && typeof metadata === "object" ? metadata : void 0;
4326
+ const value3 = md?.replyVersion;
4327
+ const stamp = value3 && typeof value3.group === "string" && value3.group && typeof value3.index === "number" && Number.isInteger(value3.index) && value3.index >= 1 ? {
4328
+ group: value3.group,
4329
+ index: value3.index
4330
+ } : null;
4331
+ return {
4332
+ stamp,
4333
+ inactive: md?.inactiveVersion === true
4334
+ };
4335
+ }
4336
+ function applyReplyVersions(messages, markOf, includeVersions) {
4337
+ const blocks = [];
4338
+ const indicesByGroup = /* @__PURE__ */ new Map();
4339
+ let current = null;
4340
+ for (const message of messages) {
4341
+ const mark = markOf(message);
4342
+ if (message.role === "user") {
4343
+ current = mark?.stamp ? {
4344
+ ...mark.stamp,
4345
+ inactive: mark.inactive
4346
+ } : null;
4347
+ if (current) {
4348
+ const seen = indicesByGroup.get(current.group) ?? /* @__PURE__ */ new Set();
4349
+ seen.add(current.index);
4350
+ indicesByGroup.set(current.group, seen);
4351
+ }
4352
+ }
4353
+ blocks.push(current);
4354
+ }
4355
+ const out = [];
4356
+ messages.forEach((message, i) => {
4357
+ const block = blocks[i];
4358
+ if (!block) {
4359
+ out.push(message);
4360
+ return;
4361
+ }
4362
+ if (block.inactive && !includeVersions) return;
4363
+ out.push({
4364
+ ...message,
4365
+ replyVersion: {
4366
+ group: block.group,
4367
+ index: block.index,
4368
+ total: indicesByGroup.get(block.group)?.size ?? 1,
4369
+ active: !block.inactive
4370
+ }
4371
+ });
4372
+ });
4373
+ return out;
4374
+ }
4322
4375
  function text(item, field, index, required) {
4323
4376
  const value3 = item[field];
4324
4377
  if (value3 === void 0 && !required) return void 0;
@@ -7804,7 +7857,7 @@ function parseWith2(schema, body) {
7804
7857
  problems: r.error.issues.map((i) => `${i.path.join(".")} ${i.message}`)
7805
7858
  };
7806
7859
  }
7807
- 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, AGENT_IDENTITY_ERRORS, 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, label, labels, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingMatchScreenSchema, 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_AGENT_PANE_MARKER, WEB_APP_CHAT_TEXT_MAX_CHARS, WEB_APP_CHAT_CONTEXT_MAX_BYTES, WEB_APP_CHAT_PATH_MAX_CHARS, WEB_APP_CHAT_HISTORY_DEFAULT_LIMIT, WEB_APP_CHAT_HISTORY_MAX_LIMIT, WEB_APP_CHAT_CONTROL_CHARS, WEB_APP_CHAT_APP_NAME_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, WEB_APP_HEALTH_KEY_TTL_SECONDS, WEB_APP_HEALTH_MIN_FAILURES, WEB_APP_HEALTH_MIN_FAILURE_RATIO, 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_OUT_OF_ACTIONS, 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, PLAN_KEYS, PLAN_LIMIT_KEYS, PLAN_FEATURE_KEYS, BILLING_ENGINES, BILLING_VERSION_KINDS, planKeyString, planPriceSchema, limitsShape, featuresShape, billingPlanSchema, topUpPackSchema, PLAN_REFUSAL_CODES, billingSignupConfigSchema, billingVersionDraftPatchSchema, billingVersionDraftCreateSchema, assignBillingPlanSchema, billingActionRatesSchema, BILLING_MOVE_DEFAULT_NOTICE_DAYS, keyString, billingMoveDraftSchema, billingMoveOrgDateSchema;
7860
+ 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, INTEGRATION_PASSTHROUGH_MAX_BASE64_RESPONSE_BYTES, 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, AGENT_IDENTITY_ERRORS, 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, label, labels, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingMatchScreenSchema, 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_AGENT_PANE_MARKER, WEB_APP_UI_VERSION_PATTERN, WEB_APP_UI_VERSION_MAX_CHARS, WEB_APP_CHAT_TEXT_MAX_CHARS, WEB_APP_CHAT_CONTEXT_MAX_BYTES, WEB_APP_CHAT_PATH_MAX_CHARS, WEB_APP_CHAT_HISTORY_DEFAULT_LIMIT, WEB_APP_CHAT_HISTORY_MAX_LIMIT, WEB_APP_CHAT_CONTROL_CHARS, WEB_APP_CHAT_APP_NAME_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, WEB_APP_HEALTH_KEY_TTL_SECONDS, WEB_APP_HEALTH_MIN_FAILURES, WEB_APP_HEALTH_MIN_FAILURE_RATIO, 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_OUT_OF_ACTIONS, 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, opaque, summaryHash, defaultWebAppBriefRequestSchema, DEFAULT_WEB_APP_BRIEF_SOURCES, defaultWebAppBriefUsageSchema, briefResponseBase, defaultWebAppBriefResponseSchema, defaultWebAppBriefKeyRequestSchema, defaultWebAppBriefKeyResponseSchema, DEFAULT_WEB_APP_BRIEF_ERROR_CODES, defaultWebAppBriefErrorSchema, SHARED_DATA_NAME_RE, SHARED_DATA_OWNER_PREFIX, SHARED_DATA_ERRORS, PLAN_KEYS, PLAN_LIMIT_KEYS, PLAN_FEATURE_KEYS, BILLING_ENGINES, BILLING_VERSION_KINDS, planKeyString, planPriceSchema, limitsShape, featuresShape, billingPlanSchema, topUpPackSchema, PLAN_REFUSAL_CODES, billingSignupConfigSchema, billingVersionDraftPatchSchema, billingVersionDraftCreateSchema, EXISTING_SUBSCRIPTION_POLICIES, billingVersionEditSchema, assignBillingPlanSchema, billingActionRatesSchema, BILLING_MOVE_DEFAULT_NOTICE_DAYS, BILLING_MOVE_NOTICE_KINDS, BILLING_MOVE_WHEN, keyString, emailTextSchema, billingMoveDraftSchema, billingMovePatchSchema, billingMoveOrgDateSchema, billingMoveEmailPreviewSchema, DWA_BUILD_MAX_BUNDLE_BYTES, sha256Hex, defaultWebAppBundleAssetSchema, defaultWebAppBundleToolSchema, defaultWebAppBundleSchema;
7808
7861
  var init_dist = __esm({
7809
7862
  "../shared-types/dist/index.mjs"() {
7810
7863
  "use strict";
@@ -8026,6 +8079,7 @@ var init_dist = __esm({
8026
8079
  "GET",
8027
8080
  "HEAD"
8028
8081
  ];
8082
+ INTEGRATION_PASSTHROUGH_MAX_BASE64_RESPONSE_BYTES = 25 * 1024 * 1024;
8029
8083
  __name(isIntegrationPassthroughReadMethod, "isIntegrationPassthroughReadMethod");
8030
8084
  __name3(isIntegrationPassthroughReadMethod, "isIntegrationPassthroughReadMethod");
8031
8085
  __name(connectionPermissionsAllowWrite, "connectionPermissionsAllowWrite");
@@ -10131,6 +10185,10 @@ var init_dist = __esm({
10131
10185
  __name3(citationDedupeKeys, "citationDedupeKeys");
10132
10186
  __name(foldRichPartsIntoMessages, "foldRichPartsIntoMessages");
10133
10187
  __name3(foldRichPartsIntoMessages, "foldRichPartsIntoMessages");
10188
+ __name(readStoredReplyVersion, "readStoredReplyVersion");
10189
+ __name3(readStoredReplyVersion, "readStoredReplyVersion");
10190
+ __name(applyReplyVersions, "applyReplyVersions");
10191
+ __name3(applyReplyVersions, "applyReplyVersions");
10134
10192
  WORK_ITEMS_KEY = "_luaWorkItems";
10135
10193
  MAX_WORK_ITEMS = 100;
10136
10194
  LIMITS = {
@@ -12926,6 +12984,8 @@ listed here; never invent a target.`;
12926
12984
  WEB_APP_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
12927
12985
  WEB_APP_TITLE_MAX_CHARS = 80;
12928
12986
  WEB_APP_AGENT_PANE_MARKER = "__lua_agent_pane_v1__";
12987
+ WEB_APP_UI_VERSION_PATTERN = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
12988
+ WEB_APP_UI_VERSION_MAX_CHARS = 64;
12929
12989
  __name(agentPaneEnabled, "agentPaneEnabled");
12930
12990
  __name3(agentPaneEnabled, "agentPaneEnabled");
12931
12991
  __name(webAppChatThreadSuffix, "webAppChatThreadSuffix");
@@ -13766,6 +13826,74 @@ listed here; never invent a target.`;
13766
13826
  }).strict().optional(),
13767
13827
  timeout: customMcpTimeoutSchema.optional()
13768
13828
  }).strict();
13829
+ opaque = z7.record(z7.unknown());
13830
+ summaryHash = z7.string().regex(/^[0-9a-f]{64}$/);
13831
+ defaultWebAppBriefRequestSchema = z7.object({
13832
+ agentId: z7.string().min(1).max(200),
13833
+ orgId: z7.string().min(1).max(200).optional(),
13834
+ /** A rebuild: the brief the app was built from. The new brief keeps its entity, fields and statuses. */
13835
+ previous: z7.object({
13836
+ brief: opaque
13837
+ }).optional(),
13838
+ /**
13839
+ * Another agent's brief (same template id + version) and the `summaryHash` it was made from. Used without a model
13840
+ * call only when the hash equals this agent's, its schema version is current and it is valid here; else ignored.
13841
+ */
13842
+ reuse: z7.object({
13843
+ brief: opaque,
13844
+ summaryHash
13845
+ }).optional()
13846
+ });
13847
+ DEFAULT_WEB_APP_BRIEF_SOURCES = [
13848
+ "model",
13849
+ "fallback",
13850
+ "reused",
13851
+ "previous"
13852
+ ];
13853
+ defaultWebAppBriefUsageSchema = z7.object({
13854
+ inputTokens: z7.number().nonnegative(),
13855
+ outputTokens: z7.number().nonnegative(),
13856
+ cacheReadTokens: z7.number().nonnegative(),
13857
+ cacheWriteTokens: z7.number().nonnegative()
13858
+ });
13859
+ briefResponseBase = z7.object({
13860
+ source: z7.enum(DEFAULT_WEB_APP_BRIEF_SOURCES),
13861
+ brief: opaque,
13862
+ names: opaque,
13863
+ capabilitySignature: z7.string().min(1),
13864
+ model: z7.string().optional(),
13865
+ usage: defaultWebAppBriefUsageSchema,
13866
+ costUsd: z7.number().nonnegative()
13867
+ });
13868
+ defaultWebAppBriefResponseSchema = z7.discriminatedUnion("reusable", [
13869
+ briefResponseBase.extend({
13870
+ reusable: z7.literal(true),
13871
+ summaryHash
13872
+ }),
13873
+ briefResponseBase.extend({
13874
+ reusable: z7.literal(false)
13875
+ })
13876
+ ]);
13877
+ defaultWebAppBriefKeyRequestSchema = z7.object({
13878
+ agentId: z7.string().min(1).max(200)
13879
+ });
13880
+ defaultWebAppBriefKeyResponseSchema = z7.object({
13881
+ summaryHash,
13882
+ schemaVersion: z7.number().int().positive()
13883
+ });
13884
+ DEFAULT_WEB_APP_BRIEF_ERROR_CODES = [
13885
+ "AGENT_NOT_FOUND",
13886
+ "BRIEF_INVALID",
13887
+ "BRIEF_UNAVAILABLE"
13888
+ ];
13889
+ defaultWebAppBriefErrorSchema = z7.object({
13890
+ code: z7.enum(DEFAULT_WEB_APP_BRIEF_ERROR_CODES),
13891
+ message: z7.string().optional(),
13892
+ problems: z7.array(z7.string()).optional(),
13893
+ model: z7.string().optional(),
13894
+ usage: defaultWebAppBriefUsageSchema.optional(),
13895
+ costUsd: z7.number().nonnegative().optional()
13896
+ });
13769
13897
  __name(maskMcpServerHeaders, "maskMcpServerHeaders");
13770
13898
  __name3(maskMcpServerHeaders, "maskMcpServerHeaders");
13771
13899
  SHARED_DATA_NAME_RE = /^[A-Za-z0-9_.-]{1,128}$/;
@@ -13857,63 +13985,63 @@ listed here; never invent a target.`;
13857
13985
  "catalog",
13858
13986
  "custom"
13859
13987
  ];
13860
- planKeyString = z7.string().regex(/^[a-z0-9][a-z0-9-]{0,47}$/, "lowercase letters, digits and dashes");
13861
- planPriceSchema = z7.object({
13862
- amountUsd: z7.number().nonnegative(),
13863
- interval: z7.enum([
13988
+ planKeyString = z8.string().regex(/^[a-z0-9][a-z0-9-]{0,47}$/, "lowercase letters, digits and dashes");
13989
+ planPriceSchema = z8.object({
13990
+ amountUsd: z8.number().nonnegative(),
13991
+ interval: z8.enum([
13864
13992
  "month",
13865
13993
  "year"
13866
13994
  ]),
13867
- per: z7.enum([
13995
+ per: z8.enum([
13868
13996
  "workspace",
13869
13997
  "seat"
13870
13998
  ])
13871
13999
  }).strict();
13872
14000
  limitsShape = Object.fromEntries(PLAN_LIMIT_KEYS.map((k) => [
13873
14001
  k,
13874
- z7.number().int().nonnegative().nullable().optional()
14002
+ z8.number().int().nonnegative().nullable().optional()
13875
14003
  ]));
13876
14004
  featuresShape = Object.fromEntries(PLAN_FEATURE_KEYS.map((k) => [
13877
14005
  k,
13878
- z7.boolean().optional()
14006
+ z8.boolean().optional()
13879
14007
  ]));
13880
- billingPlanSchema = z7.object({
14008
+ billingPlanSchema = z8.object({
13881
14009
  key: planKeyString,
13882
- name: z7.string().min(1).max(80),
14010
+ name: z8.string().min(1).max(80),
13883
14011
  /** Absent = a workspace plan. An agent-team plan prices a hired team; it sets no limits or features. */
13884
- kind: z7.enum([
14012
+ kind: z8.enum([
13885
14013
  "workspace",
13886
14014
  "agent-team"
13887
14015
  ]).optional(),
13888
- tagline: z7.string().max(200).optional(),
13889
- visible: z7.boolean(),
13890
- order: z7.number().int(),
14016
+ tagline: z8.string().max(200).optional(),
14017
+ visible: z8.boolean(),
14018
+ order: z8.number().int(),
13891
14019
  price: planPriceSchema.nullable(),
13892
- stripeProductId: z7.string().optional(),
13893
- stripePriceId: z7.string().optional(),
13894
- actionsPerPeriod: z7.number().int().nonnegative(),
13895
- trialDays: z7.number().int().nonnegative().optional(),
13896
- limits: z7.object(limitsShape).strict(),
13897
- features: z7.object(featuresShape).strict(),
13898
- invoice: z7.object({
13899
- collectionMode: z7.enum([
14020
+ stripeProductId: z8.string().optional(),
14021
+ stripePriceId: z8.string().optional(),
14022
+ actionsPerPeriod: z8.number().int().nonnegative(),
14023
+ trialDays: z8.number().int().nonnegative().optional(),
14024
+ limits: z8.object(limitsShape).strict(),
14025
+ features: z8.object(featuresShape).strict(),
14026
+ invoice: z8.object({
14027
+ collectionMode: z8.enum([
13900
14028
  "card",
13901
14029
  "invoice"
13902
14030
  ]),
13903
- dueDays: z7.number().int().nonnegative(),
13904
- lines: z7.array(z7.object({
13905
- description: z7.string().min(1),
13906
- amountUsd: z7.number().nonnegative()
14031
+ dueDays: z8.number().int().nonnegative(),
14032
+ lines: z8.array(z8.object({
14033
+ description: z8.string().min(1),
14034
+ amountUsd: z8.number().nonnegative()
13907
14035
  }).strict())
13908
14036
  }).strict().optional()
13909
14037
  }).strict();
13910
- topUpPackSchema = z7.object({
14038
+ topUpPackSchema = z8.object({
13911
14039
  key: planKeyString,
13912
- name: z7.string().min(1).max(80),
13913
- priceUsd: z7.number().positive(),
13914
- actions: z7.number().int().positive(),
13915
- stripeProductId: z7.string().optional(),
13916
- stripePriceId: z7.string().optional()
14040
+ name: z8.string().min(1).max(80),
14041
+ priceUsd: z8.number().positive(),
14042
+ actions: z8.number().int().positive(),
14043
+ stripeProductId: z8.string().optional(),
14044
+ stripePriceId: z8.string().optional()
13917
14045
  }).strict();
13918
14046
  __name(resolvePlanEntitlements, "resolvePlanEntitlements");
13919
14047
  __name3(resolvePlanEntitlements, "resolvePlanEntitlements");
@@ -13924,67 +14052,191 @@ listed here; never invent a target.`;
13924
14052
  ];
13925
14053
  __name(isPlanRefusal, "isPlanRefusal");
13926
14054
  __name3(isPlanRefusal, "isPlanRefusal");
13927
- billingSignupConfigSchema = z7.object({
13928
- enabled: z7.boolean(),
13929
- defaultVersionKey: z7.string().min(1).nullable(),
13930
- allowlistEmails: z7.array(z7.string().email().toLowerCase()).max(500),
13931
- friendsPlan: z7.object({
13932
- versionKey: z7.string().min(1),
14055
+ billingSignupConfigSchema = z8.object({
14056
+ enabled: z8.boolean(),
14057
+ defaultVersionKey: z8.string().min(1).nullable(),
14058
+ allowlistEmails: z8.array(z8.string().email().toLowerCase()).max(500),
14059
+ friendsPlan: z8.object({
14060
+ versionKey: z8.string().min(1),
13933
14061
  planKey: planKeyString
13934
14062
  }).strict().nullable()
13935
14063
  }).strict();
13936
- billingVersionDraftPatchSchema = z7.object({
13937
- revision: z7.number().int().nonnegative().optional(),
13938
- name: z7.string().min(1).max(80).optional(),
13939
- kind: z7.enum(BILLING_VERSION_KINDS).optional(),
13940
- engine: z7.enum(BILLING_ENGINES).optional(),
13941
- defaultPlanKey: z7.string().optional(),
13942
- plans: z7.array(billingPlanSchema).optional(),
13943
- topUpPacks: z7.array(topUpPackSchema).optional(),
13944
- forOrgIds: z7.array(z7.string().min(1)).optional(),
13945
- legacyCheckout: z7.boolean().optional(),
13946
- voiceAndDelegationAsActions: z7.boolean().optional(),
13947
- notes: z7.string().max(2e3).optional()
14064
+ billingVersionDraftPatchSchema = z8.object({
14065
+ revision: z8.number().int().nonnegative().optional(),
14066
+ name: z8.string().min(1).max(80).optional(),
14067
+ kind: z8.enum(BILLING_VERSION_KINDS).optional(),
14068
+ engine: z8.enum(BILLING_ENGINES).optional(),
14069
+ defaultPlanKey: z8.string().optional(),
14070
+ plans: z8.array(billingPlanSchema).optional(),
14071
+ topUpPacks: z8.array(topUpPackSchema).optional(),
14072
+ forOrgIds: z8.array(z8.string().min(1)).optional(),
14073
+ legacyCheckout: z8.boolean().optional(),
14074
+ voiceAndDelegationAsActions: z8.boolean().optional(),
14075
+ notes: z8.string().max(2e3).optional()
13948
14076
  }).strict();
13949
14077
  billingVersionDraftCreateSchema = billingVersionDraftPatchSchema.extend({
13950
- key: z7.string().min(2),
13951
- copyFrom: z7.string().optional()
14078
+ key: z8.string().min(2),
14079
+ copyFrom: z8.string().optional()
13952
14080
  }).strict();
13953
- assignBillingPlanSchema = z7.object({
13954
- versionKey: z7.string().min(1),
13955
- planKey: z7.string().optional()
14081
+ EXISTING_SUBSCRIPTION_POLICIES = [
14082
+ "keep",
14083
+ "next-renewal"
14084
+ ];
14085
+ billingVersionEditSchema = billingVersionDraftPatchSchema.extend({
14086
+ existingSubscriptions: z8.enum(EXISTING_SUBSCRIPTION_POLICIES).optional()
14087
+ }).strict();
14088
+ assignBillingPlanSchema = z8.object({
14089
+ versionKey: z8.string().min(1),
14090
+ planKey: z8.string().optional()
13956
14091
  }).strict();
13957
14092
  __name(planKeyList, "planKeyList");
13958
14093
  __name3(planKeyList, "planKeyList");
13959
14094
  __name(parseWith, "parseWith");
13960
14095
  __name3(parseWith, "parseWith");
13961
- billingActionRatesSchema = z7.object({
13962
- voiceActionsPerMinute: z7.number().nonnegative()
14096
+ billingActionRatesSchema = z8.object({
14097
+ voiceActionsPerMinute: z8.number().nonnegative()
13963
14098
  }).strict();
13964
14099
  BILLING_MOVE_DEFAULT_NOTICE_DAYS = 90;
13965
- keyString = z8.string().regex(/^[a-z0-9][a-z0-9-]{1,63}$/, "lowercase letters, digits and dashes");
13966
- billingMoveDraftSchema = z8.object({
14100
+ BILLING_MOVE_NOTICE_KINDS = [
14101
+ "scheduled",
14102
+ "reminder",
14103
+ "done"
14104
+ ];
14105
+ BILLING_MOVE_WHEN = [
14106
+ "notice",
14107
+ "now"
14108
+ ];
14109
+ keyString = z9.string().regex(/^[a-z0-9][a-z0-9-]{1,63}$/, "lowercase letters, digits and dashes");
14110
+ emailTextSchema = z9.object({
14111
+ subject: z9.string().trim().min(1).max(200).optional(),
14112
+ title: z9.string().trim().min(1).max(200).optional(),
14113
+ body: z9.string().trim().min(1).max(2e3).optional()
14114
+ }).strict();
14115
+ billingMoveDraftSchema = z9.object({
13967
14116
  key: keyString,
13968
- name: z8.string().min(1).max(120),
14117
+ name: z9.string().min(1).max(120),
13969
14118
  fromVersionKey: keyString,
13970
14119
  toVersionKey: keyString,
13971
14120
  /** Every plan of the source version → a plan of the target version. */
13972
- planMap: z8.record(z8.string().min(1), z8.string().min(1)),
13973
- noticeDays: z8.number().int().min(0).max(730).default(BILLING_MOVE_DEFAULT_NOTICE_DAYS),
14121
+ planMap: z9.record(z9.string().min(1), z9.string().min(1)),
14122
+ noticeDays: z9.number().int().min(0).max(730).default(BILLING_MOVE_DEFAULT_NOTICE_DAYS),
13974
14123
  /** Absent ⇒ every org on the source version. */
13975
- orgIds: z8.array(z8.string().min(1)).max(1e4).optional(),
13976
- excludeOrgIds: z8.array(z8.string().min(1)).max(1e4).default([]),
13977
- notes: z8.string().max(2e3).optional(),
14124
+ orgIds: z9.array(z9.string().min(1)).max(1e4).optional(),
14125
+ excludeOrgIds: z9.array(z9.string().min(1)).max(1e4).default([]),
14126
+ notes: z9.string().max(2e3).optional(),
13978
14127
  /** Actions per leftover credit when a credits version moves to an actions version; required then. */
13979
- creditsToActionsRate: z8.number().positive().max(1e4).optional()
14128
+ creditsToActionsRate: z9.number().positive().max(1e4).optional(),
14129
+ when: z9.enum(BILLING_MOVE_WHEN).default("notice"),
14130
+ /** Which owner emails this move sends; all off sends nothing. */
14131
+ emails: z9.object({
14132
+ scheduled: z9.boolean(),
14133
+ reminder: z9.boolean(),
14134
+ done: z9.boolean()
14135
+ }).strict().default({
14136
+ scheduled: true,
14137
+ reminder: true,
14138
+ done: true
14139
+ }),
14140
+ /** Staff wording per email, replacing ours; the list of what changes is always added. */
14141
+ emailText: z9.object({
14142
+ scheduled: emailTextSchema.optional(),
14143
+ reminder: emailTextSchema.optional(),
14144
+ done: emailTextSchema.optional()
14145
+ }).strict().optional()
13980
14146
  }).strict().refine((m) => m.fromVersionKey !== m.toVersionKey, {
13981
14147
  message: "source and target version must differ"
13982
14148
  });
13983
- billingMoveOrgDateSchema = z8.object({
13984
- effectiveAt: z8.coerce.date()
14149
+ billingMovePatchSchema = z9.object({
14150
+ name: z9.string().min(1).max(120).optional(),
14151
+ noticeDays: z9.number().int().min(0).max(730).optional(),
14152
+ when: z9.enum(BILLING_MOVE_WHEN).optional(),
14153
+ emails: z9.object({
14154
+ scheduled: z9.boolean(),
14155
+ reminder: z9.boolean(),
14156
+ done: z9.boolean()
14157
+ }).strict().optional(),
14158
+ emailText: z9.object({
14159
+ scheduled: emailTextSchema.optional(),
14160
+ reminder: emailTextSchema.optional(),
14161
+ done: emailTextSchema.optional()
14162
+ }).strict().optional(),
14163
+ notes: z9.string().max(2e3).optional()
14164
+ }).strict();
14165
+ billingMoveOrgDateSchema = z9.object({
14166
+ effectiveAt: z9.coerce.date()
14167
+ }).strict();
14168
+ billingMoveEmailPreviewSchema = z9.object({
14169
+ orgId: z9.string().min(1).optional(),
14170
+ kind: z9.enum(BILLING_MOVE_NOTICE_KINDS),
14171
+ /** Unsaved wording to try, so the dialog shows the email before the move is created. */
14172
+ subject: z9.string().max(200).optional(),
14173
+ title: z9.string().max(200).optional(),
14174
+ body: z9.string().max(2e3).optional()
13985
14175
  }).strict();
13986
14176
  __name(parseWith2, "parseWith2");
13987
14177
  __name3(parseWith2, "parseWith");
14178
+ DWA_BUILD_MAX_BUNDLE_BYTES = 12 * 1024 * 1024;
14179
+ sha256Hex = z10.string().regex(/^[a-f0-9]{64}$/);
14180
+ defaultWebAppBundleAssetSchema = z10.object({
14181
+ path: z10.string().min(1).max(512),
14182
+ hash: sha256Hex,
14183
+ size: z10.number().int().nonnegative().max(WEB_APP_MAX_ASSET_BYTES),
14184
+ contentType: z10.string().min(1).max(200),
14185
+ base64: z10.string()
14186
+ });
14187
+ defaultWebAppBundleToolSchema = z10.object({
14188
+ name: z10.string().min(1).max(64),
14189
+ description: z10.string().max(2e3),
14190
+ inputSchema: z10.unknown().optional(),
14191
+ outputSchema: z10.unknown().optional(),
14192
+ /** gzip + base64, as `lua push skill` sends a tool. */
14193
+ code: z10.string().min(1)
14194
+ });
14195
+ defaultWebAppBundleSchema = z10.object({
14196
+ format: z10.literal(1),
14197
+ templateVersion: z10.string().regex(/^\d+\.\d+\.\d+$/),
14198
+ webApp: z10.object({
14199
+ name: z10.string().regex(/^[a-z][a-z0-9-]{1,39}$/),
14200
+ title: z10.string().max(200).optional(),
14201
+ description: z10.string().max(1e3).optional(),
14202
+ routes: z10.array(z10.object({
14203
+ key: z10.string(),
14204
+ method: z10.string(),
14205
+ path: z10.string(),
14206
+ description: z10.string().optional()
14207
+ }).passthrough()).min(1),
14208
+ hasFetch: z10.boolean(),
14209
+ nav: z10.array(z10.object({
14210
+ path: z10.string(),
14211
+ label: z10.string(),
14212
+ icon: z10.string().optional()
14213
+ }).passthrough()),
14214
+ csp: z10.record(z10.array(z10.string())).optional(),
14215
+ branding: z10.record(z10.unknown()).optional(),
14216
+ bundlesAgentPane: z10.boolean(),
14217
+ uiVersion: z10.string().max(64).optional(),
14218
+ entryHtml: z10.string().min(1).max(WEB_APP_ENTRY_HTML_MAX_CHARS),
14219
+ /** The route bundle, uncompressed. */
14220
+ code: z10.string().min(1),
14221
+ codeSha256: sha256Hex,
14222
+ assets: z10.array(defaultWebAppBundleAssetSchema).max(WEB_APP_MAX_ASSETS),
14223
+ compiler: z10.object({
14224
+ vite: z10.string().optional()
14225
+ })
14226
+ }),
14227
+ skill: z10.object({
14228
+ name: z10.string().regex(/^dwa-[a-z0-9-]+$/),
14229
+ title: z10.string().max(200).optional(),
14230
+ description: z10.string().min(1).max(2e3),
14231
+ context: z10.unknown(),
14232
+ tools: z10.array(defaultWebAppBundleToolSchema).min(1).max(10)
14233
+ }),
14234
+ /** What the pod's smoke run answered, route by route: every one 2xx or the build failed. */
14235
+ smoke: z10.array(z10.object({
14236
+ route: z10.string(),
14237
+ status: z10.number().int()
14238
+ })).min(1)
14239
+ });
13988
14240
  }
13989
14241
  });
13990
14242
 
@@ -15094,7 +15346,7 @@ var init_lua_fetch = __esm({
15094
15346
  });
15095
15347
 
15096
15348
  // src/services/firebase-session.ts
15097
- import { z as z9 } from "zod";
15349
+ import { z as z11 } from "zod";
15098
15350
  function rejectedRefreshReason(message) {
15099
15351
  const normalised = message.toUpperCase();
15100
15352
  return REJECTED_REFRESH_REASONS.find((reason) => normalised.includes(reason));
@@ -15240,20 +15492,20 @@ var init_firebase_session = __esm({
15240
15492
  this.name = "FirebaseSessionRejectedError";
15241
15493
  }
15242
15494
  };
15243
- customTokenResponseSchema = z9.object({
15244
- idToken: z9.string().min(1),
15245
- refreshToken: z9.string().min(1),
15246
- expiresIn: z9.coerce.number().positive().finite(),
15247
- localId: z9.string().min(1).optional()
15495
+ customTokenResponseSchema = z11.object({
15496
+ idToken: z11.string().min(1),
15497
+ refreshToken: z11.string().min(1),
15498
+ expiresIn: z11.coerce.number().positive().finite(),
15499
+ localId: z11.string().min(1).optional()
15248
15500
  });
15249
- refreshResponseSchema = z9.object({
15250
- id_token: z9.string().min(1),
15251
- refresh_token: z9.string().min(1),
15252
- expires_in: z9.coerce.number().positive().finite(),
15253
- user_id: z9.string().min(1)
15501
+ refreshResponseSchema = z11.object({
15502
+ id_token: z11.string().min(1),
15503
+ refresh_token: z11.string().min(1),
15504
+ expires_in: z11.coerce.number().positive().finite(),
15505
+ user_id: z11.string().min(1)
15254
15506
  });
15255
- firebaseIdTokenPayloadSchema = z9.object({
15256
- sub: z9.string().min(1)
15507
+ firebaseIdTokenPayloadSchema = z11.object({
15508
+ sub: z11.string().min(1)
15257
15509
  });
15258
15510
  __name(requireFirebaseWebApiKey, "requireFirebaseWebApiKey");
15259
15511
  __name(claimsOfFirebaseIdToken, "claimsOfFirebaseIdToken");
@@ -15270,7 +15522,7 @@ var init_firebase_session = __esm({
15270
15522
  import { createHash, randomUUID } from "crypto";
15271
15523
  import { mkdir, open, readFile, rename, rm, stat, unlink, writeFile } from "fs/promises";
15272
15524
  import { join as join3 } from "path";
15273
- import { z as z10 } from "zod";
15525
+ import { z as z12 } from "zod";
15274
15526
  function environmentKey(environment) {
15275
15527
  return createHash("sha256").update(`${environment.apiUrl}
15276
15528
  ${environment.authUrl}
@@ -15287,15 +15539,15 @@ var init_firebase_session_store = __esm({
15287
15539
  "src/services/firebase-session-store.ts"() {
15288
15540
  "use strict";
15289
15541
  init_constants();
15290
- storedFirebaseSessionSchema = z10.object({
15291
- version: z10.literal(1),
15292
- kind: z10.literal("firebase-session"),
15293
- generation: z10.string().min(1),
15294
- refreshToken: z10.string().min(1),
15295
- firebaseUid: z10.string().min(1),
15296
- apiUrl: z10.string().url(),
15297
- authUrl: z10.string().url(),
15298
- firebaseWebApiKey: z10.string().min(1)
15542
+ storedFirebaseSessionSchema = z12.object({
15543
+ version: z12.literal(1),
15544
+ kind: z12.literal("firebase-session"),
15545
+ generation: z12.string().min(1),
15546
+ refreshToken: z12.string().min(1),
15547
+ firebaseUid: z12.string().min(1),
15548
+ apiUrl: z12.string().url(),
15549
+ authUrl: z12.string().url(),
15550
+ firebaseWebApiKey: z12.string().min(1)
15299
15551
  });
15300
15552
  currentFirebaseSessionEnvironment = /* @__PURE__ */ __name(() => ({
15301
15553
  apiUrl: BASE_URLS.API,
@@ -15853,7 +16105,7 @@ var init_workflow_job_tools = __esm({
15853
16105
 
15854
16106
  // ../workflow-graph/dist/index.mjs
15855
16107
  import { createHash as createHash2 } from "crypto";
15856
- import { z as z11 } from "zod";
16108
+ import { z as z13 } from "zod";
15857
16109
  import { z as z22 } from "zod";
15858
16110
  import { createHash as createHash22 } from "crypto";
15859
16111
  function isMapConfigObject(v) {
@@ -19580,8 +19832,8 @@ var init_dist2 = __esm({
19580
19832
  fromKnowledge = /* @__PURE__ */ __name6((k) => ({
19581
19833
  knowledge: k
19582
19834
  }), "fromKnowledge");
19583
- SideEffectsSchema = z11.enum(WORKFLOW_SIDE_EFFECTS);
19584
- JobResourcesSchema = z11.enum(WORKFLOW_JOB_RESOURCES);
19835
+ SideEffectsSchema = z13.enum(WORKFLOW_SIDE_EFFECTS);
19836
+ JobResourcesSchema = z13.enum(WORKFLOW_JOB_RESOURCES);
19585
19837
  WORKFLOW_MODEL_TEMPLATE_ROOT = "initData";
19586
19838
  WORKFLOW_MODEL_TEMPLATE_RE = /^\$\{\s*initData\.([A-Za-z0-9_.\-[\]]+)\s*(?:\|([^}]*))?\}$/;
19587
19839
  PATH_SEGMENT_RE = /^[A-Za-z0-9_-]+(?:\[(?:0|[1-9]\d*)\])*$/;
@@ -22299,19 +22551,19 @@ import { gunzipSync as gunzipSync2, gzipSync as gzipSync2 } from "zlib";
22299
22551
  function hashContentTruncated(content) {
22300
22552
  return createHash3("sha256").update(content).digest("hex").slice(0, FILE_HASH_LENGTH);
22301
22553
  }
22302
- function sha256Hex(content) {
22554
+ function sha256Hex2(content) {
22303
22555
  return createHash3("sha256").update(content).digest("hex");
22304
22556
  }
22305
22557
  function matchesFileHash(hash, plaintext) {
22306
22558
  if (!/^(?:[a-f0-9]{16}|[a-f0-9]{64})$/.test(hash)) return false;
22307
- if (sha256Hex(plaintext).startsWith(hash)) return true;
22308
- return sha256Hex(plaintext.toString("utf-8")).startsWith(hash);
22559
+ if (sha256Hex2(plaintext).startsWith(hash)) return true;
22560
+ return sha256Hex2(plaintext.toString("utf-8")).startsWith(hash);
22309
22561
  }
22310
22562
  function combineFileHashes(files) {
22311
22563
  const sorted = [
22312
22564
  ...files
22313
22565
  ].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
22314
- return sha256Hex(sorted.map((f) => f.hash).join("|"));
22566
+ return sha256Hex2(sorted.map((f) => f.hash).join("|"));
22315
22567
  }
22316
22568
  function shouldSkipDirectory(name) {
22317
22569
  return SKIP_DIRECTORIES.has(name);
@@ -22630,8 +22882,8 @@ var init_dist3 = __esm({
22630
22882
  FILE_HASH_LENGTH = 16;
22631
22883
  __name(hashContentTruncated, "hashContentTruncated");
22632
22884
  __name7(hashContentTruncated, "hashContentTruncated");
22633
- __name(sha256Hex, "sha256Hex");
22634
- __name7(sha256Hex, "sha256Hex");
22885
+ __name(sha256Hex2, "sha256Hex");
22886
+ __name7(sha256Hex2, "sha256Hex");
22635
22887
  __name(matchesFileHash, "matchesFileHash");
22636
22888
  __name7(matchesFileHash, "matchesFileHash");
22637
22889
  __name(combineFileHashes, "combineFileHashes");
@@ -23759,7 +24011,27 @@ var init_base_handler = __esm({
23759
24011
  }
23760
24012
  });
23761
24013
 
24014
+ // src/utils/server-refusal.ts
24015
+ function printableRefusal(error, code) {
24016
+ if (error?.code !== code || typeof error.message !== "string") return null;
24017
+ const message = error.message.replace(new RegExp("\\p{C}", "gu"), "").trim();
24018
+ return message || null;
24019
+ }
24020
+ function isSystemOwned(item) {
24021
+ return item?.systemOwned === true;
24022
+ }
24023
+ var init_server_refusal = __esm({
24024
+ "src/utils/server-refusal.ts"() {
24025
+ "use strict";
24026
+ __name(printableRefusal, "printableRefusal");
24027
+ __name(isSystemOwned, "isSystemOwned");
24028
+ }
24029
+ });
24030
+
23762
24031
  // src/primitives/skill.handler.ts
24032
+ function skillNameReservedMessage(error) {
24033
+ return printableRefusal(error, "SKILL_NAME_RESERVED");
24034
+ }
23763
24035
  var SkillHandler, skillHandler;
23764
24036
  var init_skill_handler = __esm({
23765
24037
  "src/primitives/skill.handler.ts"() {
@@ -23769,9 +24041,11 @@ var init_skill_handler = __esm({
23769
24041
  init_constants();
23770
24042
  init_skills_api_service();
23771
24043
  init_base_handler();
24044
+ init_server_refusal();
23772
24045
  init_artifact_loader();
23773
24046
  init_bundle_upload();
23774
24047
  init_files();
24048
+ __name(skillNameReservedMessage, "skillNameReservedMessage");
23775
24049
  SkillHandler = class extends BaseVersionedHandler {
23776
24050
  static {
23777
24051
  __name(this, "SkillHandler");
@@ -23790,7 +24064,7 @@ var init_skill_handler = __esm({
23790
24064
  async fetchFromServer(api) {
23791
24065
  const response = await api.getSkills();
23792
24066
  if (!response.success || !response.data?.skills) return null;
23793
- return response.data.skills;
24067
+ return response.data.skills.filter((skill) => !isSystemOwned(skill));
23794
24068
  }
23795
24069
  async createOnServer(api, primitive) {
23796
24070
  const skill = primitive;
@@ -23801,7 +24075,11 @@ var init_skill_handler = __esm({
23801
24075
  context: skill.context
23802
24076
  } : {}
23803
24077
  });
23804
- if (!response.success || !response.data?.id) return null;
24078
+ if (!response.success || !response.data?.id) {
24079
+ const reserved = skillNameReservedMessage(response.error);
24080
+ if (reserved) throw new Error(reserved);
24081
+ return null;
24082
+ }
23805
24083
  return response.data.id;
23806
24084
  }
23807
24085
  isActive(serverItem) {
@@ -25156,8 +25434,8 @@ function unwrapExpression(node) {
25156
25434
  function findImportSource(identifier, sourceFile, resolveImportPath) {
25157
25435
  for (const importDecl of sourceFile.getImportDeclarations()) {
25158
25436
  const defaultImport = importDecl.getDefaultImport();
25159
- const namedImports = importDecl.getNamedImports();
25160
- const isMatch = defaultImport && defaultImport.getText() === identifier || namedImports.some((named) => named.getName() === identifier);
25437
+ const namedImports2 = importDecl.getNamedImports();
25438
+ const isMatch = defaultImport && defaultImport.getText() === identifier || namedImports2.some((named) => named.getName() === identifier);
25161
25439
  if (isMatch) {
25162
25440
  return resolveImportPath(importDecl.getModuleSpecifierValue(), sourceFile.getFilePath());
25163
25441
  }
@@ -25812,7 +26090,7 @@ async function ensureSchemaConverterReady() {
25812
26090
  await loadVendor();
25813
26091
  }
25814
26092
  async function zodToJsonSchema2(schemaNode) {
25815
- const { z: z13, zodToJsonSchema: convertSchema } = await loadVendor();
26093
+ const { z: z15, zodToJsonSchema: convertSchema } = await loadVendor();
25816
26094
  try {
25817
26095
  const sourceFile = schemaNode.getSourceFile();
25818
26096
  const project = sourceFile.getProject();
@@ -25825,7 +26103,7 @@ async function zodToJsonSchema2(schemaNode) {
25825
26103
  environment: {
25826
26104
  preset: "NODE",
25827
26105
  extra: {
25828
- z: z13
26106
+ z: z15
25829
26107
  }
25830
26108
  },
25831
26109
  policy: {
@@ -25873,10 +26151,10 @@ function cleanJsonSchema(schema) {
25873
26151
  return cleanSchema;
25874
26152
  }
25875
26153
  async function zodStringToJsonSchema(zodSchemaCode) {
25876
- const { z: z13, zodToJsonSchema: convertSchema } = await loadVendor();
26154
+ const { z: z15, zodToJsonSchema: convertSchema } = await loadVendor();
25877
26155
  try {
25878
26156
  const evalFunction = new Function("z", `return ${zodSchemaCode}`);
25879
- const zodSchema = evalFunction(z13);
26157
+ const zodSchema = evalFunction(z15);
25880
26158
  const jsonSchema = convertSchema(zodSchema, {
25881
26159
  target: "jsonSchema7"
25882
26160
  });
@@ -33635,7 +33913,7 @@ function collectBuilderCalls(expr) {
33635
33913
  function serializeViaAst(sourceFile, exportName) {
33636
33914
  const expr = locateWorkflowExpression(sourceFile, exportName);
33637
33915
  if (!expr) return void 0;
33638
- const z13 = zodModule.z;
33916
+ const z15 = zodModule.z;
33639
33917
  const committed = [];
33640
33918
  const prev = __workflowCommitHook.onCommit;
33641
33919
  __workflowCommitHook.onCommit = (wf) => committed.push(wf);
@@ -33648,7 +33926,7 @@ function serializeViaAst(sourceFile, exportName) {
33648
33926
  preset: "NODE",
33649
33927
  extra: {
33650
33928
  ...PRIMITIVE_SHIMS,
33651
- z: z13,
33929
+ z: z15,
33652
33930
  env: Object.assign(() => "", {
33653
33931
  template: /* @__PURE__ */ __name((k) => ({
33654
33932
  __envRef: k
@@ -39468,13 +39746,13 @@ var init_data_entry_instance = __esm({
39468
39746
  /**
39469
39747
  * Updates the custom data entry
39470
39748
  * @param data - The data fields to update (partial update supported)
39471
- * @param searchText - Optional new search text for semantic search indexing
39749
+ * @param optionsOrSearchText - `{ searchText?, index? }` (as `Data.update`), or a bare string (legacy `searchText`)
39472
39750
  * @returns Promise resolving to the updated data
39473
39751
  * @throws Error if the update fails
39474
39752
  */
39475
- async update(data, searchText) {
39753
+ async update(data, optionsOrSearchText) {
39476
39754
  try {
39477
- const result = await this.customDataAPI.update(this.collectionName, this.id, data, searchText);
39755
+ const result = await this.customDataAPI.update(this.collectionName, this.id, data, optionsOrSearchText);
39478
39756
  this.data = {
39479
39757
  ...this.data,
39480
39758
  ...data
@@ -39535,13 +39813,13 @@ var init_data_entry_instance = __esm({
39535
39813
  }
39536
39814
  /**
39537
39815
  * Saves the data entry
39538
- * @param searchText - Optional search text for vector search indexing
39816
+ * @param optionsOrSearchText - `{ searchText?, index? }` (as `Data.update`), or a bare string (legacy `searchText`)
39539
39817
  * @returns Promise resolving to true if saving was successful
39540
39818
  * @throws Error if the save operation fails
39541
39819
  */
39542
- async save(searchText) {
39820
+ async save(optionsOrSearchText) {
39543
39821
  try {
39544
- await this.customDataAPI.update(this.collectionName, this.id, this.data, searchText);
39822
+ await this.customDataAPI.update(this.collectionName, this.id, this.data, optionsOrSearchText);
39545
39823
  return true;
39546
39824
  } catch (error) {
39547
39825
  throw new Error("Failed to save data entry", {
@@ -45263,6 +45541,7 @@ var PostProcessorApi = class extends HttpClient {
45263
45541
  // src/utils/sync-fetch.ts
45264
45542
  init_developer_api_service();
45265
45543
  init_mcp_server_handler();
45544
+ init_server_refusal();
45266
45545
  function normalizeForComparison(str3) {
45267
45546
  return str3.trim().replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/\\\\/g, "\\").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
45268
45547
  }
@@ -45391,7 +45670,7 @@ async function fetchServerPrimitives(apiKey, agentId2) {
45391
45670
  postProcessorApi.getPostProcessors().catch(() => null),
45392
45671
  developerApi.getMCPServers().catch(() => null)
45393
45672
  ]);
45394
- const skills = skillsRes?.success && skillsRes.data?.skills ? skillsRes.data.skills.map((s) => ({
45673
+ const skills = skillsRes?.success && skillsRes.data?.skills ? skillsRes.data.skills.filter((s) => !isSystemOwned(s)).map((s) => ({
45395
45674
  id: s.id,
45396
45675
  name: s.name,
45397
45676
  activeVersion: resolveActiveVersion(s.versions)
@@ -50095,7 +50374,11 @@ function createOfflineThreadsApi() {
50095
50374
  }, "open"),
50096
50375
  followUp: /* @__PURE__ */ __name(async () => {
50097
50376
  throw unavailable("followUp");
50098
- }, "followUp")
50377
+ }, "followUp"),
50378
+ resetContext: /* @__PURE__ */ __name(async () => ({
50379
+ status: "skipped",
50380
+ reason: "unavailable"
50381
+ }), "resetContext")
50099
50382
  };
50100
50383
  }
50101
50384
  __name(createOfflineThreadsApi, "createOfflineThreadsApi");
@@ -53719,6 +54002,67 @@ function detectBundledAgentPane(pagesDir, assets) {
53719
54002
  return dependsOnAppChat(pagesDir) && sourceImportsAppChat(pagesDir);
53720
54003
  }
53721
54004
  __name(detectBundledAgentPane, "detectBundledAgentPane");
54005
+ var UI_PACKAGE = "@lua-ai-global/ui";
54006
+ function resolvedUiVersion(pagesDir) {
54007
+ return resolvedPackageVersion(pagesDir, UI_PACKAGE);
54008
+ }
54009
+ __name(resolvedUiVersion, "resolvedUiVersion");
54010
+ var APP_CLIENT_PACKAGE = "@lua-ai-global/app-client";
54011
+ var THEME_APP_CLIENT_VERSION = "0.1.0";
54012
+ var PAGE_THEME_CODE = /['"]dark['"]|\.theme\b/;
54013
+ function appClientThemeWarning(pagesDir) {
54014
+ const main = [
54015
+ "main.tsx",
54016
+ "main.jsx"
54017
+ ].map((f) => path23.join(pagesDir, "src", f)).find((f) => fs19.existsSync(f));
54018
+ if (!main || PAGE_THEME_CODE.test(fs19.readFileSync(main, "utf8"))) return void 0;
54019
+ const installed = resolvedPackageVersion(pagesDir, APP_CLIENT_PACKAGE);
54020
+ if (!installed || compareSemver(installed, THEME_APP_CLIENT_VERSION) >= 0) return void 0;
54021
+ return `The pages rely on ${APP_CLIENT_PACKAGE} \u2265 0.1 to apply light/dark and the accent, but ${installed} is installed: run npm install in ${path23.basename(pagesDir)}/.`;
54022
+ }
54023
+ __name(appClientThemeWarning, "appClientThemeWarning");
54024
+ var CURRENT_DESIGN_UI_VERSION = "0.3.0";
54025
+ function uiDesignWarning(pagesDir, appName) {
54026
+ const installed = resolvedUiVersion(pagesDir);
54027
+ if (!installed || compareSemver(installed, CURRENT_DESIGN_UI_VERSION) >= 0) return void 0;
54028
+ const name = appName !== void 0 && WEB_APP_NAME_PATTERN.test(appName) ? appName : "<name>";
54029
+ const majorMinor = /^(\d+)\.(\d+)/.exec(CURRENT_DESIGN_UI_VERSION);
54030
+ const current = majorMinor ? `${majorMinor[1]}.${majorMinor[2]}` : CURRENT_DESIGN_UI_VERSION;
54031
+ return `The pages are built with ${UI_PACKAGE} ${installed}, the design before Lua Workspace's current one. Run lua apps upgrade ${name} to move them to ui ${current} (the gateway restyles older apps in the meantime).`;
54032
+ }
54033
+ __name(uiDesignWarning, "uiDesignWarning");
54034
+ function pageWarnings(pagesDir, appName) {
54035
+ return [
54036
+ appClientThemeWarning(pagesDir),
54037
+ uiDesignWarning(pagesDir, appName)
54038
+ ].filter((w) => w !== void 0);
54039
+ }
54040
+ __name(pageWarnings, "pageWarnings");
54041
+ function compareSemver(a, b) {
54042
+ const parts = /* @__PURE__ */ __name((v) => v.split("+")[0].split("-")[0].split(".").map(Number), "parts");
54043
+ const isPrerelease = /* @__PURE__ */ __name((v) => v.split("+")[0].includes("-"), "isPrerelease");
54044
+ const [x, y] = [
54045
+ parts(a),
54046
+ parts(b)
54047
+ ];
54048
+ return x[0] - y[0] || x[1] - y[1] || x[2] - y[2] || Number(isPrerelease(b)) - Number(isPrerelease(a));
54049
+ }
54050
+ __name(compareSemver, "compareSemver");
54051
+ function resolvedPackageVersion(pagesDir, pkg2) {
54052
+ for (let dir = path23.resolve(pagesDir); ; dir = path23.dirname(dir)) {
54053
+ const manifest = path23.join(dir, "node_modules", ...pkg2.split("/"), "package.json");
54054
+ if (fs19.existsSync(manifest)) {
54055
+ try {
54056
+ const version = JSON.parse(fs19.readFileSync(manifest, "utf8")).version;
54057
+ return typeof version === "string" && version.length <= WEB_APP_UI_VERSION_MAX_CHARS && WEB_APP_UI_VERSION_PATTERN.test(version) ? version : void 0;
54058
+ } catch {
54059
+ return void 0;
54060
+ }
54061
+ }
54062
+ if (path23.dirname(dir) === dir) return void 0;
54063
+ }
54064
+ }
54065
+ __name(resolvedPackageVersion, "resolvedPackageVersion");
53722
54066
  async function buildWebAppPages(pagesDir, loadVite = loadAppVite) {
53723
54067
  if (!fs19.existsSync(path23.join(pagesDir, "index.html"))) {
53724
54068
  throw new WebAppBuildError(`${pagesDir} has no index.html: \`pages.root\` must name the Vite project directory.`);
@@ -53741,10 +54085,14 @@ async function buildWebAppPages(pagesDir, loadVite = loadAppVite) {
53741
54085
  }
53742
54086
  });
53743
54087
  const output = collectBuildOutput(outDir);
54088
+ const uiVersion = resolvedUiVersion(pagesDir);
53744
54089
  return {
53745
54090
  ...output,
53746
54091
  viteVersion: version,
53747
- bundlesAgentPane: detectBundledAgentPane(pagesDir, output.assets)
54092
+ bundlesAgentPane: detectBundledAgentPane(pagesDir, output.assets),
54093
+ ...uiVersion ? {
54094
+ uiVersion
54095
+ } : {}
53748
54096
  };
53749
54097
  } finally {
53750
54098
  fs19.rmSync(outDir, {
@@ -53757,6 +54105,7 @@ __name(buildWebAppPages, "buildWebAppPages");
53757
54105
 
53758
54106
  // src/primitives/web-app.handler.ts
53759
54107
  init_package_root();
54108
+ init_server_refusal();
53760
54109
  init_cli();
53761
54110
  init_write_info();
53762
54111
  init_base_handler();
@@ -53772,12 +54121,6 @@ function webAppNameReservedMessage(error) {
53772
54121
  return printableRefusal(error, "WEB_APP_NAME_RESERVED");
53773
54122
  }
53774
54123
  __name(webAppNameReservedMessage, "webAppNameReservedMessage");
53775
- function printableRefusal(error, code) {
53776
- if (error?.code !== code || typeof error.message !== "string") return null;
53777
- const message = error.message.replace(new RegExp("\\p{C}", "gu"), "").trim();
53778
- return message || null;
53779
- }
53780
- __name(printableRefusal, "printableRefusal");
53781
54124
  var WebAppHandler = class extends BaseVersionedHandler {
53782
54125
  static {
53783
54126
  __name(this, "WebAppHandler");
@@ -53797,7 +54140,7 @@ var WebAppHandler = class extends BaseVersionedHandler {
53797
54140
  async fetchFromServer(api) {
53798
54141
  const response = await api.getWebApps();
53799
54142
  if (!response.success || !response.data?.webApps) return null;
53800
- return response.data.webApps;
54143
+ return response.data.webApps.filter((app) => !isSystemOwned(app));
53801
54144
  }
53802
54145
  async createOnServer(api, primitive) {
53803
54146
  const response = await api.createWebApp({
@@ -53888,6 +54231,7 @@ var WebAppHandler = class extends BaseVersionedHandler {
53888
54231
  if (pages.skipped.length > 0) {
53889
54232
  writeInfo(`\u26A0\uFE0F Not served (outside assets/): ${pages.skipped.slice(0, 10).join(", ")}${pages.skipped.length > 10 ? ", \u2026" : ""}. Import files from your source so Vite emits them under assets/.`);
53890
54233
  }
54234
+ for (const warning of pageWarnings(pagesDir, name)) writeInfo(`\u26A0\uFE0F ${warning}`);
53891
54235
  const compiler = pushData.compiler ?? {};
53892
54236
  return {
53893
54237
  ...pushData,
@@ -53896,6 +54240,10 @@ var WebAppHandler = class extends BaseVersionedHandler {
53896
54240
  ...pages.bundlesAgentPane ? {
53897
54241
  bundlesAgentPane: true
53898
54242
  } : {},
54243
+ // ADR 0027: the resolved @lua-ai-global/ui, sent only when found; absent ⇒ unknown, the gateway scans the CSS.
54244
+ ...pages.uiVersion ? {
54245
+ uiVersion: pages.uiVersion
54246
+ } : {},
53899
54247
  assets: pages.assets.map(({ bytes: _bytes, ...entry }) => entry),
53900
54248
  compiler: {
53901
54249
  ...compiler,
@@ -80372,6 +80720,7 @@ __name(deletePostProcessorInteractive, "deletePostProcessorInteractive");
80372
80720
 
80373
80721
  // src/commands/marketplace.ts
80374
80722
  init_cli();
80723
+ init_server_refusal();
80375
80724
 
80376
80725
  // src/api/marketplace.api.service.ts
80377
80726
  init_constants();
@@ -82330,7 +82679,7 @@ async function listSkillOnMarketplace(marketplaceApi, config, apiKey) {
82330
82679
  `);
82331
82680
  return;
82332
82681
  }
82333
- const skills = agentSkillsResponse.data.skills || [];
82682
+ const skills = (agentSkillsResponse.data.skills || []).filter((skill) => !isSystemOwned(skill));
82334
82683
  if (skills.length === 0) {
82335
82684
  console.log("\n\u2139\uFE0F No skills found on this agent.");
82336
82685
  console.log("\u{1F4A1} Push a skill first using 'lua push skill'.\n");
@@ -90573,7 +90922,7 @@ init_types();
90573
90922
  var WEB_APP_TEMPLATE_DIR = "template-web-app";
90574
90923
  var PAGES_EXCLUDE_GLOB = "src/apps/*/web";
90575
90924
  var NAME_PLACEHOLDER = "__APP_NAME__";
90576
- function pagesHaveAgentPane(pagesDir) {
90925
+ function pagesBundleAgentPane(pagesDir) {
90577
90926
  return [
90578
90927
  "main.tsx",
90579
90928
  "main.jsx"
@@ -90582,7 +90931,7 @@ function pagesHaveAgentPane(pagesDir) {
90582
90931
  return fs24.existsSync(file) && fs24.readFileSync(file, "utf8").includes("AgentPaneLayout");
90583
90932
  });
90584
90933
  }
90585
- __name(pagesHaveAgentPane, "pagesHaveAgentPane");
90934
+ __name(pagesBundleAgentPane, "pagesBundleAgentPane");
90586
90935
  function appIdentifier(name) {
90587
90936
  return name.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
90588
90937
  }
@@ -90852,8 +91201,10 @@ async function appsDevCommand(name, opts = {}) {
90852
91201
  });
90853
91202
  await server.listen();
90854
91203
  origin = server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") ?? "";
91204
+ const bundlesPane = pagesBundleAgentPane(pagesDir);
90855
91205
  writeSuccess(`
90856
91206
  \u2705 ${name} is running`);
91207
+ for (const warning of pageWarnings(pagesDir, name)) writeInfo(`\u26A0\uFE0F ${warning}`);
90857
91208
  writeHintBlock({
90858
91209
  headline: "Lua apps dev:",
90859
91210
  lines: [
@@ -90867,8 +91218,14 @@ async function appsDevCommand(name, opts = {}) {
90867
91218
  },
90868
91219
  {
90869
91220
  label: "Agent pane:",
90870
- command: app.agentPane === false ? "off (agentPane: false)" : !pagesHaveAgentPane(pagesDir) ? `not in these pages (made before lua-cli 3.53.0): lua apps upgrade ${name}` : `/_lua/chat/* \u2192 ${chatEnv === "sandbox" ? "sandbox agent (your local skills)" : "production agent"}, thread ${chat.threadId}`
91221
+ command: app.agentPane === false ? "off (agentPane: false)" : !bundlesPane ? "none here: the gateway adds the platform pane once deployed" : `/_lua/chat/* \u2192 ${chatEnv === "sandbox" ? "sandbox agent (your local skills)" : "production agent"}, thread ${chat.threadId}`
90871
91222
  },
91223
+ ...app.agentPane !== false && bundlesPane ? [
91224
+ {
91225
+ label: "Bundled pane:",
91226
+ command: `lua apps upgrade ${name} (moves to the platform pane)`
91227
+ }
91228
+ ] : [],
90872
91229
  {
90873
91230
  label: "Stop:",
90874
91231
  command: "Ctrl+C"
@@ -91107,13 +91464,19 @@ var APP_CHAT = "@lua-ai-global/app-chat";
91107
91464
  var APP_CLIENT = "@lua-ai-global/app-client";
91108
91465
  var UI = "@lua-ai-global/ui";
91109
91466
  var UPGRADED_PACKAGES = [
91110
- APP_CHAT,
91111
91467
  APP_CLIENT,
91112
91468
  UI
91113
91469
  ];
91114
- var PANE_COMMENT = "The agent pane: the person's own conversation with this app's agent, docked beside the page.";
91470
+ var PANE_API_CLIENT_RANGE = "~0.0.5";
91471
+ var PANE_COMMENT_PREFIX = "{/* The agent pane:";
91115
91472
  var PANE_CSS_COMMENT = "/* The agent pane's styles: after the design system's, on its tokens. */";
91116
91473
  var PANE_CSS = `${APP_CHAT}/styles.css`;
91474
+ var THEME_CLIENT_RANGE = "~0.1.0";
91475
+ var TEMPLATE_THEME_LINES = [
91476
+ "// Theme follows the shell: first from the bootstrap, then from the host's `init`.",
91477
+ "document.documentElement.classList.toggle('dark', lua.theme === 'dark');",
91478
+ "lua.onInit((init) => document.documentElement.classList.toggle('dark', init.theme === 'dark'));"
91479
+ ];
91117
91480
  var KNOWN_COPIED_CLIENTS = /* @__PURE__ */ new Set([
91118
91481
  "6dee7fbd9103f2f9d33879b1c83279acf3ff3da974cc76b5e3482a4cbc00dd9c",
91119
91482
  "2bf0527634fba64be8e71885dd10044231d4472baaae3982a9b4d6a801fe1195",
@@ -91218,6 +91581,13 @@ function templateRanges(templateRoot = getPackageRoot()) {
91218
91581
  return ranges;
91219
91582
  }
91220
91583
  __name(templateRanges, "templateRanges");
91584
+ function movesToNewerDesign(pkg2, wanted) {
91585
+ const current = pkg2.dependencies?.[UI] ?? pkg2.devDependencies?.[UI];
91586
+ const have = typeof current === "string" ? rangeFloor(current) : void 0;
91587
+ const need = rangeFloor(wanted);
91588
+ return !!have && !!need && (have[0] < need[0] || have[0] === need[0] && have[1] < need[1]);
91589
+ }
91590
+ __name(movesToNewerDesign, "movesToNewerDesign");
91221
91591
  function rangeFloor(range2) {
91222
91592
  if (range2.includes("||")) return void 0;
91223
91593
  const tokens = range2.trim().split(/\s+/);
@@ -91241,7 +91611,7 @@ function compareFloors(a, b) {
91241
91611
  return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
91242
91612
  }
91243
91613
  __name(compareFloors, "compareFloors");
91244
- function planPackageJson(source, ranges) {
91614
+ function planPackageJson(source, ranges, remove = []) {
91245
91615
  const pkg2 = JSON.parse(source);
91246
91616
  const changes = [];
91247
91617
  const warnings = [];
@@ -91262,13 +91632,25 @@ function planPackageJson(source, ranges) {
91262
91632
  const have = rangeFloor(current);
91263
91633
  const need = rangeFloor(wanted);
91264
91634
  if (!have || !need) {
91265
- warnings.push(`${name} is "${current}" in web/package.json; it was kept. The agent pane needs ${wanted}.`);
91635
+ warnings.push(`${name} is "${current}" in web/package.json; it was kept. The upgrade wants ${wanted}.`);
91266
91636
  continue;
91267
91637
  }
91268
91638
  if (compareFloors(have, need) >= 0) continue;
91269
91639
  pkg2[section2][name] = wanted;
91270
91640
  changes.push(`${name} ${current} \u2192 ${wanted}`);
91271
91641
  }
91642
+ for (const name of remove) {
91643
+ let removed = false;
91644
+ for (const section2 of [
91645
+ "dependencies",
91646
+ "devDependencies"
91647
+ ]) {
91648
+ if (pkg2[section2]?.[name] === void 0) continue;
91649
+ delete pkg2[section2][name];
91650
+ removed = true;
91651
+ }
91652
+ if (removed) changes.push(`${name} (removed)`);
91653
+ }
91272
91654
  if (!changes.length) return {
91273
91655
  changes,
91274
91656
  warnings
@@ -91323,15 +91705,20 @@ function rewriteClientImports(file, source, clientFile) {
91323
91705
  return out;
91324
91706
  }
91325
91707
  __name(rewriteClientImports, "rewriteClientImports");
91708
+ var THEME_INSTALL_NOTE = `the pages' light/dark and accent now come from ${APP_CLIENT} 0.1, which only npm install brings`;
91326
91709
  var MANUAL_PANE_EDIT = [
91327
- `add the import: import { AgentPaneLayout } from '${APP_CHAT}';`,
91328
- "and wrap what createRoot(...).render( renders (inside <StrictMode> when there is one):",
91329
- " <StrictMode>",
91330
- " <AgentPaneLayout>",
91331
- " <App />",
91332
- " </AgentPaneLayout>",
91333
- " </StrictMode>"
91710
+ "<AgentPaneLayout>: replace it with what it wraps; its context prop becomes lua.pane.setContext(...),",
91711
+ ` with lua from ${APP_CLIENT} (${PANE_API_CLIENT_RANGE} or later); its other props have no equivalent`,
91712
+ " (the platform pane owns them);",
91713
+ "useAgentPane(): use lua.pane instead (open, close, ask, setContext); it has no isOpen (the Workspace",
91714
+ " owns whether the pane is open);",
91715
+ "<AgentPane>: remove it; the platform pane replaces it (lua.pane.open(), lua.pane.ask(text));",
91716
+ `then npm uninstall ${APP_CHAT} in web/ and remove the @import of its styles from web/src/index.css.`
91334
91717
  ];
91718
+ var PANE_EXPORTS = /* @__PURE__ */ new Set([
91719
+ "AgentPaneLayout",
91720
+ "useAgentPane"
91721
+ ]);
91335
91722
  function syntaxErrors(file, source) {
91336
91723
  return ts6.transpileModule(source, {
91337
91724
  fileName: path32.basename(file).replace(/\.\w+$/, ".tsx"),
@@ -91345,148 +91732,518 @@ function syntaxErrors(file, source) {
91345
91732
  }
91346
91733
  __name(syntaxErrors, "syntaxErrors");
91347
91734
  var tagName2 = /* @__PURE__ */ __name((sf, n2) => (ts6.isJsxElement(n2) ? n2.openingElement.tagName : n2.tagName).getText(sf), "tagName");
91348
- function addAgentPane(file, source) {
91349
- const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
91350
- let used = false;
91351
- let importedFromChat = false;
91352
- let boundElsewhere = false;
91353
- const roots = /* @__PURE__ */ new Set();
91354
- const renders = [];
91355
- const isCreateRoot = /* @__PURE__ */ __name((e) => ts6.isCallExpression(e) && /(^|\.)createRoot$/.test(e.expression.getText(sf)), "isCreateRoot");
91356
- const visit = /* @__PURE__ */ __name((node) => {
91357
- if ((ts6.isJsxElement(node) || ts6.isJsxSelfClosingElement(node)) && tagName2(sf, node) === "AgentPaneLayout") used = true;
91358
- if (ts6.isImportDeclaration(node) && node.importClause) {
91359
- const bindings = node.importClause.namedBindings;
91360
- const names = [
91361
- ...node.importClause.name ? [
91362
- node.importClause.name.text
91363
- ] : [],
91364
- ...bindings && ts6.isNamedImports(bindings) ? bindings.elements.map((e) => e.name.text) : [],
91365
- ...bindings && ts6.isNamespaceImport(bindings) ? [
91366
- bindings.name.text
91367
- ] : []
91368
- ];
91369
- if (names.includes("AgentPaneLayout")) {
91370
- const fromChat = ts6.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === APP_CHAT && !!bindings && ts6.isNamedImports(bindings) && bindings.elements.some((e) => e.name.text === "AgentPaneLayout" && (e.propertyName?.text ?? "AgentPaneLayout") === "AgentPaneLayout");
91371
- if (fromChat) importedFromChat = true;
91372
- else boundElsewhere = true;
91373
- }
91374
- }
91375
- if (ts6.isVariableDeclaration(node) && ts6.isIdentifier(node.name) && node.initializer && isCreateRoot(node.initializer)) {
91376
- roots.add(node.name.text);
91377
- }
91378
- if (ts6.isCallExpression(node) && ts6.isPropertyAccessExpression(node.expression) && node.expression.name.text === "render") {
91379
- const target = node.expression.expression;
91380
- if (isCreateRoot(target) || ts6.isIdentifier(target) && roots.has(target.text)) renders.push(node);
91735
+ function applySplices(source, splices) {
91736
+ let out = source;
91737
+ const ordered = splices.map((s, i) => ({
91738
+ ...s,
91739
+ i
91740
+ })).sort((a, b) => b.start - a.start || b.i - a.i);
91741
+ for (const s of ordered) out = out.slice(0, s.start) + s.text + out.slice(s.end);
91742
+ return out;
91743
+ }
91744
+ __name(applySplices, "applySplices");
91745
+ function indentAt(source, pos) {
91746
+ const before = source.slice(source.lastIndexOf("\n", pos - 1) + 1, pos);
91747
+ return /^[ \t]*$/.test(before) ? before : void 0;
91748
+ }
91749
+ __name(indentAt, "indentAt");
91750
+ function lineSpan(source, start, end) {
91751
+ const rest = /^[ \t]*(\r?\n|$)/.exec(source.slice(end));
91752
+ if (indentAt(source, start) === void 0 || !rest) return [
91753
+ start,
91754
+ end
91755
+ ];
91756
+ return [
91757
+ source.lastIndexOf("\n", start - 1) + 1,
91758
+ end + rest[0].length
91759
+ ];
91760
+ }
91761
+ __name(lineSpan, "lineSpan");
91762
+ function identifiers(node, out = []) {
91763
+ if (ts6.isIdentifier(node)) out.push(node);
91764
+ ts6.forEachChild(node, (child) => {
91765
+ identifiers(child, out);
91766
+ });
91767
+ return out;
91768
+ }
91769
+ __name(identifiers, "identifiers");
91770
+ function declares(id2) {
91771
+ const p = id2.parent;
91772
+ return (ts6.isVariableDeclaration(p) || ts6.isParameter(p) || ts6.isFunctionDeclaration(p) || ts6.isFunctionExpression(p) || ts6.isClassDeclaration(p) || ts6.isClassExpression(p) || ts6.isEnumDeclaration(p) || ts6.isImportSpecifier(p) || ts6.isImportClause(p) || ts6.isNamespaceImport(p) || ts6.isImportEqualsDeclaration(p) || ts6.isBindingElement(p)) && p.name === id2;
91773
+ }
91774
+ __name(declares, "declares");
91775
+ function isReference(id2) {
91776
+ const p = id2.parent;
91777
+ if (ts6.isPropertyAccessExpression(p) && p.name === id2) return false;
91778
+ if ((ts6.isPropertyAssignment(p) || ts6.isMethodDeclaration(p) || ts6.isJsxAttribute(p)) && p.name === id2) return false;
91779
+ return true;
91780
+ }
91781
+ __name(isReference, "isReference");
91782
+ function insideImport(node) {
91783
+ for (let n2 = node; n2; n2 = n2.parent) if (ts6.isImportDeclaration(n2)) return true;
91784
+ return false;
91785
+ }
91786
+ __name(insideImport, "insideImport");
91787
+ var importsFrom = /* @__PURE__ */ __name((d, module) => ts6.isImportDeclaration(d) && ts6.isStringLiteral(d.moduleSpecifier) && d.moduleSpecifier.text === module, "importsFrom");
91788
+ function namedImports(d) {
91789
+ const b = d.importClause?.namedBindings;
91790
+ return !d.importClause?.isTypeOnly && b && ts6.isNamedImports(b) ? b : void 0;
91791
+ }
91792
+ __name(namedImports, "namedImports");
91793
+ function chatLocals(sf, exported) {
91794
+ const out = /* @__PURE__ */ new Set();
91795
+ for (const d of sf.statements) {
91796
+ if (!importsFrom(d, APP_CHAT)) continue;
91797
+ for (const e of namedImports(d)?.elements ?? []) {
91798
+ if (!e.isTypeOnly && (e.propertyName ?? e.name).text === exported) out.add(e.name.text);
91381
91799
  }
91382
- ts6.forEachChild(node, visit);
91383
- }, "visit");
91384
- visit(sf);
91385
- if (used) return {
91386
- status: "present"
91387
- };
91388
- if (boundElsewhere) return {
91389
- status: "unrecognised",
91390
- reason: "AgentPaneLayout already names something else here"
91391
- };
91392
- if (renders.length !== 1) {
91393
- return {
91394
- status: "unrecognised",
91395
- reason: renders.length ? "more than one createRoot(...).render( call" : "no createRoot(...).render( call"
91800
+ }
91801
+ return out;
91802
+ }
91803
+ __name(chatLocals, "chatLocals");
91804
+ function luaBinding(sf) {
91805
+ for (const d of sf.statements) {
91806
+ if (!importsFrom(d, APP_CLIENT)) continue;
91807
+ const e = namedImports(d)?.elements.find((x) => !x.isTypeOnly && (x.propertyName ?? x.name).text === "lua");
91808
+ if (e) return {
91809
+ local: e.name.text,
91810
+ taken: false
91396
91811
  };
91397
91812
  }
91398
- const render = renders[0];
91399
- let arg = render.arguments[0];
91400
- while (arg && ts6.isParenthesizedExpression(arg)) arg = arg.expression;
91401
- if (render.arguments.length !== 1 || !arg || !(ts6.isJsxElement(arg) || ts6.isJsxSelfClosingElement(arg) || ts6.isJsxFragment(arg))) {
91402
- return {
91403
- status: "unrecognised",
91404
- reason: "render( is not given a JSX element"
91405
- };
91406
- }
91407
- let start;
91408
- let end;
91409
- let insideStrictMode = false;
91410
- if (ts6.isJsxElement(arg) && /^(React\.)?StrictMode$/.test(tagName2(sf, arg))) {
91411
- const children = arg.children.filter((c) => !(ts6.isJsxText(c) && c.containsOnlyTriviaWhiteSpaces));
91412
- if (!children.length) return {
91413
- status: "unrecognised",
91414
- reason: "<StrictMode> renders nothing"
91415
- };
91416
- start = children[0].getStart(sf);
91417
- end = children[children.length - 1].getEnd();
91418
- insideStrictMode = true;
91419
- } else {
91420
- start = arg.getStart(sf);
91421
- end = arg.getEnd();
91813
+ return {
91814
+ taken: identifiers(sf).some((id2) => id2.text === "lua" && declares(id2))
91815
+ };
91816
+ }
91817
+ __name(luaBinding, "luaBinding");
91818
+ function hookResultUse(sf, call2) {
91819
+ if (call2.arguments.length) return "unknown";
91820
+ const pattern = /* @__PURE__ */ __name((b) => b.elements.some((e) => e.dotDotDotToken) ? "unknown" : b.elements.some((e) => (e.propertyName ?? e.name).getText(sf) === "isOpen") ? "isOpen" : "ok", "pattern");
91821
+ let node = call2;
91822
+ while (ts6.isParenthesizedExpression(node.parent)) node = node.parent;
91823
+ const p = node.parent;
91824
+ if (ts6.isPropertyAccessExpression(p) && p.expression === node) return p.name.text === "isOpen" ? "isOpen" : "ok";
91825
+ if (!ts6.isVariableDeclaration(p) || p.initializer !== node) return "unknown";
91826
+ if (ts6.isObjectBindingPattern(p.name)) return pattern(p.name);
91827
+ if (!ts6.isIdentifier(p.name)) return "unknown";
91828
+ const name = p.name;
91829
+ let use = "ok";
91830
+ for (const ref of identifiers(sf)) {
91831
+ if (ref === name || ref.text !== name.text || declares(ref) || !isReference(ref)) continue;
91832
+ const q = ref.parent;
91833
+ const here = ts6.isPropertyAccessExpression(q) && q.expression === ref ? q.name.text === "isOpen" ? "isOpen" : "ok" : ts6.isVariableDeclaration(q) && q.initializer === ref && ts6.isObjectBindingPattern(q.name) ? pattern(q.name) : ts6.isArrayLiteralExpression(q) ? "ok" : "unknown";
91834
+ if (here === "isOpen") return "isOpen";
91835
+ if (here === "unknown") use = "unknown";
91836
+ }
91837
+ return use;
91838
+ }
91839
+ __name(hookResultUse, "hookResultUse");
91840
+ function notAtModuleScope(sf, el, expr, statement) {
91841
+ let readsThis = false;
91842
+ const findThis = /* @__PURE__ */ __name((n2) => {
91843
+ if (n2.kind === ts6.SyntaxKind.ThisKeyword) readsThis = true;
91844
+ ts6.forEachChild(n2, findThis);
91845
+ }, "findThis");
91846
+ findThis(expr);
91847
+ if (readsThis) return "its context reads this";
91848
+ const used = new Set(identifiers(expr).filter(isReference).map((i) => i.text));
91849
+ for (let n2 = el.parent; n2 !== sf; n2 = n2.parent) {
91850
+ if (!ts6.isFunctionLike(n2)) continue;
91851
+ const local = /* @__PURE__ */ new Set();
91852
+ const collect2 = /* @__PURE__ */ __name((m) => {
91853
+ if (m === expr) return;
91854
+ if (ts6.isIdentifier(m) && declares(m)) local.add(m.text);
91855
+ ts6.forEachChild(m, collect2);
91856
+ }, "collect");
91857
+ collect2(n2);
91858
+ const hit = [
91859
+ ...used
91860
+ ].find((u) => local.has(u));
91861
+ if (hit) return `its context reads ${hit}, local to the component`;
91862
+ }
91863
+ const at = statement.getStart(sf);
91864
+ for (const s of sf.statements.filter((t) => t.getStart(sf) >= at)) {
91865
+ const names = ts6.isVariableStatement(s) ? s.declarationList.declarations.flatMap((d) => identifiers(d.name).filter(declares)) : (ts6.isClassDeclaration(s) || ts6.isEnumDeclaration(s)) && s.name ? [
91866
+ s.name
91867
+ ] : [];
91868
+ const hit = names.find((n2) => used.has(n2.text));
91869
+ if (hit) return `its context reads ${hit.text}, declared after it`;
91422
91870
  }
91423
- const eol = source.includes("\r\n") ? "\r\n" : "\n";
91424
- const inner = source.slice(start, end);
91425
- const lineStart = source.lastIndexOf("\n", start - 1) + 1;
91426
- const indent = source.slice(lineStart, start);
91427
- let wrapped;
91428
- if (/^[ \t]*$/.test(indent)) {
91429
- const step3 = /^\t+$/.test(indent) ? " " : " ";
91430
- const moved = inner.split("\n").map((line, i) => i === 0 || !line.trim() ? line : step3 + line).join("\n");
91431
- wrapped = (insideStrictMode ? `{/* ${PANE_COMMENT} */}${eol}${indent}` : "") + `<AgentPaneLayout>${eol}${indent}${step3}${moved}${eol}${indent}</AgentPaneLayout>`;
91432
- } else {
91433
- wrapped = `<AgentPaneLayout>${inner}</AgentPaneLayout>`;
91871
+ return void 0;
91872
+ }
91873
+ __name(notAtModuleScope, "notAtModuleScope");
91874
+ function unwrapLayout(sf, source, el) {
91875
+ const kids = el.children.filter((c) => !(ts6.isJsxText(c) && c.containsOnlyTriviaWhiteSpaces));
91876
+ const inJsx = ts6.isJsxElement(el.parent) || ts6.isJsxFragment(el.parent);
91877
+ const only = kids.length === 1 ? kids[0] : void 0;
91878
+ if (!inJsx && !(only && (ts6.isJsxElement(only) || ts6.isJsxSelfClosingElement(only) || ts6.isJsxFragment(only)))) {
91879
+ return [
91880
+ {
91881
+ start: el.openingElement.getStart(sf),
91882
+ end: el.openingElement.getEnd(),
91883
+ text: "<>"
91884
+ },
91885
+ {
91886
+ start: el.closingElement.getStart(sf),
91887
+ end: el.closingElement.getEnd(),
91888
+ text: "</>"
91889
+ }
91890
+ ];
91434
91891
  }
91435
- let out = source.slice(0, start) + wrapped + source.slice(end);
91436
- if (!importedFromChat) {
91437
- const imports = sf.statements.filter(ts6.isImportDeclaration);
91438
- const anchor = imports.find((d) => ts6.isStringLiteral(d.moduleSpecifier) && d.moduleSpecifier.text === APP_CLIENT) ?? imports.filter((d) => d.importClause).at(-1) ?? imports.at(-1);
91439
- if (anchor) {
91440
- const text2 = anchor.getText(sf);
91441
- const quote = anchor.moduleSpecifier.getText(sf)[0];
91442
- const line = `import { AgentPaneLayout } from ${quote}${APP_CHAT}${quote}${text2.trimEnd().endsWith(";") ? ";" : ""}`;
91443
- out = out.slice(0, anchor.getEnd()) + eol + line + out.slice(anchor.getEnd());
91444
- } else {
91445
- out = `import { AgentPaneLayout } from '${APP_CHAT}';${eol}` + out;
91892
+ let start = el.getStart(sf);
91893
+ if (!kids.length) {
91894
+ const [s, e] = lineSpan(source, start, el.getEnd());
91895
+ return [
91896
+ {
91897
+ start: s,
91898
+ end: e,
91899
+ text: ""
91900
+ }
91901
+ ];
91902
+ }
91903
+ const first = kids[0].getStart(sf);
91904
+ let inner = source.slice(first, kids[kids.length - 1].getEnd());
91905
+ const own = indentAt(source, start);
91906
+ const kid = indentAt(source, first);
91907
+ if (own !== void 0 && kid !== void 0 && kid.length > own.length && kid.startsWith(own)) {
91908
+ const deeper = kid;
91909
+ inner = inner.split("\n").map((line, i) => i > 0 && line.startsWith(deeper) ? own + line.slice(deeper.length) : line).join("\n");
91910
+ }
91911
+ if (inJsx && own !== void 0) {
91912
+ const siblings = el.parent.children.filter((c) => !(ts6.isJsxText(c) && c.containsOnlyTriviaWhiteSpaces));
91913
+ const prev = siblings[siblings.indexOf(el) - 1];
91914
+ if (prev && ts6.isJsxExpression(prev) && !prev.expression && prev.getText(sf).startsWith(PANE_COMMENT_PREFIX) && indentAt(source, prev.getStart(sf)) !== void 0) {
91915
+ start = prev.getStart(sf);
91446
91916
  }
91447
91917
  }
91448
- if (syntaxErrors(file, out) > syntaxErrors(file, source)) {
91918
+ return [
91919
+ {
91920
+ start,
91921
+ end: el.getEnd(),
91922
+ text: inner
91923
+ }
91924
+ ];
91925
+ }
91926
+ __name(unwrapLayout, "unwrapLayout");
91927
+ function insertBefore(sf, statement, line, eol) {
91928
+ const prev = sf.statements[sf.statements.indexOf(statement) - 1];
91929
+ if (!prev) {
91930
+ const semi2 = statement.getText(sf).trimEnd().endsWith(";") ? ";" : "";
91449
91931
  return {
91450
- status: "unrecognised",
91451
- reason: "the edit would not parse"
91932
+ start: statement.getStart(sf),
91933
+ end: statement.getStart(sf),
91934
+ text: `${line}${semi2}${eol}`
91452
91935
  };
91453
91936
  }
91937
+ const semi = prev.getText(sf).trimEnd().endsWith(";") ? ";" : "";
91938
+ const gap = ts6.isImportDeclaration(prev) ? eol : "";
91454
91939
  return {
91455
- status: "added",
91456
- content: out
91940
+ start: prev.getEnd(),
91941
+ end: prev.getEnd(),
91942
+ text: `${eol}${gap}${line}${semi}`
91457
91943
  };
91458
91944
  }
91459
- __name(addAgentPane, "addAgentPane");
91460
- function addPaneStyles(source) {
91461
- if (source.includes(PANE_CSS)) return {
91462
- status: "present"
91945
+ __name(insertBefore, "insertBefore");
91946
+ function tidyImports(file, source, needLua, eol) {
91947
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
91948
+ const referenced = new Set(identifiers(sf).filter((id2) => !insideImport(id2)).map((id2) => id2.text));
91949
+ const edits = [];
91950
+ let luaPlaced = !needLua || luaBinding(sf).local !== void 0;
91951
+ const luaImport = /* @__PURE__ */ __name((d) => {
91952
+ const quote = d.moduleSpecifier.getText(sf)[0];
91953
+ return `import { lua } from ${quote}${APP_CLIENT}${quote}${d.getText(sf).trimEnd().endsWith(";") ? ";" : ""}`;
91954
+ }, "luaImport");
91955
+ if (!luaPlaced) {
91956
+ const host = sf.statements.find((d) => importsFrom(d, APP_CLIENT) && !!namedImports(d));
91957
+ if (host) {
91958
+ const named = namedImports(host);
91959
+ const last = named.elements[named.elements.length - 1];
91960
+ edits.push(last ? {
91961
+ start: last.getEnd(),
91962
+ end: last.getEnd(),
91963
+ text: ", lua"
91964
+ } : {
91965
+ start: named.getStart(sf),
91966
+ end: named.getEnd(),
91967
+ text: "{ lua }"
91968
+ });
91969
+ luaPlaced = true;
91970
+ }
91971
+ }
91972
+ for (const d of sf.statements) {
91973
+ if (!importsFrom(d, APP_CHAT)) continue;
91974
+ const named = namedImports(d);
91975
+ if (!named) continue;
91976
+ const kept = named.elements.filter((e) => !(PANE_EXPORTS.has((e.propertyName ?? e.name).text) && !referenced.has(e.name.text)));
91977
+ if (kept.length === named.elements.length) continue;
91978
+ if (kept.length) {
91979
+ edits.push({
91980
+ start: named.getStart(sf),
91981
+ end: named.getEnd(),
91982
+ text: `{ ${kept.map((e) => e.getText(sf)).join(", ")} }`
91983
+ });
91984
+ } else if (d.importClause.name) {
91985
+ edits.push({
91986
+ start: d.importClause.name.getEnd(),
91987
+ end: named.getEnd(),
91988
+ text: ""
91989
+ });
91990
+ } else if (!luaPlaced) {
91991
+ edits.push({
91992
+ start: d.getStart(sf),
91993
+ end: d.getEnd(),
91994
+ text: luaImport(d)
91995
+ });
91996
+ luaPlaced = true;
91997
+ } else {
91998
+ const [start, end] = lineSpan(source, d.getStart(sf), d.getEnd());
91999
+ edits.push({
92000
+ start,
92001
+ end,
92002
+ text: ""
92003
+ });
92004
+ }
92005
+ }
92006
+ if (!luaPlaced) {
92007
+ const imports = sf.statements.filter(ts6.isImportDeclaration);
92008
+ const anchor = imports.filter((d) => d.importClause).at(-1) ?? imports.at(-1);
92009
+ edits.push(anchor ? {
92010
+ start: anchor.getEnd(),
92011
+ end: anchor.getEnd(),
92012
+ text: eol + luaImport(anchor)
92013
+ } : {
92014
+ start: 0,
92015
+ end: 0,
92016
+ text: `import { lua } from '${APP_CLIENT}';${eol}`
92017
+ });
92018
+ }
92019
+ return applySplices(source, edits);
92020
+ }
92021
+ __name(tidyImports, "tidyImports");
92022
+ function removeAgentPane(file, source) {
92023
+ if (!source.includes(APP_CHAT)) return {
92024
+ status: "none"
91463
92025
  };
92026
+ const parse = /* @__PURE__ */ __name((text2) => ts6.createSourceFile(file, text2, ts6.ScriptTarget.Latest, true, scriptKind(file)), "parse");
92027
+ const sf = parse(source);
92028
+ const lua = luaBinding(sf);
92029
+ const luaName = lua.local ?? "lua";
91464
92030
  const eol = source.includes("\r\n") ? "\r\n" : "\n";
91465
- const ui = /^[ \t]*@import\s+(?:url\(\s*)?(['"])@lua-ai-global\/ui\/styles\.css\1[^;\n]*;[^\n]*$/m.exec(source);
91466
- const insertAfter = /* @__PURE__ */ __name((index, quote) => source.slice(0, index) + eol + `${PANE_CSS_COMMENT}${eol}@import ${quote}${PANE_CSS}${quote};` + source.slice(index), "insertAfter");
91467
- if (ui) return {
91468
- status: "added",
91469
- content: insertAfter(ui.index + ui[0].length, ui[1])
91470
- };
91471
- const imports = [
91472
- ...source.matchAll(/^[ \t]*@import\b[^;\n]*;[^\n]*$/gm)
91473
- ];
91474
- const warning = `No @import of ${UI}/styles.css in web/src/index.css: the pane's styles were added ${imports.length ? "after the last @import" : "at the top"}; they belong after the design system's.`;
91475
- if (imports.length) {
91476
- const last = imports[imports.length - 1];
92031
+ const analyse = /* @__PURE__ */ __name((sf2) => {
92032
+ const layouts = chatLocals(sf2, "AgentPaneLayout");
92033
+ const hooks = chatLocals(sf2, "useAgentPane");
92034
+ const panes = chatLocals(sf2, "AgentPane");
92035
+ const reasons = [];
92036
+ const elements = [];
92037
+ const contexts = [];
92038
+ const calls = [];
92039
+ const top = /* @__PURE__ */ __name((n2) => {
92040
+ while (n2.parent !== sf2) n2 = n2.parent;
92041
+ return n2;
92042
+ }, "top");
92043
+ const layout = /* @__PURE__ */ __name((tag, el) => {
92044
+ for (let n2 = el.parent; n2 !== sf2; n2 = n2.parent) {
92045
+ if (ts6.isJsxElement(n2) && layouts.has(tagName2(sf2, n2))) {
92046
+ reasons.push(`<${tag}> sits inside another`);
92047
+ return;
92048
+ }
92049
+ }
92050
+ const attrs = el.openingElement.attributes.properties;
92051
+ if (!attrs.length) {
92052
+ elements.push(el);
92053
+ return;
92054
+ }
92055
+ const attr = attrs[0];
92056
+ if (attrs.length > 1 || !ts6.isJsxAttribute(attr) || attr.name.getText(sf2) !== "context") {
92057
+ const names = attrs.map((a) => ts6.isJsxAttribute(a) ? a.name.getText(sf2) : "{...}");
92058
+ reasons.push(`<${tag}> has props (${names.join(", ")}): context becomes lua.pane.setContext(...), the others have no equivalent (the platform pane owns them)`);
92059
+ return;
92060
+ }
92061
+ const init3 = attr.initializer;
92062
+ const expr = init3 && (ts6.isStringLiteral(init3) ? init3 : ts6.isJsxExpression(init3) ? init3.expression : void 0);
92063
+ if (init3 && !expr) {
92064
+ reasons.push(`<${tag}>'s context is not an expression this can move`);
92065
+ return;
92066
+ }
92067
+ const statement = top(el);
92068
+ const why = expr && notAtModuleScope(sf2, el, expr, statement);
92069
+ if (why) {
92070
+ reasons.push(`<${tag} context>: ${why}, so call lua.pane.setContext(...) where it is in scope`);
92071
+ return;
92072
+ }
92073
+ contexts.push({
92074
+ text: expr ? expr.getText(sf2) : "true",
92075
+ statement
92076
+ });
92077
+ elements.push(el);
92078
+ }, "layout");
92079
+ const visit = /* @__PURE__ */ __name((node) => {
92080
+ if (ts6.isJsxElement(node) || ts6.isJsxSelfClosingElement(node)) {
92081
+ const tag = tagName2(sf2, node);
92082
+ if (panes.has(tag)) {
92083
+ reasons.push(`it renders <${tag}> from ${APP_CHAT}; the platform pane replaces it, so remove it (lua.pane reaches only the platform pane, never a bundled <AgentPane>, so this app's lua.pane calls already talk to the platform pane)`);
92084
+ } else if (layouts.has(tag)) {
92085
+ if (ts6.isJsxElement(node)) layout(tag, node);
92086
+ else reasons.push(`<${tag} /> wraps nothing`);
92087
+ }
92088
+ }
92089
+ if (ts6.isCallExpression(node) && ts6.isIdentifier(node.expression) && hooks.has(node.expression.text)) {
92090
+ const use = hookResultUse(sf2, node);
92091
+ const hook = node.expression.text;
92092
+ if (use === "isOpen") {
92093
+ reasons.push(`it reads isOpen from ${hook}() (lua.pane has none: the Workspace owns whether the pane is open)`);
92094
+ } else if (use === "unknown") {
92095
+ reasons.push(`it uses ${hook}()'s result in a way this does not follow`);
92096
+ } else calls.push(node);
92097
+ }
92098
+ ts6.forEachChild(node, visit);
92099
+ }, "visit");
92100
+ visit(sf2);
92101
+ return {
92102
+ reasons: [
92103
+ ...new Set(reasons)
92104
+ ],
92105
+ elements,
92106
+ contexts,
92107
+ calls
92108
+ };
92109
+ }, "analyse");
92110
+ const found = analyse(sf);
92111
+ const needLua = found.calls.length > 0 || found.contexts.length > 0;
92112
+ if (needLua && lua.taken) found.reasons.push("lua already names something else here, so lua.pane cannot be used");
92113
+ if (found.reasons.length) return {
92114
+ status: "manual",
92115
+ reasons: found.reasons
92116
+ };
92117
+ const step1 = applySplices(source, found.calls.map((c) => ({
92118
+ start: c.getStart(sf),
92119
+ end: c.getEnd(),
92120
+ text: `${luaName}.pane`
92121
+ })));
92122
+ const sf1 = parse(step1);
92123
+ const again = analyse(sf1);
92124
+ const step22 = applySplices(step1, [
92125
+ ...again.elements.flatMap((el) => unwrapLayout(sf1, step1, el)),
92126
+ ...again.contexts.map(({ text: text2, statement }) => insertBefore(sf1, statement, `${luaName}.pane.setContext(${text2})`, eol))
92127
+ ]);
92128
+ const out = tidyImports(file, step22, needLua, eol);
92129
+ if (out === source) return {
92130
+ status: "none"
92131
+ };
92132
+ if (syntaxErrors(file, out) > syntaxErrors(file, source)) {
91477
92133
  return {
91478
- status: "added",
91479
- content: insertAfter(last.index + last[0].length, "'"),
91480
- warning
92134
+ status: "manual",
92135
+ reasons: [
92136
+ "the edit would not parse"
92137
+ ]
91481
92138
  };
91482
92139
  }
92140
+ const summary = [
92141
+ ...found.elements.length ? [
92142
+ "<AgentPaneLayout> removed (the platform pane replaces it)"
92143
+ ] : [],
92144
+ ...found.contexts.length ? [
92145
+ `its context \u2192 ${luaName}.pane.setContext(...)`
92146
+ ] : [],
92147
+ ...found.calls.length ? [
92148
+ `useAgentPane() \u2192 ${luaName}.pane`
92149
+ ] : []
92150
+ ];
91483
92151
  return {
91484
- status: "added",
91485
- content: `${PANE_CSS_COMMENT}${eol}@import '${PANE_CSS}';${eol}${source}`,
91486
- warning
92152
+ status: "edited",
92153
+ content: out,
92154
+ summary: summary.length ? summary : [
92155
+ `unused import from ${APP_CHAT} removed`
92156
+ ],
92157
+ usesPaneApi: needLua
91487
92158
  };
91488
92159
  }
91489
- __name(addPaneStyles, "addPaneStyles");
92160
+ __name(removeAgentPane, "removeAgentPane");
92161
+ function chatReferences(file, source) {
92162
+ if (!source.includes(APP_CHAT)) return {
92163
+ uses: [],
92164
+ styles: false
92165
+ };
92166
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
92167
+ const uses = /* @__PURE__ */ new Set();
92168
+ let styles = false;
92169
+ const fromChat = /* @__PURE__ */ __name((e) => !!e && ts6.isStringLiteral(e) && (e.text === APP_CHAT || e.text.startsWith(`${APP_CHAT}/`)), "fromChat");
92170
+ const visit = /* @__PURE__ */ __name((node) => {
92171
+ if (ts6.isImportDeclaration(node) && fromChat(node.moduleSpecifier)) {
92172
+ const clause = node.importClause;
92173
+ const b = clause?.namedBindings;
92174
+ if (!clause) {
92175
+ if (node.moduleSpecifier.text === PANE_CSS) styles = true;
92176
+ else uses.add(node.moduleSpecifier.text);
92177
+ } else {
92178
+ if (clause.name) uses.add(clause.name.text);
92179
+ if (b && ts6.isNamespaceImport(b)) uses.add(`* as ${b.name.text}`);
92180
+ if (b && ts6.isNamedImports(b)) for (const e of b.elements) uses.add((e.propertyName ?? e.name).text);
92181
+ if (!clause.name && b && ts6.isNamedImports(b) && !b.elements.length) uses.add(node.moduleSpecifier.text);
92182
+ }
92183
+ } else if (ts6.isExportDeclaration(node) && fromChat(node.moduleSpecifier)) {
92184
+ uses.add(`export \u2026 from '${node.moduleSpecifier.text}'`);
92185
+ } else if (ts6.isCallExpression(node) && node.expression.kind === ts6.SyntaxKind.ImportKeyword && fromChat(node.arguments[0])) {
92186
+ uses.add(`import('${node.arguments[0].text}')`);
92187
+ }
92188
+ ts6.forEachChild(node, visit);
92189
+ }, "visit");
92190
+ visit(sf);
92191
+ return {
92192
+ uses: [
92193
+ ...uses
92194
+ ],
92195
+ styles
92196
+ };
92197
+ }
92198
+ __name(chatReferences, "chatReferences");
92199
+ function dropChatStyleImports(file, source) {
92200
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
92201
+ const edits = sf.statements.filter((d) => importsFrom(d, PANE_CSS) && !d.importClause).map((d) => {
92202
+ const [start, end] = lineSpan(source, d.getStart(sf), d.getEnd());
92203
+ return {
92204
+ start,
92205
+ end,
92206
+ text: ""
92207
+ };
92208
+ });
92209
+ return edits.length ? applySplices(source, edits) : null;
92210
+ }
92211
+ __name(dropChatStyleImports, "dropChatStyleImports");
92212
+ function removePaneStyles(source) {
92213
+ const re = /^[ \t]*@import\s+(?:url\(\s*)?(['"])@lua-ai-global\/app-chat\/styles\.css\1[^;\n]*;[^\n]*(?:\n|$)/m;
92214
+ let out = source;
92215
+ for (let m = re.exec(out); m; m = re.exec(out)) {
92216
+ let start = m.index;
92217
+ if (start > 0) {
92218
+ const above = out.lastIndexOf("\n", start - 2) + 1;
92219
+ if (out.slice(above, start).trim() === PANE_CSS_COMMENT) start = above;
92220
+ }
92221
+ out = out.slice(0, start) + out.slice(m.index + m[0].length);
92222
+ }
92223
+ return out === source ? null : out;
92224
+ }
92225
+ __name(removePaneStyles, "removePaneStyles");
92226
+ var escapeRegExp = /* @__PURE__ */ __name((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "escapeRegExp");
92227
+ function whitespaceInsensitive(lines) {
92228
+ const anySpace = "[ \\t]*";
92229
+ const line = /* @__PURE__ */ __name((text2) => anySpace + [
92230
+ ...text2.replace(/\s+/g, "")
92231
+ ].map(escapeRegExp).join(anySpace) + anySpace, "line");
92232
+ return new RegExp(`^${lines.map(line).join("\\r?\\n")}\\r?\\n`, "m");
92233
+ }
92234
+ __name(whitespaceInsensitive, "whitespaceInsensitive");
92235
+ var THEME_BLOCK = whitespaceInsensitive(TEMPLATE_THEME_LINES);
92236
+ function removeThemeLines(file, source) {
92237
+ const match = THEME_BLOCK.exec(source);
92238
+ if (!match) return null;
92239
+ const end = match.index + match[0].length;
92240
+ const blank = /^[ \t]*\r?\n/.exec(source.slice(end))?.[0].length ?? 0;
92241
+ const out = source.slice(0, match.index) + source.slice(end + blank);
92242
+ const sf = ts6.createSourceFile(file, out, ts6.ScriptTarget.Latest, true, scriptKind(file));
92243
+ if (luaBinding(sf).local !== "lua") return null;
92244
+ return identifiers(sf).some((id2) => id2.text === "lua" && !insideImport(id2) && isReference(id2)) ? out : null;
92245
+ }
92246
+ __name(removeThemeLines, "removeThemeLines");
91490
92247
  function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91491
92248
  const { pagesDir } = target;
91492
92249
  const contents = /* @__PURE__ */ new Map();
@@ -91501,18 +92258,7 @@ function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91501
92258
  summary
91502
92259
  ]);
91503
92260
  }, "change");
91504
- const pkgFile = path32.join(pagesDir, "package.json");
91505
- try {
91506
- const pkg2 = planPackageJson(fs26.readFileSync(pkgFile, "utf8"), templateRanges(templateRoot));
91507
- if (pkg2.content) change(pkgFile, pkg2.content, pkg2.changes.join(", "));
91508
- warnings.push(...pkg2.warnings);
91509
- } catch (error) {
91510
- if (!(error instanceof SyntaxError)) throw error;
91511
- manual.push([
91512
- "web/package.json is not plain JSON, so it was left as is. In web/:",
91513
- ` npm i ${UPGRADED_PACKAGES.map((n2) => `${n2}@"${templateRanges(templateRoot)[n2]}"`).join(" ")}`
91514
- ]);
91515
- }
92261
+ const inWeb = /* @__PURE__ */ __name((file) => `web/${path32.relative(pagesDir, file).split(path32.sep).join("/")}`, "inWeb");
91516
92262
  const srcDir = path32.join(pagesDir, "src");
91517
92263
  const clientFile = path32.join(srcDir, "lua", "client.ts");
91518
92264
  let clientKept = false;
@@ -91529,47 +92275,117 @@ function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91529
92275
  manual.push([
91530
92276
  "web/src/lua/client.ts is the copied app client, edited since `lua apps new` wrote it, so it was kept.",
91531
92277
  ` Switch by hand: import from '${APP_CLIENT}' where the pages import './lua/client', bring over any`,
91532
- " change of yours the package lacks, delete web/src/lua/client.ts, then run lua apps upgrade again",
91533
- " (the agent pane talks through the package client, so it is added only after the switch)."
92278
+ " change of yours the package lacks, delete web/src/lua/client.ts, then run lua apps upgrade again."
91534
92279
  ]);
91535
92280
  }
91536
92281
  }
92282
+ let usesPaneApi = false;
92283
+ let paneRemoved = false;
92284
+ const stillImporting = [];
92285
+ const styleImporters = [];
92286
+ const leftAlone = /* @__PURE__ */ new Set();
91537
92287
  if (!clientKept) {
91538
- const mainFile = [
91539
- "main.tsx",
91540
- "main.jsx"
91541
- ].map((f) => path32.join(srcDir, f)).find((f) => fs26.existsSync(f));
91542
- const pane = mainFile ? addAgentPane(mainFile, read(mainFile)) : void 0;
91543
- if (mainFile && pane?.status === "added") change(mainFile, pane.content, "<AgentPaneLayout> around the app");
91544
- else if (!pane || pane.status === "unrecognised") {
91545
- manual.push([
91546
- `web/src/${mainFile ? path32.basename(mainFile) : "main.tsx"} was not edited (${pane ? pane.reason : "there is no web/src/main.tsx"}). By hand,`,
91547
- ...MANUAL_PANE_EDIT.map((l) => ` ${l}`)
91548
- ]);
92288
+ for (const file of sourceFiles(srcDir)) {
92289
+ if (contents.get(file) === null) continue;
92290
+ const edit = removeAgentPane(file, read(file));
92291
+ if (edit.status === "edited") {
92292
+ change(file, edit.content, edit.summary.join("; "));
92293
+ usesPaneApi ||= edit.usesPaneApi;
92294
+ paneRemoved = true;
92295
+ } else if (edit.status === "manual") {
92296
+ manual.push([
92297
+ `${inWeb(file)} was not edited: ${edit.reasons.join("; ")}.`
92298
+ ]);
92299
+ leftAlone.add(file);
92300
+ }
92301
+ const refs = chatReferences(file, read(file));
92302
+ if (refs.uses.length) stillImporting.push(`${inWeb(file)} (${refs.uses.join(", ")})`);
92303
+ if (refs.styles) styleImporters.push(file);
92304
+ }
92305
+ }
92306
+ const pkgFile = path32.join(pagesDir, "package.json");
92307
+ const pkgSource = fs26.readFileSync(pkgFile, "utf8");
92308
+ const ranges = templateRanges(templateRoot);
92309
+ const clientFloor = rangeFloor(ranges[APP_CLIENT]);
92310
+ if (usesPaneApi && (!clientFloor || compareFloors(clientFloor, rangeFloor(PANE_API_CLIENT_RANGE)) < 0)) {
92311
+ ranges[APP_CLIENT] = PANE_API_CLIENT_RANGE;
92312
+ }
92313
+ let pkg2;
92314
+ try {
92315
+ pkg2 = JSON.parse(pkgSource);
92316
+ } catch (error) {
92317
+ if (!(error instanceof SyntaxError)) throw error;
92318
+ }
92319
+ const hasChat = !!pkg2 && [
92320
+ pkg2.dependencies,
92321
+ pkg2.devDependencies
92322
+ ].some((d) => d?.[APP_CHAT] !== void 0);
92323
+ const dropChat = hasChat && !clientKept && !stillImporting.length;
92324
+ const designChanged = !!pkg2 && movesToNewerDesign(pkg2, ranges[UI]);
92325
+ if (pkg2) {
92326
+ const plan = planPackageJson(pkgSource, ranges, dropChat ? [
92327
+ APP_CHAT
92328
+ ] : []);
92329
+ if (plan.content) change(pkgFile, plan.content, plan.changes.join(", "));
92330
+ warnings.push(...plan.warnings);
92331
+ } else {
92332
+ manual.push([
92333
+ "web/package.json is not plain JSON, so it was left as is. In web/:",
92334
+ ` npm i ${UPGRADED_PACKAGES.map((n2) => `${n2}@"${ranges[n2]}"`).join(" ")}`,
92335
+ ...pkgSource.includes(APP_CHAT) && !stillImporting.length ? [
92336
+ ` npm uninstall ${APP_CHAT} (and remove the @import of its styles from web/src/index.css)`
92337
+ ] : []
92338
+ ]);
92339
+ }
92340
+ if (hasChat && stillImporting.length) {
92341
+ manual.push([
92342
+ `${APP_CHAT} was kept in web/package.json: ${stillImporting.join(", ")} still ${stillImporting.length === 1 ? "imports" : "import"} it. By hand,`,
92343
+ ...MANUAL_PANE_EDIT.map((l) => ` ${l}`)
92344
+ ]);
92345
+ }
92346
+ if (dropChat) {
92347
+ for (const file of styleImporters) {
92348
+ const next = dropChatStyleImports(file, read(file));
92349
+ if (next !== null) change(file, next, `import of ${PANE_CSS} removed`);
91549
92350
  }
91550
92351
  const cssFile = path32.join(srcDir, "index.css");
91551
- if (fs26.existsSync(cssFile)) {
91552
- const css = addPaneStyles(read(cssFile));
91553
- if (css.status === "added") change(cssFile, css.content, `@import '${PANE_CSS}'`);
91554
- if (css.warning) warnings.push(css.warning);
91555
- } else {
91556
- manual.push([
91557
- `There is no web/src/index.css. Import the pane's styles after ${UI}/styles.css wherever your styles load:`,
91558
- ` @import '${PANE_CSS}';`
91559
- ]);
92352
+ const css = fs26.existsSync(cssFile) ? removePaneStyles(read(cssFile)) : null;
92353
+ if (css !== null) change(cssFile, css, `@import '${PANE_CSS}' removed`);
92354
+ paneRemoved = true;
92355
+ }
92356
+ const mainFile = path32.join(srcDir, "main.tsx");
92357
+ let themeRemoved = false;
92358
+ if (!clientKept && !leftAlone.has(mainFile) && fs26.existsSync(mainFile)) {
92359
+ let planned;
92360
+ try {
92361
+ planned = JSON.parse(contents.get(pkgFile) ?? pkgSource);
92362
+ } catch (error) {
92363
+ if (!(error instanceof SyntaxError)) throw error;
92364
+ }
92365
+ const range2 = planned?.dependencies?.[APP_CLIENT] ?? planned?.devDependencies?.[APP_CLIENT];
92366
+ const floor = typeof range2 === "string" ? rangeFloor(range2) : void 0;
92367
+ if (floor && compareFloors(floor, rangeFloor(THEME_CLIENT_RANGE)) >= 0) {
92368
+ const next = removeThemeLines(mainFile, read(mainFile));
92369
+ if (next !== null) {
92370
+ change(mainFile, next, "theme lines removed (app-client applies the shell's theme)");
92371
+ themeRemoved = true;
92372
+ }
91560
92373
  }
91561
92374
  }
91562
92375
  return {
91563
92376
  target,
91564
92377
  changes: [
91565
92378
  ...contents.entries()
91566
- ].map(([file, content]) => ({
92379
+ ].sort(([a], [b]) => Number(b === pkgFile) - Number(a === pkgFile)).map(([file, content]) => ({
91567
92380
  file,
91568
92381
  content,
91569
92382
  summary: summaries.get(file).join("; ")
91570
92383
  })),
91571
92384
  warnings,
91572
- manual
92385
+ manual,
92386
+ paneRemoved,
92387
+ designChanged,
92388
+ themeRemoved
91573
92389
  };
91574
92390
  }
91575
92391
  __name(planWebAppUpgrade, "planWebAppUpgrade");
@@ -91631,6 +92447,12 @@ async function appsUpgradeCommand(name, opts = {}, deps = {}) {
91631
92447
  for (const c of plan.changes) {
91632
92448
  writeInfo(` ${c.content === null ? "delete" : "update"} ${rel(c.file).padEnd(width)} ${c.summary}`);
91633
92449
  }
92450
+ if (plan.designChanged) {
92451
+ writeInfo(` \u2139\uFE0F ${UI} moves to the current Lua design: buttons, inputs, tabs and cards get smaller and flatter. No code changes are needed; look over the pages with lua apps dev ${name} before you push.`);
92452
+ }
92453
+ if (plan.paneRemoved) {
92454
+ writeInfo(" \u2139\uFE0F The agent pane now comes from the platform: deployed, the app gets it in the Workspace (the top-bar button opens it). lua apps dev serves no pane.");
92455
+ }
91634
92456
  printLeftovers();
91635
92457
  if (opts.dryRun) {
91636
92458
  writeInfo("\nDry run: nothing was written.");
@@ -91667,21 +92489,24 @@ async function appsUpgradeCommand(name, opts = {}, deps = {}) {
91667
92489
  installed = status === 0;
91668
92490
  if (!installed) {
91669
92491
  throw new CliError("install_failed", `The upgrade was written to ${pagesRel}, but npm install there failed (exit ${status ?? "signal"}).`, {
91670
- hint: `The files are already upgraded; only the install is missing. Run: cd ${pagesRel} && npm install`
92492
+ hint: `The files are already upgraded; only the install is missing. Run: cd ${pagesRel} && npm install` + (plan.themeRemoved ? ` (${THEME_INSTALL_NOTE}).` : "")
91671
92493
  });
91672
92494
  }
91673
92495
  }
92496
+ if (opts.skipInstall && plan.themeRemoved) {
92497
+ writeInfo(` \u26A0\uFE0F Run npm install in ${pagesRel} before lua apps dev or lua push: ${THEME_INSTALL_NOTE}.`);
92498
+ }
91674
92499
  writeHintBlock({
91675
92500
  headline: "Next:",
91676
92501
  lines: [
91677
92502
  ...opts.skipInstall ? [
91678
92503
  {
91679
- label: "Install pages:",
92504
+ label: plan.themeRemoved ? "Install pages (required):" : "Install pages:",
91680
92505
  command: `cd ${pagesRel} && npm install`
91681
92506
  }
91682
92507
  ] : [],
91683
92508
  {
91684
- label: target.agentPaneOff ? "Run locally:" : "Try the pane:",
92509
+ label: "Run locally:",
91685
92510
  command: `lua apps dev ${name}`
91686
92511
  },
91687
92512
  {
@@ -93389,18 +94214,27 @@ Examples:
93389
94214
  $ lua apps delete hello --ci --code 123456 Delete with the emailed code
93390
94215
  $ lua apps delete hello --agent agent_123 Outside the agent's project
93391
94216
  `).action((name, opts) => appsDeleteCommand(name, opts));
93392
- appsGroup.command("upgrade <name>").description("Bring a web app made by an older lua apps new up to the current template (agent pane, app-client)").option("--dry-run", "Print the changes and write nothing").option("--force", "Apply without asking").option("--skip-install", "Do not run npm install in web/ afterwards").addHelpText("after", `
94217
+ appsGroup.command("upgrade <name>").description("Bring a web app made by an older lua apps new up to the current template (platform agent pane, app-client)").option("--dry-run", "Print the changes and write nothing").option("--force", "Apply without asking").option("--skip-install", "Do not run npm install in web/ afterwards").addHelpText("after", `
93393
94218
  Edits the app's pages in place, like the template lua apps new writes today:
93394
- web/package.json @lua-ai-global/app-chat, app-client and ui at least at the
93395
- template's ranges (a newer range of yours is kept)
93396
94219
  web/src/lua/ the copied app client (apps made before the package) is
93397
94220
  deleted and its imports point at @lua-ai-global/app-client,
93398
94221
  only when it is unchanged; an edited copy is left to you
93399
- web/src/main.tsx <AgentPaneLayout> around what createRoot(...).render( renders
93400
- web/src/index.css @import of @lua-ai-global/app-chat/styles.css after the ui styles
93401
- A shape it does not recognise is not edited: the exact edit is printed. Run it
93402
- again and it says the app is up to date. It asks before writing when both stdin
93403
- and stdout are terminals and --ci is off; --force (or --ci) applies without asking.
94222
+ web/src/** the bundled agent pane comes out (the platform's pane, which
94223
+ the gateway injects, replaces it): <AgentPaneLayout> gives way
94224
+ to what it wraps (a context prop becomes lua.pane.setContext),
94225
+ useAgentPane() becomes lua.pane from @lua-ai-global/app-client
94226
+ web/package.json app-client and ui at least at the template's ranges
94227
+ (app-client ~0.0.5 once lua.pane is used; a newer range of
94228
+ yours is kept); @lua-ai-global/app-chat removed once nothing
94229
+ imports it
94230
+ web/src/index.css the @import of app-chat's styles, with the dependency
94231
+ web/src/main.tsx the old template's .dark toggle (app-client 0.1+ applies the
94232
+ shell's theme, density and accent itself), only when it is
94233
+ exactly the template's lines
94234
+ A file it cannot rewrite (other props, isOpen, <AgentPane>) is not edited: the
94235
+ steps are printed, and app-chat stays while a file imports it. Run it again and
94236
+ it says the app is up to date. It asks before writing when both stdin and stdout
94237
+ are terminals and --ci is off; --force (or --ci) applies without asking.
93404
94238
  With agentPane: false in defineWebApp the pages are upgraded, and the pane stays
93405
94239
  off until you remove it.
93406
94240