@dsh-enhanced/plugin-control-plane 0.1.32 → 0.1.34

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 (199) hide show
  1. package/README.md +352 -4
  2. package/bin/dsh-local-release-adapter.js +80 -16
  3. package/bin/dsh-npm-registry-adapter.js +613 -0
  4. package/bin/dsh-source-adoption-authority.js +12 -0
  5. package/bin/dsh-source-approval-authority.js +16 -0
  6. package/bin/dsh-source-release-authority.js +12 -0
  7. package/bin/dsh-systemd-host-attestor.js +707 -0
  8. package/bin/dsh-task-observation-authority.js +15 -0
  9. package/lib/adapter-process.d.ts +23 -0
  10. package/lib/adapter-process.d.ts.map +1 -0
  11. package/lib/adapter-process.js +305 -0
  12. package/lib/adapter-process.js.map +1 -0
  13. package/lib/adoption-coordinator.d.ts +63 -0
  14. package/lib/adoption-coordinator.d.ts.map +1 -0
  15. package/lib/adoption-coordinator.js +241 -0
  16. package/lib/adoption-coordinator.js.map +1 -0
  17. package/lib/adoption-handoff.d.ts +16 -0
  18. package/lib/adoption-handoff.d.ts.map +1 -0
  19. package/lib/adoption-handoff.js +11 -0
  20. package/lib/adoption-handoff.js.map +1 -0
  21. package/lib/attestation.d.ts.map +1 -1
  22. package/lib/attestation.js +49 -1
  23. package/lib/attestation.js.map +1 -1
  24. package/lib/catalog.d.ts.map +1 -1
  25. package/lib/catalog.js +29 -2
  26. package/lib/catalog.js.map +1 -1
  27. package/lib/cli.d.ts +33 -9
  28. package/lib/cli.d.ts.map +1 -1
  29. package/lib/cli.js +624 -178
  30. package/lib/cli.js.map +1 -1
  31. package/lib/deployment-readiness.d.ts +38 -0
  32. package/lib/deployment-readiness.d.ts.map +1 -0
  33. package/lib/deployment-readiness.js +154 -0
  34. package/lib/deployment-readiness.js.map +1 -0
  35. package/lib/effect-blocked-replay.d.ts +81 -0
  36. package/lib/effect-blocked-replay.d.ts.map +1 -0
  37. package/lib/effect-blocked-replay.js +259 -0
  38. package/lib/effect-blocked-replay.js.map +1 -0
  39. package/lib/errors.d.ts +6 -0
  40. package/lib/errors.d.ts.map +1 -0
  41. package/lib/errors.js +9 -0
  42. package/lib/errors.js.map +1 -0
  43. package/lib/foreground-deployment-runtime.d.ts +20 -0
  44. package/lib/foreground-deployment-runtime.d.ts.map +1 -0
  45. package/lib/foreground-deployment-runtime.js +79 -0
  46. package/lib/foreground-deployment-runtime.js.map +1 -0
  47. package/lib/foreground-deployment.d.ts +17 -0
  48. package/lib/foreground-deployment.d.ts.map +1 -0
  49. package/lib/foreground-deployment.js +43 -0
  50. package/lib/foreground-deployment.js.map +1 -0
  51. package/lib/host-attestor.d.ts +1 -1
  52. package/lib/host-attestor.d.ts.map +1 -1
  53. package/lib/host-attestor.js +51 -57
  54. package/lib/host-attestor.js.map +1 -1
  55. package/lib/index.d.ts +25 -2
  56. package/lib/index.d.ts.map +1 -1
  57. package/lib/index.js +11 -2
  58. package/lib/index.js.map +1 -1
  59. package/lib/npm-publish.d.ts +25 -0
  60. package/lib/npm-publish.d.ts.map +1 -0
  61. package/lib/npm-publish.js +280 -0
  62. package/lib/npm-publish.js.map +1 -0
  63. package/lib/owner-task-gap-types.d.ts +21 -0
  64. package/lib/owner-task-gap-types.d.ts.map +1 -0
  65. package/lib/owner-task-gap-types.js +2 -0
  66. package/lib/owner-task-gap-types.js.map +1 -0
  67. package/lib/owner-task-gaps.d.ts +24 -0
  68. package/lib/owner-task-gaps.d.ts.map +1 -0
  69. package/lib/owner-task-gaps.js +74 -0
  70. package/lib/owner-task-gaps.js.map +1 -0
  71. package/lib/post-activation.d.ts +33 -0
  72. package/lib/post-activation.d.ts.map +1 -0
  73. package/lib/post-activation.js +219 -0
  74. package/lib/post-activation.js.map +1 -0
  75. package/lib/registry-fetch.d.ts +50 -0
  76. package/lib/registry-fetch.d.ts.map +1 -0
  77. package/lib/registry-fetch.js +267 -0
  78. package/lib/registry-fetch.js.map +1 -0
  79. package/lib/release.d.ts +4 -4
  80. package/lib/release.d.ts.map +1 -1
  81. package/lib/release.js +142 -56
  82. package/lib/release.js.map +1 -1
  83. package/lib/replay-endpoint-protocol.d.ts +65 -0
  84. package/lib/replay-endpoint-protocol.d.ts.map +1 -0
  85. package/lib/replay-endpoint-protocol.js +183 -0
  86. package/lib/replay-endpoint-protocol.js.map +1 -0
  87. package/lib/replay-endpoint.d.ts +7 -0
  88. package/lib/replay-endpoint.d.ts.map +1 -0
  89. package/lib/replay-endpoint.js +193 -0
  90. package/lib/replay-endpoint.js.map +1 -0
  91. package/lib/replay-grant.d.ts +62 -0
  92. package/lib/replay-grant.d.ts.map +1 -0
  93. package/lib/replay-grant.js +208 -0
  94. package/lib/replay-grant.js.map +1 -0
  95. package/lib/replay-journal.d.ts +25 -0
  96. package/lib/replay-journal.d.ts.map +1 -0
  97. package/lib/replay-journal.js +275 -0
  98. package/lib/replay-journal.js.map +1 -0
  99. package/lib/runtime-observer-protocol.d.ts +63 -0
  100. package/lib/runtime-observer-protocol.d.ts.map +1 -0
  101. package/lib/runtime-observer-protocol.js +280 -0
  102. package/lib/runtime-observer-protocol.js.map +1 -0
  103. package/lib/runtime-observer.d.ts +8 -0
  104. package/lib/runtime-observer.d.ts.map +1 -0
  105. package/lib/runtime-observer.js +182 -0
  106. package/lib/runtime-observer.js.map +1 -0
  107. package/lib/service.d.ts +145 -1
  108. package/lib/service.d.ts.map +1 -1
  109. package/lib/service.js +734 -6
  110. package/lib/service.js.map +1 -1
  111. package/lib/source-adoption-authority.d.ts +65 -0
  112. package/lib/source-adoption-authority.d.ts.map +1 -0
  113. package/lib/source-adoption-authority.js +271 -0
  114. package/lib/source-adoption-authority.js.map +1 -0
  115. package/lib/source-adoption-runner.d.ts +28 -0
  116. package/lib/source-adoption-runner.d.ts.map +1 -0
  117. package/lib/source-adoption-runner.js +197 -0
  118. package/lib/source-adoption-runner.js.map +1 -0
  119. package/lib/source-approval-authority.d.ts +50 -0
  120. package/lib/source-approval-authority.d.ts.map +1 -0
  121. package/lib/source-approval-authority.js +412 -0
  122. package/lib/source-approval-authority.js.map +1 -0
  123. package/lib/source-approval-client.d.ts +32 -0
  124. package/lib/source-approval-client.d.ts.map +1 -0
  125. package/lib/source-approval-client.js +175 -0
  126. package/lib/source-approval-client.js.map +1 -0
  127. package/lib/source-build.d.ts +60 -0
  128. package/lib/source-build.d.ts.map +1 -0
  129. package/lib/source-build.js +311 -0
  130. package/lib/source-build.js.map +1 -0
  131. package/lib/source-context.d.ts +24 -0
  132. package/lib/source-context.d.ts.map +1 -0
  133. package/lib/source-context.js +99 -0
  134. package/lib/source-context.js.map +1 -0
  135. package/lib/source-job-types.d.ts +87 -0
  136. package/lib/source-job-types.d.ts.map +1 -0
  137. package/lib/source-job-types.js +2 -0
  138. package/lib/source-job-types.js.map +1 -0
  139. package/lib/source-jobs.d.ts +113 -0
  140. package/lib/source-jobs.d.ts.map +1 -0
  141. package/lib/source-jobs.js +535 -0
  142. package/lib/source-jobs.js.map +1 -0
  143. package/lib/source-release-authority.d.ts +35 -0
  144. package/lib/source-release-authority.d.ts.map +1 -0
  145. package/lib/source-release-authority.js +271 -0
  146. package/lib/source-release-authority.js.map +1 -0
  147. package/lib/source-release-client.d.ts +10 -0
  148. package/lib/source-release-client.d.ts.map +1 -0
  149. package/lib/source-release-client.js +24 -0
  150. package/lib/source-release-client.js.map +1 -0
  151. package/lib/source-release-runner.d.ts +31 -0
  152. package/lib/source-release-runner.d.ts.map +1 -0
  153. package/lib/source-release-runner.js +125 -0
  154. package/lib/source-release-runner.js.map +1 -0
  155. package/lib/source-versioning.d.ts +24 -0
  156. package/lib/source-versioning.d.ts.map +1 -0
  157. package/lib/source-versioning.js +213 -0
  158. package/lib/source-versioning.js.map +1 -0
  159. package/lib/source-workspace.d.ts +117 -0
  160. package/lib/source-workspace.d.ts.map +1 -0
  161. package/lib/source-workspace.js +458 -0
  162. package/lib/source-workspace.js.map +1 -0
  163. package/lib/sqlite.d.ts +1 -1
  164. package/lib/sqlite.d.ts.map +1 -1
  165. package/lib/sqlite.js +509 -7
  166. package/lib/sqlite.js.map +1 -1
  167. package/lib/store.d.ts +229 -6
  168. package/lib/store.d.ts.map +1 -1
  169. package/lib/store.js +2431 -383
  170. package/lib/store.js.map +1 -1
  171. package/lib/task-observation-authority.d.ts +29 -0
  172. package/lib/task-observation-authority.d.ts.map +1 -0
  173. package/lib/task-observation-authority.js +370 -0
  174. package/lib/task-observation-authority.js.map +1 -0
  175. package/lib/task-observation-client.d.ts +4 -0
  176. package/lib/task-observation-client.d.ts.map +1 -0
  177. package/lib/task-observation-client.js +20 -0
  178. package/lib/task-observation-client.js.map +1 -0
  179. package/lib/task-observation-runtime.d.ts +59 -0
  180. package/lib/task-observation-runtime.d.ts.map +1 -0
  181. package/lib/task-observation-runtime.js +331 -0
  182. package/lib/task-observation-runtime.js.map +1 -0
  183. package/lib/task-observation-store.d.ts +17 -0
  184. package/lib/task-observation-store.d.ts.map +1 -0
  185. package/lib/task-observation-store.js +115 -0
  186. package/lib/task-observation-store.js.map +1 -0
  187. package/lib/task-observation-types.d.ts +67 -0
  188. package/lib/task-observation-types.d.ts.map +1 -0
  189. package/lib/task-observation-types.js +2 -0
  190. package/lib/task-observation-types.js.map +1 -0
  191. package/lib/trust.d.ts +3 -0
  192. package/lib/trust.d.ts.map +1 -1
  193. package/lib/trust.js +0 -0
  194. package/lib/trust.js.map +1 -1
  195. package/lib/types.d.ts +275 -8
  196. package/lib/types.d.ts.map +1 -1
  197. package/lib/version.d.ts +1 -1
  198. package/lib/version.js +1 -1
  199. package/package.json +40 -5
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { realpathSync } from 'node:fs'
4
+ import { dirname, join } from 'node:path'
5
+ import { pathToFileURL } from 'node:url'
6
+
7
+ try {
8
+ const wrapper = realpathSync(process.argv[1])
9
+ const modulePath = join(dirname(wrapper), '../lib/task-observation-authority.js')
10
+ const { runTaskObservationAuthority } = await import(pathToFileURL(modulePath).href)
11
+ await runTaskObservationAuthority()
12
+ } catch {
13
+ process.stderr.write('task observation authority refused the request\n')
14
+ process.exitCode = 1
15
+ }
@@ -0,0 +1,23 @@
1
+ /** A deliberately small process owner for descriptor-pinned helpers.
2
+ *
3
+ * `detached` gives the direct child a fresh Linux process group. This is a
4
+ * cleanup boundary, not a sandbox: a helper which calls setsid(2) can leave
5
+ * that group and is outside the guarantee made here.
6
+ */
7
+ export type ControlledProcessErrorCode = 'START' | 'TIMEOUT' | 'OUTPUT_LIMIT' | 'NON_ZERO' | 'CLEANUP' | 'ABORTED';
8
+ export declare class ControlledProcessError extends Error {
9
+ readonly code: ControlledProcessErrorCode;
10
+ constructor(code: ControlledProcessErrorCode, message: string);
11
+ }
12
+ export interface ControlledProcessOptions {
13
+ signal?: AbortSignal;
14
+ command: string;
15
+ args: readonly string[];
16
+ env: NodeJS.ProcessEnv;
17
+ stdio: Array<'pipe' | 'ignore' | number>;
18
+ stdin: string | undefined;
19
+ timeoutMs: number;
20
+ maximumOutput: number;
21
+ }
22
+ export declare function executeControlledProcess(options: ControlledProcessOptions): Promise<string>;
23
+ //# sourceMappingURL=adapter-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-process.d.ts","sourceRoot":"","sources":["../src/adapter-process.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;AAElH,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,0BAA0B;gBAAhC,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,MAAM;CAIvE;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAA;IACxC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAsHD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2GjG"}
@@ -0,0 +1,305 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readdir, readFile } from 'node:fs/promises';
3
+ export class ControlledProcessError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = 'ControlledProcessError';
9
+ }
10
+ }
11
+ const CLEANUP_GRACE_MS = 75;
12
+ const CLEANUP_SETTLE_MS = 300;
13
+ const OUTPUT_DRAIN_MS = 100;
14
+ const POLL_MS = 25;
15
+ const PROC_CONCURRENCY = 16;
16
+ const MAX_PROC_ENTRIES = 4_096;
17
+ function errorCode(error) {
18
+ return typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string' ? error.code : undefined;
19
+ }
20
+ function remaining(deadline) {
21
+ const value = deadline - performance.now();
22
+ if (value <= 0)
23
+ throw new ControlledProcessError('CLEANUP', 'helper process-group cleanup exceeded its fixed deadline');
24
+ return value;
25
+ }
26
+ async function bounded(work, deadline) {
27
+ return new Promise((resolve, reject) => {
28
+ let timer;
29
+ // Observe work even if the deadline expired between starting IO and
30
+ // installing this timer; a late rejection must not become unhandled.
31
+ void work.then(value => { if (timer !== undefined)
32
+ clearTimeout(timer); resolve(value); }, error => { if (timer !== undefined)
33
+ clearTimeout(timer); reject(error); });
34
+ try {
35
+ timer = setTimeout(() => reject(new ControlledProcessError('CLEANUP', 'helper process-group cleanup exceeded its fixed deadline')), remaining(deadline));
36
+ }
37
+ catch (error) {
38
+ reject(error);
39
+ }
40
+ });
41
+ }
42
+ async function groupMembers(groupId, deadline) {
43
+ let entries;
44
+ try {
45
+ entries = await bounded(readdir('/proc'), deadline);
46
+ }
47
+ catch (error) {
48
+ if (error instanceof ControlledProcessError)
49
+ throw error;
50
+ throw new ControlledProcessError('CLEANUP', 'could not inspect the helper process group');
51
+ }
52
+ const processes = entries.filter(entry => /^\d+$/u.test(entry));
53
+ if (processes.length > MAX_PROC_ENTRIES)
54
+ throw new ControlledProcessError('CLEANUP', 'too many processes to prove helper process-group cleanup');
55
+ const members = [];
56
+ let next = 0;
57
+ const inspect = async () => {
58
+ for (;;) {
59
+ const entry = processes[next++];
60
+ if (entry === undefined)
61
+ return;
62
+ remaining(deadline);
63
+ const controller = new AbortController();
64
+ const timer = setTimeout(() => controller.abort(), remaining(deadline));
65
+ try {
66
+ const source = await readFile(`/proc/${entry}/stat`, { encoding: 'utf8', signal: controller.signal });
67
+ const close = source.lastIndexOf(')');
68
+ // Fields after the comm are state (3), ppid (4), pgrp (5). A zombie is
69
+ // already dead, so it does not retain helper authority.
70
+ const fields = source.slice(close + 2).trim().split(/\s+/u);
71
+ if (close >= 1 && fields[0] !== 'Z' && Number(fields[2]) === groupId)
72
+ members.push(Number(entry));
73
+ }
74
+ catch (error) {
75
+ if (errorCode(error) !== 'ENOENT')
76
+ throw new ControlledProcessError('CLEANUP', 'could not inspect the helper process group');
77
+ }
78
+ finally {
79
+ clearTimeout(timer);
80
+ }
81
+ }
82
+ };
83
+ try {
84
+ await bounded(Promise.all(Array.from({ length: Math.min(PROC_CONCURRENCY, processes.length) }, inspect)).then(() => undefined), deadline);
85
+ }
86
+ catch (error) {
87
+ if (error instanceof ControlledProcessError)
88
+ throw error;
89
+ throw new ControlledProcessError('CLEANUP', 'could not inspect the helper process group');
90
+ }
91
+ return members;
92
+ }
93
+ function signalGroup(groupId, signal) {
94
+ try {
95
+ process.kill(-groupId, signal);
96
+ }
97
+ catch (error) {
98
+ // ESRCH means the group disappeared between the inspection and signal.
99
+ if (errorCode(error) !== 'ESRCH')
100
+ throw new ControlledProcessError('CLEANUP', 'could not signal the helper process group');
101
+ }
102
+ }
103
+ function groupExists(groupId) {
104
+ try {
105
+ process.kill(-groupId, 0);
106
+ return true;
107
+ }
108
+ catch (error) {
109
+ if (errorCode(error) === 'ESRCH')
110
+ return false;
111
+ throw new ControlledProcessError('CLEANUP', 'could not inspect the helper process group');
112
+ }
113
+ }
114
+ function pause(ms, deadline) {
115
+ return new Promise((resolve, reject) => {
116
+ const wait = deadline === undefined ? ms : Math.min(ms, remaining(deadline));
117
+ setTimeout(() => {
118
+ try {
119
+ if (deadline !== undefined)
120
+ remaining(deadline);
121
+ resolve();
122
+ }
123
+ catch (error) {
124
+ reject(error);
125
+ }
126
+ }, wait);
127
+ });
128
+ }
129
+ async function reclaimGroup(groupId, deadline) {
130
+ // Always reclaim after the leader exits as well. A successful leader can
131
+ // otherwise leave a same-group writer holding stdout, preventing `close`.
132
+ // ESRCH is the normal leader-exit fast path; it avoids a full /proc scan.
133
+ if (!groupExists(groupId))
134
+ return;
135
+ try {
136
+ signalGroup(groupId, 'SIGTERM');
137
+ await pause(CLEANUP_GRACE_MS, deadline);
138
+ if (!groupExists(groupId))
139
+ return;
140
+ // Do not make an observational failure a reason to skip forceful cleanup.
141
+ // The scan only proves that SIGKILL succeeded; it does not gate SIGKILL.
142
+ signalGroup(groupId, 'SIGKILL');
143
+ while (performance.now() < deadline) {
144
+ await pause(POLL_MS, deadline);
145
+ if (!groupExists(groupId))
146
+ return;
147
+ const members = await groupMembers(groupId, deadline);
148
+ if (members.length === 0)
149
+ return;
150
+ }
151
+ throw new ControlledProcessError('CLEANUP', 'could not prove the helper process group was reclaimed');
152
+ }
153
+ catch (error) {
154
+ // A final best-effort kill also covers a failed /proc scan or deadline.
155
+ try {
156
+ signalGroup(groupId, 'SIGKILL');
157
+ }
158
+ catch { /* preserve original cleanup failure */ }
159
+ throw error;
160
+ }
161
+ }
162
+ export async function executeControlledProcess(options) {
163
+ if (options.signal?.aborted)
164
+ throw new ControlledProcessError('ABORTED', 'helper process cancelled');
165
+ if (process.platform !== 'linux')
166
+ throw new ControlledProcessError('START', 'controlled helper processes require Linux');
167
+ return new Promise((resolve, reject) => {
168
+ let child;
169
+ try {
170
+ child = spawn(options.command, [...options.args], { env: options.env, shell: false, detached: true, stdio: options.stdio });
171
+ }
172
+ catch {
173
+ reject(new ControlledProcessError('START', 'helper process could not start'));
174
+ return;
175
+ }
176
+ const chunks = [];
177
+ let bytes = 0;
178
+ let cause;
179
+ let leaderExited = false;
180
+ let settling = false;
181
+ let settled = false;
182
+ let timer;
183
+ let stdoutEnded = child.stdout === null;
184
+ let resolveStdoutEnd;
185
+ const stdoutEnd = new Promise(resolve => { resolveStdoutEnd = resolve; });
186
+ let resolveLeaderExit;
187
+ const leaderExit = new Promise(resolve => { resolveLeaderExit = resolve; });
188
+ const finish = (error, output) => {
189
+ if (settled)
190
+ return;
191
+ settled = true;
192
+ options.signal?.removeEventListener('abort', onAbort);
193
+ if (timer !== undefined)
194
+ clearTimeout(timer);
195
+ child.stdout?.destroy();
196
+ child.stdin?.destroy();
197
+ if (error !== undefined)
198
+ reject(error);
199
+ else
200
+ resolve(output ?? '');
201
+ };
202
+ const reclaimAndSettle = async () => {
203
+ if (settling || settled)
204
+ return;
205
+ settling = true;
206
+ const groupId = child.pid;
207
+ const cleanupDeadline = performance.now() + CLEANUP_GRACE_MS + CLEANUP_SETTLE_MS;
208
+ try {
209
+ if (groupId === undefined)
210
+ throw new ControlledProcessError('START', 'helper process could not start');
211
+ await reclaimGroup(groupId, cleanupDeadline);
212
+ // A missing group is not proof that the direct leader has exited. Do
213
+ // not accept a scan race as successful termination.
214
+ if (!leaderExited)
215
+ await bounded(leaderExit, cleanupDeadline);
216
+ if (!leaderExited)
217
+ throw new ControlledProcessError('CLEANUP', 'could not observe the helper leader exit');
218
+ if (cause === 'ABORTED')
219
+ finish(new ControlledProcessError('ABORTED', 'helper process cancelled'));
220
+ else if (cause === 'TIMEOUT')
221
+ finish(new ControlledProcessError('TIMEOUT', 'helper process exceeded its deadline'));
222
+ else if (cause === 'OUTPUT_LIMIT')
223
+ finish(new ControlledProcessError('OUTPUT_LIMIT', 'helper process exceeded its output bound'));
224
+ else if (cause === 'NON_ZERO')
225
+ finish(new ControlledProcessError('NON_ZERO', 'helper process returned a non-zero status'));
226
+ else if (cause === 'START')
227
+ finish(new ControlledProcessError('START', 'helper process could not start or its output failed'));
228
+ else {
229
+ // `exit` can precede final pipe delivery. The group is already
230
+ // empty, so this is only a bounded drain for a valid receipt, never
231
+ // a lifecycle wait on a descendant-held pipe.
232
+ if (!stdoutEnded)
233
+ await Promise.race([stdoutEnd, pause(OUTPUT_DRAIN_MS)]);
234
+ if (!stdoutEnded)
235
+ throw new ControlledProcessError('CLEANUP', 'helper stdout did not close after process-group reclamation');
236
+ // The execution deadline remains active through cleanup. A timer or
237
+ // stream error can therefore win while the bounded receipt drain is
238
+ // pending; never turn that late cause into a successful receipt.
239
+ const finalCause = currentCause();
240
+ if (finalCause === 'ABORTED')
241
+ finish(new ControlledProcessError('ABORTED', 'helper process cancelled'));
242
+ else if (finalCause === 'TIMEOUT')
243
+ finish(new ControlledProcessError('TIMEOUT', 'helper process exceeded its deadline'));
244
+ else if (finalCause === 'OUTPUT_LIMIT')
245
+ finish(new ControlledProcessError('OUTPUT_LIMIT', 'helper process exceeded its output bound'));
246
+ else if (finalCause === 'NON_ZERO')
247
+ finish(new ControlledProcessError('NON_ZERO', 'helper process returned a non-zero status'));
248
+ else if (finalCause === 'START')
249
+ finish(new ControlledProcessError('START', 'helper process could not start or its output failed'));
250
+ else
251
+ finish(undefined, Buffer.concat(chunks).toString('utf8'));
252
+ }
253
+ }
254
+ catch (error) {
255
+ finish(error instanceof ControlledProcessError ? error : new ControlledProcessError('CLEANUP', 'could not reclaim the helper process group'));
256
+ }
257
+ };
258
+ const terminate = (next) => {
259
+ if (cause === undefined)
260
+ cause = next;
261
+ // Begin cleanup immediately; do not wait for `close`, because a child
262
+ // can inherit stdout after the leader has gone away.
263
+ void reclaimAndSettle();
264
+ };
265
+ // A function call intentionally prevents TypeScript from treating `cause`
266
+ // as immutable across an awaited bounded drain.
267
+ const currentCause = () => cause;
268
+ child.once('error', () => terminate('START'));
269
+ child.stdout?.on('error', () => terminate('START'));
270
+ child.stdout?.once('end', () => { stdoutEnded = true; resolveStdoutEnd?.(); });
271
+ child.stdout?.on('data', (chunk) => {
272
+ if (settled || cause !== undefined)
273
+ return;
274
+ bytes += chunk.length;
275
+ if (bytes > options.maximumOutput)
276
+ terminate('OUTPUT_LIMIT');
277
+ else
278
+ chunks.push(chunk);
279
+ });
280
+ child.once('exit', code => {
281
+ leaderExited = true;
282
+ resolveLeaderExit?.();
283
+ if (cause === undefined && code !== 0)
284
+ cause = 'NON_ZERO';
285
+ void reclaimAndSettle();
286
+ });
287
+ // No `close` dependency: it is not a lifecycle proof when descendants
288
+ // inherit stdout. The group scan and fixed cleanup deadline are.
289
+ child.once('close', () => { if (!leaderExited && cause === undefined)
290
+ terminate('START'); });
291
+ child.stdin?.on('error', () => { });
292
+ const onAbort = () => terminate('ABORTED');
293
+ options.signal?.addEventListener('abort', onAbort, { once: true });
294
+ if (options.signal?.aborted)
295
+ onAbort();
296
+ timer = setTimeout(() => terminate('TIMEOUT'), options.timeoutMs);
297
+ try {
298
+ child.stdin?.end(options.stdin, 'utf8');
299
+ }
300
+ catch {
301
+ terminate('START');
302
+ }
303
+ });
304
+ }
305
+ //# sourceMappingURL=adapter-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-process.js","sourceRoot":"","sources":["../src/adapter-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { AssistantAutomationsService } from '@dsh-enhanced/assistant-automations';
2
+ import { type ControlPlaneStore } from './store.js';
3
+ import type { PluginControlTrustConfig } from './trust.js';
4
+ import type { PluginActivationPlan } from './types.js';
5
+ export interface AdoptionCoordinatorConfig {
6
+ coordinatorId: string;
7
+ scope: {
8
+ workspace: string;
9
+ preset: string;
10
+ principalId: string;
11
+ ownerRouteId: string;
12
+ };
13
+ timeoutMs: number;
14
+ budgetId: string;
15
+ budgetAmount: number;
16
+ }
17
+ export declare function validateAdoptionCoordinatorConfig(value: unknown): asserts value is AdoptionCoordinatorConfig;
18
+ /**
19
+ * Advance an already signed source handoff only through Host attestation.
20
+ * This Host deliberately leaves `commit-pending` for the target Host.
21
+ */
22
+ export declare function coordinateAdoptionHandoff(options: {
23
+ store: ControlPlaneStore;
24
+ trust: PluginControlTrustConfig;
25
+ planId: string;
26
+ signal?: AbortSignal;
27
+ assertCurrent?: () => void | Promise<void>;
28
+ }): Promise<PluginActivationPlan>;
29
+ type Automations = Pick<AssistantAutomationsService, 'registerHostExecutor' | 'reconcileSystem' | 'inspectSystemOwnedActivation'>;
30
+ /** Native Automations cron coordinator. It owns no private scheduler or final commit. */
31
+ export declare class AdoptionCoordinatorRuntime {
32
+ private readonly options;
33
+ private readonly abort;
34
+ private readonly flights;
35
+ private readonly generation;
36
+ private readonly activationNonce;
37
+ private readonly automationId;
38
+ private active;
39
+ private cursor;
40
+ private unregister?;
41
+ private closing?;
42
+ private lastError;
43
+ constructor(options: {
44
+ config: AdoptionCoordinatorConfig;
45
+ store: ControlPlaneStore;
46
+ trust: PluginControlTrustConfig;
47
+ automations: Automations;
48
+ assertCurrent: () => void;
49
+ });
50
+ start(): void;
51
+ close(): Promise<void>;
52
+ health: () => {
53
+ connected: boolean;
54
+ lastError: string | null;
55
+ };
56
+ private track;
57
+ private current;
58
+ private definition;
59
+ private handoffs;
60
+ private execute;
61
+ }
62
+ export {};
63
+ //# sourceMappingURL=adoption-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoption-coordinator.d.ts","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAuF,MAAM,qCAAqC,CAAA;AAE3K,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAUtD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACvF,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAkB5G;AAKD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,KAAK,EAAE,iBAAiB,CAAA;IACxB,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmEhC;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,8BAA8B,CAAC,CAAA;AAGjI,yFAAyF;AACzF,qBAAa,0BAA0B;IAWzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAsB;gBACV,OAAO,EAAE;QAAE,MAAM,EAAE,yBAAyB,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,wBAAwB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAC;QAAC,aAAa,EAAE,MAAM,IAAI,CAAA;KAAE;IAO3L,KAAK,IAAI,IAAI;IAmBb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,MAAM;;;MAAgE;IAEtE,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;YAGF,OAAO;CA8BtB"}