@hs-x/cli 0.3.6 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +126 -0
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +58 -59
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/kit.d.ts.map +1 -1
  6. package/dist/cli/kit.js +1 -1
  7. package/dist/cli/kit.js.map +1 -1
  8. package/dist/cloudflare-auth.d.ts +19 -0
  9. package/dist/cloudflare-auth.d.ts.map +1 -1
  10. package/dist/cloudflare-auth.js +83 -2
  11. package/dist/cloudflare-auth.js.map +1 -1
  12. package/dist/cloudflare-oauth.d.ts.map +1 -1
  13. package/dist/cloudflare-oauth.js +18 -19
  14. package/dist/cloudflare-oauth.js.map +1 -1
  15. package/dist/cloudflare-scoped-resource.d.ts +41 -0
  16. package/dist/cloudflare-scoped-resource.d.ts.map +1 -0
  17. package/dist/cloudflare-scoped-resource.js +74 -0
  18. package/dist/cloudflare-scoped-resource.js.map +1 -0
  19. package/dist/command-catalog.d.ts +13 -0
  20. package/dist/command-catalog.d.ts.map +1 -0
  21. package/dist/command-catalog.js +50 -0
  22. package/dist/command-catalog.js.map +1 -0
  23. package/dist/commands/completion.d.ts.map +1 -1
  24. package/dist/commands/completion.js +287 -47
  25. package/dist/commands/completion.js.map +1 -1
  26. package/dist/commands/connect.d.ts.map +1 -1
  27. package/dist/commands/connect.js +274 -38
  28. package/dist/commands/connect.js.map +1 -1
  29. package/dist/commands/control-plane-read.d.ts +31 -3
  30. package/dist/commands/control-plane-read.d.ts.map +1 -1
  31. package/dist/commands/control-plane-read.js +136 -37
  32. package/dist/commands/control-plane-read.js.map +1 -1
  33. package/dist/commands/deploy-retry.d.ts +20 -0
  34. package/dist/commands/deploy-retry.d.ts.map +1 -0
  35. package/dist/commands/deploy-retry.js +106 -0
  36. package/dist/commands/deploy-retry.js.map +1 -0
  37. package/dist/commands/deploy.d.ts +16 -8
  38. package/dist/commands/deploy.d.ts.map +1 -1
  39. package/dist/commands/deploy.js +1027 -373
  40. package/dist/commands/deploy.js.map +1 -1
  41. package/dist/commands/dev.d.ts +19 -1
  42. package/dist/commands/dev.d.ts.map +1 -1
  43. package/dist/commands/dev.js +1378 -88
  44. package/dist/commands/dev.js.map +1 -1
  45. package/dist/commands/doctor.d.ts.map +1 -1
  46. package/dist/commands/doctor.js +27 -10
  47. package/dist/commands/doctor.js.map +1 -1
  48. package/dist/commands/flags.d.ts +9 -4
  49. package/dist/commands/flags.d.ts.map +1 -1
  50. package/dist/commands/flags.js +208 -80
  51. package/dist/commands/flags.js.map +1 -1
  52. package/dist/commands/help-command.d.ts.map +1 -1
  53. package/dist/commands/help-command.js +177 -86
  54. package/dist/commands/help-command.js.map +1 -1
  55. package/dist/commands/init.d.ts.map +1 -1
  56. package/dist/commands/init.js +5 -0
  57. package/dist/commands/init.js.map +1 -1
  58. package/dist/commands/link.d.ts.map +1 -1
  59. package/dist/commands/link.js +74 -15
  60. package/dist/commands/link.js.map +1 -1
  61. package/dist/commands/project.d.ts +107 -0
  62. package/dist/commands/project.d.ts.map +1 -0
  63. package/dist/commands/project.js +586 -0
  64. package/dist/commands/project.js.map +1 -0
  65. package/dist/commands/secrets.d.ts +2 -2
  66. package/dist/commands/status.d.ts.map +1 -1
  67. package/dist/commands/status.js +15 -5
  68. package/dist/commands/status.js.map +1 -1
  69. package/dist/commands/validate.d.ts +19 -0
  70. package/dist/commands/validate.d.ts.map +1 -1
  71. package/dist/commands/validate.js +26 -7
  72. package/dist/commands/validate.js.map +1 -1
  73. package/dist/constants.d.ts +1 -1
  74. package/dist/constants.js +1 -1
  75. package/dist/control-plane-tenant-provisioning.d.ts +24 -0
  76. package/dist/control-plane-tenant-provisioning.d.ts.map +1 -0
  77. package/dist/control-plane-tenant-provisioning.js +85 -0
  78. package/dist/control-plane-tenant-provisioning.js.map +1 -0
  79. package/dist/deploy-targets.d.ts +24 -0
  80. package/dist/deploy-targets.d.ts.map +1 -0
  81. package/dist/deploy-targets.js +38 -0
  82. package/dist/deploy-targets.js.map +1 -0
  83. package/dist/dev/account-selection.d.ts +16 -0
  84. package/dist/dev/account-selection.d.ts.map +1 -0
  85. package/dist/dev/account-selection.js +22 -0
  86. package/dist/dev/account-selection.js.map +1 -0
  87. package/dist/dev/browser-log-bridge.d.ts +32 -0
  88. package/dist/dev/browser-log-bridge.d.ts.map +1 -0
  89. package/dist/dev/browser-log-bridge.js +156 -0
  90. package/dist/dev/browser-log-bridge.js.map +1 -0
  91. package/dist/dev/compat-shim.d.ts +3 -3
  92. package/dist/dev/compat-shim.d.ts.map +1 -1
  93. package/dist/dev/compat-shim.js +29 -4
  94. package/dist/dev/compat-shim.js.map +1 -1
  95. package/dist/dev/component-selection.d.ts +25 -0
  96. package/dist/dev/component-selection.d.ts.map +1 -0
  97. package/dist/dev/component-selection.js +79 -0
  98. package/dist/dev/component-selection.js.map +1 -0
  99. package/dist/dev/console-capture.d.ts +18 -0
  100. package/dist/dev/console-capture.d.ts.map +1 -0
  101. package/dist/dev/console-capture.js +57 -0
  102. package/dist/dev/console-capture.js.map +1 -0
  103. package/dist/dev/event-bus.d.ts +1 -1
  104. package/dist/dev/event-bus.js +1 -1
  105. package/dist/dev/frontend-log-relay.d.ts +27 -0
  106. package/dist/dev/frontend-log-relay.d.ts.map +1 -0
  107. package/dist/dev/frontend-log-relay.js +102 -0
  108. package/dist/dev/frontend-log-relay.js.map +1 -0
  109. package/dist/dev/invoke.d.ts +3 -4
  110. package/dist/dev/invoke.d.ts.map +1 -1
  111. package/dist/dev/invoke.js +9 -4
  112. package/dist/dev/invoke.js.map +1 -1
  113. package/dist/dev/keyboard.d.ts +1 -0
  114. package/dist/dev/keyboard.d.ts.map +1 -1
  115. package/dist/dev/keyboard.js +9 -3
  116. package/dist/dev/keyboard.js.map +1 -1
  117. package/dist/dev/log-server.js +3 -0
  118. package/dist/dev/log-server.js.map +1 -1
  119. package/dist/dev/loopback-http-listener.d.ts +18 -0
  120. package/dist/dev/loopback-http-listener.d.ts.map +1 -0
  121. package/dist/dev/loopback-http-listener.js +91 -0
  122. package/dist/dev/loopback-http-listener.js.map +1 -0
  123. package/dist/dev/managed-session.d.ts +124 -0
  124. package/dist/dev/managed-session.d.ts.map +1 -0
  125. package/dist/dev/managed-session.js +597 -0
  126. package/dist/dev/managed-session.js.map +1 -0
  127. package/dist/dev/port-process.d.ts +21 -0
  128. package/dist/dev/port-process.d.ts.map +1 -0
  129. package/dist/dev/port-process.js +145 -0
  130. package/dist/dev/port-process.js.map +1 -0
  131. package/dist/dev/session-manager.d.ts +11 -1
  132. package/dist/dev/session-manager.d.ts.map +1 -1
  133. package/dist/dev/session-manager.js +65 -14
  134. package/dist/dev/session-manager.js.map +1 -1
  135. package/dist/dev/stream-event-format.d.ts +14 -0
  136. package/dist/dev/stream-event-format.d.ts.map +1 -0
  137. package/dist/dev/stream-event-format.js +262 -0
  138. package/dist/dev/stream-event-format.js.map +1 -0
  139. package/dist/dev/stream-filter.d.ts.map +1 -1
  140. package/dist/dev/stream-filter.js +16 -1
  141. package/dist/dev/stream-filter.js.map +1 -1
  142. package/dist/dev/stream-renderer.d.ts +4 -2
  143. package/dist/dev/stream-renderer.d.ts.map +1 -1
  144. package/dist/dev/stream-renderer.js +224 -84
  145. package/dist/dev/stream-renderer.js.map +1 -1
  146. package/dist/errors-registry.d.ts.map +1 -1
  147. package/dist/errors-registry.js +246 -0
  148. package/dist/errors-registry.js.map +1 -1
  149. package/dist/help.d.ts.map +1 -1
  150. package/dist/help.js +20 -3
  151. package/dist/help.js.map +1 -1
  152. package/dist/hubspot-app-logs.d.ts +38 -5
  153. package/dist/hubspot-app-logs.d.ts.map +1 -1
  154. package/dist/hubspot-app-logs.js +88 -17
  155. package/dist/hubspot-app-logs.js.map +1 -1
  156. package/dist/hubspot-auth.d.ts +19 -1
  157. package/dist/hubspot-auth.d.ts.map +1 -1
  158. package/dist/hubspot-auth.js +228 -83
  159. package/dist/hubspot-auth.js.map +1 -1
  160. package/dist/hubspot-developer-client.d.ts +87 -0
  161. package/dist/hubspot-developer-client.d.ts.map +1 -1
  162. package/dist/hubspot-developer-client.js +232 -1
  163. package/dist/hubspot-developer-client.js.map +1 -1
  164. package/dist/hubspot-project-archive.d.ts +21 -0
  165. package/dist/hubspot-project-archive.d.ts.map +1 -0
  166. package/dist/hubspot-project-archive.js +281 -0
  167. package/dist/hubspot-project-archive.js.map +1 -0
  168. package/dist/hubspot-project.d.ts +32 -0
  169. package/dist/hubspot-project.d.ts.map +1 -0
  170. package/dist/hubspot-project.js +269 -0
  171. package/dist/hubspot-project.js.map +1 -0
  172. package/dist/local-project-picker.js +1 -1
  173. package/dist/local-project-picker.js.map +1 -1
  174. package/dist/machine-artifact.d.ts +16 -0
  175. package/dist/machine-artifact.d.ts.map +1 -0
  176. package/dist/machine-artifact.js +18 -0
  177. package/dist/machine-artifact.js.map +1 -0
  178. package/dist/machine-id.d.ts +15 -0
  179. package/dist/machine-id.d.ts.map +1 -1
  180. package/dist/machine-id.js +53 -0
  181. package/dist/machine-id.js.map +1 -1
  182. package/dist/mutation-consent.d.ts +20 -0
  183. package/dist/mutation-consent.d.ts.map +1 -0
  184. package/dist/mutation-consent.js +9 -0
  185. package/dist/mutation-consent.js.map +1 -0
  186. package/dist/output-context.d.ts +3 -0
  187. package/dist/output-context.d.ts.map +1 -1
  188. package/dist/output-context.js +7 -1
  189. package/dist/output-context.js.map +1 -1
  190. package/dist/prompt.d.ts.map +1 -1
  191. package/dist/prompt.js +123 -48
  192. package/dist/prompt.js.map +1 -1
  193. package/dist/reporter/index.js +1 -1
  194. package/dist/reporter/index.js.map +1 -1
  195. package/dist/reporter/style.d.ts.map +1 -1
  196. package/dist/reporter/style.js +5 -0
  197. package/dist/reporter/style.js.map +1 -1
  198. package/dist/services/hubspot-dev-client.js +3 -0
  199. package/dist/services/hubspot-dev-client.js.map +1 -1
  200. package/dist/services/telemetry.d.ts +1 -2
  201. package/dist/services/telemetry.d.ts.map +1 -1
  202. package/dist/services/telemetry.js +1 -10
  203. package/dist/services/telemetry.js.map +1 -1
  204. package/dist/telemetry.d.ts.map +1 -1
  205. package/dist/telemetry.js +1 -7
  206. package/dist/telemetry.js.map +1 -1
  207. package/dist/tenant-data-plane-provisioning.d.ts +35 -0
  208. package/dist/tenant-data-plane-provisioning.d.ts.map +1 -0
  209. package/dist/tenant-data-plane-provisioning.js +38 -0
  210. package/dist/tenant-data-plane-provisioning.js.map +1 -0
  211. package/package.json +14 -12
@@ -0,0 +1,597 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { appendFile, chmod, mkdir, open, readFile, rename, rmdir, stat, writeFile, } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { statePath } from '../paths.js';
7
+ const execFileAsync = promisify(execFile);
8
+ const SESSION_SCHEMA_VERSION = 1;
9
+ const EVENT_SCHEMA_VERSION = 1;
10
+ const MAX_EVENT_READ_BYTES = 4 * 1024 * 1024;
11
+ const SESSION_ID_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{5,127}$/;
12
+ const SESSION_LOCK_TIMEOUT_MS = 10_000;
13
+ const SESSION_LOCK_RETRY_MS = 5;
14
+ const PROCESS_INSPECTION_TIMEOUT_MS = 2_000;
15
+ export function managedDevSessionPaths(sessionId) {
16
+ assertSessionId(sessionId);
17
+ const directory = statePath(join('dev-sessions', sessionId));
18
+ return {
19
+ directory,
20
+ record: join(directory, 'session.json'),
21
+ events: join(directory, 'events.jsonl'),
22
+ stdout: join(directory, 'stdout.log'),
23
+ stderr: join(directory, 'stderr.log'),
24
+ };
25
+ }
26
+ export async function createManagedDevSession(input) {
27
+ const sessionId = input.sessionId ?? `dev_${randomUUID()}`;
28
+ const paths = managedDevSessionPaths(sessionId);
29
+ await mkdir(paths.directory, { recursive: true, mode: 0o700 });
30
+ await chmod(paths.directory, 0o700);
31
+ const now = new Date().toISOString();
32
+ const record = {
33
+ schemaVersion: SESSION_SCHEMA_VERSION,
34
+ sessionId,
35
+ state: 'starting',
36
+ generation: 1,
37
+ pid: 0,
38
+ root: input.root,
39
+ launchArgv: [...input.launchArgv],
40
+ createdAt: now,
41
+ updatedAt: now,
42
+ stdoutPath: paths.stdout,
43
+ stderrPath: paths.stderr,
44
+ eventsPath: paths.events,
45
+ };
46
+ await Promise.all([
47
+ writeFile(paths.events, '', { mode: 0o600, flag: 'a' }),
48
+ writeFile(paths.stdout, '', { mode: 0o600, flag: 'a' }),
49
+ writeFile(paths.stderr, '', { mode: 0o600, flag: 'a' }),
50
+ ]);
51
+ await writeManagedDevSession(record);
52
+ await appendManagedDevEvent(record, lifecycleEvent(record, 'starting', 'session created'));
53
+ return record;
54
+ }
55
+ export async function readManagedDevSession(sessionId) {
56
+ const paths = managedDevSessionPaths(sessionId);
57
+ let parsed;
58
+ try {
59
+ parsed = JSON.parse(await readFile(paths.record, 'utf8'));
60
+ }
61
+ catch (cause) {
62
+ throw new Error(`Managed dev session ${sessionId} was not found or is unreadable: ${cause instanceof Error ? cause.message : String(cause)}`);
63
+ }
64
+ if (!isManagedDevSessionRecord(parsed) || parsed.sessionId !== sessionId) {
65
+ throw new Error(`Managed dev session ${sessionId} has an invalid session record.`);
66
+ }
67
+ return parsed;
68
+ }
69
+ export async function updateManagedDevSession(sessionId, update, guard = {}) {
70
+ return withManagedDevSessionLock(sessionId, () => updateManagedDevSessionUnlocked(sessionId, update, guard));
71
+ }
72
+ async function updateManagedDevSessionUnlocked(sessionId, update, guard = {}) {
73
+ const current = await readManagedDevSession(sessionId);
74
+ assertManagedDevSessionGuard(current, guard);
75
+ const next = update(current);
76
+ if (next.sessionId !== sessionId || next.schemaVersion !== SESSION_SCHEMA_VERSION) {
77
+ throw new Error('Managed dev session updates cannot change session identity or schema.');
78
+ }
79
+ const persisted = { ...next, updatedAt: new Date().toISOString() };
80
+ await writeManagedDevSession(persisted);
81
+ return persisted;
82
+ }
83
+ export async function setManagedDevSessionPid(sessionId, pid, guard = {}) {
84
+ if (!Number.isInteger(pid) || pid <= 1)
85
+ throw new Error(`Invalid managed dev PID ${pid}.`);
86
+ const processStartedAt = await readProcessStartedAt(pid);
87
+ return updateManagedDevSession(sessionId, (current) => {
88
+ const { processStartedAt: _previousProcessStartedAt, ...base } = current;
89
+ return {
90
+ ...base,
91
+ pid,
92
+ ...(processStartedAt ? { processStartedAt } : {}),
93
+ };
94
+ }, guard);
95
+ }
96
+ export async function prepareManagedDevSessionRestart(sessionId, guard) {
97
+ const next = await updateManagedDevSession(sessionId, (current) => {
98
+ const { readyAt: _readyAt, stoppedAt: _stoppedAt, error: _error, processStartedAt: _processStartedAt, ...restartable } = current;
99
+ return {
100
+ ...restartable,
101
+ state: 'starting',
102
+ generation: current.generation + 1,
103
+ pid: 0,
104
+ };
105
+ }, guard);
106
+ await appendManagedDevEvent(next, lifecycleEvent(next, 'starting', 'session restarting'));
107
+ return next;
108
+ }
109
+ export async function markManagedDevSessionReady(sessionId, details = {}) {
110
+ const now = new Date().toISOString();
111
+ const next = await updateManagedDevSession(sessionId, (current) => {
112
+ const { stoppedAt: _stoppedAt, error: _error, ...active } = current;
113
+ return {
114
+ ...active,
115
+ state: 'ready',
116
+ pid: process.pid,
117
+ readyAt: now,
118
+ ...(details.projectAccountId !== undefined
119
+ ? { projectAccountId: details.projectAccountId }
120
+ : {}),
121
+ ...(details.testingAccountId !== undefined
122
+ ? { testingAccountId: details.testingAccountId }
123
+ : {}),
124
+ ...(details.components !== undefined ? { components: [...details.components] } : {}),
125
+ ...(details.devPort !== undefined ? { devPort: details.devPort } : {}),
126
+ ...(details.logPort !== undefined ? { logPort: details.logPort } : {}),
127
+ };
128
+ }, { expectedPid: process.pid, expectedStates: ['starting'] });
129
+ await appendManagedDevEvent(next, lifecycleEvent(next, 'ready'));
130
+ return next;
131
+ }
132
+ export async function markManagedDevSessionState(sessionId, state, message, guard = {}) {
133
+ const next = await updateManagedDevSession(sessionId, (current) => {
134
+ const { error: _error, ...base } = current;
135
+ return {
136
+ ...base,
137
+ state,
138
+ ...(state === 'stopped' || state === 'failed'
139
+ ? { stoppedAt: new Date().toISOString() }
140
+ : {}),
141
+ ...(state === 'failed' && message ? { error: message } : {}),
142
+ };
143
+ }, guard);
144
+ await appendManagedDevEvent(next, lifecycleEvent(next, state, message));
145
+ return next;
146
+ }
147
+ export async function waitForManagedDevSessionOwner(sessionId, pid = process.pid, timeoutMs = 5_000) {
148
+ const deadline = Date.now() + timeoutMs;
149
+ while (Date.now() < deadline) {
150
+ const record = await readManagedDevSession(sessionId);
151
+ if (record.pid === pid)
152
+ return record;
153
+ await delay(25);
154
+ }
155
+ throw new Error(`Managed dev session ${sessionId} did not assign ownership to PID ${pid}.`);
156
+ }
157
+ export async function reconcileManagedDevSession(sessionId) {
158
+ const record = await readManagedDevSession(sessionId);
159
+ if (record.state === 'stopped' || record.state === 'failed')
160
+ return record;
161
+ if (record.pid <= 1 || (await managedDevProcessMatches(record)))
162
+ return record;
163
+ const alive = await isProcessAlive(record.pid);
164
+ return markManagedDevSessionState(sessionId, 'failed', alive
165
+ ? `PID ${record.pid} no longer identifies managed dev session ${sessionId}.`
166
+ : `Managed dev process ${record.pid} exited without completing cleanup.`, { expectedGeneration: record.generation, expectedPid: record.pid });
167
+ }
168
+ export async function publicManagedDevSession(session) {
169
+ const { launchArgv: _launchArgv, ...safe } = session;
170
+ return { ...safe, running: await managedDevProcessMatches(session) };
171
+ }
172
+ export function createManagedDevEventWriter(session) {
173
+ let queue = Promise.resolve();
174
+ let failure;
175
+ let closed = false;
176
+ const enqueue = (event) => {
177
+ if (closed)
178
+ return;
179
+ queue = queue
180
+ .then(() => appendManagedDevEvent(session, event))
181
+ .catch((cause) => {
182
+ failure ??= cause;
183
+ });
184
+ };
185
+ return {
186
+ log(event) {
187
+ enqueue({
188
+ schema_version: EVENT_SCHEMA_VERSION,
189
+ session_id: session.sessionId,
190
+ generation: session.generation,
191
+ ts: new Date(event.ts).toISOString(),
192
+ type: 'log',
193
+ lane: event.lane,
194
+ level: event.level,
195
+ message: event.msg,
196
+ ...(event.source ? { source: event.source } : {}),
197
+ ...(event.fields ? { fields: event.fields } : {}),
198
+ });
199
+ },
200
+ lifecycle(state, message) {
201
+ enqueue(lifecycleEvent(session, state, message));
202
+ },
203
+ async close() {
204
+ closed = true;
205
+ await queue;
206
+ if (failure)
207
+ throw failure;
208
+ },
209
+ };
210
+ }
211
+ export async function readManagedDevEvents(input) {
212
+ const endCursor = await fileSize(input.session.eventsPath);
213
+ const startCursor = clampInt(input.cursor ?? 0, 0, endCursor);
214
+ const limit = clampInt(input.limit ?? 200, 1, 10_000);
215
+ const events = [];
216
+ if (startCursor >= endCursor) {
217
+ return { events, nextCursor: startCursor, endCursor };
218
+ }
219
+ const handle = await open(input.session.eventsPath, 'r');
220
+ let nextCursor = startCursor;
221
+ try {
222
+ const requestedBytes = Math.min(endCursor - startCursor, MAX_EVENT_READ_BYTES);
223
+ const buffer = Buffer.allocUnsafe(requestedBytes);
224
+ const { bytesRead } = await handle.read(buffer, 0, requestedBytes, startCursor);
225
+ const readable = buffer.subarray(0, bytesRead);
226
+ let relativeOffset = 0;
227
+ while (relativeOffset < readable.length && events.length < limit) {
228
+ const newline = readable.indexOf(0x0a, relativeOffset);
229
+ if (newline === -1)
230
+ break;
231
+ const absoluteNext = startCursor + newline + 1;
232
+ const line = readable.subarray(relativeOffset, newline).toString('utf8').trim();
233
+ relativeOffset = newline + 1;
234
+ nextCursor = absoluteNext;
235
+ if (!line)
236
+ continue;
237
+ try {
238
+ const event = JSON.parse(line);
239
+ if (!isManagedDevStoredEvent(event) || !matchesManagedEvent(event, input.filter))
240
+ continue;
241
+ events.push({ cursor: absoluteNext, event });
242
+ }
243
+ catch {
244
+ // A malformed line should not make every later event unreadable.
245
+ }
246
+ }
247
+ }
248
+ finally {
249
+ await handle.close();
250
+ }
251
+ return { events, nextCursor, endCursor };
252
+ }
253
+ export async function managedDevProcessMatches(session) {
254
+ if (session.pid <= 1 || !(await isProcessAlive(session.pid)))
255
+ return false;
256
+ const observation = await inspectManagedDevProcess(session.pid);
257
+ if (!observation)
258
+ return false;
259
+ if (session.processStartedAt && observation.startedAt !== session.processStartedAt)
260
+ return false;
261
+ return processClaimsManagedSession(observation, session.sessionId);
262
+ }
263
+ async function readProcessStartedAt(pid) {
264
+ return (await inspectManagedDevProcess(pid))?.startedAt;
265
+ }
266
+ async function inspectManagedDevProcess(pid) {
267
+ try {
268
+ if (process.platform === 'win32') {
269
+ const { stdout } = await execFileAsync('powershell.exe', [
270
+ '-NoProfile',
271
+ '-NonInteractive',
272
+ '-Command',
273
+ `$p = Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}"; if ($null -ne $p) { [pscustomobject]@{ startedAt = $p.CreationDate.ToUniversalTime().ToString('O'); commandLine = $p.CommandLine } | ConvertTo-Json -Compress }`,
274
+ ], { timeout: PROCESS_INSPECTION_TIMEOUT_MS });
275
+ const value = JSON.parse(stdout.trim());
276
+ if (!isRecord(value) ||
277
+ typeof value.startedAt !== 'string' ||
278
+ typeof value.commandLine !== 'string') {
279
+ return undefined;
280
+ }
281
+ return { startedAt: value.startedAt, commandLine: value.commandLine };
282
+ }
283
+ const [startedResult, argv] = await Promise.all([
284
+ execFileAsync('ps', ['-p', String(pid), '-o', 'lstart='], {
285
+ timeout: PROCESS_INSPECTION_TIMEOUT_MS,
286
+ }),
287
+ readExactProcessArgv(pid),
288
+ ]);
289
+ const startedAt = startedResult.stdout.trim();
290
+ if (!startedAt)
291
+ return undefined;
292
+ if (argv)
293
+ return { startedAt, argv };
294
+ const { stdout: commandLine } = await execFileAsync('ps', ['-ww', '-p', String(pid), '-o', 'command='], { timeout: PROCESS_INSPECTION_TIMEOUT_MS });
295
+ return { startedAt, commandLine: commandLine.trim() };
296
+ }
297
+ catch {
298
+ return undefined;
299
+ }
300
+ }
301
+ async function readExactProcessArgv(pid) {
302
+ if (process.platform !== 'linux')
303
+ return undefined;
304
+ try {
305
+ const commandLine = await readFile(`/proc/${pid}/cmdline`);
306
+ return commandLine
307
+ .toString('utf8')
308
+ .split('\0')
309
+ .filter((part) => part.length > 0);
310
+ }
311
+ catch {
312
+ return undefined;
313
+ }
314
+ }
315
+ function processClaimsManagedSession(observation, sessionId) {
316
+ if (observation.argv) {
317
+ return observation.argv.some((argument, index) => (argument === '--managed-session' && observation.argv?.[index + 1] === sessionId) ||
318
+ argument === `--managed-session=${sessionId}`);
319
+ }
320
+ if (!observation.commandLine)
321
+ return false;
322
+ const escapedSessionId = sessionId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
323
+ return new RegExp(`(?:^|\\s)--managed-session(?:=|\\s+)(?:"${escapedSessionId}"|'${escapedSessionId}'|${escapedSessionId})(?=\\s|$)`).test(observation.commandLine);
324
+ }
325
+ export async function stopManagedDevSessionProcess(sessionId, input = {}) {
326
+ let session = await readManagedDevSession(sessionId);
327
+ if (session.pid > 1 && !(await isProcessAlive(session.pid))) {
328
+ session = await reconcileManagedDevSession(sessionId);
329
+ }
330
+ if (session.state === 'stopped' || session.state === 'failed')
331
+ return session;
332
+ if (session.pid <= 1) {
333
+ return markManagedDevSessionState(sessionId, 'stopped', 'stopped before the managed child claimed the session', {
334
+ expectedGeneration: session.generation,
335
+ expectedPid: session.pid,
336
+ expectedStates: ['starting', 'stopping'],
337
+ });
338
+ }
339
+ const target = { generation: session.generation, pid: session.pid };
340
+ let stoppingEvent;
341
+ session = await withManagedDevSessionLock(sessionId, async () => {
342
+ const current = await readManagedDevSession(sessionId);
343
+ assertManagedDevSessionGuard(current, {
344
+ expectedGeneration: target.generation,
345
+ expectedPid: target.pid,
346
+ });
347
+ if (current.state === 'stopped' || current.state === 'failed')
348
+ return current;
349
+ if (current.state === 'stopping')
350
+ return current;
351
+ if (!(await managedDevProcessMatches(current))) {
352
+ throw new Error(`Refusing to stop PID ${current.pid}: it no longer identifies itself as managed dev session ${sessionId}.`);
353
+ }
354
+ const stopping = await updateManagedDevSessionUnlocked(sessionId, (owned) => ({ ...owned, state: 'stopping' }), { expectedGeneration: target.generation, expectedPid: target.pid });
355
+ // Keep the state lock through the final identity check and signal. A
356
+ // concurrent restart cannot replace the generation/PID between them.
357
+ if (!(await managedDevProcessMatches(stopping))) {
358
+ throw new Error(`Refusing to stop PID ${stopping.pid}: its process identity changed before signaling.`);
359
+ }
360
+ try {
361
+ process.kill(stopping.pid, 'SIGTERM');
362
+ }
363
+ catch (cause) {
364
+ if (!isMissingProcess(cause))
365
+ throw cause;
366
+ }
367
+ stoppingEvent = stopping;
368
+ return stopping;
369
+ });
370
+ if (stoppingEvent) {
371
+ await appendManagedDevEvent(stoppingEvent, lifecycleEvent(stoppingEvent, 'stopping'));
372
+ }
373
+ const deadline = Date.now() + (input.timeoutMs ?? 10_000);
374
+ while (Date.now() < deadline) {
375
+ if (!(await managedDevProcessMatches(session))) {
376
+ const current = await readManagedDevSession(sessionId);
377
+ if (current.generation !== target.generation || current.pid !== target.pid)
378
+ return current;
379
+ if (current.state === 'stopped' || current.state === 'failed')
380
+ return current;
381
+ return markManagedDevSessionState(sessionId, 'stopped', undefined, {
382
+ expectedGeneration: target.generation,
383
+ expectedPid: target.pid,
384
+ });
385
+ }
386
+ await delay(100);
387
+ }
388
+ if (!input.force) {
389
+ throw new Error(`Managed dev session ${sessionId} did not stop after SIGTERM; rerun with --force to escalate.`);
390
+ }
391
+ await withManagedDevSessionLock(sessionId, async () => {
392
+ const current = await readManagedDevSession(sessionId);
393
+ assertManagedDevSessionGuard(current, {
394
+ expectedGeneration: target.generation,
395
+ expectedPid: target.pid,
396
+ });
397
+ if (!(await managedDevProcessMatches(current)))
398
+ return;
399
+ await forceKillManagedProcessTree(current.pid);
400
+ });
401
+ while (await managedDevProcessMatches(session))
402
+ await delay(50);
403
+ return markManagedDevSessionState(sessionId, 'stopped', 'force-stopped after SIGTERM timeout', {
404
+ expectedGeneration: target.generation,
405
+ expectedPid: target.pid,
406
+ });
407
+ }
408
+ async function forceKillManagedProcessTree(pid) {
409
+ if (process.platform === 'win32') {
410
+ await execFileAsync('taskkill.exe', ['/PID', String(pid), '/T', '/F']);
411
+ return;
412
+ }
413
+ try {
414
+ // Detached managed children are process-group leaders. Escalation should
415
+ // not strand their HubSpot dev server or tunnel children.
416
+ process.kill(-pid, 'SIGKILL');
417
+ }
418
+ catch (cause) {
419
+ if (!isMissingProcess(cause))
420
+ throw cause;
421
+ try {
422
+ process.kill(pid, 'SIGKILL');
423
+ }
424
+ catch (fallbackCause) {
425
+ if (!isMissingProcess(fallbackCause))
426
+ throw fallbackCause;
427
+ }
428
+ }
429
+ }
430
+ export async function isProcessAlive(pid) {
431
+ if (!Number.isInteger(pid) || pid <= 1)
432
+ return false;
433
+ try {
434
+ process.kill(pid, 0);
435
+ return true;
436
+ }
437
+ catch (cause) {
438
+ return !isMissingProcess(cause);
439
+ }
440
+ }
441
+ export async function fileSize(path) {
442
+ try {
443
+ return (await stat(path)).size;
444
+ }
445
+ catch {
446
+ return 0;
447
+ }
448
+ }
449
+ async function writeManagedDevSession(record) {
450
+ const path = managedDevSessionPaths(record.sessionId).record;
451
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
452
+ const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
453
+ await writeFile(temporary, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
454
+ await rename(temporary, path);
455
+ await chmod(path, 0o600);
456
+ }
457
+ async function withManagedDevSessionLock(sessionId, operation) {
458
+ const paths = managedDevSessionPaths(sessionId);
459
+ await mkdir(paths.directory, { recursive: true, mode: 0o700 });
460
+ const lockPath = join(paths.directory, 'session.lock');
461
+ const deadline = Date.now() + SESSION_LOCK_TIMEOUT_MS;
462
+ while (true) {
463
+ try {
464
+ await mkdir(lockPath, { mode: 0o700 });
465
+ break;
466
+ }
467
+ catch (cause) {
468
+ if (!hasErrorCode(cause, 'EEXIST'))
469
+ throw cause;
470
+ if (Date.now() >= deadline) {
471
+ throw new Error(`Timed out waiting for managed dev session ${sessionId} state lock at ${lockPath}.`);
472
+ }
473
+ await delay(SESSION_LOCK_RETRY_MS);
474
+ }
475
+ }
476
+ const outcome = await operation().then((value) => ({ ok: true, value }), (cause) => ({ ok: false, cause }));
477
+ let releaseFailure;
478
+ try {
479
+ await rmdir(lockPath);
480
+ }
481
+ catch (cause) {
482
+ if (!hasErrorCode(cause, 'ENOENT'))
483
+ releaseFailure = cause;
484
+ }
485
+ if (!outcome.ok)
486
+ throw outcome.cause;
487
+ if (releaseFailure)
488
+ throw releaseFailure;
489
+ return outcome.value;
490
+ }
491
+ function assertManagedDevSessionGuard(current, guard) {
492
+ if ((guard.expectedGeneration !== undefined && current.generation !== guard.expectedGeneration) ||
493
+ (guard.expectedPid !== undefined && current.pid !== guard.expectedPid) ||
494
+ (guard.expectedStates !== undefined && !guard.expectedStates.includes(current.state))) {
495
+ throw new Error(`Managed dev session ${current.sessionId} changed concurrently ` +
496
+ `(expected generation ${guard.expectedGeneration ?? '*'}, PID ${guard.expectedPid ?? '*'}, ` +
497
+ `state ${guard.expectedStates?.join('|') ?? '*'}; found generation ${current.generation}, ` +
498
+ `PID ${current.pid}, state ${current.state}).`);
499
+ }
500
+ }
501
+ async function appendManagedDevEvent(session, event) {
502
+ await appendFile(session.eventsPath, `${JSON.stringify(event)}\n`, { mode: 0o600 });
503
+ }
504
+ function lifecycleEvent(session, state, message) {
505
+ return {
506
+ schema_version: EVENT_SCHEMA_VERSION,
507
+ session_id: session.sessionId,
508
+ generation: session.generation,
509
+ ts: new Date().toISOString(),
510
+ type: 'lifecycle',
511
+ state,
512
+ ...(message ? { message } : {}),
513
+ };
514
+ }
515
+ function matchesManagedEvent(event, filter) {
516
+ if (!filter)
517
+ return true;
518
+ if (filter.since !== undefined && Date.parse(event.ts) < filter.since)
519
+ return false;
520
+ if (event.type === 'log') {
521
+ if (filter.lanes && !filter.lanes.has(event.lane))
522
+ return false;
523
+ if (filter.levels && !filter.levels.has(event.level))
524
+ return false;
525
+ }
526
+ else if (filter.lanes || filter.levels) {
527
+ return false;
528
+ }
529
+ if (filter.search) {
530
+ const haystack = JSON.stringify(event).toLowerCase();
531
+ if (!haystack.includes(filter.search.toLowerCase()))
532
+ return false;
533
+ }
534
+ return true;
535
+ }
536
+ function isManagedDevSessionRecord(value) {
537
+ if (!isRecord(value))
538
+ return false;
539
+ return (value.schemaVersion === SESSION_SCHEMA_VERSION &&
540
+ typeof value.sessionId === 'string' &&
541
+ SESSION_ID_PATTERN.test(value.sessionId) &&
542
+ typeof value.state === 'string' &&
543
+ ['starting', 'ready', 'stopping', 'stopped', 'failed'].includes(value.state) &&
544
+ typeof value.generation === 'number' &&
545
+ typeof value.pid === 'number' &&
546
+ (value.processStartedAt === undefined || typeof value.processStartedAt === 'string') &&
547
+ typeof value.root === 'string' &&
548
+ Array.isArray(value.launchArgv) &&
549
+ value.launchArgv.every((part) => typeof part === 'string') &&
550
+ typeof value.createdAt === 'string' &&
551
+ typeof value.updatedAt === 'string' &&
552
+ typeof value.stdoutPath === 'string' &&
553
+ typeof value.stderrPath === 'string' &&
554
+ typeof value.eventsPath === 'string');
555
+ }
556
+ function isManagedDevStoredEvent(value) {
557
+ if (!isRecord(value))
558
+ return false;
559
+ if (value.schema_version !== EVENT_SCHEMA_VERSION ||
560
+ typeof value.session_id !== 'string' ||
561
+ typeof value.generation !== 'number' ||
562
+ typeof value.ts !== 'string') {
563
+ return false;
564
+ }
565
+ if (value.type === 'lifecycle')
566
+ return typeof value.state === 'string';
567
+ return (value.type === 'log' &&
568
+ typeof value.lane === 'string' &&
569
+ typeof value.level === 'string' &&
570
+ typeof value.message === 'string');
571
+ }
572
+ function assertSessionId(sessionId) {
573
+ if (!SESSION_ID_PATTERN.test(sessionId)) {
574
+ throw new Error(`Invalid managed dev session id "${sessionId}".`);
575
+ }
576
+ }
577
+ function clampInt(value, min, max) {
578
+ if (!Number.isFinite(value))
579
+ return min;
580
+ return Math.min(Math.max(Math.trunc(value), min), max);
581
+ }
582
+ function isRecord(value) {
583
+ return typeof value === 'object' && value !== null;
584
+ }
585
+ function isMissingProcess(cause) {
586
+ return hasErrorCode(cause, 'ESRCH');
587
+ }
588
+ function hasErrorCode(cause, code) {
589
+ return (typeof cause === 'object' &&
590
+ cause !== null &&
591
+ 'code' in cause &&
592
+ cause.code === code);
593
+ }
594
+ function delay(ms) {
595
+ return new Promise((resolve) => setTimeout(resolve, ms));
596
+ }
597
+ //# sourceMappingURL=managed-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-session.js","sourceRoot":"","sources":["../../src/dev/managed-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface ListeningProcess {
2
+ readonly port: number;
3
+ readonly pid: number;
4
+ readonly command?: string;
5
+ readonly cwd?: string;
6
+ }
7
+ export interface TerminateProcessResult {
8
+ readonly ok: boolean;
9
+ readonly message?: string;
10
+ }
11
+ export declare function isHubSpotDevPortConflict(error: unknown): boolean;
12
+ export declare function findListeningProcess(port: number): Promise<ListeningProcess | undefined>;
13
+ export declare function terminateProcessGracefully(pid: number, options?: {
14
+ readonly timeoutMs?: number;
15
+ readonly pollMs?: number;
16
+ readonly kill?: (pid: number, signal: NodeJS.Signals | 0) => void;
17
+ readonly delay?: (ms: number) => Promise<void>;
18
+ }): Promise<TerminateProcessResult>;
19
+ export declare function stopProcessCommand(pid: number): string;
20
+ export declare function redactProcessCommand(command: string): string;
21
+ //# sourceMappingURL=port-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-process.d.ts","sourceRoot":"","sources":["../../src/dev/port-process.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAchE;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAc9F;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GACL,OAAO,CAAC,sBAAsB,CAAC,CA8BjC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5D"}