@hotmeshio/long-tail 0.16.4 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/users.d.ts +31 -1
- package/build/api/users.js +54 -1
- package/build/bin/ltc.js +7 -0
- package/build/lib/cli/commands/users.d.ts +11 -0
- package/build/lib/cli/commands/users.js +59 -0
- package/build/routes/users.js +26 -0
- package/build/sdk/index.d.ts +2 -0
- package/build/sdk/index.js +2 -0
- package/build/services/user/crud.d.ts +32 -1
- package/build/services/user/crud.js +108 -0
- package/build/services/user/index.d.ts +2 -2
- package/build/services/user/index.js +5 -1
- package/build/services/user/sql.d.ts +16 -0
- package/build/services/user/sql.js +33 -1
- package/build/services/user/types.d.ts +11 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +30 -14
- package/build/system/mcp-servers/admin/schemas.js +9 -3
- package/build/system/mcp-servers/admin/users.js +26 -0
- package/build/system/seed/tool-manifests-admin.d.ts +445 -0
- package/build/system/seed/tool-manifests-admin.js +1 -0
- package/dashboard/dist/assets/AdminDashboard-D-YHIR8w.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Csq-oxmY.js.map → AdminDashboard-D-YHIR8w.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Bnr5zbyJ.js → AgentConfigPage-CG54Ll2A.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-Bnr5zbyJ.js.map → AgentConfigPage-CG54Ll2A.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DgRu-Fhg.js → AgentDetailPage-rTcofeW4.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DgRu-Fhg.js.map → AgentDetailPage-rTcofeW4.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-B7PNjrkn.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-BuyXKkP3.js.map → AgentsPage-B7PNjrkn.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CEDwyzlx.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-CEDwyzlx.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-xpPjRnkf.js → BotPicker-cg1qXRF3.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-xpPjRnkf.js.map → BotPicker-cg1qXRF3.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-CQ3k-7rO.js → BulkAssignModal-BDzaHGAb.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-CQ3k-7rO.js.map → BulkAssignModal-BDzaHGAb.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-CswExj9-.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DCkEJ0In.js.map → CapabilitiesPage-CswExj9-.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-10sJSNNF.js → CollapsibleSection-CpVKfkkq.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-10sJSNNF.js.map → CollapsibleSection-CpVKfkkq.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-ClJhYGg1.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-BFy9Joxb.js.map → CountdownTimer-ClJhYGg1.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DIR-fUoF.js → CredentialsPage-DYBp7v8W.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DIR-fUoF.js.map → CredentialsPage-DYBp7v8W.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-C66ASvgE.js → CronLabel-Bd_fipHy.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-C66ASvgE.js.map → CronLabel-Bd_fipHy.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-B-Wn6Y8B.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-RWvrCHn7.js.map → ElapsedCell-B-Wn6Y8B.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-DcgFUbk4.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-CNaYs3nA.js.map → EntityTimelinePanel-DcgFUbk4.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BsRQtDDc.js → EscalationListSchemaPage-DpnorXeU.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BsRQtDDc.js.map → EscalationListSchemaPage-DpnorXeU.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BMYQmwGA.js → EscalationSchemaPage-LPTJJDfP.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-BMYQmwGA.js.map → EscalationSchemaPage-LPTJJDfP.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-Bq5_ICUt.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-yv4Yn6zl.js.map → EscalationsOverview-Bq5_ICUt.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-ebZK7vXl.js → EventTable-Cinbdm1u.js} +2 -2
- package/dashboard/dist/assets/{EventTable-ebZK7vXl.js.map → EventTable-Cinbdm1u.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-DyojX5m4.js +2 -0
- package/dashboard/dist/assets/FilterBar-DyojX5m4.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-BFntNMop.js → GraphInvokePage-Ba5fNcgv.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-BFntNMop.js.map → GraphInvokePage-Ba5fNcgv.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-DuFXqfz3.js +2 -0
- package/dashboard/dist/assets/HomePage-DuFXqfz3.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-GpwHcjkZ.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DlGreUpP.js.map → ListToolbar-GpwHcjkZ.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-D0G2vACW.js → McpOverview-Bi23-hih.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-D0G2vACW.js.map → McpOverview-Bi23-hih.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-LZO04PEB.js → McpQueryDetailPage-FhHSfX9W.js} +4 -4
- package/dashboard/dist/assets/{McpQueryDetailPage-LZO04PEB.js.map → McpQueryDetailPage-FhHSfX9W.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-czMlM7vR.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-BIwSDHgB.js.map → McpQueryPage-czMlM7vR.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-BOh2M0Ca.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-BOh2M0Ca.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-DfJzbGYM.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-DfJzbGYM.js.map +1 -0
- package/dashboard/dist/assets/OperationsPage-BS8blKLj.js +3 -0
- package/dashboard/dist/assets/OperationsPage-BS8blKLj.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-BWtTKrcJ.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-BWtTKrcJ.js.map +1 -0
- package/dashboard/dist/assets/{PersonaDetailPage-B48MX4lq.js → PersonaDetailPage-VkhuauBf.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-B48MX4lq.js.map → PersonaDetailPage-VkhuauBf.js.map} +1 -1
- package/dashboard/dist/assets/PersonasPage-DRoneLfx.js +2 -0
- package/dashboard/dist/assets/PersonasPage-DRoneLfx.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-B5mmkHS0.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-Co5oCg31.js.map → ProcessDetailPage-B5mmkHS0.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BV0e2OfH.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-BV0e2OfH.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-C4UTNx0p.js → RoleDetailPage-eenl_a5Z.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-C4UTNx0p.js.map → RoleDetailPage-eenl_a5Z.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BXo5RirX.js → RolesPage-BLfJcFf7.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BXo5RirX.js.map → RolesPage-BLfJcFf7.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BRQiGv2-.js → RunAsSelector-BnLKKs51.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BRQiGv2-.js.map → RunAsSelector-BnLKKs51.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BUT5wjzC.js → ScanCodesPage-BWIcjnr4.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BUT5wjzC.js.map → ScanCodesPage-BWIcjnr4.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-sAuU8cZj.js +2 -0
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CkzoOyjd.js.map → ScanSchemeDetailPage-sAuU8cZj.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-CA_q1uaI.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-DYamACNZ.js.map → ScanStationPage-CA_q1uaI.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-B3yiAcrs.js → StickyPagination-sVI21e82.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B3yiAcrs.js.map → StickyPagination-sVI21e82.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C56PtZSb.js → StreamMessageDetail-Djm_zQAv.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C56PtZSb.js.map → StreamMessageDetail-Djm_zQAv.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-D64ep5KY.js → SwimlaneTimeline-CwxXRmRQ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-D64ep5KY.js.map → SwimlaneTimeline-CwxXRmRQ.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-C2V7BcgB.js → TaskDetailPage-SiBSTsfp.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C2V7BcgB.js.map → TaskDetailPage-SiBSTsfp.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-C4ctoAa0.js → TasksListPage-CBTFz3Bp.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-C4ctoAa0.js.map → TasksListPage-CBTFz3Bp.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-Ctwwdamz.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-BpJ7In27.js.map → TimeAgo-Ctwwdamz.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BKrIaU_R.js → TimestampCell-CI8UrDuQ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BKrIaU_R.js.map → TimestampCell-CI8UrDuQ.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CdTXWPqn.js → ToolTestPanel-Cf9ZEBF7.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CdTXWPqn.js.map → ToolTestPanel-Cf9ZEBF7.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-B6tb1RG4.js → TopicDetailPage-BYIOSVNy.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-B6tb1RG4.js.map → TopicDetailPage-BYIOSVNy.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DgdOKjwE.js → TopicsPage-C9x4tIEi.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DgdOKjwE.js.map → TopicsPage-C9x4tIEi.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-A-ET2GnX.js → UserName-Ck-eLb-1.js} +2 -2
- package/dashboard/dist/assets/{UserName-A-ET2GnX.js.map → UserName-Ck-eLb-1.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BPxoPK8g.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-CzhoRsis.js.map → WorkflowExecutionPage-BPxoPK8g.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-CDHQUYEr.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-CDHQUYEr.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-DGp8J0G2.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-B4Bh8MIo.js.map → WorkflowsOverview-DGp8J0G2.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-zRrcxk0e.js → YamlWorkflowDetailPage-B112bGAY.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-zRrcxk0e.js.map → YamlWorkflowDetailPage-B112bGAY.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DMK3ojp3.js → YamlWorkflowsPage-Cw5wddH7.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DMK3ojp3.js.map → YamlWorkflowsPage-Cw5wddH7.js.map} +1 -1
- package/dashboard/dist/assets/{agents-B67yyE1z.js → agents-CZ8WIdWH.js} +2 -2
- package/dashboard/dist/assets/{agents-B67yyE1z.js.map → agents-CZ8WIdWH.js.map} +1 -1
- package/dashboard/dist/assets/{bots-pSLFdOm-.js → bots-Xu3MUuXN.js} +2 -2
- package/dashboard/dist/assets/{bots-pSLFdOm-.js.map → bots-Xu3MUuXN.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-XJukFiLn.js +2 -0
- package/dashboard/dist/assets/{capabilities-B2Dem6zw.js.map → capabilities-XJukFiLn.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DGdaM9f3.js → controlplane-D8ZQQUAV.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DGdaM9f3.js.map → controlplane-D8ZQQUAV.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-C1GyAMeK.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-BM7vp-hY.js.map → escalation-columns-C1GyAMeK.js.map} +1 -1
- package/dashboard/dist/assets/index-BEeGFfuP.js +67 -0
- package/dashboard/dist/assets/index-BEeGFfuP.js.map +1 -0
- package/dashboard/dist/assets/{index-DbLOvfv5.js → index-CHAmwNDI.js} +2 -2
- package/dashboard/dist/assets/index-CHAmwNDI.js.map +1 -0
- package/dashboard/dist/assets/index-COtlcGK_.js +2 -0
- package/dashboard/dist/assets/index-COtlcGK_.js.map +1 -0
- package/dashboard/dist/assets/index-CR96SICL.js +2 -0
- package/dashboard/dist/assets/index-CR96SICL.js.map +1 -0
- package/dashboard/dist/assets/{index-CGoXyPlO.js → index-CRxbF5vt.js} +2 -2
- package/dashboard/dist/assets/{index-CGoXyPlO.js.map → index-CRxbF5vt.js.map} +1 -1
- package/dashboard/dist/assets/{index-CLq228E2.js → index-CgGR0kM6.js} +3 -3
- package/dashboard/dist/assets/{index-CLq228E2.js.map → index-CgGR0kM6.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cn__VdSf.js → index-DCaGxwKU.js} +2 -2
- package/dashboard/dist/assets/{index-Cn__VdSf.js.map → index-DCaGxwKU.js.map} +1 -1
- package/dashboard/dist/assets/{index-DajlugVw.js → index-DFmV19fc.js} +3 -3
- package/dashboard/dist/assets/{index-DajlugVw.js.map → index-DFmV19fc.js.map} +1 -1
- package/dashboard/dist/assets/{index-Brf_fpE4.js → index-DWhyH1kV.js} +2 -2
- package/dashboard/dist/assets/{index-Brf_fpE4.js.map → index-DWhyH1kV.js.map} +1 -1
- package/dashboard/dist/assets/{index-CunrdEfT.js → index-DYIy3uT5.js} +2 -2
- package/dashboard/dist/assets/{index-CunrdEfT.js.map → index-DYIy3uT5.js.map} +1 -1
- package/dashboard/dist/assets/index-D_5_1D7U.js +2 -0
- package/dashboard/dist/assets/index-D_5_1D7U.js.map +1 -0
- package/dashboard/dist/assets/{index-Cd2RdpOx.js → index-Dc43wixL.js} +2 -2
- package/dashboard/dist/assets/{index-Cd2RdpOx.js.map → index-Dc43wixL.js.map} +1 -1
- package/dashboard/dist/assets/{index-CKt5YK2z.js → index-DeRM0-Xz.js} +2 -2
- package/dashboard/dist/assets/{index-CKt5YK2z.js.map → index-DeRM0-Xz.js.map} +1 -1
- package/dashboard/dist/assets/{index-CJV2pWNH.css → index-fUqvRHOe.css} +1 -1
- package/dashboard/dist/assets/{knowledge-BExXJ0Ib.js → knowledge-sjJNIdJY.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BExXJ0Ib.js.map → knowledge-sjJNIdJY.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-D2WA-SHc.js → mcp-CQeu19Jf.js} +2 -2
- package/dashboard/dist/assets/{mcp-D2WA-SHc.js.map → mcp-CQeu19Jf.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-4Tsojk-z.js → mcp-query-B9GuC88j.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-4Tsojk-z.js.map → mcp-query-B9GuC88j.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Dy_XSYfJ.js → personas-CQr9sXg3.js} +2 -2
- package/dashboard/dist/assets/{personas-Dy_XSYfJ.js.map → personas-CQr9sXg3.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-yDHgNtdx.js → pipelines-DzMf-VE7.js} +2 -2
- package/dashboard/dist/assets/{pipelines-yDHgNtdx.js.map → pipelines-DzMf-VE7.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CGoPhQyw.js → tasks-QKuXlyLe.js} +2 -2
- package/dashboard/dist/assets/{tasks-CGoPhQyw.js.map → tasks-QKuXlyLe.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DA1MHDwJ.js → topics-DQAQnGV7.js} +2 -2
- package/dashboard/dist/assets/{topics-DA1MHDwJ.js.map → topics-DQAQnGV7.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-DuE9Mj3I.js +2 -0
- package/dashboard/dist/assets/useDebouncedValue-DuE9Mj3I.js.map +1 -0
- package/dashboard/dist/assets/{useNamespace-BkuU0SeK.js → useNamespace-BTCrNkwo.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BkuU0SeK.js.map → useNamespace-BTCrNkwo.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-XXS3wg6-.js → useYamlActivityEvents-_aa1_rNu.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-XXS3wg6-.js.map → useYamlActivityEvents-_aa1_rNu.js.map} +1 -1
- package/dashboard/dist/assets/users-D-DhFQBy.js +2 -0
- package/dashboard/dist/assets/users-D-DhFQBy.js.map +1 -0
- package/dashboard/dist/assets/{workflows-5sds1Ko8.js → workflows-CEWX3imM.js} +2 -2
- package/dashboard/dist/assets/{workflows-5sds1Ko8.js.map → workflows-CEWX3imM.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CjNa2u3I.js → yaml-workflows-Bek1Mg86.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CjNa2u3I.js.map → yaml-workflows-Bek1Mg86.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/api/http/users.md +53 -1
- package/docs/api/mcp/admin.md +17 -0
- package/docs/api/sdk/users.md +24 -0
- package/docs/dashboard.md +19 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/AdminDashboard-Csq-oxmY.js +0 -2
- package/dashboard/dist/assets/AgentsPage-BuyXKkP3.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BIzTjUMG.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BIzTjUMG.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DCkEJ0In.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BFy9Joxb.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-RWvrCHn7.js +0 -2
- package/dashboard/dist/assets/EntityTimelinePanel-CNaYs3nA.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-yv4Yn6zl.js +0 -2
- package/dashboard/dist/assets/FilterBar-D6JDMSHi.js +0 -2
- package/dashboard/dist/assets/FilterBar-D6JDMSHi.js.map +0 -1
- package/dashboard/dist/assets/HomePage-B24GH9Ga.js +0 -2
- package/dashboard/dist/assets/HomePage-B24GH9Ga.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-DlGreUpP.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-BIwSDHgB.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-DjYWJLWh.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-DjYWJLWh.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-CTT7B-pf.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CTT7B-pf.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-Dd0WxAwH.js +0 -3
- package/dashboard/dist/assets/OperationsPage-Dd0WxAwH.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-BfKMaVzV.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-BfKMaVzV.js.map +0 -1
- package/dashboard/dist/assets/PersonasPage-dGX6E96g.js +0 -2
- package/dashboard/dist/assets/PersonasPage-dGX6E96g.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-Co5oCg31.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CrB4VAS6.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CrB4VAS6.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-CkzoOyjd.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-DYamACNZ.js +0 -2
- package/dashboard/dist/assets/TimeAgo-BpJ7In27.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CzhoRsis.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-B_tCYLei.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-B_tCYLei.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-B4Bh8MIo.js +0 -2
- package/dashboard/dist/assets/capabilities-B2Dem6zw.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BM7vp-hY.js +0 -2
- package/dashboard/dist/assets/index-5eRsj758.js +0 -2
- package/dashboard/dist/assets/index-5eRsj758.js.map +0 -1
- package/dashboard/dist/assets/index-BD6nhSOu.js +0 -2
- package/dashboard/dist/assets/index-BD6nhSOu.js.map +0 -1
- package/dashboard/dist/assets/index-Baf-tOnA.js +0 -2
- package/dashboard/dist/assets/index-Baf-tOnA.js.map +0 -1
- package/dashboard/dist/assets/index-DbLOvfv5.js.map +0 -1
- package/dashboard/dist/assets/index-zqoZDL5j.js +0 -67
- package/dashboard/dist/assets/index-zqoZDL5j.js.map +0 -1
- package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js +0 -2
- package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-onx-Z6IY.js +0 -2
- package/dashboard/dist/assets/useEventHooks-onx-Z6IY.js.map +0 -1
- package/dashboard/dist/assets/users-B_9mC6D_.js +0 -2
- package/dashboard/dist/assets/users-B_9mC6D_.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-Baf-tOnA.js","sources":["../../src/pages/knowledge/KnowledgeEntryView.tsx","../../src/pages/knowledge/CreateEntryModal.tsx","../../src/pages/knowledge/KnowledgePage.tsx"],"sourcesContent":["import { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Trash2, History } from 'lucide-react';\nimport { useGetKnowledge, useDeleteKnowledge, useStoreKnowledge, useSetKnowledgeField, useRemoveKnowledgeField, useKnowledgeVersions, useGetKnowledgeVersion } from '../../api/knowledge';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { TagInput } from '../../components/common/form/TagInput';\n\ninterface KnowledgeEntryViewProps {\n domain: string;\n entryKey: string;\n onDeleted: () => void;\n}\n\ntype EditingCell = { field: string; column: 'field' | 'value' } | null;\n\nfunction formatValue(val: unknown): string {\n if (val === null || val === undefined) return '';\n if (typeof val === 'string') return val;\n return JSON.stringify(val, null, 2);\n}\n\nfunction parseValue(raw: string): { value: unknown; looksLikeJson: boolean; parsedOk: boolean } {\n const trimmed = raw.trim();\n if (!trimmed) return { value: '', looksLikeJson: false, parsedOk: false };\n const looksLikeJson = trimmed.startsWith('{') || trimmed.startsWith('[');\n try {\n return { value: JSON.parse(trimmed), looksLikeJson, parsedOk: true };\n } catch {\n return { value: trimmed, looksLikeJson, parsedOk: false };\n }\n}\n\nfunction isSimple(val: unknown): boolean {\n if (typeof val === 'string') {\n const t = val.trim();\n // Strings that look like JSON render as structured\n if ((t.startsWith('{') && t.endsWith('}')) || (t.startsWith('[') && t.endsWith(']'))) return false;\n return true;\n }\n return typeof val === 'number' || typeof val === 'boolean' || val === null;\n}\n\nfunction AutoTextarea({ value, onChange, onKeyDown, placeholder, mono }: {\n value: string;\n onChange: (v: string) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n placeholder?: string;\n mono?: boolean;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n ref.current.style.height = 'auto';\n ref.current.style.height = `${ref.current.scrollHeight}px`;\n ref.current.focus();\n }\n }, [value]);\n\n return (\n <textarea\n ref={ref}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={1}\n className={`w-full bg-transparent text-xs text-text-primary resize-none outline-none p-0 ${mono ? 'font-mono' : ''}`}\n style={{ minHeight: '1.5em' }}\n />\n );\n}\n\nexport function KnowledgeEntryView({ domain, entryKey, onDeleted }: KnowledgeEntryViewProps) {\n const { data: entry, isLoading, refetch } = useGetKnowledge(domain, entryKey);\n const deleteMutation = useDeleteKnowledge();\n const storeMutation = useStoreKnowledge();\n const setFieldMutation = useSetKnowledgeField();\n const removeFieldMutation = useRemoveKnowledgeField();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editing, setEditing] = useState<EditingCell>(null);\n const [draft, setDraft] = useState('');\n const [ghostField, setGhostField] = useState('');\n const [ghostValue, setGhostValue] = useState('');\n const [pendingRemove, setPendingRemove] = useState<string | null>(null);\n const [jsonHint, setJsonHint] = useState<string | null>(null);\n const [editingTags, setEditingTags] = useState(false);\n // Every data-changing save mints an immutable edition. The viewed edition\n // is DEEP-LINKED (?version=N): a shared link reproduces the exact snapshot,\n // and the version select writes the URL. Absent (or equal to the current\n // version), the live entry shows.\n const [searchParams, setSearchParams] = useSearchParams();\n const versionsQuery = useKnowledgeVersions(domain, entryKey, !!entry && entry.found !== false);\n const versions = versionsQuery.data?.versions ?? [];\n const rawVersion = searchParams.get('version');\n const urlVersion = rawVersion && /^[0-9]+$/.test(rawVersion) ? parseInt(rawVersion, 10) : null;\n const viewVersion = urlVersion != null && entry && urlVersion !== entry.current_version ? urlVersion : null;\n const viewingPast = viewVersion != null;\n const snapshotQuery = useGetKnowledgeVersion(domain, entryKey, viewVersion);\n\n const selectVersion = useCallback((version: number, currentVersion: number) => {\n setSearchParams((prev) => {\n const p = new URLSearchParams(prev);\n if (version === currentVersion) p.delete('version');\n else p.set('version', String(version));\n return p;\n }, { replace: true });\n }, [setSearchParams]);\n\n const data = (viewingPast ? snapshotQuery.data?.data : entry?.data) as Record<string, unknown> | undefined;\n const allFields = data ? Object.entries(data) : [];\n\n // Ghost field input doubles as a filter — if text is entered but not yet saved,\n // narrow the visible rows to matching field names\n const fields = useMemo(() => {\n const q = ghostField.trim().toLowerCase();\n if (!q) return allFields;\n return allFields.filter(([field]) => field.toLowerCase().includes(q));\n }, [allFields, ghostField]);\n\n const originalValue = useCallback((field: string, column: 'field' | 'value'): string => {\n if (column === 'field') return field;\n return formatValue(data?.[field]);\n }, [data]);\n\n const isDirty = editing\n ? draft !== originalValue(editing.field, editing.column)\n : false;\n\n function startEdit(field: string, column: 'field' | 'value') {\n if (viewingPast) return; // editions are immutable — editing acts on the current entry only\n setEditing({ field, column });\n setDraft(originalValue(field, column));\n setPendingRemove(null);\n }\n\n function cancelEdit() {\n setEditing(null);\n setDraft('');\n }\n\n function showJsonHint() {\n setJsonHint('Invalid JSON — saved as text');\n setTimeout(() => setJsonHint(null), 4000);\n }\n\n async function commitEdit() {\n if (!editing || !data) return;\n const { field, column } = editing;\n\n if (column === 'value') {\n const { value: parsed, looksLikeJson, parsedOk } = parseValue(draft);\n if (looksLikeJson && !parsedOk) showJsonHint();\n // Use setField for surgical update — preserves siblings\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: field, value: parsed });\n } else {\n // Rename: remove old field, set new field\n const newName = draft.trim();\n if (!newName || newName === field) { cancelEdit(); return; }\n const val = data[field];\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: newName, value: val });\n }\n\n setEditing(null);\n setDraft('');\n refetch();\n }\n\n async function removeField(field: string) {\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n setPendingRemove(null);\n setEditing(null);\n refetch();\n }\n\n async function saveTags(tags: string[]) {\n await storeMutation.mutateAsync({\n domain,\n key: entryKey,\n data: data || {},\n tags,\n replace: true,\n });\n refetch();\n }\n\n async function commitGhostRow() {\n const name = ghostField.trim();\n if (!name) return;\n const { value, looksLikeJson, parsedOk } = parseValue(ghostValue);\n if (looksLikeJson && !parsedOk) showJsonHint();\n const updated = { ...data, [name]: value || '' };\n await storeMutation.mutateAsync({ domain, key: entryKey, data: updated });\n setGhostField('');\n setGhostValue('');\n refetch();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n cancelEdit();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitEdit();\n }\n }\n\n function handleGhostKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n setGhostField('');\n setGhostValue('');\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitGhostRow();\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-3 mt-4\">\n <div className=\"h-4 bg-surface-sunken rounded w-1/3\" />\n <div className=\"h-48 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!entry || entry.found === false) {\n return <p className=\"text-sm text-text-tertiary mt-4\">Entry not found.</p>;\n }\n\n return (\n <div>\n {/* Metadata + actions bar */}\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-4 min-h-[28px]\">\n {editingTags ? (\n <div className=\"flex items-center gap-2\">\n <TagInput\n tags={entry.tags || []}\n onChange={(tags) => { saveTags(tags); }}\n placeholder=\"Add tag...\"\n compact\n />\n <button\n onClick={() => setEditingTags(false)}\n className=\"text-2xs text-text-tertiary hover:text-text-secondary shrink-0\"\n >\n Done\n </button>\n </div>\n ) : (\n <div\n className=\"flex items-center gap-1 cursor-text group\"\n onClick={() => setEditingTags(true)}\n title=\"Click to edit tags\"\n >\n {entry.tags && entry.tags.length > 0 ? (\n entry.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded-full text-2xs font-medium bg-accent/10 text-accent\">\n {tag}\n </span>\n ))\n ) : (\n <span className=\"text-2xs text-text-tertiary/40 italic group-hover:text-text-tertiary\">add tags...</span>\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n {/* The edition selector — every data-changing save mints the next\n one; picking a past edition deep-links it (?version=N). */}\n <span className=\"inline-flex items-center gap-1.5\">\n <History className=\"w-3 h-3 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <select\n value={String(viewVersion ?? entry.current_version)}\n onChange={(e) => selectVersion(parseInt(e.target.value, 10), entry.current_version)}\n title=\"Version history\"\n aria-label=\"Version history\"\n className=\"select text-2xs py-1\"\n >\n {(versions.length > 0\n ? versions\n : [{ version: entry.current_version, is_current: true }]\n ).map((v) => (\n <option key={v.version} value={String(v.version)}>\n v{v.version}{v.is_current ? ' · current' : ''}\n </option>\n ))}\n </select>\n </span>\n <span className=\"text-2xs text-text-tertiary\"><TimeAgo date={entry.updated_at} /></span>\n {confirmDelete ? (\n <span className=\"flex items-center gap-2 text-2xs\">\n <span className=\"text-status-error\">Delete entry?</span>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync({ domain, key: entryKey });\n onDeleted();\n } catch { /* */ }\n }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Yes'}\n </button>\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"text-text-tertiary/50 hover:text-status-error transition-colors\"\n title=\"Delete entry\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {viewingPast && (\n <div className=\"flex items-center gap-2 mb-2 px-1 text-2xs\">\n <span className=\"text-text-secondary\">\n Viewing <span className=\"font-mono font-medium\">v{viewVersion}</span> — an immutable edition\n {snapshotQuery.data?.created_at && <> from <TimeAgo date={snapshotQuery.data.created_at} /></>}\n </span>\n <button\n onClick={() => selectVersion(entry.current_version, entry.current_version)}\n className=\"font-medium text-accent hover:text-accent-hover\"\n >\n Back to current\n </button>\n </div>\n )}\n\n {jsonHint && (\n <div className=\"flex items-center justify-end gap-2 mb-2 px-1\">\n <span className=\"inline-block w-2.5 h-2.5 rounded-full dot-ring bg-status-warning animate-pulse\" />\n <span className=\"text-xs text-status-warning\">{jsonHint}</span>\n </div>\n )}\n\n {/* Field/value grid */}\n <table className=\"w-full border-collapse\">\n <thead className=\"sticky top-0 z-10 bg-surface\">\n <tr className=\"text-left text-2xs uppercase tracking-wider text-text-tertiary border-b border-surface-border\">\n <th className=\"px-3 py-2 font-medium w-[200px] border-r border-surface-border\">Field</th>\n <th className=\"px-3 py-2 font-medium\">Value</th>\n </tr>\n {/* Input row — add new field or filter existing. Hidden while viewing\n a past edition: snapshots are immutable, edits act on the current entry. */}\n {!viewingPast && (\n <tr className=\"border-b border-surface-border bg-surface\">\n <td className=\"px-3 py-2 align-top border-r border-surface-border\">\n <input\n value={ghostField}\n onChange={(e) => setGhostField(e.target.value)}\n onKeyDown={handleGhostKeyDown}\n placeholder={allFields.length ? 'add or filter...' : 'new field'}\n className=\"w-full bg-transparent text-xs text-text-primary placeholder:text-text-tertiary/40 placeholder:italic outline-none p-0\"\n />\n </td>\n <td className=\"px-3 py-2 align-top\">\n <AutoTextarea\n value={ghostValue}\n onChange={setGhostValue}\n onKeyDown={handleGhostKeyDown}\n placeholder=\"value\"\n />\n {ghostField.trim() && (\n <div className=\"flex gap-2 mt-1.5\">\n <button\n onClick={commitGhostRow}\n className=\"text-2xs font-medium text-accent hover:text-accent-hover\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button\n onClick={() => { setGhostField(''); setGhostValue(''); }}\n className=\"text-2xs text-text-tertiary hover:text-text-secondary\"\n >\n Cancel\n </button>\n </div>\n )}\n </td>\n </tr>\n )}\n </thead>\n <tbody>\n {fields.map(([field, value]) => {\n const isEditingField = editing?.field === field && editing.column === 'field';\n const isEditingValue = editing?.field === field && editing.column === 'value';\n const isActive = isEditingField || isEditingValue;\n const isRemoving = pendingRemove === field;\n\n return (\n <tr key={field} className={`border-b border-surface-border ${isRemoving ? 'bg-status-error/10' : isActive ? '' : 'hover:bg-surface-hover/30'}`}>\n {/* Field name cell */}\n <td\n className={`px-3 py-2 align-top border-r cursor-text ${isRemoving ? 'bg-transparent border-r-transparent' : isEditingField ? 'border-r-surface-border bg-accent/5 border-l-2 border-l-accent' : 'border-r-surface-border'}`}\n onClick={() => !isEditingField && !isRemoving && startEdit(field, 'field')}\n >\n {isEditingField ? (\n <div>\n <AutoTextarea value={draft} onChange={setDraft} onKeyDown={handleKeyDown} placeholder=\"field name\" />\n {isDirty && (\n <div className=\"flex gap-2 mt-1.5\">\n <button onClick={commitEdit} className=\"text-2xs font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button onClick={cancelEdit} className=\"text-2xs text-text-tertiary hover:text-text-secondary\">Cancel</button>\n </div>\n )}\n </div>\n ) : (\n <span className=\"text-xs font-medium text-text-secondary break-all\">{field}</span>\n )}\n </td>\n\n {/* Value cell */}\n <td\n className={`px-3 py-2 align-top cursor-text ${isRemoving ? 'bg-transparent' : isEditingValue ? 'bg-accent/5 border-l-2 border-l-accent' : ''}`}\n onClick={() => !isEditingValue && !isRemoving && startEdit(field, 'value')}\n >\n {isRemoving ? (\n <span className=\"flex items-center justify-end gap-2 text-2xs\">\n <span className=\"text-status-error\">Remove <span className=\"font-medium\">{field}</span>?</span>\n <button\n onClick={(e) => { e.stopPropagation(); removeField(field); }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? '...' : 'Yes'}\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(null); }}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : isEditingValue ? (\n <div>\n <AutoTextarea\n value={draft}\n onChange={setDraft}\n onKeyDown={handleKeyDown}\n placeholder=\"value (string or JSON)\"\n mono={!isSimple(value)}\n />\n <div className=\"flex gap-2 mt-1.5\">\n {isDirty && (\n <button onClick={commitEdit} className=\"text-2xs font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n )}\n <button onClick={cancelEdit} className=\"text-2xs text-text-tertiary hover:text-text-secondary\">Cancel</button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(field); }}\n className=\"text-2xs text-status-error/50 hover:text-status-error ml-auto\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : (\n isSimple(value) ? (\n <p className=\"text-xs text-text-primary break-words whitespace-pre-wrap\">{String(value)}</p>\n ) : (\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap break-words\">\n {typeof value === 'string' ? value : JSON.stringify(value, null, 2)}\n </pre>\n )\n )}\n </td>\n </tr>\n );\n })}\n\n </tbody>\n </table>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStoreKnowledge, useListDomains } from '../../api/knowledge';\n\ninterface CreateEntryModalProps {\n open: boolean;\n onClose: () => void;\n onCreated?: (domain: string, key: string) => void;\n /** Pre-fill data from a dropped JSON file */\n prefillData?: Record<string, unknown>;\n /** Pre-fill domain from current navigation */\n prefillDomain?: string;\n}\n\nexport function CreateEntryModal({ open, onClose, onCreated, prefillData, prefillDomain }: CreateEntryModalProps) {\n const { data: domainsData } = useListDomains();\n const storeMutation = useStoreKnowledge();\n const [domain, setDomain] = useState(prefillDomain || '');\n const [key, setKey] = useState('');\n const [dataInput, setDataInput] = useState(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n const [tags, setTags] = useState('');\n const [error, setError] = useState('');\n\n const domains = (domainsData?.domains ?? []).map((d: any) => d.domain);\n\n // Sync prefill props → state when they change (e.g., JSON drop)\n useEffect(() => {\n if (open) {\n setDataInput(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n setDomain(prefillDomain || '');\n setKey('');\n setTags('');\n setError('');\n }\n }, [open, prefillData, prefillDomain]);\n\n if (!open) return null;\n\n const handleSubmit = async () => {\n setError('');\n if (!domain.trim()) { setError('Domain is required'); return; }\n if (!key.trim()) { setError('Key is required'); return; }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(dataInput);\n if (typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error();\n } catch {\n setError('Data must be a valid JSON object');\n return;\n }\n try {\n await storeMutation.mutateAsync({\n domain: domain.trim(),\n key: key.trim(),\n data: parsed,\n tags: tags ? tags.split(',').map(t => t.trim()).filter(Boolean) : [],\n });\n onCreated?.(domain.trim(), key.trim());\n onClose();\n } catch (err: any) {\n setError(err.message);\n }\n };\n\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-40 bg-black/30\" onClick={onClose} />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-6 overflow-y-auto\">\n <div className=\"bg-surface-raised border border-surface-border rounded-lg shadow-lg w-full max-w-md max-h-[85vh] flex flex-col\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-surface-border\">\n <h3 className=\"text-sm font-medium text-text-primary\">New Knowledge Entry</h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"px-5 py-4 space-y-4 overflow-y-auto flex-1 min-h-0\">\n {/* Domain */}\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Domain</label>\n <input\n type=\"text\"\n list=\"domain-list\"\n value={domain}\n onChange={(e) => setDomain(e.target.value)}\n placeholder=\"e.g., screenshots, config, emails\"\n className=\"input text-xs w-full\"\n />\n <datalist id=\"domain-list\">\n {domains.map((d: string) => <option key={d} value={d} />)}\n </datalist>\n </div>\n\n {/* Key */}\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Key</label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g., homepage, user-profile, report-2026\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {/* Data */}\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Data (JSON)</label>\n <textarea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={8}\n className=\"input-json w-full max-h-[30vh]\"\n />\n </div>\n\n {/* Tags */}\n <div>\n <label className=\"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags (comma-separated)</label>\n <input\n type=\"text\"\n value={tags}\n onChange={(e) => setTags(e.target.value)}\n placeholder=\"e.g., important, review, 401k\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {error && <p className=\"text-xs text-status-error\">{error}</p>}\n </div>\n\n <div className=\"flex justify-end gap-2 px-5 py-3 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Cancel</button>\n <button\n onClick={handleSubmit}\n disabled={storeMutation.isPending}\n className=\"btn-primary text-xs\"\n >\n {storeMutation.isPending ? 'Creating...' : 'Create Entry'}\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n );\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ChevronRight, Braces, Database, Table2, Plus } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterInput } from '../../components/common/data/FilterBar';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { DropZone } from '../../components/common/DropZone';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { useListDomains, useListKnowledge } from '../../api/knowledge';\nimport { KnowledgeEntryView } from './KnowledgeEntryView';\nimport { CreateEntryModal } from './CreateEntryModal';\n\nconst PAGE_SIZE = 50;\n\nexport function KnowledgePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const domain = searchParams.get('domain') || '';\n const entryKey = searchParams.get('key') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(PAGE_SIZE);\n const [showCreate, setShowCreate] = useState(false);\n const [prefillData, setPrefillData] = useState<Record<string, unknown> | undefined>();\n\n const handleJsonDrop = useCallback((files: File[]) => {\n console.debug('[Knowledge] drop received:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n const jsonFile = files.find(f => f.name.endsWith('.json') || f.type === 'application/json');\n if (!jsonFile) {\n console.warn('[Knowledge] no JSON file found in dropped files');\n return;\n }\n console.debug('[Knowledge] reading:', jsonFile.name);\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const parsed = JSON.parse(reader.result as string);\n if (typeof parsed === 'object' && !Array.isArray(parsed)) {\n console.debug('[Knowledge] parsed object with keys:', Object.keys(parsed));\n setPrefillData(parsed);\n setShowCreate(true);\n } else {\n console.warn('[Knowledge] JSON is not a plain object, got:', Array.isArray(parsed) ? 'array' : typeof parsed);\n }\n } catch (err) {\n console.warn('[Knowledge] JSON parse failed:', err);\n }\n };\n reader.readAsText(jsonFile);\n }, []);\n\n // Debounce search to avoid hammering the API on every keystroke\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setPage(1);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const offset = (page - 1) * pageSize;\n\n const domainsQuery = useListDomains();\n const entriesQuery = useListKnowledge(domain, {\n search: debouncedSearch || undefined,\n limit: pageSize,\n offset,\n });\n\n const domains = domainsQuery.data?.domains ?? [];\n const entries = entriesQuery.data?.entries ?? [];\n const entriesTotal = entriesQuery.data?.total ?? 0;\n\n // Domains are a small list — client-side filter is fine\n const filteredDomains = useMemo(() => {\n if (!search) return domains;\n const q = search.toLowerCase();\n return domains.filter((d) => d.domain.toLowerCase().includes(q));\n }, [domains, search]);\n\n function navigate(d: string, k?: string) {\n setSearch('');\n setDebouncedSearch('');\n setPage(1);\n const params: Record<string, string> = {};\n if (d) params.domain = d;\n if (k) params.key = k;\n setSearchParams(params);\n }\n\n const level = entryKey ? 'entry' : domain ? 'entries' : 'domains';\n const isLoading = level === 'entries' ? entriesQuery.isLoading : level === 'domains' ? domainsQuery.isLoading : false;\n const totalPages = Math.ceil((level === 'entries' ? entriesTotal : filteredDomains.length) / pageSize);\n\n const entriesApiPath = domain\n ? `/knowledge/entries?domain=${encodeURIComponent(domain)}&limit=${pageSize}&offset=${offset}${debouncedSearch ? `&search=${encodeURIComponent(debouncedSearch)}` : ''}`\n : undefined;\n const domainsApiPath = '/knowledge/domains';\n\n return (\n <DropZone onDrop={handleJsonDrop} label=\"Drop a JSON file to create an entry\" accept=\".json,application/json\">\n <div>\n <PageHeader\n title=\"Knowledge Base\"\n docsHash=\"#docs:dashboard.md:knowledge\"\n actions={\n <button\n onClick={() => { setPrefillData(undefined); setShowCreate(true); }}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n New Entry\n </button>\n }\n />\n\n {/* Breadcrumbs */}\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => navigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'domains'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Braces className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>All Domains</span>\n </button>\n {domain && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => navigate(domain)}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'entries'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Database className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {domain}\n </button>\n </>\n )}\n {entryKey && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"flex items-center gap-1.5 px-1.5 py-0.5 text-text-primary font-medium\">\n <Table2 className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {entryKey}\n </span>\n </>\n )}\n </nav>\n\n {/* Level: entry detail */}\n {level === 'entry' ? (\n <KnowledgeEntryView\n domain={domain}\n entryKey={entryKey}\n onDeleted={() => navigate(domain)}\n />\n ) : (\n <>\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => level === 'entries' ? entriesQuery.refetch() : domainsQuery.refetch()}\n isFetching={level === 'entries' ? entriesQuery.isFetching : domainsQuery.isFetching}\n apiPath={level === 'entries' ? entriesApiPath : domainsApiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={domain ? 'Filter by key or tag...' : 'Filter by domain...'}\n />\n </FilterBar>\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-2 mt-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : level === 'domains' ? (\n filteredDomains.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Braces} title={search ? 'No matching domains' : 'Knowledge Base Empty'} description={search ? undefined : 'Create your first entry or drop a JSON file'} />\n </div>\n ) : (\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-2xs uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium\">Domain</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Entries</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Latest</th>\n </tr>\n </thead>\n <tbody>\n {filteredDomains.map((d) => (\n <tr\n key={d.domain}\n onClick={() => navigate(d.domain)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n <Database className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors\">\n {d.domain}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {d.count}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={d.latest} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : (\n entries.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Plus} title={search ? 'No matching entries' : 'No entries in this domain'} description={search ? undefined : 'Add an entry or drop a JSON file'} />\n </div>\n ) : (\n <>\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-2xs uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium w-[200px]\">Key</th>\n <th className=\"pb-2 font-medium\">Tags</th>\n <th className=\"pb-2 font-medium w-16 text-right\">Fields</th>\n <th className=\"pb-2 font-medium w-20 text-right\">Version</th>\n <th className=\"pb-2 pr-2 font-medium w-32 text-right\">Updated</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry) => (\n <tr\n key={entry.key}\n onClick={() => navigate(domain, entry.key)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2 w-[200px]\">\n <span className=\"flex items-center gap-2.5\">\n <Table2 className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors truncate max-w-[160px]\" title={entry.key}>\n {entry.key}\n </span>\n </span>\n </td>\n <td className=\"py-2\">\n <div className=\"flex flex-wrap gap-1\">\n {entry.tags?.slice(0, 5).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center px-1.5 py-0 rounded-full text-2xs font-medium bg-accent/10 text-accent\"\n >\n {tag}\n </span>\n ))}\n {entry.tags && entry.tags.length > 5 && (\n <span className=\"text-2xs text-text-tertiary\">\n +{entry.tags.length - 5}\n </span>\n )}\n </div>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {entry.data ? Object.keys(entry.data).length : 0}\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary font-mono tabular-nums\">\n v{entry.current_version}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={entry.updated_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n <StickyPagination\n page={page}\n totalPages={totalPages}\n onPageChange={setPage}\n total={entriesTotal}\n pageSize={pageSize}\n onPageSizeChange={setPageSize}\n />\n </>\n )\n )}\n </>\n )}\n </div>\n\n <CreateEntryModal\n open={showCreate}\n onClose={() => { setShowCreate(false); setPrefillData(undefined); }}\n onCreated={(d, k) => {\n setSearchParams({ domain: d, key: k });\n domainsQuery.refetch();\n }}\n prefillData={prefillData}\n prefillDomain={domain || undefined}\n />\n </DropZone>\n );\n}\n"],"names":["formatValue","val","parseValue","raw","trimmed","looksLikeJson","isSimple","t","AutoTextarea","value","onChange","onKeyDown","placeholder","mono","ref","useRef","useEffect","jsx","e","KnowledgeEntryView","domain","entryKey","onDeleted","entry","isLoading","refetch","useGetKnowledge","deleteMutation","useDeleteKnowledge","storeMutation","useStoreKnowledge","setFieldMutation","useSetKnowledgeField","removeFieldMutation","useRemoveKnowledgeField","confirmDelete","setConfirmDelete","useState","editing","setEditing","draft","setDraft","ghostField","setGhostField","ghostValue","setGhostValue","pendingRemove","setPendingRemove","jsonHint","setJsonHint","editingTags","setEditingTags","searchParams","setSearchParams","useSearchParams","versions","_a","useKnowledgeVersions","rawVersion","urlVersion","viewVersion","viewingPast","snapshotQuery","useGetKnowledgeVersion","selectVersion","useCallback","version","currentVersion","prev","p","data","_b","allFields","fields","useMemo","q","field","originalValue","column","isDirty","startEdit","cancelEdit","showJsonHint","commitEdit","parsed","parsedOk","newName","removeField","saveTags","tags","commitGhostRow","name","updated","handleKeyDown","handleGhostKeyDown","jsxs","TagInput","tag","History","v","TimeAgo","Trash2","_c","Fragment","isEditingField","isEditingValue","isActive","isRemoving","CreateEntryModal","open","onClose","onCreated","prefillData","prefillDomain","domainsData","useListDomains","setDomain","key","setKey","dataInput","setDataInput","setTags","error","setError","domains","d","handleSubmit","err","createPortal","X","PAGE_SIZE","KnowledgePage","search","setSearch","debouncedSearch","setDebouncedSearch","page","setPage","pageSize","setPageSize","showCreate","setShowCreate","setPrefillData","handleJsonDrop","files","f","jsonFile","reader","offset","domainsQuery","entriesQuery","useListKnowledge","entries","entriesTotal","filteredDomains","navigate","k","params","level","totalPages","entriesApiPath","DropZone","PageHeader","Plus","Braces","ChevronRight","Database","Table2","FilterBar","ListToolbar","FilterInput","_","i","EmptyState","StickyPagination"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DbLOvfv5.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-2xs font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-2xs font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" docsHash=\"#docs:dashboard.md:task-queues\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-2xs py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxs","jsx","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
|