happy2 0.0.13 → 0.0.14

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.
Files changed (213) hide show
  1. package/package.json +1 -1
  2. package/packages/happy2-server/PLUGINS.md +196 -42
  3. package/packages/happy2-server/dist/index.d.ts +1 -0
  4. package/packages/happy2-server/dist/index.d.ts.map +1 -1
  5. package/packages/happy2-server/dist/index.js +1 -0
  6. package/packages/happy2-server/dist/index.js.map +1 -1
  7. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.d.ts +4 -0
  8. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.d.ts.map +1 -0
  9. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.js +15 -0
  10. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.js.map +1 -0
  11. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.test.d.ts +2 -0
  12. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.test.d.ts.map +1 -0
  13. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.test.js +17 -0
  14. package/packages/happy2-server/dist/modules/agent/agentSkillHomeGet.test.js.map +1 -0
  15. package/packages/happy2-server/dist/modules/agent/agentTurnGetPluginContext.d.ts +23 -0
  16. package/packages/happy2-server/dist/modules/agent/agentTurnGetPluginContext.d.ts.map +1 -0
  17. package/packages/happy2-server/dist/modules/agent/agentTurnGetPluginContext.js +70 -0
  18. package/packages/happy2-server/dist/modules/agent/agentTurnGetPluginContext.js.map +1 -0
  19. package/packages/happy2-server/dist/modules/agents/service.d.ts +2 -4
  20. package/packages/happy2-server/dist/modules/agents/service.d.ts.map +1 -1
  21. package/packages/happy2-server/dist/modules/agents/service.js +7 -7
  22. package/packages/happy2-server/dist/modules/agents/service.js.map +1 -1
  23. package/packages/happy2-server/dist/modules/auth/tokens.d.ts +15 -0
  24. package/packages/happy2-server/dist/modules/auth/tokens.d.ts.map +1 -1
  25. package/packages/happy2-server/dist/modules/auth/tokens.js +74 -6
  26. package/packages/happy2-server/dist/modules/auth/tokens.js.map +1 -1
  27. package/packages/happy2-server/dist/modules/auth/tokens.test.js +57 -0
  28. package/packages/happy2-server/dist/modules/auth/tokens.test.js.map +1 -1
  29. package/packages/happy2-server/dist/modules/chat/channelCreateWithMembers.d.ts +19 -0
  30. package/packages/happy2-server/dist/modules/chat/channelCreateWithMembers.d.ts.map +1 -0
  31. package/packages/happy2-server/dist/modules/chat/channelCreateWithMembers.js +87 -0
  32. package/packages/happy2-server/dist/modules/chat/channelCreateWithMembers.js.map +1 -0
  33. package/packages/happy2-server/dist/modules/chat/channelMembersUpdate.d.ts +15 -0
  34. package/packages/happy2-server/dist/modules/chat/channelMembersUpdate.d.ts.map +1 -0
  35. package/packages/happy2-server/dist/modules/chat/channelMembersUpdate.js +38 -0
  36. package/packages/happy2-server/dist/modules/chat/channelMembersUpdate.js.map +1 -0
  37. package/packages/happy2-server/dist/modules/chat/chatAppendAudit.d.ts +1 -1
  38. package/packages/happy2-server/dist/modules/chat/chatAppendAudit.d.ts.map +1 -1
  39. package/packages/happy2-server/dist/modules/plugin/catalog.d.ts.map +1 -1
  40. package/packages/happy2-server/dist/modules/plugin/catalog.js +3 -3
  41. package/packages/happy2-server/dist/modules/plugin/catalog.js.map +1 -1
  42. package/packages/happy2-server/dist/modules/plugin/catalog.test.js +2 -2
  43. package/packages/happy2-server/dist/modules/plugin/catalog.test.js.map +1 -1
  44. package/packages/happy2-server/dist/modules/plugin/impl/apiPermissions.d.ts +5 -0
  45. package/packages/happy2-server/dist/modules/plugin/impl/apiPermissions.d.ts.map +1 -0
  46. package/packages/happy2-server/dist/modules/plugin/impl/apiPermissions.js +106 -0
  47. package/packages/happy2-server/dist/modules/plugin/impl/apiPermissions.js.map +1 -0
  48. package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.d.ts.map +1 -1
  49. package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.js +10 -1
  50. package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.js.map +1 -1
  51. package/packages/happy2-server/dist/modules/plugin/impl/asManagementRequest.d.ts +3 -0
  52. package/packages/happy2-server/dist/modules/plugin/impl/asManagementRequest.d.ts.map +1 -0
  53. package/packages/happy2-server/dist/modules/plugin/impl/asManagementRequest.js +68 -0
  54. package/packages/happy2-server/dist/modules/plugin/impl/asManagementRequest.js.map +1 -0
  55. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.d.ts.map +1 -1
  56. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js +10 -2
  57. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js.map +1 -1
  58. package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.d.ts +19 -0
  59. package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.d.ts.map +1 -1
  60. package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.js +1 -0
  61. package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.js.map +1 -1
  62. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.d.ts.map +1 -1
  63. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js +4 -2
  64. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js.map +1 -1
  65. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.js +14 -0
  66. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.js.map +1 -1
  67. package/packages/happy2-server/dist/modules/plugin/impl/managementRequestSelection.d.ts +345 -0
  68. package/packages/happy2-server/dist/modules/plugin/impl/managementRequestSelection.d.ts.map +1 -0
  69. package/packages/happy2-server/dist/modules/plugin/impl/managementRequestSelection.js +22 -0
  70. package/packages/happy2-server/dist/modules/plugin/impl/managementRequestSelection.js.map +1 -0
  71. package/packages/happy2-server/dist/modules/plugin/packageLinkDownloader.d.ts +16 -0
  72. package/packages/happy2-server/dist/modules/plugin/packageLinkDownloader.d.ts.map +1 -0
  73. package/packages/happy2-server/dist/modules/plugin/packageLinkDownloader.js +67 -0
  74. package/packages/happy2-server/dist/modules/plugin/packageLinkDownloader.js.map +1 -0
  75. package/packages/happy2-server/dist/modules/plugin/packageStore.d.ts +14 -1
  76. package/packages/happy2-server/dist/modules/plugin/packageStore.d.ts.map +1 -1
  77. package/packages/happy2-server/dist/modules/plugin/packageStore.js +112 -1
  78. package/packages/happy2-server/dist/modules/plugin/packageStore.js.map +1 -1
  79. package/packages/happy2-server/dist/modules/plugin/packageStore.test.d.ts +2 -0
  80. package/packages/happy2-server/dist/modules/plugin/packageStore.test.d.ts.map +1 -0
  81. package/packages/happy2-server/dist/modules/plugin/packageStore.test.js +50 -0
  82. package/packages/happy2-server/dist/modules/plugin/packageStore.test.js.map +1 -0
  83. package/packages/happy2-server/dist/modules/plugin/pluginAgentCallContextGet.d.ts +5 -0
  84. package/packages/happy2-server/dist/modules/plugin/pluginAgentCallContextGet.d.ts.map +1 -0
  85. package/packages/happy2-server/dist/modules/plugin/pluginAgentCallContextGet.js +26 -0
  86. package/packages/happy2-server/dist/modules/plugin/pluginAgentCallContextGet.js.map +1 -0
  87. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.d.ts.map +1 -1
  88. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js +7 -3
  89. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js.map +1 -1
  90. package/packages/happy2-server/dist/modules/plugin/pluginDeveloperServer.test.d.ts +2 -0
  91. package/packages/happy2-server/dist/modules/plugin/pluginDeveloperServer.test.d.ts.map +1 -0
  92. package/packages/happy2-server/dist/modules/plugin/pluginDeveloperServer.test.js +44 -0
  93. package/packages/happy2-server/dist/modules/plugin/pluginDeveloperServer.test.js.map +1 -0
  94. package/packages/happy2-server/dist/modules/plugin/pluginInstall.d.ts +4 -2
  95. package/packages/happy2-server/dist/modules/plugin/pluginInstall.d.ts.map +1 -1
  96. package/packages/happy2-server/dist/modules/plugin/pluginInstall.js +19 -2
  97. package/packages/happy2-server/dist/modules/plugin/pluginInstall.js.map +1 -1
  98. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetContainerName.d.ts +7 -0
  99. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetContainerName.d.ts.map +1 -0
  100. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetContainerName.js +18 -0
  101. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetContainerName.js.map +1 -0
  102. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRequestUninstallContext.d.ts +13 -0
  103. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRequestUninstallContext.d.ts.map +1 -0
  104. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRequestUninstallContext.js +35 -0
  105. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRequestUninstallContext.js.map +1 -0
  106. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.d.ts.map +1 -1
  107. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js +3 -1
  108. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js.map +1 -1
  109. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetUninstallContext.d.ts +6 -0
  110. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetUninstallContext.d.ts.map +1 -0
  111. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetUninstallContext.js +17 -0
  112. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetUninstallContext.js.map +1 -0
  113. package/packages/happy2-server/dist/modules/plugin/pluginInstallationPermissionsUpdate.d.ts +18 -0
  114. package/packages/happy2-server/dist/modules/plugin/pluginInstallationPermissionsUpdate.d.ts.map +1 -0
  115. package/packages/happy2-server/dist/modules/plugin/pluginInstallationPermissionsUpdate.js +92 -0
  116. package/packages/happy2-server/dist/modules/plugin/pluginInstallationPermissionsUpdate.js.map +1 -0
  117. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUninstall.d.ts +16 -0
  118. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUninstall.d.ts.map +1 -0
  119. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUninstall.js +71 -0
  120. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUninstall.js.map +1 -0
  121. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginInstall.d.ts +21 -0
  122. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginInstall.d.ts.map +1 -0
  123. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginInstall.js +71 -0
  124. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginInstall.js.map +1 -0
  125. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginUninstall.d.ts +12 -0
  126. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginUninstall.d.ts.map +1 -0
  127. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginUninstall.js +56 -0
  128. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestBeginUninstall.js.map +1 -0
  129. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteInstall.d.ts +11 -0
  130. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteInstall.d.ts.map +1 -0
  131. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteInstall.js +44 -0
  132. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteInstall.js.map +1 -0
  133. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteUninstall.d.ts +10 -0
  134. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteUninstall.d.ts.map +1 -0
  135. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteUninstall.js +41 -0
  136. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCompleteUninstall.js.map +1 -0
  137. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateInstall.d.ts +26 -0
  138. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateInstall.d.ts.map +1 -0
  139. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateInstall.js +78 -0
  140. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateInstall.js.map +1 -0
  141. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateUninstall.d.ts +25 -0
  142. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateUninstall.d.ts.map +1 -0
  143. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateUninstall.js +76 -0
  144. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestCreateUninstall.js.map +1 -0
  145. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestDeny.d.ts +11 -0
  146. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestDeny.d.ts.map +1 -0
  147. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestDeny.js +48 -0
  148. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestDeny.js.map +1 -0
  149. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestGetPackage.d.ts +12 -0
  150. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestGetPackage.d.ts.map +1 -0
  151. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestGetPackage.js +42 -0
  152. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestGetPackage.js.map +1 -0
  153. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestList.d.ts +5 -0
  154. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestList.d.ts.map +1 -0
  155. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestList.js +18 -0
  156. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestList.js.map +1 -0
  157. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestListTerminalIds.d.ts +4 -0
  158. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestListTerminalIds.d.ts.map +1 -0
  159. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestListTerminalIds.js +11 -0
  160. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestListTerminalIds.js.map +1 -0
  161. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestRecoverProcessing.d.ts +5 -0
  162. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestRecoverProcessing.d.ts.map +1 -0
  163. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestRecoverProcessing.js +75 -0
  164. package/packages/happy2-server/dist/modules/plugin/pluginManagementRequestRecoverProcessing.js.map +1 -0
  165. package/packages/happy2-server/dist/modules/plugin/pluginSkillPackageListReady.d.ts +12 -0
  166. package/packages/happy2-server/dist/modules/plugin/pluginSkillPackageListReady.d.ts.map +1 -0
  167. package/packages/happy2-server/dist/modules/plugin/pluginSkillPackageListReady.js +33 -0
  168. package/packages/happy2-server/dist/modules/plugin/pluginSkillPackageListReady.js.map +1 -0
  169. package/packages/happy2-server/dist/modules/plugin/service.d.ts +108 -7
  170. package/packages/happy2-server/dist/modules/plugin/service.d.ts.map +1 -1
  171. package/packages/happy2-server/dist/modules/plugin/service.js +463 -26
  172. package/packages/happy2-server/dist/modules/plugin/service.js.map +1 -1
  173. package/packages/happy2-server/dist/modules/plugin/types.d.ts +75 -9
  174. package/packages/happy2-server/dist/modules/plugin/types.d.ts.map +1 -1
  175. package/packages/happy2-server/dist/modules/plugin/types.js +9 -0
  176. package/packages/happy2-server/dist/modules/plugin/types.js.map +1 -1
  177. package/packages/happy2-server/dist/modules/schema.d.ts +4224 -3264
  178. package/packages/happy2-server/dist/modules/schema.d.ts.map +1 -1
  179. package/packages/happy2-server/dist/modules/schema.js +35 -0
  180. package/packages/happy2-server/dist/modules/schema.js.map +1 -1
  181. package/packages/happy2-server/dist/routes/pluginHost.d.ts +2 -1
  182. package/packages/happy2-server/dist/routes/pluginHost.d.ts.map +1 -1
  183. package/packages/happy2-server/dist/routes/pluginHost.js +288 -6
  184. package/packages/happy2-server/dist/routes/pluginHost.js.map +1 -1
  185. package/packages/happy2-server/dist/routes/plugins.d.ts.map +1 -1
  186. package/packages/happy2-server/dist/routes/plugins.js +229 -3
  187. package/packages/happy2-server/dist/routes/plugins.js.map +1 -1
  188. package/packages/happy2-server/dist/server.d.ts +2 -0
  189. package/packages/happy2-server/dist/server.d.ts.map +1 -1
  190. package/packages/happy2-server/dist/server.js +9 -7
  191. package/packages/happy2-server/dist/server.js.map +1 -1
  192. package/packages/happy2-server/dist/web/assets/index-Dn5SZu3y.js +39 -0
  193. package/packages/happy2-server/dist/web/assets/{index-BaPUPGPe.css → index-Dys3sWv8.css} +1 -1
  194. package/packages/happy2-server/dist/web/index.html +2 -2
  195. package/packages/happy2-server/drizzle/0028_plugin_api_permissions.sql +1 -0
  196. package/packages/happy2-server/drizzle/0029_plugin_management_requests.sql +35 -0
  197. package/packages/happy2-server/drizzle/meta/_journal.json +14 -0
  198. package/packages/happy2-server/plugins/README.md +7 -3
  199. package/packages/happy2-server/plugins/chat-management/plugin.json +3 -3
  200. package/packages/happy2-server/plugins/chat-management/server.mjs +184 -17
  201. package/packages/happy2-server/plugins/plugin-developer/container/Dockerfile +6 -0
  202. package/packages/happy2-server/plugins/plugin-developer/plugin.json +17 -0
  203. package/packages/happy2-server/plugins/plugin-developer/plugin.png +0 -0
  204. package/packages/happy2-server/plugins/plugin-developer/server.mjs +155 -0
  205. package/packages/happy2-server/plugins/plugin-developer/skills/happy2-plugin-development/SKILL.md +59 -0
  206. package/packages/happy2-server/plugins/plugin-developer/skills/happy2-plugin-development/references/host-api.md +63 -0
  207. package/packages/happy2-server/plugins/plugin-developer/skills/happy2-plugin-development/references/installing.md +86 -0
  208. package/packages/happy2-server/plugins/plugin-developer/skills/happy2-plugin-development/references/package-format.md +137 -0
  209. package/packages/happy2-server/dist/modules/agent/agentChatGetIdBySession.d.ts +0 -7
  210. package/packages/happy2-server/dist/modules/agent/agentChatGetIdBySession.d.ts.map +0 -1
  211. package/packages/happy2-server/dist/modules/agent/agentChatGetIdBySession.js +0 -15
  212. package/packages/happy2-server/dist/modules/agent/agentChatGetIdBySession.js.map +0 -1
  213. package/packages/happy2-server/dist/web/assets/index-BnhFxR3U.js +0 -39
@@ -0,0 +1,17 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { pluginInstallations } from "../schema.js";
3
+ import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
4
+ import { PluginError } from "./types.js";
5
+ /** Authorizes an administrator and returns the process-local resources for one installation without mutating durable state. This boundary lets orchestration stop the exact runtime before the later pluginInstallations deletion. */
6
+ export async function pluginInstallationGetUninstallContext(executor, actorUserId, installationId) {
7
+ await userRequireServerAdmin(executor, actorUserId);
8
+ const [row] = await executor
9
+ .select({ containerName: pluginInstallations.containerName })
10
+ .from(pluginInstallations)
11
+ .where(eq(pluginInstallations.id, installationId))
12
+ .limit(1);
13
+ if (!row)
14
+ throw new PluginError("not_found", "Plugin installation was not found");
15
+ return row.containerName ? { containerName: row.containerName } : {};
16
+ }
17
+ //# sourceMappingURL=pluginInstallationGetUninstallContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginInstallationGetUninstallContext.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationGetUninstallContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,sOAAsO;AACtO,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACvD,QAAyB,EACzB,WAAmB,EACnB,cAAsB;IAEtB,MAAM,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ;SACvB,MAAM,CAAC,EAAE,aAAa,EAAE,mBAAmB,CAAC,aAAa,EAAE,CAAC;SAC5D,IAAI,CAAC,mBAAmB,CAAC;SACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;SACjD,KAAK,CAAC,CAAC,CAAC,CAAC;IACd,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;IAClF,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ import type { PluginHostPermission, PluginInstallationSummary } from "./types.js";
4
+ /**
5
+ * Replaces one pluginInstallations row's user-approved API grants while enforcing its immutable manifest declarations.
6
+ * A changed grant set invalidates the current container incarnation and queues runtime reactivation in the same audited sync transaction so old tokens stop authorizing immediately.
7
+ */
8
+ export declare function pluginInstallationPermissionsUpdate(executor: DrizzleExecutor, input: {
9
+ actorUserId: string;
10
+ installationId: string;
11
+ permissions: readonly PluginHostPermission[];
12
+ }): Promise<{
13
+ changed: boolean;
14
+ containerName?: string;
15
+ hint?: MutationHint;
16
+ installation: PluginInstallationSummary;
17
+ }>;
18
+ //# sourceMappingURL=pluginInstallationPermissionsUpdate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginInstallationPermissionsUpdate.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationPermissionsUpdate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAQlF;;;GAGG;AACH,wBAAsB,mCAAmC,CACrD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChD,GACF,OAAO,CAAC;IACP,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,yBAAyB,CAAC;CAC3C,CAAC,CAoED"}
@@ -0,0 +1,92 @@
1
+ import { eq, sql } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatAppendAudit } from "../chat/chatAppendAudit.js";
4
+ import { areaHint } from "../chat/areaHint.js";
5
+ import { userRequirePermission } from "../permission/userRequirePermission.js";
6
+ import { pluginInstallations, plugins } from "../schema.js";
7
+ import { syncEventInsert } from "../sync/syncEventInsert.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { PluginError } from "./types.js";
10
+ import { asPluginInstallation } from "./impl/asInstallation.js";
11
+ import { effectiveContainer } from "./impl/effectiveContainer.js";
12
+ import { installedManifest } from "./impl/installedManifest.js";
13
+ import { pluginInstallationSelection } from "./impl/installationSelection.js";
14
+ import { pluginPermissionsParse, pluginPermissionsValidate } from "./impl/apiPermissions.js";
15
+ /**
16
+ * Replaces one pluginInstallations row's user-approved API grants while enforcing its immutable manifest declarations.
17
+ * A changed grant set invalidates the current container incarnation and queues runtime reactivation in the same audited sync transaction so old tokens stop authorizing immediately.
18
+ */
19
+ export async function pluginInstallationPermissionsUpdate(executor, input) {
20
+ return withTransaction(executor, async (tx) => {
21
+ await userRequirePermission(tx, input.actorUserId, "managePlugins");
22
+ const [current] = await tx
23
+ .select({
24
+ ...pluginInstallationSelection,
25
+ manifestJson: plugins.manifestJson,
26
+ containerName: pluginInstallations.containerName,
27
+ })
28
+ .from(pluginInstallations)
29
+ .innerJoin(plugins, eq(pluginInstallations.pluginId, plugins.id))
30
+ .where(eq(pluginInstallations.id, input.installationId))
31
+ .limit(1);
32
+ if (!current)
33
+ throw new PluginError("not_found", "Plugin installation was not found");
34
+ const manifest = installedManifest(current.manifestJson);
35
+ const declared = effectiveContainer(manifest)?.permissions ?? [];
36
+ const granted = pluginPermissionsValidate(input.permissions, declared);
37
+ const before = pluginPermissionsParse(current.grantedPermissionsJson);
38
+ if (samePermissions(before, granted))
39
+ return {
40
+ changed: false,
41
+ ...(current.containerName ? { containerName: current.containerName } : {}),
42
+ installation: asPluginInstallation(current),
43
+ };
44
+ const sequence = await syncSequenceNext(tx);
45
+ await tx
46
+ .update(pluginInstallations)
47
+ .set({
48
+ grantedPermissionsJson: JSON.stringify(granted),
49
+ status: current.containerName ? "preparing" : current.status,
50
+ statusDetail: current.containerName
51
+ ? "Plugin runtime is queued to apply changed API permissions."
52
+ : current.statusDetail,
53
+ containerInstanceId: null,
54
+ syncSequence: sequence,
55
+ updatedAt: sql `CURRENT_TIMESTAMP`,
56
+ readyAt: current.containerName ? null : current.readyAt,
57
+ })
58
+ .where(eq(pluginInstallations.id, input.installationId));
59
+ await chatAppendAudit(tx, {
60
+ actorUserId: input.actorUserId,
61
+ action: "plugin.permissions_updated",
62
+ targetType: "plugin_installation",
63
+ targetId: input.installationId,
64
+ before: { grantedPermissions: before },
65
+ after: { grantedPermissions: granted },
66
+ });
67
+ await syncEventInsert(tx, {
68
+ sequence,
69
+ kind: "plugin.permissions_updated",
70
+ entityId: input.installationId,
71
+ actorUserId: input.actorUserId,
72
+ });
73
+ const [updated] = await tx
74
+ .select(pluginInstallationSelection)
75
+ .from(pluginInstallations)
76
+ .innerJoin(plugins, eq(pluginInstallations.pluginId, plugins.id))
77
+ .where(eq(pluginInstallations.id, input.installationId))
78
+ .limit(1);
79
+ if (!updated)
80
+ throw new Error("Plugin installation disappeared after permission update");
81
+ return {
82
+ changed: true,
83
+ ...(current.containerName ? { containerName: current.containerName } : {}),
84
+ hint: areaHint(sequence, "plugins"),
85
+ installation: asPluginInstallation(updated),
86
+ };
87
+ });
88
+ }
89
+ function samePermissions(left, right) {
90
+ return left.length === right.length && left.every((permission) => right.includes(permission));
91
+ }
92
+ //# sourceMappingURL=pluginInstallationPermissionsUpdate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginInstallationPermissionsUpdate.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationPermissionsUpdate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ /**
4
+ * Deletes one authorized plugin installation and its cascade-owned state, removing the plugin row when no installation remains.
5
+ * The transaction records actor provenance and a plugins sync event after PluginService has stopped process/container resources.
6
+ */
7
+ export declare function pluginInstallationUninstall(executor: DrizzleExecutor, input: {
8
+ installationId: string;
9
+ actorUserId?: string;
10
+ actorInstallationId?: string;
11
+ }): Promise<{
12
+ hint: MutationHint;
13
+ pluginId: string;
14
+ pluginRemoved: boolean;
15
+ }>;
16
+ //# sourceMappingURL=pluginInstallationUninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginInstallationUninstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationUninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC,GACF,OAAO,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,CAqD3E"}
@@ -0,0 +1,71 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatAppendAudit } from "../chat/chatAppendAudit.js";
4
+ import { areaHint } from "../chat/areaHint.js";
5
+ import { userRequirePermission } from "../permission/userRequirePermission.js";
6
+ import { pluginInstallations, plugins } from "../schema.js";
7
+ import { syncEventInsert } from "../sync/syncEventInsert.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { PluginError } from "./types.js";
10
+ /**
11
+ * Deletes one authorized plugin installation and its cascade-owned state, removing the plugin row when no installation remains.
12
+ * The transaction records actor provenance and a plugins sync event after PluginService has stopped process/container resources.
13
+ */
14
+ export async function pluginInstallationUninstall(executor, input) {
15
+ return withTransaction(executor, async (tx) => {
16
+ if (input.actorUserId)
17
+ await userRequirePermission(tx, input.actorUserId, "managePlugins");
18
+ else if (!input.actorInstallationId)
19
+ throw new PluginError("forbidden", "Plugin installation authority is required");
20
+ const [installation] = await tx
21
+ .select({
22
+ id: pluginInstallations.id,
23
+ pluginId: pluginInstallations.pluginId,
24
+ shortName: plugins.shortName,
25
+ sourceVersion: plugins.sourceVersion,
26
+ })
27
+ .from(pluginInstallations)
28
+ .innerJoin(plugins, eq(pluginInstallations.pluginId, plugins.id))
29
+ .where(eq(pluginInstallations.id, input.installationId))
30
+ .limit(1);
31
+ if (!installation)
32
+ throw new PluginError("not_found", "Plugin installation was not found");
33
+ await tx
34
+ .delete(pluginInstallations)
35
+ .where(eq(pluginInstallations.id, input.installationId));
36
+ const [remaining] = await tx
37
+ .select({ id: pluginInstallations.id })
38
+ .from(pluginInstallations)
39
+ .where(eq(pluginInstallations.pluginId, installation.pluginId))
40
+ .limit(1);
41
+ const pluginRemoved = !remaining;
42
+ if (pluginRemoved)
43
+ await tx.delete(plugins).where(eq(plugins.id, installation.pluginId));
44
+ await chatAppendAudit(tx, {
45
+ actorUserId: input.actorUserId,
46
+ action: "plugin.uninstalled",
47
+ targetType: "plugin_installation",
48
+ targetId: input.installationId,
49
+ before: {
50
+ pluginId: installation.pluginId,
51
+ shortName: installation.shortName,
52
+ actorInstallationId: input.actorInstallationId,
53
+ version: installation.sourceVersion,
54
+ },
55
+ after: { pluginRemoved },
56
+ });
57
+ const sequence = await syncSequenceNext(tx);
58
+ await syncEventInsert(tx, {
59
+ sequence,
60
+ kind: "plugin.uninstalled",
61
+ entityId: input.installationId,
62
+ actorUserId: input.actorUserId,
63
+ });
64
+ return {
65
+ hint: areaHint(sequence, "plugins"),
66
+ pluginId: installation.pluginId,
67
+ pluginRemoved,
68
+ };
69
+ });
70
+ }
71
+ //# sourceMappingURL=pluginInstallationUninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginInstallationUninstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationUninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ import { type PluginSource } from "./types.js";
4
+ export interface PluginManagementRequestInstallWork {
5
+ id: string;
6
+ chatId: string;
7
+ installationId: string;
8
+ packageDigest: string;
9
+ packageDirectory: string;
10
+ source: Extract<PluginSource, {
11
+ kind: "archive" | "link";
12
+ }>;
13
+ hint: MutationHint;
14
+ }
15
+ /** Claims one pending pluginManagementRequests install by changing it to processing for an active chat-member administrator. This durable state boundary serializes approval before filesystem and runtime side effects begin. */
16
+ export declare function pluginManagementRequestBeginInstall(executor: DrizzleExecutor, input: {
17
+ actorUserId: string;
18
+ chatId: string;
19
+ requestId: string;
20
+ }): Promise<PluginManagementRequestInstallWork>;
21
+ //# sourceMappingURL=pluginManagementRequestBeginInstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestBeginInstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestBeginInstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,kCAAkC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,IAAI,EAAE,YAAY,CAAC;CACtB;AAED,kOAAkO;AAClO,wBAAsB,mCAAmC,CACrD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,kCAAkC,CAAC,CA6E7C"}
@@ -0,0 +1,71 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatGetAccess } from "../chat/chatGetAccess.js";
4
+ import { chatAdvanceWithSequence } from "../chat/chatAdvanceWithSequence.js";
5
+ import { chatHint } from "../chat/chatHint.js";
6
+ import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
7
+ import { pluginManagementRequests } from "../schema.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { PluginError } from "./types.js";
10
+ /** Claims one pending pluginManagementRequests install by changing it to processing for an active chat-member administrator. This durable state boundary serializes approval before filesystem and runtime side effects begin. */
11
+ export async function pluginManagementRequestBeginInstall(executor, input) {
12
+ return withTransaction(executor, async (tx) => {
13
+ await userRequireServerAdmin(tx, input.actorUserId);
14
+ if (!(await chatGetAccess(tx, input.actorUserId, input.chatId, true)))
15
+ throw new PluginError("forbidden", "Chat membership is required");
16
+ const [row] = await tx
17
+ .select({
18
+ id: pluginManagementRequests.id,
19
+ action: pluginManagementRequests.action,
20
+ status: pluginManagementRequests.status,
21
+ chatId: pluginManagementRequests.chatId,
22
+ sourceKind: pluginManagementRequests.sourceKind,
23
+ sourceReference: pluginManagementRequests.sourceReference,
24
+ packageDigest: pluginManagementRequests.packageDigest,
25
+ packageDirectory: pluginManagementRequests.packageDirectory,
26
+ installationId: pluginManagementRequests.installationId,
27
+ })
28
+ .from(pluginManagementRequests)
29
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.chatId, input.chatId)))
30
+ .limit(1);
31
+ if (!row)
32
+ throw new PluginError("not_found", "Plugin management request was not found");
33
+ if (row.action !== "install")
34
+ throw new PluginError("conflict", "Request is not an install");
35
+ if (row.status !== "pending")
36
+ throw new PluginError("conflict", `Plugin request is already ${row.status}`);
37
+ if ((row.sourceKind !== "archive" && row.sourceKind !== "link") ||
38
+ !row.sourceReference ||
39
+ !row.packageDigest ||
40
+ !row.packageDirectory ||
41
+ !row.installationId)
42
+ throw new Error("Plugin install request has incomplete package metadata");
43
+ const updated = await tx
44
+ .update(pluginManagementRequests)
45
+ .set({
46
+ status: "processing",
47
+ resolvedByUserId: input.actorUserId,
48
+ updatedAt: sql `CURRENT_TIMESTAMP`,
49
+ })
50
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.status, "pending")))
51
+ .returning({ id: pluginManagementRequests.id });
52
+ if (updated.length !== 1)
53
+ throw new PluginError("conflict", "Plugin request was already resolved");
54
+ const sequence = await syncSequenceNext(tx);
55
+ await tx
56
+ .update(pluginManagementRequests)
57
+ .set({ syncSequence: sequence })
58
+ .where(eq(pluginManagementRequests.id, input.requestId));
59
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, "plugin.install_processing", input.requestId);
60
+ return {
61
+ id: row.id,
62
+ chatId: row.chatId,
63
+ installationId: row.installationId,
64
+ packageDigest: row.packageDigest,
65
+ packageDirectory: row.packageDirectory,
66
+ source: { kind: row.sourceKind, reference: row.sourceReference },
67
+ hint: chatHint(sequence, input.chatId, mutation.pts),
68
+ };
69
+ });
70
+ }
71
+ //# sourceMappingURL=pluginManagementRequestBeginInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestBeginInstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestBeginInstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ /** Claims one pending pluginManagementRequests uninstall by changing it to processing for a chat-member administrator. This durable state boundary serializes approval and returns the exact installation target for runtime removal. */
4
+ export declare function pluginManagementRequestBeginUninstall(executor: DrizzleExecutor, input: {
5
+ actorUserId: string;
6
+ chatId: string;
7
+ requestId: string;
8
+ }): Promise<{
9
+ targetInstallationId: string;
10
+ hint: MutationHint;
11
+ }>;
12
+ //# sourceMappingURL=pluginManagementRequestBeginUninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestBeginUninstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestBeginUninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD,yOAAyO;AACzO,wBAAsB,qCAAqC,CACvD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC;IAAE,oBAAoB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,CA2D/D"}
@@ -0,0 +1,56 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatGetAccess } from "../chat/chatGetAccess.js";
4
+ import { chatAdvanceWithSequence } from "../chat/chatAdvanceWithSequence.js";
5
+ import { chatHint } from "../chat/chatHint.js";
6
+ import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
7
+ import { pluginManagementRequests } from "../schema.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { PluginError } from "./types.js";
10
+ /** Claims one pending pluginManagementRequests uninstall by changing it to processing for a chat-member administrator. This durable state boundary serializes approval and returns the exact installation target for runtime removal. */
11
+ export async function pluginManagementRequestBeginUninstall(executor, input) {
12
+ return withTransaction(executor, async (tx) => {
13
+ await userRequireServerAdmin(tx, input.actorUserId);
14
+ if (!(await chatGetAccess(tx, input.actorUserId, input.chatId, true)))
15
+ throw new PluginError("forbidden", "Chat membership is required");
16
+ const [row] = await tx
17
+ .select({
18
+ action: pluginManagementRequests.action,
19
+ status: pluginManagementRequests.status,
20
+ targetInstallationId: pluginManagementRequests.targetInstallationId,
21
+ })
22
+ .from(pluginManagementRequests)
23
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.chatId, input.chatId)))
24
+ .limit(1);
25
+ if (!row)
26
+ throw new PluginError("not_found", "Plugin management request was not found");
27
+ if (row.action !== "uninstall")
28
+ throw new PluginError("conflict", "Request is not an uninstall");
29
+ if (row.status !== "pending")
30
+ throw new PluginError("conflict", `Plugin request is already ${row.status}`);
31
+ if (!row.targetInstallationId)
32
+ throw new Error("Plugin uninstall request has no target");
33
+ const updated = await tx
34
+ .update(pluginManagementRequests)
35
+ .set({
36
+ status: "processing",
37
+ resolvedByUserId: input.actorUserId,
38
+ updatedAt: sql `CURRENT_TIMESTAMP`,
39
+ })
40
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.status, "pending")))
41
+ .returning({ id: pluginManagementRequests.id });
42
+ if (updated.length !== 1)
43
+ throw new PluginError("conflict", "Plugin request was already resolved");
44
+ const sequence = await syncSequenceNext(tx);
45
+ await tx
46
+ .update(pluginManagementRequests)
47
+ .set({ syncSequence: sequence })
48
+ .where(eq(pluginManagementRequests.id, input.requestId));
49
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, "plugin.uninstall_processing", input.requestId);
50
+ return {
51
+ targetInstallationId: row.targetInstallationId,
52
+ hint: chatHint(sequence, input.chatId, mutation.pts),
53
+ };
54
+ });
55
+ }
56
+ //# sourceMappingURL=pluginManagementRequestBeginUninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestBeginUninstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestBeginUninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,yOAAyO;AACzO,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACvD,QAAyB,EACzB,KAAiE;IAEjE,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1C,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;aACjB,MAAM,CAAC;YACJ,MAAM,EAAE,wBAAwB,CAAC,MAAM;YACvC,MAAM,EAAE,wBAAwB,CAAC,MAAM;YACvC,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;SACtE,CAAC;aACD,IAAI,CAAC,wBAAwB,CAAC;aAC9B,KAAK,CACF,GAAG,CACC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,EAChD,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACpD,CACJ;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,yCAAyC,CAAC,CAAC;QACxF,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;YAC1B,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC;QACrE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YACxB,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,6BAA6B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,oBAAoB;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,MAAM,EAAE;aACnB,MAAM,CAAC,wBAAwB,CAAC;aAChC,GAAG,CAAC;YACD,MAAM,EAAE,YAAY;YACpB,gBAAgB,EAAE,KAAK,CAAC,WAAW;YACnC,SAAS,EAAE,GAAG,CAAA,mBAAmB;SACpC,CAAC;aACD,KAAK,CACF,GAAG,CACC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,EAChD,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CACjD,CACJ;aACA,SAAS,CAAC,EAAE,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE;aACH,MAAM,CAAC,wBAAwB,CAAC;aAChC,GAAG,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;aAC/B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC1C,EAAE,EACF,QAAQ,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,MAAM,EACZ,6BAA6B,EAC7B,KAAK,CAAC,SAAS,CAClB,CAAC;QACF,OAAO;YACH,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;YAC9C,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;SACvD,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ /** Finalizes a claimed pluginManagementRequests install as approved or failed and advances the originating chats point in one transaction. This completion boundary makes the runtime outcome, audit evidence, and reactive card resolution converge durably. */
4
+ export declare function pluginManagementRequestCompleteInstall(executor: DrizzleExecutor, input: {
5
+ actorUserId: string;
6
+ requestId: string;
7
+ chatId: string;
8
+ installationId: string;
9
+ error?: string;
10
+ }): Promise<MutationHint>;
11
+ //# sourceMappingURL=pluginManagementRequestCompleteInstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCompleteInstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCompleteInstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,iQAAiQ;AACjQ,wBAAsB,sCAAsC,CACxD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,GACF,OAAO,CAAC,YAAY,CAAC,CA+CvB"}
@@ -0,0 +1,44 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatAdvanceWithSequence } from "../chat/chatAdvanceWithSequence.js";
4
+ import { chatAppendAudit } from "../chat/chatAppendAudit.js";
5
+ import { chatHint } from "../chat/chatHint.js";
6
+ import { pluginManagementRequests } from "../schema.js";
7
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
8
+ /** Finalizes a claimed pluginManagementRequests install as approved or failed and advances the originating chats point in one transaction. This completion boundary makes the runtime outcome, audit evidence, and reactive card resolution converge durably. */
9
+ export async function pluginManagementRequestCompleteInstall(executor, input) {
10
+ return withTransaction(executor, async (tx) => {
11
+ const status = input.error ? "failed" : "approved";
12
+ const updated = await tx
13
+ .update(pluginManagementRequests)
14
+ .set({
15
+ status,
16
+ lastError: input.error,
17
+ resolvedAt: sql `CURRENT_TIMESTAMP`,
18
+ updatedAt: sql `CURRENT_TIMESTAMP`,
19
+ })
20
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.chatId, input.chatId), eq(pluginManagementRequests.status, "processing"), eq(pluginManagementRequests.installationId, input.installationId)))
21
+ .returning({ id: pluginManagementRequests.id });
22
+ if (updated.length !== 1)
23
+ throw new Error("Claimed plugin install request was not found");
24
+ await chatAppendAudit(tx, {
25
+ actorUserId: input.actorUserId,
26
+ action: input.error ? "plugin.install_failed" : "plugin.install_approved",
27
+ targetType: "plugin_management_request",
28
+ targetId: input.requestId,
29
+ chatId: input.chatId,
30
+ after: {
31
+ installationId: input.installationId,
32
+ ...(input.error ? { error: input.error } : {}),
33
+ },
34
+ });
35
+ const sequence = await syncSequenceNext(tx);
36
+ await tx
37
+ .update(pluginManagementRequests)
38
+ .set({ syncSequence: sequence })
39
+ .where(eq(pluginManagementRequests.id, input.requestId));
40
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, input.error ? "plugin.install_failed" : "plugin.install_approved", input.requestId);
41
+ return chatHint(sequence, input.chatId, mutation.pts);
42
+ });
43
+ }
44
+ //# sourceMappingURL=pluginManagementRequestCompleteInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCompleteInstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCompleteInstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ /** Finalizes a claimed pluginManagementRequests uninstall as approved or failed and advances the originating chats point in one transaction. This completion boundary records the runtime-removal outcome with audit and reactive card evidence. */
4
+ export declare function pluginManagementRequestCompleteUninstall(executor: DrizzleExecutor, input: {
5
+ actorUserId: string;
6
+ chatId: string;
7
+ requestId: string;
8
+ error?: string;
9
+ }): Promise<MutationHint>;
10
+ //# sourceMappingURL=pluginManagementRequestCompleteUninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCompleteUninstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCompleteUninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,oPAAoP;AACpP,wBAAsB,wCAAwC,CAC1D,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClF,OAAO,CAAC,YAAY,CAAC,CA2CvB"}
@@ -0,0 +1,41 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatAdvanceWithSequence } from "../chat/chatAdvanceWithSequence.js";
4
+ import { chatAppendAudit } from "../chat/chatAppendAudit.js";
5
+ import { chatHint } from "../chat/chatHint.js";
6
+ import { pluginManagementRequests } from "../schema.js";
7
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
8
+ /** Finalizes a claimed pluginManagementRequests uninstall as approved or failed and advances the originating chats point in one transaction. This completion boundary records the runtime-removal outcome with audit and reactive card evidence. */
9
+ export async function pluginManagementRequestCompleteUninstall(executor, input) {
10
+ return withTransaction(executor, async (tx) => {
11
+ const status = input.error ? "failed" : "approved";
12
+ const updated = await tx
13
+ .update(pluginManagementRequests)
14
+ .set({
15
+ status,
16
+ lastError: input.error,
17
+ resolvedAt: sql `CURRENT_TIMESTAMP`,
18
+ updatedAt: sql `CURRENT_TIMESTAMP`,
19
+ })
20
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.chatId, input.chatId), eq(pluginManagementRequests.status, "processing")))
21
+ .returning({ id: pluginManagementRequests.id });
22
+ if (updated.length !== 1)
23
+ throw new Error("Claimed plugin uninstall request was not found");
24
+ await chatAppendAudit(tx, {
25
+ actorUserId: input.actorUserId,
26
+ action: input.error ? "plugin.uninstall_failed" : "plugin.uninstall_approved",
27
+ targetType: "plugin_management_request",
28
+ targetId: input.requestId,
29
+ chatId: input.chatId,
30
+ after: input.error ? { error: input.error } : undefined,
31
+ });
32
+ const sequence = await syncSequenceNext(tx);
33
+ await tx
34
+ .update(pluginManagementRequests)
35
+ .set({ syncSequence: sequence })
36
+ .where(eq(pluginManagementRequests.id, input.requestId));
37
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, input.error ? "plugin.uninstall_failed" : "plugin.uninstall_approved", input.requestId);
38
+ return chatHint(sequence, input.chatId, mutation.pts);
39
+ });
40
+ }
41
+ //# sourceMappingURL=pluginManagementRequestCompleteUninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCompleteUninstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCompleteUninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,oPAAoP;AACpP,MAAM,CAAC,KAAK,UAAU,wCAAwC,CAC1D,QAAyB,EACzB,KAAiF;IAEjF,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,EAAE;aACnB,MAAM,CAAC,wBAAwB,CAAC;aAChC,GAAG,CAAC;YACD,MAAM;YACN,SAAS,EAAE,KAAK,CAAC,KAAK;YACtB,UAAU,EAAE,GAAG,CAAA,mBAAmB;YAClC,SAAS,EAAE,GAAG,CAAA,mBAAmB;SACpC,CAAC;aACD,KAAK,CACF,GAAG,CACC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,EAChD,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EACjD,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CACpD,CACJ;aACA,SAAS,CAAC,EAAE,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC5F,MAAM,eAAe,CAAC,EAAE,EAAE;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,2BAA2B;YAC7E,UAAU,EAAE,2BAA2B;YACvC,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE;aACH,MAAM,CAAC,wBAAwB,CAAC;aAChC,GAAG,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;aAC/B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC1C,EAAE,EACF,QAAQ,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,2BAA2B,EACrE,KAAK,CAAC,SAAS,CAClB,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ import { type PluginManagementRequestSummary } from "./types.js";
4
+ /** Creates one idempotent pluginManagementRequests install for an immutable staged package and advances the originating chats point in one transaction. This boundary binds audit and reactive approval evidence to the exact agent call before installation authority exists. */
5
+ export declare function pluginManagementRequestCreateInstall(executor: DrizzleExecutor, input: {
6
+ id: string;
7
+ actorUserId: string;
8
+ agentUserId: string;
9
+ callId: string;
10
+ chatId: string;
11
+ requesterInstallationId: string;
12
+ displayName: string;
13
+ shortName: string;
14
+ description: string;
15
+ reason?: string;
16
+ sourceKind: "archive" | "link";
17
+ sourceReference: string;
18
+ packageDigest: string;
19
+ packageDirectory: string;
20
+ installationId: string;
21
+ }): Promise<{
22
+ created: boolean;
23
+ hint?: MutationHint;
24
+ request: PluginManagementRequestSummary;
25
+ }>;
26
+ //# sourceMappingURL=pluginManagementRequestCreateInstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCreateInstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCreateInstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,EAAe,KAAK,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE9E,kRAAkR;AAClR,wBAAsB,oCAAoC,CACtD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,GAAG,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CAC1B,GACF,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,8BAA8B,CAAA;CAAE,CAAC,CA8E7F"}