lua-cli 3.54.0 → 3.55.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)
@@ -53719,6 +53998,50 @@ function detectBundledAgentPane(pagesDir, assets) {
53719
53998
  return dependsOnAppChat(pagesDir) && sourceImportsAppChat(pagesDir);
53720
53999
  }
53721
54000
  __name(detectBundledAgentPane, "detectBundledAgentPane");
54001
+ var UI_PACKAGE = "@lua-ai-global/ui";
54002
+ function resolvedUiVersion(pagesDir) {
54003
+ return resolvedPackageVersion(pagesDir, UI_PACKAGE);
54004
+ }
54005
+ __name(resolvedUiVersion, "resolvedUiVersion");
54006
+ var APP_CLIENT_PACKAGE = "@lua-ai-global/app-client";
54007
+ var THEME_APP_CLIENT_VERSION = "0.1.0";
54008
+ var PAGE_THEME_CODE = /['"]dark['"]|\.theme\b/;
54009
+ function appClientThemeWarning(pagesDir) {
54010
+ const main = [
54011
+ "main.tsx",
54012
+ "main.jsx"
54013
+ ].map((f) => path23.join(pagesDir, "src", f)).find((f) => fs19.existsSync(f));
54014
+ if (!main || PAGE_THEME_CODE.test(fs19.readFileSync(main, "utf8"))) return void 0;
54015
+ const installed = resolvedPackageVersion(pagesDir, APP_CLIENT_PACKAGE);
54016
+ if (!installed || compareSemver(installed, THEME_APP_CLIENT_VERSION) >= 0) return void 0;
54017
+ 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)}/.`;
54018
+ }
54019
+ __name(appClientThemeWarning, "appClientThemeWarning");
54020
+ function compareSemver(a, b) {
54021
+ const parts = /* @__PURE__ */ __name((v) => v.split("+")[0].split("-")[0].split(".").map(Number), "parts");
54022
+ const isPrerelease = /* @__PURE__ */ __name((v) => v.split("+")[0].includes("-"), "isPrerelease");
54023
+ const [x, y] = [
54024
+ parts(a),
54025
+ parts(b)
54026
+ ];
54027
+ return x[0] - y[0] || x[1] - y[1] || x[2] - y[2] || Number(isPrerelease(b)) - Number(isPrerelease(a));
54028
+ }
54029
+ __name(compareSemver, "compareSemver");
54030
+ function resolvedPackageVersion(pagesDir, pkg2) {
54031
+ for (let dir = path23.resolve(pagesDir); ; dir = path23.dirname(dir)) {
54032
+ const manifest = path23.join(dir, "node_modules", ...pkg2.split("/"), "package.json");
54033
+ if (fs19.existsSync(manifest)) {
54034
+ try {
54035
+ const version = JSON.parse(fs19.readFileSync(manifest, "utf8")).version;
54036
+ return typeof version === "string" && version.length <= WEB_APP_UI_VERSION_MAX_CHARS && WEB_APP_UI_VERSION_PATTERN.test(version) ? version : void 0;
54037
+ } catch {
54038
+ return void 0;
54039
+ }
54040
+ }
54041
+ if (path23.dirname(dir) === dir) return void 0;
54042
+ }
54043
+ }
54044
+ __name(resolvedPackageVersion, "resolvedPackageVersion");
53722
54045
  async function buildWebAppPages(pagesDir, loadVite = loadAppVite) {
53723
54046
  if (!fs19.existsSync(path23.join(pagesDir, "index.html"))) {
53724
54047
  throw new WebAppBuildError(`${pagesDir} has no index.html: \`pages.root\` must name the Vite project directory.`);
@@ -53741,10 +54064,14 @@ async function buildWebAppPages(pagesDir, loadVite = loadAppVite) {
53741
54064
  }
53742
54065
  });
53743
54066
  const output = collectBuildOutput(outDir);
54067
+ const uiVersion = resolvedUiVersion(pagesDir);
53744
54068
  return {
53745
54069
  ...output,
53746
54070
  viteVersion: version,
53747
- bundlesAgentPane: detectBundledAgentPane(pagesDir, output.assets)
54071
+ bundlesAgentPane: detectBundledAgentPane(pagesDir, output.assets),
54072
+ ...uiVersion ? {
54073
+ uiVersion
54074
+ } : {}
53748
54075
  };
53749
54076
  } finally {
53750
54077
  fs19.rmSync(outDir, {
@@ -53757,6 +54084,7 @@ __name(buildWebAppPages, "buildWebAppPages");
53757
54084
 
53758
54085
  // src/primitives/web-app.handler.ts
53759
54086
  init_package_root();
54087
+ init_server_refusal();
53760
54088
  init_cli();
53761
54089
  init_write_info();
53762
54090
  init_base_handler();
@@ -53772,12 +54100,6 @@ function webAppNameReservedMessage(error) {
53772
54100
  return printableRefusal(error, "WEB_APP_NAME_RESERVED");
53773
54101
  }
53774
54102
  __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
54103
  var WebAppHandler = class extends BaseVersionedHandler {
53782
54104
  static {
53783
54105
  __name(this, "WebAppHandler");
@@ -53797,7 +54119,7 @@ var WebAppHandler = class extends BaseVersionedHandler {
53797
54119
  async fetchFromServer(api) {
53798
54120
  const response = await api.getWebApps();
53799
54121
  if (!response.success || !response.data?.webApps) return null;
53800
- return response.data.webApps;
54122
+ return response.data.webApps.filter((app) => !isSystemOwned(app));
53801
54123
  }
53802
54124
  async createOnServer(api, primitive) {
53803
54125
  const response = await api.createWebApp({
@@ -53888,6 +54210,8 @@ var WebAppHandler = class extends BaseVersionedHandler {
53888
54210
  if (pages.skipped.length > 0) {
53889
54211
  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
54212
  }
54213
+ const themeWarning = appClientThemeWarning(pagesDir);
54214
+ if (themeWarning) writeInfo(`\u26A0\uFE0F ${themeWarning}`);
53891
54215
  const compiler = pushData.compiler ?? {};
53892
54216
  return {
53893
54217
  ...pushData,
@@ -53896,6 +54220,10 @@ var WebAppHandler = class extends BaseVersionedHandler {
53896
54220
  ...pages.bundlesAgentPane ? {
53897
54221
  bundlesAgentPane: true
53898
54222
  } : {},
54223
+ // ADR 0027: the resolved @lua-ai-global/ui, sent only when found; absent ⇒ unknown, the gateway scans the CSS.
54224
+ ...pages.uiVersion ? {
54225
+ uiVersion: pages.uiVersion
54226
+ } : {},
53899
54227
  assets: pages.assets.map(({ bytes: _bytes, ...entry }) => entry),
53900
54228
  compiler: {
53901
54229
  ...compiler,
@@ -80372,6 +80700,7 @@ __name(deletePostProcessorInteractive, "deletePostProcessorInteractive");
80372
80700
 
80373
80701
  // src/commands/marketplace.ts
80374
80702
  init_cli();
80703
+ init_server_refusal();
80375
80704
 
80376
80705
  // src/api/marketplace.api.service.ts
80377
80706
  init_constants();
@@ -82330,7 +82659,7 @@ async function listSkillOnMarketplace(marketplaceApi, config, apiKey) {
82330
82659
  `);
82331
82660
  return;
82332
82661
  }
82333
- const skills = agentSkillsResponse.data.skills || [];
82662
+ const skills = (agentSkillsResponse.data.skills || []).filter((skill) => !isSystemOwned(skill));
82334
82663
  if (skills.length === 0) {
82335
82664
  console.log("\n\u2139\uFE0F No skills found on this agent.");
82336
82665
  console.log("\u{1F4A1} Push a skill first using 'lua push skill'.\n");
@@ -90573,7 +90902,7 @@ init_types();
90573
90902
  var WEB_APP_TEMPLATE_DIR = "template-web-app";
90574
90903
  var PAGES_EXCLUDE_GLOB = "src/apps/*/web";
90575
90904
  var NAME_PLACEHOLDER = "__APP_NAME__";
90576
- function pagesHaveAgentPane(pagesDir) {
90905
+ function pagesBundleAgentPane(pagesDir) {
90577
90906
  return [
90578
90907
  "main.tsx",
90579
90908
  "main.jsx"
@@ -90582,7 +90911,7 @@ function pagesHaveAgentPane(pagesDir) {
90582
90911
  return fs24.existsSync(file) && fs24.readFileSync(file, "utf8").includes("AgentPaneLayout");
90583
90912
  });
90584
90913
  }
90585
- __name(pagesHaveAgentPane, "pagesHaveAgentPane");
90914
+ __name(pagesBundleAgentPane, "pagesBundleAgentPane");
90586
90915
  function appIdentifier(name) {
90587
90916
  return name.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
90588
90917
  }
@@ -90852,8 +91181,11 @@ async function appsDevCommand(name, opts = {}) {
90852
91181
  });
90853
91182
  await server.listen();
90854
91183
  origin = server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") ?? "";
91184
+ const bundlesPane = pagesBundleAgentPane(pagesDir);
90855
91185
  writeSuccess(`
90856
91186
  \u2705 ${name} is running`);
91187
+ const themeWarning = appClientThemeWarning(pagesDir);
91188
+ if (themeWarning) writeInfo(`\u26A0\uFE0F ${themeWarning}`);
90857
91189
  writeHintBlock({
90858
91190
  headline: "Lua apps dev:",
90859
91191
  lines: [
@@ -90867,8 +91199,14 @@ async function appsDevCommand(name, opts = {}) {
90867
91199
  },
90868
91200
  {
90869
91201
  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}`
91202
+ 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
91203
  },
91204
+ ...app.agentPane !== false && bundlesPane ? [
91205
+ {
91206
+ label: "Bundled pane:",
91207
+ command: `lua apps upgrade ${name} (moves to the platform pane)`
91208
+ }
91209
+ ] : [],
90872
91210
  {
90873
91211
  label: "Stop:",
90874
91212
  command: "Ctrl+C"
@@ -91107,13 +91445,19 @@ var APP_CHAT = "@lua-ai-global/app-chat";
91107
91445
  var APP_CLIENT = "@lua-ai-global/app-client";
91108
91446
  var UI = "@lua-ai-global/ui";
91109
91447
  var UPGRADED_PACKAGES = [
91110
- APP_CHAT,
91111
91448
  APP_CLIENT,
91112
91449
  UI
91113
91450
  ];
91114
- var PANE_COMMENT = "The agent pane: the person's own conversation with this app's agent, docked beside the page.";
91451
+ var PANE_API_CLIENT_RANGE = "~0.0.5";
91452
+ var PANE_COMMENT_PREFIX = "{/* The agent pane:";
91115
91453
  var PANE_CSS_COMMENT = "/* The agent pane's styles: after the design system's, on its tokens. */";
91116
91454
  var PANE_CSS = `${APP_CHAT}/styles.css`;
91455
+ var THEME_CLIENT_RANGE = "~0.1.0";
91456
+ var TEMPLATE_THEME_LINES = [
91457
+ "// Theme follows the shell: first from the bootstrap, then from the host's `init`.",
91458
+ "document.documentElement.classList.toggle('dark', lua.theme === 'dark');",
91459
+ "lua.onInit((init) => document.documentElement.classList.toggle('dark', init.theme === 'dark'));"
91460
+ ];
91117
91461
  var KNOWN_COPIED_CLIENTS = /* @__PURE__ */ new Set([
91118
91462
  "6dee7fbd9103f2f9d33879b1c83279acf3ff3da974cc76b5e3482a4cbc00dd9c",
91119
91463
  "2bf0527634fba64be8e71885dd10044231d4472baaae3982a9b4d6a801fe1195",
@@ -91218,6 +91562,13 @@ function templateRanges(templateRoot = getPackageRoot()) {
91218
91562
  return ranges;
91219
91563
  }
91220
91564
  __name(templateRanges, "templateRanges");
91565
+ function movesToNewerDesign(pkg2, wanted) {
91566
+ const current = pkg2.dependencies?.[UI] ?? pkg2.devDependencies?.[UI];
91567
+ const have = typeof current === "string" ? rangeFloor(current) : void 0;
91568
+ const need = rangeFloor(wanted);
91569
+ return !!have && !!need && (have[0] < need[0] || have[0] === need[0] && have[1] < need[1]);
91570
+ }
91571
+ __name(movesToNewerDesign, "movesToNewerDesign");
91221
91572
  function rangeFloor(range2) {
91222
91573
  if (range2.includes("||")) return void 0;
91223
91574
  const tokens = range2.trim().split(/\s+/);
@@ -91241,7 +91592,7 @@ function compareFloors(a, b) {
91241
91592
  return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
91242
91593
  }
91243
91594
  __name(compareFloors, "compareFloors");
91244
- function planPackageJson(source, ranges) {
91595
+ function planPackageJson(source, ranges, remove = []) {
91245
91596
  const pkg2 = JSON.parse(source);
91246
91597
  const changes = [];
91247
91598
  const warnings = [];
@@ -91262,13 +91613,25 @@ function planPackageJson(source, ranges) {
91262
91613
  const have = rangeFloor(current);
91263
91614
  const need = rangeFloor(wanted);
91264
91615
  if (!have || !need) {
91265
- warnings.push(`${name} is "${current}" in web/package.json; it was kept. The agent pane needs ${wanted}.`);
91616
+ warnings.push(`${name} is "${current}" in web/package.json; it was kept. The upgrade wants ${wanted}.`);
91266
91617
  continue;
91267
91618
  }
91268
91619
  if (compareFloors(have, need) >= 0) continue;
91269
91620
  pkg2[section2][name] = wanted;
91270
91621
  changes.push(`${name} ${current} \u2192 ${wanted}`);
91271
91622
  }
91623
+ for (const name of remove) {
91624
+ let removed = false;
91625
+ for (const section2 of [
91626
+ "dependencies",
91627
+ "devDependencies"
91628
+ ]) {
91629
+ if (pkg2[section2]?.[name] === void 0) continue;
91630
+ delete pkg2[section2][name];
91631
+ removed = true;
91632
+ }
91633
+ if (removed) changes.push(`${name} (removed)`);
91634
+ }
91272
91635
  if (!changes.length) return {
91273
91636
  changes,
91274
91637
  warnings
@@ -91323,15 +91686,20 @@ function rewriteClientImports(file, source, clientFile) {
91323
91686
  return out;
91324
91687
  }
91325
91688
  __name(rewriteClientImports, "rewriteClientImports");
91689
+ var THEME_INSTALL_NOTE = `the pages' light/dark and accent now come from ${APP_CLIENT} 0.1, which only npm install brings`;
91326
91690
  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>"
91691
+ "<AgentPaneLayout>: replace it with what it wraps; its context prop becomes lua.pane.setContext(...),",
91692
+ ` with lua from ${APP_CLIENT} (${PANE_API_CLIENT_RANGE} or later); its other props have no equivalent`,
91693
+ " (the platform pane owns them);",
91694
+ "useAgentPane(): use lua.pane instead (open, close, ask, setContext); it has no isOpen (the Workspace",
91695
+ " owns whether the pane is open);",
91696
+ "<AgentPane>: remove it; the platform pane replaces it (lua.pane.open(), lua.pane.ask(text));",
91697
+ `then npm uninstall ${APP_CHAT} in web/ and remove the @import of its styles from web/src/index.css.`
91334
91698
  ];
91699
+ var PANE_EXPORTS = /* @__PURE__ */ new Set([
91700
+ "AgentPaneLayout",
91701
+ "useAgentPane"
91702
+ ]);
91335
91703
  function syntaxErrors(file, source) {
91336
91704
  return ts6.transpileModule(source, {
91337
91705
  fileName: path32.basename(file).replace(/\.\w+$/, ".tsx"),
@@ -91345,148 +91713,518 @@ function syntaxErrors(file, source) {
91345
91713
  }
91346
91714
  __name(syntaxErrors, "syntaxErrors");
91347
91715
  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);
91716
+ function applySplices(source, splices) {
91717
+ let out = source;
91718
+ const ordered = splices.map((s, i) => ({
91719
+ ...s,
91720
+ i
91721
+ })).sort((a, b) => b.start - a.start || b.i - a.i);
91722
+ for (const s of ordered) out = out.slice(0, s.start) + s.text + out.slice(s.end);
91723
+ return out;
91724
+ }
91725
+ __name(applySplices, "applySplices");
91726
+ function indentAt(source, pos) {
91727
+ const before = source.slice(source.lastIndexOf("\n", pos - 1) + 1, pos);
91728
+ return /^[ \t]*$/.test(before) ? before : void 0;
91729
+ }
91730
+ __name(indentAt, "indentAt");
91731
+ function lineSpan(source, start, end) {
91732
+ const rest = /^[ \t]*(\r?\n|$)/.exec(source.slice(end));
91733
+ if (indentAt(source, start) === void 0 || !rest) return [
91734
+ start,
91735
+ end
91736
+ ];
91737
+ return [
91738
+ source.lastIndexOf("\n", start - 1) + 1,
91739
+ end + rest[0].length
91740
+ ];
91741
+ }
91742
+ __name(lineSpan, "lineSpan");
91743
+ function identifiers(node, out = []) {
91744
+ if (ts6.isIdentifier(node)) out.push(node);
91745
+ ts6.forEachChild(node, (child) => {
91746
+ identifiers(child, out);
91747
+ });
91748
+ return out;
91749
+ }
91750
+ __name(identifiers, "identifiers");
91751
+ function declares(id2) {
91752
+ const p = id2.parent;
91753
+ 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;
91754
+ }
91755
+ __name(declares, "declares");
91756
+ function isReference(id2) {
91757
+ const p = id2.parent;
91758
+ if (ts6.isPropertyAccessExpression(p) && p.name === id2) return false;
91759
+ if ((ts6.isPropertyAssignment(p) || ts6.isMethodDeclaration(p) || ts6.isJsxAttribute(p)) && p.name === id2) return false;
91760
+ return true;
91761
+ }
91762
+ __name(isReference, "isReference");
91763
+ function insideImport(node) {
91764
+ for (let n2 = node; n2; n2 = n2.parent) if (ts6.isImportDeclaration(n2)) return true;
91765
+ return false;
91766
+ }
91767
+ __name(insideImport, "insideImport");
91768
+ var importsFrom = /* @__PURE__ */ __name((d, module) => ts6.isImportDeclaration(d) && ts6.isStringLiteral(d.moduleSpecifier) && d.moduleSpecifier.text === module, "importsFrom");
91769
+ function namedImports(d) {
91770
+ const b = d.importClause?.namedBindings;
91771
+ return !d.importClause?.isTypeOnly && b && ts6.isNamedImports(b) ? b : void 0;
91772
+ }
91773
+ __name(namedImports, "namedImports");
91774
+ function chatLocals(sf, exported) {
91775
+ const out = /* @__PURE__ */ new Set();
91776
+ for (const d of sf.statements) {
91777
+ if (!importsFrom(d, APP_CHAT)) continue;
91778
+ for (const e of namedImports(d)?.elements ?? []) {
91779
+ if (!e.isTypeOnly && (e.propertyName ?? e.name).text === exported) out.add(e.name.text);
91381
91780
  }
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"
91781
+ }
91782
+ return out;
91783
+ }
91784
+ __name(chatLocals, "chatLocals");
91785
+ function luaBinding(sf) {
91786
+ for (const d of sf.statements) {
91787
+ if (!importsFrom(d, APP_CLIENT)) continue;
91788
+ const e = namedImports(d)?.elements.find((x) => !x.isTypeOnly && (x.propertyName ?? x.name).text === "lua");
91789
+ if (e) return {
91790
+ local: e.name.text,
91791
+ taken: false
91396
91792
  };
91397
91793
  }
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();
91794
+ return {
91795
+ taken: identifiers(sf).some((id2) => id2.text === "lua" && declares(id2))
91796
+ };
91797
+ }
91798
+ __name(luaBinding, "luaBinding");
91799
+ function hookResultUse(sf, call2) {
91800
+ if (call2.arguments.length) return "unknown";
91801
+ 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");
91802
+ let node = call2;
91803
+ while (ts6.isParenthesizedExpression(node.parent)) node = node.parent;
91804
+ const p = node.parent;
91805
+ if (ts6.isPropertyAccessExpression(p) && p.expression === node) return p.name.text === "isOpen" ? "isOpen" : "ok";
91806
+ if (!ts6.isVariableDeclaration(p) || p.initializer !== node) return "unknown";
91807
+ if (ts6.isObjectBindingPattern(p.name)) return pattern(p.name);
91808
+ if (!ts6.isIdentifier(p.name)) return "unknown";
91809
+ const name = p.name;
91810
+ let use = "ok";
91811
+ for (const ref of identifiers(sf)) {
91812
+ if (ref === name || ref.text !== name.text || declares(ref) || !isReference(ref)) continue;
91813
+ const q = ref.parent;
91814
+ 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";
91815
+ if (here === "isOpen") return "isOpen";
91816
+ if (here === "unknown") use = "unknown";
91817
+ }
91818
+ return use;
91819
+ }
91820
+ __name(hookResultUse, "hookResultUse");
91821
+ function notAtModuleScope(sf, el, expr, statement) {
91822
+ let readsThis = false;
91823
+ const findThis = /* @__PURE__ */ __name((n2) => {
91824
+ if (n2.kind === ts6.SyntaxKind.ThisKeyword) readsThis = true;
91825
+ ts6.forEachChild(n2, findThis);
91826
+ }, "findThis");
91827
+ findThis(expr);
91828
+ if (readsThis) return "its context reads this";
91829
+ const used = new Set(identifiers(expr).filter(isReference).map((i) => i.text));
91830
+ for (let n2 = el.parent; n2 !== sf; n2 = n2.parent) {
91831
+ if (!ts6.isFunctionLike(n2)) continue;
91832
+ const local = /* @__PURE__ */ new Set();
91833
+ const collect2 = /* @__PURE__ */ __name((m) => {
91834
+ if (m === expr) return;
91835
+ if (ts6.isIdentifier(m) && declares(m)) local.add(m.text);
91836
+ ts6.forEachChild(m, collect2);
91837
+ }, "collect");
91838
+ collect2(n2);
91839
+ const hit = [
91840
+ ...used
91841
+ ].find((u) => local.has(u));
91842
+ if (hit) return `its context reads ${hit}, local to the component`;
91843
+ }
91844
+ const at = statement.getStart(sf);
91845
+ for (const s of sf.statements.filter((t) => t.getStart(sf) >= at)) {
91846
+ const names = ts6.isVariableStatement(s) ? s.declarationList.declarations.flatMap((d) => identifiers(d.name).filter(declares)) : (ts6.isClassDeclaration(s) || ts6.isEnumDeclaration(s)) && s.name ? [
91847
+ s.name
91848
+ ] : [];
91849
+ const hit = names.find((n2) => used.has(n2.text));
91850
+ if (hit) return `its context reads ${hit.text}, declared after it`;
91422
91851
  }
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>`;
91852
+ return void 0;
91853
+ }
91854
+ __name(notAtModuleScope, "notAtModuleScope");
91855
+ function unwrapLayout(sf, source, el) {
91856
+ const kids = el.children.filter((c) => !(ts6.isJsxText(c) && c.containsOnlyTriviaWhiteSpaces));
91857
+ const inJsx = ts6.isJsxElement(el.parent) || ts6.isJsxFragment(el.parent);
91858
+ const only = kids.length === 1 ? kids[0] : void 0;
91859
+ if (!inJsx && !(only && (ts6.isJsxElement(only) || ts6.isJsxSelfClosingElement(only) || ts6.isJsxFragment(only)))) {
91860
+ return [
91861
+ {
91862
+ start: el.openingElement.getStart(sf),
91863
+ end: el.openingElement.getEnd(),
91864
+ text: "<>"
91865
+ },
91866
+ {
91867
+ start: el.closingElement.getStart(sf),
91868
+ end: el.closingElement.getEnd(),
91869
+ text: "</>"
91870
+ }
91871
+ ];
91434
91872
  }
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;
91873
+ let start = el.getStart(sf);
91874
+ if (!kids.length) {
91875
+ const [s, e] = lineSpan(source, start, el.getEnd());
91876
+ return [
91877
+ {
91878
+ start: s,
91879
+ end: e,
91880
+ text: ""
91881
+ }
91882
+ ];
91883
+ }
91884
+ const first = kids[0].getStart(sf);
91885
+ let inner = source.slice(first, kids[kids.length - 1].getEnd());
91886
+ const own = indentAt(source, start);
91887
+ const kid = indentAt(source, first);
91888
+ if (own !== void 0 && kid !== void 0 && kid.length > own.length && kid.startsWith(own)) {
91889
+ const deeper = kid;
91890
+ inner = inner.split("\n").map((line, i) => i > 0 && line.startsWith(deeper) ? own + line.slice(deeper.length) : line).join("\n");
91891
+ }
91892
+ if (inJsx && own !== void 0) {
91893
+ const siblings = el.parent.children.filter((c) => !(ts6.isJsxText(c) && c.containsOnlyTriviaWhiteSpaces));
91894
+ const prev = siblings[siblings.indexOf(el) - 1];
91895
+ if (prev && ts6.isJsxExpression(prev) && !prev.expression && prev.getText(sf).startsWith(PANE_COMMENT_PREFIX) && indentAt(source, prev.getStart(sf)) !== void 0) {
91896
+ start = prev.getStart(sf);
91446
91897
  }
91447
91898
  }
91448
- if (syntaxErrors(file, out) > syntaxErrors(file, source)) {
91899
+ return [
91900
+ {
91901
+ start,
91902
+ end: el.getEnd(),
91903
+ text: inner
91904
+ }
91905
+ ];
91906
+ }
91907
+ __name(unwrapLayout, "unwrapLayout");
91908
+ function insertBefore(sf, statement, line, eol) {
91909
+ const prev = sf.statements[sf.statements.indexOf(statement) - 1];
91910
+ if (!prev) {
91911
+ const semi2 = statement.getText(sf).trimEnd().endsWith(";") ? ";" : "";
91449
91912
  return {
91450
- status: "unrecognised",
91451
- reason: "the edit would not parse"
91913
+ start: statement.getStart(sf),
91914
+ end: statement.getStart(sf),
91915
+ text: `${line}${semi2}${eol}`
91452
91916
  };
91453
91917
  }
91918
+ const semi = prev.getText(sf).trimEnd().endsWith(";") ? ";" : "";
91919
+ const gap = ts6.isImportDeclaration(prev) ? eol : "";
91454
91920
  return {
91455
- status: "added",
91456
- content: out
91921
+ start: prev.getEnd(),
91922
+ end: prev.getEnd(),
91923
+ text: `${eol}${gap}${line}${semi}`
91457
91924
  };
91458
91925
  }
91459
- __name(addAgentPane, "addAgentPane");
91460
- function addPaneStyles(source) {
91461
- if (source.includes(PANE_CSS)) return {
91462
- status: "present"
91926
+ __name(insertBefore, "insertBefore");
91927
+ function tidyImports(file, source, needLua, eol) {
91928
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
91929
+ const referenced = new Set(identifiers(sf).filter((id2) => !insideImport(id2)).map((id2) => id2.text));
91930
+ const edits = [];
91931
+ let luaPlaced = !needLua || luaBinding(sf).local !== void 0;
91932
+ const luaImport = /* @__PURE__ */ __name((d) => {
91933
+ const quote = d.moduleSpecifier.getText(sf)[0];
91934
+ return `import { lua } from ${quote}${APP_CLIENT}${quote}${d.getText(sf).trimEnd().endsWith(";") ? ";" : ""}`;
91935
+ }, "luaImport");
91936
+ if (!luaPlaced) {
91937
+ const host = sf.statements.find((d) => importsFrom(d, APP_CLIENT) && !!namedImports(d));
91938
+ if (host) {
91939
+ const named = namedImports(host);
91940
+ const last = named.elements[named.elements.length - 1];
91941
+ edits.push(last ? {
91942
+ start: last.getEnd(),
91943
+ end: last.getEnd(),
91944
+ text: ", lua"
91945
+ } : {
91946
+ start: named.getStart(sf),
91947
+ end: named.getEnd(),
91948
+ text: "{ lua }"
91949
+ });
91950
+ luaPlaced = true;
91951
+ }
91952
+ }
91953
+ for (const d of sf.statements) {
91954
+ if (!importsFrom(d, APP_CHAT)) continue;
91955
+ const named = namedImports(d);
91956
+ if (!named) continue;
91957
+ const kept = named.elements.filter((e) => !(PANE_EXPORTS.has((e.propertyName ?? e.name).text) && !referenced.has(e.name.text)));
91958
+ if (kept.length === named.elements.length) continue;
91959
+ if (kept.length) {
91960
+ edits.push({
91961
+ start: named.getStart(sf),
91962
+ end: named.getEnd(),
91963
+ text: `{ ${kept.map((e) => e.getText(sf)).join(", ")} }`
91964
+ });
91965
+ } else if (d.importClause.name) {
91966
+ edits.push({
91967
+ start: d.importClause.name.getEnd(),
91968
+ end: named.getEnd(),
91969
+ text: ""
91970
+ });
91971
+ } else if (!luaPlaced) {
91972
+ edits.push({
91973
+ start: d.getStart(sf),
91974
+ end: d.getEnd(),
91975
+ text: luaImport(d)
91976
+ });
91977
+ luaPlaced = true;
91978
+ } else {
91979
+ const [start, end] = lineSpan(source, d.getStart(sf), d.getEnd());
91980
+ edits.push({
91981
+ start,
91982
+ end,
91983
+ text: ""
91984
+ });
91985
+ }
91986
+ }
91987
+ if (!luaPlaced) {
91988
+ const imports = sf.statements.filter(ts6.isImportDeclaration);
91989
+ const anchor = imports.filter((d) => d.importClause).at(-1) ?? imports.at(-1);
91990
+ edits.push(anchor ? {
91991
+ start: anchor.getEnd(),
91992
+ end: anchor.getEnd(),
91993
+ text: eol + luaImport(anchor)
91994
+ } : {
91995
+ start: 0,
91996
+ end: 0,
91997
+ text: `import { lua } from '${APP_CLIENT}';${eol}`
91998
+ });
91999
+ }
92000
+ return applySplices(source, edits);
92001
+ }
92002
+ __name(tidyImports, "tidyImports");
92003
+ function removeAgentPane(file, source) {
92004
+ if (!source.includes(APP_CHAT)) return {
92005
+ status: "none"
91463
92006
  };
92007
+ const parse = /* @__PURE__ */ __name((text2) => ts6.createSourceFile(file, text2, ts6.ScriptTarget.Latest, true, scriptKind(file)), "parse");
92008
+ const sf = parse(source);
92009
+ const lua = luaBinding(sf);
92010
+ const luaName = lua.local ?? "lua";
91464
92011
  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];
92012
+ const analyse = /* @__PURE__ */ __name((sf2) => {
92013
+ const layouts = chatLocals(sf2, "AgentPaneLayout");
92014
+ const hooks = chatLocals(sf2, "useAgentPane");
92015
+ const panes = chatLocals(sf2, "AgentPane");
92016
+ const reasons = [];
92017
+ const elements = [];
92018
+ const contexts = [];
92019
+ const calls = [];
92020
+ const top = /* @__PURE__ */ __name((n2) => {
92021
+ while (n2.parent !== sf2) n2 = n2.parent;
92022
+ return n2;
92023
+ }, "top");
92024
+ const layout = /* @__PURE__ */ __name((tag, el) => {
92025
+ for (let n2 = el.parent; n2 !== sf2; n2 = n2.parent) {
92026
+ if (ts6.isJsxElement(n2) && layouts.has(tagName2(sf2, n2))) {
92027
+ reasons.push(`<${tag}> sits inside another`);
92028
+ return;
92029
+ }
92030
+ }
92031
+ const attrs = el.openingElement.attributes.properties;
92032
+ if (!attrs.length) {
92033
+ elements.push(el);
92034
+ return;
92035
+ }
92036
+ const attr = attrs[0];
92037
+ if (attrs.length > 1 || !ts6.isJsxAttribute(attr) || attr.name.getText(sf2) !== "context") {
92038
+ const names = attrs.map((a) => ts6.isJsxAttribute(a) ? a.name.getText(sf2) : "{...}");
92039
+ reasons.push(`<${tag}> has props (${names.join(", ")}): context becomes lua.pane.setContext(...), the others have no equivalent (the platform pane owns them)`);
92040
+ return;
92041
+ }
92042
+ const init3 = attr.initializer;
92043
+ const expr = init3 && (ts6.isStringLiteral(init3) ? init3 : ts6.isJsxExpression(init3) ? init3.expression : void 0);
92044
+ if (init3 && !expr) {
92045
+ reasons.push(`<${tag}>'s context is not an expression this can move`);
92046
+ return;
92047
+ }
92048
+ const statement = top(el);
92049
+ const why = expr && notAtModuleScope(sf2, el, expr, statement);
92050
+ if (why) {
92051
+ reasons.push(`<${tag} context>: ${why}, so call lua.pane.setContext(...) where it is in scope`);
92052
+ return;
92053
+ }
92054
+ contexts.push({
92055
+ text: expr ? expr.getText(sf2) : "true",
92056
+ statement
92057
+ });
92058
+ elements.push(el);
92059
+ }, "layout");
92060
+ const visit = /* @__PURE__ */ __name((node) => {
92061
+ if (ts6.isJsxElement(node) || ts6.isJsxSelfClosingElement(node)) {
92062
+ const tag = tagName2(sf2, node);
92063
+ if (panes.has(tag)) {
92064
+ 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)`);
92065
+ } else if (layouts.has(tag)) {
92066
+ if (ts6.isJsxElement(node)) layout(tag, node);
92067
+ else reasons.push(`<${tag} /> wraps nothing`);
92068
+ }
92069
+ }
92070
+ if (ts6.isCallExpression(node) && ts6.isIdentifier(node.expression) && hooks.has(node.expression.text)) {
92071
+ const use = hookResultUse(sf2, node);
92072
+ const hook = node.expression.text;
92073
+ if (use === "isOpen") {
92074
+ reasons.push(`it reads isOpen from ${hook}() (lua.pane has none: the Workspace owns whether the pane is open)`);
92075
+ } else if (use === "unknown") {
92076
+ reasons.push(`it uses ${hook}()'s result in a way this does not follow`);
92077
+ } else calls.push(node);
92078
+ }
92079
+ ts6.forEachChild(node, visit);
92080
+ }, "visit");
92081
+ visit(sf2);
92082
+ return {
92083
+ reasons: [
92084
+ ...new Set(reasons)
92085
+ ],
92086
+ elements,
92087
+ contexts,
92088
+ calls
92089
+ };
92090
+ }, "analyse");
92091
+ const found = analyse(sf);
92092
+ const needLua = found.calls.length > 0 || found.contexts.length > 0;
92093
+ if (needLua && lua.taken) found.reasons.push("lua already names something else here, so lua.pane cannot be used");
92094
+ if (found.reasons.length) return {
92095
+ status: "manual",
92096
+ reasons: found.reasons
92097
+ };
92098
+ const step1 = applySplices(source, found.calls.map((c) => ({
92099
+ start: c.getStart(sf),
92100
+ end: c.getEnd(),
92101
+ text: `${luaName}.pane`
92102
+ })));
92103
+ const sf1 = parse(step1);
92104
+ const again = analyse(sf1);
92105
+ const step22 = applySplices(step1, [
92106
+ ...again.elements.flatMap((el) => unwrapLayout(sf1, step1, el)),
92107
+ ...again.contexts.map(({ text: text2, statement }) => insertBefore(sf1, statement, `${luaName}.pane.setContext(${text2})`, eol))
92108
+ ]);
92109
+ const out = tidyImports(file, step22, needLua, eol);
92110
+ if (out === source) return {
92111
+ status: "none"
92112
+ };
92113
+ if (syntaxErrors(file, out) > syntaxErrors(file, source)) {
91477
92114
  return {
91478
- status: "added",
91479
- content: insertAfter(last.index + last[0].length, "'"),
91480
- warning
92115
+ status: "manual",
92116
+ reasons: [
92117
+ "the edit would not parse"
92118
+ ]
91481
92119
  };
91482
92120
  }
92121
+ const summary = [
92122
+ ...found.elements.length ? [
92123
+ "<AgentPaneLayout> removed (the platform pane replaces it)"
92124
+ ] : [],
92125
+ ...found.contexts.length ? [
92126
+ `its context \u2192 ${luaName}.pane.setContext(...)`
92127
+ ] : [],
92128
+ ...found.calls.length ? [
92129
+ `useAgentPane() \u2192 ${luaName}.pane`
92130
+ ] : []
92131
+ ];
91483
92132
  return {
91484
- status: "added",
91485
- content: `${PANE_CSS_COMMENT}${eol}@import '${PANE_CSS}';${eol}${source}`,
91486
- warning
92133
+ status: "edited",
92134
+ content: out,
92135
+ summary: summary.length ? summary : [
92136
+ `unused import from ${APP_CHAT} removed`
92137
+ ],
92138
+ usesPaneApi: needLua
91487
92139
  };
91488
92140
  }
91489
- __name(addPaneStyles, "addPaneStyles");
92141
+ __name(removeAgentPane, "removeAgentPane");
92142
+ function chatReferences(file, source) {
92143
+ if (!source.includes(APP_CHAT)) return {
92144
+ uses: [],
92145
+ styles: false
92146
+ };
92147
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
92148
+ const uses = /* @__PURE__ */ new Set();
92149
+ let styles = false;
92150
+ const fromChat = /* @__PURE__ */ __name((e) => !!e && ts6.isStringLiteral(e) && (e.text === APP_CHAT || e.text.startsWith(`${APP_CHAT}/`)), "fromChat");
92151
+ const visit = /* @__PURE__ */ __name((node) => {
92152
+ if (ts6.isImportDeclaration(node) && fromChat(node.moduleSpecifier)) {
92153
+ const clause = node.importClause;
92154
+ const b = clause?.namedBindings;
92155
+ if (!clause) {
92156
+ if (node.moduleSpecifier.text === PANE_CSS) styles = true;
92157
+ else uses.add(node.moduleSpecifier.text);
92158
+ } else {
92159
+ if (clause.name) uses.add(clause.name.text);
92160
+ if (b && ts6.isNamespaceImport(b)) uses.add(`* as ${b.name.text}`);
92161
+ if (b && ts6.isNamedImports(b)) for (const e of b.elements) uses.add((e.propertyName ?? e.name).text);
92162
+ if (!clause.name && b && ts6.isNamedImports(b) && !b.elements.length) uses.add(node.moduleSpecifier.text);
92163
+ }
92164
+ } else if (ts6.isExportDeclaration(node) && fromChat(node.moduleSpecifier)) {
92165
+ uses.add(`export \u2026 from '${node.moduleSpecifier.text}'`);
92166
+ } else if (ts6.isCallExpression(node) && node.expression.kind === ts6.SyntaxKind.ImportKeyword && fromChat(node.arguments[0])) {
92167
+ uses.add(`import('${node.arguments[0].text}')`);
92168
+ }
92169
+ ts6.forEachChild(node, visit);
92170
+ }, "visit");
92171
+ visit(sf);
92172
+ return {
92173
+ uses: [
92174
+ ...uses
92175
+ ],
92176
+ styles
92177
+ };
92178
+ }
92179
+ __name(chatReferences, "chatReferences");
92180
+ function dropChatStyleImports(file, source) {
92181
+ const sf = ts6.createSourceFile(file, source, ts6.ScriptTarget.Latest, true, scriptKind(file));
92182
+ const edits = sf.statements.filter((d) => importsFrom(d, PANE_CSS) && !d.importClause).map((d) => {
92183
+ const [start, end] = lineSpan(source, d.getStart(sf), d.getEnd());
92184
+ return {
92185
+ start,
92186
+ end,
92187
+ text: ""
92188
+ };
92189
+ });
92190
+ return edits.length ? applySplices(source, edits) : null;
92191
+ }
92192
+ __name(dropChatStyleImports, "dropChatStyleImports");
92193
+ function removePaneStyles(source) {
92194
+ const re = /^[ \t]*@import\s+(?:url\(\s*)?(['"])@lua-ai-global\/app-chat\/styles\.css\1[^;\n]*;[^\n]*(?:\n|$)/m;
92195
+ let out = source;
92196
+ for (let m = re.exec(out); m; m = re.exec(out)) {
92197
+ let start = m.index;
92198
+ if (start > 0) {
92199
+ const above = out.lastIndexOf("\n", start - 2) + 1;
92200
+ if (out.slice(above, start).trim() === PANE_CSS_COMMENT) start = above;
92201
+ }
92202
+ out = out.slice(0, start) + out.slice(m.index + m[0].length);
92203
+ }
92204
+ return out === source ? null : out;
92205
+ }
92206
+ __name(removePaneStyles, "removePaneStyles");
92207
+ var escapeRegExp = /* @__PURE__ */ __name((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "escapeRegExp");
92208
+ function whitespaceInsensitive(lines) {
92209
+ const anySpace = "[ \\t]*";
92210
+ const line = /* @__PURE__ */ __name((text2) => anySpace + [
92211
+ ...text2.replace(/\s+/g, "")
92212
+ ].map(escapeRegExp).join(anySpace) + anySpace, "line");
92213
+ return new RegExp(`^${lines.map(line).join("\\r?\\n")}\\r?\\n`, "m");
92214
+ }
92215
+ __name(whitespaceInsensitive, "whitespaceInsensitive");
92216
+ var THEME_BLOCK = whitespaceInsensitive(TEMPLATE_THEME_LINES);
92217
+ function removeThemeLines(file, source) {
92218
+ const match = THEME_BLOCK.exec(source);
92219
+ if (!match) return null;
92220
+ const end = match.index + match[0].length;
92221
+ const blank = /^[ \t]*\r?\n/.exec(source.slice(end))?.[0].length ?? 0;
92222
+ const out = source.slice(0, match.index) + source.slice(end + blank);
92223
+ const sf = ts6.createSourceFile(file, out, ts6.ScriptTarget.Latest, true, scriptKind(file));
92224
+ if (luaBinding(sf).local !== "lua") return null;
92225
+ return identifiers(sf).some((id2) => id2.text === "lua" && !insideImport(id2) && isReference(id2)) ? out : null;
92226
+ }
92227
+ __name(removeThemeLines, "removeThemeLines");
91490
92228
  function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91491
92229
  const { pagesDir } = target;
91492
92230
  const contents = /* @__PURE__ */ new Map();
@@ -91501,18 +92239,7 @@ function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91501
92239
  summary
91502
92240
  ]);
91503
92241
  }, "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
- }
92242
+ const inWeb = /* @__PURE__ */ __name((file) => `web/${path32.relative(pagesDir, file).split(path32.sep).join("/")}`, "inWeb");
91516
92243
  const srcDir = path32.join(pagesDir, "src");
91517
92244
  const clientFile = path32.join(srcDir, "lua", "client.ts");
91518
92245
  let clientKept = false;
@@ -91529,47 +92256,117 @@ function planWebAppUpgrade(target, templateRoot = getPackageRoot()) {
91529
92256
  manual.push([
91530
92257
  "web/src/lua/client.ts is the copied app client, edited since `lua apps new` wrote it, so it was kept.",
91531
92258
  ` 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)."
92259
+ " change of yours the package lacks, delete web/src/lua/client.ts, then run lua apps upgrade again."
91534
92260
  ]);
91535
92261
  }
91536
92262
  }
92263
+ let usesPaneApi = false;
92264
+ let paneRemoved = false;
92265
+ const stillImporting = [];
92266
+ const styleImporters = [];
92267
+ const leftAlone = /* @__PURE__ */ new Set();
91537
92268
  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
- ]);
92269
+ for (const file of sourceFiles(srcDir)) {
92270
+ if (contents.get(file) === null) continue;
92271
+ const edit = removeAgentPane(file, read(file));
92272
+ if (edit.status === "edited") {
92273
+ change(file, edit.content, edit.summary.join("; "));
92274
+ usesPaneApi ||= edit.usesPaneApi;
92275
+ paneRemoved = true;
92276
+ } else if (edit.status === "manual") {
92277
+ manual.push([
92278
+ `${inWeb(file)} was not edited: ${edit.reasons.join("; ")}.`
92279
+ ]);
92280
+ leftAlone.add(file);
92281
+ }
92282
+ const refs = chatReferences(file, read(file));
92283
+ if (refs.uses.length) stillImporting.push(`${inWeb(file)} (${refs.uses.join(", ")})`);
92284
+ if (refs.styles) styleImporters.push(file);
92285
+ }
92286
+ }
92287
+ const pkgFile = path32.join(pagesDir, "package.json");
92288
+ const pkgSource = fs26.readFileSync(pkgFile, "utf8");
92289
+ const ranges = templateRanges(templateRoot);
92290
+ const clientFloor = rangeFloor(ranges[APP_CLIENT]);
92291
+ if (usesPaneApi && (!clientFloor || compareFloors(clientFloor, rangeFloor(PANE_API_CLIENT_RANGE)) < 0)) {
92292
+ ranges[APP_CLIENT] = PANE_API_CLIENT_RANGE;
92293
+ }
92294
+ let pkg2;
92295
+ try {
92296
+ pkg2 = JSON.parse(pkgSource);
92297
+ } catch (error) {
92298
+ if (!(error instanceof SyntaxError)) throw error;
92299
+ }
92300
+ const hasChat = !!pkg2 && [
92301
+ pkg2.dependencies,
92302
+ pkg2.devDependencies
92303
+ ].some((d) => d?.[APP_CHAT] !== void 0);
92304
+ const dropChat = hasChat && !clientKept && !stillImporting.length;
92305
+ const designChanged = !!pkg2 && movesToNewerDesign(pkg2, ranges[UI]);
92306
+ if (pkg2) {
92307
+ const plan = planPackageJson(pkgSource, ranges, dropChat ? [
92308
+ APP_CHAT
92309
+ ] : []);
92310
+ if (plan.content) change(pkgFile, plan.content, plan.changes.join(", "));
92311
+ warnings.push(...plan.warnings);
92312
+ } else {
92313
+ manual.push([
92314
+ "web/package.json is not plain JSON, so it was left as is. In web/:",
92315
+ ` npm i ${UPGRADED_PACKAGES.map((n2) => `${n2}@"${ranges[n2]}"`).join(" ")}`,
92316
+ ...pkgSource.includes(APP_CHAT) && !stillImporting.length ? [
92317
+ ` npm uninstall ${APP_CHAT} (and remove the @import of its styles from web/src/index.css)`
92318
+ ] : []
92319
+ ]);
92320
+ }
92321
+ if (hasChat && stillImporting.length) {
92322
+ manual.push([
92323
+ `${APP_CHAT} was kept in web/package.json: ${stillImporting.join(", ")} still ${stillImporting.length === 1 ? "imports" : "import"} it. By hand,`,
92324
+ ...MANUAL_PANE_EDIT.map((l) => ` ${l}`)
92325
+ ]);
92326
+ }
92327
+ if (dropChat) {
92328
+ for (const file of styleImporters) {
92329
+ const next = dropChatStyleImports(file, read(file));
92330
+ if (next !== null) change(file, next, `import of ${PANE_CSS} removed`);
91549
92331
  }
91550
92332
  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
- ]);
92333
+ const css = fs26.existsSync(cssFile) ? removePaneStyles(read(cssFile)) : null;
92334
+ if (css !== null) change(cssFile, css, `@import '${PANE_CSS}' removed`);
92335
+ paneRemoved = true;
92336
+ }
92337
+ const mainFile = path32.join(srcDir, "main.tsx");
92338
+ let themeRemoved = false;
92339
+ if (!clientKept && !leftAlone.has(mainFile) && fs26.existsSync(mainFile)) {
92340
+ let planned;
92341
+ try {
92342
+ planned = JSON.parse(contents.get(pkgFile) ?? pkgSource);
92343
+ } catch (error) {
92344
+ if (!(error instanceof SyntaxError)) throw error;
92345
+ }
92346
+ const range2 = planned?.dependencies?.[APP_CLIENT] ?? planned?.devDependencies?.[APP_CLIENT];
92347
+ const floor = typeof range2 === "string" ? rangeFloor(range2) : void 0;
92348
+ if (floor && compareFloors(floor, rangeFloor(THEME_CLIENT_RANGE)) >= 0) {
92349
+ const next = removeThemeLines(mainFile, read(mainFile));
92350
+ if (next !== null) {
92351
+ change(mainFile, next, "theme lines removed (app-client applies the shell's theme)");
92352
+ themeRemoved = true;
92353
+ }
91560
92354
  }
91561
92355
  }
91562
92356
  return {
91563
92357
  target,
91564
92358
  changes: [
91565
92359
  ...contents.entries()
91566
- ].map(([file, content]) => ({
92360
+ ].sort(([a], [b]) => Number(b === pkgFile) - Number(a === pkgFile)).map(([file, content]) => ({
91567
92361
  file,
91568
92362
  content,
91569
92363
  summary: summaries.get(file).join("; ")
91570
92364
  })),
91571
92365
  warnings,
91572
- manual
92366
+ manual,
92367
+ paneRemoved,
92368
+ designChanged,
92369
+ themeRemoved
91573
92370
  };
91574
92371
  }
91575
92372
  __name(planWebAppUpgrade, "planWebAppUpgrade");
@@ -91631,6 +92428,12 @@ async function appsUpgradeCommand(name, opts = {}, deps = {}) {
91631
92428
  for (const c of plan.changes) {
91632
92429
  writeInfo(` ${c.content === null ? "delete" : "update"} ${rel(c.file).padEnd(width)} ${c.summary}`);
91633
92430
  }
92431
+ if (plan.designChanged) {
92432
+ 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.`);
92433
+ }
92434
+ if (plan.paneRemoved) {
92435
+ 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.");
92436
+ }
91634
92437
  printLeftovers();
91635
92438
  if (opts.dryRun) {
91636
92439
  writeInfo("\nDry run: nothing was written.");
@@ -91667,21 +92470,24 @@ async function appsUpgradeCommand(name, opts = {}, deps = {}) {
91667
92470
  installed = status === 0;
91668
92471
  if (!installed) {
91669
92472
  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`
92473
+ hint: `The files are already upgraded; only the install is missing. Run: cd ${pagesRel} && npm install` + (plan.themeRemoved ? ` (${THEME_INSTALL_NOTE}).` : "")
91671
92474
  });
91672
92475
  }
91673
92476
  }
92477
+ if (opts.skipInstall && plan.themeRemoved) {
92478
+ writeInfo(` \u26A0\uFE0F Run npm install in ${pagesRel} before lua apps dev or lua push: ${THEME_INSTALL_NOTE}.`);
92479
+ }
91674
92480
  writeHintBlock({
91675
92481
  headline: "Next:",
91676
92482
  lines: [
91677
92483
  ...opts.skipInstall ? [
91678
92484
  {
91679
- label: "Install pages:",
92485
+ label: plan.themeRemoved ? "Install pages (required):" : "Install pages:",
91680
92486
  command: `cd ${pagesRel} && npm install`
91681
92487
  }
91682
92488
  ] : [],
91683
92489
  {
91684
- label: target.agentPaneOff ? "Run locally:" : "Try the pane:",
92490
+ label: "Run locally:",
91685
92491
  command: `lua apps dev ${name}`
91686
92492
  },
91687
92493
  {
@@ -93389,18 +94195,27 @@ Examples:
93389
94195
  $ lua apps delete hello --ci --code 123456 Delete with the emailed code
93390
94196
  $ lua apps delete hello --agent agent_123 Outside the agent's project
93391
94197
  `).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", `
94198
+ 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
94199
  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
94200
  web/src/lua/ the copied app client (apps made before the package) is
93397
94201
  deleted and its imports point at @lua-ai-global/app-client,
93398
94202
  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.
94203
+ web/src/** the bundled agent pane comes out (the platform's pane, which
94204
+ the gateway injects, replaces it): <AgentPaneLayout> gives way
94205
+ to what it wraps (a context prop becomes lua.pane.setContext),
94206
+ useAgentPane() becomes lua.pane from @lua-ai-global/app-client
94207
+ web/package.json app-client and ui at least at the template's ranges
94208
+ (app-client ~0.0.5 once lua.pane is used; a newer range of
94209
+ yours is kept); @lua-ai-global/app-chat removed once nothing
94210
+ imports it
94211
+ web/src/index.css the @import of app-chat's styles, with the dependency
94212
+ web/src/main.tsx the old template's .dark toggle (app-client 0.1+ applies the
94213
+ shell's theme, density and accent itself), only when it is
94214
+ exactly the template's lines
94215
+ A file it cannot rewrite (other props, isOpen, <AgentPane>) is not edited: the
94216
+ steps are printed, and app-chat stays while a file imports it. Run it again and
94217
+ it says the app is up to date. It asks before writing when both stdin and stdout
94218
+ are terminals and --ci is off; --force (or --ci) applies without asking.
93404
94219
  With agentPane: false in defineWebApp the pages are upgraded, and the pane stays
93405
94220
  off until you remove it.
93406
94221