@opengsd/gsd-pi 1.10.0 → 1.11.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 (218) hide show
  1. package/README.md +10 -9
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
  4. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  5. package/dist/resources/extensions/gsd/auto-verification.js +25 -12
  6. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +4 -3
  7. package/dist/resources/extensions/gsd/db/engine.js +8 -2
  8. package/dist/resources/extensions/gsd/db-canonical-foundation-schema.js +120 -0
  9. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  10. package/dist/resources/extensions/gsd/docs/preferences-reference.md +12 -3
  11. package/dist/resources/extensions/gsd/doctor-engine-checks.js +16 -4
  12. package/dist/resources/extensions/gsd/model-cost-table.js +6 -3
  13. package/dist/resources/extensions/gsd/model-router.js +10 -5
  14. package/dist/resources/extensions/gsd/planning-subagent-registry.js +12 -4
  15. package/dist/resources/extensions/gsd/preferences-models.js +50 -10
  16. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  17. package/dist/resources/extensions/gsd/preferences-validation.js +41 -6
  18. package/dist/resources/extensions/gsd/preferences.js +7 -0
  19. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +3 -0
  20. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
  21. package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
  22. package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
  23. package/dist/resources/extensions/subagent/index.js +1 -1
  24. package/dist/startup-model-validation.d.ts +1 -1
  25. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  26. package/dist/web/standalone/.next/BUILD_ID +1 -1
  27. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  28. package/dist/web/standalone/.next/build-manifest.json +2 -2
  29. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/index.html +1 -1
  46. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  53. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  54. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  56. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  57. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  58. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  59. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  60. package/integrations/hermes/pyproject.toml +1 -1
  61. package/package.json +7 -6
  62. package/packages/cloud-mcp-gateway/package.json +2 -2
  63. package/packages/contracts/dist/rpc.d.ts +1 -1
  64. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  65. package/packages/contracts/dist/rpc.js +1 -1
  66. package/packages/contracts/dist/rpc.js.map +1 -1
  67. package/packages/contracts/dist/rpc.test.js +1 -1
  68. package/packages/contracts/dist/rpc.test.js.map +1 -1
  69. package/packages/contracts/package.json +1 -1
  70. package/packages/daemon/package.json +4 -4
  71. package/packages/gsd-agent-core/package.json +5 -5
  72. package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
  73. package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
  74. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  75. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
  76. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  77. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  78. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
  79. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  80. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  81. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
  82. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  83. package/packages/gsd-agent-modes/package.json +7 -7
  84. package/packages/gsd-cloud/README.md +12 -2
  85. package/packages/gsd-cloud/dist/background-cli.test.js +157 -80
  86. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -1
  87. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
  88. package/packages/gsd-cloud/dist/cli.js +36 -12
  89. package/packages/gsd-cloud/dist/cli.js.map +1 -1
  90. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +6 -1
  91. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
  92. package/packages/gsd-cloud/dist/cloud-runtime.js +106 -24
  93. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
  94. package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
  95. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
  96. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
  97. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
  98. package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
  99. package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
  100. package/packages/gsd-cloud/dist/runtime-process.d.ts +5 -0
  101. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -1
  102. package/packages/gsd-cloud/dist/runtime-process.js +429 -61
  103. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -1
  104. package/packages/gsd-cloud/dist/runtime-process.test.js +493 -47
  105. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -1
  106. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
  107. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
  108. package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
  109. package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
  110. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
  111. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
  112. package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
  113. package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
  114. package/packages/gsd-cloud/package.json +2 -2
  115. package/packages/mcp-server/package.json +4 -4
  116. package/packages/native/package.json +1 -1
  117. package/packages/pi-agent-core/dist/types.d.ts +2 -2
  118. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  119. package/packages/pi-agent-core/dist/types.js.map +1 -1
  120. package/packages/pi-agent-core/package.json +1 -1
  121. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  122. package/packages/pi-ai/dist/models.generated.d.ts +113 -2
  123. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  124. package/packages/pi-ai/dist/models.generated.js +84 -9
  125. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  126. package/packages/pi-ai/dist/models.js +18 -6
  127. package/packages/pi-ai/dist/models.js.map +1 -1
  128. package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
  129. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  130. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
  131. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  132. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  133. package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
  134. package/packages/pi-ai/dist/providers/google.js.map +1 -1
  135. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
  136. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  137. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  138. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  139. package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
  140. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  141. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  142. package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
  143. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  144. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  145. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  146. package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
  147. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  148. package/packages/pi-ai/dist/providers/simple-options.js +1 -1
  149. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  150. package/packages/pi-ai/dist/types.d.ts +9 -1
  151. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  152. package/packages/pi-ai/dist/types.js.map +1 -1
  153. package/packages/pi-ai/package.json +1 -1
  154. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
  156. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  158. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -3
  160. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  161. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
  163. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  164. package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
  165. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  166. package/packages/pi-coding-agent/package.json +7 -7
  167. package/packages/pi-tui/package.json +2 -2
  168. package/packages/rpc-client/package.json +2 -2
  169. package/pkg/dist/theme/theme.d.ts +1 -1
  170. package/pkg/dist/theme/theme.d.ts.map +1 -1
  171. package/pkg/dist/theme/theme.js +1 -0
  172. package/pkg/dist/theme/theme.js.map +1 -1
  173. package/pkg/package.json +1 -1
  174. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
  175. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  176. package/src/resources/extensions/gsd/auto-verification.ts +46 -12
  177. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +4 -3
  178. package/src/resources/extensions/gsd/db/engine.ts +9 -1
  179. package/src/resources/extensions/gsd/db-canonical-foundation-schema.ts +129 -0
  180. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  181. package/src/resources/extensions/gsd/docs/preferences-reference.md +12 -3
  182. package/src/resources/extensions/gsd/doctor-engine-checks.ts +15 -4
  183. package/src/resources/extensions/gsd/model-cost-table.ts +14 -3
  184. package/src/resources/extensions/gsd/model-router.ts +10 -5
  185. package/src/resources/extensions/gsd/planning-subagent-registry.ts +18 -4
  186. package/src/resources/extensions/gsd/preferences-models.ts +54 -10
  187. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  188. package/src/resources/extensions/gsd/preferences-validation.ts +49 -6
  189. package/src/resources/extensions/gsd/preferences.ts +13 -0
  190. package/src/resources/extensions/gsd/templates/PREFERENCES.md +3 -0
  191. package/src/resources/extensions/gsd/tests/db-canonical-foundation.test.ts +459 -0
  192. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +3 -3
  193. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +64 -0
  194. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +22 -7
  195. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
  196. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  197. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
  198. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
  199. package/src/resources/extensions/gsd/tests/preferences.test.ts +71 -4
  200. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +3 -0
  201. package/src/resources/extensions/gsd/tests/service-tier.test.ts +2 -2
  202. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
  203. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  204. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
  205. package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
  206. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
  207. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
  208. package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
  209. package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
  210. package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
  211. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
  212. package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
  213. package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
  214. package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
  215. package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
  216. package/src/resources/extensions/subagent/index.ts +1 -1
  217. /package/dist/web/standalone/.next/static/{EAhnhYMt5UVOiG9-iPDjc → 8ub6oiEp2YnlOHQU20LJr}/_buildManifest.js +0 -0
  218. /package/dist/web/standalone/.next/static/{EAhnhYMt5UVOiG9-iPDjc → 8ub6oiEp2YnlOHQU20LJr}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../src/runtime-process.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: Open GSD\n// File Purpose: Detached cloud runtime process lifecycle and status persistence.\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport {\n chmodSync,\n closeSync,\n mkdirSync,\n openSync,\n readFileSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { CLOUD_RUNTIME_INITIAL_CONNECT_WINDOW_MS } from \"./cloud-runtime.js\";\n\ninterface RuntimeProcessState {\n pid: number;\n projects: string[];\n}\n\nexport interface RuntimeProcessStatus {\n running: boolean;\n pid: number | null;\n projects: string[];\n log_file: string;\n}\n\ninterface StartRuntimeOptions {\n binaryPath: string;\n configPath: string;\n projectDirs: string[];\n readyTimeoutMs?: number;\n verbose?: boolean;\n}\n\nconst PROCESS_STARTUP_GRACE_MS = 5_000;\nconst FORCED_STOP_TIMEOUT_MS = 5_000;\nconst STOP_GRACE_PERIOD_MS = 5_000;\nconst STOP_POLL_INTERVAL_MS = 50;\n\nexport const BACKGROUND_RUNTIME_READY_TIMEOUT_MS =\n CLOUD_RUNTIME_INITIAL_CONNECT_WINDOW_MS + PROCESS_STARTUP_GRACE_MS;\n\nexport async function startBackgroundRuntime(opts: StartRuntimeOptions): Promise<RuntimeProcessStatus> {\n await acquireRuntimeStartLock(opts.configPath);\n try {\n await stopBackgroundRuntime(opts.configPath);\n\n const logFile = runtimeLogPath(opts.configPath);\n mkdirSync(dirname(runtimeStatePath(opts.configPath)), { recursive: true });\n const logFd = openSync(logFile, \"a\", 0o600);\n chmodSync(logFile, 0o600);\n const runArgs = [opts.binaryPath, \"_run\", \"--config\", opts.configPath];\n if (opts.verbose) runArgs.push(\"--verbose\");\n let child: ChildProcess;\n try {\n child = spawn(process.execPath, runArgs, {\n cwd: opts.projectDirs[0] ?? process.cwd(),\n detached: true,\n env: process.env,\n stdio: [\"ignore\", logFd, logFd, \"ipc\"],\n });\n } finally {\n closeSync(logFd);\n }\n\n if (child.pid == null) {\n child.kill();\n throw new Error(`could not start the background runtime; see ${logFile}`);\n }\n const pid = child.pid;\n\n writeRuntimeState(opts.configPath, pid, opts.projectDirs);\n\n try {\n await waitUntilReady(child, opts.readyTimeoutMs ?? BACKGROUND_RUNTIME_READY_TIMEOUT_MS);\n } catch (error) {\n if (child.connected) child.disconnect();\n await terminateProcess(pid);\n removeRuntimeState(opts.configPath);\n throw error;\n }\n\n if (child.connected) child.disconnect();\n child.unref();\n\n return {\n running: true,\n pid,\n projects: opts.projectDirs,\n log_file: logFile,\n };\n } finally {\n releaseRuntimeStartLock(opts.configPath);\n }\n}\n\n/**\n * Record a running runtime so a later launch can find and stop it. Used both by\n * the detached launcher (child PID) and by a `--foreground` session (its own\n * PID), so the two modes share one source of truth and never coexist on the\n * same device token.\n */\nexport function writeRuntimeState(configPath: string, pid: number, projects: string[]): void {\n const statePath = runtimeStatePath(configPath);\n mkdirSync(dirname(statePath), { recursive: true });\n writePrivateJson(statePath, { pid, projects } satisfies RuntimeProcessState);\n}\n\nexport function clearRuntimeState(configPath: string): void {\n removeRuntimeState(configPath);\n}\n\nexport async function stopBackgroundRuntime(configPath: string): Promise<boolean> {\n const state = readRuntimeState(configPath);\n if (!state) return false;\n await terminateProcess(state.pid);\n removeRuntimeState(configPath);\n return true;\n}\n\nexport function backgroundRuntimeStatus(configPath: string): RuntimeProcessStatus {\n const state = readRuntimeState(configPath);\n if (!state) {\n return { running: false, pid: null, projects: [], log_file: runtimeLogPath(configPath) };\n }\n if (!processIsRunning(state.pid)) {\n removeRuntimeState(configPath);\n return {\n running: false,\n pid: null,\n projects: state.projects,\n log_file: runtimeLogPath(configPath),\n };\n }\n return {\n running: true,\n pid: state.pid,\n projects: state.projects,\n log_file: runtimeLogPath(configPath),\n };\n}\n\nfunction waitUntilReady(child: ChildProcess, timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout>;\n const cleanup = (): void => {\n clearTimeout(timeout);\n child.removeListener(\"error\", onError);\n child.removeListener(\"exit\", onExit);\n child.removeListener(\"message\", onMessage);\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n const onExit = (code: number | null): void => {\n cleanup();\n reject(new Error(`background runtime exited before connecting (exit ${code ?? \"unknown\"})`));\n };\n const onMessage = (message: unknown): void => {\n if (!message || typeof message !== \"object\" || (message as { type?: unknown }).type !== \"ready\") return;\n cleanup();\n resolve();\n };\n timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`background runtime did not connect within ${timeoutMs}ms`));\n }, timeoutMs);\n\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.on(\"message\", onMessage);\n });\n}\n\nfunction runtimeStatePath(configPath: string): string {\n return join(dirname(configPath), \"cloud-runtime.json\");\n}\n\nfunction runtimeLogPath(configPath: string): string {\n return join(dirname(configPath), \"cloud-runtime.log\");\n}\n\nfunction runtimeStartLockPath(configPath: string): string {\n return join(dirname(configPath), \"cloud-runtime.start.lock\");\n}\n\nasync function acquireRuntimeStartLock(configPath: string): Promise<void> {\n const lockPath = runtimeStartLockPath(configPath);\n mkdirSync(dirname(lockPath), { recursive: true });\n // Match worst-case `startBackgroundRuntime` hold time: stop prior runtime, wait for\n // ready, and tear down the child if ready fails, plus one poll interval.\n const deadline = Date.now()\n + BACKGROUND_RUNTIME_READY_TIMEOUT_MS\n + 2 * (STOP_GRACE_PERIOD_MS + FORCED_STOP_TIMEOUT_MS)\n + STOP_POLL_INTERVAL_MS;\n while (Date.now() < deadline) {\n try {\n const fd = openSync(lockPath, \"wx\");\n writeFileSync(fd, `${process.pid}\\n`, \"utf8\");\n closeSync(fd);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n try {\n const ownerPid = readRuntimeStartLockOwner(lockPath);\n const incompleteLockIsStale = ownerPid === null\n && Date.now() - statSync(lockPath).mtimeMs > 1_000;\n if ((ownerPid !== null && !processIsRunning(ownerPid)) || incompleteLockIsStale) {\n unlinkSync(lockPath);\n continue;\n }\n } catch {\n // Another process may have released the lock; retry.\n }\n await new Promise((resolve) => setTimeout(resolve, STOP_POLL_INTERVAL_MS));\n }\n }\n throw new Error(\"timed out waiting for the background runtime start lock\");\n}\n\nfunction releaseRuntimeStartLock(configPath: string): void {\n const lockPath = runtimeStartLockPath(configPath);\n if (readRuntimeStartLockOwner(lockPath) !== process.pid) return;\n try {\n unlinkSync(lockPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n}\n\nfunction readRuntimeStartLockOwner(lockPath: string): number | null {\n try {\n const pid = Number.parseInt(readFileSync(lockPath, \"utf8\").trim(), 10);\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction readRuntimeState(configPath: string): RuntimeProcessState | null {\n try {\n const value = JSON.parse(readFileSync(runtimeStatePath(configPath), \"utf8\")) as Partial<RuntimeProcessState>;\n const pid = value.pid;\n if (typeof pid !== \"number\" || !Number.isInteger(pid) || pid <= 0 || !Array.isArray(value.projects)) return null;\n return {\n pid,\n projects: value.projects.filter((project): project is string => typeof project === \"string\"),\n };\n } catch {\n return null;\n }\n}\n\nfunction processIsRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nasync function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (processIsRunning(pid)) {\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, STOP_POLL_INTERVAL_MS));\n }\n return true;\n}\n\nasync function terminateProcess(pid: number): Promise<void> {\n signalProcess(pid, \"SIGTERM\");\n if (await waitForProcessExit(pid, STOP_GRACE_PERIOD_MS)) return;\n signalProcess(pid, \"SIGKILL\");\n if (!await waitForProcessExit(pid, FORCED_STOP_TIMEOUT_MS)) {\n throw new Error(`background runtime PID ${pid} did not stop`);\n }\n}\n\nfunction signalProcess(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") throw error;\n }\n}\n\nfunction removeRuntimeState(configPath: string): void {\n try {\n unlinkSync(runtimeStatePath(configPath));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n}\n\nfunction writePrivateJson(path: string, value: unknown): void {\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n chmodSync(path, 0o600);\n}\n"]}
1
+ {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../src/runtime-process.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: Open GSD\n// File Purpose: Detached cloud runtime process lifecycle and status persistence.\nimport { execFileSync, spawn, type ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmodSync,\n closeSync,\n linkSync,\n mkdirSync,\n openSync,\n readFileSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { CLOUD_RUNTIME_INITIAL_CONNECT_WINDOW_MS } from \"./cloud-runtime.js\";\nimport { canonicalConfigPath, runtimeArtifactPath } from \"./runtime-artifacts.js\";\n\ninterface RuntimeProcessState {\n pid: number;\n projects: string[];\n process_start_identity?: string;\n}\n\ninterface LocatedRuntimeProcessState {\n path: string;\n state: RuntimeProcessState;\n}\n\ninterface RuntimeStartLockOwner {\n pid: number;\n process_start_identity?: string;\n}\n\nexport interface RuntimeProcessStatus {\n running: boolean;\n pid: number | null;\n projects: string[];\n log_file: string;\n}\n\ninterface StartRuntimeOptions {\n binaryPath: string;\n configPath: string;\n projectDirs: string[];\n readyTimeoutMs?: number;\n verbose?: boolean;\n processIdentityReader?: (pid: number) => string | null;\n}\n\nconst PROCESS_STARTUP_GRACE_MS = 5_000;\nconst FORCED_STOP_TIMEOUT_MS = 5_000;\nconst STOP_GRACE_PERIOD_MS = 5_000;\nconst STOP_POLL_INTERVAL_MS = 50;\nconst MALFORMED_START_LOCK_GRACE_MS = 5_000;\n\nexport const BACKGROUND_RUNTIME_READY_TIMEOUT_MS =\n CLOUD_RUNTIME_INITIAL_CONNECT_WINDOW_MS + PROCESS_STARTUP_GRACE_MS;\nconst START_LOCK_TIMEOUT_MS = BACKGROUND_RUNTIME_READY_TIMEOUT_MS\n + 2 * (STOP_GRACE_PERIOD_MS + FORCED_STOP_TIMEOUT_MS)\n + STOP_POLL_INTERVAL_MS;\n\nexport async function startBackgroundRuntime(opts: StartRuntimeOptions): Promise<RuntimeProcessStatus> {\n const releaseStartLock = await acquireRuntimeStartLock(opts.configPath);\n try {\n await stopBackgroundRuntime(opts.configPath);\n\n const logFile = runtimeLogPath(opts.configPath);\n mkdirSync(dirname(runtimeStatePath(opts.configPath)), { recursive: true });\n const logFd = openSync(logFile, \"a\", 0o600);\n chmodSync(logFile, 0o600);\n const runArgs = [opts.binaryPath, \"_run\", \"--config\", opts.configPath];\n if (opts.verbose) runArgs.push(\"--verbose\");\n let child: ChildProcess;\n try {\n child = spawn(process.execPath, runArgs, {\n cwd: opts.projectDirs[0] ?? process.cwd(),\n detached: true,\n env: process.env,\n stdio: [\"ignore\", logFd, logFd, \"ipc\"],\n });\n } finally {\n closeSync(logFd);\n }\n\n if (child.pid == null) {\n child.kill();\n throw new Error(`could not start the background runtime; see ${logFile}`);\n }\n const pid = child.pid;\n\n let processStartIdentity: string | null = null;\n try {\n processStartIdentity = (opts.processIdentityReader ?? readProcessStartIdentity)(pid);\n if (!processStartIdentity) {\n throw new Error(`could not determine process identity for PID ${pid}`);\n }\n writeRuntimeStateWithIdentity(\n opts.configPath,\n pid,\n opts.projectDirs,\n processStartIdentity,\n );\n } catch (error) {\n if (child.connected) child.disconnect();\n if (processStartIdentity) {\n await terminateProcess(pid, processStartIdentity);\n } else {\n await terminateKnownChild(child);\n }\n throw error;\n }\n\n try {\n await waitUntilReady(child, opts.readyTimeoutMs ?? BACKGROUND_RUNTIME_READY_TIMEOUT_MS);\n } catch (error) {\n if (child.connected) child.disconnect();\n await terminateProcess(pid, processStartIdentity);\n removeRuntimeState(opts.configPath);\n throw error;\n }\n\n if (child.connected) child.disconnect();\n child.unref();\n\n return {\n running: true,\n pid,\n projects: opts.projectDirs,\n log_file: logFile,\n };\n } finally {\n releaseStartLock();\n }\n}\n\n/**\n * Record a running runtime so a later launch can find and stop it. Used both by\n * the detached launcher (child PID) and by a `--foreground` session (its own\n * PID), so the two modes share one source of truth and never coexist on the\n * same device token.\n */\nexport function writeRuntimeState(configPath: string, pid: number, projects: string[]): void {\n const processStartIdentity = readProcessStartIdentity(pid);\n if (!processStartIdentity) {\n throw new Error(`could not determine process identity for PID ${pid}`);\n }\n writeRuntimeStateWithIdentity(configPath, pid, projects, processStartIdentity);\n}\n\nfunction writeRuntimeStateWithIdentity(\n configPath: string,\n pid: number,\n projects: string[],\n processStartIdentity: string,\n): void {\n const statePath = runtimeStatePath(configPath);\n mkdirSync(dirname(statePath), { recursive: true });\n writePrivateJson(statePath, {\n pid,\n projects,\n process_start_identity: processStartIdentity,\n } satisfies RuntimeProcessState);\n}\n\nexport function clearRuntimeState(configPath: string): void {\n removeRuntimeState(configPath);\n}\n\nexport async function stopBackgroundRuntime(configPath: string): Promise<boolean> {\n const located = readRuntimeState(configPath);\n if (!located) return false;\n const processStartIdentity = located.state.process_start_identity;\n if (!processStartIdentity || !runtimeProcessMatches(located.state)) {\n removeRuntimeStateFile(located.path);\n return false;\n }\n await terminateProcess(located.state.pid, processStartIdentity);\n removeRuntimeStateFile(located.path);\n return true;\n}\n\nexport function backgroundRuntimeStatus(configPath: string): RuntimeProcessStatus {\n const located = readRuntimeState(configPath);\n if (!located) {\n return { running: false, pid: null, projects: [], log_file: runtimeLogPath(configPath) };\n }\n if (!runtimeProcessMatches(located.state)) {\n removeRuntimeStateFile(located.path);\n return {\n running: false,\n pid: null,\n projects: located.state.projects,\n log_file: runtimeLogPath(configPath),\n };\n }\n return {\n running: true,\n pid: located.state.pid,\n projects: located.state.projects,\n log_file: runtimeLogPath(configPath),\n };\n}\n\nfunction waitUntilReady(child: ChildProcess, timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout>;\n const cleanup = (): void => {\n clearTimeout(timeout);\n child.removeListener(\"error\", onError);\n child.removeListener(\"exit\", onExit);\n child.removeListener(\"message\", onMessage);\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n const onExit = (code: number | null): void => {\n cleanup();\n reject(new Error(`background runtime exited before connecting (exit ${code ?? \"unknown\"})`));\n };\n const onMessage = (message: unknown): void => {\n if (!message || typeof message !== \"object\" || (message as { type?: unknown }).type !== \"ready\") return;\n cleanup();\n resolve();\n };\n timeout = setTimeout(() => {\n cleanup();\n reject(new Error(`background runtime did not connect within ${timeoutMs}ms`));\n }, timeoutMs);\n\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.on(\"message\", onMessage);\n });\n}\n\nexport function runtimeStatePath(configPath: string): string {\n return runtimeArtifactPath(configPath, \"state\");\n}\n\nexport function runtimeLogPath(configPath: string): string {\n return runtimeArtifactPath(configPath, \"log\");\n}\n\nfunction runtimeStartLockPath(configPath: string): string {\n return runtimeArtifactPath(configPath, \"start.lock\");\n}\n\nexport async function acquireRuntimeStartLock(\n configPath: string,\n onRecoveryClaimed?: () => void,\n): Promise<() => void> {\n const lockPath = runtimeStartLockPath(configPath);\n mkdirSync(dirname(lockPath), { recursive: true });\n const processStartIdentity = readProcessStartIdentity(process.pid);\n if (!processStartIdentity) {\n throw new Error(`could not determine process identity for PID ${process.pid}`);\n }\n const owner: RuntimeStartLockOwner = {\n pid: process.pid,\n process_start_identity: processStartIdentity,\n };\n // Match worst-case `startBackgroundRuntime` hold time: stop prior runtime, wait for\n // ready, and tear down the child if ready fails, plus one poll interval.\n const deadline = Date.now() + START_LOCK_TIMEOUT_MS;\n while (Date.now() < deadline) {\n try {\n createRuntimeStartLock(lockPath, owner);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n releaseRuntimeStartLock(lockPath, owner);\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n try {\n if (recoverRuntimeStartLock(lockPath, configPath, onRecoveryClaimed)) {\n continue;\n }\n } catch {\n // Another process may have released the lock; retry.\n }\n await new Promise((resolve) => setTimeout(resolve, STOP_POLL_INTERVAL_MS));\n }\n }\n throw new Error(\"timed out waiting for the background runtime start lock\");\n}\n\nfunction createRuntimeStartLock(lockPath: string, owner: RuntimeStartLockOwner): void {\n const temporaryPath = `${lockPath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n writePrivateJson(temporaryPath, owner);\n linkSync(temporaryPath, lockPath);\n } finally {\n removeRuntimeStateFile(temporaryPath);\n }\n}\n\nfunction releaseRuntimeStartLock(lockPath: string, owner: RuntimeStartLockOwner): void {\n if (!runtimeStartLockOwnersEqual(readRuntimeStartLockOwner(lockPath), owner)) return;\n removeRuntimeStateFile(lockPath);\n}\n\nfunction readRuntimeStartLockOwner(lockPath: string): RuntimeStartLockOwner | null {\n try {\n const text = readFileSync(lockPath, \"utf8\").trim();\n if (/^\\d+$/.test(text)) {\n const pid = Number.parseInt(text, 10);\n return pid > 0 ? { pid } : null;\n }\n const value = JSON.parse(text) as Partial<RuntimeStartLockOwner>;\n if (!Number.isInteger(value.pid) || (value.pid ?? 0) <= 0) return null;\n if (typeof value.process_start_identity !== \"string\") return null;\n return { pid: value.pid!, process_start_identity: value.process_start_identity };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n return null;\n }\n}\n\nfunction runtimeStartLockOwnerIsRunning(owner: RuntimeStartLockOwner): boolean {\n if (!owner.process_start_identity) return processIsRunning(owner.pid);\n return processMatchesIdentity(owner.pid, owner.process_start_identity);\n}\n\nfunction runtimeStartLockCanBeRecovered(lockPath: string, configPath: string): boolean {\n const owner = readRuntimeStartLockOwner(lockPath);\n if (owner?.process_start_identity) return !runtimeStartLockOwnerIsRunning(owner);\n const age = Date.now() - statSync(lockPath).mtimeMs;\n if (owner) {\n if (!runtimeStartLockOwnerIsRunning(owner)) return true;\n return age > START_LOCK_TIMEOUT_MS\n && inspectProcessCommandConfig(owner.pid, configPath) === false;\n }\n return age > MALFORMED_START_LOCK_GRACE_MS;\n}\n\nfunction recoverRuntimeStartLock(\n lockPath: string,\n configPath: string,\n onRecoveryClaimed?: () => void,\n): boolean {\n const recoveryPath = `${lockPath}.recovery.${process.pid}.${randomUUID()}`;\n try {\n linkSync(lockPath, recoveryPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n\n try {\n if (!runtimeStartLockCanBeRecovered(recoveryPath, configPath)) return false;\n onRecoveryClaimed?.();\n if (!pathsReferenceSameFile(lockPath, recoveryPath)) return false;\n unlinkSync(lockPath);\n return true;\n } finally {\n removeRuntimeStateFile(recoveryPath);\n }\n}\n\nfunction pathsReferenceSameFile(firstPath: string, secondPath: string): boolean {\n try {\n const first = statSync(firstPath, { bigint: true });\n const second = statSync(secondPath, { bigint: true });\n return first.dev === second.dev && first.ino === second.ino;\n } catch {\n return false;\n }\n}\n\nfunction runtimeStartLockOwnersEqual(\n first: RuntimeStartLockOwner | null,\n second: RuntimeStartLockOwner,\n): boolean {\n return first?.pid === second.pid\n && first.process_start_identity === second.process_start_identity;\n}\n\nfunction readRuntimeState(configPath: string): LocatedRuntimeProcessState | null {\n const statePath = runtimeStatePath(configPath);\n const current = readRuntimeStateFile(statePath);\n if (current) {\n if (typeof current.process_start_identity === \"string\"\n && statePath !== legacyRuntimeStatePath(configPath)) {\n return { path: statePath, state: current };\n }\n return migrateLegacyRuntimeState(configPath, statePath, current);\n }\n const legacyPath = legacyRuntimeStatePath(configPath);\n if (legacyPath === statePath) return null;\n const legacy = readRuntimeStateFile(legacyPath);\n if (!legacy) return null;\n return migrateLegacyRuntimeState(configPath, legacyPath, legacy);\n}\n\nfunction readRuntimeStateFile(path: string): RuntimeProcessState | null {\n try {\n const value = JSON.parse(readFileSync(path, \"utf8\")) as Partial<RuntimeProcessState>;\n const pid = value.pid;\n if (typeof pid !== \"number\" || !Number.isInteger(pid) || pid <= 0\n || !Array.isArray(value.projects)) return null;\n return {\n pid,\n projects: value.projects.filter((project): project is string => typeof project === \"string\"),\n process_start_identity: value.process_start_identity,\n };\n } catch {\n return null;\n }\n}\n\nfunction migrateLegacyRuntimeState(\n configPath: string,\n sourcePath: string,\n state: RuntimeProcessState,\n): LocatedRuntimeProcessState | null {\n const destinationPath = runtimeStatePath(configPath);\n if (sourcePath === legacyRuntimeStatePath(configPath)\n && !processCommandMatchesConfig(state.pid, configPath)) return null;\n if (typeof state.process_start_identity === \"string\") {\n if (sourcePath !== destinationPath) {\n writeRuntimeStateWithIdentity(\n configPath,\n state.pid,\n state.projects,\n state.process_start_identity,\n );\n removeRuntimeStateFile(sourcePath);\n }\n return { path: destinationPath, state };\n }\n const processStartIdentity = readProcessStartIdentity(state.pid);\n if (!processStartIdentity) return null;\n writeRuntimeStateWithIdentity(configPath, state.pid, state.projects, processStartIdentity);\n if (sourcePath !== destinationPath) removeRuntimeStateFile(sourcePath);\n return {\n path: destinationPath,\n state: { ...state, process_start_identity: processStartIdentity },\n };\n}\n\nfunction legacyRuntimeStatePath(configPath: string): string {\n return runtimeArtifactPath(`${dirname(canonicalConfigPath(configPath))}/daemon.yaml`, \"state\");\n}\n\nfunction runtimeProcessMatches(state: RuntimeProcessState): boolean {\n return typeof state.process_start_identity === \"string\"\n && processIsRunning(state.pid)\n && readProcessStartIdentity(state.pid) === state.process_start_identity;\n}\n\nfunction readProcessStartIdentity(pid: number): string | null {\n try {\n if (process.platform === \"linux\") {\n const stat = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const fields = stat.slice(stat.lastIndexOf(\")\") + 2).split(\" \");\n return fields[19] ?? null;\n }\n if (process.platform === \"darwin\" || process.platform === \"freebsd\") {\n return execFileSync(\"/bin/ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n }).trim() || null;\n }\n if (process.platform === \"win32\") {\n return execFileSync(\"powershell.exe\", [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-Process -Id ${pid}).StartTime.ToUniversalTime().Ticks`,\n ], { encoding: \"utf8\" }).trim() || null;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction processCommandMatchesConfig(pid: number, configPath: string): boolean {\n return inspectProcessCommandConfig(pid, configPath) === true;\n}\n\nfunction inspectProcessCommandConfig(pid: number, configPath: string): boolean | null {\n const expectedConfigPath = canonicalConfigPath(configPath);\n try {\n if (process.platform === \"linux\") {\n const args = readFileSync(`/proc/${pid}/cmdline`, \"utf8\").split(\"\\0\").filter(Boolean);\n return commandArgsMatchConfig(args, expectedConfigPath);\n }\n if (process.platform === \"darwin\" || process.platform === \"freebsd\") {\n const command = execFileSync(\"/bin/ps\", [\"-ww\", \"-o\", \"command=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n }).trim();\n return commandLineMatchesRuntimeConfig(command, expectedConfigPath, process.platform);\n }\n if (process.platform === \"win32\") {\n const command = execFileSync(\"powershell.exe\", [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-CimInstance Win32_Process -Filter \\\"ProcessId = ${pid}\\\").CommandLine`,\n ], { encoding: \"utf8\" }).trim();\n return commandLineMatchesRuntimeConfig(command, expectedConfigPath, process.platform);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport function commandLineMatchesRuntimeConfig(\n command: string,\n configPath: string,\n platform: NodeJS.Platform,\n): boolean {\n if (platform === \"win32\") {\n return commandArgsMatchConfig(splitWindowsCommandLine(command), canonicalConfigPath(configPath));\n }\n return commandStringMatchesConfig(command, canonicalConfigPath(configPath));\n}\n\nfunction splitWindowsCommandLine(command: string): string[] {\n const args: string[] = [];\n let index = 0;\n while (index < command.length) {\n while (/\\s/.test(command[index] ?? \"\")) index += 1;\n if (index >= command.length) break;\n let argument = \"\";\n let inQuotes = false;\n while (index < command.length) {\n if (!inQuotes && /\\s/.test(command[index] ?? \"\")) break;\n let backslashes = 0;\n while (command[index] === \"\\\\\") {\n backslashes += 1;\n index += 1;\n }\n if (command[index] === '\"') {\n argument += \"\\\\\".repeat(Math.floor(backslashes / 2));\n if (backslashes % 2 === 0) {\n inQuotes = !inQuotes;\n } else {\n argument += '\"';\n }\n index += 1;\n continue;\n }\n argument += \"\\\\\".repeat(backslashes);\n if (index < command.length) {\n argument += command[index];\n index += 1;\n }\n }\n args.push(argument);\n }\n return args;\n}\n\nfunction commandStringMatchesConfig(command: string, configPath: string): boolean {\n const runtimeCommand = findRuntimeCommand(command);\n if (!runtimeCommand) return false;\n const executablePrefix = command.slice(0, runtimeCommand.index);\n if (!commandPrefixHasCloudRuntimeLauncher(executablePrefix)) return false;\n if (runtimeCommand.command === \"login\"\n && !/(?:^|\\s)--foreground(?:\\s|$)/.test(command.slice(runtimeCommand.index))) return false;\n const match = command.slice(runtimeCommand.index).match(\n /(?:^|\\s)(?:--config|-c)(?:=|\\s+)(.*?)(?=\\s+-{1,2}[A-Za-z](?:[\\w-]*)(?:=|\\s|$)|$)/,\n );\n const configuredPath = match?.[1]?.trim().replace(/^(?:\"([\\s\\S]*)\"|'([\\s\\S]*)')$/, \"$1$2\");\n return configuredPath !== undefined && canonicalConfigPath(configuredPath) === configPath;\n}\n\nfunction commandArgsMatchConfig(args: string[], configPath: string): boolean {\n const runtimeCommand = findRuntimeCommandInArgs(args);\n if (!runtimeCommand) return false;\n if (!argsHaveCloudRuntimeLauncher(args.slice(0, runtimeCommand.index))) return false;\n const runtimeArgs = args.slice(runtimeCommand.index + 1);\n if (runtimeCommand.command === \"login\" && !runtimeArgs.includes(\"--foreground\")) return false;\n const configIndex = runtimeArgs.findIndex((arg) => arg === \"--config\" || arg === \"-c\");\n const configuredPath = configIndex >= 0 ? runtimeArgs[configIndex + 1] : undefined;\n const equalsArgument = runtimeArgs.find((arg) => arg.startsWith(\"--config=\") || arg.startsWith(\"-c=\"))\n ?.replace(/^(?:--config|-c)=/, \"\");\n return [configuredPath, equalsArgument].some(\n (value) => value !== undefined && canonicalConfigPath(value) === configPath,\n );\n}\n\nfunction argsHaveCloudRuntimeLauncher(args: string[]): boolean {\n if (args.length === 1) return isCloudRuntimeExecutable(args[0]!);\n return args.length === 2\n && isNodeExecutable(args[0]!)\n && isCloudRuntimeExecutable(args[1]!);\n}\n\nfunction commandPrefixHasCloudRuntimeLauncher(prefix: string): boolean {\n const args = splitFlattenedCommandPrefix(prefix);\n return args !== null && argsHaveCloudRuntimeLauncher(args);\n}\n\nfunction splitFlattenedCommandPrefix(prefix: string): string[] | null {\n const args: string[] = [];\n const token = /\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/gy;\n while (token.lastIndex < prefix.length) {\n const match = token.exec(prefix);\n if (!match) return null;\n args.push(match[1] ?? match[2] ?? match[3]!);\n }\n return args;\n}\n\nfunction findRuntimeCommand(command: string): { command: string; index: number } | null {\n const match = /(?:^|\\s)(_run|connect|login)(?=\\s|$)/.exec(command);\n return match ? { command: match[1]!, index: match.index } : null;\n}\n\nfunction findRuntimeCommandInArgs(args: string[]): { command: string; index: number } | null {\n const index = args.findIndex((arg) => arg === \"_run\" || arg === \"connect\" || arg === \"login\");\n return index < 0 ? null : { command: args[index]!, index };\n}\n\nfunction isCloudRuntimeExecutable(argument: string): boolean {\n return /(?:^|[\\\\/])gsd-cloud(?:\\.[cm]?js)?$/.test(argument);\n}\n\nfunction isNodeExecutable(argument: string): boolean {\n return /(?:^|[\\\\/])node(?:\\.exe)?$/i.test(argument);\n}\n\nfunction processIsRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nasync function waitForProcessExit(\n pid: number,\n expectedIdentity: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (processMatchesIdentity(pid, expectedIdentity)) {\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, STOP_POLL_INTERVAL_MS));\n }\n return true;\n}\n\nasync function terminateProcess(pid: number, expectedIdentity: string): Promise<void> {\n if (!signalProcess(pid, expectedIdentity, \"SIGTERM\")) return;\n if (await waitForProcessExit(pid, expectedIdentity, STOP_GRACE_PERIOD_MS)) return;\n if (!signalProcess(pid, expectedIdentity, \"SIGKILL\")) return;\n if (!await waitForProcessExit(pid, expectedIdentity, FORCED_STOP_TIMEOUT_MS)) {\n throw new Error(`background runtime PID ${pid} did not stop`);\n }\n}\n\nasync function terminateKnownChild(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n child.kill(\"SIGTERM\");\n if (await waitForChildExit(child, STOP_GRACE_PERIOD_MS)) return;\n child.kill(\"SIGKILL\");\n if (!await waitForChildExit(child, FORCED_STOP_TIMEOUT_MS)) {\n throw new Error(`background runtime PID ${child.pid ?? \"unknown\"} did not stop`);\n }\n}\n\nfunction waitForChildExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve(true);\n return new Promise((resolve) => {\n const onExit = (): void => {\n clearTimeout(timeout);\n resolve(true);\n };\n const timeout = setTimeout(() => {\n child.removeListener(\"exit\", onExit);\n resolve(false);\n }, timeoutMs);\n child.once(\"exit\", onExit);\n });\n}\n\nfunction signalProcess(pid: number, expectedIdentity: string, signal: NodeJS.Signals): boolean {\n if (!processMatchesIdentity(pid, expectedIdentity)) return false;\n try {\n process.kill(pid, signal);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ESRCH\") return false;\n throw error;\n }\n}\n\nfunction processMatchesIdentity(pid: number, expectedIdentity: string): boolean {\n return processIsRunning(pid) && readProcessStartIdentity(pid) === expectedIdentity;\n}\n\nfunction removeRuntimeState(configPath: string): void {\n removeRuntimeStateFile(runtimeStatePath(configPath));\n}\n\nfunction removeRuntimeStateFile(path: string): void {\n try {\n unlinkSync(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n}\n\nfunction writePrivateJson(path: string, value: unknown): void {\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n chmodSync(path, 0o600);\n}\n"]}