@tetsuo-ai/agenc 0.19.21 → 0.19.23

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.
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "manifestVersion": 2,
3
- "runtimeVersion": "0.19.21",
3
+ "runtimeVersion": "0.19.23",
4
4
  "releaseRepository": "tetsuo-ai/agenc-releases",
5
- "releaseTag": "agenc-v0.19.21",
5
+ "releaseTag": "agenc-v0.19.23",
6
6
  "build": {
7
- "sourceCommit": "d8e4162e4c29489d2c6b5250e5eadc782d305a40",
8
- "sourceRef": "refs/tags/agenc-v0.19.21",
9
- "sourceDateEpoch": 1793232621,
10
- "lockfileSha256": "cb46418b6dff9ed99c495586b33a80c335da04355230b97a0fe89b0d903cd07e",
7
+ "sourceCommit": "da0c3ff54022486ee73fe5af159f5f85b8f3f8ab",
8
+ "sourceRef": "refs/tags/agenc-v0.19.23",
9
+ "sourceDateEpoch": 1793292155,
10
+ "lockfileSha256": "b296f386b1769e547ed616c887e055b066fc341b00846b1970d02bd643aa97df",
11
11
  "nodeVersion": "v26.12.1",
12
12
  "nodeMajor": 26,
13
13
  "nodeModuleAbi": "147",
@@ -16,43 +16,43 @@
16
16
  "artifactProfile": "release",
17
17
  "releaseCandidate": {
18
18
  "workflow": "release-runtime.yml",
19
- "runId": 40796791327,
19
+ "runId": 40918429478,
20
20
  "runAttempt": 1,
21
- "runUrl": "https://github.com/tetsuo-ai/agenc-core/actions/runs/40796791327",
21
+ "runUrl": "https://github.com/tetsuo-ai/agenc-core/actions/runs/40918429478",
22
22
  "phase": "candidate",
23
23
  "sourceRef": "refs/heads/main",
24
- "evidenceSha256": "7dd68ec6937ae6dbb479c64dd776efa7cbc3a1bf619cc11c816de7f5885efd1c"
24
+ "evidenceSha256": "6804c8a298d7f8def3e0001255e8795921799d228d1e91df75351d67307ab664"
25
25
  }
26
26
  },
27
27
  "artifacts": [
28
28
  {
29
29
  "platform": "darwin",
30
30
  "arch": "arm64",
31
- "runtimeVersion": "0.19.21",
31
+ "runtimeVersion": "0.19.23",
32
32
  "nodeMajor": 26,
33
33
  "nodeModuleAbi": "147",
34
34
  "nodeApiVersion": "10",
35
- "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-arm64-node26-abi147.tar.gz",
36
- "sha256": "b9e59ed55ff7530a3115ee1dd3d977b52cda023e02092a95510edb0aaa3ce694",
37
- "bytes": 113362578,
38
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-arm64-node26-abi147.tar.gz.sigstore.json",
39
- "attestationSha256": "d496134c96403a466c04ba28155e5d62b23402f8f177d131d6410a4474a5b963",
40
- "attestationBytes": 11364,
41
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-arm64-node26-abi147.tar.gz.build.sigstore.json",
42
- "buildProvenanceSha256": "3027b5fe9de703ac947cc66128a52c9330664f53c3cb17fafb42ddd47386b150",
43
- "buildProvenanceBytes": 11226,
44
- "metadataSha256": "d9e51ea4a646b4b192ceffb2a17e23c8cf33552a79fe92d8ba03e387b097a083",
35
+ "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-arm64-node26-abi147.tar.gz",
36
+ "sha256": "0248a6262edbffc9be63f43e335590dab0756452dcfb6759398f2e3da7eecf51",
37
+ "bytes": 113413199,
38
+ "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-arm64-node26-abi147.tar.gz.sigstore.json",
39
+ "attestationSha256": "0d9ab567902c18935f37316cd2da4ddcb2742da5838c79780dc2400f0020d5f3",
40
+ "attestationBytes": 11458,
41
+ "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-arm64-node26-abi147.tar.gz.build.sigstore.json",
42
+ "buildProvenanceSha256": "463f33249817e24ba7ce1736a05db4513bd1c4e6dc3ca542fc3e322538a9d1c4",
43
+ "buildProvenanceBytes": 11222,
44
+ "metadataSha256": "d9dfa2086681dc0e2581719bd376d69a37e7911e2a552b687b9bc00950cc19cc",
45
45
  "nativeToolchain": {
46
46
  "schemaVersion": 1,
47
- "builder": "github-hosted:macos-15:macos15:20260907.0337.1:ARM64",
47
+ "builder": "github-hosted:macos-15:macos15:20261028.0489.1:ARM64",
48
48
  "runnerLabel": "macos-15",
49
49
  "runnerImage": "macos15",
50
- "runnerImageVersion": "20260907.0337.1",
50
+ "runnerImageVersion": "20261028.0489.1",
51
51
  "runnerArch": "ARM64",
52
52
  "cc": "Apple clang version 17.0.0 (clang-1700.0.13.5)",
53
53
  "cxx": "Apple clang version 17.0.0 (clang-1700.0.13.5)",
54
54
  "linker": "@(#)PROGRAM:ld PROJECT:ld-1167.5",
55
- "python": "Python 3.14.7",
55
+ "python": "Python 3.15.2",
56
56
  "make": "GNU Make 3.81",
57
57
  "buildFlags": {
58
58
  "CC": "/Applications/Xcode_16.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang",
@@ -71,13 +71,13 @@
71
71
  "xcode": "Xcode 16.4\nBuild version 16F6",
72
72
  "sdk": "15.5"
73
73
  },
74
- "dependencyTreeSha256": "050cc55e9e547786b62742fc6d3141affa0afd2d98814a7e2730e9c68bdf37b6",
74
+ "dependencyTreeSha256": "ec88b938c1800ed4afff5cadc220f3ead4e046b5d1bb4ff90deeaefff2f0137f",
75
75
  "dependencyPackages": 463,
76
76
  "archiveFormat": "tar+gzip; portable; utf8-byte-order; normalized-mtime",
77
77
  "archiveValidation": {
78
78
  "policy": "agenc-runtime-archive-v1",
79
- "entries": 30322,
80
- "uncompressedBytes": 443406848
79
+ "entries": 30329,
80
+ "uncompressedBytes": 443621888
81
81
  },
82
82
  "minimumMacosVersion": "13.5",
83
83
  "bins": {
@@ -88,20 +88,20 @@
88
88
  {
89
89
  "platform": "darwin",
90
90
  "arch": "x64",
91
- "runtimeVersion": "0.19.21",
91
+ "runtimeVersion": "0.19.23",
92
92
  "nodeMajor": 26,
93
93
  "nodeModuleAbi": "147",
94
94
  "nodeApiVersion": "10",
95
- "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-x64-node26-abi147.tar.gz",
96
- "sha256": "87177daad3780bacf69c4174c56d65a3e7f77c83ee5de027d5d8063351baf1a7",
97
- "bytes": 115260100,
98
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-x64-node26-abi147.tar.gz.sigstore.json",
99
- "attestationSha256": "c21d1d5f2f88d703aa0d16f2c1469c94dea0c712f693990acbf287dbeeaa36dc",
100
- "attestationBytes": 11356,
101
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-darwin-x64-node26-abi147.tar.gz.build.sigstore.json",
102
- "buildProvenanceSha256": "ae6783e16000f7c2aabf34790bedd3592932f3d2621e2fa168cf4fc95adecfaa",
103
- "buildProvenanceBytes": 11222,
104
- "metadataSha256": "4c4c5b65a8684716765d27f2ffa55fb35ae6f5cb42b77351af1cf3f47e6dbe03",
95
+ "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-x64-node26-abi147.tar.gz",
96
+ "sha256": "5a23e71975d9b149607c701404ce9e4ec5aa0620a7467f29a829c235bb588b57",
97
+ "bytes": 115312509,
98
+ "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-x64-node26-abi147.tar.gz.sigstore.json",
99
+ "attestationSha256": "358d0a58a81d44ae7bdd2470a68e899552a7d65faf355d891b0032aaf5ffbdb0",
100
+ "attestationBytes": 11364,
101
+ "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-darwin-x64-node26-abi147.tar.gz.build.sigstore.json",
102
+ "buildProvenanceSha256": "2ca7e177188cbb9204399a7f8c3d174bd72a78ff474266c75842c35784c11fca",
103
+ "buildProvenanceBytes": 10991,
104
+ "metadataSha256": "50f08b1a2e1aeec4c901805fa7fdd370b55a649998a18aa93c6d9eb46c608db3",
105
105
  "nativeToolchain": {
106
106
  "schemaVersion": 1,
107
107
  "builder": "github-hosted:macos-15-intel:macos15:20260824.0482.1:X64",
@@ -131,13 +131,13 @@
131
131
  "xcode": "Xcode 16.4\nBuild version 16F6",
132
132
  "sdk": "15.5"
133
133
  },
134
- "dependencyTreeSha256": "2e51634e7f2de883f13cded3b9b0025a69b4216f9b8a92e7d821c087cfcce9d4",
134
+ "dependencyTreeSha256": "a9e567fdfe1c30ebe42f75d3db5ad8a1f4b0a33151df51cd1f39deb275b53978",
135
135
  "dependencyPackages": 463,
136
136
  "archiveFormat": "tar+gzip; portable; utf8-byte-order; normalized-mtime",
137
137
  "archiveValidation": {
138
138
  "policy": "agenc-runtime-archive-v1",
139
- "entries": 30322,
140
- "uncompressedBytes": 448370176
139
+ "entries": 30329,
140
+ "uncompressedBytes": 448564224
141
141
  },
142
142
  "minimumMacosVersion": "13.5",
143
143
  "bins": {
@@ -148,20 +148,20 @@
148
148
  {
149
149
  "platform": "linux",
150
150
  "arch": "arm64",
151
- "runtimeVersion": "0.19.21",
151
+ "runtimeVersion": "0.19.23",
152
152
  "nodeMajor": 26,
153
153
  "nodeModuleAbi": "147",
154
154
  "nodeApiVersion": "10",
155
- "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-arm64-node26-abi147.tar.gz",
156
- "sha256": "cf71fef60842d884764482c77b0a2064335f4472304201c4e9f2508aa774b19a",
157
- "bytes": 127605224,
158
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-arm64-node26-abi147.tar.gz.sigstore.json",
159
- "attestationSha256": "0c19a00bff03ba40b51d049ea05be794f6d4ff2b44d7f6ffb08f2dbaff9ffa5d",
160
- "attestationBytes": 11415,
161
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-arm64-node26-abi147.tar.gz.build.sigstore.json",
162
- "buildProvenanceSha256": "52e64b14d16c13de86832c85848fc19fb835103a524aacd260a1d1a75b37de94",
163
- "buildProvenanceBytes": 11124,
164
- "metadataSha256": "b0b6dd39692b700aede87588c80335368204fd48913387fd9588a420ab0d5e8c",
155
+ "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-arm64-node26-abi147.tar.gz",
156
+ "sha256": "a79d5e6d0e00c1662a30552b3d183a52d39b216bacf90562d8330151462f29b6",
157
+ "bytes": 127658722,
158
+ "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-arm64-node26-abi147.tar.gz.sigstore.json",
159
+ "attestationSha256": "22d6c2c9fb1eeb63efbd7e81f801c620e37cab0d6829958dd1d58a22c94ef9a6",
160
+ "attestationBytes": 11458,
161
+ "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-arm64-node26-abi147.tar.gz.build.sigstore.json",
162
+ "buildProvenanceSha256": "7daadf3fbb1db64d1f52c7b025d406ee7e6a2d008abddbf81509f8ec1d1e74de",
163
+ "buildProvenanceBytes": 10983,
164
+ "metadataSha256": "6aed394687355f1f48ff5d4411fff5bd085b6ff5e557ac2f095c3a7fbaba358c",
165
165
  "nativeToolchain": {
166
166
  "schemaVersion": 1,
167
167
  "builder": "rockylinux@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f2a2d04c+rpm-content-sha256:5829a1e40236ef0f7bc62ed3c6511bd3602a929e964cbb02cb3e0634df5a1c82",
@@ -203,13 +203,13 @@
203
203
  "tar-1.30-11.el8_10"
204
204
  ]
205
205
  },
206
- "dependencyTreeSha256": "d56934b0703d105023d90237269156d402e70ac48f660699596937223401549a",
206
+ "dependencyTreeSha256": "e33612ddecef279072acf7aaa82d13316767b0d10f5e1ae63ccd67e487e99b35",
207
207
  "dependencyPackages": 465,
208
208
  "archiveFormat": "tar+gzip; portable; utf8-byte-order; normalized-mtime",
209
209
  "archiveValidation": {
210
210
  "policy": "agenc-runtime-archive-v1",
211
- "entries": 30349,
212
- "uncompressedBytes": 467233792
211
+ "entries": 30355,
212
+ "uncompressedBytes": 467412992
213
213
  },
214
214
  "libcFamily": "glibc",
215
215
  "minimumGlibcVersion": "2.28",
@@ -224,20 +224,20 @@
224
224
  {
225
225
  "platform": "linux",
226
226
  "arch": "x64",
227
- "runtimeVersion": "0.19.21",
227
+ "runtimeVersion": "0.19.23",
228
228
  "nodeMajor": 26,
229
229
  "nodeModuleAbi": "147",
230
230
  "nodeApiVersion": "10",
231
- "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-x64-node26-abi147.tar.gz",
232
- "sha256": "66fd5a1088374be18929abb7580be6715d9fc15e60f93113b760a7cff3bd8f5a",
233
- "bytes": 127503817,
234
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-x64-node26-abi147.tar.gz.sigstore.json",
235
- "attestationSha256": "14b09df1feb07bc17cb99640807ea426d8e65ada284d5bbdd34c71dd2df1cf34",
236
- "attestationBytes": 11270,
237
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-linux-x64-node26-abi147.tar.gz.build.sigstore.json",
238
- "buildProvenanceSha256": "dee343c1afa3f0eb82e529b9884c28c272f3daa2b5ea391cb1b257a9267a8b63",
239
- "buildProvenanceBytes": 10979,
240
- "metadataSha256": "ee02d99dbc51b457873b5cfcf0097dd81e23982fb9fe7bad5a8617f73cacdb25",
231
+ "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-x64-node26-abi147.tar.gz",
232
+ "sha256": "ff78ce9c00ff341d406e0d78b9564ccd7a74091bfe65802964096ab0889fda3a",
233
+ "bytes": 127550846,
234
+ "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-x64-node26-abi147.tar.gz.sigstore.json",
235
+ "attestationSha256": "cad6df827462da0799c78f1ebd79813c5ab364e827f4f0c0028a68d1c529a687",
236
+ "attestationBytes": 11509,
237
+ "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-linux-x64-node26-abi147.tar.gz.build.sigstore.json",
238
+ "buildProvenanceSha256": "0df9c94fc46c739fc68d530f97e8f6085711192c948bd373cbcf6696de92d4ac",
239
+ "buildProvenanceBytes": 11073,
240
+ "metadataSha256": "b9aa9ce58796783ea4da9437078d6858f9d516262cc497b63505839a0e5c9f11",
241
241
  "nativeToolchain": {
242
242
  "schemaVersion": 1,
243
243
  "builder": "rockylinux@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f2a2d04c+rpm-content-sha256:dd68b6a5168f632115be67586491fc7813f984ba80b56db539cc03b3c4bbd05f",
@@ -279,13 +279,13 @@
279
279
  "tar-1.30-11.el8_10"
280
280
  ]
281
281
  },
282
- "dependencyTreeSha256": "94ff723062bda9013d3c89c3784f423d0a70c154872a3f1e4134ced35a07a4a8",
282
+ "dependencyTreeSha256": "06c972f96c5a5c259762b412b77a0e6d923c74a837395219a66ab318713a765f",
283
283
  "dependencyPackages": 465,
284
284
  "archiveFormat": "tar+gzip; portable; utf8-byte-order; normalized-mtime",
285
285
  "archiveValidation": {
286
286
  "policy": "agenc-runtime-archive-v1",
287
- "entries": 30349,
288
- "uncompressedBytes": 468907520
287
+ "entries": 30355,
288
+ "uncompressedBytes": 469086720
289
289
  },
290
290
  "libcFamily": "glibc",
291
291
  "minimumGlibcVersion": "2.28",
@@ -300,20 +300,20 @@
300
300
  {
301
301
  "platform": "win",
302
302
  "arch": "x64",
303
- "runtimeVersion": "0.19.21",
303
+ "runtimeVersion": "0.19.23",
304
304
  "nodeMajor": 26,
305
305
  "nodeModuleAbi": "147",
306
306
  "nodeApiVersion": "10",
307
- "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-win-x64-node26-abi147.tar.gz",
308
- "sha256": "5316edb1e1dfbd2fb0ba1c6453c9a1edf22b2ddd8bdb86770f1131fa52152342",
309
- "bytes": 109460255,
310
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-win-x64-node26-abi147.tar.gz.sigstore.json",
311
- "attestationSha256": "ff732ac3f3eb35762b5f32c603b939952d0fae954d3fe46605e11b888e55bfed",
312
- "attestationBytes": 11442,
313
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.21/agenc-runtime-0.19.21-win-x64-node26-abi147.tar.gz.build.sigstore.json",
314
- "buildProvenanceSha256": "6f16e6d1e6c6152336ad8003655427198d43f53fd3ef6f37c36b9cfdb9b63555",
315
- "buildProvenanceBytes": 11070,
316
- "metadataSha256": "cff618c3827b4f466212619bbfe6bc543bfe069d4e29c006b06e4efda2f6baa5",
307
+ "url": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-win-x64-node26-abi147.tar.gz",
308
+ "sha256": "c17961bee76b49cd96770c3a6b62c9822745b54496860c7c98d3b0d2fddcd344",
309
+ "bytes": 109506308,
310
+ "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-win-x64-node26-abi147.tar.gz.sigstore.json",
311
+ "attestationSha256": "792d6202022a1c6088c095bd9f7b5ff1faaaea0a872f54dfbdb7d98a437f9561",
312
+ "attestationBytes": 11489,
313
+ "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.23/agenc-runtime-0.19.23-win-x64-node26-abi147.tar.gz.build.sigstore.json",
314
+ "buildProvenanceSha256": "410c96d4673197c2506c7a8e68f9e8a9dd2af5daf9bcd1dd5fea4d06493a7993",
315
+ "buildProvenanceBytes": 11160,
316
+ "metadataSha256": "85202c25dc57a62ca421a54bba2b024577585add261775ce372c924c9f13c0f1",
317
317
  "nativeToolchain": {
318
318
  "schemaVersion": 1,
319
319
  "builder": "github-hosted:windows-2025-vs2026:win25-vs2026:20261021.278.1:X64",
@@ -355,13 +355,13 @@
355
355
  "msvcCompilerSha256": "b0a1818ebae6da7f18230a84e76ce839212584ac4c2ab55b97a0d5268085da57",
356
356
  "msvcLinkerSha256": "a8c42e25c91ca2453e1110540ac08f0fc12d7539454a11b9af8baeecb469837d"
357
357
  },
358
- "dependencyTreeSha256": "c8730eae71b04e3f51a8beac13af512fe531e4249acf637f0856ad7ee89314d5",
358
+ "dependencyTreeSha256": "66008c1901a20d7b7148bf5cb2cb3e1f0a7d28fac14f4e8c012f8badf1e1ce95",
359
359
  "dependencyPackages": 462,
360
360
  "archiveFormat": "tar+gzip; portable; utf8-byte-order; normalized-mtime",
361
361
  "archiveValidation": {
362
362
  "policy": "agenc-runtime-archive-v1",
363
- "entries": 30364,
364
- "uncompressedBytes": 405969408
363
+ "entries": 30370,
364
+ "uncompressedBytes": 406149120
365
365
  },
366
366
  "bins": {
367
367
  "agenc": "node_modules/@tetsuo-ai/runtime/bin/agenc",
@@ -0,0 +1,10 @@
1
+ export function beginRuntimeUpdate(home: string, pid?: number): Promise<string>;
2
+ export function endRuntimeUpdate(lease: string): void;
3
+ export function recordRuntimeActivation(home: string, current: string, previous?: string): boolean;
4
+ export function runtimeProcessInventory(root: string, options?: {
5
+ runCommand?: typeof import("node:child_process").execFile;
6
+ timeoutMs?: number;
7
+ helperPath?: string;
8
+ }): Promise<string>;
9
+ export interface RuntimePruneResult { removed: string[]; freedBytes: number; skipped?: string }
10
+ export function pruneRuntimes(home: string, options?: { inventory?: (root: string) => string | Promise<string>; checkpoint?: (step: string) => void }): Promise<RuntimePruneResult>;
@@ -0,0 +1,319 @@
1
+ // Cleanup is deliberately macOS-only. Keep Linux/Windows install semantics.
2
+ import { execFile } from "node:child_process";
3
+ import { randomUUID } from "node:crypto";
4
+ import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync,
5
+ readdirSync, realpathSync, renameSync, rmSync, writeFileSync, existsSync } from "node:fs";
6
+ import { join, dirname } from "node:path";
7
+ import { acquireLocalSqliteLock } from "./sqlite-lock.mjs";
8
+
9
+ const versionPattern = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
10
+ function privateDirectory(path, repairWritable = false) {
11
+ mkdirSync(path, { recursive: true, mode: 0o700 });
12
+ const stat = lstatSync(path);
13
+ if (!stat.isDirectory() || stat.isSymbolicLink() || realpathSync(path) !== path ||
14
+ stat.uid !== process.getuid()) {
15
+ throw new Error(`runtime maintenance directory is unsafe: ${path}`);
16
+ }
17
+ if ((stat.mode & 0o022) !== 0) {
18
+ if (!repairWritable) throw new Error(`runtime maintenance directory is writable: ${path}`);
19
+ const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
20
+ try {
21
+ const opened = fstatSync(fd);
22
+ if (opened.dev !== stat.dev || opened.ino !== stat.ino) throw new Error("maintenance directory identity changed");
23
+ fchmodSync(fd, 0o700);
24
+ } finally { closeSync(fd); }
25
+ }
26
+ }
27
+ function atomicJson(path, value) {
28
+ const temporary = `${path}.${process.pid}-${randomUUID()}`;
29
+ try {
30
+ const fd = openSync(temporary, "wx", 0o600);
31
+ try { writeFileSync(fd, JSON.stringify(value) + "\n"); fsyncSync(fd); }
32
+ finally { closeSync(fd); }
33
+ renameSync(temporary, path);
34
+ const parent = openSync(dirname(path), "r");
35
+ try { fsyncSync(parent); } finally { closeSync(parent); }
36
+ } finally { rmSync(temporary, { force: true }); }
37
+ }
38
+ function live(pid) {
39
+ try { process.kill(pid, 0); return true; }
40
+ catch (error) { return error.code !== "ESRCH"; }
41
+ }
42
+
43
+ // The same lock serializes lease creation and cleanup. A lease spans network
44
+ // download, verification, extraction and activation, including their lock gaps.
45
+ export async function beginRuntimeUpdate(home, pid = process.pid) {
46
+ const root = join(realpathSync(home), "runtime");
47
+ privateDirectory(root, true);
48
+ const release = await acquireLocalSqliteLock(join(root, ".maintenance-lock.sqlite"), {
49
+ label: "runtime maintenance", timeoutMs: 60_000,
50
+ });
51
+ try {
52
+ const directory = join(root, ".update-leases");
53
+ privateDirectory(directory);
54
+ if (!Number.isSafeInteger(pid) || pid <= 0) throw new Error("invalid update pid");
55
+ const path = join(directory, `${pid}-${randomUUID()}.json`);
56
+ atomicJson(path, { pid });
57
+ return path;
58
+ } finally { release(); }
59
+ }
60
+ export function endRuntimeUpdate(lease) { rmSync(lease, { force: true }); }
61
+
62
+ export function recordRuntimeActivation(home, current, previous) {
63
+ if (!versionPattern.test(current) || (previous !== undefined && !versionPattern.test(previous))) {
64
+ throw new Error("invalid runtime activation history");
65
+ }
66
+ const path = join(home, "runtime", ".activation-history.json");
67
+ let old;
68
+ try { old = JSON.parse(readFileSync(path, "utf8")); }
69
+ catch (error) { if (error.code !== "ENOENT") throw error; }
70
+ // Reinstalling the current release must not forget the rollback version.
71
+ if (previous === current || previous === undefined) {
72
+ previous = old?.current === current ? old.previous : old?.current;
73
+ }
74
+ if (old?.current === current && old?.previous === previous) return false;
75
+ atomicJson(path, { current, ...(previous === undefined ? {} : { previous }) });
76
+ return true;
77
+ }
78
+
79
+ function inventoryHelper(root) {
80
+ const { current } = JSON.parse(readFileSync(join(root, ".activation-history.json"), "utf8"));
81
+ if (!versionPattern.test(current)) throw new Error("invalid runtime activation history");
82
+ const version = join(root, current);
83
+ if (lstatSync(version).isSymbolicLink()) throw new Error("unsafe inventory helper parent");
84
+ for (const key of readdirSync(version)) {
85
+ if (!new RegExp(`^darwin-${process.arch}-native-node-abi-\\d+-sha256-[a-f0-9]{64}$`).test(key)) continue;
86
+ const tree = join(version, key);
87
+ if (lstatSync(tree).isSymbolicLink()) continue;
88
+ const marker = join(tree, ".agenc-runtime-ok");
89
+ if (!existsSync(marker) || lstatSync(marker).isSymbolicLink() ||
90
+ readFileSync(marker, "utf8").trim() !== key.slice(-64)) continue;
91
+ let helper = tree;
92
+ for (const part of ["node_modules", "@tetsuo-ai", "runtime", "dist", "agenc-runtime-inventory"]) {
93
+ helper = join(helper, part);
94
+ const stat = lstatSync(helper);
95
+ if (stat.isSymbolicLink() || stat.uid !== process.getuid() || (stat.mode & 0o022) !== 0) {
96
+ throw new Error("unsafe runtime inventory helper");
97
+ }
98
+ }
99
+ if (!lstatSync(helper).isFile()) throw new Error("invalid runtime inventory helper");
100
+ return helper;
101
+ }
102
+ throw new Error("runtime inventory helper unavailable");
103
+ }
104
+
105
+ // execFile's timeout still waits for exit/pipe closure. A process stuck in kernel
106
+ // I/O may never deliver either, even after SIGKILL. Own the deadline and detach
107
+ // every event-loop reference before returning an inconclusive inventory.
108
+ function inventoryCommand(file, args, deadline, runCommand) {
109
+ return new Promise((resolve, reject) => {
110
+ let child;
111
+ let settled = false;
112
+ const expire = () => {
113
+ if (settled) return;
114
+ settled = true;
115
+ reject(new Error("runtime usage inventory deadline exceeded"));
116
+ for (const cleanup of [
117
+ () => child?.kill("SIGKILL"),
118
+ () => child?.stdin?.destroy(),
119
+ () => child?.stdout?.destroy(),
120
+ () => child?.stderr?.destroy(),
121
+ () => child?.unref(),
122
+ ]) { try { cleanup(); } catch { /* detaching must not wait for the child */ } }
123
+ };
124
+ const remaining = deadline - performance.now();
125
+ if (remaining <= 0) { expire(); return; }
126
+ const timer = setTimeout(expire, Math.ceil(remaining));
127
+ try {
128
+ child = runCommand(file, args, {
129
+ encoding: "utf8", maxBuffer: 32 * 1024 * 1024,
130
+ }, (error, stdout, stderr) => {
131
+ if (settled) return;
132
+ if (performance.now() >= deadline) { expire(); return; }
133
+ settled = true;
134
+ clearTimeout(timer);
135
+ if (error || stderr !== "" || typeof stdout !== "string") {
136
+ reject(new Error("cannot establish running runtime usage", { cause: error }));
137
+ } else resolve(stdout);
138
+ });
139
+ } catch (error) {
140
+ settled = true;
141
+ clearTimeout(timer);
142
+ reject(error);
143
+ }
144
+ });
145
+ }
146
+
147
+ // Include command lines (JS entrypoints) plus per-PID open files, executable
148
+ // mappings, native addons and cwd. The helper walks only this runtime root to
149
+ // match inode aliases; it never enumerates mounts or stats unrelated paths.
150
+ // A failed, incomplete or truncated inventory disables all cleanup.
151
+ export async function runtimeProcessInventory(root, {
152
+ runCommand = execFile, timeoutMs = 30_000, helperPath,
153
+ } = {}) {
154
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647) {
155
+ throw new Error("invalid runtime inventory deadline");
156
+ }
157
+ const deadline = performance.now() + timeoutMs;
158
+ const ps = await inventoryCommand("/bin/ps", ["-axww", "-o", "pid=,command="], deadline, runCommand);
159
+ const files = await inventoryCommand(helperPath ?? inventoryHelper(root), [root], deadline, runCommand);
160
+ const complete = "AGENC_RUNTIME_INVENTORY_OK\n";
161
+ if (!files.endsWith(complete)) throw new Error("incomplete runtime usage inventory");
162
+ return ps + "\n" + files.slice(0, -complete.length);
163
+ }
164
+ function treeBytes(path) {
165
+ const stat = lstatSync(path);
166
+ if (stat.isSymbolicLink()) return stat.size;
167
+ if (!stat.isDirectory()) return stat.size;
168
+ return readdirSync(path).reduce((sum, name) => sum + treeBytes(join(path, name)), 0);
169
+ }
170
+
171
+ export async function pruneRuntimes(home, { inventory = runtimeProcessInventory, checkpoint = () => {} } = {}) {
172
+ const root = join(realpathSync(home), "runtime");
173
+ privateDirectory(root);
174
+ const release = await acquireLocalSqliteLock(join(root, ".maintenance-lock.sqlite"), {
175
+ label: "runtime maintenance", timeoutMs: 60_000,
176
+ });
177
+ let releaseActivation;
178
+ const result = { removed: [], freedBytes: 0, skipped: undefined };
179
+ try {
180
+ releaseActivation = await acquireLocalSqliteLock(join(root, ".activation-lock.sqlite"), {
181
+ label: "runtime prune activation", timeoutMs: 60_000,
182
+ });
183
+ if (existsSync(join(root, ".activation-transaction.json"))) {
184
+ return { ...result, skipped: "activation recovery pending" };
185
+ }
186
+ const leases = join(root, ".update-leases");
187
+ if (existsSync(leases)) {
188
+ privateDirectory(leases);
189
+ for (const name of readdirSync(leases)) {
190
+ const path = join(leases, name);
191
+ if (!lstatSync(path).isFile() || lstatSync(path).isSymbolicLink()) {
192
+ return { ...result, skipped: "unrecognized update lease" };
193
+ }
194
+ const lease = JSON.parse(readFileSync(path, "utf8"));
195
+ if (!Number.isSafeInteger(lease.pid) || lease.pid <= 0 || live(lease.pid)) {
196
+ return { ...result, skipped: "update in progress" };
197
+ }
198
+ rmSync(path);
199
+ }
200
+ }
201
+ const history = JSON.parse(readFileSync(join(root, ".activation-history.json"), "utf8"));
202
+ if (!versionPattern.test(history.current) || !versionPattern.test(history.previous)) {
203
+ return { ...result, skipped: "two successful activations not recorded" };
204
+ }
205
+ const usage = await inventory(root);
206
+ // Older updater binaries predate leases. Their full command line still
207
+ // identifies an update of this home. Exclude this completed updater itself.
208
+ if (usage.split("\n").some((line) => {
209
+ const command = /^\s*(\d+)\s+(.+)$/.exec(line);
210
+ return command !== null && Number(command[1]) !== process.pid &&
211
+ command[2].includes(root + "/") && /\/agenc(?:\.js)?\s+update(?:\s|$)/.test(command[2]);
212
+ })) return { ...result, skipped: "older updater in progress" };
213
+ for (const version of readdirSync(root)) {
214
+ if (!versionPattern.test(version)) continue;
215
+ const path = join(root, version);
216
+ const stat = lstatSync(path);
217
+ if (stat.isDirectory() && !stat.isSymbolicLink() &&
218
+ readdirSync(path).some((name) => name.startsWith("."))) {
219
+ return { ...result, skipped: "runtime extraction or recovery pending" };
220
+ }
221
+ }
222
+ const pruneJournal = join(root, ".prune-transaction.json");
223
+ const removeTree = async (version, treeName, quarantineName, recovering = false) => {
224
+ if (!versionPattern.test(version) ||
225
+ !/^(?:darwin|linux|win)-(?:arm64|x64)-(?:native|glibc)-node-abi-\d+-sha256-[a-f0-9]{64}$/.test(treeName) ||
226
+ !/^\.prune-[a-f0-9-]{36}$/.test(quarantineName)) {
227
+ throw new Error("invalid prune journal");
228
+ }
229
+ const versionDir = join(root, version), tree = join(versionDir, treeName);
230
+ const quarantine = join(root, quarantineName);
231
+ const syncParents = () => {
232
+ for (const path of [versionDir, root]) {
233
+ const fd = openSync(path, "r");
234
+ try { fsyncSync(fd); } finally { closeSync(fd); }
235
+ }
236
+ };
237
+ const restore = () => {
238
+ if (existsSync(quarantine)) {
239
+ if (existsSync(tree)) throw new Error("retained runtime has a pending quarantine copy");
240
+ renameSync(quarantine, tree);
241
+ syncParents();
242
+ }
243
+ rmSync(pruneJournal, { force: true });
244
+ };
245
+ if (version === history.current || version === history.previous) {
246
+ if (recovering) restore();
247
+ return;
248
+ }
249
+ const busy = (snapshot) => [versionDir, quarantine].some((path) =>
250
+ snapshot.includes(path + "/") || snapshot.includes(path + "\n"));
251
+ if (busy(await inventory(root))) {
252
+ if (recovering) restore();
253
+ throw new Error("runtime became busy before pruning");
254
+ }
255
+ if (lstatSync(versionDir).isSymbolicLink()) throw new Error("prune parent changed identity");
256
+ for (const path of [tree, quarantine]) {
257
+ if (existsSync(path) && (!lstatSync(path).isDirectory() || lstatSync(path).isSymbolicLink())) {
258
+ throw new Error("prune tree changed identity");
259
+ }
260
+ }
261
+ if (!recovering) atomicJson(pruneJournal, { version, treeName, quarantineName });
262
+ checkpoint("prune-recorded");
263
+ if (existsSync(tree)) {
264
+ if (existsSync(quarantine)) throw new Error("ambiguous prune recovery state");
265
+ renameSync(tree, quarantine);
266
+ syncParents();
267
+ }
268
+ checkpoint("prune-quarantined");
269
+ // Close the launch-versus-scan race: original launch paths are now absent.
270
+ // A process that entered before rename is visible by its old argv, open
271
+ // descriptors, executable mapping or cwd. Restore its tree instead.
272
+ let afterRename;
273
+ try { afterRename = await inventory(root); }
274
+ catch (error) { restore(); throw error; }
275
+ if (busy(afterRename)) {
276
+ restore();
277
+ throw new Error("runtime became busy during pruning");
278
+ }
279
+ const bytes = existsSync(quarantine) ? treeBytes(quarantine) : 0;
280
+ rmSync(quarantine, { recursive: true, force: true });
281
+ checkpoint("prune-removed");
282
+ rmSync(pruneJournal);
283
+ syncParents();
284
+ result.removed.push(tree);
285
+ result.freedBytes += bytes;
286
+ };
287
+ if (existsSync(pruneJournal)) {
288
+ if (!lstatSync(pruneJournal).isFile() || lstatSync(pruneJournal).isSymbolicLink()) throw new Error("unsafe prune journal");
289
+ const pending = JSON.parse(readFileSync(pruneJournal, "utf8"));
290
+ await removeTree(pending.version, pending.treeName, pending.quarantineName, true);
291
+ }
292
+ for (const name of readdirSync(root)) {
293
+ if (!versionPattern.test(name) || name === history.current || name === history.previous) continue;
294
+ const path = join(root, name);
295
+ const stat = lstatSync(path);
296
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.uid !== process.getuid()) continue;
297
+ // Preserve interrupted extraction/backup trees and their persistent lock
298
+ // identities. Never remove the version directory or SQLite lock files.
299
+ const children = readdirSync(path);
300
+ if (children.some((child) => child.startsWith("."))) continue;
301
+ if (usage.includes(path + "/") || usage.includes(path + "\n")) continue;
302
+ for (const child of children) {
303
+ if (!/^(?:darwin|linux|win)-(?:arm64|x64)-(?:native|glibc)-node-abi-\d+-sha256-[a-f0-9]{64}$/.test(child)) continue;
304
+ const tree = join(path, child);
305
+ const treeStat = lstatSync(tree);
306
+ if (!treeStat.isDirectory() || treeStat.isSymbolicLink()) continue;
307
+ const marker = join(tree, ".agenc-runtime-ok");
308
+ if (!existsSync(marker) || lstatSync(marker).isSymbolicLink() ||
309
+ readFileSync(marker, "utf8").trim() !== child.slice(-64)) continue;
310
+ // A durable per-tree journal makes interrupted recursive removal
311
+ // retryable even if the marker was removed before the crash.
312
+ await removeTree(name, child, `.prune-${randomUUID()}`);
313
+ }
314
+ }
315
+ return result;
316
+ } catch (error) {
317
+ return { ...result, skipped: error.message };
318
+ } finally { releaseActivation?.(); release(); }
319
+ }
@@ -0,0 +1,5 @@
1
+ export interface StableNodeDescription { readonly source: string; readonly sha256: string }
2
+ export function stableNodePath(home: string): string;
3
+ export function describeStableNode(home: string, source: string): StableNodeDescription;
4
+ export function installStableNode(home: string, description: StableNodeDescription,
5
+ checkpoint?: (step: string) => void): string;
@@ -0,0 +1,114 @@
1
+ // macOS keeps command-line privacy grants by executable path and code identity.
2
+ // Copy the verified release bytes. Never symlink, patch, strip, or re-sign Node.
3
+ import { createHash, randomUUID } from "node:crypto";
4
+ import { closeSync, constants, copyFileSync, fchmodSync, fsyncSync, lstatSync,
5
+ mkdirSync, openSync, readFileSync, readlinkSync, readdirSync, realpathSync, renameSync, rmSync, symlinkSync } from "node:fs";
6
+ import { basename, dirname, join, relative, resolve } from "node:path";
7
+
8
+ export function stableNodePath(home) { return join(home, "bin", "agenc-node"); }
9
+
10
+ function regular(path) {
11
+ const stat = lstatSync(path);
12
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1) {
13
+ throw new Error(`Node must be a regular unaliased file: ${path}`);
14
+ }
15
+ return stat;
16
+ }
17
+ function hash(path) {
18
+ regular(path);
19
+ return createHash("sha256").update(readFileSync(path)).digest("hex");
20
+ }
21
+ function syncDirectory(path) {
22
+ const fd = openSync(path, constants.O_RDONLY);
23
+ try { fsyncSync(fd); } finally { closeSync(fd); }
24
+ }
25
+
26
+ // A transaction stores only a source inside its verified content-addressed tree.
27
+ // Recovery rechecks identity.json and the pinned executable hash before copying.
28
+ export function describeStableNode(home, source) {
29
+ home = realpathSync(home);
30
+ const parts = relative(join(home, "runtime"), resolve(source)).split("/");
31
+ if (parts.length !== 6 || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(parts[0]) ||
32
+ !/^darwin-(?:arm64|x64)-native-node-abi-\d+-sha256-[a-f0-9]{64}$/.test(parts[1]) ||
33
+ parts.slice(2).join("/") !== "node_modules/.agenc-node/bin/node" ||
34
+ realpathSync(source) !== resolve(source)) {
35
+ throw new Error("stable Node source must be in a macOS content-addressed runtime");
36
+ }
37
+ const tree = join(home, "runtime", parts[0], parts[1]);
38
+ const marker = readFileSync(join(tree, ".agenc-runtime-ok"), "utf8").trim();
39
+ if (marker !== parts[1].slice(-64)) throw new Error("stable Node runtime marker mismatch");
40
+ const identityPath = join(dirname(dirname(source)), "identity.json");
41
+ regular(identityPath);
42
+ const identity = JSON.parse(readFileSync(identityPath, "utf8"));
43
+ if (identity.schemaVersion !== 1 || identity.executable !== "bin/node" ||
44
+ !/^[a-f0-9]{64}$/.test(identity.executableSha256) ||
45
+ regular(source).size !== identity.executableBytes ||
46
+ hash(source) !== identity.executableSha256) {
47
+ throw new Error("stable Node executable identity mismatch");
48
+ }
49
+ return { source: resolve(source), sha256: identity.executableSha256 };
50
+ }
51
+
52
+ function cleanupNodeStaging(directory) {
53
+ for (const name of readdirSync(directory)) {
54
+ const match = /^\.agenc-node-(\d+)-[a-f0-9-]{36}$/.exec(name);
55
+ if (match === null) continue;
56
+ try { process.kill(Number(match[1]), 0); continue; }
57
+ catch (error) { if (error.code !== "ESRCH") continue; }
58
+ const path = join(directory, name);
59
+ const stat = lstatSync(path);
60
+ if (stat.isFile() && !stat.isSymbolicLink() && stat.nlink === 1 && stat.uid === process.getuid()) {
61
+ rmSync(path);
62
+ }
63
+ }
64
+ }
65
+
66
+ function nodeAlias(target) {
67
+ const alias = join(dirname(target), "node");
68
+ try {
69
+ const stat = lstatSync(alias);
70
+ if (!stat.isSymbolicLink() || readlinkSync(alias) !== basename(target)) {
71
+ throw new Error("stable Node PATH alias is occupied");
72
+ }
73
+ } catch (error) {
74
+ if (error.code !== "ENOENT") throw error;
75
+ symlinkSync(basename(target), alias);
76
+ syncDirectory(dirname(target));
77
+ }
78
+ return target;
79
+ }
80
+
81
+ export function installStableNode(home, description, checkpoint = () => {}) {
82
+ const checked = describeStableNode(home, description.source);
83
+ if (checked.sha256 !== description.sha256) throw new Error("stable Node journal hash mismatch");
84
+ const target = stableNodePath(home);
85
+ const directory = dirname(target);
86
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
87
+ const stat = lstatSync(directory);
88
+ if (!stat.isDirectory() || stat.isSymbolicLink() || realpathSync(directory) !== directory ||
89
+ stat.uid !== process.getuid() || (stat.mode & 0o022) !== 0) {
90
+ throw new Error("stable Node directory is not private and canonical");
91
+ }
92
+ cleanupNodeStaging(directory);
93
+ try {
94
+ if (hash(target) === checked.sha256) return nodeAlias(target);
95
+ } catch (error) {
96
+ if (error.code !== "ENOENT") throw error;
97
+ }
98
+ const temporary = join(directory, `.${basename(target)}-${process.pid}-${randomUUID()}`);
99
+ try {
100
+ copyFileSync(checked.source, temporary, constants.COPYFILE_EXCL);
101
+ if (hash(temporary) !== checked.sha256) throw new Error("stable Node copy checksum mismatch");
102
+ const fd = openSync(temporary, constants.O_RDONLY | constants.O_NOFOLLOW);
103
+ try { fchmodSync(fd, 0o755); fsyncSync(fd); } finally { closeSync(fd); }
104
+ checkpoint("node-staged");
105
+ // rename preserves a running process's old executable mapping. Writing into
106
+ // the existing inode would invalidate signed executable pages on macOS.
107
+ renameSync(temporary, target);
108
+ syncDirectory(directory);
109
+ checkpoint("node-replaced");
110
+ return nodeAlias(target);
111
+ } finally {
112
+ rmSync(temporary, { force: true });
113
+ }
114
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tetsuo-ai/agenc",
3
- "version": "0.19.21",
3
+ "version": "0.19.23",
4
4
  "description": "Open source AI coding agent for your terminal. Works with any model provider, including local models.",
5
5
  "keywords": [
6
6
  "ai",
@@ -44,6 +44,10 @@
44
44
  "lib/runtime-archive.mjs",
45
45
  "lib/runtime-compatibility.mjs",
46
46
  "lib/runtime-manager.mjs",
47
+ "lib/runtime-maintenance.d.mts",
48
+ "lib/runtime-maintenance.mjs",
49
+ "lib/stable-node.d.mts",
50
+ "lib/stable-node.mjs",
47
51
  "lib/runtime-release-contract.d.mts",
48
52
  "lib/runtime-release-contract.mjs",
49
53
  "lib/sqlite-lock.d.mts",