@hotmeshio/long-tail 0.11.1 → 0.12.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/build/api/domain.d.ts +14 -0
- package/build/api/domain.js +76 -0
- package/build/api/escalations/cancel.js +16 -1
- package/build/api/escalations/helpers.js +5 -0
- package/build/lib/db/schemas/030_domain_dictionary.sql +18 -0
- package/build/lib/events/escalation-wire.d.ts +9 -0
- package/build/lib/events/escalation-wire.js +69 -0
- package/build/lib/events/system-events.js +13 -5
- package/build/lib/json-path/pick.d.ts +14 -0
- package/build/lib/json-path/pick.js +51 -0
- package/build/routes/domain.d.ts +2 -0
- package/build/routes/domain.js +62 -0
- package/build/routes/index.js +2 -0
- package/build/services/domain/index.d.ts +4 -0
- package/build/services/domain/index.js +14 -0
- package/build/services/domain/read.d.ts +21 -0
- package/build/services/domain/read.js +78 -0
- package/build/services/domain/seed.d.ts +11 -0
- package/build/services/domain/seed.js +65 -0
- package/build/services/domain/sql.d.ts +10 -0
- package/build/services/domain/sql.js +29 -0
- package/build/services/domain/validate.d.ts +29 -0
- package/build/services/domain/validate.js +50 -0
- package/build/services/domain/write.d.ts +23 -0
- package/build/services/domain/write.js +43 -0
- package/build/services/escalation/crud.js +16 -12
- package/build/services/mcp/db-server/schemas.d.ts +1 -1
- package/build/services/mcp/external-server.js +31 -1
- package/build/services/role/index.d.ts +2 -0
- package/build/services/role/index.js +7 -0
- package/build/services/role/sql.d.ts +1 -0
- package/build/services/role/sql.js +3 -1
- package/build/services/role/types.d.ts +17 -1
- package/build/services/role/types.js +16 -0
- package/build/start/workers.js +6 -0
- package/build/system/mcp-servers/admin/domain-context.d.ts +14 -0
- package/build/system/mcp-servers/admin/domain-context.js +220 -0
- package/build/system/mcp-servers/admin/exports.js +7 -4
- package/build/system/mcp-servers/admin/index.js +5 -3
- package/build/system/mcp-servers/admin/pipelines.js +9 -3
- package/build/system/mcp-servers/admin/schemas.d.ts +61 -32
- package/build/system/mcp-servers/admin/schemas.js +23 -5
- package/build/system/mcp-servers/admin/workflows.js +26 -0
- package/build/system/mcp-servers/db-query/schemas.d.ts +1 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +1 -1
- package/build/system/seed/tool-manifests-admin.d.ts +286 -3
- package/build/system/seed/tool-manifests-admin.js +8 -5
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/domain-manifest.d.ts +77 -0
- package/build/types/domain-manifest.js +16 -0
- package/build/types/index.d.ts +2 -1
- package/build/types/index.js +2 -1
- package/build/types/startup.d.ts +10 -0
- package/dashboard/dist/assets/{AdminDashboard-D4ebrcNR.js → AdminDashboard-CahUELrr.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-D4ebrcNR.js.map → AdminDashboard-CahUELrr.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DP4KUuCX.js → AgentConfigPage-CkMv-cTV.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-DP4KUuCX.js.map → AgentConfigPage-CkMv-cTV.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-ktYiR1kq.js → AgentDetailPage-ZGea3Z4A.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-ktYiR1kq.js.map → AgentDetailPage-ZGea3Z4A.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-B4iqm4-h.js → AgentsPage-BMWSUJGi.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-B4iqm4-h.js.map → AgentsPage-BMWSUJGi.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-tL3mM1RG.js → AvailableEscalationsPage-BjsbfsWW.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-tL3mM1RG.js.map → AvailableEscalationsPage-BjsbfsWW.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CLrJuHnW.js → BotPicker-DN8tq7pz.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CLrJuHnW.js.map → BotPicker-DN8tq7pz.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DG5V0tMT.js → CapabilitiesPage-EAO3Ae0S.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DG5V0tMT.js.map → CapabilitiesPage-EAO3Ae0S.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CvLHvVfU.js → CollapsibleSection-J-RejbjG.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CvLHvVfU.js.map → CollapsibleSection-J-RejbjG.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-Co57-iLY.js → CountdownTimer-Dw8N9tmQ.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-Co57-iLY.js.map → CountdownTimer-Dw8N9tmQ.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-qCJZ3rdi.js → CredentialsPage-CTurxwRn.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-qCJZ3rdi.js.map → CredentialsPage-CTurxwRn.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-C3iKifDN.js → CronLabel-DZ5TmIQG.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-C3iKifDN.js.map → CronLabel-DZ5TmIQG.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-C-Szl4rU.js → CustomDurationPicker-BES_FTrm.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-C-Szl4rU.js.map → CustomDurationPicker-BES_FTrm.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CamZk5o1.js → ElapsedCell-CIGRporU.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CamZk5o1.js.map → ElapsedCell-CIGRporU.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js +2 -0
- package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js.map +1 -0
- package/dashboard/dist/assets/{EscalationListSchemaPage-BddDSfjl.js → EscalationListSchemaPage-DOrv-quD.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-BddDSfjl.js.map → EscalationListSchemaPage-DOrv-quD.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BRyCtw9R.js → EscalationSchemaPage-DAOVAxAM.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-BRyCtw9R.js.map → EscalationSchemaPage-DAOVAxAM.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DUWYxJyD.js → EscalationsOverview-B27sDn5O.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DUWYxJyD.js.map → EscalationsOverview-B27sDn5O.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CtVuCgq6.js → EventTable-Co1d40Qq.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CtVuCgq6.js.map → EventTable-Co1d40Qq.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BYsBgOiE.js → FilterBar-2ZfU21EA.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BYsBgOiE.js.map → FilterBar-2ZfU21EA.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-CA4skPN2.js → GraphInvokePage-pdvc9VSv.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-CA4skPN2.js.map → GraphInvokePage-pdvc9VSv.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-DwG-AnjQ.js → HomePage-CLlDsBnw.js} +2 -2
- package/dashboard/dist/assets/{HomePage-DwG-AnjQ.js.map → HomePage-CLlDsBnw.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-D86IN_hQ.js → ListToolbar-DMremj2e.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-D86IN_hQ.js.map → ListToolbar-DMremj2e.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CoEHGseD.js → McpOverview-BhztmhoL.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CoEHGseD.js.map → McpOverview-BhztmhoL.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-C9hMgJe1.js → McpQueryDetailPage-BseZfrhc.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-C9hMgJe1.js.map → McpQueryDetailPage-BseZfrhc.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-B20Zn4QX.js → McpQueryPage-DMzkble7.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-B20Zn4QX.js.map → McpQueryPage-DMzkble7.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DDKHf-3R.js → McpRunDetailPage-DqaBQAnn.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DDKHf-3R.js.map → McpRunDetailPage-DqaBQAnn.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Puyn3iJr.js → McpRunsPage-Du8GnHFv.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Puyn3iJr.js.map → McpRunsPage-Du8GnHFv.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-CL2feqwS.js +3 -0
- package/dashboard/dist/assets/OperationsPage-CL2feqwS.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-CXBbFLAL.js → OperatorDashboard-BHiGQZN_.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CXBbFLAL.js.map → OperatorDashboard-BHiGQZN_.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-BN5xNDDX.js → PersonaDetailPage-D6GGZgUS.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BN5xNDDX.js.map → PersonaDetailPage-D6GGZgUS.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-Bdtv6HPZ.js → PersonasPage-BQYCdmAs.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-Bdtv6HPZ.js.map → PersonasPage-BQYCdmAs.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BMg70ZAJ.js → ProcessDetailPage-P45jOLim.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BMg70ZAJ.js.map → ProcessDetailPage-P45jOLim.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-_KvdxGhL.js → ProcessesListPage-CgdzgCY6.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-_KvdxGhL.js.map → ProcessesListPage-CgdzgCY6.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-BM5BXc7j.js → RoleDetailPage-Dme2pa9z.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-BM5BXc7j.js.map → RoleDetailPage-Dme2pa9z.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-Bv23VmUi.js → RolesPage-Ci7_PbPt.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-Bv23VmUi.js.map → RolesPage-Ci7_PbPt.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-D-Sjr7uB.js → RunAsSelector-CB0pV097.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-D-Sjr7uB.js.map → RunAsSelector-CB0pV097.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-s3OEMJno.js → ScanCodesPage-DpbPhAj1.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-s3OEMJno.js.map → ScanCodesPage-DpbPhAj1.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-D8WQkZmw.js → ScanSchemeDetailPage-CGnMGlt0.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-D8WQkZmw.js.map → ScanSchemeDetailPage-CGnMGlt0.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-CkRQaH5G.js → ScanStationPage-BTeV7TGy.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-CkRQaH5G.js.map → ScanStationPage-BTeV7TGy.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BpTIMOL5.js → StickyPagination-DH-0JEyx.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BpTIMOL5.js.map → StickyPagination-DH-0JEyx.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-ChoWrZzO.js → StreamMessageDetail-u-pDrHfS.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-ChoWrZzO.js.map → StreamMessageDetail-u-pDrHfS.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-nmIqEuEH.js → SwimlaneTimeline-vN1N8BGy.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-nmIqEuEH.js.map → SwimlaneTimeline-vN1N8BGy.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-KajZD2Cp.js → TaskDetailPage-CAQm6avs.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-KajZD2Cp.js.map → TaskDetailPage-CAQm6avs.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CiqSfapP.js → TasksListPage-C1bT3DT9.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CiqSfapP.js.map → TasksListPage-C1bT3DT9.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-ClauexJj.js → TimeAgo-qZxkJ8Am.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-ClauexJj.js.map → TimeAgo-qZxkJ8Am.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CXmbCnAJ.js → TimestampCell-CC3dz6FG.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CXmbCnAJ.js.map → TimestampCell-CC3dz6FG.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DFUU0zGv.js → ToolTestPanel-C3sSQUvw.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DFUU0zGv.js.map → ToolTestPanel-C3sSQUvw.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DuN5BrsI.js → TopicDetailPage-ClI0I8Mu.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-DuN5BrsI.js.map → TopicDetailPage-ClI0I8Mu.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DZ1NQdYG.js → TopicsPage-CNf2VZud.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DZ1NQdYG.js.map → TopicsPage-CNf2VZud.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BPHG_MQs.js → UserName-BdMHmyL3.js} +2 -2
- package/dashboard/dist/assets/{UserName-BPHG_MQs.js.map → UserName-BdMHmyL3.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-D_Z-tIjR.js → WorkflowExecutionPage-Ba4mYFoW.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-D_Z-tIjR.js.map → WorkflowExecutionPage-Ba4mYFoW.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-VMBW1WuR.js → WorkflowsDashboard-ImEm16tX.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-VMBW1WuR.js.map → WorkflowsDashboard-ImEm16tX.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CUOXXcpg.js → WorkflowsOverview-BpWyV_tj.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CUOXXcpg.js.map → WorkflowsOverview-BpWyV_tj.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CsfzbboC.js → YamlWorkflowDetailPage-BFBlw1YY.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CsfzbboC.js.map → YamlWorkflowDetailPage-BFBlw1YY.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BpgKLSGT.js → YamlWorkflowsPage-C9gxapRg.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BpgKLSGT.js.map → YamlWorkflowsPage-C9gxapRg.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Cg2FVYQP.js → agents-BJQtJTiz.js} +2 -2
- package/dashboard/dist/assets/{agents-Cg2FVYQP.js.map → agents-BJQtJTiz.js.map} +1 -1
- package/dashboard/dist/assets/{bots-vtVLRKGt.js → bots-DDlU1gMy.js} +2 -2
- package/dashboard/dist/assets/{bots-vtVLRKGt.js.map → bots-DDlU1gMy.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DLsXhwlD.js → capabilities-qYrUpdid.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DLsXhwlD.js.map → capabilities-qYrUpdid.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Js7dxpX4.js → controlplane-DnJ1VDTs.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Js7dxpX4.js.map → controlplane-DnJ1VDTs.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-h0NLAJss.js → escalation-columns-BCnVWr_n.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-h0NLAJss.js.map → escalation-columns-BCnVWr_n.js.map} +1 -1
- package/dashboard/dist/assets/{index-DlO3bCfu.js → index-04QQsxMp.js} +2 -2
- package/dashboard/dist/assets/{index-DlO3bCfu.js.map → index-04QQsxMp.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bcv5k8Dw.js → index-B5q8ksfv.js} +2 -2
- package/dashboard/dist/assets/{index-Bcv5k8Dw.js.map → index-B5q8ksfv.js.map} +1 -1
- package/dashboard/dist/assets/{index-FYQ9yPhO.js → index-BAqQSgxn.js} +2 -2
- package/dashboard/dist/assets/{index-FYQ9yPhO.js.map → index-BAqQSgxn.js.map} +1 -1
- package/dashboard/dist/assets/{index-7c7FEe5S.js → index-BHbO4F8Z.js} +2 -2
- package/dashboard/dist/assets/{index-7c7FEe5S.js.map → index-BHbO4F8Z.js.map} +1 -1
- package/dashboard/dist/assets/{index-KcaVfpWn.js → index-BUpB9ezn.js} +2 -2
- package/dashboard/dist/assets/{index-KcaVfpWn.js.map → index-BUpB9ezn.js.map} +1 -1
- package/dashboard/dist/assets/{index-CcjdA7jA.js → index-C991QfUN.js} +3 -3
- package/dashboard/dist/assets/{index-CcjdA7jA.js.map → index-C991QfUN.js.map} +1 -1
- package/dashboard/dist/assets/{index-BTzhV9ST.js → index-CFlmubaP.js} +2 -2
- package/dashboard/dist/assets/{index-BTzhV9ST.js.map → index-CFlmubaP.js.map} +1 -1
- package/dashboard/dist/assets/{index-BvVJ538E.js → index-CroJTX8g.js} +2 -2
- package/dashboard/dist/assets/{index-BvVJ538E.js.map → index-CroJTX8g.js.map} +1 -1
- package/dashboard/dist/assets/{index-BjfoWzJL.js → index-CtAPxA03.js} +2 -2
- package/dashboard/dist/assets/{index-BjfoWzJL.js.map → index-CtAPxA03.js.map} +1 -1
- package/dashboard/dist/assets/{index-DQi6CjqF.js → index-D-5F3Bw-.js} +2 -2
- package/dashboard/dist/assets/{index-DQi6CjqF.js.map → index-D-5F3Bw-.js.map} +1 -1
- package/dashboard/dist/assets/{index-DglcqBHn.js → index-DhRdWzz0.js} +2 -2
- package/dashboard/dist/assets/{index-DglcqBHn.js.map → index-DhRdWzz0.js.map} +1 -1
- package/dashboard/dist/assets/{index-vAkZ5dZe.js → index-KotwPxGB.js} +2 -2
- package/dashboard/dist/assets/{index-vAkZ5dZe.js.map → index-KotwPxGB.js.map} +1 -1
- package/dashboard/dist/assets/{index-CSpTj5DB.js → index-LiLVAQzB.js} +2 -2
- package/dashboard/dist/assets/{index-CSpTj5DB.js.map → index-LiLVAQzB.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-Bkvl3cIz.js → knowledge-CnMeg8Rw.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Bkvl3cIz.js.map → knowledge-CnMeg8Rw.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DEtDLeIQ.js → mcp-CHPSFv7m.js} +2 -2
- package/dashboard/dist/assets/{mcp-DEtDLeIQ.js.map → mcp-CHPSFv7m.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BCRgnt0K.js → mcp-query-C19EGwdN.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BCRgnt0K.js.map → mcp-query-C19EGwdN.js.map} +1 -1
- package/dashboard/dist/assets/{personas-CABKq-0L.js → personas-Br1Vo2S3.js} +2 -2
- package/dashboard/dist/assets/{personas-CABKq-0L.js.map → personas-Br1Vo2S3.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-fuN8dVNl.js → pipelines-QMrFoJZX.js} +2 -2
- package/dashboard/dist/assets/{pipelines-fuN8dVNl.js.map → pipelines-QMrFoJZX.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-u3YPNJBo.js → tasks-Doy_7cGX.js} +2 -2
- package/dashboard/dist/assets/{tasks-u3YPNJBo.js.map → tasks-Doy_7cGX.js.map} +1 -1
- package/dashboard/dist/assets/{topics-D37_RAIT.js → topics-BcJS4G09.js} +2 -2
- package/dashboard/dist/assets/{topics-D37_RAIT.js.map → topics-BcJS4G09.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BbXfrFbq.js → useEventHooks-ldE5o0ok.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BbXfrFbq.js.map → useEventHooks-ldE5o0ok.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DvuoFTda.js → useNamespace-CCu8fZc6.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DvuoFTda.js.map → useNamespace-CCu8fZc6.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CL-Uf2cb.js → useYamlActivityEvents-DDrXwFXX.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CL-Uf2cb.js.map → useYamlActivityEvents-DDrXwFXX.js.map} +1 -1
- package/dashboard/dist/assets/{users-CMxw_HzK.js → users-BvKhSq1i.js} +2 -2
- package/dashboard/dist/assets/{users-CMxw_HzK.js.map → users-BvKhSq1i.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-Bez-o6fu.js → workflows-D09ysQF1.js} +2 -2
- package/dashboard/dist/assets/{workflows-Bez-o6fu.js.map → workflows-D09ysQF1.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-NrXcLsNm.js → yaml-workflows-BFHrxEl4.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-NrXcLsNm.js.map → yaml-workflows-BFHrxEl4.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/domain-dictionary.md +115 -0
- package/docs/events.md +8 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-CABCW2dS.js +0 -2
- package/dashboard/dist/assets/EntityTimelinePanel-CABCW2dS.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-Bsrt4XTL.js +0 -3
- package/dashboard/dist/assets/OperationsPage-Bsrt4XTL.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── Domain dictionary queries ──────────────────────────────────────────────
|
|
3
|
+
// One row per deployment (lt_domain, id=1). Reads are whole-doc; writes are
|
|
4
|
+
// whole-doc with optimistic concurrency on `version`.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SEED_DOMAIN = exports.UPSERT_DOMAIN = exports.GET_DOMAIN = void 0;
|
|
7
|
+
exports.GET_DOMAIN = `
|
|
8
|
+
SELECT doc, version, updated_at FROM lt_domain WHERE id = 1`;
|
|
9
|
+
/**
|
|
10
|
+
* Upsert the dictionary in ONE statement. When the caller supplies an
|
|
11
|
+
* expected version ($2 non-null), the update applies only if the stored
|
|
12
|
+
* version matches — zero rows back means a concurrent writer won (409).
|
|
13
|
+
* A null $2 is last-write-wins. Fresh inserts always succeed at version 1.
|
|
14
|
+
*/
|
|
15
|
+
exports.UPSERT_DOMAIN = `
|
|
16
|
+
INSERT INTO lt_domain (id, doc, version, updated_at)
|
|
17
|
+
VALUES (1, $1::jsonb, 1, NOW())
|
|
18
|
+
ON CONFLICT (id) DO UPDATE
|
|
19
|
+
SET doc = EXCLUDED.doc,
|
|
20
|
+
version = lt_domain.version + 1,
|
|
21
|
+
updated_at = NOW()
|
|
22
|
+
WHERE $2::int IS NULL OR lt_domain.version = $2::int
|
|
23
|
+
RETURNING version`;
|
|
24
|
+
/** Seed: first writer wins; an existing row is left untouched. */
|
|
25
|
+
exports.SEED_DOMAIN = `
|
|
26
|
+
INSERT INTO lt_domain (id, doc, version, updated_at)
|
|
27
|
+
VALUES (1, $1::jsonb, 1, NOW())
|
|
28
|
+
ON CONFLICT (id) DO NOTHING
|
|
29
|
+
RETURNING version`;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { DomainDictionary } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Reference validation for the domain dictionary — pure, registry-injected.
|
|
4
|
+
*
|
|
5
|
+
* Roles and workflows are HARD registries: an unknown reference is an error
|
|
6
|
+
* (the PUT path rejects with 422; the boot seed downgrades errors to warnings
|
|
7
|
+
* because hosts may seed roles after long-tail boots). Facet keys are
|
|
8
|
+
* DATA-derived — a legitimate facet may simply have no rows yet — so unknown
|
|
9
|
+
* facets are always warnings. Entity terms without an explicit idFacet get one
|
|
10
|
+
* DERIVED from their role's entity_facet.
|
|
11
|
+
*/
|
|
12
|
+
/** The minimal live-registry snapshot the validator compares against. */
|
|
13
|
+
export interface RegistrySnapshot {
|
|
14
|
+
roles: Array<{
|
|
15
|
+
role: string;
|
|
16
|
+
entity_facet: string | null;
|
|
17
|
+
}>;
|
|
18
|
+
workflowTypes: string[];
|
|
19
|
+
facetKeys: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface DictionaryValidation {
|
|
22
|
+
/** Unknown role/workflow references — reject on write, warn at seed. */
|
|
23
|
+
errors: string[];
|
|
24
|
+
/** Unknown facet keys and other non-fatal notes. */
|
|
25
|
+
warnings: string[];
|
|
26
|
+
/** The dictionary with derived fields filled (entity idFacet). */
|
|
27
|
+
dictionary: DomainDictionary;
|
|
28
|
+
}
|
|
29
|
+
export declare function validateDictionary(dictionary: DomainDictionary, registry: RegistrySnapshot): DictionaryValidation;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateDictionary = validateDictionary;
|
|
4
|
+
const KINDS = new Set(['entity', 'role', 'workflow', 'facet', 'action', 'rule']);
|
|
5
|
+
function rolesOf(term) {
|
|
6
|
+
const out = [];
|
|
7
|
+
if (term.maps_to?.role)
|
|
8
|
+
out.push(term.maps_to.role);
|
|
9
|
+
if (term.maps_to?.roles)
|
|
10
|
+
out.push(...term.maps_to.roles);
|
|
11
|
+
return out;
|
|
12
|
+
}
|
|
13
|
+
function validateDictionary(dictionary, registry) {
|
|
14
|
+
const errors = [];
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const knownRoles = new Map(registry.roles.map((r) => [r.role, r]));
|
|
17
|
+
const knownWorkflows = new Set(registry.workflowTypes);
|
|
18
|
+
const knownFacets = new Set(registry.facetKeys);
|
|
19
|
+
if (!dictionary.name || !dictionary.overview) {
|
|
20
|
+
errors.push('dictionary requires name and overview');
|
|
21
|
+
}
|
|
22
|
+
const terms = (dictionary.terms ?? []).map((t) => {
|
|
23
|
+
const at = `terms["${t.term}"]`;
|
|
24
|
+
if (!KINDS.has(t.kind)) {
|
|
25
|
+
errors.push(`${at}: unknown kind "${t.kind}"`);
|
|
26
|
+
}
|
|
27
|
+
for (const role of rolesOf(t)) {
|
|
28
|
+
if (!knownRoles.has(role)) {
|
|
29
|
+
errors.push(`${at}: role "${role}" is not a live role`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (t.maps_to?.workflow && !knownWorkflows.has(t.maps_to.workflow)) {
|
|
33
|
+
errors.push(`${at}: workflow "${t.maps_to.workflow}" is not a registered workflow`);
|
|
34
|
+
}
|
|
35
|
+
if (t.maps_to?.facet && !knownFacets.has(t.maps_to.facet)) {
|
|
36
|
+
warnings.push(`${at}: facet "${t.maps_to.facet}" is not (yet) a known metadata facet`);
|
|
37
|
+
}
|
|
38
|
+
// Derive the entity's id facet from its role's entity_facet when omitted.
|
|
39
|
+
if (t.kind === 'entity' && !t.idFacet) {
|
|
40
|
+
const derived = rolesOf(t)
|
|
41
|
+
.map((role) => knownRoles.get(role)?.entity_facet)
|
|
42
|
+
.find((f) => !!f);
|
|
43
|
+
if (derived)
|
|
44
|
+
return { ...t, idFacet: derived };
|
|
45
|
+
warnings.push(`${at}: entity has no idFacet and none derivable from its roles`);
|
|
46
|
+
}
|
|
47
|
+
return t;
|
|
48
|
+
});
|
|
49
|
+
return { errors, warnings, dictionary: { ...dictionary, terms } };
|
|
50
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DomainDictionary } from '../../types';
|
|
2
|
+
import { type RegistrySnapshot } from './validate';
|
|
3
|
+
/** Snapshot the live registries the validator compares against. */
|
|
4
|
+
export declare function snapshotRegistries(): Promise<RegistrySnapshot>;
|
|
5
|
+
export type PutDictionaryResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
version: number;
|
|
8
|
+
warnings: string[];
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
reason: 'invalid';
|
|
12
|
+
errors: string[];
|
|
13
|
+
warnings: string[];
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
reason: 'version_conflict';
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Replace the dictionary (whole-doc PUT). Unknown role/workflow references
|
|
20
|
+
* reject; facet warnings return alongside success. `expectedVersion` arms
|
|
21
|
+
* optimistic concurrency — omit for last-write-wins.
|
|
22
|
+
*/
|
|
23
|
+
export declare function putDomainDictionary(dictionary: DomainDictionary, expectedVersion?: number): Promise<PutDictionaryResult>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snapshotRegistries = snapshotRegistries;
|
|
4
|
+
exports.putDomainDictionary = putDomainDictionary;
|
|
5
|
+
const db_1 = require("../../lib/db");
|
|
6
|
+
const role_1 = require("../role");
|
|
7
|
+
const config_1 = require("../config");
|
|
8
|
+
const queries_1 = require("../escalation/queries");
|
|
9
|
+
const validate_1 = require("./validate");
|
|
10
|
+
const read_1 = require("./read");
|
|
11
|
+
const sql_1 = require("./sql");
|
|
12
|
+
/** Snapshot the live registries the validator compares against. */
|
|
13
|
+
async function snapshotRegistries() {
|
|
14
|
+
const [roles, configs, facetKeys] = await Promise.all([
|
|
15
|
+
(0, role_1.listRolesWithDetails)(),
|
|
16
|
+
(0, config_1.listWorkflowConfigs)(),
|
|
17
|
+
(0, queries_1.listFacetKeys)({ global: true }),
|
|
18
|
+
]);
|
|
19
|
+
return {
|
|
20
|
+
roles: roles.map((r) => ({ role: r.role, entity_facet: r.entity_facet })),
|
|
21
|
+
workflowTypes: configs.map((c) => c.workflow_type),
|
|
22
|
+
facetKeys,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Replace the dictionary (whole-doc PUT). Unknown role/workflow references
|
|
27
|
+
* reject; facet warnings return alongside success. `expectedVersion` arms
|
|
28
|
+
* optimistic concurrency — omit for last-write-wins.
|
|
29
|
+
*/
|
|
30
|
+
async function putDomainDictionary(dictionary, expectedVersion) {
|
|
31
|
+
const registry = await snapshotRegistries();
|
|
32
|
+
const { errors, warnings, dictionary: derived } = (0, validate_1.validateDictionary)(dictionary, registry);
|
|
33
|
+
if (errors.length)
|
|
34
|
+
return { ok: false, reason: 'invalid', errors, warnings };
|
|
35
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_DOMAIN, [
|
|
36
|
+
JSON.stringify(derived),
|
|
37
|
+
expectedVersion ?? null,
|
|
38
|
+
]);
|
|
39
|
+
if (rows.length === 0)
|
|
40
|
+
return { ok: false, reason: 'version_conflict' };
|
|
41
|
+
read_1.domainCache.invalidate();
|
|
42
|
+
return { ok: true, version: rows[0].version, warnings };
|
|
43
|
+
}
|
|
@@ -26,6 +26,7 @@ exports.claimByMetadata = claimByMetadata;
|
|
|
26
26
|
exports.resolveByMetadataAtomic = resolveByMetadataAtomic;
|
|
27
27
|
const db_1 = require("../../lib/db");
|
|
28
28
|
const publish_1 = require("../../lib/events/publish");
|
|
29
|
+
const escalation_wire_1 = require("../../lib/events/escalation-wire");
|
|
29
30
|
const client_1 = require("./client");
|
|
30
31
|
const queries_1 = require("./queries");
|
|
31
32
|
const map_1 = require("./map");
|
|
@@ -76,7 +77,7 @@ async function createEscalation(input) {
|
|
|
76
77
|
escalationId: escalation.id,
|
|
77
78
|
role: escalation.role,
|
|
78
79
|
status: 'pending',
|
|
79
|
-
data:
|
|
80
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
80
81
|
});
|
|
81
82
|
return escalation;
|
|
82
83
|
}
|
|
@@ -100,7 +101,7 @@ async function claimEscalation(id, userId, durationMinutes = 30) {
|
|
|
100
101
|
escalationId: escalation.id,
|
|
101
102
|
role: escalation.role,
|
|
102
103
|
status: 'claimed',
|
|
103
|
-
data:
|
|
104
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
104
105
|
});
|
|
105
106
|
return { escalation, isExtension: result.isExtension };
|
|
106
107
|
}
|
|
@@ -141,7 +142,7 @@ async function resolveEscalation(id, resolverPayload, metadata, assertClaim, res
|
|
|
141
142
|
escalationId: escalation.id,
|
|
142
143
|
role: escalation.role,
|
|
143
144
|
status: 'resolved',
|
|
144
|
-
data:
|
|
145
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
145
146
|
});
|
|
146
147
|
return escalation;
|
|
147
148
|
}
|
|
@@ -175,7 +176,7 @@ async function resolveEscalationsByIds(ids, resolverPayload, metadata) {
|
|
|
175
176
|
escalationId: escalation.id,
|
|
176
177
|
role: escalation.role,
|
|
177
178
|
status: 'resolved',
|
|
178
|
-
data:
|
|
179
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
179
180
|
});
|
|
180
181
|
}
|
|
181
182
|
return records;
|
|
@@ -215,7 +216,7 @@ async function resolveEscalationsAllOrNone(items, metadata, assertAssignee, reso
|
|
|
215
216
|
escalationId: escalation.id,
|
|
216
217
|
role: escalation.role,
|
|
217
218
|
status: 'resolved',
|
|
218
|
-
data:
|
|
219
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
219
220
|
});
|
|
220
221
|
}
|
|
221
222
|
return { ok: true, escalations: records };
|
|
@@ -283,7 +284,7 @@ async function cancelEscalation(id) {
|
|
|
283
284
|
escalationId: cancelled.id,
|
|
284
285
|
role: cancelled.role,
|
|
285
286
|
status: 'cancelled',
|
|
286
|
-
data: { reason: 'workflow_terminated' },
|
|
287
|
+
data: (0, escalation_wire_1.escalationEventData)(cancelled, { reason: 'workflow_terminated' }),
|
|
287
288
|
});
|
|
288
289
|
return cancelled;
|
|
289
290
|
}
|
|
@@ -343,7 +344,7 @@ async function releaseEscalation(id, userId) {
|
|
|
343
344
|
escalationId: released.id,
|
|
344
345
|
role: released.role,
|
|
345
346
|
status: 'released',
|
|
346
|
-
data: { released_by: userId },
|
|
347
|
+
data: (0, escalation_wire_1.escalationEventData)(released, { released_by: userId }),
|
|
347
348
|
});
|
|
348
349
|
return released;
|
|
349
350
|
}
|
|
@@ -391,7 +392,7 @@ async function escalateToRole(id, targetRole) {
|
|
|
391
392
|
escalationId: escalation.id,
|
|
392
393
|
role,
|
|
393
394
|
status: 'pending',
|
|
394
|
-
data: { from_role: fromRole, to_role: escalation.role },
|
|
395
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation, { from_role: fromRole, to_role: escalation.role }),
|
|
395
396
|
});
|
|
396
397
|
}
|
|
397
398
|
return escalation;
|
|
@@ -433,11 +434,14 @@ async function getEscalationsByWorkflowId(workflowId) {
|
|
|
433
434
|
async function cancelEscalationsByWorkflowId(workflowId) {
|
|
434
435
|
await (0, client_1.ensureEscalationCompatView)();
|
|
435
436
|
const pool = (0, db_1.getPool)();
|
|
437
|
+
// RETURNING * so each cancelled row publishes the SAME wire projection as the
|
|
438
|
+
// single-row cancel path (escalationEventData strips the heavy JSON columns);
|
|
439
|
+
// no extra query — the UPDATE already returns the rows.
|
|
436
440
|
const { rows } = await pool.query(`UPDATE public.hmsh_escalations
|
|
437
441
|
SET status = 'cancelled', updated_at = NOW()
|
|
438
442
|
WHERE workflow_id = $1
|
|
439
443
|
AND status = 'pending'
|
|
440
|
-
RETURNING
|
|
444
|
+
RETURNING *`, [workflowId]);
|
|
441
445
|
for (const row of rows) {
|
|
442
446
|
publishEscalationChange({
|
|
443
447
|
type: 'escalation.cancelled',
|
|
@@ -448,7 +452,7 @@ async function cancelEscalationsByWorkflowId(workflowId) {
|
|
|
448
452
|
escalationId: row.id,
|
|
449
453
|
role: row.role || '',
|
|
450
454
|
status: 'cancelled',
|
|
451
|
-
data: { reason: 'workflow_terminated' },
|
|
455
|
+
data: (0, escalation_wire_1.escalationEventData)(row, { reason: 'workflow_terminated' }),
|
|
452
456
|
});
|
|
453
457
|
}
|
|
454
458
|
return rows.length;
|
|
@@ -536,7 +540,7 @@ async function claimByMetadata(key, value, userId, durationMinutes = 30, metadat
|
|
|
536
540
|
escalationId: escalation.id,
|
|
537
541
|
role: escalation.role,
|
|
538
542
|
status: 'claimed',
|
|
539
|
-
data:
|
|
543
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation),
|
|
540
544
|
});
|
|
541
545
|
return {
|
|
542
546
|
escalation,
|
|
@@ -597,7 +601,7 @@ async function resolveByMetadataAtomic(key, value, userId, resolverPayload, meta
|
|
|
597
601
|
escalationId: escalation.id,
|
|
598
602
|
role: escalation.role,
|
|
599
603
|
status: 'resolved',
|
|
600
|
-
data: { resolved_by: userId },
|
|
604
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation, { resolved_by: userId }),
|
|
601
605
|
});
|
|
602
606
|
return { outcome: 'resolved', escalation };
|
|
603
607
|
}
|
|
@@ -34,8 +34,8 @@ export declare const findEscalationsSchema: z.ZodObject<{
|
|
|
34
34
|
role?: string | undefined;
|
|
35
35
|
status?: "pending" | "resolved" | undefined;
|
|
36
36
|
type?: string | undefined;
|
|
37
|
-
limit?: number | undefined;
|
|
38
37
|
priority?: number | undefined;
|
|
38
|
+
limit?: number | undefined;
|
|
39
39
|
}>;
|
|
40
40
|
export declare const getProcessSummarySchema: z.ZodObject<{
|
|
41
41
|
workflow_type: z.ZodOptional<z.ZodString>;
|
|
@@ -11,6 +11,36 @@ exports.createUnifiedMcpServer = createUnifiedMcpServer;
|
|
|
11
11
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
12
12
|
const logger_1 = require("../../lib/logger");
|
|
13
13
|
const system_1 = require("../../system");
|
|
14
|
+
const domain_1 = require("../domain");
|
|
15
|
+
/**
|
|
16
|
+
* The MCP `instructions` string. When a domain dictionary is registered,
|
|
17
|
+
* carries its overview + a compact names-only index and points the agent at
|
|
18
|
+
* `get_domain_context` for detail. The full ontology stays behind that tool —
|
|
19
|
+
* only this lightweight index rides every session's context. The dictionary
|
|
20
|
+
* read is TTL-cached and fails soft (null → no instructions).
|
|
21
|
+
*/
|
|
22
|
+
async function buildInstructions() {
|
|
23
|
+
const index = await (0, domain_1.getDomainIndex)();
|
|
24
|
+
if (!index)
|
|
25
|
+
return undefined;
|
|
26
|
+
const kindLines = Object.entries(index.terms)
|
|
27
|
+
.filter(([, names]) => names && names.length)
|
|
28
|
+
.map(([kind, names]) => `${kind}: ${names.join(', ')}`);
|
|
29
|
+
const lines = [
|
|
30
|
+
`# ${index.name} (v${index.version})`,
|
|
31
|
+
'',
|
|
32
|
+
index.overview,
|
|
33
|
+
'',
|
|
34
|
+
'## Deployment dictionary',
|
|
35
|
+
...kindLines,
|
|
36
|
+
index.runbooks.length ? `runbooks: ${index.runbooks.join(', ')}` : '',
|
|
37
|
+
'',
|
|
38
|
+
'Call `get_domain_context` (topic + optional name) before acting on anything ' +
|
|
39
|
+
'whose meaning is deployment-specific — cancel/terminate semantics invert by ' +
|
|
40
|
+
'role, and an entity\'s id facet + roles come from its entry.',
|
|
41
|
+
];
|
|
42
|
+
return lines.filter((l) => l !== '').join('\n');
|
|
43
|
+
}
|
|
14
44
|
// ── Shipped server allowlist ─────────────────────────────────────────────────
|
|
15
45
|
// Only these servers are exposed via the /mcp endpoint.
|
|
16
46
|
// Example servers (playwright, gmail, image-tools) are excluded.
|
|
@@ -89,7 +119,7 @@ function isToolAllowed(toolName, serverName, exposure, callerScopes) {
|
|
|
89
119
|
* the McpServer wrapper and tool registrations are fresh (pure in-memory).
|
|
90
120
|
*/
|
|
91
121
|
async function createUnifiedMcpServer(exposure, callerScopes) {
|
|
92
|
-
const unified = new mcp_js_1.McpServer({ name: 'long-tail', version: '1.0.0' });
|
|
122
|
+
const unified = new mcp_js_1.McpServer({ name: 'long-tail', version: '1.0.0' }, { instructions: await buildInstructions() });
|
|
93
123
|
const registered = new Set();
|
|
94
124
|
for (const [name] of Object.entries(system_1.builtinMcpServerFactories)) {
|
|
95
125
|
if (!isServerAllowed(name, exposure))
|
|
@@ -82,6 +82,8 @@ export declare function getRoleFormSchema(role: string): Promise<Record<string,
|
|
|
82
82
|
* to surface expected keys before any data exists.
|
|
83
83
|
*/
|
|
84
84
|
export declare function getRoleMetadataSchema(role: string): Promise<Record<string, any> | null>;
|
|
85
|
+
/** The role's `properties` bag (incl. the reserved ROLE_PROPERTY_KEYS). One PK read. */
|
|
86
|
+
export declare function getRoleProperties(role: string): Promise<Record<string, any> | null>;
|
|
85
87
|
/**
|
|
86
88
|
* Delete a role. Returns an error message if the role is referenced.
|
|
87
89
|
*/
|
|
@@ -17,6 +17,7 @@ exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
|
|
|
17
17
|
exports.getRoleListSchema = getRoleListSchema;
|
|
18
18
|
exports.getRoleFormSchema = getRoleFormSchema;
|
|
19
19
|
exports.getRoleMetadataSchema = getRoleMetadataSchema;
|
|
20
|
+
exports.getRoleProperties = getRoleProperties;
|
|
20
21
|
exports.deleteRole = deleteRole;
|
|
21
22
|
const db_1 = require("../../lib/db");
|
|
22
23
|
const user_1 = require("../user");
|
|
@@ -238,6 +239,12 @@ async function getRoleMetadataSchema(role) {
|
|
|
238
239
|
const { rows } = await pool.query(sql_1.GET_ROLE_METADATA_SCHEMA, [role]);
|
|
239
240
|
return rows[0]?.metadata_schema ?? null;
|
|
240
241
|
}
|
|
242
|
+
/** The role's `properties` bag (incl. the reserved ROLE_PROPERTY_KEYS). One PK read. */
|
|
243
|
+
async function getRoleProperties(role) {
|
|
244
|
+
const pool = (0, db_1.getPool)();
|
|
245
|
+
const { rows } = await pool.query(sql_1.GET_ROLE_PROPERTIES, [role]);
|
|
246
|
+
return rows[0]?.properties ?? null;
|
|
247
|
+
}
|
|
241
248
|
/**
|
|
242
249
|
* Delete a role. Returns an error message if the role is referenced.
|
|
243
250
|
*/
|
|
@@ -68,6 +68,7 @@ export declare const GET_ROLE_FORM_SCHEMA = "\n SELECT form_schema FROM lt_role
|
|
|
68
68
|
*/
|
|
69
69
|
export declare const LIST_ENFORCING_ROLES = "\n SELECT role FROM lt_roles WHERE enforce_schema";
|
|
70
70
|
export declare const GET_ROLE_METADATA_SCHEMA = "\n SELECT metadata_schema FROM lt_roles WHERE role = $1";
|
|
71
|
+
export declare const GET_ROLE_PROPERTIES = "\n SELECT properties FROM lt_roles WHERE role = $1";
|
|
71
72
|
export declare const GET_ROLE_UPSTREAMS = "\n SELECT upstream_role FROM lt_role_upstreams WHERE role = $1 ORDER BY upstream_role";
|
|
72
73
|
export declare const LIST_ROLE_SCHEMA_VERSIONS = "\n SELECT\n s.version,\n s.form_schema IS NOT NULL AS has_form_schema,\n s.metadata_schema IS NOT NULL AS has_metadata_schema,\n s.change_summary,\n s.created_at,\n s.version = r.current_schema_version AS is_current\n FROM lt_role_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1\n ORDER BY s.version DESC";
|
|
73
74
|
export declare const GET_ROLE_SCHEMA_VERSION = "\n SELECT s.role, s.version, s.form_schema, s.metadata_schema,\n s.change_summary, s.created_at, r.current_schema_version AS latest_version\n FROM lt_role_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1 AND s.version = $2";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─── Escalation chain queries ───────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_LIST_SCHEMA_CURRENT = exports.GET_ROLE_LIST_SCHEMA_VERSION = exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_METADATA_SCHEMA = exports.LIST_ENFORCING_ROLES = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
|
|
4
|
+
exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_LIST_SCHEMA_CURRENT = exports.GET_ROLE_LIST_SCHEMA_VERSION = exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_PROPERTIES = exports.GET_ROLE_METADATA_SCHEMA = exports.LIST_ENFORCING_ROLES = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
|
|
5
5
|
exports.GET_ESCALATION_TARGETS = `
|
|
6
6
|
SELECT target_role
|
|
7
7
|
FROM lt_config_role_escalations
|
|
@@ -168,6 +168,8 @@ exports.LIST_ENFORCING_ROLES = `
|
|
|
168
168
|
SELECT role FROM lt_roles WHERE enforce_schema`;
|
|
169
169
|
exports.GET_ROLE_METADATA_SCHEMA = `
|
|
170
170
|
SELECT metadata_schema FROM lt_roles WHERE role = $1`;
|
|
171
|
+
exports.GET_ROLE_PROPERTIES = `
|
|
172
|
+
SELECT properties FROM lt_roles WHERE role = $1`;
|
|
171
173
|
exports.GET_ROLE_UPSTREAMS = `
|
|
172
174
|
SELECT upstream_role FROM lt_role_upstreams WHERE role = $1 ORDER BY upstream_role`;
|
|
173
175
|
// ─── Versioned role schemas ─────────────────────────────────────────────────
|
|
@@ -3,6 +3,21 @@ export interface EscalationChain {
|
|
|
3
3
|
source_role: string;
|
|
4
4
|
target_role: string;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Reserved keys inside `lt_roles.properties` — the role's verb semantics for
|
|
8
|
+
* the domain dictionary. Everything else in the bag is user-owned. Values are
|
|
9
|
+
* plain strings; readers type-guard (the bag is open, PATCH can write anything).
|
|
10
|
+
*
|
|
11
|
+
* - ON_CANCEL: what cancel MEANS for this row class, imperative
|
|
12
|
+
* (e.g. "reset — the dispatcher re-mints the attempt").
|
|
13
|
+
* - ON_TIMEOUT: expiry semantics for this row class.
|
|
14
|
+
* - WORKED_BY: who works this queue ("humans at the dashboard" | "machines" | "both").
|
|
15
|
+
*/
|
|
16
|
+
export declare const ROLE_PROPERTY_KEYS: {
|
|
17
|
+
readonly ON_CANCEL: "on_cancel";
|
|
18
|
+
readonly ON_TIMEOUT: "on_timeout";
|
|
19
|
+
readonly WORKED_BY: "worked_by";
|
|
20
|
+
};
|
|
6
21
|
export interface RoleDetail {
|
|
7
22
|
role: string;
|
|
8
23
|
title: string | null;
|
|
@@ -17,7 +32,8 @@ export interface RoleDetail {
|
|
|
17
32
|
* and creation-time metadata validation.
|
|
18
33
|
*/
|
|
19
34
|
metadata_schema: Record<string, any> | null;
|
|
20
|
-
/** Free-form user-owned bag
|
|
35
|
+
/** Free-form user-owned bag (icons, colors, tags, …), plus the reserved
|
|
36
|
+
* domain-semantics keys in ROLE_PROPERTY_KEYS (on_cancel, on_timeout, worked_by). */
|
|
21
37
|
properties: Record<string, any>;
|
|
22
38
|
ops_visible: boolean;
|
|
23
39
|
/**
|
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/** Type definitions for the role and escalation chain service. */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ROLE_PROPERTY_KEYS = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Reserved keys inside `lt_roles.properties` — the role's verb semantics for
|
|
7
|
+
* the domain dictionary. Everything else in the bag is user-owned. Values are
|
|
8
|
+
* plain strings; readers type-guard (the bag is open, PATCH can write anything).
|
|
9
|
+
*
|
|
10
|
+
* - ON_CANCEL: what cancel MEANS for this row class, imperative
|
|
11
|
+
* (e.g. "reset — the dispatcher re-mints the attempt").
|
|
12
|
+
* - ON_TIMEOUT: expiry semantics for this row class.
|
|
13
|
+
* - WORKED_BY: who works this queue ("humans at the dashboard" | "machines" | "both").
|
|
14
|
+
*/
|
|
15
|
+
exports.ROLE_PROPERTY_KEYS = {
|
|
16
|
+
ON_CANCEL: 'on_cancel',
|
|
17
|
+
ON_TIMEOUT: 'on_timeout',
|
|
18
|
+
WORKED_BY: 'worked_by',
|
|
19
|
+
};
|
package/build/start/workers.js
CHANGED
|
@@ -273,6 +273,12 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
|
|
|
273
273
|
await seedSystemTopics();
|
|
274
274
|
if (startConfig.topics?.length)
|
|
275
275
|
await seedConfigTopics(startConfig.topics);
|
|
276
|
+
// Seed the domain dictionary (every container, workers or not) — insert-if-
|
|
277
|
+
// absent with warn-only reference validation; the DB row is runtime truth.
|
|
278
|
+
if (startConfig.mcp?.domainDictionaryPath) {
|
|
279
|
+
const { seedDomainDictionary } = await Promise.resolve().then(() => __importStar(require('../services/domain')));
|
|
280
|
+
await seedDomainDictionary(startConfig.mcp.domainDictionaryPath);
|
|
281
|
+
}
|
|
276
282
|
// Seed example topics when examples are enabled
|
|
277
283
|
if (startConfig.examples) {
|
|
278
284
|
try {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_domain_context — the deployment's domain dictionary, merged with live
|
|
3
|
+
* platform state so an agent can translate domain speech into primitive calls.
|
|
4
|
+
*
|
|
5
|
+
* The dictionary (lt_domain, TTL-cached) holds the semantic overlay: jargon
|
|
6
|
+
* terms mapped to roles/workflows/facets/verbs, guidance, runbooks. This tool
|
|
7
|
+
* JOINS it with the live registries at call time — role entries carry the live
|
|
8
|
+
* row's title/description/entity_facet plus its properties verb semantics
|
|
9
|
+
* (on_cancel/on_timeout/worked_by); workflow entries carry the live config;
|
|
10
|
+
* entity entries carry the id facet derived from their role. References to
|
|
11
|
+
* since-removed roles/workflows are annotated, never thrown. Read-safe.
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
+
export declare function registerDomainContextTools(server: McpServer): void;
|