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,78 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { withTransaction } from "../drizzle.js";
3
+ import { chatAppendAudit } from "../chat/chatAppendAudit.js";
4
+ import { chatAdvanceWithSequence } from "../chat/chatAdvanceWithSequence.js";
5
+ import { chatGetAccess } from "../chat/chatGetAccess.js";
6
+ import { chatHint } from "../chat/chatHint.js";
7
+ import { pluginManagementRequests } from "../schema.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { asPluginManagementRequest } from "./impl/asManagementRequest.js";
10
+ import { pluginManagementRequestSelection } from "./impl/managementRequestSelection.js";
11
+ import { PluginError } from "./types.js";
12
+ /** 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. */
13
+ export async function pluginManagementRequestCreateInstall(executor, input) {
14
+ return withTransaction(executor, async (tx) => {
15
+ const access = await chatGetAccess(tx, input.actorUserId, input.chatId, true);
16
+ if (!access)
17
+ throw new PluginError("forbidden", "The originating user cannot access this chat");
18
+ const [existing] = await tx
19
+ .select(pluginManagementRequestSelection)
20
+ .from(pluginManagementRequests)
21
+ .where(and(eq(pluginManagementRequests.requesterInstallationId, input.requesterInstallationId), eq(pluginManagementRequests.callId, input.callId), eq(pluginManagementRequests.action, "install")))
22
+ .limit(1);
23
+ if (existing)
24
+ return { created: false, request: asPluginManagementRequest(existing) };
25
+ await tx.insert(pluginManagementRequests).values({
26
+ id: input.id,
27
+ action: "install",
28
+ status: "pending",
29
+ chatId: input.chatId,
30
+ actorUserId: input.actorUserId,
31
+ agentUserId: input.agentUserId,
32
+ requesterInstallationId: input.requesterInstallationId,
33
+ callId: input.callId,
34
+ displayName: input.displayName,
35
+ shortName: input.shortName,
36
+ description: input.description,
37
+ reason: input.reason,
38
+ sourceKind: input.sourceKind,
39
+ sourceReference: input.sourceReference,
40
+ packageDigest: input.packageDigest,
41
+ packageDirectory: input.packageDirectory,
42
+ installationId: input.installationId,
43
+ });
44
+ await chatAppendAudit(tx, {
45
+ actorUserId: input.actorUserId,
46
+ action: "plugin.install_requested",
47
+ targetType: "plugin_management_request",
48
+ targetId: input.id,
49
+ chatId: input.chatId,
50
+ after: {
51
+ agentUserId: input.agentUserId,
52
+ requesterInstallationId: input.requesterInstallationId,
53
+ shortName: input.shortName,
54
+ sourceKind: input.sourceKind,
55
+ sourceReference: input.sourceReference,
56
+ },
57
+ });
58
+ const sequence = await syncSequenceNext(tx);
59
+ await tx
60
+ .update(pluginManagementRequests)
61
+ .set({ syncSequence: sequence })
62
+ .where(eq(pluginManagementRequests.id, input.id));
63
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, "plugin.install_requested", input.id);
64
+ const [created] = await tx
65
+ .select(pluginManagementRequestSelection)
66
+ .from(pluginManagementRequests)
67
+ .where(eq(pluginManagementRequests.id, input.id))
68
+ .limit(1);
69
+ if (!created)
70
+ throw new Error("Plugin management request projection was not found");
71
+ return {
72
+ created: true,
73
+ hint: chatHint(sequence, input.chatId, mutation.pts),
74
+ request: asPluginManagementRequest(created),
75
+ };
76
+ });
77
+ }
78
+ //# sourceMappingURL=pluginManagementRequestCreateInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCreateInstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCreateInstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ import { type PluginManagementRequestSummary, type PluginSource } from "./types.js";
4
+ /** Creates one idempotent pluginManagementRequests uninstall with a validated metadata snapshot and advances the originating chats point in one transaction. This boundary binds human review and audit evidence to the exact agent call and installation target. */
5
+ export declare function pluginManagementRequestCreateUninstall(executor: DrizzleExecutor, input: {
6
+ id: string;
7
+ actorUserId: string;
8
+ agentUserId: string;
9
+ callId: string;
10
+ chatId: string;
11
+ requesterInstallationId: string;
12
+ targetInstallationId: string;
13
+ displayName: string;
14
+ shortName: string;
15
+ description: string;
16
+ reason?: string;
17
+ source: PluginSource;
18
+ packageDigest: string;
19
+ packageDirectory: string;
20
+ }): Promise<{
21
+ created: boolean;
22
+ hint?: MutationHint;
23
+ request: PluginManagementRequestSummary;
24
+ }>;
25
+ //# sourceMappingURL=pluginManagementRequestCreateUninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCreateUninstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCreateUninstall.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,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjG,qQAAqQ;AACrQ,wBAAsB,sCAAsC,CACxD,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,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC5B,GACF,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,8BAA8B,CAAA;CAAE,CAAC,CA4E7F"}
@@ -0,0 +1,76 @@
1
+ import { and, eq } 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 { chatGetAccess } from "../chat/chatGetAccess.js";
6
+ import { chatHint } from "../chat/chatHint.js";
7
+ import { pluginManagementRequests } from "../schema.js";
8
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
9
+ import { asPluginManagementRequest } from "./impl/asManagementRequest.js";
10
+ import { pluginManagementRequestSelection } from "./impl/managementRequestSelection.js";
11
+ import { PluginError } from "./types.js";
12
+ /** Creates one idempotent pluginManagementRequests uninstall with a validated metadata snapshot and advances the originating chats point in one transaction. This boundary binds human review and audit evidence to the exact agent call and installation target. */
13
+ export async function pluginManagementRequestCreateUninstall(executor, input) {
14
+ return withTransaction(executor, async (tx) => {
15
+ if (!(await chatGetAccess(tx, input.actorUserId, input.chatId, true)))
16
+ throw new PluginError("forbidden", "The originating user cannot access this chat");
17
+ const [existing] = await tx
18
+ .select(pluginManagementRequestSelection)
19
+ .from(pluginManagementRequests)
20
+ .where(and(eq(pluginManagementRequests.requesterInstallationId, input.requesterInstallationId), eq(pluginManagementRequests.callId, input.callId), eq(pluginManagementRequests.action, "uninstall")))
21
+ .limit(1);
22
+ if (existing)
23
+ return { created: false, request: asPluginManagementRequest(existing) };
24
+ await tx.insert(pluginManagementRequests).values({
25
+ id: input.id,
26
+ action: "uninstall",
27
+ status: "pending",
28
+ chatId: input.chatId,
29
+ actorUserId: input.actorUserId,
30
+ agentUserId: input.agentUserId,
31
+ requesterInstallationId: input.requesterInstallationId,
32
+ callId: input.callId,
33
+ displayName: input.displayName,
34
+ shortName: input.shortName,
35
+ description: input.description,
36
+ reason: input.reason,
37
+ sourceKind: input.source.kind,
38
+ sourceReference: input.source.reference,
39
+ packageDigest: input.packageDigest,
40
+ packageDirectory: input.packageDirectory,
41
+ targetInstallationId: input.targetInstallationId,
42
+ });
43
+ await chatAppendAudit(tx, {
44
+ actorUserId: input.actorUserId,
45
+ action: "plugin.uninstall_requested",
46
+ targetType: "plugin_management_request",
47
+ targetId: input.id,
48
+ chatId: input.chatId,
49
+ after: {
50
+ agentUserId: input.agentUserId,
51
+ requesterInstallationId: input.requesterInstallationId,
52
+ targetInstallationId: input.targetInstallationId,
53
+ shortName: input.shortName,
54
+ },
55
+ });
56
+ const sequence = await syncSequenceNext(tx);
57
+ await tx
58
+ .update(pluginManagementRequests)
59
+ .set({ syncSequence: sequence })
60
+ .where(eq(pluginManagementRequests.id, input.id));
61
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, "plugin.uninstall_requested", input.id);
62
+ const [created] = await tx
63
+ .select(pluginManagementRequestSelection)
64
+ .from(pluginManagementRequests)
65
+ .where(eq(pluginManagementRequests.id, input.id))
66
+ .limit(1);
67
+ if (!created)
68
+ throw new Error("Plugin uninstall request projection was not found");
69
+ return {
70
+ created: true,
71
+ hint: chatHint(sequence, input.chatId, mutation.pts),
72
+ request: asPluginManagementRequest(created),
73
+ };
74
+ });
75
+ }
76
+ //# sourceMappingURL=pluginManagementRequestCreateUninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestCreateUninstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestCreateUninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ import type { PluginManagementRequestAction } from "./types.js";
4
+ /** Denies one pending pluginManagementRequests row and advances the originating chats point for a chat-member administrator in one transaction. This resolution boundary keeps authorization, audit evidence, and the reactive card state consistent. */
5
+ export declare function pluginManagementRequestDeny(executor: DrizzleExecutor, input: {
6
+ actorUserId: string;
7
+ chatId: string;
8
+ requestId: string;
9
+ action: PluginManagementRequestAction;
10
+ }): Promise<MutationHint>;
11
+ //# sourceMappingURL=pluginManagementRequestDeny.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestDeny.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestDeny.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,yPAAyP;AACzP,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,6BAA6B,CAAC;CACzC,GACF,OAAO,CAAC,YAAY,CAAC,CAiDvB"}
@@ -0,0 +1,48 @@
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 { chatGetAccess } from "../chat/chatGetAccess.js";
6
+ import { chatHint } from "../chat/chatHint.js";
7
+ import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
8
+ import { pluginManagementRequests } from "../schema.js";
9
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
10
+ import { PluginError } from "./types.js";
11
+ /** Denies one pending pluginManagementRequests row and advances the originating chats point for a chat-member administrator in one transaction. This resolution boundary keeps authorization, audit evidence, and the reactive card state consistent. */
12
+ export async function pluginManagementRequestDeny(executor, input) {
13
+ return withTransaction(executor, async (tx) => {
14
+ await userRequireServerAdmin(tx, input.actorUserId);
15
+ if (!(await chatGetAccess(tx, input.actorUserId, input.chatId, true)))
16
+ throw new PluginError("forbidden", "Chat membership is required");
17
+ const updated = await tx
18
+ .update(pluginManagementRequests)
19
+ .set({
20
+ status: "denied",
21
+ resolvedByUserId: input.actorUserId,
22
+ resolvedAt: sql `CURRENT_TIMESTAMP`,
23
+ updatedAt: sql `CURRENT_TIMESTAMP`,
24
+ })
25
+ .where(and(eq(pluginManagementRequests.id, input.requestId), eq(pluginManagementRequests.chatId, input.chatId), eq(pluginManagementRequests.action, input.action), eq(pluginManagementRequests.status, "pending")))
26
+ .returning({
27
+ id: pluginManagementRequests.id,
28
+ action: pluginManagementRequests.action,
29
+ });
30
+ if (updated.length !== 1)
31
+ throw new PluginError("conflict", `Plugin ${input.action} request is not pending`);
32
+ await chatAppendAudit(tx, {
33
+ actorUserId: input.actorUserId,
34
+ action: `plugin.${updated[0].action}_denied`,
35
+ targetType: "plugin_management_request",
36
+ targetId: input.requestId,
37
+ chatId: input.chatId,
38
+ });
39
+ const sequence = await syncSequenceNext(tx);
40
+ await tx
41
+ .update(pluginManagementRequests)
42
+ .set({ syncSequence: sequence })
43
+ .where(eq(pluginManagementRequests.id, input.requestId));
44
+ const mutation = await chatAdvanceWithSequence(tx, sequence, input.actorUserId, input.chatId, `plugin.${updated[0].action}_denied`, input.requestId);
45
+ return chatHint(sequence, input.chatId, mutation.pts);
46
+ });
47
+ }
48
+ //# sourceMappingURL=pluginManagementRequestDeny.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestDeny.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestDeny.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import { type PluginSource } from "./types.js";
3
+ export interface PluginManagementRequestPackage {
4
+ id: string;
5
+ chatId: string;
6
+ packageDigest: string;
7
+ packageDirectory: string;
8
+ source: PluginSource;
9
+ }
10
+ /** Returns the private staged-package coordinates for one visible approval and does not mutate durable state. This boundary lets the package store integrity-check an image or approved operation without exposing filesystem paths through routes. */
11
+ export declare function pluginManagementRequestGetPackage(executor: DrizzleExecutor, actorUserId: string, chatId: string, requestId: string): Promise<PluginManagementRequestPackage>;
12
+ //# sourceMappingURL=pluginManagementRequestGetPackage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestGetPackage.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestGetPackage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,8BAA8B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,uPAAuP;AACvP,wBAAsB,iCAAiC,CACnD,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,8BAA8B,CAAC,CAyCzC"}
@@ -0,0 +1,42 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { chatGetAccess } from "../chat/chatGetAccess.js";
3
+ import { pluginManagementRequests } from "../schema.js";
4
+ import { PluginError } from "./types.js";
5
+ /** Returns the private staged-package coordinates for one visible approval and does not mutate durable state. This boundary lets the package store integrity-check an image or approved operation without exposing filesystem paths through routes. */
6
+ export async function pluginManagementRequestGetPackage(executor, actorUserId, chatId, requestId) {
7
+ if (!(await chatGetAccess(executor, actorUserId, chatId, true)))
8
+ throw new PluginError("forbidden", "Chat membership is required");
9
+ const [row] = await executor
10
+ .select({
11
+ id: pluginManagementRequests.id,
12
+ chatId: pluginManagementRequests.chatId,
13
+ action: pluginManagementRequests.action,
14
+ status: pluginManagementRequests.status,
15
+ sourceKind: pluginManagementRequests.sourceKind,
16
+ sourceReference: pluginManagementRequests.sourceReference,
17
+ packageDigest: pluginManagementRequests.packageDigest,
18
+ packageDirectory: pluginManagementRequests.packageDirectory,
19
+ })
20
+ .from(pluginManagementRequests)
21
+ .where(and(eq(pluginManagementRequests.id, requestId), eq(pluginManagementRequests.chatId, chatId)))
22
+ .limit(1);
23
+ if (!row)
24
+ throw new PluginError("not_found", "Plugin management request was not found");
25
+ if (row.status !== "pending" && row.status !== "processing")
26
+ throw new PluginError("not_found", "Plugin management request image is no longer retained");
27
+ if ((row.sourceKind !== "archive" &&
28
+ row.sourceKind !== "builtin" &&
29
+ row.sourceKind !== "link") ||
30
+ !row.sourceReference ||
31
+ !row.packageDigest ||
32
+ !row.packageDirectory)
33
+ throw new Error("Plugin management request has incomplete package metadata");
34
+ return {
35
+ id: row.id,
36
+ chatId: row.chatId,
37
+ packageDigest: row.packageDigest,
38
+ packageDirectory: row.packageDirectory,
39
+ source: { kind: row.sourceKind, reference: row.sourceReference },
40
+ };
41
+ }
42
+ //# sourceMappingURL=pluginManagementRequestGetPackage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestGetPackage.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestGetPackage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAU5D,uPAAuP;AACvP,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACnD,QAAyB,EACzB,WAAmB,EACnB,MAAc,EACd,SAAiB;IAEjB,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ;SACvB,MAAM,CAAC;QACJ,EAAE,EAAE,wBAAwB,CAAC,EAAE;QAC/B,MAAM,EAAE,wBAAwB,CAAC,MAAM;QACvC,MAAM,EAAE,wBAAwB,CAAC,MAAM;QACvC,MAAM,EAAE,wBAAwB,CAAC,MAAM;QACvC,UAAU,EAAE,wBAAwB,CAAC,UAAU;QAC/C,eAAe,EAAE,wBAAwB,CAAC,eAAe;QACzD,aAAa,EAAE,wBAAwB,CAAC,aAAa;QACrD,gBAAgB,EAAE,wBAAwB,CAAC,gBAAgB;KAC9D,CAAC;SACD,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CACF,GAAG,CACC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,SAAS,CAAC,EAC1C,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9C,CACJ;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACd,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,yCAAyC,CAAC,CAAC;IACxF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY;QACvD,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAC;IAChG,IACI,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS;QACzB,GAAG,CAAC,UAAU,KAAK,SAAS;QAC5B,GAAG,CAAC,UAAU,KAAK,MAAM,CAAC;QAC9B,CAAC,GAAG,CAAC,eAAe;QACpB,CAAC,GAAG,CAAC,aAAa;QAClB,CAAC,GAAG,CAAC,gBAAgB;QAErB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,OAAO;QACH,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE;KACnE,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import { type PluginManagementRequestSummary } from "./types.js";
3
+ /** Lists durable plugin approval cards for one accessible chat and does not mutate durable state. This projection boundary requires active membership while excluding staged filesystem paths and other private package internals. */
4
+ export declare function pluginManagementRequestList(executor: DrizzleExecutor, actorUserId: string, chatId: string): Promise<PluginManagementRequestSummary[]>;
5
+ //# sourceMappingURL=pluginManagementRequestList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestList.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,EAAe,KAAK,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE9E,sOAAsO;AACtO,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAS3C"}
@@ -0,0 +1,18 @@
1
+ import { desc, eq } from "drizzle-orm";
2
+ import { chatGetAccess } from "../chat/chatGetAccess.js";
3
+ import { pluginManagementRequests } from "../schema.js";
4
+ import { asPluginManagementRequest } from "./impl/asManagementRequest.js";
5
+ import { pluginManagementRequestSelection } from "./impl/managementRequestSelection.js";
6
+ import { PluginError } from "./types.js";
7
+ /** Lists durable plugin approval cards for one accessible chat and does not mutate durable state. This projection boundary requires active membership while excluding staged filesystem paths and other private package internals. */
8
+ export async function pluginManagementRequestList(executor, actorUserId, chatId) {
9
+ if (!(await chatGetAccess(executor, actorUserId, chatId, true)))
10
+ throw new PluginError("forbidden", "Chat membership is required");
11
+ const rows = await executor
12
+ .select(pluginManagementRequestSelection)
13
+ .from(pluginManagementRequests)
14
+ .where(eq(pluginManagementRequests.chatId, chatId))
15
+ .orderBy(desc(pluginManagementRequests.createdAt), desc(pluginManagementRequests.id));
16
+ return rows.map(asPluginManagementRequest);
17
+ }
18
+ //# sourceMappingURL=pluginManagementRequestList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestList.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAC;AAE9E,sOAAsO;AACtO,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC7C,QAAyB,EACzB,WAAmB,EACnB,MAAc;IAEd,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,QAAQ;SACtB,MAAM,CAAC,gCAAgC,CAAC;SACxC,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAClD,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ /** Lists terminal pluginManagementRequests whose staged package directories can be reclaimed and does not mutate durable state. This restart-cleanup boundary prevents resolved approval snapshots from accumulating after a process stops between resolution and filesystem cleanup. */
3
+ export declare function pluginManagementRequestListTerminalIds(executor: DrizzleExecutor): Promise<string[]>;
4
+ //# sourceMappingURL=pluginManagementRequestListTerminalIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestListTerminalIds.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestListTerminalIds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,yRAAyR;AACzR,wBAAsB,sCAAsC,CACxD,QAAQ,EAAE,eAAe,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB"}
@@ -0,0 +1,11 @@
1
+ import { inArray } from "drizzle-orm";
2
+ import { pluginManagementRequests } from "../schema.js";
3
+ /** Lists terminal pluginManagementRequests whose staged package directories can be reclaimed and does not mutate durable state. This restart-cleanup boundary prevents resolved approval snapshots from accumulating after a process stops between resolution and filesystem cleanup. */
4
+ export async function pluginManagementRequestListTerminalIds(executor) {
5
+ const rows = await executor
6
+ .select({ id: pluginManagementRequests.id })
7
+ .from(pluginManagementRequests)
8
+ .where(inArray(pluginManagementRequests.status, ["approved", "denied", "failed"]));
9
+ return rows.map(({ id }) => id);
10
+ }
11
+ //# sourceMappingURL=pluginManagementRequestListTerminalIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestListTerminalIds.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestListTerminalIds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,yRAAyR;AACzR,MAAM,CAAC,KAAK,UAAU,sCAAsC,CACxD,QAAyB;IAEzB,MAAM,IAAI,GAAG,MAAM,QAAQ;SACtB,MAAM,CAAC,EAAE,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC;SAC3C,IAAI,CAAC,wBAAwB,CAAC;SAC9B,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { MutationHint } from "../chat/types.js";
3
+ /** Resolves pluginManagementRequests left processing by a stopped complete-server process according to the durable installation outcome. This restart boundary prevents approval cards from remaining permanently claimed while preserving audit and reactive chat evidence for the recovered terminal state. */
4
+ export declare function pluginManagementRequestRecoverProcessing(executor: DrizzleExecutor): Promise<MutationHint[]>;
5
+ //# sourceMappingURL=pluginManagementRequestRecoverProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestRecoverProcessing.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestRecoverProcessing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,iTAAiT;AACjT,wBAAsB,wCAAwC,CAC1D,QAAQ,EAAE,eAAe,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC,CA+EzB"}
@@ -0,0 +1,75 @@
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 { pluginInstallations, pluginManagementRequests } from "../schema.js";
7
+ import { syncSequenceNext } from "../sync/syncSequenceNext.js";
8
+ /** Resolves pluginManagementRequests left processing by a stopped complete-server process according to the durable installation outcome. This restart boundary prevents approval cards from remaining permanently claimed while preserving audit and reactive chat evidence for the recovered terminal state. */
9
+ export async function pluginManagementRequestRecoverProcessing(executor) {
10
+ return withTransaction(executor, async (tx) => {
11
+ const rows = await tx
12
+ .select({
13
+ id: pluginManagementRequests.id,
14
+ action: pluginManagementRequests.action,
15
+ chatId: pluginManagementRequests.chatId,
16
+ installationId: pluginManagementRequests.installationId,
17
+ targetInstallationId: pluginManagementRequests.targetInstallationId,
18
+ resolvedByUserId: pluginManagementRequests.resolvedByUserId,
19
+ })
20
+ .from(pluginManagementRequests)
21
+ .where(eq(pluginManagementRequests.status, "processing"));
22
+ const hints = [];
23
+ for (const row of rows) {
24
+ if (row.action !== "install" && row.action !== "uninstall")
25
+ throw new Error(`Unknown processing plugin request action ${row.action}`);
26
+ const durableId = row.action === "install" ? row.installationId : row.targetInstallationId;
27
+ const [installation] = durableId
28
+ ? await tx
29
+ .select({ id: pluginInstallations.id })
30
+ .from(pluginInstallations)
31
+ .where(eq(pluginInstallations.id, durableId))
32
+ .limit(1)
33
+ : [];
34
+ const approved = row.action === "install"
35
+ ? Boolean(row.installationId && installation)
36
+ : row.action === "uninstall"
37
+ ? Boolean(row.targetInstallationId && !installation)
38
+ : false;
39
+ const error = approved
40
+ ? undefined
41
+ : "The server stopped before the plugin operation completed.";
42
+ const updated = await tx
43
+ .update(pluginManagementRequests)
44
+ .set({
45
+ status: approved ? "approved" : "failed",
46
+ lastError: error,
47
+ resolvedAt: sql `CURRENT_TIMESTAMP`,
48
+ updatedAt: sql `CURRENT_TIMESTAMP`,
49
+ })
50
+ .where(and(eq(pluginManagementRequests.id, row.id), eq(pluginManagementRequests.status, "processing")))
51
+ .returning({ id: pluginManagementRequests.id });
52
+ if (updated.length !== 1)
53
+ throw new Error("Processing plugin management request disappeared during recovery");
54
+ const action = `plugin.${row.action}_${approved ? "approved" : "failed"}`;
55
+ if (row.resolvedByUserId)
56
+ await chatAppendAudit(tx, {
57
+ actorUserId: row.resolvedByUserId,
58
+ action,
59
+ targetType: "plugin_management_request",
60
+ targetId: row.id,
61
+ chatId: row.chatId,
62
+ after: { recoveredAfterRestart: true, ...(error ? { error } : {}) },
63
+ });
64
+ const sequence = await syncSequenceNext(tx);
65
+ await tx
66
+ .update(pluginManagementRequests)
67
+ .set({ syncSequence: sequence })
68
+ .where(eq(pluginManagementRequests.id, row.id));
69
+ const mutation = await chatAdvanceWithSequence(tx, sequence, row.resolvedByUserId ?? undefined, row.chatId, action, row.id);
70
+ hints.push(chatHint(sequence, row.chatId, mutation.pts));
71
+ }
72
+ return hints;
73
+ });
74
+ }
75
+ //# sourceMappingURL=pluginManagementRequestRecoverProcessing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManagementRequestRecoverProcessing.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginManagementRequestRecoverProcessing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DrizzleExecutor } from "../drizzle.js";
2
+ import type { PluginSource } from "./types.js";
3
+ export interface PluginReadySkillPackage {
4
+ pluginId: string;
5
+ shortName: string;
6
+ packageDigest: string;
7
+ packageDirectory: string;
8
+ source: PluginSource;
9
+ }
10
+ /** Lists each durable plugin package with at least one ready installation and does not mutate durable state. This worker boundary exposes only immutable package coordinates needed to reconcile skills into an isolated agent home. */
11
+ export declare function pluginSkillPackageListReady(executor: DrizzleExecutor): Promise<PluginReadySkillPackage[]>;
12
+ //# sourceMappingURL=pluginSkillPackageListReady.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginSkillPackageListReady.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginSkillPackageListReady.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,wOAAwO;AACxO,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,eAAe,GAC1B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CA8BpC"}
@@ -0,0 +1,33 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { pluginInstallations, plugins } from "../schema.js";
3
+ /** Lists each durable plugin package with at least one ready installation and does not mutate durable state. This worker boundary exposes only immutable package coordinates needed to reconcile skills into an isolated agent home. */
4
+ export async function pluginSkillPackageListReady(executor) {
5
+ const rows = await executor
6
+ .select({
7
+ pluginId: plugins.id,
8
+ shortName: plugins.shortName,
9
+ packageDigest: plugins.packageDigest,
10
+ packageDirectory: plugins.packageDirectory,
11
+ sourceKind: plugins.sourceKind,
12
+ sourceReference: plugins.sourceReference,
13
+ })
14
+ .from(plugins)
15
+ .innerJoin(pluginInstallations, eq(pluginInstallations.pluginId, plugins.id))
16
+ .where(eq(pluginInstallations.status, "ready"))
17
+ .groupBy(plugins.id)
18
+ .orderBy(plugins.shortName, plugins.id);
19
+ return rows.map((row) => {
20
+ if (row.sourceKind !== "builtin" &&
21
+ row.sourceKind !== "archive" &&
22
+ row.sourceKind !== "link")
23
+ throw new Error(`Unknown plugin source kind ${row.sourceKind}`);
24
+ return {
25
+ pluginId: row.pluginId,
26
+ shortName: row.shortName,
27
+ packageDigest: row.packageDigest,
28
+ packageDirectory: row.packageDirectory,
29
+ source: { kind: row.sourceKind, reference: row.sourceReference },
30
+ };
31
+ });
32
+ }
33
+ //# sourceMappingURL=pluginSkillPackageListReady.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginSkillPackageListReady.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginSkillPackageListReady.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAW5D,wOAAwO;AACxO,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC7C,QAAyB;IAEzB,MAAM,IAAI,GAAG,MAAM,QAAQ;SACtB,MAAM,CAAC;QACJ,QAAQ,EAAE,OAAO,CAAC,EAAE;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;KAC3C,CAAC;SACD,IAAI,CAAC,OAAO,CAAC;SACb,SAAS,CAAC,mBAAmB,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;SAC5E,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC9C,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;SACnB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACpB,IACI,GAAG,CAAC,UAAU,KAAK,SAAS;YAC5B,GAAG,CAAC,UAAU,KAAK,SAAS;YAC5B,GAAG,CAAC,UAAU,KAAK,MAAM;YAEzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,OAAO;YACH,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE;SACnE,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}