happy2 0.0.11 → 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.
Files changed (133) hide show
  1. package/README.md +10 -0
  2. package/package.json +1 -1
  3. package/packages/happy2-server/PLUGINS.md +106 -34
  4. package/packages/happy2-server/README.md +11 -0
  5. package/packages/happy2-server/dist/daemon.d.ts +39 -0
  6. package/packages/happy2-server/dist/daemon.d.ts.map +1 -0
  7. package/packages/happy2-server/dist/daemon.js +302 -0
  8. package/packages/happy2-server/dist/daemon.js.map +1 -0
  9. package/packages/happy2-server/dist/daemon.test.d.ts +2 -0
  10. package/packages/happy2-server/dist/daemon.test.d.ts.map +1 -0
  11. package/packages/happy2-server/dist/daemon.test.js +245 -0
  12. package/packages/happy2-server/dist/daemon.test.js.map +1 -0
  13. package/packages/happy2-server/dist/index.d.ts +1 -1
  14. package/packages/happy2-server/dist/index.d.ts.map +1 -1
  15. package/packages/happy2-server/dist/index.js +1 -1
  16. package/packages/happy2-server/dist/index.js.map +1 -1
  17. package/packages/happy2-server/dist/modules/auth/tokens.d.ts +7 -0
  18. package/packages/happy2-server/dist/modules/auth/tokens.d.ts.map +1 -1
  19. package/packages/happy2-server/dist/modules/auth/tokens.js +33 -0
  20. package/packages/happy2-server/dist/modules/auth/tokens.js.map +1 -1
  21. package/packages/happy2-server/dist/modules/auth/tokens.test.d.ts +2 -0
  22. package/packages/happy2-server/dist/modules/auth/tokens.test.d.ts.map +1 -0
  23. package/packages/happy2-server/dist/modules/auth/tokens.test.js +28 -0
  24. package/packages/happy2-server/dist/modules/auth/tokens.test.js.map +1 -0
  25. package/packages/happy2-server/dist/modules/config/defaults.d.ts.map +1 -1
  26. package/packages/happy2-server/dist/modules/config/defaults.js +2 -0
  27. package/packages/happy2-server/dist/modules/config/defaults.js.map +1 -1
  28. package/packages/happy2-server/dist/modules/config/loader.d.ts.map +1 -1
  29. package/packages/happy2-server/dist/modules/config/loader.js +5 -0
  30. package/packages/happy2-server/dist/modules/config/loader.js.map +1 -1
  31. package/packages/happy2-server/dist/modules/config/loader.test.js +15 -0
  32. package/packages/happy2-server/dist/modules/config/loader.test.js.map +1 -1
  33. package/packages/happy2-server/dist/modules/config/type.d.ts +2 -0
  34. package/packages/happy2-server/dist/modules/config/type.d.ts.map +1 -1
  35. package/packages/happy2-server/dist/modules/plugin/catalog.d.ts.map +1 -1
  36. package/packages/happy2-server/dist/modules/plugin/catalog.js +45 -4
  37. package/packages/happy2-server/dist/modules/plugin/catalog.js.map +1 -1
  38. package/packages/happy2-server/dist/modules/plugin/catalog.test.js +33 -0
  39. package/packages/happy2-server/dist/modules/plugin/catalog.test.js.map +1 -1
  40. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.d.ts.map +1 -1
  41. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js +14 -1
  42. package/packages/happy2-server/dist/modules/plugin/impl/asPlugin.js.map +1 -1
  43. package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.d.ts +3 -0
  44. package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.d.ts.map +1 -0
  45. package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.js +12 -0
  46. package/packages/happy2-server/dist/modules/plugin/impl/effectiveContainer.js.map +1 -0
  47. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.d.ts.map +1 -1
  48. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js +11 -0
  49. package/packages/happy2-server/dist/modules/plugin/impl/installedManifest.js.map +1 -1
  50. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.d.ts.map +1 -1
  51. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js +15 -1
  52. package/packages/happy2-server/dist/modules/plugin/pluginCatalogList.js.map +1 -1
  53. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.d.ts +10 -0
  54. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.d.ts.map +1 -0
  55. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.js +20 -0
  56. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceAuthorize.js.map +1 -0
  57. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.d.ts +12 -0
  58. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.d.ts.map +1 -0
  59. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.js +44 -0
  60. package/packages/happy2-server/dist/modules/plugin/pluginContainerInstanceInvalidate.js.map +1 -0
  61. package/packages/happy2-server/dist/modules/plugin/pluginInstall.d.ts.map +1 -1
  62. package/packages/happy2-server/dist/modules/plugin/pluginInstall.js +10 -5
  63. package/packages/happy2-server/dist/modules/plugin/pluginInstall.js.map +1 -1
  64. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.d.ts.map +1 -1
  65. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js +18 -7
  66. package/packages/happy2-server/dist/modules/plugin/pluginInstallationGetRuntimeConfiguration.js.map +1 -1
  67. package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.d.ts +14 -0
  68. package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.d.ts.map +1 -0
  69. package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.js +20 -0
  70. package/packages/happy2-server/dist/modules/plugin/pluginInstallationListForHost.js.map +1 -0
  71. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.d.ts +1 -0
  72. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.d.ts.map +1 -1
  73. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.js +1 -0
  74. package/packages/happy2-server/dist/modules/plugin/pluginInstallationUpdateStatus.js.map +1 -1
  75. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.d.ts +11 -0
  76. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.d.ts.map +1 -0
  77. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.js +43 -0
  78. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsList.js.map +1 -0
  79. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.d.ts +15 -0
  80. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.d.ts.map +1 -0
  81. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.js +37 -0
  82. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsListReady.js.map +1 -0
  83. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.d.ts +16 -0
  84. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.d.ts.map +1 -0
  85. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.js +71 -0
  86. package/packages/happy2-server/dist/modules/plugin/pluginMcpToolsReplace.js.map +1 -0
  87. package/packages/happy2-server/dist/modules/plugin/runtime.d.ts +19 -0
  88. package/packages/happy2-server/dist/modules/plugin/runtime.d.ts.map +1 -1
  89. package/packages/happy2-server/dist/modules/plugin/runtime.js +87 -2
  90. package/packages/happy2-server/dist/modules/plugin/runtime.js.map +1 -1
  91. package/packages/happy2-server/dist/modules/plugin/service.d.ts +12 -4
  92. package/packages/happy2-server/dist/modules/plugin/service.d.ts.map +1 -1
  93. package/packages/happy2-server/dist/modules/plugin/service.js +216 -170
  94. package/packages/happy2-server/dist/modules/plugin/service.js.map +1 -1
  95. package/packages/happy2-server/dist/modules/plugin/types.d.ts +40 -3
  96. package/packages/happy2-server/dist/modules/plugin/types.d.ts.map +1 -1
  97. package/packages/happy2-server/dist/modules/plugin/types.js +1 -0
  98. package/packages/happy2-server/dist/modules/plugin/types.js.map +1 -1
  99. package/packages/happy2-server/dist/modules/sandbox/index.d.ts +1 -1
  100. package/packages/happy2-server/dist/modules/sandbox/index.d.ts.map +1 -1
  101. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.d.ts +8 -1
  102. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.d.ts.map +1 -1
  103. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.js +101 -1
  104. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.js.map +1 -1
  105. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.test.js +78 -2
  106. package/packages/happy2-server/dist/modules/sandbox/localOciSandboxProvider.test.js.map +1 -1
  107. package/packages/happy2-server/dist/modules/sandbox/types.d.ts +16 -0
  108. package/packages/happy2-server/dist/modules/sandbox/types.d.ts.map +1 -1
  109. package/packages/happy2-server/dist/modules/schema.d.ts +394 -0
  110. package/packages/happy2-server/dist/modules/schema.d.ts.map +1 -1
  111. package/packages/happy2-server/dist/modules/schema.js +15 -0
  112. package/packages/happy2-server/dist/modules/schema.js.map +1 -1
  113. package/packages/happy2-server/dist/routes/pluginHost.d.ts +6 -0
  114. package/packages/happy2-server/dist/routes/pluginHost.d.ts.map +1 -0
  115. package/packages/happy2-server/dist/routes/pluginHost.js +37 -0
  116. package/packages/happy2-server/dist/routes/pluginHost.js.map +1 -0
  117. package/packages/happy2-server/dist/routes/plugins.d.ts.map +1 -1
  118. package/packages/happy2-server/dist/routes/plugins.js +12 -0
  119. package/packages/happy2-server/dist/routes/plugins.js.map +1 -1
  120. package/packages/happy2-server/dist/runner.js +20 -1
  121. package/packages/happy2-server/dist/runner.js.map +1 -1
  122. package/packages/happy2-server/dist/server.d.ts +2 -0
  123. package/packages/happy2-server/dist/server.d.ts.map +1 -1
  124. package/packages/happy2-server/dist/server.js +20 -1
  125. package/packages/happy2-server/dist/server.js.map +1 -1
  126. package/packages/happy2-server/dist/systemService.d.ts.map +1 -1
  127. package/packages/happy2-server/dist/systemService.js +16 -1
  128. package/packages/happy2-server/dist/systemService.js.map +1 -1
  129. package/packages/happy2-server/dist/systemService.test.js +15 -1
  130. package/packages/happy2-server/dist/systemService.test.js.map +1 -1
  131. package/packages/happy2-server/drizzle/0022_plugin_container_runtime_tools.sql +16 -0
  132. package/packages/happy2-server/drizzle/meta/_journal.json +7 -0
  133. package/packages/happy2-server/happy2.example.toml +8 -0
@@ -1,5 +1,8 @@
1
1
  import { PluginError } from "./types.js";
2
2
  import { NdjsonStreamTransport } from "./utils/ndjsonStreamTransport.js";
3
+ const COMMAND_MONITOR_STARTUP_CHECKS = 20;
4
+ const COMMAND_MONITOR_STARTUP_INTERVAL_MS = 50;
5
+ const COMMAND_MONITOR_STEADY_INTERVAL_MS = 5_000;
3
6
  /** Runs stdio MCP packages in dedicated containers owned by the selected local sandbox provider. */
4
7
  export class SandboxPluginMcpRuntime {
5
8
  provider;
@@ -12,6 +15,15 @@ export class SandboxPluginMcpRuntime {
12
15
  throw new PluginError("broken_configuration", `${provider.displayName} does not support plugin containers`);
13
16
  if (input.build && input.build.tag !== input.imageTag)
14
17
  throw new Error("Plugin build and runtime image tags must match");
18
+ const existing = await provider.inspectPluginSandbox?.(input.containerName, signal);
19
+ if (existing?.running &&
20
+ existing.installationId === input.installationId &&
21
+ existing.containerInstanceId === input.existingContainerInstanceId)
22
+ return {
23
+ containerInstanceId: existing.containerInstanceId,
24
+ imageTag: input.imageTag,
25
+ reused: true,
26
+ };
15
27
  await provider.removeSandbox(input.containerName);
16
28
  if (input.build)
17
29
  await provider.buildImage({
@@ -21,10 +33,15 @@ export class SandboxPluginMcpRuntime {
21
33
  }, { signal });
22
34
  await provider.createPluginSandbox({
23
35
  containerName: input.containerName,
36
+ containerInstanceId: input.containerInstanceId,
24
37
  imageTag: input.imageTag,
25
38
  installationId: input.installationId,
26
39
  }, signal);
27
- return { imageTag: input.imageTag };
40
+ return {
41
+ containerInstanceId: input.containerInstanceId,
42
+ imageTag: input.imageTag,
43
+ reused: false,
44
+ };
28
45
  }
29
46
  async openLocal(input, signal) {
30
47
  const provider = await this.localProvider();
@@ -41,9 +58,44 @@ export class SandboxPluginMcpRuntime {
41
58
  }
42
59
  return new NdjsonStreamTransport(handle);
43
60
  }
61
+ async startLocalCommand(input, signal) {
62
+ const provider = await this.localProvider();
63
+ if (!provider.startPluginCommand)
64
+ throw new PluginError("broken_configuration", `${provider.displayName} does not support persistent plugin commands`);
65
+ try {
66
+ await provider.startPluginCommand({
67
+ containerName: input.containerName,
68
+ command: [input.command, ...input.args],
69
+ environment: input.environment,
70
+ }, signal);
71
+ return await this.monitorLocalCommand(input.containerName, signal);
72
+ }
73
+ catch (error) {
74
+ throw new PluginError("broken_configuration", error instanceof Error ? error.message : "Plugin command could not start");
75
+ }
76
+ }
77
+ async monitorLocalCommand(containerName, signal) {
78
+ const provider = await this.localProvider();
79
+ if (!provider.isPluginCommandRunning)
80
+ throw new PluginError("broken_configuration", `${provider.displayName} cannot monitor persistent plugin commands`);
81
+ const controller = new AbortController();
82
+ const abort = () => controller.abort();
83
+ signal?.addEventListener("abort", abort, { once: true });
84
+ const wait = monitorPluginCommand(provider, containerName, controller.signal).finally(() => signal?.removeEventListener("abort", abort));
85
+ return {
86
+ wait,
87
+ close: () => controller.abort(),
88
+ };
89
+ }
44
90
  async removeLocal(containerName) {
45
91
  await (await this.localProvider()).removeSandbox(containerName);
46
92
  }
93
+ async isLocalRunning(containerName, installationId, containerInstanceId) {
94
+ const state = await (await this.localProvider()).inspectPluginSandbox?.(containerName);
95
+ return Boolean(state?.running &&
96
+ state.installationId === installationId &&
97
+ state.containerInstanceId === containerInstanceId);
98
+ }
47
99
  async localProvider() {
48
100
  let provider;
49
101
  try {
@@ -55,8 +107,41 @@ export class SandboxPluginMcpRuntime {
55
107
  : "A local sandbox provider is not configured");
56
108
  }
57
109
  if (provider.locality !== "local")
58
- throw new PluginError("broken_configuration", "Stdio MCP plugins require a local sandbox provider");
110
+ throw new PluginError("broken_configuration", "Container plugins require a local sandbox provider");
59
111
  return provider;
60
112
  }
61
113
  }
114
+ async function monitorPluginCommand(provider, containerName, signal) {
115
+ let completedChecks = 0;
116
+ while (!signal.aborted) {
117
+ try {
118
+ if (!(await provider.isPluginCommandRunning(containerName, signal)))
119
+ return { exitCode: null, signal: null };
120
+ }
121
+ catch {
122
+ if (signal.aborted)
123
+ break;
124
+ // A temporary OCI daemon failure must not revoke a still-running incarnation.
125
+ }
126
+ completedChecks += 1;
127
+ await monitorDelay(signal, completedChecks < COMMAND_MONITOR_STARTUP_CHECKS
128
+ ? COMMAND_MONITOR_STARTUP_INTERVAL_MS
129
+ : COMMAND_MONITOR_STEADY_INTERVAL_MS);
130
+ }
131
+ return { exitCode: null, signal: "SIGTERM" };
132
+ }
133
+ function monitorDelay(signal, milliseconds) {
134
+ if (signal.aborted)
135
+ return Promise.resolve();
136
+ return new Promise((resolve) => {
137
+ const timeout = setTimeout(finish, milliseconds);
138
+ const abort = () => finish();
139
+ function finish() {
140
+ clearTimeout(timeout);
141
+ signal.removeEventListener("abort", abort);
142
+ resolve();
143
+ }
144
+ signal.addEventListener("abort", abort, { once: true });
145
+ });
146
+ }
62
147
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../sources/modules/plugin/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../sources/modules/plugin/runtime.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,12 @@ import type { DrizzleExecutor } from "../drizzle.js";
3
3
  import type { PubSub } from "../realtime/index.js";
4
4
  import type { WebhookUrlPolicy } from "../integrations/ssrf.js";
5
5
  import type { WebhookTransport } from "../integrations/types.js";
6
+ import type { TokenService } from "../auth/tokens.js";
6
7
  import type { PluginCatalog } from "./catalog.js";
7
8
  import type { PluginPackageStore } from "./packageStore.js";
8
9
  import type { PluginMcpRuntime } from "./runtime.js";
9
10
  import type { PluginSecretProtector } from "./secrets.js";
10
- import { type PluginFunctionDefinition, type PluginFunctionResult, type PluginInstallationSummary } from "./types.js";
11
+ import { type PluginFunctionDefinition, type PluginFunctionResult, type PluginHostPermission, type PluginInstallationSummary } from "./types.js";
11
12
  /** Coordinates durable plugin installs with asynchronous container preparation, MCP health probes, restart recovery, and local connection creation. */
12
13
  export declare class PluginService {
13
14
  private readonly executor;
@@ -16,13 +17,15 @@ export declare class PluginService {
16
17
  private readonly packages;
17
18
  private readonly secrets;
18
19
  private readonly runtime;
20
+ private readonly tokens;
19
21
  private readonly urlPolicy;
20
22
  private readonly remoteTransport;
23
+ private readonly hostApiUrl;
21
24
  private readonly onError;
22
25
  private readonly activations;
23
- private readonly localContainers;
26
+ private readonly commandHandles;
24
27
  private closed;
25
- constructor(executor: DrizzleExecutor, pubsub: PubSub, catalog: PluginCatalog, packages: PluginPackageStore, secrets: PluginSecretProtector, runtime: PluginMcpRuntime, urlPolicy: WebhookUrlPolicy, remoteTransport: WebhookTransport, onError: (error: unknown) => void);
28
+ constructor(executor: DrizzleExecutor, pubsub: PubSub, catalog: PluginCatalog, packages: PluginPackageStore, secrets: PluginSecretProtector, runtime: PluginMcpRuntime, tokens: TokenService, urlPolicy: WebhookUrlPolicy, remoteTransport: WebhookTransport, hostApiUrl: string, onError: (error: unknown) => void);
26
29
  start(): Promise<void>;
27
30
  install(input: {
28
31
  actorUserId: string;
@@ -37,16 +40,21 @@ export declare class PluginService {
37
40
  }>;
38
41
  openLocal(installationId: string): Promise<Transport>;
39
42
  listFunctions(signal?: AbortSignal): Promise<readonly PluginFunctionDefinition[]>;
40
- private listFunctionsWithSignal;
41
43
  callFunction(functionName: string, args: unknown, signal?: AbortSignal): Promise<PluginFunctionResult>;
42
44
  private callFunctionWithSignal;
45
+ authorizeHost(token: string, permission: PluginHostPermission): Promise<string>;
43
46
  close(): Promise<void>;
44
47
  private activate;
45
48
  private withClient;
46
49
  private runActivation;
47
50
  private probeLocal;
51
+ private discoverTools;
48
52
  private probeRemote;
49
53
  private status;
50
54
  private publish;
55
+ private closeCommand;
56
+ private monitorCommand;
57
+ private runtimeEnvironment;
58
+ private pluginRuntimeToken;
51
59
  }
52
60
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAUjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAEH,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAEjC,MAAM,YAAY,CAAC;AAOpB,uJAAuJ;AACvJ,qBAAa,aAAa;IASlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhB5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IACJ,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,MAAM,CAAS;IAEvB,YACqB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,gBAAgB,EACjC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EAClD;IAEE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB3B;IAEK,OAAO,CAAC,KAAK,EAAE;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAgCrC;IAEK,KAAK,CACP,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAmBxE;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAc1D;IAEK,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAOtF;YAEa,uBAAuB;IA6D/B,YAAY,CACd,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;YAEa,sBAAsB;IA6D9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED,OAAO,CAAC,QAAQ;YASF,UAAU;YAyCV,aAAa;YAwFb,UAAU;YA2BV,WAAW;YA2DX,MAAM;IAiBpB,OAAO,CAAC,OAAO;CAGlB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../sources/modules/plugin/service.ts"],"names":[],"mappings":"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"}