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.
- package/.opencode/skills/commit-pr/SKILL.md +548 -0
- package/.opencode/skills/engineering-conventions/SKILL.md +57 -0
- package/.opencode/skills/phase-wrap/SKILL.md +1 -1
- package/.opencode/skills/running-tests/SKILL.md +282 -0
- package/.opencode/skills/writing-tests/SKILL.md +794 -0
- package/dist/cli/{guardrail-explain-xe0wjnxz.js → guardrail-explain-han9f51y.js} +4 -4
- package/dist/cli/{index-rh53rrpt.js → index-1ccnwh54.js} +16 -13
- package/dist/cli/{index-e8pk68cc.js → index-axwxkbdd.js} +166 -23
- package/dist/cli/{index-hs2knbfq.js → index-mz2z7jtn.js} +599 -260
- package/dist/cli/{index-d4hpgf63.js → index-prppjv2q.js} +1 -1
- package/dist/cli/{index-5p1gvn98.js → index-q3265fxa.js} +8 -4
- package/dist/cli/index.js +3 -3
- package/dist/cli/{knowledge-store-n4x6zyk7.js → knowledge-store-gsy6p46z.js} +1 -1
- package/dist/cli/{skill-generator-s0spm65v.js → skill-generator-1hzfyhth.js} +2 -2
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/link.d.ts +19 -0
- package/dist/commands/registry.d.ts +23 -0
- package/dist/commands/unlink.d.ts +13 -0
- package/dist/config/bundled-skills.d.ts +1 -1
- package/dist/config/skill-mirrors.d.ts +87 -0
- package/dist/hooks/knowledge-events.d.ts +3 -3
- package/dist/hooks/knowledge-link.d.ts +82 -0
- package/dist/hooks/knowledge-validator.d.ts +1 -1
- package/dist/index.js +2088 -1561
- package/dist/knowledge/identity.d.ts +9 -0
- package/dist/session/worktree-link-suggestion.d.ts +27 -0
- package/package.json +6 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
handleGuardrailExplain
|
|
4
|
-
} from "./index-
|
|
5
|
-
import"./index-
|
|
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-
|
|
9
|
-
import"./index-
|
|
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-
|
|
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, "
|
|
52
|
+
return path.join(resolveKnowledgeStoreDir(directory), "knowledge-events.jsonl");
|
|
51
53
|
}
|
|
52
54
|
function resolveKnowledgeCounterBaselinePath(directory) {
|
|
53
|
-
return path.join(directory, "
|
|
55
|
+
return path.join(resolveKnowledgeStoreDir(directory), "knowledge-counter-baseline.json");
|
|
54
56
|
}
|
|
55
57
|
function resolveLegacyApplicationLogPath(directory) {
|
|
56
|
-
return path.join(directory, "
|
|
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, "
|
|
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 =
|
|
812
|
-
const quarantinePath = path2.join(directory, "
|
|
813
|
-
const rejectedPath =
|
|
814
|
-
const swarmDir =
|
|
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
|
|
876
|
-
const
|
|
877
|
-
const
|
|
878
|
-
const
|
|
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
|
|
22
|
-
|
|
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", "
|
|
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
|
|
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
|
|
177
|
+
return path2.join(resolveKnowledgeStoreDir(directory), "knowledge.jsonl");
|
|
35
178
|
}
|
|
36
179
|
function resolveSwarmRejectedPath(directory) {
|
|
37
|
-
return
|
|
180
|
+
return path2.join(resolveKnowledgeStoreDir(directory), "knowledge-rejected.jsonl");
|
|
38
181
|
}
|
|
39
182
|
function resolveSwarmRetractionsPath(directory) {
|
|
40
|
-
return
|
|
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 ||
|
|
187
|
+
const home = process.env.HOME || os2.homedir();
|
|
45
188
|
let dataDir;
|
|
46
189
|
if (platform === "win32") {
|
|
47
|
-
dataDir =
|
|
190
|
+
dataDir = path2.join(process.env.LOCALAPPDATA || path2.join(home, "AppData", "Local"), "opencode-swarm", "Data");
|
|
48
191
|
} else if (platform === "darwin") {
|
|
49
|
-
dataDir =
|
|
192
|
+
dataDir = path2.join(home, "Library", "Application Support", "opencode-swarm");
|
|
50
193
|
} else {
|
|
51
|
-
dataDir =
|
|
194
|
+
dataDir = path2.join(process.env.XDG_DATA_HOME || path2.join(home, ".local", "share"), "opencode-swarm");
|
|
52
195
|
}
|
|
53
|
-
return
|
|
196
|
+
return path2.join(dataDir, "shared-learnings.jsonl");
|
|
54
197
|
}
|
|
55
198
|
function resolveHiveRejectedPath() {
|
|
56
199
|
const hivePath = resolveHiveKnowledgePath();
|
|
57
|
-
return
|
|
200
|
+
return path2.join(path2.dirname(hivePath), "shared-learnings-rejected.jsonl");
|
|
58
201
|
}
|
|
59
202
|
function resolveHiveEventsPath() {
|
|
60
203
|
const hivePath = resolveHiveKnowledgePath();
|
|
61
|
-
return
|
|
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 =
|
|
224
|
+
const resolvedPath = path2.resolve(filePath);
|
|
82
225
|
const cap = maxEntries !== undefined && maxEntries > 0 ? maxEntries : undefined;
|
|
83
226
|
if (cap !== undefined) {
|
|
84
|
-
if (!
|
|
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 (!
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 };
|