@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.
Files changed (61) hide show
  1. package/dist/claude-agent-sdk.d.ts +1 -0
  2. package/dist/claude-agent-sdk.js +9 -0
  3. package/dist/codex-app-server.d.ts +1 -0
  4. package/dist/codex-app-server.js +4 -2
  5. package/dist/connector.d.ts +1 -0
  6. package/dist/connector.js +16 -11
  7. package/dist/native-jsonl-reader.d.ts +21 -0
  8. package/dist/native-jsonl-reader.js +89 -0
  9. package/dist/native-session-history.d.ts +20 -3
  10. package/dist/native-session-history.js +245 -38
  11. package/dist/opencode-server.d.ts +1 -0
  12. package/dist/opencode-server.js +1 -0
  13. package/dist/runner/abstract-runner.d.ts +11 -2
  14. package/dist/runner/abstract-runner.js +4 -0
  15. package/dist/runner/claude/managed-run-controller.js +3 -0
  16. package/dist/runner/claude-code-runner.d.ts +2 -1
  17. package/dist/runner/claude-code-runner.js +4 -0
  18. package/dist/runner/codex/managed-run-controller.js +6 -0
  19. package/dist/runner/codex-runner.d.ts +2 -1
  20. package/dist/runner/codex-runner.js +13 -2
  21. package/dist/runner/opencode/managed-run-controller.js +4 -0
  22. package/dist/runner/opencode-runner.d.ts +10 -3
  23. package/dist/runner/opencode-runner.js +87 -14
  24. package/dist/runner/runner-registry.js +16 -1
  25. package/dist/runtime-command-detector.js +1 -6
  26. package/dist/runtime-state.js +1 -0
  27. package/dist/service/conversation-history-service.d.ts +6 -5
  28. package/dist/service/conversation-history-service.js +151 -55
  29. package/dist/service/external-session-resume-service.d.ts +2 -0
  30. package/dist/service/external-session-resume-service.js +45 -34
  31. package/dist/service/native-session-projection-service.d.ts +1 -0
  32. package/dist/service/native-session-projection-service.js +4 -0
  33. package/dist/service/native-session-watch-service.d.ts +18 -0
  34. package/dist/service/native-session-watch-service.js +232 -34
  35. package/dist/service/run-workbench-service.d.ts +2 -4
  36. package/dist/service/run-workbench-service.js +2 -7
  37. package/dist/service/session-command-service.js +1 -1
  38. package/dist/service/session-identity-service.d.ts +1 -1
  39. package/dist/service/session-identity-service.js +1 -1
  40. package/dist/service/session-lifecycle-service.js +3 -0
  41. package/dist/service/session-message-service.d.ts +0 -1
  42. package/dist/service/session-message-service.js +15 -23
  43. package/dist/service/skill-directory-service.d.ts +1 -0
  44. package/dist/service/skill-directory-service.js +40 -6
  45. package/dist/service/workspace-domain-state.d.ts +3 -0
  46. package/dist/service/workspace-domain-state.js +1 -0
  47. package/dist/service/workspace-file-service.d.ts +1 -0
  48. package/dist/service/workspace-file-service.js +14 -1
  49. package/dist/service/workspace-queue-workbench-service.d.ts +17 -0
  50. package/dist/service/workspace-queue-workbench-service.js +66 -6
  51. package/dist/service/workspace-watch-service.d.ts +7 -2
  52. package/dist/service/workspace-watch-service.js +32 -6
  53. package/dist/service/workspace-workbench-service.d.ts +14 -0
  54. package/dist/service/workspace-workbench-service.js +215 -16
  55. package/dist/util/personal-instructions.d.ts +2 -0
  56. package/dist/util/personal-instructions.js +31 -0
  57. package/dist/util/runner-native-session-parsers.d.ts +1 -0
  58. package/dist/util/runner-native-session-parsers.js +76 -12
  59. package/dist/workspace.d.ts +14 -8
  60. package/dist/workspace.js +65 -42
  61. 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.4",
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.4"
27
+ "@myagentroam/protocol": "^0.9.6"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/ws": "^8.18.1"