@hotmeshio/long-tail 0.10.8 → 0.10.10
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/escalations/bulk.js +7 -1
- package/build/api/escalations/helpers.d.ts +10 -1
- package/build/api/escalations/helpers.js +52 -12
- package/build/api/index.d.ts +1 -0
- package/build/api/index.js +2 -1
- package/build/api/personas.d.ts +121 -0
- package/build/api/personas.js +341 -0
- package/build/bin/ltc.js +23 -0
- package/build/lib/cli/commands/personas.d.ts +16 -0
- package/build/lib/cli/commands/personas.js +42 -0
- package/build/lib/db/schemas/024_personas.sql +53 -0
- package/build/lib/events/matching.d.ts +10 -0
- package/build/lib/events/matching.js +14 -0
- package/build/lib/events/publish.d.ts +8 -2
- package/build/lib/events/publish.js +9 -2
- package/build/lib/events/socketio.d.ts +8 -2
- package/build/lib/events/socketio.js +36 -3
- package/build/lib/events/system-events.js +9 -1
- package/build/routes/index.js +2 -0
- package/build/routes/personas.d.ts +2 -0
- package/build/routes/personas.js +118 -0
- package/build/routes/users.js +35 -0
- package/build/sdk/index.d.ts +15 -0
- package/build/sdk/index.js +16 -0
- package/build/services/escalation/crud.js +40 -2
- package/build/services/orchestrator/condition.d.ts +1 -1
- package/build/services/orchestrator/condition.js +1 -1
- package/build/services/persona/index.d.ts +92 -0
- package/build/services/persona/index.js +217 -0
- package/build/services/persona/sql.d.ts +24 -0
- package/build/services/persona/sql.js +158 -0
- package/build/services/persona/types.d.ts +23 -0
- package/build/services/persona/types.js +33 -0
- package/build/services/topics/system-topics.d.ts +0 -4
- package/build/services/topics/system-topics.js +57 -14
- package/build/services/user/sql.d.ts +8 -5
- package/build/services/user/sql.js +15 -5
- package/build/system/mcp-servers/admin/index.d.ts +1 -0
- package/build/system/mcp-servers/admin/index.js +5 -2
- package/build/system/mcp-servers/admin/personas.d.ts +8 -0
- package/build/system/mcp-servers/admin/personas.js +186 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +91 -0
- package/build/system/mcp-servers/admin/schemas.js +42 -2
- package/build/system/seed/tool-manifests-admin.d.ts +975 -0
- package/build/system/seed/tool-manifests-admin.js +11 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/events.d.ts +11 -3
- package/build/types/index.d.ts +1 -0
- package/build/types/persona.d.ts +56 -0
- package/build/types/persona.js +2 -0
- package/build/types/user.d.ts +2 -0
- package/dashboard/dist/assets/{AdminDashboard-D0HdEkT9.js → AdminDashboard-cGYuppUP.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-D0HdEkT9.js.map → AdminDashboard-cGYuppUP.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CtURUMOV.js → AgentConfigPage-DwaUyoCy.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-CtURUMOV.js.map → AgentConfigPage-DwaUyoCy.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-DxpFaltM.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DxpFaltM.js.map +1 -0
- package/dashboard/dist/assets/{AgentsPage-DBequneI.js → AgentsPage-ByOoA8oT.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DBequneI.js.map → AgentsPage-ByOoA8oT.js.map} +1 -1
- package/dashboard/dist/assets/AutoGrowTextarea-y-oNY51_.js +2 -0
- package/dashboard/dist/assets/AutoGrowTextarea-y-oNY51_.js.map +1 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-Bk7fFV2e.js → AvailableEscalationsPage-C1vtTvqP.js} +2 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-BMXokkH7.js → BotPicker-Dohv8dhR.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-BMXokkH7.js.map → BotPicker-Dohv8dhR.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-w-D6xraE.js → CapabilitiesPage-DeijFG3J.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-w-D6xraE.js.map → CapabilitiesPage-DeijFG3J.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-IPL1H1bQ.js → CollapsibleSection-BPNwS4eO.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-IPL1H1bQ.js.map → CollapsibleSection-BPNwS4eO.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-DR48hDES.js → CredentialsPage-oeNmMzTM.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DR48hDES.js.map → CredentialsPage-oeNmMzTM.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-KQEj0cDS.js → CronLabel-CebR1m2k.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-KQEj0cDS.js.map → CronLabel-CebR1m2k.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-Bh9QdBVw.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-Bh9QdBVw.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-BrnAkQxF.js → DropZone-Bavzt2QR.js} +2 -2
- package/dashboard/dist/assets/{DropZone-BrnAkQxF.js.map → DropZone-Bavzt2QR.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-Caa6CU_y.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-Cflz7Pb5.js.map → ElapsedCell-Caa6CU_y.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BTBZ8OBY.js → EscalationListSchemaPage-CAGfq0eK.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BTBZ8OBY.js.map → EscalationListSchemaPage-CAGfq0eK.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-Cd9fR2EA.js → EscalationSchemaPage-qDD4ur6P.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-Cd9fR2EA.js.map → EscalationSchemaPage-qDD4ur6P.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BzNFcA0i.js → EscalationsOverview-CC1wRTzy.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BzNFcA0i.js.map → EscalationsOverview-CC1wRTzy.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-S2BJqOt2.js → EventTable-4JeTcXr_.js} +2 -2
- package/dashboard/dist/assets/{EventTable-S2BJqOt2.js.map → EventTable-4JeTcXr_.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CeXwNVn6.js → FilterBar-BOV8DWIO.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CeXwNVn6.js.map → FilterBar-BOV8DWIO.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-CBjXjOLX.js → GraphInvokePage-C0i1speW.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-CBjXjOLX.js.map → GraphInvokePage-C0i1speW.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js +2 -0
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar-Dx6DuFdR.js → ListToolbar-BFHVOba6.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Dx6DuFdR.js.map → ListToolbar-BFHVOba6.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Cj8_UyWJ.js → McpOverview-Chn2zIXr.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Cj8_UyWJ.js.map → McpOverview-Chn2zIXr.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-Cv1FKrvw.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-Cv1FKrvw.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-Dzn8JE4E.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-Dzn8JE4E.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-BqhRwkGk.js → McpRunDetailPage-CuNtR4Ed.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-BqhRwkGk.js.map → McpRunDetailPage-CuNtR4Ed.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-CNXYU4iX.js → McpRunsPage-C8iifeKN.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-CNXYU4iX.js.map → McpRunsPage-C8iifeKN.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-DQGzN0Ph.js → NamespacePill-ep9Zmokr.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DQGzN0Ph.js.map → NamespacePill-ep9Zmokr.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-C7UB_d-X.js → OperationsPage-flrZ-EJ9.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-C7UB_d-X.js.map → OperationsPage-flrZ-EJ9.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-DlcE3U5L.js → PageHeader-Bw8RNkqR.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DlcE3U5L.js.map → PageHeader-Bw8RNkqR.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BMhnR3-9.js → PageHeaderWithStats-NR_4idn6.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BMhnR3-9.js.map → PageHeaderWithStats-NR_4idn6.js.map} +1 -1
- package/dashboard/dist/assets/PersonaDetailPage-DKILoUqL.js +2 -0
- package/dashboard/dist/assets/PersonaDetailPage-DKILoUqL.js.map +1 -0
- package/dashboard/dist/assets/PersonasPage-qvzHTrFw.js +2 -0
- package/dashboard/dist/assets/PersonasPage-qvzHTrFw.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-C3LfeKvi.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-C3LfeKvi.js.map +1 -0
- package/dashboard/dist/assets/{ProcessesListPage-DatKHVkd.js → ProcessesListPage-OoZ_u4ty.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DatKHVkd.js.map → ProcessesListPage-OoZ_u4ty.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-dzo14hB_.js → RolePill-TySZq7dB.js} +2 -2
- package/dashboard/dist/assets/{RolePill-dzo14hB_.js.map → RolePill-TySZq7dB.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +2 -0
- package/dashboard/dist/assets/RolesPage-CNueMVuJ.js.map +1 -0
- package/dashboard/dist/assets/{RunAsSelector-VbBn0o7s.js → RunAsSelector-CwWEpiSF.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-VbBn0o7s.js.map → RunAsSelector-CwWEpiSF.js.map} +1 -1
- package/dashboard/dist/assets/ScopeBadge-C7Uixtmk.js +2 -0
- package/dashboard/dist/assets/ScopeBadge-C7Uixtmk.js.map +1 -0
- package/dashboard/dist/assets/StatCard-Ca-ngCaD.js +2 -0
- package/dashboard/dist/assets/StatCard-Ca-ngCaD.js.map +1 -0
- package/dashboard/dist/assets/{StatusBadge-BbqghFMi.js → StatusBadge-BwUvykDo.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BbqghFMi.js.map → StatusBadge-BwUvykDo.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BI8tDf2V.js → StickyPagination-DvIF3kQK.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BI8tDf2V.js.map → StickyPagination-DvIF3kQK.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-BObbEz7P.js → StreamMessageDetail-DkFK_XGD.js} +2 -2
- package/dashboard/dist/assets/StreamMessageDetail-DkFK_XGD.js.map +1 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-BHjAtOGC.js → SwimlaneTimeline-CMw-Et6h.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BHjAtOGC.js.map → SwimlaneTimeline-CMw-Et6h.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-cyhTZTwe.js → TagInput-D8gSp48D.js} +2 -2
- package/dashboard/dist/assets/{TagInput-cyhTZTwe.js.map → TagInput-D8gSp48D.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-B-E1dqUw.js → TaskDetailPage-BhXuChOf.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-B-E1dqUw.js.map → TaskDetailPage-BhXuChOf.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-_zIpG4bG.js → TaskQueuePill-CHqolBmU.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-_zIpG4bG.js.map → TaskQueuePill-CHqolBmU.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-urJ4XiUi.js → TasksListPage-6JHQQ5QZ.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-urJ4XiUi.js.map → TasksListPage-6JHQQ5QZ.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-D6Dg0SQs.js → TimeAgo-CInx-vzY.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-D6Dg0SQs.js.map → TimeAgo-CInx-vzY.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DG__Gr-e.js → TimestampCell-Fq17Zrsu.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DG__Gr-e.js.map → TimestampCell-Fq17Zrsu.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-CKHYG6eV.js → ToolPill-BbgMDhaE.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-CKHYG6eV.js.map → ToolPill-BbgMDhaE.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-D-hGLf95.js → ToolTestPanel-DhjEe59s.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-D-hGLf95.js.map → ToolTestPanel-DhjEe59s.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-B10i4xV2.js → TopicDetailPage-DbIdmQpQ.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-B10i4xV2.js.map → TopicDetailPage-DbIdmQpQ.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CAP-GUbr.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-C5THflVQ.js.map → TopicsPage-CAP-GUbr.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CZTpouta.js → UserName-DggcLkSc.js} +2 -2
- package/dashboard/dist/assets/{UserName-CZTpouta.js.map → UserName-DggcLkSc.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-mbnj6saI.js → WorkflowExecutionPage-Bmra5fVt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-mbnj6saI.js.map → WorkflowExecutionPage-Bmra5fVt.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-DlSVXnnj.js → WorkflowPill-CcUUVugA.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-DlSVXnnj.js.map → WorkflowPill-CcUUVugA.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DC_9GrpY.js → WorkflowsDashboard-BQsZAGYU.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DC_9GrpY.js.map → WorkflowsDashboard-BQsZAGYU.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-ClSH1UwG.js → WorkflowsOverview-CeliraHZ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-ClSH1UwG.js.map → WorkflowsOverview-CeliraHZ.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BkgoB7oD.js → YamlWorkflowDetailPage-DGxlonrV.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BkgoB7oD.js.map → YamlWorkflowDetailPage-DGxlonrV.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Db_REA2f.js → YamlWorkflowsPage-DnT8UiyQ.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Db_REA2f.js.map → YamlWorkflowsPage-DnT8UiyQ.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dvb8j9AB.js → agents-mRV7m4sh.js} +2 -2
- package/dashboard/dist/assets/{agents-Dvb8j9AB.js.map → agents-mRV7m4sh.js.map} +1 -1
- package/dashboard/dist/assets/{bots-D9jYHjBM.js → bots-SONCZlCM.js} +2 -2
- package/dashboard/dist/assets/{bots-D9jYHjBM.js.map → bots-SONCZlCM.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BAto9JcQ.js → capabilities-DZjCMN32.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BAto9JcQ.js.map → capabilities-DZjCMN32.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-2Aic2Tfm.js → controlplane-RQNXjna2.js} +2 -2
- package/dashboard/dist/assets/{controlplane-2Aic2Tfm.js.map → controlplane-RQNXjna2.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-DPKPJtw3.js → escalation-columns-XLEcZRCg.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-DPKPJtw3.js.map → escalation-columns-XLEcZRCg.js.map} +1 -1
- package/dashboard/dist/assets/index-2BwHxjCw.css +1 -0
- package/dashboard/dist/assets/{index-BZbDwh_Y.js → index-C6GsrvX1.js} +2 -2
- package/dashboard/dist/assets/{index-BZbDwh_Y.js.map → index-C6GsrvX1.js.map} +1 -1
- package/dashboard/dist/assets/{index-BzQIzZfd.js → index-CK-6m8e_.js} +2 -2
- package/dashboard/dist/assets/{index-BzQIzZfd.js.map → index-CK-6m8e_.js.map} +1 -1
- package/dashboard/dist/assets/index-CkeSxuZ0.js +2 -0
- package/dashboard/dist/assets/{index-B5JgykZD.js.map → index-CkeSxuZ0.js.map} +1 -1
- package/dashboard/dist/assets/{index-BW7-Q9Qf.js → index-CxVGlkK6.js} +2 -2
- package/dashboard/dist/assets/{index-BW7-Q9Qf.js.map → index-CxVGlkK6.js.map} +1 -1
- package/dashboard/dist/assets/index-D2CfSx_x.js +5 -0
- package/dashboard/dist/assets/index-D2CfSx_x.js.map +1 -0
- package/dashboard/dist/assets/{index-4zRmxPwA.js → index-DFJF8aWz.js} +3 -3
- package/dashboard/dist/assets/{index-4zRmxPwA.js.map → index-DFJF8aWz.js.map} +1 -1
- package/dashboard/dist/assets/index-DYKRtstT.js +2 -0
- package/dashboard/dist/assets/index-DYKRtstT.js.map +1 -0
- package/dashboard/dist/assets/index-DY_hlZCQ.js +2 -0
- package/dashboard/dist/assets/index-DY_hlZCQ.js.map +1 -0
- package/dashboard/dist/assets/{index-KkikDsJ2.js → index-DbZpL10z.js} +2 -2
- package/dashboard/dist/assets/{index-KkikDsJ2.js.map → index-DbZpL10z.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh3CVChT.js +63 -0
- package/dashboard/dist/assets/index-Dh3CVChT.js.map +1 -0
- package/dashboard/dist/assets/{index-peRHL38z.js → index-DqsLfO-0.js} +2 -2
- package/dashboard/dist/assets/{index-peRHL38z.js.map → index-DqsLfO-0.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-T1Wq0Z.js → index-iHV3d7o3.js} +2 -2
- package/dashboard/dist/assets/{index-C-T1Wq0Z.js.map → index-iHV3d7o3.js.map} +1 -1
- package/dashboard/dist/assets/{index-CeM012DJ.js → index-ymm58cTW.js} +2 -2
- package/dashboard/dist/assets/{index-CeM012DJ.js.map → index-ymm58cTW.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DO8idX0e.js → knowledge-Bawo8u7l.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DO8idX0e.js.map → knowledge-Bawo8u7l.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BGpQlkFp.js → mcp-CKIpbpRZ.js} +2 -2
- package/dashboard/dist/assets/{mcp-BGpQlkFp.js.map → mcp-CKIpbpRZ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DT0SCB9l.js → mcp-query-vld4hYxQ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DT0SCB9l.js.map → mcp-query-vld4hYxQ.js.map} +1 -1
- package/dashboard/dist/assets/personas-BsARc3df.js +2 -0
- package/dashboard/dist/assets/personas-BsARc3df.js.map +1 -0
- package/dashboard/dist/assets/{pipelines-CYk7cN6-.js → pipelines-BTSL-5ko.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CYk7cN6-.js.map → pipelines-BTSL-5ko.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-B4Y5xbF0.js → tasks-DggQdNbj.js} +2 -2
- package/dashboard/dist/assets/{tasks-B4Y5xbF0.js.map → tasks-DggQdNbj.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CVnqDw3B.js → topics-DzAKa34X.js} +2 -2
- package/dashboard/dist/assets/{topics-CVnqDw3B.js.map → topics-DzAKa34X.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-5uI9oI5W.js +2 -0
- package/dashboard/dist/assets/useEventHooks-5uI9oI5W.js.map +1 -0
- package/dashboard/dist/assets/{useNamespace-B1t3hsGf.js → useNamespace-CEKzFIqe.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-B1t3hsGf.js.map → useNamespace-CEKzFIqe.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-B8Ru07xQ.js → useYamlActivityEvents-hHgX1Z50.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-B8Ru07xQ.js.map → useYamlActivityEvents-hHgX1Z50.js.map} +1 -1
- package/dashboard/dist/assets/{users-C8H4jjTq.js → users-AO8lUyNr.js} +2 -2
- package/dashboard/dist/assets/{users-C8H4jjTq.js.map → users-AO8lUyNr.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BE_WrH2z.js → vendor-icons-DN9yGSuM.js} +134 -129
- package/dashboard/dist/assets/vendor-icons-DN9yGSuM.js.map +1 -0
- package/dashboard/dist/assets/{workflows-BAdI5k--.js → workflows-PtnlRK09.js} +2 -2
- package/dashboard/dist/assets/{workflows-BAdI5k--.js.map → workflows-PtnlRK09.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Bf2aQS-M.js → yaml-workflows-DPu3Y8vG.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Bf2aQS-M.js.map → yaml-workflows-DPu3Y8vG.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +1 -1
- package/docs/api/http/personas.md +160 -0
- package/docs/api/sdk/escalations.md +2 -2
- package/docs/cli.md +12 -0
- package/docs/dashboard.md +16 -1
- package/docs/design-principles.md +9 -5
- package/docs/events.md +4 -2
- package/docs/hitl/escalation.md +1 -1
- package/docs/hitl/x-lt-list-schema.md +12 -5
- package/docs/iam.md +47 -0
- package/docs/sdk.md +1 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentDetailPage-C5AnjpD9.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-C5AnjpD9.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-Bk7fFV2e.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-D-CpxYDO.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-D-CpxYDO.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-_KceggR9.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-_KceggR9.js.map +0 -1
- package/dashboard/dist/assets/ElapsedCell-Cflz7Pb5.js +0 -2
- package/dashboard/dist/assets/HomePage-NMLaXTvf.js +0 -2
- package/dashboard/dist/assets/HomePage-NMLaXTvf.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-Bqh8GChr.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-Bqh8GChr.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-CqFkBwBR.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CqFkBwBR.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DwbPAPaf.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-DwbPAPaf.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-ChGWcwSp.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-ChGWcwSp.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-GJ_coHsM.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-GJ_coHsM.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-CPKw336d.js +0 -2
- package/dashboard/dist/assets/RolesPage-CPKw336d.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DBANWIss.js +0 -2
- package/dashboard/dist/assets/StatCard-DBANWIss.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-BObbEz7P.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-C5THflVQ.js +0 -2
- package/dashboard/dist/assets/index-B5JgykZD.js +0 -2
- package/dashboard/dist/assets/index-CKxFjMtw.js +0 -63
- package/dashboard/dist/assets/index-CKxFjMtw.js.map +0 -1
- package/dashboard/dist/assets/index-Pmvw74oY.css +0 -1
- package/dashboard/dist/assets/index-_Q1Wf2A8.js +0 -2
- package/dashboard/dist/assets/index-_Q1Wf2A8.js.map +0 -1
- package/dashboard/dist/assets/index-jkVeGCkD.js +0 -5
- package/dashboard/dist/assets/index-jkVeGCkD.js.map +0 -1
- package/dashboard/dist/assets/index-oHU-ramT.js +0 -2
- package/dashboard/dist/assets/index-oHU-ramT.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-D8bVEx-w.js +0 -2
- package/dashboard/dist/assets/useEventHooks-D8bVEx-w.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BE_WrH2z.js.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { LTPersonaRelationship, LTWriteScope } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical relationship values, ordered by allowance (highest first). A
|
|
4
|
+
* persona grant is always a `member` membership; the relationship selects the
|
|
5
|
+
* point on the work-surface scope lattice the membership stores.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PERSONA_RELATIONSHIPS: LTPersonaRelationship[];
|
|
8
|
+
/** Normalize an input relationship (canonical or alias) — null if unknown. */
|
|
9
|
+
export declare function normalizeRelationship(value: string): LTPersonaRelationship | null;
|
|
10
|
+
/**
|
|
11
|
+
* The membership scope a relationship grants. Read is always `all` (an
|
|
12
|
+
* observer sees the whole pond); write is the axis the relationship selects.
|
|
13
|
+
*/
|
|
14
|
+
export declare function relationshipToWriteScope(relationship: LTPersonaRelationship): LTWriteScope;
|
|
15
|
+
export interface CreatePersonaInput {
|
|
16
|
+
key: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface UpdatePersonaInput {
|
|
21
|
+
title?: string | null;
|
|
22
|
+
description?: string | null;
|
|
23
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERSONA_RELATIONSHIPS = void 0;
|
|
4
|
+
exports.normalizeRelationship = normalizeRelationship;
|
|
5
|
+
exports.relationshipToWriteScope = relationshipToWriteScope;
|
|
6
|
+
/**
|
|
7
|
+
* Canonical relationship values, ordered by allowance (highest first). A
|
|
8
|
+
* persona grant is always a `member` membership; the relationship selects the
|
|
9
|
+
* point on the work-surface scope lattice the membership stores.
|
|
10
|
+
*/
|
|
11
|
+
exports.PERSONA_RELATIONSHIPS = ['write-all', 'write-self', 'read-all'];
|
|
12
|
+
/** Input synonyms accepted at every surface and normalized to canonical values. */
|
|
13
|
+
const RELATIONSHIP_ALIASES = {
|
|
14
|
+
'write-none': 'read-all',
|
|
15
|
+
};
|
|
16
|
+
/** Normalize an input relationship (canonical or alias) — null if unknown. */
|
|
17
|
+
function normalizeRelationship(value) {
|
|
18
|
+
if (exports.PERSONA_RELATIONSHIPS.includes(value)) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
return RELATIONSHIP_ALIASES[value] ?? null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The membership scope a relationship grants. Read is always `all` (an
|
|
25
|
+
* observer sees the whole pond); write is the axis the relationship selects.
|
|
26
|
+
*/
|
|
27
|
+
function relationshipToWriteScope(relationship) {
|
|
28
|
+
switch (relationship) {
|
|
29
|
+
case 'write-all': return 'all';
|
|
30
|
+
case 'write-self': return 'self';
|
|
31
|
+
case 'read-all': return 'none';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import type { LTTopicConfig } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Seed all 22 built-in system topics into the catalog.
|
|
4
|
-
* Called once at startup after migrations.
|
|
5
|
-
*/
|
|
6
2
|
export declare function seedSystemTopics(): Promise<void>;
|
|
7
3
|
/**
|
|
8
4
|
* Seed user-declared topics from startConfig.topics[].
|
|
@@ -12,6 +12,7 @@ const WORKFLOW_CONTEXT_PROPS = {
|
|
|
12
12
|
originId: { type: 'string', description: 'Root process lineage ID' },
|
|
13
13
|
};
|
|
14
14
|
const STATUS_FIELD = { type: 'string', description: 'Status after this event' };
|
|
15
|
+
const ROLE_FIELD = { type: 'string', description: 'Escalation role (the queue) — also the third subject token' };
|
|
15
16
|
function objectSchema(properties) {
|
|
16
17
|
return { type: 'object', properties };
|
|
17
18
|
}
|
|
@@ -83,37 +84,64 @@ const SYSTEM_TOPICS = [
|
|
|
83
84
|
example_payload: { workflowId: 'wf-abc', workflowName: 'processOrder', status: 'failed' },
|
|
84
85
|
tags: ['lifecycle', 'error'],
|
|
85
86
|
},
|
|
86
|
-
// Escalation lifecycle
|
|
87
|
+
// Escalation lifecycle — subjects are `system.escalation.{role}.{id}.{verb}`.
|
|
88
|
+
// The role token is the organizing level: subscribe to one queue with
|
|
89
|
+
// `system.escalation.{role}.>`, one verb across queues with
|
|
90
|
+
// `system.escalation.*.*.{verb}`, or one item with `system.escalation.*.{id}.>`.
|
|
87
91
|
{
|
|
88
|
-
topic: 'system.escalation
|
|
92
|
+
topic: 'system.escalation.*.*.created',
|
|
89
93
|
description: 'An escalation has been created.',
|
|
90
94
|
category: 'escalation',
|
|
91
|
-
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
92
|
-
example_payload: { escalationId: 'esc-001', status: 'pending', workflowName: 'processOrder' },
|
|
95
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
96
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'pending', workflowName: 'processOrder' },
|
|
93
97
|
tags: ['lifecycle', 'hitl'],
|
|
94
98
|
},
|
|
95
99
|
{
|
|
96
|
-
topic: 'system.escalation
|
|
100
|
+
topic: 'system.escalation.*.*.resolved',
|
|
97
101
|
description: 'An escalation has been resolved.',
|
|
98
102
|
category: 'escalation',
|
|
99
|
-
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
100
|
-
example_payload: { escalationId: 'esc-001', status: 'resolved', workflowName: 'processOrder' },
|
|
103
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
104
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'resolved', workflowName: 'processOrder' },
|
|
101
105
|
tags: ['lifecycle', 'hitl'],
|
|
102
106
|
},
|
|
103
107
|
{
|
|
104
|
-
topic: 'system.escalation
|
|
108
|
+
topic: 'system.escalation.*.*.claimed',
|
|
105
109
|
description: 'An escalation has been claimed.',
|
|
106
110
|
category: 'escalation',
|
|
107
|
-
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, status: STATUS_FIELD }),
|
|
108
|
-
example_payload: { escalationId: 'esc-001', status: 'claimed' },
|
|
111
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD }),
|
|
112
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'claimed' },
|
|
109
113
|
tags: ['lifecycle', 'hitl'],
|
|
110
114
|
},
|
|
111
115
|
{
|
|
112
|
-
topic: 'system.escalation
|
|
116
|
+
topic: 'system.escalation.*.*.released',
|
|
113
117
|
description: 'An escalation has been returned to the queue.',
|
|
114
118
|
category: 'escalation',
|
|
115
|
-
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, status: STATUS_FIELD }),
|
|
116
|
-
example_payload: { escalationId: 'esc-001', status: 'pending' },
|
|
119
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD }),
|
|
120
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'pending' },
|
|
121
|
+
tags: ['lifecycle', 'hitl'],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
topic: 'system.escalation.*.*.cancelled',
|
|
125
|
+
description: 'An escalation has been cancelled.',
|
|
126
|
+
category: 'escalation',
|
|
127
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
128
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'cancelled' },
|
|
129
|
+
tags: ['lifecycle', 'hitl'],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
topic: 'system.escalation.*.*.reassigned',
|
|
133
|
+
description: 'An escalation has moved to a different role. Publishes under both the departing and arriving role.',
|
|
134
|
+
category: 'escalation',
|
|
135
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD, data: { type: 'object', description: 'from_role and to_role' } }),
|
|
136
|
+
example_payload: { escalationId: 'esc-001', role: 'order-manager', status: 'pending', data: { from_role: 'order-review', to_role: 'order-manager' } },
|
|
137
|
+
tags: ['lifecycle', 'hitl'],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
topic: 'system.escalation.*.*.expired',
|
|
141
|
+
description: 'A waiting escalation hit its SLA timeout and the engine transitioned it.',
|
|
142
|
+
category: 'escalation',
|
|
143
|
+
payload_schema: objectSchema({ ...WORKFLOW_CONTEXT_PROPS, escalationId: { type: 'string' }, role: ROLE_FIELD, status: STATUS_FIELD, data: { type: 'object' } }),
|
|
144
|
+
example_payload: { escalationId: 'esc-001', role: 'order-review', status: 'expired' },
|
|
117
145
|
tags: ['lifecycle', 'hitl'],
|
|
118
146
|
},
|
|
119
147
|
// Activity lifecycle
|
|
@@ -247,9 +275,18 @@ function inferCategory(topic) {
|
|
|
247
275
|
return topic.split('.')[0];
|
|
248
276
|
}
|
|
249
277
|
/**
|
|
250
|
-
* Seed
|
|
278
|
+
* Seed the built-in system topics into the catalog.
|
|
251
279
|
* Called once at startup after migrations.
|
|
252
280
|
*/
|
|
281
|
+
// Catalog names no longer published. Escalation subjects carry the role token
|
|
282
|
+
// (`system.escalation.{role}.{id}.{verb}`), so the roleless names are retired
|
|
283
|
+
// from the catalog at seed time.
|
|
284
|
+
const RETIRED_TOPICS = [
|
|
285
|
+
'system.escalation.*.created',
|
|
286
|
+
'system.escalation.*.resolved',
|
|
287
|
+
'system.escalation.*.claimed',
|
|
288
|
+
'system.escalation.*.released',
|
|
289
|
+
];
|
|
253
290
|
async function seedSystemTopics() {
|
|
254
291
|
for (const def of SYSTEM_TOPICS) {
|
|
255
292
|
try {
|
|
@@ -268,6 +305,12 @@ async function seedSystemTopics() {
|
|
|
268
305
|
logger_1.loggerRegistry.warn(`[long-tail] topic seed failed for ${def.topic}: ${err.message}`);
|
|
269
306
|
}
|
|
270
307
|
}
|
|
308
|
+
for (const retired of RETIRED_TOPICS) {
|
|
309
|
+
try {
|
|
310
|
+
await (0, index_1.deleteTopic)(retired);
|
|
311
|
+
}
|
|
312
|
+
catch { /* absent on a fresh catalog */ }
|
|
313
|
+
}
|
|
271
314
|
}
|
|
272
315
|
/**
|
|
273
316
|
* Seed user-declared topics from startConfig.topics[].
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** Ensure a role name exists in the lt_roles lookup table (FK target). */
|
|
2
2
|
export declare const ENSURE_ROLE_EXISTS = "INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING";
|
|
3
|
-
/** Fetch roles for a single user, ordered by creation time.
|
|
4
|
-
|
|
3
|
+
/** Fetch roles for a single user, ordered by creation time. granted_by_persona
|
|
4
|
+
* is the sustaining persona's key (null = direct grant). */
|
|
5
|
+
export declare const GET_ROLES_BY_USER_ID = "SELECT r.role, r.type, r.read_scope, r.write_scope, r.created_at, p.key AS granted_by_persona\n FROM lt_user_roles r\n LEFT JOIN lt_personas p ON p.id = r.granted_by_persona\n WHERE r.user_id = $1 ORDER BY r.created_at";
|
|
5
6
|
/** Fetch a user row by external_id. */
|
|
6
7
|
export declare const GET_USER_BY_EXTERNAL_ID = "SELECT * FROM lt_users WHERE external_id = $1";
|
|
7
8
|
/**
|
|
@@ -23,9 +24,11 @@ export declare const VERIFY_USER_BY_ID = "SELECT id FROM lt_users WHERE id = $1
|
|
|
23
24
|
export declare const GET_USER_WITH_ROLES = "SELECT u.id, u.external_id, u.display_name, u.status, u.metadata,\n r.role, r.type AS role_type, r.read_scope, r.write_scope\n FROM lt_users u\n LEFT JOIN lt_user_roles r ON r.user_id = u.id\n WHERE u.external_id = $1\n ORDER BY r.created_at";
|
|
24
25
|
export declare const DELETE_USER_BY_ID = "DELETE FROM lt_users WHERE id = $1";
|
|
25
26
|
/** Batch-load roles for many users (avoids N+1). */
|
|
26
|
-
export declare const GET_ROLES_BY_USER_IDS = "SELECT user_id, role, type, read_scope, write_scope, created_at FROM lt_user_roles WHERE user_id = ANY($1) ORDER BY created_at";
|
|
27
|
-
/** Upsert a user–role assignment, promoting the type/scope if the row exists.
|
|
28
|
-
|
|
27
|
+
export declare const GET_ROLES_BY_USER_IDS = "SELECT r.user_id, r.role, r.type, r.read_scope, r.write_scope, r.created_at, p.key AS granted_by_persona\n FROM lt_user_roles r\n LEFT JOIN lt_personas p ON p.id = r.granted_by_persona\n WHERE r.user_id = ANY($1) ORDER BY r.created_at";
|
|
28
|
+
/** Upsert a user–role assignment, promoting the type/scope if the row exists.
|
|
29
|
+
* A direct grant takes the row over: granted_by_persona resets to NULL, so a
|
|
30
|
+
* later persona unassign can never remove a membership an admin set by hand. */
|
|
31
|
+
export declare const UPSERT_USER_ROLE = "INSERT INTO lt_user_roles (user_id, role, type, read_scope, write_scope) VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (user_id, role) DO UPDATE SET\n type = EXCLUDED.type,\n read_scope = EXCLUDED.read_scope,\n write_scope = EXCLUDED.write_scope,\n granted_by_persona = NULL\n RETURNING role, type, read_scope, write_scope, created_at";
|
|
29
32
|
export declare const DELETE_USER_ROLE = "DELETE FROM lt_user_roles WHERE user_id = $1 AND role = $2";
|
|
30
33
|
export declare const HAS_ROLE = "SELECT 1 FROM lt_user_roles WHERE user_id = $1 AND role = $2 LIMIT 1";
|
|
31
34
|
export declare const HAS_ROLE_TYPE = "SELECT 1 FROM lt_user_roles WHERE user_id = $1 AND type = $2 LIMIT 1";
|
|
@@ -4,8 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.IS_GROUP_ADMIN = exports.GET_ROLE_SCOPE = exports.HAS_ROLE_TYPE = exports.HAS_ROLE = exports.DELETE_USER_ROLE = exports.UPSERT_USER_ROLE = exports.GET_ROLES_BY_USER_IDS = exports.DELETE_USER_BY_ID = exports.GET_USER_WITH_ROLES = exports.VERIFY_USER_BY_ID = exports.GET_USER_BY_ID = exports.GET_USER_BY_EMAIL = exports.CREATE_USER_WITH_ROLES = exports.GET_USER_BY_EXTERNAL_ID = exports.GET_ROLES_BY_USER_ID = exports.ENSURE_ROLE_EXISTS = void 0;
|
|
5
5
|
/** Ensure a role name exists in the lt_roles lookup table (FK target). */
|
|
6
6
|
exports.ENSURE_ROLE_EXISTS = 'INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING';
|
|
7
|
-
/** Fetch roles for a single user, ordered by creation time.
|
|
8
|
-
|
|
7
|
+
/** Fetch roles for a single user, ordered by creation time. granted_by_persona
|
|
8
|
+
* is the sustaining persona's key (null = direct grant). */
|
|
9
|
+
exports.GET_ROLES_BY_USER_ID = `SELECT r.role, r.type, r.read_scope, r.write_scope, r.created_at, p.key AS granted_by_persona
|
|
10
|
+
FROM lt_user_roles r
|
|
11
|
+
LEFT JOIN lt_personas p ON p.id = r.granted_by_persona
|
|
12
|
+
WHERE r.user_id = $1 ORDER BY r.created_at`;
|
|
9
13
|
/** Fetch a user row by external_id. */
|
|
10
14
|
exports.GET_USER_BY_EXTERNAL_ID = 'SELECT * FROM lt_users WHERE external_id = $1';
|
|
11
15
|
// ─── User CRUD ───────────────────────────────────────────────────────────────
|
|
@@ -48,13 +52,19 @@ exports.GET_USER_WITH_ROLES = `SELECT u.id, u.external_id, u.display_name, u.sta
|
|
|
48
52
|
exports.DELETE_USER_BY_ID = 'DELETE FROM lt_users WHERE id = $1';
|
|
49
53
|
// ─── Role management ─────────────────────────────────────────────────────────
|
|
50
54
|
/** Batch-load roles for many users (avoids N+1). */
|
|
51
|
-
exports.GET_ROLES_BY_USER_IDS =
|
|
52
|
-
|
|
55
|
+
exports.GET_ROLES_BY_USER_IDS = `SELECT r.user_id, r.role, r.type, r.read_scope, r.write_scope, r.created_at, p.key AS granted_by_persona
|
|
56
|
+
FROM lt_user_roles r
|
|
57
|
+
LEFT JOIN lt_personas p ON p.id = r.granted_by_persona
|
|
58
|
+
WHERE r.user_id = ANY($1) ORDER BY r.created_at`;
|
|
59
|
+
/** Upsert a user–role assignment, promoting the type/scope if the row exists.
|
|
60
|
+
* A direct grant takes the row over: granted_by_persona resets to NULL, so a
|
|
61
|
+
* later persona unassign can never remove a membership an admin set by hand. */
|
|
53
62
|
exports.UPSERT_USER_ROLE = `INSERT INTO lt_user_roles (user_id, role, type, read_scope, write_scope) VALUES ($1, $2, $3, $4, $5)
|
|
54
63
|
ON CONFLICT (user_id, role) DO UPDATE SET
|
|
55
64
|
type = EXCLUDED.type,
|
|
56
65
|
read_scope = EXCLUDED.read_scope,
|
|
57
|
-
write_scope = EXCLUDED.write_scope
|
|
66
|
+
write_scope = EXCLUDED.write_scope,
|
|
67
|
+
granted_by_persona = NULL
|
|
58
68
|
RETURNING role, type, read_scope, write_scope, created_at`;
|
|
59
69
|
exports.DELETE_USER_ROLE = 'DELETE FROM lt_user_roles WHERE user_id = $1 AND role = $2';
|
|
60
70
|
exports.HAS_ROLE = 'SELECT 1 FROM lt_user_roles WHERE user_id = $1 AND role = $2 LIMIT 1';
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* mcp-servers.ts — routes/mcp.ts
|
|
12
12
|
* yaml-workflows.ts — routes/yaml-workflows/
|
|
13
13
|
* users.ts — routes/users.ts + routes/roles.ts
|
|
14
|
+
* personas.ts — routes/personas.ts + persona sub-routes on routes/users.ts
|
|
14
15
|
* maintenance.ts — routes/dba.ts
|
|
15
16
|
* agents.ts — routes/agents.ts
|
|
16
17
|
* agent-subscriptions.ts — routes/agents.ts (subscription sub-routes)
|
|
@@ -16,6 +16,7 @@ exports.stopAdminServer = stopAdminServer;
|
|
|
16
16
|
* mcp-servers.ts — routes/mcp.ts
|
|
17
17
|
* yaml-workflows.ts — routes/yaml-workflows/
|
|
18
18
|
* users.ts — routes/users.ts + routes/roles.ts
|
|
19
|
+
* personas.ts — routes/personas.ts + persona sub-routes on routes/users.ts
|
|
19
20
|
* maintenance.ts — routes/dba.ts
|
|
20
21
|
* agents.ts — routes/agents.ts
|
|
21
22
|
* agent-subscriptions.ts — routes/agents.ts (subscription sub-routes)
|
|
@@ -44,6 +45,7 @@ const workflows_1 = require("./workflows");
|
|
|
44
45
|
const mcp_servers_1 = require("./mcp-servers");
|
|
45
46
|
const yaml_workflows_1 = require("./yaml-workflows");
|
|
46
47
|
const users_1 = require("./users");
|
|
48
|
+
const personas_1 = require("./personas");
|
|
47
49
|
const maintenance_1 = require("./maintenance");
|
|
48
50
|
const agents_1 = require("./agents");
|
|
49
51
|
const agent_subscriptions_1 = require("./agent-subscriptions");
|
|
@@ -56,7 +58,7 @@ const exports_1 = require("./exports");
|
|
|
56
58
|
const overview_1 = require("./overview");
|
|
57
59
|
const diagnostics_1 = require("./diagnostics");
|
|
58
60
|
const ortho_1 = require("./ortho");
|
|
59
|
-
const TOOL_COUNT =
|
|
61
|
+
const TOOL_COUNT = 100;
|
|
60
62
|
let server = null;
|
|
61
63
|
async function createAdminServer(options) {
|
|
62
64
|
if (server && !options?.fresh)
|
|
@@ -73,6 +75,7 @@ async function createAdminServer(options) {
|
|
|
73
75
|
(0, mcp_servers_1.registerMcpServerTools)(instance); // 4 tools
|
|
74
76
|
(0, yaml_workflows_1.registerYamlWorkflowTools)(instance); // 5 tools
|
|
75
77
|
(0, users_1.registerUserTools)(instance); // 10 tools (users + roles + role schemas)
|
|
78
|
+
(0, personas_1.registerPersonaTools)(instance); // 10 tools (persona CRUD + links + assignment)
|
|
76
79
|
(0, maintenance_1.registerMaintenanceTools)(instance); // 1 tool
|
|
77
80
|
(0, agents_1.registerAgentTools)(instance); // 5 tools
|
|
78
81
|
(0, agent_subscriptions_1.registerAgentSubscriptionTools)(instance); // 3 tools
|
|
@@ -85,7 +88,7 @@ async function createAdminServer(options) {
|
|
|
85
88
|
(0, overview_1.registerOverviewTools)(instance); // 1 tool
|
|
86
89
|
(0, diagnostics_1.registerDiagnosticsTools)(instance); // 3 tools
|
|
87
90
|
(0, ortho_1.registerOrthoTools)(instance); // 4 tools
|
|
88
|
-
// Total:
|
|
91
|
+
// Total: 100
|
|
89
92
|
logger_1.loggerRegistry.info(`[lt-mcp:admin] ${name} ready (${TOOL_COUNT} tools registered)`);
|
|
90
93
|
return instance;
|
|
91
94
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona management tools — mirrors routes/personas.ts plus the persona
|
|
3
|
+
* sub-routes on routes/users.ts. A persona is a named bundle of roles with a
|
|
4
|
+
* per-role relationship scope; assigning one fans out to ordinary scoped role
|
|
5
|
+
* memberships (lt_user_roles stays the single source of authorization truth).
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerPersonaTools(server: McpServer): void;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerPersonaTools = registerPersonaTools;
|
|
37
|
+
const personaService = __importStar(require("../../../services/persona"));
|
|
38
|
+
const schemas_1 = require("./schemas");
|
|
39
|
+
const PERSONA_KEY = /^[a-z][a-z0-9_-]*$/;
|
|
40
|
+
function errorResult(message) {
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
|
|
43
|
+
isError: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function jsonResult(data) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: 'text', text: JSON.stringify(data) }],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function registerPersonaTools(server) {
|
|
52
|
+
// mirrors GET /api/personas
|
|
53
|
+
server.registerTool('list_personas', {
|
|
54
|
+
title: 'List Personas',
|
|
55
|
+
description: 'List all personas — named role bundles with per-role relationship ' +
|
|
56
|
+
'scope — with their role links and holder counts.',
|
|
57
|
+
inputSchema: schemas_1.listPersonasSchema,
|
|
58
|
+
}, async (_args) => {
|
|
59
|
+
const personas = await personaService.listPersonas();
|
|
60
|
+
return jsonResult({ personas });
|
|
61
|
+
});
|
|
62
|
+
// mirrors GET /api/personas/:key
|
|
63
|
+
server.registerTool('get_persona', {
|
|
64
|
+
title: 'Get Persona',
|
|
65
|
+
description: 'Fetch one persona with its role links and current assignees.',
|
|
66
|
+
inputSchema: schemas_1.getPersonaSchema,
|
|
67
|
+
}, async (args) => {
|
|
68
|
+
const persona = await personaService.getPersona(args.key);
|
|
69
|
+
if (!persona)
|
|
70
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
71
|
+
return jsonResult(persona);
|
|
72
|
+
});
|
|
73
|
+
// mirrors POST /api/personas
|
|
74
|
+
server.registerTool('create_persona', {
|
|
75
|
+
title: 'Create Persona',
|
|
76
|
+
description: 'Create a persona. Link roles with link_persona_role, then assign ' +
|
|
77
|
+
'users with assign_persona.',
|
|
78
|
+
inputSchema: schemas_1.createPersonaSchema,
|
|
79
|
+
}, async (args) => {
|
|
80
|
+
const key = args.key.trim().toLowerCase();
|
|
81
|
+
if (!PERSONA_KEY.test(key)) {
|
|
82
|
+
return errorResult('key must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores');
|
|
83
|
+
}
|
|
84
|
+
const persona = await personaService.createPersona({
|
|
85
|
+
key,
|
|
86
|
+
title: args.title,
|
|
87
|
+
description: args.description,
|
|
88
|
+
});
|
|
89
|
+
return jsonResult(persona);
|
|
90
|
+
});
|
|
91
|
+
// mirrors PATCH /api/personas/:key
|
|
92
|
+
server.registerTool('update_persona', {
|
|
93
|
+
title: 'Update Persona',
|
|
94
|
+
description: 'Update a persona\'s title/description with PATCH semantics — omitted fields keep their values; null clears.',
|
|
95
|
+
inputSchema: schemas_1.updatePersonaSchema,
|
|
96
|
+
}, async (args) => {
|
|
97
|
+
const persona = await personaService.updatePersona(args.key, {
|
|
98
|
+
title: args.title,
|
|
99
|
+
description: args.description,
|
|
100
|
+
});
|
|
101
|
+
if (!persona)
|
|
102
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
103
|
+
return jsonResult(persona);
|
|
104
|
+
});
|
|
105
|
+
// mirrors DELETE /api/personas/:key
|
|
106
|
+
server.registerTool('delete_persona', {
|
|
107
|
+
title: 'Delete Persona',
|
|
108
|
+
description: 'Delete a persona. Memberships it sustains are removed (or re-homed ' +
|
|
109
|
+
'to a sibling persona the user still holds); direct grants are never touched.',
|
|
110
|
+
inputSchema: schemas_1.deletePersonaSchema,
|
|
111
|
+
}, async (args) => {
|
|
112
|
+
const result = await personaService.deletePersona(args.key);
|
|
113
|
+
if (!result.deleted)
|
|
114
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
115
|
+
return jsonResult({ deleted: true, recompute: result.recompute });
|
|
116
|
+
});
|
|
117
|
+
// mirrors PUT /api/personas/:key/roles/:role
|
|
118
|
+
server.registerTool('link_persona_role', {
|
|
119
|
+
title: 'Link Persona Role',
|
|
120
|
+
description: 'Link a role to a persona (or change the link\'s relationship). Every ' +
|
|
121
|
+
'current holder\'s memberships are reconciled in the same transaction.',
|
|
122
|
+
inputSchema: schemas_1.linkPersonaRoleSchema,
|
|
123
|
+
}, async (args) => {
|
|
124
|
+
const relationship = personaService.normalizeRelationship(args.relationship);
|
|
125
|
+
if (!relationship) {
|
|
126
|
+
return errorResult('relationship must be write-all, write-self, or read-all (write-none is accepted as read-all)');
|
|
127
|
+
}
|
|
128
|
+
const result = await personaService.linkPersonaRole(args.key, args.role.trim().toLowerCase(), relationship);
|
|
129
|
+
if (!result)
|
|
130
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
131
|
+
return jsonResult(result);
|
|
132
|
+
});
|
|
133
|
+
// mirrors DELETE /api/personas/:key/roles/:role
|
|
134
|
+
server.registerTool('unlink_persona_role', {
|
|
135
|
+
title: 'Unlink Persona Role',
|
|
136
|
+
description: 'Remove a role link from a persona and reconcile every holder\'s memberships.',
|
|
137
|
+
inputSchema: schemas_1.unlinkPersonaRoleSchema,
|
|
138
|
+
}, async (args) => {
|
|
139
|
+
const result = await personaService.unlinkPersonaRole(args.key, args.role);
|
|
140
|
+
if (!result.personaFound)
|
|
141
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
142
|
+
if (!result.unlinked)
|
|
143
|
+
return errorResult(`Persona '${args.key}' does not link role '${args.role}'`);
|
|
144
|
+
return jsonResult({ unlinked: true, recompute: result.recompute });
|
|
145
|
+
});
|
|
146
|
+
// mirrors POST /api/users/:id/personas
|
|
147
|
+
server.registerTool('assign_persona', {
|
|
148
|
+
title: 'Assign Persona',
|
|
149
|
+
description: 'Assign a persona to a user — shorthand for adding the user to each ' +
|
|
150
|
+
'linked role at the linked scope. Idempotent: re-assigning overlays ' +
|
|
151
|
+
'fresh from the persona\'s current links. Highest allowance wins when ' +
|
|
152
|
+
'bundles overlap; direct grants are only ever raised, never lowered.',
|
|
153
|
+
inputSchema: schemas_1.assignPersonaSchema,
|
|
154
|
+
}, async (args) => {
|
|
155
|
+
const recompute = await personaService.assignPersona(args.user_id, args.key);
|
|
156
|
+
if (!recompute)
|
|
157
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
158
|
+
return jsonResult({ assigned: true, recompute });
|
|
159
|
+
});
|
|
160
|
+
// mirrors DELETE /api/users/:id/personas/:key
|
|
161
|
+
server.registerTool('unassign_persona', {
|
|
162
|
+
title: 'Unassign Persona',
|
|
163
|
+
description: 'Unassign a persona from a user. Removes only memberships the persona ' +
|
|
164
|
+
'sustains — rows another held persona still grants are re-homed to it, ' +
|
|
165
|
+
'and direct grants are never touched.',
|
|
166
|
+
inputSchema: schemas_1.unassignPersonaSchema,
|
|
167
|
+
}, async (args) => {
|
|
168
|
+
const result = await personaService.unassignPersona(args.user_id, args.key);
|
|
169
|
+
if (!result.personaFound)
|
|
170
|
+
return errorResult(`Persona '${args.key}' not found`);
|
|
171
|
+
if (!result.unassigned)
|
|
172
|
+
return errorResult(`User does not hold persona '${args.key}'`);
|
|
173
|
+
return jsonResult({ unassigned: true, recompute: result.recompute });
|
|
174
|
+
});
|
|
175
|
+
// mirrors GET /api/users/:id/personas
|
|
176
|
+
server.registerTool('get_user_personas', {
|
|
177
|
+
title: 'Get User Personas',
|
|
178
|
+
description: 'The personas a user holds plus the composed role/scope map their ' +
|
|
179
|
+
'memberships form (each row names the sustaining persona, or null for ' +
|
|
180
|
+
'a direct grant).',
|
|
181
|
+
inputSchema: schemas_1.getUserPersonasSchema,
|
|
182
|
+
}, async (args) => {
|
|
183
|
+
const result = await personaService.getUserPersonas(args.user_id);
|
|
184
|
+
return jsonResult(result);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
@@ -648,6 +648,97 @@ export declare const listRoleSchemaVersionsSchema: z.ZodObject<{
|
|
|
648
648
|
}, {
|
|
649
649
|
role: string;
|
|
650
650
|
}>;
|
|
651
|
+
export declare const listPersonasSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
652
|
+
export declare const getPersonaSchema: z.ZodObject<{
|
|
653
|
+
key: z.ZodString;
|
|
654
|
+
}, "strip", z.ZodTypeAny, {
|
|
655
|
+
key: string;
|
|
656
|
+
}, {
|
|
657
|
+
key: string;
|
|
658
|
+
}>;
|
|
659
|
+
export declare const createPersonaSchema: z.ZodObject<{
|
|
660
|
+
key: z.ZodString;
|
|
661
|
+
title: z.ZodOptional<z.ZodString>;
|
|
662
|
+
description: z.ZodOptional<z.ZodString>;
|
|
663
|
+
}, "strip", z.ZodTypeAny, {
|
|
664
|
+
key: string;
|
|
665
|
+
description?: string | undefined;
|
|
666
|
+
title?: string | undefined;
|
|
667
|
+
}, {
|
|
668
|
+
key: string;
|
|
669
|
+
description?: string | undefined;
|
|
670
|
+
title?: string | undefined;
|
|
671
|
+
}>;
|
|
672
|
+
export declare const updatePersonaSchema: z.ZodObject<{
|
|
673
|
+
key: z.ZodString;
|
|
674
|
+
title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
675
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
676
|
+
}, "strip", z.ZodTypeAny, {
|
|
677
|
+
key: string;
|
|
678
|
+
description?: string | null | undefined;
|
|
679
|
+
title?: string | null | undefined;
|
|
680
|
+
}, {
|
|
681
|
+
key: string;
|
|
682
|
+
description?: string | null | undefined;
|
|
683
|
+
title?: string | null | undefined;
|
|
684
|
+
}>;
|
|
685
|
+
export declare const deletePersonaSchema: z.ZodObject<{
|
|
686
|
+
key: z.ZodString;
|
|
687
|
+
}, "strip", z.ZodTypeAny, {
|
|
688
|
+
key: string;
|
|
689
|
+
}, {
|
|
690
|
+
key: string;
|
|
691
|
+
}>;
|
|
692
|
+
export declare const linkPersonaRoleSchema: z.ZodObject<{
|
|
693
|
+
key: z.ZodString;
|
|
694
|
+
role: z.ZodString;
|
|
695
|
+
relationship: z.ZodEnum<["write-all", "write-self", "read-all", "write-none"]>;
|
|
696
|
+
}, "strip", z.ZodTypeAny, {
|
|
697
|
+
role: string;
|
|
698
|
+
key: string;
|
|
699
|
+
relationship: "write-all" | "write-self" | "read-all" | "write-none";
|
|
700
|
+
}, {
|
|
701
|
+
role: string;
|
|
702
|
+
key: string;
|
|
703
|
+
relationship: "write-all" | "write-self" | "read-all" | "write-none";
|
|
704
|
+
}>;
|
|
705
|
+
export declare const unlinkPersonaRoleSchema: z.ZodObject<{
|
|
706
|
+
key: z.ZodString;
|
|
707
|
+
role: z.ZodString;
|
|
708
|
+
}, "strip", z.ZodTypeAny, {
|
|
709
|
+
role: string;
|
|
710
|
+
key: string;
|
|
711
|
+
}, {
|
|
712
|
+
role: string;
|
|
713
|
+
key: string;
|
|
714
|
+
}>;
|
|
715
|
+
export declare const assignPersonaSchema: z.ZodObject<{
|
|
716
|
+
user_id: z.ZodString;
|
|
717
|
+
key: z.ZodString;
|
|
718
|
+
}, "strip", z.ZodTypeAny, {
|
|
719
|
+
key: string;
|
|
720
|
+
user_id: string;
|
|
721
|
+
}, {
|
|
722
|
+
key: string;
|
|
723
|
+
user_id: string;
|
|
724
|
+
}>;
|
|
725
|
+
export declare const unassignPersonaSchema: z.ZodObject<{
|
|
726
|
+
user_id: z.ZodString;
|
|
727
|
+
key: z.ZodString;
|
|
728
|
+
}, "strip", z.ZodTypeAny, {
|
|
729
|
+
key: string;
|
|
730
|
+
user_id: string;
|
|
731
|
+
}, {
|
|
732
|
+
key: string;
|
|
733
|
+
user_id: string;
|
|
734
|
+
}>;
|
|
735
|
+
export declare const getUserPersonasSchema: z.ZodObject<{
|
|
736
|
+
user_id: z.ZodString;
|
|
737
|
+
}, "strip", z.ZodTypeAny, {
|
|
738
|
+
user_id: string;
|
|
739
|
+
}, {
|
|
740
|
+
user_id: string;
|
|
741
|
+
}>;
|
|
651
742
|
export declare const pruneSchema: z.ZodObject<{
|
|
652
743
|
app_id: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
653
744
|
expire: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|