happy-imou-cloud 2.1.43 → 2.1.44

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 (32) hide show
  1. package/compat/acp-sdk-schema/index.d.ts +16 -3
  2. package/compat/acp-sdk-schema/index.js +15 -2
  3. package/compat/acp-sdk-schema/types.gen.d.ts +1801 -313
  4. package/compat/acp-sdk-schema/zod.gen.d.ts +3267 -1775
  5. package/compat/acp-sdk-schema/zod.gen.js +1007 -316
  6. package/dist/{BaseReasoningProcessor-D6itItnT.cjs → BaseReasoningProcessor-CMyFNQ1O.cjs} +2 -2
  7. package/dist/{BaseReasoningProcessor-CWCPAVJ3.mjs → BaseReasoningProcessor-DVSN7PCw.mjs} +2 -2
  8. package/dist/{ProviderSelectionHandler-CYUH1U8F.mjs → ProviderSelectionHandler-2IaDlDBx.mjs} +2 -2
  9. package/dist/{ProviderSelectionHandler-CXwqOJpC.cjs → ProviderSelectionHandler-Dqa4j1pD.cjs} +2 -2
  10. package/dist/{api-B89O-SC-.mjs → api-BhMVpzwg.mjs} +12 -8
  11. package/dist/{api-zMic8QXq.cjs → api-BoWVQeVe.cjs} +12 -8
  12. package/dist/{command-_qNFoJ-l.cjs → command-DoF8oaxg.cjs} +2 -2
  13. package/dist/{command-W01qXC9C.mjs → command-h3Rr4Abu.mjs} +2 -2
  14. package/dist/{index-CiHiCC31.mjs → index-DxF1W0nt.mjs} +57 -14
  15. package/dist/{index-DVVbyQGZ.cjs → index-kIN8gN9G.cjs} +60 -17
  16. package/dist/index.cjs +2 -2
  17. package/dist/index.mjs +2 -2
  18. package/dist/lib.cjs +1 -1
  19. package/dist/lib.d.cts +335 -336
  20. package/dist/lib.d.mts +335 -336
  21. package/dist/lib.mjs +1 -1
  22. package/dist/{registerKillSessionHandler-CDYAY5Ev.cjs → registerKillSessionHandler-CBm2WFM0.cjs} +2 -2
  23. package/dist/{registerKillSessionHandler-BnS3ozFX.mjs → registerKillSessionHandler-Dsg63Cx6.mjs} +2 -2
  24. package/dist/{runClaude-0U7kV07_.mjs → runClaude-BpwlCyVT.mjs} +4 -4
  25. package/dist/{runClaude-C1xfptKt.cjs → runClaude-Dq9OISKt.cjs} +4 -4
  26. package/dist/{runCodex-DnDmHm7E.mjs → runCodex-BMNR2hNp.mjs} +5 -5
  27. package/dist/{runCodex-BBgKpYLO.cjs → runCodex-BnzErOK_.cjs} +5 -5
  28. package/dist/{runGemini-CUwQHJ9y.cjs → runGemini-CYc9Ufxo.cjs} +4 -4
  29. package/dist/{runGemini-DcsIBQSc.mjs → runGemini-D4Af8oH1.mjs} +4 -4
  30. package/package.json +2 -2
  31. package/scripts/ensureAcpSdkCompat.mjs +37 -11
  32. package/scripts/release-smoke.mjs +1 -0
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, c as configuration, l as logger } from './api-B89O-SC-.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, c as configuration, l as logger } from './api-BhMVpzwg.mjs';
2
2
  export { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
3
3
  import 'axios';
4
4
  import 'chalk';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DVVbyQGZ.cjs');
4
- var persistence = require('./api-zMic8QXq.cjs');
3
+ var index = require('./index-kIN8gN9G.cjs');
4
+ var persistence = require('./api-BoWVQeVe.cjs');
5
5
  var node_crypto = require('node:crypto');
6
6
  var path = require('node:path');
7
7
  require('axios');
@@ -1,5 +1,5 @@
1
- import { k as initialMachineMetadata, R as RuntimeShell, f as formatDisplayMessage, l as resolveCanonicalToolNameV2, m as isTerminalReferenceOnlyPayload, t as truncateDisplayMessage } from './index-CiHiCC31.mjs';
2
- import { r as readSettings, H as HeadTailPreviewBuffer, e as HAPPY_ORG_REPLY_ACK_VERSION, f as HAPPY_ORG_TURN_REPORT_TAG, g as HAPPY_ORG_SUMMARY_MAX_LENGTH, j as HAPPY_ORG_REPEAT_THRESHOLD, l as logger, n as normalizePreviewableArtifactTarget } from './api-B89O-SC-.mjs';
1
+ import { k as initialMachineMetadata, R as RuntimeShell, f as formatDisplayMessage, l as resolveCanonicalToolNameV2, m as isTerminalReferenceOnlyPayload, t as truncateDisplayMessage } from './index-DxF1W0nt.mjs';
2
+ import { r as readSettings, H as HeadTailPreviewBuffer, e as HAPPY_ORG_REPLY_ACK_VERSION, f as HAPPY_ORG_TURN_REPORT_TAG, g as HAPPY_ORG_SUMMARY_MAX_LENGTH, j as HAPPY_ORG_REPEAT_THRESHOLD, l as logger, n as normalizePreviewableArtifactTarget } from './api-BhMVpzwg.mjs';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { basename } from 'node:path';
5
5
  import 'axios';
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger, k as backoff, m as delay, d as AssistantMessageStream, o as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError, h as hashObject } from './api-B89O-SC-.mjs';
2
+ import { l as logger, k as backoff, m as delay, d as AssistantMessageStream, o as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError, h as hashObject } from './api-BhMVpzwg.mjs';
3
3
  import 'cross-spawn';
4
4
  import '@agentclientprotocol/sdk';
5
- import { n as getProjectPath, F as Future, o as claudeLocal, E as ExitCodeError, q as trimIdent, u as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, w as claudeCheckSession, x as projectPath, y as mapToClaudeMode, P as PushableAsyncIterable, z as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, B as getEnvironmentInfo, a as createSessionMetadata, C as startCaffeinate, b as closeProviderSession } from './index-CiHiCC31.mjs';
5
+ import { n as getProjectPath, F as Future, o as claudeLocal, E as ExitCodeError, q as trimIdent, u as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, w as claudeCheckSession, x as projectPath, y as mapToClaudeMode, P as PushableAsyncIterable, z as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, B as getEnvironmentInfo, a as createSessionMetadata, C as startCaffeinate, b as closeProviderSession } from './index-DxF1W0nt.mjs';
6
6
  import 'ps-list';
7
7
  import 'fs';
8
8
  import 'path';
@@ -23,9 +23,9 @@ import 'tweetnacl';
23
23
  import 'open';
24
24
  import React, { useState, useRef, useEffect, useCallback } from 'react';
25
25
  import { useStdout, useInput, Box, Text, render } from 'ink';
26
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-CYUH1U8F.mjs';
26
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-2IaDlDBx.mjs';
27
27
  import { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
28
- import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, q as createSessionTranscriptInkRenderer, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, n as renderTerminalOutputPreview, p as forwardAgentMessageToProviderSession, m as buildPermissionPushNotification, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, c as registerKillSessionHandler } from './registerKillSessionHandler-BnS3ozFX.mjs';
28
+ import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, q as createSessionTranscriptInkRenderer, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, n as renderTerminalOutputPreview, p as forwardAgentMessageToProviderSession, m as buildPermissionPushNotification, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, c as registerKillSessionHandler } from './registerKillSessionHandler-Dsg63Cx6.mjs';
29
29
  import 'socket.io-client';
30
30
  import 'expo-server-sdk';
31
31
  import { isDeepStrictEqual } from 'node:util';
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
- var persistence = require('./api-zMic8QXq.cjs');
4
+ var persistence = require('./api-BoWVQeVe.cjs');
5
5
  require('cross-spawn');
6
6
  require('@agentclientprotocol/sdk');
7
- var index = require('./index-DVVbyQGZ.cjs');
7
+ var index = require('./index-kIN8gN9G.cjs');
8
8
  require('ps-list');
9
9
  require('fs');
10
10
  require('path');
@@ -25,9 +25,9 @@ require('tweetnacl');
25
25
  require('open');
26
26
  var React = require('react');
27
27
  var ink = require('ink');
28
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-CXwqOJpC.cjs');
28
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-Dqa4j1pD.cjs');
29
29
  var types = require('./types-DVk3crez.cjs');
30
- var registerKillSessionHandler = require('./registerKillSessionHandler-CDYAY5Ev.cjs');
30
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CBm2WFM0.cjs');
31
31
  require('socket.io-client');
32
32
  require('expo-server-sdk');
33
33
  var node_util = require('node:util');
@@ -1,6 +1,6 @@
1
- import { p as preserveSessionRuntimeMetadata, l as logger, h as hashObject, d as AssistantMessageStream, b as connectionState, A as ApiClient } from './api-B89O-SC-.mjs';
2
- import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, c as registerKillSessionHandler, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, q as createSessionTranscriptInkRenderer, k as extractPermissionRequestPushContext, m as buildPermissionPushNotification, n as renderTerminalOutputPreview, o as inferToolResultError, p as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-BnS3ozFX.mjs';
3
- import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-CiHiCC31.mjs';
1
+ import { p as preserveSessionRuntimeMetadata, l as logger, h as hashObject, d as AssistantMessageStream, b as connectionState, A as ApiClient } from './api-BhMVpzwg.mjs';
2
+ import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, c as registerKillSessionHandler, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, q as createSessionTranscriptInkRenderer, k as extractPermissionRequestPushContext, m as buildPermissionPushNotification, n as renderTerminalOutputPreview, o as inferToolResultError, p as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-Dsg63Cx6.mjs';
3
+ import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-DxF1W0nt.mjs';
4
4
  import 'cross-spawn';
5
5
  import '@agentclientprotocol/sdk';
6
6
  import { randomUUID } from 'node:crypto';
@@ -24,8 +24,8 @@ import 'tweetnacl';
24
24
  import 'open';
25
25
  import React, { useState, useRef, useEffect, useCallback } from 'react';
26
26
  import { useStdout, useInput, Box, Text, render } from 'ink';
27
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-CYUH1U8F.mjs';
28
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CWCPAVJ3.mjs';
27
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-2IaDlDBx.mjs';
28
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DVSN7PCw.mjs';
29
29
  import 'zod';
30
30
  import 'socket.io-client';
31
31
  import 'expo-server-sdk';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var persistence = require('./api-zMic8QXq.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-CDYAY5Ev.cjs');
5
- var index = require('./index-DVVbyQGZ.cjs');
3
+ var persistence = require('./api-BoWVQeVe.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CBm2WFM0.cjs');
5
+ var index = require('./index-kIN8gN9G.cjs');
6
6
  require('cross-spawn');
7
7
  require('@agentclientprotocol/sdk');
8
8
  var node_crypto = require('node:crypto');
@@ -26,8 +26,8 @@ require('tweetnacl');
26
26
  require('open');
27
27
  var React = require('react');
28
28
  var ink = require('ink');
29
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-CXwqOJpC.cjs');
30
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-D6itItnT.cjs');
29
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-Dqa4j1pD.cjs');
30
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-CMyFNQ1O.cjs');
31
31
  require('zod');
32
32
  require('socket.io-client');
33
33
  require('expo-server-sdk');
@@ -3,10 +3,10 @@
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
- var persistence = require('./api-zMic8QXq.cjs');
7
- var registerKillSessionHandler = require('./registerKillSessionHandler-CDYAY5Ev.cjs');
8
- var index = require('./index-DVVbyQGZ.cjs');
9
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-D6itItnT.cjs');
6
+ var persistence = require('./api-BoWVQeVe.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CBm2WFM0.cjs');
8
+ var index = require('./index-kIN8gN9G.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-CMyFNQ1O.cjs');
10
10
  require('cross-spawn');
11
11
  require('@agentclientprotocol/sdk');
12
12
  require('ps-list');
@@ -1,10 +1,10 @@
1
1
  import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { l as logger, b as connectionState, A as ApiClient, h as hashObject, d as AssistantMessageStream } from './api-B89O-SC-.mjs';
5
- import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, k as extractPermissionRequestPushContext, m as buildPermissionPushNotification, n as renderTerminalOutputPreview, o as inferToolResultError, p as forwardAgentMessageToProviderSession, q as createSessionTranscriptInkRenderer } from './registerKillSessionHandler-BnS3ozFX.mjs';
6
- import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-CiHiCC31.mjs';
7
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CWCPAVJ3.mjs';
4
+ import { l as logger, b as connectionState, A as ApiClient, h as hashObject, d as AssistantMessageStream } from './api-BhMVpzwg.mjs';
5
+ import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, h as finalizeHappyOrgTurnWithBusinessAck, i as buildTurnResultPushNotification, j as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, k as extractPermissionRequestPushContext, m as buildPermissionPushNotification, n as renderTerminalOutputPreview, o as inferToolResultError, p as forwardAgentMessageToProviderSession, q as createSessionTranscriptInkRenderer } from './registerKillSessionHandler-Dsg63Cx6.mjs';
6
+ import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-DxF1W0nt.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DVSN7PCw.mjs';
8
8
  import 'cross-spawn';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'ps-list';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.1.43",
3
+ "version": "2.1.44",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",
@@ -87,7 +87,7 @@
87
87
  "test:happy-org-1.2-quality": "node ../../node_modules/vitest/vitest.mjs run --config vitest.happy-org-1.2.config.mjs"
88
88
  },
89
89
  "dependencies": {
90
- "@agentclientprotocol/sdk": "0.17.1",
90
+ "@agentclientprotocol/sdk": "0.21.0",
91
91
  "@stablelib/base64": "^2.0.1",
92
92
  "@stablelib/hex": "^2.0.1",
93
93
  "@types/cross-spawn": "^6.0.6",
@@ -1,4 +1,4 @@
1
- import { copyFileSync, existsSync, mkdirSync } from 'node:fs';
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
2
2
  import { dirname, resolve, join } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
 
@@ -61,14 +61,26 @@ function hasAllFiles(directory, files) {
61
61
  return files.every((file) => existsSync(join(directory, file)));
62
62
  }
63
63
 
64
- function copyMissingFiles(sourceDir, targetDir, files) {
64
+ function filesMatch(sourceFile, targetFile) {
65
+ if (!existsSync(sourceFile) || !existsSync(targetFile)) {
66
+ return false;
67
+ }
68
+
69
+ return readFileSync(sourceFile).equals(readFileSync(targetFile));
70
+ }
71
+
72
+ function hasMatchingFiles(sourceDir, targetDir, files) {
73
+ return files.every((file) => filesMatch(join(sourceDir, file), join(targetDir, file)));
74
+ }
75
+
76
+ function copyChangedFiles(sourceDir, targetDir, files) {
65
77
  let copied = 0;
66
78
 
67
79
  for (const file of files) {
68
80
  const sourceFile = join(sourceDir, file);
69
81
  const targetFile = join(targetDir, file);
70
82
 
71
- if (!existsSync(sourceFile) || existsSync(targetFile)) {
83
+ if (!existsSync(sourceFile) || filesMatch(sourceFile, targetFile)) {
72
84
  continue;
73
85
  }
74
86
 
@@ -91,6 +103,9 @@ export function ensureAcpSdkCompat(options = {}) {
91
103
  const targetPackageDir = resolve(target.targetPackageDir);
92
104
  const targetBaseDir = join(targetPackageDir, target.targetBaseDir);
93
105
  const sentinelFile = join(targetPackageDir, target.sentinelFile);
106
+ const requiredRuntimeFiles = Array.isArray(target.requiredRuntimeFiles) ? target.requiredRuntimeFiles : [];
107
+ const optionalTypeFiles = Array.isArray(target.optionalTypeFiles) ? target.optionalTypeFiles : [];
108
+ const sourceBaseDirs = Array.isArray(target.sourceBaseDirs) ? target.sourceBaseDirs : [];
94
109
 
95
110
  if (!existsSync(sentinelFile)) {
96
111
  results.push({
@@ -103,7 +118,20 @@ export function ensureAcpSdkCompat(options = {}) {
103
118
  continue;
104
119
  }
105
120
 
106
- if (hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
121
+ const sourceBaseDir = sourceBaseDirs.find((candidate) => hasAllFiles(candidate, requiredRuntimeFiles));
122
+ const typeSourceBaseDir = optionalTypeFiles.length > 0
123
+ ? sourceBaseDirs.find((candidate) => hasAllFiles(candidate, optionalTypeFiles))
124
+ : null;
125
+
126
+ const hasRequiredRuntimeFiles = hasAllFiles(targetBaseDir, requiredRuntimeFiles);
127
+ const runtimeFilesMatchSource = sourceBaseDir
128
+ ? hasMatchingFiles(sourceBaseDir, targetBaseDir, requiredRuntimeFiles)
129
+ : hasRequiredRuntimeFiles;
130
+ const typeFilesMatchSource = typeSourceBaseDir
131
+ ? hasMatchingFiles(typeSourceBaseDir, targetBaseDir, optionalTypeFiles)
132
+ : true;
133
+
134
+ if (runtimeFilesMatchSource && typeFilesMatchSource) {
107
135
  results.push({
108
136
  name: target.name,
109
137
  checked: true,
@@ -114,24 +142,22 @@ export function ensureAcpSdkCompat(options = {}) {
114
142
  continue;
115
143
  }
116
144
 
117
- const sourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.requiredRuntimeFiles));
118
145
  if (!sourceBaseDir) {
119
146
  throw new Error(
120
- `[runtime-compat] Missing ${target.requiredRuntimeFiles.join(', ')} under ${targetBaseDir}, and no repair source is available for ${target.name}.`,
147
+ `[runtime-compat] Missing ${requiredRuntimeFiles.join(', ')} under ${targetBaseDir}, and no repair source is available for ${target.name}.`,
121
148
  );
122
149
  }
123
150
 
124
151
  mkdirSync(targetBaseDir, { recursive: true });
125
152
 
126
- const copiedRuntimeFiles = copyMissingFiles(sourceBaseDir, targetBaseDir, target.requiredRuntimeFiles);
127
- const typeSourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.optionalTypeFiles));
153
+ const copiedRuntimeFiles = copyChangedFiles(sourceBaseDir, targetBaseDir, requiredRuntimeFiles);
128
154
  const copiedTypeFiles = typeSourceBaseDir
129
- ? copyMissingFiles(typeSourceBaseDir, targetBaseDir, target.optionalTypeFiles)
155
+ ? copyChangedFiles(typeSourceBaseDir, targetBaseDir, optionalTypeFiles)
130
156
  : 0;
131
157
 
132
- if (!hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
158
+ if (!hasMatchingFiles(sourceBaseDir, targetBaseDir, requiredRuntimeFiles)) {
133
159
  throw new Error(
134
- `[runtime-compat] Repair source ${sourceBaseDir} did not restore ${target.requiredRuntimeFiles.join(', ')} into ${targetBaseDir}.`,
160
+ `[runtime-compat] Repair source ${sourceBaseDir} did not restore ${requiredRuntimeFiles.join(', ')} into ${targetBaseDir}.`,
135
161
  );
136
162
  }
137
163
 
@@ -198,6 +198,7 @@ function main() {
198
198
  'src/agent/acp/AcpBackend.startup.test.ts',
199
199
  'src/agent/acp/AcpBackend.waitForResponseComplete.test.ts',
200
200
  'src/agent/acp/AcpBackend.initDelay.test.ts',
201
+ 'src/agent/acp/AcpBackend.streams.test.ts',
201
202
  'src/agent/acp/acpSpawn.test.ts',
202
203
  'src/agent/acp/createAcpFilteredStdoutReadable.multiline.test.ts',
203
204
  'src/agent/acp/killProcessTree.test.ts',