@hotmeshio/long-tail 0.10.2 → 0.10.4
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/README.md +1 -0
- package/build/api/bot-accounts.d.ts +4 -0
- package/build/api/bot-accounts.js +3 -1
- package/build/api/escalations/metadata.js +21 -1
- package/build/api/escalations/resolve.d.ts +8 -0
- package/build/api/escalations/resolve.js +82 -3
- package/build/api/roles.d.ts +2 -0
- package/build/api/roles.js +4 -0
- package/build/bin/ltc.js +10 -1
- package/build/index.js +7 -1
- package/build/lib/cli/client.d.ts +4 -1
- package/build/lib/cli/client.js +4 -2
- package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
- package/build/lib/typed-resolution.d.ts +35 -0
- package/build/lib/typed-resolution.js +37 -0
- package/build/modules/branding.d.ts +21 -2
- package/build/modules/branding.js +22 -1
- package/build/modules/config.d.ts +1 -0
- package/build/modules/config.js +5 -0
- package/build/routes/bot-accounts.js +3 -1
- package/build/routes/settings.js +21 -0
- package/build/sdk/index.d.ts +4 -0
- package/build/sdk/index.js +14 -0
- package/build/services/escalation/crud.d.ts +18 -6
- package/build/services/escalation/crud.js +18 -2
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +1 -0
- package/build/services/escalation/resolver-validation.d.ts +28 -0
- package/build/services/escalation/resolver-validation.js +95 -0
- package/build/services/escalation/sql.d.ts +12 -2
- package/build/services/escalation/sql.js +22 -2
- package/build/services/iam/bots.d.ts +4 -1
- package/build/services/iam/bots.js +5 -3
- package/build/services/iam/sql.d.ts +2 -2
- package/build/services/iam/sql.js +15 -1
- package/build/services/role/enforcement-cache.d.ts +21 -0
- package/build/services/role/enforcement-cache.js +0 -0
- package/build/services/role/index.js +5 -0
- package/build/services/role/sql.d.ts +12 -2
- package/build/services/role/sql.js +15 -2
- package/build/services/role/types.d.ts +9 -0
- package/build/shared/form-validation/derive-field-label.d.ts +14 -0
- package/build/shared/form-validation/derive-field-label.js +31 -0
- package/build/shared/form-validation/field-validator.d.ts +45 -0
- package/build/shared/form-validation/field-validator.js +214 -0
- package/build/shared/form-validation/index.d.ts +12 -0
- package/build/shared/form-validation/index.js +28 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
- package/build/shared/form-validation/validate-resolver-payload.js +62 -0
- package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
- package/build/shared/form-validation/x-lt-bind.js +110 -0
- package/build/shared/form-validation/x-lt-help.d.ts +21 -0
- package/build/shared/form-validation/x-lt-help.js +91 -0
- package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
- package/build/shared/form-validation/x-lt-show-if.js +84 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
- package/build/system/mcp-servers/admin/schemas.js +1 -0
- package/build/system/mcp-servers/admin/users.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
- package/build/system/mcp-servers/human-queue-schemas.js +4 -1
- package/build/system/mcp-servers/human-queue.js +41 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/sdk.d.ts +6 -1
- package/build/types/startup.d.ts +26 -0
- package/build/types/validation.d.ts +43 -0
- package/build/types/validation.js +28 -0
- package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-Cma2NGsF.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js.map → AdminDashboard-Cma2NGsF.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +2 -0
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js → BotPicker-CidlGr6f.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js.map → BotPicker-CidlGr6f.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-W9F9lziT.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js.map → CollapsibleSection-W9F9lziT.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-BUh-Dzba.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-C0x0HcHX.js.map → ConfirmDeleteModal-BUh-Dzba.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-uot2mE_g.js → CopyableId-B1mxKfVb.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-uot2mE_g.js.map → CopyableId-B1mxKfVb.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-lkv_7msa.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-DyOgfnPB.js} +2 -2
- package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
- package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-geum95dj.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js.map → CronLabel-geum95dj.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +1 -0
- package/dashboard/dist/assets/DataTable-BTu2AaEl.js +2 -0
- package/dashboard/dist/assets/DataTable-BTu2AaEl.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js → DropZone-C3hOjJtC.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3hOjJtC.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DFOW9T4b.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js.map → ElapsedCell-DFOW9T4b.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js +20 -0
- package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js.map +1 -0
- package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js +9 -0
- package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js.map +1 -0
- package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js +2 -0
- package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js.map +1 -0
- package/dashboard/dist/assets/EventTable-DJWJ7J0m.js +2 -0
- package/dashboard/dist/assets/EventTable-DJWJ7J0m.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js +2 -0
- package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js.map +1 -0
- package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js +2 -0
- package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js.map +1 -0
- package/dashboard/dist/assets/HomePage-D8RVntg0.js +2 -0
- package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js +2 -0
- package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js.map +1 -0
- package/dashboard/dist/assets/McpOverview-NXKsGiWU.js +2 -0
- package/dashboard/dist/assets/McpOverview-NXKsGiWU.js.map +1 -0
- package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js → McpQueryPage-BPJmFYOY.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js.map +1 -0
- package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js +2 -0
- package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js.map +1 -0
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +2 -0
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DpXjhs-3.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-_axS17fp.js.map → OperatorDashboard-DpXjhs-3.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DvEmMMP6.js +2 -0
- package/dashboard/dist/assets/PageHeader-DvEmMMP6.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js.map +1 -0
- package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js → PriorityBadge-CCERr9vQ.js} +2 -2
- package/dashboard/dist/assets/PriorityBadge-CCERr9vQ.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js.map +1 -0
- package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js.map → ProcessesListPage-CQ9tSw7U.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js.map +1 -0
- package/dashboard/dist/assets/RolePill-CWhoLwef.js +2 -0
- package/dashboard/dist/assets/RolePill-CWhoLwef.js.map +1 -0
- package/dashboard/dist/assets/RolesPage-D-6kIact.js +2 -0
- package/dashboard/dist/assets/RolesPage-D-6kIact.js.map +1 -0
- package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js.map +1 -0
- package/dashboard/dist/assets/StatCard-DBANWIss.js +2 -0
- package/dashboard/dist/assets/StatCard-DBANWIss.js.map +1 -0
- package/dashboard/dist/assets/StatusBadge-BbqghFMi.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BbqghFMi.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js → StickyPagination-BTGfmGV3.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js.map → StickyPagination-BTGfmGV3.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js +2 -0
- package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js.map +1 -0
- package/dashboard/dist/assets/TagInput-CoR4MzsW.js +2 -0
- package/dashboard/dist/assets/TagInput-CoR4MzsW.js.map +1 -0
- package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js.map → TaskDetailPage-BRg-w2Ev.js.map} +1 -1
- package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js +2 -0
- package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js.map +1 -0
- package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js → TasksListPage-kB_j9G8o.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-D7dSIY7-.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js.map → TimeAgo-D7dSIY7-.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-BZe6bx18.js +2 -0
- package/dashboard/dist/assets/TimestampCell-BZe6bx18.js.map +1 -0
- package/dashboard/dist/assets/ToolPill-xX-buQtY.js +2 -0
- package/dashboard/dist/assets/ToolPill-xX-buQtY.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-Cy3chaca.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-VXM1oHMC.js} +2 -2
- package/dashboard/dist/assets/{UserName-DcXhOSVm.js.map → UserName-VXM1oHMC.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js.map → WorkflowsDashboard-BbM69MnB.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js +2 -0
- package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js.map +1 -0
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js.map → YamlWorkflowDetailPage-CDDVMYWi.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js.map +1 -0
- package/dashboard/dist/assets/{agents-CopQ3t5o.js → agents-BwiSNu73.js} +2 -2
- package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-BwiSNu73.js.map} +1 -1
- package/dashboard/dist/assets/bots-ClgSrxel.js +2 -0
- package/dashboard/dist/assets/bots-ClgSrxel.js.map +1 -0
- package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-JUaKsby4.js} +2 -2
- package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-JUaKsby4.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-CuTQ7eUE.js} +2 -2
- package/dashboard/dist/assets/{controlplane-B4rT6tIw.js.map → controlplane-CuTQ7eUE.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +2 -0
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +1 -0
- package/dashboard/dist/assets/index-BBA4AxmL.js +2 -0
- package/dashboard/dist/assets/index-BBA4AxmL.js.map +1 -0
- package/dashboard/dist/assets/index-C-8xXyvr.js +63 -0
- package/dashboard/dist/assets/index-C-8xXyvr.js.map +1 -0
- package/dashboard/dist/assets/index-C1t0YIXC.js +5 -0
- package/dashboard/dist/assets/index-C1t0YIXC.js.map +1 -0
- package/dashboard/dist/assets/index-C9o2UNhC.js +2 -0
- package/dashboard/dist/assets/index-C9o2UNhC.js.map +1 -0
- package/dashboard/dist/assets/index-CBj-vstO.js +2 -0
- package/dashboard/dist/assets/{index-Dd1RxGNw.js.map → index-CBj-vstO.js.map} +1 -1
- package/dashboard/dist/assets/index-CUguKMXZ.js +2 -0
- package/dashboard/dist/assets/index-CUguKMXZ.js.map +1 -0
- package/dashboard/dist/assets/index-Cavwd8UU.js +6 -0
- package/dashboard/dist/assets/index-Cavwd8UU.js.map +1 -0
- package/dashboard/dist/assets/index-CnsPBTXL.js +2 -0
- package/dashboard/dist/assets/index-CnsPBTXL.js.map +1 -0
- package/dashboard/dist/assets/index-CoPWHo_H.js +2 -0
- package/dashboard/dist/assets/index-CoPWHo_H.js.map +1 -0
- package/dashboard/dist/assets/index-CwQVaa7x.js +2 -0
- package/dashboard/dist/assets/index-CwQVaa7x.js.map +1 -0
- package/dashboard/dist/assets/index-DSa-6Ux8.js +2 -0
- package/dashboard/dist/assets/index-DSa-6Ux8.js.map +1 -0
- package/dashboard/dist/assets/index-DeMs_aBT.css +1 -0
- package/dashboard/dist/assets/index-Ikj_NTuy.js +5 -0
- package/dashboard/dist/assets/index-Ikj_NTuy.js.map +1 -0
- package/dashboard/dist/assets/index-Xd1jcHe7.js +2 -0
- package/dashboard/dist/assets/index-Xd1jcHe7.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-B9bmoXOe.js → knowledge-BHBt-6kW.js} +2 -2
- package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-BHBt-6kW.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-CBcz4BCS.js} +2 -2
- package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-CBcz4BCS.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-C4fKTOYo.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CmAAH3B6.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DBXX6TEi.js.map → pipelines-CmAAH3B6.js.map} +1 -1
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js +2 -0
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +1 -0
- package/dashboard/dist/assets/task-queues-7-sHKPsN.js +2 -0
- package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
- package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BAEsqcz2.js} +2 -2
- package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BAEsqcz2.js.map} +1 -1
- package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-CY0pJ6_o.js} +2 -2
- package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-CY0pJ6_o.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-BlpwRvHO.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CoNUlZ6Z.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
- package/dashboard/dist/assets/{users-mI9goDjj.js → users-uGtDRGxR.js} +2 -2
- package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-uGtDRGxR.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-DKCAtTJ9.js} +135 -130
- package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-DoX-AtHN.js} +2 -2
- package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-DoX-AtHN.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-DM3jVem2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +15 -1
- package/docs/api/http/roles.md +2 -0
- package/docs/design-principles.md +234 -0
- package/docs/hitl/design.md +228 -0
- package/docs/hitl/form.md +21 -1
- package/docs/hitl/iframe.md +1 -1
- package/docs/hitl/x-lt-display.md +56 -0
- package/docs/hitl/x-lt-layout.md +20 -1
- package/docs/hitl/x-lt-list-schema.md +8 -1
- package/docs/hitl/x-lt-widget.md +23 -0
- package/docs/hitl-guide.md +4 -2
- package/docs/schema-enforcement.md +149 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-CHczRx5N.js +0 -2
- package/dashboard/dist/assets/AgentsPage-CHczRx5N.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-lQJGZ_-t.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-TXsRlTU4.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-BKxS-1sA.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js.map +0 -1
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js +0 -2
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +0 -1
- package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js +0 -20
- package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js.map +0 -1
- package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js +0 -9
- package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js.map +0 -1
- package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js.map +0 -1
- package/dashboard/dist/assets/EventTable-DBV1P2ME.js +0 -2
- package/dashboard/dist/assets/EventTable-DBV1P2ME.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js +0 -2
- package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js +0 -2
- package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
- package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
- package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js +0 -2
- package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js.map +0 -1
- package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js +0 -2
- package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js.map +0 -1
- package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js +0 -2
- package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js +0 -2
- package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js.map +0 -1
- package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
- package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
- package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
- package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js.map +0 -1
- package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js +0 -2
- package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js +0 -2
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +0 -1
- package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js +0 -2
- package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js +0 -2
- package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js.map +0 -1
- package/dashboard/dist/assets/TagInput-C2gi47M8.js +0 -2
- package/dashboard/dist/assets/TagInput-C2gi47M8.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js +0 -2
- package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-DGOsba-A.js +0 -2
- package/dashboard/dist/assets/TimestampCell-DGOsba-A.js.map +0 -1
- package/dashboard/dist/assets/ToolPill-D74TkYB-.js +0 -2
- package/dashboard/dist/assets/ToolPill-D74TkYB-.js.map +0 -1
- package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-5yW63ELl.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js.map +0 -1
- package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
- package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
- package/dashboard/dist/assets/index-B68A3v-S.js +0 -2
- package/dashboard/dist/assets/index-B68A3v-S.js.map +0 -1
- package/dashboard/dist/assets/index-BAi89Xpm.js +0 -2
- package/dashboard/dist/assets/index-BAi89Xpm.js.map +0 -1
- package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
- package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
- package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
- package/dashboard/dist/assets/index-BOJMUk4F.js.map +0 -1
- package/dashboard/dist/assets/index-BrgYykPV.js +0 -2
- package/dashboard/dist/assets/index-BrgYykPV.js.map +0 -1
- package/dashboard/dist/assets/index-BxgtIqvl.js +0 -2
- package/dashboard/dist/assets/index-BxgtIqvl.js.map +0 -1
- package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
- package/dashboard/dist/assets/index-CDHDoHYz.js +0 -6
- package/dashboard/dist/assets/index-CDHDoHYz.js.map +0 -1
- package/dashboard/dist/assets/index-CUZJHXew.js +0 -2
- package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
- package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
- package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
- package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
- package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
- package/dashboard/dist/assets/index-Dd1RxGNw.js +0 -2
- package/dashboard/dist/assets/index-iOb3sGsC.js +0 -5
- package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
- package/dashboard/dist/assets/index-mcAkQblr.js +0 -2
- package/dashboard/dist/assets/index-mcAkQblr.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-ihWGa7_d.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface FieldError {
|
|
2
|
+
field: string;
|
|
3
|
+
message: string;
|
|
4
|
+
}
|
|
5
|
+
interface ChecklistItem {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a checklist widget's item definitions from its `x-lt-source`
|
|
12
|
+
* "domain.path" against the escalation context. Missing domain/path or a
|
|
13
|
+
* non-array value yields an empty list.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveChecklistItems(sourcePath: unknown, ctx: Record<string, unknown> | undefined): ChecklistItem[];
|
|
16
|
+
/**
|
|
17
|
+
* The checklist completion guard (`x-lt-require-all`): every rendered item must
|
|
18
|
+
* be checked, except items whose definition carries `required: false` (the
|
|
19
|
+
* explicit opt-out). Vacuous when the source resolves to no items — never
|
|
20
|
+
* blocks on zero. Returns the panel message, or undefined when satisfied.
|
|
21
|
+
* Stricter than (and composes with) the field-level required-array entry,
|
|
22
|
+
* which remains the at-least-one check.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateRequireAll(value: unknown, fieldSchema: Record<string, unknown> | undefined, ctx?: Record<string, unknown>): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Runtime type check against the field's declared JSON Schema `type`. Guards
|
|
27
|
+
* the payload contract for API-first callers (a form widget already produces
|
|
28
|
+
* the right primitive; a script or agent submitting `"1"` for a number field
|
|
29
|
+
* does not). Absent/empty values pass — presence is the required check's job.
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateFieldType(value: unknown, fieldSchema: Record<string, unknown> | undefined): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Per-field JSON Schema validation — subset used by the resolver form.
|
|
34
|
+
*
|
|
35
|
+
* Returns a human-readable error string when the value fails a constraint,
|
|
36
|
+
* or undefined when the value is valid. Callers are responsible for the
|
|
37
|
+
* required check (empty-when-required) before calling this for constraint checks.
|
|
38
|
+
*
|
|
39
|
+
* `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic
|
|
40
|
+
* constraint paths like `x-lt-minimum: "envelope.min_score"`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateFieldConstraints(value: unknown, fieldSchema: Record<string, unknown> | undefined, ctx?: Record<string, unknown>): string | undefined;
|
|
43
|
+
/** Full field error including required check then constraints. */
|
|
44
|
+
export declare function validateField(value: unknown, fieldSchema: Record<string, unknown> | undefined, isRequired: boolean, isTouched: boolean, ctx?: Record<string, unknown>): string | undefined;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveChecklistItems = resolveChecklistItems;
|
|
4
|
+
exports.validateRequireAll = validateRequireAll;
|
|
5
|
+
exports.validateFieldType = validateFieldType;
|
|
6
|
+
exports.validateFieldConstraints = validateFieldConstraints;
|
|
7
|
+
exports.validateField = validateField;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve a checklist widget's item definitions from its `x-lt-source`
|
|
10
|
+
* "domain.path" against the escalation context. Missing domain/path or a
|
|
11
|
+
* non-array value yields an empty list.
|
|
12
|
+
*/
|
|
13
|
+
function resolveChecklistItems(sourcePath, ctx) {
|
|
14
|
+
if (typeof sourcePath !== 'string' || !ctx)
|
|
15
|
+
return [];
|
|
16
|
+
const dot = sourcePath.indexOf('.');
|
|
17
|
+
if (dot === -1)
|
|
18
|
+
return [];
|
|
19
|
+
const domainObj = ctx[sourcePath.slice(0, dot)];
|
|
20
|
+
if (!domainObj || typeof domainObj !== 'object')
|
|
21
|
+
return [];
|
|
22
|
+
let cur = domainObj;
|
|
23
|
+
for (const p of sourcePath.slice(dot + 1).split('.')) {
|
|
24
|
+
cur = cur[p];
|
|
25
|
+
if (cur === undefined)
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return Array.isArray(cur) ? cur : [];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The checklist completion guard (`x-lt-require-all`): every rendered item must
|
|
32
|
+
* be checked, except items whose definition carries `required: false` (the
|
|
33
|
+
* explicit opt-out). Vacuous when the source resolves to no items — never
|
|
34
|
+
* blocks on zero. Returns the panel message, or undefined when satisfied.
|
|
35
|
+
* Stricter than (and composes with) the field-level required-array entry,
|
|
36
|
+
* which remains the at-least-one check.
|
|
37
|
+
*/
|
|
38
|
+
function validateRequireAll(value, fieldSchema, ctx) {
|
|
39
|
+
if (fieldSchema?.['x-lt-widget'] !== 'checklist')
|
|
40
|
+
return undefined;
|
|
41
|
+
if (fieldSchema['x-lt-require-all'] !== true)
|
|
42
|
+
return undefined;
|
|
43
|
+
const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);
|
|
44
|
+
const mandatory = items.filter((i) => i.required !== false);
|
|
45
|
+
if (mandatory.length === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
const state = (typeof value === 'object' && value !== null && !Array.isArray(value))
|
|
48
|
+
? value
|
|
49
|
+
: {};
|
|
50
|
+
const incomplete = mandatory.filter((i) => !state[i.id]).length;
|
|
51
|
+
if (incomplete === 0)
|
|
52
|
+
return undefined;
|
|
53
|
+
return `${incomplete} of ${mandatory.length} checks incomplete`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Runtime type check against the field's declared JSON Schema `type`. Guards
|
|
57
|
+
* the payload contract for API-first callers (a form widget already produces
|
|
58
|
+
* the right primitive; a script or agent submitting `"1"` for a number field
|
|
59
|
+
* does not). Absent/empty values pass — presence is the required check's job.
|
|
60
|
+
*/
|
|
61
|
+
function validateFieldType(value, fieldSchema) {
|
|
62
|
+
const declared = fieldSchema?.type;
|
|
63
|
+
if (typeof declared !== 'string')
|
|
64
|
+
return undefined;
|
|
65
|
+
if (value === undefined || value === null || value === '')
|
|
66
|
+
return undefined;
|
|
67
|
+
switch (declared) {
|
|
68
|
+
case 'string':
|
|
69
|
+
return typeof value === 'string' ? undefined : 'Expected text';
|
|
70
|
+
case 'number':
|
|
71
|
+
return typeof value === 'number' && Number.isFinite(value) ? undefined : 'Expected a number';
|
|
72
|
+
case 'integer':
|
|
73
|
+
return typeof value === 'number' && Number.isInteger(value) ? undefined : 'Expected a whole number';
|
|
74
|
+
case 'boolean':
|
|
75
|
+
return typeof value === 'boolean' ? undefined : 'Expected true or false';
|
|
76
|
+
case 'array':
|
|
77
|
+
return Array.isArray(value) ? undefined : 'Expected a list';
|
|
78
|
+
case 'object':
|
|
79
|
+
return typeof value === 'object' && !Array.isArray(value) ? undefined : 'Expected an object';
|
|
80
|
+
default:
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Per-field JSON Schema validation — subset used by the resolver form.
|
|
86
|
+
*
|
|
87
|
+
* Returns a human-readable error string when the value fails a constraint,
|
|
88
|
+
* or undefined when the value is valid. Callers are responsible for the
|
|
89
|
+
* required check (empty-when-required) before calling this for constraint checks.
|
|
90
|
+
*
|
|
91
|
+
* `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic
|
|
92
|
+
* constraint paths like `x-lt-minimum: "envelope.min_score"`.
|
|
93
|
+
*/
|
|
94
|
+
function validateFieldConstraints(value, fieldSchema, ctx) {
|
|
95
|
+
if (!fieldSchema)
|
|
96
|
+
return undefined;
|
|
97
|
+
// Enum membership — the form's select widget constrains choices; API-first
|
|
98
|
+
// callers are unconstrained, so the schema's enum is the contract.
|
|
99
|
+
const allowed = fieldSchema.enum;
|
|
100
|
+
if (Array.isArray(allowed) && allowed.length > 0
|
|
101
|
+
&& value !== undefined && value !== null && value !== ''
|
|
102
|
+
&& !allowed.includes(value)) {
|
|
103
|
+
return `Must be one of: ${allowed.map((v) => String(v)).join(', ')}`;
|
|
104
|
+
}
|
|
105
|
+
if (typeof value === 'string') {
|
|
106
|
+
const s = value.trim();
|
|
107
|
+
if (s === '')
|
|
108
|
+
return undefined; // empty string: required check is the caller's job
|
|
109
|
+
const minLength = resolveNumericConstraint(fieldSchema.minLength, fieldSchema['x-lt-min-length'], ctx);
|
|
110
|
+
if (minLength !== undefined && s.length < minLength) {
|
|
111
|
+
return `Minimum ${minLength} character${minLength === 1 ? '' : 's'}`;
|
|
112
|
+
}
|
|
113
|
+
const maxLength = resolveNumericConstraint(fieldSchema.maxLength, fieldSchema['x-lt-max-length'], ctx);
|
|
114
|
+
if (maxLength !== undefined && s.length > maxLength) {
|
|
115
|
+
return `Maximum ${maxLength} characters (${s.length} entered)`;
|
|
116
|
+
}
|
|
117
|
+
const pattern = fieldSchema.pattern;
|
|
118
|
+
if (pattern) {
|
|
119
|
+
try {
|
|
120
|
+
if (!new RegExp(pattern).test(s)) {
|
|
121
|
+
const patternError = fieldSchema['x-lt-pattern-error'];
|
|
122
|
+
return patternError ?? 'Invalid format';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Malformed pattern in schema — silently skip
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const fmt = fieldSchema.format;
|
|
130
|
+
if (fmt === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s)) {
|
|
131
|
+
return 'Enter a valid email address';
|
|
132
|
+
}
|
|
133
|
+
if (fmt === 'uri' && !/^https?:\/\/.+/.test(s)) {
|
|
134
|
+
return 'Enter a valid URL';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (typeof value === 'number') {
|
|
138
|
+
const minimum = resolveNumericConstraint(fieldSchema.minimum, fieldSchema['x-lt-minimum'], ctx);
|
|
139
|
+
const exclusiveMinimum = resolveNumericConstraint(fieldSchema.exclusiveMinimum, undefined, ctx);
|
|
140
|
+
const maximum = resolveNumericConstraint(fieldSchema.maximum, fieldSchema['x-lt-maximum'], ctx);
|
|
141
|
+
const exclusiveMaximum = resolveNumericConstraint(fieldSchema.exclusiveMaximum, undefined, ctx);
|
|
142
|
+
if (minimum !== undefined && value < minimum) {
|
|
143
|
+
return `Minimum value is ${minimum}`;
|
|
144
|
+
}
|
|
145
|
+
if (exclusiveMinimum !== undefined && value <= exclusiveMinimum) {
|
|
146
|
+
return `Must be greater than ${exclusiveMinimum}`;
|
|
147
|
+
}
|
|
148
|
+
if (maximum !== undefined && value > maximum) {
|
|
149
|
+
return `Maximum value is ${maximum}`;
|
|
150
|
+
}
|
|
151
|
+
if (exclusiveMaximum !== undefined && value >= exclusiveMaximum) {
|
|
152
|
+
return `Must be less than ${exclusiveMaximum}`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
function resolveNumericConstraint(staticVal, dynamicPath, ctx) {
|
|
158
|
+
if (typeof staticVal === 'number')
|
|
159
|
+
return staticVal;
|
|
160
|
+
if (typeof dynamicPath === 'string' && ctx) {
|
|
161
|
+
const dot = dynamicPath.indexOf('.');
|
|
162
|
+
if (dot !== -1) {
|
|
163
|
+
const domain = dynamicPath.slice(0, dot);
|
|
164
|
+
const path = dynamicPath.slice(dot + 1);
|
|
165
|
+
const domainObj = ctx[domain];
|
|
166
|
+
if (domainObj && typeof domainObj === 'object') {
|
|
167
|
+
const parts = path.split('.');
|
|
168
|
+
let cur = domainObj;
|
|
169
|
+
for (const p of parts) {
|
|
170
|
+
cur = cur[p];
|
|
171
|
+
if (cur === undefined)
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
if (typeof cur === 'number')
|
|
175
|
+
return cur;
|
|
176
|
+
if (typeof cur === 'string') {
|
|
177
|
+
const n = Number(cur);
|
|
178
|
+
if (!Number.isNaN(n))
|
|
179
|
+
return n;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
/** Full field error including required check then constraints. */
|
|
187
|
+
function validateField(value, fieldSchema, isRequired, isTouched, ctx) {
|
|
188
|
+
if (!isTouched)
|
|
189
|
+
return undefined;
|
|
190
|
+
if (isRequired) {
|
|
191
|
+
if (value === undefined || value === null)
|
|
192
|
+
return 'Required';
|
|
193
|
+
if (typeof value === 'boolean' && !value)
|
|
194
|
+
return 'Required';
|
|
195
|
+
if (typeof value === 'string' && value.trim() === '')
|
|
196
|
+
return 'Required';
|
|
197
|
+
if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
|
|
198
|
+
const vals = Object.values(value);
|
|
199
|
+
if (vals.length === 0 || vals.every((v) => !v))
|
|
200
|
+
return 'Required';
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Declared-type check runs before constraints: a mis-typed value would make
|
|
204
|
+
// the numeric/string constraint branches silently inapplicable.
|
|
205
|
+
const typeError = validateFieldType(value, fieldSchema);
|
|
206
|
+
if (typeError)
|
|
207
|
+
return typeError;
|
|
208
|
+
// Checklist completion — the stricter guard runs regardless of the
|
|
209
|
+
// required-array entry (which stays at-least-one when present).
|
|
210
|
+
const requireAll = validateRequireAll(value, fieldSchema, ctx);
|
|
211
|
+
if (requireAll)
|
|
212
|
+
return requireAll;
|
|
213
|
+
return validateFieldConstraints(value, fieldSchema, ctx);
|
|
214
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isomorphic form-validation library for the x-lt-* enriched form_schema
|
|
3
|
+
* vocabulary. The dashboard renders and pre-validates resolver forms with it;
|
|
4
|
+
* the API layer enforces the same contract on every resolve surface. Pure
|
|
5
|
+
* functions only — no React, no DOM, no database.
|
|
6
|
+
*/
|
|
7
|
+
export * from './derive-field-label';
|
|
8
|
+
export * from './x-lt-bind';
|
|
9
|
+
export * from './x-lt-help';
|
|
10
|
+
export * from './x-lt-show-if';
|
|
11
|
+
export * from './field-validator';
|
|
12
|
+
export * from './validate-resolver-payload';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Isomorphic form-validation library for the x-lt-* enriched form_schema
|
|
19
|
+
* vocabulary. The dashboard renders and pre-validates resolver forms with it;
|
|
20
|
+
* the API layer enforces the same contract on every resolve surface. Pure
|
|
21
|
+
* functions only — no React, no DOM, no database.
|
|
22
|
+
*/
|
|
23
|
+
__exportStar(require("./derive-field-label"), exports);
|
|
24
|
+
__exportStar(require("./x-lt-bind"), exports);
|
|
25
|
+
__exportStar(require("./x-lt-help"), exports);
|
|
26
|
+
__exportStar(require("./x-lt-show-if"), exports);
|
|
27
|
+
__exportStar(require("./field-validator"), exports);
|
|
28
|
+
__exportStar(require("./validate-resolver-payload"), exports);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The full pre-submission validation pass over a resolver form schema — the
|
|
3
|
+
* same pass on both sides of the wire. The dashboard runs it on the flat form
|
|
4
|
+
* values before submitting; the API layer runs it on the submitted (bound,
|
|
5
|
+
* nested) payload by inverting x-lt-bind first. Because both entry points
|
|
6
|
+
* funnel into one loop, a payload that passes the client panel passes the
|
|
7
|
+
* server gate, and a 422's violation list is exactly what the panel shows.
|
|
8
|
+
*
|
|
9
|
+
* Semantics per field:
|
|
10
|
+
* - x-lt-showIf-hidden fields are skipped entirely (a field the submitter
|
|
11
|
+
* cannot see never blocks submission)
|
|
12
|
+
* - required (schema.required membership), with checklist/empty-object rules
|
|
13
|
+
* - declared-type check (string/number/integer/boolean/array/object)
|
|
14
|
+
* - enum membership
|
|
15
|
+
* - x-lt-require-all against the checklist items resolved from context
|
|
16
|
+
* - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
|
|
17
|
+
*
|
|
18
|
+
* The showIf/`resolver.*` domain is always the FLAT form representation, so a
|
|
19
|
+
* condition like `resolver.approved` reads the same on both sides.
|
|
20
|
+
*/
|
|
21
|
+
import { type FieldError } from './field-validator';
|
|
22
|
+
import { type ShowIfContext } from './x-lt-show-if';
|
|
23
|
+
export type { FieldError } from './field-validator';
|
|
24
|
+
/**
|
|
25
|
+
* The escalation-surface context the pass evaluates showIf conditions and
|
|
26
|
+
* dynamic constraints against. `resolver` is supplied by the pass itself
|
|
27
|
+
* (the flat form values under validation) — callers provide the rest.
|
|
28
|
+
*/
|
|
29
|
+
export type ResolverValidationContext = Omit<ShowIfContext, 'resolver'>;
|
|
30
|
+
/**
|
|
31
|
+
* Validate FLAT form values against the form schema. This is the dashboard's
|
|
32
|
+
* entry point (the values the user edits, keyed by field name).
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateResolverForm(schema: Record<string, unknown> | null | undefined, formValues: Record<string, unknown>, ctx?: ResolverValidationContext | null): FieldError[];
|
|
35
|
+
/**
|
|
36
|
+
* Validate a SUBMITTED resolver payload (the bound, nested shape the workflow
|
|
37
|
+
* consumes) against the form schema. This is the API layer's entry point: the
|
|
38
|
+
* payload is inverted through each field's x-lt-bind path back to the flat
|
|
39
|
+
* form representation, then run through the same pass the client uses.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateResolverPayload(schema: Record<string, unknown> | null | undefined, payload: Record<string, unknown>, ctx?: ResolverValidationContext | null): FieldError[];
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateResolverForm = validateResolverForm;
|
|
4
|
+
exports.validateResolverPayload = validateResolverPayload;
|
|
5
|
+
/**
|
|
6
|
+
* The full pre-submission validation pass over a resolver form schema — the
|
|
7
|
+
* same pass on both sides of the wire. The dashboard runs it on the flat form
|
|
8
|
+
* values before submitting; the API layer runs it on the submitted (bound,
|
|
9
|
+
* nested) payload by inverting x-lt-bind first. Because both entry points
|
|
10
|
+
* funnel into one loop, a payload that passes the client panel passes the
|
|
11
|
+
* server gate, and a 422's violation list is exactly what the panel shows.
|
|
12
|
+
*
|
|
13
|
+
* Semantics per field:
|
|
14
|
+
* - x-lt-showIf-hidden fields are skipped entirely (a field the submitter
|
|
15
|
+
* cannot see never blocks submission)
|
|
16
|
+
* - required (schema.required membership), with checklist/empty-object rules
|
|
17
|
+
* - declared-type check (string/number/integer/boolean/array/object)
|
|
18
|
+
* - enum membership
|
|
19
|
+
* - x-lt-require-all against the checklist items resolved from context
|
|
20
|
+
* - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
|
|
21
|
+
*
|
|
22
|
+
* The showIf/`resolver.*` domain is always the FLAT form representation, so a
|
|
23
|
+
* condition like `resolver.approved` reads the same on both sides.
|
|
24
|
+
*/
|
|
25
|
+
const field_validator_1 = require("./field-validator");
|
|
26
|
+
const x_lt_show_if_1 = require("./x-lt-show-if");
|
|
27
|
+
const x_lt_bind_1 = require("./x-lt-bind");
|
|
28
|
+
/**
|
|
29
|
+
* Validate FLAT form values against the form schema. This is the dashboard's
|
|
30
|
+
* entry point (the values the user edits, keyed by field name).
|
|
31
|
+
*/
|
|
32
|
+
function validateResolverForm(schema, formValues, ctx) {
|
|
33
|
+
if (!schema)
|
|
34
|
+
return [];
|
|
35
|
+
const properties = (schema.properties ?? {});
|
|
36
|
+
const required = new Set(schema.required ?? []);
|
|
37
|
+
const liveCtx = {
|
|
38
|
+
...(ctx ?? {}),
|
|
39
|
+
resolver: formValues,
|
|
40
|
+
};
|
|
41
|
+
const errors = [];
|
|
42
|
+
for (const [field, fieldSchema] of Object.entries(properties)) {
|
|
43
|
+
if (!(0, x_lt_show_if_1.evaluateShowIf)(fieldSchema['x-lt-showIf'], liveCtx))
|
|
44
|
+
continue;
|
|
45
|
+
const err = (0, field_validator_1.validateField)(formValues[field], fieldSchema, required.has(field), true, liveCtx);
|
|
46
|
+
if (err)
|
|
47
|
+
errors.push({ field, message: err });
|
|
48
|
+
}
|
|
49
|
+
return errors;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validate a SUBMITTED resolver payload (the bound, nested shape the workflow
|
|
53
|
+
* consumes) against the form schema. This is the API layer's entry point: the
|
|
54
|
+
* payload is inverted through each field's x-lt-bind path back to the flat
|
|
55
|
+
* form representation, then run through the same pass the client uses.
|
|
56
|
+
*/
|
|
57
|
+
function validateResolverPayload(schema, payload, ctx) {
|
|
58
|
+
if (!schema)
|
|
59
|
+
return [];
|
|
60
|
+
const formValues = (0, x_lt_bind_1.mapPayloadToForm)(payload, schema);
|
|
61
|
+
return validateResolverForm(schema, formValues, ctx);
|
|
62
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-bind — maps the escalation FORM (flat field values the user edits) to and
|
|
3
|
+
* from the PAYLOAD (the nested JSON the workflow consumes). A form_schema property
|
|
4
|
+
* may declare `x-lt-bind: "a.b[0].c"`, the path its value occupies in the payload;
|
|
5
|
+
* a property with no bind sits at its own name at the root (1:1). This module is
|
|
6
|
+
* isomorphic — the dashboard renders forms with it, and the API layer inverts a
|
|
7
|
+
* submitted payload through it to validate against the form contract. One
|
|
8
|
+
* implementation, both sides.
|
|
9
|
+
*
|
|
10
|
+
* mapPayloadToForm — payload → flat form values, to PREFILL/display the form
|
|
11
|
+
* (server-side: to validate a submitted payload)
|
|
12
|
+
* mapFormToPayload — flat form values → payload, the shape submitted/stored
|
|
13
|
+
*/
|
|
14
|
+
type PathSeg = {
|
|
15
|
+
key: string;
|
|
16
|
+
} | {
|
|
17
|
+
index: number;
|
|
18
|
+
};
|
|
19
|
+
/** Parse a bind path — dot keys with optional `[n]` indices. Rejects pollution keys. */
|
|
20
|
+
export declare function parsePath(path: string): PathSeg[];
|
|
21
|
+
/** Set `value` at `path` inside `root`, creating intermediate objects/arrays. */
|
|
22
|
+
export declare function setDeep(root: Record<string, any>, path: string, value: unknown): void;
|
|
23
|
+
/** Read the value at `path` inside `root` (undefined if any segment is missing). */
|
|
24
|
+
export declare function getDeep(root: unknown, path: string): unknown;
|
|
25
|
+
/** The bind path for a form property (its `x-lt-bind`, or the property name). */
|
|
26
|
+
export declare function bindPathFor(propName: string, propDef: Record<string, any> | undefined): string;
|
|
27
|
+
/**
|
|
28
|
+
* Assemble the payload from the form's flat values. A field absent from
|
|
29
|
+
* `formValues` is omitted (so clearing/deleting a field drops it from the
|
|
30
|
+
* payload). Unknown keys not declared in the schema are dropped. With no schema
|
|
31
|
+
* properties, values pass through unchanged.
|
|
32
|
+
*/
|
|
33
|
+
export declare function mapFormToPayload(formValues: Record<string, any>, formSchema: Record<string, any> | null | undefined): Record<string, any>;
|
|
34
|
+
/**
|
|
35
|
+
* Reverse of {@link mapFormToPayload}: pull each form field's value out of the
|
|
36
|
+
* payload via its bind path, to prefill/display the form. A field whose bound
|
|
37
|
+
* path is missing from the payload is omitted (the caller falls back to the
|
|
38
|
+
* schema default).
|
|
39
|
+
*/
|
|
40
|
+
export declare function mapPayloadToForm(payload: Record<string, any> | null | undefined, formSchema: Record<string, any> | null | undefined): Record<string, any>;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* x-lt-bind — maps the escalation FORM (flat field values the user edits) to and
|
|
4
|
+
* from the PAYLOAD (the nested JSON the workflow consumes). A form_schema property
|
|
5
|
+
* may declare `x-lt-bind: "a.b[0].c"`, the path its value occupies in the payload;
|
|
6
|
+
* a property with no bind sits at its own name at the root (1:1). This module is
|
|
7
|
+
* isomorphic — the dashboard renders forms with it, and the API layer inverts a
|
|
8
|
+
* submitted payload through it to validate against the form contract. One
|
|
9
|
+
* implementation, both sides.
|
|
10
|
+
*
|
|
11
|
+
* mapPayloadToForm — payload → flat form values, to PREFILL/display the form
|
|
12
|
+
* (server-side: to validate a submitted payload)
|
|
13
|
+
* mapFormToPayload — flat form values → payload, the shape submitted/stored
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.parsePath = parsePath;
|
|
17
|
+
exports.setDeep = setDeep;
|
|
18
|
+
exports.getDeep = getDeep;
|
|
19
|
+
exports.bindPathFor = bindPathFor;
|
|
20
|
+
exports.mapFormToPayload = mapFormToPayload;
|
|
21
|
+
exports.mapPayloadToForm = mapPayloadToForm;
|
|
22
|
+
const BLOCKED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
23
|
+
/** Parse a bind path — dot keys with optional `[n]` indices. Rejects pollution keys. */
|
|
24
|
+
function parsePath(path) {
|
|
25
|
+
const segs = [];
|
|
26
|
+
for (const raw of path.split('.')) {
|
|
27
|
+
const m = raw.match(/^([^[\]]*)((?:\[\d+\])*)$/);
|
|
28
|
+
if (!m)
|
|
29
|
+
throw new Error(`invalid x-lt-bind path segment: "${raw}"`);
|
|
30
|
+
const [, name, brackets] = m;
|
|
31
|
+
if (name) {
|
|
32
|
+
if (BLOCKED_KEYS.has(name))
|
|
33
|
+
throw new Error(`x-lt-bind path may not target "${name}"`);
|
|
34
|
+
segs.push({ key: name });
|
|
35
|
+
}
|
|
36
|
+
for (const b of brackets.match(/\d+/g) ?? [])
|
|
37
|
+
segs.push({ index: Number(b) });
|
|
38
|
+
}
|
|
39
|
+
if (segs.length === 0)
|
|
40
|
+
throw new Error(`empty x-lt-bind path: "${path}"`);
|
|
41
|
+
return segs;
|
|
42
|
+
}
|
|
43
|
+
/** Set `value` at `path` inside `root`, creating intermediate objects/arrays. */
|
|
44
|
+
function setDeep(root, path, value) {
|
|
45
|
+
const segs = parsePath(path);
|
|
46
|
+
let node = root;
|
|
47
|
+
for (let i = 0; i < segs.length - 1; i++) {
|
|
48
|
+
const seg = segs[i];
|
|
49
|
+
const next = segs[i + 1];
|
|
50
|
+
const childKey = 'key' in seg ? seg.key : seg.index;
|
|
51
|
+
const wantArray = 'index' in next;
|
|
52
|
+
if (node[childKey] == null || typeof node[childKey] !== 'object') {
|
|
53
|
+
node[childKey] = wantArray ? [] : {};
|
|
54
|
+
}
|
|
55
|
+
node = node[childKey];
|
|
56
|
+
}
|
|
57
|
+
const last = segs[segs.length - 1];
|
|
58
|
+
node['key' in last ? last.key : last.index] = value;
|
|
59
|
+
}
|
|
60
|
+
/** Read the value at `path` inside `root` (undefined if any segment is missing). */
|
|
61
|
+
function getDeep(root, path) {
|
|
62
|
+
let node = root;
|
|
63
|
+
for (const seg of parsePath(path)) {
|
|
64
|
+
if (node == null || typeof node !== 'object')
|
|
65
|
+
return undefined;
|
|
66
|
+
node = node['key' in seg ? seg.key : seg.index];
|
|
67
|
+
}
|
|
68
|
+
return node;
|
|
69
|
+
}
|
|
70
|
+
/** The bind path for a form property (its `x-lt-bind`, or the property name). */
|
|
71
|
+
function bindPathFor(propName, propDef) {
|
|
72
|
+
const bind = propDef?.['x-lt-bind'];
|
|
73
|
+
return typeof bind === 'string' && bind.length > 0 ? bind : propName;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Assemble the payload from the form's flat values. A field absent from
|
|
77
|
+
* `formValues` is omitted (so clearing/deleting a field drops it from the
|
|
78
|
+
* payload). Unknown keys not declared in the schema are dropped. With no schema
|
|
79
|
+
* properties, values pass through unchanged.
|
|
80
|
+
*/
|
|
81
|
+
function mapFormToPayload(formValues, formSchema) {
|
|
82
|
+
const props = formSchema?.properties;
|
|
83
|
+
if (!props)
|
|
84
|
+
return { ...formValues };
|
|
85
|
+
const payload = {};
|
|
86
|
+
for (const [name, def] of Object.entries(props)) {
|
|
87
|
+
if (!(name in formValues))
|
|
88
|
+
continue;
|
|
89
|
+
setDeep(payload, bindPathFor(name, def), formValues[name]);
|
|
90
|
+
}
|
|
91
|
+
return payload;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Reverse of {@link mapFormToPayload}: pull each form field's value out of the
|
|
95
|
+
* payload via its bind path, to prefill/display the form. A field whose bound
|
|
96
|
+
* path is missing from the payload is omitted (the caller falls back to the
|
|
97
|
+
* schema default).
|
|
98
|
+
*/
|
|
99
|
+
function mapPayloadToForm(payload, formSchema) {
|
|
100
|
+
const props = formSchema?.properties;
|
|
101
|
+
if (!props)
|
|
102
|
+
return payload ? { ...payload } : {};
|
|
103
|
+
const form = {};
|
|
104
|
+
for (const [name, def] of Object.entries(props)) {
|
|
105
|
+
const v = getDeep(payload, bindPathFor(name, def));
|
|
106
|
+
if (v !== undefined)
|
|
107
|
+
form[name] = v;
|
|
108
|
+
}
|
|
109
|
+
return form;
|
|
110
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The token domains a help template may reference. */
|
|
2
|
+
export declare const HELP_DOMAINS: readonly ["escalation", "metadata", "envelope", "payload", "resolver"];
|
|
3
|
+
export type HelpDomain = (typeof HELP_DOMAINS)[number];
|
|
4
|
+
export type HelpTokenContext = Partial<Record<HelpDomain, Record<string, unknown> | null>>;
|
|
5
|
+
/** Replace every `{{domain.path}}` token with its value from the context. */
|
|
6
|
+
export declare function interpolateHelp(template: string, ctx: HelpTokenContext): string;
|
|
7
|
+
/** The schema's help source: `x-lt-help` first, `x-lt-context` as fallback. */
|
|
8
|
+
export declare function resolveHelpSource(schema: Record<string, unknown> | null | undefined): string | null;
|
|
9
|
+
/** The schema's help content, interpolated. Null when the schema declares none. */
|
|
10
|
+
export declare function buildHelpMarkdown(schema: Record<string, unknown> | null | undefined, ctx: HelpTokenContext): string | null;
|
|
11
|
+
export interface HelpStateHint {
|
|
12
|
+
isTerminal: boolean;
|
|
13
|
+
status?: string;
|
|
14
|
+
claimed: boolean;
|
|
15
|
+
claimedByMe: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* State-aware guidance shown when the schema carries no help content — the
|
|
19
|
+
* panel always tells the user what this page expects of them right now.
|
|
20
|
+
*/
|
|
21
|
+
export declare function defaultHelpMarkdown({ isTerminal, status, claimed, claimedByMe }: HelpStateHint): string;
|