@tetsuo-ai/agenc 0.19.19 → 0.19.21

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.
package/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # AgenC Core
2
2
 
3
- An open source AI coding agent for your terminal. It works with any model
3
+ Our goal is to multiply model capability per dollar of inference. AgenC is an
4
+ open source framework that improves how any model plans, uses tools and checks
5
+ its work.
6
+
7
+ AgenC Core is a coding agent for your terminal. It works with any model
4
8
  provider: 25 are built in, including OpenAI, Anthropic, xAI Grok, Gemini,
5
9
  DeepSeek, Venice and local models through Ollama or LM Studio.
6
10
 
package/bin/agenc CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { main } from "../src/launcher.mjs";
3
3
 
4
- try { process.title = "agenc-launcher"; } catch { /* platform may not support it */ }
4
+ // Darwin process-list readers can mistake environ for argv after a title write.
5
+ // Only use native titles on platforms with a separate, verified command line.
6
+ if (process.platform === "linux" || process.platform === "win32") {
7
+ try { process.title = "agenc-launcher"; } catch { /* platform may not support it */ }
8
+ }
5
9
  process.exitCode = await main();
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "manifestVersion": 2,
3
- "runtimeVersion": "0.19.19",
3
+ "runtimeVersion": "0.19.21",
4
4
  "releaseRepository": "tetsuo-ai/agenc-releases",
5
- "releaseTag": "agenc-v0.19.19",
5
+ "releaseTag": "agenc-v0.19.21",
6
6
  "build": {
7
- "sourceCommit": "56645d8190f8891cb81c1f48515872bddaf7e737",
8
- "sourceRef": "refs/tags/agenc-v0.19.19",
9
- "sourceDateEpoch": 1792903263,
10
- "lockfileSha256": "93a2bbbcff0f27b99668c8c4a66f3be6e5b740828fd4fbaa8b839f5c38429b3a",
7
+ "sourceCommit": "d8e4162e4c29489d2c6b5250e5eadc782d305a40",
8
+ "sourceRef": "refs/tags/agenc-v0.19.21",
9
+ "sourceDateEpoch": 1793232621,
10
+ "lockfileSha256": "cb46418b6dff9ed99c495586b33a80c335da04355230b97a0fe89b0d903cd07e",
11
11
  "nodeVersion": "v26.12.1",
12
12
  "nodeMajor": 26,
13
13
  "nodeModuleAbi": "147",
@@ -16,32 +16,32 @@
16
16
  "artifactProfile": "release",
17
17
  "releaseCandidate": {
18
18
  "workflow": "release-runtime.yml",
19
- "runId": 40165167044,
19
+ "runId": 40796791327,
20
20
  "runAttempt": 1,
21
- "runUrl": "https://github.com/tetsuo-ai/agenc-core/actions/runs/40165167044",
21
+ "runUrl": "https://github.com/tetsuo-ai/agenc-core/actions/runs/40796791327",
22
22
  "phase": "candidate",
23
23
  "sourceRef": "refs/heads/main",
24
- "evidenceSha256": "0b35a81821097ee2595929447ec3147c148535dae5f9eed088785bb7a4c2285a"
24
+ "evidenceSha256": "7dd68ec6937ae6dbb479c64dd776efa7cbc3a1bf619cc11c816de7f5885efd1c"
25
25
  }
26
26
  },
27
27
  "artifacts": [
28
28
  {
29
29
  "platform": "darwin",
30
30
  "arch": "arm64",
31
- "runtimeVersion": "0.19.19",
31
+ "runtimeVersion": "0.19.21",
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.19/agenc-runtime-0.19.19-darwin-arm64-node26-abi147.tar.gz",
36
- "sha256": "6318d6a14ab2699e3ef8e84b297c277f5f2372b85e4069cd81b2d777223e7784",
37
- "bytes": 113349339,
38
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-darwin-arm64-node26-abi147.tar.gz.sigstore.json",
39
- "attestationSha256": "22ca30b9f05ef16ec55fdd71c7b90b35bd2751f17a2780be1d412948f2b632ba",
40
- "attestationBytes": 11270,
41
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-darwin-arm64-node26-abi147.tar.gz.build.sigstore.json",
42
- "buildProvenanceSha256": "7cdadf53ec4fa211d1b2ca0579c998618f7e4e551aec7f0018c70755a6405825",
43
- "buildProvenanceBytes": 11136,
44
- "metadataSha256": "1a37ebc498e77d8c0af6f66aa431dbd10973cb6d893089ff41a3addc3d5bef77",
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",
45
45
  "nativeToolchain": {
46
46
  "schemaVersion": 1,
47
47
  "builder": "github-hosted:macos-15:macos15:20260907.0337.1:ARM64",
@@ -71,13 +71,13 @@
71
71
  "xcode": "Xcode 16.4\nBuild version 16F6",
72
72
  "sdk": "15.5"
73
73
  },
74
- "dependencyTreeSha256": "9bbc7756bfc31af69e21323f32efa5d639dbfa77f1102ec9227e887ed23cd30a",
74
+ "dependencyTreeSha256": "050cc55e9e547786b62742fc6d3141affa0afd2d98814a7e2730e9c68bdf37b6",
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
79
  "entries": 30322,
80
- "uncompressedBytes": 443378176
80
+ "uncompressedBytes": 443406848
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.19",
91
+ "runtimeVersion": "0.19.21",
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.19/agenc-runtime-0.19.19-darwin-x64-node26-abi147.tar.gz",
96
- "sha256": "5d1dafe0cf2739aff0961a2330228c849a5b6439f1bf5cd14cd7a35c362eea27",
97
- "bytes": 115251609,
98
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-darwin-x64-node26-abi147.tar.gz.sigstore.json",
99
- "attestationSha256": "f73442637ade5e38dd32f4e5e7355d4bdea916f9b4dc4a2f0e33e2266039abd4",
100
- "attestationBytes": 11501,
101
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-darwin-x64-node26-abi147.tar.gz.build.sigstore.json",
102
- "buildProvenanceSha256": "6b04bfe56feecdce88de0445ea5d62538ff6d2c647a78683a75d3bcb2715e823",
103
- "buildProvenanceBytes": 11167,
104
- "metadataSha256": "b381c499b662ea9c2902b27e48f712cde656aa01273043e6762caada486ca4fd",
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",
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": "6da334b79180ffe4215a926a543bb16df6b941e53e62b2d687f1d32410e8e724",
134
+ "dependencyTreeSha256": "2e51634e7f2de883f13cded3b9b0025a69b4216f9b8a92e7d821c087cfcce9d4",
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
139
  "entries": 30322,
140
- "uncompressedBytes": 448341504
140
+ "uncompressedBytes": 448370176
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.19",
151
+ "runtimeVersion": "0.19.21",
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.19/agenc-runtime-0.19.19-linux-arm64-node26-abi147.tar.gz",
156
- "sha256": "b5ccf0190e83e8c74fb212310de6eaf669c19275359af99d4eb53e7fefd8881c",
157
- "bytes": 127594869,
158
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-linux-arm64-node26-abi147.tar.gz.sigstore.json",
159
- "attestationSha256": "0270a8f159ec5cb8fdeef3968a4f4ff46c93e89039f07f2425b2c3a3173a34e6",
160
- "attestationBytes": 11321,
161
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-linux-arm64-node26-abi147.tar.gz.build.sigstore.json",
162
- "buildProvenanceSha256": "d8abcf865994908d3b8a8225f318a7d97eaade14faec6ca05f5cd62a0653589a",
163
- "buildProvenanceBytes": 11081,
164
- "metadataSha256": "b1d8e87453fb05923f913e187238557af0bd675c3d13b718fb3b7ee0a58dfafe",
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",
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": "a9bca64b3b600bdd5b12102aae6bf6d5ab83399406b1fa45524a5642e2d4d83a",
206
+ "dependencyTreeSha256": "d56934b0703d105023d90237269156d402e70ac48f660699596937223401549a",
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
211
  "entries": 30349,
212
- "uncompressedBytes": 467205120
212
+ "uncompressedBytes": 467233792
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.19",
227
+ "runtimeVersion": "0.19.21",
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.19/agenc-runtime-0.19.19-linux-x64-node26-abi147.tar.gz",
232
- "sha256": "c32754e1c614a7eb1f84f117a18c0890a9684358fa4d46ea36032908f0e4d095",
233
- "bytes": 127497620,
234
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-linux-x64-node26-abi147.tar.gz.sigstore.json",
235
- "attestationSha256": "99cab8abda4938c60cfc3e0c906add61ef037ed89ed43a9591577ef02e5494cc",
236
- "attestationBytes": 11309,
237
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-linux-x64-node26-abi147.tar.gz.build.sigstore.json",
238
- "buildProvenanceSha256": "00d5bf1dc88c4574ede2acf90892b0e12596e650960199c458b5a93e32305541",
239
- "buildProvenanceBytes": 11175,
240
- "metadataSha256": "69105965131049b1dfff3170494d094d2e0bef783ae1f0787f898155cc801118",
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",
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": "17f7b123d8e3ce777cd952e2f7fd1845bbcbccd352da4452007cedc8b056825a",
282
+ "dependencyTreeSha256": "94ff723062bda9013d3c89c3784f423d0a70c154872a3f1e4134ced35a07a4a8",
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
287
  "entries": 30349,
288
- "uncompressedBytes": 468878848
288
+ "uncompressedBytes": 468907520
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.19",
303
+ "runtimeVersion": "0.19.21",
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.19/agenc-runtime-0.19.19-win-x64-node26-abi147.tar.gz",
308
- "sha256": "ceab3d15c333dff170c193c16d1077ff12bca1d136aeca4344d94fb43b350509",
309
- "bytes": 109451856,
310
- "attestationUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-win-x64-node26-abi147.tar.gz.sigstore.json",
311
- "attestationSha256": "d7116357d7a1e69a72ac8d4ce980413d1cbd32d70f2921061ba43b1228f2485a",
312
- "attestationBytes": 11301,
313
- "buildProvenanceUrl": "https://github.com/tetsuo-ai/agenc-releases/releases/download/agenc-v0.19.19/agenc-runtime-0.19.19-win-x64-node26-abi147.tar.gz.build.sigstore.json",
314
- "buildProvenanceSha256": "5892a99426876ba774f6f3fa4a8d9bc2bc7cc51c2cafd8f2443a09ece39fe9f3",
315
- "buildProvenanceBytes": 10972,
316
- "metadataSha256": "10cf402444536f3eb16baa3789314520eb307da6f2a397f4c7231557bee5204d",
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",
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": "daa6a7df6f5196c75a06ebd1995751a5adf277986fba01f5492aaf42cf197227",
358
+ "dependencyTreeSha256": "c8730eae71b04e3f51a8beac13af512fe531e4249acf637f0856ad7ee89314d5",
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
363
  "entries": 30364,
364
- "uncompressedBytes": 405940736
364
+ "uncompressedBytes": 405969408
365
365
  },
366
366
  "bins": {
367
367
  "agenc": "node_modules/@tetsuo-ai/runtime/bin/agenc",
@@ -40,6 +40,7 @@ const REGISTRY_VERSION = 1;
40
40
  const REGISTRY_SYMBOL = Symbol.for("@tetsuo-ai/agenc.sqlite-lock-registry");
41
41
  const MAX_BUSY_RETRY_MS = 50;
42
42
  const MAX_TIMER_DELAY_MS = 2_147_483_647;
43
+ const DARWIN_FILESYSTEM_PROBE_TIMEOUT_MS = 2_000;
43
44
  const UNSUPPORTED_FILE_ID_64 = 0xffff_ffff_ffff_ffffn;
44
45
  const WINDOWS_PATH_TRANSPORT_MAX_CHARS = 16_384;
45
46
  const WINDOWS_PATH_TRANSPORT_MAX_ENTRIES = 128;
@@ -338,10 +339,7 @@ function execFileUtf8(file, args, options, context, path) {
338
339
  { ...options, encoding: "utf8" },
339
340
  (error, stdout, stderr) => {
340
341
  if (deadlineTimer !== undefined) clearTimeout(deadlineTimer);
341
- if (expired) {
342
- rejectRun(timeoutError(context, path, error ?? undefined));
343
- return;
344
- }
342
+ if (expired) return;
345
343
  if (error !== null) {
346
344
  Object.assign(error, { stdout, stderr });
347
345
  rejectRun(error);
@@ -354,7 +352,15 @@ function execFileUtf8(file, args, options, context, path) {
354
352
  const remaining = remainingMilliseconds(context);
355
353
  if (remaining <= 0) {
356
354
  expired = true;
357
- child.kill();
355
+ // A helper stuck in kernel I/O may never exit, even after SIGKILL.
356
+ // Settle at our deadline and release every event-loop reference rather
357
+ // than waiting for execFile's exit/stdio-close callback.
358
+ rejectRun(timeoutError(context, path));
359
+ child.kill("SIGKILL");
360
+ child.stdin?.destroy();
361
+ child.stdout?.destroy();
362
+ child.stderr?.destroy();
363
+ child.unref();
358
364
  return;
359
365
  }
360
366
  deadlineTimer = setTimeout(
@@ -694,6 +700,13 @@ async function assertWindowsPathSecurity(entries, context) {
694
700
  throwIfExpired(context, displayPath);
695
701
  }
696
702
 
703
+ function unsupportedLockFilesystem(parent, filesystemType, cause) {
704
+ return new Error(
705
+ `agenc: non-local or unknown lock filesystem is unsupported (${filesystemType ?? "unknown"}): ${parent}`,
706
+ cause === undefined ? undefined : { cause },
707
+ );
708
+ }
709
+
697
710
  async function assertLocalFilesystem(parent, context) {
698
711
  throwIfExpired(context, parent);
699
712
  let filesystemType;
@@ -716,26 +729,53 @@ async function assertLocalFilesystem(parent, context) {
716
729
  }
717
730
  }
718
731
  } else if (process.platform === "darwin") {
719
- let stdout;
732
+ const probeStartedAt = performance.now();
733
+ const probeDeadline = Math.min(
734
+ context.deadline,
735
+ probeStartedAt + DARWIN_FILESYSTEM_PROBE_TIMEOUT_MS,
736
+ );
737
+ const probeContext = {
738
+ ...context,
739
+ deadline: probeDeadline,
740
+ timeoutMs: Math.min(
741
+ DARWIN_FILESYSTEM_PROBE_TIMEOUT_MS,
742
+ Math.max(1, Math.ceil(probeDeadline - probeStartedAt)),
743
+ ),
744
+ label: `${context.label} (macOS lock filesystem probe via /bin/df)`,
745
+ };
746
+ let result;
720
747
  try {
721
- ({ stdout } = await execFileUtf8("/sbin/mount", [], {
722
- env: { LC_ALL: "C" },
723
- maxBuffer: 4 * 1024 * 1024,
724
- }, context, parent));
748
+ // With an existing directory operand, df calls statfs on that path.
749
+ // -T filters f_fstypename against our exact allowlist, including on
750
+ // supported macOS versions that cannot print the type with df -Y.
751
+ // Never use a bare mount/df or df -l: unrelated filesystems may be stuck.
752
+ result = await execFileUtf8(
753
+ "/bin/df",
754
+ ["-P", "-T", [...LOCAL_FILESYSTEM_TYPES].join(","), parent],
755
+ { env: { LC_ALL: "C" }, maxBuffer: 64 * 1024 },
756
+ probeContext,
757
+ parent,
758
+ );
725
759
  } catch (error) {
726
- throw normalizeTimedCommandError(error, context, parent);
760
+ const normalized = normalizeTimedCommandError(error, probeContext, parent);
761
+ if (normalized instanceof LocalSqliteLockTimeoutError) throw normalized;
762
+ throw unsupportedLockFilesystem(parent, undefined, normalized);
727
763
  }
728
- throwIfExpired(context, parent);
729
- let longest = -1;
730
- for (const line of stdout.split("\n")) {
731
- const match = line.match(/ on (.+) \(([^,]+)/);
732
- if (match === null) continue;
733
- const mountPoint = decodeMountPath(match[1]);
734
- if (pathIsWithin(parent, mountPoint) && mountPoint.length > longest) {
735
- longest = mountPoint.length;
736
- filesystemType = match[2];
737
- }
764
+ throwIfExpired(probeContext, parent);
765
+ const lines = result.stdout.split("\n");
766
+ if (lines.at(-1) === "") lines.pop();
767
+ const row = lines[1]?.match(/^.+[\t ]+\d+[\t ]+\d+[\t ]+-?\d+[\t ]+\d+%[\t ]+(\/.*)$/u);
768
+ // The type was checked by df on the operand itself. Do not infer it from
769
+ // the printed mount point: APFS firmlinks can map /Users to the Data volume
770
+ // mounted at /System/Volumes/Data without changing realpath(/Users/...).
771
+ if (
772
+ result.stderr !== "" || lines.length !== 2 ||
773
+ !/^Filesystem[\t ]+512-blocks[\t ]+Used[\t ]+Avail(?:able)?[\t ]+Capacity[\t ]+Mounted on$/u.test(lines[0]) ||
774
+ row == null
775
+ ) {
776
+ throw unsupportedLockFilesystem(parent);
738
777
  }
778
+ return;
739
779
  } else if (process.platform === "win32") {
740
780
  await assertWindowsPathSecurity([{ path: parent, role: "leafDirectory" }], context);
741
781
  return;
@@ -745,9 +785,7 @@ async function assertLocalFilesystem(parent, context) {
745
785
  );
746
786
  }
747
787
  if (filesystemType === undefined || !LOCAL_FILESYSTEM_TYPES.has(filesystemType)) {
748
- throw new Error(
749
- `agenc: non-local or unknown lock filesystem is unsupported (${filesystemType ?? "unknown"}): ${parent}`,
750
- );
788
+ throw unsupportedLockFilesystem(parent, filesystemType);
751
789
  }
752
790
  }
753
791
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tetsuo-ai/agenc",
3
- "version": "0.19.19",
3
+ "version": "0.19.21",
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",