imcodes 2026.4.1304-dev.1266 → 2026.4.1308-dev.1276

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 (47) hide show
  1. package/dist/shared/daemon-events.d.ts +7 -0
  2. package/dist/shared/daemon-events.d.ts.map +1 -0
  3. package/dist/shared/daemon-events.js +6 -0
  4. package/dist/shared/daemon-events.js.map +1 -0
  5. package/dist/src/agent/session-manager.d.ts.map +1 -1
  6. package/dist/src/agent/session-manager.js +54 -107
  7. package/dist/src/agent/session-manager.js.map +1 -1
  8. package/dist/src/daemon/command-handler.d.ts +1 -0
  9. package/dist/src/daemon/command-handler.d.ts.map +1 -1
  10. package/dist/src/daemon/command-handler.js +23 -15
  11. package/dist/src/daemon/command-handler.js.map +1 -1
  12. package/dist/src/daemon/discussion-orchestrator.d.ts.map +1 -1
  13. package/dist/src/daemon/discussion-orchestrator.js +0 -2
  14. package/dist/src/daemon/discussion-orchestrator.js.map +1 -1
  15. package/dist/src/daemon/lifecycle.d.ts.map +1 -1
  16. package/dist/src/daemon/lifecycle.js +1 -2
  17. package/dist/src/daemon/lifecycle.js.map +1 -1
  18. package/dist/src/daemon/oc-session-sync.d.ts.map +1 -1
  19. package/dist/src/daemon/oc-session-sync.js +3 -7
  20. package/dist/src/daemon/oc-session-sync.js.map +1 -1
  21. package/dist/src/daemon/subsession-manager.d.ts.map +1 -1
  22. package/dist/src/daemon/subsession-manager.js +3 -4
  23. package/dist/src/daemon/subsession-manager.js.map +1 -1
  24. package/dist/src/daemon/terminal-streamer.d.ts.map +1 -1
  25. package/dist/src/daemon/terminal-streamer.js +9 -6
  26. package/dist/src/daemon/terminal-streamer.js.map +1 -1
  27. package/dist/src/store/session-store.d.ts +2 -2
  28. package/dist/src/store/session-store.d.ts.map +1 -1
  29. package/dist/src/store/session-store.js +1 -2
  30. package/dist/src/store/session-store.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/shared/agent-types.d.ts +0 -4
  33. package/dist/shared/agent-types.d.ts.map +0 -1
  34. package/dist/shared/agent-types.js +0 -10
  35. package/dist/shared/agent-types.js.map +0 -1
  36. package/dist/shared/runtime-types.d.ts +0 -7
  37. package/dist/shared/runtime-types.d.ts.map +0 -1
  38. package/dist/shared/runtime-types.js +0 -8
  39. package/dist/shared/runtime-types.js.map +0 -1
  40. package/dist/shared/session-capabilities.d.ts +0 -6
  41. package/dist/shared/session-capabilities.d.ts.map +0 -1
  42. package/dist/shared/session-capabilities.js +0 -10
  43. package/dist/shared/session-capabilities.js.map +0 -1
  44. package/dist/shared/session-states.d.ts +0 -14
  45. package/dist/shared/session-states.d.ts.map +0 -1
  46. package/dist/shared/session-states.js +0 -17
  47. package/dist/shared/session-states.js.map +0 -1
@@ -35,9 +35,8 @@ import { CODEX_MODEL_IDS, normalizeClaudeCodeModelId } from '../shared/models/op
35
35
  import { getClaudeSdkRuntimeConfig, normalizeClaudeSdkModelForProvider } from '../agent/sdk-runtime-config.js';
36
36
  import { getCodexRuntimeConfig } from '../agent/codex-runtime-config.js';
37
37
  import { P2P_TERMINAL_RUN_STATUSES } from '../../shared/p2p-status.js';
38
+ import { DAEMON_MSG } from '../../shared/daemon-events.js';
38
39
  import { CLAUDE_SDK_EFFORT_LEVELS, CODEX_SDK_EFFORT_LEVELS, DEFAULT_TRANSPORT_EFFORT, OPENCLAW_THINKING_LEVELS, QWEN_EFFORT_LEVELS, isTransportEffortLevel, } from '../../shared/effort-levels.js';
39
- import { SESSION_STATE } from '../../shared/session-states.js';
40
- import { canSessionUseTerminal } from '../../shared/session-capabilities.js';
41
40
  /**
42
41
  * Build a unified subsession.sync payload from the session store record.
43
42
  * Ensures all fields (including Qwen metadata) are always sent — no more
@@ -81,7 +80,6 @@ async function buildSubSessionSync(id, overrides) {
81
80
  providerId: r?.providerId ?? null,
82
81
  providerSessionId: r?.providerSessionId ?? null,
83
82
  requestedModel: r?.requestedModel ?? null,
84
- state: r?.state ?? SESSION_STATE.UNKNOWN,
85
83
  activeModel: r?.activeModel ?? r?.modelDisplay ?? null,
86
84
  transportConfig: r?.transportConfig ?? null,
87
85
  // Qwen metadata — freshly computed display fields + stored config fields
@@ -588,7 +586,7 @@ export function handleWebCommand(msg, serverLink) {
588
586
  void handleServerDelete();
589
587
  break;
590
588
  case 'daemon.upgrade':
591
- void handleDaemonUpgrade(cmd.targetVersion);
589
+ void handleDaemonUpgrade(cmd.targetVersion, serverLink);
592
590
  break;
593
591
  case 'file.search':
594
592
  void handleFileSearch(cmd, serverLink);
@@ -1482,16 +1480,6 @@ function handleSubscribe(cmd, serverLink) {
1482
1480
  const session = cmd.session;
1483
1481
  if (!session)
1484
1482
  return;
1485
- const record = getSession(session);
1486
- if (!canSessionUseTerminal(record)) {
1487
- const existing = activeSubscriptions.get(session);
1488
- if (existing) {
1489
- existing.unsubscribe();
1490
- activeSubscriptions.delete(session);
1491
- }
1492
- logger.debug({ session, runtimeType: record?.runtimeType, agentType: record?.agentType }, 'Ignored terminal subscribe for non-terminal session');
1493
- return;
1494
- }
1495
1483
  // The bridge may include a `raw` flag on terminal.subscribe for its own forwarding-mode
1496
1484
  // bookkeeping, but daemon-side terminal streaming remains transport-stable in this phase:
1497
1485
  // once subscribed for a session, we continue emitting both text diffs and raw PTY bytes.
@@ -2175,7 +2163,24 @@ async function handleDiscussionStop(cmd) {
2175
2163
  * 3. A short sleep before the restart gives the current daemon time to finish
2176
2164
  * sending any in-flight messages.
2177
2165
  */
2178
- async function handleDaemonUpgrade(targetVersion) {
2166
+ async function handleDaemonUpgrade(targetVersion, serverLink) {
2167
+ const activeRuns = getActiveP2pRunsBlockingDaemonUpgrade();
2168
+ if (activeRuns.length > 0) {
2169
+ logger.warn({
2170
+ targetVersion,
2171
+ activeRunIds: activeRuns.map((run) => run.id),
2172
+ activeRunStatuses: activeRuns.map((run) => run.status),
2173
+ }, 'daemon.upgrade: blocked because P2P runs are active');
2174
+ try {
2175
+ serverLink?.send({
2176
+ type: DAEMON_MSG.UPGRADE_BLOCKED,
2177
+ reason: 'p2p_active',
2178
+ activeRunIds: activeRuns.map((run) => run.id),
2179
+ });
2180
+ }
2181
+ catch { /* ignore */ }
2182
+ return;
2183
+ }
2179
2184
  const { spawn } = await import('child_process');
2180
2185
  const { writeFileSync, mkdtempSync, existsSync } = await import('fs');
2181
2186
  const { join, dirname } = await import('path');
@@ -2370,6 +2375,9 @@ const FILE_SEARCH_EXCLUDES = new Set([
2370
2375
  'dist', 'build', '.next', '.nuxt', 'vendor', 'target',
2371
2376
  ]);
2372
2377
  const FILE_SEARCH_MAX = 20;
2378
+ export function getActiveP2pRunsBlockingDaemonUpgrade(runs = listP2pRuns()) {
2379
+ return runs.filter((run) => !P2P_TERMINAL_RUN_STATUSES.has(run.status));
2380
+ }
2373
2381
  async function handleFileSearch(cmd, serverLink) {
2374
2382
  const query = (cmd.query ?? '').trim();
2375
2383
  const projectDir = cmd.projectDir;