iosm-cli 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -47
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +38 -11
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/failure-retrospective.d.ts +12 -0
- package/dist/core/failure-retrospective.d.ts.map +1 -0
- package/dist/core/failure-retrospective.js +115 -0
- package/dist/core/failure-retrospective.js.map +1 -0
- package/dist/core/project-index/index.d.ts +17 -0
- package/dist/core/project-index/index.d.ts.map +1 -0
- package/dist/core/project-index/index.js +323 -0
- package/dist/core/project-index/index.js.map +1 -0
- package/dist/core/project-index/types.d.ts +34 -0
- package/dist/core/project-index/types.d.ts.map +1 -0
- package/dist/core/project-index/types.js +2 -0
- package/dist/core/project-index/types.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +8 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/shared-memory.d.ts +46 -0
- package/dist/core/shared-memory.d.ts.map +1 -0
- package/dist/core/shared-memory.js +253 -0
- package/dist/core/shared-memory.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +5 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagents.js +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/swarm/gates.d.ts +9 -0
- package/dist/core/swarm/gates.d.ts.map +1 -0
- package/dist/core/swarm/gates.js +65 -0
- package/dist/core/swarm/gates.js.map +1 -0
- package/dist/core/swarm/index.d.ts +9 -0
- package/dist/core/swarm/index.d.ts.map +1 -0
- package/dist/core/swarm/index.js +9 -0
- package/dist/core/swarm/index.js.map +1 -0
- package/dist/core/swarm/locks.d.ts +21 -0
- package/dist/core/swarm/locks.d.ts.map +1 -0
- package/dist/core/swarm/locks.js +93 -0
- package/dist/core/swarm/locks.js.map +1 -0
- package/dist/core/swarm/planner.d.ts +16 -0
- package/dist/core/swarm/planner.d.ts.map +1 -0
- package/dist/core/swarm/planner.js +137 -0
- package/dist/core/swarm/planner.js.map +1 -0
- package/dist/core/swarm/retry.d.ts +16 -0
- package/dist/core/swarm/retry.d.ts.map +1 -0
- package/dist/core/swarm/retry.js +32 -0
- package/dist/core/swarm/retry.js.map +1 -0
- package/dist/core/swarm/scheduler.d.ts +48 -0
- package/dist/core/swarm/scheduler.d.ts.map +1 -0
- package/dist/core/swarm/scheduler.js +554 -0
- package/dist/core/swarm/scheduler.js.map +1 -0
- package/dist/core/swarm/spawn.d.ts +16 -0
- package/dist/core/swarm/spawn.d.ts.map +1 -0
- package/dist/core/swarm/spawn.js +42 -0
- package/dist/core/swarm/spawn.js.map +1 -0
- package/dist/core/swarm/state-store.d.ts +35 -0
- package/dist/core/swarm/state-store.d.ts.map +1 -0
- package/dist/core/swarm/state-store.js +106 -0
- package/dist/core/swarm/state-store.js.map +1 -0
- package/dist/core/swarm/types.d.ts +116 -0
- package/dist/core/swarm/types.d.ts.map +1 -0
- package/dist/core/swarm/types.js +2 -0
- package/dist/core/swarm/types.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +3 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/shared-memory.d.ts +23 -0
- package/dist/core/tools/shared-memory.d.ts.map +1 -0
- package/dist/core/tools/shared-memory.js +134 -0
- package/dist/core/tools/shared-memory.js.map +1 -0
- package/dist/core/tools/task.d.ts +8 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +664 -123
- package/dist/core/tools/task.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +27 -4
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/subagent-message.js +14 -0
- package/dist/modes/interactive/components/subagent-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +38 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1362 -31
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +11 -1
- package/docs/interactive-mode.md +42 -3
- package/docs/orchestration-and-subagents.md +96 -169
- package/package.json +4 -3
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
4
|
+
const TEXT_EXTENSIONS = new Set([
|
|
5
|
+
".ts",
|
|
6
|
+
".tsx",
|
|
7
|
+
".js",
|
|
8
|
+
".jsx",
|
|
9
|
+
".mjs",
|
|
10
|
+
".cjs",
|
|
11
|
+
".py",
|
|
12
|
+
".go",
|
|
13
|
+
".rs",
|
|
14
|
+
".java",
|
|
15
|
+
".kt",
|
|
16
|
+
".swift",
|
|
17
|
+
".json",
|
|
18
|
+
".yaml",
|
|
19
|
+
".yml",
|
|
20
|
+
".toml",
|
|
21
|
+
".md",
|
|
22
|
+
".sql",
|
|
23
|
+
".css",
|
|
24
|
+
".scss",
|
|
25
|
+
".html",
|
|
26
|
+
]);
|
|
27
|
+
const EXCLUDED_DIRS = new Set([".git", "node_modules", "dist", "build", "coverage", ".next", ".iosm"]);
|
|
28
|
+
function toPosixPath(input) {
|
|
29
|
+
return input.split(sep).join("/");
|
|
30
|
+
}
|
|
31
|
+
function getExtension(filePath) {
|
|
32
|
+
const normalized = filePath.toLowerCase();
|
|
33
|
+
const index = normalized.lastIndexOf(".");
|
|
34
|
+
return index >= 0 ? normalized.slice(index) : "";
|
|
35
|
+
}
|
|
36
|
+
function normalizeToken(value) {
|
|
37
|
+
return value.trim().toLowerCase();
|
|
38
|
+
}
|
|
39
|
+
function tokenize(input) {
|
|
40
|
+
return input
|
|
41
|
+
.toLowerCase()
|
|
42
|
+
.split(/[^\p{L}\p{N}_-]+/u)
|
|
43
|
+
.map((token) => token.trim())
|
|
44
|
+
.filter((token) => token.length >= 2);
|
|
45
|
+
}
|
|
46
|
+
function collectImports(content) {
|
|
47
|
+
const result = new Set();
|
|
48
|
+
const importRegexes = [
|
|
49
|
+
/\bimport\s+[^"'\n]*["']([^"']+)["']/g,
|
|
50
|
+
/\brequire\(\s*["']([^"']+)["']\s*\)/g,
|
|
51
|
+
/\bfrom\s+["']([^"']+)["']/g,
|
|
52
|
+
/\buse\s+([a-zA-Z0-9_:]+)/g,
|
|
53
|
+
];
|
|
54
|
+
for (const regex of importRegexes) {
|
|
55
|
+
for (const match of content.matchAll(regex)) {
|
|
56
|
+
const value = (match[1] ?? "").trim();
|
|
57
|
+
if (value)
|
|
58
|
+
result.add(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return [...result].slice(0, 40);
|
|
62
|
+
}
|
|
63
|
+
function collectSymbols(content) {
|
|
64
|
+
const result = new Set();
|
|
65
|
+
const symbolRegexes = [
|
|
66
|
+
/\b(?:export\s+)?(?:class|interface|type|enum|function)\s+([A-Za-z_][A-Za-z0-9_]*)/g,
|
|
67
|
+
/\bconst\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*\(/g,
|
|
68
|
+
/\bdef\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(/g,
|
|
69
|
+
];
|
|
70
|
+
for (const regex of symbolRegexes) {
|
|
71
|
+
for (const match of content.matchAll(regex)) {
|
|
72
|
+
const value = (match[1] ?? "").trim();
|
|
73
|
+
if (value)
|
|
74
|
+
result.add(value);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return [...result].slice(0, 80);
|
|
78
|
+
}
|
|
79
|
+
function inferOwnerZone(relPath) {
|
|
80
|
+
const [top] = relPath.split("/");
|
|
81
|
+
if (!top)
|
|
82
|
+
return "root";
|
|
83
|
+
if (top === "src" || top === "app" || top === "packages") {
|
|
84
|
+
const [, second] = relPath.split("/");
|
|
85
|
+
return second ? `${top}/${second}` : top;
|
|
86
|
+
}
|
|
87
|
+
return top;
|
|
88
|
+
}
|
|
89
|
+
function repoScaleFromCounts(totalFiles, sourceFiles) {
|
|
90
|
+
if (totalFiles >= 8000 || sourceFiles >= 4000)
|
|
91
|
+
return "large";
|
|
92
|
+
if (totalFiles >= 2500 || sourceFiles >= 1200)
|
|
93
|
+
return "medium";
|
|
94
|
+
return "small";
|
|
95
|
+
}
|
|
96
|
+
function scoreEntry(entry, tokens) {
|
|
97
|
+
if (tokens.length === 0)
|
|
98
|
+
return 0;
|
|
99
|
+
const normalizedPath = entry.path.toLowerCase();
|
|
100
|
+
let score = 0;
|
|
101
|
+
for (const token of tokens) {
|
|
102
|
+
if (normalizedPath.includes(token))
|
|
103
|
+
score += 3;
|
|
104
|
+
if (entry.ownerZone.toLowerCase().includes(token))
|
|
105
|
+
score += 2;
|
|
106
|
+
if (entry.symbols.some((symbol) => symbol.toLowerCase().includes(token)))
|
|
107
|
+
score += 2;
|
|
108
|
+
if (entry.imports.some((item) => item.toLowerCase().includes(token)))
|
|
109
|
+
score += 1;
|
|
110
|
+
}
|
|
111
|
+
return score;
|
|
112
|
+
}
|
|
113
|
+
function fileHash(input) {
|
|
114
|
+
return createHash("sha256").update(input).digest("hex");
|
|
115
|
+
}
|
|
116
|
+
function getStorageRoot(cwd) {
|
|
117
|
+
return join(resolve(cwd), ".iosm", "project-index");
|
|
118
|
+
}
|
|
119
|
+
export function getProjectIndexPath(cwd) {
|
|
120
|
+
return join(getStorageRoot(cwd), "index.json");
|
|
121
|
+
}
|
|
122
|
+
export function loadProjectIndex(cwd) {
|
|
123
|
+
const filePath = getProjectIndexPath(cwd);
|
|
124
|
+
if (!existsSync(filePath))
|
|
125
|
+
return undefined;
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
128
|
+
if (!parsed?.meta || !Array.isArray(parsed.entries))
|
|
129
|
+
return undefined;
|
|
130
|
+
return parsed;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function saveProjectIndex(cwd, index) {
|
|
137
|
+
const filePath = getProjectIndexPath(cwd);
|
|
138
|
+
mkdirSync(getStorageRoot(cwd), { recursive: true });
|
|
139
|
+
writeFileSync(filePath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
|
|
140
|
+
}
|
|
141
|
+
function scanFiles(cwd, maxFiles) {
|
|
142
|
+
const root = resolve(cwd);
|
|
143
|
+
const stack = [root];
|
|
144
|
+
const files = [];
|
|
145
|
+
while (stack.length > 0 && files.length < maxFiles) {
|
|
146
|
+
const current = stack.pop();
|
|
147
|
+
if (!current)
|
|
148
|
+
break;
|
|
149
|
+
let entries;
|
|
150
|
+
try {
|
|
151
|
+
entries = readdirSync(current, { withFileTypes: true });
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
for (const entry of entries) {
|
|
157
|
+
const absPath = join(current, entry.name);
|
|
158
|
+
if (entry.isDirectory()) {
|
|
159
|
+
if (EXCLUDED_DIRS.has(entry.name))
|
|
160
|
+
continue;
|
|
161
|
+
stack.push(absPath);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (!entry.isFile())
|
|
165
|
+
continue;
|
|
166
|
+
if (!TEXT_EXTENSIONS.has(getExtension(entry.name)))
|
|
167
|
+
continue;
|
|
168
|
+
let stats;
|
|
169
|
+
try {
|
|
170
|
+
stats = statSync(absPath);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (!stats.isFile() || stats.size > 1_000_000)
|
|
176
|
+
continue;
|
|
177
|
+
files.push(absPath);
|
|
178
|
+
if (files.length >= maxFiles)
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return files.sort((a, b) => a.localeCompare(b));
|
|
183
|
+
}
|
|
184
|
+
function buildEntry(cwd, absPath, previous) {
|
|
185
|
+
let stat;
|
|
186
|
+
try {
|
|
187
|
+
stat = statSync(absPath);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
if (!stat.isFile())
|
|
193
|
+
return undefined;
|
|
194
|
+
const relPath = toPosixPath(relative(cwd, absPath));
|
|
195
|
+
if (!relPath || relPath.startsWith(".."))
|
|
196
|
+
return undefined;
|
|
197
|
+
if (previous && previous.mtimeMs === stat.mtimeMs && previous.size === stat.size) {
|
|
198
|
+
return previous;
|
|
199
|
+
}
|
|
200
|
+
let content = "";
|
|
201
|
+
try {
|
|
202
|
+
content = readFileSync(absPath, "utf8");
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return {
|
|
206
|
+
path: relPath,
|
|
207
|
+
size: stat.size,
|
|
208
|
+
mtimeMs: stat.mtimeMs,
|
|
209
|
+
ownerZone: inferOwnerZone(relPath),
|
|
210
|
+
imports: previous?.imports ?? [],
|
|
211
|
+
symbols: previous?.symbols ?? [],
|
|
212
|
+
changeFreq: (previous?.changeFreq ?? 0) + 1,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const digest = fileHash(content);
|
|
216
|
+
const previousDigest = previous ? fileHash([previous.path, previous.mtimeMs, previous.size, previous.symbols.join(",")].join("|")) : "";
|
|
217
|
+
const changed = !previous || previousDigest !== digest;
|
|
218
|
+
return {
|
|
219
|
+
path: relPath,
|
|
220
|
+
size: stat.size,
|
|
221
|
+
mtimeMs: stat.mtimeMs,
|
|
222
|
+
ownerZone: inferOwnerZone(relPath),
|
|
223
|
+
imports: collectImports(content),
|
|
224
|
+
symbols: collectSymbols(content),
|
|
225
|
+
changeFreq: changed ? (previous?.changeFreq ?? 0) + 1 : (previous?.changeFreq ?? 0),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
export function buildProjectIndex(cwd, options) {
|
|
229
|
+
const root = resolve(cwd);
|
|
230
|
+
const maxFiles = Math.max(500, options?.maxFiles ?? 20_000);
|
|
231
|
+
const files = scanFiles(root, maxFiles);
|
|
232
|
+
const previous = options?.incrementalFrom;
|
|
233
|
+
const changedSet = options?.changedFiles && options.changedFiles.length > 0
|
|
234
|
+
? new Set(options.changedFiles.map((filePath) => toPosixPath(filePath)))
|
|
235
|
+
: undefined;
|
|
236
|
+
const previousByPath = new Map();
|
|
237
|
+
for (const entry of previous?.entries ?? []) {
|
|
238
|
+
previousByPath.set(entry.path, entry);
|
|
239
|
+
}
|
|
240
|
+
const entries = [];
|
|
241
|
+
let sourceFiles = 0;
|
|
242
|
+
let testFiles = 0;
|
|
243
|
+
for (const absPath of files) {
|
|
244
|
+
const relPath = toPosixPath(relative(root, absPath));
|
|
245
|
+
const previousEntry = previousByPath.get(relPath);
|
|
246
|
+
const entry = changedSet && previousEntry && !changedSet.has(relPath)
|
|
247
|
+
? previousEntry
|
|
248
|
+
: buildEntry(root, absPath, previousEntry);
|
|
249
|
+
if (!entry)
|
|
250
|
+
continue;
|
|
251
|
+
entries.push(entry);
|
|
252
|
+
if (/^(src|app|packages)\//.test(entry.path))
|
|
253
|
+
sourceFiles += 1;
|
|
254
|
+
if (/(^|\/)(test|tests|__tests__)\//.test(entry.path) || /\.(test|spec)\./.test(entry.path))
|
|
255
|
+
testFiles += 1;
|
|
256
|
+
}
|
|
257
|
+
const meta = {
|
|
258
|
+
version: 1,
|
|
259
|
+
cwd: root,
|
|
260
|
+
builtAt: previous?.meta.builtAt ?? new Date().toISOString(),
|
|
261
|
+
updatedAt: new Date().toISOString(),
|
|
262
|
+
totalFiles: entries.length,
|
|
263
|
+
sourceFiles,
|
|
264
|
+
testFiles,
|
|
265
|
+
repoScaleMode: repoScaleFromCounts(entries.length, sourceFiles),
|
|
266
|
+
};
|
|
267
|
+
return { meta, entries };
|
|
268
|
+
}
|
|
269
|
+
export function ensureProjectIndex(cwd, modeHint) {
|
|
270
|
+
const existing = loadProjectIndex(cwd);
|
|
271
|
+
if (!existing) {
|
|
272
|
+
const built = buildProjectIndex(cwd);
|
|
273
|
+
saveProjectIndex(cwd, built);
|
|
274
|
+
return { index: built, rebuilt: true };
|
|
275
|
+
}
|
|
276
|
+
const needsRebuild = (existing.meta.repoScaleMode === "large" || modeHint === "large") &&
|
|
277
|
+
Date.now() - Date.parse(existing.meta.updatedAt) > 60_000;
|
|
278
|
+
if (needsRebuild) {
|
|
279
|
+
const rebuilt = buildProjectIndex(cwd, { incrementalFrom: existing });
|
|
280
|
+
saveProjectIndex(cwd, rebuilt);
|
|
281
|
+
return { index: rebuilt, rebuilt: true };
|
|
282
|
+
}
|
|
283
|
+
return { index: existing, rebuilt: false };
|
|
284
|
+
}
|
|
285
|
+
export function queryProjectIndex(index, queryText, limit = 20) {
|
|
286
|
+
const tokens = [...new Set(tokenize(queryText).map(normalizeToken))].slice(0, 12);
|
|
287
|
+
const scored = index.entries
|
|
288
|
+
.map((entry) => ({ entry, score: scoreEntry(entry, tokens) }))
|
|
289
|
+
.filter((item) => item.score > 0)
|
|
290
|
+
.sort((a, b) => b.score - a.score || a.entry.path.localeCompare(b.entry.path))
|
|
291
|
+
.slice(0, Math.max(1, limit));
|
|
292
|
+
return {
|
|
293
|
+
matches: scored.map((item) => item.entry),
|
|
294
|
+
tokens,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
export function inferRepoScaleMode(input) {
|
|
298
|
+
return repoScaleFromCounts(input.totalFiles, input.sourceFiles);
|
|
299
|
+
}
|
|
300
|
+
export function collectChangedFilesSince(index, cwd) {
|
|
301
|
+
const root = resolve(cwd);
|
|
302
|
+
const changed = [];
|
|
303
|
+
for (const entry of index.entries) {
|
|
304
|
+
const absPath = join(root, entry.path);
|
|
305
|
+
let stat;
|
|
306
|
+
try {
|
|
307
|
+
stat = statSync(absPath);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
changed.push(entry.path);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (!stat.isFile()) {
|
|
314
|
+
changed.push(entry.path);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (stat.mtimeMs !== entry.mtimeMs || stat.size !== entry.size) {
|
|
318
|
+
changed.push(entry.path);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return changed;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/project-index/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport type {\n\tBuildProjectIndexOptions,\n\tProjectIndex,\n\tProjectIndexEntry,\n\tProjectIndexMeta,\n\tProjectIndexQueryResult,\n\tRepoScaleMode,\n} from \"./types.js\";\nexport type {\n\tBuildProjectIndexOptions,\n\tProjectIndex,\n\tProjectIndexEntry,\n\tProjectIndexMeta,\n\tProjectIndexQueryResult,\n\tRepoScaleMode,\n} from \"./types.js\";\n\nconst TEXT_EXTENSIONS = new Set([\n\t\".ts\",\n\t\".tsx\",\n\t\".js\",\n\t\".jsx\",\n\t\".mjs\",\n\t\".cjs\",\n\t\".py\",\n\t\".go\",\n\t\".rs\",\n\t\".java\",\n\t\".kt\",\n\t\".swift\",\n\t\".json\",\n\t\".yaml\",\n\t\".yml\",\n\t\".toml\",\n\t\".md\",\n\t\".sql\",\n\t\".css\",\n\t\".scss\",\n\t\".html\",\n]);\n\nconst EXCLUDED_DIRS = new Set([\".git\", \"node_modules\", \"dist\", \"build\", \"coverage\", \".next\", \".iosm\"]);\n\nfunction toPosixPath(input: string): string {\n\treturn input.split(sep).join(\"/\");\n}\n\nfunction getExtension(filePath: string): string {\n\tconst normalized = filePath.toLowerCase();\n\tconst index = normalized.lastIndexOf(\".\");\n\treturn index >= 0 ? normalized.slice(index) : \"\";\n}\n\nfunction normalizeToken(value: string): string {\n\treturn value.trim().toLowerCase();\n}\n\nfunction tokenize(input: string): string[] {\n\treturn input\n\t\t.toLowerCase()\n\t\t.split(/[^\\p{L}\\p{N}_-]+/u)\n\t\t.map((token) => token.trim())\n\t\t.filter((token) => token.length >= 2);\n}\n\nfunction collectImports(content: string): string[] {\n\tconst result = new Set<string>();\n\tconst importRegexes = [\n\t\t/\\bimport\\s+[^\"'\\n]*[\"']([^\"']+)[\"']/g,\n\t\t/\\brequire\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g,\n\t\t/\\bfrom\\s+[\"']([^\"']+)[\"']/g,\n\t\t/\\buse\\s+([a-zA-Z0-9_:]+)/g,\n\t];\n\tfor (const regex of importRegexes) {\n\t\tfor (const match of content.matchAll(regex)) {\n\t\t\tconst value = (match[1] ?? \"\").trim();\n\t\t\tif (value) result.add(value);\n\t\t}\n\t}\n\treturn [...result].slice(0, 40);\n}\n\nfunction collectSymbols(content: string): string[] {\n\tconst result = new Set<string>();\n\tconst symbolRegexes = [\n\t\t/\\b(?:export\\s+)?(?:class|interface|type|enum|function)\\s+([A-Za-z_][A-Za-z0-9_]*)/g,\n\t\t/\\bconst\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*\\(/g,\n\t\t/\\bdef\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g,\n\t];\n\tfor (const regex of symbolRegexes) {\n\t\tfor (const match of content.matchAll(regex)) {\n\t\t\tconst value = (match[1] ?? \"\").trim();\n\t\t\tif (value) result.add(value);\n\t\t}\n\t}\n\treturn [...result].slice(0, 80);\n}\n\nfunction inferOwnerZone(relPath: string): string {\n\tconst [top] = relPath.split(\"/\");\n\tif (!top) return \"root\";\n\tif (top === \"src\" || top === \"app\" || top === \"packages\") {\n\t\tconst [, second] = relPath.split(\"/\");\n\t\treturn second ? `${top}/${second}` : top;\n\t}\n\treturn top;\n}\n\nfunction repoScaleFromCounts(totalFiles: number, sourceFiles: number): RepoScaleMode {\n\tif (totalFiles >= 8000 || sourceFiles >= 4000) return \"large\";\n\tif (totalFiles >= 2500 || sourceFiles >= 1200) return \"medium\";\n\treturn \"small\";\n}\n\nfunction scoreEntry(entry: ProjectIndexEntry, tokens: string[]): number {\n\tif (tokens.length === 0) return 0;\n\tconst normalizedPath = entry.path.toLowerCase();\n\tlet score = 0;\n\tfor (const token of tokens) {\n\t\tif (normalizedPath.includes(token)) score += 3;\n\t\tif (entry.ownerZone.toLowerCase().includes(token)) score += 2;\n\t\tif (entry.symbols.some((symbol) => symbol.toLowerCase().includes(token))) score += 2;\n\t\tif (entry.imports.some((item) => item.toLowerCase().includes(token))) score += 1;\n\t}\n\treturn score;\n}\n\nfunction fileHash(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction getStorageRoot(cwd: string): string {\n\treturn join(resolve(cwd), \".iosm\", \"project-index\");\n}\n\nexport function getProjectIndexPath(cwd: string): string {\n\treturn join(getStorageRoot(cwd), \"index.json\");\n}\n\nexport function loadProjectIndex(cwd: string): ProjectIndex | undefined {\n\tconst filePath = getProjectIndexPath(cwd);\n\tif (!existsSync(filePath)) return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(filePath, \"utf8\")) as ProjectIndex;\n\t\tif (!parsed?.meta || !Array.isArray(parsed.entries)) return undefined;\n\t\treturn parsed;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function saveProjectIndex(cwd: string, index: ProjectIndex): void {\n\tconst filePath = getProjectIndexPath(cwd);\n\tmkdirSync(getStorageRoot(cwd), { recursive: true });\n\twriteFileSync(filePath, `${JSON.stringify(index, null, 2)}\\n`, \"utf8\");\n}\n\nfunction scanFiles(cwd: string, maxFiles: number): string[] {\n\tconst root = resolve(cwd);\n\tconst stack = [root];\n\tconst files: string[] = [];\n\twhile (stack.length > 0 && files.length < maxFiles) {\n\t\tconst current = stack.pop();\n\t\tif (!current) break;\n\t\tlet entries;\n\t\ttry {\n\t\t\tentries = readdirSync(current, { withFileTypes: true });\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst absPath = join(current, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tif (EXCLUDED_DIRS.has(entry.name)) continue;\n\t\t\t\tstack.push(absPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.isFile()) continue;\n\t\t\tif (!TEXT_EXTENSIONS.has(getExtension(entry.name))) continue;\n\t\t\tlet stats;\n\t\t\ttry {\n\t\t\t\tstats = statSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stats.isFile() || stats.size > 1_000_000) continue;\n\t\t\tfiles.push(absPath);\n\t\t\tif (files.length >= maxFiles) break;\n\t\t}\n\t}\n\treturn files.sort((a, b) => a.localeCompare(b));\n}\n\nfunction buildEntry(cwd: string, absPath: string, previous?: ProjectIndexEntry): ProjectIndexEntry | undefined {\n\tlet stat;\n\ttry {\n\t\tstat = statSync(absPath);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!stat.isFile()) return undefined;\n\tconst relPath = toPosixPath(relative(cwd, absPath));\n\tif (!relPath || relPath.startsWith(\"..\")) return undefined;\n\tif (previous && previous.mtimeMs === stat.mtimeMs && previous.size === stat.size) {\n\t\treturn previous;\n\t}\n\tlet content = \"\";\n\ttry {\n\t\tcontent = readFileSync(absPath, \"utf8\");\n\t} catch {\n\t\treturn {\n\t\t\tpath: relPath,\n\t\t\tsize: stat.size,\n\t\t\tmtimeMs: stat.mtimeMs,\n\t\t\townerZone: inferOwnerZone(relPath),\n\t\t\timports: previous?.imports ?? [],\n\t\t\tsymbols: previous?.symbols ?? [],\n\t\t\tchangeFreq: (previous?.changeFreq ?? 0) + 1,\n\t\t};\n\t}\n\tconst digest = fileHash(content);\n\tconst previousDigest = previous ? fileHash([previous.path, previous.mtimeMs, previous.size, previous.symbols.join(\",\")].join(\"|\")) : \"\";\n\tconst changed = !previous || previousDigest !== digest;\n\treturn {\n\t\tpath: relPath,\n\t\tsize: stat.size,\n\t\tmtimeMs: stat.mtimeMs,\n\t\townerZone: inferOwnerZone(relPath),\n\t\timports: collectImports(content),\n\t\tsymbols: collectSymbols(content),\n\t\tchangeFreq: changed ? (previous?.changeFreq ?? 0) + 1 : (previous?.changeFreq ?? 0),\n\t};\n}\n\nexport function buildProjectIndex(cwd: string, options?: BuildProjectIndexOptions): ProjectIndex {\n\tconst root = resolve(cwd);\n\tconst maxFiles = Math.max(500, options?.maxFiles ?? 20_000);\n\tconst files = scanFiles(root, maxFiles);\n\tconst previous = options?.incrementalFrom;\n\tconst changedSet =\n\t\toptions?.changedFiles && options.changedFiles.length > 0\n\t\t\t? new Set(options.changedFiles.map((filePath) => toPosixPath(filePath)))\n\t\t\t: undefined;\n\tconst previousByPath = new Map<string, ProjectIndexEntry>();\n\tfor (const entry of previous?.entries ?? []) {\n\t\tpreviousByPath.set(entry.path, entry);\n\t}\n\n\tconst entries: ProjectIndexEntry[] = [];\n\tlet sourceFiles = 0;\n\tlet testFiles = 0;\n\tfor (const absPath of files) {\n\t\tconst relPath = toPosixPath(relative(root, absPath));\n\t\tconst previousEntry = previousByPath.get(relPath);\n\t\tconst entry =\n\t\t\tchangedSet && previousEntry && !changedSet.has(relPath)\n\t\t\t\t? previousEntry\n\t\t\t\t: buildEntry(root, absPath, previousEntry);\n\t\tif (!entry) continue;\n\t\tentries.push(entry);\n\t\tif (/^(src|app|packages)\\//.test(entry.path)) sourceFiles += 1;\n\t\tif (/(^|\\/)(test|tests|__tests__)\\//.test(entry.path) || /\\.(test|spec)\\./.test(entry.path)) testFiles += 1;\n\t}\n\n\tconst meta: ProjectIndexMeta = {\n\t\tversion: 1,\n\t\tcwd: root,\n\t\tbuiltAt: previous?.meta.builtAt ?? new Date().toISOString(),\n\t\tupdatedAt: new Date().toISOString(),\n\t\ttotalFiles: entries.length,\n\t\tsourceFiles,\n\t\ttestFiles,\n\t\trepoScaleMode: repoScaleFromCounts(entries.length, sourceFiles),\n\t};\n\n\treturn { meta, entries };\n}\n\nexport function ensureProjectIndex(cwd: string, modeHint?: RepoScaleMode): { index: ProjectIndex; rebuilt: boolean } {\n\tconst existing = loadProjectIndex(cwd);\n\tif (!existing) {\n\t\tconst built = buildProjectIndex(cwd);\n\t\tsaveProjectIndex(cwd, built);\n\t\treturn { index: built, rebuilt: true };\n\t}\n\n\tconst needsRebuild =\n\t\t(existing.meta.repoScaleMode === \"large\" || modeHint === \"large\") &&\n\t\tDate.now() - Date.parse(existing.meta.updatedAt) > 60_000;\n\n\tif (needsRebuild) {\n\t\tconst rebuilt = buildProjectIndex(cwd, { incrementalFrom: existing });\n\t\tsaveProjectIndex(cwd, rebuilt);\n\t\treturn { index: rebuilt, rebuilt: true };\n\t}\n\treturn { index: existing, rebuilt: false };\n}\n\nexport function queryProjectIndex(index: ProjectIndex, queryText: string, limit = 20): ProjectIndexQueryResult {\n\tconst tokens = [...new Set(tokenize(queryText).map(normalizeToken))].slice(0, 12);\n\tconst scored = index.entries\n\t\t.map((entry) => ({ entry, score: scoreEntry(entry, tokens) }))\n\t\t.filter((item) => item.score > 0)\n\t\t.sort((a, b) => b.score - a.score || a.entry.path.localeCompare(b.entry.path))\n\t\t.slice(0, Math.max(1, limit));\n\treturn {\n\t\tmatches: scored.map((item) => item.entry),\n\t\ttokens,\n\t};\n}\n\nexport function inferRepoScaleMode(input: { totalFiles: number; sourceFiles: number }): RepoScaleMode {\n\treturn repoScaleFromCounts(input.totalFiles, input.sourceFiles);\n}\n\nexport function collectChangedFilesSince(index: ProjectIndex, cwd: string): string[] {\n\tconst root = resolve(cwd);\n\tconst changed: string[] = [];\n\tfor (const entry of index.entries) {\n\t\tconst absPath = join(root, entry.path);\n\t\tlet stat;\n\t\ttry {\n\t\t\tstat = statSync(absPath);\n\t\t} catch {\n\t\t\tchanged.push(entry.path);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\tchanged.push(entry.path);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.mtimeMs !== entry.mtimeMs || stat.size !== entry.size) {\n\t\t\tchanged.push(entry.path);\n\t\t}\n\t}\n\treturn changed;\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type RepoScaleMode = "small" | "medium" | "large";
|
|
2
|
+
export interface ProjectIndexEntry {
|
|
3
|
+
path: string;
|
|
4
|
+
size: number;
|
|
5
|
+
mtimeMs: number;
|
|
6
|
+
ownerZone: string;
|
|
7
|
+
imports: string[];
|
|
8
|
+
symbols: string[];
|
|
9
|
+
changeFreq: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ProjectIndexMeta {
|
|
12
|
+
version: 1;
|
|
13
|
+
cwd: string;
|
|
14
|
+
builtAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
totalFiles: number;
|
|
17
|
+
sourceFiles: number;
|
|
18
|
+
testFiles: number;
|
|
19
|
+
repoScaleMode: RepoScaleMode;
|
|
20
|
+
}
|
|
21
|
+
export interface ProjectIndex {
|
|
22
|
+
meta: ProjectIndexMeta;
|
|
23
|
+
entries: ProjectIndexEntry[];
|
|
24
|
+
}
|
|
25
|
+
export interface BuildProjectIndexOptions {
|
|
26
|
+
maxFiles?: number;
|
|
27
|
+
incrementalFrom?: ProjectIndex;
|
|
28
|
+
changedFiles?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface ProjectIndexQueryResult {
|
|
31
|
+
matches: ProjectIndexEntry[];
|
|
32
|
+
tokens: string[];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/project-index/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/project-index/types.ts"],"names":[],"mappings":"","sourcesContent":["export type RepoScaleMode = \"small\" | \"medium\" | \"large\";\n\nexport interface ProjectIndexEntry {\n\tpath: string;\n\tsize: number;\n\tmtimeMs: number;\n\townerZone: string;\n\timports: string[];\n\tsymbols: string[];\n\tchangeFreq: number;\n}\n\nexport interface ProjectIndexMeta {\n\tversion: 1;\n\tcwd: string;\n\tbuiltAt: string;\n\tupdatedAt: string;\n\ttotalFiles: number;\n\tsourceFiles: number;\n\ttestFiles: number;\n\trepoScaleMode: RepoScaleMode;\n}\n\nexport interface ProjectIndex {\n\tmeta: ProjectIndexMeta;\n\tentries: ProjectIndexEntry[];\n}\n\nexport interface BuildProjectIndexOptions {\n\tmaxFiles?: number;\n\tincrementalFrom?: ProjectIndex;\n\tchangedFiles?: string[];\n}\n\nexport interface ProjectIndexQueryResult {\n\tmatches: ProjectIndexEntry[];\n\ttokens: string[];\n}\n"]}
|
package/dist/core/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,EAAW,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAmB,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/core/sdk.js
CHANGED
|
@@ -13,6 +13,7 @@ import { SessionManager } from "./session-manager.js";
|
|
|
13
13
|
import { SettingsManager } from "./settings-manager.js";
|
|
14
14
|
import { loadCustomSubagents, resolveCustomSubagentReference } from "./subagents.js";
|
|
15
15
|
import { time } from "./timings.js";
|
|
16
|
+
import { createSharedMemoryReadTool, createSharedMemoryWriteTool } from "./tools/shared-memory.js";
|
|
16
17
|
import { patchAgentForParallelTaskExecution } from "./parallel-task-agent.js";
|
|
17
18
|
import { allTools, astGrepTool, bashTool, codingTools, combyTool, createAstGrepTool, createBashTool, createCodingTools, createCombyTool, createEditTool, createFdTool, createFindTool, createGrepTool, createJqTool, createLsTool, createReadOnlyTools, createReadTool, createRgTool, createSedTool, createSemgrepTool, createSemanticSearchTool, createTaskTool, createToolsFromNames, createWriteTool, editTool, fdTool, findTool, grepTool, jqTool, lsTool, readOnlyTools, readTool, rgTool, sedTool, semanticSearchTool, semgrepTool, yqTool, createYqTool, writeTool, } from "./tools/index.js";
|
|
18
19
|
import { getAgentProfile } from "./agent-profiles.js";
|
|
@@ -271,6 +272,12 @@ export async function createAgentSession(options = {}) {
|
|
|
271
272
|
}
|
|
272
273
|
subModel = resolved;
|
|
273
274
|
}
|
|
275
|
+
const sharedMemoryTools = runnerOptions.sharedMemoryContext
|
|
276
|
+
? [
|
|
277
|
+
createSharedMemoryWriteTool(runnerOptions.sharedMemoryContext),
|
|
278
|
+
createSharedMemoryReadTool(runnerOptions.sharedMemoryContext),
|
|
279
|
+
]
|
|
280
|
+
: undefined;
|
|
274
281
|
const { session: sub } = await createAgentSession({
|
|
275
282
|
cwd: runnerOptions.cwd,
|
|
276
283
|
agentDir,
|
|
@@ -280,6 +287,7 @@ export async function createAgentSession(options = {}) {
|
|
|
280
287
|
tools: createToolsFromNames(runnerOptions.cwd, runnerOptions.tools, {
|
|
281
288
|
semantic: { authStorage, agentDir },
|
|
282
289
|
}),
|
|
290
|
+
customTools: sharedMemoryTools,
|
|
283
291
|
sessionManager: SessionManager.inMemory(),
|
|
284
292
|
settingsManager,
|
|
285
293
|
enableTaskTool: false, // prevent recursive subagent spawning
|