@happier-dev/stack 0.1.0-preview.1771446991.62892 → 0.1.0-preview.1771464806.49264
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/protocol/dist/common/asyncTtlCache.d.ts +3 -0
- package/node_modules/@happier-dev/protocol/dist/common/asyncTtlCache.d.ts.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/common/asyncTtlCache.js +11 -0
- package/node_modules/@happier-dev/protocol/dist/common/asyncTtlCache.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/catalog.d.ts +6 -6
- package/node_modules/@happier-dev/protocol/dist/features/catalog.js +6 -6
- package/node_modules/@happier-dev/protocol/dist/features/catalog.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/decision.d.ts +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.d.ts +3 -3
- package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.js +3 -3
- package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.js.map +1 -1
- package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts +5 -3
- 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 +7 -2
- 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 +5 -3
- package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/auth_login_respects_pinned_stack_port.test.mjs +200 -0
- package/scripts/remote_cmd.mjs +12 -2
- package/scripts/stack/run_script_with_stack_env.mjs +24 -2
|
@@ -15,6 +15,9 @@ export declare class AsyncTtlCache<T> {
|
|
|
15
15
|
errorTtlMs: number;
|
|
16
16
|
}>);
|
|
17
17
|
get(key: string): AsyncTtlCacheEntry<T> | null;
|
|
18
|
+
keys(): IterableIterator<string>;
|
|
19
|
+
delete(key: string): void;
|
|
20
|
+
clear(): void;
|
|
18
21
|
isFresh(entry: AsyncTtlCacheEntry<T>, nowMs?: number): boolean;
|
|
19
22
|
setSuccess(key: string, value: T, params?: Readonly<{
|
|
20
23
|
nowMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncTtlCache.d.ts","sourceRoot":"","sources":["../../src/common/asyncTtlCache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,GAC7E,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtE,qBAAa,aAAa,CAAC,CAAC;;gBAMd,MAAM,EAAE,QAAQ,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAK1E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,SAAa,GAAG,OAAO;IAIlE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAM9F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAM5E,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAenE"}
|
|
1
|
+
{"version":3,"file":"asyncTtlCache.d.ts","sourceRoot":"","sources":["../../src/common/asyncTtlCache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,GAC7E,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtE,qBAAa,aAAa,CAAC,CAAC;;gBAMd,MAAM,EAAE,QAAQ,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAK1E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIhC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKzB,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,SAAa,GAAG,OAAO;IAIlE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAM9F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAM5E,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAenE"}
|
|
@@ -10,6 +10,17 @@ export class AsyncTtlCache {
|
|
|
10
10
|
get(key) {
|
|
11
11
|
return this.#cache.get(key) ?? null;
|
|
12
12
|
}
|
|
13
|
+
keys() {
|
|
14
|
+
return this.#cache.keys();
|
|
15
|
+
}
|
|
16
|
+
delete(key) {
|
|
17
|
+
this.#cache.delete(key);
|
|
18
|
+
this.#inflight.delete(key);
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
this.#cache.clear();
|
|
22
|
+
this.#inflight.clear();
|
|
23
|
+
}
|
|
13
24
|
isFresh(entry, nowMs = Date.now()) {
|
|
14
25
|
return nowMs >= 0 && nowMs < entry.expiresAt;
|
|
15
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncTtlCache.js","sourceRoot":"","sources":["../../src/common/asyncTtlCache.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,aAAa;IACf,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;IAClD,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,oBAAoB,CAAS;IAC7B,kBAAkB,CAAS;IAEpC,YAAY,MAA8D;QACxE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,KAA4B,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACtD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,KAAQ,EAAE,MAAqD;QACrF,MAAM,KAAK,GAAG,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;QACxG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,MAAqD;QACzE,MAAM,KAAK,GAAG,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACtG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,SAAS,CAAI,GAAW,EAAE,GAAqB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAA2B,CAAC;QACnE,IAAI,QAAQ;YAAE,OAAO,MAAM,QAAQ,CAAC;QAEpC,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,OAAO,MAAM,GAAG,EAAE,CAAC;YACrB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,MAAM,OAAO,CAAC;IACvB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"asyncTtlCache.js","sourceRoot":"","sources":["../../src/common/asyncTtlCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,6 @@ export declare const FEATURE_CATALOG: {
|
|
|
6
6
|
readonly dependencies: readonly [];
|
|
7
7
|
readonly representation: "server";
|
|
8
8
|
};
|
|
9
|
-
readonly 'automations.existingSessionTarget': {
|
|
10
|
-
readonly description: "Automation target support for existing session execution.";
|
|
11
|
-
readonly defaultFailMode: "fail_closed";
|
|
12
|
-
readonly dependencies: readonly ["automations"];
|
|
13
|
-
readonly representation: "server";
|
|
14
|
-
};
|
|
15
9
|
readonly 'execution.runs': {
|
|
16
10
|
readonly description: "Execution runs / sub-agent orchestration surfaces and runtime.";
|
|
17
11
|
readonly defaultFailMode: "fail_closed";
|
|
@@ -54,6 +48,12 @@ export declare const FEATURE_CATALOG: {
|
|
|
54
48
|
readonly dependencies: readonly [];
|
|
55
49
|
readonly representation: "server";
|
|
56
50
|
};
|
|
51
|
+
readonly 'attachments.uploads': {
|
|
52
|
+
readonly description: "Client attachment uploads (files/images) sent to session runners for LLM access.";
|
|
53
|
+
readonly defaultFailMode: "fail_closed";
|
|
54
|
+
readonly dependencies: readonly [];
|
|
55
|
+
readonly representation: "server";
|
|
56
|
+
};
|
|
57
57
|
readonly 'sharing.session': {
|
|
58
58
|
readonly description: "Session sharing capability (share session with other users/devices).";
|
|
59
59
|
readonly defaultFailMode: "fail_closed";
|
|
@@ -8,12 +8,6 @@ const FEATURE_CATALOG_DEFINITION = {
|
|
|
8
8
|
dependencies: [],
|
|
9
9
|
representation: 'server',
|
|
10
10
|
},
|
|
11
|
-
'automations.existingSessionTarget': {
|
|
12
|
-
description: 'Automation target support for existing session execution.',
|
|
13
|
-
defaultFailMode: 'fail_closed',
|
|
14
|
-
dependencies: ['automations'],
|
|
15
|
-
representation: 'server',
|
|
16
|
-
},
|
|
17
11
|
'execution.runs': {
|
|
18
12
|
description: 'Execution runs / sub-agent orchestration surfaces and runtime.',
|
|
19
13
|
defaultFailMode: 'fail_closed',
|
|
@@ -56,6 +50,12 @@ const FEATURE_CATALOG_DEFINITION = {
|
|
|
56
50
|
dependencies: [],
|
|
57
51
|
representation: 'server',
|
|
58
52
|
},
|
|
53
|
+
'attachments.uploads': {
|
|
54
|
+
description: 'Client attachment uploads (files/images) sent to session runners for LLM access.',
|
|
55
|
+
defaultFailMode: 'fail_closed',
|
|
56
|
+
dependencies: [],
|
|
57
|
+
representation: 'server',
|
|
58
|
+
},
|
|
59
59
|
'sharing.session': {
|
|
60
60
|
description: 'Session sharing capability (share session with other users/devices).',
|
|
61
61
|
defaultFailMode: 'fail_closed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/features/catalog.ts"],"names":[],"mappings":"AAIA,SAAS,oBAAoB,CAE3B,OAAU;IACV,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,0BAA0B,GAAG;IACjC,WAAW,EAAE;QACX,WAAW,EAAE,sDAAsD;QACnE,eAAe,EAAE,aAAa;QAC9B,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,QAAQ;KACzB;IACD,
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/features/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,11 +49,11 @@ export declare const FeatureDecisionSchema: z.ZodObject<{
|
|
|
49
49
|
automations: "automations";
|
|
50
50
|
connectedServices: "connectedServices";
|
|
51
51
|
"execution.runs": "execution.runs";
|
|
52
|
-
"automations.existingSessionTarget": "automations.existingSessionTarget";
|
|
53
52
|
"voice.happierVoice": "voice.happierVoice";
|
|
54
53
|
"voice.agent": "voice.agent";
|
|
55
54
|
"connectedServices.quotas": "connectedServices.quotas";
|
|
56
55
|
"updates.ota": "updates.ota";
|
|
56
|
+
"attachments.uploads": "attachments.uploads";
|
|
57
57
|
"sharing.session": "sharing.session";
|
|
58
58
|
"sharing.public": "sharing.public";
|
|
59
59
|
"sharing.contentKeys": "sharing.contentKeys";
|
package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export declare const DEFAULT_EMBEDDED_FEATURE_POLICY_ENV: "preview";
|
|
2
2
|
declare const EMBEDDED_FEATURE_BUILD_POLICY_RAW_INNER: {
|
|
3
3
|
readonly preview: {
|
|
4
|
-
readonly allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp,voice";
|
|
5
|
-
readonly denyRaw: "automations,
|
|
4
|
+
readonly allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp,voice,attachments.uploads";
|
|
5
|
+
readonly denyRaw: "automations,execution.runs,voice.agent,social.friends,connectedServices,connectedServices.quotas,app.ui.changelog,scm.writeOperations,files.reviewComments,files.diffSyntaxHighlighting,files.editor,files.syntaxHighlighting.advanced";
|
|
6
6
|
};
|
|
7
7
|
readonly production: {
|
|
8
8
|
readonly allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp";
|
|
9
|
-
readonly denyRaw: "automations,
|
|
9
|
+
readonly denyRaw: "automations,execution.runs,voice,voice.agent,social.friends,connectedServices,connectedServices.quotas,app.ui.changelog,scm.writeOperations,files.reviewComments,files.diffSyntaxHighlighting,files.editor,files.syntaxHighlighting.advanced";
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
export declare const EMBEDDED_FEATURE_BUILD_POLICY_RAW: typeof EMBEDDED_FEATURE_BUILD_POLICY_RAW_INNER;
|
package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.js
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
export const DEFAULT_EMBEDDED_FEATURE_POLICY_ENV = "preview";
|
|
4
4
|
const EMBEDDED_FEATURE_BUILD_POLICY_RAW_INNER = {
|
|
5
5
|
preview: {
|
|
6
|
-
allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp,voice",
|
|
7
|
-
denyRaw: "automations,
|
|
6
|
+
allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp,voice,attachments.uploads",
|
|
7
|
+
denyRaw: "automations,execution.runs,voice.agent,social.friends,connectedServices,connectedServices.quotas,app.ui.changelog,scm.writeOperations,files.reviewComments,files.diffSyntaxHighlighting,files.editor,files.syntaxHighlighting.advanced",
|
|
8
8
|
},
|
|
9
9
|
production: {
|
|
10
10
|
allowRaw: "updates.ota,sharing.session,sharing.public,sharing.contentKeys,sharing.pendingQueueV2,auth.recovery.providerReset,auth.ui.recoveryKeyReminder,app.analytics,app.ui.storeReviewPrompts,app.ui.sessionGettingStartedGuidance,bugReports,session.typeSelector,zen.navigation,usage.reporting,messages.thinkingVisibility,codex.resume.mcp,codex.resume.acp",
|
|
11
|
-
denyRaw: "automations,
|
|
11
|
+
denyRaw: "automations,execution.runs,voice,voice.agent,social.friends,connectedServices,connectedServices.quotas,app.ui.changelog,scm.writeOperations,files.reviewComments,files.diffSyntaxHighlighting,files.editor,files.syntaxHighlighting.advanced",
|
|
12
12
|
},
|
|
13
13
|
};
|
|
14
14
|
export const EMBEDDED_FEATURE_BUILD_POLICY_RAW = Object.freeze({
|
package/node_modules/@happier-dev/protocol/dist/features/embeddedFeaturePolicies.generated.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddedFeaturePolicies.generated.js","sourceRoot":"","sources":["../../src/features/embeddedFeaturePolicies.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,uBAAuB;AAEvB,MAAM,CAAC,MAAM,mCAAmC,GAAG,SAAkB,CAAC;AAEtE,MAAM,uCAAuC,GAAG;IAC9C,OAAO,EAAE;QACP,QAAQ,EAAE
|
|
1
|
+
{"version":3,"file":"embeddedFeaturePolicies.generated.js","sourceRoot":"","sources":["../../src/features/embeddedFeaturePolicies.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,uBAAuB;AAEvB,MAAM,CAAC,MAAM,mCAAmC,GAAG,SAAkB,CAAC;AAEtE,MAAM,uCAAuC,GAAG;IAC9C,OAAO,EAAE;QACP,QAAQ,EAAE,mXAAmX;QAC7X,OAAO,EAAE,wOAAwO;KAClP;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,yVAAyV;QACnW,OAAO,EAAE,8OAA8O;KACxP;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,iCAAiC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,uCAAuC,CAAC,OAAO,EAAE,CAAC;IAC9E,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,uCAAuC,CAAC,UAAU,EAAE,CAAC;CACrF,CAAmD,CAAC"}
|
|
@@ -3,12 +3,14 @@ export declare const FeatureGatesSchema: z.ZodObject<{
|
|
|
3
3
|
bugReports: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
4
4
|
enabled: z.ZodBoolean;
|
|
5
5
|
}, z.core.$strip>>>;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
existingSessionTarget: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
6
|
+
attachments: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
7
|
+
uploads: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
9
8
|
enabled: z.ZodBoolean;
|
|
10
9
|
}, z.core.$strip>>>;
|
|
11
10
|
}, z.core.$strip>>>;
|
|
11
|
+
automations: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
12
|
+
enabled: z.ZodBoolean;
|
|
13
|
+
}, z.core.$strip>>>;
|
|
12
14
|
connectedServices: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
13
15
|
enabled: z.ZodBoolean;
|
|
14
16
|
quotas: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
package/node_modules/@happier-dev/protocol/dist/features/payload/featureGatesSchema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureGatesSchema.d.ts","sourceRoot":"","sources":["../../../src/features/payload/featureGatesSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"featureGatesSchema.d.ts","sourceRoot":"","sources":["../../../src/features/payload/featureGatesSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoE7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
|
@@ -7,13 +7,18 @@ const VoiceGateSchema = z.object({
|
|
|
7
7
|
});
|
|
8
8
|
export const FeatureGatesSchema = z.object({
|
|
9
9
|
bugReports: FeatureGateSchema.optional().default(DEFAULT_GATE_DISABLED),
|
|
10
|
+
attachments: z
|
|
11
|
+
.object({
|
|
12
|
+
uploads: FeatureGateSchema.optional().default(DEFAULT_GATE_DISABLED),
|
|
13
|
+
})
|
|
14
|
+
.optional()
|
|
15
|
+
.default({ uploads: DEFAULT_GATE_DISABLED }),
|
|
10
16
|
automations: z
|
|
11
17
|
.object({
|
|
12
18
|
enabled: z.boolean(),
|
|
13
|
-
existingSessionTarget: FeatureGateSchema.optional().default(DEFAULT_GATE_DISABLED),
|
|
14
19
|
})
|
|
15
20
|
.optional()
|
|
16
|
-
.default({ enabled: false
|
|
21
|
+
.default({ enabled: false }),
|
|
17
22
|
connectedServices: z
|
|
18
23
|
.object({
|
|
19
24
|
enabled: z.boolean(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureGatesSchema.js","sourceRoot":"","sources":["../../../src/features/payload/featureGatesSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,kBAAkB,CAAC;AAEvE,MAAM,qBAAqB,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAE9D,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,YAAY,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;IACvE,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"featureGatesSchema.js","sourceRoot":"","sources":["../../../src/features/payload/featureGatesSchema.ts"],"names":[],"mappings":"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"}
|
package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts
CHANGED
|
@@ -6,12 +6,14 @@ export declare const FeaturesResponseSchema: z.ZodPipe<z.ZodTransform<unknown, u
|
|
|
6
6
|
bugReports: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
7
7
|
enabled: z.ZodBoolean;
|
|
8
8
|
}, z.core.$strip>>>;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
existingSessionTarget: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
9
|
+
attachments: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
10
|
+
uploads: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
12
11
|
enabled: z.ZodBoolean;
|
|
13
12
|
}, z.core.$strip>>>;
|
|
14
13
|
}, z.core.$strip>>>;
|
|
14
|
+
automations: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
15
|
+
enabled: z.ZodBoolean;
|
|
16
|
+
}, z.core.$strip>>>;
|
|
15
17
|
connectedServices: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
16
18
|
enabled: z.ZodBoolean;
|
|
17
19
|
quotas: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
package/node_modules/@happier-dev/protocol/dist/features/payload/featuresResponseSchema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featuresResponseSchema.d.ts","sourceRoot":"","sources":["../../../src/features/payload/featuresResponseSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAuBhF,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"featuresResponseSchema.d.ts","sourceRoot":"","sources":["../../../src/features/payload/featuresResponseSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAuBhF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAMlC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { dirname, join } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import net from 'node:net';
|
|
9
|
+
|
|
10
|
+
function runNode(args, { cwd, env } = {}) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const proc = spawn(process.execPath, args, { cwd, env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
13
|
+
let stdout = '';
|
|
14
|
+
let stderr = '';
|
|
15
|
+
proc.stdout.on('data', (d) => (stdout += String(d)));
|
|
16
|
+
proc.stderr.on('data', (d) => (stderr += String(d)));
|
|
17
|
+
proc.on('error', reject);
|
|
18
|
+
proc.on('exit', (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function ensureMinimalMonorepo({ monoRoot }) {
|
|
23
|
+
await mkdir(join(monoRoot, 'apps', 'ui'), { recursive: true });
|
|
24
|
+
await mkdir(join(monoRoot, 'apps', 'cli'), { recursive: true });
|
|
25
|
+
await mkdir(join(monoRoot, 'apps', 'server'), { recursive: true });
|
|
26
|
+
await writeFile(join(monoRoot, 'apps', 'ui', 'package.json'), '{}\n', 'utf-8');
|
|
27
|
+
await writeFile(join(monoRoot, 'apps', 'cli', 'package.json'), '{}\n', 'utf-8');
|
|
28
|
+
await writeFile(join(monoRoot, 'apps', 'server', 'package.json'), '{}\n', 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function pickFreeLocalPort() {
|
|
32
|
+
const srv = net.createServer();
|
|
33
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
34
|
+
srv.once('error', rejectPromise);
|
|
35
|
+
srv.listen({ host: '127.0.0.1', port: 0 }, () => resolvePromise());
|
|
36
|
+
});
|
|
37
|
+
const addr = srv.address();
|
|
38
|
+
const port = typeof addr === 'object' && addr ? Number(addr.port) : NaN;
|
|
39
|
+
await new Promise((resolvePromise) => srv.close(() => resolvePromise()));
|
|
40
|
+
if (!Number.isFinite(port) || port <= 0) {
|
|
41
|
+
throw new Error(`failed to pick a free local port (got: ${String(port)})`);
|
|
42
|
+
}
|
|
43
|
+
return port;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
test('hstack stack auth <stack> login --print prefers pinned env port over stale runtime port', async () => {
|
|
47
|
+
const scriptsDir = dirname(fileURLToPath(import.meta.url));
|
|
48
|
+
const rootDir = dirname(scriptsDir);
|
|
49
|
+
|
|
50
|
+
const tmp = await mkdtemp(join(tmpdir(), 'hstack-auth-pinned-port-'));
|
|
51
|
+
try {
|
|
52
|
+
const storageDir = join(tmp, 'storage');
|
|
53
|
+
const monoRoot = join(tmp, 'happier');
|
|
54
|
+
await ensureMinimalMonorepo({ monoRoot });
|
|
55
|
+
|
|
56
|
+
const stackName = 'dev';
|
|
57
|
+
const stackDir = join(storageDir, stackName);
|
|
58
|
+
await mkdir(stackDir, { recursive: true });
|
|
59
|
+
|
|
60
|
+
const envPath = join(stackDir, 'env');
|
|
61
|
+
await writeFile(
|
|
62
|
+
envPath,
|
|
63
|
+
[
|
|
64
|
+
`HAPPIER_STACK_STACK=${stackName}`,
|
|
65
|
+
`HAPPIER_STACK_REPO_DIR=${monoRoot}`,
|
|
66
|
+
'HAPPIER_STACK_SERVER_PORT=4101',
|
|
67
|
+
// Avoid external probes so --json stays hermetic.
|
|
68
|
+
'HAPPIER_STACK_TAILSCALE_PREFER_PUBLIC_URL=0',
|
|
69
|
+
'HAPPIER_STACK_TAILSCALE_SERVE=0',
|
|
70
|
+
'',
|
|
71
|
+
].join('\n'),
|
|
72
|
+
'utf-8'
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Simulate a stale runtime state with a different port recorded.
|
|
76
|
+
await writeFile(
|
|
77
|
+
join(stackDir, 'stack.runtime.json'),
|
|
78
|
+
JSON.stringify({ version: 1, ownerPid: 0, ports: { server: 4999 } }, null, 2) + '\n',
|
|
79
|
+
'utf-8'
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const env = {
|
|
83
|
+
...process.env,
|
|
84
|
+
HAPPIER_STACK_STORAGE_DIR: storageDir,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const res = await runNode(
|
|
88
|
+
[join(rootDir, 'bin', 'hstack.mjs'), 'stack', 'auth', stackName, 'login', '--print', '--no-open', '--json'],
|
|
89
|
+
{ cwd: rootDir, env }
|
|
90
|
+
);
|
|
91
|
+
assert.equal(res.code, 0, `expected exit 0, got ${res.code}\nstderr:\n${res.stderr}\nstdout:\n${res.stdout}`);
|
|
92
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
93
|
+
assert.equal(parsed?.internalServerUrl, 'http://127.0.0.1:4101');
|
|
94
|
+
} finally {
|
|
95
|
+
await rm(tmp, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('hstack stack auth <stack> login --print uses last runtime port when stack env is ephemeral', async () => {
|
|
100
|
+
const scriptsDir = dirname(fileURLToPath(import.meta.url));
|
|
101
|
+
const rootDir = dirname(scriptsDir);
|
|
102
|
+
|
|
103
|
+
const tmp = await mkdtemp(join(tmpdir(), 'hstack-auth-ephemeral-port-'));
|
|
104
|
+
try {
|
|
105
|
+
const storageDir = join(tmp, 'storage');
|
|
106
|
+
const monoRoot = join(tmp, 'happier');
|
|
107
|
+
await ensureMinimalMonorepo({ monoRoot });
|
|
108
|
+
|
|
109
|
+
const stackName = 'dev';
|
|
110
|
+
const stackDir = join(storageDir, stackName);
|
|
111
|
+
await mkdir(stackDir, { recursive: true });
|
|
112
|
+
|
|
113
|
+
const envPath = join(stackDir, 'env');
|
|
114
|
+
await writeFile(
|
|
115
|
+
envPath,
|
|
116
|
+
[
|
|
117
|
+
`HAPPIER_STACK_STACK=${stackName}`,
|
|
118
|
+
`HAPPIER_STACK_REPO_DIR=${monoRoot}`,
|
|
119
|
+
// Intentionally omit HAPPIER_STACK_SERVER_PORT (ephemeral model).
|
|
120
|
+
'HAPPIER_STACK_TAILSCALE_PREFER_PUBLIC_URL=0',
|
|
121
|
+
'HAPPIER_STACK_TAILSCALE_SERVE=0',
|
|
122
|
+
'',
|
|
123
|
+
].join('\n'),
|
|
124
|
+
'utf-8'
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
await writeFile(
|
|
128
|
+
join(stackDir, 'stack.runtime.json'),
|
|
129
|
+
JSON.stringify({ version: 1, ownerPid: 0, ports: { server: 4999 } }, null, 2) + '\n',
|
|
130
|
+
'utf-8'
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const env = {
|
|
134
|
+
...process.env,
|
|
135
|
+
HAPPIER_STACK_STORAGE_DIR: storageDir,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const res = await runNode(
|
|
139
|
+
[join(rootDir, 'bin', 'hstack.mjs'), 'stack', 'auth', stackName, 'login', '--print', '--no-open', '--json'],
|
|
140
|
+
{ cwd: rootDir, env }
|
|
141
|
+
);
|
|
142
|
+
assert.equal(res.code, 0, `expected exit 0, got ${res.code}\nstderr:\n${res.stderr}\nstdout:\n${res.stdout}`);
|
|
143
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
144
|
+
assert.equal(parsed?.internalServerUrl, 'http://127.0.0.1:4999');
|
|
145
|
+
} finally {
|
|
146
|
+
await rm(tmp, { recursive: true, force: true });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test('hstack stack dev <stack> --json reuses recorded runtime port for ephemeral stacks', async () => {
|
|
151
|
+
const scriptsDir = dirname(fileURLToPath(import.meta.url));
|
|
152
|
+
const rootDir = dirname(scriptsDir);
|
|
153
|
+
|
|
154
|
+
const tmp = await mkdtemp(join(tmpdir(), 'hstack-stack-ephemeral-reuse-'));
|
|
155
|
+
try {
|
|
156
|
+
const storageDir = join(tmp, 'storage');
|
|
157
|
+
const monoRoot = join(tmp, 'happier');
|
|
158
|
+
await ensureMinimalMonorepo({ monoRoot });
|
|
159
|
+
|
|
160
|
+
const stackName = 'dev';
|
|
161
|
+
const stackDir = join(storageDir, stackName);
|
|
162
|
+
await mkdir(stackDir, { recursive: true });
|
|
163
|
+
|
|
164
|
+
const envPath = join(stackDir, 'env');
|
|
165
|
+
await writeFile(
|
|
166
|
+
envPath,
|
|
167
|
+
[
|
|
168
|
+
`HAPPIER_STACK_STACK=${stackName}`,
|
|
169
|
+
`HAPPIER_STACK_REPO_DIR=${monoRoot}`,
|
|
170
|
+
// Intentionally omit HAPPIER_STACK_SERVER_PORT (ephemeral model).
|
|
171
|
+
'HAPPIER_STACK_TAILSCALE_PREFER_PUBLIC_URL=0',
|
|
172
|
+
'HAPPIER_STACK_TAILSCALE_SERVE=0',
|
|
173
|
+
'',
|
|
174
|
+
].join('\n'),
|
|
175
|
+
'utf-8'
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
const runtimePort = await pickFreeLocalPort();
|
|
179
|
+
await writeFile(
|
|
180
|
+
join(stackDir, 'stack.runtime.json'),
|
|
181
|
+
JSON.stringify({ version: 1, ownerPid: 0, ports: { server: runtimePort } }, null, 2) + '\n',
|
|
182
|
+
'utf-8'
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
const env = {
|
|
186
|
+
...process.env,
|
|
187
|
+
HAPPIER_STACK_STORAGE_DIR: storageDir,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const res = await runNode(
|
|
191
|
+
[join(rootDir, 'bin', 'hstack.mjs'), 'stack', 'dev', stackName, '--json'],
|
|
192
|
+
{ cwd: rootDir, env }
|
|
193
|
+
);
|
|
194
|
+
assert.equal(res.code, 0, `expected exit 0, got ${res.code}\nstderr:\n${res.stderr}\nstdout:\n${res.stdout}`);
|
|
195
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
196
|
+
assert.equal(parsed?.serverPort, runtimePort);
|
|
197
|
+
} finally {
|
|
198
|
+
await rm(tmp, { recursive: true, force: true });
|
|
199
|
+
}
|
|
200
|
+
});
|
package/scripts/remote_cmd.mjs
CHANGED
|
@@ -55,11 +55,11 @@ function parseJsonLinesBestEffort(stdout) {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
async function runSsh({ target, command }) {
|
|
58
|
-
await run('ssh', [target, 'bash', '-lc', command], { env: process.env });
|
|
58
|
+
await run('ssh', [target, 'bash', '-lc', safeBashSingleQuote(command)], { env: process.env });
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
async function runSshJson({ target, command }) {
|
|
62
|
-
const out = await runCapture('ssh', [target, 'bash', '-lc', command], { env: process.env });
|
|
62
|
+
const out = await runCapture('ssh', [target, 'bash', '-lc', safeBashSingleQuote(command)], { env: process.env });
|
|
63
63
|
const parsed = parseJsonLinesBestEffort(out);
|
|
64
64
|
if (!parsed) {
|
|
65
65
|
throw new Error('Remote command did not return valid JSON');
|
|
@@ -211,6 +211,16 @@ async function runRemoteDaemonSetup(argvRaw) {
|
|
|
211
211
|
|
|
212
212
|
await runSsh({ target: ssh.value, command: installCmd });
|
|
213
213
|
|
|
214
|
+
if (serverFlags.serverUrl) {
|
|
215
|
+
const serverUrl = safeBashSingleQuote(serverFlags.serverUrl);
|
|
216
|
+
const webappUrl = safeBashSingleQuote(serverFlags.webappUrl || serverFlags.serverUrl);
|
|
217
|
+
// Persist server targeting on the remote host so future `happier daemon start` uses the same server.
|
|
218
|
+
await runSsh({
|
|
219
|
+
target: ssh.value,
|
|
220
|
+
command: `${remoteBin} server set --server-url ${serverUrl} --webapp-url ${webappUrl} --json`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
214
224
|
const request = await runSshJson({ target: ssh.value, command: `${remoteBin} auth request --json` });
|
|
215
225
|
const publicKey = typeof request?.publicKey === 'string' ? request.publicKey : '';
|
|
216
226
|
if (!publicKey) {
|
|
@@ -169,8 +169,16 @@ export async function runStackScriptWithStackEnv({ rootDir, stackName, scriptPat
|
|
|
169
169
|
const n = Number(v);
|
|
170
170
|
return Number.isFinite(n) && n > 0 ? n : null;
|
|
171
171
|
};
|
|
172
|
+
// Port reuse:
|
|
173
|
+
// - Hard reuse: `--restart` (fail-closed if ports are occupied unless we can prove stack ownership).
|
|
174
|
+
// - Soft reuse: if the stack previously recorded ports in stack.runtime.json, prefer reusing them
|
|
175
|
+
// on the next start to keep stack endpoints stable (helps auth + server-scoped state).
|
|
176
|
+
const hasRecordedPorts = hasRecordedRuntimePortsForRestart(runtimeState);
|
|
177
|
+
const wantsSoftReuse = !wantsRestart && hasRecordedPorts && existingPorts;
|
|
178
|
+
const wantsHardReuse = isTrueRestart;
|
|
179
|
+
|
|
172
180
|
const candidatePorts =
|
|
173
|
-
|
|
181
|
+
(wantsHardReuse || wantsSoftReuse) && existingPorts
|
|
174
182
|
? {
|
|
175
183
|
server: parsePortOrNull(existingPorts.server),
|
|
176
184
|
backend: parsePortOrNull(existingPorts.backend),
|
|
@@ -181,12 +189,26 @@ export async function runStackScriptWithStackEnv({ rootDir, stackName, scriptPat
|
|
|
181
189
|
}
|
|
182
190
|
: null;
|
|
183
191
|
|
|
184
|
-
|
|
192
|
+
let canReuse =
|
|
185
193
|
candidatePorts &&
|
|
186
194
|
candidatePorts.server &&
|
|
187
195
|
(serverComponent !== 'happier-server' || candidatePorts.backend) &&
|
|
188
196
|
(!managedInfra || (candidatePorts.pg && candidatePorts.redis && candidatePorts.minio && candidatePorts.minioConsole));
|
|
189
197
|
|
|
198
|
+
// Soft reuse: if previously recorded ports are occupied, fall back to allocating new ports.
|
|
199
|
+
if (canReuse && wantsSoftReuse && !wantsHardReuse) {
|
|
200
|
+
const toCheck = Object.values(candidatePorts)
|
|
201
|
+
.map((n) => Number(n))
|
|
202
|
+
.filter((n) => Number.isFinite(n) && n > 0);
|
|
203
|
+
for (const p of toCheck) {
|
|
204
|
+
// eslint-disable-next-line no-await-in-loop
|
|
205
|
+
if (!(await isTcpPortFree(p))) {
|
|
206
|
+
canReuse = false;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
190
212
|
if (canReuse) {
|
|
191
213
|
ports.server = candidatePorts.server;
|
|
192
214
|
if (serverComponent === 'happier-server') {
|