opencode-swarm 7.88.4 → 7.90.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.
@@ -1,12 +1,12 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-d4hpgf63.js";
5
- import"./index-hs2knbfq.js";
4
+ } from "./index-prppjv2q.js";
5
+ import"./index-mz2z7jtn.js";
6
6
  import"./index-6tnmt41c.js";
7
7
  import"./index-bm4f0nme.js";
8
- import"./index-rh53rrpt.js";
9
- import"./index-e8pk68cc.js";
8
+ import"./index-1ccnwh54.js";
9
+ import"./index-axwxkbdd.js";
10
10
  import"./index-bywt2171.js";
11
11
  import"./index-123s7kjc.js";
12
12
  import"./index-8y7qetpg.js";
@@ -5,10 +5,12 @@ import {
5
5
  inferTags,
6
6
  readKnowledge,
7
7
  resolveHiveKnowledgePath,
8
+ resolveKnowledgeStoreDir,
8
9
  resolveSwarmKnowledgePath,
10
+ resolveSwarmRejectedPath,
9
11
  rewriteKnowledge,
10
12
  transactKnowledge
11
- } from "./index-e8pk68cc.js";
13
+ } from "./index-axwxkbdd.js";
12
14
  import {
13
15
  atomicWriteFile
14
16
  } from "./index-fjwwrwr5.js";
@@ -47,13 +49,13 @@ var RECEIPT_EVENT_TYPES = new Set([
47
49
  "override"
48
50
  ]);
49
51
  function resolveKnowledgeEventsPath(directory) {
50
- return path.join(directory, ".swarm", "knowledge-events.jsonl");
52
+ return path.join(resolveKnowledgeStoreDir(directory), "knowledge-events.jsonl");
51
53
  }
52
54
  function resolveKnowledgeCounterBaselinePath(directory) {
53
- return path.join(directory, ".swarm", "knowledge-counter-baseline.json");
55
+ return path.join(resolveKnowledgeStoreDir(directory), "knowledge-counter-baseline.json");
54
56
  }
55
57
  function resolveLegacyApplicationLogPath(directory) {
56
- return path.join(directory, ".swarm", "knowledge-application.jsonl");
58
+ return path.join(resolveKnowledgeStoreDir(directory), "knowledge-application.jsonl");
57
59
  }
58
60
  async function readKnowledgeEvents(directory, maxEvents) {
59
61
  const filePath = resolveKnowledgeEventsPath(directory);
@@ -770,7 +772,7 @@ function validateActionability(entry) {
770
772
  return { actionable: false, reason };
771
773
  }
772
774
  function resolveUnactionablePath(directory) {
773
- return path2.join(directory, ".swarm", "knowledge-unactionable.jsonl");
775
+ return path2.join(resolveKnowledgeStoreDir(directory), "knowledge-unactionable.jsonl");
774
776
  }
775
777
  async function appendUnactionable(directory, entry, reason) {
776
778
  const filePath = resolveUnactionablePath(directory);
@@ -808,10 +810,10 @@ async function quarantineEntry(directory, entryId, reason, reportedBy) {
808
810
  return;
809
811
  }
810
812
  const sanitizedReason = reason.slice(0, 500).replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\x0d]/g, "");
811
- const knowledgePath = path2.join(directory, ".swarm", "knowledge.jsonl");
812
- const quarantinePath = path2.join(directory, ".swarm", "knowledge-quarantined.jsonl");
813
- const rejectedPath = path2.join(directory, ".swarm", "knowledge-rejected.jsonl");
814
- const swarmDir = path2.join(directory, ".swarm");
813
+ const knowledgePath = resolveSwarmKnowledgePath(directory);
814
+ const quarantinePath = path2.join(resolveKnowledgeStoreDir(directory), "knowledge-quarantined.jsonl");
815
+ const rejectedPath = resolveSwarmRejectedPath(directory);
816
+ const swarmDir = resolveKnowledgeStoreDir(directory);
815
817
  await mkdir2(swarmDir, { recursive: true });
816
818
  let release;
817
819
  try {
@@ -872,10 +874,11 @@ async function restoreEntry(directory, entryId) {
872
874
  warn("[knowledge-validator] restoreEntry: invalid entryId rejected");
873
875
  return;
874
876
  }
875
- const knowledgePath = path2.join(directory, ".swarm", "knowledge.jsonl");
876
- const quarantinePath = path2.join(directory, ".swarm", "knowledge-quarantined.jsonl");
877
- const rejectedPath = path2.join(directory, ".swarm", "knowledge-rejected.jsonl");
878
- const swarmDir = path2.join(directory, ".swarm");
877
+ const storeDir = resolveKnowledgeStoreDir(directory);
878
+ const knowledgePath = resolveSwarmKnowledgePath(directory);
879
+ const quarantinePath = path2.join(storeDir, "knowledge-quarantined.jsonl");
880
+ const rejectedPath = resolveSwarmRejectedPath(directory);
881
+ const swarmDir = storeDir;
879
882
  await mkdir2(swarmDir, { recursive: true });
880
883
  let release;
881
884
  try {
@@ -14,51 +14,194 @@ import {
14
14
 
15
15
  // src/hooks/knowledge-store.ts
16
16
  var import_proper_lockfile = __toESM(require_proper_lockfile(), 1);
17
- import { existsSync } from "fs";
17
+ import { existsSync as existsSync2 } from "fs";
18
18
  import { appendFile, mkdir, readFile } from "fs/promises";
19
+ import * as os2 from "os";
20
+ import * as path2 from "path";
21
+
22
+ // src/hooks/knowledge-link.ts
23
+ import { existsSync, mkdirSync, readFileSync, rmSync } from "fs";
19
24
  import * as os from "os";
20
25
  import * as path from "path";
21
- var KNOWLEDGE_JSONL_CACHE_NAMESPACE = "knowledge-jsonl:normalized:v1";
22
- function getPlatformConfigDir() {
26
+ var LINK_POINTER_FILENAME = "link.json";
27
+ var MAX_LINK_ID_LENGTH = 64;
28
+ var WINDOWS_RESERVED_NAMES = new Set([
29
+ "con",
30
+ "prn",
31
+ "aux",
32
+ "nul",
33
+ "com0",
34
+ "com1",
35
+ "com2",
36
+ "com3",
37
+ "com4",
38
+ "com5",
39
+ "com6",
40
+ "com7",
41
+ "com8",
42
+ "com9",
43
+ "lpt0",
44
+ "lpt1",
45
+ "lpt2",
46
+ "lpt3",
47
+ "lpt4",
48
+ "lpt5",
49
+ "lpt6",
50
+ "lpt7",
51
+ "lpt8",
52
+ "lpt9"
53
+ ]);
54
+ var CACHE_TTL_MS = 2000;
55
+ var MAX_CACHE_ENTRIES = 500;
56
+ function resolveDataDir() {
23
57
  const platform = process.platform;
24
58
  const home = process.env.HOME || os.homedir();
25
59
  if (platform === "win32") {
26
- return path.join(process.env.LOCALAPPDATA || path.join(home, "AppData", "Local"), "opencode-swarm", "config");
60
+ return path.join(process.env.LOCALAPPDATA || path.join(home, "AppData", "Local"), "opencode-swarm", "Data");
27
61
  } else if (platform === "darwin") {
28
62
  return path.join(home, "Library", "Application Support", "opencode-swarm");
63
+ }
64
+ return path.join(process.env.XDG_DATA_HOME || path.join(home, ".local", "share"), "opencode-swarm");
65
+ }
66
+ function resolveLinkBaseDir() {
67
+ return path.join(resolveDataDir(), "links");
68
+ }
69
+ function resolveLinkDir(linkId) {
70
+ return path.join(resolveLinkBaseDir(), linkId);
71
+ }
72
+ function sanitizeLinkId(name) {
73
+ if (typeof name !== "string")
74
+ return null;
75
+ const cleaned = name.trim().toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/-+/g, "-").replace(/^[-.]+|[-.]+$/g, "").slice(0, MAX_LINK_ID_LENGTH).replace(/[-.]+$/g, "");
76
+ if (cleaned.length === 0)
77
+ return null;
78
+ const base = cleaned.split(".")[0];
79
+ if (WINDOWS_RESERVED_NAMES.has(base))
80
+ return null;
81
+ return cleaned;
82
+ }
83
+ function resolveLinkPointerPath(directory) {
84
+ return path.join(directory, ".swarm", LINK_POINTER_FILENAME);
85
+ }
86
+ function readLinkPointer(directory) {
87
+ const pointerPath = resolveLinkPointerPath(directory);
88
+ if (!existsSync(pointerPath))
89
+ return null;
90
+ try {
91
+ const raw = JSON.parse(readFileSync(pointerPath, "utf-8"));
92
+ if (!raw || typeof raw !== "object")
93
+ return null;
94
+ const obj = raw;
95
+ const linkId = obj.linkId;
96
+ if (typeof linkId !== "string" || linkId.length === 0)
97
+ return null;
98
+ const safeId = sanitizeLinkId(linkId);
99
+ if (!safeId)
100
+ return null;
101
+ return {
102
+ version: 1,
103
+ linkId: safeId,
104
+ name: typeof obj.name === "string" ? obj.name : undefined,
105
+ createdAt: typeof obj.createdAt === "string" ? obj.createdAt : new Date(0).toISOString(),
106
+ source: obj.source === "auto" ? "auto" : "manual"
107
+ };
108
+ } catch {
109
+ return null;
110
+ }
111
+ }
112
+ async function writeLinkPointer(directory, pointer) {
113
+ const swarmDir = path.join(directory, ".swarm");
114
+ mkdirSync(swarmDir, { recursive: true });
115
+ const pointerPath = resolveLinkPointerPath(directory);
116
+ await atomicWriteFile(pointerPath, JSON.stringify(pointer, null, 2));
117
+ invalidateKnowledgeStoreDirCache(directory);
118
+ }
119
+ async function removeLinkPointer(directory) {
120
+ const pointerPath = resolveLinkPointerPath(directory);
121
+ try {
122
+ rmSync(pointerPath, { force: true });
123
+ } finally {
124
+ invalidateKnowledgeStoreDirCache(directory);
125
+ }
126
+ }
127
+ var _resolutionCache = new Map;
128
+ function resolveKnowledgeStoreDir(directory) {
129
+ const localSwarm = path.join(directory, ".swarm");
130
+ const now = Date.now();
131
+ const cached = _resolutionCache.get(directory);
132
+ if (cached && now < cached.expires) {
133
+ return cached.linkDir ?? localSwarm;
134
+ }
135
+ let linkDir = null;
136
+ try {
137
+ const pointer = readLinkPointer(directory);
138
+ if (pointer) {
139
+ linkDir = path.resolve(resolveLinkDir(pointer.linkId));
140
+ }
141
+ } catch {
142
+ linkDir = null;
143
+ }
144
+ if (!_resolutionCache.has(directory) && _resolutionCache.size >= MAX_CACHE_ENTRIES) {
145
+ const oldest = _resolutionCache.keys().next().value;
146
+ if (oldest !== undefined)
147
+ _resolutionCache.delete(oldest);
148
+ }
149
+ _resolutionCache.set(directory, { linkDir, expires: now + CACHE_TTL_MS });
150
+ return linkDir ?? localSwarm;
151
+ }
152
+ function invalidateKnowledgeStoreDirCache(directory) {
153
+ if (directory === undefined) {
154
+ _resolutionCache.clear();
155
+ return;
156
+ }
157
+ _resolutionCache.delete(directory);
158
+ }
159
+ function isLinked(directory) {
160
+ return readLinkPointer(directory) !== null;
161
+ }
162
+
163
+ // src/hooks/knowledge-store.ts
164
+ var KNOWLEDGE_JSONL_CACHE_NAMESPACE = "knowledge-jsonl:normalized:v1";
165
+ function getPlatformConfigDir() {
166
+ const platform = process.platform;
167
+ const home = process.env.HOME || os2.homedir();
168
+ if (platform === "win32") {
169
+ return path2.join(process.env.LOCALAPPDATA || path2.join(home, "AppData", "Local"), "opencode-swarm", "config");
170
+ } else if (platform === "darwin") {
171
+ return path2.join(home, "Library", "Application Support", "opencode-swarm");
29
172
  } else {
30
- return path.join(process.env.XDG_CONFIG_HOME || path.join(home, ".config"), "opencode-swarm");
173
+ return path2.join(process.env.XDG_CONFIG_HOME || path2.join(home, ".config"), "opencode-swarm");
31
174
  }
32
175
  }
33
176
  function resolveSwarmKnowledgePath(directory) {
34
- return path.join(directory, ".swarm", "knowledge.jsonl");
177
+ return path2.join(resolveKnowledgeStoreDir(directory), "knowledge.jsonl");
35
178
  }
36
179
  function resolveSwarmRejectedPath(directory) {
37
- return path.join(directory, ".swarm", "knowledge-rejected.jsonl");
180
+ return path2.join(resolveKnowledgeStoreDir(directory), "knowledge-rejected.jsonl");
38
181
  }
39
182
  function resolveSwarmRetractionsPath(directory) {
40
- return path.join(directory, ".swarm", "knowledge-retractions.jsonl");
183
+ return path2.join(resolveKnowledgeStoreDir(directory), "knowledge-retractions.jsonl");
41
184
  }
42
185
  function resolveHiveKnowledgePath() {
43
186
  const platform = process.platform;
44
- const home = process.env.HOME || os.homedir();
187
+ const home = process.env.HOME || os2.homedir();
45
188
  let dataDir;
46
189
  if (platform === "win32") {
47
- dataDir = path.join(process.env.LOCALAPPDATA || path.join(home, "AppData", "Local"), "opencode-swarm", "Data");
190
+ dataDir = path2.join(process.env.LOCALAPPDATA || path2.join(home, "AppData", "Local"), "opencode-swarm", "Data");
48
191
  } else if (platform === "darwin") {
49
- dataDir = path.join(home, "Library", "Application Support", "opencode-swarm");
192
+ dataDir = path2.join(home, "Library", "Application Support", "opencode-swarm");
50
193
  } else {
51
- dataDir = path.join(process.env.XDG_DATA_HOME || path.join(home, ".local", "share"), "opencode-swarm");
194
+ dataDir = path2.join(process.env.XDG_DATA_HOME || path2.join(home, ".local", "share"), "opencode-swarm");
52
195
  }
53
- return path.join(dataDir, "shared-learnings.jsonl");
196
+ return path2.join(dataDir, "shared-learnings.jsonl");
54
197
  }
55
198
  function resolveHiveRejectedPath() {
56
199
  const hivePath = resolveHiveKnowledgePath();
57
- return path.join(path.dirname(hivePath), "shared-learnings-rejected.jsonl");
200
+ return path2.join(path2.dirname(hivePath), "shared-learnings-rejected.jsonl");
58
201
  }
59
202
  function resolveHiveEventsPath() {
60
203
  const hivePath = resolveHiveKnowledgePath();
61
- return path.join(path.dirname(hivePath), "shared-knowledge-events.jsonl");
204
+ return path2.join(path2.dirname(hivePath), "shared-knowledge-events.jsonl");
62
205
  }
63
206
  function parseKnowledgeContent(content, max) {
64
207
  const results = [];
@@ -78,16 +221,16 @@ function parseKnowledgeContent(content, max) {
78
221
  return results;
79
222
  }
80
223
  async function readKnowledge(filePath, maxEntries) {
81
- const resolvedPath = path.resolve(filePath);
224
+ const resolvedPath = path2.resolve(filePath);
82
225
  const cap = maxEntries !== undefined && maxEntries > 0 ? maxEntries : undefined;
83
226
  if (cap !== undefined) {
84
- if (!existsSync(resolvedPath))
227
+ if (!existsSync2(resolvedPath))
85
228
  return [];
86
229
  const content = await readFile(resolvedPath, "utf-8");
87
230
  return parseKnowledgeContent(content, cap);
88
231
  }
89
232
  const entries = await readCachedParsedFile(resolvedPath, KNOWLEDGE_JSONL_CACHE_NAMESPACE, async () => {
90
- if (!existsSync(resolvedPath))
233
+ if (!existsSync2(resolvedPath))
91
234
  return null;
92
235
  return await readFile(resolvedPath, "utf-8");
93
236
  }, (content) => parseKnowledgeContent(content, Infinity));
@@ -169,7 +312,7 @@ async function appendRetractionRecord(directory, record) {
169
312
  await appendKnowledge(resolveSwarmRetractionsPath(directory), record);
170
313
  }
171
314
  async function appendKnowledge(filePath, entry) {
172
- const dir = path.dirname(filePath);
315
+ const dir = path2.dirname(filePath);
173
316
  await mkdir(dir, { recursive: true });
174
317
  let release = null;
175
318
  try {
@@ -188,7 +331,7 @@ async function appendKnowledge(filePath, entry) {
188
331
  }
189
332
  }
190
333
  async function rewriteKnowledge(filePath, entries) {
191
- const dir = path.dirname(filePath);
334
+ const dir = path2.dirname(filePath);
192
335
  await mkdir(dir, { recursive: true });
193
336
  let release = null;
194
337
  try {
@@ -209,7 +352,7 @@ async function rewriteKnowledge(filePath, entries) {
209
352
  }
210
353
  }
211
354
  async function transactFile(filePath, read, write, mutate) {
212
- const dir = path.dirname(filePath);
355
+ const dir = path2.dirname(filePath);
213
356
  try {
214
357
  await mkdir(dir, { recursive: true });
215
358
  } catch {
@@ -474,7 +617,7 @@ async function applyConfidenceDeltas(filePath, deltas) {
474
617
  }
475
618
  let release = null;
476
619
  try {
477
- const dir = path.dirname(filePath);
620
+ const dir = path2.dirname(filePath);
478
621
  await mkdir(dir, { recursive: true });
479
622
  release = await import_proper_lockfile.default.lock(dir, {
480
623
  retries: { retries: 5, minTimeout: 100, maxTimeout: 500 },
@@ -537,4 +680,4 @@ var _internals = {
537
680
  bumpKnowledgeConfidenceBatch
538
681
  };
539
682
 
540
- export { getPlatformConfigDir, resolveSwarmKnowledgePath, resolveSwarmRejectedPath, resolveSwarmRetractionsPath, resolveHiveKnowledgePath, resolveHiveRejectedPath, resolveHiveEventsPath, readKnowledge, normalizeEntry, readRejectedLessons, readRetractionRecords, appendRetractionRecord, appendKnowledge, rewriteKnowledge, transactFile, transactKnowledge, appendKnowledgeWithCapEnforcement, enforceKnowledgeCap, sweepAgedEntries, sweepStaleTodos, appendRejectedLesson, normalize, wordBigrams, jaccardBigram, findNearDuplicate, computeConfidence, OUTCOME_SIGNAL_SMOOTHING, computeOutcomeSignal, inferTags, bumpKnowledgeConfidenceBatch, _internals };
683
+ export { resolveLinkDir, sanitizeLinkId, readLinkPointer, writeLinkPointer, removeLinkPointer, resolveKnowledgeStoreDir, isLinked, getPlatformConfigDir, resolveSwarmKnowledgePath, resolveSwarmRejectedPath, resolveSwarmRetractionsPath, resolveHiveKnowledgePath, resolveHiveRejectedPath, resolveHiveEventsPath, readKnowledge, normalizeEntry, readRejectedLessons, readRetractionRecords, appendRetractionRecord, appendKnowledge, rewriteKnowledge, transactFile, transactKnowledge, appendKnowledgeWithCapEnforcement, enforceKnowledgeCap, sweepAgedEntries, sweepStaleTodos, appendRejectedLesson, normalize, wordBigrams, jaccardBigram, findNearDuplicate, computeConfidence, OUTCOME_SIGNAL_SMOOTHING, computeOutcomeSignal, inferTags, bumpKnowledgeConfidenceBatch, _internals };