@hotmeshio/long-tail 0.23.2 → 0.24.1
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/build/adapters/express.d.ts +11 -1
- package/build/adapters/express.js +42 -41
- package/build/api/auth-sso.d.ts +1 -1
- package/build/api/bot-accounts.d.ts +2 -0
- package/build/api/bot-accounts.js +4 -0
- package/build/api/capabilities.d.ts +7 -2
- package/build/api/capabilities.js +13 -2
- package/build/api/escalations/analytics.js +5 -0
- package/build/api/escalations/bulk.d.ts +2 -0
- package/build/api/escalations/bulk.js +9 -4
- package/build/api/escalations/helpers.d.ts +5 -0
- package/build/api/escalations/helpers.js +7 -0
- package/build/api/escalations/metadata.js +3 -0
- package/build/api/escalations/single.d.ts +3 -2
- package/build/api/escalations/single.js +8 -3
- package/build/api/mcp/tools.d.ts +12 -0
- package/build/api/mcp/tools.js +113 -9
- package/build/api/scan-codes/choice.js +31 -7
- package/build/api/settings.js +9 -0
- package/build/api/tasks.d.ts +3 -3
- package/build/api/tasks.js +30 -7
- package/build/api/workflows/input-lookups.js +1 -1
- package/build/api/workflows/invocable.js +2 -2
- package/build/api/workflows/invocation.js +1 -1
- package/build/api/yaml-workflows/cron.d.ts +3 -2
- package/build/api/yaml-workflows/cron.js +6 -1
- package/build/api/yaml-workflows/deploy.d.ts +15 -2
- package/build/api/yaml-workflows/deploy.js +69 -2
- package/build/lib/db/schemas/038_oauth_server.sql +46 -0
- package/build/lib/db/schemas/039_nats_ws_tickets.sql +12 -0
- package/build/lib/events/browser-view.d.ts +20 -0
- package/build/lib/events/browser-view.js +117 -0
- package/build/lib/events/nats-ws-filter.d.ts +29 -0
- package/build/lib/events/nats-ws-filter.js +109 -0
- package/build/lib/events/nats-ws-proxy.d.ts +7 -0
- package/build/lib/events/nats-ws-proxy.js +86 -7
- package/build/lib/events/nats-ws-server-filter.d.ts +16 -0
- package/build/lib/events/nats-ws-server-filter.js +56 -0
- package/build/lib/events/nats-ws-ticket.d.ts +19 -0
- package/build/lib/events/nats-ws-ticket.js +63 -0
- package/build/lib/events/socketio.d.ts +10 -1
- package/build/lib/events/socketio.js +10 -3
- package/build/lib/http/index.d.ts +27 -0
- package/build/lib/http/index.js +55 -0
- package/build/modules/auth.d.ts +15 -24
- package/build/modules/auth.js +43 -126
- package/build/modules/capabilities.d.ts +62 -0
- package/build/modules/capabilities.js +188 -0
- package/build/modules/config.d.ts +19 -0
- package/build/modules/config.js +27 -0
- package/build/modules/defaults.d.ts +10 -0
- package/build/modules/defaults.js +12 -1
- package/build/modules/maintenance.d.ts +2 -0
- package/build/modules/maintenance.js +7 -0
- package/build/modules/mcp-auth.d.ts +11 -0
- package/build/modules/mcp-auth.js +56 -0
- package/build/modules/oauth-server.d.ts +18 -0
- package/build/modules/oauth-server.js +40 -0
- package/build/routes/agents.js +47 -14
- package/build/routes/announcements.js +2 -2
- package/build/routes/auth-sso.js +2 -2
- package/build/routes/auth.js +2 -2
- package/build/routes/bot-accounts.js +26 -3
- package/build/routes/capabilities.js +4 -4
- package/build/routes/controlplane.js +2 -2
- package/build/routes/dba.js +2 -2
- package/build/routes/delegation.js +2 -2
- package/build/routes/diagnostics.js +2 -2
- package/build/routes/docs.js +2 -2
- package/build/routes/domain.js +2 -2
- package/build/routes/escalations/accumulate.d.ts +1 -1
- package/build/routes/escalations/acting.d.ts +1 -1
- package/build/routes/escalations/analytics.d.ts +1 -1
- package/build/routes/escalations/bulk.d.ts +1 -1
- package/build/routes/escalations/facets.d.ts +1 -1
- package/build/routes/escalations/index.js +2 -2
- package/build/routes/escalations/list.d.ts +1 -1
- package/build/routes/escalations/metadata.d.ts +1 -1
- package/build/routes/escalations/related.d.ts +1 -1
- package/build/routes/escalations/resolve.d.ts +1 -1
- package/build/routes/escalations/single.d.ts +1 -1
- package/build/routes/escalations/single.js +1 -1
- package/build/routes/exports.js +14 -13
- package/build/routes/file-browser.js +9 -8
- package/build/routes/files.js +2 -2
- package/build/routes/index.js +4 -2
- package/build/routes/insight.js +5 -4
- package/build/routes/knowledge.js +2 -2
- package/build/routes/maintenance.js +2 -2
- package/build/routes/mcp-endpoint.d.ts +3 -1
- package/build/routes/mcp-endpoint.js +18 -8
- package/build/routes/mcp.js +35 -15
- package/build/routes/me.js +2 -2
- package/build/routes/namespaces.js +4 -3
- package/build/routes/nats-credentials.js +27 -3
- package/build/routes/oauth-server/authorize.d.ts +2 -0
- package/build/routes/oauth-server/authorize.js +110 -0
- package/build/routes/oauth-server/grants.d.ts +2 -0
- package/build/routes/oauth-server/grants.js +35 -0
- package/build/routes/oauth-server/index.d.ts +8 -0
- package/build/routes/oauth-server/index.js +52 -0
- package/build/routes/oauth-server/registration.d.ts +2 -0
- package/build/routes/oauth-server/registration.js +38 -0
- package/build/routes/oauth-server/token.d.ts +2 -0
- package/build/routes/oauth-server/token.js +100 -0
- package/build/routes/oauth-well-known.d.ts +8 -0
- package/build/routes/oauth-well-known.js +31 -0
- package/build/routes/oauth.js +2 -2
- package/build/routes/overview.js +2 -2
- package/build/routes/personas.js +2 -2
- package/build/routes/pipelines.js +6 -5
- package/build/routes/roles.js +2 -2
- package/build/routes/scan-codes.js +2 -2
- package/build/routes/settings.js +2 -2
- package/build/routes/tasks.js +5 -5
- package/build/routes/topics.js +21 -9
- package/build/routes/users.js +25 -22
- package/build/routes/workflow-sets.js +13 -12
- package/build/routes/workflows/config.js +15 -2
- package/build/routes/workflows/discovery.js +2 -2
- package/build/routes/workflows/index.js +2 -2
- package/build/routes/workflows/invocation.js +11 -10
- package/build/routes/yaml-workflows/cron.js +20 -7
- package/build/routes/yaml-workflows/crud.js +13 -12
- package/build/routes/yaml-workflows/deployment.js +11 -10
- package/build/routes/yaml-workflows/index.js +2 -2
- package/build/routes/yaml-workflows/versions.js +2 -2
- package/build/services/agent/authority.d.ts +15 -0
- package/build/services/agent/authority.js +59 -0
- package/build/services/agent/trigger-registry.js +7 -2
- package/build/services/auth/bot-api-key.d.ts +2 -0
- package/build/services/auth/bot-api-key.js +10 -0
- package/build/services/auth/oauth-server/access-token.d.ts +36 -0
- package/build/services/auth/oauth-server/access-token.js +80 -0
- package/build/services/auth/oauth-server/authorization.d.ts +47 -0
- package/build/services/auth/oauth-server/authorization.js +54 -0
- package/build/services/auth/oauth-server/constants.d.ts +11 -0
- package/build/services/auth/oauth-server/constants.js +16 -0
- package/build/services/auth/oauth-server/index.d.ts +3 -0
- package/build/services/auth/oauth-server/index.js +27 -0
- package/build/services/auth/oauth-server/metadata.d.ts +21 -0
- package/build/services/auth/oauth-server/metadata.js +53 -0
- package/build/services/auth/oauth-server/registration.d.ts +42 -0
- package/build/services/auth/oauth-server/registration.js +134 -0
- package/build/services/auth/oauth-server/sql.d.ts +50 -0
- package/build/services/auth/oauth-server/sql.js +156 -0
- package/build/services/auth/oauth-server/store.d.ts +88 -0
- package/build/services/auth/oauth-server/store.js +171 -0
- package/build/services/auth/sql.d.ts +1 -0
- package/build/services/auth/sql.js +3 -1
- package/build/services/cron/index.js +5 -3
- package/build/services/escalation/queries.js +7 -2
- package/build/services/export/index.d.ts +10 -0
- package/build/services/export/index.js +27 -0
- package/build/services/invocation-access.d.ts +25 -4
- package/build/services/invocation-access.js +39 -7
- package/build/services/maintenance/index.js +8 -0
- package/build/services/mcp/client/connection-dispatch.d.ts +6 -1
- package/build/services/mcp/client/connection-dispatch.js +3 -2
- package/build/services/mcp/client/connection-lifecycle.d.ts +10 -2
- package/build/services/mcp/client/connection-lifecycle.js +45 -7
- package/build/services/mcp/client/connection-test.js +2 -6
- package/build/services/mcp/client/connection.d.ts +1 -1
- package/build/services/mcp/client/connection.js +3 -1
- package/build/services/mcp/client/index.d.ts +2 -2
- package/build/services/mcp/client/index.js +4 -1
- package/build/services/mcp/client/network-transport.d.ts +12 -0
- package/build/services/mcp/client/network-transport.js +20 -0
- package/build/services/mcp/client/tools.d.ts +13 -0
- package/build/services/mcp/client/tools.js +18 -0
- package/build/services/mcp/db-server/index.js +2 -1
- package/build/services/mcp/external-server.d.ts +9 -4
- package/build/services/mcp/external-server.js +34 -11
- package/build/services/mcp/playwright-server/index.js +2 -1
- package/build/services/mcp/registered-tools.d.ts +3 -0
- package/build/services/mcp/registered-tools.js +7 -0
- package/build/services/mcp/seed-service-account.d.ts +4 -1
- package/build/services/mcp/seed-service-account.js +11 -6
- package/build/services/mcp/server-lifecycle.js +2 -1
- package/build/services/workflow-invocation.d.ts +16 -3
- package/build/services/workflow-invocation.js +42 -10
- package/build/services/yaml-workflow/deployer.d.ts +10 -2
- package/build/services/yaml-workflow/deployer.js +17 -5
- package/build/services/yaml-workflow/invoke.js +31 -26
- package/build/services/yaml-workflow/workers/register.js +3 -13
- package/build/services/yaml-workflow/workers/step-tool.d.ts +7 -0
- package/build/services/yaml-workflow/workers/step-tool.js +69 -0
- package/build/start/config.js +7 -0
- package/build/start/index.js +4 -22
- package/build/start/server.d.ts +6 -4
- package/build/start/server.js +11 -35
- package/build/start/socket-auth.js +2 -1
- package/build/start/workers.js +1 -1
- package/build/system/mcp-servers/admin/agent-subscriptions.js +25 -1
- package/build/system/mcp-servers/admin/agents.js +25 -2
- package/build/system/mcp-servers/admin/announcements.js +3 -2
- package/build/system/mcp-servers/admin/bot-accounts.js +37 -5
- package/build/system/mcp-servers/admin/escalations.d.ts +3 -5
- package/build/system/mcp-servers/admin/escalations.js +74 -70
- package/build/system/mcp-servers/admin/exports.js +7 -1
- package/build/system/mcp-servers/admin/index.js +24 -25
- package/build/system/mcp-servers/admin/overview.d.ts +2 -2
- package/build/system/mcp-servers/admin/run-read.d.ts +2 -0
- package/build/system/mcp-servers/admin/run-read.js +5 -0
- package/build/system/mcp-servers/admin/scan-codes.d.ts +2 -2
- package/build/system/mcp-servers/admin/scan-codes.js +5 -11
- package/build/system/mcp-servers/admin/schemas.d.ts +26 -26
- package/build/system/mcp-servers/admin/tasks.js +7 -2
- package/build/system/mcp-servers/admin/users.js +31 -4
- package/build/system/mcp-servers/admin/workflow-config.js +12 -1
- package/build/system/mcp-servers/admin/workflows.js +27 -5
- package/build/system/mcp-servers/admin/yaml-workflows.js +13 -21
- package/build/system/mcp-servers/caller-auth.d.ts +18 -0
- package/build/system/mcp-servers/caller-auth.js +29 -0
- package/build/system/mcp-servers/claude-code.js +2 -1
- package/build/system/mcp-servers/db-query/index.js +2 -1
- package/build/system/mcp-servers/file-storage.js +2 -1
- package/build/system/mcp-servers/http-fetch.js +2 -1
- package/build/system/mcp-servers/human-queue.js +7 -3
- package/build/system/mcp-servers/oauth.js +31 -4
- package/build/system/mcp-servers/schema-exchange.js +2 -1
- package/build/system/mcp-servers/vision.d.ts +1 -0
- package/build/system/mcp-servers/vision.js +17 -7
- package/build/system/mcp-servers/workflow.js +13 -25
- package/build/system/seed/tool-manifests-admin.d.ts +2 -17985
- package/build/system/seed/tool-manifests-admin.js +121 -121
- package/build/system/seed/tool-manifests-data.d.ts +8 -374
- package/build/system/seed/tool-manifests-data.js +22 -4
- package/build/system/seed/tool-manifests-escalation.d.ts +2 -352
- package/build/system/seed/tool-manifests-escalation.js +11 -1
- package/build/system/seed/tool-manifests-events.d.ts +2 -116
- package/build/system/seed/tool-manifests-events.js +6 -2
- package/build/system/seed/tool-manifests-knowledge.d.ts +2 -221
- package/build/system/seed/tool-manifests-knowledge.js +41 -1
- package/build/system/seed/tool-manifests-workflows.d.ts +2 -71
- package/build/system/seed/tool-manifests-workflows.js +3 -1
- package/build/system/workflows/shared/principal-tools.d.ts +20 -0
- package/build/system/workflows/shared/principal-tools.js +64 -0
- package/build/system/workflows/shared/tool-executor.js +21 -11
- package/build/system/workflows/shared/tool-loader.js +8 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/auth.d.ts +1 -1
- package/build/types/capability.d.ts +14 -0
- package/build/types/capability.js +2 -0
- package/build/types/events.d.ts +1 -1
- package/build/types/index.d.ts +3 -1
- package/build/types/maintenance.d.ts +2 -2
- package/build/types/mcp.d.ts +3 -1
- package/build/types/oauth-server.d.ts +52 -0
- package/build/types/oauth-server.js +2 -0
- package/build/types/startup.d.ts +15 -7
- package/build/vitest.config.js +2 -1
- package/build/vitest.fast.config.d.ts +2 -0
- package/build/vitest.fast.config.js +20 -0
- package/build/vitest.llm.config.d.ts +2 -0
- package/build/vitest.llm.config.js +16 -0
- package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js → AdminDashboard-B3mkMIOT.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BPWsgMfZ.js.map → AdminDashboard-B3mkMIOT.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js → AgentConfigPage-CQj2B678.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-De9imyo5.js.map → AgentConfigPage-CQj2B678.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js → AgentDetailPage-CzrD8JJI.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-B6o96Y5G.js.map → AgentDetailPage-CzrD8JJI.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js → AgentsPage-jg2OFwyW.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DMEmiK_W.js.map → AgentsPage-jg2OFwyW.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js → AvailableEscalationsPage-IS28XBRe.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DeYMngwE.js.map → AvailableEscalationsPage-IS28XBRe.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js → BotPicker-DvEJFpwS.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DDmpgGHZ.js.map → BotPicker-DvEJFpwS.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js → BulkAssignModal-BoQCi-YC.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BqlklomG.js.map → BulkAssignModal-BoQCi-YC.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js → CapabilitiesPage-kwlrcb_t.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DOtjDTbK.js.map → CapabilitiesPage-kwlrcb_t.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js → CollapsibleSection-UMIV4KIj.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CLr8LP0V.js.map → CollapsibleSection-UMIV4KIj.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js +2 -0
- package/dashboard/dist/assets/ConfirmDeleteModal-C5puwMg7.js.map +1 -0
- package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js +2 -0
- package/dashboard/dist/assets/ConnectedAppsPage-drZa65kP.js.map +1 -0
- package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js → CountdownTimer-LG03dVgR.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-DxX72PwV.js.map → CountdownTimer-LG03dVgR.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js → CredentialsPage-CaFQ6vLb.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CObc9Rs5.js.map → CredentialsPage-CaFQ6vLb.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js → CronLabel-Co5j7tzW.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Bb8GoNY5.js.map → CronLabel-Co5j7tzW.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js → ElapsedCell-WJyE9G0T.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CmGhVlYl.js.map → ElapsedCell-WJyE9G0T.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js → EntityTimelinePanel-CDFFfX9d.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-B4Jwy1w3.js.map → EntityTimelinePanel-CDFFfX9d.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js → EscalationListSchemaPage-CMrUlaKI.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-CZZbZ4Aa.js.map → EscalationListSchemaPage-CMrUlaKI.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js → EscalationSchemaPage-Dx2Lyfrz.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-D0ko59_S.js.map → EscalationSchemaPage-Dx2Lyfrz.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js → EscalationTimeline-d3nvshOk.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-BcnJEKFD.js.map → EscalationTimeline-d3nvshOk.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js → EscalationTitleSelect-DWQieOM9.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-P0q5sck4.js.map → EscalationTitleSelect-DWQieOM9.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js → EscalationsOverview-BX8Cpi0X.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BLPmh4AF.js.map → EscalationsOverview-BX8Cpi0X.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-gBzi5tIS.js → EventTable-D1-ITVXS.js} +2 -2
- package/dashboard/dist/assets/{EventTable-gBzi5tIS.js.map → EventTable-D1-ITVXS.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BulSsWb2.js → FilterBar-ABC9ctin.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BulSsWb2.js.map → FilterBar-ABC9ctin.js.map} +1 -1
- package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js → FormattedValue-k27T4bG7.js} +2 -2
- package/dashboard/dist/assets/{FormattedValue-BMHRrvrL.js.map → FormattedValue-k27T4bG7.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js → GraphInvokePage-DKUErxWc.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage--997yNRr.js.map → GraphInvokePage-DKUErxWc.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CwXFz--v.js → HomePage-C6u9dIpR.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CwXFz--v.js.map → HomePage-C6u9dIpR.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js → ListToolbar-gA5rFzkz.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Df4qZryJ.js.map → ListToolbar-gA5rFzkz.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js → McpOverview-BOPo3J_i.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DrogIAKJ.js.map → McpOverview-BOPo3J_i.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js → McpQueryDetailPage-BRVVi0Zh.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CJmvCAE6.js.map → McpQueryDetailPage-BRVVi0Zh.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js → McpQueryPage-Dmbb6SAc.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-lygo4Yq0.js.map → McpQueryPage-Dmbb6SAc.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js → McpRunDetailPage-bMXNO-6V.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-hvns2sCm.js.map → McpRunDetailPage-bMXNO-6V.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js → McpRunsPage-Bi9AMWja.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-C2_7spTX.js.map → McpRunsPage-Bi9AMWja.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js → OperationsPage-CvR74ZUJ.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BlK8WlsY.js.map → OperationsPage-CvR74ZUJ.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js → OperatorDashboard-DctmZw10.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-BeWBiMGX.js.map → OperatorDashboard-DctmZw10.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js → PersonaDetailPage-Ubqm2rQH.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CNHpsX_i.js.map → PersonaDetailPage-Ubqm2rQH.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js → PersonasPage-BpFL2rpo.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-ChASEZRg.js.map → PersonasPage-BpFL2rpo.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js → PortalPage-Dfc_Q02R.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-D5Lk-PKF.js.map → PortalPage-Dfc_Q02R.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-liJspvQh.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DNgCIwRl.js.map → ProcessDetailPage-liJspvQh.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js → ProcessesListPage-C3OM5ZUy.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-pRjWuWlH.js.map → ProcessesListPage-C3OM5ZUy.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +8 -0
- package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js → RoleDetailPage-CrlYCh-R.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-Bh_UcfYY.js.map → RoleDetailPage-CrlYCh-R.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CK17N7zz.js → RolesPage-BaazL_pt.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CK17N7zz.js.map → RolesPage-BaazL_pt.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js → RunAsSelector-DxuV0fa1.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BEKUP0p2.js.map → RunAsSelector-DxuV0fa1.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js → ScanCodesPage-C0mvmYTq.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-Bd0Pflqx.js.map → ScanCodesPage-C0mvmYTq.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js → ScanSchemeDetailPage-CiJgt5dZ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CnuhozmJ.js.map → ScanSchemeDetailPage-CiJgt5dZ.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js → ScanStationPage-DzGaXc40.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-CoLc-q3h.js.map → ScanStationPage-DzGaXc40.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js → StickyPagination-CqbjVY6T.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-COrfvkBi.js.map → StickyPagination-CqbjVY6T.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js → StreamMessageDetail-wX3i0aqs.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-Cif2egLy.js.map → StreamMessageDetail-wX3i0aqs.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js → SwimlaneTimeline-C50PsFoV.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BnZYTrAh.js.map → SwimlaneTimeline-C50PsFoV.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js → TaskDetailPage-bbNSv4Ae.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DEz_dqyR.js.map → TaskDetailPage-bbNSv4Ae.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js → TasksListPage-CDWnm_d9.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-oEfEGj0_.js.map → TasksListPage-CDWnm_d9.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js → TimeAgo-BLjqlfoX.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Dz5TgZZZ.js.map → TimeAgo-BLjqlfoX.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BUTgE244.js → TimestampCell-CnW0ENb5.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BUTgE244.js.map → TimestampCell-CnW0ENb5.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js → ToolTestPanel-DkMgCB-k.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BS4g6vt-.js.map → ToolTestPanel-DkMgCB-k.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js → TopicDetailPage-g3pljKKX.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-C_I6JIVD.js.map → TopicDetailPage-g3pljKKX.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js → TopicsPage-CVcCYdy-.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Cr6-wfhJ.js.map → TopicsPage-CVcCYdy-.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-ZFpWMaFF.js → UserName-D6zGIK2i.js} +2 -2
- package/dashboard/dist/assets/{UserName-ZFpWMaFF.js.map → UserName-D6zGIK2i.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js → WorkflowExecutionPage-B8g81FCJ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-ByPixDZW.js.map → WorkflowExecutionPage-B8g81FCJ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js → WorkflowsDashboard-nxT3bv6W.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-CWsJdMdR.js.map → WorkflowsDashboard-nxT3bv6W.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js → WorkflowsOverview-grI-KAI2.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Dk9gyqZN.js.map → WorkflowsOverview-grI-KAI2.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js → YamlWorkflowDetailPage-BoZ-hfBE.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CHwcrsaT.js.map → YamlWorkflowDetailPage-BoZ-hfBE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js → YamlWorkflowsPage-Bf04rwRv.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-B5jRX2Ph.js.map → YamlWorkflowsPage-Bf04rwRv.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dd7E-27d.js → agents-Dphpdi8l.js} +2 -2
- package/dashboard/dist/assets/{agents-Dd7E-27d.js.map → agents-Dphpdi8l.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CpaYjZTk.js → bots-DIFE298x.js} +2 -2
- package/dashboard/dist/assets/{bots-CpaYjZTk.js.map → bots-DIFE298x.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CNjg_qv1.js → capabilities-D7Y7LClY.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CNjg_qv1.js.map → capabilities-D7Y7LClY.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DgmvnAtU.js → controlplane-D1TGcYsS.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DgmvnAtU.js.map → controlplane-D1TGcYsS.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js → escalation-columns-cwZE6xyo.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Uj4U9g5H.js.map → escalation-columns-cwZE6xyo.js.map} +1 -1
- package/dashboard/dist/assets/{index-x5z73M9N.js → index-BzYcUPdD.js} +2 -2
- package/dashboard/dist/assets/{index-x5z73M9N.js.map → index-BzYcUPdD.js.map} +1 -1
- package/dashboard/dist/assets/index-CeCtqujG.js +67 -0
- package/dashboard/dist/assets/index-CeCtqujG.js.map +1 -0
- package/dashboard/dist/assets/{index-RIFT3RlO.js → index-ChV7pBjM.js} +2 -2
- package/dashboard/dist/assets/{index-RIFT3RlO.js.map → index-ChV7pBjM.js.map} +1 -1
- package/dashboard/dist/assets/{index-OfO0173w.js → index-CniRa65p.js} +2 -2
- package/dashboard/dist/assets/{index-OfO0173w.js.map → index-CniRa65p.js.map} +1 -1
- package/dashboard/dist/assets/{index-ByBy9M3L.js → index-CxdjT1Yk.js} +2 -2
- package/dashboard/dist/assets/{index-ByBy9M3L.js.map → index-CxdjT1Yk.js.map} +1 -1
- package/dashboard/dist/assets/{index-C_K7OlzT.js → index-DAvi5_2T.js} +2 -2
- package/dashboard/dist/assets/{index-C_K7OlzT.js.map → index-DAvi5_2T.js.map} +1 -1
- package/dashboard/dist/assets/{index-BrwqtXRh.js → index-DN-kX7hL.js} +2 -2
- package/dashboard/dist/assets/{index-BrwqtXRh.js.map → index-DN-kX7hL.js.map} +1 -1
- package/dashboard/dist/assets/index-Dl_8hbYI.js +2 -0
- package/dashboard/dist/assets/index-Dl_8hbYI.js.map +1 -0
- package/dashboard/dist/assets/{index-D4Dlznn9.js → index-DpKOr311.js} +2 -2
- package/dashboard/dist/assets/{index-D4Dlznn9.js.map → index-DpKOr311.js.map} +1 -1
- package/dashboard/dist/assets/{index-CnOvJz6U.js → index-Dy1wWu2e.js} +2 -2
- package/dashboard/dist/assets/{index-CnOvJz6U.js.map → index-Dy1wWu2e.js.map} +1 -1
- package/dashboard/dist/assets/{index-BT1Ms5Q5.js → index-HLu98Sqh.js} +2 -2
- package/dashboard/dist/assets/{index-BT1Ms5Q5.js.map → index-HLu98Sqh.js.map} +1 -1
- package/dashboard/dist/assets/{index-BFASQ7_X.js → index-ag2pCAPu.js} +2 -2
- package/dashboard/dist/assets/{index-BFASQ7_X.js.map → index-ag2pCAPu.js.map} +1 -1
- package/dashboard/dist/assets/{index-BsHVgWH6.js → index-gkxPN7Vx.js} +2 -2
- package/dashboard/dist/assets/{index-BsHVgWH6.js.map → index-gkxPN7Vx.js.map} +1 -1
- package/dashboard/dist/assets/index-m9A3UYst.css +1 -0
- package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js → knowledge-DnMs-SOJ.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Cci_r6Kl.js.map → knowledge-DnMs-SOJ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-NY4iL0L-.js → mcp-CwW-K3r4.js} +2 -2
- package/dashboard/dist/assets/{mcp-NY4iL0L-.js.map → mcp-CwW-K3r4.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js → mcp-query-BZt5e8_Q.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CbvZo_I_.js.map → mcp-query-BZt5e8_Q.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Fy-f7QQd.js → personas-UA-Xn60f.js} +2 -2
- package/dashboard/dist/assets/{personas-Fy-f7QQd.js.map → personas-UA-Xn60f.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DKiuozxV.js → pipelines-Cu3PARum.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DKiuozxV.js.map → pipelines-Cu3PARum.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CdM1Rkk9.js → tasks-BO6h8GJE.js} +2 -2
- package/dashboard/dist/assets/{tasks-CdM1Rkk9.js.map → tasks-BO6h8GJE.js.map} +1 -1
- package/dashboard/dist/assets/{topics-XNy2mf3n.js → topics-CWjCR-17.js} +2 -2
- package/dashboard/dist/assets/{topics-XNy2mf3n.js.map → topics-CWjCR-17.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js → useDebouncedValue-6t0jx1RB.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-CyGcU3_S.js.map → useDebouncedValue-6t0jx1RB.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js → useNamespace-CqpoQx6D.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-C2RIh_IN.js.map → useNamespace-CqpoQx6D.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js → useYamlActivityEvents-hmCQQwzB.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CDiV5fjf.js.map → useYamlActivityEvents-hmCQQwzB.js.map} +1 -1
- package/dashboard/dist/assets/{validate-DcGWN82Y.js → validate-BIRn4a6d.js} +2 -2
- package/dashboard/dist/assets/{validate-DcGWN82Y.js.map → validate-BIRn4a6d.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js → yaml-workflows-ziUdZhKY.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CH8UrouH.js.map → yaml-workflows-ziUdZhKY.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/agents.md +3 -1
- package/docs/api/http/agents.md +15 -1
- package/docs/api/http/escalations.md +3 -3
- package/docs/api/http/exports.md +3 -1
- package/docs/api/http/file-browser.md +3 -1
- package/docs/api/http/mcp-endpoint.md +8 -5
- package/docs/api/http/mcp-servers.md +34 -4
- package/docs/api/http/namespaces.md +2 -0
- package/docs/api/http/pipelines.md +2 -0
- package/docs/api/http/roles.md +11 -8
- package/docs/api/http/service-accounts.md +8 -2
- package/docs/api/http/settings.md +29 -2
- package/docs/api/http/tasks.md +3 -1
- package/docs/api/http/topics.md +7 -1
- package/docs/api/http/users.md +8 -2
- package/docs/api/http/workflows.md +25 -10
- package/docs/api/http/yaml-workflows.md +21 -0
- package/docs/api/mcp/admin.md +409 -49
- package/docs/api/mcp/file-storage.md +4 -0
- package/docs/api/mcp/http-fetch.md +6 -2
- package/docs/api/mcp/human-queue.md +53 -0
- package/docs/api/mcp/index.md +13 -10
- package/docs/api/mcp/knowledge.md +34 -0
- package/docs/api/mcp/oauth.md +1 -1
- package/docs/api/mcp/ortho.md +113 -0
- package/docs/api/mcp/vision.md +1 -1
- package/docs/api/sdk/bot-accounts.md +1 -0
- package/docs/api/sdk/escalations.md +2 -2
- package/docs/api/sdk/mcp.md +2 -2
- package/docs/api/sdk/settings.md +1 -1
- package/docs/api/sdk/tasks.md +2 -2
- package/docs/api/sdk/workflows.md +2 -2
- package/docs/api/sdk/yaml-workflows.md +1 -1
- package/docs/architecture.md +3 -1
- package/docs/auth.md +3 -2
- package/docs/cloud.md +7 -2
- package/docs/dashboard.md +16 -7
- package/docs/data.md +1 -1
- package/docs/escalation-strategies.md +9 -20
- package/docs/events.md +6 -0
- package/docs/iam.md +7 -5
- package/docs/maintenance.md +51 -28
- package/docs/mcp.md +159 -210
- package/docs/oauth-and-delegation.md +32 -21
- package/docs/topics.md +2 -0
- package/docs/workflows.md +14 -112
- package/package.json +5 -3
- package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-DW4DrPur.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-DNgCIwRl.js +0 -2
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +0 -8
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +0 -1
- package/dashboard/dist/assets/index-CtlBjl8o.js +0 -2
- package/dashboard/dist/assets/index-CtlBjl8o.js.map +0 -1
- package/dashboard/dist/assets/index-LRYC__mE.js +0 -67
- package/dashboard/dist/assets/index-LRYC__mE.js.map +0 -1
- package/dashboard/dist/assets/index-MYI2_Xb3.css +0 -1
package/docs/workflows.md
CHANGED
|
@@ -59,7 +59,7 @@ See the [Compilation Pipeline](https://github.com/hotmeshio/long-tail/blob/main/
|
|
|
59
59
|
- [The Interceptor](#the-interceptor)
|
|
60
60
|
- [Escalation Lifecycle](#escalation-lifecycle)
|
|
61
61
|
- [Composing Workflows](#composing-workflows)
|
|
62
|
-
- [
|
|
62
|
+
- [Worked Example](#worked-example): AI review with human escalation
|
|
63
63
|
- [Milestones](#milestones)
|
|
64
64
|
- [Roles](#roles)
|
|
65
65
|
- [Testing](#testing)
|
|
@@ -410,110 +410,9 @@ PUT /api/workflows/processDocumentOrchestrator/config
|
|
|
410
410
|
|
|
411
411
|
The orchestrator gets its own task record and tracks the lifecycle of its children.
|
|
412
412
|
|
|
413
|
-
##
|
|
413
|
+
## Worked Example
|
|
414
414
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
### The Pipeline
|
|
418
|
-
|
|
419
|
-
```
|
|
420
|
-
Document images --> Vision extraction --> Database validation --> Match or escalate
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
**Step 1 — List pages.** The workflow loads document page images from storage.
|
|
424
|
-
|
|
425
|
-
**Step 2 — Extract.** Each page is sent to OpenAI's Vision API (`gpt-4o-mini`) as a durable activity. The prompt asks for structured JSON: member ID, name, address, phone, email, emergency contact.
|
|
426
|
-
|
|
427
|
-
**Step 3 — Merge.** Multi-page extractions are merged. The primary page (with member ID) provides the base record; partial pages (emergency contact, additional fields) are folded in.
|
|
428
|
-
|
|
429
|
-
**Step 4 — Validate.** The merged record is compared against the member database. Address fields are checked for exact match. Member status must be `active`.
|
|
430
|
-
|
|
431
|
-
**Step 5 — Return or escalate.** If everything matches, the workflow returns:
|
|
432
|
-
|
|
433
|
-
```typescript
|
|
434
|
-
return {
|
|
435
|
-
type: 'return',
|
|
436
|
-
milestones: [
|
|
437
|
-
{ name: 'pages_processed', value: pages.length },
|
|
438
|
-
{ name: 'extraction', value: 'success' },
|
|
439
|
-
{ name: 'validation', value: 'match' },
|
|
440
|
-
],
|
|
441
|
-
data: {
|
|
442
|
-
documentId,
|
|
443
|
-
memberId: merged.memberId,
|
|
444
|
-
extractedInfo: merged,
|
|
445
|
-
validationResult: 'match',
|
|
446
|
-
confidence: 1.0,
|
|
447
|
-
},
|
|
448
|
-
};
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
If there's a mismatch or missing data, it escalates with full context:
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
return {
|
|
455
|
-
type: 'escalation',
|
|
456
|
-
data: {
|
|
457
|
-
documentId,
|
|
458
|
-
extractedInfo: merged, // what Vision saw
|
|
459
|
-
validationResult: 'mismatch', // why it's escalating
|
|
460
|
-
databaseRecord: record, // what the database has
|
|
461
|
-
reason: 'Address mismatch for MBR-2024-001...',
|
|
462
|
-
},
|
|
463
|
-
message: reason,
|
|
464
|
-
role: 'reviewer',
|
|
465
|
-
};
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
### Durable Activities
|
|
469
|
-
|
|
470
|
-
Each activity (list pages, extract, validate) is wrapped with `proxyActivities()`:
|
|
471
|
-
|
|
472
|
-
```typescript
|
|
473
|
-
const { listDocumentPages, extractMemberInfo, validateMember } =
|
|
474
|
-
Durable.workflow.proxyActivities<ActivitiesType>({
|
|
475
|
-
activities,
|
|
476
|
-
retryPolicy: {
|
|
477
|
-
maximumAttempts: 2,
|
|
478
|
-
backoffCoefficient: 2,
|
|
479
|
-
maximumInterval: '10 seconds',
|
|
480
|
-
},
|
|
481
|
-
});
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
If the process crashes after `extractMemberInfo` completes but before `validateMember` starts, the workflow replays from the last checkpoint. The Vision API is not called again.
|
|
485
|
-
|
|
486
|
-
### The Orchestrator
|
|
487
|
-
|
|
488
|
-
The workflow is invoked through a thin orchestrator:
|
|
489
|
-
|
|
490
|
-
```typescript
|
|
491
|
-
import { executeLT } from '@hotmeshio/long-tail';
|
|
492
|
-
|
|
493
|
-
export async function verifyDocumentOrchestrator(envelope: LTEnvelope) {
|
|
494
|
-
return await executeLT({
|
|
495
|
-
workflowName: 'verifyDocument',
|
|
496
|
-
args: [envelope],
|
|
497
|
-
taskQueue: 'long-tail-verify',
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
The orchestrator creates the task record, starts the child, and waits. If the child escalates, the orchestrator waits for the human to resolve it. When resolved, the child re-runs, completes, and the orchestrator gets the result.
|
|
503
|
-
|
|
504
|
-
### Running the Tests
|
|
505
|
-
|
|
506
|
-
```bash
|
|
507
|
-
# Vision workflow tests (requires OpenAI API key)
|
|
508
|
-
OPENAI_API_KEY=sk-... npm run test:vision
|
|
509
|
-
|
|
510
|
-
# With verbose output
|
|
511
|
-
npx vitest run tests/workflows/verify-document.test.ts --reporter=verbose
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
### MCP-Native Variant
|
|
515
|
-
|
|
516
|
-
The same pipeline also exists as an MCP-native workflow (`verify-document-mcp`) where every activity routes through MCP tools instead of calling functions directly. See the [MCP Guide](mcp.md#mcp-native-workflow) for that perspective.
|
|
415
|
+
`examples/workflows/review-content` brings the concepts above together: an activity asks an AI model to review content, the workflow approves it when the model is confident, and escalates to a `reviewer` otherwise. The interceptor tracks the task and the escalation, and resolving the escalation completes the run. Its test is `tests/workflows/review-content.test.ts`.
|
|
517
416
|
|
|
518
417
|
## Escalation Strategies
|
|
519
418
|
|
|
@@ -654,9 +553,9 @@ it('should escalate and resolve', async () => {
|
|
|
654
553
|
const workflowId = `test-${Durable.guid()}`;
|
|
655
554
|
|
|
656
555
|
await client.workflow.start({
|
|
657
|
-
args: [{ data: {
|
|
556
|
+
args: [{ data: { contentId: 'CONTENT-001', content: 'Borderline post', contentType: 'text' }, metadata: {} }],
|
|
658
557
|
taskQueue: 'test-queue',
|
|
659
|
-
workflowName: '
|
|
558
|
+
workflowName: 'reviewContent',
|
|
660
559
|
workflowId,
|
|
661
560
|
expire: 120,
|
|
662
561
|
});
|
|
@@ -668,9 +567,9 @@ it('should escalate and resolve', async () => {
|
|
|
668
567
|
|
|
669
568
|
// Resolve — triggers a re-run
|
|
670
569
|
await resolveEscalation(escalations[0].id, {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
570
|
+
contentId: 'CONTENT-001',
|
|
571
|
+
approved: true,
|
|
572
|
+
humanNote: 'Reviewed and approved',
|
|
674
573
|
});
|
|
675
574
|
|
|
676
575
|
// Wait for the re-run to complete, then verify
|
|
@@ -689,11 +588,14 @@ The test utilities are in `tests/setup/`: `waitForEscalation()` and `waitForEsca
|
|
|
689
588
|
# All workflow tests (~4-5 min)
|
|
690
589
|
npm run test:workflows
|
|
691
590
|
|
|
692
|
-
# Verify-document workflow (requires OpenAI key)
|
|
693
|
-
OPENAI_API_KEY=sk-... npm run test:vision
|
|
694
|
-
|
|
695
591
|
# Full backend suite
|
|
696
592
|
npm test
|
|
593
|
+
|
|
594
|
+
# Fast backend tests: skips tests/workflows and *.llm.test.ts, blanks LLM keys
|
|
595
|
+
npm run test:fast
|
|
596
|
+
|
|
597
|
+
# Tests that call a live model
|
|
598
|
+
npm run test:llm
|
|
697
599
|
```
|
|
698
600
|
|
|
699
601
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hotmeshio/long-tail",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "./build/index.d.ts",
|
|
@@ -33,11 +33,13 @@
|
|
|
33
33
|
"lint:fix": "eslint . --fix --ext .ts",
|
|
34
34
|
"test": "vitest run",
|
|
35
35
|
"test:watch": "vitest",
|
|
36
|
+
"test:fast": "vitest run --config vitest.fast.config.ts",
|
|
37
|
+
"test:llm": "vitest run --config vitest.llm.config.ts",
|
|
36
38
|
"test:workflows": "vitest run tests/workflows",
|
|
37
39
|
"test:export": "vitest run tests/workflows/export.test.ts",
|
|
38
40
|
"test:vision": "vitest run tests/services/mcp/vision-server.test.ts",
|
|
39
|
-
"test:mcp": "vitest run tests/mcp.test.ts",
|
|
40
|
-
"test:mcp:triage": "vitest run tests/
|
|
41
|
+
"test:mcp": "vitest run tests/services/mcp/servers.test.ts",
|
|
42
|
+
"test:mcp:triage": "vitest run --config tests/integration/vitest.config.ts tests/integration/mcpTriage.test.ts",
|
|
41
43
|
"test:integration": "docker compose down -v && rm -rf .docker-data/files/* && docker compose up -d --build && vitest run --config tests/integration/vitest.config.ts",
|
|
42
44
|
"test:integration:skip-reset": "vitest run --config tests/integration/vitest.config.ts",
|
|
43
45
|
"test:functional": "docker compose down -v && rm -rf .docker-data/files/* && docker compose up -d --build && npx playwright test --config tests/functional/playwright.config.ts",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-DvWWuNIB.js";import{M as i}from"./index-LRYC__mE.js";function d({open:r,onClose:t,onConfirm:x,title:n,description:c,isPending:s,error:a}){return e.jsx(i,{open:r,onClose:t,title:n,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:c}),a&&e.jsx("p",{className:"text-xs text-status-error",children:a.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:t,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,className:"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:s,children:s?"Deleting...":"Delete"})]})]})})}export{d as C};
|
|
2
|
-
//# sourceMappingURL=ConfirmDeleteModal-DW4DrPur.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDeleteModal-DW4DrPur.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsx","Modal","jsxs"],"mappings":"uFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,IAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAM,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,EAAY,EACvDE,GAASC,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,QAAQ,EAClEE,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAM,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,UAAU,uGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as b,j as e}from"./vendor-query-DvWWuNIB.js";import{a as z}from"./tasks-CdM1Rkk9.js";import{D as S,f as L,C as V,b as J,c as q,d as G,J as P,S as T}from"./index-LRYC__mE.js";import{P as K}from"./PageHeaderWithStats-DHj8Mqox.js";import{S as W}from"./StatusBadge-DHVwxre2.js";import{W as Q}from"./WorkflowPill-Dg7BDTyM.js";import{T as y}from"./TimestampCell-BUTgE244.js";import{L as D,e as X}from"./vendor-react-_9U4mKFr.js";import{R as Y}from"./RolePill-Di2CAHuD.js";import{U as Z}from"./UserName-ZFpWMaFF.js";import"./vendor-icons-CeVtUKyP.js";const ee="bg-stripes animate-pulse opacity-70";function $(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function I(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function E(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,x=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):x.push(s);const r=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),p=f-o||1,m=s=>(s-o)/p*100,h=[];for(const s of r){const d=new Date(s.created_at).getTime(),j=s.completed_at?new Date(s.completed_at).getTime():l,g=!s.completed_at;h.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:g,task:s});const v=(c.get(s.id)||[]).sort((n,u)=>new Date(n.created_at).getTime()-new Date(u.created_at).getTime());for(const n of v){const u=new Date(n.created_at).getTime(),N=n.resolved_at?new Date(n.resolved_at).getTime():l,M=!n.resolved_at;let w=null;if(n.claimed_at){const U=new Date(n.claimed_at).getTime(),H=N-u||1;w=(U-u)/H*100}h.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:u,endMs:N,startPct:m(u),widthPct:Math.max((N-u)/p*100,.5),durationMs:N-u,isOpen:M,escalation:n,claimPct:w})}}for(const s of x){const d=new Date(s.created_at).getTime(),j=s.resolved_at?new Date(s.resolved_at).getTime():l;let g=null;if(s.claimed_at){const v=new Date(s.claimed_at).getTime(),n=j-d||1;g=(v-d)/n*100}h.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:!s.resolved_at,escalation:s,claimPct:g})}return{lanes:h,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[x,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const p=m=>{i.current===null&&(i.current=m);const h=m-i.current,s=Math.min(h/c,1),d=1-Math.pow(1-s,3);r(d),s<1&&(f=requestAnimationFrame(p))};return f=requestAnimationFrame(p),()=>cancelAnimationFrame(f)},[t,c]);const k=b.useCallback(f=>{const p=(f.startMs-a)/o,m=(f.endMs-a)/o;if(x<p)return{width:0,opacity:0};const h=m-p||.001,s=Math.min((x-p)/h,1),d=f.widthPct*s,j=Math.min(s/.1,1);return{width:d,opacity:j}},[x,a,o]);return{progress:x,animatedBar:k}}function R({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-2xs text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(R,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-2xs font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),x=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:x,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-2xs text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(y,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(S,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,x)=>e.jsxs("span",{className:"px-2 py-0.5 text-2xs font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},x))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.claimed_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:["after ",e.jsx(S,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.resolved_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:[e.jsx(S,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:x,animDone:r,traceUrl:i}){var m,h;const o=t.kind==="task",k=o?t.task.status:t.escalation.status,f=se(k,t.isOpen),p=x.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:p?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):e.jsx(R,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):E(t.escalation)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}):e.jsx(F,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&E(t.escalation)),children:o?A(t.label,24):A(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:p?`${Math.max(x.width,.3)}%`:"0%",minWidth:p?"4px":"0px",opacity:x.opacity},title:`${t.label} — ${L(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[x.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-2xs font-mono text-text-inverse truncate",children:L(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-text-inverse/70",style:{left:`${t.claimPct}%`},title:(h=t.escalation)!=null&&h.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-text-inverse border border-status-warning"})})]})]})]}),e.jsx(V,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,x]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),k=o-i||1,{progress:f,animatedBar:p}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,h=Array.from({length:m+1},(n,u)=>({pct:u/m*100,label:L(Math.round(u/m*k))})),s=n=>{x(u=>{const N=new Set(u);return N.has(n)?N.delete(n):N.add(n),N})},d=r.map(n=>n.id),j=d.length>0&&d.every(n=>c.has(n)),g=()=>{x(j?new Set:new Set(d))},v=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:j,onToggleAll:g}),e.jsx(oe,{ticks:h}),r.map(n=>e.jsx(xe,{lane:n,ticks:h,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:p(n),animDone:v,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function ye(){var j;const{originId:t}=X();J(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),x=((j=c==null?void 0:c.telemetry)==null?void 0:j.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),k=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const g=r.filter(v=>v.status==="completed"&&v.data).sort((v,n)=>new Date(n.completed_at).getTime()-new Date(v.completed_at).getTime());return g.length>0?C(g[0].data):null},[o,r]),p=b.useMemo(()=>r.length>0&&r.some(g=>g.status!=="completed"&&g.status!=="cancelled"),[r]),m=b.useMemo(()=>{const g=r.filter(u=>u.status==="completed").length,v=r.filter(u=>u.status==="needs_intervention").length,n=i.filter(u=>u.status==="resolved").length;return{tasks:r.length,completed:g,escalated:v,escalations:i.length,resolved:n}},[r,i]),h=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const v=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],n=r.every(w=>w.status==="completed"||w.status==="cancelled"),u=i.every(w=>w.status==="resolved"),N=r.length>0&&n&&u,M=N?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:v,endIso:M,isFinished:N,elapsed:G(v,M)}},[r,i]),s=b.useMemo(()=>{const g=[];return h&&g.push({label:h.isFinished?"Completed":"Running",value:h.elapsed,dotClass:h.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),g.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),g},[h,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const d=k||f||p;return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),d&&e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:k?e.jsx(P,{data:k,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(T,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx(P,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):p?e.jsxs("div",{children:[e.jsx(T,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(T,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:x})]})}export{ye as ProcessDetailPage};
|
|
2
|
-
//# sourceMappingURL=ProcessDetailPage-DNgCIwRl.js.map
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{a as g,j as n}from"./vendor-query-DvWWuNIB.js";import{ai as at,aj as Zt,ab as Qt,aR as Oe,aS as te,aA as xt,aT as Te,Z as _e,aw as Re,aU as Le,aV as Se,m as Fe,p as Me,U as $e,aW as Pe,aX as De,z as We,aY as Ue,aZ as qe,aM as Je,a_ as Ge,a$ as He,b0 as Ve,S as Be,b1 as Xe,b2 as Ye,az as ze,K as Ke,A as Ze,b as Qe,b3 as tn,a as en,b4 as nn,b5 as rn,b6 as sn,af as on,am as an,b7 as ln,b8 as cn,b9 as dn,ba as un,bb as xn,bc as pn,bd as fn,be as mn,a2 as gn,M as bn,bf as yn,bg as hn,k as jn,bh as Nn,bi as vn,a1 as kn,aL as wn,bj as An,bk as En,bl as In,G as Cn,bm as On,bn as Tn,bo as _n,bp as Rn,bq as Ln,br as Sn,q as Fn,a6 as Mn,bs as $n,ax as Pn,bt as Dn,bu as Wn,bv as Un,bw as qn,bx as Jn,aq as Gn,by as Hn,f as Vn,aC as Bn,bz as Xn,bA as Yn,bB as zn,an as ee,_ as Kn,W as Zn,bC as Qn,a5 as ne,X as tr}from"./vendor-icons-CeVtUKyP.js";import{m as re,g as ft,H as er,e as nr,a as B,r as mt,s as rr,b as sr,c as se}from"./validate-DcGWN82Y.js";import{ah as Z,aq as ir,a$ as gt,$ as or,a9 as ar,s as lr,b0 as cr,J as dr,b1 as ur,O as xr,b2 as pr,aw as fr,b3 as mr,aZ as gr,i as br,M as ie,az as yr,aA as hr,aB as jr}from"./index-LRYC__mE.js";import{L as lt}from"./vendor-react-_9U4mKFr.js";import{S as Nr}from"./StatusBadge-DHVwxre2.js";import{E as vr}from"./constants-CeBBTzf5.js";import{V as kr}from"./WorkflowPill-Dg7BDTyM.js";const oe=g.createContext(null),ji=oe.Provider;function wr(t){const e=g.useContext(oe);return e&&e.field===t?e:null}function ae({notice:t}){return t?t.error?n.jsx("p",{role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]","data-testid":"field-scan-notice",children:t.error},t.at):n.jsx("p",{role:"status",className:"text-2xs text-status-success mt-1","data-testid":"field-scan-notice",children:t.message??"Scanned"},t.at):null}const Ar={SCHEMA_VALIDATION:"schema_validation"};function Er(t){return typeof t=="object"&&t!==null&&t.code===Ar.SCHEMA_VALIDATION&&Array.isArray(t.violations)}function Tt(t,e={}){const r=re(e,t),s={_form_schema:t};for(const[i,o]of Object.entries(t.properties??{})){const a=o.type==="object"?{}:"";s[i]=r[i]??o.default??a}return JSON.stringify(s,null,2)}function J(t,e){const r=e==null?void 0:e.title;if(typeof r=="string"&&r.trim().length>0)return r.trim();const s=t.split(/[_-]+/).filter(Boolean);return s.length<=1?t:s.map(i=>Ir(i)?i:i.charAt(0).toUpperCase()+i.slice(1)).join(" ")}function Ir(t){return t.length>1&&t===t.toUpperCase()&&/[A-Z]/.test(t)}function le({errors:t,schema:e}){const r=s=>{const i=document.querySelector(`[data-field-key="${s}"]`);i&&(i.scrollIntoView({behavior:"smooth",block:"center"}),i.focus({preventScroll:!0}))};return t.length===0?n.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No errors to display."}):n.jsxs("div",{className:"space-y-1",role:"alert","aria-live":"polite",children:[n.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-wider text-status-error mb-4",children:[t.length," ",t.length===1?"issue":"issues"," to resolve"]}),n.jsx("div",{className:"space-y-1.5",children:t.map(({field:s,message:i})=>{var o;return n.jsxs("button",{onClick:()=>r(s),className:"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group",children:[n.jsx(at,{className:"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors"}),n.jsxs("div",{children:[n.jsx("p",{className:"text-2xs font-semibold text-text-primary leading-snug",children:J(s,(o=e==null?void 0:e.properties)==null?void 0:o[s])}),n.jsx("p",{className:"text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5",children:i})]})]},s)})}),n.jsx("p",{className:"text-2xs text-text-quaternary mt-4 px-3",children:"Click an issue to scroll to and focus the field."})]})}const Cr=/\{\{\s*([^{}]+?)\s*\}\}/g;function st(t){return typeof t=="string"&&/\{\{[^{}]+\}\}/.test(t)}function z(t,e){if(!e)return;const r=t.indexOf("."),s=e[r===-1?t:t.slice(0,r)];if(r===-1)return s;if(!(s===null||typeof s!="object"))return ft(s,t.slice(r+1))}function bt(t,e){let r=!1;const s=t.replace(Cr,(i,o)=>{const a=z(o,e);return typeof a=="string"&&a.trim().length>0?a:typeof a=="number"&&Number.isFinite(a)?String(a):(r=!0,"")});return r?null:s}const Or="x-lt-scan",Tr="x-lt-scan-submit",_t="x-lt-order",_r="Expected {{expected}}";function X(t){const e=t==null?void 0:t[Or];if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,s=Array.isArray(r.schemes)?r.schemes.filter(o=>Number.isInteger(o)):[];if(s.length===0)return null;const i=Array.isArray(r.expect)?r.expect.filter(o=>typeof o=="string"):void 0;return{schemes:s,value:r.value==="code"?"code":"target",...i!=null&&i.length?{expect:i}:{},expectError:typeof r["expect-error"]=="string"?r["expect-error"]:_r,multiplicity:r.multiplicity==="count"?"count":"once",...typeof r.prompt=="string"&&r.prompt.trim()?{prompt:r.prompt}:{}}}function Rr(t,e){if(t===e)return!0;const r=/^[0-9]{8,14}$/;return r.test(t)&&r.test(e)&&t.padStart(14,"0")===e.padStart(14,"0")}function ce(t,e){if(!t.expect)return null;const r=[];for(const s of t.expect){const i=z(s,e),o=Array.isArray(i)?i:[i];for(const a of o)typeof a=="string"&&a?r.push(a):typeof a=="number"&&r.push(String(a))}return r}function Lr(t,e){return t.expectError.replace(/\{\{\s*expected\s*\}\}/g,[...new Set(e)].join(", ")||"nothing")}function de(t,e,r){const s=X(e);if(!s)return;const i=ce(s,r);if(i===null)return;const o=Array.isArray(t)?t:t==null||t===""?[]:[t],a=s.multiplicity==="count"?[...i]:[...new Set(i)];for(const l of o){const c=a.findIndex(u=>Rr(String(l),u));if(c===-1)return Lr(s,i);a.splice(c,1)}}function Sr(t,e){const r=X(t);if(r){const i=ce(r,e);if(i!==null)return r.multiplicity==="count"?i.length:new Set(i).size}const s=t==null?void 0:t.maxItems;return typeof s=="number"?s:null}function Ni(t,e,r,s){const i=X(r);if(!i)return{ok:!1,error:"This field takes no scans"};const o=i.value==="code"?e.code:e.target,a=r.type==="array",l=a?[...Array.isArray(t)?t:[],o]:o,c=de(l,r,s);if(c)return{ok:!1,error:c};const u=r.maxItems;return a&&typeof u=="number"&&l.length>u?{ok:!1,error:`At most ${u}`}:{ok:!0,value:l}}function Fr(t,e){if(e.type==="array"){const r=e.maxItems;return typeof r!="number"||!Array.isArray(t)||t.length<r}return t==null||t===""}function vi(t,e,r,s){const i=(t==null?void 0:t.properties)??{},o=Array.isArray(t==null?void 0:t[_t])?t[_t]:[],l=[...o.filter(c=>c in i),...Object.keys(i).filter(c=>!o.includes(c))].filter(c=>{var u;return(u=X(i[c]))==null?void 0:u.schemes.includes(r)});return l.length===0?null:s&&l.includes(s)?s:l.find(c=>Fr(e[c],i[c]))??l[0]}function ki(t){return(t==null?void 0:t[Tr])===!0}function wi(t,e){const r=(t==null?void 0:t.properties)??{},s=new Set((t==null?void 0:t.required)??[]),i=Object.keys(r).filter(o=>X(r[o])&&s.has(o));return i.length===0?!1:i.every(o=>{const a=e[o];if(Array.isArray(a)){const l=r[o].minItems;return a.length>=(typeof l=="number"?l:1)}return a!=null&&a!==""})}const ue="x-lt-options";function Rt(t){return typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t)}function Mr(t){return Array.isArray(t)&&t.length>0&&!t.some(e=>typeof e=="string")}function Lt(t){if(Rt(t))return{value:t,label:String(t)};if(t&&typeof t=="object"&&!Array.isArray(t)){const e=t,r=e.value!==void 0?e.value:e.id;if(Rt(r)&&typeof e.label=="string"&&e.label.length>0)return{value:r,label:e.label}}return null}function yt(t,e){if(!t)return;const r=t.enum;if(Array.isArray(r)&&r.length>0)return r.map(a=>({value:a,label:String(a)}));const s=t[ue];if(Mr(s)){const a=s.map(Lt).filter(l=>l!==null);return a.length>0?a:void 0}const i=(typeof s=="string"?[s]:Array.isArray(s)?s:[]).filter(a=>typeof a=="string"&&a.length>0);if(i.length===0)return;const o=i.some(st)?[]:void 0;for(const a of i){let l=a;if(st(a)){const d=bt(a,e);if(d===null)continue;l=d}const c=z(l,e);if(!Array.isArray(c))continue;const u=c.map(Lt).filter(d=>d!==null);if(u.length>0)return u}return o}function ht(t,e){const r=(typeof t=="string"?[t]:Array.isArray(t)?t:[]).filter(s=>typeof s=="string"&&s.length>0);if(r.length===0||!e)return[];for(const s of r){let i=s;if(st(s)){const a=bt(s,e);if(a===null)continue;i=a}const o=z(i,e);if(Array.isArray(o)&&o.length>0)return o}return[]}const $r="x-lt-default-checked";function Pr(t,e,r){if((t==null?void 0:t["x-lt-widget"])!=="checklist"||t[$r]!==!0||e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0)return null;const s=ht(t["x-lt-source"],r);return s.length===0?null:Object.fromEntries(s.map(i=>[i.id,!0]))}function Dr(t,e,r){if((e==null?void 0:e["x-lt-widget"])!=="checklist"||e["x-lt-require-all"]!==!0)return;const i=ht(e["x-lt-source"],r).filter(l=>l.required!==!1);if(i.length===0)return;const o=typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{},a=i.filter(l=>!o[l.id]).length;if(a!==0)return`${a} of ${i.length} checks incomplete`}const St="Invalid JSON";function it(t){return(t==null?void 0:t["x-lt-widget"])==="json"}function xe(t){return it(t)||(t==null?void 0:t[ue])!==void 0}function Ft(t,e){return`${t} ${e}${t===1?"":"s"}`}function jt(t,e){const r=e==null?void 0:e.type;if(typeof r=="string"&&!(t==null||t===""))switch(r){case"string":return typeof t=="string"?void 0:"Expected text";case"number":return typeof t=="number"&&Number.isFinite(t)?void 0:"Expected a number";case"integer":return typeof t=="number"&&Number.isInteger(t)?void 0:"Expected a whole number";case"boolean":return typeof t=="boolean"?void 0:"Expected true or false";case"array":return Array.isArray(t)?void 0:it(e)&&typeof t=="string"?St:"Expected a list";case"object":return typeof t=="object"&&!Array.isArray(t)?void 0:it(e)&&typeof t=="string"?St:"Expected an object";default:return}}function Nt(t,e,r){if(!e)return;const s=yt(e,r);if(s!==void 0&&t!==void 0&&t!==null&&t!==""&&!Array.isArray(t)){if(s.length===0)return"No valid options for this selection";if(!s.some(o=>o.value===t))return`Must be one of: ${s.map(o=>String(o.value)).join(", ")}`}const i=de(t,e,r);if(i)return i;if(Array.isArray(t))return xe(e)?Wr(t,e,s,r):void 0;if(t!==null&&typeof t=="object")return Ur(t,e,r);if(typeof t=="string"){const o=t.trim();if(o==="")return;const a=H(e.minLength,e["x-lt-min-length"],r);if(a!==void 0&&o.length<a)return`Minimum ${a} character${a===1?"":"s"}`;const l=H(e.maxLength,e["x-lt-max-length"],r);if(l!==void 0&&o.length>l)return`Maximum ${l} characters (${o.length} entered)`;const c=e.pattern;if(c)try{if(!new RegExp(c).test(o))return e["x-lt-pattern-error"]??"Invalid format"}catch{}const u=e.format;if(u==="email"&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o))return"Enter a valid email address";if(u==="uri"&&!/^https?:\/\/.+/.test(o))return"Enter a valid URL"}if(typeof t=="number"){const o=H(e.minimum,e["x-lt-minimum"],r),a=H(e.exclusiveMinimum,void 0,r),l=H(e.maximum,e["x-lt-maximum"],r),c=H(e.exclusiveMaximum,void 0,r);if(o!==void 0&&t<o)return`Minimum value is ${o}`;if(a!==void 0&&t<=a)return`Must be greater than ${a}`;if(l!==void 0&&t>l)return`Maximum value is ${l}`;if(c!==void 0&&t>=c)return`Must be less than ${c}`}}function Wr(t,e,r,s){if(t.length===0)return;if(r!==void 0){if(r.length===0)return"No valid options for this selection";if(t.some(l=>!r.some(c=>c.value===l)))return`Must be one of: ${r.map(l=>String(l.value)).join(", ")}`}const i=H(e.minItems,void 0,s);if(i!==void 0&&t.length<i)return`At least ${Ft(i,"item")}`;const o=H(e.maxItems,void 0,s);if(o!==void 0&&t.length>o)return`At most ${Ft(o,"item")}`;const a=e.items;if(a&&typeof a=="object"&&!Array.isArray(a)){const l=a;for(let c=0;c<t.length;c++){const u=jt(t[c],l)??Nt(t[c],l,s);if(u)return`Item ${c+1}: ${u}`}}}function Ur(t,e,r){const s=Object.entries(t);if(s.length===0)return;const i=e.propertyNames,o=Array.isArray(i==null?void 0:i.enum)?i.enum.map(String):void 0;if(o){const l=s.find(([c])=>!o.includes(c));if(l)return`Unknown key "${l[0]}". Allowed: ${o.join(", ")}`}const a=e.additionalProperties;if(a&&typeof a=="object"&&!Array.isArray(a)){const l=a;for(const[c,u]of s){const d=jt(u,l)??Nt(u,l,r);if(d)return`"${c}": ${d}`}}}function H(t,e,r){if(typeof t=="number")return t;if(typeof e=="string"&&r){const s=e.indexOf(".");if(s!==-1){const i=e.slice(0,s),o=e.slice(s+1),a=r[i];if(a&&typeof a=="object"){const l=o.split(".");let c=a;for(const u of l)if(c=c[u],c===void 0)break;if(typeof c=="number")return c;if(typeof c=="string"){const u=Number(c);if(!Number.isNaN(u))return u}}}}}function pe(t,e,r,s,i){if(!s)return;if(r){if(t==null||typeof t=="boolean"&&!t&&yt(e,i)===void 0||typeof t=="string"&&t.trim()===""||Array.isArray(t)&&t.length===0&&xe(e))return"Required";if(typeof t=="object"&&!Array.isArray(t)&&t!==null){const l=Object.values(t);if(l.length===0||!it(e)&&l.every(c=>!c))return"Required"}}const o=jt(t,e);if(o)return o;const a=Dr(t,e,i);return a||Nt(t,e,i)}function Mt(t){return t!=null&&t!==""&&t!==!1&&t!==0}function qr(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function $t(t,e){const r=t.indexOf("."),s=r===-1?t:t.slice(0,r);if(!er.includes(s))return{known:!1,value:void 0};const i=e[s];if(r===-1)return{known:!0,value:i};try{return{known:!0,value:ft(i,t.slice(r+1))}}catch{return{known:!0,value:void 0}}}function K(t,e){if(Array.isArray(t))return t.every(c=>K(c,e));if(typeof t!="string"||t.length===0||!e)return!0;const r=t.startsWith("!"),s=r?t.slice(1):t,i=s.indexOf("!="),o=s.indexOf("=");if(i!==-1||o!==-1&&o!==i+1){const c=i!==-1&&(o===-1||i<o),u=c?i:o,d=s.slice(0,u).trim(),p=s.slice(u+(c?2:1)).trim(),{known:x,value:m}=$t(d,e);if(!x)return!0;const b=qr(m)===p,f=c?!b:b;return r?!f:f}const{known:a,value:l}=$t(s,e);return a?r?!Mt(l):Mt(l):!0}function Jr(t,e){return(t==null?void 0:t["x-lt-hide-if-empty"])!==!0?!1:e==null||e===""||e===!1||e===0}const Gr="x-lt-require-any";function Hr(t){const e=t==null?void 0:t[Gr];return Array.isArray(e)?e.filter(r=>Array.isArray(r)).map(r=>r.filter(s=>typeof s=="string"&&s.length>0)).filter(r=>r.length>0):[]}function Vr(t){return t==null?!1:typeof t=="string"?t.trim().length>0:!0}const Br="x-lt-require-sum";function Xr(t){const e=t==null?void 0:t[Br];if(!Array.isArray(e))return[];const r=[];for(const s of e){if(!s||typeof s!="object"||Array.isArray(s))continue;const{fields:i,minimum:o}=s;if(!Array.isArray(i))continue;const a=i.filter(l=>typeof l=="string"&&l.length>0);a.length!==0&&(o!==void 0&&typeof o!="number"||r.push({fields:a,minimum:typeof o=="number"?o:1}))}return r}function Yr(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){const e=Number(t);if(!Number.isNaN(e))return e}return 0}function fe(t,e,r){if(!t)return[];const s=t.properties??{},i=new Set(t.required??[]),o={...r??{},resolver:e,input:e},a=[];for(const[l,c]of Object.entries(s)){if(!K(c["x-lt-showIf"],o))continue;const u=pe(e[l],c,i.has(l),!0,o);u&&a.push({field:l,message:u})}for(const l of Hr(t)){const c=l.filter(d=>s[d]&&K(s[d]["x-lt-showIf"],o));if(c.length===0||c.some(d=>Vr(e[d])))continue;const u=c.map(d=>s[d].title??d);a.push({field:c[0],message:`Enter a value for at least one of: ${u.join(", ")}`})}for(const l of Xr(t)){const c=l.fields.filter(p=>s[p]&&K(s[p]["x-lt-showIf"],o));if(c.length===0||c.reduce((p,x)=>p+Yr(e[x]),0)>=l.minimum)continue;const d=c.map(p=>s[p].title??p);a.push({field:c[0],message:`Combined value of ${d.join(", ")} must be at least ${l.minimum}`})}return a}function zr(t,e,r){if(!t)return[];const s=re(e,t);return fe(t,s,r)}function Pt(t,e){let r;try{r=JSON.parse(t)}catch{return{payload:null,errors:[],parseError:"Invalid JSON"}}const s=r._form_schema;if(s){const a=fe(s,r,e);if(a.length>0)return{payload:null,errors:a,parseError:null}}const{_form_schema:i,...o}=r;return{payload:nr(o,s),errors:[],parseError:null}}const Kr=2600;function Zr({hint:t,onLockedClick:e,children:r}){const[s,i]=g.useState(null);g.useEffect(()=>{if(!s)return;const a=setTimeout(()=>i(null),Kr);return()=>clearTimeout(a)},[s]);const o=a=>{if(e==null||e(),t){const l=Math.min(Math.max(a.clientX,96),window.innerWidth-96);i(c=>({x:l,y:a.clientY,n:((c==null?void 0:c.n)??0)+1}))}};return n.jsxs("div",{className:"pb-8 max-w-form",onClick:o,"data-testid":"locked-form-frame",children:[r,t&&s&&n.jsxs("div",{role:"status",className:"fixed z-[60] pointer-events-none flex items-center gap-2 px-3 py-1.5 rounded-md bg-surface-raised border border-surface-border shadow-lg text-xs font-medium text-text-primary whitespace-nowrap animate-[click-hint_2.6s_ease-in-out_both]",style:{left:s.x,top:s.y-12},onAnimationEnd:()=>i(null),"data-testid":"locked-form-hint",children:[n.jsx(Zt,{className:"w-3.5 h-3.5 text-accent shrink-0",strokeWidth:1.5}),t]},s.n)]})}function _({children:t,isRequired:e,htmlFor:r}){return n.jsxs("label",{htmlFor:r,className:"block text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t,e&&n.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function M({id:t,children:e}){return n.jsx("p",{id:t,className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:e})}function D({error:t,id:e}){return t?n.jsx("p",{id:e,role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function Y(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function Qr(t){return t?"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full"}function ts({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=g.useRef(null),a=(s==null?void 0:s.accept)??void 0,l=J(t,s),c=s==null?void 0:s.description,u=g.useCallback(p=>{var b;const x=(b=p.target.files)==null?void 0:b[0];if(!x)return;const m=new FileReader;m.onload=()=>{typeof m.result=="string"&&r(m.result)},m.readAsDataURL(x)},[r]),d=e.startsWith("data:");return n.jsxs("div",{children:[n.jsx(_,{isRequired:i,children:l}),c&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:c}),n.jsxs("div",{className:"mt-1",children:[n.jsx("input",{ref:o,type:"file",accept:a,onChange:u,className:"hidden"}),n.jsx("button",{type:"button",onClick:()=>{var p;return(p=o.current)==null?void 0:p.click()},className:"btn-secondary text-xs px-3 py-1.5",children:d?"Replace file":"Choose file"}),d&&n.jsx("span",{className:"ml-2 text-xs text-status-success",children:"File attached"})]})]})}function es({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=J(t,s),a=s==null?void 0:s.description,l=(s==null?void 0:s["x-lt-language"])??"",c=g.useCallback(u=>{if(u.key==="Tab"){u.preventDefault();const d=u.currentTarget,p=d.selectionStart,x=d.selectionEnd,m=e.substring(0,p)+" "+e.substring(x);r(m),requestAnimationFrame(()=>{d.selectionStart=d.selectionEnd=p+2})}},[e,r]);return n.jsxs("div",{children:[n.jsxs(_,{isRequired:i,children:[o,l&&n.jsx("span",{className:"ml-2 text-text-tertiary/60 normal-case font-normal",children:l})]}),a&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:a}),n.jsx("textarea",{value:e,onChange:u=>r(u.target.value),onKeyDown:c,className:"input w-full mt-1 font-mono text-xs leading-relaxed",rows:10,spellCheck:!1})]})}function ns({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=g.useRef(null),[a,l]=g.useState(!1),c=J(t,s),u=s==null?void 0:s.description;g.useEffect(()=>{const f=o.current;if(!f)return;const y=f.getContext("2d");if(y&&(y.lineWidth=2,y.lineCap="round",y.strokeStyle="#1E1535",e&&e.startsWith("data:"))){const h=new Image;h.onload=()=>y.drawImage(h,0,0),h.src=e}},[]);const d=g.useCallback(f=>{const y=o.current,h=y.getBoundingClientRect(),k=h.width>0?y.width/h.width:1,j=h.height>0?y.height/h.height:1;return"touches"in f?{x:(f.touches[0].clientX-h.left)*k,y:(f.touches[0].clientY-h.top)*j}:{x:(f.clientX-h.left)*k,y:(f.clientY-h.top)*j}},[]),p=g.useCallback(f=>{var k;l(!0);const y=(k=o.current)==null?void 0:k.getContext("2d");if(!y)return;const h=d(f);y.beginPath(),y.moveTo(h.x,h.y)},[d]),x=g.useCallback(f=>{var k;if(!a)return;const y=(k=o.current)==null?void 0:k.getContext("2d");if(!y)return;const h=d(f);y.lineTo(h.x,h.y),y.stroke()},[a,d]),m=g.useCallback(()=>{l(!1);const f=o.current;f&&r(f.toDataURL("image/png"))},[r]),b=g.useCallback(()=>{const f=o.current;if(!f)return;const y=f.getContext("2d");y&&(y.clearRect(0,0,f.width,f.height),r(""))},[r]);return n.jsxs("div",{children:[n.jsx(_,{isRequired:i,children:c}),u&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:u}),n.jsx("div",{className:"mt-1 max-w-[25rem] border border-surface-border rounded-md overflow-hidden bg-white",children:n.jsx("canvas",{ref:o,width:400,height:150,className:"w-full cursor-crosshair touch-none",onMouseDown:p,onMouseMove:x,onMouseUp:m,onMouseLeave:m,onTouchStart:p,onTouchMove:x,onTouchEnd:m})}),n.jsx("button",{type:"button",onClick:b,className:"mt-1 text-2xs text-text-tertiary hover:text-accent transition-colors",children:"Clear"})]})}function rs({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=J(t,s),a=s==null?void 0:s.description;return n.jsxs("div",{children:[n.jsx(_,{isRequired:i,children:o}),a&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:a}),n.jsx("textarea",{value:e,onChange:l=>r(l.target.value),className:"input w-full mt-1 text-sm leading-relaxed",rows:8,placeholder:"Supports plain text. Markdown formatting is preserved."})]})}function ss({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const[o,a]=g.useState("write"),l=J(t,s),c=s==null?void 0:s.description;return(s==null?void 0:s.readOnly)===!0?n.jsx(Z,{content:e,className:"my-1"}):n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsx(_,{isRequired:i,children:l}),n.jsx("div",{className:"flex items-center gap-0.5",children:["write","preview"].map(d=>n.jsx("button",{type:"button",onClick:()=>a(d),className:`px-2 py-0.5 text-2xs rounded transition-colors ${o===d?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:d==="write"?"Write":"Preview"},d))})]}),c&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:c}),o==="write"?n.jsx("textarea",{value:e,onChange:d=>r(d.target.value),className:"input w-full mt-1 text-sm font-mono leading-relaxed",rows:10,placeholder:"Write markdown — headings, lists, tables, code blocks, and links all render."}):n.jsx("div",{className:"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]",children:e.trim()?n.jsx(Z,{content:e}):n.jsx("p",{className:"text-xs text-text-quaternary italic",children:"Nothing to preview."})})]})}const is=28;function os({fieldKey:t,value:e,onChange:r,schema:s,escalationContext:i,isRequired:o,submitAttempted:a,error:l}){const c=(s==null?void 0:s["x-lt-require-all"])===!0,u=ht(s==null?void 0:s["x-lt-source"],i);let d={};try{e&&(d=JSON.parse(e))}catch{}const p=(()=>{const j=Pr(s,d,i);return j?JSON.stringify(j):null})();g.useEffect(()=>{p&&r(p)},[p]);const x=j=>r(JSON.stringify({...d,[j]:!d[j]})),m=J(t,s),b=s==null?void 0:s.description;if(u.length===0)return n.jsxs(n.Fragment,{children:[n.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"No checklist items. None of the field's x-lt-source paths resolved on this escalation."}),l&&n.jsx("p",{className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:l})]});const f=s==null?void 0:s["x-lt-variant"],y=f==="chips"||f==="rows"?f:c||u.some(j=>j.label.length>is)?"rows":"chips",h=u.filter(j=>d[j.id]).length,k=(u.find(j=>!d[j.id]&&j.required!==!1)??u[0]).id;return n.jsxs("div",{role:"group","aria-label":m,"aria-required":o||void 0,"aria-invalid":l?!0:void 0,children:[n.jsx(_,{isRequired:o,children:m}),b&&n.jsx(M,{children:b}),y==="chips"?n.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:u.map(j=>{const N=d[j.id]??!1,v=!N&&!!a&&h===0&&(j.required||o);return n.jsxs("label",{className:`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${N?"bg-accent border-accent text-text-inverse":v?"bg-surface-field border-status-error/60 text-status-error":"bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary"}`,children:[n.jsx("input",{type:"checkbox",checked:N,onChange:()=>x(j.id),className:"sr-only","data-testid":`checklist-item-${j.id}`,...j.id===k?{"data-field-key":t}:{}}),N&&n.jsx(Qt,{className:"w-3.5 h-3.5 shrink-0",strokeWidth:2.5}),j.label]},j.id)})}):n.jsx("div",{className:"space-y-2.5 mt-2",children:u.map(j=>{const N=d[j.id]??!1,v=!N&&!!a&&(c?j.required!==!1:h===0&&(j.required||o));return n.jsxs("label",{className:`flex items-start gap-3 cursor-pointer group select-none rounded px-2 py-1 -mx-2 transition-colors ${v?"bg-status-error/5":"hover:bg-surface-hover"}`,children:[n.jsx("input",{type:"checkbox",checked:N,onChange:()=>x(j.id),className:`mt-0.5 w-3.5 h-3.5 shrink-0 rounded ${v?"accent-status-error":"accent-accent"}`,"data-testid":`checklist-item-${j.id}`,...j.id===k?{"data-field-key":t}:{}}),n.jsxs("span",{className:`text-sm leading-snug transition-colors ${v?"text-status-error":"text-text-secondary group-hover:text-text-primary"}`,children:[j.label,j.required&&n.jsx("span",{className:`ml-0.5 text-2xs ${v?"text-status-error":"text-text-quaternary"}`,children:"*"})]})]},j.id)})}),n.jsx("p",{className:"text-2xs text-text-quaternary mt-3 tabular-nums",children:y==="chips"?n.jsxs(n.Fragment,{children:[h," selected",o&&h===0&&!!a&&n.jsx("span",{className:"ml-1 text-text-quaternary/60",children:"(check at least one)"})]}):n.jsxs(n.Fragment,{children:[h," / ",u.length," confirmed",c?n.jsxs("span",{className:"ml-1 text-text-quaternary/60",children:["(all required",u.some(j=>j.required===!1)?" except optional":"",")"]}):o&&h===0&&!!a&&n.jsx("span",{className:"ml-1 text-text-quaternary/60",children:"(at least one required)"})]})}),l&&n.jsx("p",{role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:l})]})}const as=/\.(png|jpe?g|gif|webp|avif|bmp|svg)(\?.*)?$/i;function ls(t){var s,i,o,a;const e=t.trim();if(!e)return{kind:"none"};const r=(i=(s=/^data:([^;,]+)[;,]/.exec(e))==null?void 0:s[1])==null?void 0:i.toLowerCase();if(r)return r.startsWith("image/")?{kind:"image",src:e}:{kind:"file",href:e,label:r==="application/pdf"?"PDF":r,isData:!0};if(/^https?:\/\//i.test(e)){if(as.test(e))return{kind:"image",src:e};const l=(a=(o=/\.([a-z0-9]{2,5})(\?.*)?$/i.exec(e))==null?void 0:o[1])==null?void 0:a.toUpperCase();return{kind:"file",href:e,label:l??"attachment",isData:!1}}return{kind:"none"}}function Dt({fieldKey:t,value:e,schema:r}){const[s,i]=g.useState(!1),o=ls(e??""),a=t.replace(/[_-]/g," "),l=r==null?void 0:r.description,c=n.jsxs(n.Fragment,{children:[n.jsx("label",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:a}),l&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:l})]});return o.kind==="none"?n.jsxs("div",{children:[c,n.jsx("p",{className:"text-xs text-text-quaternary italic mt-1",children:"No attachment"})]}):o.kind==="image"?n.jsxs("div",{children:[c,n.jsxs("div",{className:"mt-1",children:[n.jsx("button",{type:"button",onClick:()=>i(!0),className:"block rounded-[0.125em] border border-surface-border overflow-hidden hover:border-accent transition-colors",title:"View full size",children:n.jsx("img",{src:o.src,alt:t.replace(/[_-]/g," "),className:"max-h-48 max-w-full object-contain","data-testid":`attachment-image-${t}`})}),s&&n.jsx("div",{className:"fixed inset-0 z-[100] bg-text-primary/60 backdrop-blur-sm flex items-center justify-center p-8 cursor-zoom-out",onClick:()=>i(!1),role:"dialog","aria-modal":"true","aria-label":`${a} — full size`,children:n.jsx("img",{src:o.src,alt:a,className:"max-h-[90vh] max-w-[90vw] object-contain"})})]})]}):n.jsxs("div",{children:[c,n.jsx("div",{className:"mt-1",children:n.jsxs("a",{href:o.href,...o.isData?{download:`${t}.${o.label==="PDF"?"pdf":"bin"}`}:{target:"_blank",rel:"noopener noreferrer"},className:"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`attachment-link-${t}`,children:[n.jsx(Oe,{className:"w-3.5 h-3.5",strokeWidth:1.5}),o.isData?`Download ${o.label}`:`Open ${o.label}`,o.isData?n.jsx(te,{className:"w-3 h-3",strokeWidth:1.5}):n.jsx(xt,{className:"w-3 h-3",strokeWidth:1.5})]})})]})}function cs({fieldKey:t,schema:e,escalationContext:r}){const s=(e==null?void 0:e["x-lt-href"])??"",i=s&&r?B(s,r):s,o=(e==null?void 0:e.title)??(e==null?void 0:e.description)??"Open",a=e==null?void 0:e.description,l=i.startsWith("/"),c=!i.trim();return n.jsxs("div",{"data-field-key":t,children:[n.jsx(_,{children:o}),a&&n.jsx(M,{children:a}),n.jsx("div",{className:"mt-1",children:c?n.jsx("span",{className:"text-xs text-text-quaternary italic",children:"No link configured"}):l?n.jsxs(lt,{to:i,className:"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`link-widget-${t}`,children:[o,n.jsx(xt,{className:"w-3 h-3 shrink-0",strokeWidth:1.5})]}):n.jsxs("a",{href:i,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`link-widget-${t}`,children:[o,n.jsx(xt,{className:"w-3 h-3 shrink-0",strokeWidth:1.5})]})})]})}function me({to:t,className:e=""}){return n.jsxs(lt,{to:t,title:"View details",tabIndex:-1,className:`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${e}`,children:[n.jsx(Te,{className:"w-3.5 h-3.5",strokeWidth:2}),n.jsx("span",{className:"sr-only",children:"View details"})]})}const Wt="—";function ds(t,e){if(!t||!e)return"";const r=t.indexOf(".");if(r===-1)return"";const s=t.slice(0,r),i=t.slice(r+1);try{const o=ft(e[s],i);return typeof o=="string"?o:""}catch{return""}}function us(t,e){if(!t||t===Wt)return Wt;if(e==="age"){const r=new Date(t);return Number.isNaN(r.getTime())?t:gt(t)}return t}function xs({fieldKey:t,schema:e,escalationContext:r}){const s=e==null?void 0:e["x-lt-source"],i=(e==null?void 0:e["x-lt-fields"])??[],o=(e==null?void 0:e.title)??"Linked escalation",a=e==null?void 0:e.description,l=ds(s,r),{data:c,isLoading:u,isError:d}=ir(l);return n.jsxs("div",{"data-field-key":t,children:[n.jsx(_,{children:o}),a&&n.jsx(M,{children:a}),n.jsx("div",{className:"mt-1",children:!l||d?n.jsx("p",{className:"text-xs text-text-quaternary italic","data-testid":`escalation-widget-empty-${t}`,children:"No linked record"}):u?n.jsx(fs,{}):c?n.jsx(ps,{esc:c,fields:i,fieldKey:t}):n.jsx("p",{className:"text-xs text-text-quaternary italic",children:"No linked record"})})]})}function ps({esc:t,fields:e,fieldKey:r}){if(!t)return null;const s=mt(t);return n.jsxs("div",{className:"border-l-2 border-accent-faint pl-3 py-2 space-y-2","data-testid":`escalation-widget-card-${r}`,children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t.type,t.subtype&&t.subtype!==t.type?` · ${t.subtype}`:""]}),n.jsx(Nr,{status:t.status})]}),t.description&&n.jsx("p",{className:"text-xs text-text-primary leading-snug",children:t.description}),e.length>0&&n.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5",children:e.map(i=>{const o=B(i.value,s),a=us(o,i.format);return n.jsxs("div",{className:"contents",children:[n.jsx("dt",{className:"text-2xs text-text-tertiary whitespace-nowrap",children:i.label}),n.jsx("dd",{className:"text-2xs text-text-primary",children:a})]},i.label)})}),n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsxs("span",{className:"text-2xs text-text-quaternary",children:[t.role," · ",gt(t.created_at)]}),n.jsx(me,{to:`/escalations/detail/${t.id}`})]})]})}function fs(){return n.jsxs("div",{className:"border-l-2 border-accent-faint pl-3 py-2 space-y-2 animate-pulse",children:[n.jsx("div",{className:"h-3 w-32 bg-surface-sunken rounded"}),n.jsx("div",{className:"h-3 w-48 bg-surface-sunken rounded"}),n.jsx("div",{className:"h-3 w-24 bg-surface-sunken rounded"})]})}function ms(t,e){if(!t)return{};const r={};for(const[s,i]of Object.entries(t))r[s]=typeof i=="string"?B(i,e):i;return r}function gs(t,e,r){const s=ms(t.facets,e),i={role:t.role,status:t.status??"pending",facets:s,limit:t.limit,enabled:!!(t.role||Object.keys(s).length)};return t.assigned==="me"?{...i,assigned_to:r,available:!1,enabled:i.enabled&&!!r}:t.assigned==="any"?i:{...i,available:t.available??!0}}const bs=[{label:"Description",value:"{{escalation.description}}"},{label:"Role",value:"{{escalation.role}}"},{label:"Age",value:"{{escalation.created_at}}",format:"age"}],Ut="—";function ys(t,e){if(!t||t===Ut)return Ut;if(e==="age"){const r=new Date(t);return Number.isNaN(r.getTime())?t:gt(t)}return t}function pt(t,e){return typeof t=="string"?B(t,e):Array.isArray(t)?t.map(r=>pt(r,e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([r,s])=>[r,pt(s,e)])):t}function hs({fieldKey:t,schema:e,escalationContext:r}){const s=(e==null?void 0:e["x-lt-query"])??{},i=(e==null?void 0:e["x-lt-columns"])??bs,o=(e==null?void 0:e["x-lt-actions"])??[],a=(e==null?void 0:e.title)??"Related items",l=e==null?void 0:e.description,c=r??{},{user:u}=or(),d=gs(s,c,u==null?void 0:u.userId),{data:p,isLoading:x}=ar({role:d.role,status:d.status,facets:d.facets,assigned_to:d.assigned_to,available:d.available,limit:d.limit??5,enabled:d.enabled,include:rr({columns:i,actions:o})?"envelope":void 0}),m=(p==null?void 0:p.escalations)??[],b=lr(),[f,y]=g.useState({}),[h,k]=g.useState(null),j=async(N,v)=>{const A=mt(N);if(!(v.confirm&&!window.confirm(B(v.confirm,A)))){k(N.id),y(O=>({...O,[N.id]:""}));try{await b.mutateAsync({id:N.id,resolverPayload:pt(v.resolverPayload,A)})}catch(O){y(S=>({...S,[N.id]:O.message}))}finally{k(null)}}};return n.jsxs("div",{"data-field-key":t,children:[n.jsx(_,{children:a}),l&&n.jsx(M,{children:l}),n.jsx("div",{className:"mt-1","data-testid":`escalation-list-widget-${t}`,children:x?n.jsx(Ns,{columns:i.length}):n.jsx(js,{escalations:m,columns:i,fieldKey:t,actions:o,onAction:j,pendingRow:h,rowErrors:f})})]})}function js({escalations:t,columns:e,fieldKey:r,actions:s,onAction:i,pendingRow:o,rowErrors:a}){return t.length===0?n.jsx("p",{className:"text-xs text-text-quaternary italic py-1","data-testid":`escalation-list-empty-${r}`,children:"No items found"}):n.jsxs("table",{className:"w-full text-xs border-collapse","data-testid":`escalation-list-table-${r}`,children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b border-surface-border",children:[e.map(l=>n.jsx("th",{className:"text-left text-2xs font-semibold uppercase tracking-wider text-text-tertiary pb-1 pr-3 last:pr-0",children:l.label},l.label)),s.length>0&&n.jsx("th",{className:"w-px"}),n.jsx("th",{className:"w-8"})]})}),n.jsx("tbody",{children:t.map(l=>{const c=mt(l),u=a[l.id];return n.jsxs("tr",{className:"border-b border-surface-border/50 last:border-0 hover:bg-surface-sunken/50 transition-colors",children:[e.map(d=>{const p=B(d.value,c),x=ys(p,d.format);return n.jsx("td",{className:"py-1 pr-3 last:pr-0 text-text-primary align-top",children:x},d.label)}),s.length>0&&n.jsxs("td",{className:"py-1 pr-2 align-top whitespace-nowrap",children:[s.map(d=>n.jsx("button",{type:"button",onClick:()=>i(l,d),disabled:o===l.id,className:"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-default transition-colors ml-1 first:ml-0","data-testid":`escalation-list-action-${l.id}`,children:d.label},d.label)),u&&n.jsx("p",{className:"text-2xs text-status-error mt-0.5 whitespace-normal max-w-[16rem]","data-testid":`escalation-list-action-error-${l.id}`,children:u})]}),n.jsx("td",{className:"py-1 pl-2 align-top",children:n.jsx(me,{to:`/escalations/detail/${l.id}`})})]},l.id)})})]})}function Ns({columns:t}){return n.jsx("div",{className:"space-y-1.5 animate-pulse",children:[0,1,2].map(e=>n.jsx("div",{className:"flex gap-4",children:Array.from({length:t},(r,s)=>n.jsx("div",{className:"h-3 bg-surface-sunken rounded flex-1"},s))},e))})}function ge(t,e){return{metadata:t??{},...e?{lookup:e}:{}}}const vs="x-lt-invoke",Q={LINK:"link",BUTTON:"button"},ks=/^\{\{\s*([^{}]+?)\s*\}\}$/;function nt(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ws(t){return t===Q.LINK||t===Q.BUTTON}function As(t){const e=t==null?void 0:t[vs];if(!nt(e))return null;const r=e.workflow;if(typeof r!="string"||r.trim().length===0)return null;const s=e.confirm;return{workflow:r.trim(),data:nt(e.data)?e.data:{},metadata:nt(e.metadata)?e.metadata:{},modal:e.modal===!0,confirm:typeof s=="string"&&s.trim().length>0?s:null,variant:ws(e.variant)?e.variant:Q.LINK,icon:e.icon!==!1}}function ot(t,e){if(typeof t=="string"){const r=ks.exec(t);if(r){const s=z(r[1],e??void 0);return s===null?void 0:s}return st(t)?bt(t,e??void 0)??void 0:t}if(Array.isArray(t))return t.map(r=>ot(r,e)).filter(r=>r!==void 0);if(nt(t)){const r={};for(const[s,i]of Object.entries(t)){const o=ot(i,e);o!==void 0&&(r[s]=o)}return r}return t}function Es(t,e){return{data:ot(t.data,e),metadata:ot(t.metadata,e)}}const vt={ACTIVITY:"Activity",ALERT:"AlertTriangle",ARCHIVE:"Archive",AWARD:"Award",BARCODE:"Barcode",BELL:"Bell",BOT:"Bot",BOX:"Box",BOXES:"Boxes",BUILDING:"Building2",CALENDAR:"Calendar",CAMERA:"Camera",CHECKLIST:"ListChecks",CLIPBOARD:"ClipboardList",CLIPBOARD_CHECK:"ClipboardCheck",CLOCK:"Clock",COG:"Cog",CPU:"Cpu",DATABASE:"Database",DOWNLOAD:"Download",DROPLETS:"Droplets",FACTORY:"Factory",FAN:"Fan",FILE:"FileText",FLAG:"Flag",FLAME:"Flame",GAUGE:"Gauge",HAMMER:"Hammer",HEART:"Heart",IMAGE:"Image",KEY:"Key",LAYERS:"Layers",LEAF:"Leaf",LIFEBUOY:"LifeBuoy",LOCK:"Lock",MAIL:"Mail",MAP:"Map",MEGAPHONE:"Megaphone",MESSAGE:"MessageSquare",PACKAGE:"Package",PALETTE:"Palette",PEN:"PenTool",PILL:"Pill",POWER:"Power",PRINTER:"Printer",RECEIPT:"Receipt",RECYCLE:"Recycle",REFRESH:"RefreshCw",ROCKET:"Rocket",ROUTE:"Route",RULER:"Ruler",SCALE:"Scale",SCAN:"ScanBarcode",SCISSORS:"Scissors",SEARCH:"Search",SEND:"Send",SERVER:"Server",SHIELD:"ShieldCheck",SHOPPING_CART:"ShoppingCart",SNOWFLAKE:"Snowflake",SPARKLES:"Sparkles",STAR:"Star",STORE:"Store",SUN:"Sun",TAG:"Tag",TEST_TUBE:"TestTube",THERMOMETER:"Thermometer",TRASH:"Trash2",TRUCK:"Truck",UPLOAD:"Upload",USER:"User",USERS:"Users",WAND:"Wand2",WAREHOUSE:"Warehouse",WIFI:"Wifi",WRENCH:"Wrench",ZAP:"Zap"},Is=new Set(Object.values(vt));function Cs(t){return typeof t=="string"&&Is.has(t)}const Os={Activity:Kn,AlertTriangle:ee,Archive:zn,Award:Yn,Barcode:Xn,Bell:Bn,Bot:Vn,Box:Hn,Boxes:Gn,Building2:Jn,Calendar:qn,Camera:Un,ClipboardCheck:Wn,ClipboardList:Dn,Clock:Pn,Cog:$n,Cpu:Mn,Database:Fn,Download:te,Droplets:Sn,Factory:Ln,Fan:Rn,FileText:_n,Flag:Tn,Flame:On,Gauge:Cn,Hammer:In,Heart:En,Image:An,Key:wn,Layers:kn,Leaf:vn,LifeBuoy:Nn,ListChecks:jn,Lock:Zt,Mail:hn,Map:yn,Megaphone:bn,MessageSquare:gn,Package:mn,Palette:fn,PenTool:pn,Pill:xn,Power:un,Printer:dn,Receipt:cn,Recycle:ln,RefreshCw:an,Rocket:on,Route:sn,Ruler:rn,Scale:nn,ScanBarcode:en,Scissors:tn,Search:Qe,Send:Ze,Server:Ke,ShieldCheck:ze,ShoppingCart:Ye,Snowflake:Xe,Sparkles:Be,Star:Ve,Store:He,Sun:Ge,Tag:Je,TestTube:qe,Thermometer:Ue,Trash2:We,Truck:De,Upload:Pe,User:$e,Users:Me,Wand2:Fe,Warehouse:Se,Wifi:Le,Wrench:Re,Zap:_e},qt=Object.values(vt),Ts=Object.fromEntries(Object.entries(vt).map(([t,e])=>[e,t]));function _s(t){return Cs(t)?Os[t]:null}function Ai(t){const e=t.trim().toLowerCase().replace(/[\s_-]+/g,"");return e?qt.filter(r=>r.toLowerCase().includes(e)||Ts[r].toLowerCase().replace(/_/g,"").includes(e)):[...qt]}function kt({icon:t,tier:e,className:r,strokeWidth:s=1.5}){const i=_s(t)??kr[e]??Zn;return n.jsx(i,{className:r,strokeWidth:s,"aria-hidden":!0})}function Rs(t){return`${t.domain}/${t.key} ${t.current||t.version===null?"(current)":`v${t.version}`}`}const L={RUNNING:"running",COMPLETED:"completed",FAILED:"failed"};function Jt(t,e){return`lt.events.system.workflow.${t}.${e}`}function wt(t){const[e,r]=g.useState(L.RUNNING),[s,i]=g.useState(void 0);return g.useEffect(()=>{r(L.RUNNING),i(void 0)},[t]),cr(t?[Jt(t,"completed"),Jt(t,"failed")]:[],o=>{o.workflowId===t&&(r(o.type.endsWith(".failed")?L.FAILED:L.COMPLETED),i(o.data))}),{outcome:e,payload:s}}const Ls={[L.RUNNING]:"Working…",[L.COMPLETED]:"Completed",[L.FAILED]:"Failed"};function be({outcome:t,className:e=""}){const r=t===L.FAILED?"text-status-error":t===L.COMPLETED?"text-status-success":"text-text-secondary";return n.jsxs("p",{className:`flex items-center gap-1.5 text-xs ${r} ${e}`,role:"status","data-testid":"run-outcome",children:[Ls[t],t===L.RUNNING&&n.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent animate-pulse","aria-hidden":!0})]})}function ye({payload:t}){return!t||Object.keys(t).length===0?null:n.jsx("div",{className:"max-h-72 overflow-y-auto px-3 py-2 bg-surface-sunken","data-testid":"run-outline",children:n.jsx(ur,{data:t})})}function Ss({workflowId:t,outcome:e,executionPath:r}){const s=e===L.FAILED?"text-status-error":"text-status-success",i=e===L.RUNNING?"Started":e===L.COMPLETED?"Completed":"Failed";return n.jsxs("p",{className:"flex items-center gap-1.5 text-xs min-w-0",role:"status","data-testid":"started-run",children:[n.jsx("span",{className:s,children:i}),e===L.RUNNING&&n.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent animate-pulse","aria-hidden":!0}),n.jsx("span",{className:"text-text-quaternary",children:"·"}),n.jsx("span",{className:"font-mono text-text-secondary truncate",children:t}),r&&n.jsxs(n.Fragment,{children:[n.jsx("span",{className:"text-text-quaternary",children:"·"}),n.jsx(lt,{to:r,className:"text-accent hover:underline shrink-0",children:"View workflow →"})]})]})}function Fs({payload:t}){return!t||Object.keys(t).length===0?null:n.jsx("div",{className:"mt-3 h-48 overflow-y-auto rounded-md border border-surface-border bg-surface-raised px-3 py-2","data-testid":"started-run-result",children:n.jsx(dr,{data:t,label:"Result"})})}const Ms="/workflows/executions",W={PAGE:"page",MODAL:"modal"};function he(t,e){const{realIsBuilder:r}=xr(),s=pr(),[i,o]=g.useState(null),[a,l]=g.useState([]),[c,u]=g.useState(null),d=g.useCallback(()=>{o(null),l([]),u(null),s.reset()},[s]);return{submit:g.useCallback(async(x,m)=>{o(null),l([]),u(null);const b={...m};e.certified&&(b.certified=!0);try{const f=await s.mutateAsync({workflowType:t.workflow_type,data:x,metadata:b,...e.overrideBot?{execute_as:e.overrideBot}:{}});u(f.workflowId)}catch(f){f instanceof fr&&Er(f.body)?(l(f.body.violations),o(f.body.error)):o(f instanceof Error?f.message:"Invocation failed")}},[s,e.certified,e.overrideBot,t.workflow_type]),reset:d,pending:s.isPending,error:i,violations:a,startedId:c,executionPath:c&&r?`${Ms}/${encodeURIComponent(c)}`:null}}function At(){const{connected:t}=mr();return t?null:n.jsxs("p",{className:"flex items-center gap-1.5 text-2xs text-status-warning","data-testid":"events-warning",children:[n.jsx(Qn,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),"Live events are off, so the result will not appear here.",n.jsx("button",{type:"button",onClick:()=>window.location.reload(),className:"text-accent hover:underline",children:"Reconnect events"})]})}const $s={[W.PAGE]:"sticky bottom-0 z-10 bg-surface border-t border-surface-border/40 pt-3 pb-16 -mb-16",[W.MODAL]:"border-t border-surface-border/40 pt-3"};function je({onSubmit:t,onSubmitAgain:e,pending:r,error:s,issueCount:i=0,onShowIssues:o,startedId:a,executionPath:l,host:c=W.PAGE}){const u=c===W.PAGE,d=wt(u?a??"":""),p=u&&a!==null;return n.jsxs("div",{className:$s[c],children:[n.jsxs("div",{className:"flex items-center justify-between gap-6 min-h-9",children:[n.jsxs("div",{className:"flex-1 min-w-0 flex flex-col gap-1",children:[n.jsx(At,{}),i>0&&o?n.jsxs("button",{type:"button",onClick:o,className:"flex items-center gap-1.5 text-xs text-status-error hover:underline","data-testid":"invoke-issues",children:[n.jsx(at,{className:"w-3.5 h-3.5",strokeWidth:1.5}),i," ",i===1?"issue":"issues"," to resolve"]}):s?n.jsx("p",{className:"text-xs text-status-error",role:"alert",children:s}):null,p&&n.jsx(Ss,{workflowId:a,outcome:d.outcome,executionPath:l})]}),n.jsx("div",{className:"shrink-0",children:p?n.jsx("button",{type:"button",onClick:e,className:"text-xs text-accent hover:underline","data-testid":"invoke-again",children:"Submit again"}):n.jsx("button",{type:"button",onClick:t,disabled:r,className:"btn-primary px-8 py-2","data-testid":"invoke-start",children:r?"Submitting…":"Submit"})})]}),p&&d.outcome!==L.RUNNING&&n.jsx(Fs,{payload:d.payload})]})}const et="invoke-help",Ps=380,q={INSTRUCTIONS:"instructions",ISSUES:"issues"};function Ds({view:t,onViewChange:e,onClose:r,helpMarkdown:s,errors:i,schema:o}){const a=[];s&&a.push({id:q.INSTRUCTIONS,icon:ne,label:"Instructions",content:n.jsx(Z,{content:s})}),a.push({id:q.ISSUES,icon:at,label:"Issues",content:n.jsx(le,{errors:i,schema:o})});const l=a.some(c=>c.id===t)?t:a[0].id;return n.jsx(br,{views:a,activeId:l,onViewChange:c=>e(c),onClose:r,stickyClassName:"h-full min-h-0",labelInline:!0})}function Ws({schema:t,context:e,errors:r,enabled:s=!0}){const i=gr(),o=s?i==null?void 0:i.setPanel:void 0,a=s?i==null?void 0:i.closePanel:void 0,l=(i==null?void 0:i.ownerKey)??null,c=(i==null?void 0:i.open)??!1,[u,d]=g.useState(null),p=g.useMemo(()=>sr(t,e),[t,e]),x=g.useCallback(()=>{d(null),a==null||a(et)},[a]);g.useEffect(()=>{!o||!u||o(n.jsx(Ds,{view:u,onViewChange:d,onClose:x,helpMarkdown:p,errors:r,schema:t}),{key:et,width:Ps})},[o,u,p,r,t,x]),g.useEffect(()=>{u&&c&&l&&l!==et&&d(null)},[u,c,l]);const m=g.useRef(a);return m.current=a,g.useEffect(()=>()=>{var b;(b=m.current)==null||b.call(m,et)},[]),{helpMarkdown:p,hasInstructions:!!p,open:u!==null,showInstructions:()=>d(q.INSTRUCTIONS),showIssues:()=>d(q.ISSUES),close:x}}function Us({selected:t,schema:e,metadata:r,lookup:s,submission:i,lead:o,prefill:a,host:l=W.PAGE}){const c=l===W.MODAL,[u,d]=g.useState(()=>Tt(e,a)),[p,x]=g.useState(!1),[m,b]=g.useState([]),[f,y]=g.useState(null),[h,k]=g.useState(null);g.useEffect(()=>{d(Tt(e,a)),x(!1),b([]),y(null),k(null),i.reset()},[t.workflow_type]);const j=g.useMemo(()=>({...ge(r,s),resolver:null}),[r,s]),N=g.useMemo(()=>{try{const C=JSON.parse(u);return{...j,resolver:C,input:C}}catch{return j}},[u,j]);g.useEffect(()=>{p&&b(Pt(u,j).errors)},[u,p,j]);const v=m.length>0?m:i.violations,A=Ws({schema:e,context:N,errors:v,enabled:!c}),O=c?()=>k(q.ISSUES):A.showIssues,S=c?()=>k(C=>C===q.INSTRUCTIONS?null:q.INSTRUCTIONS):A.showInstructions;g.useEffect(()=>{i.violations.length>0&&O()},[i.violations]);const P=()=>{x(!0);const C=Pt(u,j);if(C.parseError){y(C.parseError);return}if(y(null),C.errors.length>0){b(C.errors),O();return}b([]),i.submit(C.payload,r)},E=c&&h===q.ISSUES&&v.length>0,T=c&&h===q.INSTRUCTIONS&&A.helpMarkdown;return n.jsxs("div",{"data-testid":"rich-invoke-form",children:[n.jsxs("div",{className:"space-y-6 pb-6",children:[o,T&&n.jsx("div",{className:"px-4 py-3 bg-surface-hover","data-testid":"invoke-inline-help",children:n.jsx(Z,{content:A.helpMarkdown})}),n.jsx(ui,{value:u,onChange:d,submitAttempted:p,escalationContext:j,onOpenHelp:A.hasInstructions?S:void 0}),E&&n.jsx("div",{"data-testid":"invoke-inline-issues",children:n.jsx(le,{errors:v,schema:e})})]}),n.jsx(je,{onSubmitAgain:i.reset,onSubmit:P,pending:i.pending,error:f??i.error,issueCount:v.length,onShowIssues:O,startedId:i.startedId,executionPath:i.executionPath,host:l})]})}const Gt=`{
|
|
2
|
-
"data": {},
|
|
3
|
-
"metadata": {}
|
|
4
|
-
}`;function qs(t){return typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":t!==null&&typeof t=="object"?"object":"string"}function Ht(t){if(!t)return[];const e=t.data;return!e||typeof e!="object"?[]:Object.entries(e).map(([r,s])=>({key:r,type:qs(s),defaultValue:s}))}function dt(t){return{...t}}function Vt(t,e){return JSON.stringify({data:t,metadata:e},null,2)}function Js({selectedConfig:t,isJsonMode:e,hasFormView:r,jsonInput:s,formFields:i,dataFields:o,onJsonChange:a,onToggleMode:l,onUpdateFormField:c,onSetFormFields:u}){return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[n.jsx("label",{className:"block text-xs text-text-secondary",children:"Envelope"}),n.jsxs("div",{className:"flex items-center gap-3",children:[r&&n.jsx("button",{type:"button",onClick:l,className:"text-2xs text-accent hover:underline",children:e?"Form view":"JSON view"}),t.envelope_schema?n.jsx("span",{className:"text-2xs text-accent",children:"Pre-filled from workflow config"}):n.jsx("span",{className:"text-2xs text-status-warning",children:"No template"})]})]}),!t.envelope_schema&&n.jsx("div",{className:"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3",children:n.jsxs("p",{className:"text-xs text-text-secondary leading-relaxed",children:["This workflow has no input template. Edit the JSON directly below, or ",n.jsx(lt,{to:"/workflows/registry/new",className:"text-status-success hover:underline",children:"register it"})," in the Workflow Registry with an envelope schema for pre-filled fields and form-based input."]})}),e||!r?n.jsx("textarea",{value:s,onChange:d=>a(d.target.value),className:"input-json",rows:12,spellCheck:!1}):n.jsx("div",{className:"space-y-3",children:o.map(({key:d,type:p})=>{var f,y;const x=i[d],m=typeof x=="string"?x:JSON.stringify(x??(p==="array"?[]:{}),null,2),b=Math.min(20,Math.max(4,((y=(f=m==null?void 0:m.split)==null?void 0:f.call(m,`
|
|
5
|
-
`))==null?void 0:y.length)??4));return n.jsxs("div",{children:[n.jsxs("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[d,n.jsx("span",{className:"ml-2 font-normal normal-case",children:p})]}),p==="boolean"?n.jsxs("select",{value:String(x??!1),onChange:h=>c(d,h.target.value,p),className:"select text-xs w-full",children:[n.jsx("option",{value:"true",children:"true"}),n.jsx("option",{value:"false",children:"false"})]}):p==="object"||p==="array"?n.jsx("textarea",{value:m,onChange:h=>{try{c(d,JSON.parse(h.target.value),p)}catch{u({...i,[d]:h.target.value})}},className:"input-json w-full",rows:b,spellCheck:!1}):n.jsx("input",{type:p==="number"?"number":"text",value:String(x??""),onChange:h=>c(d,h.target.value,p),className:"input text-xs w-full"})]},d)})}),n.jsxs("p",{className:"text-2xs text-text-tertiary mt-1.5",children:["The envelope wraps your workflow input. ",n.jsx("code",{className:"text-accent/80",children:"data"})," holds workflow-specific fields; ",n.jsx("code",{className:"text-accent/80",children:"metadata"})," is optional context."]})]})}const Bt="lt:invoke:prefill";function Gs({selected:t,metadata:e,submission:r,lead:s,prefill:i,host:o=W.PAGE}){const[a,l]=g.useState(Gt),[c,u]=g.useState(""),[d,p]=g.useState({}),[x,m]=g.useState(!1),b=g.useMemo(()=>{const N=t.envelope_schema??null;if(!i||Object.keys(i).length===0)return N;const v=N==null?void 0:N.data,A={...v&&typeof v=="object"?v:{},...i};return{...N??{},data:A}},[t.envelope_schema,i]),f=g.useMemo(()=>Ht(b),[b]),y=f.length>0;g.useEffect(()=>{u(""),r.reset();const N=o===W.PAGE?sessionStorage.getItem(Bt):null;if(N){sessionStorage.removeItem(Bt),l(N);try{const A=JSON.parse(N),O=(A==null?void 0:A.data)??A;O&&typeof O=="object"&&p(dt(O))}catch{}m(!0);return}l(b?JSON.stringify(b,null,2):Gt);const v=b==null?void 0:b.data;p(v&&typeof v=="object"?dt(v):{}),m(!Ht(b).length)},[t.workflow_type]);const h=()=>{if(x)try{const N=JSON.parse(a);N.data&&typeof N.data=="object"&&p(dt(N.data))}catch{}else l(Vt(d,e));m(!x)},k=(N,v,A)=>{let O=v;A==="number"?O=v===""?0:Number(v):A==="boolean"&&(O=v==="true"||v===!0);const S={...d,[N]:O};p(S),l(Vt(S,e))},j=()=>{u("");let N;try{N=JSON.parse(a)}catch{u("Invalid JSON");return}const{data:v,metadata:A}=N;if(!v||typeof v!="object"){u('Envelope must include a "data" object');return}r.submit(v,A??{})};return n.jsxs("div",{children:[n.jsxs("div",{className:"space-y-6 pb-6",children:[s,n.jsx(Js,{selectedConfig:t,isJsonMode:x,hasFormView:y,jsonInput:a,formFields:d,dataFields:f,onJsonChange:N=>{l(N),u("")},onToggleMode:h,onUpdateFormField:k,onSetFormFields:p})]}),n.jsx(je,{onSubmitAgain:r.reset,onSubmit:j,pending:r.pending,error:c||r.error,startedId:r.startedId,executionPath:r.executionPath,host:o})]})}function Hs({workflow:t,workflowId:e,onDone:r,onRetry:s}){var c;const i=wt(e),o=i.outcome===L.FAILED,a=i.outcome===L.RUNNING,l=o&&typeof((c=i.payload)==null?void 0:c.error)=="string"?i.payload.error:null;return n.jsxs("div",{className:"flex flex-col gap-4","data-testid":"run-receipt","data-outcome":i.outcome,children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(kt,{icon:t.icon,tier:t.tier,className:"w-6 h-6 shrink-0 text-accent"}),n.jsx(be,{outcome:i.outcome,className:"text-sm"})]}),a&&n.jsx(At,{}),l&&n.jsx("p",{className:"text-xs text-status-error",role:"alert",children:l}),!a&&n.jsx(ye,{payload:l?void 0:i.payload}),n.jsxs("div",{className:"flex justify-end gap-2 pt-2 border-t border-surface-border/40",children:[o&&n.jsx("button",{type:"button",onClick:s,className:"btn-secondary text-xs","data-testid":"run-retry",children:"Try again"}),n.jsx("button",{type:"button",onClick:r,className:"btn-primary text-xs px-6","data-testid":"run-done",children:a||o?"Close":"Done"})]})]})}function Ne(t,e){var s;const r=(s=t.envelope_schema)==null?void 0:s.metadata;return{...r&&typeof r=="object"?r:{},...e}}function Vs({workflow:t,prefill:e,onClose:r}){const s=g.useMemo(()=>Ne(t,e.metadata),[t,e.metadata]),i=Array.isArray(t.input_lookups)&&t.input_lookups.length>0,{data:o}=yr(t.workflow_type,i),a=g.useMemo(()=>o?hr(o.lookups):void 0,[o]),l=(o==null?void 0:o.lookups.filter(p=>p.missing))??[],c=he(t,{certified:t.certified,overrideBot:""}),u=t.description?n.jsx(Z,{content:t.description,className:"text-xs text-text-secondary leading-relaxed"}):void 0,d=c.startedId!==null;return n.jsxs("div",{"data-testid":"invoke-modal",children:[d&&n.jsx(Hs,{workflow:t,workflowId:c.startedId,onDone:r,onRetry:c.reset}),n.jsxs("div",{hidden:d,children:[l.length>0&&n.jsxs("p",{className:"flex items-center gap-1.5 text-2xs text-status-warning mb-4","data-testid":"lookup-missing",children:[n.jsx(ee,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),l.map(Rs).join(", ")," ",l.length===1?"is":"are"," not available; the fields that read ",l.length===1?"it":"them"," fall back to plain inputs."]}),t.input_schema?n.jsx(Us,{selected:t,schema:t.input_schema,metadata:s,lookup:a,submission:c,lead:u,prefill:e.data,host:W.MODAL}):n.jsx(Gs,{selected:t,metadata:s,submission:c,lead:u,prefill:e.data,host:W.MODAL})]})]})}function Bs({open:t,onClose:e,workflow:r,prefill:s}){const i=n.jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[n.jsx(kt,{icon:r.icon,tier:r.tier,className:"w-4 h-4 shrink-0 text-accent"}),n.jsx("span",{className:"truncate",title:r.workflow_type,children:se(r.workflow_type)})]});return n.jsx(ie,{open:t,onClose:e,title:i,maxWidth:"max-w-2xl",closeOnBackdrop:!1,children:n.jsx(Vs,{workflow:r,prefill:s,onClose:e})})}const Xs={[Q.LINK]:"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors",[Q.BUTTON]:"btn-secondary inline-flex items-center gap-1.5 text-xs px-3 py-1.5"};function Ys({fieldKey:t,schema:e,escalationContext:r}){var u;const s=g.useMemo(()=>As(e),[e]),{data:i,isPending:o}=jr(),a=i==null?void 0:i.find(d=>d.workflow_type===(s==null?void 0:s.workflow)),l=(u=r==null?void 0:r.escalation)==null?void 0:u.status,c=l!==void 0&&l!==vr.PENDING;return!s||c?null:o?n.jsx("div",{className:"h-4 w-32 rounded bg-surface-hover animate-pulse","data-testid":`invoke-widget-${t}-loading`}):a?n.jsx(zs,{fieldKey:t,schema:e,config:s,workflow:a,escalationContext:r}):null}function zs({fieldKey:t,schema:e,config:r,workflow:s,escalationContext:i}){var E;const o=i,a=g.useMemo(()=>Es(r,o),[r,o]),l=g.useMemo(()=>Ne(s,a.metadata),[s,a.metadata]),c=he(s,{certified:s.certified,overrideBot:""}),u=wt(c.startedId??""),[d,p]=g.useState([]),[x,m]=g.useState(!1),[b,f]=g.useState(!1),y=(e==null?void 0:e.title)??se(s.workflow_type),h=e==null?void 0:e.description,k=r.icon?n.jsx(kt,{icon:s.icon,tier:s.tier,className:"w-3.5 h-3.5 shrink-0"}):null,j=()=>{m(!1),c.submit(a.data,l)},N=()=>{if(r.modal){f(!0);return}if(p([]),s.input_schema){const T=zr(s.input_schema,a.data,ge(l));if(T.length>0){p(T);return}}r.confirm?m(!0):j()},v=()=>{p([]),c.reset(),f(!0)},A=d.length>0?d:c.violations,O=c.startedId!==null,S=O&&u.outcome===L.RUNNING,P=O&&u.outcome===L.FAILED&&typeof((E=u.payload)==null?void 0:E.error)=="string"?u.payload.error:null;return n.jsxs("div",{"data-field-key":t,"data-testid":`invoke-widget-${t}`,children:[n.jsx(_,{children:y}),h&&n.jsx(M,{children:h}),n.jsxs("div",{className:"mt-1 flex flex-col gap-1.5",children:[O&&n.jsxs(n.Fragment,{children:[n.jsx(be,{outcome:u.outcome}),S&&n.jsx(At,{}),P&&n.jsx("p",{className:"text-2xs text-status-error",role:"alert",children:P}),!S&&n.jsx(ye,{payload:P?void 0:u.payload})]}),!S&&n.jsxs("button",{type:"button",onClick:N,disabled:c.pending,className:`self-start ${Xs[r.variant]}`,"data-testid":`invoke-control-${t}`,children:[k,c.pending?"Starting…":y]}),A.length>0&&n.jsxs("div",{className:"text-2xs",role:"alert","data-testid":`invoke-issues-${t}`,children:[n.jsx("ul",{className:"space-y-0.5 text-status-error",children:A.map(T=>n.jsxs("li",{className:"flex items-start gap-1.5",children:[n.jsx(at,{className:"w-3 h-3 mt-px shrink-0",strokeWidth:1.5}),n.jsxs("span",{children:[n.jsx("span",{className:"font-semibold",children:T.field})," · ",T.message]})]},T.field))}),n.jsx("button",{type:"button",onClick:v,className:"mt-1 text-accent hover:underline","data-testid":`invoke-open-form-${t}`,children:"Open form"})]}),A.length===0&&c.error&&n.jsx("p",{className:"text-2xs text-status-error",role:"alert",children:c.error})]}),r.confirm&&n.jsxs(ie,{open:x,onClose:()=>m(!1),title:y,children:[n.jsx("p",{className:"text-sm text-text-secondary mb-5",children:B(r.confirm,i??{})}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx("button",{type:"button",onClick:()=>m(!1),className:"btn-secondary text-xs",children:"Cancel"}),n.jsx("button",{type:"button",onClick:j,className:"btn-primary text-xs","data-testid":`invoke-confirm-${t}`,children:y})]})]}),n.jsx(Bs,{open:b,onClose:()=>f(!1),workflow:s,prefill:a})]})}const rt={"file-upload":ts,"code-editor":es,signature:ns,"rich-text":rs,markdown:ss,checklist:os,attachment:Dt,image:Dt,link:cs,escalation:xs,"escalation-list":hs,invoke:Ys},ve="textarea",ke="json";function Ks(t){return t in rt||t===ve||t===ke}function Xt(t,e=""){if(!t||typeof t!="object"||Array.isArray(t))return[];const r=t,s=[],i=r["x-lt-widget"];typeof i=="string"&&e&&!Ks(i)&&s.push({path:e,widget:i});const o=r.properties;if(o&&typeof o=="object"&&!Array.isArray(o))for(const[a,l]of Object.entries(o))s.push(...Xt(l,e?`${e}.${a}`:a));return r.items&&s.push(...Xt(r.items,e)),s}const Zs=new Set(["string","number","integer","boolean","array","object"]);function Qs(t,e){const r=t==null?void 0:t.type;if(typeof r=="string"&&Zs.has(r))return r;if(e==null)return"null";if(Array.isArray(e))return"array";const s=typeof e;return s==="number"||s==="boolean"||s==="string"?s:"object"}const ut="dictionary",ti=new Set(["markdown","attachment","image"]);function we(t,e){if(!e)return;const r=t==null?void 0:t["x-lt-section-options"],s=r==null?void 0:r[e];return s&&typeof s=="object"?s:void 0}function ei(t,e,r){var l,c;const s=(l=t==null?void 0:t.properties)==null?void 0:l[r];if((s==null?void 0:s.readOnly)!==!0)return!1;const i=s==null?void 0:s["x-lt-widget"];if(typeof i=="string"&&ti.has(i))return!1;const o=s==null?void 0:s["x-lt-display"];if(typeof o=="string")return o===ut;const a=(c=we(t,e))==null?void 0:c.display;return typeof a=="string"?a===ut:(t==null?void 0:t["x-lt-display"])===ut}function ni(t,e,r,s){var o;const i=[];for(const a of t){const[l]=a,c=i[i.length-1];if(ei(e,r,l)){(c==null?void 0:c.kind)==="dictionary"?c.entries.push(a):i.push({kind:"dictionary",entries:[a]});continue}const u=(o=e==null?void 0:e.properties)==null?void 0:o[l],d=u==null?void 0:u["x-lt-column-group"];if(s==="two-column"&&typeof d=="string"&&d.trim()){(c==null?void 0:c.kind)==="column-group"&&c.name===d?c.entries.push(a):i.push({kind:"column-group",name:d,entries:[a]});continue}i.push({kind:"field",entry:a})}return i}function ri({value:t,options:e,nullable:r,fieldKey:s,label:i,helperText:o,isRequired:a,error:l,onBlur:c,ids:u,ariaProps:d,onChange:p}){const x=t==null||t===""?"":String(t),m=e.some(b=>String(b.value)===x);return n.jsxs("div",{children:[n.jsx(_,{isRequired:a,htmlFor:u.field,children:i}),o&&n.jsx(M,{id:u.help,children:o}),n.jsxs("select",{value:m?x:"",disabled:e.length===0,onChange:b=>{const f=e.find(y=>String(y.value)===b.target.value);p(f?f.value:null),c==null||c()},onBlur:c,"data-field-key":s,className:Qr(!!l),...d,children:[(!m||r)&&n.jsx("option",{value:"",disabled:!r,children:"Choose…"}),e.map(b=>n.jsx("option",{value:String(b.value),children:b.label},String(b.value)))]}),n.jsx(D,{error:l,id:u.error})]})}function si({value:t,options:e,fieldKey:r,label:s,helperText:i,isRequired:o,error:a,onBlur:l,ids:c,ariaProps:u,onChange:d}){const p=new Set(Array.isArray(t)?t:[]),x=m=>{const b=new Set(p);b.has(m)?b.delete(m):b.add(m),d(e.filter(f=>b.has(f.value)).map(f=>f.value)),l==null||l()};return n.jsxs("div",{role:"group","aria-label":s,"aria-required":o||void 0,"aria-invalid":a?!0:void 0,"aria-describedby":u["aria-describedby"],children:[n.jsx(_,{isRequired:o,children:s}),i&&n.jsx(M,{id:c.help,children:i}),e.length===0?n.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"No options yet"}):n.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:e.map((m,b)=>{const f=p.has(m.value);return n.jsxs("label",{className:`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${f?"bg-accent border-accent text-text-inverse":a?"bg-surface-field border-status-error/60 text-status-error":"bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary"}`,children:[n.jsx("input",{type:"checkbox",checked:f,onChange:()=>x(m.value),className:"sr-only","data-testid":`multi-select-${r}-${String(m.value)}`,...b===0?{"data-field-key":r,id:c.field}:{}}),f&&n.jsx(Qt,{className:"w-3.5 h-3.5 shrink-0",strokeWidth:2.5}),m.label]},String(m.value))})}),n.jsx(D,{error:a,id:c.error})]})}function Yt(t){return typeof t=="string"?t:t==null?"":JSON.stringify(t,null,2)}function zt(t){try{return{ok:!0,value:JSON.parse(t)}}catch{return{ok:!1}}}function ii({value:t,fieldKey:e,label:r,helperText:s,isRequired:i,error:o,onBlur:a,ids:l,ariaProps:c,onChange:u}){const[d,p]=g.useState(()=>Yt(t));g.useEffect(()=>{if(typeof t=="string"){t!==d&&p(t);return}const m=zt(d);!(m.ok&&JSON.stringify(m.value)===JSON.stringify(t??null))&&!(d.trim()===""&&t===null)&&p(Yt(t))},[t]);const x=d.split(`
|
|
6
|
-
`).length;return n.jsxs("div",{children:[n.jsx(_,{isRequired:i,htmlFor:l.field,children:r}),s&&n.jsx(M,{id:l.help,children:s}),n.jsx("textarea",{value:d,onChange:m=>{const b=m.target.value;if(p(b),b.trim()===""){u(null);return}const f=zt(b);u(f.ok?f.value:b)},onBlur:a,spellCheck:!1,"data-field-key":e,rows:Math.min(14,Math.max(4,x)),className:`${Y(!!o)} font-mono text-xs leading-relaxed`,...c}),n.jsx(D,{error:o,id:l.error})]})}function oi({fieldKey:t,label:e,values:r,fieldSchema:s,helperText:i,isRequired:o,error:a,ids:l,notice:c,context:u,onChange:d}){const p=X(s),x=p?Sr(s,u):null,m=(p==null?void 0:p.prompt)??i,b=f=>d(r.filter((y,h)=>h!==f));return n.jsxs("div",{"data-field-key":t,tabIndex:p?-1:void 0,className:"outline-none",children:[n.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[n.jsx(_,{isRequired:o,children:e}),x!==null&&n.jsxs("span",{className:"text-2xs tabular-nums text-text-tertiary","data-testid":"list-field-count",children:[r.length," of ",x]})]}),i&&(r.length>0||!p)&&n.jsx(M,{id:l.help,children:i}),r.length===0&&p?n.jsx("p",{id:l.help,className:"text-xs text-text-tertiary mt-1 italic","data-testid":"list-field-empty",children:m??"Scan to add"}):n.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:r.map((f,y)=>n.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-2xs font-mono bg-surface-sunken rounded text-text-secondary",children:[String(f),p&&n.jsx("button",{type:"button",onClick:()=>b(y),className:"-mr-1 p-0.5 rounded text-text-quaternary hover:text-status-error hover:bg-surface-hover","aria-label":`Remove ${String(f)}`,"data-testid":"list-field-remove",children:n.jsx(tr,{className:"w-3 h-3",strokeWidth:2})})]},y))}),n.jsx(D,{error:a,id:l.error}),n.jsx(ae,{notice:c})]})}const Kt={date:"date","date-time":"datetime-local",email:"email",uri:"url"},ai={date:"max-w-48","date-time":"max-w-64"};function Ae({fieldKey:t,value:e,onChange:r,onBlur:s,schema:i,isRequired:o,isReadOnly:a,error:l,escalationContext:c,submitAttempted:u}){var P;const d=(P=i==null?void 0:i.properties)==null?void 0:P[t],p=wr(t),x=J(t,d),m=d==null?void 0:d["x-lt-widget"],b=Qs(d,e),f=`lt-field-${t}`,y={field:f,help:`${f}-help`,error:`${f}-error`},h=typeof(d==null?void 0:d.description)=="string"&&d.description.length>0?d.description:void 0,k={id:f,"aria-required":o||void 0,"aria-invalid":l?!0:void 0,"aria-describedby":l?y.error:h?y.help:void 0},j={fieldKey:t,label:x,helperText:h,isRequired:o,error:l,onBlur:s,ids:y,ariaProps:k,onChange:r},N=m==="markdown"&&typeof e=="string",v=(m==="attachment"||m==="image")&&typeof e=="string",A=!!(m&&m in rt);if(a&&!N&&!v&&!A){const E=e===null?"null":typeof e=="object"?JSON.stringify(e,null,2):String(e);return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,children:x}),n.jsx("p",{className:"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap",children:E})]})}if(m===ke&&(b==="array"||b==="object"))return n.jsx(ii,{...j,value:e});if(m&&m in rt){const E=rt[m],T=o||(d==null?void 0:d["x-lt-require-all"])===!0,C={fieldKey:t,schema:d,escalationContext:c,isRequired:T,submitAttempted:u,error:l};if((d==null?void 0:d.type)==="object"){const $=typeof e=="string"?e:typeof e=="object"&&e!==null&&!Array.isArray(e)?JSON.stringify(e):"";return n.jsx(E,{...C,value:$,onChange:V=>{try{r(JSON.parse(V))}catch{r(V)}}})}if(typeof e=="string")return n.jsx(E,{...C,value:e,onChange:$=>r($)});if(typeof e=="object"&&e!==null&&!Array.isArray(e))return n.jsx(E,{...C,value:JSON.stringify(e),onChange:$=>{try{r(JSON.parse($))}catch{r($)}}})}const O=yt(d,c);if(b==="array"){if(O!==void 0&&(d==null?void 0:d["x-lt-options"])!==void 0)return n.jsx(si,{...j,value:e,options:O})}else if(O!==void 0&&b!=="object")return n.jsx(ri,{...j,value:e,options:O,nullable:(d==null?void 0:d["x-lt-nullable"])===!0});switch(b){case"boolean":return n.jsxs("div",{children:[n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:e===!0,onChange:E=>{r(E.target.checked),s==null||s()},className:"w-3.5 h-3.5 rounded accent-accent","data-field-key":t,...k}),n.jsxs("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[x,o&&n.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})]}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx(D,{error:l,id:y.error})]});case"number":case"integer":return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,htmlFor:f,children:x}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx("input",{type:"number",value:typeof e=="number"||typeof e=="string"?e:"",onChange:E=>r(parseFloat(E.target.value)||0),onBlur:s,step:"any","data-field-key":t,className:`${Y(!!l)} max-w-48`,...k}),n.jsx(D,{error:l,id:y.error})]});case"string":return S(typeof e=="string"?e:e==null?"":String(e));case"array":return!Array.isArray(e)&&!(e==null&&X(d))?S(e==null?"":String(e)):n.jsx(oi,{fieldKey:t,label:x,values:Array.isArray(e)?e:[],fieldSchema:d,helperText:h,isRequired:o,error:l,ids:y,notice:p,context:c,onChange:r});case"object":{if(typeof e!="object"||e===null||Array.isArray(e))return S(e==null?"":String(e));const E=Object.entries(e);return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,children:x}),n.jsx("div",{className:"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3",children:E.map(([T,C])=>n.jsx(Ae,{fieldKey:T,value:C,onChange:$=>r({...e,[T]:$})},T))})]})}default:return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,children:x}),n.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"null"})]})}function S(E){const T=d==null?void 0:d.format;if(T==="password")return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,htmlFor:f,children:x}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx("input",{type:"password",value:E,onChange:C=>r(C.target.value),onBlur:s,"data-field-key":t,className:Y(!!l),autoComplete:"off",...k}),n.jsx(D,{error:l,id:y.error})]});if(T&&T in Kt)return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,htmlFor:f,children:x}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx("input",{type:Kt[T],value:E,onChange:C=>r(C.target.value),onBlur:s,"data-field-key":t,className:`${Y(!!l)} ${ai[T]??""}`,...k}),n.jsx(D,{error:l,id:y.error})]});if(T==="textarea"||m===ve||E.includes(`
|
|
7
|
-
`)||E.length>80){const C=d==null?void 0:d.maxLength,$=d==null?void 0:d["x-lt-max-length"],V=$?Number(z($,c)):NaN,U=C??(Number.isFinite(V)?V:void 0),ct=U!==void 0&&E.length>U;return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,htmlFor:f,children:x}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx("textarea",{value:E,onChange:tt=>{r(tt.target.value),s==null||s()},onBlur:s,"data-field-key":t,className:`${Y(!!l)} leading-relaxed`,rows:Math.min(6,Math.max(3,Math.ceil(E.length/60))),...k}),U!==void 0&&n.jsxs("p",{className:`text-2xs mt-0.5 text-right tabular-nums ${ct?"text-status-error font-medium":"text-text-quaternary"}`,children:[E.length," / ",U]}),n.jsx(D,{error:l,id:y.error})]})}return n.jsxs("div",{children:[n.jsx(_,{isRequired:o,htmlFor:f,children:x}),h&&n.jsx(M,{id:y.help,children:h}),n.jsx("input",{type:"text",value:E,onChange:C=>r(C.target.value),onBlur:s,"data-field-key":t,className:Y(!!l),...k}),n.jsx(D,{error:l,id:y.error}),n.jsx(ae,{notice:p})]})}}function li({items:t,columns:e=1}){if(t.length===0)return null;const r=e>=2&&t.length>1?"grid-cols-1 @dict-inline:grid-cols-[max-content_1fr] @dict-pairs:grid-cols-[max-content_1fr_max-content_1fr]":"grid-cols-1 @dict-inline:grid-cols-[max-content_1fr]";return n.jsx("div",{className:"@container",children:n.jsx("dl",{className:`grid ${r} items-baseline gap-x-6 @dict-pairs:gap-x-8 gap-y-1.5`,children:t.map(({key:s,label:i,value:o})=>n.jsxs(g.Fragment,{children:[n.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-wide text-text-secondary mt-2 first:mt-0 @dict-inline:mt-0",children:i}),n.jsx("dd",{className:"text-sm text-text-primary break-words whitespace-pre-wrap min-w-0","data-field-key":s,children:ci(o)})]},s))})})}function ci(t){return t==null||t===""?"—":typeof t=="boolean"?t?"Yes":"No":typeof t=="object"?JSON.stringify(t):String(t)}function di({name:t,entries:e,formSchema:r,layout:s,renderField:i}){const o=ni(e,r,t,s),a=we(r,t),l=(a==null?void 0:a.columns)??(s==="two-column"?2:1),c=d=>d.map(([p,x])=>{var m;return{key:p,label:J(p,(m=r==null?void 0:r.properties)==null?void 0:m[p]),value:x}}),u=()=>o.map((d,p)=>d.kind==="dictionary"?n.jsx("div",{className:s==="two-column"?"col-span-full":"",children:n.jsx(li,{items:c(d.entries),columns:l})},`dict-${p}`):d.kind==="column-group"?n.jsx("div",{className:"@container",children:n.jsx("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 gap-x-4 gap-y-5",children:d.entries.map(x=>i(x))})},`group-${d.name}-${p}`):i(d.entry));return n.jsxs("div",{className:t?"border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4 animate-[section-enter_0.25s_ease-out]":"",children:[t&&n.jsx("p",{className:"mb-4 text-[1.40625rem] font-semibold tracking-wider text-heading [font-variant-caps:small-caps]",children:t}),s==="two-column"?n.jsx("div",{className:"@container",children:n.jsx("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-x-col-gap gap-y-5",children:u()})}):n.jsx("div",{className:"space-y-5",children:u()})]})}function ui({value:t,onChange:e,disabled:r,submitAttempted:s,escalationContext:i,onOpenHelp:o,onDisabledClick:a,disabledHint:l}){var Et,It;const[c,u]=g.useState({}),[d,p]=g.useState({}),[x,m]=g.useState(null),[b,f]=g.useState(!1),[y,h]=g.useState(new Set);g.useEffect(()=>{try{const w=JSON.parse(t);if(typeof w=="object"&&w!==null&&!Array.isArray(w)){const R={},I={};for(const[F,G]of Object.entries(w))F.startsWith("_")||F.startsWith("$")?I[F]=G:R[F]=G;u(R),p(I),m(I._form_schema&&typeof I._form_schema=="object"?I._form_schema:null),f(!1)}}catch{f(!0)}},[t]);const k=g.useCallback(w=>{u(w),e(JSON.stringify({...w,...d},null,2))},[d,e]),j=g.useCallback((w,R)=>{k({...c,[w]:R})},[c,k]),N=g.useCallback(w=>{h(R=>{if(R.has(w))return R;const I=new Set(R);return I.add(w),I})},[]);if(b)return n.jsx("p",{className:"text-xs text-status-error",children:"Unable to parse resolver data as form. Use the JSON editor below."});const v=Object.entries(c);if(v.length===0)return n.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No resolver fields defined."});const A=x==null?void 0:x["x-lt-order"],O=A?[...v].sort((w,R)=>{const I=A.indexOf(w[0]),F=A.indexOf(R[0]);return(I===-1?1/0:I)-(F===-1?1/0:F)}):v,S={...i??{},resolver:c,input:c},P=O.filter(([w,R])=>{var F;const I=(F=x==null?void 0:x.properties)==null?void 0:F[w];return K(I==null?void 0:I["x-lt-showIf"],S)?!Jr(I,R):!1}),E=new Set((x==null?void 0:x.required)??[]),T=x==null?void 0:x["x-lt-layout"],C=x==null?void 0:x.title,$=x==null?void 0:x.description,V=typeof(x==null?void 0:x["x-lt-help"])=="string"||typeof(x==null?void 0:x["x-lt-context"])=="string",U=[];for(const w of P){const[R]=w,I=(Et=x==null?void 0:x.properties)==null?void 0:Et[R],F=((It=I==null?void 0:I["x-lt-section"])==null?void 0:It.trim())||null,G=U[U.length-1];!G||G.name!==F?U.push({name:F,entries:[w]}):G.entries.push(w)}const ct=([w,R])=>{var Ot;const I=(Ot=x==null?void 0:x.properties)==null?void 0:Ot[w],F=(I==null?void 0:I.readOnly)===!0,G=(I==null?void 0:I["x-lt-span"])??1,Ct=E.has(w),Ee=y.has(w)||!!s,Ie=pe(R,I,Ct,Ee,S);return n.jsx("div",{className:`animate-[field-enter_0.2s_ease-out] ${T==="two-column"&&G>=2?"col-span-full":""}`,children:n.jsx(Ae,{fieldKey:w,value:R,onChange:Ce=>j(w,Ce),onBlur:()=>N(w),schema:x,isRequired:Ct,isReadOnly:F,error:Ie,escalationContext:S,submitAttempted:!!s})},w)},tt=n.jsxs("div",{className:r?"pointer-events-none":void 0,inert:r||void 0,"aria-disabled":r||void 0,children:[C&&n.jsxs("div",{className:"mb-1 flex items-center gap-1.5",children:[n.jsx("h3",{className:"heading-3",children:C}),V&&o&&n.jsx("button",{type:"button",onClick:o,title:"Open instructions","aria-label":"Open instructions",className:"p-1 rounded-md text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors",children:n.jsx(ne,{className:"w-4 h-4",strokeWidth:1.5})})]}),$&&n.jsx("p",{className:"text-sm text-text-secondary leading-relaxed mb-6",children:$}),n.jsx("div",{className:"space-y-8",children:U.map((w,R)=>n.jsx(di,{name:w.name,entries:w.entries,formSchema:x,layout:T,renderField:ct},w.name??`__s${R}`))})]});return r?n.jsx(Zr,{hint:l,onLockedClick:a,children:tt}):n.jsx("div",{className:"pb-8 max-w-form",children:tt})}export{le as E,ji as F,Gs as L,ui as R,kt as W,Ni as a,Pt as b,Tt as c,J as d,Us as e,ge as f,Ai as g,_s as h,Er as i,Xt as j,Rs as l,vi as p,gs as r,wi as s,he as u,fe as v,ki as w};
|
|
8
|
-
//# sourceMappingURL=ResolverForm-CKIOAGtY.js.map
|