@hotmeshio/long-tail 0.13.0 → 0.14.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/announcements.d.ts +22 -0
- package/build/api/announcements.js +96 -0
- package/build/api/auth-sso.d.ts +6 -3
- package/build/api/auth-sso.js +6 -3
- package/build/api/escalations/list.d.ts +8 -0
- package/build/api/escalations/list.js +14 -4
- package/build/api/index.d.ts +1 -0
- package/build/api/index.js +2 -1
- package/build/api/workflows/config.d.ts +1 -0
- package/build/api/workflows/config.js +1 -0
- package/build/api/workflows/discovery.js +1 -0
- package/build/lib/db/schemas/031_announcements.sql +30 -0
- package/build/lib/db/schemas/032_workflow_read_safe.sql +9 -0
- package/build/lib/events/publish.d.ts +15 -0
- package/build/lib/events/publish.js +22 -0
- package/build/modules/auth.js +9 -3
- package/build/routes/announcements.d.ts +2 -0
- package/build/routes/announcements.js +64 -0
- package/build/routes/auth-sso.js +6 -1
- package/build/routes/escalations/list.js +2 -0
- package/build/routes/index.js +2 -0
- package/build/services/announcement/index.d.ts +30 -0
- package/build/services/announcement/index.js +29 -0
- package/build/services/announcement/sql.d.ts +8 -0
- package/build/services/announcement/sql.js +24 -0
- package/build/services/config/cache.js +1 -0
- package/build/services/config/read.js +2 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +6 -5
- package/build/services/config/write.js +5 -0
- package/build/services/scan-code/index.d.ts +1 -1
- package/build/services/scan-code/index.js +3 -1
- package/build/services/scan-code/sql.d.ts +7 -0
- package/build/services/scan-code/sql.js +55 -1
- package/build/services/scan-code/write.d.ts +8 -0
- package/build/services/scan-code/write.js +23 -1
- package/build/services/topics/system-topics.js +20 -0
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +3 -0
- package/build/shared/form-validation/validate-resolver-payload.js +19 -0
- package/build/shared/form-validation/x-lt-labels.d.ts +17 -6
- package/build/shared/form-validation/x-lt-labels.js +12 -4
- package/build/shared/form-validation/x-lt-require-any.d.ts +22 -0
- package/build/shared/form-validation/x-lt-require-any.js +41 -0
- package/build/start/workers.js +50 -0
- package/build/system/mcp-servers/admin/announcements.d.ts +7 -0
- package/build/system/mcp-servers/admin/announcements.js +69 -0
- package/build/system/mcp-servers/admin/index.js +5 -3
- package/build/system/mcp-servers/admin/workflows.js +45 -0
- package/build/system/seed/tool-manifests-admin.d.ts +357 -0
- package/build/system/seed/tool-manifests-admin.js +3 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/auth.d.ts +21 -7
- package/build/types/config.d.ts +8 -0
- package/build/types/index.d.ts +1 -1
- package/build/types/startup.d.ts +57 -0
- package/dashboard/dist/assets/{AdminDashboard-D2unnS2b.js → AdminDashboard-DeZsR4pA.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-D2unnS2b.js.map → AdminDashboard-DeZsR4pA.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CBkf403g.js → AgentConfigPage-Bi5ZAsjf.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-CBkf403g.js.map → AgentConfigPage-Bi5ZAsjf.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CAIU3yzo.js → AgentDetailPage-CIbKor5E.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-CAIU3yzo.js.map → AgentDetailPage-CIbKor5E.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-qP9fWMyT.js → AgentsPage-CRFZ6KDu.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-qP9fWMyT.js.map → AgentsPage-CRFZ6KDu.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DDsmXjpi.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-BN-MKITV.js → BotPicker-dUpw1wW6.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-BN-MKITV.js.map → BotPicker-dUpw1wW6.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-CJfmWokN.js → CapabilitiesPage-Ca2jEln-.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-CJfmWokN.js.map → CapabilitiesPage-Ca2jEln-.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BvMHlHyt.js → CollapsibleSection-BXlR5QmW.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BvMHlHyt.js.map → CollapsibleSection-BXlR5QmW.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-rnoWmFqx.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-2TvvRwGJ.js → CredentialsPage-CGyCCzGh.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-2TvvRwGJ.js.map → CredentialsPage-CGyCCzGh.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-HxmsDSnV.js → CronLabel-CAu2hmQf.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-HxmsDSnV.js.map → CronLabel-CAu2hmQf.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-hlnadaFt.js.map +1 -0
- package/dashboard/dist/assets/{ElapsedCell-BkRu9Xpd.js → ElapsedCell-B1eoCzEw.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BkRu9Xpd.js.map → ElapsedCell-B1eoCzEw.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel--E6hLMCM.js → EntityTimelinePanel-CIOyjwjM.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel--E6hLMCM.js.map → EntityTimelinePanel-CIOyjwjM.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CdFtqEEX.js → EscalationListSchemaPage-DQNQ7o_4.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-CdFtqEEX.js.map → EscalationListSchemaPage-DQNQ7o_4.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BsjS2axz.js → EscalationSchemaPage-DFgDn4R3.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-BsjS2axz.js.map → EscalationSchemaPage-DFgDn4R3.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-FL-xteVc.js → EscalationsOverview-DfbKtXVZ.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-FL-xteVc.js.map → EscalationsOverview-DfbKtXVZ.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BOcgZ78i.js → EventTable-CZPkvhao.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BOcgZ78i.js.map → EventTable-CZPkvhao.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DfCiCmm-.js → FilterBar-CYjKK9Cp.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DfCiCmm-.js.map → FilterBar-CYjKK9Cp.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DfVeiN-8.js → GraphInvokePage-DY9u42vt.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DfVeiN-8.js.map → GraphInvokePage-DY9u42vt.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-C2IhF9WB.js → HomePage-p_CYlGnh.js} +2 -2
- package/dashboard/dist/assets/{HomePage-C2IhF9WB.js.map → HomePage-p_CYlGnh.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-DA0PTOl5.js → ListToolbar-Dz-1RXSH.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-DA0PTOl5.js.map → ListToolbar-Dz-1RXSH.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DstPch5M.js → McpOverview-BUI9sVTk.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DstPch5M.js.map → McpOverview-BUI9sVTk.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-Csv0PKE0.js → McpQueryDetailPage-CVN_UAB3.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-Csv0PKE0.js.map → McpQueryDetailPage-CVN_UAB3.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-DxmqCkly.js → McpQueryPage-DRTKSPDR.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-DxmqCkly.js.map → McpQueryPage-DRTKSPDR.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CcJOlp_B.js → McpRunDetailPage-CTb1AxR3.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CcJOlp_B.js.map → McpRunDetailPage-CTb1AxR3.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BZCR043j.js → McpRunsPage-BWLwjVd0.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BZCR043j.js.map → McpRunsPage-BWLwjVd0.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-DMsPXITh.js → OperationsPage-BSl_oUAJ.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-DMsPXITh.js.map → OperationsPage-BSl_oUAJ.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DSloftQ5.js → OperatorDashboard-DGs9kPOZ.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DSloftQ5.js.map → OperatorDashboard-DGs9kPOZ.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-jDVRCLbU.js → PersonaDetailPage-C33MgXUY.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-jDVRCLbU.js.map → PersonaDetailPage-C33MgXUY.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DnDDwXoy.js → PersonasPage-BbLOHq5X.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DnDDwXoy.js.map → PersonasPage-BbLOHq5X.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CfAUU6q2.js → ProcessDetailPage-zwd0HCJl.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CfAUU6q2.js.map → ProcessDetailPage-zwd0HCJl.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CnAXzaVv.js → ProcessesListPage-DnfmK6jf.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CnAXzaVv.js.map → ProcessesListPage-DnfmK6jf.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-Dg1p6Qz_.js → RoleDetailPage-axZtFPC_.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-Dg1p6Qz_.js.map → RoleDetailPage-axZtFPC_.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DeRVQux8.js → RolesPage-DN6yqH7-.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DeRVQux8.js.map → RolesPage-DN6yqH7-.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BFNqQGuG.js → RunAsSelector-DrGsUhL8.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BFNqQGuG.js.map → RunAsSelector-DrGsUhL8.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-D0GOdk5m.js → ScanCodesPage-BmQjEyWZ.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-D0GOdk5m.js.map → ScanCodesPage-BmQjEyWZ.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-VODehqGs.js.map +1 -0
- package/dashboard/dist/assets/{ScanStationPage-DH1ynTX9.js → ScanStationPage-Y-9Gs7t5.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-DH1ynTX9.js.map → ScanStationPage-Y-9Gs7t5.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-B99hVu95.js → StickyPagination-9VkHiOsT.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B99hVu95.js.map → StickyPagination-9VkHiOsT.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-DcDGISrv.js → StreamMessageDetail-C37J6Qyz.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DcDGISrv.js.map → StreamMessageDetail-C37J6Qyz.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BP3mSQAg.js → SwimlaneTimeline-NVGsBIX-.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BP3mSQAg.js.map → SwimlaneTimeline-NVGsBIX-.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-_XWLJzt-.js → TaskDetailPage-5sbMHi5U.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-_XWLJzt-.js.map → TaskDetailPage-5sbMHi5U.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-iGriKiO2.js → TasksListPage-C9AN7IBb.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-iGriKiO2.js.map → TasksListPage-C9AN7IBb.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BO33VeFl.js → TimeAgo-CsbQGlSd.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BO33VeFl.js.map → TimeAgo-CsbQGlSd.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-KAjX7w35.js → TimestampCell-DlbIkV-G.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-KAjX7w35.js.map → TimestampCell-DlbIkV-G.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BchG2yC6.js → ToolTestPanel-BKbLocvr.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BchG2yC6.js.map → ToolTestPanel-BKbLocvr.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BaK8H0o1.js → TopicDetailPage-fOnTfDso.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-BaK8H0o1.js.map → TopicDetailPage-fOnTfDso.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DEyvm669.js → TopicsPage-BoVkp7DM.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DEyvm669.js.map → TopicsPage-BoVkp7DM.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BV6SKI9P.js → UserName-0gjVPU_U.js} +2 -2
- package/dashboard/dist/assets/{UserName-BV6SKI9P.js.map → UserName-0gjVPU_U.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-1sKoEFNC.js → WorkflowExecutionPage-B28OxTS_.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-1sKoEFNC.js.map → WorkflowExecutionPage-B28OxTS_.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-YTHDZZOD.js → WorkflowsDashboard-Bzvz6tTY.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-YTHDZZOD.js.map → WorkflowsDashboard-Bzvz6tTY.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-ucXPLTtm.js → WorkflowsOverview-BkcRU4Ej.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-ucXPLTtm.js.map → WorkflowsOverview-BkcRU4Ej.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C_RTZKqZ.js → YamlWorkflowDetailPage-CmM78sYi.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C_RTZKqZ.js.map → YamlWorkflowDetailPage-CmM78sYi.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Usid3w2W.js → YamlWorkflowsPage-Dp6vG1au.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Usid3w2W.js.map → YamlWorkflowsPage-Dp6vG1au.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BTDsRK8e.js → agents-MeqzOPD6.js} +2 -2
- package/dashboard/dist/assets/{agents-BTDsRK8e.js.map → agents-MeqzOPD6.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DxLrfdfr.js → bots-DTGXnvX_.js} +2 -2
- package/dashboard/dist/assets/{bots-DxLrfdfr.js.map → bots-DTGXnvX_.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DbTmeW-S.js → capabilities-BjlARR7F.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DbTmeW-S.js.map → capabilities-BjlARR7F.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CEBntAL4.js → controlplane-DMYI0OaL.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CEBntAL4.js.map → controlplane-DMYI0OaL.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Carqdwoh.js → escalation-columns-BMO_H3cb.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Carqdwoh.js.map → escalation-columns-BMO_H3cb.js.map} +1 -1
- package/dashboard/dist/assets/{index-De8iV1y2.js → index-3QEnMBNG.js} +2 -2
- package/dashboard/dist/assets/{index-De8iV1y2.js.map → index-3QEnMBNG.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bqm4zu46.js → index-B3FzpDEG.js} +2 -2
- package/dashboard/dist/assets/{index-Bqm4zu46.js.map → index-B3FzpDEG.js.map} +1 -1
- package/dashboard/dist/assets/{index-cFHoANSG.css → index-B5jxf81r.css} +1 -1
- package/dashboard/dist/assets/{index-DBXm49S6.js → index-BU4oujVO.js} +30 -29
- package/dashboard/dist/assets/index-BU4oujVO.js.map +1 -0
- package/dashboard/dist/assets/{index-kes8V4Xw.js → index-CGCD5hTX.js} +2 -2
- package/dashboard/dist/assets/{index-kes8V4Xw.js.map → index-CGCD5hTX.js.map} +1 -1
- package/dashboard/dist/assets/{index-BhapT-Vl.js → index-Ch-OS1pk.js} +2 -2
- package/dashboard/dist/assets/{index-BhapT-Vl.js.map → index-Ch-OS1pk.js.map} +1 -1
- package/dashboard/dist/assets/{index-B9m7fA3M.js → index-CkkOh8y9.js} +2 -2
- package/dashboard/dist/assets/{index-B9m7fA3M.js.map → index-CkkOh8y9.js.map} +1 -1
- package/dashboard/dist/assets/{index-B2hz0pUh.js → index-D3iDAWK2.js} +2 -2
- package/dashboard/dist/assets/{index-B2hz0pUh.js.map → index-D3iDAWK2.js.map} +1 -1
- package/dashboard/dist/assets/{index-C0hSttF5.js → index-D6kXz3H8.js} +2 -2
- package/dashboard/dist/assets/{index-C0hSttF5.js.map → index-D6kXz3H8.js.map} +1 -1
- package/dashboard/dist/assets/{index-CVBBkW8V.js → index-Dsgqxdyh.js} +2 -2
- package/dashboard/dist/assets/{index-CVBBkW8V.js.map → index-Dsgqxdyh.js.map} +1 -1
- package/dashboard/dist/assets/{index-nwLh3CK2.js → index-DuhqzYwC.js} +2 -2
- package/dashboard/dist/assets/{index-nwLh3CK2.js.map → index-DuhqzYwC.js.map} +1 -1
- package/dashboard/dist/assets/{index-CDkg6iOE.js → index-DuyzcDuV.js} +2 -2
- package/dashboard/dist/assets/{index-CDkg6iOE.js.map → index-DuyzcDuV.js.map} +1 -1
- package/dashboard/dist/assets/index-LF1gEc6w.js +3 -0
- package/dashboard/dist/assets/index-LF1gEc6w.js.map +1 -0
- package/dashboard/dist/assets/{index-CgIBjZta.js → index-k5vcLICm.js} +2 -2
- package/dashboard/dist/assets/{index-CgIBjZta.js.map → index-k5vcLICm.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-oFYAanUp.js → knowledge-DAV1Jy7b.js} +2 -2
- package/dashboard/dist/assets/{knowledge-oFYAanUp.js.map → knowledge-DAV1Jy7b.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-C9Kw4Ow8.js → mcp-CivbxL1P.js} +2 -2
- package/dashboard/dist/assets/{mcp-C9Kw4Ow8.js.map → mcp-CivbxL1P.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BwzpZ91Z.js → mcp-query-CGvWNrgo.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BwzpZ91Z.js.map → mcp-query-CGvWNrgo.js.map} +1 -1
- package/dashboard/dist/assets/{personas-D5ehmtRb.js → personas-lI3aUr6t.js} +2 -2
- package/dashboard/dist/assets/{personas-D5ehmtRb.js.map → personas-lI3aUr6t.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-xgPKGEdD.js → pipelines-DjPfnTmx.js} +2 -2
- package/dashboard/dist/assets/{pipelines-xgPKGEdD.js.map → pipelines-DjPfnTmx.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CLyrl-MU.js → tasks-Co_S55BO.js} +2 -2
- package/dashboard/dist/assets/{tasks-CLyrl-MU.js.map → tasks-Co_S55BO.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B_gO7CQ0.js → topics-2IGhZXBi.js} +2 -2
- package/dashboard/dist/assets/{topics-B_gO7CQ0.js.map → topics-2IGhZXBi.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BdWYm63U.js → useEventHooks-D0C5yke4.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BdWYm63U.js.map → useEventHooks-D0C5yke4.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-C238M4Qn.js → useNamespace-LG52DTT-.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-C238M4Qn.js.map → useNamespace-LG52DTT-.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-B2ryEK4S.js → useYamlActivityEvents-1IZGVpWC.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-B2ryEK4S.js.map → useYamlActivityEvents-1IZGVpWC.js.map} +1 -1
- package/dashboard/dist/assets/{users-BFaTe6Mt.js → users-C-eHT1i6.js} +2 -2
- package/dashboard/dist/assets/{users-BFaTe6Mt.js.map → users-C-eHT1i6.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-DXz7tZxp.js → workflows-C16CeY4e.js} +2 -2
- package/dashboard/dist/assets/{workflows-DXz7tZxp.js.map → workflows-C16CeY4e.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-u3xuRAnS.js → yaml-workflows-BBenayT9.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-u3xuRAnS.js.map → yaml-workflows-BBenayT9.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/auth.md +26 -1
- package/docs/code-owned-configuration.md +27 -0
- package/docs/dashboard.md +15 -0
- package/docs/hitl/x-lt-footer.md +16 -4
- package/docs/hitl/x-lt-validation.md +23 -0
- package/docs/mcp.md +2 -0
- package/docs/scan-codes.md +24 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DvWaiafI.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DvWaiafI.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-By4rbMDN.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-By4rbMDN.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-8Ao-1pKA.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-8Ao-1pKA.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-vFqoe_P4.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-vFqoe_P4.js.map +0 -1
- package/dashboard/dist/assets/index-DBXm49S6.js.map +0 -1
- package/dashboard/dist/assets/index-DsgjFRvA.js +0 -3
- package/dashboard/dist/assets/index-DsgjFRvA.js.map +0 -1
|
@@ -29,6 +29,7 @@ async function getWorkflowConfig(workflowType) {
|
|
|
29
29
|
resolver_schema: wf.resolver_schema ?? null,
|
|
30
30
|
cron_schedule: wf.cron_schedule ?? null,
|
|
31
31
|
execute_as: wf.execute_as ?? null,
|
|
32
|
+
read_safe: wf.read_safe ?? false,
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
async function listWorkflowConfigs() {
|
|
@@ -66,5 +67,6 @@ async function listWorkflowConfigs() {
|
|
|
66
67
|
resolver_schema: wf.resolver_schema ?? null,
|
|
67
68
|
cron_schedule: wf.cron_schedule ?? null,
|
|
68
69
|
execute_as: wf.execute_as ?? null,
|
|
70
|
+
read_safe: wf.read_safe ?? false,
|
|
69
71
|
}));
|
|
70
72
|
}
|
|
@@ -5,13 +5,13 @@ export declare const LIST_ALL_WORKFLOWS = "SELECT * FROM lt_config_workflows ORD
|
|
|
5
5
|
export declare const LIST_ALL_ROLES = "SELECT * FROM lt_config_roles ORDER BY workflow_type, role";
|
|
6
6
|
export declare const LIST_ALL_INVOCATION_ROLES = "SELECT * FROM lt_config_invocation_roles ORDER BY workflow_type, role";
|
|
7
7
|
export declare const ENSURE_ROLE_EXISTS = "INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING";
|
|
8
|
-
export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified";
|
|
8
|
+
export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified,\n read_safe = EXCLUDED.read_safe";
|
|
9
9
|
export declare const DELETE_CONFIG_ROLES = "DELETE FROM lt_config_roles WHERE workflow_type = $1";
|
|
10
10
|
export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)";
|
|
11
11
|
export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
|
|
12
12
|
export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
|
|
13
13
|
export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
|
|
14
|
-
export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (workflow_type) DO NOTHING";
|
|
14
|
+
export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\nON CONFLICT (workflow_type) DO NOTHING";
|
|
15
15
|
export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
16
16
|
export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
17
17
|
export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
|
|
@@ -23,8 +23,8 @@ exports.ENSURE_ROLE_EXISTS = `\
|
|
|
23
23
|
INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING`;
|
|
24
24
|
exports.UPSERT_WORKFLOW = `\
|
|
25
25
|
INSERT INTO lt_config_workflows
|
|
26
|
-
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)
|
|
27
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
26
|
+
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)
|
|
27
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
|
28
28
|
ON CONFLICT (workflow_type) DO UPDATE SET
|
|
29
29
|
invocable = EXCLUDED.invocable,
|
|
30
30
|
task_queue = EXCLUDED.task_queue,
|
|
@@ -36,7 +36,8 @@ ON CONFLICT (workflow_type) DO UPDATE SET
|
|
|
36
36
|
cron_schedule = EXCLUDED.cron_schedule,
|
|
37
37
|
tool_tags = EXCLUDED.tool_tags,
|
|
38
38
|
execute_as = EXCLUDED.execute_as,
|
|
39
|
-
certified = EXCLUDED.certified
|
|
39
|
+
certified = EXCLUDED.certified,
|
|
40
|
+
read_safe = EXCLUDED.read_safe`;
|
|
40
41
|
exports.DELETE_CONFIG_ROLES = `\
|
|
41
42
|
DELETE FROM lt_config_roles WHERE workflow_type = $1`;
|
|
42
43
|
exports.INSERT_CONFIG_ROLE = `\
|
|
@@ -52,8 +53,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
|
52
53
|
// ------------------------------------------------------------------ //
|
|
53
54
|
exports.SEED_WORKFLOW_CONFIG = `\
|
|
54
55
|
INSERT INTO lt_config_workflows
|
|
55
|
-
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)
|
|
56
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
56
|
+
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)
|
|
57
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
|
57
58
|
ON CONFLICT (workflow_type) DO NOTHING`;
|
|
58
59
|
exports.SEED_CONFIG_ROLE = `\
|
|
59
60
|
INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
|
|
@@ -52,6 +52,7 @@ async function replaceWorkflowConfig(config, certified) {
|
|
|
52
52
|
config.tool_tags || [],
|
|
53
53
|
config.execute_as ?? null,
|
|
54
54
|
certified,
|
|
55
|
+
config.read_safe ?? false,
|
|
55
56
|
]);
|
|
56
57
|
// Replace roles
|
|
57
58
|
await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
|
|
@@ -112,6 +113,7 @@ async function seedWorkflowConfig(config) {
|
|
|
112
113
|
config.tool_tags || [],
|
|
113
114
|
config.execute_as ?? null,
|
|
114
115
|
resolveCertified(config),
|
|
116
|
+
config.read_safe ?? false,
|
|
115
117
|
]);
|
|
116
118
|
const inserted = (rowCount ?? 0) > 0;
|
|
117
119
|
if (inserted) {
|
|
@@ -134,6 +136,8 @@ async function seedWorkflowConfig(config) {
|
|
|
134
136
|
drifts.push('invocable');
|
|
135
137
|
if (resolveCertified(config) !== existing.certified)
|
|
136
138
|
drifts.push('certified');
|
|
139
|
+
if ((config.read_safe ?? false) !== (existing.read_safe ?? false))
|
|
140
|
+
drifts.push('read_safe');
|
|
137
141
|
if (config.default_role !== existing.default_role)
|
|
138
142
|
drifts.push('default_role');
|
|
139
143
|
if (JSON.stringify(config.envelope_schema) !== JSON.stringify(existing.envelope_schema))
|
|
@@ -169,6 +173,7 @@ async function applyWorkflowConfig(config) {
|
|
|
169
173
|
existing.default_role === config.default_role &&
|
|
170
174
|
(existing.description ?? null) === (config.description ?? null) &&
|
|
171
175
|
existing.certified === certified &&
|
|
176
|
+
(existing.read_safe ?? false) === (config.read_safe ?? false) &&
|
|
172
177
|
(existing.cron_schedule ?? null) === (config.cron_schedule ?? null) &&
|
|
173
178
|
(existing.execute_as ?? null) === (config.execute_as ?? null) &&
|
|
174
179
|
sortedEqual(existing.consumes ?? [], config.consumes ?? []) &&
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { listScanSchemes, getScanScheme, listScanRules, getScanRule, } from './read';
|
|
2
|
-
export { upsertScanScheme, deleteScanScheme, upsertScanRule, deleteScanRule, seedScanScheme, seedScanRule, type ScanSchemeInput, type ScanRuleInput, } from './write';
|
|
2
|
+
export { upsertScanScheme, deleteScanScheme, upsertScanRule, deleteScanRule, seedScanScheme, seedScanRule, applyScanScheme, applyScanRule, type ScanSchemeInput, type ScanRuleInput, } from './write';
|
|
3
3
|
export { parseScanCode, interpolateScanTemplate, type ScanParseResult, type ScanParseFailure, type ScanTemplateContext, } from './parse';
|
|
4
4
|
export { assertValidScheme, assertValidSteps } from './validate';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.assertValidSteps = exports.assertValidScheme = exports.interpolateScanTemplate = exports.parseScanCode = exports.seedScanRule = exports.seedScanScheme = exports.deleteScanRule = exports.upsertScanRule = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanRule = exports.listScanRules = exports.getScanScheme = exports.listScanSchemes = void 0;
|
|
3
|
+
exports.assertValidSteps = exports.assertValidScheme = exports.interpolateScanTemplate = exports.parseScanCode = exports.applyScanRule = exports.applyScanScheme = exports.seedScanRule = exports.seedScanScheme = exports.deleteScanRule = exports.upsertScanRule = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanRule = exports.listScanRules = exports.getScanScheme = exports.listScanSchemes = void 0;
|
|
4
4
|
var read_1 = require("./read");
|
|
5
5
|
Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return read_1.listScanSchemes; } });
|
|
6
6
|
Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return read_1.getScanScheme; } });
|
|
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "upsertScanRule", { enumerable: true, get: functi
|
|
|
13
13
|
Object.defineProperty(exports, "deleteScanRule", { enumerable: true, get: function () { return write_1.deleteScanRule; } });
|
|
14
14
|
Object.defineProperty(exports, "seedScanScheme", { enumerable: true, get: function () { return write_1.seedScanScheme; } });
|
|
15
15
|
Object.defineProperty(exports, "seedScanRule", { enumerable: true, get: function () { return write_1.seedScanRule; } });
|
|
16
|
+
Object.defineProperty(exports, "applyScanScheme", { enumerable: true, get: function () { return write_1.applyScanScheme; } });
|
|
17
|
+
Object.defineProperty(exports, "applyScanRule", { enumerable: true, get: function () { return write_1.applyScanRule; } });
|
|
16
18
|
var parse_1 = require("./parse");
|
|
17
19
|
Object.defineProperty(exports, "parseScanCode", { enumerable: true, get: function () { return parse_1.parseScanCode; } });
|
|
18
20
|
Object.defineProperty(exports, "interpolateScanTemplate", { enumerable: true, get: function () { return parse_1.interpolateScanTemplate; } });
|
|
@@ -8,3 +8,10 @@ export declare const UPSERT_ACTION = "INSERT INTO lt_config_scan_actions\n (sch
|
|
|
8
8
|
export declare const DELETE_ACTION = "DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
|
|
9
9
|
export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (version) DO NOTHING";
|
|
10
10
|
export declare const SEED_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO NOTHING";
|
|
11
|
+
/**
|
|
12
|
+
* Apply — same column set as the upsert, guarded by IS DISTINCT FROM so an
|
|
13
|
+
* unchanged declaration is a zero-row no-op. `(xmax = 0)` distinguishes
|
|
14
|
+
* insert from update. jsonb columns compare content-wise in SQL.
|
|
15
|
+
*/
|
|
16
|
+
export declare const APPLY_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,\n lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,\n lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,\n lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,\n lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,\n EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,\n EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,\n EXCLUDED.enabled)\nRETURNING (xmax = 0) AS inserted";
|
|
17
|
+
export declare const APPLY_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n not_primed = EXCLUDED.not_primed,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_actions.name, lt_config_scan_actions.steps,\n lt_config_scan_actions.fallback, lt_config_scan_actions.not_primed,\n lt_config_scan_actions.enabled)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.steps, EXCLUDED.fallback,\n EXCLUDED.not_primed, EXCLUDED.enabled)\nRETURNING (xmax = 0) AS inserted";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Read queries //
|
|
4
4
|
// ------------------------------------------------------------------ //
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SEED_ACTION = exports.SEED_SCHEME = exports.DELETE_ACTION = exports.UPSERT_ACTION = exports.DELETE_SCHEME = exports.UPSERT_SCHEME = exports.GET_ACTION = exports.LIST_ACTIONS = exports.GET_SCHEME = exports.LIST_SCHEMES = void 0;
|
|
6
|
+
exports.APPLY_ACTION = exports.APPLY_SCHEME = exports.SEED_ACTION = exports.SEED_SCHEME = exports.DELETE_ACTION = exports.UPSERT_ACTION = exports.DELETE_SCHEME = exports.UPSERT_SCHEME = exports.GET_ACTION = exports.LIST_ACTIONS = exports.GET_SCHEME = exports.LIST_SCHEMES = void 0;
|
|
7
7
|
exports.LIST_SCHEMES = `\
|
|
8
8
|
SELECT * FROM lt_config_scan_schemes ORDER BY version`;
|
|
9
9
|
exports.GET_SCHEME = `\
|
|
@@ -61,3 +61,57 @@ INSERT INTO lt_config_scan_actions
|
|
|
61
61
|
(scheme_version, category, name, steps, fallback, not_primed, enabled)
|
|
62
62
|
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
63
63
|
ON CONFLICT (scheme_version, category) DO NOTHING`;
|
|
64
|
+
// ------------------------------------------------------------------ //
|
|
65
|
+
// Apply (code-owned startup pass — code is source of truth) //
|
|
66
|
+
// ------------------------------------------------------------------ //
|
|
67
|
+
/**
|
|
68
|
+
* Apply — same column set as the upsert, guarded by IS DISTINCT FROM so an
|
|
69
|
+
* unchanged declaration is a zero-row no-op. `(xmax = 0)` distinguishes
|
|
70
|
+
* insert from update. jsonb columns compare content-wise in SQL.
|
|
71
|
+
*/
|
|
72
|
+
exports.APPLY_SCHEME = `\
|
|
73
|
+
INSERT INTO lt_config_scan_schemes
|
|
74
|
+
(version, name, description, target_facet, encoding, delimiter, target_length,
|
|
75
|
+
kind, grant_ttl_seconds, grant_max_uses, enabled)
|
|
76
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
|
77
|
+
ON CONFLICT (version) DO UPDATE SET
|
|
78
|
+
name = EXCLUDED.name,
|
|
79
|
+
description = EXCLUDED.description,
|
|
80
|
+
target_facet = EXCLUDED.target_facet,
|
|
81
|
+
encoding = EXCLUDED.encoding,
|
|
82
|
+
delimiter = EXCLUDED.delimiter,
|
|
83
|
+
target_length = EXCLUDED.target_length,
|
|
84
|
+
kind = EXCLUDED.kind,
|
|
85
|
+
grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,
|
|
86
|
+
grant_max_uses = EXCLUDED.grant_max_uses,
|
|
87
|
+
enabled = EXCLUDED.enabled,
|
|
88
|
+
updated_at = NOW()
|
|
89
|
+
WHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,
|
|
90
|
+
lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,
|
|
91
|
+
lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,
|
|
92
|
+
lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,
|
|
93
|
+
lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled)
|
|
94
|
+
IS DISTINCT FROM
|
|
95
|
+
(EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,
|
|
96
|
+
EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,
|
|
97
|
+
EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,
|
|
98
|
+
EXCLUDED.enabled)
|
|
99
|
+
RETURNING (xmax = 0) AS inserted`;
|
|
100
|
+
exports.APPLY_ACTION = `\
|
|
101
|
+
INSERT INTO lt_config_scan_actions
|
|
102
|
+
(scheme_version, category, name, steps, fallback, not_primed, enabled)
|
|
103
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
104
|
+
ON CONFLICT (scheme_version, category) DO UPDATE SET
|
|
105
|
+
name = EXCLUDED.name,
|
|
106
|
+
steps = EXCLUDED.steps,
|
|
107
|
+
fallback = EXCLUDED.fallback,
|
|
108
|
+
not_primed = EXCLUDED.not_primed,
|
|
109
|
+
enabled = EXCLUDED.enabled,
|
|
110
|
+
updated_at = NOW()
|
|
111
|
+
WHERE (lt_config_scan_actions.name, lt_config_scan_actions.steps,
|
|
112
|
+
lt_config_scan_actions.fallback, lt_config_scan_actions.not_primed,
|
|
113
|
+
lt_config_scan_actions.enabled)
|
|
114
|
+
IS DISTINCT FROM
|
|
115
|
+
(EXCLUDED.name, EXCLUDED.steps, EXCLUDED.fallback,
|
|
116
|
+
EXCLUDED.not_primed, EXCLUDED.enabled)
|
|
117
|
+
RETURNING (xmax = 0) AS inserted`;
|
|
@@ -28,3 +28,11 @@ export declare function deleteScanRule(schemeVersion: number, category: string):
|
|
|
28
28
|
/** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
|
|
29
29
|
export declare function seedScanScheme(input: ScanSchemeInput): Promise<boolean>;
|
|
30
30
|
export declare function seedScanRule(input: ScanRuleInput): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Apply a scheme declaration at startup (code is source of truth). Same
|
|
33
|
+
* validation as the upsert; the IS DISTINCT FROM guard makes an unchanged
|
|
34
|
+
* declaration a zero-row no-op.
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyScanScheme(input: ScanSchemeInput): Promise<'applied' | 'unchanged'>;
|
|
37
|
+
/** Apply a rule declaration at startup (code is source of truth). */
|
|
38
|
+
export declare function applyScanRule(input: ScanRuleInput): Promise<'applied' | 'unchanged'>;
|
|
@@ -6,6 +6,8 @@ exports.upsertScanRule = upsertScanRule;
|
|
|
6
6
|
exports.deleteScanRule = deleteScanRule;
|
|
7
7
|
exports.seedScanScheme = seedScanScheme;
|
|
8
8
|
exports.seedScanRule = seedScanRule;
|
|
9
|
+
exports.applyScanScheme = applyScanScheme;
|
|
10
|
+
exports.applyScanRule = applyScanRule;
|
|
9
11
|
const db_1 = require("../../lib/db");
|
|
10
12
|
const types_1 = require("../../types");
|
|
11
13
|
const sql_1 = require("./sql");
|
|
@@ -55,7 +57,8 @@ async function deleteScanScheme(version) {
|
|
|
55
57
|
const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_SCHEME, [version]);
|
|
56
58
|
return (rowCount ?? 0) > 0;
|
|
57
59
|
}
|
|
58
|
-
|
|
60
|
+
/** Shared rule-input validation — the upsert and startup-apply paths enforce the same contract. */
|
|
61
|
+
async function assertValidRuleInput(input) {
|
|
59
62
|
if (!/^[0-9]$/.test(input.category)) {
|
|
60
63
|
throw new Error('category must be a single digit (0-9)');
|
|
61
64
|
}
|
|
@@ -65,6 +68,9 @@ async function upsertScanRule(input) {
|
|
|
65
68
|
if (input.steps.length === 0 && !input.fallback?.markdown && !input.fallback?.route) {
|
|
66
69
|
throw new Error('a rule needs at least one step or a fallback');
|
|
67
70
|
}
|
|
71
|
+
}
|
|
72
|
+
async function upsertScanRule(input) {
|
|
73
|
+
await assertValidRuleInput(input);
|
|
68
74
|
const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_ACTION, ruleParams(input));
|
|
69
75
|
return rows[0];
|
|
70
76
|
}
|
|
@@ -83,3 +89,19 @@ async function seedScanRule(input) {
|
|
|
83
89
|
const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_ACTION, ruleParams(input));
|
|
84
90
|
return (rowCount ?? 0) > 0;
|
|
85
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Apply a scheme declaration at startup (code is source of truth). Same
|
|
94
|
+
* validation as the upsert; the IS DISTINCT FROM guard makes an unchanged
|
|
95
|
+
* declaration a zero-row no-op.
|
|
96
|
+
*/
|
|
97
|
+
async function applyScanScheme(input) {
|
|
98
|
+
(0, validate_1.assertValidScheme)(input);
|
|
99
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.APPLY_SCHEME, schemeParams(input));
|
|
100
|
+
return (rowCount ?? 0) > 0 ? 'applied' : 'unchanged';
|
|
101
|
+
}
|
|
102
|
+
/** Apply a rule declaration at startup (code is source of truth). */
|
|
103
|
+
async function applyScanRule(input) {
|
|
104
|
+
await assertValidRuleInput(input);
|
|
105
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.APPLY_ACTION, ruleParams(input));
|
|
106
|
+
return (rowCount ?? 0) > 0 ? 'applied' : 'unchanged';
|
|
107
|
+
}
|
|
@@ -261,6 +261,26 @@ const SYSTEM_TOPICS = [
|
|
|
261
261
|
example_payload: { workflowId: 'wf-abc', workflowName: 'processOrder', milestones: [{ name: 'items_processed', value: 42 }] },
|
|
262
262
|
tags: ['progress', 'core'],
|
|
263
263
|
},
|
|
264
|
+
// Surfaces
|
|
265
|
+
{
|
|
266
|
+
topic: 'system.surfaces.dashboard',
|
|
267
|
+
description: 'A dashboard announcement was published or removed. Delivery reaches ' +
|
|
268
|
+
'every authenticated subscriber — role targeting is display scoping, ' +
|
|
269
|
+
'so bodies must never carry secrets.',
|
|
270
|
+
category: 'surfaces',
|
|
271
|
+
payload_schema: objectSchema({
|
|
272
|
+
action: { type: 'string', description: 'created | deleted' },
|
|
273
|
+
announcement: {
|
|
274
|
+
type: 'object',
|
|
275
|
+
description: 'The announcement row (id, title, body, layout, roles, expires_at)',
|
|
276
|
+
},
|
|
277
|
+
}),
|
|
278
|
+
example_payload: {
|
|
279
|
+
action: 'created',
|
|
280
|
+
announcement: { id: 'ann-001', title: 'Maintenance tonight', layout: 'banner', roles: [] },
|
|
281
|
+
},
|
|
282
|
+
tags: ['surface', 'dashboard'],
|
|
283
|
+
},
|
|
264
284
|
];
|
|
265
285
|
// ── Seeding ─────────────────────────────────────────────────────────────────────
|
|
266
286
|
/**
|
|
@@ -29,5 +29,6 @@ __exportStar(require("./x-lt-labels"), exports);
|
|
|
29
29
|
__exportStar(require("./x-lt-query"), exports);
|
|
30
30
|
__exportStar(require("./x-lt-submit-guard"), exports);
|
|
31
31
|
__exportStar(require("./x-lt-show-if"), exports);
|
|
32
|
+
__exportStar(require("./x-lt-require-any"), exports);
|
|
32
33
|
__exportStar(require("./field-validator"), exports);
|
|
33
34
|
__exportStar(require("./validate-resolver-payload"), exports);
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
* - x-lt-require-all against the checklist items resolved from context
|
|
16
16
|
* - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
|
|
17
17
|
*
|
|
18
|
+
* Root-level x-lt-require-any groups run after the per-field pass: each group
|
|
19
|
+
* needs a value in at least one visible member (all-hidden groups are waived).
|
|
20
|
+
*
|
|
18
21
|
* The showIf/`resolver.*` domain is always the FLAT form representation, so a
|
|
19
22
|
* condition like `resolver.approved` reads the same on both sides.
|
|
20
23
|
*/
|
|
@@ -19,12 +19,16 @@ exports.validateResolverPayload = validateResolverPayload;
|
|
|
19
19
|
* - x-lt-require-all against the checklist items resolved from context
|
|
20
20
|
* - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)
|
|
21
21
|
*
|
|
22
|
+
* Root-level x-lt-require-any groups run after the per-field pass: each group
|
|
23
|
+
* needs a value in at least one visible member (all-hidden groups are waived).
|
|
24
|
+
*
|
|
22
25
|
* The showIf/`resolver.*` domain is always the FLAT form representation, so a
|
|
23
26
|
* condition like `resolver.approved` reads the same on both sides.
|
|
24
27
|
*/
|
|
25
28
|
const field_validator_1 = require("./field-validator");
|
|
26
29
|
const x_lt_show_if_1 = require("./x-lt-show-if");
|
|
27
30
|
const x_lt_bind_1 = require("./x-lt-bind");
|
|
31
|
+
const x_lt_require_any_1 = require("./x-lt-require-any");
|
|
28
32
|
/**
|
|
29
33
|
* Validate FLAT form values against the form schema. This is the dashboard's
|
|
30
34
|
* entry point (the values the user edits, keyed by field name).
|
|
@@ -46,6 +50,21 @@ function validateResolverForm(schema, formValues, ctx) {
|
|
|
46
50
|
if (err)
|
|
47
51
|
errors.push({ field, message: err });
|
|
48
52
|
}
|
|
53
|
+
// Require-any groups: at least one VISIBLE member per group carries a value.
|
|
54
|
+
// A member hidden by showIf (or naming no property) can neither satisfy nor
|
|
55
|
+
// be demanded; an all-hidden group is waived.
|
|
56
|
+
for (const group of (0, x_lt_require_any_1.readRequireAnyGroups)(schema)) {
|
|
57
|
+
const visible = group.filter((k) => properties[k] && (0, x_lt_show_if_1.evaluateShowIf)(properties[k]['x-lt-showIf'], liveCtx));
|
|
58
|
+
if (visible.length === 0)
|
|
59
|
+
continue;
|
|
60
|
+
if (visible.some((k) => (0, x_lt_require_any_1.hasRequireAnyValue)(formValues[k])))
|
|
61
|
+
continue;
|
|
62
|
+
const titles = visible.map((k) => properties[k].title ?? k);
|
|
63
|
+
errors.push({
|
|
64
|
+
field: visible[0],
|
|
65
|
+
message: `Enter a value for at least one of: ${titles.join(', ')}`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
49
68
|
return errors;
|
|
50
69
|
}
|
|
51
70
|
/**
|
|
@@ -10,19 +10,30 @@
|
|
|
10
10
|
* { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
|
|
11
11
|
* ```
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* `cancel` additionally accepts `false` to remove the control entirely —
|
|
14
|
+
* for roles where cancelling is not part of the process ("Send to Service"
|
|
15
|
+
* flows escalate instead). The other targets are rename-only: hiding
|
|
16
|
+
* claim/submit/release would strand the footer.
|
|
17
|
+
*
|
|
18
|
+
* Only the five known targets are read; unknown keys and non-string values
|
|
19
|
+
* (except `cancel: false`) are ignored. Any target the schema omits keeps its
|
|
20
|
+
* default label, so a schema overrides just the controls it cares about.
|
|
16
21
|
*/
|
|
17
22
|
export declare const X_LT_LABELS = "x-lt-labels";
|
|
18
23
|
/** The footer controls a schema may rename. */
|
|
19
24
|
export declare const FOOTER_LABEL_TARGETS: readonly ["claim", "cancel", "submit", "escalate", "release"];
|
|
20
25
|
export type FooterLabelTarget = (typeof FOOTER_LABEL_TARGETS)[number];
|
|
21
|
-
/**
|
|
22
|
-
|
|
26
|
+
/**
|
|
27
|
+
* A partial map of target → override label. Absent targets keep their
|
|
28
|
+
* default. `cancel: false` removes the cancel control from the footer.
|
|
29
|
+
*/
|
|
30
|
+
export type FooterLabels = Partial<Record<Exclude<FooterLabelTarget, 'cancel'>, string>> & {
|
|
31
|
+
cancel?: string | false;
|
|
32
|
+
};
|
|
23
33
|
/**
|
|
24
34
|
* The schema's footer label overrides, or an empty map when none are declared.
|
|
25
35
|
* Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
|
|
26
|
-
* blank or non-string values are dropped
|
|
36
|
+
* blank or non-string values are dropped — except `cancel: false`, which is
|
|
37
|
+
* preserved as the hide instruction.
|
|
27
38
|
*/
|
|
28
39
|
export declare function readFooterLabels(schema: Record<string, unknown> | null | undefined): FooterLabels;
|
|
@@ -11,9 +11,14 @@
|
|
|
11
11
|
* { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
|
|
12
12
|
* ```
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* `cancel` additionally accepts `false` to remove the control entirely —
|
|
15
|
+
* for roles where cancelling is not part of the process ("Send to Service"
|
|
16
|
+
* flows escalate instead). The other targets are rename-only: hiding
|
|
17
|
+
* claim/submit/release would strand the footer.
|
|
18
|
+
*
|
|
19
|
+
* Only the five known targets are read; unknown keys and non-string values
|
|
20
|
+
* (except `cancel: false`) are ignored. Any target the schema omits keeps its
|
|
21
|
+
* default label, so a schema overrides just the controls it cares about.
|
|
17
22
|
*/
|
|
18
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
24
|
exports.FOOTER_LABEL_TARGETS = exports.X_LT_LABELS = void 0;
|
|
@@ -24,7 +29,8 @@ exports.FOOTER_LABEL_TARGETS = ['claim', 'cancel', 'submit', 'escalate', 'releas
|
|
|
24
29
|
/**
|
|
25
30
|
* The schema's footer label overrides, or an empty map when none are declared.
|
|
26
31
|
* Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
|
|
27
|
-
* blank or non-string values are dropped
|
|
32
|
+
* blank or non-string values are dropped — except `cancel: false`, which is
|
|
33
|
+
* preserved as the hide instruction.
|
|
28
34
|
*/
|
|
29
35
|
function readFooterLabels(schema) {
|
|
30
36
|
const raw = schema?.[exports.X_LT_LABELS];
|
|
@@ -32,6 +38,8 @@ function readFooterLabels(schema) {
|
|
|
32
38
|
return {};
|
|
33
39
|
const source = raw;
|
|
34
40
|
const labels = {};
|
|
41
|
+
if (source.cancel === false)
|
|
42
|
+
labels.cancel = false;
|
|
35
43
|
for (const target of exports.FOOTER_LABEL_TARGETS) {
|
|
36
44
|
const value = source[target];
|
|
37
45
|
if (typeof value === 'string' && value.trim().length > 0) {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-require-any — "at least one of this set" as a root-schema token. A
|
|
3
|
+
* form_schema declares groups of field names; a submission passes when every
|
|
4
|
+
* group has a value in at least one member. The canonical case: a Left
|
|
5
|
+
* quantity and a Right quantity where either satisfies, but blank-both fails.
|
|
6
|
+
*
|
|
7
|
+
* x-lt-require-any string[][] — e.g. [["left_quantity", "right_quantity"]]
|
|
8
|
+
*
|
|
9
|
+
* Visibility rules compose: a member hidden by its `x-lt-showIf` (or naming
|
|
10
|
+
* no schema property) can neither satisfy the group nor be demanded of the
|
|
11
|
+
* submitter, and a group whose members are ALL hidden is waived. `false` and
|
|
12
|
+
* `0` are answers; `''`, null, and undefined are not.
|
|
13
|
+
*/
|
|
14
|
+
export declare const X_LT_REQUIRE_ANY = "x-lt-require-any";
|
|
15
|
+
/**
|
|
16
|
+
* The schema's require-any groups. Malformed declarations (non-array token,
|
|
17
|
+
* non-array groups, non-string members) read as no groups — a bad token never
|
|
18
|
+
* bricks submission.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readRequireAnyGroups(schema: Record<string, unknown> | null | undefined): string[][];
|
|
21
|
+
/** Present = an actual answer: `false` and `0` count; `''`/null/undefined do not. */
|
|
22
|
+
export declare function hasRequireAnyValue(value: unknown): boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* x-lt-require-any — "at least one of this set" as a root-schema token. A
|
|
4
|
+
* form_schema declares groups of field names; a submission passes when every
|
|
5
|
+
* group has a value in at least one member. The canonical case: a Left
|
|
6
|
+
* quantity and a Right quantity where either satisfies, but blank-both fails.
|
|
7
|
+
*
|
|
8
|
+
* x-lt-require-any string[][] — e.g. [["left_quantity", "right_quantity"]]
|
|
9
|
+
*
|
|
10
|
+
* Visibility rules compose: a member hidden by its `x-lt-showIf` (or naming
|
|
11
|
+
* no schema property) can neither satisfy the group nor be demanded of the
|
|
12
|
+
* submitter, and a group whose members are ALL hidden is waived. `false` and
|
|
13
|
+
* `0` are answers; `''`, null, and undefined are not.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.X_LT_REQUIRE_ANY = void 0;
|
|
17
|
+
exports.readRequireAnyGroups = readRequireAnyGroups;
|
|
18
|
+
exports.hasRequireAnyValue = hasRequireAnyValue;
|
|
19
|
+
exports.X_LT_REQUIRE_ANY = 'x-lt-require-any';
|
|
20
|
+
/**
|
|
21
|
+
* The schema's require-any groups. Malformed declarations (non-array token,
|
|
22
|
+
* non-array groups, non-string members) read as no groups — a bad token never
|
|
23
|
+
* bricks submission.
|
|
24
|
+
*/
|
|
25
|
+
function readRequireAnyGroups(schema) {
|
|
26
|
+
const raw = schema?.[exports.X_LT_REQUIRE_ANY];
|
|
27
|
+
if (!Array.isArray(raw))
|
|
28
|
+
return [];
|
|
29
|
+
return raw
|
|
30
|
+
.filter((group) => Array.isArray(group))
|
|
31
|
+
.map((group) => group.filter((m) => typeof m === 'string' && m.length > 0))
|
|
32
|
+
.filter((group) => group.length > 0);
|
|
33
|
+
}
|
|
34
|
+
/** Present = an actual answer: `false` and `0` count; `''`/null/undefined do not. */
|
|
35
|
+
function hasRequireAnyValue(value) {
|
|
36
|
+
if (value === undefined || value === null)
|
|
37
|
+
return false;
|
|
38
|
+
if (typeof value === 'string')
|
|
39
|
+
return value.trim().length > 0;
|
|
40
|
+
return true;
|
|
41
|
+
}
|
package/build/start/workers.js
CHANGED
|
@@ -236,6 +236,7 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
|
|
|
236
236
|
resolver_schema: c.resolverSchema ?? null,
|
|
237
237
|
cron_schedule: c.cronSchedule ?? null,
|
|
238
238
|
execute_as: c.executeAs ?? null,
|
|
239
|
+
read_safe: c.readSafe ?? false,
|
|
239
240
|
};
|
|
240
241
|
try {
|
|
241
242
|
if ((0, apply_report_1.ownedByCode)(c.reset, configSource)) {
|
|
@@ -472,6 +473,55 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
|
|
|
472
473
|
(0, apply_report_1.logSurfaceReport)('agents', agentReport);
|
|
473
474
|
}
|
|
474
475
|
}
|
|
476
|
+
// Declared scan schemes + rules (one ownership unit, one reset). The scheme
|
|
477
|
+
// applies first — rule validation reads its kind.
|
|
478
|
+
if (startConfig.scanSchemes?.length) {
|
|
479
|
+
const { seedScanScheme, seedScanRule, applyScanScheme, applyScanRule, listScanSchemes, listScanRules, } = await Promise.resolve().then(() => __importStar(require('../services/scan-code')));
|
|
480
|
+
const scanReport = (0, apply_report_1.newSurfaceReport)();
|
|
481
|
+
for (const scheme of startConfig.scanSchemes) {
|
|
482
|
+
const codeOwned = (0, apply_report_1.ownedByCode)(scheme.reset, configSource);
|
|
483
|
+
const { rules, reset: _reset, ...schemeInput } = scheme;
|
|
484
|
+
try {
|
|
485
|
+
if (codeOwned) {
|
|
486
|
+
let outcome = await applyScanScheme(schemeInput);
|
|
487
|
+
for (const rule of rules ?? []) {
|
|
488
|
+
const ruleOutcome = await applyScanRule({ scheme_version: scheme.version, ...rule });
|
|
489
|
+
if (ruleOutcome === 'applied')
|
|
490
|
+
outcome = 'applied';
|
|
491
|
+
}
|
|
492
|
+
(0, apply_report_1.recordOutcome)(scanReport, `scheme ${scheme.version}`, outcome);
|
|
493
|
+
if (outcome === 'applied')
|
|
494
|
+
logger_1.loggerRegistry.info(`[long-tail] scan scheme applied: ${scheme.version}`);
|
|
495
|
+
const declaredCategories = new Set((rules ?? []).map((r) => r.category));
|
|
496
|
+
const existingRules = await listScanRules(scheme.version);
|
|
497
|
+
scanReport.orphans.push(...existingRules
|
|
498
|
+
.filter((r) => !declaredCategories.has(r.category))
|
|
499
|
+
.map((r) => `${scheme.version}/${r.category}`));
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
const inserted = await seedScanScheme(schemeInput);
|
|
503
|
+
for (const rule of rules ?? []) {
|
|
504
|
+
await seedScanRule({ scheme_version: scheme.version, ...rule });
|
|
505
|
+
}
|
|
506
|
+
(0, apply_report_1.recordOutcome)(scanReport, `scheme ${scheme.version}`, 'db-owned');
|
|
507
|
+
if (inserted)
|
|
508
|
+
logger_1.loggerRegistry.info(`[long-tail] scan scheme seeded: ${scheme.version}`);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
logger_1.loggerRegistry.warn(`[long-tail] scan scheme seed failed for ${scheme.version}: ${err.message}`);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (codeOwnedBoot && !startConfig.examples) {
|
|
516
|
+
const declaredVersions = new Set(startConfig.scanSchemes.map((s) => s.version));
|
|
517
|
+
scanReport.orphans.push(...(await listScanSchemes())
|
|
518
|
+
.map((s) => s.version)
|
|
519
|
+
.filter((v) => !declaredVersions.has(v))
|
|
520
|
+
.map(String));
|
|
521
|
+
}
|
|
522
|
+
if (codeOwnedBoot)
|
|
523
|
+
(0, apply_report_1.logSurfaceReport)('scan-schemes', scanReport);
|
|
524
|
+
}
|
|
475
525
|
// Register the in-process callback adapter for agent event triggers.
|
|
476
526
|
// Reuse existing instance if already registered (e.g., from SDK createClient).
|
|
477
527
|
const { CallbackEventAdapter } = await Promise.resolve().then(() => __importStar(require('../lib/events/callback')));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard announcement tool — mirrors routes/announcements.ts. Publishing
|
|
3
|
+
* is a privileged surface (the HTTP route guards with requireRoleManager);
|
|
4
|
+
* targeting is display scoping only, so bodies must never carry secrets.
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerAnnouncementTools(server: McpServer): void;
|