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,345 @@
1
+ export declare const pluginManagementRequestSelection: {
2
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
3
+ name: "id";
4
+ tableName: "plugin_management_requests";
5
+ dataType: "string";
6
+ columnType: "SQLiteText";
7
+ data: string;
8
+ driverParam: string;
9
+ notNull: true;
10
+ hasDefault: false;
11
+ isPrimaryKey: true;
12
+ isAutoincrement: false;
13
+ hasRuntimeDefault: false;
14
+ enumValues: [string, ...string[]];
15
+ baseColumn: never;
16
+ identity: undefined;
17
+ generated: undefined;
18
+ }, {}, {
19
+ length: number | undefined;
20
+ }>;
21
+ action: import("drizzle-orm/sqlite-core").SQLiteColumn<{
22
+ name: "action";
23
+ tableName: "plugin_management_requests";
24
+ dataType: "string";
25
+ columnType: "SQLiteText";
26
+ data: string;
27
+ driverParam: string;
28
+ notNull: true;
29
+ hasDefault: false;
30
+ isPrimaryKey: false;
31
+ isAutoincrement: false;
32
+ hasRuntimeDefault: false;
33
+ enumValues: [string, ...string[]];
34
+ baseColumn: never;
35
+ identity: undefined;
36
+ generated: undefined;
37
+ }, {}, {
38
+ length: number | undefined;
39
+ }>;
40
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
41
+ name: "status";
42
+ tableName: "plugin_management_requests";
43
+ dataType: "string";
44
+ columnType: "SQLiteText";
45
+ data: string;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: true;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: [string, ...string[]];
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {
57
+ length: number | undefined;
58
+ }>;
59
+ chatId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
60
+ name: "chat_id";
61
+ tableName: "plugin_management_requests";
62
+ dataType: "string";
63
+ columnType: "SQLiteText";
64
+ data: string;
65
+ driverParam: string;
66
+ notNull: true;
67
+ hasDefault: false;
68
+ isPrimaryKey: false;
69
+ isAutoincrement: false;
70
+ hasRuntimeDefault: false;
71
+ enumValues: [string, ...string[]];
72
+ baseColumn: never;
73
+ identity: undefined;
74
+ generated: undefined;
75
+ }, {}, {
76
+ length: number | undefined;
77
+ }>;
78
+ agentUserId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
79
+ name: "agent_user_id";
80
+ tableName: "plugin_management_requests";
81
+ dataType: "string";
82
+ columnType: "SQLiteText";
83
+ data: string;
84
+ driverParam: string;
85
+ notNull: false;
86
+ hasDefault: false;
87
+ isPrimaryKey: false;
88
+ isAutoincrement: false;
89
+ hasRuntimeDefault: false;
90
+ enumValues: [string, ...string[]];
91
+ baseColumn: never;
92
+ identity: undefined;
93
+ generated: undefined;
94
+ }, {}, {
95
+ length: number | undefined;
96
+ }>;
97
+ requesterInstallationId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
98
+ name: "requester_installation_id";
99
+ tableName: "plugin_management_requests";
100
+ dataType: "string";
101
+ columnType: "SQLiteText";
102
+ data: string;
103
+ driverParam: string;
104
+ notNull: false;
105
+ hasDefault: false;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: [string, ...string[]];
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}, {
114
+ length: number | undefined;
115
+ }>;
116
+ displayName: import("drizzle-orm/sqlite-core").SQLiteColumn<{
117
+ name: "display_name";
118
+ tableName: "plugin_management_requests";
119
+ dataType: "string";
120
+ columnType: "SQLiteText";
121
+ data: string;
122
+ driverParam: string;
123
+ notNull: true;
124
+ hasDefault: false;
125
+ isPrimaryKey: false;
126
+ isAutoincrement: false;
127
+ hasRuntimeDefault: false;
128
+ enumValues: [string, ...string[]];
129
+ baseColumn: never;
130
+ identity: undefined;
131
+ generated: undefined;
132
+ }, {}, {
133
+ length: number | undefined;
134
+ }>;
135
+ shortName: import("drizzle-orm/sqlite-core").SQLiteColumn<{
136
+ name: "short_name";
137
+ tableName: "plugin_management_requests";
138
+ dataType: "string";
139
+ columnType: "SQLiteText";
140
+ data: string;
141
+ driverParam: string;
142
+ notNull: true;
143
+ hasDefault: false;
144
+ isPrimaryKey: false;
145
+ isAutoincrement: false;
146
+ hasRuntimeDefault: false;
147
+ enumValues: [string, ...string[]];
148
+ baseColumn: never;
149
+ identity: undefined;
150
+ generated: undefined;
151
+ }, {}, {
152
+ length: number | undefined;
153
+ }>;
154
+ description: import("drizzle-orm/sqlite-core").SQLiteColumn<{
155
+ name: "description";
156
+ tableName: "plugin_management_requests";
157
+ dataType: "string";
158
+ columnType: "SQLiteText";
159
+ data: string;
160
+ driverParam: string;
161
+ notNull: true;
162
+ hasDefault: false;
163
+ isPrimaryKey: false;
164
+ isAutoincrement: false;
165
+ hasRuntimeDefault: false;
166
+ enumValues: [string, ...string[]];
167
+ baseColumn: never;
168
+ identity: undefined;
169
+ generated: undefined;
170
+ }, {}, {
171
+ length: number | undefined;
172
+ }>;
173
+ reason: import("drizzle-orm/sqlite-core").SQLiteColumn<{
174
+ name: "reason";
175
+ tableName: "plugin_management_requests";
176
+ dataType: "string";
177
+ columnType: "SQLiteText";
178
+ data: string;
179
+ driverParam: string;
180
+ notNull: false;
181
+ hasDefault: false;
182
+ isPrimaryKey: false;
183
+ isAutoincrement: false;
184
+ hasRuntimeDefault: false;
185
+ enumValues: [string, ...string[]];
186
+ baseColumn: never;
187
+ identity: undefined;
188
+ generated: undefined;
189
+ }, {}, {
190
+ length: number | undefined;
191
+ }>;
192
+ sourceKind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
193
+ name: "source_kind";
194
+ tableName: "plugin_management_requests";
195
+ dataType: "string";
196
+ columnType: "SQLiteText";
197
+ data: string;
198
+ driverParam: string;
199
+ notNull: false;
200
+ hasDefault: false;
201
+ isPrimaryKey: false;
202
+ isAutoincrement: false;
203
+ hasRuntimeDefault: false;
204
+ enumValues: [string, ...string[]];
205
+ baseColumn: never;
206
+ identity: undefined;
207
+ generated: undefined;
208
+ }, {}, {
209
+ length: number | undefined;
210
+ }>;
211
+ sourceReference: import("drizzle-orm/sqlite-core").SQLiteColumn<{
212
+ name: "source_reference";
213
+ tableName: "plugin_management_requests";
214
+ dataType: "string";
215
+ columnType: "SQLiteText";
216
+ data: string;
217
+ driverParam: string;
218
+ notNull: false;
219
+ hasDefault: false;
220
+ isPrimaryKey: false;
221
+ isAutoincrement: false;
222
+ hasRuntimeDefault: false;
223
+ enumValues: [string, ...string[]];
224
+ baseColumn: never;
225
+ identity: undefined;
226
+ generated: undefined;
227
+ }, {}, {
228
+ length: number | undefined;
229
+ }>;
230
+ targetInstallationId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
231
+ name: "target_installation_id";
232
+ tableName: "plugin_management_requests";
233
+ dataType: "string";
234
+ columnType: "SQLiteText";
235
+ data: string;
236
+ driverParam: string;
237
+ notNull: false;
238
+ hasDefault: false;
239
+ isPrimaryKey: false;
240
+ isAutoincrement: false;
241
+ hasRuntimeDefault: false;
242
+ enumValues: [string, ...string[]];
243
+ baseColumn: never;
244
+ identity: undefined;
245
+ generated: undefined;
246
+ }, {}, {
247
+ length: number | undefined;
248
+ }>;
249
+ installationId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
250
+ name: "installation_id";
251
+ tableName: "plugin_management_requests";
252
+ dataType: "string";
253
+ columnType: "SQLiteText";
254
+ data: string;
255
+ driverParam: string;
256
+ notNull: false;
257
+ hasDefault: false;
258
+ isPrimaryKey: false;
259
+ isAutoincrement: false;
260
+ hasRuntimeDefault: false;
261
+ enumValues: [string, ...string[]];
262
+ baseColumn: never;
263
+ identity: undefined;
264
+ generated: undefined;
265
+ }, {}, {
266
+ length: number | undefined;
267
+ }>;
268
+ resolvedByUserId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
269
+ name: "resolved_by_user_id";
270
+ tableName: "plugin_management_requests";
271
+ dataType: "string";
272
+ columnType: "SQLiteText";
273
+ data: string;
274
+ driverParam: string;
275
+ notNull: false;
276
+ hasDefault: false;
277
+ isPrimaryKey: false;
278
+ isAutoincrement: false;
279
+ hasRuntimeDefault: false;
280
+ enumValues: [string, ...string[]];
281
+ baseColumn: never;
282
+ identity: undefined;
283
+ generated: undefined;
284
+ }, {}, {
285
+ length: number | undefined;
286
+ }>;
287
+ resolvedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
288
+ name: "resolved_at";
289
+ tableName: "plugin_management_requests";
290
+ dataType: "string";
291
+ columnType: "SQLiteText";
292
+ data: string;
293
+ driverParam: string;
294
+ notNull: false;
295
+ hasDefault: false;
296
+ isPrimaryKey: false;
297
+ isAutoincrement: false;
298
+ hasRuntimeDefault: false;
299
+ enumValues: [string, ...string[]];
300
+ baseColumn: never;
301
+ identity: undefined;
302
+ generated: undefined;
303
+ }, {}, {
304
+ length: number | undefined;
305
+ }>;
306
+ lastError: import("drizzle-orm/sqlite-core").SQLiteColumn<{
307
+ name: "last_error";
308
+ tableName: "plugin_management_requests";
309
+ dataType: "string";
310
+ columnType: "SQLiteText";
311
+ data: string;
312
+ driverParam: string;
313
+ notNull: false;
314
+ hasDefault: false;
315
+ isPrimaryKey: false;
316
+ isAutoincrement: false;
317
+ hasRuntimeDefault: false;
318
+ enumValues: [string, ...string[]];
319
+ baseColumn: never;
320
+ identity: undefined;
321
+ generated: undefined;
322
+ }, {}, {
323
+ length: number | undefined;
324
+ }>;
325
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
326
+ name: "created_at";
327
+ tableName: "plugin_management_requests";
328
+ dataType: "string";
329
+ columnType: "SQLiteText";
330
+ data: string;
331
+ driverParam: string;
332
+ notNull: true;
333
+ hasDefault: true;
334
+ isPrimaryKey: false;
335
+ isAutoincrement: false;
336
+ hasRuntimeDefault: false;
337
+ enumValues: [string, ...string[]];
338
+ baseColumn: never;
339
+ identity: undefined;
340
+ generated: undefined;
341
+ }, {}, {
342
+ length: number | undefined;
343
+ }>;
344
+ };
345
+ //# sourceMappingURL=managementRequestSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managementRequestSelection.d.ts","sourceRoot":"","sources":["../../../../sources/modules/plugin/impl/managementRequestSelection.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gCAAgC;IACzC,EAAE;;;;;;;;;;;;;;;;;;;IACF,MAAM;;;;;;;;;;;;;;;;;;;IACN,MAAM;;;;;;;;;;;;;;;;;;;IACN,MAAM;;;;;;;;;;;;;;;;;;;IACN,WAAW;;;;;;;;;;;;;;;;;;;IACX,uBAAuB;;;;;;;;;;;;;;;;;;;IACvB,WAAW;;;;;;;;;;;;;;;;;;;IACX,SAAS;;;;;;;;;;;;;;;;;;;IACT,WAAW;;;;;;;;;;;;;;;;;;;IACX,MAAM;;;;;;;;;;;;;;;;;;;IACN,UAAU;;;;;;;;;;;;;;;;;;;IACV,eAAe;;;;;;;;;;;;;;;;;;;IACf,oBAAoB;;;;;;;;;;;;;;;;;;;IACpB,cAAc;;;;;;;;;;;;;;;;;;;IACd,gBAAgB;;;;;;;;;;;;;;;;;;;IAChB,UAAU;;;;;;;;;;;;;;;;;;;IACV,SAAS;;;;;;;;;;;;;;;;;;;IACT,SAAS;;;;;;;;;;;;;;;;;;;CACZ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { pluginManagementRequests } from "../../schema.js";
2
+ export const pluginManagementRequestSelection = {
3
+ id: pluginManagementRequests.id,
4
+ action: pluginManagementRequests.action,
5
+ status: pluginManagementRequests.status,
6
+ chatId: pluginManagementRequests.chatId,
7
+ agentUserId: pluginManagementRequests.agentUserId,
8
+ requesterInstallationId: pluginManagementRequests.requesterInstallationId,
9
+ displayName: pluginManagementRequests.displayName,
10
+ shortName: pluginManagementRequests.shortName,
11
+ description: pluginManagementRequests.description,
12
+ reason: pluginManagementRequests.reason,
13
+ sourceKind: pluginManagementRequests.sourceKind,
14
+ sourceReference: pluginManagementRequests.sourceReference,
15
+ targetInstallationId: pluginManagementRequests.targetInstallationId,
16
+ installationId: pluginManagementRequests.installationId,
17
+ resolvedByUserId: pluginManagementRequests.resolvedByUserId,
18
+ resolvedAt: pluginManagementRequests.resolvedAt,
19
+ lastError: pluginManagementRequests.lastError,
20
+ createdAt: pluginManagementRequests.createdAt,
21
+ };
22
+ //# sourceMappingURL=managementRequestSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managementRequestSelection.js","sourceRoot":"","sources":["../../../../sources/modules/plugin/impl/managementRequestSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC5C,EAAE,EAAE,wBAAwB,CAAC,EAAE;IAC/B,MAAM,EAAE,wBAAwB,CAAC,MAAM;IACvC,MAAM,EAAE,wBAAwB,CAAC,MAAM;IACvC,MAAM,EAAE,wBAAwB,CAAC,MAAM;IACvC,WAAW,EAAE,wBAAwB,CAAC,WAAW;IACjD,uBAAuB,EAAE,wBAAwB,CAAC,uBAAuB;IACzE,WAAW,EAAE,wBAAwB,CAAC,WAAW;IACjD,SAAS,EAAE,wBAAwB,CAAC,SAAS;IAC7C,WAAW,EAAE,wBAAwB,CAAC,WAAW;IACjD,MAAM,EAAE,wBAAwB,CAAC,MAAM;IACvC,UAAU,EAAE,wBAAwB,CAAC,UAAU;IAC/C,eAAe,EAAE,wBAAwB,CAAC,eAAe;IACzD,oBAAoB,EAAE,wBAAwB,CAAC,oBAAoB;IACnE,cAAc,EAAE,wBAAwB,CAAC,cAAc;IACvD,gBAAgB,EAAE,wBAAwB,CAAC,gBAAgB;IAC3D,UAAU,EAAE,wBAAwB,CAAC,UAAU;IAC/C,SAAS,EAAE,wBAAwB,CAAC,SAAS;IAC7C,SAAS,EAAE,wBAAwB,CAAC,SAAS;CAChD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { WebhookUrlPolicy } from "../integrations/ssrf.js";
2
+ export interface PluginPackageLinkDownload {
3
+ body: Buffer;
4
+ url: string;
5
+ }
6
+ export interface PluginPackageLinkDownloader {
7
+ download(url: string, signal?: AbortSignal): Promise<PluginPackageLinkDownload>;
8
+ }
9
+ /** Downloads bounded plugin ZIP links through the server's public-address policy with DNS-pinned HTTPS sockets and revalidated redirects. */
10
+ export declare class NodePluginPackageLinkDownloader implements PluginPackageLinkDownloader {
11
+ private readonly policy;
12
+ constructor(policy: WebhookUrlPolicy);
13
+ download(url: string, signal?: AbortSignal): Promise<PluginPackageLinkDownload>;
14
+ private downloadFollowing;
15
+ }
16
+ //# sourceMappingURL=packageLinkDownloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageLinkDownloader.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/packageLinkDownloader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,MAAM,WAAW,yBAAyB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnF;AAED,6IAA6I;AAC7I,qBAAa,+BAAgC,YAAW,2BAA2B;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,gBAAgB,EAAI;IAEnD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAUpF;YAEa,iBAAiB;CAoBlC"}
@@ -0,0 +1,67 @@
1
+ import { request } from "node:https";
2
+ const MAX_ARCHIVE_BYTES = 20 * 1024 * 1024;
3
+ const DOWNLOAD_TIMEOUT_MS = 20_000;
4
+ const MAX_REDIRECTS = 3;
5
+ /** Downloads bounded plugin ZIP links through the server's public-address policy with DNS-pinned HTTPS sockets and revalidated redirects. */
6
+ export class NodePluginPackageLinkDownloader {
7
+ policy;
8
+ constructor(policy) {
9
+ this.policy = policy;
10
+ }
11
+ async download(url, signal) {
12
+ const timeout = AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS);
13
+ const bounded = signal ? AbortSignal.any([signal, timeout]) : timeout;
14
+ try {
15
+ return await this.downloadFollowing(url, bounded, 0);
16
+ }
17
+ catch (error) {
18
+ if (timeout.aborted && !signal?.aborted)
19
+ throw new Error("Plugin link download timed out");
20
+ throw error;
21
+ }
22
+ }
23
+ async downloadFollowing(input, signal, redirects) {
24
+ const resolved = await this.policy.resolveForDelivery(input);
25
+ const response = await downloadPinned(resolved.url, resolved.addresses[0], signal);
26
+ if (response.statusCode >= 300 && response.statusCode < 400 && response.location) {
27
+ if (redirects >= MAX_REDIRECTS)
28
+ throw new Error("Plugin link redirected too many times");
29
+ return this.downloadFollowing(new URL(response.location, resolved.url).toString(), signal, redirects + 1);
30
+ }
31
+ if (response.statusCode < 200 || response.statusCode >= 300)
32
+ throw new Error(`Plugin link returned HTTP ${response.statusCode}`);
33
+ return { body: response.body, url: resolved.url };
34
+ }
35
+ }
36
+ function downloadPinned(input, address, signal) {
37
+ const url = new URL(input);
38
+ return new Promise((resolve, reject) => {
39
+ const requestHandle = request(url, {
40
+ headers: { accept: "application/zip, application/octet-stream" },
41
+ lookup: (_hostname, _options, callback) => callback(null, address.address, address.family),
42
+ signal,
43
+ }, (response) => {
44
+ const chunks = [];
45
+ let bytes = 0;
46
+ response.on("data", (chunk) => {
47
+ bytes += chunk.byteLength;
48
+ if (bytes > MAX_ARCHIVE_BYTES) {
49
+ response.destroy(new Error("Plugin link exceeds 20 MiB"));
50
+ return;
51
+ }
52
+ chunks.push(chunk);
53
+ });
54
+ response.once("error", reject);
55
+ response.once("end", () => resolve({
56
+ body: Buffer.concat(chunks),
57
+ ...(typeof response.headers.location === "string"
58
+ ? { location: response.headers.location }
59
+ : {}),
60
+ statusCode: response.statusCode ?? 0,
61
+ }));
62
+ });
63
+ requestHandle.once("error", reject);
64
+ requestHandle.end();
65
+ });
66
+ }
67
+ //# sourceMappingURL=packageLinkDownloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageLinkDownloader.js","sourceRoot":"","sources":["../../../sources/modules/plugin/packageLinkDownloader.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
- import type { PluginPackage } from "./types.js";
1
+ import type { PluginPackage, PluginSource } from "./types.js";
2
+ import type { PluginReadySkillPackage } from "./pluginSkillPackageListReady.js";
3
+ export interface PreparedPluginPackage {
4
+ plugin: PluginPackage;
5
+ cleanup(): Promise<void>;
6
+ }
2
7
  /** Persists one exact package snapshot per system plugin so catalog changes cannot mutate installed metadata or files. */
3
8
  export declare class PluginPackageStore {
4
9
  private readonly root;
@@ -7,6 +12,13 @@ export declare class PluginPackageStore {
7
12
  packageDirectory: string;
8
13
  imageStorageKey: string;
9
14
  }>;
15
+ prepareArchive(archive: Buffer, source: PluginSource): Promise<PreparedPluginPackage>;
16
+ stageRequest(plugin: PluginPackage, requestId: string): Promise<string>;
17
+ loadRequest(requestId: string, recordedDirectory: string, source: PluginSource, packageDigest: string): Promise<PluginPackage>;
18
+ loadInstalled(pluginId: string, recordedDirectory: string, shortName: string, packageDigest: string, source: PluginSource): Promise<PluginPackage>;
19
+ readRequestImage(requestId: string, recordedDirectory: string, source: PluginSource, packageDigest: string): Promise<Buffer>;
20
+ removeRequest(requestId: string): Promise<void>;
21
+ syncSkills(installed: readonly PluginReadySkillPackage[], agentHome: string): Promise<void>;
10
22
  remove(pluginId: string): Promise<void>;
11
23
  cleanupTemporary(): Promise<void>;
12
24
  createDownloadDirectory(): Promise<string>;
@@ -24,5 +36,6 @@ export declare class PluginPackageStore {
24
36
  readImage(pluginId: string, recordedDirectory: string, imageStorageKey: string, shortName: string, packageDigest: string): Promise<Buffer>;
25
37
  private path;
26
38
  private load;
39
+ private requestPath;
27
40
  }
28
41
  //# sourceMappingURL=packageStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageStore.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/packageStore.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,0HAA0H;AAC1H,qBAAa,kBAAkB;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,MAAM,EAAI;IAEvC,OAAO,CACT,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CA0ChE;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5C;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAetC;IAEK,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG/C;IAEK,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9D;IAEK,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAelF;IAEK,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D;IAEK,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlF;IAEK,kBAAkB,CACpB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAoBjB;IAEK,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzD;IAEK,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,SAAS,CACX,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAWlD;IAEK,SAAS,CACX,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAKjB;IAED,OAAO,CAAC,IAAI;YASE,IAAI;CAoBrB"}
1
+ {"version":3,"file":"packageStore.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/packageStore.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,0HAA0H;AAC1H,qBAAa,kBAAkB;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,MAAM,EAAI;IAEvC,OAAO,CACT,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CA0ChE;IAEK,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsB1F;IAEK,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe5E;IAEK,WAAW,CACb,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,CAAC,CAcxB;IAEK,aAAa,CACf,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,CAAC,CAGxB;IAEK,gBAAgB,CAClB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAGjB;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAEK,UAAU,CACZ,SAAS,EAAE,SAAS,uBAAuB,EAAE,EAC7C,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAsCf;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5C;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAetC;IAEK,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG/C;IAEK,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9D;IAEK,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAelF;IAEK,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D;IAEK,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlF;IAEK,kBAAkB,CACpB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAoBjB;IAEK,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzD;IAEK,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,SAAS,CACX,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAWlD;IAEK,SAAS,CACX,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAKjB;IAED,OAAO,CAAC,IAAI;YASE,IAAI;IAqBlB,OAAO,CAAC,WAAW;CAQtB"}
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { cp, lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, } from "node:fs/promises";
3
- import { join, resolve, sep } from "node:path";
3
+ import { dirname, join, resolve, sep } from "node:path";
4
+ import { pluginArchiveExtract } from "./archive.js";
4
5
  import { pluginPackageLoadInstalled, pluginPackageLoadSource } from "./catalog.js";
5
6
  /** Persists one exact package snapshot per system plugin so catalog changes cannot mutate installed metadata or files. */
6
7
  export class PluginPackageStore {
@@ -45,6 +46,107 @@ export class PluginPackageStore {
45
46
  await rm(staging, { force: true, recursive: true });
46
47
  }
47
48
  }
49
+ async prepareArchive(archive, source) {
50
+ await mkdir(this.root, { recursive: true, mode: 0o700 });
51
+ const temporary = resolve(this.root, `.incoming-${randomUUID()}`);
52
+ try {
53
+ const [candidate] = await pluginArchiveExtract(archive, temporary, "zip");
54
+ if (!candidate)
55
+ throw new Error("Plugin ZIP does not contain a package");
56
+ const loaded = await pluginPackageLoadSource(candidate.directory, source);
57
+ const plugin = source.kind === "archive"
58
+ ? {
59
+ ...loaded,
60
+ source: { kind: "archive", reference: loaded.packageDigest },
61
+ }
62
+ : loaded;
63
+ return {
64
+ plugin,
65
+ cleanup: () => rm(temporary, { force: true, recursive: true }),
66
+ };
67
+ }
68
+ catch (error) {
69
+ await rm(temporary, { force: true, recursive: true });
70
+ throw error;
71
+ }
72
+ }
73
+ async stageRequest(plugin, requestId) {
74
+ const destination = this.requestPath(requestId);
75
+ await mkdir(dirname(destination), { recursive: true, mode: 0o700 });
76
+ await rm(destination, { force: true, recursive: true });
77
+ await cp(plugin.directory, destination, {
78
+ recursive: true,
79
+ errorOnExist: true,
80
+ force: false,
81
+ });
82
+ const copied = await pluginPackageLoadSource(destination, plugin.source);
83
+ if (copied.packageDigest !== plugin.packageDigest) {
84
+ await rm(destination, { force: true, recursive: true });
85
+ throw new Error("Plugin package changed while its approval snapshot was copied");
86
+ }
87
+ return realpath(destination);
88
+ }
89
+ async loadRequest(requestId, recordedDirectory, source, packageDigest) {
90
+ const destination = this.requestPath(requestId);
91
+ const [requestRoot, actual, recorded] = await Promise.all([
92
+ realpath(resolve(this.root, ".requests")),
93
+ realpath(destination),
94
+ realpath(recordedDirectory),
95
+ ]);
96
+ const expected = resolve(requestRoot, requestId);
97
+ if (actual !== expected || recorded !== expected)
98
+ throw new Error("Pending plugin package is outside the request package store");
99
+ const plugin = await pluginPackageLoadSource(actual, source);
100
+ if (plugin.packageDigest !== packageDigest)
101
+ throw new Error("Pending plugin package no longer matches its recorded digest");
102
+ return plugin;
103
+ }
104
+ async loadInstalled(pluginId, recordedDirectory, shortName, packageDigest, source) {
105
+ await this.verify(pluginId, recordedDirectory, shortName, packageDigest);
106
+ return pluginPackageLoadInstalled(recordedDirectory, source, shortName);
107
+ }
108
+ async readRequestImage(requestId, recordedDirectory, source, packageDigest) {
109
+ const plugin = await this.loadRequest(requestId, recordedDirectory, source, packageDigest);
110
+ return readFile(plugin.iconPath);
111
+ }
112
+ async removeRequest(requestId) {
113
+ await rm(this.requestPath(requestId), { force: true, recursive: true });
114
+ }
115
+ async syncSkills(installed, agentHome) {
116
+ const targetRoot = resolve(agentHome, ".agents", "skills", "happy2-plugins");
117
+ const staging = resolve(agentHome, ".agents", `.happy2-skills-${randomUUID()}`);
118
+ await rm(staging, { force: true, recursive: true });
119
+ await mkdir(staging, { recursive: true, mode: 0o700 });
120
+ const desired = new Set();
121
+ try {
122
+ for (const item of installed) {
123
+ const plugin = await this.loadInstalled(item.pluginId, item.packageDirectory, item.shortName, item.packageDigest, item.source);
124
+ for (const skill of plugin.skills) {
125
+ const directory = `${item.pluginId}-${skill.name}`;
126
+ desired.add(directory);
127
+ await cp(join(plugin.directory, skill.directory), join(staging, directory), {
128
+ recursive: true,
129
+ errorOnExist: true,
130
+ force: false,
131
+ });
132
+ }
133
+ }
134
+ await mkdir(targetRoot, { recursive: true, mode: 0o700 });
135
+ for (const entry of await readdir(targetRoot, { withFileTypes: true })) {
136
+ if (desired.has(entry.name))
137
+ continue;
138
+ await rm(join(targetRoot, entry.name), { force: true, recursive: true });
139
+ }
140
+ for (const directory of [...desired].sort()) {
141
+ const destination = join(targetRoot, directory);
142
+ await rm(destination, { force: true, recursive: true });
143
+ await rename(join(staging, directory), destination);
144
+ }
145
+ }
146
+ finally {
147
+ await rm(staging, { force: true, recursive: true });
148
+ }
149
+ }
48
150
  async remove(pluginId) {
49
151
  await rm(this.path(pluginId), { force: true, recursive: true });
50
152
  }
@@ -178,6 +280,15 @@ export class PluginPackageStore {
178
280
  throw new Error("Installed plugin package no longer matches its recorded digest");
179
281
  return plugin;
180
282
  }
283
+ requestPath(requestId) {
284
+ if (!/^[a-z0-9]+$/.test(requestId))
285
+ throw new Error("Invalid plugin request id");
286
+ const destination = resolve(this.root, ".requests", requestId);
287
+ const requestRoot = resolve(this.root, ".requests");
288
+ if (!destination.startsWith(`${requestRoot}${sep}`))
289
+ throw new Error("Invalid plugin request package path");
290
+ return destination;
291
+ }
181
292
  }
182
293
  async function installedSource(directory, shortName) {
183
294
  // The source identity does not affect package validation or digest; callers have already