happy-imou-cloud 2.1.1 → 2.1.2

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 (44) hide show
  1. package/bin/happy-cloud.mjs +21 -21
  2. package/compat/acp-sdk-schema/index.js +27 -27
  3. package/compat/acp-sdk-schema/types.gen.js +2 -2
  4. package/compat/acp-sdk-schema/zod.gen.js +1553 -1553
  5. package/compat/ink-build/components/Cursor.d.ts +83 -83
  6. package/compat/ink-build/components/Cursor.js +52 -52
  7. package/compat/ink-build/components/CursorContext.d.ts +11 -11
  8. package/compat/ink-build/components/CursorContext.js +7 -7
  9. package/compat/ink-build/components/ErrorBoundary.d.ts +18 -18
  10. package/compat/ink-build/components/ErrorBoundary.js +22 -22
  11. package/compat/ink-build/hooks/use-cursor.d.ts +12 -12
  12. package/compat/ink-build/hooks/use-cursor.js +28 -28
  13. package/dist/{BaseReasoningProcessor-Dn9FxfxU.mjs → BaseReasoningProcessor-BaOWkVcu.mjs} +3 -3
  14. package/dist/{BaseReasoningProcessor-CBMK-8Gi.cjs → BaseReasoningProcessor-CzvqwxuY.cjs} +3 -3
  15. package/dist/ProviderSelectionHandler-Q8pl7e-d.mjs +261 -0
  16. package/dist/ProviderSelectionHandler-wwbfeK_s.cjs +265 -0
  17. package/dist/{api-DBy5lPZw.mjs → api-Cxifhw5r.mjs} +3 -3
  18. package/dist/{api-DId_j3C2.cjs → api-DZimmN4C.cjs} +2 -2
  19. package/dist/{command-CeaBwYCW.mjs → command-B6LM3Nml.mjs} +3 -3
  20. package/dist/{command-DwfUpmId.cjs → command-RcCJI1jl.cjs} +3 -3
  21. package/dist/{index-CuuYSKiv.cjs → index-Cuvs0lFS.cjs} +168 -75
  22. package/dist/{index-66vjECEd.mjs → index-Des7I5WX.mjs} +165 -72
  23. package/dist/index.cjs +3 -3
  24. package/dist/index.mjs +3 -3
  25. package/dist/lib.cjs +1 -1
  26. package/dist/lib.d.cts +36 -36
  27. package/dist/lib.d.mts +36 -36
  28. package/dist/lib.mjs +1 -1
  29. package/dist/{persistence-BOWh1NER.mjs → persistence-6d4U4Sh8.mjs} +1 -1
  30. package/dist/{persistence-Dzr6sFwD.cjs → persistence-C8-MtdQK.cjs} +1 -1
  31. package/dist/{registerKillSessionHandler-D4_wpN18.mjs → registerKillSessionHandler-BFBkz_XT.mjs} +417 -5
  32. package/dist/{registerKillSessionHandler-Dg_iRBPm.cjs → registerKillSessionHandler-BapPCRmp.cjs} +419 -4
  33. package/dist/{runClaude-B74dHAnQ.mjs → runClaude-CPV5Uap2.mjs} +34 -5
  34. package/dist/{runClaude-oIFzkfuU.cjs → runClaude-DVnqKa1q.cjs} +37 -8
  35. package/dist/{runCodex-D_9CuL6M.cjs → runCodex-Bzsp8gFO.cjs} +29 -21
  36. package/dist/{runCodex-mLHjsgVj.mjs → runCodex-CwtLSTMJ.mjs} +26 -18
  37. package/dist/{runGemini-CcWGezMt.cjs → runGemini-6Dwyk_Km.cjs} +267 -82
  38. package/dist/{runGemini-BMiho2ab.mjs → runGemini-Bmoxehlh.mjs} +267 -82
  39. package/package.json +9 -9
  40. package/scripts/build.mjs +68 -68
  41. package/scripts/ensureAcpSdkCompat.mjs +170 -172
  42. package/scripts/release-smoke.mjs +38 -35
  43. package/dist/ProviderSelectionHandler-BuXk-8ji.cjs +0 -680
  44. package/dist/ProviderSelectionHandler-CMaQThYO.mjs +0 -673
@@ -1,173 +1,171 @@
1
- #!/usr/bin/env node
2
-
3
1
  import { copyFileSync, existsSync, mkdirSync } from 'node:fs';
4
- import { dirname, resolve, join } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
-
7
- const here = dirname(fileURLToPath(import.meta.url));
8
- const defaultPackageRoot = resolve(here, '..');
9
- const defaultWorkspaceRoot = resolve(defaultPackageRoot, '..', '..');
10
-
11
- function getRepairTargets(packageRoot, workspaceRoot) {
12
- return [
13
- {
14
- name: '@agentclientprotocol/sdk schema',
15
- targetPackageDir: join(packageRoot, 'node_modules', '@agentclientprotocol', 'sdk'),
16
- targetBaseDir: 'dist/schema',
17
- sentinelFile: 'dist/acp.js',
18
- requiredRuntimeFiles: [
19
- 'index.js',
20
- 'types.gen.js',
21
- 'zod.gen.js',
22
- ],
23
- optionalTypeFiles: [
24
- 'index.d.ts',
25
- 'types.gen.d.ts',
26
- 'zod.gen.d.ts',
27
- ],
28
- sourceBaseDirs: [
29
- join(workspaceRoot, 'node_modules', '@agentclientprotocol', 'sdk', 'dist', 'schema'),
30
- join(packageRoot, 'compat', 'acp-sdk-schema'),
31
- ],
32
- },
33
- {
34
- name: 'ink cursor hooks',
35
- targetPackageDir: join(packageRoot, 'node_modules', 'ink'),
36
- targetBaseDir: 'build',
37
- sentinelFile: 'build/index.js',
38
- requiredRuntimeFiles: [
39
- 'components/Cursor.js',
40
- 'components/CursorContext.js',
41
- 'components/ErrorBoundary.js',
42
- 'hooks/use-cursor.js',
43
- ],
44
- optionalTypeFiles: [
45
- 'components/Cursor.d.ts',
46
- 'components/CursorContext.d.ts',
47
- 'components/ErrorBoundary.d.ts',
48
- 'hooks/use-cursor.d.ts',
49
- ],
50
- sourceBaseDirs: [
51
- join(workspaceRoot, 'node_modules', 'ink', 'build'),
52
- join(packageRoot, 'compat', 'ink-build'),
53
- ],
54
- },
55
- ];
56
- }
57
-
58
- function isDirectExecution() {
59
- return process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
60
- }
61
-
62
- function hasAllFiles(directory, files) {
63
- return files.every((file) => existsSync(join(directory, file)));
64
- }
65
-
66
- function copyMissingFiles(sourceDir, targetDir, files) {
67
- let copied = 0;
68
-
69
- for (const file of files) {
70
- const sourceFile = join(sourceDir, file);
71
- const targetFile = join(targetDir, file);
72
-
73
- if (!existsSync(sourceFile) || existsSync(targetFile)) {
74
- continue;
75
- }
76
-
77
- mkdirSync(dirname(targetFile), { recursive: true });
78
- copyFileSync(sourceFile, targetFile);
79
- copied += 1;
80
- }
81
-
82
- return copied;
83
- }
84
-
85
- export function ensureAcpSdkCompat(options = {}) {
86
- const packageRoot = resolve(options.packageRoot ?? defaultPackageRoot);
87
- const workspaceRoot = resolve(options.workspaceRoot ?? defaultWorkspaceRoot);
88
- const targetOverrides = Array.isArray(options.targets) ? options.targets : null;
89
- const repairTargets = targetOverrides ?? getRepairTargets(packageRoot, workspaceRoot);
90
- const results = [];
91
-
92
- for (const target of repairTargets) {
93
- const targetPackageDir = resolve(target.targetPackageDir);
94
- const targetBaseDir = join(targetPackageDir, target.targetBaseDir);
95
- const sentinelFile = join(targetPackageDir, target.sentinelFile);
96
-
97
- if (!existsSync(sentinelFile)) {
98
- results.push({
99
- name: target.name,
100
- checked: false,
101
- repaired: false,
102
- reason: 'target-package-missing',
103
- targetBaseDir,
104
- });
105
- continue;
106
- }
107
-
108
- if (hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
109
- results.push({
110
- name: target.name,
111
- checked: true,
112
- repaired: false,
113
- reason: 'already-valid',
114
- targetBaseDir,
115
- });
116
- continue;
117
- }
118
-
119
- const sourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.requiredRuntimeFiles));
120
- if (!sourceBaseDir) {
121
- throw new Error(
122
- `[runtime-compat] Missing ${target.requiredRuntimeFiles.join(', ')} under ${targetBaseDir}, and no repair source is available for ${target.name}.`,
123
- );
124
- }
125
-
126
- mkdirSync(targetBaseDir, { recursive: true });
127
-
128
- const copiedRuntimeFiles = copyMissingFiles(sourceBaseDir, targetBaseDir, target.requiredRuntimeFiles);
129
- const typeSourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.optionalTypeFiles));
130
- const copiedTypeFiles = typeSourceBaseDir
131
- ? copyMissingFiles(typeSourceBaseDir, targetBaseDir, target.optionalTypeFiles)
132
- : 0;
133
-
134
- if (!hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
135
- throw new Error(
136
- `[runtime-compat] Repair source ${sourceBaseDir} did not restore ${target.requiredRuntimeFiles.join(', ')} into ${targetBaseDir}.`,
137
- );
138
- }
139
-
140
- results.push({
141
- name: target.name,
142
- checked: true,
143
- repaired: copiedRuntimeFiles > 0 || copiedTypeFiles > 0,
144
- reason: 'repaired',
145
- copiedRuntimeFiles,
146
- copiedTypeFiles,
147
- sourceBaseDir,
148
- targetBaseDir,
149
- });
150
- }
151
-
152
- const repairedTargets = results.filter((result) => result.repaired);
153
- const checkedTargets = results.filter((result) => result.checked);
154
-
155
- return {
156
- checked: checkedTargets.length > 0,
157
- repaired: repairedTargets.length > 0,
158
- reason: repairedTargets.length > 0 ? 'repaired' : 'already-valid',
159
- results,
160
- };
161
- }
162
-
163
- if (isDirectExecution()) {
164
- const result = ensureAcpSdkCompat();
165
-
166
- if (result.repaired) {
167
- for (const target of result.results.filter((entry) => entry.repaired)) {
168
- console.log(`[runtime-compat] Restored ${target.name} from ${target.sourceBaseDir} -> ${target.targetBaseDir}`);
169
- }
170
- } else {
171
- console.log(`[runtime-compat] ${result.reason}`);
172
- }
173
- }
2
+ import { dirname, resolve, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const here = dirname(fileURLToPath(import.meta.url));
6
+ const defaultPackageRoot = resolve(here, '..');
7
+ const defaultWorkspaceRoot = resolve(defaultPackageRoot, '..', '..');
8
+
9
+ function getRepairTargets(packageRoot, workspaceRoot) {
10
+ return [
11
+ {
12
+ name: '@agentclientprotocol/sdk schema',
13
+ targetPackageDir: join(packageRoot, 'node_modules', '@agentclientprotocol', 'sdk'),
14
+ targetBaseDir: 'dist/schema',
15
+ sentinelFile: 'dist/acp.js',
16
+ requiredRuntimeFiles: [
17
+ 'index.js',
18
+ 'types.gen.js',
19
+ 'zod.gen.js',
20
+ ],
21
+ optionalTypeFiles: [
22
+ 'index.d.ts',
23
+ 'types.gen.d.ts',
24
+ 'zod.gen.d.ts',
25
+ ],
26
+ sourceBaseDirs: [
27
+ join(workspaceRoot, 'node_modules', '@agentclientprotocol', 'sdk', 'dist', 'schema'),
28
+ join(packageRoot, 'compat', 'acp-sdk-schema'),
29
+ ],
30
+ },
31
+ {
32
+ name: 'ink cursor hooks',
33
+ targetPackageDir: join(packageRoot, 'node_modules', 'ink'),
34
+ targetBaseDir: 'build',
35
+ sentinelFile: 'build/index.js',
36
+ requiredRuntimeFiles: [
37
+ 'components/Cursor.js',
38
+ 'components/CursorContext.js',
39
+ 'components/ErrorBoundary.js',
40
+ 'hooks/use-cursor.js',
41
+ ],
42
+ optionalTypeFiles: [
43
+ 'components/Cursor.d.ts',
44
+ 'components/CursorContext.d.ts',
45
+ 'components/ErrorBoundary.d.ts',
46
+ 'hooks/use-cursor.d.ts',
47
+ ],
48
+ sourceBaseDirs: [
49
+ join(workspaceRoot, 'node_modules', 'ink', 'build'),
50
+ join(packageRoot, 'compat', 'ink-build'),
51
+ ],
52
+ },
53
+ ];
54
+ }
55
+
56
+ function isDirectExecution() {
57
+ return process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
58
+ }
59
+
60
+ function hasAllFiles(directory, files) {
61
+ return files.every((file) => existsSync(join(directory, file)));
62
+ }
63
+
64
+ function copyMissingFiles(sourceDir, targetDir, files) {
65
+ let copied = 0;
66
+
67
+ for (const file of files) {
68
+ const sourceFile = join(sourceDir, file);
69
+ const targetFile = join(targetDir, file);
70
+
71
+ if (!existsSync(sourceFile) || existsSync(targetFile)) {
72
+ continue;
73
+ }
74
+
75
+ mkdirSync(dirname(targetFile), { recursive: true });
76
+ copyFileSync(sourceFile, targetFile);
77
+ copied += 1;
78
+ }
79
+
80
+ return copied;
81
+ }
82
+
83
+ export function ensureAcpSdkCompat(options = {}) {
84
+ const packageRoot = resolve(options.packageRoot ?? defaultPackageRoot);
85
+ const workspaceRoot = resolve(options.workspaceRoot ?? defaultWorkspaceRoot);
86
+ const targetOverrides = Array.isArray(options.targets) ? options.targets : null;
87
+ const repairTargets = targetOverrides ?? getRepairTargets(packageRoot, workspaceRoot);
88
+ const results = [];
89
+
90
+ for (const target of repairTargets) {
91
+ const targetPackageDir = resolve(target.targetPackageDir);
92
+ const targetBaseDir = join(targetPackageDir, target.targetBaseDir);
93
+ const sentinelFile = join(targetPackageDir, target.sentinelFile);
94
+
95
+ if (!existsSync(sentinelFile)) {
96
+ results.push({
97
+ name: target.name,
98
+ checked: false,
99
+ repaired: false,
100
+ reason: 'target-package-missing',
101
+ targetBaseDir,
102
+ });
103
+ continue;
104
+ }
105
+
106
+ if (hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
107
+ results.push({
108
+ name: target.name,
109
+ checked: true,
110
+ repaired: false,
111
+ reason: 'already-valid',
112
+ targetBaseDir,
113
+ });
114
+ continue;
115
+ }
116
+
117
+ const sourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.requiredRuntimeFiles));
118
+ if (!sourceBaseDir) {
119
+ throw new Error(
120
+ `[runtime-compat] Missing ${target.requiredRuntimeFiles.join(', ')} under ${targetBaseDir}, and no repair source is available for ${target.name}.`,
121
+ );
122
+ }
123
+
124
+ mkdirSync(targetBaseDir, { recursive: true });
125
+
126
+ const copiedRuntimeFiles = copyMissingFiles(sourceBaseDir, targetBaseDir, target.requiredRuntimeFiles);
127
+ const typeSourceBaseDir = target.sourceBaseDirs.find((candidate) => hasAllFiles(candidate, target.optionalTypeFiles));
128
+ const copiedTypeFiles = typeSourceBaseDir
129
+ ? copyMissingFiles(typeSourceBaseDir, targetBaseDir, target.optionalTypeFiles)
130
+ : 0;
131
+
132
+ if (!hasAllFiles(targetBaseDir, target.requiredRuntimeFiles)) {
133
+ throw new Error(
134
+ `[runtime-compat] Repair source ${sourceBaseDir} did not restore ${target.requiredRuntimeFiles.join(', ')} into ${targetBaseDir}.`,
135
+ );
136
+ }
137
+
138
+ results.push({
139
+ name: target.name,
140
+ checked: true,
141
+ repaired: copiedRuntimeFiles > 0 || copiedTypeFiles > 0,
142
+ reason: 'repaired',
143
+ copiedRuntimeFiles,
144
+ copiedTypeFiles,
145
+ sourceBaseDir,
146
+ targetBaseDir,
147
+ });
148
+ }
149
+
150
+ const repairedTargets = results.filter((result) => result.repaired);
151
+ const checkedTargets = results.filter((result) => result.checked);
152
+
153
+ return {
154
+ checked: checkedTargets.length > 0,
155
+ repaired: repairedTargets.length > 0,
156
+ reason: repairedTargets.length > 0 ? 'repaired' : 'already-valid',
157
+ results,
158
+ };
159
+ }
160
+
161
+ if (isDirectExecution()) {
162
+ const result = ensureAcpSdkCompat();
163
+
164
+ if (result.repaired) {
165
+ for (const target of result.results.filter((entry) => entry.repaired)) {
166
+ console.log(`[runtime-compat] Restored ${target.name} from ${target.sourceBaseDir} -> ${target.targetBaseDir}`);
167
+ }
168
+ } else {
169
+ console.log(`[runtime-compat] ${result.reason}`);
170
+ }
171
+ }
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { spawnSync } from 'node:child_process';
4
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
5
- import { tmpdir } from 'node:os';
6
- import { fileURLToPath } from 'node:url';
7
- import { dirname, join, resolve } from 'node:path';
8
- import { ensureAcpSdkCompat } from './ensureAcpSdkCompat.mjs';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { dirname, join, resolve } from 'node:path';
8
+ import { ensureAcpSdkCompat } from './ensureAcpSdkCompat.mjs';
9
9
 
10
10
  const here = dirname(fileURLToPath(import.meta.url));
11
11
  const packageRoot = resolve(here, '..');
@@ -106,10 +106,10 @@ function runToolStep(name, tool, args, options = {}) {
106
106
  runStep(name, tool.command, [...tool.prefixArgs, ...args], options);
107
107
  }
108
108
 
109
- function verifyPackedInstall() {
110
- const tempRoot = mkdtempSync(join(tmpdir(), 'happy-cli-release-smoke-'));
111
- const packOutputDir = join(tempRoot, 'pack');
112
- let tarballPath = null;
109
+ function verifyPackedInstall() {
110
+ const tempRoot = mkdtempSync(join(tmpdir(), 'happy-cli-release-smoke-'));
111
+ const packOutputDir = join(tempRoot, 'pack');
112
+ let tarballPath = null;
113
113
 
114
114
  try {
115
115
  mkdirSync(packOutputDir, { recursive: true });
@@ -144,25 +144,25 @@ function verifyPackedInstall() {
144
144
  cwd: tempRoot,
145
145
  });
146
146
 
147
- runStep('run packed cli help', 'node', [
148
- join(tempRoot, 'node_modules', 'happy-imou-cloud', 'bin', 'happy-cloud.mjs'),
149
- '--help',
150
- ], {
151
- cwd: tempRoot,
152
- });
153
-
154
- runStep('run packed cli auth status', 'node', [
155
- join(tempRoot, 'node_modules', 'happy-imou-cloud', 'bin', 'happy-cloud.mjs'),
156
- 'auth',
157
- 'status',
158
- ], {
159
- cwd: tempRoot,
160
- env: {
161
- ...process.env,
162
- HAPPY_CLOUD_HOME_DIR: join(tempRoot, '.happy-cloud'),
163
- },
164
- });
165
- } finally {
147
+ runStep('run packed cli help', 'node', [
148
+ join(tempRoot, 'node_modules', 'happy-imou-cloud', 'bin', 'happy-cloud.mjs'),
149
+ '--help',
150
+ ], {
151
+ cwd: tempRoot,
152
+ });
153
+
154
+ runStep('run packed cli auth status', 'node', [
155
+ join(tempRoot, 'node_modules', 'happy-imou-cloud', 'bin', 'happy-cloud.mjs'),
156
+ 'auth',
157
+ 'status',
158
+ ], {
159
+ cwd: tempRoot,
160
+ env: {
161
+ ...process.env,
162
+ HAPPY_CLOUD_HOME_DIR: join(tempRoot, '.happy-cloud'),
163
+ },
164
+ });
165
+ } finally {
166
166
  if (tarballPath) {
167
167
  try {
168
168
  unlinkSync(tarballPath);
@@ -183,12 +183,12 @@ function shouldSkipPackedInstallVerification() {
183
183
  return process.env.npm_lifecycle_event === 'prepublishOnly';
184
184
  }
185
185
 
186
- function main() {
187
- const tsc = resolveTool('tsc', 'typescript');
188
- const vitest = resolveTool('vitest', 'vitest');
189
-
190
- ensureAcpSdkCompat();
191
- runToolStep('typecheck', tsc, ['--noEmit']);
186
+ function main() {
187
+ const tsc = resolveTool('tsc', 'typescript');
188
+ const vitest = resolveTool('vitest', 'vitest');
189
+
190
+ ensureAcpSdkCompat();
191
+ runToolStep('typecheck', tsc, ['--noEmit']);
192
192
  runToolStep('unit runtime suite', vitest, [
193
193
  'run',
194
194
  '--testTimeout',
@@ -224,14 +224,17 @@ function main() {
224
224
  'src/runtime/RuntimeShell.test.ts',
225
225
  'src/runtime/createDefaultRuntimeShell.test.ts',
226
226
  'src/agent/claude/ClaudeCodeBackend.test.ts',
227
+ 'src/happyOrg/runtime.test.ts',
227
228
  'src/claude/loop.test.ts',
228
229
  'src/claude/claudeAcpRemoteLauncher.test.ts',
230
+ 'src/claude/userMessageQueue.test.ts',
229
231
  'src/claude/utils/acpPermissionHandler.test.ts',
230
232
  'src/codex/__tests__/runCodex.lifecycle.test.ts',
231
233
  'src/codex/__tests__/runtimeSession.test.ts',
232
234
  'src/codex/__tests__/selectionHandler.test.ts',
233
235
  'src/codex/__tests__/codexRemoteLauncher.acpOnly.test.ts',
234
236
  'src/codex/__tests__/codexRemoteLauncher.startupError.test.ts',
237
+ 'src/gemini/userMessageQueue.test.ts',
235
238
  'src/security/signedTransport.test.ts',
236
239
  'src/agent/initializeAgents.test.ts',
237
240
  'src/agent/factories/factories.test.ts',