autohand-cli 0.7.8 → 0.7.9

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 (175) hide show
  1. package/dist/CommunitySkillsCache-N2RWBCY2.cjs +7 -0
  2. package/dist/{CommunitySkillsCache-Q22FUAR5.js → CommunitySkillsCache-YWDFZBKP.js} +2 -2
  3. package/dist/MemoryManager-J7APSLZ7.js +7 -0
  4. package/dist/MemoryManager-RLLYVIDY.cjs +7 -0
  5. package/dist/PermissionManager-ISI5OAJK.cjs +10 -0
  6. package/dist/{PermissionManager-HATZKTRC.js → PermissionManager-WYP5JPCQ.js} +3 -3
  7. package/dist/SessionManager-7MF76Q3Q.cjs +9 -0
  8. package/dist/{SessionManager-S5R6O3NU.js → SessionManager-SFBDIBGA.js} +2 -2
  9. package/dist/{SkillsRegistry-R5WDM6T3.js → SkillsRegistry-E437FFJV.js} +2 -2
  10. package/dist/SkillsRegistry-UTK2YT4M.cjs +8 -0
  11. package/dist/{SyncApiClient-FAOMIZAP.js → SyncApiClient-AYXYSOJM.js} +1 -1
  12. package/dist/SyncApiClient-ID3KXEMA.cjs +10 -0
  13. package/dist/agents-N2ZB4O2A.cjs +9 -0
  14. package/dist/{agents-ICAC3KD3.js → agents-ZMT7HBRT.js} +2 -2
  15. package/dist/agents-new-3EWS2NR3.cjs +11 -0
  16. package/dist/agents-new-TCGUYK5I.js +11 -0
  17. package/dist/cc-2W6M7J45.cjs +8 -0
  18. package/dist/cc-UTTLESTY.js +8 -0
  19. package/dist/{chunk-XFPITUFJ.cjs → chunk-32R47CAQ.cjs} +50 -8
  20. package/dist/{chunk-2JPUEN44.cjs → chunk-3DGR4GNN.cjs} +57 -84
  21. package/dist/{chunk-WIUGUR5T.js → chunk-3DVEGFBZ.js} +8 -8
  22. package/dist/{chunk-YWKZF2SA.js → chunk-3SDEZTZD.js} +46 -46
  23. package/dist/{chunk-KH7BCZJN.js → chunk-4BZ65NIH.js} +1 -1
  24. package/dist/{chunk-52MLYK5P.js → chunk-4YQ2OJAL.js} +1 -1
  25. package/dist/{chunk-54GVL2SE.cjs → chunk-5UC3VAJ2.cjs} +2 -2
  26. package/dist/{chunk-YDOR2OCA.cjs → chunk-6DSJ7XST.cjs} +16 -11
  27. package/dist/chunk-6SM6N7DJ.js +2828 -0
  28. package/dist/{chunk-MDWULS57.js → chunk-6UJMCWRY.js} +56 -33
  29. package/dist/{chunk-6KMAJTU3.js → chunk-7GJR65DQ.js} +2 -2
  30. package/dist/{chunk-B5N5UAMO.cjs → chunk-7WKEDH3E.cjs} +5 -5
  31. package/dist/{chunk-B4ZPNXZE.cjs → chunk-A5KU3JZW.cjs} +1 -1
  32. package/dist/{chunk-PMMSDR44.cjs → chunk-AQNY2M6Q.cjs} +3 -1
  33. package/dist/{chunk-AVL4DKQO.js → chunk-BTVNRLSE.js} +1 -1
  34. package/dist/{chunk-PU534KPO.cjs → chunk-CHVXUA3O.cjs} +4 -4
  35. package/dist/{chunk-DPJ3IIBB.js → chunk-CMNQAF6C.js} +7 -2
  36. package/dist/{chunk-7TOHYAUF.cjs → chunk-CPO5KEQS.cjs} +2 -2
  37. package/dist/{chunk-5MDDOGTD.cjs → chunk-DRXFJR7F.cjs} +22 -30
  38. package/dist/{chunk-JBKP2CLA.cjs → chunk-FN5S5OE7.cjs} +47 -47
  39. package/dist/{chunk-SFGJQPGC.cjs → chunk-FPHU2ES6.cjs} +56 -33
  40. package/dist/{chunk-3L76MLO5.cjs → chunk-FSTLJIR5.cjs} +21 -28
  41. package/dist/chunk-HF65HHDU.cjs +83 -0
  42. package/dist/{chunk-A552JHUJ.cjs → chunk-HUA44A35.cjs} +21 -18
  43. package/dist/{chunk-B7EUETGY.cjs → chunk-HWDP4HQO.cjs} +4 -4
  44. package/dist/{chunk-OC5YDNFC.js → chunk-IYZBLUEJ.js} +35 -52
  45. package/dist/chunk-J2RUI7GJ.js +83 -0
  46. package/dist/{chunk-WH3D42BQ.js → chunk-J7VV7JAB.js} +55 -82
  47. package/dist/{chunk-VEDIYPWY.cjs → chunk-JRV4SOJU.cjs} +9 -9
  48. package/dist/{chunk-GWIAMKKF.js → chunk-K6CZ2AGI.js} +6 -3
  49. package/dist/{chunk-SYJLMBLP.cjs → chunk-KJAZ4YAR.cjs} +17 -17
  50. package/dist/{chunk-BAFJQUWR.js → chunk-KS45GREN.js} +12 -19
  51. package/dist/chunk-KXNAGJE6.cjs +589 -0
  52. package/dist/chunk-L5QWMGLV.cjs +2828 -0
  53. package/dist/{chunk-U5WIP4HS.js → chunk-LCBOOA7S.js} +47 -5
  54. package/dist/chunk-LJCSSR5V.cjs +63 -0
  55. package/dist/chunk-LKIKNRUP.js +219 -0
  56. package/dist/{chunk-WQSWU2QA.cjs → chunk-LY5VN3B3.cjs} +9 -6
  57. package/dist/{chunk-YAGD43KA.cjs → chunk-LYMZDJX5.cjs} +36 -37
  58. package/dist/{chunk-SLISYSP4.cjs → chunk-MRDZHNCF.cjs} +4 -4
  59. package/dist/chunk-NCC6ETZS.js +362 -0
  60. package/dist/chunk-NCLCL7JK.js +63 -0
  61. package/dist/chunk-NTFNUTY2.js +589 -0
  62. package/dist/{chunk-GDTZQSJ6.cjs → chunk-O3EX3SAD.cjs} +2 -2
  63. package/dist/chunk-OO7EKEJH.cjs +219 -0
  64. package/dist/{chunk-P2Z6GDEN.js → chunk-OXJCLU3X.js} +1 -1
  65. package/dist/{chunk-23JQSCTO.js → chunk-P6EGMTK4.js} +1 -1
  66. package/dist/{chunk-VPAN5H7Q.js → chunk-PFS5ZOCO.js} +30 -31
  67. package/dist/{chunk-EKY5PKQI.js → chunk-PGH3MHPP.js} +3 -1
  68. package/dist/{chunk-EDGV5BNH.js → chunk-PVSYZXS7.js} +18 -26
  69. package/dist/{chunk-NI3BQXKU.js → chunk-QAJM6VG5.js} +2 -2
  70. package/dist/{chunk-OBV3UUIL.js → chunk-R5PZPF55.js} +1 -1
  71. package/dist/{chunk-MJFBVQHB.js → chunk-RDGYHJ52.js} +5 -5
  72. package/dist/{chunk-YDH2BMEN.js → chunk-RX4KPL6H.js} +1 -1
  73. package/dist/{chunk-GFJ6AETU.cjs → chunk-T7HQBZZB.cjs} +6 -6
  74. package/dist/chunk-TSV4LVHK.js +35 -0
  75. package/dist/{chunk-7VW3A7DO.cjs → chunk-TUO5SZRD.cjs} +2 -2
  76. package/dist/{chunk-C3IFF3EH.cjs → chunk-UL5T2XIY.cjs} +36 -53
  77. package/dist/chunk-ULQ6MDSJ.cjs +362 -0
  78. package/dist/{chunk-UL7YPRCU.js → chunk-UP6YRP44.js} +1 -1
  79. package/dist/{chunk-G77ZY4QG.js → chunk-VQDWNDP5.js} +1 -1
  80. package/dist/chunk-VXCMGBXY.cjs +35 -0
  81. package/dist/{chunk-JHFH3N4U.cjs → chunk-WCN5WDOI.cjs} +2 -2
  82. package/dist/{chunk-53BR4MUW.cjs → chunk-WGO4ACS7.cjs} +3 -3
  83. package/dist/{chunk-4M2GX7RH.cjs → chunk-WJICM4SK.cjs} +2 -2
  84. package/dist/{chunk-4RWTUT2Z.js → chunk-WT367RVU.js} +19 -16
  85. package/dist/{chunk-A6QBABQ7.js → chunk-XOSFZHSS.js} +2 -2
  86. package/dist/{chunk-3YEDXG6S.js → chunk-YDJA5ETO.js} +1 -1
  87. package/dist/completion-NCSTSKTL.cjs +11 -0
  88. package/dist/{completion-Y42FKDT3.js → completion-NTZERPAZ.js} +2 -1
  89. package/dist/constants-B2X7KDIH.cjs +20 -0
  90. package/dist/{constants-ZLG6M5SI.js → constants-OFIAR4E5.js} +1 -1
  91. package/dist/export-5AJNVX4O.cjs +9 -0
  92. package/dist/{export-WJ5P6E5Z.js → export-ZQHTLV4W.js} +2 -1
  93. package/dist/feedback-F7BMGSV6.cjs +12 -0
  94. package/dist/feedback-NL7CWTRY.js +12 -0
  95. package/dist/hooks-AX5VPCZ3.cjs +10 -0
  96. package/dist/hooks-V22HVLQT.js +10 -0
  97. package/dist/index.cjs +5306 -3582
  98. package/dist/index.js +3780 -2056
  99. package/dist/language-IEKARNQH.js +13 -0
  100. package/dist/language-ULQCKXAD.cjs +13 -0
  101. package/dist/localProjectPermissions-7FI3XF4K.cjs +17 -0
  102. package/dist/{localProjectPermissions-YFFAKLUZ.js → localProjectPermissions-FD5AK5FB.js} +2 -2
  103. package/dist/login-PD3DFJLM.js +15 -0
  104. package/dist/login-VHGT4YKT.cjs +15 -0
  105. package/dist/logout-2QXNFGDT.js +13 -0
  106. package/dist/logout-A4SMKEFO.cjs +13 -0
  107. package/dist/permissions-S7433NQJ.js +10 -0
  108. package/dist/permissions-YZ6WCDBL.cjs +10 -0
  109. package/dist/plan-B3CW5DXJ.cjs +10 -0
  110. package/dist/plan-JFGNRL2S.js +10 -0
  111. package/dist/resume-54ERVSFM.cjs +10 -0
  112. package/dist/resume-YJ5CVKAP.js +10 -0
  113. package/dist/search-4TEQMUPU.js +11 -0
  114. package/dist/search-QGLS4SV7.cjs +11 -0
  115. package/dist/share-2B2T3AUU.cjs +11 -0
  116. package/dist/share-SZMXZIA3.js +11 -0
  117. package/dist/skills-HVQNCTGK.cjs +12 -0
  118. package/dist/{skills-3YEEODHK.js → skills-PB4HXV4R.js} +1 -1
  119. package/dist/{skills-install-FTGOHOZ4.cjs → skills-install-7SFS24HY.cjs} +10 -9
  120. package/dist/{skills-install-KAXAQSN6.js → skills-install-UBBNXWD5.js} +4 -3
  121. package/dist/skills-new-5FSDAJWE.js +12 -0
  122. package/dist/skills-new-IOTZYE6F.cjs +12 -0
  123. package/dist/{status-PBFFUC4Q.js → status-AGPSKXSW.js} +2 -2
  124. package/dist/status-WOINF556.cjs +9 -0
  125. package/dist/{sync-3B7SNBYC.js → sync-64MZDWGG.js} +3 -3
  126. package/dist/sync-F5ECJW25.cjs +39 -0
  127. package/dist/{sync-H4UHHLKU.js → sync-LYKDHRFM.js} +3 -3
  128. package/dist/sync-W5UR7BEP.cjs +14 -0
  129. package/dist/theme-CWG3ZLHB.cjs +13 -0
  130. package/dist/theme-HQKV7YAP.js +13 -0
  131. package/package.json +2 -2
  132. package/dist/CommunitySkillsCache-2BITCEAA.cjs +0 -7
  133. package/dist/MemoryManager-2ATHG7BH.js +0 -7
  134. package/dist/MemoryManager-AENCGCEW.cjs +0 -7
  135. package/dist/PermissionManager-6HZGTK2N.cjs +0 -10
  136. package/dist/SessionManager-AG4WT3DP.cjs +0 -9
  137. package/dist/SkillsRegistry-ZXU6YDRP.cjs +0 -8
  138. package/dist/SyncApiClient-UOA4VLLD.cjs +0 -10
  139. package/dist/agents-YONWPKFS.cjs +0 -9
  140. package/dist/agents-new-NV557UVG.cjs +0 -10
  141. package/dist/agents-new-QHM3CO4B.js +0 -10
  142. package/dist/chunk-3HPUOQJN.cjs +0 -23
  143. package/dist/chunk-5DN5KNXU.js +0 -81
  144. package/dist/chunk-7BYSXAKS.js +0 -23
  145. package/dist/chunk-ARVFUZOB.js +0 -736
  146. package/dist/chunk-GWXXFQ3F.cjs +0 -81
  147. package/dist/chunk-XFQS2VGT.cjs +0 -736
  148. package/dist/completion-WVFWX7XQ.cjs +0 -10
  149. package/dist/constants-G2PLP5HH.cjs +0 -20
  150. package/dist/export-BKBJ7PB2.cjs +0 -8
  151. package/dist/feedback-HZBCTSFG.js +0 -10
  152. package/dist/feedback-JBQ3UPGZ.cjs +0 -10
  153. package/dist/hooks-G4VLYMLX.cjs +0 -9
  154. package/dist/hooks-LN4A6NQL.js +0 -9
  155. package/dist/language-KODBDE5R.js +0 -12
  156. package/dist/language-SJT475NW.cjs +0 -12
  157. package/dist/localProjectPermissions-AYQYGTOE.cjs +0 -17
  158. package/dist/login-TC2KROQI.js +0 -14
  159. package/dist/login-TYMR2ZD3.cjs +0 -14
  160. package/dist/logout-2ECV365P.js +0 -12
  161. package/dist/logout-CO3CPYZJ.cjs +0 -12
  162. package/dist/permissions-5MTH22EF.js +0 -9
  163. package/dist/permissions-IP5SITPI.cjs +0 -9
  164. package/dist/resume-EPOEF3WV.cjs +0 -9
  165. package/dist/resume-LOYD5MMP.js +0 -9
  166. package/dist/share-APR5S2CS.cjs +0 -10
  167. package/dist/share-VLJFDZKR.js +0 -10
  168. package/dist/skills-CRM55MKM.cjs +0 -12
  169. package/dist/skills-new-JF4FKNUT.cjs +0 -11
  170. package/dist/skills-new-JYX2GBKM.js +0 -11
  171. package/dist/status-DAEFE7ZC.cjs +0 -9
  172. package/dist/sync-4RARBQIH.cjs +0 -39
  173. package/dist/sync-YZ6YZ42H.cjs +0 -14
  174. package/dist/theme-3XV5BWUB.js +0 -12
  175. package/dist/theme-Z2WS5XWZ.cjs +0 -12
@@ -5,6 +5,7 @@ var DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
5
5
  var DEFAULT_MAX_TOTAL_SIZE = 100 * 1024 * 1024;
6
6
  var DEFAULT_MAX_RETRIES = 3;
7
7
  var DEFAULT_RETRY_DELAY = 1e3;
8
+ var MAX_FILES_PER_REQUEST = 100;
8
9
  var SyncApiClient = class {
9
10
  constructor(config) {
10
11
  this.baseUrl = config?.baseUrl || DEFAULT_BASE_URL;
@@ -89,29 +90,41 @@ var SyncApiClient = class {
89
90
  }
90
91
  /**
91
92
  * Upload sync manifest and request pre-signed URLs for file uploads
93
+ * Batches requests to stay within API limits (max 100 files per request)
92
94
  */
93
95
  async initiateUpload(token, manifest, filePaths) {
94
- const response = await this.fetchWithRetry(
95
- `${this.baseUrl}/v1/sync/upload`,
96
- {
97
- method: "POST",
98
- headers: {
99
- Authorization: `Bearer ${token}`,
100
- "Content-Type": "application/json"
101
- },
102
- body: JSON.stringify({
103
- manifest,
104
- files: filePaths
105
- })
96
+ const batches = [];
97
+ for (let i = 0; i < filePaths.length; i += MAX_FILES_PER_REQUEST) {
98
+ batches.push(filePaths.slice(i, i + MAX_FILES_PER_REQUEST));
99
+ }
100
+ const allUploadUrls = {};
101
+ for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {
102
+ const batch = batches[batchIndex];
103
+ const response = await this.fetchWithRetry(
104
+ `${this.baseUrl}/v1/sync/upload`,
105
+ {
106
+ method: "POST",
107
+ headers: {
108
+ Authorization: `Bearer ${token}`,
109
+ "Content-Type": "application/json"
110
+ },
111
+ body: JSON.stringify({
112
+ // Only include manifest on first batch
113
+ ...batchIndex === 0 ? { manifest } : {},
114
+ files: batch
115
+ })
116
+ }
117
+ );
118
+ if (!response.ok) {
119
+ const error = await response.text().catch(() => "Unknown error");
120
+ throw new Error(`API error: ${response.status} ${error}`);
106
121
  }
107
- );
108
- if (!response.ok) {
109
- const error = await response.text().catch(() => "Unknown error");
110
- throw new Error(`API error: ${response.status} ${error}`);
122
+ const data = await response.json();
123
+ const batchUrls = data.uploadUrls || {};
124
+ Object.assign(allUploadUrls, batchUrls);
111
125
  }
112
- const data = await response.json();
113
126
  return {
114
- uploadUrls: data.uploadUrls || {}
127
+ uploadUrls: allUploadUrls
115
128
  };
116
129
  }
117
130
  /**
@@ -180,26 +193,36 @@ var SyncApiClient = class {
180
193
  }
181
194
  /**
182
195
  * Request pre-signed URLs for file downloads
196
+ * Batches requests to stay within API limits (max 100 files per request)
183
197
  */
184
198
  async initiateDownload(token, filePaths) {
185
- const response = await this.fetchWithRetry(
186
- `${this.baseUrl}/v1/sync/download`,
187
- {
188
- method: "POST",
189
- headers: {
190
- Authorization: `Bearer ${token}`,
191
- "Content-Type": "application/json"
192
- },
193
- body: JSON.stringify({ files: filePaths })
199
+ const batches = [];
200
+ for (let i = 0; i < filePaths.length; i += MAX_FILES_PER_REQUEST) {
201
+ batches.push(filePaths.slice(i, i + MAX_FILES_PER_REQUEST));
202
+ }
203
+ const allDownloadUrls = {};
204
+ for (const batch of batches) {
205
+ const response = await this.fetchWithRetry(
206
+ `${this.baseUrl}/v1/sync/download`,
207
+ {
208
+ method: "POST",
209
+ headers: {
210
+ Authorization: `Bearer ${token}`,
211
+ "Content-Type": "application/json"
212
+ },
213
+ body: JSON.stringify({ files: batch })
214
+ }
215
+ );
216
+ if (!response.ok) {
217
+ const error = await response.text().catch(() => "Unknown error");
218
+ throw new Error(`API error: ${response.status} ${error}`);
194
219
  }
195
- );
196
- if (!response.ok) {
197
- const error = await response.text().catch(() => "Unknown error");
198
- throw new Error(`API error: ${response.status} ${error}`);
220
+ const data = await response.json();
221
+ const batchUrls = data.downloadUrls || {};
222
+ Object.assign(allDownloadUrls, batchUrls);
199
223
  }
200
- const data = await response.json();
201
224
  return {
202
- downloadUrls: data.downloadUrls || {}
225
+ downloadUrls: allDownloadUrls
203
226
  };
204
227
  }
205
228
  /**
@@ -1,7 +1,7 @@
1
1
  // package.json
2
2
  var package_default = {
3
3
  name: "autohand-cli",
4
- version: "0.7.8",
4
+ version: "0.7.9",
5
5
  license: "Apache-2.0",
6
6
  description: "Autohand interactive coding agent CLI powered by LLMs.",
7
7
  repository: {
@@ -21,6 +21,7 @@ var package_default = {
21
21
  "dist"
22
22
  ],
23
23
  scripts: {
24
+ postinstall: "node scripts/fix-ansi-styles.js || true",
24
25
  go: 'bun run build && ./install-local.sh && echo "COMPLETED"',
25
26
  build: "tsup",
26
27
  dev: "bun src/index.ts",
@@ -51,7 +52,6 @@ var package_default = {
51
52
  commander: "^14.0.2",
52
53
  diff: "^8.0.2",
53
54
  dotenv: "^17.2.3",
54
- enquirer: "^2.4.1",
55
55
  "fs-extra": "^11.3.2",
56
56
  i18next: "^25.7.4",
57
57
  ignore: "^5.3.1",
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunk3HPUOQJNcjs = require('./chunk-3HPUOQJN.cjs');
3
+ var _chunkLJCSSR5Vcjs = require('./chunk-LJCSSR5V.cjs');
4
4
 
5
5
  // src/commands/permissions.ts
6
6
  var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
@@ -39,7 +39,7 @@ async function permissions(ctx) {
39
39
  console.log(_chalk2.default.gray("\u2500".repeat(50)));
40
40
  console.log(_chalk2.default.gray(`Total: ${whitelist.length} approved, ${blacklist.length} denied`));
41
41
  console.log();
42
- const actionResult = await _chunk3HPUOQJNcjs.safePrompt.call(void 0, {
42
+ const actionResult = await _chunkLJCSSR5Vcjs.safePrompt.call(void 0, {
43
43
  type: "select",
44
44
  name: "action",
45
45
  message: "What would you like to do?",
@@ -55,7 +55,7 @@ async function permissions(ctx) {
55
55
  }
56
56
  const { action } = actionResult;
57
57
  if (action === "remove_approved" && whitelist.length > 0) {
58
- const result = await _chunk3HPUOQJNcjs.safePrompt.call(void 0, {
58
+ const result = await _chunkLJCSSR5Vcjs.safePrompt.call(void 0, {
59
59
  type: "select",
60
60
  name: "pattern",
61
61
  message: "Select item to remove from approved list:",
@@ -66,7 +66,7 @@ async function permissions(ctx) {
66
66
  console.log(_chalk2.default.yellow(`Removed "${result.pattern}" from approved list.`));
67
67
  }
68
68
  } else if (action === "remove_denied" && blacklist.length > 0) {
69
- const result = await _chunk3HPUOQJNcjs.safePrompt.call(void 0, {
69
+ const result = await _chunkLJCSSR5Vcjs.safePrompt.call(void 0, {
70
70
  type: "select",
71
71
  name: "pattern",
72
72
  message: "Select item to remove from denied list:",
@@ -77,7 +77,7 @@ async function permissions(ctx) {
77
77
  console.log(_chalk2.default.yellow(`Removed "${result.pattern}" from denied list.`));
78
78
  }
79
79
  } else if (action === "clear_all") {
80
- const result = await _chunk3HPUOQJNcjs.safePrompt.call(void 0, {
80
+ const result = await _chunkLJCSSR5Vcjs.safePrompt.call(void 0, {
81
81
  type: "confirm",
82
82
  name: "confirm",
83
83
  message: "Clear all saved permissions? This cannot be undone.",
@@ -226,7 +226,7 @@ async function handleSkillsInstall(ctx, skillName) {
226
226
  if (!workspaceRoot) {
227
227
  return "Workspace root not available.";
228
228
  }
229
- const { skillsInstall } = await Promise.resolve().then(() => _interopRequireWildcard(require("./skills-install-FTGOHOZ4.cjs")));
229
+ const { skillsInstall } = await Promise.resolve().then(() => _interopRequireWildcard(require("./skills-install-7SFS24HY.cjs")));
230
230
  const result = await skillsInstall(
231
231
  {
232
232
  skillsRegistry,
@@ -22,7 +22,9 @@ var AUTOHAND_PATHS = {
22
22
  /** Custom tools */
23
23
  tools: _path2.default.join(AUTOHAND_HOME, "tools"),
24
24
  /** Skills (instruction packages) */
25
- skills: _path2.default.join(AUTOHAND_HOME, "skills")
25
+ skills: _path2.default.join(AUTOHAND_HOME, "skills"),
26
+ /** Plan files for plan mode */
27
+ plans: _path2.default.join(AUTOHAND_HOME, "plans")
26
28
  };
27
29
  var AUTOHAND_FILES = {
28
30
  /** Main config file */
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AUTOHAND_PATHS
3
- } from "./chunk-EKY5PKQI.js";
3
+ } from "./chunk-PGH3MHPP.js";
4
4
 
5
5
  // src/session/SessionManager.ts
6
6
  import fs from "fs-extra";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
4
+ var _chunkAQNY2M6Qcjs = require('./chunk-AQNY2M6Q.cjs');
5
5
 
6
6
  // src/memory/MemoryManager.ts
7
7
  var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
@@ -11,13 +11,13 @@ var SIMILARITY_THRESHOLD = 0.6;
11
11
  var MemoryManager = class {
12
12
  constructor(workspaceRoot) {
13
13
  this.projectMemoryDir = null;
14
- this.userMemoryDir = _chunkPMMSDR44cjs.AUTOHAND_PATHS.memory;
14
+ this.userMemoryDir = _chunkAQNY2M6Qcjs.AUTOHAND_PATHS.memory;
15
15
  if (workspaceRoot) {
16
- this.projectMemoryDir = _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, "memory");
16
+ this.projectMemoryDir = _path2.default.join(workspaceRoot, _chunkAQNY2M6Qcjs.PROJECT_DIR_NAME, "memory");
17
17
  }
18
18
  }
19
19
  setWorkspace(workspaceRoot) {
20
- this.projectMemoryDir = _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, "memory");
20
+ this.projectMemoryDir = _path2.default.join(workspaceRoot, _chunkAQNY2M6Qcjs.PROJECT_DIR_NAME, "memory");
21
21
  }
22
22
  async initialize() {
23
23
  await _fsextra2.default.ensureDir(this.userMemoryDir);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  package_default
3
- } from "./chunk-6KMAJTU3.js";
3
+ } from "./chunk-7GJR65DQ.js";
4
4
 
5
5
  // src/commands/status.ts
6
6
  import chalk from "chalk";
@@ -34,7 +34,8 @@ async function gatherStatusData(ctx) {
34
34
  sessionsCount: allSessions.length,
35
35
  contextPercentLeft: ctx.getContextPercentLeft?.() ?? 100,
36
36
  totalTokensUsed: ctx.getTotalTokensUsed?.() ?? 0,
37
- config: ctx.config
37
+ config: ctx.config,
38
+ contextCompactionEnabled: ctx.isContextCompactionEnabled?.() ?? true
38
39
  };
39
40
  }
40
41
  function renderStatusUI(data) {
@@ -159,6 +160,10 @@ function renderStatusTab(data) {
159
160
  console.log(chalk.bold("cwd:"), data.cwd);
160
161
  console.log(chalk.bold("Provider:"), data.provider);
161
162
  console.log(chalk.bold("Model:"), data.model);
163
+ console.log(
164
+ chalk.bold("Context Compaction:"),
165
+ data.contextCompactionEnabled ? chalk.green("ON") : chalk.yellow("OFF")
166
+ );
162
167
  console.log();
163
168
  console.log(
164
169
  chalk.bold("API Status:"),
@@ -1,13 +1,13 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
3
+ var _chunkAQNY2M6Qcjs = require('./chunk-AQNY2M6Q.cjs');
4
4
 
5
5
  // src/permissions/localProjectPermissions.ts
6
6
  var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
7
7
  var _path = require('path'); var _path2 = _interopRequireDefault(_path);
8
8
  var LOCAL_SETTINGS_FILE = "settings.local.json";
9
9
  function getLocalSettingsPath(workspaceRoot) {
10
- return _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, LOCAL_SETTINGS_FILE);
10
+ return _path2.default.join(workspaceRoot, _chunkAQNY2M6Qcjs.PROJECT_DIR_NAME, LOCAL_SETTINGS_FILE);
11
11
  }
12
12
  async function loadLocalProjectSettings(workspaceRoot) {
13
13
  const settingsPath = getLocalSettingsPath(workspaceRoot);
@@ -1,13 +1,16 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunk54GVL2SEcjs = require('./chunk-54GVL2SE.cjs');
3
+ var _chunk5UC3VAJ2cjs = require('./chunk-5UC3VAJ2.cjs');
4
4
 
5
5
 
6
- var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
6
+
7
+ var _chunkL5QWMGLVcjs = require('./chunk-L5QWMGLV.cjs');
8
+
9
+
10
+ var _chunkAQNY2M6Qcjs = require('./chunk-AQNY2M6Q.cjs');
7
11
 
8
12
  // src/commands/share.ts
9
13
  var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
10
- var _enquirer = require('enquirer'); var _enquirer2 = _interopRequireDefault(_enquirer);
11
14
  var _ora = require('ora'); var _ora2 = _interopRequireDefault(_ora);
12
15
 
13
16
  // src/share/costEstimator.ts
@@ -173,7 +176,7 @@ function serializeSession(session, options) {
173
176
  const toolUsage = extractToolUsage(messages);
174
177
  const gitDiff = options.gitDiff ? parseGitDiff(options.gitDiff) : void 0;
175
178
  const client = {
176
- cliVersion: _chunk54GVL2SEcjs.package_default.version,
179
+ cliVersion: _chunk5UC3VAJ2cjs.package_default.version,
177
180
  platform: process.platform,
178
181
  deviceId: options.deviceId
179
182
  };
@@ -209,15 +212,15 @@ var DEFAULT_CONFIG = {
209
212
  // 30s for large payloads
210
213
  maxRetries: 3,
211
214
  offlineQueue: true,
212
- cliVersion: _chunk54GVL2SEcjs.package_default.version
215
+ cliVersion: _chunk5UC3VAJ2cjs.package_default.version
213
216
  };
214
217
  var ShareApiClient = class {
215
218
  constructor(configOverrides) {
216
219
  this.deviceId = null;
217
220
  this.config = { ...DEFAULT_CONFIG, ...configOverrides };
218
- const dataDir = _path2.default.join(_chunkPMMSDR44cjs.AUTOHAND_PATHS.config, "share");
221
+ const dataDir = _path2.default.join(_chunkAQNY2M6Qcjs.AUTOHAND_PATHS.config, "share");
219
222
  this.queuePath = _path2.default.join(dataDir, "queue.json");
220
- this.deviceIdPath = _path2.default.join(_chunkPMMSDR44cjs.AUTOHAND_PATHS.feedback, ".device-id");
223
+ this.deviceIdPath = _path2.default.join(_chunkAQNY2M6Qcjs.AUTOHAND_PATHS.feedback, ".device-id");
221
224
  }
222
225
  // ============ Device ID ============
223
226
  /**
@@ -488,34 +491,23 @@ async function execute(_args, context) {
488
491
  );
489
492
  console.log(` Duration: ${_chalk2.default.cyan(formatDuration(duration))}`);
490
493
  console.log();
491
- const { Select, Confirm } = _enquirer2.default;
492
- const visibilityPrompt = new Select({
493
- name: "visibility",
494
- message: "Share visibility:",
495
- choices: [
496
- { name: "public", message: "Public - Anyone with the link can view" },
497
- { name: "private", message: "Private - Requires one-time passcode" }
498
- ]
494
+ const visibilityOptions = [
495
+ { label: "Public - Anyone with the link can view", value: "public" },
496
+ { label: "Private - Requires one-time passcode", value: "private" }
497
+ ];
498
+ const visibilityResult = await _chunkL5QWMGLVcjs.showModal.call(void 0, {
499
+ title: "Share visibility:",
500
+ options: visibilityOptions
499
501
  });
500
- let visibility;
501
- try {
502
- visibility = await visibilityPrompt.run();
503
- } catch (e8) {
502
+ if (!visibilityResult) {
504
503
  console.log(_chalk2.default.gray("Cancelled."));
505
504
  return;
506
505
  }
507
- const confirmPrompt = new Confirm({
508
- name: "confirm",
509
- message: `Share this session as ${visibility}?`,
510
- initial: true
506
+ const visibility = visibilityResult.value;
507
+ const confirmed = await _chunkL5QWMGLVcjs.showConfirm.call(void 0, {
508
+ title: `Share this session as ${visibility}?`,
509
+ defaultValue: true
511
510
  });
512
- let confirmed;
513
- try {
514
- confirmed = await confirmPrompt.run();
515
- } catch (e9) {
516
- console.log(_chalk2.default.gray("Cancelled."));
517
- return;
518
- }
519
511
  if (!confirmed) {
520
512
  console.log(_chalk2.default.gray("Cancelled."));
521
513
  return;
@@ -1,6 +1,9 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/commands/completion.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+
3
+ var _chunkL5QWMGLVcjs = require('./chunk-L5QWMGLV.cjs');
4
+
5
+ // src/commands/completion.ts
2
6
  var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
3
- var _enquirer = require('enquirer'); var _enquirer2 = _interopRequireDefault(_enquirer);
4
7
 
5
8
  // src/completions/index.ts
6
9
  var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
@@ -276,58 +279,55 @@ async function execute(args) {
276
279
  if (detected) {
277
280
  console.log(_chalk2.default.gray(`Detected shell: ${detected}`));
278
281
  }
279
- const { Select: Select2 } = _enquirer2.default;
280
- const prompt = new Select2({
281
- name: "shell",
282
- message: "Select your shell:",
283
- choices: [
284
- { name: "bash", message: "Bash" },
285
- { name: "zsh", message: "Zsh" },
286
- { name: "fish", message: "Fish" }
287
- ],
288
- initial: detected || "bash"
282
+ const shellOptions = [
283
+ { label: "Bash", value: "bash" },
284
+ { label: "Zsh", value: "zsh" },
285
+ { label: "Fish", value: "fish" }
286
+ ];
287
+ const shellResult = await _chunkL5QWMGLVcjs.showModal.call(void 0, {
288
+ title: "Select your shell:",
289
+ options: shellOptions,
290
+ initialIndex: shellOptions.findIndex((o) => o.value === (detected || "bash"))
289
291
  });
290
- try {
291
- shell = await prompt.run();
292
- } catch (e) {
292
+ if (!shellResult) {
293
293
  console.log(_chalk2.default.gray("Cancelled."));
294
294
  return;
295
295
  }
296
+ shell = shellResult.value;
296
297
  }
297
- const { Select } = _enquirer2.default;
298
- const actionPrompt = new Select({
299
- name: "action",
300
- message: "What would you like to do?",
301
- choices: [
302
- { name: "print", message: "Print completion script to terminal" },
303
- { name: "install", message: "Install completion to default location" },
304
- { name: "instructions", message: "Show installation instructions" }
305
- ]
298
+ const actionOptions = [
299
+ { label: "Print completion script to terminal", value: "print" },
300
+ { label: "Install completion to default location", value: "install" },
301
+ { label: "Show installation instructions", value: "instructions" }
302
+ ];
303
+ const actionResult = await _chunkL5QWMGLVcjs.showModal.call(void 0, {
304
+ title: "What would you like to do?",
305
+ options: actionOptions
306
306
  });
307
- try {
308
- const action = await actionPrompt.run();
309
- switch (action) {
310
- case "print":
311
- console.log();
312
- console.log(_chalk2.default.cyan(`# ${shell} completion script for autohand`));
313
- console.log(_chalk2.default.cyan("# Copy and save to appropriate location"));
314
- console.log();
315
- console.log(generateCompletion(shell));
316
- break;
317
- case "install":
318
- const installPath = await installCompletion(shell);
319
- console.log();
320
- console.log(_chalk2.default.green("Completion script installed to:"));
321
- console.log(_chalk2.default.cyan(` ${installPath}`));
322
- console.log();
323
- console.log(getInstallInstructions(shell));
324
- break;
325
- case "instructions":
326
- console.log(getInstallInstructions(shell));
327
- break;
328
- }
329
- } catch (e2) {
307
+ if (!actionResult) {
330
308
  console.log(_chalk2.default.gray("Cancelled."));
309
+ return;
310
+ }
311
+ const action = actionResult.value;
312
+ switch (action) {
313
+ case "print":
314
+ console.log();
315
+ console.log(_chalk2.default.cyan(`# ${shell} completion script for autohand`));
316
+ console.log(_chalk2.default.cyan("# Copy and save to appropriate location"));
317
+ console.log();
318
+ console.log(generateCompletion(shell));
319
+ break;
320
+ case "install":
321
+ const installPath = await installCompletion(shell);
322
+ console.log();
323
+ console.log(_chalk2.default.green("Completion script installed to:"));
324
+ console.log(_chalk2.default.cyan(` ${installPath}`));
325
+ console.log();
326
+ console.log(getInstallInstructions(shell));
327
+ break;
328
+ case "instructions":
329
+ console.log(getInstallInstructions(shell));
330
+ break;
331
331
  }
332
332
  }
333
333
  async function runCompletionCommand(shell) {
@@ -5,6 +5,7 @@ var DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
5
5
  var DEFAULT_MAX_TOTAL_SIZE = 100 * 1024 * 1024;
6
6
  var DEFAULT_MAX_RETRIES = 3;
7
7
  var DEFAULT_RETRY_DELAY = 1e3;
8
+ var MAX_FILES_PER_REQUEST = 100;
8
9
  var SyncApiClient = class {
9
10
  constructor(config) {
10
11
  this.baseUrl = _optionalChain([config, 'optionalAccess', _ => _.baseUrl]) || DEFAULT_BASE_URL;
@@ -89,29 +90,41 @@ var SyncApiClient = class {
89
90
  }
90
91
  /**
91
92
  * Upload sync manifest and request pre-signed URLs for file uploads
93
+ * Batches requests to stay within API limits (max 100 files per request)
92
94
  */
93
95
  async initiateUpload(token, manifest, filePaths) {
94
- const response = await this.fetchWithRetry(
95
- `${this.baseUrl}/v1/sync/upload`,
96
- {
97
- method: "POST",
98
- headers: {
99
- Authorization: `Bearer ${token}`,
100
- "Content-Type": "application/json"
101
- },
102
- body: JSON.stringify({
103
- manifest,
104
- files: filePaths
105
- })
96
+ const batches = [];
97
+ for (let i = 0; i < filePaths.length; i += MAX_FILES_PER_REQUEST) {
98
+ batches.push(filePaths.slice(i, i + MAX_FILES_PER_REQUEST));
99
+ }
100
+ const allUploadUrls = {};
101
+ for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {
102
+ const batch = batches[batchIndex];
103
+ const response = await this.fetchWithRetry(
104
+ `${this.baseUrl}/v1/sync/upload`,
105
+ {
106
+ method: "POST",
107
+ headers: {
108
+ Authorization: `Bearer ${token}`,
109
+ "Content-Type": "application/json"
110
+ },
111
+ body: JSON.stringify({
112
+ // Only include manifest on first batch
113
+ ...batchIndex === 0 ? { manifest } : {},
114
+ files: batch
115
+ })
116
+ }
117
+ );
118
+ if (!response.ok) {
119
+ const error = await response.text().catch(() => "Unknown error");
120
+ throw new Error(`API error: ${response.status} ${error}`);
106
121
  }
107
- );
108
- if (!response.ok) {
109
- const error = await response.text().catch(() => "Unknown error");
110
- throw new Error(`API error: ${response.status} ${error}`);
122
+ const data = await response.json();
123
+ const batchUrls = data.uploadUrls || {};
124
+ Object.assign(allUploadUrls, batchUrls);
111
125
  }
112
- const data = await response.json();
113
126
  return {
114
- uploadUrls: data.uploadUrls || {}
127
+ uploadUrls: allUploadUrls
115
128
  };
116
129
  }
117
130
  /**
@@ -180,26 +193,36 @@ var SyncApiClient = class {
180
193
  }
181
194
  /**
182
195
  * Request pre-signed URLs for file downloads
196
+ * Batches requests to stay within API limits (max 100 files per request)
183
197
  */
184
198
  async initiateDownload(token, filePaths) {
185
- const response = await this.fetchWithRetry(
186
- `${this.baseUrl}/v1/sync/download`,
187
- {
188
- method: "POST",
189
- headers: {
190
- Authorization: `Bearer ${token}`,
191
- "Content-Type": "application/json"
192
- },
193
- body: JSON.stringify({ files: filePaths })
199
+ const batches = [];
200
+ for (let i = 0; i < filePaths.length; i += MAX_FILES_PER_REQUEST) {
201
+ batches.push(filePaths.slice(i, i + MAX_FILES_PER_REQUEST));
202
+ }
203
+ const allDownloadUrls = {};
204
+ for (const batch of batches) {
205
+ const response = await this.fetchWithRetry(
206
+ `${this.baseUrl}/v1/sync/download`,
207
+ {
208
+ method: "POST",
209
+ headers: {
210
+ Authorization: `Bearer ${token}`,
211
+ "Content-Type": "application/json"
212
+ },
213
+ body: JSON.stringify({ files: batch })
214
+ }
215
+ );
216
+ if (!response.ok) {
217
+ const error = await response.text().catch(() => "Unknown error");
218
+ throw new Error(`API error: ${response.status} ${error}`);
194
219
  }
195
- );
196
- if (!response.ok) {
197
- const error = await response.text().catch(() => "Unknown error");
198
- throw new Error(`API error: ${response.status} ${error}`);
220
+ const data = await response.json();
221
+ const batchUrls = data.downloadUrls || {};
222
+ Object.assign(allDownloadUrls, batchUrls);
199
223
  }
200
- const data = await response.json();
201
224
  return {
202
- downloadUrls: data.downloadUrls || {}
225
+ downloadUrls: allDownloadUrls
203
226
  };
204
227
  }
205
228
  /**