@myagentroam/node 0.9.4 → 0.9.6
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/dist/claude-agent-sdk.d.ts +1 -0
- package/dist/claude-agent-sdk.js +9 -0
- package/dist/codex-app-server.d.ts +1 -0
- package/dist/codex-app-server.js +4 -2
- package/dist/connector.d.ts +1 -0
- package/dist/connector.js +16 -11
- package/dist/native-jsonl-reader.d.ts +21 -0
- package/dist/native-jsonl-reader.js +89 -0
- package/dist/native-session-history.d.ts +20 -3
- package/dist/native-session-history.js +245 -38
- package/dist/opencode-server.d.ts +1 -0
- package/dist/opencode-server.js +1 -0
- package/dist/runner/abstract-runner.d.ts +11 -2
- package/dist/runner/abstract-runner.js +4 -0
- package/dist/runner/claude/managed-run-controller.js +3 -0
- package/dist/runner/claude-code-runner.d.ts +2 -1
- package/dist/runner/claude-code-runner.js +4 -0
- package/dist/runner/codex/managed-run-controller.js +6 -0
- package/dist/runner/codex-runner.d.ts +2 -1
- package/dist/runner/codex-runner.js +13 -2
- package/dist/runner/opencode/managed-run-controller.js +4 -0
- package/dist/runner/opencode-runner.d.ts +10 -3
- package/dist/runner/opencode-runner.js +87 -14
- package/dist/runner/runner-registry.js +16 -1
- package/dist/runtime-command-detector.js +1 -6
- package/dist/runtime-state.js +1 -0
- package/dist/service/conversation-history-service.d.ts +6 -5
- package/dist/service/conversation-history-service.js +151 -55
- package/dist/service/external-session-resume-service.d.ts +2 -0
- package/dist/service/external-session-resume-service.js +45 -34
- package/dist/service/native-session-projection-service.d.ts +1 -0
- package/dist/service/native-session-projection-service.js +4 -0
- package/dist/service/native-session-watch-service.d.ts +18 -0
- package/dist/service/native-session-watch-service.js +232 -34
- package/dist/service/run-workbench-service.d.ts +2 -4
- package/dist/service/run-workbench-service.js +2 -7
- package/dist/service/session-command-service.js +1 -1
- package/dist/service/session-identity-service.d.ts +1 -1
- package/dist/service/session-identity-service.js +1 -1
- package/dist/service/session-lifecycle-service.js +3 -0
- package/dist/service/session-message-service.d.ts +0 -1
- package/dist/service/session-message-service.js +15 -23
- package/dist/service/skill-directory-service.d.ts +1 -0
- package/dist/service/skill-directory-service.js +40 -6
- package/dist/service/workspace-domain-state.d.ts +3 -0
- package/dist/service/workspace-domain-state.js +1 -0
- package/dist/service/workspace-file-service.d.ts +1 -0
- package/dist/service/workspace-file-service.js +14 -1
- package/dist/service/workspace-queue-workbench-service.d.ts +17 -0
- package/dist/service/workspace-queue-workbench-service.js +66 -6
- package/dist/service/workspace-watch-service.d.ts +7 -2
- package/dist/service/workspace-watch-service.js +32 -6
- package/dist/service/workspace-workbench-service.d.ts +14 -0
- package/dist/service/workspace-workbench-service.js +215 -16
- package/dist/util/personal-instructions.d.ts +2 -0
- package/dist/util/personal-instructions.js +31 -0
- package/dist/util/runner-native-session-parsers.d.ts +1 -0
- package/dist/util/runner-native-session-parsers.js +76 -12
- package/dist/workspace.d.ts +14 -8
- package/dist/workspace.js +65 -42
- package/package.json +2 -2
package/dist/workspace.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { watch } from 'node:fs';
|
|
3
|
-
import { lstat, mkdir, opendir, readdir, readFile, realpath, rename, rm, stat, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { lstat, mkdir, opendir, open, readdir, readFile, realpath, rename, rm, stat, unlink, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { homedir, platform as hostPlatform } from 'node:os';
|
|
5
5
|
import { dirname, isAbsolute, posix, relative, resolve, sep, win32 } from 'node:path';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { minimatch } from 'minimatch';
|
|
8
8
|
const GIT_TIMEOUT_MS = 5_000;
|
|
9
9
|
const GIT_OUTPUT_LIMIT = 512 * 1024;
|
|
10
|
-
const GIT_BINARY_PREVIEW_LIMIT = 4 * 1024 * 1024;
|
|
11
10
|
const FILE_READ_LIMIT = 512 * 1024;
|
|
12
11
|
const DIRECTORY_PAGE_LIMIT = 200;
|
|
13
12
|
const DIRECTORY_PICKER_LIMIT = 200;
|
|
@@ -665,6 +664,38 @@ export async function readWorkspaceTextFile(workspaceRoot, requestedPath, offset
|
|
|
665
664
|
nextOffset
|
|
666
665
|
};
|
|
667
666
|
}
|
|
667
|
+
export async function readWorkspaceFileContentRange(workspaceRoot, requestedPath, offset = 0, limit = FILE_READ_LIMIT) {
|
|
668
|
+
if (!Number.isSafeInteger(offset) ||
|
|
669
|
+
offset < 0 ||
|
|
670
|
+
!Number.isSafeInteger(limit) ||
|
|
671
|
+
limit < 1 ||
|
|
672
|
+
limit > FILE_READ_LIMIT)
|
|
673
|
+
throw new Error('FILE_RANGE_INVALID');
|
|
674
|
+
const root = await realpath(workspaceRoot);
|
|
675
|
+
const file = await resolveWorkspaceEntry(root, requestedPath, false);
|
|
676
|
+
const metadata = await lstat(file);
|
|
677
|
+
if (!metadata.isFile())
|
|
678
|
+
throw new Error('FILE_NOT_REGULAR');
|
|
679
|
+
if (offset > metadata.size)
|
|
680
|
+
throw new Error('FILE_RANGE_INVALID');
|
|
681
|
+
const length = Math.min(limit, metadata.size - offset);
|
|
682
|
+
const source = Buffer.allocUnsafe(length);
|
|
683
|
+
const handle = await open(file, 'r');
|
|
684
|
+
try {
|
|
685
|
+
const { bytesRead } = await handle.read(source, 0, length, offset);
|
|
686
|
+
const end = offset + bytesRead;
|
|
687
|
+
return {
|
|
688
|
+
path: relative(root, file).split(sep).join('/'),
|
|
689
|
+
size: metadata.size,
|
|
690
|
+
offset,
|
|
691
|
+
contentBase64: source.subarray(0, bytesRead).toString('base64'),
|
|
692
|
+
nextOffset: end < metadata.size ? end : null
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
finally {
|
|
696
|
+
await handle.close();
|
|
697
|
+
}
|
|
698
|
+
}
|
|
668
699
|
/** Reads one absolute file only when the resolved target remains within a Node allowed root. */
|
|
669
700
|
export async function readAllowedTextFile(requestedPath, allowedRoots, offset = 0, limit = FILE_READ_LIMIT) {
|
|
670
701
|
if (!isAbsolute(requestedPath))
|
|
@@ -1212,20 +1243,44 @@ export async function readGitHistoryFileDiff(repository, commit, requestedPath,
|
|
|
1212
1243
|
]);
|
|
1213
1244
|
const binary = result.output.includes(0) || result.text.includes('Binary files ');
|
|
1214
1245
|
if (binary) {
|
|
1215
|
-
const [beforePreview, afterPreview] = await Promise.all([
|
|
1216
|
-
readGitBinaryPreview(repository, `${commit}^`, previousPath ?? path),
|
|
1217
|
-
readGitBinaryPreview(repository, commit, path)
|
|
1218
|
-
]);
|
|
1219
1246
|
return {
|
|
1220
1247
|
binary: true,
|
|
1221
1248
|
summary: `binary diff sha256=${createHash('sha256').update(result.output).digest('hex')} bytes=${result.output.length}`,
|
|
1222
|
-
truncated: result.truncated
|
|
1223
|
-
...(beforePreview === undefined ? {} : { beforePreview }),
|
|
1224
|
-
...(afterPreview === undefined ? {} : { afterPreview })
|
|
1249
|
+
truncated: result.truncated
|
|
1225
1250
|
};
|
|
1226
1251
|
}
|
|
1227
1252
|
return { binary: false, text: result.text, truncated: result.truncated };
|
|
1228
1253
|
}
|
|
1254
|
+
export async function readGitHistoryFileContentRange(repository, commit, requestedPath, offset, limit, refs) {
|
|
1255
|
+
if (!Number.isSafeInteger(offset) ||
|
|
1256
|
+
offset < 0 ||
|
|
1257
|
+
!Number.isSafeInteger(limit) ||
|
|
1258
|
+
limit < 1 ||
|
|
1259
|
+
limit > 20 * 1024 * 1024 ||
|
|
1260
|
+
offset + limit > 20 * 1024 * 1024)
|
|
1261
|
+
throw new Error('FILE_RANGE_INVALID');
|
|
1262
|
+
await assertHistoryCommitReachable(repository, commit, refs);
|
|
1263
|
+
const path = safeGitWorkspacePath(requestedPath);
|
|
1264
|
+
const object = `${commit}:${path}`;
|
|
1265
|
+
const sizeResult = await runGit(repository, ['cat-file', '-s', object]);
|
|
1266
|
+
const size = Number(sizeResult.text.trim());
|
|
1267
|
+
if (!Number.isSafeInteger(size) || size < 0 || offset > size)
|
|
1268
|
+
throw new Error('FILE_RANGE_INVALID');
|
|
1269
|
+
if (offset === size)
|
|
1270
|
+
return { path, size, offset, contentBase64: '', nextOffset: null };
|
|
1271
|
+
const result = await runGitAllowFailure(repository, ['cat-file', 'blob', object], offset + limit);
|
|
1272
|
+
if (result.code !== 0)
|
|
1273
|
+
throw new GitCommandError(result.code, result.stderr);
|
|
1274
|
+
const content = result.output.subarray(offset, Math.min(size, offset + limit));
|
|
1275
|
+
const nextOffset = offset + content.length;
|
|
1276
|
+
return {
|
|
1277
|
+
path,
|
|
1278
|
+
size,
|
|
1279
|
+
offset,
|
|
1280
|
+
contentBase64: content.toString('base64'),
|
|
1281
|
+
nextOffset: nextOffset < size ? nextOffset : null
|
|
1282
|
+
};
|
|
1283
|
+
}
|
|
1229
1284
|
export async function readCurrentChanges(workspacePath) {
|
|
1230
1285
|
return (await readCurrentChangesSummary(workspacePath)).changes;
|
|
1231
1286
|
}
|
|
@@ -1236,16 +1291,10 @@ export async function readCurrentChangeDiff(workspacePath, requestedPath) {
|
|
|
1236
1291
|
const after = await readWorkingTreeText(workspacePath, path);
|
|
1237
1292
|
const binary = result.output.includes(0) || result.text.includes('Binary files ') || after?.binary === true;
|
|
1238
1293
|
if (binary) {
|
|
1239
|
-
const [beforePreview, afterPreview] = await Promise.all([
|
|
1240
|
-
readGitBinaryPreview(workspacePath, 'HEAD', path),
|
|
1241
|
-
readWorkingTreeBinaryPreview(workspacePath, path)
|
|
1242
|
-
]);
|
|
1243
1294
|
return {
|
|
1244
1295
|
binary: true,
|
|
1245
1296
|
summary: `binary diff sha256=${createHash('sha256').update(result.output).digest('hex')} bytes=${result.output.length}`,
|
|
1246
|
-
truncated: result.truncated || after?.truncated === true
|
|
1247
|
-
...(beforePreview === undefined ? {} : { beforePreview }),
|
|
1248
|
-
...(afterPreview === undefined ? {} : { afterPreview })
|
|
1297
|
+
truncated: result.truncated || after?.truncated === true
|
|
1249
1298
|
};
|
|
1250
1299
|
}
|
|
1251
1300
|
return {
|
|
@@ -1315,32 +1364,6 @@ async function assertCurrentChangePathAccessible(workspacePath, path) {
|
|
|
1315
1364
|
return;
|
|
1316
1365
|
await resolveWorkspaceEntry(root, path, false);
|
|
1317
1366
|
}
|
|
1318
|
-
async function readGitBinaryPreview(repository, ref, path) {
|
|
1319
|
-
const result = await runGitAllowFailure(repository, ['show', `${ref}:${path}`], GIT_BINARY_PREVIEW_LIMIT);
|
|
1320
|
-
if (result.code !== 0)
|
|
1321
|
-
return undefined;
|
|
1322
|
-
return result.truncated
|
|
1323
|
-
? { truncated: true }
|
|
1324
|
-
: { contentBase64: result.output.toString('base64'), truncated: false };
|
|
1325
|
-
}
|
|
1326
|
-
async function readWorkingTreeBinaryPreview(workspacePath, path) {
|
|
1327
|
-
const root = await realpath(workspacePath);
|
|
1328
|
-
let file;
|
|
1329
|
-
try {
|
|
1330
|
-
file = await resolveWorkspaceEntry(root, path, false);
|
|
1331
|
-
}
|
|
1332
|
-
catch (error) {
|
|
1333
|
-
if (error instanceof Error && error.message === 'FILE_NOT_FOUND')
|
|
1334
|
-
return undefined;
|
|
1335
|
-
throw error;
|
|
1336
|
-
}
|
|
1337
|
-
const metadata = await lstat(file);
|
|
1338
|
-
if (!metadata.isFile())
|
|
1339
|
-
return undefined;
|
|
1340
|
-
if (metadata.size > GIT_BINARY_PREVIEW_LIMIT)
|
|
1341
|
-
return { truncated: true };
|
|
1342
|
-
return { contentBase64: (await readFile(file)).toString('base64'), truncated: false };
|
|
1343
|
-
}
|
|
1344
1367
|
async function readWorkingTreeText(workspacePath, path) {
|
|
1345
1368
|
const root = await realpath(workspacePath);
|
|
1346
1369
|
let file;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myagentroam/node",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
4
4
|
"description": "MyAgentRoam Node runtime CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"node-pty": "1.1.0",
|
|
25
25
|
"ws": "^8.21.3",
|
|
26
26
|
"zod": "4.4.3",
|
|
27
|
-
"@myagentroam/protocol": "^0.9.
|
|
27
|
+
"@myagentroam/protocol": "^0.9.6"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/ws": "^8.18.1"
|