happy2 0.0.9 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/package.json +7 -3
- package/packages/happy2-server/PLUGINS.md +402 -0
- package/packages/happy2-server/README.md +39 -0
- package/packages/happy2-server/dist/daemon.d.ts +39 -0
- package/packages/happy2-server/dist/daemon.d.ts.map +1 -0
- package/packages/happy2-server/dist/daemon.js +302 -0
- package/packages/happy2-server/dist/daemon.js.map +1 -0
- package/packages/happy2-server/dist/daemon.test.d.ts +2 -0
- package/packages/happy2-server/dist/daemon.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/daemon.test.js +245 -0
- package/packages/happy2-server/dist/daemon.test.js.map +1 -0
- package/packages/happy2-server/dist/index.d.ts +7 -1
- package/packages/happy2-server/dist/index.d.ts.map +1 -1
- package/packages/happy2-server/dist/index.js +5 -1
- package/packages/happy2-server/dist/index.js.map +1 -1
- package/packages/happy2-server/dist/modules/agents/daemon.d.ts +10 -13
- package/packages/happy2-server/dist/modules/agents/daemon.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/agents/daemon.js +19 -5
- package/packages/happy2-server/dist/modules/agents/daemon.js.map +1 -1
- package/packages/happy2-server/dist/modules/agents/service.d.ts +9 -1
- package/packages/happy2-server/dist/modules/agents/service.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/agents/service.js +59 -2
- package/packages/happy2-server/dist/modules/agents/service.js.map +1 -1
- package/packages/happy2-server/dist/modules/auth/tokens.d.ts +7 -0
- package/packages/happy2-server/dist/modules/auth/tokens.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/auth/tokens.js +33 -0
- package/packages/happy2-server/dist/modules/auth/tokens.js.map +1 -1
- package/packages/happy2-server/dist/modules/auth/tokens.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/auth/tokens.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/tokens.test.js +28 -0
- package/packages/happy2-server/dist/modules/auth/tokens.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/chat/types.d.ts +1 -1
- package/packages/happy2-server/dist/modules/chat/types.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/config/defaults.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/config/defaults.js +5 -0
- package/packages/happy2-server/dist/modules/config/defaults.js.map +1 -1
- package/packages/happy2-server/dist/modules/config/loader.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/config/loader.js +9 -0
- package/packages/happy2-server/dist/modules/config/loader.js.map +1 -1
- package/packages/happy2-server/dist/modules/config/loader.test.js +15 -0
- package/packages/happy2-server/dist/modules/config/loader.test.js.map +1 -1
- package/packages/happy2-server/dist/modules/config/paths.d.ts +1 -0
- package/packages/happy2-server/dist/modules/config/paths.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/config/paths.js +1 -0
- package/packages/happy2-server/dist/modules/config/paths.js.map +1 -1
- package/packages/happy2-server/dist/modules/config/paths.test.js +1 -0
- package/packages/happy2-server/dist/modules/config/paths.test.js.map +1 -1
- package/packages/happy2-server/dist/modules/config/type.d.ts +5 -0
- package/packages/happy2-server/dist/modules/config/type.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/integrations/transport.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/integrations/transport.js +8 -1
- package/packages/happy2-server/dist/modules/integrations/transport.js.map +1 -1
- package/packages/happy2-server/dist/modules/integrations/types.d.ts +2 -0
- package/packages/happy2-server/dist/modules/integrations/types.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/integrations/types.js.map +1 -1
- package/packages/happy2-server/dist/modules/plugin/catalog.d.ts +13 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.js +400 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.test.js +172 -0
- package/packages/happy2-server/dist/modules/plugin/catalog.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/functions.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/functions.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/functions.test.js +123 -0
- package/packages/happy2-server/dist/modules/plugin/functions.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/httpBridge.d.ts +19 -0
- package/packages/happy2-server/dist/modules/plugin/httpBridge.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/httpBridge.js +206 -0
- package/packages/happy2-server/dist/modules/plugin/httpBridge.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.js +47 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asInstallation.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js +82 -0
- package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.js +12 -0
- package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.d.ts +288 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.js +19 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installationSelection.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js +63 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.js +17 -0
- package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginFunctionResult.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginFunctionResult.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginFunctionResult.js +16 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginFunctionResult.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginSelection.d.ts +339 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginSelection.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginSelection.js +22 -0
- package/packages/happy2-server/dist/modules/plugin/impl/pluginSelection.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/index.d.ts +3 -0
- package/packages/happy2-server/dist/modules/plugin/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/index.js +3 -0
- package/packages/happy2-server/dist/modules/plugin/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/packageStore.d.ts +15 -0
- package/packages/happy2-server/dist/modules/plugin/packageStore.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/packageStore.js +90 -0
- package/packages/happy2-server/dist/modules/plugin/packageStore.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginAuthorizeManagement.d.ts +7 -0
- package/packages/happy2-server/dist/modules/plugin/pluginAuthorizeManagement.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginAuthorizeManagement.js +9 -0
- package/packages/happy2-server/dist/modules/plugin/pluginAuthorizeManagement.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.d.ts +9 -0
- package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js +64 -0
- package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.d.ts +10 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.js +20 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.d.ts +12 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.js +44 -0
- package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFindBySource.d.ts +9 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFindBySource.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFindBySource.js +15 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFindBySource.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultAcquire.d.ts +23 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultAcquire.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultAcquire.js +54 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultAcquire.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultComplete.d.ts +13 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultComplete.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultComplete.js +37 -0
- package/packages/happy2-server/dist/modules/plugin/pluginFunctionResultComplete.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginGetImage.d.ts +17 -0
- package/packages/happy2-server/dist/modules/plugin/pluginGetImage.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginGetImage.js +29 -0
- package/packages/happy2-server/dist/modules/plugin/pluginGetImage.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstall.d.ts +27 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstall.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstall.js +180 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstall.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.d.ts +9 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js +122 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetStatus.d.ts +11 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetStatus.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetStatus.js +18 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetStatus.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationList.d.ts +8 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationList.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationList.js +19 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationList.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.d.ts +14 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.js +20 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListIds.d.ts +7 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListIds.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListIds.js +13 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListIds.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListReadyMcpIds.d.ts +7 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListReadyMcpIds.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListReadyMcpIds.js +16 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationListReadyMcpIds.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.d.ts +16 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.js +38 -0
- package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginList.d.ts +8 -0
- package/packages/happy2-server/dist/modules/plugin/pluginList.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginList.js +17 -0
- package/packages/happy2-server/dist/modules/plugin/pluginList.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.d.ts +11 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.js +43 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.d.ts +15 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.js +37 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.d.ts +16 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.js +71 -0
- package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginRemoveMissingBuiltins.d.ts +14 -0
- package/packages/happy2-server/dist/modules/plugin/pluginRemoveMissingBuiltins.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/pluginRemoveMissingBuiltins.js +51 -0
- package/packages/happy2-server/dist/modules/plugin/pluginRemoveMissingBuiltins.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/runtime.d.ts +56 -0
- package/packages/happy2-server/dist/modules/plugin/runtime.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/runtime.js +147 -0
- package/packages/happy2-server/dist/modules/plugin/runtime.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.d.ts +17 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.js +56 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.test.js +14 -0
- package/packages/happy2-server/dist/modules/plugin/secrets.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/service.d.ts +60 -0
- package/packages/happy2-server/dist/modules/plugin/service.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/service.js +584 -0
- package/packages/happy2-server/dist/modules/plugin/service.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/types.d.ts +194 -0
- package/packages/happy2-server/dist/modules/plugin/types.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/types.js +10 -0
- package/packages/happy2-server/dist/modules/plugin/types.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.d.ts +19 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.js +97 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.test.js +74 -0
- package/packages/happy2-server/dist/modules/plugin/utils/ndjsonStreamTransport.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.d.ts +29 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.js +126 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.js.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.test.js +75 -0
- package/packages/happy2-server/dist/modules/plugin/utils/remoteMcpTransport.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/sandbox/index.d.ts +1 -1
- package/packages/happy2-server/dist/modules/sandbox/index.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.d.ts +9 -1
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.js +218 -4
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.js.map +1 -1
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.test.js +157 -2
- package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.test.js.map +1 -1
- package/packages/happy2-server/dist/modules/sandbox/types.d.ts +24 -0
- package/packages/happy2-server/dist/modules/sandbox/types.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/schema.d.ts +7781 -5489
- package/packages/happy2-server/dist/modules/schema.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/schema.js +87 -1
- package/packages/happy2-server/dist/modules/schema.js.map +1 -1
- package/packages/happy2-server/dist/modules/sync/syncGetDifference.d.ts.map +1 -1
- package/packages/happy2-server/dist/modules/sync/syncGetDifference.js +2 -0
- package/packages/happy2-server/dist/modules/sync/syncGetDifference.js.map +1 -1
- package/packages/happy2-server/dist/routes/pluginHost.d.ts +6 -0
- package/packages/happy2-server/dist/routes/pluginHost.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/pluginHost.js +37 -0
- package/packages/happy2-server/dist/routes/pluginHost.js.map +1 -0
- package/packages/happy2-server/dist/routes/plugins.d.ts +8 -0
- package/packages/happy2-server/dist/routes/plugins.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/plugins.js +198 -0
- package/packages/happy2-server/dist/routes/plugins.js.map +1 -0
- package/packages/happy2-server/dist/runner.js +64 -19
- package/packages/happy2-server/dist/runner.js.map +1 -1
- package/packages/happy2-server/dist/server.d.ts +8 -0
- package/packages/happy2-server/dist/server.d.ts.map +1 -1
- package/packages/happy2-server/dist/server.js +65 -3
- package/packages/happy2-server/dist/server.js.map +1 -1
- package/packages/happy2-server/dist/systemService.d.ts +48 -0
- package/packages/happy2-server/dist/systemService.d.ts.map +1 -0
- package/packages/happy2-server/dist/systemService.js +323 -0
- package/packages/happy2-server/dist/systemService.js.map +1 -0
- package/packages/happy2-server/dist/systemService.test.d.ts +2 -0
- package/packages/happy2-server/dist/systemService.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/systemService.test.js +280 -0
- package/packages/happy2-server/dist/systemService.test.js.map +1 -0
- package/packages/happy2-server/dist/web/assets/index-9SGCQLg7.js +46 -0
- package/packages/happy2-server/dist/web/assets/{index-DZ1uRLgV.css → index-DWXBQDJB.css} +1 -1
- package/packages/happy2-server/dist/web/index.html +2 -2
- package/packages/happy2-server/drizzle/0020_plugins.sql +61 -0
- package/packages/happy2-server/drizzle/0021_plugin_function_results.sql +11 -0
- package/packages/happy2-server/drizzle/0022_plugin_container_runtime_tools.sql +16 -0
- package/packages/happy2-server/drizzle/meta/_journal.json +21 -0
- package/packages/happy2-server/happy2.example.toml +13 -0
- package/packages/happy2-server/plugins/README.md +7 -0
- package/packages/happy2-server/plugins/hello/container/Dockerfile +6 -0
- package/packages/happy2-server/plugins/hello/plugin.json +16 -0
- package/packages/happy2-server/plugins/hello/plugin.png +0 -0
- package/packages/happy2-server/plugins/hello/server.mjs +75 -0
- package/packages/happy2-server/plugins/hello/skills/hello/SKILL.md +11 -0
- package/packages/happy2-server/dist/web/assets/index-DH1SOwNV.js +0 -46
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
import type { MutationHint } from "../chat/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Revokes one missing container incarnation in pluginInstallations only if it is still the installation's current authority.
|
|
5
|
+
* The guarded transaction prevents an old health check from invalidating a replacement and publishes the resulting failed lifecycle state.
|
|
6
|
+
*/
|
|
7
|
+
export declare function pluginContainerInstanceInvalidate(executor: DrizzleExecutor, input: {
|
|
8
|
+
installationId: string;
|
|
9
|
+
containerInstanceId: string;
|
|
10
|
+
detail: string;
|
|
11
|
+
}): Promise<MutationHint | undefined>;
|
|
12
|
+
//# sourceMappingURL=pluginContainerInstanceInvalidate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginContainerInstanceInvalidate.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginContainerInstanceInvalidate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,wBAAsB,iCAAiC,CACnD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/E,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAwCnC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
2
|
+
import { withTransaction } from "../drizzle.js";
|
|
3
|
+
import { pluginInstallations } from "../schema.js";
|
|
4
|
+
import { syncSequenceNext } from "../sync/syncSequenceNext.js";
|
|
5
|
+
import { syncEventInsert } from "../sync/syncEventInsert.js";
|
|
6
|
+
import { areaHint } from "../chat/areaHint.js";
|
|
7
|
+
/**
|
|
8
|
+
* Revokes one missing container incarnation in pluginInstallations only if it is still the installation's current authority.
|
|
9
|
+
* The guarded transaction prevents an old health check from invalidating a replacement and publishes the resulting failed lifecycle state.
|
|
10
|
+
*/
|
|
11
|
+
export async function pluginContainerInstanceInvalidate(executor, input) {
|
|
12
|
+
return withTransaction(executor, async (tx) => {
|
|
13
|
+
const [current] = await tx
|
|
14
|
+
.select({ id: pluginInstallations.id })
|
|
15
|
+
.from(pluginInstallations)
|
|
16
|
+
.where(and(eq(pluginInstallations.id, input.installationId), eq(pluginInstallations.containerInstanceId, input.containerInstanceId)))
|
|
17
|
+
.limit(1);
|
|
18
|
+
if (!current)
|
|
19
|
+
return undefined;
|
|
20
|
+
const sequence = await syncSequenceNext(tx);
|
|
21
|
+
const [updated] = await tx
|
|
22
|
+
.update(pluginInstallations)
|
|
23
|
+
.set({
|
|
24
|
+
containerInstanceId: null,
|
|
25
|
+
status: "failed",
|
|
26
|
+
statusDetail: input.detail,
|
|
27
|
+
lastError: "The recorded plugin container is not running.",
|
|
28
|
+
readyAt: null,
|
|
29
|
+
syncSequence: sequence,
|
|
30
|
+
updatedAt: sql `CURRENT_TIMESTAMP`,
|
|
31
|
+
})
|
|
32
|
+
.where(and(eq(pluginInstallations.id, input.installationId), eq(pluginInstallations.containerInstanceId, input.containerInstanceId)))
|
|
33
|
+
.returning({ id: pluginInstallations.id });
|
|
34
|
+
if (!updated)
|
|
35
|
+
return undefined;
|
|
36
|
+
await syncEventInsert(tx, {
|
|
37
|
+
sequence,
|
|
38
|
+
kind: "plugin.failed",
|
|
39
|
+
entityId: input.installationId,
|
|
40
|
+
});
|
|
41
|
+
return areaHint(sequence, "plugins");
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=pluginContainerInstanceInvalidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginContainerInstanceInvalidate.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginContainerInstanceInvalidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACnD,QAAyB,EACzB,KAA8E;IAE9E,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;aACrB,MAAM,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC;aACtC,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CACF,GAAG,CACC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,EAChD,EAAE,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CACzE,CACJ;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;aACrB,MAAM,CAAC,mBAAmB,CAAC;aAC3B,GAAG,CAAC;YACD,mBAAmB,EAAE,IAAI;YACzB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,KAAK,CAAC,MAAM;YAC1B,SAAS,EAAE,+CAA+C;YAC1D,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAA,mBAAmB;SACpC,CAAC;aACD,KAAK,CACF,GAAG,CACC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,EAChD,EAAE,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CACzE,CACJ;aACA,SAAS,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,eAAe,CAAC,EAAE,EAAE;YACtB,QAAQ;YACR,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,KAAK,CAAC,cAAc;SACjC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
/**
|
|
3
|
+
* Finds the durable system plugin for one catalog source so installation orchestration can reuse its immutable package snapshot.
|
|
4
|
+
* This read-only lookup does not mutate durable state and exists to avoid copying package files for ordinary additional installations.
|
|
5
|
+
*/
|
|
6
|
+
export declare function pluginFindBySource(executor: DrizzleExecutor, sourceKind: "builtin", sourceReference: string): Promise<{
|
|
7
|
+
id: string;
|
|
8
|
+
} | undefined>;
|
|
9
|
+
//# sourceMappingURL=pluginFindBySource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFindBySource.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFindBySource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD;;;GAGG;AACH,wBAAsB,kBAAkB,CACpC,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,SAAS,EACrB,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CASrC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { and, eq } from "drizzle-orm";
|
|
2
|
+
import { plugins } from "../schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Finds the durable system plugin for one catalog source so installation orchestration can reuse its immutable package snapshot.
|
|
5
|
+
* This read-only lookup does not mutate durable state and exists to avoid copying package files for ordinary additional installations.
|
|
6
|
+
*/
|
|
7
|
+
export async function pluginFindBySource(executor, sourceKind, sourceReference) {
|
|
8
|
+
const [row] = await executor
|
|
9
|
+
.select({ id: plugins.id })
|
|
10
|
+
.from(plugins)
|
|
11
|
+
.where(and(eq(plugins.sourceKind, sourceKind), eq(plugins.sourceReference, sourceReference)))
|
|
12
|
+
.limit(1);
|
|
13
|
+
return row;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=pluginFindBySource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFindBySource.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFindBySource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,QAAyB,EACzB,UAAqB,EACrB,eAAuB;IAEvB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ;SACvB,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,CACF,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CACxF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACd,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
import type { PluginFunctionResult } from "./types.js";
|
|
3
|
+
export type PluginFunctionResultAcquireResult = {
|
|
4
|
+
kind: "acquired";
|
|
5
|
+
} | {
|
|
6
|
+
kind: "in_progress";
|
|
7
|
+
retryAt: number;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "replay";
|
|
10
|
+
result: PluginFunctionResult;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Creates, replays, waits for, or conditionally takes over the durable pluginFunctionResults lease for one Rig call.
|
|
14
|
+
* The transaction admits one live MCP executor at a time while retaining a completed outcome indefinitely for event redelivery and restart recovery.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pluginFunctionResultAcquire(executor: DrizzleExecutor, input: {
|
|
17
|
+
callId: string;
|
|
18
|
+
leaseExpiresAt: number;
|
|
19
|
+
leaseToken: string;
|
|
20
|
+
now: number;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
}): Promise<PluginFunctionResultAcquireResult>;
|
|
23
|
+
//# sourceMappingURL=pluginFunctionResultAcquire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFunctionResultAcquire.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFunctionResultAcquire.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAC;AAGtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,iCAAiC,GACvC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEvD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACrB,GACF,OAAO,CAAC,iCAAiC,CAAC,CAoD5C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
2
|
+
import { withTransaction } from "../drizzle.js";
|
|
3
|
+
import { pluginFunctionResults } from "../schema.js";
|
|
4
|
+
import { parsePluginFunctionResult } from "./impl/pluginFunctionResult.js";
|
|
5
|
+
/**
|
|
6
|
+
* Creates, replays, waits for, or conditionally takes over the durable pluginFunctionResults lease for one Rig call.
|
|
7
|
+
* The transaction admits one live MCP executor at a time while retaining a completed outcome indefinitely for event redelivery and restart recovery.
|
|
8
|
+
*/
|
|
9
|
+
export async function pluginFunctionResultAcquire(executor, input) {
|
|
10
|
+
return withTransaction(executor, async (tx) => {
|
|
11
|
+
const lockedUntil = new Date(input.leaseExpiresAt).toISOString();
|
|
12
|
+
const [inserted] = await tx
|
|
13
|
+
.insert(pluginFunctionResults)
|
|
14
|
+
.values({
|
|
15
|
+
sessionId: input.sessionId,
|
|
16
|
+
callId: input.callId,
|
|
17
|
+
leaseToken: input.leaseToken,
|
|
18
|
+
lockedUntil,
|
|
19
|
+
})
|
|
20
|
+
.onConflictDoNothing()
|
|
21
|
+
.returning({ callId: pluginFunctionResults.callId });
|
|
22
|
+
if (inserted)
|
|
23
|
+
return { kind: "acquired" };
|
|
24
|
+
const [row] = await tx
|
|
25
|
+
.select({
|
|
26
|
+
lockedUntil: pluginFunctionResults.lockedUntil,
|
|
27
|
+
resolutionJson: pluginFunctionResults.resolutionJson,
|
|
28
|
+
status: pluginFunctionResults.status,
|
|
29
|
+
})
|
|
30
|
+
.from(pluginFunctionResults)
|
|
31
|
+
.where(and(eq(pluginFunctionResults.sessionId, input.sessionId), eq(pluginFunctionResults.callId, input.callId)))
|
|
32
|
+
.limit(1);
|
|
33
|
+
if (!row)
|
|
34
|
+
throw new Error("Plugin function result disappeared during acquisition");
|
|
35
|
+
if (row?.status === "completed") {
|
|
36
|
+
if (row.resolutionJson === null)
|
|
37
|
+
throw new Error("Completed plugin function result is missing its resolution");
|
|
38
|
+
return { kind: "replay", result: parsePluginFunctionResult(row.resolutionJson) };
|
|
39
|
+
}
|
|
40
|
+
if (row?.lockedUntil && Date.parse(row.lockedUntil) > input.now)
|
|
41
|
+
return { kind: "in_progress", retryAt: Date.parse(row.lockedUntil) };
|
|
42
|
+
await tx
|
|
43
|
+
.update(pluginFunctionResults)
|
|
44
|
+
.set({
|
|
45
|
+
leaseToken: input.leaseToken,
|
|
46
|
+
lockedUntil,
|
|
47
|
+
status: "in_progress",
|
|
48
|
+
updatedAt: sql `CURRENT_TIMESTAMP`,
|
|
49
|
+
})
|
|
50
|
+
.where(and(eq(pluginFunctionResults.sessionId, input.sessionId), eq(pluginFunctionResults.callId, input.callId)));
|
|
51
|
+
return { kind: "acquired" };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=pluginFunctionResultAcquire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFunctionResultAcquire.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFunctionResultAcquire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAQ3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC7C,QAAyB,EACzB,KAMC;IAED,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE;aACtB,MAAM,CAAC,qBAAqB,CAAC;aAC7B,MAAM,CAAC;YACJ,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW;SACd,CAAC;aACD,mBAAmB,EAAE;aACrB,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;aACjB,MAAM,CAAC;YACJ,WAAW,EAAE,qBAAqB,CAAC,WAAW;YAC9C,cAAc,EAAE,qBAAqB,CAAC,cAAc;YACpD,MAAM,EAAE,qBAAqB,CAAC,MAAM;SACvC,CAAC;aACD,IAAI,CAAC,qBAAqB,CAAC;aAC3B,KAAK,CACF,GAAG,CACC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACpD,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACjD,CACJ;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACnF,IAAI,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,cAAc,KAAK,IAAI;gBAC3B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAClF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACrF,CAAC;QACD,IAAI,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG;YAC3D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACzE,MAAM,EAAE;aACH,MAAM,CAAC,qBAAqB,CAAC;aAC7B,GAAG,CAAC;YACD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW;YACX,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,GAAG,CAAA,mBAAmB;SACpC,CAAC;aACD,KAAK,CACF,GAAG,CACC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACpD,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACjD,CACJ,CAAC;QACN,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
import type { PluginFunctionResult } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stores the terminal MCP outcome only while the caller owns the pluginFunctionResults lease for the Rig call.
|
|
5
|
+
* Lease fencing prevents a late or superseded executor from replacing the first durable resolution that Rig and every redelivery must observe.
|
|
6
|
+
*/
|
|
7
|
+
export declare function pluginFunctionResultComplete(executor: DrizzleExecutor, input: {
|
|
8
|
+
callId: string;
|
|
9
|
+
leaseToken: string;
|
|
10
|
+
result: PluginFunctionResult;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
}): Promise<PluginFunctionResult>;
|
|
13
|
+
//# sourceMappingURL=pluginFunctionResultComplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFunctionResultComplete.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFunctionResultComplete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAC;AAGtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;GAGG;AACH,wBAAsB,4BAA4B,CAC9C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IACH,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACrB,GACF,OAAO,CAAC,oBAAoB,CAAC,CAsC/B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
2
|
+
import { withTransaction } from "../drizzle.js";
|
|
3
|
+
import { pluginFunctionResults } from "../schema.js";
|
|
4
|
+
import { parsePluginFunctionResult } from "./impl/pluginFunctionResult.js";
|
|
5
|
+
/**
|
|
6
|
+
* Stores the terminal MCP outcome only while the caller owns the pluginFunctionResults lease for the Rig call.
|
|
7
|
+
* Lease fencing prevents a late or superseded executor from replacing the first durable resolution that Rig and every redelivery must observe.
|
|
8
|
+
*/
|
|
9
|
+
export async function pluginFunctionResultComplete(executor, input) {
|
|
10
|
+
return withTransaction(executor, async (tx) => {
|
|
11
|
+
const [completed] = await tx
|
|
12
|
+
.update(pluginFunctionResults)
|
|
13
|
+
.set({
|
|
14
|
+
leaseToken: null,
|
|
15
|
+
lockedUntil: null,
|
|
16
|
+
resolutionJson: JSON.stringify(input.result),
|
|
17
|
+
status: "completed",
|
|
18
|
+
updatedAt: sql `CURRENT_TIMESTAMP`,
|
|
19
|
+
})
|
|
20
|
+
.where(and(eq(pluginFunctionResults.sessionId, input.sessionId), eq(pluginFunctionResults.callId, input.callId), eq(pluginFunctionResults.status, "in_progress"), eq(pluginFunctionResults.leaseToken, input.leaseToken)))
|
|
21
|
+
.returning({ resolutionJson: pluginFunctionResults.resolutionJson });
|
|
22
|
+
if (completed?.resolutionJson)
|
|
23
|
+
return parsePluginFunctionResult(completed.resolutionJson);
|
|
24
|
+
const [winner] = await tx
|
|
25
|
+
.select({
|
|
26
|
+
resolutionJson: pluginFunctionResults.resolutionJson,
|
|
27
|
+
status: pluginFunctionResults.status,
|
|
28
|
+
})
|
|
29
|
+
.from(pluginFunctionResults)
|
|
30
|
+
.where(and(eq(pluginFunctionResults.sessionId, input.sessionId), eq(pluginFunctionResults.callId, input.callId)))
|
|
31
|
+
.limit(1);
|
|
32
|
+
if (winner?.status === "completed" && winner.resolutionJson)
|
|
33
|
+
return parsePluginFunctionResult(winner.resolutionJson);
|
|
34
|
+
throw new Error("Plugin function result lease was lost before completion");
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=pluginFunctionResultComplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginFunctionResultComplete.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginFunctionResultComplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAC9C,QAAyB,EACzB,KAKC;IAED,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QAC1C,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE;aACvB,MAAM,CAAC,qBAAqB,CAAC;aAC7B,GAAG,CAAC;YACD,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5C,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,GAAG,CAAA,mBAAmB;SACpC,CAAC;aACD,KAAK,CACF,GAAG,CACC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACpD,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAC9C,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CACzD,CACJ;aACA,SAAS,CAAC,EAAE,cAAc,EAAE,qBAAqB,CAAC,cAAc,EAAE,CAAC,CAAC;QACzE,IAAI,SAAS,EAAE,cAAc;YAAE,OAAO,yBAAyB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;aACpB,MAAM,CAAC;YACJ,cAAc,EAAE,qBAAqB,CAAC,cAAc;YACpD,MAAM,EAAE,qBAAqB,CAAC,MAAM;SACvC,CAAC;aACD,IAAI,CAAC,qBAAqB,CAAC;aAC3B,KAAK,CACF,GAAG,CACC,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACpD,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACjD,CACJ;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,MAAM,EAAE,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,cAAc;YACvD,OAAO,yBAAyB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
export interface StoredPluginImage {
|
|
3
|
+
pluginId: string;
|
|
4
|
+
shortName: string;
|
|
5
|
+
packageDigest: string;
|
|
6
|
+
packageDirectory: string;
|
|
7
|
+
storageKey: string;
|
|
8
|
+
contentType: string;
|
|
9
|
+
size: number;
|
|
10
|
+
checksumSha256: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns the private filesystem locator and public response metadata for one persisted plugin image after administrator authorization.
|
|
14
|
+
* This read-only boundary does not mutate durable state and prevents routes from reading package paths without a durable plugin record.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pluginGetImage(executor: DrizzleExecutor, actorUserId: string, pluginId: string): Promise<StoredPluginImage>;
|
|
17
|
+
//# sourceMappingURL=pluginGetImage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginGetImage.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginGetImage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAChC,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAkB5B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { plugins } from "../schema.js";
|
|
3
|
+
import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
|
|
4
|
+
import { PluginError } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns the private filesystem locator and public response metadata for one persisted plugin image after administrator authorization.
|
|
7
|
+
* This read-only boundary does not mutate durable state and prevents routes from reading package paths without a durable plugin record.
|
|
8
|
+
*/
|
|
9
|
+
export async function pluginGetImage(executor, actorUserId, pluginId) {
|
|
10
|
+
await userRequireServerAdmin(executor, actorUserId);
|
|
11
|
+
const [row] = await executor
|
|
12
|
+
.select({
|
|
13
|
+
pluginId: plugins.id,
|
|
14
|
+
shortName: plugins.shortName,
|
|
15
|
+
packageDigest: plugins.packageDigest,
|
|
16
|
+
packageDirectory: plugins.packageDirectory,
|
|
17
|
+
storageKey: plugins.imageStorageKey,
|
|
18
|
+
contentType: plugins.imageContentType,
|
|
19
|
+
size: plugins.imageSize,
|
|
20
|
+
checksumSha256: plugins.imageChecksumSha256,
|
|
21
|
+
})
|
|
22
|
+
.from(plugins)
|
|
23
|
+
.where(eq(plugins.id, pluginId))
|
|
24
|
+
.limit(1);
|
|
25
|
+
if (!row)
|
|
26
|
+
throw new PluginError("not_found", "System plugin was not found");
|
|
27
|
+
return row;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=pluginGetImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginGetImage.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginGetImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAazC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,QAAyB,EACzB,WAAmB,EACnB,QAAgB;IAEhB,MAAM,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ;SACvB,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,eAAe;QACnC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QACrC,IAAI,EAAE,OAAO,CAAC,SAAS;QACvB,cAAc,EAAE,OAAO,CAAC,mBAAmB;KAC9C,CAAC;SACD,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;SAC/B,KAAK,CAAC,CAAC,CAAC,CAAC;IACd,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
import type { MutationHint } from "../chat/types.js";
|
|
3
|
+
import type { PluginSecretProtector } from "./secrets.js";
|
|
4
|
+
import { type PluginInstallationSummary, type PluginPackage } from "./types.js";
|
|
5
|
+
export interface PluginPackageCandidate {
|
|
6
|
+
pluginId: string;
|
|
7
|
+
packageDirectory: string;
|
|
8
|
+
imageStorageKey: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Ensures one catalog package has a durable system plugin, then creates an independent installation with its own encrypted variables and container choice.
|
|
12
|
+
* The transaction commits plugins, pluginInstallations, pluginInstallationVariables, audit, and sync evidence together so no installation can reference a partial plugin record.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pluginInstall(executor: DrizzleExecutor, secretProtector: PluginSecretProtector, input: {
|
|
15
|
+
actorUserId: string;
|
|
16
|
+
installationId: string;
|
|
17
|
+
plugin: PluginPackage;
|
|
18
|
+
candidate?: PluginPackageCandidate;
|
|
19
|
+
variables: Readonly<Record<string, string>>;
|
|
20
|
+
containerImageId?: string;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
hint: MutationHint;
|
|
23
|
+
installation: PluginInstallationSummary;
|
|
24
|
+
pluginCreated: boolean;
|
|
25
|
+
pluginId: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=pluginInstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginInstall.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAarD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAEH,KAAK,yBAAyB,EAE9B,KAAK,aAAa,EACrB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,qBAAqB,EACtC,KAAK,EAAE;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,GACF,OAAO,CAAC;IACP,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,yBAAyB,CAAC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC,CAmKD"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { and, eq } from "drizzle-orm";
|
|
2
|
+
import { withTransaction } from "../drizzle.js";
|
|
3
|
+
import { agentImages, pluginInstallations, pluginInstallationVariables, plugins, } from "../schema.js";
|
|
4
|
+
import { userRequireServerAdmin } from "../chat/userRequireServerAdmin.js";
|
|
5
|
+
import { chatAppendAudit } from "../chat/chatAppendAudit.js";
|
|
6
|
+
import { syncSequenceNext } from "../sync/syncSequenceNext.js";
|
|
7
|
+
import { syncEventInsert } from "../sync/syncEventInsert.js";
|
|
8
|
+
import { areaHint } from "../chat/areaHint.js";
|
|
9
|
+
import { PluginError, } from "./types.js";
|
|
10
|
+
import { pluginInstallationSelection } from "./impl/installationSelection.js";
|
|
11
|
+
import { asPluginInstallation } from "./impl/asInstallation.js";
|
|
12
|
+
import { installedManifest } from "./impl/installedManifest.js";
|
|
13
|
+
import { effectiveContainer } from "./impl/effectiveContainer.js";
|
|
14
|
+
const MAX_VARIABLE_BYTES = 64 * 1024;
|
|
15
|
+
/**
|
|
16
|
+
* Ensures one catalog package has a durable system plugin, then creates an independent installation with its own encrypted variables and container choice.
|
|
17
|
+
* The transaction commits plugins, pluginInstallations, pluginInstallationVariables, audit, and sync evidence together so no installation can reference a partial plugin record.
|
|
18
|
+
*/
|
|
19
|
+
export async function pluginInstall(executor, secretProtector, input) {
|
|
20
|
+
return withTransaction(executor, async (tx) => {
|
|
21
|
+
await userRequireServerAdmin(tx, input.actorUserId);
|
|
22
|
+
const [existing] = await tx
|
|
23
|
+
.select({ id: plugins.id, manifestJson: plugins.manifestJson })
|
|
24
|
+
.from(plugins)
|
|
25
|
+
.where(and(eq(plugins.sourceKind, input.plugin.source.kind), eq(plugins.sourceReference, input.plugin.source.reference)))
|
|
26
|
+
.limit(1);
|
|
27
|
+
let pluginId;
|
|
28
|
+
let manifest;
|
|
29
|
+
let pluginCreated = false;
|
|
30
|
+
if (existing) {
|
|
31
|
+
pluginId = existing.id;
|
|
32
|
+
manifest = installedManifest(existing.manifestJson);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (!input.candidate)
|
|
36
|
+
throw new Error("A new system plugin requires a persisted package candidate");
|
|
37
|
+
pluginId = input.candidate.pluginId;
|
|
38
|
+
manifest = input.plugin.manifest;
|
|
39
|
+
await tx.insert(plugins).values({
|
|
40
|
+
id: pluginId,
|
|
41
|
+
displayName: manifest.displayName,
|
|
42
|
+
shortName: manifest.shortName,
|
|
43
|
+
description: manifest.description,
|
|
44
|
+
sourceKind: input.plugin.source.kind,
|
|
45
|
+
sourceReference: input.plugin.source.reference,
|
|
46
|
+
sourceVersion: manifest.version,
|
|
47
|
+
packageDigest: input.plugin.packageDigest,
|
|
48
|
+
manifestJson: JSON.stringify(manifest),
|
|
49
|
+
packageDirectory: input.candidate.packageDirectory,
|
|
50
|
+
imageStorageKey: input.candidate.imageStorageKey,
|
|
51
|
+
imageContentType: input.plugin.image.contentType,
|
|
52
|
+
imageSize: input.plugin.image.size,
|
|
53
|
+
imageWidth: input.plugin.image.width,
|
|
54
|
+
imageHeight: input.plugin.image.height,
|
|
55
|
+
imageThumbhash: input.plugin.image.thumbhash,
|
|
56
|
+
imageChecksumSha256: input.plugin.image.checksumSha256,
|
|
57
|
+
installedByUserId: input.actorUserId,
|
|
58
|
+
});
|
|
59
|
+
pluginCreated = true;
|
|
60
|
+
}
|
|
61
|
+
const definitions = manifest.variables;
|
|
62
|
+
const mcp = manifest.mcp;
|
|
63
|
+
const localContainer = effectiveContainer(manifest);
|
|
64
|
+
validateVariables(definitions, input.variables);
|
|
65
|
+
const selectionRequired = Boolean(localContainer && !localContainer.dockerfile);
|
|
66
|
+
if (selectionRequired && !input.containerImageId)
|
|
67
|
+
throw new PluginError("broken_configuration", "containerImageId is required for this stdio MCP plugin");
|
|
68
|
+
if (!selectionRequired && input.containerImageId)
|
|
69
|
+
throw new PluginError("broken_configuration", "containerImageId is not accepted for this plugin");
|
|
70
|
+
if (input.containerImageId) {
|
|
71
|
+
const [image] = await tx
|
|
72
|
+
.select({ id: agentImages.id })
|
|
73
|
+
.from(agentImages)
|
|
74
|
+
.where(and(eq(agentImages.id, input.containerImageId), eq(agentImages.status, "ready")))
|
|
75
|
+
.limit(1);
|
|
76
|
+
if (!image)
|
|
77
|
+
throw new PluginError("broken_configuration", "The selected container image does not exist or is not ready");
|
|
78
|
+
}
|
|
79
|
+
const id = input.installationId;
|
|
80
|
+
const hasRuntime = Boolean(localContainer || mcp?.type === "remote");
|
|
81
|
+
const status = hasRuntime ? "preparing" : "ready";
|
|
82
|
+
const [created] = await tx
|
|
83
|
+
.insert(pluginInstallations)
|
|
84
|
+
.values({
|
|
85
|
+
id,
|
|
86
|
+
pluginId,
|
|
87
|
+
containerImageId: input.containerImageId,
|
|
88
|
+
containerName: localContainer ? `happy2-plugin-${id}` : null,
|
|
89
|
+
status,
|
|
90
|
+
statusDetail: hasRuntime
|
|
91
|
+
? "Plugin runtime is queued for preparation."
|
|
92
|
+
: "Plugin skills are installed.",
|
|
93
|
+
installedByUserId: input.actorUserId,
|
|
94
|
+
readyAt: hasRuntime ? null : new Date().toISOString(),
|
|
95
|
+
})
|
|
96
|
+
.returning({ id: pluginInstallations.id });
|
|
97
|
+
if (!created)
|
|
98
|
+
throw new Error("Plugin installation was not created");
|
|
99
|
+
for (const definition of definitions) {
|
|
100
|
+
const value = input.variables[definition.key];
|
|
101
|
+
await tx.insert(pluginInstallationVariables).values({
|
|
102
|
+
installationId: id,
|
|
103
|
+
key: definition.key,
|
|
104
|
+
kind: definition.kind,
|
|
105
|
+
...(definition.kind === "secret"
|
|
106
|
+
? {
|
|
107
|
+
secretCiphertext: await secretProtector.protect(value, {
|
|
108
|
+
installationId: id,
|
|
109
|
+
key: definition.key,
|
|
110
|
+
}),
|
|
111
|
+
}
|
|
112
|
+
: { textValue: value }),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
await chatAppendAudit(tx, {
|
|
116
|
+
actorUserId: input.actorUserId,
|
|
117
|
+
action: "plugin.installed",
|
|
118
|
+
targetType: "plugin_installation",
|
|
119
|
+
targetId: id,
|
|
120
|
+
after: {
|
|
121
|
+
pluginId,
|
|
122
|
+
shortName: manifest.shortName,
|
|
123
|
+
version: manifest.version,
|
|
124
|
+
mcpType: mcp?.type,
|
|
125
|
+
container: Boolean(localContainer),
|
|
126
|
+
containerPermissions: localContainer?.permissions ?? [],
|
|
127
|
+
variableKeys: definitions.map(({ key }) => key),
|
|
128
|
+
containerImageId: input.containerImageId,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const sequence = await syncSequenceNext(tx);
|
|
132
|
+
if (pluginCreated)
|
|
133
|
+
await tx
|
|
134
|
+
.update(plugins)
|
|
135
|
+
.set({ syncSequence: sequence })
|
|
136
|
+
.where(eq(plugins.id, pluginId));
|
|
137
|
+
const [updated] = await tx
|
|
138
|
+
.update(pluginInstallations)
|
|
139
|
+
.set({ syncSequence: sequence })
|
|
140
|
+
.where(eq(pluginInstallations.id, id))
|
|
141
|
+
.returning({ id: pluginInstallations.id });
|
|
142
|
+
if (!updated)
|
|
143
|
+
throw new Error("Plugin installation was not updated");
|
|
144
|
+
await syncEventInsert(tx, {
|
|
145
|
+
sequence,
|
|
146
|
+
kind: "plugin.installed",
|
|
147
|
+
entityId: id,
|
|
148
|
+
actorUserId: input.actorUserId,
|
|
149
|
+
});
|
|
150
|
+
const [projection] = await tx
|
|
151
|
+
.select(pluginInstallationSelection)
|
|
152
|
+
.from(pluginInstallations)
|
|
153
|
+
.innerJoin(plugins, eq(pluginInstallations.pluginId, plugins.id))
|
|
154
|
+
.where(eq(pluginInstallations.id, id))
|
|
155
|
+
.limit(1);
|
|
156
|
+
if (!projection)
|
|
157
|
+
throw new Error("Plugin installation projection was not found");
|
|
158
|
+
return {
|
|
159
|
+
hint: areaHint(sequence, "plugins"),
|
|
160
|
+
installation: asPluginInstallation(projection),
|
|
161
|
+
pluginCreated,
|
|
162
|
+
pluginId,
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function validateVariables(definitions, values) {
|
|
167
|
+
const expected = new Set(definitions.map(({ key }) => key));
|
|
168
|
+
const unexpected = Object.keys(values).find((key) => !expected.has(key));
|
|
169
|
+
if (unexpected)
|
|
170
|
+
throw new PluginError("broken_configuration", `Unexpected plugin variable ${unexpected}`);
|
|
171
|
+
for (const definition of definitions) {
|
|
172
|
+
const value = values[definition.key];
|
|
173
|
+
if (typeof value !== "string" ||
|
|
174
|
+
!value ||
|
|
175
|
+
value.includes("\u0000") ||
|
|
176
|
+
Buffer.byteLength(value, "utf8") > MAX_VARIABLE_BYTES)
|
|
177
|
+
throw new PluginError("broken_configuration", `${definition.key} must be a valid environment value between 1 byte and 64 KiB`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=pluginInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginInstall.js","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstall.ts"],"names":[],"mappings":"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"}
|
package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DrizzleExecutor } from "../drizzle.js";
|
|
2
|
+
import type { PluginSecretProtector } from "./secrets.js";
|
|
3
|
+
import { type PluginRuntimeConfiguration } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves one installed manifest into its private runtime configuration, revealing encrypted values only for process environment or remote header materialization.
|
|
6
|
+
* This read-only boundary does not mutate durable state and keeps secret recovery out of routes, catalog projections, and lifecycle orchestration.
|
|
7
|
+
*/
|
|
8
|
+
export declare function pluginInstallationGetRuntimeConfiguration(executor: DrizzleExecutor, secretProtector: PluginSecretProtector, installationId: string): Promise<PluginRuntimeConfiguration>;
|
|
9
|
+
//# sourceMappingURL=pluginInstallationGetRuntimeConfiguration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginInstallationGetRuntimeConfiguration.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/pluginInstallationGetRuntimeConfiguration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAe,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAI1E;;;GAGG;AACH,wBAAsB,yCAAyC,CAC3D,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,qBAAqB,EACtC,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAoIrC"}
|