@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.
- package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.d.ts +1 -0
- package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.d.ts.map +1 -1
- package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.js +3 -0
- package/node_modules/@happier-dev/agents/dist/connectedServices/runtimeFallbackCapability.js.map +1 -1
- package/node_modules/@happier-dev/agents/dist/manifest.d.ts +1 -0
- package/node_modules/@happier-dev/agents/dist/manifest.d.ts.map +1 -1
- package/node_modules/@happier-dev/agents/dist/manifest.js +1 -0
- package/node_modules/@happier-dev/agents/dist/manifest.js.map +1 -1
- package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.d.ts +1 -1
- package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.d.ts.map +1 -1
- package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.js +2 -0
- package/node_modules/@happier-dev/agents/dist/runtime/terminal/control.js.map +1 -1
- package/node_modules/@happier-dev/agents/dist/types.d.ts +1 -0
- package/node_modules/@happier-dev/agents/dist/types.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.js +5 -18
- package/node_modules/@happier-dev/cli-common/dist/componentArtifacts/buildServerBinaryArtifactPayload.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.d.ts +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.js +14 -6
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/copyRuntimePayloadTree.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.d.ts +2 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.js +2 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/index.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.js +13 -19
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/selfHostServerEnv.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.d.ts +4 -0
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.js +20 -0
- package/node_modules/@happier-dev/cli-common/dist/firstPartyRuntime/serverRuntimeArtifactLayout.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/output/index.d.ts +1 -0
- package/node_modules/@happier-dev/cli-common/dist/output/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/output/index.js +1 -0
- package/node_modules/@happier-dev/cli-common/dist/output/index.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/output/planet.d.ts +47 -0
- package/node_modules/@happier-dev/cli-common/dist/output/planet.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/output/planet.js +183 -0
- package/node_modules/@happier-dev/cli-common/dist/output/planet.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/output/progress.d.ts +3 -1
- package/node_modules/@happier-dev/cli-common/dist/output/progress.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/output/progress.js +131 -57
- package/node_modules/@happier-dev/cli-common/dist/output/progress.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.js +41 -78
- package/node_modules/@happier-dev/cli-common/dist/relayHost/relayHostEngine.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.d.ts +5 -0
- package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.js +12 -0
- package/node_modules/@happier-dev/cli-common/dist/relayHost/remoteRelayRuntimeInstallCommand.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/service/windows.js +30 -8
- package/node_modules/@happier-dev/cli-common/dist/service/windows.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/license +9 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/package.json +83 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/readme.md +297 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/index.d.ts +325 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/index.js +225 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/utilities.js +33 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/node_modules/@happier-dev/cli-common/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/node_modules/@happier-dev/cli-common/package.json +3 -1
- package/node_modules/@happier-dev/protocol/dist/account/encryptionMigrate.d.ts +32 -8
- package/node_modules/@happier-dev/protocol/dist/account/encryptionMigrate.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.d.ts +5 -0
- package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.js +3 -0
- package/node_modules/@happier-dev/protocol/dist/account/settings/accountSettings.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.d.ts +6 -0
- package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.js +2 -0
- package/node_modules/@happier-dev/protocol/dist/account/settings/notificationChannels.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.js +106 -9
- package/node_modules/@happier-dev/protocol/dist/actions/actionExecutor.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.js +23 -9
- package/node_modules/@happier-dev/protocol/dist/actions/actionSpecs.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.d.ts +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.js +16 -4
- package/node_modules/@happier-dev/protocol/dist/actions/permissionPrivilege.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.d.ts +12 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.js +68 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestNotificationContent.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.d.ts +8 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.js +100 -0
- package/node_modules/@happier-dev/protocol/dist/activity/agentRequestSummary.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/parseJson.d.ts +2 -0
- package/node_modules/@happier-dev/protocol/dist/activity/parseJson.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/parseJson.js +32 -0
- package/node_modules/@happier-dev/protocol/dist/activity/parseJson.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.d.ts +12 -0
- package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.js +120 -0
- package/node_modules/@happier-dev/protocol/dist/activity/shellCommand.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.d.ts +1 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.js +1 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/index.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.d.ts +2 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.js +2 -1
- package/node_modules/@happier-dev/protocol/dist/clientCompatibility/primitives.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.d.ts +36 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.js +36 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountSubscription.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.d.ts +143 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.js +46 -0
- package/node_modules/@happier-dev/protocol/dist/connect/accountUsage.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.d.ts +40 -0
- package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.js +9 -0
- package/node_modules/@happier-dev/protocol/dist/connect/connectedServiceSchemas.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.d.ts +8 -0
- package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.js +22 -0
- package/node_modules/@happier-dev/protocol/dist/connect/recoveryCreditConsumeIdempotencyKey.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.d.ts +39 -0
- package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.js +4 -1
- package/node_modules/@happier-dev/protocol/dist/daemonExecutionRuns.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.d.ts +80 -20
- package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.js +18 -1
- package/node_modules/@happier-dev/protocol/dist/drafts/sessionDrafts.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.d.ts +25 -0
- package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.js +18 -0
- package/node_modules/@happier-dev/protocol/dist/executionRunStartRequest.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/executionRuns.d.ts +51 -3
- package/node_modules/@happier-dev/protocol/dist/executionRuns.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/executionRuns.js +5 -2
- package/node_modules/@happier-dev/protocol/dist/executionRuns.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/catalog.d.ts +12 -0
- package/node_modules/@happier-dev/protocol/dist/features/catalog.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/catalog.js +12 -0
- package/node_modules/@happier-dev/protocol/dist/features/catalog.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/decision.d.ts +2 -0
- package/node_modules/@happier-dev/protocol/dist/features/decision.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts +6 -0
- package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.js +4 -0
- package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts +6 -0
- package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/index.d.ts +11 -3
- package/node_modules/@happier-dev/protocol/dist/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/index.js +11 -3
- package/node_modules/@happier-dev/protocol/dist/index.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/prompts/buildAppendSystemPromptBaseV1.js +1 -1
- package/node_modules/@happier-dev/protocol/dist/prompts/buildAppendSystemPromptBaseV1.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.js +25 -35
- package/node_modules/@happier-dev/protocol/dist/prompts/executionRunsGuidanceV1.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/scm.d.ts +6 -0
- package/node_modules/@happier-dev/protocol/dist/scm.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/scm.js +3 -0
- package/node_modules/@happier-dev/protocol/dist/scm.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/scmRepositoryProvisioning.d.ts +6 -0
- package/node_modules/@happier-dev/protocol/dist/scmRepositoryProvisioning.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.d.ts +164 -0
- package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.js +3 -0
- package/node_modules/@happier-dev/protocol/dist/sessionControl/contract.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.d.ts +32 -0
- package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.js +23 -0
- package/node_modules/@happier-dev/protocol/dist/sessionControl/pendingActivationAuthorizationV1.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/sessionFolders/folderAssignments.d.ts +12 -0
- package/node_modules/@happier-dev/protocol/dist/sessionFolders/folderAssignments.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.d.ts +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.js +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionOrganization/constants.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.d.ts +13 -0
- package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.js +2 -0
- package/node_modules/@happier-dev/protocol/dist/sessionUserMessageRpc.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.d.ts +27 -1
- package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.js +0 -1
- package/node_modules/@happier-dev/protocol/dist/sessionWorkState/sessionWorkStateRpc.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/spawnSession.d.ts +2 -1
- package/node_modules/@happier-dev/protocol/dist/spawnSession.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/spawnSession.js +2 -1
- package/node_modules/@happier-dev/protocol/dist/spawnSession.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.d.ts +20 -0
- package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.d.ts.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.js +21 -0
- package/node_modules/@happier-dev/protocol/dist/structuredMessages/executionRunCompletionV1.js.map +1 -0
- package/node_modules/@happier-dev/protocol/dist/updates.d.ts +35 -0
- package/node_modules/@happier-dev/protocol/dist/updates.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/updates.js +2 -0
- package/node_modules/@happier-dev/protocol/dist/updates.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev_cli_build_ownership.test.mjs +3 -1
- package/scripts/dev_external_server_flags.test.mjs +23 -5
- package/scripts/ghops.test.mjs +9 -3
- package/scripts/provision/linux-ubuntu-provision.sh +5 -0
- package/scripts/provision/linux-ubuntu-provision.test.mjs +3 -1
- package/scripts/self_host_launchd.real.integration.test.mjs +5 -3
- package/scripts/self_host_runtime.mjs +10 -9
- package/scripts/self_host_runtime.test.mjs +2 -2
- package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +14 -0
- package/scripts/utils/dev/expo_dev.mjs +24 -1
- package/scripts/utils/dev_targets/mutagen_project.mjs +4 -1
- package/scripts/utils/dev_targets/mutagen_project.test.mjs +2 -1
- package/scripts/utils/dev_targets/remote_commands.mjs +5 -2
- package/scripts/utils/dev_targets/remote_commands.test.mjs +5 -2
- package/scripts/utils/dev_targets/supervisor.mjs +1 -0
- package/scripts/utils/dev_targets/supervisor.test.mjs +5 -0
- package/scripts/utils/server/apply_runtime_server_sqlite_env.test.mjs +2 -2
- 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
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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 () => {
|
package/scripts/ghops.test.mjs
CHANGED
|
@@ -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.
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
})
|
|
2368
|
+
});
|
|
2368
2369
|
|
|
2369
|
-
await
|
|
2370
|
-
await
|
|
2371
|
-
await
|
|
2372
|
-
await
|
|
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
|
|
2376
|
-
await
|
|
2377
|
-
await
|
|
2378
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
-
'
|
|
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
|
|
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.
|
|
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:
|
|
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
|
|
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
|
|
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
|
);
|