opencode-swarm 7.144.7 → 7.145.0

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 (86) hide show
  1. package/dist/cli/{capability-probe-976tt4ba.js → capability-probe-va4kk8vg.js} +2 -2
  2. package/dist/cli/{config-doctor-zdvaq4nb.js → config-doctor-dzsv3pqy.js} +2 -2
  3. package/dist/cli/{core-j7f118a5.js → core-qkh9me8x.js} +2 -2
  4. package/dist/cli/{curation-policy-a511r0qz.js → curation-policy-5x6346tf.js} +7 -7
  5. package/dist/cli/{curator-drift-ckjm272w.js → curator-drift-yn5d0mvq.js} +3 -3
  6. package/dist/cli/curator-llm-factory-q5p4578g.js +64 -0
  7. package/dist/cli/{curator-97sm8wn0.js → curator-zssndq5x.js} +34 -33
  8. package/dist/cli/dispatch-ndxbsk98.js +1 -1
  9. package/dist/cli/{evidence-summary-service-kwtb2d14.js → evidence-summary-service-dqcpapj8.js} +15 -14
  10. package/dist/cli/{gate-evidence-rk9j0hc4.js → gate-evidence-bkdqryqg.js} +9 -8
  11. package/dist/cli/guardrail-explain-kspf83x5.js +65 -0
  12. package/dist/cli/{guardrail-log-zbqf4ws6.js → guardrail-log-qg4sq6gr.js} +4 -4
  13. package/dist/cli/{hive-promoter-qzvtp5wx.js → hive-promoter-3h7dhnek.js} +34 -33
  14. package/dist/cli/{index-00fk9c3b.js → index-0jr9zn34.js} +1 -1
  15. package/dist/cli/{index-zq9gs0yk.js → index-0pcq32y2.js} +1 -1
  16. package/dist/cli/{index-gmdgap01.js → index-2dnqazyr.js} +1 -1
  17. package/dist/cli/{index-b44qqqt2.js → index-3g0xk6tk.js} +1 -1
  18. package/dist/cli/{index-yz0hfa4g.js → index-4e5a28h7.js} +2 -2
  19. package/dist/cli/index-4evasm2b.js +514 -0
  20. package/dist/cli/{index-jszgrk71.js → index-4zwjc9sb.js} +10 -29
  21. package/dist/cli/{index-x4q96ejx.js → index-6ezbzd5e.js} +2509 -1995
  22. package/dist/cli/{index-q7zy6dej.js → index-6hqhyb0f.js} +4 -4
  23. package/dist/cli/{index-9s8drsf9.js → index-6q3agdmr.js} +4 -21
  24. package/dist/cli/{index-hkdgkkhb.js → index-77ef8gye.js} +2 -2
  25. package/dist/cli/{index-bx20cv1v.js → index-7g276m9m.js} +2 -2
  26. package/dist/cli/{index-zy7f84cs.js → index-85gkedsf.js} +14 -5
  27. package/dist/cli/{index-7bvd5nh2.js → index-apjdytwx.js} +3 -3
  28. package/dist/cli/{index-pzsezhek.js → index-b3xret0a.js} +5 -5
  29. package/dist/cli/{index-qm0mz7rj.js → index-c13ttmak.js} +8 -8
  30. package/dist/cli/{index-d879g58v.js → index-e00wbqw5.js} +2 -2
  31. package/dist/cli/{index-cwtpqm5f.js → index-e1pxav9g.js} +1 -1
  32. package/dist/cli/{index-n4hwcsbd.js → index-ffdwj1an.js} +5 -5
  33. package/dist/cli/{index-vdha477y.js → index-fp464as8.js} +1 -1
  34. package/dist/cli/{index-c1cfsg9y.js → index-h4hasck4.js} +4 -4
  35. package/dist/cli/{index-39jbnhar.js → index-hfzcztv6.js} +36 -35
  36. package/dist/cli/{index-wknz5c8q.js → index-jy9bwa9k.js} +2 -2
  37. package/dist/cli/{index-xjgwr4c6.js → index-k6pdsct6.js} +1 -1
  38. package/dist/cli/{index-r2q0nd0a.js → index-kp87kr1a.js} +3 -3
  39. package/dist/cli/{index-w9bnt74s.js → index-mkks7jwg.js} +13 -15
  40. package/dist/cli/{index-f9vvg5xb.js → index-pa86tpgt.js} +67 -2
  41. package/dist/cli/{index-77h4xjn5.js → index-qfawexc8.js} +9 -9
  42. package/dist/cli/{index-grkev1g6.js → index-s6cwsnrw.js} +8 -8
  43. package/dist/cli/{index-h1p08s3n.js → index-s72naw1j.js} +1 -1
  44. package/dist/cli/{index-s1xefrx7.js → index-v64kjqvg.js} +19 -16
  45. package/dist/cli/{index-6z5jtf7d.js → index-wk54ey3h.js} +4 -4
  46. package/dist/cli/{index-x4eqd82b.js → index-zfhe7vbb.js} +1 -1
  47. package/dist/cli/{index-1jsmmx7y.js → index-zz5qsjd1.js} +64 -35
  48. package/dist/cli/index.js +34 -33
  49. package/dist/cli/{knowledge-escalator-fhc6ecbv.js → knowledge-escalator-w1mbaktt.js} +14 -13
  50. package/dist/cli/{knowledge-events-31g69mx2.js → knowledge-events-a0dj6gy6.js} +12 -11
  51. package/dist/cli/{knowledge-link-4cg4776a.js → knowledge-link-mzdjvjsd.js} +6 -6
  52. package/dist/cli/{knowledge-store-g389c1cy.js → knowledge-store-8kk3rghx.js} +7 -7
  53. package/dist/cli/{knowledge-validator-sng5xt5a.js → knowledge-validator-91ym56e0.js} +9 -9
  54. package/dist/cli/{pending-delegations-9h1jmtw1.js → pending-delegations-6vsrmw5w.js} +6 -6
  55. package/dist/cli/{pr-subscriptions-8pg34pev.js → pr-subscriptions-zc3skxde.js} +6 -6
  56. package/dist/cli/{runner-cqecp1na.js → runner-jj32v8bk.js} +8 -7
  57. package/dist/cli/{scan-cursor-qm3tsvvw.js → scan-cursor-12jxwd14.js} +8 -8
  58. package/dist/cli/{schema-vnghba3d.js → schema-nq9tcz87.js} +1 -1
  59. package/dist/cli/{scope-persistence-k9mqd414.js → scope-persistence-dv6z7n08.js} +8 -7
  60. package/dist/cli/{skill-generator-v1wdh3ne.js → skill-generator-drscnzq9.js} +16 -15
  61. package/dist/cli/{telemetry-cybx6cfz.js → telemetry-z54dgdrh.js} +1 -1
  62. package/dist/cli/{workspace-snapshot-d89zm6wm.js → workspace-snapshot-q21mgbsh.js} +2 -2
  63. package/dist/cli/{worktree-collision-ownership-vy0kxa98.js → worktree-collision-ownership-rfyyjjct.js} +9 -9
  64. package/dist/cli/{worktree-isolation-bxt3rftm.js → worktree-isolation-4tehtym5.js} +34 -33
  65. package/dist/cli/{worktree-provisioning-owner-zzkjycp1.js → worktree-provisioning-owner-72cyddz5.js} +3 -3
  66. package/dist/commands/close.d.ts +8 -1
  67. package/dist/config/evidence-schema.d.ts +6 -6
  68. package/dist/config/plan-schema.d.ts +2 -2
  69. package/dist/config/schema.d.ts +7 -7
  70. package/dist/evidence/task-file.d.ts +16 -16
  71. package/dist/git/branch.d.ts +9 -0
  72. package/dist/hooks/delegation-gate/worktree-isolation.d.ts +5 -0
  73. package/dist/index.js +561 -531
  74. package/dist/memory/schema.d.ts +3 -3
  75. package/dist/observability/catalog.d.ts +5 -4
  76. package/dist/observability/envelope.d.ts +2 -2
  77. package/dist/sandbox/executor.d.ts +6 -0
  78. package/dist/services/swarm-residue.d.ts +151 -0
  79. package/dist/telemetry.d.ts +20 -1
  80. package/dist/tools/knowledge-receipt.d.ts +1 -1
  81. package/dist/utils/atomic-write.d.ts +185 -0
  82. package/package.json +1 -1
  83. package/dist/cli/curator-llm-factory-eny079d1.js +0 -63
  84. package/dist/cli/guardrail-explain-8gggptqj.js +0 -64
  85. package/dist/cli/{index-f36ybbsv.js → index-b30x236n.js} +3 -3
  86. package/dist/cli/{index-fv0s19g9.js → index-w8pgjr75.js} +3 -3
@@ -0,0 +1,514 @@
1
+ // @bun
2
+ import {
3
+ invalidateCachedArtifact
4
+ } from "./index-ed5ykebp.js";
5
+
6
+ // src/utils/atomic-write.ts
7
+ import { randomBytes } from "crypto";
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ var UUID_RE = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
11
+ var SWARM_TEMP_GRAMMARS = [
12
+ {
13
+ id: "canonical-v1",
14
+ era: "canonical",
15
+ match: /^(.+)\.[0-9a-f]{32}\.tmp$/,
16
+ token: "instance",
17
+ quarantineEligible: true,
18
+ parsesTarget: true,
19
+ producers: [
20
+ "src/utils/atomic-write.ts:atomicWriteSwarmFile",
21
+ "src/utils/atomic-write.ts:atomicWriteFileAnyRoot"
22
+ ]
23
+ },
24
+ {
25
+ id: "target-suffix-tmp-uuid",
26
+ era: "current",
27
+ match: new RegExp(`^(.+)\\.tmp\\.${UUID_RE}$`),
28
+ token: "instance",
29
+ quarantineEligible: true,
30
+ parsesTarget: true,
31
+ producers: [
32
+ "src/commands/handoff.ts:48 (pre-#2035)",
33
+ "src/commands/handoff.ts:79 (pre-#2035)",
34
+ "src/memory/local-jsonl-provider.ts:1171",
35
+ "src/config/bundled-skills.ts:241"
36
+ ]
37
+ },
38
+ {
39
+ id: "target-suffix-tmp-pid-uuid",
40
+ era: "current",
41
+ match: new RegExp(`^(.+)\\.tmp\\.\\d+\\.${UUID_RE}$`),
42
+ token: "instance",
43
+ quarantineEligible: true,
44
+ parsesTarget: true,
45
+ producers: ["src/hooks/pr-workflow-gate.ts:11950"],
46
+ note: "pre/post-rename file-identity verification (assertOpened/ClosedSwarmFileIdentity, pr-workflow-gate.ts:11844-11889) is writer-specific and load-bearing"
47
+ },
48
+ {
49
+ id: "target-suffix-tmp-num-num-json",
50
+ era: "current",
51
+ match: /^(.+)\.tmp\.\d+\.\d+\.json$/,
52
+ token: "instance",
53
+ quarantineEligible: true,
54
+ parsesTarget: true,
55
+ producers: ["src/hooks/issue-trace-state.ts:315"],
56
+ note: "the .json terminator keeps this shape distinct from the bare two-token family \u2014 declared before it so first-match wins"
57
+ },
58
+ {
59
+ id: "target-suffix-tmp-num-alnum",
60
+ era: "current",
61
+ match: /^(.+)\.tmp\.\d+\.[0-9a-z]+$/,
62
+ token: "instance",
63
+ quarantineEligible: true,
64
+ parsesTarget: true,
65
+ producers: [
66
+ "src/evidence/task-file.ts:67 (pre-#2035)",
67
+ "src/scope/scope-persistence.ts:2304 (pre-#2035)",
68
+ "src/scope/scope-persistence.ts:2318 (pre-#2035)",
69
+ "src/plan/manager.ts:628",
70
+ "src/plan/manager.ts:1775",
71
+ "src/plan/manager.ts:1820",
72
+ "src/review/evidence.ts:125",
73
+ "src/turbo/lean/evidence.ts:182",
74
+ "src/summaries/manager.ts:122",
75
+ "src/evidence/manager.ts:288",
76
+ "src/evidence/manager.ts:456",
77
+ "src/tools/sast-baseline.ts:106",
78
+ "src/tools/repo-graph/storage.ts:397",
79
+ "src/memory/reflection-service.ts:547 (pre-#2035)",
80
+ "src/hooks/review-receipt.ts:608",
81
+ "src/hooks/review-receipt.ts:674",
82
+ "src/hooks/review-receipt.ts:812",
83
+ "src/knowledge/identity.ts:209",
84
+ "src/evidence/phase-participation.ts:303 (pre-#2035)",
85
+ "src/turbo/lean/integration.ts:426",
86
+ "src/turbo/lean/reviewer.ts:403",
87
+ "src/plan/ledger.ts:713",
88
+ "src/services/synonym-map.ts:389",
89
+ "src/services/skill-optimizer/store.ts:340",
90
+ "src/services/skill-optimizer/store.ts:503",
91
+ "src/turbo/epic/state.ts:177",
92
+ "src/turbo/epic/calibration.ts:197",
93
+ "src/commands/archive-sqlite.ts:318",
94
+ "src/memory/jsonl-migration.ts:157"
95
+ ],
96
+ note: "fsync-discipline / lock-scoped fd writers whose temp naming is pinned by their own durability test suites (plan-durability invariant 5, #2034 crash matrix); grammars registered here so their residue stays discoverable"
97
+ },
98
+ {
99
+ id: "target-suffix-tmp-token",
100
+ era: "current",
101
+ match: /^(.+)\.tmp\.[0-9a-z-]{6,}$/,
102
+ token: "instance",
103
+ quarantineEligible: true,
104
+ parsesTarget: true,
105
+ producers: [
106
+ "src/turbo/lean/state.ts:246",
107
+ "src/turbo/lean/recovery.ts:175",
108
+ "src/hooks/delegation-gate/worktree-merge-status.ts:110"
109
+ ]
110
+ },
111
+ {
112
+ id: "target-suffix-tmp-dash",
113
+ era: "current",
114
+ match: /^(.+)\.tmp-\d+-[0-9a-z-]+$/,
115
+ token: "instance",
116
+ quarantineEligible: true,
117
+ parsesTarget: true,
118
+ producers: [
119
+ "src/services/skill-evaluator.ts:492 (pre-#2035)",
120
+ "src/services/skill-improver.ts:154 (pre-#2035)",
121
+ "src/services/skill-consolidation.ts:72 (pre-#2035)",
122
+ "src/services/skill-generator.ts:601 (pre-#2035)",
123
+ "src/tools/spec-write.ts:98",
124
+ "src/sdd/effective-spec.ts:1149",
125
+ "src/background/lane-output-store.ts:353",
126
+ "src/background/pending-delegations.ts:905",
127
+ "src/background/delegation-health.ts:300",
128
+ "src/hooks/delegation-gate/worktree-provisioning-owner.ts:100",
129
+ "src/tools/submit-phase-council-verdicts.ts:437",
130
+ "src/summaries/store.ts:46 (pre-#2035)"
131
+ ],
132
+ note: "background lane/delegation stores keep bounded-retry rename semantics wired into their callers (#2034/#2276 delivery contracts); migration candidates for a follow-up but grammars registered"
133
+ },
134
+ {
135
+ id: "target-suffix-tmp-dash-num",
136
+ era: "current",
137
+ match: /^(.+)\.tmp-\d+$/,
138
+ token: "instance",
139
+ quarantineEligible: true,
140
+ parsesTarget: true,
141
+ producers: ["src/services/skill-improver-quota.ts:114"]
142
+ },
143
+ {
144
+ id: "target-dot-pid-uuid-tmp",
145
+ era: "current",
146
+ match: new RegExp(`^(.+)\\.\\d+\\.${UUID_RE}\\.tmp$`),
147
+ token: "instance",
148
+ quarantineEligible: true,
149
+ parsesTarget: true,
150
+ producers: ["src/hooks/knowledge-receipt-ledger-storage.ts:546"],
151
+ note: "pre/post-rename file-identity verification (existingFileIdentity checks, knowledge-receipt-ledger-storage.ts:544-591) is writer-specific and load-bearing"
152
+ },
153
+ {
154
+ id: "dot-numeric-instance-tmp",
155
+ era: "current",
156
+ match: /^\..+(?:\.\d+){2,4}\.[0-9a-z]+\.tmp$/,
157
+ token: "instance",
158
+ quarantineEligible: true,
159
+ parsesTarget: false,
160
+ producers: [
161
+ "src/utils/bun-compat.ts:138",
162
+ "src/tools/repo-graph/freshness.ts:171"
163
+ ],
164
+ note: "bunWrite Node-fallback internal temp and the repo-graph fingerprint temp (2-4 numeric token groups); leading-dot temps are standalone, target not parsed"
165
+ },
166
+ {
167
+ id: "dot-uuid-instance-tmp",
168
+ era: "current",
169
+ match: new RegExp(`^\\..+\\.${UUID_RE}\\.tmp$`),
170
+ token: "instance",
171
+ quarantineEligible: true,
172
+ parsesTarget: true,
173
+ producers: [
174
+ "src/tools/write-pr-review-artifact.ts:107",
175
+ "src/tools/write-pr-review-trigger-eval.ts:574"
176
+ ],
177
+ note: "bundled-skills writes outside .swarm (project skill roots) and keeps its own contained-directory logic (invariant 4 bundled-skill ownership)"
178
+ },
179
+ {
180
+ id: "tmp-prefix-named",
181
+ era: "legacy",
182
+ match: /^\.tmp-.+-\d+-\d+$/,
183
+ token: "instance",
184
+ quarantineEligible: true,
185
+ parsesTarget: false,
186
+ producers: ["src/commands/issue.ts:167 (pre-#2035)"],
187
+ note: "prefix form embeds the filename; target not reliably parseable (dashes), so eligibility relies on the age/tracked/symlink/lock gates"
188
+ },
189
+ {
190
+ id: "target-rebuild-close",
191
+ era: "current",
192
+ match: /^(.+)\.(?:rebuild|close)\.\d+\.[0-9a-z]+$/,
193
+ token: "instance",
194
+ quarantineEligible: true,
195
+ parsesTarget: true,
196
+ producers: ["src/plan/manager.ts:1960", "src/plan/manager.ts:2149"],
197
+ note: "plan-durability (invariant 5) fd-write paths; grammars registered, writers unchanged in this PR"
198
+ },
199
+ {
200
+ id: "target-migration-pid",
201
+ era: "current",
202
+ match: /^(.+)\.migration-\d+$/,
203
+ token: "instance",
204
+ quarantineEligible: true,
205
+ parsesTarget: true,
206
+ producers: ["src/scope/scope-persistence.ts:633 (pre-#2035)"]
207
+ },
208
+ {
209
+ id: "dot-tmp-prefix-legacy",
210
+ era: "legacy",
211
+ match: /^\.tmp\..+$/,
212
+ token: "constant",
213
+ quarantineEligible: true,
214
+ parsesTarget: false,
215
+ producers: [
216
+ "pre-7.x writers (historical); matched by the pre-#2035 close sweep"
217
+ ],
218
+ note: "legacy prefix grammar: issue #2035 req 7 preserves its handling \u2014 stale instances are quarantined (formerly unlinked) under the same eligibility gates"
219
+ },
220
+ {
221
+ id: "dot-constant-tmp",
222
+ era: "current",
223
+ match: /^\..+\.tmp$/,
224
+ token: "constant",
225
+ quarantineEligible: false,
226
+ parsesTarget: false,
227
+ producers: [
228
+ "src/tools/write-drift-evidence.ts:275",
229
+ "src/tools/write-mutation-evidence.ts:169",
230
+ "src/tools/write-hallucination-evidence.ts:121",
231
+ "src/tools/record-implementation-review.ts:87",
232
+ "src/tools/record-recurrence-sweep.ts:125",
233
+ "src/tools/record-issue-reproduction.ts:85",
234
+ "src/tools/record-issue-publication.ts:74",
235
+ "src/tools/write-final-council-evidence.ts:311"
236
+ ],
237
+ note: "constant-name temps: no per-invocation token \u2014 reported when stale, never auto-quarantined (may be an in-flight writer of any process)"
238
+ },
239
+ {
240
+ id: "target-constant-tmp",
241
+ era: "current",
242
+ match: /^(.+)\.tmp$/,
243
+ token: "constant",
244
+ quarantineEligible: false,
245
+ parsesTarget: false,
246
+ producers: [
247
+ "src/tools/checkpoint.ts:194",
248
+ "src/full-auto/state.ts:448",
249
+ "src/context-map/persistence.ts:119",
250
+ "src/context-map/capsule-persistence.ts:107",
251
+ "src/test-impact/history-store.ts:225",
252
+ "src/test-impact/history-store.ts:353",
253
+ "src/hooks/promotion-evidence-store.ts:102",
254
+ "src/hooks/skill-usage-log.ts:554",
255
+ "src/hooks/skill-usage-log.ts:608",
256
+ "src/parallel/file-locks.ts:113",
257
+ "src/plan/ledger.ts:1302",
258
+ "src/plan/ledger.ts:1303"
259
+ ],
260
+ note: "constant-name temps: reported when stale, never auto-quarantined. file-locks meta sidecars live under the scanner-skipped .swarm/locks/ subtree; the ledger reconcile temp embeds instance tokens but its .tmp-suffix shape maps here (conservatively report-only)"
261
+ }
262
+ ];
263
+ function matchTempGrammar(basename) {
264
+ return SWARM_TEMP_GRAMMARS.find((g) => g.match.test(basename));
265
+ }
266
+ function parseTargetBasename(basename) {
267
+ for (const g of SWARM_TEMP_GRAMMARS) {
268
+ if (!g.parsesTarget)
269
+ continue;
270
+ const m = g.match.exec(basename);
271
+ if (m?.[1])
272
+ return m[1];
273
+ }
274
+ return null;
275
+ }
276
+ var WRITER_CLASSIFICATION = Object.freeze({
277
+ "src/commands/close.ts": "migrated",
278
+ "src/commands/handoff.ts": "migrated",
279
+ "src/commands/simulate.ts": "migrated",
280
+ "src/commands/coupling.ts": "migrated",
281
+ "src/commands/issue.ts": "migrated",
282
+ "src/evidence/task-file.ts": "migrated",
283
+ "src/evidence/phase-participation.ts": "migrated",
284
+ "src/memory/reflection-service.ts": "migrated",
285
+ "src/scope/scope-persistence.ts": "migrated",
286
+ "src/services/skill-consolidation.ts": "migrated",
287
+ "src/services/skill-evaluator.ts": "migrated",
288
+ "src/services/skill-generator.ts": "migrated",
289
+ "src/services/skill-improver.ts": "migrated",
290
+ "src/summaries/store.ts": "migrated",
291
+ "src/background/delegation-health.ts": "registered-bespoke",
292
+ "src/background/lane-output-store.ts": "registered-bespoke",
293
+ "src/background/pending-delegations.ts": "registered-bespoke",
294
+ "src/commands/archive-sqlite.ts": "registered-bespoke",
295
+ "src/context-map/capsule-persistence.ts": "registered-bespoke",
296
+ "src/context-map/persistence.ts": "registered-bespoke",
297
+ "src/evidence/documents-retention.ts": "registered-bespoke",
298
+ "src/evidence/manager.ts": "registered-bespoke",
299
+ "src/full-auto/state.ts": "registered-bespoke",
300
+ "src/hooks/delegation-gate/worktree-merge-status.ts": "registered-bespoke",
301
+ "src/hooks/delegation-gate/worktree-provisioning-owner.ts": "registered-bespoke",
302
+ "src/hooks/issue-trace-state.ts": "registered-bespoke",
303
+ "src/hooks/knowledge-receipt-ledger-storage.ts": "registered-bespoke",
304
+ "src/hooks/pr-workflow-gate.ts": "registered-bespoke",
305
+ "src/hooks/promotion-evidence-store.ts": "registered-bespoke",
306
+ "src/hooks/review-receipt.ts": "registered-bespoke",
307
+ "src/hooks/skill-usage-log.ts": "registered-bespoke",
308
+ "src/knowledge/identity.ts": "registered-bespoke",
309
+ "src/memory/jsonl-migration.ts": "external",
310
+ "src/memory/local-jsonl-provider.ts": "registered-bespoke",
311
+ "src/plan/ledger.ts": "registered-bespoke",
312
+ "src/plan/manager.ts": "registered-bespoke",
313
+ "src/review/evidence.ts": "registered-bespoke",
314
+ "src/sdd/effective-spec.ts": "registered-bespoke",
315
+ "src/services/skill-improver-quota.ts": "registered-bespoke",
316
+ "src/services/skill-optimizer/activation.ts": "external",
317
+ "src/services/skill-optimizer/store.ts": "registered-bespoke",
318
+ "src/services/skill-reviser.ts": "external",
319
+ "src/services/synonym-map.ts": "registered-bespoke",
320
+ "src/session/snapshot-writer.ts": "registered-bespoke",
321
+ "src/summaries/manager.ts": "registered-bespoke",
322
+ "src/test-impact/history-store.ts": "registered-bespoke",
323
+ "src/turbo/epic/calibration.ts": "registered-bespoke",
324
+ "src/turbo/epic/state.ts": "registered-bespoke",
325
+ "src/turbo/lean/evidence.ts": "registered-bespoke",
326
+ "src/turbo/lean/integration.ts": "registered-bespoke",
327
+ "src/turbo/lean/recovery.ts": "registered-bespoke",
328
+ "src/turbo/lean/reviewer.ts": "registered-bespoke",
329
+ "src/turbo/lean/state.ts": "registered-bespoke",
330
+ "src/tools/apply-patch.ts": "external",
331
+ "src/tools/checkpoint.ts": "registered-bespoke",
332
+ "src/tools/record-implementation-review.ts": "registered-bespoke",
333
+ "src/tools/record-issue-publication.ts": "registered-bespoke",
334
+ "src/tools/record-issue-reproduction.ts": "registered-bespoke",
335
+ "src/tools/record-recurrence-sweep.ts": "registered-bespoke",
336
+ "src/tools/repo-graph/freshness.ts": "registered-bespoke",
337
+ "src/tools/repo-graph/storage.ts": "registered-bespoke",
338
+ "src/tools/sast-baseline.ts": "registered-bespoke",
339
+ "src/tools/spec-write.ts": "registered-bespoke",
340
+ "src/tools/submit-phase-council-verdicts.ts": "registered-bespoke",
341
+ "src/tools/write-drift-evidence.ts": "registered-bespoke",
342
+ "src/tools/write-final-council-evidence.ts": "registered-bespoke",
343
+ "src/tools/write-hallucination-evidence.ts": "registered-bespoke",
344
+ "src/tools/write-mutation-evidence.ts": "registered-bespoke",
345
+ "src/tools/write-pr-review-artifact.ts": "registered-bespoke",
346
+ "src/tools/write-pr-review-trigger-eval.ts": "registered-bespoke",
347
+ "src/config/bundled-skills.ts": "external",
348
+ "src/services/config-doctor.ts": "external",
349
+ "src/parallel/file-locks.ts": "registered-bespoke",
350
+ "src/utils/bun-compat.ts": "registered-bespoke",
351
+ "src/background/plan-sync-worker.ts": "reader-only",
352
+ "src/config/lane-permissions.ts": "reader-only",
353
+ "src/environment/profile.ts": "reader-only",
354
+ "src/worktree/core.ts": "reader-only"
355
+ });
356
+ function assertWellFormedTargetPath(targetPath) {
357
+ if (!path.isAbsolute(targetPath)) {
358
+ throw new Error(`atomic-write target must be absolute: ${targetPath}`);
359
+ }
360
+ if (/[\0-\x1f\x7f]/.test(targetPath)) {
361
+ throw new Error("atomic-write target contains control characters");
362
+ }
363
+ if (/[*?]/.test(targetPath) || /(^|[/\\])\{[^}]*\}([/\\]|$)/.test(targetPath)) {
364
+ throw new Error(`atomic-write target contains glob metacharacters: ${targetPath}`);
365
+ }
366
+ if (/(^|[/\\])~([/\\]|$)/.test(targetPath)) {
367
+ throw new Error("atomic-write target contains unresolved home-dir marker (~)");
368
+ }
369
+ if (/\$\{?[A-Za-z_][A-Za-z0-9_]*\}?/.test(targetPath) || /%[^/\\%]+%/.test(targetPath)) {
370
+ throw new Error("atomic-write target contains unresolved environment-variable form");
371
+ }
372
+ }
373
+ function lstatNotSymlink(p, what) {
374
+ const st = fs.lstatSync(p);
375
+ if (st.isSymbolicLink()) {
376
+ throw new Error(`${what} is a symlink/reparse point: ${p}`);
377
+ }
378
+ }
379
+ function assertSwarmContainedTarget(targetPath) {
380
+ assertWellFormedTargetPath(targetPath);
381
+ const resolved = path.normalize(path.resolve(targetPath));
382
+ const segments = resolved.split(path.sep);
383
+ let swarmIdx = -1;
384
+ for (let i = segments.length - 2;i >= 1; i--) {
385
+ if (segments[i] === ".swarm") {
386
+ swarmIdx = i;
387
+ break;
388
+ }
389
+ }
390
+ if (swarmIdx === -1) {
391
+ throw new Error(`atomic-write target is not under a project .swarm root: ${targetPath}`);
392
+ }
393
+ const swarmRoot = segments.slice(0, swarmIdx + 1).join(path.sep);
394
+ try {
395
+ const st = fs.lstatSync(swarmRoot);
396
+ if (!st.isDirectory() || st.isSymbolicLink()) {
397
+ throw new Error(`.swarm root is not a real directory (symlink/reparse or non-dir): ${swarmRoot}`);
398
+ }
399
+ } catch (err) {
400
+ if (err?.code !== "ENOENT")
401
+ throw err;
402
+ }
403
+ const rel = path.relative(swarmRoot, resolved);
404
+ if (!rel || rel.startsWith("..") || path.isAbsolute(rel)) {
405
+ throw new Error(`atomic-write target escapes .swarm root: ${targetPath}`);
406
+ }
407
+ let probe = swarmRoot;
408
+ for (const seg of rel.split(path.sep)) {
409
+ probe = path.join(probe, seg);
410
+ if (!fs.existsSync(probe))
411
+ break;
412
+ lstatNotSymlink(probe, "path segment under .swarm");
413
+ }
414
+ return { projectRoot: path.dirname(swarmRoot), swarmRoot };
415
+ }
416
+ var MAX_ATOMIC_WRITE_BYTES = 256 * 1024 * 1024;
417
+ var RENAME_RETRY_DELAYS_MS = [10, 25, 50, 100, 200];
418
+ var RETRYABLE_RENAME_CODES = new Set(["EPERM", "EBUSY", "EACCES", "EEXIST"]);
419
+ var _internals = {
420
+ randomSuffix: () => randomBytes(16).toString("hex"),
421
+ writeSync: (fd, buffer, offset, length) => fs.writeSync(fd, buffer, offset, length),
422
+ renameSync: (from, to) => fs.renameSync(from, to),
423
+ unlinkSync: (p) => fs.unlinkSync(p),
424
+ fsyncSync: (fd) => fs.fsyncSync(fd)
425
+ };
426
+ function toBuffer(content) {
427
+ if (typeof content === "string")
428
+ return Buffer.from(content, "utf-8");
429
+ return content;
430
+ }
431
+ function syncSleep(ms) {
432
+ try {
433
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
434
+ } catch {
435
+ const start = Date.now();
436
+ while (Date.now() - start < ms) {}
437
+ }
438
+ }
439
+ function renameWithRetry(tempPath, targetPath) {
440
+ let lastError;
441
+ for (let attempt = 0;attempt <= RENAME_RETRY_DELAYS_MS.length; attempt++) {
442
+ try {
443
+ _internals.renameSync(tempPath, targetPath);
444
+ return;
445
+ } catch (err) {
446
+ lastError = err;
447
+ const code = err?.code;
448
+ if (!code || !RETRYABLE_RENAME_CODES.has(code))
449
+ throw err;
450
+ if (attempt < RENAME_RETRY_DELAYS_MS.length) {
451
+ syncSleep(RENAME_RETRY_DELAYS_MS[attempt]);
452
+ }
453
+ }
454
+ }
455
+ throw lastError;
456
+ }
457
+ function writeAtomicSync(targetPath, content, options) {
458
+ if (options?.contained !== false) {
459
+ assertSwarmContainedTarget(targetPath);
460
+ } else {
461
+ assertWellFormedTargetPath(targetPath);
462
+ }
463
+ const resolvedTarget = path.resolve(targetPath);
464
+ const buffer = toBuffer(content);
465
+ const maxBytes = options?.maxBytes ?? MAX_ATOMIC_WRITE_BYTES;
466
+ if (buffer.byteLength > maxBytes) {
467
+ throw new Error(`atomic write exceeds ${maxBytes} byte bound: ${buffer.byteLength}`);
468
+ }
469
+ const tempPath = `${resolvedTarget}.${_internals.randomSuffix()}.tmp`;
470
+ fs.mkdirSync(path.dirname(tempPath), { recursive: true });
471
+ try {
472
+ const fd = fs.openSync(tempPath, "wx");
473
+ try {
474
+ let written = 0;
475
+ while (written < buffer.byteLength) {
476
+ written += _internals.writeSync(fd, buffer, written, buffer.byteLength - written);
477
+ }
478
+ if (options?.skipFsync !== true) {
479
+ try {
480
+ _internals.fsyncSync(fd);
481
+ } catch {}
482
+ }
483
+ } finally {
484
+ fs.closeSync(fd);
485
+ }
486
+ renameWithRetry(tempPath, resolvedTarget);
487
+ } finally {
488
+ try {
489
+ _internals.unlinkSync(tempPath);
490
+ } catch {}
491
+ }
492
+ try {
493
+ const dirFd = fs.openSync(path.dirname(resolvedTarget), "r");
494
+ try {
495
+ fs.fsyncSync(dirFd);
496
+ } finally {
497
+ fs.closeSync(dirFd);
498
+ }
499
+ } catch {}
500
+ invalidateCachedArtifact(resolvedTarget);
501
+ }
502
+ async function atomicWriteSwarmFile(targetPath, content, options) {
503
+ await new Promise((resolve2) => setImmediate(resolve2));
504
+ writeAtomicSync(targetPath, content, options);
505
+ }
506
+ function atomicWriteSwarmFileSync(targetPath, content, options) {
507
+ writeAtomicSync(targetPath, content, options);
508
+ }
509
+ async function atomicWriteFileAnyRoot(targetPath, content, options) {
510
+ await new Promise((resolve2) => setImmediate(resolve2));
511
+ writeAtomicSync(targetPath, content, { ...options, contained: false });
512
+ }
513
+
514
+ export { matchTempGrammar, parseTargetBasename, atomicWriteSwarmFile, atomicWriteSwarmFileSync, atomicWriteFileAnyRoot };
@@ -2,22 +2,23 @@
2
2
  import {
3
3
  computePlanStructureHash,
4
4
  derivePlanId
5
- } from "./index-7bvd5nh2.js";
5
+ } from "./index-apjdytwx.js";
6
6
  import {
7
7
  unsafePathTextReason
8
8
  } from "./index-556ja8an.js";
9
9
  import {
10
10
  PlanSchema
11
- } from "./index-zq9gs0yk.js";
11
+ } from "./index-0pcq32y2.js";
12
+ import {
13
+ atomicWriteSwarmFile,
14
+ atomicWriteSwarmFileSync
15
+ } from "./index-4evasm2b.js";
12
16
  import {
13
17
  assertProjectRoot
14
- } from "./index-f9vvg5xb.js";
18
+ } from "./index-pa86tpgt.js";
15
19
  import {
16
20
  require_proper_lockfile
17
21
  } from "./index-7g4c7s5r.js";
18
- import {
19
- bunWrite
20
- } from "./index-zj6t9zgx.js";
21
22
  import {
22
23
  __toESM
23
24
  } from "./index-a76rekgs.js";
@@ -562,11 +563,7 @@ function migrateLegacyBindingsSync(directory, scanCapacity = bindingFileScanCapa
562
563
  if (valid && binding) {
563
564
  const exactPath = getBindingFilePath(directory, binding);
564
565
  if (!fs2.existsSync(exactPath)) {
565
- const temp = `${exactPath}.migration-${process.pid}`;
566
- fs2.writeFileSync(temp, JSON.stringify(binding, null, 2), {
567
- flag: "wx"
568
- });
569
- fs2.renameSync(temp, exactPath);
566
+ atomicWriteSwarmFileSync(exactPath, JSON.stringify(binding, null, 2));
570
567
  } else {
571
568
  const existingRaw = readBoundedFile(exactPath);
572
569
  const existing = existingRaw ? validateScopeBindingPayload(directory, JSON.parse(existingRaw)) : null;
@@ -1596,26 +1593,10 @@ function resolveAuthorizedPrFeedbackScopeBindingFromDisk(input) {
1596
1593
  return admission.ok ? matches[0] : null;
1597
1594
  }
1598
1595
  async function atomicWrite(targetPath, content) {
1599
- const tempPath = `${targetPath}.tmp.${Date.now()}.${Math.floor(Math.random() * 1e9)}`;
1600
- try {
1601
- await bunWrite(tempPath, content);
1602
- fs2.renameSync(tempPath, targetPath);
1603
- } finally {
1604
- try {
1605
- fs2.unlinkSync(tempPath);
1606
- } catch {}
1607
- }
1596
+ await atomicWriteSwarmFile(targetPath, content);
1608
1597
  }
1609
1598
  function atomicWriteSync(targetPath, content) {
1610
- const tempPath = `${targetPath}.tmp.${Date.now()}.${Math.floor(Math.random() * 1e9)}`;
1611
- try {
1612
- fs2.writeFileSync(tempPath, content, { flag: "wx" });
1613
- fs2.renameSync(tempPath, targetPath);
1614
- } finally {
1615
- try {
1616
- fs2.unlinkSync(tempPath);
1617
- } catch {}
1618
- }
1599
+ atomicWriteSwarmFileSync(targetPath, content);
1619
1600
  }
1620
1601
  var _scopePersistenceInternals = {
1621
1602
  get liveBindingCapacity() {