@hotmeshio/long-tail 0.14.3 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -9
- package/build/api/escalations/create.js +18 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +3 -1
- package/build/api/escalations/lookups.d.ts +20 -0
- package/build/api/escalations/lookups.js +90 -0
- package/build/api/escalations/metadata.d.ts +1 -1
- package/build/api/escalations/metadata.js +4 -4
- package/build/api/escalations/resolve.d.ts +1 -1
- package/build/api/escalations/resolve.js +6 -6
- package/build/api/knowledge.d.ts +9 -0
- package/build/api/knowledge.js +24 -0
- package/build/bin/ltc.js +10 -0
- package/build/index.d.ts +1 -1
- package/build/index.js +3 -2
- package/build/lib/cli/commands/escalations.d.ts +3 -0
- package/build/lib/cli/commands/escalations.js +25 -0
- package/build/lib/cli/commands/knowledge.d.ts +5 -0
- package/build/lib/cli/commands/knowledge.js +17 -2
- package/build/lib/cli/scanner.js +2 -0
- package/build/lib/db/schemas/033_knowledge_versions.sql +33 -0
- package/build/routes/escalations/single.js +10 -0
- package/build/routes/knowledge.js +35 -2
- package/build/sdk/index.d.ts +5 -0
- package/build/sdk/index.js +3 -0
- package/build/services/diagnostics/patterns.js +1 -1
- package/build/services/escalation/crud.d.ts +3 -3
- package/build/services/escalation/crud.js +9 -2
- package/build/services/escalation/resolver-validation.js +6 -0
- package/build/services/escalation/sql.d.ts +1 -1
- package/build/services/escalation/sql.js +1 -1
- package/build/services/knowledge/index.d.ts +18 -0
- package/build/services/knowledge/index.js +52 -0
- package/build/services/knowledge/lookup-cache.d.ts +29 -0
- package/build/services/knowledge/lookup-cache.js +94 -0
- package/build/services/knowledge/sql.d.ts +2 -0
- package/build/services/knowledge/sql.js +14 -0
- package/build/services/mcp/server-tools.js +30 -0
- package/build/services/orchestrator/condition.d.ts +33 -13
- package/build/services/orchestrator/condition.js +41 -14
- package/build/services/yaml-workflow/durable-compiler/parser.js +4 -1
- package/build/shared/form-validation/ctx-path.d.ts +12 -0
- package/build/shared/form-validation/ctx-path.js +56 -0
- package/build/shared/form-validation/field-validator.d.ts +4 -2
- package/build/shared/form-validation/field-validator.js +25 -19
- package/build/shared/form-validation/index.d.ts +3 -0
- package/build/shared/form-validation/index.js +3 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +2 -0
- package/build/shared/form-validation/validate-resolver-payload.js +19 -0
- package/build/shared/form-validation/x-lt-help.d.ts +1 -1
- package/build/shared/form-validation/x-lt-help.js +2 -1
- package/build/shared/form-validation/x-lt-options.d.ts +7 -0
- package/build/shared/form-validation/x-lt-options.js +63 -0
- package/build/shared/form-validation/x-lt-require-sum.d.ts +30 -0
- package/build/shared/form-validation/x-lt-require-sum.js +59 -0
- package/build/system/activities/knowledge.d.ts +3 -0
- package/build/system/activities/knowledge.js +5 -2
- package/build/system/activities/sql.d.ts +6 -10
- package/build/system/activities/sql.js +105 -49
- package/build/system/mcp-servers/admin/schemas.d.ts +4 -4
- package/build/system/mcp-servers/knowledge.js +23 -2
- package/build/system/seed/tool-manifests-escalation.js +12 -0
- package/build/system/seed/tool-manifests-knowledge.d.ts +36 -0
- package/build/system/seed/tool-manifests-knowledge.js +15 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +37 -3
- package/build/types/escalation.js +42 -2
- package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js → AdminDashboard-BVgjY4zN.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js.map → AdminDashboard-BVgjY4zN.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-4C9aU0dj.js → AgentConfigPage-ChL59YL5.js} +6 -6
- package/dashboard/dist/assets/AgentConfigPage-ChL59YL5.js.map +1 -0
- package/dashboard/dist/assets/{AgentDetailPage-B6uvDnMF.js → AgentDetailPage-IJfgCOIF.js} +2 -2
- package/dashboard/dist/assets/AgentDetailPage-IJfgCOIF.js.map +1 -0
- package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js → AgentsPage-C7PnPXz_.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js.map → AgentsPage-C7PnPXz_.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C5f2rqHa.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-C9VKPhD6.js.map → AvailableEscalationsPage-C5f2rqHa.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js → BotPicker-CBf6bHLV.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js.map → BotPicker-CBf6bHLV.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js → BulkAssignModal-CkxoPByA.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js.map → BulkAssignModal-CkxoPByA.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-D7USh3F0.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Bkbq_GO6.js.map → CapabilitiesPage-D7USh3F0.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js → CollapsibleSection-DfPpAIxa.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js.map → CollapsibleSection-DfPpAIxa.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js → CredentialsPage-BHZ5SKIu.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js.map → CredentialsPage-BHZ5SKIu.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js → CronLabel-wE8Hms6c.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js.map → CronLabel-wE8Hms6c.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js → DropZone-Pv-v5RAs.js} +2 -2
- package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js.map → DropZone-Pv-v5RAs.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js → ElapsedCell-B4VxKHpw.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js.map → ElapsedCell-B4VxKHpw.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js → EntityTimelinePanel-CFbQDHOj.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js.map → EntityTimelinePanel-CFbQDHOj.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js → EscalationListSchemaPage-YTgexl4f.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js.map → EscalationListSchemaPage-YTgexl4f.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js → EscalationSchemaPage-Sjk05eHP.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js.map → EscalationSchemaPage-Sjk05eHP.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js → EscalationsOverview-gHWPjUpZ.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js.map → EscalationsOverview-gHWPjUpZ.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DRUHkKtv.js → EventTable-C9lHQ57t.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DRUHkKtv.js.map → EventTable-C9lHQ57t.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js → FilterBar-BY--ANxv.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js.map → FilterBar-BY--ANxv.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js → GraphInvokePage-B-Oo5s-W.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js.map → GraphInvokePage-B-Oo5s-W.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-DXzDBkQV.js → HomePage-BrcjKOaJ.js} +2 -2
- package/dashboard/dist/assets/{HomePage-DXzDBkQV.js.map → HomePage-BrcjKOaJ.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-D5TQ4X_M.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-BvpGFFYp.js.map → ListToolbar-D5TQ4X_M.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-C2atR_B6.js → McpOverview-jlukVWQ7.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-C2atR_B6.js.map → McpOverview-jlukVWQ7.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js → McpQueryDetailPage-BWKbvJSd.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js.map → McpQueryDetailPage-BWKbvJSd.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-BH2Pon4M.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CM_Fgl9G.js.map → McpQueryPage-BH2Pon4M.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js → McpRunDetailPage-kUnq2QSO.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js.map → McpRunDetailPage-kUnq2QSO.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js → McpRunsPage-BTucgt64.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js.map → McpRunsPage-BTucgt64.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js → NamespacePill-DONj6eUU.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js.map → NamespacePill-DONj6eUU.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js → OperationsPage-Cp8WL-ld.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js.map → OperationsPage-Cp8WL-ld.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js → OperatorDashboard-wHyeLWzX.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js.map → OperatorDashboard-wHyeLWzX.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js → PageHeader-CFVw67M6.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js.map → PageHeader-CFVw67M6.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js → PageHeaderWithStats-D9tQxILm.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js.map → PageHeaderWithStats-D9tQxILm.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js → PersonaDetailPage-BXlTqLDK.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js.map → PersonaDetailPage-BXlTqLDK.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-62hANmNf.js → PersonasPage-DlmdJ3Dm.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-62hANmNf.js.map → PersonasPage-DlmdJ3Dm.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js → ProcessDetailPage-D88ocvmT.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js.map → ProcessDetailPage-D88ocvmT.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js → ProcessesListPage-DpXm-KtK.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js.map → ProcessesListPage-DpXm-KtK.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js → RoleDetailPage-DE2Rj2QE.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js.map → RoleDetailPage-DE2Rj2QE.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-C0hExOmI.js → RolePill-Di_5hfvw.js} +2 -2
- package/dashboard/dist/assets/{RolePill-C0hExOmI.js.map → RolePill-Di_5hfvw.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js → RolesPage-CZSvJlsz.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js.map → RolesPage-CZSvJlsz.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js → RunAsSelector-BawZcqAk.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js.map → RunAsSelector-BawZcqAk.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js → ScanCodesPage-DSlpA9kK.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js.map → ScanCodesPage-DSlpA9kK.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js → ScanSchemeDetailPage-BK4hisGD.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js.map → ScanSchemeDetailPage-BK4hisGD.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js → ScanStationPage-D3QjajFD.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js.map → ScanStationPage-D3QjajFD.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js → ScopeBadge-CqIIeWjK.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js.map → ScopeBadge-CqIIeWjK.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js → StickyPagination-BfZwU2NR.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js.map → StickyPagination-BfZwU2NR.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js → StreamMessageDetail-C7zIHX5D.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js.map → StreamMessageDetail-C7zIHX5D.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js → SwimlaneTimeline-DNSo8AT8.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js.map → SwimlaneTimeline-DNSo8AT8.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BXxXs1JD.js → TagInput-BLwxTNsI.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BXxXs1JD.js.map → TagInput-BLwxTNsI.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js → TaskDetailPage-BOJ8pwh3.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js.map → TaskDetailPage-BOJ8pwh3.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js → TaskQueuePill-DVgcqd-h.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js.map → TaskQueuePill-DVgcqd-h.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js → TasksListPage-C4CYqZf8.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js.map → TasksListPage-C4CYqZf8.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js → TimeAgo-JRPi9IEd.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js.map → TimeAgo-JRPi9IEd.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js → TimestampCell-BVYyU-nl.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js.map → TimestampCell-BVYyU-nl.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js → ToolPill-C6hkOqPx.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js.map → ToolPill-C6hkOqPx.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js → ToolTestPanel-IGrd44Au.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js.map → ToolTestPanel-IGrd44Au.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js → TopicDetailPage-DhianNey.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js.map → TopicDetailPage-DhianNey.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js → TopicsPage-Glhqz_Nv.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js.map → TopicsPage-Glhqz_Nv.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BrwZnLjU.js → UserName-CD9OqhNI.js} +2 -2
- package/dashboard/dist/assets/{UserName-BrwZnLjU.js.map → UserName-CD9OqhNI.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js → WorkflowExecutionPage-8Q2438Ry.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js.map → WorkflowExecutionPage-8Q2438Ry.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js → WorkflowPill-CN-952iI.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js.map → WorkflowPill-CN-952iI.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js → WorkflowsDashboard-CkAoYT86.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js.map → WorkflowsDashboard-CkAoYT86.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js → WorkflowsOverview-Zh_EidMp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js.map → WorkflowsOverview-Zh_EidMp.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js → YamlWorkflowDetailPage-BKJbFT8C.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js.map → YamlWorkflowDetailPage-BKJbFT8C.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js → YamlWorkflowsPage-DK1z6iFt.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js.map → YamlWorkflowsPage-DK1z6iFt.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Cg_e-aaf.js → agents-BEASyYpg.js} +2 -2
- package/dashboard/dist/assets/{agents-Cg_e-aaf.js.map → agents-BEASyYpg.js.map} +1 -1
- package/dashboard/dist/assets/{bots-B047yNJ0.js → bots-CaXqSHat.js} +2 -2
- package/dashboard/dist/assets/{bots-B047yNJ0.js.map → bots-CaXqSHat.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CI1dbCDk.js → capabilities-Cijq-qev.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CI1dbCDk.js.map → capabilities-Cijq-qev.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Cy7snw7f.js → controlplane-HGuRC7AW.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Cy7snw7f.js.map → controlplane-HGuRC7AW.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js → escalation-columns-BLVz8XCP.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js.map → escalation-columns-BLVz8XCP.js.map} +1 -1
- package/dashboard/dist/assets/index-BJDAXUzO.js +2 -0
- package/dashboard/dist/assets/index-BJDAXUzO.js.map +1 -0
- package/dashboard/dist/assets/{index-DVtIMrTb.js → index-CEIp6WWg.js} +2 -2
- package/dashboard/dist/assets/{index-DVtIMrTb.js.map → index-CEIp6WWg.js.map} +1 -1
- package/dashboard/dist/assets/index-CK_ohh6Q.js +3 -0
- package/dashboard/dist/assets/index-CK_ohh6Q.js.map +1 -0
- package/dashboard/dist/assets/{index-DAUV3eJ-.js → index-CLQ0HBHR.js} +2 -2
- package/dashboard/dist/assets/{index-DAUV3eJ-.js.map → index-CLQ0HBHR.js.map} +1 -1
- package/dashboard/dist/assets/{index-COKZW8Xx.js → index-Cg0vCZng.js} +2 -2
- package/dashboard/dist/assets/{index-COKZW8Xx.js.map → index-Cg0vCZng.js.map} +1 -1
- package/dashboard/dist/assets/{index-lGfBW1PB.js → index-CgXVDPW-.js} +31 -31
- package/dashboard/dist/assets/index-CgXVDPW-.js.map +1 -0
- package/dashboard/dist/assets/index-ClY0ihQ5.js +2 -0
- package/dashboard/dist/assets/{index-X3_AxcUk.js.map → index-ClY0ihQ5.js.map} +1 -1
- package/dashboard/dist/assets/{index-C_y0lQ_o.js → index-D2OU2MJb.js} +2 -2
- package/dashboard/dist/assets/{index-C_y0lQ_o.js.map → index-D2OU2MJb.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bf3hVGXZ.js → index-IkgBE7e_.js} +2 -2
- package/dashboard/dist/assets/{index-Bf3hVGXZ.js.map → index-IkgBE7e_.js.map} +1 -1
- package/dashboard/dist/assets/{index-B6Grf1WQ.js → index-Xi3LO4Ye.js} +4 -4
- package/dashboard/dist/assets/{index-B6Grf1WQ.js.map → index-Xi3LO4Ye.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bxd2sXqz.js → index-YMd3ZiPd.js} +2 -2
- package/dashboard/dist/assets/{index-Bxd2sXqz.js.map → index-YMd3ZiPd.js.map} +1 -1
- package/dashboard/dist/assets/{index-Uk6N1qiH.js → index-t1JXcmBG.js} +2 -2
- package/dashboard/dist/assets/{index-Uk6N1qiH.js.map → index-t1JXcmBG.js.map} +1 -1
- package/dashboard/dist/assets/{index-DyTb77Jb.js → index-tCDjx1kF.js} +2 -2
- package/dashboard/dist/assets/{index-DyTb77Jb.js.map → index-tCDjx1kF.js.map} +1 -1
- package/dashboard/dist/assets/knowledge-DpaUJtVW.js +2 -0
- package/dashboard/dist/assets/knowledge-DpaUJtVW.js.map +1 -0
- package/dashboard/dist/assets/{mcp-D889kZ-c.js → mcp-BkkLq6OE.js} +2 -2
- package/dashboard/dist/assets/{mcp-D889kZ-c.js.map → mcp-BkkLq6OE.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js → mcp-query-DeXu3La5.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js.map → mcp-query-DeXu3La5.js.map} +1 -1
- package/dashboard/dist/assets/{personas-xHB16O-Q.js → personas-BRbKVVko.js} +2 -2
- package/dashboard/dist/assets/{personas-xHB16O-Q.js.map → personas-BRbKVVko.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DnTPjw1v.js → pipelines-B7xo92sK.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DnTPjw1v.js.map → pipelines-B7xo92sK.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BcDvp6dL.js → tasks-BGyqM1Ho.js} +2 -2
- package/dashboard/dist/assets/{tasks-BcDvp6dL.js.map → tasks-BGyqM1Ho.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DXw6BNy5.js → topics-I81rKc75.js} +2 -2
- package/dashboard/dist/assets/{topics-DXw6BNy5.js.map → topics-I81rKc75.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js → useEventHooks-CjV3uNxt.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js.map → useEventHooks-CjV3uNxt.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js → useNamespace-B-HMdRka.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js.map → useNamespace-B-HMdRka.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js → useYamlActivityEvents-CNsAlsgz.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js.map → useYamlActivityEvents-CNsAlsgz.js.map} +1 -1
- package/dashboard/dist/assets/{users-XpCq_umD.js → users-DiTqBepm.js} +2 -2
- package/dashboard/dist/assets/{users-XpCq_umD.js.map → users-DiTqBepm.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BgsXTN4h.js → vendor-icons-h-jlRSb9.js} +141 -146
- package/dashboard/dist/assets/vendor-icons-h-jlRSb9.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CMxHVqQ8.js → workflows-TA0p_3B8.js} +2 -2
- package/dashboard/dist/assets/{workflows-CMxHVqQ8.js.map → workflows-TA0p_3B8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js → yaml-workflows-DN9-DBnQ.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js.map → yaml-workflows-DN9-DBnQ.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/api/http/escalations.md +31 -8
- package/docs/api/http/knowledge.md +24 -2
- package/docs/api/http/roles.md +1 -1
- package/docs/api/mcp/admin.md +1 -1
- package/docs/api/mcp/human-queue.md +14 -0
- package/docs/api/mcp/knowledge.md +17 -1
- package/docs/api/sdk/escalations.md +38 -15
- package/docs/api/sdk/knowledge.md +27 -0
- package/docs/api/sdk/roles.md +1 -1
- package/docs/compilation.md +1 -1
- package/docs/compiler.md +2 -2
- package/docs/dashboard.md +1 -1
- package/docs/data.md +3 -3
- package/docs/hitl/escalation.md +14 -12
- package/docs/hitl/form.md +1 -0
- package/docs/hitl/iframe.md +2 -2
- package/docs/hitl/lookups.md +134 -0
- package/docs/hitl/resolution.md +4 -4
- package/docs/hitl/roles.md +4 -4
- package/docs/hitl/x-lt-show-if.md +1 -1
- package/docs/hitl/x-lt-transition.md +2 -2
- package/docs/hitl/x-lt-validation.md +64 -2
- package/docs/hitl/x-lt-widget.md +2 -2
- package/docs/hitl-guide.md +8 -2
- package/docs/story.md +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-4C9aU0dj.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-B6uvDnMF.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-BvpGFFYp.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +0 -2
- package/dashboard/dist/assets/index-Ds5rGe-i.js +0 -3
- package/dashboard/dist/assets/index-Ds5rGe-i.js.map +0 -1
- package/dashboard/dist/assets/index-X3_AxcUk.js +0 -2
- package/dashboard/dist/assets/index-lGfBW1PB.js.map +0 -1
- package/dashboard/dist/assets/index-nUmEwQrg.js +0 -2
- package/dashboard/dist/assets/index-nUmEwQrg.js.map +0 -1
- package/dashboard/dist/assets/knowledge-DsIUzscY.js +0 -2
- package/dashboard/dist/assets/knowledge-DsIUzscY.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +0 -1
|
@@ -156,6 +156,29 @@ GET /api/escalations/:id
|
|
|
156
156
|
{ "error": "Escalation not found" }
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
+
## Get escalation lookups
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
GET /api/escalations/:id/lookups
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Resolves the versioned knowledge lookups pinned on the row (`envelope.lookups`). The refs ARE the grant: any user who may read the escalation may fetch exactly the pinned editions it names — the general knowledge API stays a builder surface. See [lookups](../../hitl/lookups.md).
|
|
166
|
+
|
|
167
|
+
**Scope:** Enforces the same read scope as `GET /api/escalations/:id`.
|
|
168
|
+
|
|
169
|
+
**Response 200:**
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"lookups": [
|
|
174
|
+
{ "domain": "catalog", "key": "materials", "version": 2, "data": { "items": ["aluminum", "steel"] } },
|
|
175
|
+
{ "domain": "catalog", "key": "geo", "version": 9, "data": null, "missing": true }
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
A ref whose snapshot does not exist answers with `missing: true` — the batch never fails.
|
|
181
|
+
|
|
159
182
|
## Claim an escalation
|
|
160
183
|
|
|
161
184
|
```
|
|
@@ -279,7 +302,7 @@ Returned when the escalation has already been resolved or is otherwise not pendi
|
|
|
279
302
|
|
|
280
303
|
### Signal-based resolution (metadata.signal_id)
|
|
281
304
|
|
|
282
|
-
When an escalation has `metadata.signal_id`, the resolve endpoint signals the running workflow instead of starting a new one. The workflow is still alive — it called `
|
|
305
|
+
When an escalation has `metadata.signal_id`, the resolve endpoint signals the running workflow instead of starting a new one. The workflow is still alive — it called `conditional(signalId)` and is paused.
|
|
283
306
|
|
|
284
307
|
The resolver payload is augmented with `$escalation_id` before signaling:
|
|
285
308
|
|
|
@@ -287,13 +310,13 @@ The resolver payload is augmented with `$escalation_id` before signaling:
|
|
|
287
310
|
{ "approved": true, "notes": "Looks good", "$escalation_id": "esc-a1b2c3d4-..." }
|
|
288
311
|
```
|
|
289
312
|
|
|
290
|
-
The workflow is responsible for resolving the escalation. The `
|
|
313
|
+
The workflow is responsible for resolving the escalation. The `conditional()` helper handles this automatically — it strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload.
|
|
291
314
|
|
|
292
315
|
If you use raw `Durable.workflow.condition()` instead, you must resolve the escalation yourself using the `$escalation_id` from the signal data.
|
|
293
316
|
|
|
294
317
|
### Signal-key resolution (efficient/atomic — `signal_key`)
|
|
295
318
|
|
|
296
|
-
When an escalation was written atomically by `
|
|
319
|
+
When an escalation was written atomically by `conditional(signalId, config)` (or `Durable.workflow.condition(signalId, config)`), the row carries a `signal_key` and no `signal_id`/`signal_routing` metadata. The resolve endpoint detects `signal_key` and resolves it through the SDK: the resolve marks the row resolved **and** delivers the signal to the waiting `condition()` in one transaction, so the original job resumes in place — no re-run, no separate resolve activity. `system.escalation.{role}.{id}.resolved` fires.
|
|
297
320
|
|
|
298
321
|
```
|
|
299
322
|
POST /api/escalations/resolve-by-signal-key
|
|
@@ -303,7 +326,7 @@ For callers that know the deterministic signal id (webhooks — e.g. `signal-sca
|
|
|
303
326
|
|
|
304
327
|
| Field | Type | Required | Description |
|
|
305
328
|
|-------|------|----------|-------------|
|
|
306
|
-
| `signalKey` | `string` | yes | The signal id passed to `
|
|
329
|
+
| `signalKey` | `string` | yes | The signal id passed to `conditional(signalId, config)` |
|
|
307
330
|
| `resolverPayload` | `object` | yes | The decision payload delivered to the waiting workflow |
|
|
308
331
|
| `metadata` | `object` | no | Outcome facets merged into the row's GIN-indexed metadata (see [Resolve an escalation](#resolve-an-escalation)) |
|
|
309
332
|
|
|
@@ -325,7 +348,7 @@ When a reviewer claims an escalation, the dashboard renders a typed form instead
|
|
|
325
348
|
|
|
326
349
|
### Option 1: Role `form_schema` (versioned)
|
|
327
350
|
|
|
328
|
-
The escalation form is owned by the target **role** as a versioned `form_schema`, declared on the role (e.g. via `PATCH /api/roles/:role`). Every escalation targeting that role resolves against it. A workflow pins a specific version through `
|
|
351
|
+
The escalation form is owned by the target **role** as a versioned `form_schema`, declared on the role (e.g. via `PATCH /api/roles/:role`). Every escalation targeting that role resolves against it. A workflow pins a specific version through `conditional`'s `schemaVersion`, which stamps `metadata.schema_version` on the escalation; unpinned escalations resolve against the role's latest `form_schema`. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload.
|
|
329
352
|
|
|
330
353
|
The deprecated workflow-config `resolver_schema` remains only as a legacy fallback when no role `form_schema` is available.
|
|
331
354
|
|
|
@@ -830,7 +853,7 @@ Returns all escalations linked to a specific workflow ID.
|
|
|
830
853
|
POST /api/escalations/:id/cancel
|
|
831
854
|
```
|
|
832
855
|
|
|
833
|
-
Permanently cancels a pending or claimed escalation. The workflow waiting on this escalation (via `
|
|
856
|
+
Permanently cancels a pending or claimed escalation. The workflow waiting on this escalation (via `conditional`) receives `null` as the condition result, allowing it to handle the cancellation gracefully.
|
|
834
857
|
|
|
835
858
|
Terminal escalations (`resolved` or already `cancelled`) return 409.
|
|
836
859
|
|
|
@@ -1060,7 +1083,7 @@ POST /api/escalations/resolve-by-metadata
|
|
|
1060
1083
|
|
|
1061
1084
|
Single atomic query finds the pending escalation by metadata, auto-claims if unclaimed, and resolves it. RBAC is enforced in the SQL WHERE clause. Write scope is honored here: a `member` with `write_scope=self` may resolve their own assigned item atomically, which is how a one-time user completes the form routed to them.
|
|
1062
1085
|
|
|
1063
|
-
**Signal guard:** If the escalation has `metadata.signal_id` (created by `
|
|
1086
|
+
**Signal guard:** If the escalation has `metadata.signal_id` (created by `conditional`), the SQL does NOT resolve it directly. Instead, the endpoint signals the running workflow — `conditional` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
|
|
1064
1087
|
|
|
1065
1088
|
**Body:**
|
|
1066
1089
|
|
|
@@ -1089,7 +1112,7 @@ Single atomic query finds the pending escalation by metadata, auto-claims if unc
|
|
|
1089
1112
|
}
|
|
1090
1113
|
```
|
|
1091
1114
|
|
|
1092
|
-
**Response 200 (signal-backed):** Workflow signaled; `
|
|
1115
|
+
**Response 200 (signal-backed):** Workflow signaled; `conditional` resolves the escalation durably.
|
|
1093
1116
|
|
|
1094
1117
|
```json
|
|
1095
1118
|
{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
CRUD operations for the knowledge store — a domain-scoped key-value store backed by PostgreSQL JSONB. Each entry has a domain, key, arbitrary JSON data, and optional tags.
|
|
4
4
|
|
|
5
|
-
All endpoints require authentication.
|
|
5
|
+
All endpoints require authentication and builder access (superadmin or a user holding the `engineer` role). Members reach knowledge content only through escalation lookup refs — see [lookups](../../hitl/lookups.md) and `GET /api/escalations/:id/lookups`.
|
|
6
6
|
|
|
7
7
|
## List domains
|
|
8
8
|
|
|
@@ -64,12 +64,13 @@ Returns entries within a domain, ordered by last updated.
|
|
|
64
64
|
GET /api/knowledge/entry?domain=screenshot&key=google
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
Returns a single knowledge entry by domain and key. Returns `{ found: false }` if not found.
|
|
67
|
+
Returns a single knowledge entry by domain and key. Returns `{ found: false }` if not found. With `version`, returns that immutable edition from the version history instead of the live entry.
|
|
68
68
|
|
|
69
69
|
| Parameter | Type | Required | Description |
|
|
70
70
|
|-----------|------|----------|-------------|
|
|
71
71
|
| `domain` | `string` | Yes | Domain |
|
|
72
72
|
| `key` | `string` | Yes | Entry key |
|
|
73
|
+
| `version` | `integer` | No | Fetch this immutable edition instead of the live entry |
|
|
73
74
|
|
|
74
75
|
**Response 200:**
|
|
75
76
|
|
|
@@ -85,6 +86,27 @@ Returns a single knowledge entry by domain and key. Returns `{ found: false }` i
|
|
|
85
86
|
}
|
|
86
87
|
```
|
|
87
88
|
|
|
89
|
+
## List entry versions
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
GET /api/knowledge/entry/versions?domain=catalog&key=materials
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Every data-changing write mints an immutable edition. Lists them newest first, with the current one marked.
|
|
96
|
+
|
|
97
|
+
**Response 200:**
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"domain": "catalog",
|
|
102
|
+
"key": "materials",
|
|
103
|
+
"versions": [
|
|
104
|
+
{ "version": 2, "change_summary": null, "created_at": "...", "is_current": true },
|
|
105
|
+
{ "version": 1, "change_summary": null, "created_at": "...", "is_current": false }
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
88
110
|
## Store entry
|
|
89
111
|
|
|
90
112
|
```
|
package/docs/api/http/roles.md
CHANGED
|
@@ -412,7 +412,7 @@ GET /api/roles/:role/schema
|
|
|
412
412
|
GET /api/roles/:role/schema?version=3
|
|
413
413
|
```
|
|
414
414
|
|
|
415
|
-
Fetch the role's `form_schema` + `metadata_schema` pair. Without `version`, returns the live (latest) schema along with the role's current version number. With `version`, returns that immutable snapshot from the version history — the snapshot an escalation pinned via `metadata.schema_version` (`
|
|
415
|
+
Fetch the role's `form_schema` + `metadata_schema` pair. Without `version`, returns the live (latest) schema along with the role's current version number. With `version`, returns that immutable snapshot from the version history — the snapshot an escalation pinned via `metadata.schema_version` (`conditional`'s `schemaVersion` field).
|
|
416
416
|
|
|
417
417
|
**Response 200:**
|
|
418
418
|
|
package/docs/api/mcp/admin.md
CHANGED
|
@@ -1547,7 +1547,7 @@ Return the numeric status semaphore for a workflow.
|
|
|
1547
1547
|
|
|
1548
1548
|
## Ortho Pipeline
|
|
1549
1549
|
|
|
1550
|
-
AI-operable tools for driving the orthotic manufacturing pipeline. Each order passes through eight sequential stages (design → review → print → grind → glue → finish → qa → ship). The pipeline is a HotMesh durable workflow; each stage suspends at a `
|
|
1550
|
+
AI-operable tools for driving the orthotic manufacturing pipeline. Each order passes through eight sequential stages (design → review → print → grind → glue → finish → qa → ship). The pipeline is a HotMesh durable workflow; each stage suspends at a `conditional` checkpoint until an escalation is resolved.
|
|
1551
1551
|
|
|
1552
1552
|
A Claude agent loop calls `ortho_submit` to start an order, polls `ortho_pending` to see what's waiting, drives each stage forward with `ortho_complete_stage`, and monitors progress with `ortho_status`.
|
|
1553
1553
|
|
|
@@ -49,6 +49,20 @@ Check the status of an escalation. Returns status and resolver payload if resolv
|
|
|
49
49
|
|-------|------|----------|-------------|
|
|
50
50
|
| escalation_id | string | Yes | The escalation ID to check |
|
|
51
51
|
|
|
52
|
+
### get_escalation_lookups
|
|
53
|
+
|
|
54
|
+
Resolve the versioned knowledge lookups pinned on an escalation (`envelope.lookups`). Each ref answers with its immutable edition; a ref whose snapshot does not exist answers with `missing: true`. Like the other tools on this server, the call carries no per-user identity — the MCP surface reads at service scope.
|
|
55
|
+
|
|
56
|
+
| | |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Read-safe | Yes |
|
|
59
|
+
|
|
60
|
+
**Parameters:**
|
|
61
|
+
|
|
62
|
+
| Field | Type | Required | Description |
|
|
63
|
+
|-------|------|----------|-------------|
|
|
64
|
+
| escalation_id | string | Yes | The escalation whose pinned knowledge lookups to resolve |
|
|
65
|
+
|
|
52
66
|
### get_available_work
|
|
53
67
|
|
|
54
68
|
List available escalations for a role. Returns pending, unassigned escalations.
|
|
@@ -35,7 +35,23 @@ Store a value in a 3-level additive hierarchy: domain > key > field. Upserts by
|
|
|
35
35
|
|
|
36
36
|
### get_knowledge
|
|
37
37
|
|
|
38
|
-
Retrieve a single knowledge entry by domain and key.
|
|
38
|
+
Retrieve a single knowledge entry by domain and key. Pass `version` to fetch a pinned immutable edition.
|
|
39
|
+
|
|
40
|
+
| | |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Read-safe | Yes |
|
|
43
|
+
|
|
44
|
+
**Parameters:**
|
|
45
|
+
|
|
46
|
+
| Field | Type | Required | Description |
|
|
47
|
+
|-------|------|----------|-------------|
|
|
48
|
+
| domain | string | Yes | Knowledge domain |
|
|
49
|
+
| key | string | Yes | Document key |
|
|
50
|
+
| version | number | No | Fetch this immutable edition instead of the live entry |
|
|
51
|
+
|
|
52
|
+
### list_knowledge_versions
|
|
53
|
+
|
|
54
|
+
List every immutable edition of a knowledge entry, newest first, with the current one marked. Every data-changing write mints a new version.
|
|
39
55
|
|
|
40
56
|
| | |
|
|
41
57
|
|---|---|
|
|
@@ -197,6 +197,27 @@ const result = await lt.escalations.get({ id: 'esc_123' });
|
|
|
197
197
|
|
|
198
198
|
---
|
|
199
199
|
|
|
200
|
+
## getLookups
|
|
201
|
+
|
|
202
|
+
Resolve the versioned knowledge lookups pinned on an escalation (`envelope.lookups`). Enforces the same read scope as `get`; the refs on the row grant exactly the pinned editions they name. See [lookups](../../hitl/lookups.md).
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
const result = await lt.escalations.getLookups({ id: 'esc_123' });
|
|
206
|
+
// result.data.lookups → [{ domain, key, version, as?, data, missing? }]
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Parameters:**
|
|
210
|
+
|
|
211
|
+
| Field | Type | Required | Description |
|
|
212
|
+
|-------|------|----------|-------------|
|
|
213
|
+
| `id` | `string` | Yes | Escalation UUID |
|
|
214
|
+
|
|
215
|
+
**Returns:** `LTApiResult<{ lookups }>` -- each entry is `{ domain, key, version, as?, data, missing? }`.
|
|
216
|
+
|
|
217
|
+
**Auth:** Required
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
200
221
|
## getByWorkflowId
|
|
201
222
|
|
|
202
223
|
List all escalations for a given workflow ID.
|
|
@@ -342,29 +363,31 @@ The in-process library takes the same patch as a third argument:
|
|
|
342
363
|
|
|
343
364
|
---
|
|
344
365
|
|
|
345
|
-
##
|
|
366
|
+
## conditional (workflow helper)
|
|
346
367
|
|
|
347
|
-
Wait for a signal and automatically resolve the associated escalation. This is the counterpart to `executeLT` — where `executeLT` wraps `startChild` + `condition`, `
|
|
368
|
+
Wait for a signal and automatically resolve the associated escalation. This is the counterpart to `executeLT` — where `executeLT` wraps `startChild` + `condition`, `conditional` wraps `condition` + escalation resolution.
|
|
348
369
|
|
|
349
370
|
```typescript
|
|
350
|
-
|
|
371
|
+
conditional<T>(signalId: string, escalation?: ConditionQueueConfig): Promise<T | false | null>
|
|
351
372
|
```
|
|
352
373
|
|
|
374
|
+
> `conditionLT` is a deprecated alias of `conditional`. Existing code continues to work.
|
|
375
|
+
|
|
353
376
|
### Two ways to pause on an escalation
|
|
354
377
|
|
|
355
378
|
There are two ways to make a workflow pause as a claimable escalation, and they are not equivalent in cost:
|
|
356
379
|
|
|
357
380
|
- **Native `condition(signalId, escalationConfig)` — the efficient primitive.** HotMesh's `condition` takes an optional escalation config as its second argument. The row is written inside the workflow's Leg1 checkpoint, with `signal_key = signalId`. Resolving it (`resolve` / `resolveBySignalKey`) marks the row resolved **and** delivers the signal in one guarded transaction, resuming the job in place. No create activity, no enrich step, and **no proxy-activity round-trip on the resume** — the resolve is the whole transaction. This is the path to prefer.
|
|
358
381
|
|
|
359
|
-
- **`
|
|
382
|
+
- **`conditional(signalId, config?)` — long-tail sugar.** With a config it delegates to the native efficient `condition` above (same atomic behavior — use it freely). Without a config it also supports the older **two-step** pattern: an escalation created separately, where the resume injects `$escalation_id` and `conditional` resolves it through a durable `proxyActivity` (`ltResolveEscalation`). That extra activity round-trip is the cost of the two-step form; the efficient form (and native `condition`) avoid it.
|
|
360
383
|
|
|
361
|
-
Reach for native `condition(signalId, config)` when you want the leanest path; reach for `
|
|
384
|
+
Reach for native `condition(signalId, config)` when you want the leanest path; reach for `conditional` for the ergonomic wrapper or to support the legacy two-step flow. Both resume the same row, and both accept the resolve-time `metadata` patch (the efficient path merges it in the single guarded UPDATE; the two-step path forwards it through `ltResolveEscalation` into that same atomic resolve).
|
|
362
385
|
|
|
363
386
|
### Atomic form (recommended)
|
|
364
387
|
|
|
365
388
|
Pass an escalation config as the second argument. The escalation row is written inside the workflow's Leg1 checkpoint — one commit, crash-safe: no separate `ltCreateEscalation` activity, no enrich step. `signal_key` is set to `signalId`, so the dashboard resolve endpoint (resolve-by-id → Path 0) and `POST /escalations/resolve-by-signal-key` resume *this* job in place, and `system.escalation.{role}.{id}.created` fires automatically.
|
|
366
389
|
|
|
367
|
-
`
|
|
390
|
+
`conditional` returns `T | false | null`:
|
|
368
391
|
- `T` — the resolver's payload (normal resolution)
|
|
369
392
|
- `false` — the SLA timer fired first (`config.timeout`); the row is now `status='expired'`
|
|
370
393
|
- `null` — the escalation was cancelled (workflow terminated or explicit `POST /api/escalations/:id/cancel`)
|
|
@@ -372,13 +395,13 @@ Pass an escalation config as the second argument. The escalation row is written
|
|
|
372
395
|
Always guard for `null` and `false` before accessing the payload:
|
|
373
396
|
|
|
374
397
|
```typescript
|
|
375
|
-
import {
|
|
398
|
+
import { conditional } from '@hotmeshio/long-tail';
|
|
376
399
|
|
|
377
400
|
export async function stationWorker(envelope: LTEnvelope) {
|
|
378
401
|
const ctx = Durable.workflow.workflowInfo();
|
|
379
402
|
const signalId = `station-done-${ctx.workflowId}`;
|
|
380
403
|
|
|
381
|
-
const decision = await
|
|
404
|
+
const decision = await conditional<{ approved: boolean }>(signalId, {
|
|
382
405
|
role: 'qc-inspector',
|
|
383
406
|
type: 'orderPipeline',
|
|
384
407
|
subtype: 'qc',
|
|
@@ -418,7 +441,7 @@ UPDATE, so operators can never resolve into a workflow that already moved on.
|
|
|
418
441
|
Create the escalation first (e.g. to enrich routing metadata), then wait:
|
|
419
442
|
|
|
420
443
|
```typescript
|
|
421
|
-
import {
|
|
444
|
+
import { conditional } from '@hotmeshio/long-tail';
|
|
422
445
|
|
|
423
446
|
export async function myWorkflow(envelope: LTEnvelope) {
|
|
424
447
|
const signalId = `approval-${Durable.workflow.workflowId}`;
|
|
@@ -443,7 +466,7 @@ export async function myWorkflow(envelope: LTEnvelope) {
|
|
|
443
466
|
});
|
|
444
467
|
|
|
445
468
|
// Pause — dashboard signals on resolve
|
|
446
|
-
const decision = await
|
|
469
|
+
const decision = await conditional<{ approved: boolean; notes: string }>(signalId);
|
|
447
470
|
|
|
448
471
|
if (!decision) {
|
|
449
472
|
// null = cancelled, false = timeout
|
|
@@ -457,10 +480,10 @@ export async function myWorkflow(envelope: LTEnvelope) {
|
|
|
457
480
|
**How it works:**
|
|
458
481
|
|
|
459
482
|
1. The workflow creates an escalation with `metadata.signal_id` pointing to its own signal key
|
|
460
|
-
2. The workflow calls `
|
|
483
|
+
2. The workflow calls `conditional(signalId)` and pauses
|
|
461
484
|
3. A reviewer claims and resolves the escalation in the dashboard
|
|
462
485
|
4. The resolve API injects `$escalation_id` into the payload and signals the workflow
|
|
463
|
-
5. `
|
|
486
|
+
5. `conditional` receives the signal, strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload
|
|
464
487
|
|
|
465
488
|
The escalation resolution happens inside the workflow as a durable activity — crash-safe and transactional within the workflow's execution context.
|
|
466
489
|
|
|
@@ -472,7 +495,7 @@ If you use raw `Durable.workflow.condition()` instead, the `$escalation_id` fiel
|
|
|
472
495
|
|
|
473
496
|
When a reviewer claims an escalation in the dashboard, a typed form is rendered instead of a raw JSON editor — if a schema is available. There are two ways to provide one:
|
|
474
497
|
|
|
475
|
-
**Option 1 — Role `form_schema` (versioned):** The escalation form is owned by the target role as a versioned `form_schema`. A workflow pins a version through `
|
|
498
|
+
**Option 1 — Role `form_schema` (versioned):** The escalation form is owned by the target role as a versioned `form_schema`. A workflow pins a version through `conditional`'s `schemaVersion`; unpinned escalations resolve against the role's latest. Fields may carry `x-lt-bind` to map a form value to a path in the resolver payload. The deprecated workflow-config `resolver_schema` remains only as a legacy fallback.
|
|
476
499
|
|
|
477
500
|
**Option 2 — Escalation metadata (dynamic):** Pass `form_schema` inside `metadata` when creating an escalation. This overrides any role-level schema.
|
|
478
501
|
|
|
@@ -659,7 +682,7 @@ const result = await lt.escalations.bulkTriage({
|
|
|
659
682
|
|
|
660
683
|
## cancel
|
|
661
684
|
|
|
662
|
-
Permanently cancel a pending or claimed escalation. The workflow waiting on `
|
|
685
|
+
Permanently cancel a pending or claimed escalation. The workflow waiting on `conditional` receives `null`.
|
|
663
686
|
|
|
664
687
|
```typescript
|
|
665
688
|
const result = await lt.escalations.cancel({ id: 'esc_123' });
|
|
@@ -769,7 +792,7 @@ const result = await lt.escalations.claimByMetadata({
|
|
|
769
792
|
|
|
770
793
|
Find and resolve an escalation by metadata key-value pair. Single atomic query with signal guard.
|
|
771
794
|
|
|
772
|
-
If the escalation has `metadata.signal_id` (created by `
|
|
795
|
+
If the escalation has `metadata.signal_id` (created by `conditional`), the endpoint signals the running workflow instead of resolving directly in the DB. `conditional` receives the signal and resolves the escalation durably inside the workflow. This preserves the same transactional integrity as the standard resolve-by-ID path.
|
|
773
796
|
|
|
774
797
|
```typescript
|
|
775
798
|
// Non-signal escalation → resolved atomically
|
|
@@ -51,6 +51,33 @@ const result = await lt.knowledge.getEntry({
|
|
|
51
51
|
|
|
52
52
|
**Returns:** `LTApiResult<KnowledgeEntry>` or `{ found: false }` if not found.
|
|
53
53
|
|
|
54
|
+
## getEntryVersion
|
|
55
|
+
|
|
56
|
+
Get an immutable edition from an entry's version history.
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const result = await lt.knowledge.getEntryVersion({
|
|
60
|
+
domain: 'catalog',
|
|
61
|
+
key: 'materials',
|
|
62
|
+
version: 2,
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Returns:** `LTApiResult<{ domain, key, version, data, tags, created_at }>` — 404 when the edition does not exist.
|
|
67
|
+
|
|
68
|
+
## listEntryVersions
|
|
69
|
+
|
|
70
|
+
List every edition of an entry, newest first, with the current one marked.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const result = await lt.knowledge.listEntryVersions({
|
|
74
|
+
domain: 'catalog',
|
|
75
|
+
key: 'materials',
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Returns:** `LTApiResult<{ domain, key, versions: [{ version, change_summary, created_at, is_current }] }>`
|
|
80
|
+
|
|
54
81
|
## storeEntry
|
|
55
82
|
|
|
56
83
|
Create or update a knowledge entry. Data is merged by default; set `replace: true` to fully overwrite.
|
package/docs/api/sdk/roles.md
CHANGED
|
@@ -291,7 +291,7 @@ When the update changes `form_schema` or `metadata_schema`, the new pair is snap
|
|
|
291
291
|
|
|
292
292
|
## getSchema
|
|
293
293
|
|
|
294
|
-
Fetch a role's `form_schema` + `metadata_schema` pair. With `version`, reads that immutable snapshot from the version history (the one an escalation pins via `
|
|
294
|
+
Fetch a role's `form_schema` + `metadata_schema` pair. With `version`, reads that immutable snapshot from the version history (the one an escalation pins via `conditional`'s `schemaVersion`); without it, reads the live (latest) schema and its current version number. A missing version is a 404 — it never falls back to a different version.
|
|
295
295
|
|
|
296
296
|
```typescript
|
|
297
297
|
const latest = await lt.roles.getSchema({ role: 'reviewer' });
|
package/docs/compilation.md
CHANGED
|
@@ -141,7 +141,7 @@ The dynamic path remains for genuinely new problems. But the long tail gets shor
|
|
|
141
141
|
|
|
142
142
|
The Pipeline Designer compiles from execution traces — the dynamic path. But there's a second entry point: compiling directly from source code.
|
|
143
143
|
|
|
144
|
-
If you've written a durable workflow using the
|
|
144
|
+
If you've written a durable workflow using the durable workflow API (`proxyActivities`, `sleep`, `condition`, `startChild`), you can compile it to a YAML DAG without executing it first. The `ltc` CLI reads your TypeScript source, extracts the orchestration structure, and produces an equivalent DAG that runs without replay overhead.
|
|
145
145
|
|
|
146
146
|
```bash
|
|
147
147
|
ltc compile workflows/assembly-line.ts
|
package/docs/compiler.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# The Workflow Compiler
|
|
2
2
|
|
|
3
|
-
You wrote a durable workflow. It works. `proxyActivities`, `sleep`, `condition` — the
|
|
3
|
+
You wrote a durable workflow. It works. `proxyActivities`, `sleep`, `condition` — the durable API is productive and familiar. But under the hood, the durable engine replays the entire workflow function on every wake-up. Sleep three times in a ten-step workflow? Steps 1–3 replay on wake one. Steps 1–6 replay on wake two. Steps 1–9 replay on wake three. The replay is deterministic — it skips completed activities — but the function still executes from the top every time.
|
|
4
4
|
|
|
5
5
|
The compiled YAML DAG does the same work without replay. Each step fires exactly once. State flows explicitly between activities through input mappings. No function re-execution, no replay loop, no wasted cycles.
|
|
6
6
|
|
|
@@ -161,7 +161,7 @@ ltc compile examples/workflows/ --dry-run
|
|
|
161
161
|
● basic-signal/index.ts
|
|
162
162
|
Function: basicSignal · HotMesh Durable
|
|
163
163
|
Activities: ltCreateEscalation, processApproval
|
|
164
|
-
Control flow:
|
|
164
|
+
Control flow: conditional
|
|
165
165
|
|
|
166
166
|
● kitchen-sink/index.ts
|
|
167
167
|
Function: kitchenSink · HotMesh Durable
|
package/docs/dashboard.md
CHANGED
|
@@ -267,7 +267,7 @@ Accessible at `/admin/roles/:role/schema`. The versioned form behind a role's es
|
|
|
267
267
|
|
|
268
268
|
- **Editor** — form fields as JSON Schema in a full-width editor, with an optional change summary recorded on the version the save creates. **Save Version** writes only the schema: every save that changes it appends an immutable snapshot and advances the current version.
|
|
269
269
|
- **Version rail** — the full history with the current version marked. Expand any version to view its snapshot or load it into the editor as the base for the next save.
|
|
270
|
-
- **Pinning** — workflows pin a version via `schemaVersion` in the `
|
|
270
|
+
- **Pinning** — workflows pin a version via `schemaVersion` in the `conditional` config, so their resolver form keeps that exact shape for the life of the run. Escalations without a pin render the latest version.
|
|
271
271
|
|
|
272
272
|
**API:** `GET /api/roles/:role/schema` fetches the latest or a pinned version. `GET /api/roles/:role/schema/versions` lists the history. `PATCH /api/roles/:role` with `form_schema` (+ optional `change_summary`) saves a new version.
|
|
273
273
|
|
package/docs/data.md
CHANGED
|
@@ -40,7 +40,7 @@ The graph edges that don't fit the line. `lt_roles.parent_role` places a role in
|
|
|
40
40
|
|
|
41
41
|
### lt_role_schemas
|
|
42
42
|
|
|
43
|
-
Immutable version history of each role's schema pair. Every change to a role's `form_schema` or `metadata_schema` (via `PATCH /api/roles/:role`, the SDK, or the `update_role` MCP tool) appends the next `(role, version)` snapshot in the same atomic statement that updates `lt_roles`. Escalations pin a version via `metadata.schema_version` (`
|
|
43
|
+
Immutable version history of each role's schema pair. Every change to a role's `form_schema` or `metadata_schema` (via `PATCH /api/roles/:role`, the SDK, or the `update_role` MCP tool) appends the next `(role, version)` snapshot in the same atomic statement that updates `lt_roles`. Escalations pin a version via `metadata.schema_version` (`conditional`'s `schemaVersion` field) so the resolver form they render stays exactly what their author specified; unpinned escalations use the live columns on `lt_roles`.
|
|
44
44
|
|
|
45
45
|
| Column | Type | Default | Description |
|
|
46
46
|
|--------|------|---------|-------------|
|
|
@@ -101,7 +101,7 @@ Tracks every workflow execution. Created by the LT interceptor when a workflow s
|
|
|
101
101
|
|
|
102
102
|
Records human intervention requests. Created when a workflow returns
|
|
103
103
|
`type: 'escalation'`, when `ltCreateEscalation` runs, or atomically when a
|
|
104
|
-
workflow calls `condition(signalId, config)` / `
|
|
104
|
+
workflow calls `condition(signalId, config)` / `conditional(signalId, config)`.
|
|
105
105
|
Updated when claimed or resolved.
|
|
106
106
|
|
|
107
107
|
The storage is the **shared HotMesh table `public.hmsh_escalations`**
|
|
@@ -112,7 +112,7 @@ Indexes are managed by the SDK on `hmsh_escalations` (see below).
|
|
|
112
112
|
|
|
113
113
|
Role read/write scope does **not** add columns here. An escalation carries a `role`
|
|
114
114
|
and an optional `assigned_to`; work-surface scope lives on the membership table
|
|
115
|
-
(`lt_user_roles`) and is applied at read time. `condition()` / `
|
|
115
|
+
(`lt_user_roles`) and is applied at read time. `condition()` / `conditional()` and
|
|
116
116
|
the escalation engine are unaffected.
|
|
117
117
|
|
|
118
118
|
The columns below are the `hmsh_escalations` table. The public API record
|
package/docs/hitl/escalation.md
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
# Creating Escalations
|
|
2
2
|
|
|
3
|
-
## `
|
|
3
|
+
## `conditional` — Atomic Pattern
|
|
4
4
|
|
|
5
|
-
Pass an escalation config to `
|
|
5
|
+
Pass an escalation config to `conditional`. The escalation row, its metadata, and the resume timer all commit inside the workflow's Leg1 checkpoint — one write, crash-safe. The `signal_key` on the row is the resume key: the dashboard resolve endpoint and `POST /api/escalations/resolve-by-signal-key` both resume this job in place, and the `system.escalation.{role}.{id}.created` event fires automatically.
|
|
6
|
+
|
|
7
|
+
> `conditionLT` is a deprecated alias of `conditional`. Existing code continues to work.
|
|
6
8
|
|
|
7
9
|
```typescript
|
|
8
|
-
import {
|
|
10
|
+
import { conditional } from '@hotmeshio/long-tail';
|
|
9
11
|
|
|
10
12
|
export async function approvalWorkflow(envelope: LTEnvelope) {
|
|
11
13
|
const ctx = Durable.workflow.workflowInfo();
|
|
12
14
|
const signalId = `approval-${ctx.workflowId}`;
|
|
13
15
|
|
|
14
|
-
const decision = await
|
|
16
|
+
const decision = await conditional<{ approved: boolean; notes?: string }>(signalId, {
|
|
15
17
|
role: 'finance-reviewer',
|
|
16
18
|
type: 'approval',
|
|
17
19
|
subtype: 'budget-request',
|
|
@@ -48,7 +50,7 @@ export async function approvalWorkflow(envelope: LTEnvelope) {
|
|
|
48
50
|
}
|
|
49
51
|
```
|
|
50
52
|
|
|
51
|
-
`
|
|
53
|
+
`conditional` returns `T | false | null`:
|
|
52
54
|
- `T` — the human's resolver payload
|
|
53
55
|
- `false` — SLA timeout (omit `timeout` for an open-ended wait)
|
|
54
56
|
- `null` — cancellation (workflow terminated or explicit cancel)
|
|
@@ -60,7 +62,7 @@ Interactive and webhook resolves deliver the resolver's identity alongside the p
|
|
|
60
62
|
```typescript
|
|
61
63
|
import type { EscalationResolution } from '@hotmeshio/long-tail';
|
|
62
64
|
|
|
63
|
-
const decision = await
|
|
65
|
+
const decision = await conditional<{
|
|
64
66
|
approved: boolean;
|
|
65
67
|
$resolution?: EscalationResolution;
|
|
66
68
|
}>(signalId, { role: 'order-reviewer', metadata: { orderId } });
|
|
@@ -80,7 +82,7 @@ Every field of the config — including all `metadata` facets — commits inside
|
|
|
80
82
|
|
|
81
83
|
### Early-signal buffering
|
|
82
84
|
|
|
83
|
-
A resolve that races ahead of the `
|
|
85
|
+
A resolve that races ahead of the `conditional` registration (a fast webhook, or a payload deposited before the workflow starts) is held as a pending signal and delivered when the wait registers — 10 minutes by default; pass `expire` to `signal()` when signaling early on purpose. Fan-out (`Promise.all` over many waits) scales the same way.
|
|
84
86
|
|
|
85
87
|
---
|
|
86
88
|
|
|
@@ -89,7 +91,7 @@ A resolve that races ahead of the `conditionLT` registration (a fast webhook, or
|
|
|
89
91
|
Every role carries a versioned `form_schema`. Every save that changes it appends an immutable snapshot to `lt_role_schemas` and advances the role's current version. Escalations pin one with `schemaVersion`:
|
|
90
92
|
|
|
91
93
|
```typescript
|
|
92
|
-
const decision = await
|
|
94
|
+
const decision = await conditional<{ approved: boolean; lotNumber: string }>(signalId, {
|
|
93
95
|
role: 'reviewer',
|
|
94
96
|
description: instructions,
|
|
95
97
|
schemaVersion: 3, // renders role schema v3, always, regardless of later edits
|
|
@@ -130,12 +132,12 @@ The reference examples ship as fully runnable seeds:
|
|
|
130
132
|
### Simple approval
|
|
131
133
|
|
|
132
134
|
```typescript
|
|
133
|
-
import {
|
|
135
|
+
import { conditional } from '@hotmeshio/long-tail';
|
|
134
136
|
|
|
135
137
|
export async function approveSpendWorkflow(envelope: LTEnvelope) {
|
|
136
138
|
const ctx = Durable.workflow.workflowInfo();
|
|
137
139
|
|
|
138
|
-
const decision = await
|
|
140
|
+
const decision = await conditional<{ approved: boolean; notes?: string }>(
|
|
139
141
|
`spend-approval-${ctx.workflowId}`,
|
|
140
142
|
{
|
|
141
143
|
role: 'finance-reviewer',
|
|
@@ -173,7 +175,7 @@ export async function approveSpendWorkflow(envelope: LTEnvelope) {
|
|
|
173
175
|
Dynamic checklist where item labels come from the workflow's envelope, not the static schema. Item count and wording vary per escalation without touching the form schema.
|
|
174
176
|
|
|
175
177
|
```typescript
|
|
176
|
-
import {
|
|
178
|
+
import { conditional } from '@hotmeshio/long-tail';
|
|
177
179
|
|
|
178
180
|
export async function stationCheckWorkflow(envelope: LTEnvelope) {
|
|
179
181
|
const ctx = Durable.workflow.workflowInfo();
|
|
@@ -184,7 +186,7 @@ export async function stationCheckWorkflow(envelope: LTEnvelope) {
|
|
|
184
186
|
{ id: 'step_2', label: 'Sign the dispensing log' },
|
|
185
187
|
];
|
|
186
188
|
|
|
187
|
-
const result = await
|
|
189
|
+
const result = await conditional<{ checks: Record<string, boolean> }>(
|
|
188
190
|
`station-check-${ctx.workflowId}`,
|
|
189
191
|
{
|
|
190
192
|
role: 'station-operator',
|
package/docs/hitl/form.md
CHANGED
|
@@ -32,6 +32,7 @@ Declare `title` on every field whose key isn't already a readable label — it i
|
|
|
32
32
|
| `number` | Number input |
|
|
33
33
|
| `string` | Text input (default) |
|
|
34
34
|
| `string` + `enum` | Dropdown select |
|
|
35
|
+
| `string`/`number` + `x-lt-options` | Dropdown select — options resolved from the escalation context (see [x-lt-validation.md](x-lt-validation.md#dynamic-select-options-x-lt-options)) |
|
|
35
36
|
| `null` | Read-only "null" display |
|
|
36
37
|
| `array` | Tag display (read-only) |
|
|
37
38
|
| `object` | Nested section with recursive fields, or a widget (see [x-lt-widget.md](x-lt-widget.md)) |
|
package/docs/hitl/iframe.md
CHANGED
|
@@ -51,8 +51,8 @@ const WORKBENCH_FORM_SCHEMA = {
|
|
|
51
51
|
},
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
// Workflow side — the wait is a normal
|
|
55
|
-
const design = await
|
|
54
|
+
// Workflow side — the wait is a normal conditional; the iframe submits the payload
|
|
55
|
+
const design = await conditional<{ stl_url: string }>(signalId, {
|
|
56
56
|
role: 'cad-designer',
|
|
57
57
|
description: 'Design the widget for this order.',
|
|
58
58
|
escalation_payload: JSON.stringify({ workbenchId, companyId }),
|