aws-runtime-bridge 1.6.10 → 1.6.12

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.
@@ -70,7 +70,6 @@ export declare class ClaudeSdkAdapter extends EventEmitter implements BaseProvid
70
70
  * 发送空闲提示到 SDK
71
71
  */
72
72
  private sendIdlePrompt;
73
- private isTaskPollingIdleCommand;
74
73
  private isMessagePollingIdleCommand;
75
74
  private buildMessagePollingIdlePrompt;
76
75
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"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"}
@@ -368,9 +368,6 @@ export class ClaudeSdkAdapter extends EventEmitter {
368
368
  if (!commands?.idleInputCommand) {
369
369
  return;
370
370
  }
371
- if (this.isTaskPollingIdleCommand(commands.idleInputCommand)) {
372
- return;
373
- }
374
371
  this.lastActivityAt.set(sessionId, Date.now());
375
372
  // 每500ms检测一次空闲状态
376
373
  const timer = setInterval(() => {
@@ -446,13 +443,6 @@ export class ClaudeSdkAdapter extends EventEmitter {
446
443
  },
447
444
  });
448
445
  }
449
- isTaskPollingIdleCommand(command) {
450
- const normalized = command.trim();
451
- if (!normalized) {
452
- return false;
453
- }
454
- return normalized.toLowerCase().includes('my_task') || normalized.includes('流程任务');
455
- }
456
446
  isMessagePollingIdleCommand(command) {
457
447
  const normalized = command.trim();
458
448
  if (!normalized) {
@@ -462,7 +452,7 @@ export class ClaudeSdkAdapter extends EventEmitter {
462
452
  return lower.includes('poll_message') || lower.includes('get_message') || normalized.includes('取消息');
463
453
  }
464
454
  buildMessagePollingIdlePrompt() {
465
- return '请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。';
455
+ return '请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。';
466
456
  }
467
457
  /**
468
458
  * 发送手动快捷键 token 序列,和空闲自动命令共用解析逻辑。
@@ -151,7 +151,7 @@ describe('ClaudeSdkAdapter', () => {
151
151
  fs.rmSync(commandDirectory, { recursive: true, force: true });
152
152
  }
153
153
  });
154
- it('does not auto-wake Claude for my_task-style idle commands', async () => {
154
+ it('auto-wakes Claude when workflow idle commands include poll_message and my_task guidance', async () => {
155
155
  vi.useFakeTimers();
156
156
  const adapter = new ClaudeSdkAdapter();
157
157
  const sentPrompts = [];
@@ -173,12 +173,16 @@ describe('ClaudeSdkAdapter', () => {
173
173
  sentPrompts.push(prompt);
174
174
  });
175
175
  adapter.setIdleCommands('session-1', {
176
- idleInputCommand: 'system: 请先检查自己的流程任务,必要时调用my_task获取待处理节点',
176
+ idleInputCommand: 'system: 请保持工作循环:持续调用 poll_message 阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。',
177
177
  nonInputCommand: '',
178
178
  });
179
- await vi.advanceTimersByTimeAsync(3000);
179
+ await vi.advanceTimersByTimeAsync(1000);
180
180
  expect(sentPrompts).toHaveLength(0);
181
- expect(sendIdlePrompt).not.toHaveBeenCalled();
181
+ await vi.advanceTimersByTimeAsync(600);
182
+ expect(sendIdlePrompt).toHaveBeenCalledTimes(1);
183
+ expect(sentPrompts).toEqual([
184
+ '请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。',
185
+ ]);
182
186
  });
183
187
  it('starts a blocking poll turn for poll_message-style idle commands', async () => {
184
188
  vi.useFakeTimers();
@@ -201,13 +205,15 @@ describe('ClaudeSdkAdapter', () => {
201
205
  sentPrompts.push(prompt);
202
206
  });
203
207
  adapter.setIdleCommands('session-1', {
204
- idleInputCommand: 'system: 醒来了吗?使用get_profile获取自己的信息,继续未完成的任务或使用poll_message阻塞获取消息',
208
+ idleInputCommand: 'system: 请保持工作循环:持续调用 poll_message 阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。',
205
209
  nonInputCommand: '',
206
210
  });
207
211
  await vi.advanceTimersByTimeAsync(1000);
208
212
  expect(sentPrompts).toHaveLength(0);
209
213
  await vi.advanceTimersByTimeAsync(600);
210
- expect(sentPrompts).toEqual(['请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。']);
214
+ expect(sentPrompts).toEqual([
215
+ '请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。',
216
+ ]);
211
217
  });
212
218
  it('still auto-wakes Claude for regular idle commands', async () => {
213
219
  vi.useFakeTimers();
@@ -777,7 +777,7 @@ export class CodexSdkAdapter extends EventEmitter {
777
777
  toIdlePrompt(command) {
778
778
  const trimmed = command.trim();
779
779
  if (this.isMessagePollingIdleCommand(trimmed)) {
780
- return '请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。';
780
+ return '请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。';
781
781
  }
782
782
  return trimmed;
783
783
  }
@@ -199,13 +199,13 @@ describe('CodexSdkAdapter', () => {
199
199
  },
200
200
  ];
201
201
  adapter.setIdleCommands('session-1', {
202
- idleInputCommand: 'system: 醒来了吗?使用get_profile获取自己的信息,继续未完成的任务或使用poll_message阻塞获取消息',
202
+ idleInputCommand: 'system: 请保持工作循环:持续调用 poll_message 阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。',
203
203
  nonInputCommand: '',
204
204
  });
205
205
  await vi.advanceTimersByTimeAsync(1000);
206
206
  expect(runMessages).toHaveLength(0);
207
207
  await vi.advanceTimersByTimeAsync(600);
208
- expect(runMessages).toEqual(['请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。']);
208
+ expect(runMessages).toEqual(['请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。']);
209
209
  const userMessages = adapter.getConversation('session-1').filter((message) => message.role === 'user');
210
210
  expect(userMessages).toHaveLength(0);
211
211
  });
@@ -710,7 +710,7 @@ export class OpencodeSdkAdapter extends EventEmitter {
710
710
  toIdlePrompt(command) {
711
711
  const trimmed = command.trim();
712
712
  if (this.isMessagePollingIdleCommand(trimmed)) {
713
- return '请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。';
713
+ return '请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。';
714
714
  }
715
715
  return trimmed;
716
716
  }
@@ -17,8 +17,8 @@ describe('OpencodeSdkAdapter', () => {
17
17
  });
18
18
  it('normalizes poll_message-style idle commands into a blocking poll prompt', () => {
19
19
  const adapter = new OpencodeSdkAdapter();
20
- const prompt = Reflect.get(adapter, 'toIdlePrompt').call(adapter, 'system: 醒来了吗?使用get_profile获取自己的信息,继续未完成的任务或使用poll_message阻塞获取消息');
21
- expect(prompt).toBe('请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。');
20
+ const prompt = Reflect.get(adapter, 'toIdlePrompt').call(adapter, 'system: 请保持工作循环:持续调用 poll_message 阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。');
21
+ expect(prompt).toBe('请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。');
22
22
  });
23
23
  it('starts idle detection when commands are set after OpenCode is already waiting for input', async () => {
24
24
  vi.useFakeTimers();
@@ -58,7 +58,48 @@ describe('OpencodeSdkAdapter', () => {
58
58
  nonInputCommand: '',
59
59
  });
60
60
  await vi.advanceTimersByTimeAsync(500);
61
- expect(sentMessages).toEqual(['请调用 poll_message 工具阻塞等待新消息;收到消息后再处理消息内容。']);
61
+ expect(sentMessages).toEqual(['请持续调用 poll_message 工具阻塞等待新消息和流程线任务提醒;收到流程任务提醒后调用 my_task 查看详情,按需调用 start_task 开始处理,完成后调用 submit_task_result 提交结果,然后继续 poll_message。']);
62
+ });
63
+ it('re-arms polling idle detection after OpenCode returns to waiting for input', async () => {
64
+ vi.useFakeTimers();
65
+ const adapter = new OpencodeSdkAdapter();
66
+ const sentMessages = [];
67
+ const session = {
68
+ adapterSession: {
69
+ sessionId: 'session-1',
70
+ status: 'waiting_input',
71
+ messages: [],
72
+ createdAt: new Date().toISOString(),
73
+ totalUsage: { inputTokens: 0, outputTokens: 0 },
74
+ },
75
+ config: {
76
+ command: 'opencode',
77
+ workingDirectory: process.cwd(),
78
+ autoAccept: true,
79
+ },
80
+ sseActive: false,
81
+ pendingPermissions: new Map(),
82
+ emittedToolStarts: new Set(),
83
+ workingDirectory: process.cwd(),
84
+ userMessageIds: new Set(),
85
+ currentAssistantText: '',
86
+ seenTextPartIds: new Set(),
87
+ };
88
+ Reflect.set(adapter, 'sessions', new Map([['session-1', session]]));
89
+ vi.spyOn(adapter, 'sendMessage').mockImplementation(async (_sessionId, message) => {
90
+ sentMessages.push(message);
91
+ session.adapterSession.status = 'thinking';
92
+ });
93
+ adapter.setIdleCommands('session-1', {
94
+ idleInputCommand: 'system: 使用poll_message阻塞获取消息',
95
+ nonInputCommand: '',
96
+ });
97
+ await vi.advanceTimersByTimeAsync(500);
98
+ expect(sentMessages).toHaveLength(1);
99
+ session.adapterSession.status = 'waiting_input';
100
+ Reflect.get(adapter, 'startIdleDetection').call(adapter, 'session-1');
101
+ await vi.advanceTimersByTimeAsync(500);
102
+ expect(sentMessages).toHaveLength(2);
62
103
  });
63
104
  it('includes serve startup output when the OpenCode process exits early', () => {
64
105
  const adapter = new OpencodeSdkAdapter();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws-runtime-bridge",
3
- "version": "1.6.10",
3
+ "version": "1.6.12",
4
4
  "description": "AgentsWorkStudio runtime bridge service for machine-level agent runtime integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",