@wayai/cli 0.3.57 → 0.3.58

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
@@ -259,11 +259,15 @@ var init_api_client = __esm({
259
259
  }
260
260
  // --- Templates gallery ---
261
261
  // Consumer (any authed user): list the joint template set + pull the wayai slice.
262
- async templateList() {
263
- return this.request("GET", "/api/ci/templates");
262
+ // `locale` is optional — the server resolves to each template's defaultLocale when
263
+ // omitted, and falls back to it (with a resolvedLocale signal) when unauthored.
264
+ async templateList(locale) {
265
+ const qs = locale ? `?${new URLSearchParams({ locale })}` : "";
266
+ return this.request("GET", `/api/ci/templates${qs}`);
264
267
  }
265
- async templatePull(slug) {
266
- return this.request("GET", `/api/ci/templates/${encodeURIComponent(slug)}`);
268
+ async templatePull(slug, locale) {
269
+ const qs = locale ? `?${new URLSearchParams({ locale })}` : "";
270
+ return this.request("GET", `/api/ci/templates/${encodeURIComponent(slug)}${qs}`);
267
271
  }
268
272
  // Author (platform-admin): push a template into the store / pull it for inspection.
269
273
  async adminTemplatePush(body) {
@@ -5211,7 +5215,7 @@ function findStepBoundaries(transcript) {
5211
5215
  }
5212
5216
  return out;
5213
5217
  }
5214
- var APP_ERROR_BRAND, AppError, LLM_RATE_LIMIT_BRAND, LlmRateLimitError, LLM_PROVIDER_HTTP_BRAND, LlmProviderHttpError, LLM_PROVIDER_TIMEOUT_BRAND, LlmProviderTimeoutError, ExternalServiceError, CHANNEL_PROVIDER_HTTP_BRAND, ChannelProviderHttpError, MEDIA_PROVIDER_HTTP_BRAND, MediaProviderHttpError, AUTH_TYPE, ORG_CREDENTIAL_AUTH_TYPES, AUTH_TYPE_DISPLAY, LEGACY_AUTH_TYPE_MAP, VALID_AUTH_TYPES, AGENT_ROLES, SAFE_USER_ID_REGEX, uuidSchema, paginationSchema, timestampSchema, idParamSchema, primaryRegionSchema, placementSourceSchema, orgIdParam, orgAdminIdParam, createOrganizationBody, updateOrganizationBody, addOrgAdminBody, SUMMARIZATION_THRESHOLD_MIN, SUMMARIZATION_THRESHOLD_MAX, summarizationThresholdField, monitorConfigField, agentIdParam, listAgentsQuery, agentConnectionsQuery, createAgentBody, updateAgentBody, AGENT_PARAMETER_TYPES, AGENT_PARAMETER_NAME_REGEX, agentParameterCreateSchema, MAX_AGENT_PARAMETERS_PER_REQUEST, createAgentParametersBody, SLUG_REGEX, slugSchema, INVISIBLE_NAME_CHARS, MAX_KANBAN_STATUSES, MAX_FOLLOWUPS_PER_STATUS, MAX_LANES, MAX_ADDITIONAL_CONTEXT_SCHEMA_BYTES, RESERVED_TEMPLATE_DUMP_NAME, kanbanStatusSlugSchema, followupSchema, EXCLUSIVE_FLAG_PAIRS, kanbanStatusSchema, kanbanStatusesArraySchema, laneSchema, lanesArraySchema, hubIdParam, hubAdminIdParam, hubUserIdParam, hubIdentityIdParam, hubTeamIdParam, hubTeamUserDeleteParam, hubSchemaQuery, createHubBody, updateHubBody, addHubAdminBody, addHubIdentityAuthorizationBody, contactDecisionBody, approveContactBody, listContactAccessQuery, createHubTeamBody, updateHubTeamBody, addHubTeamUserBody, reassignHubUserBody, replicatePreviewBody, claimCodeChannelParam, claimCodeDeleteParam, connectionIdParam, connectorIdParam, listConnectionsQuery, deleteConnectionQuery, addConnectionBody, editConnectionBody, registerWhatsappQuery, registerWhatsappBody, retryProvisioningQuery, resendDomainStatusQuery, PLACEHOLDER_TOKENS, ALLOWED_TYPES, SUBSCHEMA_OBJECT_KEYWORDS, SUBSCHEMA_LIST_KEYWORDS, SUBSCHEMA_MAP_KEYWORDS, MAX_SCHEMA_DEPTH, toolIdParam, listToolsQuery, toolAgentQuery, deleteToolQuery, toolConnectionsQuery, nativeToolIdSchema, addNativeToolBody, addMcpToolBody, createCustomToolBody, updateCustomToolBody, updateToolExecutionConfigBody, initialValueCreateSchema, initialValueUpdateSchema, stateIdParam, listStatesQuery, stateNameSchema, createStateBody, updateStateBody, reorderStatesBody, orgTagIdParam, listOrgTagsQuery, createOrgTagBody, updateOrgTagBody, orgCredentialIdParam, listOrgCredentialsQuery, createOrgCredentialBody, updateOrgCredentialBody, orgResourceIdParam, orgResourceFileIdParam, orgResourceFolderIdParam, hubOrgResourceParam, listOrgResourcesQuery, orgIdQuery, createOrgResourceBody, updateOrgResourceBody, createOrgResourceFolderBody, updateOrgResourceFolderBody, uploadOrgResourceFileBody, updateOrgResourceFileBody, uploadOrgSkillZipBody, linkOrgResourceBody, resourceIdParam, listResourcesQuery, createResourceBody, updateResourceBody, syncSkillsBody, resourceFileIdParam, listResourceFilesQuery, createResourceFileBody, updateResourceFileBody, uploadResourceFileBody, uploadSkillZipBody, resourceFolderIdParam, listResourceFoldersQuery, createResourceFolderBody, updateResourceFolderBody, agentResourceQuery, hubResourceQuery, linkAgentResourceBody, updateAgentResourceBody, unlinkAgentResourceQuery, navItemSchema, hubCountResetBody, navItemCountResetBody, typingBody, analyticsHubIdParam, analyticsVariableIdParam, updateVariablePinBody, updateAnalyticsViewBody, NUMERIC_FILTER_OPS, TEXT_FILTER_OPS, CATEGORICAL_FILTER_OPS, VARIABLE_FILTER_OPS, STRUCTURED_QUERY_OPS, STRUCTURED_QUERY_AGGREGATIONS, filterValueSchema, conversationsBody, analyticsConversationIdParam, messagesQuery, conversationDetailDataQuery, analyticsDataBody, structuredQueryBody, analyticsSqlBody, analyticsSqlSchemaQuery, PACING_INTERVAL_MIN_MS, PACING_INTERVAL_MAX_MS, EVAL_RUN_DEADLINE_MIN_MS, EVAL_RUN_DEADLINE_MAX_MS, paginationSchema2, evalIdParam, sessionIdParam, scenarioSetIdParam, hubIdQuery, createEvalBody, updateEvalBody, getEvalsQuery, toggleEvalBody, bulkToggleEvalsBody, pacingConfigSchema, sessionConfigSchema, createSessionBody, getSessionsQuery, getSessionResultsQuery, getSessionRunsQuery, evalAnalyticsQuery, getSessionCostQuery, compareSessionsQuery, evalsSqlBody, evalsSqlSchemaQuery, exportResultsQuery, validateEvalBody, hubAgentsQuery, createScenarioSetBody, updateScenarioSetBody, scenarioSetsHubQuery, createScenarioFromConversationBody, createJourneyFromConversationBody, journeyIdParam, journeyToolCallSchema, journeyTurnSchema, journeyStepOverrideSchema, createJourneyBody, updateJourneyBody, getConversationsQuery, getMessagesQuery, updateUserBody, updateProfileBody, pathnameRegex, updatePreferencesBody, registerPushTokenBody, deletePushTokenQuery, activityQuery, deletionModeSchema, deletionRequestBody, archiveHubIdParam, archiveConversationParams, archiveListQuery, archiveMessageObservabilityParams, conversationIdParam, claimBody, releaseBody, transferBody, closeBody, additionalContextPayloadSchema, kanbanUpdateBody, observabilityParams, observabilityListParams, deleteUserConversationsBody, sendMessageBody, listConversationsQuery, getConversationDetailParams, getConversationDetailQuery, listWhatsAppTemplatesQuery, sendWhatsAppTemplateBody, billingOrgIdParam, subscriptionItemParams, spendCapBody, growthPacksBody, portalSessionBody, checkoutSessionBody, updateBillingCurrencyBody, invoicesQuery, downloadBody, uploadQuery, signUrlBody, completionsBody, outboundSchemaQuery, templateIdParam, listTemplatesQuery, deleteTemplateQuery, templateStatusQuery, createTemplateBody, updateTemplateBody, submitTemplateBody, testTemplateBody, contactIdParam, listContactsQuery, createContactBody, updateContactBody, listIdParam, listListsQuery, listListContactsQuery, createListBody, updateListBody, addListContactsBody, removeListContactsBody, scheduleIdParam, listSchedulesQuery, listExecutionsQuery, createScheduleBody, updateScheduleBody, uuidPattern, ciUuidSchema, hubAsCodeConfigSchema, ciPullHubIdParam, ciBranchParam, ciPullQuery, ciHubsQuery, ciLookupQuery, ciBranchesQuery, ciSyncBody, ciPushBody, ciDiffBody, ciPublishBody, ciPublishPreviewBody, ciSyncMcpBody, ciOrgResourcesParam, orgResourcesConfigSchema, ciOrgResourcesPushBody, ciOrgResourcesDiffBody, adminOrgIdParam, adminOrgAdminIdParam, adminUserIdParam, adminPlanIdParam, adminOrganizationsQuery, adminUserSearchQuery, kanbanSlugMigrationQuery, adjustQuotaBody, updatePlanBody, addAdminUserBody, updatePlatformConfigBody, updateFreeOrgLimitBody, updatePricingPlanBody, dataExplorerSearchQuery, dataExplorerOrgIdParam, dataExplorerHubIdParam, dataExplorerConvIdParam, dataExplorerDoInstancesQuery, dataExplorerNsIdParam, dataExplorerKvKeysQuery, dataExplorerKvKeyParam, uuidOrHexId, dataExplorerDeleteOrgParam, dataExplorerDeleteHubParam, dataExplorerDeleteConvParam, dataExplorerDeleteUserParam, dataExplorerDeleteQuery, dataExplorerKvDeleteQuery, pitrDoNamespace, pitrBookmarkParam, pitrRestoreBody, healthSamplingTriggerBody, dataExplorerDebugDoType, DEBUG_READ_MAX_LIMIT, DEBUG_READ_DEFAULT_LIMIT, DEBUG_DO_HEX_PREFIX, debugDoEntityId, debugTableName, dataExplorerDebugTablesParam, dataExplorerDebugRowsParam, dataExplorerDebugRowsQuery, dataExplorerDebugAnalyticsTable, debugUuid, dataExplorerDebugAnalyticsRowsParam, dataExplorerDebugAnalyticsRowsQuery, debugHubConvParam, debugMessageIdQuery, whatsappCallbackBody, authMeResponse, wsTicketResponse, sessionCheckResponse, logoutResponse, magicCodeSendBody, magicCodeSendResponse, magicCodeVerifyBody, magicCodeVerifyResponse, browserParams, browserFoldersQuery, browserFilesQuery, stateOperationBody, conversationListResourcesQuery, conversationReadResourceQuery, listPendingSchedulesQuery, listHubAggregateSchedulesQuery, reportSourceSchema, intakeReportSourceSchema, reportClassificationSchema, reportStatusSchema, reportLocaleSchema, reportMessageAuthorRoleSchema, sentryRefStatusSchema, createReportBody, editReportBody, contestReportBody, reporterListQuery, listReportsQuery, GITHUB_ISSUE_URL_REGEX, githubIssueUrlSchema, transitionReportBody, groupReportsBody, holdReportBody, clickhouseReadyResponse, bootstrapQuery, requestSnapshotChunkMessage, MAX_NAME_LENGTH, MAX_VALUE_LENGTH, MAX_TAGS, MAX_TAG_LENGTH, MAX_SCOPE_HUBS, MAX_SCOPE_TAGS, vaultSecretScopeSchema, vaultCreateBody, vaultUpdateBody, PERMISSIONS, MAX_NAME_LENGTH2, MAX_HUBS_PER_GRANT, MAX_HUB_TAGS_PER_GRANT, MAX_GRANTS, permissionEnum, grantScopeSchema, grantSchema, createTokenBody, tokenOrgIdParam, tokenGrantScopeSchema, tokenGrantSchema, tokenMetadataSchema, listTokensResponse, createTokenResponse, orgTokenSummarySchema, listOrgTokensResponse, invitePreviewQuery, invitePreviewResponse, discordTier, discordBillingCycle, discordMetadata, discordOAuthStartResponse, discordOAuthFinalizeBody, discordOAuthFinalizeResponse, discordDisconnectResponse, jsonSchemaSchema, hubUserIdentity, stateValueEntry, getHubUserContextResponse, updateHubUserBody, updateHubUserResponse, unlockHubUserNameResponse, stateResetParams, stateResetResponse, hubAlertsParam, hubAlertSeverity, hubAlert, hubAlertsListResponse, noticeSeveritySchema, noticeStatusSchema, NOTICE_SCOPE_REGEX, noticeScopeSchema, noticeLinkSchema, createNoticeBody, updateNoticeBody, listNoticesQuery, noticeIdParamSchema, TEMPLATE_SLUG_REGEX, templateSlugSchema, templateStatusSchema, templateFileMapSchema, templateWayaiBlockSchema, templateRekorBlockSchema, templateYamlWayaiBlock, templateYamlRekorBlock, templateYamlSchema, templatePushMetadataSchema, templateHeroSchema, templatePushBody, templateSlugParam, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, WAYAI_WORKSPACE_LAYOUT, MAX_RESOURCE_FILE_SIZE;
5218
+ var APP_ERROR_BRAND, AppError, LLM_RATE_LIMIT_BRAND, LlmRateLimitError, LLM_PROVIDER_HTTP_BRAND, LlmProviderHttpError, LLM_PROVIDER_TIMEOUT_BRAND, LlmProviderTimeoutError, ExternalServiceError, CHANNEL_PROVIDER_HTTP_BRAND, ChannelProviderHttpError, MEDIA_PROVIDER_HTTP_BRAND, MediaProviderHttpError, AUTH_TYPE, ORG_CREDENTIAL_AUTH_TYPES, AUTH_TYPE_DISPLAY, LEGACY_AUTH_TYPE_MAP, VALID_AUTH_TYPES, AGENT_ROLES, SAFE_USER_ID_REGEX, SUPPORTED_LOCALES, uuidSchema, paginationSchema, timestampSchema, idParamSchema, primaryRegionSchema, placementSourceSchema, orgIdParam, orgAdminIdParam, createOrganizationBody, updateOrganizationBody, addOrgAdminBody, SUMMARIZATION_THRESHOLD_MIN, SUMMARIZATION_THRESHOLD_MAX, summarizationThresholdField, monitorConfigField, agentIdParam, listAgentsQuery, agentConnectionsQuery, createAgentBody, updateAgentBody, AGENT_PARAMETER_TYPES, AGENT_PARAMETER_NAME_REGEX, agentParameterCreateSchema, MAX_AGENT_PARAMETERS_PER_REQUEST, createAgentParametersBody, SLUG_REGEX, slugSchema, INVISIBLE_NAME_CHARS, MAX_KANBAN_STATUSES, MAX_FOLLOWUPS_PER_STATUS, MAX_LANES, MAX_ADDITIONAL_CONTEXT_SCHEMA_BYTES, RESERVED_TEMPLATE_DUMP_NAME, kanbanStatusSlugSchema, followupSchema, EXCLUSIVE_FLAG_PAIRS, kanbanStatusSchema, kanbanStatusesArraySchema, laneSchema, lanesArraySchema, hubIdParam, hubAdminIdParam, hubUserIdParam, hubIdentityIdParam, hubTeamIdParam, hubTeamUserDeleteParam, hubSchemaQuery, createHubBody, updateHubBody, addHubAdminBody, addHubIdentityAuthorizationBody, contactDecisionBody, approveContactBody, listContactAccessQuery, createHubTeamBody, updateHubTeamBody, addHubTeamUserBody, reassignHubUserBody, replicatePreviewBody, claimCodeChannelParam, claimCodeDeleteParam, connectionIdParam, connectorIdParam, listConnectionsQuery, deleteConnectionQuery, addConnectionBody, editConnectionBody, registerWhatsappQuery, registerWhatsappBody, retryProvisioningQuery, resendDomainStatusQuery, PLACEHOLDER_TOKENS, ALLOWED_TYPES, SUBSCHEMA_OBJECT_KEYWORDS, SUBSCHEMA_LIST_KEYWORDS, SUBSCHEMA_MAP_KEYWORDS, MAX_SCHEMA_DEPTH, toolIdParam, listToolsQuery, toolAgentQuery, deleteToolQuery, toolConnectionsQuery, nativeToolIdSchema, addNativeToolBody, addMcpToolBody, createCustomToolBody, updateCustomToolBody, updateToolExecutionConfigBody, initialValueCreateSchema, initialValueUpdateSchema, stateIdParam, listStatesQuery, stateNameSchema, createStateBody, updateStateBody, reorderStatesBody, orgTagIdParam, listOrgTagsQuery, createOrgTagBody, updateOrgTagBody, orgCredentialIdParam, listOrgCredentialsQuery, createOrgCredentialBody, updateOrgCredentialBody, orgResourceIdParam, orgResourceFileIdParam, orgResourceFolderIdParam, hubOrgResourceParam, listOrgResourcesQuery, orgIdQuery, createOrgResourceBody, updateOrgResourceBody, createOrgResourceFolderBody, updateOrgResourceFolderBody, uploadOrgResourceFileBody, updateOrgResourceFileBody, uploadOrgSkillZipBody, linkOrgResourceBody, resourceIdParam, listResourcesQuery, createResourceBody, updateResourceBody, syncSkillsBody, resourceFileIdParam, listResourceFilesQuery, createResourceFileBody, updateResourceFileBody, uploadResourceFileBody, uploadSkillZipBody, resourceFolderIdParam, listResourceFoldersQuery, createResourceFolderBody, updateResourceFolderBody, agentResourceQuery, hubResourceQuery, linkAgentResourceBody, updateAgentResourceBody, unlinkAgentResourceQuery, navItemSchema, hubCountResetBody, navItemCountResetBody, typingBody, analyticsHubIdParam, analyticsVariableIdParam, updateVariablePinBody, updateAnalyticsViewBody, NUMERIC_FILTER_OPS, TEXT_FILTER_OPS, CATEGORICAL_FILTER_OPS, VARIABLE_FILTER_OPS, STRUCTURED_QUERY_OPS, STRUCTURED_QUERY_AGGREGATIONS, filterValueSchema, conversationsBody, analyticsConversationIdParam, messagesQuery, conversationDetailDataQuery, analyticsDataBody, structuredQueryBody, analyticsSqlBody, analyticsSqlSchemaQuery, PACING_INTERVAL_MIN_MS, PACING_INTERVAL_MAX_MS, EVAL_RUN_DEADLINE_MIN_MS, EVAL_RUN_DEADLINE_MAX_MS, paginationSchema2, evalIdParam, sessionIdParam, scenarioSetIdParam, hubIdQuery, createEvalBody, updateEvalBody, getEvalsQuery, toggleEvalBody, bulkToggleEvalsBody, pacingConfigSchema, sessionConfigSchema, createSessionBody, getSessionsQuery, getSessionResultsQuery, getSessionRunsQuery, evalAnalyticsQuery, getSessionCostQuery, compareSessionsQuery, evalsSqlBody, evalsSqlSchemaQuery, exportResultsQuery, validateEvalBody, hubAgentsQuery, createScenarioSetBody, updateScenarioSetBody, scenarioSetsHubQuery, createScenarioFromConversationBody, createJourneyFromConversationBody, journeyIdParam, journeyToolCallSchema, journeyTurnSchema, journeyStepOverrideSchema, createJourneyBody, updateJourneyBody, getConversationsQuery, getMessagesQuery, updateUserBody, updateProfileBody, pathnameRegex, updatePreferencesBody, registerPushTokenBody, deletePushTokenQuery, activityQuery, deletionModeSchema, deletionRequestBody, archiveHubIdParam, archiveConversationParams, archiveListQuery, archiveMessageObservabilityParams, conversationIdParam, claimBody, releaseBody, transferBody, closeBody, additionalContextPayloadSchema, kanbanUpdateBody, observabilityParams, observabilityListParams, deleteUserConversationsBody, sendMessageBody, listConversationsQuery, getConversationDetailParams, getConversationDetailQuery, listWhatsAppTemplatesQuery, sendWhatsAppTemplateBody, billingOrgIdParam, subscriptionItemParams, spendCapBody, growthPacksBody, portalSessionBody, checkoutSessionBody, updateBillingCurrencyBody, invoicesQuery, downloadBody, uploadQuery, signUrlBody, completionsBody, outboundSchemaQuery, templateIdParam, listTemplatesQuery, deleteTemplateQuery, templateStatusQuery, createTemplateBody, updateTemplateBody, submitTemplateBody, testTemplateBody, contactIdParam, listContactsQuery, createContactBody, updateContactBody, listIdParam, listListsQuery, listListContactsQuery, createListBody, updateListBody, addListContactsBody, removeListContactsBody, scheduleIdParam, listSchedulesQuery, listExecutionsQuery, createScheduleBody, updateScheduleBody, uuidPattern, ciUuidSchema, hubAsCodeConfigSchema, ciPullHubIdParam, ciBranchParam, ciPullQuery, ciHubsQuery, ciLookupQuery, ciBranchesQuery, ciSyncBody, ciPushBody, ciDiffBody, ciPublishBody, ciPublishPreviewBody, ciSyncMcpBody, ciOrgResourcesParam, orgResourcesConfigSchema, ciOrgResourcesPushBody, ciOrgResourcesDiffBody, adminOrgIdParam, adminOrgAdminIdParam, adminUserIdParam, adminPlanIdParam, adminOrganizationsQuery, adminUserSearchQuery, kanbanSlugMigrationQuery, adjustQuotaBody, updatePlanBody, addAdminUserBody, updatePlatformConfigBody, updateFreeOrgLimitBody, updatePricingPlanBody, dataExplorerSearchQuery, dataExplorerOrgIdParam, dataExplorerHubIdParam, dataExplorerConvIdParam, dataExplorerDoInstancesQuery, dataExplorerNsIdParam, dataExplorerKvKeysQuery, dataExplorerKvKeyParam, uuidOrHexId, dataExplorerDeleteOrgParam, dataExplorerDeleteHubParam, dataExplorerDeleteConvParam, dataExplorerDeleteUserParam, dataExplorerDeleteQuery, dataExplorerKvDeleteQuery, pitrDoNamespace, pitrBookmarkParam, pitrRestoreBody, healthSamplingTriggerBody, dataExplorerDebugDoType, DEBUG_READ_MAX_LIMIT, DEBUG_READ_DEFAULT_LIMIT, DEBUG_DO_HEX_PREFIX, debugDoEntityId, debugTableName, dataExplorerDebugTablesParam, dataExplorerDebugRowsParam, dataExplorerDebugRowsQuery, dataExplorerDebugAnalyticsTable, debugUuid, dataExplorerDebugAnalyticsRowsParam, dataExplorerDebugAnalyticsRowsQuery, debugHubConvParam, debugMessageIdQuery, whatsappCallbackBody, authMeResponse, wsTicketResponse, sessionCheckResponse, logoutResponse, magicCodeSendBody, magicCodeSendResponse, magicCodeVerifyBody, magicCodeVerifyResponse, browserParams, browserFoldersQuery, browserFilesQuery, stateOperationBody, conversationListResourcesQuery, conversationReadResourceQuery, listPendingSchedulesQuery, listHubAggregateSchedulesQuery, reportSourceSchema, intakeReportSourceSchema, reportClassificationSchema, reportStatusSchema, reportLocaleSchema, reportMessageAuthorRoleSchema, sentryRefStatusSchema, createReportBody, editReportBody, contestReportBody, reporterListQuery, listReportsQuery, GITHUB_ISSUE_URL_REGEX, githubIssueUrlSchema, transitionReportBody, groupReportsBody, holdReportBody, clickhouseReadyResponse, bootstrapQuery, requestSnapshotChunkMessage, MAX_NAME_LENGTH, MAX_VALUE_LENGTH, MAX_TAGS, MAX_TAG_LENGTH, MAX_SCOPE_HUBS, MAX_SCOPE_TAGS, vaultSecretScopeSchema, vaultCreateBody, vaultUpdateBody, PERMISSIONS, MAX_NAME_LENGTH2, MAX_HUBS_PER_GRANT, MAX_HUB_TAGS_PER_GRANT, MAX_GRANTS, permissionEnum, grantScopeSchema, grantSchema, createTokenBody, tokenOrgIdParam, tokenGrantScopeSchema, tokenGrantSchema, tokenMetadataSchema, listTokensResponse, createTokenResponse, orgTokenSummarySchema, listOrgTokensResponse, invitePreviewQuery, invitePreviewResponse, discordTier, discordBillingCycle, discordMetadata, discordOAuthStartResponse, discordOAuthFinalizeBody, discordOAuthFinalizeResponse, discordDisconnectResponse, jsonSchemaSchema, hubUserIdentity, stateValueEntry, getHubUserContextResponse, updateHubUserBody, updateHubUserResponse, unlockHubUserNameResponse, stateResetParams, stateResetResponse, hubAlertsParam, hubAlertSeverity, hubAlert, hubAlertsListResponse, noticeSeveritySchema, noticeStatusSchema, NOTICE_SCOPE_REGEX, noticeScopeSchema, noticeLinkSchema, createNoticeBody, updateNoticeBody, listNoticesQuery, noticeIdParamSchema, templateLocaleSchema, TEMPLATE_SLUG_REGEX, templateSlugSchema, templateStatusSchema, templateFileMapSchema, templateTextSchema, templateRekorPointerSchema, templateYamlLocaleEntry, templateYamlWayaiBlock, templateYamlRekorBlock, templateYamlSchema, templateHeroSchema, templatePushLocaleSchema, templatePushBody, templateListQuery, templateSlugParam, templateDetailQuery, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, WAYAI_WORKSPACE_LAYOUT, MAX_RESOURCE_FILE_SIZE;
5215
5219
  var init_dist = __esm({
5216
5220
  "../../packages/core/dist/index.js"() {
5217
5221
  "use strict";
@@ -5387,6 +5391,7 @@ var init_dist = __esm({
5387
5391
  "summarizer"
5388
5392
  ];
5389
5393
  SAFE_USER_ID_REGEX = /^[A-Za-z0-9_-]{1,64}$/;
5394
+ SUPPORTED_LOCALES = ["en", "pt", "es"];
5390
5395
  uuidSchema = external_exports.string().uuid();
5391
5396
  paginationSchema = external_exports.object({
5392
5397
  limit: external_exports.coerce.number().int().min(1).max(100).default(50),
@@ -7561,62 +7566,76 @@ var init_dist = __esm({
7561
7566
  offset: external_exports.coerce.number().int().min(0).optional()
7562
7567
  });
7563
7568
  noticeIdParamSchema = external_exports.object({ id: external_exports.string().min(1) });
7569
+ templateLocaleSchema = external_exports.enum(SUPPORTED_LOCALES);
7564
7570
  TEMPLATE_SLUG_REGEX = /^[a-z0-9][a-z0-9-]{0,62}$/;
7565
7571
  templateSlugSchema = external_exports.string().regex(TEMPLATE_SLUG_REGEX, "slug must be lowercase alphanumeric with hyphens (max 63)");
7566
7572
  templateStatusSchema = external_exports.enum(["published", "draft", "internal"]);
7567
7573
  templateFileMapSchema = external_exports.record(external_exports.string()).refine((m) => Object.keys(m).every(isSafeTemplatePath), {
7568
7574
  message: 'file map contains an unsafe path (no absolute paths, "..", or backslashes)'
7569
7575
  });
7570
- templateWayaiBlockSchema = external_exports.object({
7576
+ templateTextSchema = external_exports.object({
7571
7577
  metaTitle: external_exports.string().min(1).max(200),
7572
- metaDescription: external_exports.string().max(1e3).default(""),
7573
- installCommand: external_exports.string().min(1).max(300)
7578
+ metaDescription: external_exports.string().max(1e3).default("")
7574
7579
  });
7575
- templateRekorBlockSchema = templateWayaiBlockSchema.extend({
7580
+ templateRekorPointerSchema = external_exports.object({
7576
7581
  mcpEndpoint: external_exports.string().url().optional(),
7577
7582
  url: external_exports.string().url().optional()
7578
7583
  });
7579
- templateYamlWayaiBlock = templateWayaiBlockSchema.extend({
7580
- source: external_exports.string().min(1)
7584
+ templateYamlLocaleEntry = templateTextSchema.extend({ source: external_exports.string().min(1) });
7585
+ templateYamlWayaiBlock = external_exports.object({
7586
+ installCommand: external_exports.string().min(1).max(300),
7587
+ locales: external_exports.record(templateLocaleSchema, templateYamlLocaleEntry)
7581
7588
  });
7582
- templateYamlRekorBlock = templateRekorBlockSchema.extend({
7583
- source: external_exports.string().min(1)
7589
+ templateYamlRekorBlock = templateRekorPointerSchema.extend({
7590
+ locales: external_exports.record(templateLocaleSchema, templateYamlLocaleEntry)
7584
7591
  });
7585
7592
  templateYamlSchema = external_exports.object({
7586
7593
  slug: templateSlugSchema,
7587
7594
  category: external_exports.string().min(1).max(60),
7588
7595
  status: templateStatusSchema.default("draft"),
7589
7596
  order: external_exports.number().int().min(0).max(1e5).optional(),
7597
+ defaultLocale: templateLocaleSchema,
7590
7598
  hero: external_exports.string().optional(),
7591
7599
  // relative path to a hero image inside the template folder
7592
7600
  wayai: templateYamlWayaiBlock.optional(),
7593
7601
  rekor: templateYamlRekorBlock.optional()
7594
7602
  }).refine((c) => Boolean(c.wayai) || Boolean(c.rekor), {
7595
7603
  message: "template.yaml must define at least one of `wayai:` or `rekor:`"
7596
- });
7597
- templatePushMetadataSchema = external_exports.object({
7598
- category: external_exports.string().min(1).max(60),
7599
- status: templateStatusSchema,
7600
- order: external_exports.number().int().min(0).max(1e5).default(0),
7601
- wayai: templateWayaiBlockSchema.optional(),
7602
- rekor: templateRekorBlockSchema.optional()
7604
+ }).refine((c) => !c.wayai || Boolean(c.wayai.locales[c.defaultLocale]), {
7605
+ message: "`wayai.locales` must include the defaultLocale"
7606
+ }).refine((c) => !c.rekor || Boolean(c.rekor.locales[c.defaultLocale]), {
7607
+ message: "`rekor.locales` must include the defaultLocale"
7603
7608
  });
7604
7609
  templateHeroSchema = external_exports.object({
7605
7610
  filename: external_exports.string().min(1).max(200).regex(/\.(png|jpe?g|webp|gif)$/i, "hero must be a raster image (png/jpg/webp/gif)"),
7606
- // ~8MB of base64 ≈ a ~6MB image — a generous cap that bounds the inline payload
7607
- // (the endpoint is platform-admin-only, but an unbounded blob is still avoidable).
7608
7611
  dataBase64: external_exports.string().min(1).max(8e6)
7609
7612
  });
7613
+ templatePushLocaleSchema = external_exports.object({
7614
+ wayai: templateTextSchema.optional(),
7615
+ rekorText: templateTextSchema.optional(),
7616
+ readmeMarkdown: external_exports.string().default(""),
7617
+ wayaiFiles: templateFileMapSchema.optional()
7618
+ });
7610
7619
  templatePushBody = external_exports.object({
7611
7620
  slug: templateSlugSchema,
7612
- metadata: templatePushMetadataSchema,
7613
- // wayai slice file-map (path -> body); ABSENT for a Rekor-only template.
7614
- wayaiFiles: templateFileMapSchema.optional(),
7615
- // raw README markdown; the backend renders + sanitizes (single authority).
7616
- readmeMarkdown: external_exports.string().default(""),
7617
- hero: templateHeroSchema.optional()
7621
+ defaultLocale: templateLocaleSchema,
7622
+ common: external_exports.object({
7623
+ category: external_exports.string().min(1).max(60),
7624
+ status: templateStatusSchema,
7625
+ order: external_exports.number().int().min(0).max(1e5).default(0),
7626
+ // The WayAI install command — present iff the template has a wayai side; a
7627
+ // Rekor-only template omits it.
7628
+ installCommand: external_exports.string().min(1).max(300).optional(),
7629
+ hero: templateHeroSchema.optional(),
7630
+ rekorPointer: templateRekorPointerSchema.optional()
7631
+ }),
7632
+ locales: external_exports.record(templateLocaleSchema, templatePushLocaleSchema)
7633
+ }).refine((b) => Boolean(b.locales[b.defaultLocale]), {
7634
+ message: "`locales` must include the defaultLocale"
7618
7635
  });
7636
+ templateListQuery = external_exports.object({ locale: templateLocaleSchema.optional() });
7619
7637
  templateSlugParam = external_exports.object({ slug: templateSlugSchema });
7638
+ templateDetailQuery = external_exports.object({ locale: templateLocaleSchema.optional() });
7620
7639
  ADMIN_SKILL_NAME_REGEX = /^[a-z0-9][a-z0-9-]{0,63}$/;
7621
7640
  adminSkillNameParam = external_exports.object({
7622
7641
  name: external_exports.string().regex(ADMIN_SKILL_NAME_REGEX, "invalid skill name")
@@ -13091,7 +13110,7 @@ function isSafeTemplatePath2(path22) {
13091
13110
  (seg) => seg.length > 0 && seg !== "." && seg !== ".." && /^[A-Za-z0-9._-]+$/.test(seg)
13092
13111
  );
13093
13112
  }
13094
- var uuidSchema2, paginationSchema3, timestampSchema2, idParamSchema2, primaryRegionSchema2, placementSourceSchema2, orgIdParam2, orgAdminIdParam2, createOrganizationBody2, updateOrganizationBody2, addOrgAdminBody2, AUTH_TYPE2, ORG_CREDENTIAL_AUTH_TYPES2, AUTH_TYPE_DISPLAY2, LEGACY_AUTH_TYPE_MAP2, VALID_AUTH_TYPES2, AGENT_ROLES2, SAFE_USER_ID_REGEX2, SUMMARIZATION_THRESHOLD_MIN2, SUMMARIZATION_THRESHOLD_MAX2, summarizationThresholdField2, monitorConfigField2, agentIdParam2, listAgentsQuery2, agentConnectionsQuery2, createAgentBody2, updateAgentBody2, AGENT_PARAMETER_TYPES2, AGENT_PARAMETER_NAME_REGEX2, agentParameterCreateSchema2, MAX_AGENT_PARAMETERS_PER_REQUEST2, createAgentParametersBody2, SLUG_REGEX2, slugSchema2, INVISIBLE_NAME_CHARS2, MAX_KANBAN_STATUSES2, MAX_FOLLOWUPS_PER_STATUS2, MAX_LANES2, MAX_ADDITIONAL_CONTEXT_SCHEMA_BYTES2, RESERVED_TEMPLATE_DUMP_NAME2, kanbanStatusSlugSchema2, followupSchema2, EXCLUSIVE_FLAG_PAIRS2, kanbanStatusSchema2, kanbanStatusesArraySchema2, laneSchema2, lanesArraySchema2, hubIdParam2, hubAdminIdParam2, hubUserIdParam2, hubIdentityIdParam2, hubTeamIdParam2, hubTeamUserDeleteParam2, hubSchemaQuery2, createHubBody2, updateHubBody2, addHubAdminBody2, addHubIdentityAuthorizationBody2, contactDecisionBody2, approveContactBody2, listContactAccessQuery2, createHubTeamBody2, updateHubTeamBody2, addHubTeamUserBody2, reassignHubUserBody2, replicatePreviewBody2, claimCodeChannelParam2, claimCodeDeleteParam2, connectionIdParam2, connectorIdParam2, listConnectionsQuery2, deleteConnectionQuery2, addConnectionBody2, editConnectionBody2, registerWhatsappQuery2, registerWhatsappBody2, retryProvisioningQuery2, resendDomainStatusQuery2, PLACEHOLDER_TOKENS2, ALLOWED_TYPES2, SUBSCHEMA_OBJECT_KEYWORDS2, SUBSCHEMA_LIST_KEYWORDS2, SUBSCHEMA_MAP_KEYWORDS2, MAX_SCHEMA_DEPTH2, toolIdParam2, listToolsQuery2, toolAgentQuery2, deleteToolQuery2, toolConnectionsQuery2, nativeToolIdSchema2, addNativeToolBody2, addMcpToolBody2, createCustomToolBody2, updateCustomToolBody2, updateToolExecutionConfigBody2, initialValueCreateSchema2, initialValueUpdateSchema2, stateIdParam2, listStatesQuery2, stateNameSchema2, createStateBody2, updateStateBody2, reorderStatesBody2, orgTagIdParam2, listOrgTagsQuery2, createOrgTagBody2, updateOrgTagBody2, orgCredentialIdParam2, listOrgCredentialsQuery2, createOrgCredentialBody2, updateOrgCredentialBody2, orgResourceIdParam2, orgResourceFileIdParam2, orgResourceFolderIdParam2, hubOrgResourceParam2, listOrgResourcesQuery2, orgIdQuery2, createOrgResourceBody2, updateOrgResourceBody2, createOrgResourceFolderBody2, updateOrgResourceFolderBody2, uploadOrgResourceFileBody2, updateOrgResourceFileBody2, uploadOrgSkillZipBody2, linkOrgResourceBody2, resourceIdParam2, listResourcesQuery2, createResourceBody2, updateResourceBody2, syncSkillsBody2, resourceFileIdParam2, listResourceFilesQuery2, createResourceFileBody2, updateResourceFileBody2, uploadResourceFileBody2, uploadSkillZipBody2, resourceFolderIdParam2, listResourceFoldersQuery2, createResourceFolderBody2, updateResourceFolderBody2, agentResourceQuery2, hubResourceQuery2, linkAgentResourceBody2, updateAgentResourceBody2, unlinkAgentResourceQuery2, navItemSchema2, hubCountResetBody2, navItemCountResetBody2, typingBody2, analyticsHubIdParam2, analyticsVariableIdParam2, updateVariablePinBody2, updateAnalyticsViewBody2, NUMERIC_FILTER_OPS2, TEXT_FILTER_OPS2, CATEGORICAL_FILTER_OPS2, VARIABLE_FILTER_OPS2, STRUCTURED_QUERY_OPS2, STRUCTURED_QUERY_AGGREGATIONS2, filterValueSchema2, conversationsBody2, analyticsConversationIdParam2, messagesQuery2, conversationDetailDataQuery2, analyticsDataBody2, structuredQueryBody2, analyticsSqlBody2, analyticsSqlSchemaQuery2, PACING_INTERVAL_MIN_MS2, PACING_INTERVAL_MAX_MS2, EVAL_RUN_DEADLINE_MIN_MS2, EVAL_RUN_DEADLINE_MAX_MS2, paginationSchema22, evalIdParam2, sessionIdParam2, scenarioSetIdParam2, hubIdQuery2, createEvalBody2, updateEvalBody2, getEvalsQuery2, toggleEvalBody2, bulkToggleEvalsBody2, pacingConfigSchema2, sessionConfigSchema2, createSessionBody2, getSessionsQuery2, getSessionResultsQuery2, getSessionRunsQuery2, evalAnalyticsQuery2, getSessionCostQuery2, compareSessionsQuery2, evalsSqlBody2, evalsSqlSchemaQuery2, exportResultsQuery2, validateEvalBody2, hubAgentsQuery2, createScenarioSetBody2, updateScenarioSetBody2, scenarioSetsHubQuery2, createScenarioFromConversationBody2, createJourneyFromConversationBody2, journeyIdParam2, journeyToolCallSchema2, journeyTurnSchema2, journeyStepOverrideSchema2, createJourneyBody2, updateJourneyBody2, getConversationsQuery2, getMessagesQuery2, updateUserBody2, updateProfileBody2, pathnameRegex2, updatePreferencesBody2, registerPushTokenBody2, deletePushTokenQuery2, activityQuery2, deletionModeSchema2, deletionRequestBody2, archiveHubIdParam2, archiveConversationParams2, archiveListQuery2, archiveMessageObservabilityParams2, conversationIdParam2, claimBody2, releaseBody2, transferBody2, closeBody2, additionalContextPayloadSchema2, kanbanUpdateBody2, observabilityParams2, observabilityListParams2, deleteUserConversationsBody2, sendMessageBody2, listConversationsQuery2, getConversationDetailParams2, getConversationDetailQuery2, listWhatsAppTemplatesQuery2, sendWhatsAppTemplateBody2, billingOrgIdParam2, subscriptionItemParams2, spendCapBody2, growthPacksBody2, portalSessionBody2, checkoutSessionBody2, updateBillingCurrencyBody2, invoicesQuery2, downloadBody2, uploadQuery2, signUrlBody2, completionsBody2, outboundSchemaQuery2, templateIdParam2, listTemplatesQuery2, deleteTemplateQuery2, templateStatusQuery2, createTemplateBody2, updateTemplateBody2, submitTemplateBody2, testTemplateBody2, contactIdParam2, listContactsQuery2, createContactBody2, updateContactBody2, listIdParam2, listListsQuery2, listListContactsQuery2, createListBody2, updateListBody2, addListContactsBody2, removeListContactsBody2, scheduleIdParam2, listSchedulesQuery2, listExecutionsQuery2, createScheduleBody2, updateScheduleBody2, uuidPattern2, ciUuidSchema2, hubAsCodeConfigSchema2, ciPullHubIdParam2, ciBranchParam2, ciPullQuery2, ciHubsQuery2, ciLookupQuery2, ciBranchesQuery2, ciSyncBody2, ciPushBody2, ciDiffBody2, ciPublishBody2, ciPublishPreviewBody2, ciSyncMcpBody2, ciOrgResourcesParam2, orgResourcesConfigSchema2, ciOrgResourcesPushBody2, ciOrgResourcesDiffBody2, adminOrgIdParam2, adminOrgAdminIdParam2, adminUserIdParam2, adminPlanIdParam2, adminOrganizationsQuery2, adminUserSearchQuery2, kanbanSlugMigrationQuery2, adjustQuotaBody2, updatePlanBody2, addAdminUserBody2, updatePlatformConfigBody2, updateFreeOrgLimitBody2, updatePricingPlanBody2, dataExplorerSearchQuery2, dataExplorerOrgIdParam2, dataExplorerHubIdParam2, dataExplorerConvIdParam2, dataExplorerDoInstancesQuery2, dataExplorerNsIdParam2, dataExplorerKvKeysQuery2, dataExplorerKvKeyParam2, uuidOrHexId2, dataExplorerDeleteOrgParam2, dataExplorerDeleteHubParam2, dataExplorerDeleteConvParam2, dataExplorerDeleteUserParam2, dataExplorerDeleteQuery2, dataExplorerKvDeleteQuery2, pitrDoNamespace2, pitrBookmarkParam2, pitrRestoreBody2, healthSamplingTriggerBody2, dataExplorerDebugDoType2, DEBUG_READ_MAX_LIMIT2, DEBUG_READ_DEFAULT_LIMIT2, DEBUG_DO_HEX_PREFIX2, debugDoEntityId2, debugTableName2, dataExplorerDebugTablesParam2, dataExplorerDebugRowsParam2, dataExplorerDebugRowsQuery2, dataExplorerDebugAnalyticsTable2, debugUuid2, dataExplorerDebugAnalyticsRowsParam2, dataExplorerDebugAnalyticsRowsQuery2, debugHubConvParam2, debugMessageIdQuery2, whatsappCallbackBody2, authMeResponse2, wsTicketResponse2, sessionCheckResponse2, logoutResponse2, magicCodeSendBody2, magicCodeSendResponse2, magicCodeVerifyBody2, magicCodeVerifyResponse2, browserParams2, browserFoldersQuery2, browserFilesQuery2, stateOperationBody2, conversationListResourcesQuery2, conversationReadResourceQuery2, listPendingSchedulesQuery2, listHubAggregateSchedulesQuery2, reportSourceSchema2, intakeReportSourceSchema2, reportClassificationSchema2, reportStatusSchema2, reportLocaleSchema2, reportMessageAuthorRoleSchema2, sentryRefStatusSchema2, createReportBody2, editReportBody2, contestReportBody2, reporterListQuery2, listReportsQuery2, GITHUB_ISSUE_URL_REGEX2, githubIssueUrlSchema2, transitionReportBody2, groupReportsBody2, holdReportBody2, clickhouseReadyResponse2, bootstrapQuery2, requestSnapshotChunkMessage2, MAX_NAME_LENGTH3, MAX_VALUE_LENGTH2, MAX_TAGS2, MAX_TAG_LENGTH2, MAX_SCOPE_HUBS2, MAX_SCOPE_TAGS2, vaultSecretScopeSchema2, vaultCreateBody2, vaultUpdateBody2, PERMISSIONS2, MAX_NAME_LENGTH22, MAX_HUBS_PER_GRANT2, MAX_HUB_TAGS_PER_GRANT2, MAX_GRANTS2, permissionEnum2, grantScopeSchema2, grantSchema2, createTokenBody2, tokenOrgIdParam2, tokenGrantScopeSchema2, tokenGrantSchema2, tokenMetadataSchema2, listTokensResponse2, createTokenResponse2, orgTokenSummarySchema2, listOrgTokensResponse2, invitePreviewQuery2, invitePreviewResponse2, discordTier2, discordBillingCycle2, discordMetadata2, discordOAuthStartResponse2, discordOAuthFinalizeBody2, discordOAuthFinalizeResponse2, discordDisconnectResponse2, jsonSchemaSchema2, hubUserIdentity2, stateValueEntry2, getHubUserContextResponse2, updateHubUserBody2, updateHubUserResponse2, unlockHubUserNameResponse2, stateResetParams2, stateResetResponse2, hubAlertsParam2, hubAlertSeverity2, hubAlert2, hubAlertsListResponse2, noticeSeveritySchema2, noticeStatusSchema2, NOTICE_SCOPE_REGEX2, noticeScopeSchema2, noticeLinkSchema2, createNoticeBody2, updateNoticeBody2, listNoticesQuery2, noticeIdParamSchema2, TEMPLATE_SLUG_REGEX2, templateSlugSchema2, templateStatusSchema2, templateFileMapSchema2, templateWayaiBlockSchema2, templateRekorBlockSchema2, templateYamlWayaiBlock2, templateYamlRekorBlock2, templateYamlSchema2, templatePushMetadataSchema2, templateHeroSchema2, templatePushBody2, templateSlugParam2, ADMIN_SKILL_NAME_REGEX2, adminSkillNameParam2;
13113
+ var uuidSchema2, paginationSchema3, timestampSchema2, idParamSchema2, primaryRegionSchema2, placementSourceSchema2, orgIdParam2, orgAdminIdParam2, createOrganizationBody2, updateOrganizationBody2, addOrgAdminBody2, AUTH_TYPE2, ORG_CREDENTIAL_AUTH_TYPES2, AUTH_TYPE_DISPLAY2, LEGACY_AUTH_TYPE_MAP2, VALID_AUTH_TYPES2, AGENT_ROLES2, SAFE_USER_ID_REGEX2, SUPPORTED_LOCALES2, SUMMARIZATION_THRESHOLD_MIN2, SUMMARIZATION_THRESHOLD_MAX2, summarizationThresholdField2, monitorConfigField2, agentIdParam2, listAgentsQuery2, agentConnectionsQuery2, createAgentBody2, updateAgentBody2, AGENT_PARAMETER_TYPES2, AGENT_PARAMETER_NAME_REGEX2, agentParameterCreateSchema2, MAX_AGENT_PARAMETERS_PER_REQUEST2, createAgentParametersBody2, SLUG_REGEX2, slugSchema2, INVISIBLE_NAME_CHARS2, MAX_KANBAN_STATUSES2, MAX_FOLLOWUPS_PER_STATUS2, MAX_LANES2, MAX_ADDITIONAL_CONTEXT_SCHEMA_BYTES2, RESERVED_TEMPLATE_DUMP_NAME2, kanbanStatusSlugSchema2, followupSchema2, EXCLUSIVE_FLAG_PAIRS2, kanbanStatusSchema2, kanbanStatusesArraySchema2, laneSchema2, lanesArraySchema2, hubIdParam2, hubAdminIdParam2, hubUserIdParam2, hubIdentityIdParam2, hubTeamIdParam2, hubTeamUserDeleteParam2, hubSchemaQuery2, createHubBody2, updateHubBody2, addHubAdminBody2, addHubIdentityAuthorizationBody2, contactDecisionBody2, approveContactBody2, listContactAccessQuery2, createHubTeamBody2, updateHubTeamBody2, addHubTeamUserBody2, reassignHubUserBody2, replicatePreviewBody2, claimCodeChannelParam2, claimCodeDeleteParam2, connectionIdParam2, connectorIdParam2, listConnectionsQuery2, deleteConnectionQuery2, addConnectionBody2, editConnectionBody2, registerWhatsappQuery2, registerWhatsappBody2, retryProvisioningQuery2, resendDomainStatusQuery2, PLACEHOLDER_TOKENS2, ALLOWED_TYPES2, SUBSCHEMA_OBJECT_KEYWORDS2, SUBSCHEMA_LIST_KEYWORDS2, SUBSCHEMA_MAP_KEYWORDS2, MAX_SCHEMA_DEPTH2, toolIdParam2, listToolsQuery2, toolAgentQuery2, deleteToolQuery2, toolConnectionsQuery2, nativeToolIdSchema2, addNativeToolBody2, addMcpToolBody2, createCustomToolBody2, updateCustomToolBody2, updateToolExecutionConfigBody2, initialValueCreateSchema2, initialValueUpdateSchema2, stateIdParam2, listStatesQuery2, stateNameSchema2, createStateBody2, updateStateBody2, reorderStatesBody2, orgTagIdParam2, listOrgTagsQuery2, createOrgTagBody2, updateOrgTagBody2, orgCredentialIdParam2, listOrgCredentialsQuery2, createOrgCredentialBody2, updateOrgCredentialBody2, orgResourceIdParam2, orgResourceFileIdParam2, orgResourceFolderIdParam2, hubOrgResourceParam2, listOrgResourcesQuery2, orgIdQuery2, createOrgResourceBody2, updateOrgResourceBody2, createOrgResourceFolderBody2, updateOrgResourceFolderBody2, uploadOrgResourceFileBody2, updateOrgResourceFileBody2, uploadOrgSkillZipBody2, linkOrgResourceBody2, resourceIdParam2, listResourcesQuery2, createResourceBody2, updateResourceBody2, syncSkillsBody2, resourceFileIdParam2, listResourceFilesQuery2, createResourceFileBody2, updateResourceFileBody2, uploadResourceFileBody2, uploadSkillZipBody2, resourceFolderIdParam2, listResourceFoldersQuery2, createResourceFolderBody2, updateResourceFolderBody2, agentResourceQuery2, hubResourceQuery2, linkAgentResourceBody2, updateAgentResourceBody2, unlinkAgentResourceQuery2, navItemSchema2, hubCountResetBody2, navItemCountResetBody2, typingBody2, analyticsHubIdParam2, analyticsVariableIdParam2, updateVariablePinBody2, updateAnalyticsViewBody2, NUMERIC_FILTER_OPS2, TEXT_FILTER_OPS2, CATEGORICAL_FILTER_OPS2, VARIABLE_FILTER_OPS2, STRUCTURED_QUERY_OPS2, STRUCTURED_QUERY_AGGREGATIONS2, filterValueSchema2, conversationsBody2, analyticsConversationIdParam2, messagesQuery2, conversationDetailDataQuery2, analyticsDataBody2, structuredQueryBody2, analyticsSqlBody2, analyticsSqlSchemaQuery2, PACING_INTERVAL_MIN_MS2, PACING_INTERVAL_MAX_MS2, EVAL_RUN_DEADLINE_MIN_MS2, EVAL_RUN_DEADLINE_MAX_MS2, paginationSchema22, evalIdParam2, sessionIdParam2, scenarioSetIdParam2, hubIdQuery2, createEvalBody2, updateEvalBody2, getEvalsQuery2, toggleEvalBody2, bulkToggleEvalsBody2, pacingConfigSchema2, sessionConfigSchema2, createSessionBody2, getSessionsQuery2, getSessionResultsQuery2, getSessionRunsQuery2, evalAnalyticsQuery2, getSessionCostQuery2, compareSessionsQuery2, evalsSqlBody2, evalsSqlSchemaQuery2, exportResultsQuery2, validateEvalBody2, hubAgentsQuery2, createScenarioSetBody2, updateScenarioSetBody2, scenarioSetsHubQuery2, createScenarioFromConversationBody2, createJourneyFromConversationBody2, journeyIdParam2, journeyToolCallSchema2, journeyTurnSchema2, journeyStepOverrideSchema2, createJourneyBody2, updateJourneyBody2, getConversationsQuery2, getMessagesQuery2, updateUserBody2, updateProfileBody2, pathnameRegex2, updatePreferencesBody2, registerPushTokenBody2, deletePushTokenQuery2, activityQuery2, deletionModeSchema2, deletionRequestBody2, archiveHubIdParam2, archiveConversationParams2, archiveListQuery2, archiveMessageObservabilityParams2, conversationIdParam2, claimBody2, releaseBody2, transferBody2, closeBody2, additionalContextPayloadSchema2, kanbanUpdateBody2, observabilityParams2, observabilityListParams2, deleteUserConversationsBody2, sendMessageBody2, listConversationsQuery2, getConversationDetailParams2, getConversationDetailQuery2, listWhatsAppTemplatesQuery2, sendWhatsAppTemplateBody2, billingOrgIdParam2, subscriptionItemParams2, spendCapBody2, growthPacksBody2, portalSessionBody2, checkoutSessionBody2, updateBillingCurrencyBody2, invoicesQuery2, downloadBody2, uploadQuery2, signUrlBody2, completionsBody2, outboundSchemaQuery2, templateIdParam2, listTemplatesQuery2, deleteTemplateQuery2, templateStatusQuery2, createTemplateBody2, updateTemplateBody2, submitTemplateBody2, testTemplateBody2, contactIdParam2, listContactsQuery2, createContactBody2, updateContactBody2, listIdParam2, listListsQuery2, listListContactsQuery2, createListBody2, updateListBody2, addListContactsBody2, removeListContactsBody2, scheduleIdParam2, listSchedulesQuery2, listExecutionsQuery2, createScheduleBody2, updateScheduleBody2, uuidPattern2, ciUuidSchema2, hubAsCodeConfigSchema2, ciPullHubIdParam2, ciBranchParam2, ciPullQuery2, ciHubsQuery2, ciLookupQuery2, ciBranchesQuery2, ciSyncBody2, ciPushBody2, ciDiffBody2, ciPublishBody2, ciPublishPreviewBody2, ciSyncMcpBody2, ciOrgResourcesParam2, orgResourcesConfigSchema2, ciOrgResourcesPushBody2, ciOrgResourcesDiffBody2, adminOrgIdParam2, adminOrgAdminIdParam2, adminUserIdParam2, adminPlanIdParam2, adminOrganizationsQuery2, adminUserSearchQuery2, kanbanSlugMigrationQuery2, adjustQuotaBody2, updatePlanBody2, addAdminUserBody2, updatePlatformConfigBody2, updateFreeOrgLimitBody2, updatePricingPlanBody2, dataExplorerSearchQuery2, dataExplorerOrgIdParam2, dataExplorerHubIdParam2, dataExplorerConvIdParam2, dataExplorerDoInstancesQuery2, dataExplorerNsIdParam2, dataExplorerKvKeysQuery2, dataExplorerKvKeyParam2, uuidOrHexId2, dataExplorerDeleteOrgParam2, dataExplorerDeleteHubParam2, dataExplorerDeleteConvParam2, dataExplorerDeleteUserParam2, dataExplorerDeleteQuery2, dataExplorerKvDeleteQuery2, pitrDoNamespace2, pitrBookmarkParam2, pitrRestoreBody2, healthSamplingTriggerBody2, dataExplorerDebugDoType2, DEBUG_READ_MAX_LIMIT2, DEBUG_READ_DEFAULT_LIMIT2, DEBUG_DO_HEX_PREFIX2, debugDoEntityId2, debugTableName2, dataExplorerDebugTablesParam2, dataExplorerDebugRowsParam2, dataExplorerDebugRowsQuery2, dataExplorerDebugAnalyticsTable2, debugUuid2, dataExplorerDebugAnalyticsRowsParam2, dataExplorerDebugAnalyticsRowsQuery2, debugHubConvParam2, debugMessageIdQuery2, whatsappCallbackBody2, authMeResponse2, wsTicketResponse2, sessionCheckResponse2, logoutResponse2, magicCodeSendBody2, magicCodeSendResponse2, magicCodeVerifyBody2, magicCodeVerifyResponse2, browserParams2, browserFoldersQuery2, browserFilesQuery2, stateOperationBody2, conversationListResourcesQuery2, conversationReadResourceQuery2, listPendingSchedulesQuery2, listHubAggregateSchedulesQuery2, reportSourceSchema2, intakeReportSourceSchema2, reportClassificationSchema2, reportStatusSchema2, reportLocaleSchema2, reportMessageAuthorRoleSchema2, sentryRefStatusSchema2, createReportBody2, editReportBody2, contestReportBody2, reporterListQuery2, listReportsQuery2, GITHUB_ISSUE_URL_REGEX2, githubIssueUrlSchema2, transitionReportBody2, groupReportsBody2, holdReportBody2, clickhouseReadyResponse2, bootstrapQuery2, requestSnapshotChunkMessage2, MAX_NAME_LENGTH3, MAX_VALUE_LENGTH2, MAX_TAGS2, MAX_TAG_LENGTH2, MAX_SCOPE_HUBS2, MAX_SCOPE_TAGS2, vaultSecretScopeSchema2, vaultCreateBody2, vaultUpdateBody2, PERMISSIONS2, MAX_NAME_LENGTH22, MAX_HUBS_PER_GRANT2, MAX_HUB_TAGS_PER_GRANT2, MAX_GRANTS2, permissionEnum2, grantScopeSchema2, grantSchema2, createTokenBody2, tokenOrgIdParam2, tokenGrantScopeSchema2, tokenGrantSchema2, tokenMetadataSchema2, listTokensResponse2, createTokenResponse2, orgTokenSummarySchema2, listOrgTokensResponse2, invitePreviewQuery2, invitePreviewResponse2, discordTier2, discordBillingCycle2, discordMetadata2, discordOAuthStartResponse2, discordOAuthFinalizeBody2, discordOAuthFinalizeResponse2, discordDisconnectResponse2, jsonSchemaSchema2, hubUserIdentity2, stateValueEntry2, getHubUserContextResponse2, updateHubUserBody2, updateHubUserResponse2, unlockHubUserNameResponse2, stateResetParams2, stateResetResponse2, hubAlertsParam2, hubAlertSeverity2, hubAlert2, hubAlertsListResponse2, noticeSeveritySchema2, noticeStatusSchema2, NOTICE_SCOPE_REGEX2, noticeScopeSchema2, noticeLinkSchema2, createNoticeBody2, updateNoticeBody2, listNoticesQuery2, noticeIdParamSchema2, templateLocaleSchema2, TEMPLATE_SLUG_REGEX2, templateSlugSchema2, templateStatusSchema2, templateFileMapSchema2, templateTextSchema2, templateRekorPointerSchema2, templateYamlLocaleEntry2, templateYamlWayaiBlock2, templateYamlRekorBlock2, templateYamlSchema2, templateHeroSchema2, templatePushLocaleSchema2, templatePushBody2, templateListQuery2, templateSlugParam2, templateDetailQuery2, ADMIN_SKILL_NAME_REGEX2, adminSkillNameParam2;
13095
13114
  var init_contracts = __esm({
13096
13115
  "../../packages/core/dist/contracts/index.js"() {
13097
13116
  "use strict";
@@ -13232,6 +13251,7 @@ var init_contracts = __esm({
13232
13251
  "summarizer"
13233
13252
  ];
13234
13253
  SAFE_USER_ID_REGEX2 = /^[A-Za-z0-9_-]{1,64}$/;
13254
+ SUPPORTED_LOCALES2 = ["en", "pt", "es"];
13235
13255
  SUMMARIZATION_THRESHOLD_MIN2 = 1e3;
13236
13256
  SUMMARIZATION_THRESHOLD_MAX2 = 1e6;
13237
13257
  summarizationThresholdField2 = external_exports.number().int().min(SUMMARIZATION_THRESHOLD_MIN2).max(SUMMARIZATION_THRESHOLD_MAX2).nullable().optional();
@@ -15357,62 +15377,76 @@ var init_contracts = __esm({
15357
15377
  offset: external_exports.coerce.number().int().min(0).optional()
15358
15378
  });
15359
15379
  noticeIdParamSchema2 = external_exports.object({ id: external_exports.string().min(1) });
15380
+ templateLocaleSchema2 = external_exports.enum(SUPPORTED_LOCALES2);
15360
15381
  TEMPLATE_SLUG_REGEX2 = /^[a-z0-9][a-z0-9-]{0,62}$/;
15361
15382
  templateSlugSchema2 = external_exports.string().regex(TEMPLATE_SLUG_REGEX2, "slug must be lowercase alphanumeric with hyphens (max 63)");
15362
15383
  templateStatusSchema2 = external_exports.enum(["published", "draft", "internal"]);
15363
15384
  templateFileMapSchema2 = external_exports.record(external_exports.string()).refine((m) => Object.keys(m).every(isSafeTemplatePath2), {
15364
15385
  message: 'file map contains an unsafe path (no absolute paths, "..", or backslashes)'
15365
15386
  });
15366
- templateWayaiBlockSchema2 = external_exports.object({
15387
+ templateTextSchema2 = external_exports.object({
15367
15388
  metaTitle: external_exports.string().min(1).max(200),
15368
- metaDescription: external_exports.string().max(1e3).default(""),
15369
- installCommand: external_exports.string().min(1).max(300)
15389
+ metaDescription: external_exports.string().max(1e3).default("")
15370
15390
  });
15371
- templateRekorBlockSchema2 = templateWayaiBlockSchema2.extend({
15391
+ templateRekorPointerSchema2 = external_exports.object({
15372
15392
  mcpEndpoint: external_exports.string().url().optional(),
15373
15393
  url: external_exports.string().url().optional()
15374
15394
  });
15375
- templateYamlWayaiBlock2 = templateWayaiBlockSchema2.extend({
15376
- source: external_exports.string().min(1)
15395
+ templateYamlLocaleEntry2 = templateTextSchema2.extend({ source: external_exports.string().min(1) });
15396
+ templateYamlWayaiBlock2 = external_exports.object({
15397
+ installCommand: external_exports.string().min(1).max(300),
15398
+ locales: external_exports.record(templateLocaleSchema2, templateYamlLocaleEntry2)
15377
15399
  });
15378
- templateYamlRekorBlock2 = templateRekorBlockSchema2.extend({
15379
- source: external_exports.string().min(1)
15400
+ templateYamlRekorBlock2 = templateRekorPointerSchema2.extend({
15401
+ locales: external_exports.record(templateLocaleSchema2, templateYamlLocaleEntry2)
15380
15402
  });
15381
15403
  templateYamlSchema2 = external_exports.object({
15382
15404
  slug: templateSlugSchema2,
15383
15405
  category: external_exports.string().min(1).max(60),
15384
15406
  status: templateStatusSchema2.default("draft"),
15385
15407
  order: external_exports.number().int().min(0).max(1e5).optional(),
15408
+ defaultLocale: templateLocaleSchema2,
15386
15409
  hero: external_exports.string().optional(),
15387
15410
  // relative path to a hero image inside the template folder
15388
15411
  wayai: templateYamlWayaiBlock2.optional(),
15389
15412
  rekor: templateYamlRekorBlock2.optional()
15390
15413
  }).refine((c) => Boolean(c.wayai) || Boolean(c.rekor), {
15391
15414
  message: "template.yaml must define at least one of `wayai:` or `rekor:`"
15392
- });
15393
- templatePushMetadataSchema2 = external_exports.object({
15394
- category: external_exports.string().min(1).max(60),
15395
- status: templateStatusSchema2,
15396
- order: external_exports.number().int().min(0).max(1e5).default(0),
15397
- wayai: templateWayaiBlockSchema2.optional(),
15398
- rekor: templateRekorBlockSchema2.optional()
15415
+ }).refine((c) => !c.wayai || Boolean(c.wayai.locales[c.defaultLocale]), {
15416
+ message: "`wayai.locales` must include the defaultLocale"
15417
+ }).refine((c) => !c.rekor || Boolean(c.rekor.locales[c.defaultLocale]), {
15418
+ message: "`rekor.locales` must include the defaultLocale"
15399
15419
  });
15400
15420
  templateHeroSchema2 = external_exports.object({
15401
15421
  filename: external_exports.string().min(1).max(200).regex(/\.(png|jpe?g|webp|gif)$/i, "hero must be a raster image (png/jpg/webp/gif)"),
15402
- // ~8MB of base64 ≈ a ~6MB image — a generous cap that bounds the inline payload
15403
- // (the endpoint is platform-admin-only, but an unbounded blob is still avoidable).
15404
15422
  dataBase64: external_exports.string().min(1).max(8e6)
15405
15423
  });
15424
+ templatePushLocaleSchema2 = external_exports.object({
15425
+ wayai: templateTextSchema2.optional(),
15426
+ rekorText: templateTextSchema2.optional(),
15427
+ readmeMarkdown: external_exports.string().default(""),
15428
+ wayaiFiles: templateFileMapSchema2.optional()
15429
+ });
15406
15430
  templatePushBody2 = external_exports.object({
15407
15431
  slug: templateSlugSchema2,
15408
- metadata: templatePushMetadataSchema2,
15409
- // wayai slice file-map (path -> body); ABSENT for a Rekor-only template.
15410
- wayaiFiles: templateFileMapSchema2.optional(),
15411
- // raw README markdown; the backend renders + sanitizes (single authority).
15412
- readmeMarkdown: external_exports.string().default(""),
15413
- hero: templateHeroSchema2.optional()
15432
+ defaultLocale: templateLocaleSchema2,
15433
+ common: external_exports.object({
15434
+ category: external_exports.string().min(1).max(60),
15435
+ status: templateStatusSchema2,
15436
+ order: external_exports.number().int().min(0).max(1e5).default(0),
15437
+ // The WayAI install command — present iff the template has a wayai side; a
15438
+ // Rekor-only template omits it.
15439
+ installCommand: external_exports.string().min(1).max(300).optional(),
15440
+ hero: templateHeroSchema2.optional(),
15441
+ rekorPointer: templateRekorPointerSchema2.optional()
15442
+ }),
15443
+ locales: external_exports.record(templateLocaleSchema2, templatePushLocaleSchema2)
15444
+ }).refine((b) => Boolean(b.locales[b.defaultLocale]), {
15445
+ message: "`locales` must include the defaultLocale"
15414
15446
  });
15447
+ templateListQuery2 = external_exports.object({ locale: templateLocaleSchema2.optional() });
15415
15448
  templateSlugParam2 = external_exports.object({ slug: templateSlugSchema2 });
15449
+ templateDetailQuery2 = external_exports.object({ locale: templateLocaleSchema2.optional() });
15416
15450
  ADMIN_SKILL_NAME_REGEX2 = /^[a-z0-9][a-z0-9-]{0,63}$/;
15417
15451
  adminSkillNameParam2 = external_exports.object({
15418
15452
  name: external_exports.string().regex(ADMIN_SKILL_NAME_REGEX2, "invalid skill name")
@@ -16703,9 +16737,32 @@ async function runTemplateList() {
16703
16737
  }
16704
16738
  }
16705
16739
  async function runTemplatePull(rest) {
16706
- const slug = rest[0];
16740
+ const positional = [];
16741
+ let lang;
16742
+ for (let i = 0; i < rest.length; i++) {
16743
+ if (rest[i] === "--lang") {
16744
+ const v = rest[++i];
16745
+ if (!v) {
16746
+ console.error("--lang requires a value");
16747
+ process.exit(1);
16748
+ }
16749
+ const parsed = templateLocaleSchema2.safeParse(v);
16750
+ if (!parsed.success) {
16751
+ console.error(`Invalid --lang "${v}": must be one of ${templateLocaleSchema2.options.join(", ")}.`);
16752
+ process.exit(1);
16753
+ }
16754
+ lang = parsed.data;
16755
+ continue;
16756
+ }
16757
+ if (rest[i].startsWith("--")) {
16758
+ console.error(`Unknown flag: ${rest[i]}`);
16759
+ process.exit(1);
16760
+ }
16761
+ positional.push(rest[i]);
16762
+ }
16763
+ const slug = positional[0];
16707
16764
  if (!slug) {
16708
- console.error("wayai template pull <slug>");
16765
+ console.error("wayai template pull <slug> [--lang <locale>]");
16709
16766
  process.exit(1);
16710
16767
  }
16711
16768
  if (!TEMPLATE_SLUG_REGEX2.test(slug)) {
@@ -16721,13 +16778,16 @@ async function runTemplatePull(rest) {
16721
16778
  const client = new ApiClient({ apiUrl: config.api_url, accessToken });
16722
16779
  let detail;
16723
16780
  try {
16724
- detail = await client.templatePull(slug);
16781
+ detail = await client.templatePull(slug, lang);
16725
16782
  } catch (err) {
16726
16783
  exitOnTemplateApiError(err);
16727
16784
  throw err;
16728
16785
  }
16786
+ if (detail.resolvedLocale !== detail.requestedLocale) {
16787
+ console.log(`Note: "${detail.requestedLocale}" not translated yet \u2014 pulled "${detail.resolvedLocale}" instead.`);
16788
+ }
16729
16789
  if (!detail.includes.wayai) {
16730
- console.log(`Template "${slug}" has no WayAI slice \u2014 run \`rekor template pull ${slug}\` for its data layer.`);
16790
+ console.log(`Template "${slug}" has no WayAI slice \u2014 run \`rekor template pull ${slug}${langFlag(lang)}\` for its data layer.`);
16731
16791
  return;
16732
16792
  }
16733
16793
  const targetDir = path20.join(resolveLayout(gitRoot).hubsDir, slug);
@@ -16736,15 +16796,21 @@ async function runTemplatePull(rest) {
16736
16796
  console.log(`Next: \`wayai push\` to deploy it into your own hub.`);
16737
16797
  if (detail.includes.rekor) {
16738
16798
  console.log(`
16739
- This template includes a Rekor data layer \u2014 run \`rekor template pull ${slug}\` to add it.`);
16799
+ This template includes a Rekor data layer \u2014 run \`rekor template pull ${slug}${langFlag(lang)}\` to add it.`);
16740
16800
  }
16741
16801
  }
16802
+ function langFlag(lang) {
16803
+ return lang ? ` --lang ${lang}` : "";
16804
+ }
16742
16805
  function printTemplateHelp() {
16743
16806
  console.log(`wayai template \u2014 install ready-made hub templates
16744
16807
 
16745
16808
  Usage:
16746
- wayai template list List available templates
16747
- wayai template pull <slug> Write a template's WayAI slice into wayai-ws/hubs/<slug>/
16809
+ wayai template list List available templates
16810
+ wayai template pull <slug> [--lang <l>] Write a template's WayAI slice into wayai-ws/hubs/<slug>/
16811
+
16812
+ --lang selects a localized variant (${templateLocaleSchema2.options.join("|")}); omitted = the template's default
16813
+ language. An untranslated language falls back to the default (with a note).
16748
16814
 
16749
16815
  After pulling, run \`wayai push\` to deploy the template into your own hub.`);
16750
16816
  }
@@ -17224,17 +17290,36 @@ async function runTemplatePush(positional) {
17224
17290
  console.error(`template.yaml slug "${manifest.slug}" does not match folder "${slug}".`);
17225
17291
  process.exit(1);
17226
17292
  }
17227
- let wayaiFiles;
17228
- if (manifest.wayai) {
17229
- const sliceDir = path21.resolve(templateDir, manifest.wayai.source);
17230
- if (!fs17.existsSync(sliceDir)) {
17231
- console.error(`wayai source not found: ${manifest.wayai.source} (resolved ${sliceDir})`);
17232
- process.exit(1);
17293
+ const authoredLocales = /* @__PURE__ */ new Set([
17294
+ ...manifest.wayai ? Object.keys(manifest.wayai.locales) : [],
17295
+ ...manifest.rekor ? Object.keys(manifest.rekor.locales) : []
17296
+ ]);
17297
+ const locales = {};
17298
+ for (const locale of authoredLocales) {
17299
+ const wayaiEntry = manifest.wayai?.locales[locale];
17300
+ const rekorEntry = manifest.rekor?.locales[locale];
17301
+ let wayaiFiles;
17302
+ if (wayaiEntry) {
17303
+ const sliceDir = path21.resolve(templateDir, wayaiEntry.source);
17304
+ if (!fs17.existsSync(sliceDir)) {
17305
+ console.error(`wayai source not found for ${locale}: ${wayaiEntry.source} (resolved ${sliceDir})`);
17306
+ process.exit(1);
17307
+ }
17308
+ wayaiFiles = readDirToFileMap(sliceDir);
17233
17309
  }
17234
- wayaiFiles = readDirToFileMap(sliceDir);
17310
+ const readmePath = path21.join(templateDir, `README.${locale}.md`);
17311
+ const readmeMarkdown = fs17.existsSync(readmePath) ? fs17.readFileSync(readmePath, "utf-8") : "";
17312
+ locales[locale] = {
17313
+ readmeMarkdown,
17314
+ ...wayaiFiles && { wayaiFiles },
17315
+ ...wayaiEntry && {
17316
+ wayai: { metaTitle: wayaiEntry.metaTitle, metaDescription: wayaiEntry.metaDescription }
17317
+ },
17318
+ ...rekorEntry && {
17319
+ rekorText: { metaTitle: rekorEntry.metaTitle, metaDescription: rekorEntry.metaDescription }
17320
+ }
17321
+ };
17235
17322
  }
17236
- const readmePath = path21.join(templateDir, "README.md");
17237
- const readmeMarkdown = fs17.existsSync(readmePath) ? fs17.readFileSync(readmePath, "utf-8") : "";
17238
17323
  let hero;
17239
17324
  if (manifest.hero) {
17240
17325
  const heroPath = path21.resolve(templateDir, manifest.hero);
@@ -17244,27 +17329,27 @@ async function runTemplatePush(positional) {
17244
17329
  console.error(`Warning: hero not found at ${manifest.hero}; skipping.`);
17245
17330
  }
17246
17331
  }
17247
- const metadata = {
17248
- category: manifest.category,
17249
- status: manifest.status,
17250
- order: manifest.order ?? 0,
17251
- ...manifest.wayai && {
17252
- wayai: {
17253
- metaTitle: manifest.wayai.metaTitle,
17254
- metaDescription: manifest.wayai.metaDescription,
17255
- installCommand: manifest.wayai.installCommand
17332
+ const body = {
17333
+ slug,
17334
+ defaultLocale: manifest.defaultLocale,
17335
+ common: {
17336
+ category: manifest.category,
17337
+ status: manifest.status,
17338
+ order: manifest.order ?? 0,
17339
+ // The install command is the wayai one (locale-agnostic). OMIT it for a
17340
+ // Rekor-only template — the contract requires installCommand be non-empty
17341
+ // when present, so sending '' would 400 the whole push.
17342
+ ...manifest.wayai?.installCommand && { installCommand: manifest.wayai.installCommand },
17343
+ ...hero && { hero },
17344
+ ...manifest.rekor && (manifest.rekor.mcpEndpoint || manifest.rekor.url) && {
17345
+ rekorPointer: {
17346
+ ...manifest.rekor.mcpEndpoint && { mcpEndpoint: manifest.rekor.mcpEndpoint },
17347
+ ...manifest.rekor.url && { url: manifest.rekor.url }
17348
+ }
17256
17349
  }
17257
17350
  },
17258
- ...manifest.rekor && {
17259
- rekor: {
17260
- metaTitle: manifest.rekor.metaTitle,
17261
- metaDescription: manifest.rekor.metaDescription,
17262
- installCommand: manifest.rekor.installCommand,
17263
- ...manifest.rekor.mcpEndpoint && { mcpEndpoint: manifest.rekor.mcpEndpoint }
17264
- }
17265
- }
17351
+ locales
17266
17352
  };
17267
- const body = { slug, metadata, wayaiFiles, readmeMarkdown, hero };
17268
17353
  const { config, accessToken } = await requireAuth();
17269
17354
  const client = new ApiClient({ apiUrl: config.api_url, accessToken });
17270
17355
  let result;