@happier-dev/stack 0.1.0-preview.10.1 → 0.1.0-preview.134.1

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 (109) hide show
  1. package/docs/server-flavors.md +6 -6
  2. package/node_modules/@happier-dev/cli-common/dist/index.d.ts +2 -0
  3. package/node_modules/@happier-dev/cli-common/dist/index.d.ts.map +1 -1
  4. package/node_modules/@happier-dev/cli-common/dist/index.js +2 -0
  5. package/node_modules/@happier-dev/cli-common/dist/index.js.map +1 -1
  6. package/node_modules/@happier-dev/cli-common/dist/providers/index.d.ts +51 -0
  7. package/node_modules/@happier-dev/cli-common/dist/providers/index.d.ts.map +1 -0
  8. package/node_modules/@happier-dev/cli-common/dist/providers/index.js +129 -0
  9. package/node_modules/@happier-dev/cli-common/dist/providers/index.js.map +1 -0
  10. package/node_modules/@happier-dev/cli-common/dist/service/index.d.ts +5 -0
  11. package/node_modules/@happier-dev/cli-common/dist/service/index.d.ts.map +1 -0
  12. package/node_modules/@happier-dev/cli-common/dist/service/index.js +5 -0
  13. package/node_modules/@happier-dev/cli-common/dist/service/index.js.map +1 -0
  14. package/node_modules/@happier-dev/cli-common/dist/service/launchd.d.ts +15 -0
  15. package/node_modules/@happier-dev/cli-common/dist/service/launchd.d.ts.map +1 -0
  16. package/node_modules/@happier-dev/cli-common/dist/service/launchd.js +97 -0
  17. package/node_modules/@happier-dev/cli-common/dist/service/launchd.js.map +1 -0
  18. package/node_modules/@happier-dev/cli-common/dist/service/manager.d.ts +55 -0
  19. package/node_modules/@happier-dev/cli-common/dist/service/manager.d.ts.map +1 -0
  20. package/node_modules/@happier-dev/cli-common/dist/service/manager.js +302 -0
  21. package/node_modules/@happier-dev/cli-common/dist/service/manager.js.map +1 -0
  22. package/node_modules/@happier-dev/cli-common/dist/service/systemd.d.ts +12 -0
  23. package/node_modules/@happier-dev/cli-common/dist/service/systemd.d.ts.map +1 -0
  24. package/node_modules/@happier-dev/cli-common/dist/service/systemd.js +75 -0
  25. package/node_modules/@happier-dev/cli-common/dist/service/systemd.js.map +1 -0
  26. package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts +8 -0
  27. package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts.map +1 -0
  28. package/node_modules/@happier-dev/cli-common/dist/service/windows.js +29 -0
  29. package/node_modules/@happier-dev/cli-common/dist/service/windows.js.map +1 -0
  30. package/node_modules/@happier-dev/cli-common/package.json +11 -0
  31. package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts +22 -0
  32. package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts.map +1 -0
  33. package/node_modules/@happier-dev/release-runtime/dist/assets.js +44 -0
  34. package/node_modules/@happier-dev/release-runtime/dist/assets.js.map +1 -0
  35. package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts +5 -0
  36. package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts.map +1 -0
  37. package/node_modules/@happier-dev/release-runtime/dist/checksums.js +21 -0
  38. package/node_modules/@happier-dev/release-runtime/dist/checksums.js.map +1 -0
  39. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts +14 -0
  40. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts.map +1 -0
  41. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js +39 -0
  42. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js.map +1 -0
  43. package/node_modules/@happier-dev/release-runtime/dist/github.d.ts +20 -0
  44. package/node_modules/@happier-dev/release-runtime/dist/github.d.ts.map +1 -0
  45. package/node_modules/@happier-dev/release-runtime/dist/github.js +60 -0
  46. package/node_modules/@happier-dev/release-runtime/dist/github.js.map +1 -0
  47. package/node_modules/@happier-dev/release-runtime/dist/index.d.ts +7 -0
  48. package/node_modules/@happier-dev/release-runtime/dist/index.d.ts.map +1 -0
  49. package/node_modules/@happier-dev/release-runtime/dist/index.js +7 -0
  50. package/node_modules/@happier-dev/release-runtime/dist/index.js.map +1 -0
  51. package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts +7 -0
  52. package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts.map +1 -0
  53. package/node_modules/@happier-dev/release-runtime/dist/minisign.js +92 -0
  54. package/node_modules/@happier-dev/release-runtime/dist/minisign.js.map +1 -0
  55. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts +26 -0
  56. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts.map +1 -0
  57. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js +53 -0
  58. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js.map +1 -0
  59. package/node_modules/@happier-dev/release-runtime/package.json +38 -0
  60. package/package.json +4 -2
  61. package/scripts/auth.mjs +3 -2
  62. package/scripts/auth_copy_from_pglite_lock_in_use.integration.test.mjs +1 -0
  63. package/scripts/auth_copy_from_runCapture.integration.test.mjs +8 -1
  64. package/scripts/build.mjs +3 -18
  65. package/scripts/bundleWorkspaceDeps.mjs +5 -1
  66. package/scripts/bundleWorkspaceDeps.test.mjs +16 -0
  67. package/scripts/mobile.mjs +32 -1
  68. package/scripts/mobile_prebuild_happyDir_defined.test.mjs +47 -0
  69. package/scripts/mobile_prebuild_sets_rct_metro_port.test.mjs +81 -0
  70. package/scripts/mobile_run_ios_passes_port.integration.test.mjs +101 -0
  71. package/scripts/providers_cmd.mjs +262 -0
  72. package/scripts/release_binary_smoke.integration.test.mjs +25 -6
  73. package/scripts/remote_cmd.mjs +240 -0
  74. package/scripts/self_host_daemon.real.integration.test.mjs +296 -0
  75. package/scripts/self_host_launchd.real.integration.test.mjs +211 -0
  76. package/scripts/self_host_runtime.mjs +1403 -312
  77. package/scripts/self_host_runtime.test.mjs +361 -1
  78. package/scripts/self_host_schtasks.real.integration.test.mjs +217 -0
  79. package/scripts/self_host_service_e2e_harness.mjs +93 -0
  80. package/scripts/self_host_systemd.real.integration.test.mjs +8 -86
  81. package/scripts/service.mjs +156 -26
  82. package/scripts/stack/command_arguments.mjs +1 -0
  83. package/scripts/stack/help_text.mjs +2 -0
  84. package/scripts/stack_daemon_cmd.integration.test.mjs +37 -0
  85. package/scripts/stack_happy_cmd.integration.test.mjs +36 -0
  86. package/scripts/utils/auth/credentials_paths.mjs +9 -9
  87. package/scripts/utils/auth/credentials_paths.test.mjs +8 -0
  88. package/scripts/utils/auth/stable_scope_id.mjs +1 -1
  89. package/scripts/utils/cli/cli_registry.mjs +18 -0
  90. package/scripts/utils/cli/progress.mjs +8 -1
  91. package/scripts/utils/cli/progress.test.mjs +43 -0
  92. package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +17 -0
  93. package/scripts/utils/dev/expo_dev.mjs +35 -5
  94. package/scripts/utils/dev/expo_dev_restart_port_reservation.test.mjs +180 -1
  95. package/scripts/utils/dev/expo_dev_runtime_metadata.test.mjs +126 -0
  96. package/scripts/utils/dev/expo_dev_verbose_logs.test.mjs +9 -2
  97. package/scripts/utils/server/port.mjs +20 -2
  98. package/scripts/utils/service/service_manager.definition.test.mjs +66 -0
  99. package/scripts/utils/service/service_manager.mjs +96 -0
  100. package/scripts/utils/service/service_manager.plan.test.mjs +37 -0
  101. package/scripts/utils/service/service_manager.test.mjs +20 -0
  102. package/scripts/utils/service/systemd_service_unit.mjs +1 -0
  103. package/scripts/utils/service/systemd_service_unit.test.mjs +42 -0
  104. package/scripts/utils/service/windows_schtasks_wrapper.mjs +1 -0
  105. package/scripts/utils/service/windows_schtasks_wrapper.test.mjs +25 -0
  106. package/scripts/utils/ui/ui_export_env.mjs +29 -0
  107. package/scripts/utils/ui/ui_export_env.test.mjs +25 -0
  108. package/scripts/worktrees.mjs +3 -0
  109. package/scripts/worktrees_status_default_target.test.mjs +56 -0
@@ -0,0 +1,302 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { chmod, mkdir, rename, writeFile } from 'node:fs/promises';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { buildLaunchdPath, buildLaunchdPlistXml } from './launchd.js';
5
+ import { renderSystemdServiceUnit } from './systemd.js';
6
+ import { renderWindowsScheduledTaskWrapperPs1 } from './windows.js';
7
+ export function resolveServiceBackend(params = {}) {
8
+ const p = String(params.platform ?? '').trim() || process.platform;
9
+ const m = String(params.mode ?? '').trim().toLowerCase() === 'system' ? 'system' : 'user';
10
+ if (p === 'darwin')
11
+ return m === 'system' ? 'launchd-system' : 'launchd-user';
12
+ if (p === 'linux')
13
+ return m === 'system' ? 'systemd-system' : 'systemd-user';
14
+ if (p === 'win32')
15
+ return m === 'system' ? 'schtasks-system' : 'schtasks-user';
16
+ throw new Error(`Unsupported platform: ${p}`);
17
+ }
18
+ function normalizeSpec(spec) {
19
+ const label = String(spec?.label ?? '').trim();
20
+ if (!label)
21
+ throw new Error('Service label is required');
22
+ const programArgs = Array.isArray(spec?.programArgs) ? spec.programArgs.map((a) => String(a ?? '')).filter(Boolean) : [];
23
+ if (programArgs.length === 0)
24
+ throw new Error('Service programArgs are required');
25
+ return {
26
+ label,
27
+ description: String(spec?.description ?? '').trim() || label,
28
+ programArgs,
29
+ workingDirectory: String(spec?.workingDirectory ?? '').trim(),
30
+ env: spec?.env ?? {},
31
+ runAsUser: String(spec?.runAsUser ?? '').trim(),
32
+ stdoutPath: String(spec?.stdoutPath ?? '').trim(),
33
+ stderrPath: String(spec?.stderrPath ?? '').trim(),
34
+ };
35
+ }
36
+ function systemdUnitPathForLabel(params) {
37
+ const unit = `${params.label}.service`;
38
+ if (params.mode === 'system')
39
+ return join('/etc/systemd/system', unit);
40
+ return join(String(params.homeDir ?? '').trim() || '', '.config', 'systemd', 'user', unit);
41
+ }
42
+ function launchdPlistPathForLabel(params) {
43
+ const dir = params.mode === 'system'
44
+ ? '/Library/LaunchDaemons'
45
+ : join(String(params.homeDir ?? '').trim() || '', 'Library', 'LaunchAgents');
46
+ return join(dir, `${params.label}.plist`);
47
+ }
48
+ function windowsWrapperPathForLabel(params) {
49
+ const base = String(params.homeDir ?? '').trim() || 'C:\\Users\\Default';
50
+ if (params.mode === 'system') {
51
+ return `C:\\\\ProgramData\\\\happier\\\\services\\\\${params.label}.ps1`;
52
+ }
53
+ return `${base}\\\\.happier\\\\services\\\\${params.label}.ps1`;
54
+ }
55
+ export function buildServiceDefinition(params) {
56
+ const s = normalizeSpec(params.spec);
57
+ const backend = String(params.backend ?? '').trim();
58
+ if (backend === 'systemd-user' || backend === 'systemd-system') {
59
+ const mode = backend === 'systemd-system' ? 'system' : 'user';
60
+ const path = systemdUnitPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
61
+ const contents = renderSystemdServiceUnit({
62
+ description: s.description,
63
+ execStart: s.programArgs,
64
+ workingDirectory: s.workingDirectory,
65
+ env: s.env,
66
+ restart: 'always',
67
+ runAsUser: s.runAsUser,
68
+ stdoutPath: s.stdoutPath,
69
+ stderrPath: s.stderrPath,
70
+ wantedBy: mode === 'system' ? 'multi-user.target' : 'default.target',
71
+ });
72
+ return { kind: 'systemd-service', path, contents, mode: 0o644 };
73
+ }
74
+ if (backend === 'launchd-user' || backend === 'launchd-system') {
75
+ const mode = backend === 'launchd-system' ? 'system' : 'user';
76
+ const path = launchdPlistPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
77
+ const mergedEnv = {
78
+ ...(s.env ?? {}),
79
+ PATH: buildLaunchdPath({ execPath: process.execPath, basePath: process.env.PATH }),
80
+ };
81
+ const contents = buildLaunchdPlistXml({
82
+ label: s.label,
83
+ programArgs: s.programArgs,
84
+ env: mergedEnv,
85
+ stdoutPath: s.stdoutPath || (mode === 'system' ? `/var/log/${s.label}.out.log` : join(String(params.homeDir ?? '').trim() || '', '.happier', 'logs', `${s.label}.out.log`)),
86
+ stderrPath: s.stderrPath || (mode === 'system' ? `/var/log/${s.label}.err.log` : join(String(params.homeDir ?? '').trim() || '', '.happier', 'logs', `${s.label}.err.log`)),
87
+ workingDirectory: s.workingDirectory,
88
+ keepAliveOnFailure: true,
89
+ });
90
+ return { kind: 'launchd-plist', path, contents, mode: 0o644 };
91
+ }
92
+ if (backend === 'schtasks-user' || backend === 'schtasks-system') {
93
+ const mode = backend === 'schtasks-system' ? 'system' : 'user';
94
+ const path = windowsWrapperPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
95
+ const contents = renderWindowsScheduledTaskWrapperPs1({
96
+ workingDirectory: s.workingDirectory,
97
+ programArgs: s.programArgs,
98
+ env: s.env,
99
+ stdoutPath: s.stdoutPath,
100
+ stderrPath: s.stderrPath,
101
+ });
102
+ return { kind: 'windows-wrapper-ps1', path, contents, mode: 0o644 };
103
+ }
104
+ throw new Error(`Unsupported backend: ${backend}`);
105
+ }
106
+ function resolveUid(uid) {
107
+ if (typeof uid === 'number' && Number.isFinite(uid) && uid >= 0)
108
+ return Math.floor(uid);
109
+ if (typeof process.getuid === 'function')
110
+ return process.getuid();
111
+ return null;
112
+ }
113
+ export function planServiceAction(params) {
114
+ const backend = String(params.backend ?? '').trim();
115
+ const action = String(params.action ?? '').trim();
116
+ const label = String(params.label ?? '').trim();
117
+ const definitionPath = String(params.definitionPath ?? '').trim();
118
+ const contents = String(params.definitionContents ?? '');
119
+ const taskName = String(params.taskName ?? '').trim();
120
+ const persistent = params.persistent !== false;
121
+ const uid = resolveUid(params.uid);
122
+ if (!backend)
123
+ throw new Error('backend is required');
124
+ if (!action)
125
+ throw new Error('action is required');
126
+ if (!label)
127
+ throw new Error('label is required');
128
+ const writes = [];
129
+ const commands = [];
130
+ if (action === 'install') {
131
+ if (!definitionPath)
132
+ throw new Error('definitionPath is required for install');
133
+ writes.push({ path: definitionPath, contents, mode: 0o644 });
134
+ }
135
+ if (backend === 'systemd-user' || backend === 'systemd-system') {
136
+ const prefix = backend === 'systemd-user' ? ['--user'] : [];
137
+ const unitName = `${label}.service`;
138
+ if (action === 'install') {
139
+ commands.push({ cmd: 'systemctl', args: [...prefix, 'daemon-reload'] });
140
+ commands.push({
141
+ cmd: 'systemctl',
142
+ args: persistent ? [...prefix, 'enable', '--now', unitName] : [...prefix, 'start', unitName],
143
+ });
144
+ return { writes, commands };
145
+ }
146
+ if (action === 'uninstall') {
147
+ commands.push({ cmd: 'systemctl', args: [...prefix, 'disable', '--now', unitName], allowFail: true });
148
+ commands.push({ cmd: 'systemctl', args: [...prefix, 'daemon-reload'] });
149
+ return { writes, commands };
150
+ }
151
+ if (action === 'start') {
152
+ commands.push({ cmd: 'systemctl', args: persistent ? [...prefix, 'enable', '--now', unitName] : [...prefix, 'start', unitName] });
153
+ return { writes, commands };
154
+ }
155
+ if (action === 'stop') {
156
+ commands.push({ cmd: 'systemctl', args: persistent ? [...prefix, 'disable', '--now', unitName] : [...prefix, 'stop', unitName], allowFail: true });
157
+ return { writes, commands };
158
+ }
159
+ if (action === 'restart') {
160
+ commands.push({ cmd: 'systemctl', args: [...prefix, 'restart', unitName] });
161
+ return { writes, commands };
162
+ }
163
+ }
164
+ if (backend === 'launchd-user' || backend === 'launchd-system') {
165
+ if (!definitionPath)
166
+ throw new Error('definitionPath is required for launchd operations');
167
+ const preferBootstrap = backend === 'launchd-user' && uid != null && uid > 0;
168
+ if (action === 'install' || action === 'start') {
169
+ if (preferBootstrap) {
170
+ commands.push({ cmd: 'launchctl', args: ['bootout', `gui/${uid}/${label}`], allowFail: true });
171
+ commands.push({ cmd: 'launchctl', args: ['bootstrap', `gui/${uid}`, definitionPath] });
172
+ commands.push({ cmd: 'launchctl', args: ['enable', `gui/${uid}/${label}`] });
173
+ commands.push({ cmd: 'launchctl', args: ['kickstart', '-k', `gui/${uid}/${label}`] });
174
+ }
175
+ else {
176
+ if (action === 'install') {
177
+ commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
178
+ }
179
+ commands.push({ cmd: 'launchctl', args: persistent ? ['load', '-w', definitionPath] : ['load', definitionPath] });
180
+ }
181
+ return { writes, commands };
182
+ }
183
+ if (action === 'uninstall' || action === 'stop') {
184
+ if (preferBootstrap) {
185
+ commands.push({ cmd: 'launchctl', args: ['disable', `gui/${uid}/${label}`], allowFail: true });
186
+ commands.push({ cmd: 'launchctl', args: ['bootout', `gui/${uid}`, definitionPath], allowFail: true });
187
+ commands.push({ cmd: 'launchctl', args: ['remove', label], allowFail: true });
188
+ }
189
+ else {
190
+ commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
191
+ }
192
+ return { writes, commands };
193
+ }
194
+ if (action === 'restart') {
195
+ if (preferBootstrap) {
196
+ commands.push({ cmd: 'launchctl', args: ['kickstart', '-k', `gui/${uid}/${label}`] });
197
+ }
198
+ else {
199
+ commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
200
+ commands.push({ cmd: 'launchctl', args: persistent ? ['load', '-w', definitionPath] : ['load', definitionPath] });
201
+ }
202
+ return { writes, commands };
203
+ }
204
+ }
205
+ if (backend === 'schtasks-user' || backend === 'schtasks-system') {
206
+ const name = taskName || `Happier\\${label}`;
207
+ const mode = backend === 'schtasks-system' ? 'system' : 'user';
208
+ if (action === 'install') {
209
+ if (!definitionPath)
210
+ throw new Error('definitionPath is required for schtasks install');
211
+ const ps = `powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${definitionPath}"`;
212
+ const schedule = persistent
213
+ ? (mode === 'system' ? 'ONSTART' : 'ONLOGON')
214
+ : 'ONCE';
215
+ const args = [
216
+ '/Create',
217
+ '/F',
218
+ '/SC',
219
+ schedule,
220
+ ...(schedule === 'ONCE' ? ['/ST', '00:00'] : []),
221
+ '/TN',
222
+ name,
223
+ '/TR',
224
+ ps,
225
+ ...(mode === 'system' ? ['/RU', 'SYSTEM', '/RL', 'HIGHEST'] : []),
226
+ ];
227
+ commands.push({ cmd: 'schtasks', args });
228
+ commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
229
+ return { writes, commands };
230
+ }
231
+ if (action === 'uninstall') {
232
+ commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
233
+ commands.push({ cmd: 'schtasks', args: ['/Delete', '/F', '/TN', name], allowFail: true });
234
+ return { writes, commands };
235
+ }
236
+ if (action === 'start') {
237
+ commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
238
+ return { writes, commands };
239
+ }
240
+ if (action === 'stop') {
241
+ commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
242
+ return { writes, commands };
243
+ }
244
+ if (action === 'restart') {
245
+ commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
246
+ commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
247
+ return { writes, commands };
248
+ }
249
+ }
250
+ throw new Error(`Unsupported plan: ${backend} ${action}`);
251
+ }
252
+ function commandExists(cmd, envPath) {
253
+ const name = String(cmd ?? '').trim();
254
+ if (!name)
255
+ return false;
256
+ if (process.platform === 'win32') {
257
+ const res = spawnSync('where', [name], { stdio: 'ignore', env: { ...process.env, PATH: envPath ?? process.env.PATH } });
258
+ return (res.status ?? 1) === 0;
259
+ }
260
+ const res = spawnSync('sh', ['-lc', `command -v ${name} >/dev/null 2>&1`], { stdio: 'ignore', env: { ...process.env, PATH: envPath ?? process.env.PATH } });
261
+ return (res.status ?? 1) === 0;
262
+ }
263
+ export async function applyServicePlan(plan, options = {}) {
264
+ for (const w of plan.writes) {
265
+ await writeAtomicTextFile(w.path, w.contents, w.mode ?? 0o644);
266
+ }
267
+ if (options.runCommands === false)
268
+ return;
269
+ for (const c of plan.commands) {
270
+ if (!commandExists(c.cmd, process.env.PATH)) {
271
+ throw new Error(`[service] command not found: ${c.cmd}`);
272
+ }
273
+ const res = spawnSync(c.cmd, [...c.args], { encoding: 'utf8', env: process.env });
274
+ if (res.error) {
275
+ if (c.allowFail)
276
+ continue;
277
+ throw new Error(`[service] failed to run ${c.cmd}: ${res.error.message}`);
278
+ }
279
+ const status = typeof res.status === 'number' ? res.status : null;
280
+ if (status !== 0) {
281
+ if (c.allowFail)
282
+ continue;
283
+ const stderr = String(res.stderr ?? '').trim();
284
+ const suffix = stderr ? `\n${stderr}` : '';
285
+ throw new Error(`[service] command failed (${status ?? 'unknown'}): ${c.cmd} ${c.args.join(' ')}${suffix}`.trim());
286
+ }
287
+ }
288
+ }
289
+ async function writeAtomicTextFile(path, contents, mode) {
290
+ const dir = dirname(path);
291
+ await mkdir(dir, { recursive: true });
292
+ const tmp = join(dir, `.tmp.${Date.now()}.${Math.random().toString(16).slice(2)}`);
293
+ await writeFile(tmp, contents, 'utf-8');
294
+ await rename(tmp, path);
295
+ try {
296
+ await chmod(path, mode);
297
+ }
298
+ catch {
299
+ // ignore
300
+ }
301
+ }
302
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/service/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare function renderSystemdServiceUnit(params: Readonly<{
2
+ description: string;
3
+ execStart: string | readonly string[];
4
+ workingDirectory?: string;
5
+ env?: Record<string, string>;
6
+ restart?: string;
7
+ runAsUser?: string;
8
+ stdoutPath?: string;
9
+ stderrPath?: string;
10
+ wantedBy?: string;
11
+ }>): string;
12
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"AAwCA,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,GAAG,MAAM,CAqCV"}
@@ -0,0 +1,75 @@
1
+ function escapeSystemdEnvValue(value) {
2
+ const s = String(value ?? '');
3
+ if (/^[A-Za-z0-9_./:@%+-]+$/.test(s))
4
+ return s;
5
+ const escaped = s
6
+ .replaceAll('\\', '\\\\')
7
+ .replaceAll('%', '%%')
8
+ .replaceAll('\r\n', '\n')
9
+ .replaceAll('\r', '\n')
10
+ .replaceAll('\n', '\\n')
11
+ .replaceAll('"', '\\"');
12
+ return `"${escaped}"`;
13
+ }
14
+ function escapeSystemdExecArg(value) {
15
+ const s = String(value ?? '');
16
+ if (/^[A-Za-z0-9_./:@%+=-]+$/.test(s))
17
+ return s;
18
+ const escaped = s
19
+ .replaceAll('\\', '\\\\')
20
+ .replaceAll('\r\n', '\n')
21
+ .replaceAll('\r', '\n')
22
+ .replaceAll('\n', '\\n')
23
+ .replaceAll('"', '\\"');
24
+ return `"${escaped}"`;
25
+ }
26
+ function systemdEnvLines(env) {
27
+ const entries = Object.entries(env ?? {}).filter(([k]) => String(k ?? '').trim());
28
+ const envKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
29
+ const lines = [];
30
+ for (const [kRaw, vRaw] of entries) {
31
+ const k = String(kRaw ?? '').trim();
32
+ if (!k)
33
+ continue;
34
+ if (!envKeyPattern.test(k)) {
35
+ throw new Error(`Invalid systemd environment variable name: ${k}`);
36
+ }
37
+ lines.push(`Environment=${k}=${escapeSystemdEnvValue(String(vRaw ?? ''))}`);
38
+ }
39
+ return lines;
40
+ }
41
+ export function renderSystemdServiceUnit(params) {
42
+ const desc = String(params.description ?? '').trim() || 'Happier Service';
43
+ const restartPolicy = String(params.restart ?? '').trim() || 'always';
44
+ const workDir = String(params.workingDirectory ?? '').trim();
45
+ const out = String(params.stdoutPath ?? '').trim();
46
+ const err = String(params.stderrPath ?? '').trim();
47
+ const runAsUser = String(params.runAsUser ?? '').trim();
48
+ const execStart = Array.isArray(params.execStart)
49
+ ? params.execStart.map((a) => escapeSystemdExecArg(String(a ?? ''))).join(' ')
50
+ : String(params.execStart ?? '').trim();
51
+ if (!execStart) {
52
+ throw new Error('execStart is required');
53
+ }
54
+ const envLines = systemdEnvLines(params.env);
55
+ const workDirLine = workDir ? `WorkingDirectory=${workDir}\n` : '';
56
+ const userLine = runAsUser ? `User=${runAsUser}\n` : '';
57
+ const outLine = out ? `StandardOutput=append:${out}\n` : '';
58
+ const errLine = err ? `StandardError=append:${err}\n` : '';
59
+ const wantedBy = String(params.wantedBy ?? '').trim() || 'default.target';
60
+ const envBlock = envLines.length ? `\n${envLines.join('\n')}\n` : '\n';
61
+ return `[Unit]
62
+ Description=${desc}
63
+ After=network-online.target
64
+ Wants=network-online.target
65
+
66
+ [Service]
67
+ Type=simple
68
+ ${workDirLine}${userLine}${envBlock}ExecStart=${execStart}
69
+ Restart=${restartPolicy}
70
+ RestartSec=2
71
+ ${outLine}${errLine}[Install]
72
+ WantedBy=${wantedBy}
73
+ `;
74
+ }
75
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function renderWindowsScheduledTaskWrapperPs1(params: Readonly<{
2
+ workingDirectory?: string;
3
+ programArgs?: readonly string[];
4
+ env?: Record<string, string>;
5
+ stdoutPath?: string;
6
+ stderrPath?: string;
7
+ }>): string;
8
+ //# sourceMappingURL=windows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/service/windows.ts"],"names":[],"mappings":"AASA,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,QAAQ,CAAC;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,GAAG,MAAM,CAuBV"}
@@ -0,0 +1,29 @@
1
+ function psDoubleQuote(s) {
2
+ // PowerShell double-quoted string escape: `"
3
+ return String(s ?? '').replaceAll('`', '``').replaceAll('"', '`"');
4
+ }
5
+ function psQuoted(s) {
6
+ return `"${psDoubleQuote(s)}"`;
7
+ }
8
+ export function renderWindowsScheduledTaskWrapperPs1(params) {
9
+ const wd = String(params.workingDirectory ?? '').trim();
10
+ const args = Array.isArray(params.programArgs) ? params.programArgs.map((a) => String(a ?? '')).filter(Boolean) : [];
11
+ const out = String(params.stdoutPath ?? '').trim();
12
+ const err = String(params.stderrPath ?? '').trim();
13
+ const envLines = Object.entries(params.env ?? {})
14
+ .filter(([k]) => String(k ?? '').trim())
15
+ .map(([k, v]) => `$env:${String(k).trim()} = ${psQuoted(String(v ?? ''))}`)
16
+ .join('\n');
17
+ const cmd = args.length ? `& ${args.map(psQuoted).join(' ')}` : '';
18
+ const redirect = out || err ? ` 1>> ${psQuoted(out)} 2>> ${psQuoted(err)}` : '';
19
+ return [
20
+ '$ErrorActionPreference = "Stop"',
21
+ wd ? `Set-Location -LiteralPath ${psQuoted(wd)}` : '',
22
+ envLines,
23
+ cmd ? `${cmd}${redirect}` : '',
24
+ '',
25
+ ]
26
+ .filter(Boolean)
27
+ .join('\n');
28
+ }
29
+ //# sourceMappingURL=windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/service/windows.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,CAAS;IAC9B,6CAA6C;IAC7C,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,MAMnD;IACA,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;SAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhF,OAAO;QACL,iCAAiC;QACjC,EAAE,CAAC,CAAC,CAAC,6BAA6B,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACrD,QAAQ;QACR,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9B,EAAE;KACH;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -21,6 +21,17 @@
21
21
  "./workspaces": {
22
22
  "types": "./dist/workspaces/index.d.ts",
23
23
  "default": "./dist/workspaces/index.js"
24
+ },
25
+ "./service": {
26
+ "types": "./dist/service/index.d.ts",
27
+ "default": "./dist/service/index.js"
28
+ },
29
+ "./providers": {
30
+ "types": "./dist/providers/index.d.ts",
31
+ "default": "./dist/providers/index.js"
24
32
  }
33
+ },
34
+ "dependencies": {
35
+ "@happier-dev/agents": "0.0.0"
25
36
  }
26
37
  }
@@ -0,0 +1,22 @@
1
+ export declare function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows, }: {
2
+ assets: unknown;
3
+ product: string;
4
+ os: string;
5
+ arch: string;
6
+ preferZipOnWindows?: boolean;
7
+ }): {
8
+ version: string;
9
+ archive: {
10
+ name: string;
11
+ url: string;
12
+ };
13
+ checksums: {
14
+ name: string;
15
+ url: string;
16
+ };
17
+ checksumsSig: {
18
+ name: string;
19
+ url: string;
20
+ };
21
+ };
22
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAcA,wBAAgB,yBAAyB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,EAAE,EACF,IAAI,EACJ,kBAAyB,GAC1B,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;cAEwC,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;EAoC3D"}
@@ -0,0 +1,44 @@
1
+ function normalizeAsset(asset) {
2
+ const name = String(asset?.name ?? '').trim();
3
+ const url = String(asset?.browser_download_url ?? asset?.url ?? '').trim();
4
+ return name && url ? { name, url } : null;
5
+ }
6
+ const VERSION_RE = '\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?';
7
+ export function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows = true, }) {
8
+ const list = Array.isArray(assets) ? assets : [];
9
+ const byName = new Map();
10
+ for (const asset of list) {
11
+ const normalized = normalizeAsset(asset);
12
+ if (!normalized)
13
+ continue;
14
+ byName.set(normalized.name, normalized);
15
+ }
16
+ const checksumsRe = new RegExp(`^checksums-${product}-v(${VERSION_RE})\\.txt$`);
17
+ const checksumsName = [...byName.keys()].find((name) => checksumsRe.test(name)) ?? '';
18
+ if (!checksumsName) {
19
+ throw new Error(`[release-assets] missing checksums-${product}-v<version>.txt asset`);
20
+ }
21
+ const versionMatch = checksumsRe.exec(checksumsName);
22
+ const version = versionMatch?.[1] ?? '';
23
+ if (!version) {
24
+ throw new Error(`[release-assets] unable to derive version from checksums filename: ${checksumsName}`);
25
+ }
26
+ const checksumsSigName = `${checksumsName}.minisig`;
27
+ const base = `${product}-v${version}-${os}-${arch}`;
28
+ const zipName = `${base}.zip`;
29
+ const tgzName = `${base}.tar.gz`;
30
+ const archiveName = os.toLowerCase() === 'windows' && preferZipOnWindows && byName.has(zipName)
31
+ ? zipName
32
+ : tgzName;
33
+ const checksums = byName.get(checksumsName) ?? null;
34
+ const checksumsSig = byName.get(checksumsSigName) ?? null;
35
+ const archive = byName.get(archiveName) ?? null;
36
+ if (!checksums)
37
+ throw new Error(`[release-assets] missing release asset: ${checksumsName}`);
38
+ if (!checksumsSig)
39
+ throw new Error(`[release-assets] missing release asset: ${checksumsSigName}`);
40
+ if (!archive)
41
+ throw new Error(`[release-assets] missing release asset: ${archiveName}`);
42
+ return { version, archive, checksums, checksumsSig };
43
+ }
44
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function lookupSha256(params: Readonly<{
2
+ checksumsText: string;
3
+ filename: string;
4
+ }>): string;
5
+ //# sourceMappingURL=checksums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.d.ts","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAgBlG"}
@@ -0,0 +1,21 @@
1
+ export function lookupSha256(params) {
2
+ const target = String(params.filename ?? '').trim();
3
+ if (!target)
4
+ throw new Error('[checksums] filename is required');
5
+ const text = String(params.checksumsText ?? '');
6
+ const lines = text.split('\n');
7
+ for (const line of lines) {
8
+ const trimmed = line.trim();
9
+ if (!trimmed)
10
+ continue;
11
+ const m = /^([0-9a-fA-F]{8,})\s+(.+)$/.exec(trimmed);
12
+ if (!m)
13
+ continue;
14
+ const hash = m[1].toLowerCase();
15
+ const file = m[2].trim();
16
+ if (file === target)
17
+ return hash;
18
+ }
19
+ throw new Error(`[checksums] sha256 not found for ${target}`);
20
+ }
21
+ //# sourceMappingURL=checksums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.js","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,MAA6D;IACxF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type PlannedCommand = Readonly<{
2
+ cmd: string;
3
+ args: string[];
4
+ }>;
5
+ export declare function planArchiveExtraction(params: Readonly<{
6
+ archiveName: string;
7
+ archivePath: string;
8
+ destDir: string;
9
+ os: 'linux' | 'darwin' | 'windows';
10
+ }>): Readonly<{
11
+ requiredCommand: 'tar' | 'powershell';
12
+ command: PlannedCommand;
13
+ }>;
14
+ //# sourceMappingURL=extractPlan.d.ts.map