@myagentroam/node 0.9.0 → 0.9.3

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 (98) hide show
  1. package/dist/connector.d.ts +2 -0
  2. package/dist/connector.js +50 -25
  3. package/dist/control-outbound-scheduler.d.ts +4 -1
  4. package/dist/control-outbound-scheduler.js +39 -6
  5. package/dist/database.d.ts +0 -19
  6. package/dist/database.js +1 -62
  7. package/dist/event-buffer.d.ts +2 -5
  8. package/dist/event-buffer.js +3 -12
  9. package/dist/native-session-history.js +105 -26
  10. package/dist/runner/abstract-runner.d.ts +1 -1
  11. package/dist/runner/abstract-runner.js +2 -2
  12. package/dist/runner/claude/managed-run-controller.d.ts +0 -1
  13. package/dist/runner/claude/managed-run-controller.js +32 -17
  14. package/dist/runner/claude-code-runner.js +3 -4
  15. package/dist/runner/codex/conversation-parser.d.ts +3 -3
  16. package/dist/runner/codex/conversation-parser.js +33 -12
  17. package/dist/runner/codex/managed-run-controller.d.ts +2 -2
  18. package/dist/runner/codex/managed-run-controller.js +26 -10
  19. package/dist/runner/codex-runner.d.ts +3 -1
  20. package/dist/runner/codex-runner.js +40 -10
  21. package/dist/runner/opencode/conversation-parser.d.ts +11 -7
  22. package/dist/runner/opencode/conversation-parser.js +16 -16
  23. package/dist/runner/opencode/managed-run-controller.d.ts +8 -2
  24. package/dist/runner/opencode/managed-run-controller.js +94 -22
  25. package/dist/runner/opencode-runner.d.ts +3 -0
  26. package/dist/runner/opencode-runner.js +25 -0
  27. package/dist/runner-command-engine.js +1 -1
  28. package/dist/runner-profiles.js +29 -17
  29. package/dist/runner-usage.js +5 -5
  30. package/dist/runtime-state.d.ts +5 -12
  31. package/dist/runtime-state.js +32 -46
  32. package/dist/service/attachment-domain-state.d.ts +2 -0
  33. package/dist/service/attachment-domain-state.js +2 -0
  34. package/dist/service/conversation-history-service.js +55 -24
  35. package/dist/service/conversation-segment-service.d.ts +20 -0
  36. package/dist/service/conversation-segment-service.js +156 -0
  37. package/dist/service/external-session-resume-service.js +9 -0
  38. package/dist/service/fake-managed-run-service.d.ts +0 -1
  39. package/dist/service/fake-managed-run-service.js +0 -2
  40. package/dist/service/mcp-installation-verifier.js +1 -1
  41. package/dist/service/native-session-projection-service.js +5 -0
  42. package/dist/service/native-session-watch-service.d.ts +1 -0
  43. package/dist/service/native-session-watch-service.js +21 -4
  44. package/dist/service/node-connection-lifecycle-service.d.ts +0 -2
  45. package/dist/service/node-connection-lifecycle-service.js +0 -1
  46. package/dist/service/node-control-channel.js +1 -1
  47. package/dist/service/node-control-message-service.d.ts +0 -1
  48. package/dist/service/node-control-message-service.js +9 -6
  49. package/dist/service/node-request-service.js +2 -1
  50. package/dist/service/node-workspace-coordinator.d.ts +1 -4
  51. package/dist/service/node-workspace-coordinator.js +2 -12
  52. package/dist/service/run-attachment-service.d.ts +3 -2
  53. package/dist/service/run-attachment-service.js +51 -17
  54. package/dist/service/run-event-service.d.ts +2 -0
  55. package/dist/service/run-event-service.js +77 -2
  56. package/dist/service/run-workbench-service.d.ts +1 -1
  57. package/dist/service/run-workbench-service.js +1 -5
  58. package/dist/service/runner-interaction-service.d.ts +1 -2
  59. package/dist/service/runner-interaction-service.js +1 -4
  60. package/dist/service/session-catalog-service.js +4 -4
  61. package/dist/service/session-context-service.d.ts +1 -0
  62. package/dist/service/session-context-service.js +14 -0
  63. package/dist/service/session-domain-state.d.ts +1 -0
  64. package/dist/service/session-domain-state.js +1 -0
  65. package/dist/service/session-message-service.js +5 -10
  66. package/dist/service/session-presentation-service.d.ts +1 -0
  67. package/dist/service/session-presentation-service.js +8 -1
  68. package/dist/service/session-query-service.d.ts +4 -0
  69. package/dist/service/session-query-service.js +6 -1
  70. package/dist/service/skill-directory-service.d.ts +3 -1
  71. package/dist/service/skill-directory-service.js +31 -30
  72. package/dist/service/skill-install-service.js +4 -74
  73. package/dist/service/skill-node-operation-service.d.ts +1 -1
  74. package/dist/service/skill-node-operation-service.js +6 -3
  75. package/dist/service/workbench-event-service.d.ts +1 -13
  76. package/dist/service/workbench-event-service.js +2 -36
  77. package/dist/service/workbench-manifest-service.d.ts +0 -1
  78. package/dist/service/workbench-manifest-service.js +0 -1
  79. package/dist/service/workspace-domain-state.d.ts +1 -0
  80. package/dist/service/workspace-git-exclude-service.d.ts +4 -0
  81. package/dist/service/workspace-git-exclude-service.js +119 -0
  82. package/dist/service/workspace-queue-workbench-service.d.ts +1 -0
  83. package/dist/service/workspace-queue-workbench-service.js +4 -2
  84. package/dist/service/workspace-service.js +2 -0
  85. package/dist/service/workspace-upload-service.d.ts +2 -0
  86. package/dist/service/workspace-upload-service.js +28 -6
  87. package/dist/service/workspace-workbench-service.d.ts +0 -3
  88. package/dist/service/workspace-workbench-service.js +0 -17
  89. package/dist/supervisor.js +2 -1
  90. package/dist/terminal.js +1 -1
  91. package/dist/util/node-operation-parsers.js +2 -2
  92. package/dist/util/runner-error.d.ts +6 -0
  93. package/dist/util/runner-error.js +52 -0
  94. package/dist/util/runner-native-session-parsers.d.ts +2 -3
  95. package/dist/util/runner-native-session-parsers.js +48 -20
  96. package/dist/util/safe-error.d.ts +2 -0
  97. package/dist/util/safe-error.js +5 -0
  98. package/package.json +2 -2
@@ -69,15 +69,6 @@ export function codexThreadActivity(result) {
69
69
  return 'IDLE';
70
70
  return 'UNAVAILABLE';
71
71
  }
72
- export function externalResumeFailureDetail(error) {
73
- const message = error instanceof Error ? error.message : 'SESSION_RESUME_REJECTED';
74
- return [...message]
75
- .map((character) => (character <= '\u001f' || character === '\u007f' ? ' ' : character))
76
- .join('')
77
- .replace(/\s+/g, ' ')
78
- .trim()
79
- .slice(0, 240);
80
- }
81
72
  export function codexActiveTurnId(result) {
82
73
  if (!isPlainRecord(result) ||
83
74
  !isPlainRecord(result.thread) ||
@@ -155,23 +146,49 @@ export function deduplicateDirectSessions(sessions) {
155
146
  export function nativeConversationPage(session, history, input, runtimeTurns = [], registerImages = () => []) {
156
147
  const limit = Math.min(Math.max(input.limit ?? 30, 1), 500);
157
148
  const nativeTurns = nativeTranscriptTurns(history.items);
149
+ const representedClientMessageIds = new Set(nativeTurns.flatMap((entries) => entries.flatMap(({ entry, index }) => {
150
+ if (entry.kind !== 'message' || entry.role !== 'USER')
151
+ return [];
152
+ const clientMessageId = nativeUserClientMessageId(entry, entry.createdAt ?? index, runtimeTurns);
153
+ return clientMessageId === null ? [] : [clientMessageId];
154
+ })));
155
+ const missingRuntimeErrorTurns = input.cursor === undefined
156
+ ? runtimeTurns.filter((turn) => {
157
+ const clientMessageId = runtimeTurnClientMessageId(turn);
158
+ return (turn.items.some((item) => item.kind === 'error') &&
159
+ (clientMessageId === undefined || !representedClientMessageIds.has(clientMessageId)));
160
+ })
161
+ : [];
158
162
  const end = nativePageEnd(input.cursor, session.id, nativeTurns.length);
159
163
  const start = Math.max(0, end - limit);
160
- const turns = nativeTurns
164
+ const nativePageTurns = nativeTurns
161
165
  .slice(start, end)
162
166
  .map((entries, relativeIndex) => {
163
167
  const firstIndex = entries[0]?.index ?? 0;
164
168
  const turnId = `${session.id}:native:${firstIndex}`;
165
- const items = entries.map(({ entry, index }) => nativeTranscriptConversationItem(session, entry, index, turnId, runtimeTurns, registerImages));
169
+ const nativeItems = entries.map(({ entry, index }) => nativeTranscriptConversationItem(session, entry, index, turnId, runtimeTurns, registerImages));
170
+ const clientMessageId = nativeItems.flatMap((item) => item.kind === 'user_message' && isPlainRecord(item.payload)
171
+ ? [item.payload.clientMessageId]
172
+ : [])[0];
173
+ const runtimeTurn = typeof clientMessageId === 'string'
174
+ ? runtimeTurns.find((turn) => runtimeTurnClientMessageId(turn) === clientMessageId)
175
+ : undefined;
176
+ const runtimeErrors = (runtimeTurn?.items ?? [])
177
+ .filter((item) => item.kind === 'error')
178
+ .map((item) => ({ ...item, turnId, runId: runtimeTurn?.runId ?? null }));
179
+ const items = [
180
+ ...nativeItems,
181
+ ...runtimeErrors.filter((error) => !nativeItems.some((item) => item.id === error.id))
182
+ ];
166
183
  const startedAt = items[0]?.startedAt ?? firstIndex;
167
184
  const completedAt = items.at(-1)?.completedAt ?? startedAt;
168
185
  const after = lastNativeItemId(entries);
169
186
  return {
170
187
  id: turnId,
171
188
  sessionId: session.id,
172
- runId: null,
189
+ runId: runtimeTurn?.runId ?? null,
173
190
  userItemId: items.find((item) => item.kind === 'user_message')?.id ?? null,
174
- status: 'SUCCEEDED',
191
+ status: runtimeErrors.length > 0 ? 'FAILED' : 'SUCCEEDED',
175
192
  model: null,
176
193
  effort: null,
177
194
  access: null,
@@ -188,13 +205,24 @@ export function nativeConversationPage(session, history, input, runtimeTurns = [
188
205
  completedAt
189
206
  };
190
207
  });
208
+ const combined = [...nativePageTurns, ...missingRuntimeErrorTurns].sort((left, right) => (left.startedAt ?? 0) - (right.startedAt ?? 0));
209
+ const dropped = combined.slice(0, Math.max(0, combined.length - limit));
210
+ const turns = combined.slice(-limit);
211
+ const nativePageIds = new Set(nativePageTurns.map((turn) => turn.id));
212
+ const nextEnd = start + dropped.filter((turn) => nativePageIds.has(turn.id)).length;
191
213
  return {
192
214
  turns,
193
- nextCursor: start > 0
194
- ? Buffer.from(JSON.stringify({ sessionId: session.id, end: start })).toString('base64url')
215
+ nextCursor: nextEnd > 0
216
+ ? Buffer.from(JSON.stringify({ sessionId: session.id, end: nextEnd })).toString('base64url')
195
217
  : null
196
218
  };
197
219
  }
220
+ function runtimeTurnClientMessageId(turn) {
221
+ const user = turn.items.find((item) => item.kind === 'user_message');
222
+ return isPlainRecord(user?.payload) && typeof user.payload.clientMessageId === 'string'
223
+ ? user.payload.clientMessageId
224
+ : undefined;
225
+ }
198
226
  function lastNativeItemId(entries) {
199
227
  return entries.findLast(({ entry }) => entry.nativeId !== undefined)?.entry.nativeId;
200
228
  }
@@ -228,8 +256,8 @@ function nativeTranscriptConversationItem(session, entry, index, turnId, runtime
228
256
  const clientMessageId = entry.kind === 'message' && entry.role === 'USER'
229
257
  ? nativeUserClientMessageId(entry, time, runtimeTurns)
230
258
  : null;
231
- // Claude 标签式 Plan Mode:用户正文剥离注入的规划指令标签,
232
- // 完整的 <proposed_plan> Agent 文本归一化为计划卡。
259
+ // Claude tagged Plan Mode strips the injected planning instruction label from user content
260
+ // and normalizes a complete <proposed_plan> Agent response into a plan card.
233
261
  const entryText = entry.kind === 'message'
234
262
  ? entry.role === 'USER'
235
263
  ? stripClaudePlanTag(entry.text)
@@ -304,8 +332,8 @@ function nativeTranscriptConversationItem(session, entry, index, turnId, runtime
304
332
  return item;
305
333
  }
306
334
  /**
307
- * Claude JSONL 不保存浏览器请求 ID。Node 进程仍存活时,以正文和生成时刻
308
- * 对齐当前运行态的用户消息,让 native 历史页替换同一乐观 Turn,而不是重复一条。
335
+ * Claude JSONL does not retain browser request IDs. While the Node process is alive, match current
336
+ * runtime user messages by content and creation time so native history replaces the optimistic Turn.
309
337
  */
310
338
  export function nativeUserClientMessageId(entry, createdAt, runtimeTurns) {
311
339
  for (const turn of runtimeTurns) {
@@ -314,7 +342,7 @@ export function nativeUserClientMessageId(entry, createdAt, runtimeTurns) {
314
342
  continue;
315
343
  const payload = user.payload;
316
344
  const clientMessageId = typeof payload.clientMessageId === 'string' ? payload.clientMessageId : null;
317
- // 标签式 Plan Mode 的指令标签只存在于原生 transcript,运行态气泡始终是原文。
345
+ // Tagged Plan Mode instruction labels exist only in native transcripts; runtime bubbles retain the original content.
318
346
  if (clientMessageId === null || payload.text !== stripClaudePlanTag(entry.text))
319
347
  continue;
320
348
  const runtimeCreatedAt = user.startedAt ?? turn.startedAt;
@@ -0,0 +1,2 @@
1
+ /** Returns only a stable public error code, never a raw runtime exception message. */
2
+ export declare function safeErrorCode(error: unknown, fallback: string): string;
@@ -0,0 +1,5 @@
1
+ const STABLE_ERROR_CODE = /^[A-Z][A-Z0-9_]{0,127}$/u;
2
+ /** Returns only a stable public error code, never a raw runtime exception message. */
3
+ export function safeErrorCode(error, fallback) {
4
+ return error instanceof Error && STABLE_ERROR_CODE.test(error.message) ? error.message : fallback;
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myagentroam/node",
3
- "version": "0.9.0",
3
+ "version": "0.9.3",
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.0"
27
+ "@myagentroam/protocol": "^0.9.3"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/ws": "^8.18.1"