@clowder-ai/plugin-contract 0.1.0-beta.2 → 0.1.0-beta.20

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 (183) hide show
  1. package/dist/codegen/generate-contract.d.ts +10 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -1
  3. package/dist/codegen/generate-contract.js +201 -19
  4. package/dist/codegen/generate-contract.js.map +1 -1
  5. package/dist/conformance/fixtures.d.ts +11 -0
  6. package/dist/conformance/fixtures.d.ts.map +1 -0
  7. package/dist/conformance/fixtures.js +9 -0
  8. package/dist/conformance/fixtures.js.map +1 -0
  9. package/dist/conformance/index.d.ts +4 -0
  10. package/dist/conformance/index.d.ts.map +1 -1
  11. package/dist/conformance/index.js +3 -0
  12. package/dist/conformance/index.js.map +1 -1
  13. package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
  14. package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
  15. package/dist/conformance/messaging-behavior-fixture.js +30 -0
  16. package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
  17. package/dist/conformance/runner.d.ts.map +1 -1
  18. package/dist/conformance/runner.js +22 -2
  19. package/dist/conformance/runner.js.map +1 -1
  20. package/dist/conformance/stdio-harness/child-process-harness.d.ts +65 -0
  21. package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -0
  22. package/dist/conformance/stdio-harness/child-process-harness.js +296 -0
  23. package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -0
  24. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts +26 -0
  25. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts.map +1 -0
  26. package/dist/conformance/stdio-harness/dual-transport-oracle.js +32 -0
  27. package/dist/conformance/stdio-harness/dual-transport-oracle.js.map +1 -0
  28. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts +27 -0
  29. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts.map +1 -0
  30. package/dist/conformance/stdio-harness/harness-process-spawn.js +43 -0
  31. package/dist/conformance/stdio-harness/harness-process-spawn.js.map +1 -0
  32. package/dist/conformance/stdio-harness/index.d.ts +5 -0
  33. package/dist/conformance/stdio-harness/index.d.ts.map +1 -0
  34. package/dist/conformance/stdio-harness/index.js +4 -0
  35. package/dist/conformance/stdio-harness/index.js.map +1 -0
  36. package/dist/conformance/stdio-harness/ndjson-frame.d.ts +31 -0
  37. package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -0
  38. package/dist/conformance/stdio-harness/ndjson-frame.js +125 -0
  39. package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -0
  40. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts +15 -0
  41. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts.map +1 -0
  42. package/dist/conformance/stdio-harness/node-process-tree-runtime.js +78 -0
  43. package/dist/conformance/stdio-harness/node-process-tree-runtime.js.map +1 -0
  44. package/dist/conformance/stdio-harness/process-tree-controller.d.ts +51 -0
  45. package/dist/conformance/stdio-harness/process-tree-controller.d.ts.map +1 -0
  46. package/dist/conformance/stdio-harness/process-tree-controller.js +162 -0
  47. package/dist/conformance/stdio-harness/process-tree-controller.js.map +1 -0
  48. package/dist/conformance/stdio-harness/windows-sentinel.d.ts +15 -0
  49. package/dist/conformance/stdio-harness/windows-sentinel.d.ts.map +1 -0
  50. package/dist/conformance/stdio-harness/windows-sentinel.js +160 -0
  51. package/dist/conformance/stdio-harness/windows-sentinel.js.map +1 -0
  52. package/dist/conformance/stdio-harness/wire-shape.d.ts +18 -0
  53. package/dist/conformance/stdio-harness/wire-shape.d.ts.map +1 -0
  54. package/dist/conformance/stdio-harness/wire-shape.js +2 -0
  55. package/dist/conformance/stdio-harness/wire-shape.js.map +1 -0
  56. package/dist/docx-materialization.d.ts +8 -0
  57. package/dist/docx-materialization.d.ts.map +1 -0
  58. package/dist/docx-materialization.js +19 -0
  59. package/dist/docx-materialization.js.map +1 -0
  60. package/dist/generated/contract.generated.d.ts +957 -12
  61. package/dist/generated/contract.generated.d.ts.map +1 -1
  62. package/dist/generated/contract.generated.js +9 -1
  63. package/dist/generated/contract.generated.js.map +1 -1
  64. package/dist/index.d.ts +3 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +5 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/validation/catalog.d.ts +21 -0
  69. package/dist/validation/catalog.d.ts.map +1 -0
  70. package/dist/validation/catalog.js +140 -0
  71. package/dist/validation/catalog.js.map +1 -0
  72. package/dist/validation/companion-bridge.d.ts +6 -0
  73. package/dist/validation/companion-bridge.d.ts.map +1 -0
  74. package/dist/validation/companion-bridge.js +57 -0
  75. package/dist/validation/companion-bridge.js.map +1 -0
  76. package/dist/validation/docx-materialization.d.ts +6 -0
  77. package/dist/validation/docx-materialization.d.ts.map +1 -0
  78. package/dist/validation/docx-materialization.js +36 -0
  79. package/dist/validation/docx-materialization.js.map +1 -0
  80. package/dist/validation/index.d.ts +6 -0
  81. package/dist/validation/index.d.ts.map +1 -1
  82. package/dist/validation/index.js +6 -0
  83. package/dist/validation/index.js.map +1 -1
  84. package/dist/validation/manifest.d.ts +23 -0
  85. package/dist/validation/manifest.d.ts.map +1 -0
  86. package/dist/validation/manifest.js +160 -0
  87. package/dist/validation/manifest.js.map +1 -0
  88. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  89. package/dist/validation/messaging-semantic.js +49 -0
  90. package/dist/validation/messaging-semantic.js.map +1 -1
  91. package/dist/validation/messaging-wire.d.ts +38 -0
  92. package/dist/validation/messaging-wire.d.ts.map +1 -0
  93. package/dist/validation/messaging-wire.js +164 -0
  94. package/dist/validation/messaging-wire.js.map +1 -0
  95. package/dist/validation/signals.d.ts +26 -0
  96. package/dist/validation/signals.d.ts.map +1 -0
  97. package/dist/validation/signals.js +206 -0
  98. package/dist/validation/signals.js.map +1 -0
  99. package/dist/wire/constants.d.ts +36 -0
  100. package/dist/wire/constants.d.ts.map +1 -0
  101. package/dist/wire/constants.js +36 -0
  102. package/dist/wire/constants.js.map +1 -0
  103. package/dist/wire/disposition-fixtures.d.ts +118 -0
  104. package/dist/wire/disposition-fixtures.d.ts.map +1 -0
  105. package/dist/wire/disposition-fixtures.js +1881 -0
  106. package/dist/wire/disposition-fixtures.js.map +1 -0
  107. package/dist/wire/disposition.d.ts +102 -0
  108. package/dist/wire/disposition.d.ts.map +1 -0
  109. package/dist/wire/disposition.js +217 -0
  110. package/dist/wire/disposition.js.map +1 -0
  111. package/dist/wire/envelope.d.ts +253 -0
  112. package/dist/wire/envelope.d.ts.map +1 -0
  113. package/dist/wire/envelope.js +19 -0
  114. package/dist/wire/envelope.js.map +1 -0
  115. package/dist/wire/errors.d.ts +222 -0
  116. package/dist/wire/errors.d.ts.map +1 -0
  117. package/dist/wire/errors.js +153 -0
  118. package/dist/wire/errors.js.map +1 -0
  119. package/dist/wire/grants.d.ts +57 -0
  120. package/dist/wire/grants.d.ts.map +1 -0
  121. package/dist/wire/grants.js +59 -0
  122. package/dist/wire/grants.js.map +1 -0
  123. package/dist/wire/handshake-byte-bounds.d.ts +69 -0
  124. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
  125. package/dist/wire/handshake-byte-bounds.js +173 -0
  126. package/dist/wire/handshake-byte-bounds.js.map +1 -0
  127. package/dist/wire/handshake.d.ts +146 -0
  128. package/dist/wire/handshake.d.ts.map +1 -0
  129. package/dist/wire/handshake.js +189 -0
  130. package/dist/wire/handshake.js.map +1 -0
  131. package/dist/wire/index.d.ts +37 -0
  132. package/dist/wire/index.d.ts.map +1 -0
  133. package/dist/wire/index.js +61 -0
  134. package/dist/wire/index.js.map +1 -0
  135. package/dist/wire/lifecycle-byte-bounds.d.ts +55 -0
  136. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
  137. package/dist/wire/lifecycle-byte-bounds.js +209 -0
  138. package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
  139. package/dist/wire/messaging-byte-bounds.d.ts +61 -0
  140. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
  141. package/dist/wire/messaging-byte-bounds.js +459 -0
  142. package/dist/wire/messaging-byte-bounds.js.map +1 -0
  143. package/dist/wire/registry.d.ts +294 -0
  144. package/dist/wire/registry.d.ts.map +1 -0
  145. package/dist/wire/registry.js +256 -0
  146. package/dist/wire/registry.js.map +1 -0
  147. package/dist/wire/request-id.d.ts +34 -0
  148. package/dist/wire/request-id.d.ts.map +1 -0
  149. package/dist/wire/request-id.js +40 -0
  150. package/dist/wire/request-id.js.map +1 -0
  151. package/dist/wire/row-shapes.d.ts +217 -0
  152. package/dist/wire/row-shapes.d.ts.map +1 -0
  153. package/dist/wire/row-shapes.js +75 -0
  154. package/dist/wire/row-shapes.js.map +1 -0
  155. package/dist/wire/signal-byte-bounds.d.ts +97 -0
  156. package/dist/wire/signal-byte-bounds.d.ts.map +1 -0
  157. package/dist/wire/signal-byte-bounds.js +229 -0
  158. package/dist/wire/signal-byte-bounds.js.map +1 -0
  159. package/dist/wire/wire-uint53.d.ts +26 -0
  160. package/dist/wire/wire-uint53.d.ts.map +1 -0
  161. package/dist/wire/wire-uint53.js +32 -0
  162. package/dist/wire/wire-uint53.js.map +1 -0
  163. package/fixtures/behavior/messaging/adversarial-invariants.json +85 -0
  164. package/fixtures/manifest/invalid/duplicate-signal-type.json +33 -0
  165. package/fixtures/manifest/invalid/icon-package-escape.json +22 -0
  166. package/fixtures/manifest/valid/localized-product-metadata.json +27 -0
  167. package/fixtures/messaging/valid/subscription-delivery.json +1 -1
  168. package/fixtures/signals/invalid/destination-injection.json +15 -0
  169. package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
  170. package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
  171. package/fixtures/signals/invalid/non-utc-occurred-at.json +12 -0
  172. package/fixtures/signals/valid/feishu-meeting-artifact.json +18 -0
  173. package/fixtures/signals/valid/remote-service-declaration.json +10 -0
  174. package/package.json +19 -6
  175. package/src/schemas/behavior-fixture.schema.json +262 -2
  176. package/src/schemas/catalog.schema.json +91 -0
  177. package/src/schemas/companion-bridge.schema.json +937 -0
  178. package/src/schemas/docx-materialization.schema.json +302 -0
  179. package/src/schemas/manifest.schema.json +490 -4
  180. package/src/schemas/messaging.schema.json +209 -32
  181. package/src/schemas/physical-limb.schema.json +319 -0
  182. package/src/schemas/plugin-metadata.schema.json +62 -0
  183. package/src/schemas/signal.schema.json +129 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * NDJSON frame ceiling — derived from the canonical wire constant.
3
+ * P-1b consumes P-1a's truth; this alias exists for harness-local naming.
4
+ * Widened to `number` so callers can pass stricter sub-limits.
5
+ */
6
+ export declare const MAX_NDJSON_FRAME_BYTES: number;
7
+ export type JsonObject = Readonly<Record<string, unknown>>;
8
+ export interface DecodedNdjsonFrame {
9
+ /** Exact bytes before LF; retained for pre-parse contract validation. */
10
+ readonly raw: Uint8Array;
11
+ /** Convenience parse only; contract validation must still inspect raw. */
12
+ readonly value: JsonObject;
13
+ }
14
+ export type NdjsonFrameErrorCode = 'FRAME_TOO_LARGE' | 'INVALID_UTF8' | 'INVALID_JSON' | 'INVALID_FRAME' | 'TRUNCATED_FRAME' | 'DECODER_CLOSED';
15
+ export declare class NdjsonFrameError extends Error {
16
+ readonly code: NdjsonFrameErrorCode;
17
+ constructor(code: NdjsonFrameErrorCode, message: string);
18
+ }
19
+ export declare function encodeNdjsonFrame(value: JsonObject, maxFrameBytes?: number): Uint8Array;
20
+ export declare class NdjsonFrameDecoder {
21
+ private readonly maxFrameBytes;
22
+ private buffered;
23
+ private closed;
24
+ private failed;
25
+ constructor(maxFrameBytes?: number);
26
+ push(chunk: Uint8Array): readonly DecodedNdjsonFrame[];
27
+ end(): readonly DecodedNdjsonFrame[];
28
+ private assertOpen;
29
+ private fail;
30
+ }
31
+ //# sourceMappingURL=ndjson-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-frame.d.ts","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/ndjson-frame.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAwB,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,cAAc,GACd,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,IAAI,EAAE,oBAAoB;gBAA1B,IAAI,EAAE,oBAAoB,EACnC,OAAO,EAAE,MAAM;CAKlB;AAyCD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,aAAa,SAAyB,GACrC,UAAU,CAmBZ;AAED,qBAAa,kBAAkB;IAKjB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAJ1C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEM,aAAa,SAAyB;IAInE,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,kBAAkB,EAAE;IAkDtD,GAAG,IAAI,SAAS,kBAAkB,EAAE;IAapC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,IAAI;CAIb"}
@@ -0,0 +1,125 @@
1
+ import { MAX_FRAME_BYTES } from '../../wire/constants.js';
2
+ /**
3
+ * NDJSON frame ceiling — derived from the canonical wire constant.
4
+ * P-1b consumes P-1a's truth; this alias exists for harness-local naming.
5
+ * Widened to `number` so callers can pass stricter sub-limits.
6
+ */
7
+ export const MAX_NDJSON_FRAME_BYTES = MAX_FRAME_BYTES;
8
+ export class NdjsonFrameError extends Error {
9
+ code;
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.code = code;
13
+ this.name = 'NdjsonFrameError';
14
+ }
15
+ }
16
+ function validateMaxFrameBytes(maxFrameBytes) {
17
+ if (!Number.isSafeInteger(maxFrameBytes) ||
18
+ maxFrameBytes <= 0 ||
19
+ maxFrameBytes > MAX_NDJSON_FRAME_BYTES) {
20
+ throw new RangeError(`NDJSON maxFrameBytes must be a positive safe integer no greater than ${MAX_NDJSON_FRAME_BYTES}`);
21
+ }
22
+ }
23
+ function assertJsonObject(value) {
24
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
25
+ throw new NdjsonFrameError('INVALID_FRAME', 'NDJSON frames must contain one non-array JSON object');
26
+ }
27
+ }
28
+ function decodeFrame(frame) {
29
+ let text;
30
+ try {
31
+ text = new TextDecoder('utf-8', { fatal: true }).decode(frame);
32
+ }
33
+ catch {
34
+ throw new NdjsonFrameError('INVALID_UTF8', 'NDJSON frame is not valid UTF-8');
35
+ }
36
+ let value;
37
+ try {
38
+ value = JSON.parse(text);
39
+ }
40
+ catch {
41
+ throw new NdjsonFrameError('INVALID_JSON', 'NDJSON frame is not valid JSON');
42
+ }
43
+ assertJsonObject(value);
44
+ return { raw: Buffer.from(frame), value };
45
+ }
46
+ export function encodeNdjsonFrame(value, maxFrameBytes = MAX_NDJSON_FRAME_BYTES) {
47
+ validateMaxFrameBytes(maxFrameBytes);
48
+ assertJsonObject(value);
49
+ const serialized = JSON.stringify(value);
50
+ if (serialized === undefined) {
51
+ throw new NdjsonFrameError('INVALID_FRAME', 'NDJSON frames must serialize to one non-array JSON object');
52
+ }
53
+ assertJsonObject(JSON.parse(serialized));
54
+ const frame = Buffer.from(serialized, 'utf8');
55
+ if (frame.byteLength > maxFrameBytes) {
56
+ throw new NdjsonFrameError('FRAME_TOO_LARGE', `NDJSON frame is ${frame.byteLength} bytes; limit is ${maxFrameBytes}`);
57
+ }
58
+ return Buffer.concat([frame, Buffer.from('\n')], frame.byteLength + 1);
59
+ }
60
+ export class NdjsonFrameDecoder {
61
+ maxFrameBytes;
62
+ buffered = Buffer.alloc(0);
63
+ closed = false;
64
+ failed = false;
65
+ constructor(maxFrameBytes = MAX_NDJSON_FRAME_BYTES) {
66
+ this.maxFrameBytes = maxFrameBytes;
67
+ validateMaxFrameBytes(maxFrameBytes);
68
+ }
69
+ push(chunk) {
70
+ this.assertOpen();
71
+ if (chunk.byteLength === 0) {
72
+ return [];
73
+ }
74
+ const incoming = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
75
+ const combined = this.buffered.byteLength === 0
76
+ ? incoming
77
+ : Buffer.concat([this.buffered, incoming], this.buffered.byteLength + incoming.byteLength);
78
+ const frames = [];
79
+ let frameStart = 0;
80
+ try {
81
+ let newline = combined.indexOf(0x0a, frameStart);
82
+ while (newline !== -1) {
83
+ const frameLength = newline - frameStart;
84
+ if (frameLength > this.maxFrameBytes) {
85
+ throw new NdjsonFrameError('FRAME_TOO_LARGE', `NDJSON frame is ${frameLength} bytes; limit is ${this.maxFrameBytes}`);
86
+ }
87
+ if (frameLength === 0) {
88
+ throw new NdjsonFrameError('INVALID_FRAME', 'blank NDJSON frames are not allowed');
89
+ }
90
+ frames.push(decodeFrame(combined.subarray(frameStart, newline)));
91
+ frameStart = newline + 1;
92
+ newline = combined.indexOf(0x0a, frameStart);
93
+ }
94
+ const remainder = combined.subarray(frameStart);
95
+ if (remainder.byteLength > this.maxFrameBytes) {
96
+ throw new NdjsonFrameError('FRAME_TOO_LARGE', `unterminated NDJSON frame exceeded ${this.maxFrameBytes} bytes`);
97
+ }
98
+ this.buffered = Buffer.from(remainder);
99
+ return frames;
100
+ }
101
+ catch (error) {
102
+ this.fail();
103
+ throw error;
104
+ }
105
+ }
106
+ end() {
107
+ this.assertOpen();
108
+ this.closed = true;
109
+ if (this.buffered.byteLength === 0) {
110
+ return [];
111
+ }
112
+ this.buffered = Buffer.alloc(0);
113
+ throw new NdjsonFrameError('TRUNCATED_FRAME', 'NDJSON stream ended before the final LF delimiter');
114
+ }
115
+ assertOpen() {
116
+ if (this.closed || this.failed) {
117
+ throw new NdjsonFrameError('DECODER_CLOSED', 'NDJSON decoder is closed');
118
+ }
119
+ }
120
+ fail() {
121
+ this.failed = true;
122
+ this.buffered = Buffer.alloc(0);
123
+ }
124
+ }
125
+ //# sourceMappingURL=ndjson-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-frame.js","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/ndjson-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ProcessTreeRuntime, type TaskkillOutcome } from './process-tree-controller.js';
2
+ export interface TaskkillProcess {
3
+ readonly kill: () => boolean;
4
+ readonly once: {
5
+ (event: 'close', listener: (code: number | null) => void): TaskkillProcess;
6
+ (event: 'error', listener: (error: Error) => void): TaskkillProcess;
7
+ };
8
+ }
9
+ export type TaskkillSpawner = (command: string, args: readonly string[], options: {
10
+ readonly stdio: 'ignore';
11
+ readonly windowsHide: true;
12
+ }) => TaskkillProcess;
13
+ export declare function runTaskkill(rootPid: number, timeoutMs: number, spawnTaskkill?: TaskkillSpawner): Promise<TaskkillOutcome>;
14
+ export declare function createNodeProcessTreeRuntime(platform: NodeJS.Platform, signalTarget: (signal: NodeJS.Signals) => void, killProcess?: typeof process.kill): ProcessTreeRuntime;
15
+ //# sourceMappingURL=node-process-tree-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-process-tree-runtime.d.ts","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/node-process-tree-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE;QACb,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,eAAe,CAAC;QAC3E,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,eAAe,CAAC;KACrE,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;CAAE,KAC9D,eAAe,CAAC;AAKrB,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,eAAwC,GACtD,OAAO,CAAC,eAAe,CAAC,CAqC1B;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAC9C,WAAW,GAAE,OAAO,OAAO,CAAC,IAAmB,GAC9C,kBAAkB,CAiCpB"}
@@ -0,0 +1,78 @@
1
+ import { spawn } from 'node:child_process';
2
+ import {} from './process-tree-controller.js';
3
+ const defaultTaskkillSpawner = (command, args, options) => spawn(command, [...args], options);
4
+ export function runTaskkill(rootPid, timeoutMs, spawnTaskkill = defaultTaskkillSpawner) {
5
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
6
+ throw new RangeError('taskkill timeoutMs must be a positive safe integer');
7
+ }
8
+ let child;
9
+ try {
10
+ child = spawnTaskkill('taskkill', ['/pid', String(rootPid), '/t', '/f'], { stdio: 'ignore', windowsHide: true });
11
+ }
12
+ catch (error) {
13
+ return Promise.resolve({
14
+ status: 'spawn-error',
15
+ error: error instanceof Error ? error : new Error(String(error)),
16
+ });
17
+ }
18
+ return new Promise((resolve) => {
19
+ let settled = false;
20
+ const settle = (outcome) => {
21
+ if (settled) {
22
+ return;
23
+ }
24
+ settled = true;
25
+ clearTimeout(timer);
26
+ resolve(outcome);
27
+ };
28
+ const timer = setTimeout(() => {
29
+ child.kill();
30
+ settle({ status: 'timeout' });
31
+ }, timeoutMs);
32
+ child.once('error', (error) => settle({ status: 'spawn-error', error }));
33
+ child.once('close', (code) => settle(code === 0 ? { status: 'success' } : { status: 'nonzero', code }));
34
+ });
35
+ }
36
+ export function createNodeProcessTreeRuntime(platform, signalTarget, killProcess = process.kill) {
37
+ return {
38
+ platform,
39
+ now: Date.now,
40
+ sleep: (delayMs) => new Promise((resolve) => setTimeout(resolve, delayMs)),
41
+ signalTarget,
42
+ signalTree: (rootPid, signal) => {
43
+ try {
44
+ killProcess(-rootPid, signal);
45
+ }
46
+ catch (error) {
47
+ if (isNoSuchProcessError(error)) {
48
+ signalTarget(signal);
49
+ return;
50
+ }
51
+ throw error;
52
+ }
53
+ },
54
+ treeIsAlive: (rootPid) => {
55
+ try {
56
+ killProcess(platform === 'win32' ? rootPid : -rootPid, 0);
57
+ return true;
58
+ }
59
+ catch (error) {
60
+ if (isNoSuchProcessError(error)) {
61
+ return false;
62
+ }
63
+ if (isPermissionError(error)) {
64
+ return true;
65
+ }
66
+ throw error;
67
+ }
68
+ },
69
+ runTaskkill,
70
+ };
71
+ }
72
+ function isNoSuchProcessError(error) {
73
+ return error instanceof Error && 'code' in error && error.code === 'ESRCH';
74
+ }
75
+ function isPermissionError(error) {
76
+ return error instanceof Error && 'code' in error && error.code === 'EPERM';
77
+ }
78
+ //# sourceMappingURL=node-process-tree-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-process-tree-runtime.js","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/node-process-tree-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export type HarnessProcessState = 'spawned' | 'running' | 'terminating' | 'exited' | 'reaped' | 'cleanup-failed';
2
+ export type TaskkillOutcome = {
3
+ readonly status: 'success';
4
+ } | {
5
+ readonly status: 'nonzero';
6
+ readonly code: number | null;
7
+ } | {
8
+ readonly status: 'spawn-error';
9
+ readonly error: Error;
10
+ } | {
11
+ readonly status: 'timeout';
12
+ };
13
+ export interface ProcessTreeRuntime {
14
+ readonly platform: NodeJS.Platform;
15
+ readonly now: () => number;
16
+ readonly sleep: (delayMs: number) => Promise<void>;
17
+ readonly signalTarget: (signal: NodeJS.Signals) => void;
18
+ readonly signalTree: (rootPid: number, signal: NodeJS.Signals) => void;
19
+ readonly treeIsAlive: (rootPid: number) => boolean;
20
+ readonly runTaskkill: (rootPid: number, timeoutMs: number) => Promise<TaskkillOutcome>;
21
+ }
22
+ export interface ReapProcessTreeOptions {
23
+ readonly timeoutMs: number;
24
+ readonly probeIntervalMs: number;
25
+ readonly taskkillTimeoutMs: number;
26
+ readonly targetExitGraceMs: number;
27
+ }
28
+ export declare class HarnessCleanupError extends Error {
29
+ readonly rootPid: number | undefined;
30
+ constructor(rootPid: number | undefined, message: string, options?: ErrorOptions);
31
+ }
32
+ export declare class ProcessTreeController {
33
+ readonly rootPid: number | undefined;
34
+ readonly runtime: ProcessTreeRuntime;
35
+ private currentState;
36
+ private targetExited;
37
+ private streamsClosed;
38
+ private hardKillRequested;
39
+ private terminationError;
40
+ private reapPromise;
41
+ constructor(rootPid: number | undefined, runtime: ProcessTreeRuntime);
42
+ get state(): HarnessProcessState;
43
+ markRunning(): void;
44
+ requestTermination(signal: NodeJS.Signals): void;
45
+ markTargetExited(): void;
46
+ markStreamsClosed(): void;
47
+ treeIsAlive(): boolean;
48
+ reap(options: ReapProcessTreeOptions): Promise<void>;
49
+ private reapOnce;
50
+ }
51
+ //# sourceMappingURL=process-tree-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-tree-controller.d.ts","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/process-tree-controller.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,SAAS,GACT,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,gBAAgB,CAAC;AAErB,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IACvE,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,CACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;gBAA3B,OAAO,EAAE,MAAM,GAAG,SAAS,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY;CAKzB;AAED,qBAAa,qBAAqB;IAS9B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IACpC,QAAQ,CAAC,OAAO,EAAE,kBAAkB;IATtC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,WAAW,CAA4B;gBAGpC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,kBAAkB;IAGtC,IAAI,KAAK,IAAI,mBAAmB,CAE/B;IAED,WAAW,IAAI,IAAI;IAMnB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;IA0BhD,gBAAgB,IAAI,IAAI;IAWxB,iBAAiB,IAAI,IAAI;IAIzB,WAAW,IAAI,OAAO;IAItB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAStC,QAAQ;CA6FvB"}
@@ -0,0 +1,162 @@
1
+ export class HarnessCleanupError extends Error {
2
+ rootPid;
3
+ constructor(rootPid, message, options) {
4
+ super(message, options);
5
+ this.rootPid = rootPid;
6
+ this.name = 'HarnessCleanupError';
7
+ }
8
+ }
9
+ export class ProcessTreeController {
10
+ rootPid;
11
+ runtime;
12
+ currentState = 'spawned';
13
+ targetExited = false;
14
+ streamsClosed = false;
15
+ hardKillRequested = false;
16
+ terminationError;
17
+ reapPromise;
18
+ constructor(rootPid, runtime) {
19
+ this.rootPid = rootPid;
20
+ this.runtime = runtime;
21
+ }
22
+ get state() {
23
+ return this.currentState;
24
+ }
25
+ markRunning() {
26
+ if (this.state === 'spawned') {
27
+ this.currentState = 'running';
28
+ }
29
+ }
30
+ requestTermination(signal) {
31
+ if (this.state === 'reaped' || this.state === 'cleanup-failed') {
32
+ return;
33
+ }
34
+ if (this.hardKillRequested) {
35
+ return;
36
+ }
37
+ if (signal === 'SIGKILL') {
38
+ this.hardKillRequested = true;
39
+ }
40
+ if (this.state === 'spawned' || this.state === 'running') {
41
+ this.currentState = 'terminating';
42
+ }
43
+ try {
44
+ if (this.rootPid === undefined || this.runtime.platform === 'win32') {
45
+ this.runtime.signalTarget(signal);
46
+ return;
47
+ }
48
+ this.runtime.signalTree(this.rootPid, signal);
49
+ }
50
+ catch (error) {
51
+ this.terminationError =
52
+ error instanceof Error ? error : new Error(String(error));
53
+ }
54
+ }
55
+ markTargetExited() {
56
+ this.targetExited = true;
57
+ if (this.state === 'reaped' || this.state === 'cleanup-failed') {
58
+ return;
59
+ }
60
+ if (this.state === 'spawned' || this.state === 'running') {
61
+ this.currentState = 'terminating';
62
+ }
63
+ this.currentState = 'exited';
64
+ }
65
+ markStreamsClosed() {
66
+ this.streamsClosed = true;
67
+ }
68
+ treeIsAlive() {
69
+ return this.rootPid === undefined ? false : this.runtime.treeIsAlive(this.rootPid);
70
+ }
71
+ reap(options) {
72
+ validatePositiveSafeInteger(options.timeoutMs, 'cleanup timeoutMs');
73
+ validatePositiveSafeInteger(options.probeIntervalMs, 'cleanup probeIntervalMs');
74
+ validatePositiveSafeInteger(options.taskkillTimeoutMs, 'taskkill timeoutMs');
75
+ validatePositiveSafeInteger(options.targetExitGraceMs, 'target-exit graceMs');
76
+ this.reapPromise ??= this.reapOnce(options);
77
+ return this.reapPromise;
78
+ }
79
+ async reapOnce(options) {
80
+ let taskkillOutcome;
81
+ let targetExitConfirmedBeforeTaskkill = true;
82
+ if (this.runtime.platform === 'win32' && this.rootPid !== undefined) {
83
+ const targetExitDeadline = this.runtime.now() + options.targetExitGraceMs;
84
+ while (!this.targetExited && this.runtime.now() < targetExitDeadline) {
85
+ await this.runtime.sleep(Math.min(options.probeIntervalMs, targetExitDeadline - this.runtime.now()));
86
+ }
87
+ targetExitConfirmedBeforeTaskkill = this.targetExited;
88
+ try {
89
+ taskkillOutcome = await this.runtime.runTaskkill(this.rootPid, options.taskkillTimeoutMs);
90
+ }
91
+ catch (error) {
92
+ taskkillOutcome = {
93
+ status: 'spawn-error',
94
+ error: error instanceof Error ? error : new Error(String(error)),
95
+ };
96
+ }
97
+ if (taskkillOutcome.status !== 'success') {
98
+ this.currentState = 'cleanup-failed';
99
+ const outcome = describeTaskkillOutcome(taskkillOutcome);
100
+ const terminationDetail = this.terminationError === undefined
101
+ ? ''
102
+ : `; termination signal failed: ${this.terminationError.message}`;
103
+ const cause = this.terminationError ??
104
+ (taskkillOutcome.status === 'spawn-error'
105
+ ? taskkillOutcome.error
106
+ : undefined);
107
+ throw new HarnessCleanupError(this.rootPid, `harness process-tree cleanup has no whole-tree evidence after taskkill ${outcome}${terminationDetail}`, cause === undefined ? undefined : { cause });
108
+ }
109
+ }
110
+ const deadline = this.runtime.now() + options.timeoutMs;
111
+ while (true) {
112
+ let treeAlive;
113
+ try {
114
+ treeAlive = this.treeIsAlive();
115
+ }
116
+ catch (error) {
117
+ const cause = error instanceof Error ? error : new Error(String(error));
118
+ this.currentState = 'cleanup-failed';
119
+ throw new HarnessCleanupError(this.rootPid, `harness process-tree cleanup probe failed: ${cause.message}`, { cause });
120
+ }
121
+ if (!treeAlive && this.targetExited && this.streamsClosed) {
122
+ if (!targetExitConfirmedBeforeTaskkill) {
123
+ this.currentState = 'cleanup-failed';
124
+ throw new HarnessCleanupError(this.rootPid, 'Windows sentinel did not report target exit before taskkill reaped the wrapper root');
125
+ }
126
+ this.currentState = 'reaped';
127
+ return;
128
+ }
129
+ if (this.runtime.now() >= deadline) {
130
+ this.currentState = 'cleanup-failed';
131
+ const outcome = describeTaskkillOutcome(taskkillOutcome);
132
+ const terminationDetail = this.terminationError === undefined
133
+ ? ''
134
+ : `; termination signal failed: ${this.terminationError.message}`;
135
+ const cause = this.terminationError ??
136
+ (taskkillOutcome?.status === 'spawn-error'
137
+ ? taskkillOutcome.error
138
+ : undefined);
139
+ throw new HarnessCleanupError(this.rootPid, `harness process-tree cleanup failed after taskkill ${outcome}${terminationDetail}`, cause === undefined ? undefined : { cause });
140
+ }
141
+ await this.runtime.sleep(Math.min(options.probeIntervalMs, deadline - this.runtime.now()));
142
+ }
143
+ }
144
+ }
145
+ function validatePositiveSafeInteger(value, label) {
146
+ if (!Number.isSafeInteger(value) || value <= 0) {
147
+ throw new RangeError(`${label} must be a positive safe integer`);
148
+ }
149
+ }
150
+ function describeTaskkillOutcome(outcome) {
151
+ if (outcome === undefined) {
152
+ return 'not-applicable';
153
+ }
154
+ if (outcome.status === 'nonzero') {
155
+ return `nonzero (code=${String(outcome.code)})`;
156
+ }
157
+ if (outcome.status === 'spawn-error') {
158
+ return `spawn-error (${outcome.error.message})`;
159
+ }
160
+ return outcome.status;
161
+ }
162
+ //# sourceMappingURL=process-tree-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-tree-controller.js","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/process-tree-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ export interface WindowsSentinelOptions {
3
+ readonly command: string;
4
+ readonly args: readonly string[];
5
+ readonly cwd?: string;
6
+ readonly env?: NodeJS.ProcessEnv;
7
+ }
8
+ export interface WindowsSentinel {
9
+ readonly root: ChildProcessWithoutNullStreams;
10
+ readonly onTargetError: (listener: (error: Error) => void) => void;
11
+ readonly onTargetExit: (listener: (code: number | null, signal: NodeJS.Signals | null) => void) => void;
12
+ readonly signalTarget: (signal: NodeJS.Signals) => void;
13
+ }
14
+ export declare function spawnWindowsSentinel(options: WindowsSentinelOptions): WindowsSentinel;
15
+ //# sourceMappingURL=windows-sentinel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-sentinel.d.ts","sourceRoot":"","sources":["../../../src/conformance/stdio-harness/windows-sentinel.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,YAAY,EAAE,CACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,KACnE,IAAI,CAAC;IACV,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;CACzD;AAiFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAmGrF"}