@happier-dev/stack 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.d.ts +1 -0
  2. package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.d.ts.map +1 -1
  3. package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.js +3 -0
  4. package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.js.map +1 -1
  5. package/node_modules/@happier-dev/agents/dist/manifest.d.ts +1 -0
  6. package/node_modules/@happier-dev/agents/dist/manifest.d.ts.map +1 -1
  7. package/node_modules/@happier-dev/agents/dist/manifest.js +1 -0
  8. package/node_modules/@happier-dev/agents/dist/manifest.js.map +1 -1
  9. package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.d.ts +1 -1
  10. package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.d.ts.map +1 -1
  11. package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.js +2 -0
  12. package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.js.map +1 -1
  13. package/node_modules/@happier-dev/agents/dist/types.d.ts +1 -0
  14. package/node_modules/@happier-dev/agents/dist/types.d.ts.map +1 -1
  15. package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.d.ts.map +1 -1
  16. package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.js +5 -18
  17. package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.js.map +1 -1
  18. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.d.ts +1 -1
  19. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.d.ts.map +1 -1
  20. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.js +14 -6
  21. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.js.map +1 -1
  22. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.d.ts +2 -1
  23. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.d.ts.map +1 -1
  24. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.js +2 -1
  25. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.js.map +1 -1
  26. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.d.ts.map +1 -1
  27. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.js +13 -19
  28. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.js.map +1 -1
  29. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.d.ts +4 -0
  30. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.d.ts.map +1 -1
  31. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.js +20 -0
  32. package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.js.map +1 -1
  33. package/node_modules/@happier-dev/cli-common/dist/output/index.d.ts +1 -0
  34. package/node_modules/@happier-dev/cli-common/dist/output/index.d.ts.map +1 -1
  35. package/node_modules/@happier-dev/cli-common/dist/output/index.js +1 -0
  36. package/node_modules/@happier-dev/cli-common/dist/output/index.js.map +1 -1
  37. package/node_modules/@happier-dev/cli-common/dist/output/planet.d.ts +47 -0
  38. package/node_modules/@happier-dev/cli-common/dist/output/planet.d.ts.map +1 -0
  39. package/node_modules/@happier-dev/cli-common/dist/output/planet.js +183 -0
  40. package/node_modules/@happier-dev/cli-common/dist/output/planet.js.map +1 -0
  41. package/node_modules/@happier-dev/cli-common/dist/output/progress.d.ts +3 -1
  42. package/node_modules/@happier-dev/cli-common/dist/output/progress.d.ts.map +1 -1
  43. package/node_modules/@happier-dev/cli-common/dist/output/progress.js +131 -57
  44. package/node_modules/@happier-dev/cli-common/dist/output/progress.js.map +1 -1
  45. package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.d.ts.map +1 -1
  46. package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.js +41 -78
  47. package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.js.map +1 -1
  48. package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.d.ts +5 -0
  49. package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.d.ts.map +1 -1
  50. package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.js +12 -0
  51. package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.js.map +1 -1
  52. package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts.map +1 -1
  53. package/node_modules/@happier-dev/cli-common/dist/service/windows.js +30 -8
  54. package/node_modules/@happier-dev/cli-common/dist/service/windows.js.map +1 -1
  55. package/node_modules/@happier-dev/cli-common/node_modules/chalk/license +9 -0
  56. package/node_modules/@happier-dev/cli-common/node_modules/chalk/package.json +83 -0
  57. package/node_modules/@happier-dev/cli-common/node_modules/chalk/readme.md +297 -0
  58. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/index.d.ts +325 -0
  59. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/index.js +225 -0
  60. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/utilities.js +33 -0
  61. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  62. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  63. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  64. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
  65. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  66. package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
  67. package/node_modules/@happier-dev/cli-common/package.json +3 -1
  68. package/node_modules/@happier-dev/protocol/dist/account/encryptionMigrate.d.ts +32 -8
  69. package/node_modules/@happier-dev/protocol/dist/account/encryptionMigrate.d.ts.map +1 -1
  70. package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.d.ts +5 -0
  71. package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.d.ts.map +1 -1
  72. package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.js +3 -0
  73. package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.js.map +1 -1
  74. package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.d.ts +6 -0
  75. package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.d.ts.map +1 -1
  76. package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.js +2 -0
  77. package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.js.map +1 -1
  78. package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.d.ts.map +1 -1
  79. package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.js +106 -9
  80. package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.js.map +1 -1
  81. package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.d.ts.map +1 -1
  82. package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.js +23 -9
  83. package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.js.map +1 -1
  84. package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.d.ts +1 -1
  85. package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.d.ts.map +1 -1
  86. package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.js +16 -4
  87. package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.js.map +1 -1
  88. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.d.ts +12 -0
  89. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.d.ts.map +1 -0
  90. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.js +68 -0
  91. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.js.map +1 -0
  92. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.d.ts +8 -0
  93. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.d.ts.map +1 -0
  94. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.js +100 -0
  95. package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.js.map +1 -0
  96. package/node_modules/@happier-dev/protocol/dist/activity/parseJson.d.ts +2 -0
  97. package/node_modules/@happier-dev/protocol/dist/activity/parseJson.d.ts.map +1 -0
  98. package/node_modules/@happier-dev/protocol/dist/activity/parseJson.js +32 -0
  99. package/node_modules/@happier-dev/protocol/dist/activity/parseJson.js.map +1 -0
  100. package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.d.ts +12 -0
  101. package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.d.ts.map +1 -0
  102. package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.js +120 -0
  103. package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.js.map +1 -0
  104. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.d.ts +1 -1
  105. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.d.ts.map +1 -1
  106. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.js +1 -1
  107. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.js.map +1 -1
  108. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.d.ts +2 -1
  109. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.d.ts.map +1 -1
  110. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.js +2 -1
  111. package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.js.map +1 -1
  112. package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.d.ts +36 -0
  113. package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.d.ts.map +1 -0
  114. package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.js +36 -0
  115. package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.js.map +1 -0
  116. package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.d.ts +143 -0
  117. package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.d.ts.map +1 -1
  118. package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.js +46 -0
  119. package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.js.map +1 -1
  120. package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.d.ts +40 -0
  121. package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.d.ts.map +1 -1
  122. package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.js +9 -0
  123. package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.js.map +1 -1
  124. package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.d.ts +8 -0
  125. package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.d.ts.map +1 -0
  126. package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.js +22 -0
  127. package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.js.map +1 -0
  128. package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.d.ts +39 -0
  129. package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.d.ts.map +1 -1
  130. package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.js +4 -1
  131. package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.js.map +1 -1
  132. package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.d.ts +80 -20
  133. package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.d.ts.map +1 -1
  134. package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.js +18 -1
  135. package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.js.map +1 -1
  136. package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.d.ts +25 -0
  137. package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.d.ts.map +1 -1
  138. package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.js +18 -0
  139. package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.js.map +1 -1
  140. package/node_modules/@happier-dev/protocol/dist/executionRuns.d.ts +51 -3
  141. package/node_modules/@happier-dev/protocol/dist/executionRuns.d.ts.map +1 -1
  142. package/node_modules/@happier-dev/protocol/dist/executionRuns.js +5 -2
  143. package/node_modules/@happier-dev/protocol/dist/executionRuns.js.map +1 -1
  144. package/node_modules/@happier-dev/protocol/dist/features/catalog.d.ts +12 -0
  145. package/node_modules/@happier-dev/protocol/dist/features/catalog.d.ts.map +1 -1
  146. package/node_modules/@happier-dev/protocol/dist/features/catalog.js +12 -0
  147. package/node_modules/@happier-dev/protocol/dist/features/catalog.js.map +1 -1
  148. package/node_modules/@happier-dev/protocol/dist/features/decision.d.ts +2 -0
  149. package/node_modules/@happier-dev/protocol/dist/features/decision.d.ts.map +1 -1
  150. package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts +6 -0
  151. package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts.map +1 -1
  152. package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.js +4 -0
  153. package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.js.map +1 -1
  154. package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts +6 -0
  155. package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts.map +1 -1
  156. package/node_modules/@happier-dev/protocol/dist/index.d.ts +11 -3
  157. package/node_modules/@happier-dev/protocol/dist/index.d.ts.map +1 -1
  158. package/node_modules/@happier-dev/protocol/dist/index.js +11 -3
  159. package/node_modules/@happier-dev/protocol/dist/index.js.map +1 -1
  160. package/node_modules/@happier-dev/protocol/dist/prompts/buildAppendSystemPromptBaseV1.js +1 -1
  161. package/node_modules/@happier-dev/protocol/dist/prompts/buildAppendSystemPromptBaseV1.js.map +1 -1
  162. package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.d.ts.map +1 -1
  163. package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.js +25 -35
  164. package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.js.map +1 -1
  165. package/node_modules/@happier-dev/protocol/dist/scm.d.ts +6 -0
  166. package/node_modules/@happier-dev/protocol/dist/scm.d.ts.map +1 -1
  167. package/node_modules/@happier-dev/protocol/dist/scm.js +3 -0
  168. package/node_modules/@happier-dev/protocol/dist/scm.js.map +1 -1
  169. package/node_modules/@happier-dev/protocol/dist/scmRepositoryProvisioning.d.ts +6 -0
  170. package/node_modules/@happier-dev/protocol/dist/scmRepositoryProvisioning.d.ts.map +1 -1
  171. package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.d.ts +164 -0
  172. package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.d.ts.map +1 -1
  173. package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.js +3 -0
  174. package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.js.map +1 -1
  175. package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.d.ts +32 -0
  176. package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.d.ts.map +1 -0
  177. package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.js +23 -0
  178. package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.js.map +1 -0
  179. package/node_modules/@happier-dev/protocol/dist/sessionFolders/folderAssignments.d.ts +12 -0
  180. package/node_modules/@happier-dev/protocol/dist/sessionFolders/folderAssignments.d.ts.map +1 -1
  181. package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.d.ts +1 -1
  182. package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.d.ts.map +1 -1
  183. package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.js +1 -1
  184. package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.js.map +1 -1
  185. package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.d.ts +13 -0
  186. package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.d.ts.map +1 -1
  187. package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.js +2 -0
  188. package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.js.map +1 -1
  189. package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.d.ts +27 -1
  190. package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.d.ts.map +1 -1
  191. package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.js +0 -1
  192. package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.js.map +1 -1
  193. package/node_modules/@happier-dev/protocol/dist/spawnSession.d.ts +2 -1
  194. package/node_modules/@happier-dev/protocol/dist/spawnSession.d.ts.map +1 -1
  195. package/node_modules/@happier-dev/protocol/dist/spawnSession.js +2 -1
  196. package/node_modules/@happier-dev/protocol/dist/spawnSession.js.map +1 -1
  197. package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.d.ts +20 -0
  198. package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.d.ts.map +1 -0
  199. package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.js +21 -0
  200. package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.js.map +1 -0
  201. package/node_modules/@happier-dev/protocol/dist/updates.d.ts +35 -0
  202. package/node_modules/@happier-dev/protocol/dist/updates.d.ts.map +1 -1
  203. package/node_modules/@happier-dev/protocol/dist/updates.js +2 -0
  204. package/node_modules/@happier-dev/protocol/dist/updates.js.map +1 -1
  205. package/package.json +1 -1
  206. package/scripts/dev_cli_build_ownership.test.mjs +3 -1
  207. package/scripts/dev_external_server_flags.test.mjs +23 -5
  208. package/scripts/ghops.test.mjs +9 -3
  209. package/scripts/provision/linux-ubuntu-provision.sh +5 -0
  210. package/scripts/provision/linux-ubuntu-provision.test.mjs +3 -1
  211. package/scripts/self_host_launchd.real.integration.test.mjs +5 -3
  212. package/scripts/self_host_runtime.mjs +10 -9
  213. package/scripts/self_host_runtime.test.mjs +2 -2
  214. package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +14 -0
  215. package/scripts/utils/dev/expo_dev.mjs +24 -1
  216. package/scripts/utils/dev_targets/mutagen_project.mjs +4 -1
  217. package/scripts/utils/dev_targets/mutagen_project.test.mjs +2 -1
  218. package/scripts/utils/dev_targets/remote_commands.mjs +5 -2
  219. package/scripts/utils/dev_targets/remote_commands.test.mjs +5 -2
  220. package/scripts/utils/dev_targets/supervisor.mjs +1 -0
  221. package/scripts/utils/dev_targets/supervisor.test.mjs +5 -0
  222. package/scripts/utils/server/apply_runtime_server_sqlite_env.test.mjs +2 -2
  223. package/scripts/utils/server/resolve_stack_server_port.test.mjs +3 -3
@@ -24,11 +24,29 @@ test('dev --json reports local server mode by default', async () => {
24
24
  const repoRoot = dirname(dirname(packageRoot)); // repo root
25
25
  const devScript = join(packageRoot, 'scripts', 'dev.mjs');
26
26
 
27
- const res = await runNode([devScript, '--json'], { cwd: repoRoot, env: process.env });
28
- assert.equal(res.code, 0, `expected exit 0, got ${res.code}\nstdout:\n${res.stdout}\nstderr:\n${res.stderr}`);
29
- const parsed = JSON.parse(res.stdout);
30
- assert.equal(parsed.startServer, true);
31
- assert.equal(parsed.serverConnectionSource, 'local');
27
+ const storageDir = await mkdtemp(join(tmpdir(), 'hstack-dev-local-default-'));
28
+ try {
29
+ const res = await runNode([devScript, '--json'], {
30
+ cwd: repoRoot,
31
+ env: {
32
+ ...process.env,
33
+ HAPPIER_SERVER_URL: '',
34
+ HAPPIER_STACK_STACK: 'repo-local-default',
35
+ HAPPIER_STACK_HOME_DIR: join(storageDir, 'home'),
36
+ HAPPIER_STACK_STORAGE_DIR: storageDir,
37
+ HAPPIER_STACK_SANDBOX_DIR: join(storageDir, 'sandbox'),
38
+ HAPPIER_STACK_REPO_DIR: '',
39
+ HAPPIER_STACK_ENV_FILE: '',
40
+ HAPPIER_STACK_DISABLE_STACK_ENV_AUTOLOAD: '1',
41
+ },
42
+ });
43
+ assert.equal(res.code, 0, `expected exit 0, got ${res.code}\nstdout:\n${res.stdout}\nstderr:\n${res.stderr}`);
44
+ const parsed = JSON.parse(res.stdout);
45
+ assert.equal(parsed.startServer, true);
46
+ assert.equal(parsed.serverConnectionSource, 'local');
47
+ } finally {
48
+ await rm(storageDir, { recursive: true, force: true });
49
+ }
32
50
  });
33
51
 
34
52
  test('dev --no-server --json fails without an external server URL', async () => {
@@ -305,7 +305,9 @@ test('fails closed when token is missing', () => {
305
305
  assert.match(res.stderr, /HAPPIER_GITHUB_BOT_TOKEN/);
306
306
  });
307
307
 
308
- test('uses the execution-host credential broker when the VM has no environment token', () => {
308
+ test('uses the execution-host credential broker when the VM has no environment token', {
309
+ skip: process.platform !== 'linux' ? 'execution-host credential brokering is Linux-VM-only' : false,
310
+ }, () => {
309
311
  const dir = mkdtempSync(join(tmpdir(), 'ghops-mac-host-token-test-'));
310
312
  const { fakeGh } = createFakeBotAuthTools(dir);
311
313
  const fixture = createMacHostCredentialFixture(dir);
@@ -328,7 +330,9 @@ test('uses the execution-host credential broker when the VM has no environment t
328
330
  assert.deepEqual(JSON.parse(input), { version: 1, operation: 'read-ghops-credential' });
329
331
  });
330
332
 
331
- test('keeps an explicit bot push on the authoritative checkout when the credential comes from mac-host', () => {
333
+ test('keeps an explicit bot push on the authoritative checkout when the credential comes from mac-host', {
334
+ skip: process.platform !== 'linux' ? 'execution-host credential brokering is Linux-VM-only' : false,
335
+ }, () => {
332
336
  const dir = mkdtempSync(join(tmpdir(), 'ghops-mac-host-git-push-test-'));
333
337
  const { fakeGh } = createFakeBotAuthTools(dir);
334
338
  const { fakeGit, gitLog } = createFakeGitPushTool(dir);
@@ -359,7 +363,9 @@ test('keeps an explicit bot push on the authoritative checkout when the credenti
359
363
  assert.equal(readFileSync(fixture.sshLog, 'utf8').trim().split('\n').length, 1);
360
364
  });
361
365
 
362
- test('fails closed when the configured mac-host credential route is unavailable', () => {
366
+ test('fails closed when the configured mac-host credential route is unavailable', {
367
+ skip: process.platform !== 'linux' ? 'execution-host credential brokering is Linux-VM-only' : false,
368
+ }, () => {
363
369
  const dir = mkdtempSync(join(tmpdir(), 'ghops-mac-host-unavailable-test-'));
364
370
  const { fakeGh } = createFakeBotAuthTools(dir);
365
371
  const fixture = createMacHostCredentialFixture(dir);
@@ -126,6 +126,10 @@ Description=Happier session jobs
126
126
  [Slice]
127
127
  CPUWeight=50
128
128
  IOWeight=50
129
+ # Reclaim and throttle disposable session work before it can starve the guest
130
+ # OS and the protected Happier control plane. This is deliberately soft: jobs
131
+ # can exceed it under pressure and are never OOM-killed by this policy.
132
+ MemoryHigh=80%
129
133
  EOF
130
134
  chmod 0644 "${unit_dir}/happier-jobs.slice"
131
135
 
@@ -141,6 +145,7 @@ as_root apt-get install -y --no-install-recommends \
141
145
  ca-certificates \
142
146
  curl \
143
147
  git \
148
+ gh \
144
149
  gnupg \
145
150
  jq \
146
151
  xz-utils \
@@ -113,7 +113,8 @@ test('linux provision (happier profile) runs corepack enable as root', async ()
113
113
  assert.match(happierJobsSliceUnit, /^\[Slice\]$/m);
114
114
  assert.match(happierJobsSliceUnit, /^CPUWeight=50$/m);
115
115
  assert.match(happierJobsSliceUnit, /^IOWeight=50$/m);
116
- assert.doesNotMatch(happierJobsSliceUnit, /MemoryMax|MemoryHigh|TasksMax|OOM/u);
116
+ assert.match(happierJobsSliceUnit, /^MemoryHigh=80%$/m);
117
+ assert.doesNotMatch(happierJobsSliceUnit, /^(?:MemoryMax|TasksMax|OOM\w*)=/mu);
117
118
 
118
119
  const corepackOut = await readIfExists(corepackLog);
119
120
  assert.match(corepackOut, /corepack enable root=1/, 'expected corepack enable to be invoked via sudo/as_root');
@@ -122,6 +123,7 @@ test('linux provision (happier profile) runs corepack enable as root', async ()
122
123
  const aptOut = await readIfExists(aptLog);
123
124
  assert.match(aptOut, /apt-get update/, 'expected apt-get update to run');
124
125
  assert.match(aptOut, /apt-get install/, 'expected apt-get install to run');
126
+ assert.match(aptOut, /(?:^|\s)gh(?:\s|$)/, 'expected the GitHub CLI to be installed');
125
127
 
126
128
  const secondResult = spawnSync('bash', [scriptPath, '--profile=happier'], {
127
129
  cwd: root,
@@ -6,6 +6,8 @@ import test from 'node:test';
6
6
  import { fileURLToPath } from 'node:url';
7
7
 
8
8
  const SELF_HOST_INSTALL_TIMEOUT_MS = 420_000;
9
+ const SELF_HOST_ARTIFACT_BUILD_TIMEOUT_MS = 12 * 60_000;
10
+ const SELF_HOST_TEST_TIMEOUT_MS = 30 * 60_000;
9
11
 
10
12
  import { commandExists, extractBinaryFromArtifact, reserveLocalhostPort, run, waitForHealth } from './self_host_service_e2e_harness.mjs';
11
13
 
@@ -23,7 +25,7 @@ function launchctlPrintTarget(label) {
23
25
 
24
26
  test(
25
27
  'compiled hstack self-host install/uninstall works on macOS launchd host without repo checkout',
26
- { timeout: 15 * 60_000 },
28
+ { timeout: SELF_HOST_TEST_TIMEOUT_MS },
27
29
  async (t) => {
28
30
  if (process.platform !== 'darwin') {
29
31
  t.skip(`macos-only test (current: ${process.platform})`);
@@ -58,7 +60,7 @@ test(
58
60
  label: 'self-host-launchd',
59
61
  cwd: repoRoot,
60
62
  env: { ...process.env },
61
- timeoutMs: 8 * 60_000,
63
+ timeoutMs: SELF_HOST_ARTIFACT_BUILD_TIMEOUT_MS,
62
64
  }
63
65
  );
64
66
  run(
@@ -73,7 +75,7 @@ test(
73
75
  label: 'self-host-launchd',
74
76
  cwd: repoRoot,
75
77
  env: { ...process.env },
76
- timeoutMs: 8 * 60_000,
78
+ timeoutMs: SELF_HOST_ARTIFACT_BUILD_TIMEOUT_MS,
77
79
  }
78
80
  );
79
81
 
@@ -43,6 +43,7 @@ import {
43
43
  resolveConfiguredRelayRuntimeBinaryOverride,
44
44
  resolveConfiguredRelayRuntimePaths,
45
45
  } from '@happier-dev/cli-common/firstPartyRuntime/relayRuntime';
46
+ import { removeRuntimePayloadPath } from '@happier-dev/cli-common/firstPartyRuntime';
46
47
  import {
47
48
  mergeSelfHostServerEnvText,
48
49
  parseEnvText as parseEnvTextShared,
@@ -2364,18 +2365,18 @@ async function cmdUninstall({ channel, mode, argv, json }) {
2364
2365
  homeDir: homedir(),
2365
2366
  spec: serviceSpec,
2366
2367
  persistent: true,
2367
- }).catch(() => {});
2368
+ });
2368
2369
 
2369
- await rm(config.serverBinaryPath, { force: true });
2370
- await rm(config.serverPreviousBinaryPath, { force: true });
2371
- await rm(join(config.binDir, config.serverBinaryName), { force: true });
2372
- await rm(config.statePath, { force: true });
2370
+ await removeRuntimePayloadPath(config.serverBinaryPath, config.platform);
2371
+ await removeRuntimePayloadPath(config.serverPreviousBinaryPath, config.platform);
2372
+ await removeRuntimePayloadPath(join(config.binDir, config.serverBinaryName), config.platform);
2373
+ await removeRuntimePayloadPath(config.statePath, config.platform);
2373
2374
 
2374
2375
  if (purgeData) {
2375
- await rm(config.installRoot, { recursive: true, force: true });
2376
- await rm(config.configDir, { recursive: true, force: true });
2377
- await rm(config.dataDir, { recursive: true, force: true });
2378
- await rm(config.logDir, { recursive: true, force: true });
2376
+ await removeRuntimePayloadPath(config.installRoot, config.platform);
2377
+ await removeRuntimePayloadPath(config.configDir, config.platform);
2378
+ await removeRuntimePayloadPath(config.dataDir, config.platform);
2379
+ await removeRuntimePayloadPath(config.logDir, config.platform);
2379
2380
  }
2380
2381
 
2381
2382
  printResult({
@@ -1631,7 +1631,7 @@ test('renderServerEnvFile emits sqlite/local defaults for self-host mode', () =>
1631
1631
  assert.match(envText, /PORT=3005/);
1632
1632
  assert.match(envText, /METRICS_ENABLED=false/);
1633
1633
  assert.match(envText, /HAPPIER_DB_PROVIDER=sqlite/);
1634
- assert.match(envText, /DATABASE_URL=file:\/\/\/var\/lib\/happier\/happier-server-light\.sqlite/);
1634
+ assert.match(envText, /DATABASE_URL=file:\/var\/lib\/happier\/happier-server-light\.sqlite/);
1635
1635
  assert.match(envText, /HAPPIER_FILES_BACKEND=local/);
1636
1636
  assert.match(envText, /HAPPIER_SQLITE_AUTO_MIGRATE=1/);
1637
1637
  assert.match(envText, /HAPPIER_SQLITE_MIGRATIONS_DIR=\/var\/lib\/happier\/migrations\/sqlite/);
@@ -1703,7 +1703,7 @@ test('renderServerEnvFile uses Prisma-compatible sqlite DATABASE_URL semantics o
1703
1703
  filesDir: 'C:\\\\Users\\\\me\\\\Happier QA\\\\self-host\\\\data\\\\files',
1704
1704
  dbDir: 'C:\\\\Users\\\\me\\\\Happier QA\\\\self-host\\\\data\\\\pglite',
1705
1705
  });
1706
- assert.match(envText, /DATABASE_URL=file:C:\/Users\/me\/Happier%20QA\/self-host\/data\/happier-server-light\.sqlite/);
1706
+ assert.match(envText, /DATABASE_URL=file:C:\\Users\\me\\Happier QA\\self-host\\data\\happier-server-light\.sqlite/);
1707
1707
  });
1708
1708
 
1709
1709
  test('resolveSelfHostHealthTimeoutMs defaults to a safe health timeout', () => {
@@ -74,6 +74,20 @@ test('buildExpoDevEnv uses the Tailscale IP for dev-client local API URLs when p
74
74
  assert.equal(env.EXPO_PUBLIC_SERVER_URL, 'http://100.64.0.10:3013');
75
75
  });
76
76
 
77
+ test('buildExpoDevEnv publishes a remote target through its stable outer Expo port', () => {
78
+ const env = buildExpoDevEnv({
79
+ baseEnv: { HAPPIER_STACK_EXPO_PUBLIC_PORT: '18829' },
80
+ apiServerUrl: 'http://localhost:52753',
81
+ wantDevClient: true,
82
+ wantWeb: true,
83
+ stackMode: true,
84
+ stackName: 'qa-agent-remote',
85
+ expoPublicHost: '100.79.179.31',
86
+ });
87
+
88
+ assert.equal(env.EXPO_PACKAGER_PROXY_URL, 'http://100.79.179.31:18829');
89
+ });
90
+
77
91
  test('buildExpoDevEnv does not set EXPO_APP_SLUG in dev-client mode (slug must match EAS project)', () => {
78
92
  const baseEnv = {
79
93
  ...process.env,
@@ -347,6 +347,7 @@ export function buildExpoDevEnv({
347
347
  stackMode,
348
348
  stackName,
349
349
  expoTailscaleIp = '',
350
+ expoPublicHost = '',
350
351
  } = {}) {
351
352
  const env = { ...(baseEnv || process.env) };
352
353
  delete env.CI;
@@ -370,6 +371,23 @@ export function buildExpoDevEnv({
370
371
  env.EXPO_PUBLIC_HAPPIER_SERVER_URL = effectiveApiServerUrl;
371
372
  env.EXPO_PUBLIC_HAPPY_SERVER_URL = effectiveApiServerUrl;
372
373
  env.EXPO_PUBLIC_SERVER_URL = effectiveApiServerUrl;
374
+ const publicExpoPort = Number(env.HAPPIER_STACK_EXPO_PUBLIC_PORT);
375
+ if (
376
+ wantDevClient
377
+ && !String(env.EXPO_PACKAGER_PROXY_URL ?? '').trim()
378
+ && Number.isInteger(publicExpoPort)
379
+ && publicExpoPort > 0
380
+ ) {
381
+ const localPublicUrl = `http://localhost:${publicExpoPort}`;
382
+ const reachablePublicUrl = resolveMobileReachableServerUrl({
383
+ env,
384
+ serverUrl: localPublicUrl,
385
+ preferredHost: expoPublicHost,
386
+ });
387
+ if (reachablePublicUrl && reachablePublicUrl !== localPublicUrl) {
388
+ env.EXPO_PACKAGER_PROXY_URL = reachablePublicUrl;
389
+ }
390
+ }
373
391
  if (stackMode) {
374
392
  env.EXPO_PUBLIC_HAPPY_SERVER_CONTEXT = 'stack';
375
393
  }
@@ -434,7 +452,11 @@ export async function ensureDevExpoServer({
434
452
  }
435
453
 
436
454
  const wantTailscale = resolveExpoTailscaleEnabled({ env: baseEnv, expoTailscale });
437
- const tailscaleStatus = wantTailscale ? await getTailscaleStatus({ env: baseEnv }) : null;
455
+ const publicExpoPort = Number(baseEnv?.HAPPIER_STACK_EXPO_PUBLIC_PORT);
456
+ const needsPublicExpoHost = wantDevClient && Number.isInteger(publicExpoPort) && publicExpoPort > 0;
457
+ const tailscaleStatus = wantTailscale || needsPublicExpoHost
458
+ ? await getTailscaleStatus({ env: baseEnv })
459
+ : null;
438
460
  const expoTailscaleIp = tailscaleStatus?.available && tailscaleStatus?.ip ? tailscaleStatus.ip : '';
439
461
 
440
462
  const env = buildExpoDevEnv({
@@ -445,6 +467,7 @@ export async function ensureDevExpoServer({
445
467
  stackMode,
446
468
  stackName,
447
469
  expoTailscaleIp,
470
+ expoPublicHost: expoTailscaleIp,
448
471
  });
449
472
 
450
473
  // Mobile config is needed for `--scheme` and for the app's environment.
@@ -11,6 +11,7 @@ const DEFAULT_IGNORES = [
11
11
  '.*.__sync_backup__.*',
12
12
  '.tmp.*',
13
13
  '.backup.*',
14
+ 'packages/plugin-sdk/.example-builds',
14
15
  '.project',
15
16
  '.happier',
16
17
  '.happier-stack',
@@ -36,7 +37,9 @@ const DEFAULT_IGNORES = [
36
37
  '.restore.*',
37
38
  '.dist.hstack-*',
38
39
  '.cxx',
39
- 'apps/ui/ios/build',
40
+ // Expo prebuild generates this entire Git-ignored tree for the target's
41
+ // native identity and toolchain. Replication would undo its Info.plist.
42
+ 'apps/ui/ios',
40
43
  'apps/ui/android/app/build',
41
44
  'apps/ui/android/build',
42
45
  'apps/ui/android/.gradle',
@@ -51,6 +51,7 @@ test('renderMutagenProject creates one-way source replicas while retaining targe
51
51
  '.*.__sync_backup__.*',
52
52
  '.tmp.*',
53
53
  '.backup.*',
54
+ 'packages/plugin-sdk/.example-builds',
54
55
  '.project',
55
56
  '.happier',
56
57
  'coverage',
@@ -75,7 +76,7 @@ test('renderMutagenProject creates one-way source replicas while retaining targe
75
76
  '.restore.*',
76
77
  '.dist.hstack-*',
77
78
  '.cxx',
78
- 'apps/ui/ios/build',
79
+ 'apps/ui/ios',
79
80
  'apps/ui/android/app/build',
80
81
  'apps/ui/android/build',
81
82
  'apps/ui/android/.gradle',
@@ -237,8 +237,6 @@ function buildRemoteDevArgs({ services, serverUrl, publicServerUrl, startMobile
237
237
  args.push('--no-browser', '--no-dev-targets', '--watch');
238
238
  if (services.expo && startMobile) args.push('--mobile');
239
239
  if (services.server) {
240
- // The target's SSH forward owns the stable endpoint, so bind the server to its configured port.
241
- args.push('--no-proxy');
242
240
  if (publicServerUrl) args.push(`--server-public-url=${publicServerUrl}`);
243
241
  } else {
244
242
  args.push(`--server-url=${serverUrl}`);
@@ -255,6 +253,7 @@ function resolveRemoteStackInvocation(target, {
255
253
  stackName,
256
254
  remoteServerPort = null,
257
255
  remoteExpoPort = null,
256
+ expoPublicPort = null,
258
257
  expoPublicUrl = '',
259
258
  startMobile = false,
260
259
  resolveServerPublicUrlOnTarget = false,
@@ -276,6 +275,9 @@ function resolveRemoteStackInvocation(target, {
276
275
  const expoPort = normalizedServices.expo
277
276
  ? requireServicePort(remoteExpoPort, 'remote Expo port')
278
277
  : null;
278
+ const stablePublicExpoPort = normalizedServices.expo && resolveExpoPublicUrlOnTarget
279
+ ? requireServicePort(expoPublicPort, 'public Expo port')
280
+ : null;
279
281
  const serverRuntimeConfig = normalizedServices.server
280
282
  ? normalizeRemoteServerRuntimeConfig(remoteServerRuntimeConfig)
281
283
  : null;
@@ -295,6 +297,7 @@ function resolveRemoteStackInvocation(target, {
295
297
  'HAPPIER_STACK_EXPO_DEV_PORT_STRATEGY=stable',
296
298
  'HAPPIER_STACK_EXPO_HOST=localhost',
297
299
  ]),
300
+ ...(stablePublicExpoPort == null ? [] : [`HAPPIER_STACK_EXPO_PUBLIC_PORT=${stablePublicExpoPort}`]),
298
301
  ...(expoPublicUrl && !resolveExpoPublicUrlOnTarget ? [`EXPO_PACKAGER_PROXY_URL=${expoPublicUrl}`] : []),
299
302
  'HAPPIER_CLI_PKGROLL_TIMEOUT_MS=1800000',
300
303
  ...(normalizedServices.daemon && deferDaemonStartUntilCredentials
@@ -194,7 +194,7 @@ test('remote server command pins stable public URL and exact target-local SQLite
194
194
  assert.match(command, /HAPPIER_STACK_SERVER_PORT=43005/);
195
195
  assert.match(command, /HAPPIER_SERVER_RETENTION__SESSION_SIDECHAIN_MESSAGES__DAYS=7/);
196
196
  assert.match(command, /--server-public-url=.*127\.0\.0\.1:52753/);
197
- assert.match(command, /--no-proxy/);
197
+ assert.doesNotMatch(command, /--no-proxy/);
198
198
  assert.doesNotMatch(command, /--no-server|--no-daemon/);
199
199
  assert.doesNotMatch(command, /guest\/data-must-not-leak|DATABASE_URL/);
200
200
  assert.match(stopCommand, /stack stop .*repo-local-dev.* --yes --no-docker --preserve-daemon/);
@@ -241,7 +241,8 @@ test('remote target resolves automatically detected mobile public addresses at i
241
241
  activeServerId: 'stack_repo__id_default',
242
242
  stackName: 'repo-local-dev',
243
243
  remoteServerPort: 52753,
244
- remoteExpoPort: 18829,
244
+ remoteExpoPort: 30685,
245
+ expoPublicPort: 18829,
245
246
  expoPublicUrl: 'http://192.168.5.15:18829',
246
247
  startMobile: true,
247
248
  resolveServerPublicUrlOnTarget: true,
@@ -258,6 +259,8 @@ test('remote target resolves automatically detected mobile public addresses at i
258
259
 
259
260
  assert.match(command, /--mobile/);
260
261
  assert.match(command, /HAPPIER_STACK_EXPO_HOST=localhost/);
262
+ assert.match(command, /HAPPIER_STACK_EXPO_PUBLIC_PORT=18829/);
263
+ assert.match(command, /HAPPIER_STACK_EXPO_DEV_PORT=30685/);
261
264
  assert.doesNotMatch(command, /EXPO_PACKAGER_PROXY_URL=/);
262
265
  assert.doesNotMatch(command, /--server-public-url=/);
263
266
  assert.doesNotMatch(command, /192\.168\.5\.15/);
@@ -476,6 +476,7 @@ export async function startStackDevTargets(
476
476
  stackName,
477
477
  remoteServerPort,
478
478
  remoteExpoPort,
479
+ expoPublicPort: localExpoPort,
479
480
  expoPublicUrl,
480
481
  resolveServerPublicUrlOnTarget: Boolean(resolveMobilePublicUrlsOnTarget && services.server),
481
482
  resolveExpoPublicUrlOnTarget: Boolean(resolveMobilePublicUrlsOnTarget && services.expo),
@@ -259,6 +259,11 @@ test('authoritative Mac server forwards its target-owned Expo through the guest
259
259
  assert.ok(tunnel?.args.some((arg) => String(arg).startsWith('*:18081:localhost:')));
260
260
  const worker = calls.find((call) => call.kind === 'spawn' && call.command === 'ssh' && !call.args.includes('-N'));
261
261
  assert.match(worker?.args.at(-1) ?? '', /HAPPIER_STACK_EXPO_DEV_PORT=/);
262
+ assert.match(
263
+ worker?.args.at(-1) ?? '',
264
+ /HAPPIER_STACK_EXPO_PUBLIC_PORT=18081/,
265
+ 'the target must publish the stable outer port while resolving its own reachable host',
266
+ );
262
267
  assert.doesNotMatch(
263
268
  worker?.args.at(-1) ?? '',
264
269
  /EXPO_PACKAGER_PROXY_URL=|--server-public-url=|192\.168\.1\.20/,
@@ -13,7 +13,7 @@ test('applyRuntimeServerSqliteEnv uses the bounded local pool by default', () =>
13
13
 
14
14
  assert.equal(
15
15
  env.DATABASE_URL,
16
- 'file:///tmp/happier-data/happier-server-light.sqlite?socket_timeout=30&connection_limit=1',
16
+ 'file:/tmp/happier-data/happier-server-light.sqlite?socket_timeout=30&connection_limit=1',
17
17
  );
18
18
  });
19
19
 
@@ -28,7 +28,7 @@ test('applyRuntimeServerSqliteEnv applies sqlite URL params from env when genera
28
28
 
29
29
  assert.equal(
30
30
  env.DATABASE_URL,
31
- 'file:///tmp/happier-data/happier-server-light.sqlite?socket_timeout=1&connection_limit=1',
31
+ 'file:/tmp/happier-data/happier-server-light.sqlite?socket_timeout=1&connection_limit=1',
32
32
  );
33
33
  });
34
34
 
@@ -683,7 +683,7 @@ test('non-main stack does not reuse runtime port with only a live pid and non-ha
683
683
  runtimeStatePath,
684
684
  defaultPort: 3005,
685
685
  listenerObservationScope,
686
- waitForTcpPortFreeImpl: async () => ({ status: 'occupied' }),
686
+ waitForTcpPortFreeImpl: async () => ({ status: 'occupied', reason: 'address-in-use' }),
687
687
  });
688
688
 
689
689
  assert.notEqual(out, port);
@@ -709,7 +709,7 @@ test('non-main stack errors when pinned server port is occupied by a non-happier
709
709
  runtimeStatePath: null,
710
710
  defaultPort: 3005,
711
711
  listenerObservationScope,
712
- waitForTcpPortFreeImpl: async () => ({ status: 'occupied' }),
712
+ waitForTcpPortFreeImpl: async () => ({ status: 'occupied', reason: 'address-in-use' }),
713
713
  }),
714
714
  /HAPPIER_STACK_SERVER_PORT/
715
715
  );
@@ -734,7 +734,7 @@ test('non-main stack errors when pinned server port health responds 200 for anot
734
734
  runtimeStatePath: null,
735
735
  defaultPort: 3005,
736
736
  listenerObservationScope,
737
- waitForTcpPortFreeImpl: async () => ({ status: 'occupied' }),
737
+ waitForTcpPortFreeImpl: async () => ({ status: 'occupied', reason: 'address-in-use' }),
738
738
  }),
739
739
  /HAPPIER_STACK_SERVER_PORT/
740
740
  );