@wayai/cli 0.3.62 → 0.3.64

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
@@ -381,6 +381,13 @@ var init_api_client = __esm({
381
381
  const body = opts.mode === "current" ? { hub_id: hubId, user_id: opts.userId, mode: "current", conversation_id: opts.conversationId } : { hub_id: hubId, user_id: opts.userId, mode: "all" };
382
382
  return this.request("POST", "/api/conversations/delete-user-history", body);
383
383
  }
384
+ async annotateConversation(hubId, conversationId, annotation) {
385
+ return this.request(
386
+ "POST",
387
+ `/api/conversations/${conversationId}/annotations`,
388
+ { hub_id: hubId, ...annotation }
389
+ );
390
+ }
384
391
  async getConversations(hubId, opts) {
385
392
  const params = new URLSearchParams({ hub_id: hubId });
386
393
  if (opts?.status) params.set("status", opts.status);
@@ -5248,7 +5255,7 @@ function findStepBoundaries(transcript) {
5248
5255
  }
5249
5256
  return out;
5250
5257
  }
5251
- 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, templateHttpUrl, templateRekorPointerSchema, templateYamlLocaleEntry, templateYamlWayaiBlock, templateYamlRekorBlock, templateTagsSchema, templateYamlSchema, templateHeroSchema, templatePushLocaleSchema, templatePushBody, templateListQuery, templateSlugParam, templateDetailQuery, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, WAYAI_WORKSPACE_LAYOUT, MAX_RESOURCE_FILE_SIZE;
5258
+ 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, variantAiModeSchema, experimentStatusSchema, overlayUpdateSchema, experimentIdParam, variantIdParam, listExperimentsQuery, listVariantsQuery, listOverridesQuery, deleteOverrideQuery, createExperimentBody, updateExperimentBody, setExperimentStatusBody, createVariantBody, updateVariantBody, upsertOverrideBody, 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, annotateConversationBody, 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, templateUsesEntrySchema, templateUsesSchema, templateYamlLocaleEntry, templateYamlWayaiBlock, templateTagsSchema, templateYamlSchema, templateHeroSchema, templatePushLocaleSchema, templatePushBody, templateListQuery, templateSlugParam, templateDetailQuery, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, WAYAI_WORKSPACE_LAYOUT, MAX_RESOURCE_FILE_SIZE;
5252
5259
  var init_dist = __esm({
5253
5260
  "../../packages/core/dist/index.js"() {
5254
5261
  "use strict";
@@ -5298,6 +5305,7 @@ var init_dist = __esm({
5298
5305
  init_zod();
5299
5306
  init_zod();
5300
5307
  init_zod();
5308
+ init_zod();
5301
5309
  APP_ERROR_BRAND = /* @__PURE__ */ Symbol.for("wayai.AppError");
5302
5310
  AppError = class extends Error {
5303
5311
  constructor(message, code, statusCode = 500, details) {
@@ -5746,6 +5754,9 @@ var init_dist = __esm({
5746
5754
  // summarization_threshold_tokens relocated to the summarizer AGENT (PR4) — validated/
5747
5755
  // persisted via the agent path (.passthrough() agent body → HubDO column), not here.
5748
5756
  auto_close_inactive_days: external_exports.number().int().min(1).max(180).optional(),
5757
+ // Per-hub ConversationDO retention window (days) — keeps an ended conversation's DO
5758
+ // alive for post-hoc annotation. Default 7, max 30 (= ENDED_INDEX_RETENTION_DAYS).
5759
+ conversation_retention_days: external_exports.number().int().min(1).max(30).optional(),
5749
5760
  // Channel contact access control. Enum-validated explicitly (not via passthrough)
5750
5761
  // so `language`/`access_approval_role` can't reach the DB with an invalid value.
5751
5762
  language: external_exports.enum(["en", "pt", "es"]).optional(),
@@ -5929,6 +5940,70 @@ var init_dist = __esm({
5929
5940
  display_order: external_exports.number().int().nonnegative()
5930
5941
  })).min(1)
5931
5942
  });
5943
+ variantAiModeSchema = external_exports.enum(["pilot+copilot", "pilot", "copilot", "turned_off"]);
5944
+ experimentStatusSchema = external_exports.enum(["draft", "running", "stopped"]);
5945
+ overlayUpdateSchema = external_exports.record(external_exports.unknown()).nullish().transform((v) => v === void 0 ? void 0 : v && Object.keys(v).length > 0 ? v : null);
5946
+ experimentIdParam = external_exports.object({
5947
+ id: external_exports.string().uuid()
5948
+ });
5949
+ variantIdParam = external_exports.object({
5950
+ id: external_exports.string().uuid()
5951
+ });
5952
+ listExperimentsQuery = external_exports.object({
5953
+ hub_id: external_exports.string().uuid()
5954
+ });
5955
+ listVariantsQuery = external_exports.object({
5956
+ hub_id: external_exports.string().uuid(),
5957
+ experiment_id: external_exports.string().uuid().optional()
5958
+ });
5959
+ listOverridesQuery = external_exports.object({
5960
+ hub_id: external_exports.string().uuid(),
5961
+ variant_id: external_exports.string().uuid()
5962
+ });
5963
+ deleteOverrideQuery = external_exports.object({
5964
+ hub_id: external_exports.string().uuid(),
5965
+ variant_id: external_exports.string().uuid(),
5966
+ agent_id: external_exports.string().uuid()
5967
+ });
5968
+ createExperimentBody = external_exports.object({
5969
+ hub_id: external_exports.string().uuid(),
5970
+ experiment_slug: slugSchema.optional(),
5971
+ experiment_name: external_exports.string().min(1, "experiment_name is required").max(100, "experiment_name must be 100 characters or fewer"),
5972
+ primary_metric: external_exports.string().max(200).nullish(),
5973
+ status: experimentStatusSchema.default("draft")
5974
+ });
5975
+ updateExperimentBody = external_exports.object({
5976
+ // experiment_slug is immutable after first persist — not accepted here.
5977
+ experiment_name: external_exports.string().min(1).max(100).optional(),
5978
+ primary_metric: external_exports.string().max(200).nullish(),
5979
+ control_variant_id: external_exports.string().uuid().nullish()
5980
+ });
5981
+ setExperimentStatusBody = external_exports.object({
5982
+ status: experimentStatusSchema
5983
+ });
5984
+ createVariantBody = external_exports.object({
5985
+ hub_id: external_exports.string().uuid(),
5986
+ experiment_id: external_exports.string().uuid(),
5987
+ label: external_exports.string().min(1, "label is required").max(100, "label must be 100 characters or fewer"),
5988
+ weight: external_exports.number().positive().default(1),
5989
+ ai_mode: variantAiModeSchema.nullish(),
5990
+ is_control: external_exports.boolean().default(false)
5991
+ });
5992
+ updateVariantBody = external_exports.object({
5993
+ label: external_exports.string().min(1).max(100).optional(),
5994
+ weight: external_exports.number().positive().optional(),
5995
+ ai_mode: variantAiModeSchema.nullish(),
5996
+ is_control: external_exports.boolean().optional()
5997
+ });
5998
+ upsertOverrideBody = external_exports.object({
5999
+ hub_id: external_exports.string().uuid(),
6000
+ variant_id: external_exports.string().uuid(),
6001
+ agent_id: external_exports.string().uuid(),
6002
+ instructions: external_exports.string().nullish(),
6003
+ additional_context_template: external_exports.string().nullish(),
6004
+ connection_id: external_exports.string().uuid().nullish(),
6005
+ agent_settings_overlay: overlayUpdateSchema
6006
+ });
5932
6007
  orgTagIdParam = external_exports.object({
5933
6008
  id: external_exports.string().uuid()
5934
6009
  });
@@ -6297,7 +6372,7 @@ var init_dist = __esm({
6297
6372
  selected_variables: external_exports.array(external_exports.string()),
6298
6373
  include_summary: external_exports.boolean().optional(),
6299
6374
  include_variables: external_exports.boolean().optional(),
6300
- variable_origin: external_exports.enum(["agent", "system"]).optional(),
6375
+ variable_origin: external_exports.enum(["agent", "system", "annotation"]).optional(),
6301
6376
  variable_category: external_exports.string().optional(),
6302
6377
  variables_only: external_exports.boolean().optional()
6303
6378
  });
@@ -6684,6 +6759,15 @@ var init_dist = __esm({
6684
6759
  additional_context: additionalContextPayloadSchema.optional(),
6685
6760
  event_description: external_exports.string().optional()
6686
6761
  });
6762
+ annotateConversationBody = external_exports.object({
6763
+ hub_id: external_exports.string().uuid(),
6764
+ key: external_exports.string().regex(
6765
+ AGENT_PARAMETER_NAME_REGEX,
6766
+ "key must be a valid identifier (letter/underscore start; letters, digits, underscore; max 64 chars)"
6767
+ ),
6768
+ value: external_exports.union([external_exports.string().max(1024), external_exports.number(), external_exports.boolean()]),
6769
+ type: external_exports.enum(["numeric", "categorical", "text"]).default("categorical")
6770
+ });
6687
6771
  observabilityParams = external_exports.object({
6688
6772
  conversationId: external_exports.string().uuid(),
6689
6773
  messageId: external_exports.string().uuid()
@@ -7610,19 +7694,16 @@ var init_dist = __esm({
7610
7694
  metaTitle: external_exports.string().min(1).max(200),
7611
7695
  metaDescription: external_exports.string().max(1e3).default("")
7612
7696
  });
7613
- templateHttpUrl = external_exports.string().url().refine((u) => /^https?:\/\//i.test(u), { message: "must be an http(s) URL" });
7614
- templateRekorPointerSchema = external_exports.object({
7615
- mcpEndpoint: templateHttpUrl.optional(),
7616
- url: templateHttpUrl.optional()
7697
+ templateUsesEntrySchema = external_exports.object({
7698
+ backend: templateSlugSchema,
7699
+ endpoint: templateSlugSchema
7617
7700
  });
7701
+ templateUsesSchema = external_exports.array(templateUsesEntrySchema).max(24).default([]);
7618
7702
  templateYamlLocaleEntry = templateTextSchema.extend({ source: external_exports.string().min(1) });
7619
7703
  templateYamlWayaiBlock = external_exports.object({
7620
7704
  installCommand: external_exports.string().min(1).max(300),
7621
7705
  locales: external_exports.record(templateLocaleSchema, templateYamlLocaleEntry)
7622
7706
  });
7623
- templateYamlRekorBlock = templateRekorPointerSchema.extend({
7624
- locales: external_exports.record(templateLocaleSchema, templateYamlLocaleEntry)
7625
- });
7626
7707
  templateTagsSchema = external_exports.array(external_exports.string().min(1).max(30)).max(12).default([]).transform((tags) => [...new Set(tags.map((t) => t.trim().toLowerCase()).filter(Boolean))]);
7627
7708
  templateYamlSchema = external_exports.object({
7628
7709
  slug: templateSlugSchema,
@@ -7633,21 +7714,14 @@ var init_dist = __esm({
7633
7714
  defaultLocale: templateLocaleSchema,
7634
7715
  hero: external_exports.string().optional(),
7635
7716
  // relative path to a hero image inside the template folder
7636
- // The Rekor MCP Factory endpoint this template stands up (locale-agnostic).
7637
- // Authored at the TOP LEVEL so one shared `template.yaml` satisfies both
7638
- // `wayai admin template push` (here) and `rekor admin template push` (which reads
7639
- // it flat). Mirrored onto the wire as `common.rekorPointer.mcpEndpoint`. The
7640
- // deprecated `rekor.mcpEndpoint` nesting is still honored as a fallback always
7641
- // read via `resolveTemplateMcpEndpoint`, never one location directly.
7642
- mcpEndpoint: templateHttpUrl.optional(),
7643
- wayai: templateYamlWayaiBlock.optional(),
7644
- rekor: templateYamlRekorBlock.optional()
7645
- }).refine((c) => Boolean(c.wayai) || Boolean(c.rekor), {
7646
- message: "template.yaml must define at least one of `wayai:` or `rekor:`"
7647
- }).refine((c) => !c.wayai || Boolean(c.wayai.locales[c.defaultLocale]), {
7717
+ // The Rekor backend(s) this channel runs on (gh #2955). Locale-agnostic. The
7718
+ // cross-link + MCP endpoint are derived from each entry's slugs, never authored.
7719
+ uses: templateUsesSchema,
7720
+ // A WayAI template IS a WayAI channel — the wayai slice is required. (The old
7721
+ // Rekor-only store entry is gone: a pure Rekor backend lives only in Rekor's store.)
7722
+ wayai: templateYamlWayaiBlock
7723
+ }).refine((c) => Boolean(c.wayai.locales[c.defaultLocale]), {
7648
7724
  message: "`wayai.locales` must include the defaultLocale"
7649
- }).refine((c) => !c.rekor || Boolean(c.rekor.locales[c.defaultLocale]), {
7650
- message: "`rekor.locales` must include the defaultLocale"
7651
7725
  });
7652
7726
  templateHeroSchema = external_exports.object({
7653
7727
  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)"),
@@ -7655,7 +7729,6 @@ var init_dist = __esm({
7655
7729
  });
7656
7730
  templatePushLocaleSchema = external_exports.object({
7657
7731
  wayai: templateTextSchema.optional(),
7658
- rekorText: templateTextSchema.optional(),
7659
7732
  readmeMarkdown: external_exports.string().default(""),
7660
7733
  wayaiFiles: templateFileMapSchema.optional()
7661
7734
  });
@@ -7667,11 +7740,12 @@ var init_dist = __esm({
7667
7740
  tags: templateTagsSchema,
7668
7741
  status: templateStatusSchema,
7669
7742
  order: external_exports.number().int().min(0).max(1e5).default(0),
7670
- // The WayAI install command present iff the template has a wayai side; a
7671
- // Rekor-only template omits it.
7743
+ // The WayAI install command (a WayAI template always has a wayai side). Kept
7744
+ // optional on the wire so a malformed manifest 400s on the field, not the body.
7672
7745
  installCommand: external_exports.string().min(1).max(300).optional(),
7673
7746
  hero: templateHeroSchema.optional(),
7674
- rekorPointer: templateRekorPointerSchema.optional()
7747
+ // The channel→backend edge (gh #2955), locale-agnostic.
7748
+ uses: templateUsesSchema
7675
7749
  }),
7676
7750
  locales: external_exports.record(templateLocaleSchema, templatePushLocaleSchema)
7677
7751
  }).refine((b) => Boolean(b.locales[b.defaultLocale]), {
@@ -7772,7 +7846,7 @@ var init_layout = __esm({
7772
7846
  ...WAYAI_WORKSPACE_LAYOUT,
7773
7847
  legacy: { wsDir: "workspace", orgAtRoot: "org" }
7774
7848
  };
7775
- TEMPLATES_AUTHORING_SUBDIR = "templates";
7849
+ TEMPLATES_AUTHORING_SUBDIR = "wayai-templates";
7776
7850
  _layoutWarned = false;
7777
7851
  }
7778
7852
  });
@@ -11440,6 +11514,11 @@ Usage:
11440
11514
  wayai conversations <conversation_id> Show detail + messages
11441
11515
  wayai conversations <conversation_id> observability List the LLM turns (per-message id, latency, tool_calls)
11442
11516
  wayai conversations <conversation_id> observability --message-id <id>
11517
+ wayai conversations <conversation_id> annotate --set key=value [--type numeric|categorical|text]
11518
+ Set a post-hoc business outcome (e.g. customer_purchased=true)
11519
+ on an ended conversation, as an analytics dimension. Repeat
11520
+ --set for multiple keys. Needs the hub kept within its
11521
+ conversation retention window.
11443
11522
  Full record for one turn:
11444
11523
  resolved system prompt, the exact
11445
11524
  messages the model saw (rendered
@@ -11476,6 +11555,8 @@ async function conversationsCommand(args2) {
11476
11555
  let from;
11477
11556
  let to;
11478
11557
  let jsonOutput = false;
11558
+ const annotations = [];
11559
+ let annotationType;
11479
11560
  for (let i = 0; i < args2.length; i++) {
11480
11561
  const arg = args2[i];
11481
11562
  if (arg === "--status") {
@@ -11514,6 +11595,26 @@ async function conversationsCommand(args2) {
11514
11595
  process.exit(1);
11515
11596
  }
11516
11597
  to = args2[++i];
11598
+ } else if (arg === "--set") {
11599
+ if (i + 1 >= args2.length) {
11600
+ console.error("--set requires key=value");
11601
+ process.exit(1);
11602
+ }
11603
+ const pair = args2[++i];
11604
+ const eq = pair.indexOf("=");
11605
+ if (eq <= 0) {
11606
+ console.error(`--set must be key=value (got: ${pair})`);
11607
+ process.exit(1);
11608
+ }
11609
+ annotations.push({ key: pair.slice(0, eq), value: pair.slice(eq + 1) });
11610
+ } else if (arg === "--type") {
11611
+ const val = args2[++i];
11612
+ if (val === "numeric" || val === "categorical" || val === "text") {
11613
+ annotationType = val;
11614
+ } else {
11615
+ console.error(`Invalid --type: ${val}. Must be 'numeric', 'categorical', or 'text'.`);
11616
+ process.exit(1);
11617
+ }
11517
11618
  } else if (arg === "--json") {
11518
11619
  jsonOutput = true;
11519
11620
  } else if (!arg.startsWith("-")) {
@@ -11551,6 +11652,29 @@ async function conversationsCommand(args2) {
11551
11652
  }
11552
11653
  return;
11553
11654
  }
11655
+ if (subcommand === "annotate") {
11656
+ if (!conversationId) {
11657
+ console.error("Usage: wayai conversations <conversation_id> annotate --set key=value [--type numeric|categorical|text]");
11658
+ process.exit(1);
11659
+ }
11660
+ if (annotations.length === 0) {
11661
+ console.error("annotate requires at least one --set key=value");
11662
+ process.exit(1);
11663
+ }
11664
+ const results = [];
11665
+ for (const { key, value } of annotations) {
11666
+ const inferred = value.trim() !== "" && Number.isFinite(Number(value)) ? "numeric" : "categorical";
11667
+ const type = annotationType ?? inferred;
11668
+ await client.annotateConversation(hubId, conversationId, { key, value, type });
11669
+ results.push({ key, type });
11670
+ }
11671
+ if (jsonOutput) {
11672
+ console.log(JSON.stringify({ conversation_id: conversationId, annotations: results }, null, 2));
11673
+ } else {
11674
+ for (const r of results) console.log(`\u2713 Set annotation ${r.key} (${r.type})`);
11675
+ }
11676
+ return;
11677
+ }
11554
11678
  if (subcommand) {
11555
11679
  console.error(`Unknown conversations subcommand: ${subcommand}`);
11556
11680
  process.exit(1);
@@ -13154,10 +13278,10 @@ function isSafeTemplatePath2(path22) {
13154
13278
  (seg) => seg.length > 0 && seg !== "." && seg !== ".." && /^[A-Za-z0-9._-]+$/.test(seg)
13155
13279
  );
13156
13280
  }
13157
- function resolveTemplateMcpEndpoint(manifest) {
13158
- return manifest.mcpEndpoint ?? manifest.rekor?.mcpEndpoint;
13281
+ function distinctUsesBackends(uses) {
13282
+ return [...new Set((uses ?? []).map((u) => u.backend))];
13159
13283
  }
13160
- 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, templateHttpUrl2, templateRekorPointerSchema2, templateYamlLocaleEntry2, templateYamlWayaiBlock2, templateYamlRekorBlock2, templateTagsSchema2, templateYamlSchema2, templateHeroSchema2, templatePushLocaleSchema2, templatePushBody2, templateListQuery2, templateSlugParam2, templateDetailQuery2, ADMIN_SKILL_NAME_REGEX2, adminSkillNameParam2;
13284
+ 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, variantAiModeSchema2, experimentStatusSchema2, overlayUpdateSchema2, experimentIdParam2, variantIdParam2, listExperimentsQuery2, listVariantsQuery2, listOverridesQuery2, deleteOverrideQuery2, createExperimentBody2, updateExperimentBody2, setExperimentStatusBody2, createVariantBody2, updateVariantBody2, upsertOverrideBody2, 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, annotateConversationBody2, 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, templateUsesEntrySchema2, templateUsesSchema2, templateYamlLocaleEntry2, templateYamlWayaiBlock2, templateTagsSchema2, templateYamlSchema2, templateHeroSchema2, templatePushLocaleSchema2, templatePushBody2, templateListQuery2, templateSlugParam2, templateDetailQuery2, ADMIN_SKILL_NAME_REGEX2, adminSkillNameParam2;
13161
13285
  var init_contracts = __esm({
13162
13286
  "../../packages/core/dist/contracts/index.js"() {
13163
13287
  "use strict";
@@ -13207,6 +13331,7 @@ var init_contracts = __esm({
13207
13331
  init_zod();
13208
13332
  init_zod();
13209
13333
  init_zod();
13334
+ init_zod();
13210
13335
  uuidSchema2 = external_exports.string().uuid();
13211
13336
  paginationSchema3 = external_exports.object({
13212
13337
  limit: external_exports.coerce.number().int().min(1).max(100).default(50),
@@ -13571,6 +13696,9 @@ var init_contracts = __esm({
13571
13696
  // summarization_threshold_tokens relocated to the summarizer AGENT (PR4) — validated/
13572
13697
  // persisted via the agent path (.passthrough() agent body → HubDO column), not here.
13573
13698
  auto_close_inactive_days: external_exports.number().int().min(1).max(180).optional(),
13699
+ // Per-hub ConversationDO retention window (days) — keeps an ended conversation's DO
13700
+ // alive for post-hoc annotation. Default 7, max 30 (= ENDED_INDEX_RETENTION_DAYS).
13701
+ conversation_retention_days: external_exports.number().int().min(1).max(30).optional(),
13574
13702
  // Channel contact access control. Enum-validated explicitly (not via passthrough)
13575
13703
  // so `language`/`access_approval_role` can't reach the DB with an invalid value.
13576
13704
  language: external_exports.enum(["en", "pt", "es"]).optional(),
@@ -13754,6 +13882,70 @@ var init_contracts = __esm({
13754
13882
  display_order: external_exports.number().int().nonnegative()
13755
13883
  })).min(1)
13756
13884
  });
13885
+ variantAiModeSchema2 = external_exports.enum(["pilot+copilot", "pilot", "copilot", "turned_off"]);
13886
+ experimentStatusSchema2 = external_exports.enum(["draft", "running", "stopped"]);
13887
+ overlayUpdateSchema2 = external_exports.record(external_exports.unknown()).nullish().transform((v) => v === void 0 ? void 0 : v && Object.keys(v).length > 0 ? v : null);
13888
+ experimentIdParam2 = external_exports.object({
13889
+ id: external_exports.string().uuid()
13890
+ });
13891
+ variantIdParam2 = external_exports.object({
13892
+ id: external_exports.string().uuid()
13893
+ });
13894
+ listExperimentsQuery2 = external_exports.object({
13895
+ hub_id: external_exports.string().uuid()
13896
+ });
13897
+ listVariantsQuery2 = external_exports.object({
13898
+ hub_id: external_exports.string().uuid(),
13899
+ experiment_id: external_exports.string().uuid().optional()
13900
+ });
13901
+ listOverridesQuery2 = external_exports.object({
13902
+ hub_id: external_exports.string().uuid(),
13903
+ variant_id: external_exports.string().uuid()
13904
+ });
13905
+ deleteOverrideQuery2 = external_exports.object({
13906
+ hub_id: external_exports.string().uuid(),
13907
+ variant_id: external_exports.string().uuid(),
13908
+ agent_id: external_exports.string().uuid()
13909
+ });
13910
+ createExperimentBody2 = external_exports.object({
13911
+ hub_id: external_exports.string().uuid(),
13912
+ experiment_slug: slugSchema2.optional(),
13913
+ experiment_name: external_exports.string().min(1, "experiment_name is required").max(100, "experiment_name must be 100 characters or fewer"),
13914
+ primary_metric: external_exports.string().max(200).nullish(),
13915
+ status: experimentStatusSchema2.default("draft")
13916
+ });
13917
+ updateExperimentBody2 = external_exports.object({
13918
+ // experiment_slug is immutable after first persist — not accepted here.
13919
+ experiment_name: external_exports.string().min(1).max(100).optional(),
13920
+ primary_metric: external_exports.string().max(200).nullish(),
13921
+ control_variant_id: external_exports.string().uuid().nullish()
13922
+ });
13923
+ setExperimentStatusBody2 = external_exports.object({
13924
+ status: experimentStatusSchema2
13925
+ });
13926
+ createVariantBody2 = external_exports.object({
13927
+ hub_id: external_exports.string().uuid(),
13928
+ experiment_id: external_exports.string().uuid(),
13929
+ label: external_exports.string().min(1, "label is required").max(100, "label must be 100 characters or fewer"),
13930
+ weight: external_exports.number().positive().default(1),
13931
+ ai_mode: variantAiModeSchema2.nullish(),
13932
+ is_control: external_exports.boolean().default(false)
13933
+ });
13934
+ updateVariantBody2 = external_exports.object({
13935
+ label: external_exports.string().min(1).max(100).optional(),
13936
+ weight: external_exports.number().positive().optional(),
13937
+ ai_mode: variantAiModeSchema2.nullish(),
13938
+ is_control: external_exports.boolean().optional()
13939
+ });
13940
+ upsertOverrideBody2 = external_exports.object({
13941
+ hub_id: external_exports.string().uuid(),
13942
+ variant_id: external_exports.string().uuid(),
13943
+ agent_id: external_exports.string().uuid(),
13944
+ instructions: external_exports.string().nullish(),
13945
+ additional_context_template: external_exports.string().nullish(),
13946
+ connection_id: external_exports.string().uuid().nullish(),
13947
+ agent_settings_overlay: overlayUpdateSchema2
13948
+ });
13757
13949
  orgTagIdParam2 = external_exports.object({
13758
13950
  id: external_exports.string().uuid()
13759
13951
  });
@@ -14122,7 +14314,7 @@ var init_contracts = __esm({
14122
14314
  selected_variables: external_exports.array(external_exports.string()),
14123
14315
  include_summary: external_exports.boolean().optional(),
14124
14316
  include_variables: external_exports.boolean().optional(),
14125
- variable_origin: external_exports.enum(["agent", "system"]).optional(),
14317
+ variable_origin: external_exports.enum(["agent", "system", "annotation"]).optional(),
14126
14318
  variable_category: external_exports.string().optional(),
14127
14319
  variables_only: external_exports.boolean().optional()
14128
14320
  });
@@ -14509,6 +14701,15 @@ var init_contracts = __esm({
14509
14701
  additional_context: additionalContextPayloadSchema2.optional(),
14510
14702
  event_description: external_exports.string().optional()
14511
14703
  });
14704
+ annotateConversationBody2 = external_exports.object({
14705
+ hub_id: external_exports.string().uuid(),
14706
+ key: external_exports.string().regex(
14707
+ AGENT_PARAMETER_NAME_REGEX2,
14708
+ "key must be a valid identifier (letter/underscore start; letters, digits, underscore; max 64 chars)"
14709
+ ),
14710
+ value: external_exports.union([external_exports.string().max(1024), external_exports.number(), external_exports.boolean()]),
14711
+ type: external_exports.enum(["numeric", "categorical", "text"]).default("categorical")
14712
+ });
14512
14713
  observabilityParams2 = external_exports.object({
14513
14714
  conversationId: external_exports.string().uuid(),
14514
14715
  messageId: external_exports.string().uuid()
@@ -15435,19 +15636,16 @@ var init_contracts = __esm({
15435
15636
  metaTitle: external_exports.string().min(1).max(200),
15436
15637
  metaDescription: external_exports.string().max(1e3).default("")
15437
15638
  });
15438
- templateHttpUrl2 = external_exports.string().url().refine((u) => /^https?:\/\//i.test(u), { message: "must be an http(s) URL" });
15439
- templateRekorPointerSchema2 = external_exports.object({
15440
- mcpEndpoint: templateHttpUrl2.optional(),
15441
- url: templateHttpUrl2.optional()
15639
+ templateUsesEntrySchema2 = external_exports.object({
15640
+ backend: templateSlugSchema2,
15641
+ endpoint: templateSlugSchema2
15442
15642
  });
15643
+ templateUsesSchema2 = external_exports.array(templateUsesEntrySchema2).max(24).default([]);
15443
15644
  templateYamlLocaleEntry2 = templateTextSchema2.extend({ source: external_exports.string().min(1) });
15444
15645
  templateYamlWayaiBlock2 = external_exports.object({
15445
15646
  installCommand: external_exports.string().min(1).max(300),
15446
15647
  locales: external_exports.record(templateLocaleSchema2, templateYamlLocaleEntry2)
15447
15648
  });
15448
- templateYamlRekorBlock2 = templateRekorPointerSchema2.extend({
15449
- locales: external_exports.record(templateLocaleSchema2, templateYamlLocaleEntry2)
15450
- });
15451
15649
  templateTagsSchema2 = external_exports.array(external_exports.string().min(1).max(30)).max(12).default([]).transform((tags) => [...new Set(tags.map((t) => t.trim().toLowerCase()).filter(Boolean))]);
15452
15650
  templateYamlSchema2 = external_exports.object({
15453
15651
  slug: templateSlugSchema2,
@@ -15458,21 +15656,14 @@ var init_contracts = __esm({
15458
15656
  defaultLocale: templateLocaleSchema2,
15459
15657
  hero: external_exports.string().optional(),
15460
15658
  // relative path to a hero image inside the template folder
15461
- // The Rekor MCP Factory endpoint this template stands up (locale-agnostic).
15462
- // Authored at the TOP LEVEL so one shared `template.yaml` satisfies both
15463
- // `wayai admin template push` (here) and `rekor admin template push` (which reads
15464
- // it flat). Mirrored onto the wire as `common.rekorPointer.mcpEndpoint`. The
15465
- // deprecated `rekor.mcpEndpoint` nesting is still honored as a fallback always
15466
- // read via `resolveTemplateMcpEndpoint`, never one location directly.
15467
- mcpEndpoint: templateHttpUrl2.optional(),
15468
- wayai: templateYamlWayaiBlock2.optional(),
15469
- rekor: templateYamlRekorBlock2.optional()
15470
- }).refine((c) => Boolean(c.wayai) || Boolean(c.rekor), {
15471
- message: "template.yaml must define at least one of `wayai:` or `rekor:`"
15472
- }).refine((c) => !c.wayai || Boolean(c.wayai.locales[c.defaultLocale]), {
15659
+ // The Rekor backend(s) this channel runs on (gh #2955). Locale-agnostic. The
15660
+ // cross-link + MCP endpoint are derived from each entry's slugs, never authored.
15661
+ uses: templateUsesSchema2,
15662
+ // A WayAI template IS a WayAI channel — the wayai slice is required. (The old
15663
+ // Rekor-only store entry is gone: a pure Rekor backend lives only in Rekor's store.)
15664
+ wayai: templateYamlWayaiBlock2
15665
+ }).refine((c) => Boolean(c.wayai.locales[c.defaultLocale]), {
15473
15666
  message: "`wayai.locales` must include the defaultLocale"
15474
- }).refine((c) => !c.rekor || Boolean(c.rekor.locales[c.defaultLocale]), {
15475
- message: "`rekor.locales` must include the defaultLocale"
15476
15667
  });
15477
15668
  templateHeroSchema2 = external_exports.object({
15478
15669
  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)"),
@@ -15480,7 +15671,6 @@ var init_contracts = __esm({
15480
15671
  });
15481
15672
  templatePushLocaleSchema2 = external_exports.object({
15482
15673
  wayai: templateTextSchema2.optional(),
15483
- rekorText: templateTextSchema2.optional(),
15484
15674
  readmeMarkdown: external_exports.string().default(""),
15485
15675
  wayaiFiles: templateFileMapSchema2.optional()
15486
15676
  });
@@ -15492,11 +15682,12 @@ var init_contracts = __esm({
15492
15682
  tags: templateTagsSchema2,
15493
15683
  status: templateStatusSchema2,
15494
15684
  order: external_exports.number().int().min(0).max(1e5).default(0),
15495
- // The WayAI install command present iff the template has a wayai side; a
15496
- // Rekor-only template omits it.
15685
+ // The WayAI install command (a WayAI template always has a wayai side). Kept
15686
+ // optional on the wire so a malformed manifest 400s on the field, not the body.
15497
15687
  installCommand: external_exports.string().min(1).max(300).optional(),
15498
15688
  hero: templateHeroSchema2.optional(),
15499
- rekorPointer: templateRekorPointerSchema2.optional()
15689
+ // The channel→backend edge (gh #2955), locale-agnostic.
15690
+ uses: templateUsesSchema2
15500
15691
  }),
15501
15692
  locales: external_exports.record(templateLocaleSchema2, templatePushLocaleSchema2)
15502
15693
  }).refine((b) => Boolean(b.locales[b.defaultLocale]), {
@@ -16776,10 +16967,10 @@ async function templateCommand(args2) {
16776
16967
  process.exit(1);
16777
16968
  }
16778
16969
  }
16779
- function includesLabel(includes) {
16970
+ function includesLabel(item) {
16780
16971
  const parts = [];
16781
- if (includes.wayai) parts.push("wayai agent");
16782
- if (includes.rekor) parts.push("rekor data layer");
16972
+ if (item.includes.wayai) parts.push("wayai agent");
16973
+ if (item.uses?.length) parts.push("rekor backend");
16783
16974
  return parts.length ? parts.join(" + ") : "(none)";
16784
16975
  }
16785
16976
  async function runTemplateList() {
@@ -16801,7 +16992,7 @@ async function runTemplateList() {
16801
16992
  const catWidth = Math.max(8, ...templates.map((t) => t.category.length));
16802
16993
  console.log(`${"SLUG".padEnd(slugWidth)} ${"CATEGORY".padEnd(catWidth)} INCLUDES`);
16803
16994
  for (const t of templates) {
16804
- console.log(`${t.slug.padEnd(slugWidth)} ${t.category.padEnd(catWidth)} ${includesLabel(t.includes)}`);
16995
+ console.log(`${t.slug.padEnd(slugWidth)} ${t.category.padEnd(catWidth)} ${includesLabel(t)}`);
16805
16996
  }
16806
16997
  }
16807
16998
  async function runTemplatePull(rest) {
@@ -16865,7 +17056,9 @@ async function runTemplatePull(rest) {
16865
17056
  console.log(`Note: "${detail.requestedLocale}" not translated yet \u2014 pulled "${detail.resolvedLocale}" instead.`);
16866
17057
  }
16867
17058
  if (!detail.includes.wayai) {
16868
- console.log(`Template "${slug}" has no WayAI slice \u2014 run \`rekor template pull ${slug}${langFlag(lang)}\` for its data layer.`);
17059
+ const backends2 = distinctUsesBackends(detail.uses);
17060
+ const hint = backends2.length ? ` \u2014 run ${backends2.map((b) => `\`rekor template pull ${b}${langFlag(lang)}\``).join(" and ")} for its data layer.` : ".";
17061
+ console.log(`Template "${slug}" has no WayAI slice${hint}`);
16869
17062
  return;
16870
17063
  }
16871
17064
  const targetDir = path20.join(resolveLayout(gitRoot).hubsDir, slug);
@@ -16895,9 +17088,13 @@ Commit or move your changes and re-run with --force to overwrite, or pull into a
16895
17088
  const written = writeFileMap(targetDir, detail.files);
16896
17089
  console.log(`Pulled template "${slug}" \u2192 ${relTarget}/ (${written.length} file${written.length === 1 ? "" : "s"}).`);
16897
17090
  console.log(`Next: \`wayai push\` to deploy it into your own hub.`);
16898
- if (detail.includes.rekor) {
17091
+ const backends = distinctUsesBackends(detail.uses);
17092
+ if (backends.length) {
17093
+ const cmds = backends.map((b) => `\`rekor template pull ${b}${langFlag(lang)}\``).join(" and ");
17094
+ const noun = backends.length === 1 ? "a Rekor backend" : "Rekor backends";
17095
+ const obj = backends.length === 1 ? "it" : "them";
16899
17096
  console.log(`
16900
- This template includes a Rekor data layer \u2014 run \`rekor template pull ${slug}${langFlag(lang)}\` to add it.`);
17097
+ This channel runs on ${noun} \u2014 run ${cmds} to add ${obj}.`);
16901
17098
  }
16902
17099
  }
16903
17100
  function langFlag(lang) {
@@ -16988,32 +17185,21 @@ var init_report_edit_args = __esm({
16988
17185
 
16989
17186
  // src/lib/template-manifest.ts
16990
17187
  function buildTemplatePushCommon(manifest, hero) {
16991
- const mcpEndpoint = resolveTemplateMcpEndpoint(manifest);
16992
17188
  return {
16993
17189
  category: manifest.category,
16994
17190
  tags: manifest.tags,
16995
17191
  status: manifest.status,
16996
17192
  order: manifest.order ?? 0,
16997
- // The install command is the wayai one (locale-agnostic). OMIT it for a Rekor-only
16998
- // template — the contract requires installCommand be non-empty when present, so
16999
- // sending '' would 400 the whole push.
17000
- ...manifest.wayai?.installCommand && { installCommand: manifest.wayai.installCommand },
17193
+ installCommand: manifest.wayai.installCommand,
17001
17194
  ...hero && { hero },
17002
- // The rekor pointer carries the (locale-agnostic) mcpEndpoint + cross-link url. Only
17003
- // emitted alongside a `rekor:` block the store gates the endpoint behind per-locale
17004
- // rekorText, so a block-less endpoint would be dead data (the command warns on it).
17005
- ...manifest.rekor && (mcpEndpoint || manifest.rekor.url) && {
17006
- rekorPointer: {
17007
- ...mcpEndpoint && { mcpEndpoint },
17008
- ...manifest.rekor.url && { url: manifest.rekor.url }
17009
- }
17010
- }
17195
+ // The channel→backend edge (locale-agnostic). The store persists it verbatim; the
17196
+ // website derives the "runs on backend X" cross-link + MCP endpoint from the slugs.
17197
+ uses: manifest.uses
17011
17198
  };
17012
17199
  }
17013
17200
  var init_template_manifest = __esm({
17014
17201
  "src/lib/template-manifest.ts"() {
17015
17202
  "use strict";
17016
- init_contracts();
17017
17203
  }
17018
17204
  });
17019
17205
 
@@ -17425,14 +17611,12 @@ async function runTemplatePush(positional) {
17425
17611
  console.error(`template.yaml slug "${manifest.slug}" does not match folder "${slug}".`);
17426
17612
  process.exit(1);
17427
17613
  }
17428
- const authoredLocales = /* @__PURE__ */ new Set([
17429
- ...manifest.wayai ? Object.keys(manifest.wayai.locales) : [],
17430
- ...manifest.rekor ? Object.keys(manifest.rekor.locales) : []
17431
- ]);
17614
+ const authoredLocales = new Set(
17615
+ Object.keys(manifest.wayai.locales)
17616
+ );
17432
17617
  const locales = {};
17433
17618
  for (const locale of authoredLocales) {
17434
- const wayaiEntry = manifest.wayai?.locales[locale];
17435
- const rekorEntry = manifest.rekor?.locales[locale];
17619
+ const wayaiEntry = manifest.wayai.locales[locale];
17436
17620
  let wayaiFiles;
17437
17621
  if (wayaiEntry) {
17438
17622
  const sliceDir = path21.resolve(templateDir, wayaiEntry.source);
@@ -17449,9 +17633,6 @@ async function runTemplatePush(positional) {
17449
17633
  ...wayaiFiles && { wayaiFiles },
17450
17634
  ...wayaiEntry && {
17451
17635
  wayai: { metaTitle: wayaiEntry.metaTitle, metaDescription: wayaiEntry.metaDescription }
17452
- },
17453
- ...rekorEntry && {
17454
- rekorText: { metaTitle: rekorEntry.metaTitle, metaDescription: rekorEntry.metaDescription }
17455
17636
  }
17456
17637
  };
17457
17638
  }
@@ -17464,12 +17645,6 @@ async function runTemplatePush(positional) {
17464
17645
  console.error(`Warning: hero not found at ${manifest.hero}; skipping.`);
17465
17646
  }
17466
17647
  }
17467
- const mcpEndpoint = resolveTemplateMcpEndpoint(manifest);
17468
- if (mcpEndpoint && !manifest.rekor) {
17469
- console.error(
17470
- "Warning: `mcpEndpoint` is set but there is no `rekor:` block to attach it to \u2014 it will be ignored. Add a `rekor:` block (the cross-link to the paired template) or remove `mcpEndpoint`."
17471
- );
17472
- }
17473
17648
  const body = {
17474
17649
  slug,
17475
17650
  defaultLocale: manifest.defaultLocale,
@@ -17534,7 +17709,9 @@ async function runTemplatePull2(positional, flagArgs) {
17534
17709
  const target = outDir ? path21.resolve(outDir) : path21.join(process.cwd(), "template-store-pull", slug);
17535
17710
  const written = writeFileMap(target, detail.files);
17536
17711
  console.log(`Pulled "${slug}" from the store \u2192 ${target} (${written.length} file${written.length === 1 ? "" : "s"}).`);
17537
- console.log(`includes: wayai=${detail.includes.wayai} rekor=${detail.includes.rekor}`);
17712
+ const uses = detail.uses ?? [];
17713
+ const usesLabel = uses.length ? uses.map((u) => `${u.backend}/${u.endpoint}`).join(", ") : "(none)";
17714
+ console.log(`includes: wayai=${detail.includes.wayai} | uses: ${usesLabel}`);
17538
17715
  }
17539
17716
  async function runSkillInstall(positional) {
17540
17717
  const name = positional[0] ?? "wayai-admin";
@@ -17974,7 +18151,7 @@ Usage:
17974
18151
  wayai admin notice list [--status active|resolved] [--limit N] [--offset N] [--json]
17975
18152
  wayai admin notice resolve <notice_id>
17976
18153
 
17977
- wayai admin template push <slug> Publish a template from tutorials/templates/<slug>/ into the store
18154
+ wayai admin template push <slug> Publish a template from wayai-templates/<slug>/ into the store
17978
18155
  wayai admin template pull <slug> [--out DIR] [--json] Pull a published template from the store for inspection
17979
18156
 
17980
18157
  wayai admin skill install [name] Install a private operator skill (default: wayai-admin) into each present harness's skills/ dir