@nexrall/code-core 1.4.71 → 1.4.73

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 (126) hide show
  1. package/dist/agent/agentRegistry.d.ts.map +1 -1
  2. package/dist/agent/agentRegistry.js +28 -10
  3. package/dist/agent/agentTypes.d.ts.map +1 -1
  4. package/dist/agent/agentTypes.js +159 -48
  5. package/dist/agent/askOnce.d.ts.map +1 -1
  6. package/dist/agent/askOnce.js +14 -5
  7. package/dist/agent/backgroundAgents.d.ts.map +1 -1
  8. package/dist/agent/backgroundAgents.js +22 -8
  9. package/dist/agent/claimEvidence.d.ts.map +1 -1
  10. package/dist/agent/claimEvidence.js +2 -1
  11. package/dist/agent/compaction.d.ts.map +1 -1
  12. package/dist/agent/compaction.js +31 -10
  13. package/dist/agent/crossProcessLock.d.ts.map +1 -1
  14. package/dist/agent/crossProcessLock.js +14 -6
  15. package/dist/agent/editCompleteness.d.ts.map +1 -1
  16. package/dist/agent/fileLocks.d.ts.map +1 -1
  17. package/dist/agent/fileLocks.js +14 -5
  18. package/dist/agent/flaky.d.ts.map +1 -1
  19. package/dist/agent/hooks.d.ts.map +1 -1
  20. package/dist/agent/hooks.js +284 -75
  21. package/dist/agent/iterationPolicy.d.ts.map +1 -1
  22. package/dist/agent/iterationPolicy.js +26 -23
  23. package/dist/agent/lifecycleHost.d.ts.map +1 -1
  24. package/dist/agent/lifecycleHost.js +35 -11
  25. package/dist/agent/loop.d.ts +22 -4
  26. package/dist/agent/loop.d.ts.map +1 -1
  27. package/dist/agent/loop.js +238 -51
  28. package/dist/agent/memory.d.ts.map +1 -1
  29. package/dist/agent/memory.js +13 -7
  30. package/dist/agent/modelCatalogue.d.ts.map +1 -1
  31. package/dist/agent/modelCatalogue.js +4 -1
  32. package/dist/agent/nestedInstructions.d.ts +122 -0
  33. package/dist/agent/nestedInstructions.d.ts.map +1 -0
  34. package/dist/agent/nestedInstructions.js +696 -0
  35. package/dist/agent/peerRegistry.d.ts.map +1 -1
  36. package/dist/agent/peerRegistry.js +44 -6
  37. package/dist/agent/peerTransport.d.ts.map +1 -1
  38. package/dist/agent/peerTransport.js +18 -6
  39. package/dist/agent/planMode.d.ts.map +1 -1
  40. package/dist/agent/planMode.js +194 -41
  41. package/dist/agent/readDedupe.d.ts.map +1 -1
  42. package/dist/agent/readDedupe.js +3 -1
  43. package/dist/agent/securityLint.d.ts.map +1 -1
  44. package/dist/agent/sharedTasks.d.ts.map +1 -1
  45. package/dist/agent/sharedTasks.js +20 -5
  46. package/dist/agent/skills.d.ts +79 -0
  47. package/dist/agent/skills.d.ts.map +1 -1
  48. package/dist/agent/skills.js +403 -14
  49. package/dist/agent/subAgentBudget.d.ts.map +1 -1
  50. package/dist/agent/subTask.d.ts.map +1 -1
  51. package/dist/agent/subTask.js +87 -37
  52. package/dist/agent/subTaskSupport.d.ts.map +1 -1
  53. package/dist/agent/subTaskSupport.js +43 -14
  54. package/dist/agent/testIntegrity.d.ts.map +1 -1
  55. package/dist/agent/testIntegrity.js +4 -2
  56. package/dist/agent/toolDescriptions.d.ts.map +1 -1
  57. package/dist/agent/toolPrefetch.d.ts.map +1 -1
  58. package/dist/agent/toolPrefetch.js +15 -11
  59. package/dist/agent/trust.d.ts.map +1 -1
  60. package/dist/agent/trust.js +6 -2
  61. package/dist/agent/worktree.d.ts.map +1 -1
  62. package/dist/agent/worktree.js +70 -16
  63. package/dist/agent/worktreeEnforcement.d.ts.map +1 -1
  64. package/dist/agent/worktreeEnforcement.js +9 -4
  65. package/dist/api/client.d.ts +6 -0
  66. package/dist/api/client.d.ts.map +1 -1
  67. package/dist/api/client.js +64 -31
  68. package/dist/auth/index.d.ts.map +1 -1
  69. package/dist/auth/index.js +3 -1
  70. package/dist/checkpoint/manager.d.ts.map +1 -1
  71. package/dist/checkpoint/manager.js +22 -7
  72. package/dist/commands/loader.d.ts.map +1 -1
  73. package/dist/commands/loader.js +6 -1
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +2 -0
  77. package/dist/mcp/client.d.ts +42 -0
  78. package/dist/mcp/client.d.ts.map +1 -1
  79. package/dist/mcp/client.js +89 -24
  80. package/dist/mcp/httpClient.d.ts +24 -1
  81. package/dist/mcp/httpClient.d.ts.map +1 -1
  82. package/dist/mcp/httpClient.js +80 -14
  83. package/dist/mcp/instructions.d.ts +11 -0
  84. package/dist/mcp/instructions.d.ts.map +1 -0
  85. package/dist/mcp/instructions.js +42 -0
  86. package/dist/mcp/manager.d.ts +35 -0
  87. package/dist/mcp/manager.d.ts.map +1 -1
  88. package/dist/mcp/manager.js +135 -24
  89. package/dist/mcp/server.d.ts.map +1 -1
  90. package/dist/mcp/server.js +48 -14
  91. package/dist/mcp/sseClient.d.ts +9 -1
  92. package/dist/mcp/sseClient.d.ts.map +1 -1
  93. package/dist/mcp/sseClient.js +43 -10
  94. package/dist/mcp/stats.d.ts.map +1 -1
  95. package/dist/permissions/bashClassify.d.ts.map +1 -1
  96. package/dist/permissions/bashClassify.js +25 -3
  97. package/dist/permissions/destructive.d.ts.map +1 -1
  98. package/dist/permissions/destructive.js +7 -2
  99. package/dist/permissions/destructiveTokens.d.ts.map +1 -1
  100. package/dist/permissions/destructiveTokens.js +104 -24
  101. package/dist/permissions/modePolicy.d.ts.map +1 -1
  102. package/dist/permissions/modePolicy.js +40 -17
  103. package/dist/permissions/rules.d.ts.map +1 -1
  104. package/dist/permissions/rules.js +7 -5
  105. package/dist/plugins/data.d.ts.map +1 -1
  106. package/dist/plugins/data.js +6 -2
  107. package/dist/plugins/index.d.ts.map +1 -1
  108. package/dist/plugins/index.js +18 -7
  109. package/dist/plugins/installer.d.ts.map +1 -1
  110. package/dist/plugins/installer.js +17 -10
  111. package/dist/plugins/sources.d.ts.map +1 -1
  112. package/dist/plugins/sources.js +9 -3
  113. package/dist/tools/executor.d.ts.map +1 -1
  114. package/dist/tools/executor.js +454 -168
  115. package/dist/tools/sandbox.d.ts.map +1 -1
  116. package/dist/tools/sandbox.js +5 -1
  117. package/dist/tools/symbols.d.ts.map +1 -1
  118. package/dist/tools/symbols.js +30 -8
  119. package/dist/tools/tsLangService.d.ts.map +1 -1
  120. package/dist/tools/tsLangService.js +12 -4
  121. package/dist/types.d.ts +17 -0
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/util/frontmatter.d.ts.map +1 -1
  124. package/dist/util/miniYaml.d.ts.map +1 -1
  125. package/dist/util/miniYaml.js +3 -1
  126. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"peerRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/peerRegistry.ts"],"names":[],"mappings":"AA2CA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yJAAyJ;IACzJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtC;AAMD,iBAAS,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAG7C;AA0BD,8FAA8F;AAC9F,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,+IAA+I;IAC/I,SAAS,IAAI,IAAI,CAAC;IAClB,sJAAsJ;IACtJ,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC9C,mKAAmK;IACnK,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAyClE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAwBtD;AAED,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE9D;AAED,eAAO,MAAM,qBAAqB;;;;;;CAAsF,CAAC"}
1
+ {"version":3,"file":"peerRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/peerRegistry.ts"],"names":[],"mappings":"AA2CA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yJAAyJ;IACzJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtC;AAWD,iBAAS,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAG7C;AAoDD,8FAA8F;AAC9F,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,+IAA+I;IAC/I,SAAS,IAAI,IAAI,CAAC;IAClB,sJAAsJ;IACtJ,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC9C,mKAAmK;IACnK,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAiDlE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCtD;AAED,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE9D;AAED,eAAO,MAAM,qBAAqB;;;;;;CAMjC,CAAC"}
@@ -127,8 +127,34 @@ function writeRecord(r) {
127
127
  fs.writeFileSync(tmp, JSON.stringify(r));
128
128
  fs.renameSync(tmp, p);
129
129
  }
130
- const ADJECTIVES = ['graceful', 'quiet', 'brave', 'calm', 'swift', 'keen', 'bold', 'clear', 'gentle', 'sharp', 'steady', 'curious'];
131
- const NOUNS = ['unicorn', 'falcon', 'otter', 'harbor', 'meadow', 'ember', 'summit', 'cedar', 'quartz', 'heron', 'lynx', 'delta'];
130
+ const ADJECTIVES = [
131
+ 'graceful',
132
+ 'quiet',
133
+ 'brave',
134
+ 'calm',
135
+ 'swift',
136
+ 'keen',
137
+ 'bold',
138
+ 'clear',
139
+ 'gentle',
140
+ 'sharp',
141
+ 'steady',
142
+ 'curious',
143
+ ];
144
+ const NOUNS = [
145
+ 'unicorn',
146
+ 'falcon',
147
+ 'otter',
148
+ 'harbor',
149
+ 'meadow',
150
+ 'ember',
151
+ 'summit',
152
+ 'cedar',
153
+ 'quartz',
154
+ 'heron',
155
+ 'lynx',
156
+ 'delta',
157
+ ];
132
158
  /** Generate a readable random peer name, same shape Claude Code uses ("graceful-unicorn"). */
133
159
  function randomPeerName() {
134
160
  const a = ADJECTIVES[crypto.randomInt(ADJECTIVES.length)];
@@ -160,7 +186,9 @@ function registerPeer(opts) {
160
186
  }
161
187
  const now = Date.now();
162
188
  const record = {
163
- id, name, pid: process.pid,
189
+ id,
190
+ name,
191
+ pid: process.pid,
164
192
  clientType: opts.clientType,
165
193
  workDir: opts.workDir,
166
194
  socketPath: opts.socketPath,
@@ -185,7 +213,9 @@ function registerPeer(opts) {
185
213
  try {
186
214
  fs.unlinkSync(recordPath(id));
187
215
  }
188
- catch { /* already gone */ }
216
+ catch {
217
+ /* already gone */
218
+ }
189
219
  },
190
220
  };
191
221
  }
@@ -222,7 +252,9 @@ function listPeers(ownId) {
222
252
  try {
223
253
  fs.unlinkSync(recordPath(id));
224
254
  }
225
- catch { /* raced with another GC — fine */ }
255
+ catch {
256
+ /* raced with another GC — fine */
257
+ }
226
258
  }
227
259
  }
228
260
  if (ownId) {
@@ -234,5 +266,11 @@ function listPeers(ownId) {
234
266
  function findPeerByName(name) {
235
267
  return listPeers().find((p) => p.name === name) ?? null;
236
268
  }
237
- exports._peerRegistryInternal = { peersRoot, recordPath, isRecordAlive, HEARTBEAT_STALE_MS, HEARTBEAT_INTERVAL_MS };
269
+ exports._peerRegistryInternal = {
270
+ peersRoot,
271
+ recordPath,
272
+ isRecordAlive,
273
+ HEARTBEAT_STALE_MS,
274
+ HEARTBEAT_INTERVAL_MS,
275
+ };
238
276
  //# sourceMappingURL=peerRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"peerTransport.d.ts","sourceRoot":"","sources":["../../src/agent/peerTransport.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AA+CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CA8EhF;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAkChC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B;AAED,eAAO,MAAM,sBAAsB;;;;;CAA2E,CAAC"}
1
+ {"version":3,"file":"peerTransport.d.ts","sourceRoot":"","sources":["../../src/agent/peerTransport.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AA+CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAgGhF;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAqChC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B;AAED,eAAO,MAAM,sBAAsB;;;;;CAA2E,CAAC"}
@@ -215,7 +215,9 @@ function startPeerInbox(peerId, opts) {
215
215
  try {
216
216
  fs.unlinkSync(socketPath);
217
217
  }
218
- catch { /* did not exist */ }
218
+ catch {
219
+ /* did not exist */
220
+ }
219
221
  }
220
222
  // No directory/stale-file handling needed on Windows — named pipes have no
221
223
  // on-disk path component (see socketPathFor's doc comment), and a stale
@@ -247,10 +249,14 @@ function startPeerInbox(peerId, opts) {
247
249
  });
248
250
  }
249
251
  }
250
- catch { /* malformed message — drop silently, same as a corrupt network packet */ }
252
+ catch {
253
+ /* malformed message — drop silently, same as a corrupt network packet */
254
+ }
251
255
  conn.end();
252
256
  });
253
- conn.on('error', () => { });
257
+ conn.on('error', () => {
258
+ /* peer disconnected mid-write — nothing to recover */
259
+ });
254
260
  });
255
261
  server.listen(socketPath, () => {
256
262
  if (isWindows)
@@ -261,14 +267,18 @@ function startPeerInbox(peerId, opts) {
261
267
  try {
262
268
  fs.chmodSync(socketPath, 0o600);
263
269
  }
264
- catch { /* best-effort on platforms without POSIX chmod semantics */ }
270
+ catch {
271
+ /* best-effort on platforms without POSIX chmod semantics */
272
+ }
265
273
  });
266
274
  // See PeerInboxOptions.onError's own comment for why this used to be a
267
275
  // pure no-op (`() => {}`) and why that was a real bug, not a deliberate
268
276
  // simplification: `listen()` failing (EINVAL for an over-length path,
269
277
  // EADDRINUSE, EACCES, ...) used to be indistinguishable from success from
270
278
  // this function's return value alone.
271
- server.on('error', (err) => { opts.onError?.(err instanceof Error ? err : new Error(String(err))); });
279
+ server.on('error', (err) => {
280
+ opts.onError?.(err instanceof Error ? err : new Error(String(err)));
281
+ });
272
282
  return {
273
283
  socketPath,
274
284
  close() {
@@ -286,7 +296,9 @@ function startPeerInbox(peerId, opts) {
286
296
  try {
287
297
  fs.unlinkSync(socketPath);
288
298
  }
289
- catch { /* already gone, or never existed (Windows) */ }
299
+ catch {
300
+ /* already gone, or never existed (Windows) */
301
+ }
290
302
  },
291
303
  };
292
304
  }
@@ -1 +1 @@
1
- {"version":3,"file":"planMode.d.ts","sourceRoot":"","sources":["../../src/agent/planMode.ts"],"names":[],"mappings":"AAiJA,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,MAAM,EAAE,eAAe,GAAG,oBAAoB,CAAC;IAC/C,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAqFD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA8D1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,eAAe,GAAG,IAAI,CAoCxB;AAED,oEAAoE;AACpE,eAAO,MAAM,sBAAsB,QAqBvB,CAAC"}
1
+ {"version":3,"file":"planMode.d.ts","sourceRoot":"","sources":["../../src/agent/planMode.ts"],"names":[],"mappings":"AAwOA,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,MAAM,EAAE,eAAe,GAAG,oBAAoB,CAAC;IAC/C,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAuKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA8D1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,IAAI,CAoClG;AAED,oEAAoE;AACpE,eAAO,MAAM,sBAAsB,QAqBvB,CAAC"}
@@ -31,18 +31,26 @@ exports.checkPlanMode = checkPlanMode;
31
31
  * and the refusal is visible the first time anybody tries it.
32
32
  */
33
33
  const READ_ONLY_TOOLS = new Set([
34
- 'read_file', 'search_files', 'glob', 'list_directory', 'notebook_read',
34
+ 'read_file',
35
+ 'search_files',
36
+ 'glob',
37
+ 'list_directory',
38
+ 'notebook_read',
35
39
  // Planning bookkeeping. todo_write persists only to the session's own todo
36
40
  // list, not the repo, so it stays available — a plan mode that cannot draft
37
41
  // a checklist is missing the point of plan mode.
38
- 'todo_write', 'todo_read',
39
- 'cron_list', 'mcp_list_resources', 'mcp_read_resource',
42
+ 'todo_write',
43
+ 'todo_read',
44
+ 'cron_list',
45
+ 'mcp_list_resources',
46
+ 'mcp_read_resource',
40
47
  // Reading memory is fine; memory_write is NOT here on purpose. Memory is
41
48
  // durable state that survives the session, so writing it is a real mutation
42
49
  // even though no file in the repo changes.
43
50
  'memory_read',
44
51
  'use_skill',
45
- 'fetch_url', 'web_search',
52
+ 'fetch_url',
53
+ 'web_search',
46
54
  // Delegating research is ALLOWED, and this is safe rather than a hole:
47
55
  // runSubTask passes planMode down, so the sub-agent is under the same lock and
48
56
  // its own write tools are refused by this very function one level deeper.
@@ -53,8 +61,12 @@ const READ_ONLY_TOOLS = new Set([
53
61
  // the mode's headline use case worse, for no security gain.
54
62
  'task',
55
63
  // VS Code language server — all pure queries.
56
- 'get_symbols', 'get_workspace_symbols', 'find_references', 'go_to_definition',
57
- 'get_hover', 'get_diagnostics',
64
+ 'get_symbols',
65
+ 'get_workspace_symbols',
66
+ 'find_references',
67
+ 'go_to_definition',
68
+ 'get_hover',
69
+ 'get_diagnostics',
58
70
  // Reading output from an ALREADY-running background shell. Starting one is
59
71
  // gated with the rest of bash below; draining a buffer is not a new effect.
60
72
  'bash_output',
@@ -68,16 +80,71 @@ const READ_ONLY_TOOLS = new Set([
68
80
  * `isReadOnlyCommand` for the several that are read-only ONLY in some forms.
69
81
  */
70
82
  const READ_ONLY_BASH = new Set([
71
- 'ls', 'cat', 'head', 'tail', 'wc', 'file', 'stat', 'du', 'df', 'pwd', 'which',
72
- 'type', 'echo', 'printf', 'basename', 'dirname', 'realpath', 'readlink',
73
- 'grep', 'egrep', 'fgrep', 'rg', 'ag', 'ack', 'find', 'fd', 'locate',
74
- 'diff', 'comm', 'cmp', 'sort', 'uniq', 'cut', 'tr', 'column', 'jq', 'yq',
75
- 'date', 'whoami', 'hostname', 'uname', 'env', 'printenv', 'id', 'groups',
76
- 'ps', 'uptime', 'free', 'node', 'python', 'python3',
83
+ 'ls',
84
+ 'cat',
85
+ 'head',
86
+ 'tail',
87
+ 'wc',
88
+ 'file',
89
+ 'stat',
90
+ 'du',
91
+ 'df',
92
+ 'pwd',
93
+ 'which',
94
+ 'type',
95
+ 'echo',
96
+ 'printf',
97
+ 'basename',
98
+ 'dirname',
99
+ 'realpath',
100
+ 'readlink',
101
+ 'grep',
102
+ 'egrep',
103
+ 'fgrep',
104
+ 'rg',
105
+ 'ag',
106
+ 'ack',
107
+ 'find',
108
+ 'fd',
109
+ 'locate',
110
+ 'diff',
111
+ 'comm',
112
+ 'cmp',
113
+ 'sort',
114
+ 'uniq',
115
+ 'cut',
116
+ 'tr',
117
+ 'column',
118
+ 'jq',
119
+ 'yq',
120
+ 'date',
121
+ 'whoami',
122
+ 'hostname',
123
+ 'uname',
124
+ 'env',
125
+ 'printenv',
126
+ 'id',
127
+ 'groups',
128
+ 'ps',
129
+ 'uptime',
130
+ 'free',
131
+ 'node',
132
+ 'python',
133
+ 'python3',
77
134
  // `less`/`more`/`top` are deliberately NOT here: pagers run `!cmd` from inside and
78
135
  // `top` never exits. `env` is listed but only bare — see toolFlagsOk.
79
- 'tree', 'nl', 'tac', 'strings', 'md5sum', 'sha256sum',
80
- 'true', 'false', 'test', 'sleep', 'seq', 'expr',
136
+ 'tree',
137
+ 'nl',
138
+ 'tac',
139
+ 'strings',
140
+ 'md5sum',
141
+ 'sha256sum',
142
+ 'true',
143
+ 'false',
144
+ 'test',
145
+ 'sleep',
146
+ 'seq',
147
+ 'expr',
81
148
  // Changes this shell's cwd only. Needed so `cd x && ls` is not refused.
82
149
  'cd',
83
150
  ]);
@@ -87,9 +154,7 @@ const READ_ONLY_BASH = new Set([
87
154
  * `build/git` — attacker-written files — were classified by their NAME and waved
88
155
  * through as read-only.
89
156
  */
90
- const SYSTEM_BIN_DIRS = new Set([
91
- '/bin', '/usr/bin', '/usr/local/bin', '/sbin', '/usr/sbin', '/opt/homebrew/bin',
92
- ]);
157
+ const SYSTEM_BIN_DIRS = new Set(['/bin', '/usr/bin', '/usr/local/bin', '/sbin', '/usr/sbin', '/opt/homebrew/bin']);
93
158
  /**
94
159
  * Environment assignments that change WHAT a read-only verb runs: the search path,
95
160
  * loader, pager/editor/external-diff hooks, and the interpreters' option vars.
@@ -106,10 +171,31 @@ const GH_NOUNS = new Set(['pr', 'issue', 'run', 'repo', 'release', 'workflow', '
106
171
  */
107
172
  const READ_ONLY_SUBCOMMANDS = {
108
173
  git: new Set([
109
- 'log', 'show', 'diff', 'status', 'blame', 'branch', 'tag', 'remote',
110
- 'describe', 'rev-parse', 'rev-list', 'ls-files', 'ls-tree', 'ls-remote',
111
- 'cat-file', 'shortlog', 'reflog', 'whatchanged', 'grep', 'config',
112
- 'check-ignore', 'merge-base', 'name-rev', 'count-objects', 'verify-commit',
174
+ 'log',
175
+ 'show',
176
+ 'diff',
177
+ 'status',
178
+ 'blame',
179
+ 'branch',
180
+ 'tag',
181
+ 'remote',
182
+ 'describe',
183
+ 'rev-parse',
184
+ 'rev-list',
185
+ 'ls-files',
186
+ 'ls-tree',
187
+ 'ls-remote',
188
+ 'cat-file',
189
+ 'shortlog',
190
+ 'reflog',
191
+ 'whatchanged',
192
+ 'grep',
193
+ 'config',
194
+ 'check-ignore',
195
+ 'merge-base',
196
+ 'name-rev',
197
+ 'count-objects',
198
+ 'verify-commit',
113
199
  ]),
114
200
  // Package managers: only their query verbs.
115
201
  npm: new Set(['ls', 'list', 'view', 'info', 'outdated', 'why', 'config', 'ping', 'search']),
@@ -151,23 +237,33 @@ function toolFlagsOk(verb, args) {
151
237
  const flags = args.filter((a) => a.startsWith('-'));
152
238
  const pos = args.filter((a) => !a.startsWith('-'));
153
239
  switch (verb) {
154
- case 'env': return args.length === 0; // `env CMD` RUNS CMD
240
+ case 'env':
241
+ return args.length === 0; // `env CMD` RUNS CMD
155
242
  case 'sort':
156
243
  return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*o/.test(f)) || f.startsWith('--output') || f.startsWith('--compress-program'));
157
- case 'uniq': return pos.length <= 1; // second positional is an OUTPUT file
244
+ case 'uniq':
245
+ return pos.length <= 1; // second positional is an OUTPUT file
158
246
  case 'find':
159
247
  return !args.some((a) => ['-exec', '-execdir', '-delete', '-ok', '-okdir', '-fprint', '-fprint0', '-fprintf', '-fls'].includes(a));
160
248
  case 'fd':
161
249
  return !flags.some((f) => f.startsWith('--exec') || (isShort(f) && /^-[A-Za-z]*[xX]/.test(f)));
162
- case 'rg': return !flags.some((f) => flagName(f) === '--pre' || f.startsWith('--hostname-bin'));
250
+ case 'rg':
251
+ return !flags.some((f) => flagName(f) === '--pre' || f.startsWith('--hostname-bin'));
163
252
  case 'ag':
164
- case 'ack': return !flags.some((f) => f.startsWith('--pager'));
165
- case 'yq': return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*i/.test(f)) || f.startsWith('--inplace'));
166
- case 'tree': return !flags.some((f) => isShort(f) && /^-[A-Za-z]*o/.test(f));
167
- case 'date': return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*s/.test(f)) || f.startsWith('--set'));
168
- case 'hostname': return pos.length === 0; // `hostname NAME` renames the machine
169
- case 'file': return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*C/.test(f)) || f.startsWith('--compile'));
170
- default: return true;
253
+ case 'ack':
254
+ return !flags.some((f) => f.startsWith('--pager'));
255
+ case 'yq':
256
+ return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*i/.test(f)) || f.startsWith('--inplace'));
257
+ case 'tree':
258
+ return !flags.some((f) => isShort(f) && /^-[A-Za-z]*o/.test(f));
259
+ case 'date':
260
+ return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*s/.test(f)) || f.startsWith('--set'));
261
+ case 'hostname':
262
+ return pos.length === 0; // `hostname NAME` renames the machine
263
+ case 'file':
264
+ return !flags.some((f) => (isShort(f) && /^-[A-Za-z]*C/.test(f)) || f.startsWith('--compile'));
265
+ default:
266
+ return true;
171
267
  }
172
268
  }
173
269
  /** Every flag must be a known read-only one; anything unfamiliar fails closed. */
@@ -192,18 +288,72 @@ function subcommandFlagsOk(verb, sub, args) {
192
288
  return false;
193
289
  switch (sub) {
194
290
  case 'branch':
195
- return flagsWithin(flags, 'arvlq', ['--all', '--remotes', '--verbose', '--list', '--show-current', '--contains', '--no-contains', '--merged', '--no-merged', '--points-at', '--sort', '--format', '--column', '--no-column', '--color', '--no-color', '--abbrev', '--no-abbrev', '--ignore-case', '--omit-empty'])
196
- && (pos.length <= 1 || listish);
291
+ return (flagsWithin(flags, 'arvlq', [
292
+ '--all',
293
+ '--remotes',
294
+ '--verbose',
295
+ '--list',
296
+ '--show-current',
297
+ '--contains',
298
+ '--no-contains',
299
+ '--merged',
300
+ '--no-merged',
301
+ '--points-at',
302
+ '--sort',
303
+ '--format',
304
+ '--column',
305
+ '--no-column',
306
+ '--color',
307
+ '--no-color',
308
+ '--abbrev',
309
+ '--no-abbrev',
310
+ '--ignore-case',
311
+ '--omit-empty',
312
+ ]) &&
313
+ (pos.length <= 1 || listish));
197
314
  case 'tag':
198
- return flagsWithin(flags, 'lnv', ['--list', '--contains', '--no-contains', '--merged', '--no-merged', '--points-at', '--sort', '--format', '--column', '--no-column', '--color', '--no-color', '--verify', '--ignore-case', '--omit-empty'])
199
- && (pos.length <= 1 || listish || flags.some((f) => f === '-v' || f === '--verify'));
315
+ return (flagsWithin(flags, 'lnv', [
316
+ '--list',
317
+ '--contains',
318
+ '--no-contains',
319
+ '--merged',
320
+ '--no-merged',
321
+ '--points-at',
322
+ '--sort',
323
+ '--format',
324
+ '--column',
325
+ '--no-column',
326
+ '--color',
327
+ '--no-color',
328
+ '--verify',
329
+ '--ignore-case',
330
+ '--omit-empty',
331
+ ]) &&
332
+ (pos.length <= 1 || listish || flags.some((f) => f === '-v' || f === '--verify')));
200
333
  case 'remote':
201
- return flagsWithin(flags, 'vn', ['--verbose']) && (pos[1] === undefined || pos[1] === 'show' || pos[1] === 'get-url');
334
+ return (flagsWithin(flags, 'vn', ['--verbose']) && (pos[1] === undefined || pos[1] === 'show' || pos[1] === 'get-url'));
202
335
  case 'config':
203
- return flagsWithin(flags, 'lz', ['--get', '--get-all', '--get-regexp', '--list', '--show-origin', '--show-scope', '--global', '--local', '--system', '--worktree', '--name-only', '--null', '--includes', '--no-includes', '--type'])
204
- && pos.length <= 2; // `config` itself + at most one key
205
- case 'reflog': return pos[1] !== 'expire' && pos[1] !== 'delete';
206
- default: return true;
336
+ return (flagsWithin(flags, 'lz', [
337
+ '--get',
338
+ '--get-all',
339
+ '--get-regexp',
340
+ '--list',
341
+ '--show-origin',
342
+ '--show-scope',
343
+ '--global',
344
+ '--local',
345
+ '--system',
346
+ '--worktree',
347
+ '--name-only',
348
+ '--null',
349
+ '--includes',
350
+ '--no-includes',
351
+ '--type',
352
+ ]) && pos.length <= 2); // `config` itself + at most one key
353
+ case 'reflog':
354
+ return pos[1] !== 'expire' && pos[1] !== 'delete';
355
+ default:
356
+ return true;
207
357
  }
208
358
  }
209
359
  if (sub === 'config' && (verb === 'npm' || verb === 'pnpm' || verb === 'yarn')) {
@@ -312,7 +462,10 @@ function isReadOnlyPipeline(command) {
312
462
  return false;
313
463
  if (/[>`]|\$\(|<\(/.test(cmd))
314
464
  return false;
315
- const segs = cmd.split(/\|\||&&|[;|\n\r]/).map((x) => x.trim()).filter(Boolean);
465
+ const segs = cmd
466
+ .split(/\|\||&&|[;|\n\r]/)
467
+ .map((x) => x.trim())
468
+ .filter(Boolean);
316
469
  if (!segs.length)
317
470
  return false;
318
471
  return segs.every((seg) => !seg.includes('&') && isReadOnlyCommand(seg));
@@ -1 +1 @@
1
- {"version":3,"file":"readDedupe.d.ts","sourceRoot":"","sources":["../../src/agent/readDedupe.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAMxC,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAFrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE5B,OAAO,CAAC,EAAE,MAAM,YAAA;IAE7C,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,GAAG;IAQX,0EAA0E;IAC1E,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;IAezE,0FAA0F;IAC1F,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAS/D,uFAAuF;IACvF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;CAOrC"}
1
+ {"version":3,"file":"readDedupe.d.ts","sourceRoot":"","sources":["../../src/agent/readDedupe.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAUxC,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAFrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE5B,OAAO,CAAC,EAAE,MAAM,YAAA;IAE7C,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,GAAG;IAQX,0EAA0E;IAC1E,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;IA0BzE,0FAA0F;IAC1F,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAW/D,uFAAuF;IACvF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;CAOrC"}
@@ -109,7 +109,9 @@ class ReadDedupe {
109
109
  const st = fs.statSync(k.abs);
110
110
  this.records.set(k.key, { toolUseId, mtimeMs: st.mtimeMs, size: st.size });
111
111
  }
112
- catch { /* unreadable now — nothing to remember */ }
112
+ catch {
113
+ /* unreadable now — nothing to remember */
114
+ }
113
115
  }
114
116
  /** Forget every recorded range of these absolute paths (a write tool touched them). */
115
117
  invalidate(absPaths) {
@@ -1 +1 @@
1
- {"version":3,"file":"securityLint.d.ts","sourceRoot":"","sources":["../../src/agent/securityLint.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;AA+ID;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,eAAe,EAAE,CA6CzE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAepE"}
1
+ {"version":3,"file":"securityLint.d.ts","sourceRoot":"","sources":["../../src/agent/securityLint.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;AAyJD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,eAAe,EAAE,CA8CzE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAapE"}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTasks.d.ts","sourceRoot":"","sources":["../../src/agent/sharedTasks.ts"],"names":[],"mappings":"AA6DA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,4HAA4H;IAC5H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AA4BD,0HAA0H;AAC1H,iBAAS,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAUnD;AAED,4GAA4G;AAC5G,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAG/D;AAED,0IAA0I;AAC1I,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAW7D;AAED,sJAAsJ;AACtJ,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC/C,UAAU,CAUZ;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAA;CAAE,CAAC;AAEvF;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BxG;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACrF,OAAO,CAAC,WAAW,CAAC,CAoBtB;AAED,eAAO,MAAM,oBAAoB;;;;;;;;CAAqH,CAAC;AAEvJ;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzE"}
1
+ {"version":3,"file":"sharedTasks.d.ts","sourceRoot":"","sources":["../../src/agent/sharedTasks.ts"],"names":[],"mappings":"AA6DA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,4HAA4H;IAC5H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8HAA8H;IAC9H,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAiCD,0HAA0H;AAC1H,iBAAS,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAenD;AAED,4GAA4G;AAC5G,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAG/D;AAED,0IAA0I;AAC1I,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAe7D;AAED,sJAAsJ;AACtJ,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC/C,UAAU,CAaZ;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAA;CAAE,CAAC;AAEvF;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCxG;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,eAAO,MAAM,oBAAoB;;;;;;;;CAQhC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOzE"}
@@ -171,7 +171,9 @@ function isClaimAbandoned(task) {
171
171
  // verdict is withheld until the claim has existed for a minimum age —
172
172
  // without this guard, a session that legitimately claims-then-exits
173
173
  // quickly can have its still-valid claim stolen out from under it.
174
- if (age >= MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS && typeof task.claimedByPid === 'number' && !isPidAlive(task.claimedByPid))
174
+ if (age >= MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS &&
175
+ typeof task.claimedByPid === 'number' &&
176
+ !isPidAlive(task.claimedByPid))
175
177
  return true;
176
178
  if (age > CLAIM_STALE_MS)
177
179
  return true;
@@ -208,9 +210,12 @@ function createSharedTask(workDir, content, opts = {}) {
208
210
  const id = opts.id ?? crypto.randomBytes(6).toString('hex');
209
211
  const now = Date.now();
210
212
  const task = {
211
- id, content, status: 'pending',
213
+ id,
214
+ content,
215
+ status: 'pending',
212
216
  blockedBy: opts.blockedBy?.length ? opts.blockedBy : undefined,
213
- createdAt: now, updatedAt: now,
217
+ createdAt: now,
218
+ updatedAt: now,
214
219
  };
215
220
  writeTask(workDir, task);
216
221
  return task;
@@ -275,13 +280,23 @@ async function updateSharedTaskStatus(workDir, taskId, status, opts = {}) {
275
280
  ...task,
276
281
  status,
277
282
  updatedAt: Date.now(),
278
- ...(status === 'pending' || status === 'completed' ? { claimedBy: undefined, claimedByPid: undefined, claimedAt: undefined } : {}),
283
+ ...(status === 'pending' || status === 'completed'
284
+ ? { claimedBy: undefined, claimedByPid: undefined, claimedAt: undefined }
285
+ : {}),
279
286
  };
280
287
  writeTask(workDir, updated);
281
288
  return { ok: true, task: updated };
282
289
  }, workDir);
283
290
  }
284
- exports._sharedTasksInternal = { tasksRoot, scopeDir, taskPath, isClaimAbandoned, isUnblocked, CLAIM_STALE_MS, MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS };
291
+ exports._sharedTasksInternal = {
292
+ tasksRoot,
293
+ scopeDir,
294
+ taskPath,
295
+ isClaimAbandoned,
296
+ isUnblocked,
297
+ CLAIM_STALE_MS,
298
+ MIN_CLAIM_AGE_FOR_DEATH_CHECK_MS,
299
+ };
285
300
  /**
286
301
  * Remove a task outright — the veto path for a `TaskCreated` hook. Claude Code creates the
287
302
  * task, and when a hook refuses it the task is DELETED and the reason goes back to the