@dxos/functions 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (184) hide show
  1. package/dist/lib/browser/index.mjs +767 -884
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +767 -884
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/errors.d.ts +44 -60
  8. package/dist/types/src/errors.d.ts.map +1 -1
  9. package/dist/types/src/example/fib.d.ts +1 -1
  10. package/dist/types/src/example/index.d.ts +3 -3
  11. package/dist/types/src/example/index.d.ts.map +1 -1
  12. package/dist/types/src/example/reply.d.ts +1 -1
  13. package/dist/types/src/example/sleep.d.ts +1 -1
  14. package/dist/types/src/index.d.ts +2 -5
  15. package/dist/types/src/index.d.ts.map +1 -1
  16. package/dist/types/src/operation-compatibility.test.d.ts +2 -0
  17. package/dist/types/src/operation-compatibility.test.d.ts.map +1 -0
  18. package/dist/types/src/protocol/functions-ai-http-client.d.ts +12 -0
  19. package/dist/types/src/protocol/functions-ai-http-client.d.ts.map +1 -0
  20. package/dist/types/src/protocol/index.d.ts +2 -0
  21. package/dist/types/src/protocol/index.d.ts.map +1 -0
  22. package/dist/types/src/protocol/protocol.d.ts +7 -0
  23. package/dist/types/src/protocol/protocol.d.ts.map +1 -0
  24. package/dist/types/src/protocol/protocol.test.d.ts +2 -0
  25. package/dist/types/src/protocol/protocol.test.d.ts.map +1 -0
  26. package/dist/types/src/sdk.d.ts +114 -0
  27. package/dist/types/src/sdk.d.ts.map +1 -0
  28. package/dist/types/src/services/credentials.d.ts +6 -4
  29. package/dist/types/src/services/credentials.d.ts.map +1 -1
  30. package/dist/types/src/services/event-logger.d.ts +33 -27
  31. package/dist/types/src/services/event-logger.d.ts.map +1 -1
  32. package/dist/types/src/services/function-invocation-service.d.ts +7 -19
  33. package/dist/types/src/services/function-invocation-service.d.ts.map +1 -1
  34. package/dist/types/src/services/index.d.ts +2 -4
  35. package/dist/types/src/services/index.d.ts.map +1 -1
  36. package/dist/types/src/services/queues.d.ts +4 -4
  37. package/dist/types/src/services/queues.d.ts.map +1 -1
  38. package/dist/types/src/services/tracing.d.ts +41 -12
  39. package/dist/types/src/services/tracing.d.ts.map +1 -1
  40. package/dist/types/src/types/Function.d.ts +40 -35
  41. package/dist/types/src/types/Function.d.ts.map +1 -1
  42. package/dist/types/src/types/Script.d.ts +9 -16
  43. package/dist/types/src/types/Script.d.ts.map +1 -1
  44. package/dist/types/src/types/Trigger.d.ts +58 -76
  45. package/dist/types/src/types/Trigger.d.ts.map +1 -1
  46. package/dist/types/src/types/TriggerEvent.d.ts +43 -13
  47. package/dist/types/src/types/TriggerEvent.d.ts.map +1 -1
  48. package/dist/types/src/types/index.d.ts +1 -0
  49. package/dist/types/src/types/index.d.ts.map +1 -1
  50. package/dist/types/src/types/url.d.ts +13 -0
  51. package/dist/types/src/types/url.d.ts.map +1 -0
  52. package/dist/types/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +23 -58
  54. package/src/errors.ts +4 -4
  55. package/src/example/fib.ts +1 -1
  56. package/src/example/reply.ts +1 -1
  57. package/src/example/sleep.ts +1 -1
  58. package/src/index.ts +2 -5
  59. package/src/operation-compatibility.test.ts +185 -0
  60. package/src/protocol/functions-ai-http-client.ts +67 -0
  61. package/src/{executor → protocol}/index.ts +1 -1
  62. package/src/protocol/protocol.test.ts +59 -0
  63. package/src/protocol/protocol.ts +262 -0
  64. package/src/{handler.ts → sdk.ts} +129 -66
  65. package/src/services/credentials.ts +32 -17
  66. package/src/services/event-logger.ts +10 -4
  67. package/src/services/function-invocation-service.ts +23 -70
  68. package/src/services/index.ts +2 -4
  69. package/src/services/queues.ts +5 -7
  70. package/src/services/tracing.ts +68 -44
  71. package/src/types/Function.ts +39 -8
  72. package/src/types/Script.ts +10 -9
  73. package/src/types/Trigger.ts +18 -14
  74. package/src/types/TriggerEvent.ts +29 -29
  75. package/src/types/index.ts +1 -0
  76. package/src/types/url.ts +32 -0
  77. package/dist/lib/browser/bundler/index.mjs +0 -256
  78. package/dist/lib/browser/bundler/index.mjs.map +0 -7
  79. package/dist/lib/browser/chunk-J5LGTIGS.mjs +0 -10
  80. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +0 -7
  81. package/dist/lib/browser/chunk-M6EXIREF.mjs +0 -610
  82. package/dist/lib/browser/chunk-M6EXIREF.mjs.map +0 -7
  83. package/dist/lib/browser/edge/index.mjs +0 -83
  84. package/dist/lib/browser/edge/index.mjs.map +0 -7
  85. package/dist/lib/browser/testing/index.mjs +0 -131
  86. package/dist/lib/browser/testing/index.mjs.map +0 -7
  87. package/dist/lib/node-esm/bundler/index.mjs +0 -257
  88. package/dist/lib/node-esm/bundler/index.mjs.map +0 -7
  89. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  90. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  91. package/dist/lib/node-esm/chunk-P3IATZMZ.mjs +0 -612
  92. package/dist/lib/node-esm/chunk-P3IATZMZ.mjs.map +0 -7
  93. package/dist/lib/node-esm/edge/index.mjs +0 -84
  94. package/dist/lib/node-esm/edge/index.mjs.map +0 -7
  95. package/dist/lib/node-esm/testing/index.mjs +0 -132
  96. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  97. package/dist/types/src/bundler/bundler.d.ts +0 -49
  98. package/dist/types/src/bundler/bundler.d.ts.map +0 -1
  99. package/dist/types/src/bundler/bundler.test.d.ts +0 -2
  100. package/dist/types/src/bundler/bundler.test.d.ts.map +0 -1
  101. package/dist/types/src/bundler/index.d.ts +0 -2
  102. package/dist/types/src/bundler/index.d.ts.map +0 -1
  103. package/dist/types/src/e2e/deploy.test.d.ts +0 -2
  104. package/dist/types/src/e2e/deploy.test.d.ts.map +0 -1
  105. package/dist/types/src/edge/functions.d.ts +0 -17
  106. package/dist/types/src/edge/functions.d.ts.map +0 -1
  107. package/dist/types/src/edge/index.d.ts +0 -2
  108. package/dist/types/src/edge/index.d.ts.map +0 -1
  109. package/dist/types/src/executor/executor.d.ts +0 -14
  110. package/dist/types/src/executor/executor.d.ts.map +0 -1
  111. package/dist/types/src/executor/index.d.ts +0 -2
  112. package/dist/types/src/executor/index.d.ts.map +0 -1
  113. package/dist/types/src/handler.d.ts +0 -102
  114. package/dist/types/src/handler.d.ts.map +0 -1
  115. package/dist/types/src/services/database.d.ts +0 -67
  116. package/dist/types/src/services/database.d.ts.map +0 -1
  117. package/dist/types/src/services/function-invocation-service.test.d.ts +0 -2
  118. package/dist/types/src/services/function-invocation-service.test.d.ts.map +0 -1
  119. package/dist/types/src/services/local-function-execution.d.ts +0 -34
  120. package/dist/types/src/services/local-function-execution.d.ts.map +0 -1
  121. package/dist/types/src/services/remote-function-execution-service.d.ts +0 -22
  122. package/dist/types/src/services/remote-function-execution-service.d.ts.map +0 -1
  123. package/dist/types/src/services/service-container.d.ts +0 -57
  124. package/dist/types/src/services/service-container.d.ts.map +0 -1
  125. package/dist/types/src/services/service-registry.d.ts +0 -31
  126. package/dist/types/src/services/service-registry.d.ts.map +0 -1
  127. package/dist/types/src/services/service-registry.test.d.ts +0 -2
  128. package/dist/types/src/services/service-registry.test.d.ts.map +0 -1
  129. package/dist/types/src/testing/index.d.ts +0 -3
  130. package/dist/types/src/testing/index.d.ts.map +0 -1
  131. package/dist/types/src/testing/layer.d.ts +0 -18
  132. package/dist/types/src/testing/layer.d.ts.map +0 -1
  133. package/dist/types/src/testing/logger.d.ts +0 -5
  134. package/dist/types/src/testing/logger.d.ts.map +0 -1
  135. package/dist/types/src/testing/persist-database.test.d.ts +0 -2
  136. package/dist/types/src/testing/persist-database.test.d.ts.map +0 -1
  137. package/dist/types/src/testing/services.d.ts +0 -59
  138. package/dist/types/src/testing/services.d.ts.map +0 -1
  139. package/dist/types/src/trace.d.ts +0 -122
  140. package/dist/types/src/trace.d.ts.map +0 -1
  141. package/dist/types/src/translations.d.ts +0 -12
  142. package/dist/types/src/translations.d.ts.map +0 -1
  143. package/dist/types/src/triggers/index.d.ts +0 -4
  144. package/dist/types/src/triggers/index.d.ts.map +0 -1
  145. package/dist/types/src/triggers/input-builder.d.ts +0 -3
  146. package/dist/types/src/triggers/input-builder.d.ts.map +0 -1
  147. package/dist/types/src/triggers/invocation-tracer.d.ts +0 -37
  148. package/dist/types/src/triggers/invocation-tracer.d.ts.map +0 -1
  149. package/dist/types/src/triggers/trigger-dispatcher.d.ts +0 -78
  150. package/dist/types/src/triggers/trigger-dispatcher.d.ts.map +0 -1
  151. package/dist/types/src/triggers/trigger-dispatcher.test.d.ts +0 -2
  152. package/dist/types/src/triggers/trigger-dispatcher.test.d.ts.map +0 -1
  153. package/dist/types/src/triggers/trigger-state-store.d.ts +0 -28
  154. package/dist/types/src/triggers/trigger-state-store.d.ts.map +0 -1
  155. package/dist/types/src/url.d.ts +0 -21
  156. package/dist/types/src/url.d.ts.map +0 -1
  157. package/src/bundler/bundler.test.ts +0 -58
  158. package/src/bundler/bundler.ts +0 -295
  159. package/src/bundler/index.ts +0 -5
  160. package/src/e2e/deploy.test.ts +0 -69
  161. package/src/edge/functions.ts +0 -67
  162. package/src/edge/index.ts +0 -9
  163. package/src/executor/executor.ts +0 -58
  164. package/src/services/database.ts +0 -175
  165. package/src/services/function-invocation-service.test.ts +0 -81
  166. package/src/services/local-function-execution.ts +0 -153
  167. package/src/services/remote-function-execution-service.ts +0 -63
  168. package/src/services/service-container.ts +0 -115
  169. package/src/services/service-registry.test.ts +0 -45
  170. package/src/services/service-registry.ts +0 -63
  171. package/src/testing/index.ts +0 -6
  172. package/src/testing/layer.ts +0 -114
  173. package/src/testing/logger.ts +0 -17
  174. package/src/testing/persist-database.test.ts +0 -87
  175. package/src/testing/services.ts +0 -115
  176. package/src/trace.ts +0 -178
  177. package/src/translations.ts +0 -20
  178. package/src/triggers/index.ts +0 -7
  179. package/src/triggers/input-builder.ts +0 -35
  180. package/src/triggers/invocation-tracer.ts +0 -101
  181. package/src/triggers/trigger-dispatcher.test.ts +0 -664
  182. package/src/triggers/trigger-dispatcher.ts +0 -521
  183. package/src/triggers/trigger-state-store.ts +0 -61
  184. package/src/url.ts +0 -55
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/bundler/bundler.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Schedule from 'effect/Schedule';\nimport { type BuildOptions, type BuildResult, type Loader, type Plugin, build, initialize } from 'esbuild-wasm';\n\nimport { subtleCrypto } from '@dxos/crypto';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nexport type Import = {\n moduleUrl: string;\n defaultImport: boolean;\n namedImports: string[];\n};\n\nexport type BundleOptions = {\n /**\n * Source code to bundle.\n */\n source: string;\n};\n\nexport type BundleResult =\n | {\n timestamp: number;\n sourceHash: Buffer;\n error: unknown;\n }\n | {\n timestamp: number;\n sourceHash: Buffer;\n imports: Import[];\n entryPoint: string;\n asset: Uint8Array;\n bundle: string;\n };\n\nexport type BundlerOptions = {\n platform: BuildOptions['platform'];\n sandboxedModules: string[];\n remoteModules: Record<string, string>;\n};\n\nlet initialized: Promise<void>;\nexport const initializeBundler = async (options: { wasmUrl: string }) => {\n await (initialized ??= initialize({\n wasmURL: options.wasmUrl,\n }));\n};\n\n/**\n * ESBuild bundler.\n */\nexport class Bundler {\n constructor(private readonly _options: BundlerOptions) {}\n\n async bundle({ source }: BundleOptions): Promise<BundleResult> {\n const { sandboxedModules: providedModules, ...options } = this._options;\n const sourceHash = Buffer.from(await subtleCrypto.digest('SHA-256', Buffer.from(source)));\n\n if (this._options.platform === 'browser') {\n invariant(initialized, 'Compiler not initialized.');\n await initialized;\n }\n\n const imports = source ? analyzeSourceFileImports(source) : [];\n\n // https://esbuild.github.io/api/#build\n try {\n const result = await build({\n platform: options.platform,\n conditions: ['workerd', 'browser'],\n metafile: true,\n write: false,\n entryPoints: {\n // Gets mapped to `userFunc.js` by esbuild.\n userFunc: 'memory:main.tsx',\n },\n bundle: true,\n format: 'esm',\n plugins: [\n {\n name: 'memory',\n setup: (build) => {\n build.onResolve({ filter: /^\\.\\/runtime\\.js$/ }, ({ path }) => {\n return { path, external: true };\n });\n\n build.onResolve({ filter: /^dxos:functions$/ }, ({ path }) => {\n return { path: './runtime.js', external: true };\n });\n\n build.onResolve({ filter: /^memory:/ }, ({ path }) => {\n return { path: path.split(':')[1], namespace: 'memory' };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'memory' }, ({ path }) => {\n if (path === 'main.tsx') {\n return {\n contents: source,\n loader: 'tsx',\n };\n }\n });\n\n for (const module of providedModules) {\n build.onResolve({ filter: new RegExp(`^${module}$`) }, ({ path }) => {\n return { path, namespace: 'injected-module' };\n });\n }\n\n build.onLoad({ filter: /.*/, namespace: 'injected-module' }, ({ path }) => {\n const namedImports = imports.find((entry) => entry.moduleIdentifier === path)?.namedImports ?? [];\n return {\n contents: `\n const { ${namedImports.join(',')} } = window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}];\n export { ${namedImports.join(',')} };\n export default window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}].default;\n `,\n loader: 'tsx',\n };\n });\n },\n },\n httpPlugin,\n ],\n });\n\n log('compile complete', result.metafile);\n\n const entryPoint = 'userFunc.js';\n return {\n timestamp: Date.now(),\n sourceHash,\n imports: this.analyzeImports(result),\n entryPoint,\n asset: result.outputFiles![0].contents,\n bundle: result.outputFiles![0].text,\n };\n } catch (err) {\n return { timestamp: Date.now(), sourceHash, error: err };\n }\n }\n\n // TODO(dmaretskyi): In the future we can replace the compiler with SWC with plugins running in WASM.\n analyzeImports(result: BuildResult): Import[] {\n invariant(result.outputFiles);\n\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, result.outputFiles[0].text);\n return Object.values(result.metafile!.outputs)[0].imports.map((entry): Import => {\n const namedImports: string[] = [];\n const parsedImport = parsedImports.find((capture) => capture?.[4] === entry.path);\n if (parsedImport?.[2]) {\n NAMED_IMPORTS_REGEX.lastIndex = 0;\n const namedImportsMatch = NAMED_IMPORTS_REGEX.exec(parsedImport[2]);\n if (namedImportsMatch) {\n namedImportsMatch[1].split(',').forEach((importName) => {\n namedImports.push(importName.trim());\n });\n }\n }\n\n return {\n moduleUrl: entry.path,\n defaultImport: !!parsedImport?.[1],\n namedImports,\n };\n });\n }\n\n analyzeSourceFileImports(code: string): {\n defaultImportName: string;\n namedImports: string[];\n wildcardImportName: string;\n moduleIdentifier: string;\n quotes: string;\n }[] {\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, code);\n return parsedImports.map((capture) => {\n return {\n defaultImportName: capture[1],\n namedImports: capture[2]?.split(',').map((importName) => importName.trim()),\n wildcardImportName: capture[3],\n moduleIdentifier: capture[4],\n quotes: capture[5],\n };\n });\n }\n}\n\n// https://regex101.com/r/FEN5ks/1\n// https://stackoverflow.com/a/73265022\n// $1 = default import name (can be non-existent)\n// $2 = destructured exports (can be non-existent)\n// $3 = wildcard import name (can be non-existent)\n// $4 = module identifier\n// $5 = quotes used (either ' or \")\nconst IMPORT_REGEX =\n /import(?:(?:(?:[ \\n\\t]+([^ *\\n\\t{},]+)[ \\n\\t]*(?:,|[ \\n\\t]+))?([ \\n\\t]*{(?:[ \\n\\t]*[^ \\n\\t\"'{}]+[ \\n\\t]*,?)+})?[ \\n\\t]*)|[ \\n\\t]*\\*[ \\n\\t]*as[ \\n\\t]+([^ \\n\\t{}]+)[ \\n\\t]+)from[ \\n\\t]*(?:['\"])([^'\"\\n]+)(['\"])/gm;\n\nconst NAMED_IMPORTS_REGEX = /[ \\n\\t]*{((?:[ \\n\\t]*[^ \\n\\t\"'{}]+[ \\n\\t]*,?)+)}[ \\n\\t]*/gm;\n\nconst allMatches = (regex: RegExp, str: string) => {\n let match;\n const matches = [];\n regex.lastIndex = 0;\n while ((match = regex.exec(str))) {\n matches.push(match);\n }\n\n return matches;\n};\n\ntype ParsedImport = {\n defaultImportName?: string;\n namedImports: string[];\n wildcardImportName?: string;\n moduleIdentifier: string;\n quotes: string;\n};\n\nconst analyzeSourceFileImports = (code: string): ParsedImport[] => {\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, code);\n return parsedImports.map((capture) => {\n return {\n defaultImportName: capture[1],\n namedImports: capture[2]\n ?.trim()\n .slice(1, -1)\n .split(',')\n .map((importName) => importName.trim()),\n wildcardImportName: capture[3],\n moduleIdentifier: capture[4],\n quotes: capture[5],\n };\n });\n};\n\nconst MAX_RETRIES = 5;\nconst INITIAL_DELAY = 1_000;\n\nconst httpPlugin: Plugin = {\n name: 'http',\n setup: (build) => {\n // Intercept import paths starting with \"http:\" and \"https:\" so esbuild doesn't attempt to map them to a file system location.\n // Tag them with the \"http-url\" namespace to associate them with this plugin.\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n namespace: 'http-url',\n }));\n\n // We also want to intercept all import paths inside downloaded files and resolve them against the original URL.\n // All of these files will be in the \"http-url\" namespace.\n // Make sure to keep the newly resolved URL in the \"http-url\" namespace so imports inside it will also be resolved as URLs recursively.\n build.onResolve({ filter: /.*/, namespace: 'http-url' }, (args) => ({\n path: new URL(args.path, args.importer).toString(),\n namespace: 'http-url',\n }));\n\n // When a URL is loaded, we want to actually download the content from the internet.\n // This has just enough logic to be able to handle the example import from unpkg.com but in reality this would probably need to be more complex.\n build.onLoad({ filter: /.*/, namespace: 'http-url' }, async (args) => {\n return Effect.gen(function* () {\n const response = yield* HttpClient.get(args.path);\n if (response.status !== 200) {\n throw new Error(`failed to fetch: ${response.status}`);\n }\n\n const text = yield* response.text;\n return { contents: text, loader: 'jsx' as Loader };\n }).pipe(\n Effect.retry(\n Function.pipe(\n Schedule.exponential(Duration.millis(INITIAL_DELAY)),\n Schedule.jittered,\n Schedule.intersect(Schedule.recurs(MAX_RETRIES - 1)),\n ),\n ),\n Effect.provide(FetchHttpClient.layer),\n runAndForwardErrors,\n );\n });\n },\n};\n"],
5
- "mappings": "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",
6
- "names": ["FetchHttpClient", "HttpClient", "Duration", "Effect", "Function", "Schedule", "build", "initialize", "subtleCrypto", "runAndForwardErrors", "invariant", "log", "initialized", "initializeBundler", "options", "wasmURL", "wasmUrl", "Bundler", "_options", "bundle", "source", "sandboxedModules", "providedModules", "sourceHash", "Buffer", "from", "digest", "platform", "imports", "analyzeSourceFileImports", "result", "conditions", "metafile", "write", "entryPoints", "userFunc", "format", "plugins", "name", "setup", "onResolve", "filter", "path", "external", "split", "namespace", "onLoad", "contents", "loader", "module", "RegExp", "namedImports", "find", "entry", "moduleIdentifier", "join", "JSON", "stringify", "httpPlugin", "entryPoint", "timestamp", "Date", "now", "analyzeImports", "asset", "outputFiles", "text", "err", "error", "parsedImports", "allMatches", "IMPORT_REGEX", "Object", "values", "outputs", "map", "parsedImport", "capture", "NAMED_IMPORTS_REGEX", "lastIndex", "namedImportsMatch", "exec", "forEach", "importName", "push", "trim", "moduleUrl", "defaultImport", "code", "defaultImportName", "wildcardImportName", "quotes", "regex", "str", "match", "matches", "slice", "MAX_RETRIES", "INITIAL_DELAY", "args", "URL", "importer", "toString", "gen", "response", "get", "status", "Error", "pipe", "retry", "exponential", "millis", "jittered", "intersect", "recurs", "provide", "layer"]
7
- }
@@ -1,11 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- var __defProp = Object.defineProperty;
3
- var __export = (target, all) => {
4
- for (var name in all)
5
- __defProp(target, name, { get: all[name], enumerable: true });
6
- };
7
-
8
- export {
9
- __export
10
- };
11
- //# sourceMappingURL=chunk-HSLMI22Q.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,612 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/errors.ts
4
- import { BaseError } from "@dxos/errors";
5
- var ServiceNotAvailableError = class extends BaseError.extend("SERVICE_NOT_AVAILABLE", "Service not available") {
6
- constructor(service, options) {
7
- super({
8
- context: {
9
- service
10
- },
11
- ...options
12
- });
13
- }
14
- };
15
- var FunctionNotFoundError = class extends BaseError.extend("FUNCTION_NOT_FOUND", "Function not found") {
16
- constructor(functionKey, options) {
17
- super({
18
- context: {
19
- function: functionKey
20
- },
21
- ...options
22
- });
23
- }
24
- };
25
- var FunctionError = class extends BaseError.extend("FUNCTION_ERROR", "Function invocation error") {
26
- };
27
- var TriggerStateNotFoundError = class extends BaseError.extend("TRIGGER_STATE_NOT_FOUND", "Trigger state not found") {
28
- };
29
-
30
- // src/url.ts
31
- var FUNCTIONS_META_KEY = "dxos.org/service/function";
32
- var FUNCTIONS_PRESET_META_KEY = "dxos.org/service/function-preset";
33
- var isSecure = (protocol) => {
34
- return protocol === "https:" || protocol === "wss:";
35
- };
36
- var getUserFunctionIdInMetadata = (meta) => {
37
- return meta.keys.find((key) => key.source === FUNCTIONS_META_KEY)?.id;
38
- };
39
- var setUserFunctionIdInMetadata = (meta, functionId) => {
40
- const key = meta.keys.find((key2) => key2.source === FUNCTIONS_META_KEY);
41
- if (key) {
42
- if (key.id !== functionId) {
43
- throw new Error("Metadata mismatch");
44
- }
45
- } else {
46
- meta.keys.push({
47
- source: FUNCTIONS_META_KEY,
48
- id: functionId
49
- });
50
- }
51
- };
52
- var getInvocationUrl = (functionId, edgeUrl, options = {}) => {
53
- const baseUrl = new URL("functions/", edgeUrl);
54
- const url = new URL(`./${functionId}`, baseUrl.toString());
55
- options.spaceId && url.searchParams.set("spaceId", options.spaceId);
56
- options.subjectId && url.searchParams.set("subjectId", options.subjectId);
57
- url.protocol = isSecure(url.protocol) ? "https" : "http";
58
- return url.toString();
59
- };
60
-
61
- // src/services/database.ts
62
- import * as Context from "effect/Context";
63
- import * as Effect from "effect/Effect";
64
- import * as Layer from "effect/Layer";
65
- import * as Option from "effect/Option";
66
- import { Obj, ObjectNotFoundError } from "@dxos/echo";
67
- import { promiseWithCauseCapture } from "@dxos/effect";
68
- import { invariant } from "@dxos/invariant";
69
- var __dxlog_file = "/__w/dxos/dxos/packages/core/functions/src/services/database.ts";
70
- var DatabaseService = class _DatabaseService extends Context.Tag("@dxos/functions/DatabaseService")() {
71
- static notAvailable = Layer.succeed(_DatabaseService, {
72
- get db() {
73
- throw new Error("Database not available");
74
- }
75
- });
76
- static make = (db) => {
77
- return {
78
- get db() {
79
- return db;
80
- }
81
- };
82
- };
83
- static layer = (db) => {
84
- return Layer.succeed(_DatabaseService, _DatabaseService.make(db));
85
- };
86
- /**
87
- * Resolves an object by its DXN.
88
- */
89
- static resolve = (dxn, schema) => Effect.gen(function* () {
90
- const { db } = yield* _DatabaseService;
91
- const object = yield* promiseWithCauseCapture(() => db.graph.createRefResolver({
92
- context: {
93
- space: db.spaceId
94
- }
95
- }).resolve(dxn));
96
- if (!object) {
97
- return yield* Effect.fail(new ObjectNotFoundError(dxn));
98
- }
99
- invariant(!schema || Obj.instanceOf(schema, object), "Object type mismatch.", {
100
- F: __dxlog_file,
101
- L: 82,
102
- S: this,
103
- A: [
104
- "!schema || Obj.instanceOf(schema, object)",
105
- "'Object type mismatch.'"
106
- ]
107
- });
108
- return object;
109
- });
110
- /**
111
- * Loads an object reference.
112
- */
113
- static load = Effect.fn(function* (ref) {
114
- const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
115
- if (!object) {
116
- return yield* Effect.fail(new ObjectNotFoundError(ref.dxn));
117
- }
118
- return object;
119
- });
120
- /**
121
- * Loads an object reference option.
122
- */
123
- // TODO(burdon): Option?
124
- static loadOption = Effect.fn(function* (ref) {
125
- const object = yield* _DatabaseService.load(ref).pipe(Effect.catchTag("OBJECT_NOT_FOUND", () => Effect.succeed(void 0)));
126
- return Option.fromNullable(object);
127
- });
128
- // TODO(burdon): Can we create a proxy for the following methods on EchoDatabase? Use @inheritDoc?
129
- // TODO(burdon): Figure out how to chain query().run();
130
- /**
131
- * @link EchoDatabase.add
132
- */
133
- static add = (obj) => _DatabaseService.pipe(Effect.map(({ db }) => db.add(obj)));
134
- /**
135
- * @link EchoDatabase.remove
136
- */
137
- static remove = (obj) => _DatabaseService.pipe(Effect.map(({ db }) => db.remove(obj)));
138
- /**
139
- * @link EchoDatabase.flush
140
- */
141
- static flush = (opts) => _DatabaseService.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts))));
142
- /**
143
- * @link EchoDatabase.getObjectById
144
- */
145
- static getObjectById = (id) => {
146
- return _DatabaseService.pipe(Effect.map(({ db }) => db.getObjectById(id)));
147
- };
148
- /**
149
- * Creates a `QueryResult` object that can be subscribed to.
150
- */
151
- static query = (queryOrFilter) => _DatabaseService.pipe(Effect.map(({ db }) => db.query(queryOrFilter)), Effect.withSpan("DatabaseService.query"));
152
- /**
153
- * Executes the query once and returns the results.
154
- */
155
- static runQuery = (queryOrFilter) => _DatabaseService.query(queryOrFilter).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
156
- static schemaQuery = (query) => _DatabaseService.pipe(Effect.map(({ db }) => db.schemaRegistry.query(query)), Effect.withSpan("DatabaseService.schemaQuery"));
157
- static runSchemaQuery = (query) => _DatabaseService.schemaQuery(query).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
158
- };
159
-
160
- // src/services/credentials.ts
161
- import * as HttpClient from "@effect/platform/HttpClient";
162
- import * as HttpClientRequest from "@effect/platform/HttpClientRequest";
163
- import * as Context2 from "effect/Context";
164
- import * as Effect2 from "effect/Effect";
165
- import * as Layer2 from "effect/Layer";
166
- import * as Redacted from "effect/Redacted";
167
- import { Query } from "@dxos/echo";
168
- import { DataType } from "@dxos/schema";
169
- var CredentialsService = class _CredentialsService extends Context2.Tag("@dxos/functions/CredentialsService")() {
170
- static getCredential = (query) => Effect2.gen(function* () {
171
- const credentials = yield* _CredentialsService;
172
- return yield* Effect2.promise(() => credentials.getCredential(query));
173
- });
174
- static getApiKey = (query) => Effect2.gen(function* () {
175
- const credential = yield* _CredentialsService.getCredential(query);
176
- if (!credential.apiKey) {
177
- throw new Error(`API key not found for service: ${query.service}`);
178
- }
179
- return Redacted.make(credential.apiKey);
180
- });
181
- static configuredLayer = (credentials) => Layer2.succeed(_CredentialsService, new ConfiguredCredentialsService(credentials));
182
- static layerConfig = (credentials) => Layer2.effect(_CredentialsService, Effect2.gen(function* () {
183
- const serviceCredentials = yield* Effect2.forEach(credentials, ({ service, apiKey }) => Effect2.gen(function* () {
184
- return {
185
- service,
186
- apiKey: Redacted.value(yield* apiKey)
187
- };
188
- }));
189
- return new ConfiguredCredentialsService(serviceCredentials);
190
- }));
191
- static layerFromDatabase = () => Layer2.effect(_CredentialsService, Effect2.gen(function* () {
192
- const dbService = yield* DatabaseService;
193
- const queryCredentials = async (query) => {
194
- const { objects: accessTokens } = await dbService.db.query(Query.type(DataType.AccessToken)).run();
195
- return accessTokens.filter((accessToken) => accessToken.source === query.service).map((accessToken) => ({
196
- service: accessToken.source,
197
- apiKey: accessToken.token
198
- }));
199
- };
200
- return {
201
- getCredential: async (query) => {
202
- const credentials = await queryCredentials(query);
203
- if (credentials.length === 0) {
204
- throw new Error(`Credential not found for service: ${query.service}`);
205
- }
206
- return credentials[0];
207
- },
208
- queryCredentials: async (query) => {
209
- return queryCredentials(query);
210
- }
211
- };
212
- }));
213
- };
214
- var ConfiguredCredentialsService = class {
215
- credentials;
216
- constructor(credentials = []) {
217
- this.credentials = credentials;
218
- }
219
- addCredentials(credentials) {
220
- this.credentials.push(...credentials);
221
- return this;
222
- }
223
- async queryCredentials(query) {
224
- return this.credentials.filter((credential) => credential.service === query.service);
225
- }
226
- async getCredential(query) {
227
- const credential = this.credentials.find((credential2) => credential2.service === query.service);
228
- if (!credential) {
229
- throw new Error(`Credential not found for service: ${query.service}`);
230
- }
231
- return credential;
232
- }
233
- };
234
- var withAuthorization = (query, kind) => HttpClient.mapRequestEffect(Effect2.fnUntraced(function* (request) {
235
- const key = yield* CredentialsService.getApiKey(query).pipe(Effect2.map(Redacted.value));
236
- const authorization = kind ? `${kind} ${key}` : key;
237
- return HttpClientRequest.setHeader(request, "Authorization", authorization);
238
- }));
239
-
240
- // src/services/tracing.ts
241
- import * as Context3 from "effect/Context";
242
- import * as Effect3 from "effect/Effect";
243
- import * as Layer3 from "effect/Layer";
244
- import { AgentStatus } from "@dxos/ai";
245
- import { Obj as Obj2 } from "@dxos/echo";
246
- import { log } from "@dxos/log";
247
- import { DataType as DataType2 } from "@dxos/schema";
248
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions/src/services/tracing.ts";
249
- var TracingService = class _TracingService extends Context3.Tag("@dxos/functions/TracingService")() {
250
- static noop = {
251
- write: () => {
252
- },
253
- getTraceContext: () => ({})
254
- };
255
- static layerNoop = Layer3.succeed(_TracingService, _TracingService.noop);
256
- static console = {
257
- write: (event) => {
258
- console.log(event);
259
- },
260
- getTraceContext: () => ({})
261
- };
262
- static layerConsole = Layer3.succeed(_TracingService, _TracingService.console);
263
- static layerLogInfo = () => Layer3.succeed(_TracingService, {
264
- write: (event) => {
265
- if (Obj2.instanceOf(AgentStatus, event)) {
266
- log.info("status", {
267
- message: event.message
268
- }, {
269
- F: __dxlog_file2,
270
- L: 52,
271
- S: this,
272
- C: (f, a) => f(...a)
273
- });
274
- }
275
- },
276
- getTraceContext: () => ({})
277
- });
278
- /**
279
- * Creates a TracingService layer that emits events to the parent tracing service.
280
- */
281
- static layerSubframe = (mapContext) => Layer3.effect(_TracingService, Effect3.gen(function* () {
282
- const tracing = yield* _TracingService;
283
- const context = mapContext(tracing.getTraceContext());
284
- return {
285
- write: (event) => tracing.write(event),
286
- getTraceContext: () => context
287
- };
288
- }));
289
- static layerQueue = (queue) => Layer3.effect(_TracingService, Effect3.gen(function* () {
290
- return {
291
- write: (event) => queue.append([
292
- event
293
- ]),
294
- getTraceContext: () => ({
295
- debugInfo: {
296
- queue: queue.dxn.toString()
297
- }
298
- })
299
- };
300
- }));
301
- /**
302
- * Emit the current human-readable execution status.
303
- */
304
- static emitStatus = Effect3.fnUntraced(function* (data) {
305
- const tracing = yield* _TracingService;
306
- tracing.write(Obj2.make(AgentStatus, {
307
- parentMessage: tracing.getTraceContext().parentMessage,
308
- toolCallId: tracing.getTraceContext().toolCallId,
309
- created: (/* @__PURE__ */ new Date()).toISOString(),
310
- ...data
311
- }));
312
- });
313
- static emitConverationMessage = Effect3.fnUntraced(function* (data) {
314
- const tracing = yield* _TracingService;
315
- tracing.write(Obj2.make(DataType2.Message, {
316
- parentMessage: tracing.getTraceContext().parentMessage,
317
- ...data,
318
- properties: {
319
- [MESSAGE_PROPERTY_TOOL_CALL_ID]: tracing.getTraceContext().toolCallId,
320
- ...data.properties
321
- }
322
- }));
323
- });
324
- };
325
- var MESSAGE_PROPERTY_TOOL_CALL_ID = "toolCallId";
326
-
327
- // src/services/event-logger.ts
328
- import * as Context4 from "effect/Context";
329
- import * as Effect4 from "effect/Effect";
330
- import * as Layer4 from "effect/Layer";
331
- import * as Schema from "effect/Schema";
332
- import { Obj as Obj3, Type } from "@dxos/echo";
333
- import { invariant as invariant2 } from "@dxos/invariant";
334
- import { LogLevel, log as log2 } from "@dxos/log";
335
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions/src/services/event-logger.ts";
336
- var ComputeEventPayload = Schema.Union(Schema.Struct({
337
- type: Schema.Literal("begin-compute"),
338
- nodeId: Schema.String,
339
- inputs: Schema.Record({
340
- key: Schema.String,
341
- value: Schema.Any
342
- })
343
- }), Schema.Struct({
344
- type: Schema.Literal("end-compute"),
345
- nodeId: Schema.String,
346
- outputs: Schema.Record({
347
- key: Schema.String,
348
- value: Schema.Any
349
- })
350
- }), Schema.Struct({
351
- type: Schema.Literal("compute-input"),
352
- nodeId: Schema.String,
353
- property: Schema.String,
354
- value: Schema.Any
355
- }), Schema.Struct({
356
- type: Schema.Literal("compute-output"),
357
- nodeId: Schema.String,
358
- property: Schema.String,
359
- value: Schema.Any
360
- }), Schema.Struct({
361
- type: Schema.Literal("custom"),
362
- nodeId: Schema.String,
363
- event: Schema.Any
364
- }));
365
- var ComputeEvent = Schema.Struct({
366
- payload: ComputeEventPayload
367
- }).pipe(Type.Obj({
368
- typename: "dxos.org/type/ComputeEvent",
369
- version: "0.1.0"
370
- }));
371
- var ComputeEventLogger = class _ComputeEventLogger extends Context4.Tag("@dxos/functions/ComputeEventLogger")() {
372
- static noop = {
373
- log: () => {
374
- },
375
- nodeId: void 0
376
- };
377
- /**
378
- * Implements ComputeEventLogger using TracingService.
379
- */
380
- static layerFromTracing = Layer4.effect(_ComputeEventLogger, Effect4.gen(function* () {
381
- const tracing = yield* TracingService;
382
- return {
383
- log: (event) => {
384
- tracing.write(Obj3.make(ComputeEvent, {
385
- payload: event
386
- }));
387
- },
388
- nodeId: void 0
389
- };
390
- }));
391
- };
392
- var logCustomEvent = (data) => Effect4.gen(function* () {
393
- const logger = yield* ComputeEventLogger;
394
- if (!logger.nodeId) {
395
- throw new Error("logCustomEvent must be called within a node compute function");
396
- }
397
- logger.log({
398
- type: "custom",
399
- nodeId: logger.nodeId,
400
- event: data
401
- });
402
- });
403
- var createDefectLogger = () => Effect4.catchAll((error) => Effect4.gen(function* () {
404
- log2.error("unhandled effect error", {
405
- error
406
- }, {
407
- F: __dxlog_file3,
408
- L: 96,
409
- S: this,
410
- C: (f, a) => f(...a)
411
- });
412
- throw error;
413
- }));
414
- var createEventLogger = (level, message = "event") => {
415
- const logFunction = {
416
- [LogLevel.WARN]: log2.warn,
417
- [LogLevel.VERBOSE]: log2.verbose,
418
- [LogLevel.DEBUG]: log2.debug,
419
- [LogLevel.INFO]: log2.info,
420
- [LogLevel.ERROR]: log2.error
421
- }[level];
422
- invariant2(logFunction, void 0, {
423
- F: __dxlog_file3,
424
- L: 114,
425
- S: void 0,
426
- A: [
427
- "logFunction",
428
- ""
429
- ]
430
- });
431
- return {
432
- log: (event) => {
433
- logFunction(message, event);
434
- },
435
- nodeId: void 0
436
- };
437
- };
438
-
439
- // src/services/queues.ts
440
- import * as Context5 from "effect/Context";
441
- import * as Effect5 from "effect/Effect";
442
- import * as Layer5 from "effect/Layer";
443
- var QueueService = class _QueueService extends Context5.Tag("@dxos/functions/QueueService")() {
444
- static notAvailable = Layer5.succeed(_QueueService, {
445
- queues: {
446
- get(_dxn) {
447
- throw new Error("Queues not available");
448
- },
449
- create() {
450
- throw new Error("Queues not available");
451
- }
452
- },
453
- queue: void 0
454
- });
455
- static make = (queues, queue) => {
456
- return {
457
- queues,
458
- queue
459
- };
460
- };
461
- static layer = (queues, queue) => Layer5.succeed(_QueueService, _QueueService.make(queues, queue));
462
- /**
463
- * Gets a queue by its DXN.
464
- */
465
- static getQueue = (dxn) => _QueueService.pipe(Effect5.map(({ queues }) => queues.get(dxn)));
466
- /**
467
- * Creates a new queue.
468
- */
469
- static createQueue = (options) => _QueueService.pipe(Effect5.map(({ queues }) => queues.create(options)));
470
- static append = (queue, objects) => Effect5.promise(() => queue.append(objects));
471
- };
472
- var ContextQueueService = class _ContextQueueService extends Context5.Tag("@dxos/functions/ContextQueueService")() {
473
- static layer = (queue) => Layer5.succeed(_ContextQueueService, {
474
- queue
475
- });
476
- };
477
-
478
- // src/services/remote-function-execution-service.ts
479
- import * as Context6 from "effect/Context";
480
- import * as Effect6 from "effect/Effect";
481
- import * as Layer6 from "effect/Layer";
482
- var RemoteFunctionExecutionService = class _RemoteFunctionExecutionService extends Context6.Tag("@dxos/functions/RemoteFunctionExecutionService")() {
483
- /**
484
- * @param baseUrl URL of the EDGE server.
485
- * @param spaceId - The space ID to invoke the function in. If not provided, the function will be without space context.
486
- * @returns
487
- */
488
- static fromClient(baseUrl, spaceId) {
489
- return Layer6.succeed(_RemoteFunctionExecutionService, {
490
- callFunction: (deployedFunctionId, input) => Effect6.gen(function* () {
491
- const url = getInvocationUrl(deployedFunctionId, baseUrl, {
492
- spaceId
493
- });
494
- const result = yield* Effect6.promise(() => fetch(url, {
495
- method: "POST",
496
- headers: {
497
- "Content-Type": "application/json"
498
- },
499
- body: JSON.stringify(input)
500
- }));
501
- if (result.status >= 300 || result.status < 200) {
502
- const text = yield* Effect6.promise(() => result.text());
503
- return yield* Effect6.die(new FunctionError({
504
- message: "Failed to invoke function",
505
- cause: new Error(`HTTP error: ${text}`)
506
- }));
507
- }
508
- const data = yield* Effect6.promise(() => result.json());
509
- return data;
510
- })
511
- });
512
- }
513
- static mock = () => {
514
- return {
515
- callFunction: (deployedFunctionId, input) => Effect6.succeed(input)
516
- };
517
- };
518
- static layerMock = Layer6.succeed(_RemoteFunctionExecutionService, _RemoteFunctionExecutionService.mock());
519
- };
520
-
521
- // src/services/service-container.ts
522
- import * as Layer7 from "effect/Layer";
523
- import { AiService } from "@dxos/ai";
524
- import { entries } from "@dxos/util";
525
- var SERVICES = {
526
- ai: AiService.AiService,
527
- credentials: CredentialsService,
528
- database: DatabaseService,
529
- eventLogger: ComputeEventLogger,
530
- functionCallService: RemoteFunctionExecutionService,
531
- queues: QueueService,
532
- tracing: TracingService
533
- };
534
- var SERVICE_MAPPING = Object.fromEntries(entries(SERVICES).map(([name, tag]) => [
535
- tag.key,
536
- name
537
- ]));
538
- var SERVICE_TAGS = Object.values(SERVICES);
539
- var DEFAULT_SERVICES = {
540
- tracing: TracingService.noop
541
- };
542
- var ServiceContainer = class _ServiceContainer {
543
- _services = {
544
- ...DEFAULT_SERVICES
545
- };
546
- /**
547
- * Set services.
548
- * @param services - Services to set.
549
- * @returns The container instance.
550
- */
551
- setServices(services) {
552
- this._services = {
553
- ...this._services,
554
- ...services
555
- };
556
- return this;
557
- }
558
- getService(tag) {
559
- const serviceKey = SERVICE_MAPPING[tag.key];
560
- const service = serviceKey != null ? this._services[serviceKey] : void 0;
561
- if (!service) {
562
- throw new Error(`Service not available: ${tag.key}`);
563
- }
564
- return service;
565
- }
566
- clone() {
567
- return new _ServiceContainer().setServices({
568
- ...this._services
569
- });
570
- }
571
- // TODO(dmaretskyi): `getService` is designed to error at runtime if the service is not available, but Layer forces us to provide all services and makes stubs for the ones that are not available.
572
- createLayer() {
573
- const ai = this._services.ai != null ? Layer7.succeed(AiService.AiService, this._services.ai) : AiService.notAvailable;
574
- const credentials = Layer7.succeed(CredentialsService, this._services.credentials ?? new ConfiguredCredentialsService());
575
- const database = this._services.database != null ? Layer7.succeed(DatabaseService, this._services.database) : DatabaseService.notAvailable;
576
- const queues = this._services.queues != null ? Layer7.succeed(QueueService, this._services.queues) : QueueService.notAvailable;
577
- const tracing = Layer7.succeed(TracingService, this._services.tracing ?? TracingService.noop);
578
- const eventLogger = Layer7.succeed(ComputeEventLogger, this._services.eventLogger ?? ComputeEventLogger.noop);
579
- const functionCallService = Layer7.succeed(RemoteFunctionExecutionService, this._services.functionCallService ?? RemoteFunctionExecutionService.mock());
580
- return Layer7.mergeAll(ai, credentials, database, queues, tracing, eventLogger, functionCallService);
581
- }
582
- };
583
-
584
- export {
585
- ServiceNotAvailableError,
586
- FunctionNotFoundError,
587
- FunctionError,
588
- TriggerStateNotFoundError,
589
- FUNCTIONS_META_KEY,
590
- FUNCTIONS_PRESET_META_KEY,
591
- getUserFunctionIdInMetadata,
592
- setUserFunctionIdInMetadata,
593
- getInvocationUrl,
594
- DatabaseService,
595
- CredentialsService,
596
- ConfiguredCredentialsService,
597
- withAuthorization,
598
- TracingService,
599
- MESSAGE_PROPERTY_TOOL_CALL_ID,
600
- ComputeEventPayload,
601
- ComputeEvent,
602
- ComputeEventLogger,
603
- logCustomEvent,
604
- createDefectLogger,
605
- createEventLogger,
606
- QueueService,
607
- ContextQueueService,
608
- RemoteFunctionExecutionService,
609
- SERVICE_TAGS,
610
- ServiceContainer
611
- };
612
- //# sourceMappingURL=chunk-P3IATZMZ.mjs.map