@osdk/integration-testing 0.0.0 → 0.1.0

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 (192) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/bin/postinstall.mjs +15 -0
  3. package/build/browser/cli-service/CliServiceLauncher.js +220 -0
  4. package/build/browser/cli-service/CliServiceLauncher.js.map +1 -0
  5. package/build/browser/cli-service/FoundryCliService.js +168 -0
  6. package/build/browser/cli-service/FoundryCliService.js.map +1 -0
  7. package/build/browser/cli-service/OntologyServer.js +32 -0
  8. package/build/browser/cli-service/OntologyServer.js.map +1 -0
  9. package/build/browser/cli-service/ServiceDiscoverer.js +100 -0
  10. package/build/browser/cli-service/ServiceDiscoverer.js.map +1 -0
  11. package/build/browser/cli-service/StatusServer.js +91 -0
  12. package/build/browser/cli-service/StatusServer.js.map +1 -0
  13. package/build/browser/createIntegrationClient.js +67 -0
  14. package/build/browser/createIntegrationClient.js.map +1 -0
  15. package/build/browser/createIntegrationServer.js +115 -0
  16. package/build/browser/createIntegrationServer.js.map +1 -0
  17. package/build/browser/createSeedClient.js +77 -0
  18. package/build/browser/createSeedClient.js.map +1 -0
  19. package/build/browser/generated/cli/OntologySeedingService/setSeed.js +28 -0
  20. package/build/browser/generated/cli/OntologySeedingService/setSeed.js.map +1 -0
  21. package/build/browser/generated/cli/OntologySeedingService.js +19 -0
  22. package/build/browser/generated/cli/OntologySeedingService.js.map +1 -0
  23. package/build/browser/generated/cli/StatusService/getStatus.js +25 -0
  24. package/build/browser/generated/cli/StatusService/getStatus.js.map +1 -0
  25. package/build/browser/generated/cli/StatusService/publishStatus.js +26 -0
  26. package/build/browser/generated/cli/StatusService/publishStatus.js.map +1 -0
  27. package/build/browser/generated/cli/StatusService.js +20 -0
  28. package/build/browser/generated/cli/StatusService.js.map +1 -0
  29. package/build/browser/generated/cli/__components.js +2 -0
  30. package/build/browser/generated/cli/__components.js.map +1 -0
  31. package/build/browser/generated/cli/index.js +20 -0
  32. package/build/browser/generated/cli/index.js.map +1 -0
  33. package/build/browser/index.js +27 -0
  34. package/build/browser/index.js.map +1 -0
  35. package/build/browser/scripts/download.js +92 -0
  36. package/build/browser/scripts/download.js.map +1 -0
  37. package/build/browser/scripts/foundry-host.js +59 -0
  38. package/build/browser/scripts/foundry-host.js.map +1 -0
  39. package/build/browser/scripts/foundry-token.js +50 -0
  40. package/build/browser/scripts/foundry-token.js.map +1 -0
  41. package/build/browser/scripts/gitRemote.js +39 -0
  42. package/build/browser/scripts/gitRemote.js.map +1 -0
  43. package/build/browser/scripts/postinstall.js +38 -0
  44. package/build/browser/scripts/postinstall.js.map +1 -0
  45. package/build/browser/test/NoSpawnStatusServer.js +33 -0
  46. package/build/browser/test/NoSpawnStatusServer.js.map +1 -0
  47. package/build/browser/test/StubService.js +61 -0
  48. package/build/browser/test/StubService.js.map +1 -0
  49. package/build/browser/test/emptyOntologyMetadata.js +32 -0
  50. package/build/browser/test/emptyOntologyMetadata.js.map +1 -0
  51. package/build/browser/test/stubStatusServer.js +74 -0
  52. package/build/browser/test/stubStatusServer.js.map +1 -0
  53. package/build/browser/test/writeDiscoveryFile.js +39 -0
  54. package/build/browser/test/writeDiscoveryFile.js.map +1 -0
  55. package/build/browser/types.js +2 -0
  56. package/build/browser/types.js.map +1 -0
  57. package/build/browser/utils/empty-ontology-block.js +61 -0
  58. package/build/browser/utils/empty-ontology-block.js.map +1 -0
  59. package/build/browser/utils/foundry-cli.js +46 -0
  60. package/build/browser/utils/foundry-cli.js.map +1 -0
  61. package/build/browser/utils/process.js +26 -0
  62. package/build/browser/utils/process.js.map +1 -0
  63. package/build/browser/utils/service.js +33 -0
  64. package/build/browser/utils/service.js.map +1 -0
  65. package/build/cjs/index.cjs +841 -0
  66. package/build/cjs/index.cjs.map +1 -0
  67. package/build/cjs/index.d.cts +118 -0
  68. package/build/esm/cli-service/CliServiceLauncher.js +220 -0
  69. package/build/esm/cli-service/CliServiceLauncher.js.map +1 -0
  70. package/build/esm/cli-service/FoundryCliService.js +168 -0
  71. package/build/esm/cli-service/FoundryCliService.js.map +1 -0
  72. package/build/esm/cli-service/OntologyServer.js +32 -0
  73. package/build/esm/cli-service/OntologyServer.js.map +1 -0
  74. package/build/esm/cli-service/ServiceDiscoverer.js +100 -0
  75. package/build/esm/cli-service/ServiceDiscoverer.js.map +1 -0
  76. package/build/esm/cli-service/StatusServer.js +91 -0
  77. package/build/esm/cli-service/StatusServer.js.map +1 -0
  78. package/build/esm/createIntegrationClient.js +67 -0
  79. package/build/esm/createIntegrationClient.js.map +1 -0
  80. package/build/esm/createIntegrationServer.js +115 -0
  81. package/build/esm/createIntegrationServer.js.map +1 -0
  82. package/build/esm/createSeedClient.js +77 -0
  83. package/build/esm/createSeedClient.js.map +1 -0
  84. package/build/esm/generated/cli/OntologySeedingService/setSeed.js +28 -0
  85. package/build/esm/generated/cli/OntologySeedingService/setSeed.js.map +1 -0
  86. package/build/esm/generated/cli/OntologySeedingService.js +19 -0
  87. package/build/esm/generated/cli/OntologySeedingService.js.map +1 -0
  88. package/build/esm/generated/cli/StatusService/getStatus.js +25 -0
  89. package/build/esm/generated/cli/StatusService/getStatus.js.map +1 -0
  90. package/build/esm/generated/cli/StatusService/publishStatus.js +26 -0
  91. package/build/esm/generated/cli/StatusService/publishStatus.js.map +1 -0
  92. package/build/esm/generated/cli/StatusService.js +20 -0
  93. package/build/esm/generated/cli/StatusService.js.map +1 -0
  94. package/build/esm/generated/cli/__components.js +2 -0
  95. package/build/esm/generated/cli/__components.js.map +1 -0
  96. package/build/esm/generated/cli/index.js +20 -0
  97. package/build/esm/generated/cli/index.js.map +1 -0
  98. package/build/esm/index.js +27 -0
  99. package/build/esm/index.js.map +1 -0
  100. package/build/esm/scripts/download.js +92 -0
  101. package/build/esm/scripts/download.js.map +1 -0
  102. package/build/esm/scripts/foundry-host.js +59 -0
  103. package/build/esm/scripts/foundry-host.js.map +1 -0
  104. package/build/esm/scripts/foundry-token.js +50 -0
  105. package/build/esm/scripts/foundry-token.js.map +1 -0
  106. package/build/esm/scripts/gitRemote.js +39 -0
  107. package/build/esm/scripts/gitRemote.js.map +1 -0
  108. package/build/esm/scripts/postinstall.js +38 -0
  109. package/build/esm/scripts/postinstall.js.map +1 -0
  110. package/build/esm/test/NoSpawnStatusServer.js +33 -0
  111. package/build/esm/test/NoSpawnStatusServer.js.map +1 -0
  112. package/build/esm/test/StubService.js +61 -0
  113. package/build/esm/test/StubService.js.map +1 -0
  114. package/build/esm/test/emptyOntologyMetadata.js +32 -0
  115. package/build/esm/test/emptyOntologyMetadata.js.map +1 -0
  116. package/build/esm/test/stubStatusServer.js +74 -0
  117. package/build/esm/test/stubStatusServer.js.map +1 -0
  118. package/build/esm/test/writeDiscoveryFile.js +39 -0
  119. package/build/esm/test/writeDiscoveryFile.js.map +1 -0
  120. package/build/esm/types.js +2 -0
  121. package/build/esm/types.js.map +1 -0
  122. package/build/esm/utils/empty-ontology-block.js +61 -0
  123. package/build/esm/utils/empty-ontology-block.js.map +1 -0
  124. package/build/esm/utils/foundry-cli.js +46 -0
  125. package/build/esm/utils/foundry-cli.js.map +1 -0
  126. package/build/esm/utils/process.js +26 -0
  127. package/build/esm/utils/process.js.map +1 -0
  128. package/build/esm/utils/service.js +33 -0
  129. package/build/esm/utils/service.js.map +1 -0
  130. package/build/types/cli-service/CliServiceLauncher.d.ts +36 -0
  131. package/build/types/cli-service/CliServiceLauncher.d.ts.map +1 -0
  132. package/build/types/cli-service/FoundryCliService.d.ts +60 -0
  133. package/build/types/cli-service/FoundryCliService.d.ts.map +1 -0
  134. package/build/types/cli-service/OntologyServer.d.ts +10 -0
  135. package/build/types/cli-service/OntologyServer.d.ts.map +1 -0
  136. package/build/types/cli-service/ServiceDiscoverer.d.ts +22 -0
  137. package/build/types/cli-service/ServiceDiscoverer.d.ts.map +1 -0
  138. package/build/types/cli-service/StatusServer.d.ts +17 -0
  139. package/build/types/cli-service/StatusServer.d.ts.map +1 -0
  140. package/build/types/createIntegrationClient.d.ts +2 -0
  141. package/build/types/createIntegrationClient.d.ts.map +1 -0
  142. package/build/types/createIntegrationServer.d.ts +2 -0
  143. package/build/types/createIntegrationServer.d.ts.map +1 -0
  144. package/build/types/createSeedClient.d.ts +9 -0
  145. package/build/types/createSeedClient.d.ts.map +1 -0
  146. package/build/types/generated/cli/OntologySeedingService/setSeed.d.ts +9 -0
  147. package/build/types/generated/cli/OntologySeedingService/setSeed.d.ts.map +1 -0
  148. package/build/types/generated/cli/OntologySeedingService.d.ts +1 -0
  149. package/build/types/generated/cli/OntologySeedingService.d.ts.map +1 -0
  150. package/build/types/generated/cli/StatusService/getStatus.d.ts +6 -0
  151. package/build/types/generated/cli/StatusService/getStatus.d.ts.map +1 -0
  152. package/build/types/generated/cli/StatusService/publishStatus.d.ts +7 -0
  153. package/build/types/generated/cli/StatusService/publishStatus.d.ts.map +1 -0
  154. package/build/types/generated/cli/StatusService.d.ts +2 -0
  155. package/build/types/generated/cli/StatusService.d.ts.map +1 -0
  156. package/build/types/generated/cli/__components.d.ts +189 -0
  157. package/build/types/generated/cli/__components.d.ts.map +1 -0
  158. package/build/types/generated/cli/index.d.ts +3 -0
  159. package/build/types/generated/cli/index.d.ts.map +1 -0
  160. package/build/types/index.d.ts +10 -0
  161. package/build/types/index.d.ts.map +1 -0
  162. package/build/types/scripts/download.d.ts +6 -0
  163. package/build/types/scripts/download.d.ts.map +1 -0
  164. package/build/types/scripts/foundry-host.d.ts +7 -0
  165. package/build/types/scripts/foundry-host.d.ts.map +1 -0
  166. package/build/types/scripts/foundry-token.d.ts +5 -0
  167. package/build/types/scripts/foundry-token.d.ts.map +1 -0
  168. package/build/types/scripts/gitRemote.d.ts +9 -0
  169. package/build/types/scripts/gitRemote.d.ts.map +1 -0
  170. package/build/types/scripts/postinstall.d.ts +1 -0
  171. package/build/types/scripts/postinstall.d.ts.map +1 -0
  172. package/build/types/test/NoSpawnStatusServer.d.ts +11 -0
  173. package/build/types/test/NoSpawnStatusServer.d.ts.map +1 -0
  174. package/build/types/test/StubService.d.ts +23 -0
  175. package/build/types/test/StubService.d.ts.map +1 -0
  176. package/build/types/test/emptyOntologyMetadata.d.ts +3 -0
  177. package/build/types/test/emptyOntologyMetadata.d.ts.map +1 -0
  178. package/build/types/test/stubStatusServer.d.ts +14 -0
  179. package/build/types/test/stubStatusServer.d.ts.map +1 -0
  180. package/build/types/test/writeDiscoveryFile.d.ts +8 -0
  181. package/build/types/test/writeDiscoveryFile.d.ts.map +1 -0
  182. package/build/types/types.d.ts +104 -0
  183. package/build/types/types.d.ts.map +1 -0
  184. package/build/types/utils/empty-ontology-block.d.ts +4 -0
  185. package/build/types/utils/empty-ontology-block.d.ts.map +1 -0
  186. package/build/types/utils/foundry-cli.d.ts +13 -0
  187. package/build/types/utils/foundry-cli.d.ts.map +1 -0
  188. package/build/types/utils/process.d.ts +1 -0
  189. package/build/types/utils/process.d.ts.map +1 -0
  190. package/build/types/utils/service.d.ts +4 -0
  191. package/build/types/utils/service.d.ts.map +1 -0
  192. package/package.json +93 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/createIntegrationClient.ts","../../src/cli-service/FoundryCliService.ts","../../src/utils/process.ts","../../src/utils/service.ts","../../src/cli-service/ServiceDiscoverer.ts","../../src/generated/cli/OntologySeedingService.ts","../../src/generated/cli/OntologySeedingService/setSeed.ts","../../src/generated/cli/StatusService.ts","../../src/generated/cli/StatusService/publishStatus.ts","../../src/generated/cli/StatusService/getStatus.ts","../../src/cli-service/StatusServer.ts","../../src/cli-service/CliServiceLauncher.ts","../../src/cli-service/OntologyServer.ts","../../src/createSeedClient.ts","../../src/utils/empty-ontology-block.ts","../../src/createIntegrationServer.ts","../../src/utils/foundry-cli.ts"],"names":["Agent","fs","undiciFetch","createClient","createMockClient","client","invariant","spawn","resolve","once","fs2","join","conjureFetch","path","setTimeout","isAbsolute","SeedBuilder","PreviewOntologyIrConverter","valid","gte","promisify","exec"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from \"node:fs/promises\";\nimport { createClient } from \"@osdk/client\";\nimport { createMockClient } from \"@osdk/unit-testing\";\nimport { fetch as undiciFetch, Agent } from \"undici\";\n\n/** The definition kinds accepted by {@link Client}'s call signatures. */\n\nexport async function createIntegrationClient(config) {\n const {\n baseUrl,\n metadata,\n caCertPath\n } = config;\n const agent = new Agent({\n connect: caCertPath ? {\n ca: await fs.readFile(caCertPath)\n } : {\n rejectUnauthorized: false\n }\n });\n const fetchWithCert = (input, init) => undiciFetch(input, {\n ...init,\n dispatcher: agent\n });\n const realClient = createClient(baseUrl, metadata.ontology.rid, () => Promise.resolve(\"integration-client-token\"), {}, fetchWithCert);\n const mockClient = createMockClient();\n const clientInternal = def => {\n switch (def.type) {\n case \"query\":\n return mockClient(def);\n case \"action\":\n return realClient(def);\n case \"interface\":\n return realClient(def);\n case \"object\":\n return realClient(def);\n case \"experiment\":\n default:\n return realClient(def);\n }\n };\n const client = Object.defineProperties(clientInternal, {\n ...Object.getOwnPropertyDescriptors(realClient),\n whenQuery: {\n value: mockClient.whenQuery.bind(undefined)\n },\n clearStubs: {\n value: mockClient.clearStubs.bind(undefined)\n }\n });\n return client;\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { once } from \"node:events\";\nimport invariant from \"tiny-invariant\";\nconst MAX_CAPTURED_STDERR_CHUNKS = 32;\nexport const DEFAULT_READY_TIMEOUT_MS = 30_000;\nexport const DEFAULT_STOP_GRACE_MS = 5_000;\n\n/**\n * The shared collaborators a service needs to answer questions about itself.\n * Injected by the launcher via {@link FoundryCliService.attach} so services do\n * not have to construct — or know how to reach — either one.\n */\n\nconst TERMINAL_STATES = new Set([\"FAILED\", \"STOPPED\"]);\n\n/**\n * One Foundry CLI service subprocess.\n *\n * Subclasses supply the `foundry` subcommand to run and, where the default is\n * wrong, how to tell that the service is up.\n *\n * Dependencies are declared but not enforced here: a service names what it needs\n * and {@link CliServiceLauncher} is what orders and awaits them.\n */\nexport class FoundryCliService {\n #foundryCliPath;\n #projectPath;\n #child;\n #context;\n #stderr = [];\n #exit;\n constructor(name, config) {\n this.name = name;\n this.dependencies = config.dependencies ?? [];\n this.#foundryCliPath = config.foundryCliPath ?? \"foundry\";\n this.#projectPath = config.projectPath;\n }\n getProjectPath() {\n return this.#projectPath;\n }\n getCaCertPath() {\n return this.#context?.discoverer.get(this.name)?.caCertPath ?? undefined;\n }\n getUrl() {\n return this.#context?.discoverer.get(this.name)?.url;\n }\n getExitInfo() {\n if (this.#exit === undefined) {\n return undefined;\n }\n const {\n code,\n signal\n } = this.#exit;\n return signal ?? `code ${code}`;\n }\n getCapturedStderr() {\n return this.#stderr.join(\"\").trim();\n }\n getContext() {\n const context = this.#context;\n !(context !== undefined) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${this.name} is not registered with a CliServiceLauncher, so it has ` + `no discoverer or status server to consult`) : invariant(false) : void 0;\n return context;\n }\n attach(context) {\n this.#context = context;\n }\n async start() {\n if (this.#child !== undefined) {\n return;\n }\n await this.getContext().discoverer.refresh();\n !!(await this.checkHealth()).ready ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${this.name} is already running; stop it before starting a new one`) : invariant(false) : void 0;\n await this.#spawn();\n }\n async #spawn() {\n this.#exit = undefined;\n this.#stderr = [];\n const child = spawn(this.#foundryCliPath, [...this.getArgs()], {\n cwd: this.#projectPath\n });\n this.#child = child;\n child.stderr.setEncoding(\"utf-8\");\n child.stderr.on(\"data\", chunk => {\n if (this.#stderr.push(chunk) > MAX_CAPTURED_STDERR_CHUNKS) {\n this.#stderr.shift();\n }\n });\n child.stdout.resume(); // flush, since we don't read from stdout\n child.on(\"exit\", (code, signal) => {\n this.#exit = {\n code,\n signal\n };\n });\n await new Promise((resolve, reject) => {\n child.once(\"spawn\", resolve);\n child.once(\"error\", error => reject(new Error(`Failed to spawn ${this.name} via ${this.#foundryCliPath}`, {\n cause: error\n })));\n });\n }\n async checkHealth() {\n const {\n discoverer,\n statusServer\n } = this.getContext();\n const discovery = discoverer.get(this.name);\n if (typeof discovery === \"undefined\") {\n return {\n service: this.name,\n state: \"UNDISCOVERED\",\n ready: false,\n terminal: false\n };\n }\n const status = await statusServer.getServiceStatus(this.name);\n const state = status?.status ?? \"DISCOVERED\";\n return {\n service: this.name,\n state,\n ready: state === \"READY\",\n terminal: TERMINAL_STATES.has(state),\n url: discovery.url,\n ...(status?.message != null ? {\n message: status.message\n } : {})\n };\n }\n\n /**\n * Signal the service and wait for the process to actually be gone.\n */\n async stop() {\n const child = this.#child;\n this.#child = undefined;\n if (child === undefined || child.exitCode != null || child.signalCode != null) {\n return;\n }\n const exited = once(child, \"exit\");\n child.kill(\"SIGINT\");\n const escalation = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, DEFAULT_STOP_GRACE_MS);\n try {\n await exited;\n } finally {\n clearTimeout(escalation);\n }\n }\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const isProcessAlive = pid => {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means the process exists but is owned by another user.\n return err.code === \"EPERM\";\n }\n};","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst SERVICE_FILE_NAMES = {\n ONTOLOGY: \"ontology\",\n TYPESCRIPT_FUNCTIONS: \"typescript-functions\",\n PYTHON_FUNCTIONS: \"python-functions\",\n APP: \"app\",\n STATUS_SERVER: \"status-server\",\n PLATFORM_API_PROXY: \"platform-api-proxy\"\n};\nconst SERVICE_NAMES_BY_FILE_NAME = new Map(Object.entries(SERVICE_FILE_NAMES).map(([name, stem]) => [stem, name]));\nexport const serviceNameFromFileName = fileName => {\n const name = fileName.match(/^\\.?(?<name>.+)-discovery\\.json$/u)?.groups?.name;\n return name === undefined ? undefined : SERVICE_NAMES_BY_FILE_NAME.get(name);\n};\n\n/** The name a running service publishes its discovery record under. */\nexport const discoveryFileName = name => `.${SERVICE_FILE_NAMES[name]}-discovery.json`;","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport { isProcessAlive } from \"../utils/process.js\";\nimport { serviceNameFromFileName } from \"../utils/service.js\";\n/**\n * Reads the discovery files that running Foundry services publish into\n * `basePath`.\n */\nexport class ServiceDiscoverer {\n #basePath;\n #discovered = new Map();\n constructor(args) {\n this.#basePath = args.basePath;\n }\n get discoveryDir() {\n return this.#basePath;\n }\n async start() {\n await fs.mkdir(this.#basePath, {\n recursive: true\n });\n await this.refresh();\n }\n\n /**\n * Re-read every discovery file in the directory.\n */\n async refresh() {\n const fileNames = await fs.readdir(this.#basePath);\n const discoveries = await Promise.all(fileNames.map(fileName => this.#read(fileName)));\n return discoveries.filter(discovery => discovery !== undefined);\n }\n get(name) {\n const discovery = this.#discovered.get(name);\n if (typeof discovery === \"undefined\") {\n return undefined;\n }\n if (!isProcessAlive(discovery.pid)) {\n this.#discovered.delete(name); // Stale: the publisher died without cleaning up after itself.\n return undefined;\n }\n return discovery;\n }\n isDiscovered(name) {\n return this.get(name) !== undefined;\n }\n all() {\n const live = new Map();\n for (const name of this.#discovered.keys()) {\n const discovery = this.get(name);\n if (discovery !== undefined) {\n live.set(name, discovery);\n }\n }\n return live;\n }\n stop() {\n this.#discovered.clear();\n }\n async #read(fileName) {\n const serviceName = serviceNameFromFileName(fileName);\n if (typeof serviceName === \"undefined\") {\n return undefined;\n }\n let contents;\n try {\n contents = await fs.readFile(join(this.#basePath, fileName), \"utf-8\");\n } catch {\n this.#discovered.delete(serviceName);\n return undefined;\n }\n let parsed;\n try {\n parsed = JSON.parse(contents);\n } catch {\n return undefined;\n }\n !parsed.url ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Service URL not found`) : invariant(false) : void 0;\n this.#discovered.set(serviceName, parsed);\n return parsed;\n }\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**/\nexport { setSeed } from \"./OntologySeedingService/setSeed.js\";","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**/\nimport { conjureFetch } from \"conjure-lite\";\n/**\n * Sets the seed state of the local ontology server. Succeeds with an\n * empty `200` response; failures surface as errors: 400 for a malformed\n * request body, 503 while the server is still starting, and 500 (with\n * the underlying detail) for seeding failures.\n */\nexport async function setSeed(ctx, seed) {\n return conjureFetch(ctx, `/seed`, \"PUT\", seed);\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**/\nexport { publishStatus } from \"./StatusService/publishStatus.js\";\nexport { getStatus } from \"./StatusService/getStatus.js\";","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**/\nimport { conjureFetch } from \"conjure-lite\";\n/**\n * Publish a lifecycle event. Called by services whenever a status\n * transition occurs.\n */\nexport async function publishStatus(ctx, status) {\n return conjureFetch(ctx, `/status`, \"POST\", status);\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**/\nimport { conjureFetch } from \"conjure-lite\";\n/**\n * Return the current status of all services.\n */\nexport async function getStatus(ctx) {\n return conjureFetch(ctx, `/status`, \"GET\");\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport { StatusService } from \"../generated/cli/index.js\";\nimport { FoundryCliService } from \"./FoundryCliService.js\";\nconst HEALTH_REQUEST_TIMEOUT_MS = 2_000;\n/**\n * The local status server, and the health authority for every other service.\n */\nexport class StatusServer extends FoundryCliService {\n /** Shared by callers that ask while a fetch is already outstanding. */\n #inFlight;\n constructor(config) {\n super(\"STATUS_SERVER\", config);\n }\n getArgs() {\n // force project path to cwd\n return [\"start\", \"status-server\", \"--discovery-path\", path.resolve(this.getProjectPath(), \".palantir\")];\n }\n async checkHealth() {\n const discovery = this.getContext().discoverer.get(\"STATUS_SERVER\");\n if (discovery === undefined) {\n return {\n service: \"STATUS_SERVER\",\n state: \"UNDISCOVERED\",\n ready: false,\n terminal: false\n };\n }\n const healthy = await this.#isHealthy(discovery.url);\n return {\n service: \"STATUS_SERVER\",\n state: healthy ? \"READY\" : \"DISCOVERED\",\n ready: healthy,\n terminal: false,\n url: discovery.url\n };\n }\n async #isHealthy(baseUrl) {\n try {\n const response = await fetch(new URL(\"/api/health\", baseUrl), {\n signal: AbortSignal.timeout(HEALTH_REQUEST_TIMEOUT_MS)\n });\n if (!response.ok) {\n return false;\n }\n const body = await response.json();\n return body.status === \"healthy\";\n } catch {\n return false;\n }\n }\n\n /**\n * The lifecycle snapshot for every service.\n */\n async getServiceStatuses() {\n const baseUrl = this.getContext().discoverer.get(\"STATUS_SERVER\")?.url;\n !baseUrl ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot get service status because the status server is not discovered yet\") : invariant(false) : void 0;\n this.#inFlight ??= StatusService.getStatus({\n baseUrl,\n servicePath: \"\"\n }).catch(() => undefined).finally(() => {\n this.#inFlight = undefined;\n });\n const result = await this.#inFlight;\n return result ?? [];\n }\n async getServiceStatus(name) {\n const statuses = await this.getServiceStatuses();\n return statuses.find(({\n service\n }) => service === name);\n }\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\nimport invariant from \"tiny-invariant\";\nimport { DEFAULT_READY_TIMEOUT_MS } from \"./FoundryCliService.js\";\nimport { ServiceDiscoverer } from \"./ServiceDiscoverer.js\";\nimport { StatusServer } from \"./StatusServer.js\";\nconst HEALTH_POLL_INTERVAL_MS = 200;\n/**\n * Brings a set of Foundry services. Includes a status server by default.\n */\nexport class CliServiceLauncher {\n #discoverer;\n #statusServer;\n #services = new Map();\n\n /** Memoized in-flight starts, so a shared dependency is started once. */\n #starts = new Map();\n #started = false;\n constructor(config = {}) {\n const projectDir = config.projectDir ?? process.cwd();\n this.#discoverer = new ServiceDiscoverer({\n basePath: path.resolve(projectDir, \".palantir\")\n });\n this.#statusServer = config.statusServer ?? new StatusServer({\n projectPath: projectDir,\n foundryCliPath: config.foundryCliPath\n });\n this.register(this.#statusServer);\n }\n get services() {\n return [...this.#services.values()];\n }\n get(name) {\n return this.#services.get(name);\n }\n register(service) {\n const existing = this.#services.get(service.name);\n if (existing === service) {\n return service;\n }\n !(existing === undefined) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `A different ${service.name} service is already registered`) : invariant(false) : void 0;\n this.#services.set(service.name, service);\n service.attach({\n discoverer: this.#discoverer,\n statusServer: this.#statusServer\n });\n for (const dependency of service.dependencies) {\n this.register(dependency);\n }\n return service;\n }\n async start() {\n await this.#ensureDiscovering();\n this.#assertAcyclic();\n const results = await Promise.allSettled([...this.#services.values()].map(service => this.#start(service)));\n const failed = results.find(result => result.status === \"rejected\");\n if (failed !== undefined) {\n await this.stop();\n throw failed.reason;\n }\n }\n async startService(service) {\n this.register(service);\n await this.#ensureDiscovering();\n this.#assertAcyclic();\n await this.#start(service);\n }\n async #ensureDiscovering() {\n if (!this.#started) {\n await this.#discoverer.start();\n this.#started = true;\n }\n }\n async #start(service) {\n const runningPromise = this.#starts.get(service.name);\n if (typeof runningPromise !== \"undefined\") {\n return runningPromise;\n }\n const started = this.#startImmediate(service);\n this.#starts.set(service.name, started);\n try {\n await started;\n } catch (err) {\n this.#starts.delete(service.name);\n throw err;\n }\n }\n async #startImmediate(service) {\n await Promise.all(this.#prerequisites(service).map(dependency => this.#start(dependency)));\n await service.start();\n await this.waitUntilReady(service);\n }\n\n /**\n * Everything that must be ready before `service` may start: its declared\n * dependencies, plus the status server.\n */\n #prerequisites(service) {\n return service.name === this.#statusServer.name ? service.dependencies : [this.#statusServer, ...service.dependencies];\n }\n\n /**\n * Poll a service's health until it is ready, reaches a terminal state, or\n * exceeds its timeout.\n */\n async waitUntilReady(service) {\n const deadline = Date.now() + DEFAULT_READY_TIMEOUT_MS;\n let health = await service.checkHealth();\n while (!health.ready) {\n const current = health;\n const notReady = () => `${service.name} is not ready (${current.state})${formatError(service, current)}`;\n !!current.terminal ? process.env.NODE_ENV !== \"production\" ? invariant(false, notReady) : invariant(false) : void 0;\n !(service.getExitInfo() === undefined) ? process.env.NODE_ENV !== \"production\" ? invariant(false, notReady) : invariant(false) : void 0;\n !(Date.now() < deadline) ? process.env.NODE_ENV !== \"production\" ? invariant(false, () => `${service.name} is not ready (${current.state}) within ` + `${DEFAULT_READY_TIMEOUT_MS}ms${formatError(service, current)}`) : invariant(false) : void 0;\n await setTimeout(HEALTH_POLL_INTERVAL_MS);\n await this.#discoverer.refresh();\n health = await service.checkHealth();\n }\n return health;\n }\n async checkHealth() {\n await this.#discoverer.refresh();\n return Promise.all([...this.#services.values()].map(service => service.checkHealth()));\n }\n async checkDependencies(service) {\n await this.#discoverer.refresh();\n return Promise.all(service.dependencies.map(dependency => dependency.checkHealth()));\n }\n async dependenciesReady(service) {\n const healths = await this.checkDependencies(service);\n return healths.every(({\n ready\n }) => ready);\n }\n\n /**\n * Stop every service, dependents before their dependencies, waiting for each\n * process to be gone before the next is signalled.\n */\n async stop() {\n for (const service of this.#startupOrder().reverse()) {\n await service.stop();\n }\n this.#starts.clear();\n this.#discoverer.stop();\n this.#started = false;\n }\n\n /**\n * Registered services in a valid startup order: every service appears after\n * everything it depends on.\n */\n #startupOrder() {\n const ordered = [];\n const seen = new Set();\n const visit = service => {\n if (seen.has(service.name)) {\n return;\n }\n seen.add(service.name);\n for (const dependency of this.#prerequisites(service)) {\n visit(dependency);\n }\n ordered.push(service);\n };\n for (const service of this.#services.values()) {\n visit(service);\n }\n return ordered;\n }\n #assertAcyclic() {\n const settled = new Set();\n const visit = (service, walkedPath) => {\n if (settled.has(service.name)) {\n return;\n }\n const cycleStart = walkedPath.indexOf(service.name);\n !(cycleStart === -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, () => `Dependency cycle between services: ${[...walkedPath.slice(cycleStart), service.name].join(\" -> \")}`) : invariant(false) : void 0;\n for (const dependency of this.#prerequisites(service)) {\n visit(dependency, [...walkedPath, service.name]);\n }\n settled.add(service.name);\n };\n for (const service of this.#services.values()) {\n visit(service, []);\n }\n }\n}\nconst formatError = (service, health) => {\n const parts = [];\n if (health.message != null && health.message.length > 0) {\n parts.push(health.message);\n }\n const exit = service.getExitInfo();\n if (exit !== undefined) {\n parts.push(`the process exited (${exit})`);\n }\n const stderr = service.getCapturedStderr();\n if (stderr.length > 0) {\n parts.push(`stderr:\\n${stderr}`);\n }\n return parts.length === 0 ? \"\" : `: ${parts.join(\"; \")}`;\n};","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path, { isAbsolute, resolve } from \"node:path\";\nimport { FoundryCliService } from \"./FoundryCliService.js\";\nexport class OntologyServer extends FoundryCliService {\n #metadataPath;\n constructor(config) {\n super(\"ONTOLOGY\", config);\n this.#metadataPath = isAbsolute(config.metadataPath) ? config.metadataPath : resolve(config.projectPath, config.metadataPath);\n }\n getMetadataPath() {\n return this.#metadataPath;\n }\n getArgs() {\n return [\"start\", \"ontology\", \"--skip-build\", \"--metadata\", this.#metadataPath, \"--discovery-path\", path.resolve(this.getProjectPath(), \".palantir\")];\n }\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeedBuilder } from \"@osdk/seed-helpers\";\nimport { OntologySeedingService } from \"./generated/cli/index.js\";\nexport function createSeedClient(config) {\n const {\n baseUrl,\n metadata,\n fetchFn\n } = config;\n const builder = new SeedBuilder(metadata);\n const seedClientFunction = async seed => {\n let result;\n if (typeof seed === \"function\") {\n result = seed(builder);\n } else {\n builder.addAll(seed);\n }\n await applySeed(builder.build());\n return result;\n };\n const applySeed = async seed => {\n const res = await OntologySeedingService.setSeed({\n baseUrl,\n servicePath: \"/api\",\n fetchFn\n }, seed);\n return res;\n };\n const seedClientUtils = {\n ref: (o, pk) => builder.ref(o, pk),\n addAll: async output => {\n builder.addAll(output);\n await applySeed(builder.build());\n },\n set: async output => {\n builder.set(output);\n await applySeed(builder.build());\n },\n create: async (o, props) => {\n const ref = builder.create(o, props);\n await applySeed(builder.build());\n return ref;\n },\n update: async (ref, props) => {\n const returnedRef = builder.update(ref, props);\n await applySeed(builder.build());\n return returnedRef;\n },\n delete: async ref => {\n builder.delete(ref);\n await applySeed(builder.build());\n },\n link: async (source, apiName, target) => {\n builder.link(source, apiName, target);\n await applySeed(builder.build());\n },\n unlink: async (source, apiName, target) => {\n builder.unlink(source, apiName, target);\n await applySeed(builder.build());\n }\n };\n return Object.defineProperties(seedClientFunction, Object.getOwnPropertyDescriptors(seedClientUtils));\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const EMPTY_ONTOLOGY_BLOCK_DATA = {\n objectTypes: {},\n sharedPropertyTypes: {},\n interfaceTypes: {},\n linkTypes: {},\n actionTypes: {},\n blockPermissionInformation: {\n actionTypes: {},\n objectTypes: {},\n linkTypes: {},\n interfaceTypes: {},\n sharedPropertyTypes: {}\n },\n blockOutputCompassLocations: {},\n knownIdentifiers: {\n actionParameterIds: {},\n actionParameters: {},\n actionTypes: {},\n datasourceColumns: {},\n datasources: {},\n filesDatasources: {},\n functions: {},\n geotimeSeriesSyncs: {},\n groupIds: {},\n interfaceActionTypeConstraints: {},\n interfaceLinkTypes: {},\n interfaceParameterConstraints: {},\n interfacePropertyTypes: {},\n interfaceTypes: {},\n linkTypeIds: {},\n linkTypes: {},\n markings: {},\n objectTypeIds: {},\n objectTypes: {},\n propertyTypeIds: {},\n propertyTypes: {},\n sharedPropertyTypes: {},\n timeSeriesSyncs: {},\n valueTypes: {},\n webhooks: {},\n workshopModules: {}\n },\n ruleSets: {}\n};","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { PreviewOntologyIrConverter } from \"@osdk/generator-converters.preview\";\nimport invariant from \"tiny-invariant\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\nimport { CliServiceLauncher } from \"./cli-service/CliServiceLauncher.js\";\nimport { OntologyServer } from \"./cli-service/OntologyServer.js\";\nimport { createIntegrationClient } from \"./createIntegrationClient.js\";\nimport { createSeedClient } from \"./createSeedClient.js\";\nimport { EMPTY_ONTOLOGY_BLOCK_DATA } from \"./utils/empty-ontology-block.js\";\nconst transformMetadata = metadata => {\n const transformed = PreviewOntologyIrConverter.getPreviewFullMetadataFromBlockData(EMPTY_ONTOLOGY_BLOCK_DATA, metadata);\n return {\n ...transformed,\n ontology: metadata.ontology\n };\n};\nconst writeMetadata = async args => {\n const {\n metadataPath,\n previewMetadata\n } = args;\n const stringified = JSON.stringify(previewMetadata);\n await fs.writeFile(metadataPath, stringified);\n};\nexport async function createIntegrationServer(config) {\n const {\n metadata,\n projectPath = process.cwd(),\n foundryCliPath\n } = config;\n const testPath = await fs.mkdtemp(path.join(projectPath, \".test-run-\"));\n const metadataPath = path.resolve(testPath, \"ontology-metadata.json\");\n const previewMetadata = transformMetadata(metadata);\n const serviceLauncher = new CliServiceLauncher({\n projectDir: testPath,\n foundryCliPath\n });\n // write metadata to metadataPath for foundry cli to read from\n await writeMetadata({\n previewMetadata,\n metadataPath\n });\n const ontology = serviceLauncher.register(new OntologyServer({\n projectPath: testPath,\n metadataPath,\n foundryCliPath\n }));\n\n // stateful cache of client and seed client\n let client;\n let seedClient;\n return {\n getOntologyUrl: () => ontology.getUrl(),\n start: async () => {\n await serviceLauncher.start();\n },\n stop: async () => {\n await serviceLauncher.stop();\n await fs.rm(testPath, {\n recursive: true,\n force: true\n });\n },\n getSeedClient: async () => {\n if (seedClient !== undefined) return seedClient;\n const baseUrl = ontology.getUrl();\n !baseUrl ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Ontology server is not ready\") : invariant(false) : void 0;\n const caCertPath = ontology.getCaCertPath();\n !caCertPath ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Ontology server is not ready\") : invariant(false) : void 0;\n const agent = new Agent({\n connect: caCertPath ? {\n ca: await fs.readFile(caCertPath)\n } : {\n rejectUnauthorized: false\n }\n });\n const fetchWithCert = (input, init) => undiciFetch(input, {\n ...init,\n dispatcher: agent\n });\n return seedClient = createSeedClient({\n baseUrl,\n metadata,\n fetchFn: fetchWithCert\n });\n },\n getClient: async () => {\n if (client !== undefined) return client;\n const baseUrl = ontology.getUrl();\n !baseUrl ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Ontology server is not ready\") : invariant(false) : void 0;\n return client = await createIntegrationClient({\n baseUrl,\n metadata,\n caCertPath: ontology.getCaCertPath()\n });\n }\n };\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { gte, valid } from \"semver\";\nexport const MIN_FOUNDRY_CLI_VERSION = \"0.224.0\";\nconst FOUNDRY_VERSION_PATTERN = /cli (\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)/u;\nconst parseFoundryVersion = stdout => stdout.trim().match(FOUNDRY_VERSION_PATTERN)?.[1];\nconst versionIsAtMinimum = (version, min) => valid(version) != null && valid(min) != null && gte(version, min);\nconst execAsync = promisify(exec);\nexport const checkFoundryCliVersion = () => {\n return execAsync(\"which foundry\").then(() => execAsync(\"foundry --version\")).then(({\n stdout\n }) => {\n const version = parseFoundryVersion(stdout);\n if (!version) return {\n type: \"version-error\"\n };\n const isMin = versionIsAtMinimum(version, MIN_FOUNDRY_CLI_VERSION);\n if (!isMin) return {\n type: \"version-incompatible\",\n version\n };\n return {\n type: \"installed\",\n version\n };\n }).catch(() => ({\n type: \"not-found\"\n }));\n};"]}
@@ -0,0 +1,118 @@
1
+ import { PrimaryKeyType, LinkTypeApiNamesFor } from '@osdk/api';
2
+ import { Client, ObjectTypeDefinition } from '@osdk/client';
3
+ import { OntologyFullMetadata } from '@osdk/foundry.ontologies';
4
+ import { SeedFunction, SeedOutput, SeedRef, SeedProps, LinkTargets } from '@osdk/seed-helpers';
5
+ import { MockClient } from '@osdk/unit-testing';
6
+
7
+ type IntegrationClient = Client & {
8
+ whenQuery: MockClient["whenQuery"];
9
+ clearStubs(): MockClient["clearStubs"];
10
+ };
11
+ interface IntegrationClientConfig {
12
+ baseUrl: string;
13
+ metadata: OntologyFullMetadata;
14
+ caCertPath?: string;
15
+ }
16
+ interface IntegrationServerConfig {
17
+ /** Path to a prebuilt ontology metadata JSON. */
18
+ metadata: OntologyFullMetadata;
19
+ /** Path to the `foundry` binary. Defaults to `foundry` on `PATH`. */
20
+ foundryCliPath?: string;
21
+ /**
22
+ * Directory to create this server's run directory in. Each server gets its
23
+ * own `.test-run-*` beneath it, removed on {@link IntegrationServer.stop}, so
24
+ * servers sharing a `projectPath` stay isolated. Must already exist; defaults
25
+ * to the working directory.
26
+ */
27
+ projectPath?: string;
28
+ }
29
+ interface IntegrationServer {
30
+ start(): Promise<void>;
31
+ stop(): Promise<void>;
32
+ getOntologyUrl(): string | undefined;
33
+ getSeedClient(): Promise<SeedClient>;
34
+ getClient(): Promise<IntegrationClient>;
35
+ }
36
+ type SeedClient = {
37
+ /**
38
+ * Transactional interface to SeedBuilder
39
+ * Applies changes if function is provided, calls .addAll(seed) if SeedOutput is provided.
40
+ */
41
+ <T = void>(seed: SeedFunction<T> | SeedOutput): Promise<T>;
42
+ /**
43
+ * Returns a reference to an object already in the seed, or `undefined` if none
44
+ * exists. Read-only: nothing is applied to the server.
45
+ * @param o Object type definition
46
+ * @param primaryKey Primary key value of the object
47
+ * @returns Reference to the object, or `undefined` if not found
48
+ */
49
+ ref<Q extends ObjectTypeDefinition>(o: Q, primaryKey: PrimaryKeyType<Q>): SeedRef<Q> | undefined;
50
+ /**
51
+ * Replaces the entire seed with `seed` and applies it, discarding everything
52
+ * accumulated so far. Clears the seed when called with no argument.
53
+ * @param seed Seed output to reset to, or `undefined` to clear
54
+ */
55
+ set(seed?: SeedOutput): Promise<void>;
56
+ /**
57
+ * Merges an existing seed output into the current seed and applies it.
58
+ * @param seed Seed output to merge in; must match the metadata the client was created with
59
+ */
60
+ addAll(seed: SeedOutput): Promise<void>;
61
+ /**
62
+ * Creates an object of the given type and applies the seed.
63
+ * @param o Object type definition
64
+ * @param props Object properties, including its primary key
65
+ * @returns Reference to the created object
66
+ * @throws {Error} if an object of that type already exists with the same primary key
67
+ */
68
+ create<Q extends ObjectTypeDefinition>(o: Q, props: SeedProps<Q>): Promise<SeedRef<Q>>;
69
+ /**
70
+ * Merges `props` into the referenced object and applies the seed. Properties not
71
+ * included are left unchanged; the object is created if it does not yet exist.
72
+ * @param ref Reference to the object to update
73
+ * @param props Partial object properties to merge in, excluding the primary key
74
+ * @returns The same reference passed in
75
+ */
76
+ update<Q extends ObjectTypeDefinition>(ref: SeedRef<Q>, props: Partial<Omit<SeedProps<Q>, Exclude<Q["primaryKeyApiName"], undefined>>>): Promise<SeedRef<Q>>;
77
+ /**
78
+ * Removes the referenced object from the seed and applies it. No-op if the object
79
+ * does not exist.
80
+ * @param ref Reference to the object to delete
81
+ */
82
+ delete<Q extends ObjectTypeDefinition>(ref: SeedRef<Q>): Promise<void>;
83
+ /**
84
+ * Links the source object to one or more targets via the given link type and
85
+ * applies the seed. Re-adding an existing link is a no-op.
86
+ * @param source Reference to the source object
87
+ * @param apiName Link type API name
88
+ * @param target Reference (or references) to the target object(s)
89
+ */
90
+ link<Q extends ObjectTypeDefinition, A extends LinkTypeApiNamesFor<Q>>(source: SeedRef<Q>, apiName: A, target: LinkTargets<Q, A>): Promise<void>;
91
+ /**
92
+ * Removes links from the source object to the given targets via the link type and
93
+ * applies the seed. No-op if no matching links exist.
94
+ * @param source Reference to the source object
95
+ * @param apiName Link type API name
96
+ * @param target Reference (or references) to the target object(s)
97
+ */
98
+ unlink<Q extends ObjectTypeDefinition, A extends LinkTypeApiNamesFor<Q>>(source: SeedRef<Q>, apiName: A, target: LinkTargets<Q, A>): Promise<void>;
99
+ };
100
+
101
+ declare function createIntegrationClient(config: IntegrationClientConfig): Promise<IntegrationClient>;
102
+
103
+ declare function createIntegrationServer(config: IntegrationServerConfig): Promise<IntegrationServer>;
104
+
105
+ type FoundryProbeResult = {
106
+ type: "installed";
107
+ version: string;
108
+ } | {
109
+ type: "version-incompatible";
110
+ version: string;
111
+ } | {
112
+ type: "version-error";
113
+ } | {
114
+ type: "not-found";
115
+ };
116
+ declare const checkFoundryCliVersion: () => Promise<FoundryProbeResult>;
117
+
118
+ export { type IntegrationClient, type IntegrationClientConfig, type IntegrationServer, type IntegrationServerConfig, type SeedClient, checkFoundryCliVersion, createIntegrationClient, createIntegrationServer };
@@ -0,0 +1,220 @@
1
+ /*
2
+ * Copyright 2026 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import path from "node:path";
18
+ import { setTimeout } from "node:timers/promises";
19
+ import invariant from "tiny-invariant";
20
+ import { DEFAULT_READY_TIMEOUT_MS } from "./FoundryCliService.js";
21
+ import { ServiceDiscoverer } from "./ServiceDiscoverer.js";
22
+ import { StatusServer } from "./StatusServer.js";
23
+ const HEALTH_POLL_INTERVAL_MS = 200;
24
+ /**
25
+ * Brings a set of Foundry services. Includes a status server by default.
26
+ */
27
+ export class CliServiceLauncher {
28
+ #discoverer;
29
+ #statusServer;
30
+ #services = new Map();
31
+
32
+ /** Memoized in-flight starts, so a shared dependency is started once. */
33
+ #starts = new Map();
34
+ #started = false;
35
+ constructor(config = {}) {
36
+ const projectDir = config.projectDir ?? process.cwd();
37
+ this.#discoverer = new ServiceDiscoverer({
38
+ basePath: path.resolve(projectDir, ".palantir")
39
+ });
40
+ this.#statusServer = config.statusServer ?? new StatusServer({
41
+ projectPath: projectDir,
42
+ foundryCliPath: config.foundryCliPath
43
+ });
44
+ this.register(this.#statusServer);
45
+ }
46
+ get services() {
47
+ return [...this.#services.values()];
48
+ }
49
+ get(name) {
50
+ return this.#services.get(name);
51
+ }
52
+ register(service) {
53
+ const existing = this.#services.get(service.name);
54
+ if (existing === service) {
55
+ return service;
56
+ }
57
+ !(existing === undefined) ? process.env.NODE_ENV !== "production" ? invariant(false, `A different ${service.name} service is already registered`) : invariant(false) : void 0;
58
+ this.#services.set(service.name, service);
59
+ service.attach({
60
+ discoverer: this.#discoverer,
61
+ statusServer: this.#statusServer
62
+ });
63
+ for (const dependency of service.dependencies) {
64
+ this.register(dependency);
65
+ }
66
+ return service;
67
+ }
68
+ async start() {
69
+ await this.#ensureDiscovering();
70
+ this.#assertAcyclic();
71
+ const results = await Promise.allSettled([...this.#services.values()].map(service => this.#start(service)));
72
+ const failed = results.find(result => result.status === "rejected");
73
+ if (failed !== undefined) {
74
+ await this.stop();
75
+ throw failed.reason;
76
+ }
77
+ }
78
+ async startService(service) {
79
+ this.register(service);
80
+ await this.#ensureDiscovering();
81
+ this.#assertAcyclic();
82
+ await this.#start(service);
83
+ }
84
+ async #ensureDiscovering() {
85
+ if (!this.#started) {
86
+ await this.#discoverer.start();
87
+ this.#started = true;
88
+ }
89
+ }
90
+ async #start(service) {
91
+ const runningPromise = this.#starts.get(service.name);
92
+ if (typeof runningPromise !== "undefined") {
93
+ return runningPromise;
94
+ }
95
+ const started = this.#startImmediate(service);
96
+ this.#starts.set(service.name, started);
97
+ try {
98
+ await started;
99
+ } catch (err) {
100
+ this.#starts.delete(service.name);
101
+ throw err;
102
+ }
103
+ }
104
+ async #startImmediate(service) {
105
+ await Promise.all(this.#prerequisites(service).map(dependency => this.#start(dependency)));
106
+ await service.start();
107
+ await this.waitUntilReady(service);
108
+ }
109
+
110
+ /**
111
+ * Everything that must be ready before `service` may start: its declared
112
+ * dependencies, plus the status server.
113
+ */
114
+ #prerequisites(service) {
115
+ return service.name === this.#statusServer.name ? service.dependencies : [this.#statusServer, ...service.dependencies];
116
+ }
117
+
118
+ /**
119
+ * Poll a service's health until it is ready, reaches a terminal state, or
120
+ * exceeds its timeout.
121
+ */
122
+ async waitUntilReady(service) {
123
+ const deadline = Date.now() + DEFAULT_READY_TIMEOUT_MS;
124
+ let health = await service.checkHealth();
125
+ while (!health.ready) {
126
+ const current = health;
127
+ const notReady = () => `${service.name} is not ready (${current.state})${formatError(service, current)}`;
128
+ !!current.terminal ? process.env.NODE_ENV !== "production" ? invariant(false, notReady) : invariant(false) : void 0;
129
+ !(service.getExitInfo() === undefined) ? process.env.NODE_ENV !== "production" ? invariant(false, notReady) : invariant(false) : void 0;
130
+ !(Date.now() < deadline) ? process.env.NODE_ENV !== "production" ? invariant(false, () => `${service.name} is not ready (${current.state}) within ` + `${DEFAULT_READY_TIMEOUT_MS}ms${formatError(service, current)}`) : invariant(false) : void 0;
131
+ await setTimeout(HEALTH_POLL_INTERVAL_MS);
132
+ await this.#discoverer.refresh();
133
+ health = await service.checkHealth();
134
+ }
135
+ return health;
136
+ }
137
+ async checkHealth() {
138
+ await this.#discoverer.refresh();
139
+ return Promise.all([...this.#services.values()].map(service => service.checkHealth()));
140
+ }
141
+ async checkDependencies(service) {
142
+ await this.#discoverer.refresh();
143
+ return Promise.all(service.dependencies.map(dependency => dependency.checkHealth()));
144
+ }
145
+ async dependenciesReady(service) {
146
+ const healths = await this.checkDependencies(service);
147
+ return healths.every(({
148
+ ready
149
+ }) => ready);
150
+ }
151
+
152
+ /**
153
+ * Stop every service, dependents before their dependencies, waiting for each
154
+ * process to be gone before the next is signalled.
155
+ */
156
+ async stop() {
157
+ for (const service of this.#startupOrder().reverse()) {
158
+ await service.stop();
159
+ }
160
+ this.#starts.clear();
161
+ this.#discoverer.stop();
162
+ this.#started = false;
163
+ }
164
+
165
+ /**
166
+ * Registered services in a valid startup order: every service appears after
167
+ * everything it depends on.
168
+ */
169
+ #startupOrder() {
170
+ const ordered = [];
171
+ const seen = new Set();
172
+ const visit = service => {
173
+ if (seen.has(service.name)) {
174
+ return;
175
+ }
176
+ seen.add(service.name);
177
+ for (const dependency of this.#prerequisites(service)) {
178
+ visit(dependency);
179
+ }
180
+ ordered.push(service);
181
+ };
182
+ for (const service of this.#services.values()) {
183
+ visit(service);
184
+ }
185
+ return ordered;
186
+ }
187
+ #assertAcyclic() {
188
+ const settled = new Set();
189
+ const visit = (service, walkedPath) => {
190
+ if (settled.has(service.name)) {
191
+ return;
192
+ }
193
+ const cycleStart = walkedPath.indexOf(service.name);
194
+ !(cycleStart === -1) ? process.env.NODE_ENV !== "production" ? invariant(false, () => `Dependency cycle between services: ${[...walkedPath.slice(cycleStart), service.name].join(" -> ")}`) : invariant(false) : void 0;
195
+ for (const dependency of this.#prerequisites(service)) {
196
+ visit(dependency, [...walkedPath, service.name]);
197
+ }
198
+ settled.add(service.name);
199
+ };
200
+ for (const service of this.#services.values()) {
201
+ visit(service, []);
202
+ }
203
+ }
204
+ }
205
+ const formatError = (service, health) => {
206
+ const parts = [];
207
+ if (health.message != null && health.message.length > 0) {
208
+ parts.push(health.message);
209
+ }
210
+ const exit = service.getExitInfo();
211
+ if (exit !== undefined) {
212
+ parts.push(`the process exited (${exit})`);
213
+ }
214
+ const stderr = service.getCapturedStderr();
215
+ if (stderr.length > 0) {
216
+ parts.push(`stderr:\n${stderr}`);
217
+ }
218
+ return parts.length === 0 ? "" : `: ${parts.join("; ")}`;
219
+ };
220
+ //# sourceMappingURL=CliServiceLauncher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliServiceLauncher.js","names":["path","setTimeout","invariant","DEFAULT_READY_TIMEOUT_MS","ServiceDiscoverer","StatusServer","HEALTH_POLL_INTERVAL_MS","CliServiceLauncher","discoverer","statusServer","services","Map","starts","started","constructor","config","projectDir","process","cwd","basePath","resolve","projectPath","foundryCliPath","register","values","get","name","service","existing","undefined","env","NODE_ENV","set","attach","dependency","dependencies","start","ensureDiscovering","assertAcyclic","results","Promise","allSettled","map","failed","find","result","status","stop","reason","startService","#ensureDiscovering","#start","runningPromise","startImmediate","err","delete","#startImmediate","all","prerequisites","waitUntilReady","#prerequisites","deadline","Date","now","health","checkHealth","ready","current","notReady","state","formatError","terminal","getExitInfo","refresh","checkDependencies","dependenciesReady","healths","every","startupOrder","reverse","clear","#startupOrder","ordered","seen","Set","visit","has","add","push","#assertAcyclic","settled","walkedPath","cycleStart","indexOf","slice","join","parts","message","length","exit","stderr","getCapturedStderr"],"sources":["CliServiceLauncher.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\n\nimport invariant from \"tiny-invariant\";\n\nimport type { ServiceName } from \"../generated/cli/index.js\";\nimport {\n DEFAULT_READY_TIMEOUT_MS,\n type FoundryCliService,\n type ServiceHealth,\n} from \"./FoundryCliService.js\";\nimport { ServiceDiscoverer } from \"./ServiceDiscoverer.js\";\nimport { StatusServer } from \"./StatusServer.js\";\n\nconst HEALTH_POLL_INTERVAL_MS = 200;\n\nexport interface CliServiceLauncherConfig {\n /** Directory the services run in; `.palantir/` hangs off it. */\n projectDir?: string;\n /** Path to the `foundry` binary. */\n foundryCliPath?: string;\n /** Status server to use. One is created if not supplied. */\n statusServer?: StatusServer;\n}\n\n/**\n * Brings a set of Foundry services. Includes a status server by default.\n */\nexport class CliServiceLauncher {\n #discoverer: ServiceDiscoverer;\n #statusServer: StatusServer;\n #services = new Map<ServiceName, FoundryCliService>();\n\n /** Memoized in-flight starts, so a shared dependency is started once. */\n #starts = new Map<ServiceName, Promise<void>>();\n #started = false;\n\n constructor(config: CliServiceLauncherConfig = {}) {\n const projectDir = config.projectDir ?? process.cwd();\n this.#discoverer = new ServiceDiscoverer({\n basePath: path.resolve(projectDir, \".palantir\"),\n });\n this.#statusServer =\n config.statusServer ??\n new StatusServer({\n projectPath: projectDir,\n foundryCliPath: config.foundryCliPath,\n });\n this.register(this.#statusServer);\n }\n\n get services(): readonly FoundryCliService[] {\n return [...this.#services.values()];\n }\n\n get(name: ServiceName): FoundryCliService | undefined {\n return this.#services.get(name);\n }\n\n register<T extends FoundryCliService>(service: T): T {\n const existing = this.#services.get(service.name);\n if (existing === service) {\n return service;\n }\n invariant(\n existing === undefined,\n `A different ${service.name} service is already registered`,\n );\n this.#services.set(service.name, service);\n service.attach({\n discoverer: this.#discoverer,\n statusServer: this.#statusServer,\n });\n for (const dependency of service.dependencies) {\n this.register(dependency);\n }\n return service;\n }\n\n async start(): Promise<void> {\n await this.#ensureDiscovering();\n this.#assertAcyclic();\n const results = await Promise.allSettled(\n [...this.#services.values()].map((service) => this.#start(service)),\n );\n const failed = results.find((result) => result.status === \"rejected\");\n if (failed !== undefined) {\n await this.stop();\n throw failed.reason;\n }\n }\n\n async startService(service: FoundryCliService): Promise<void> {\n this.register(service);\n await this.#ensureDiscovering();\n this.#assertAcyclic();\n await this.#start(service);\n }\n\n async #ensureDiscovering(): Promise<void> {\n if (!this.#started) {\n await this.#discoverer.start();\n this.#started = true;\n }\n }\n\n async #start(service: FoundryCliService): Promise<void> {\n const runningPromise = this.#starts.get(service.name);\n if (typeof runningPromise !== \"undefined\") {\n return runningPromise;\n }\n const started = this.#startImmediate(service);\n this.#starts.set(service.name, started);\n try {\n await started;\n } catch (err) {\n this.#starts.delete(service.name);\n throw err;\n }\n }\n\n async #startImmediate(service: FoundryCliService): Promise<void> {\n await Promise.all(\n this.#prerequisites(service).map((dependency) => this.#start(dependency)),\n );\n await service.start();\n await this.waitUntilReady(service);\n }\n\n /**\n * Everything that must be ready before `service` may start: its declared\n * dependencies, plus the status server.\n */\n #prerequisites(service: FoundryCliService): readonly FoundryCliService[] {\n return service.name === this.#statusServer.name\n ? service.dependencies\n : [this.#statusServer, ...service.dependencies];\n }\n\n /**\n * Poll a service's health until it is ready, reaches a terminal state, or\n * exceeds its timeout.\n */\n async waitUntilReady(service: FoundryCliService): Promise<ServiceHealth> {\n const deadline = Date.now() + DEFAULT_READY_TIMEOUT_MS;\n let health = await service.checkHealth();\n while (!health.ready) {\n const current = health;\n const notReady = (): string =>\n `${service.name} is not ready (${current.state})${formatError(service, current)}`;\n invariant(!current.terminal, notReady);\n invariant(service.getExitInfo() === undefined, notReady);\n invariant(\n Date.now() < deadline,\n () =>\n `${service.name} is not ready (${current.state}) within ` +\n `${DEFAULT_READY_TIMEOUT_MS}ms${formatError(service, current)}`,\n );\n await setTimeout(HEALTH_POLL_INTERVAL_MS);\n await this.#discoverer.refresh();\n health = await service.checkHealth();\n }\n return health;\n }\n\n async checkHealth(): Promise<ServiceHealth[]> {\n await this.#discoverer.refresh();\n return Promise.all(\n [...this.#services.values()].map((service) => service.checkHealth()),\n );\n }\n\n async checkDependencies(\n service: FoundryCliService,\n ): Promise<ServiceHealth[]> {\n await this.#discoverer.refresh();\n return Promise.all(\n service.dependencies.map((dependency) => dependency.checkHealth()),\n );\n }\n\n async dependenciesReady(service: FoundryCliService): Promise<boolean> {\n const healths = await this.checkDependencies(service);\n return healths.every(({ ready }) => ready);\n }\n\n /**\n * Stop every service, dependents before their dependencies, waiting for each\n * process to be gone before the next is signalled.\n */\n async stop(): Promise<void> {\n for (const service of this.#startupOrder().reverse()) {\n await service.stop();\n }\n this.#starts.clear();\n this.#discoverer.stop();\n this.#started = false;\n }\n\n /**\n * Registered services in a valid startup order: every service appears after\n * everything it depends on.\n */\n #startupOrder(): FoundryCliService[] {\n const ordered: FoundryCliService[] = [];\n const seen = new Set<ServiceName>();\n const visit = (service: FoundryCliService): void => {\n if (seen.has(service.name)) {\n return;\n }\n seen.add(service.name);\n for (const dependency of this.#prerequisites(service)) {\n visit(dependency);\n }\n ordered.push(service);\n };\n for (const service of this.#services.values()) {\n visit(service);\n }\n return ordered;\n }\n\n #assertAcyclic(): void {\n const settled = new Set<ServiceName>();\n const visit = (\n service: FoundryCliService,\n walkedPath: ServiceName[],\n ): void => {\n if (settled.has(service.name)) {\n return;\n }\n const cycleStart = walkedPath.indexOf(service.name);\n invariant(\n cycleStart === -1,\n () =>\n `Dependency cycle between services: ${[\n ...walkedPath.slice(cycleStart),\n service.name,\n ].join(\" -> \")}`,\n );\n for (const dependency of this.#prerequisites(service)) {\n visit(dependency, [...walkedPath, service.name]);\n }\n settled.add(service.name);\n };\n for (const service of this.#services.values()) {\n visit(service, []);\n }\n }\n}\n\nconst formatError = (\n service: FoundryCliService,\n health: ServiceHealth,\n): string => {\n const parts: string[] = [];\n if (health.message != null && health.message.length > 0) {\n parts.push(health.message);\n }\n const exit = service.getExitInfo();\n if (exit !== undefined) {\n parts.push(`the process exited (${exit})`);\n }\n const stderr = service.getCapturedStderr();\n if (stderr.length > 0) {\n parts.push(`stderr:\\n${stderr}`);\n }\n return parts.length === 0 ? \"\" : `: ${parts.join(\"; \")}`;\n};\n"],"mappings":"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","ignoreList":[]}