autohand-cli 0.7.5 → 0.7.7
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.
- package/README.md +2 -0
- package/dist/{AutomodeManager-TJSW2SQY.cjs → AutomodeManager-HV6M7EAX.cjs} +61 -22
- package/dist/{AutomodeManager-WIMHLG4W.js → AutomodeManager-YVCJXOMQ.js} +61 -22
- package/dist/CommunitySkillsCache-2BITCEAA.cjs +7 -0
- package/dist/{CommunitySkillsCache-XPDVYU3K.js → CommunitySkillsCache-Q22FUAR5.js} +2 -2
- package/dist/HookManager-X47HCM5G.cjs +6 -0
- package/dist/{HookManager-VIX56KFU.js → HookManager-ZXKHCD7U.js} +1 -1
- package/dist/MemoryManager-2ATHG7BH.js +7 -0
- package/dist/MemoryManager-AENCGCEW.cjs +7 -0
- package/dist/PermissionManager-6HZGTK2N.cjs +10 -0
- package/dist/{PermissionManager-YFZI4ZZ6.js → PermissionManager-HATZKTRC.js} +3 -3
- package/dist/SessionManager-AG4WT3DP.cjs +9 -0
- package/dist/{SessionManager-IMW2HGR3.js → SessionManager-S5R6O3NU.js} +2 -2
- package/dist/{SkillsRegistry-7NICF6FY.js → SkillsRegistry-R5WDM6T3.js} +2 -2
- package/dist/SkillsRegistry-ZXU6YDRP.cjs +8 -0
- package/dist/SyncApiClient-FAOMIZAP.js +10 -0
- package/dist/SyncApiClient-UOA4VLLD.cjs +10 -0
- package/dist/add-dir-OMK3Y4DM.cjs +8 -0
- package/dist/add-dir-PNU7AGKO.js +8 -0
- package/dist/{agents-B33IAATH.js → agents-ICAC3KD3.js} +2 -2
- package/dist/agents-YONWPKFS.cjs +9 -0
- package/dist/agents-new-NV557UVG.cjs +10 -0
- package/dist/{agents-new-KTXJFC5E.js → agents-new-QHM3CO4B.js} +2 -2
- package/dist/{chunk-MFLRXVKU.js → chunk-23JQSCTO.js} +1 -1
- package/dist/chunk-2JPUEN44.cjs +299 -0
- package/dist/{chunk-5PD2L6WI.js → chunk-3YEDXG6S.js} +1 -1
- package/dist/{chunk-3ZUWWML7.cjs → chunk-4M2GX7RH.cjs} +2 -2
- package/dist/chunk-4RWTUT2Z.js +151 -0
- package/dist/{chunk-CHQMK2ZG.js → chunk-52MLYK5P.js} +1 -1
- package/dist/{chunk-CVYEUA3D.cjs → chunk-53BR4MUW.cjs} +3 -3
- package/dist/{chunk-5WKR4HIB.js → chunk-5DN5KNXU.js} +1 -1
- package/dist/{chunk-3CO5R6M2.cjs → chunk-7TOHYAUF.cjs} +2 -2
- package/dist/{chunk-UPR5PKX4.cjs → chunk-7VW3A7DO.cjs} +7 -3
- package/dist/chunk-A552JHUJ.cjs +151 -0
- package/dist/{chunk-NGSLABLS.js → chunk-A6QBABQ7.js} +1 -1
- package/dist/chunk-ARVFUZOB.js +736 -0
- package/dist/{chunk-2FLBGPE3.js → chunk-AVL4DKQO.js} +6 -2
- package/dist/{chunk-CT2VTDPQ.cjs → chunk-B4ZPNXZE.cjs} +1 -1
- package/dist/{chunk-OKMYLMCR.cjs → chunk-B7EUETGY.cjs} +4 -4
- package/dist/chunk-C26EN22G.cjs +328 -0
- package/dist/chunk-DOTAX65F.js +328 -0
- package/dist/{chunk-SKT2CRNY.cjs → chunk-DSKVMFRM.cjs} +56 -8
- package/dist/{chunk-FUEL6BK7.js → chunk-EKY5PKQI.js} +15 -0
- package/dist/{chunk-YMP7AGNT.js → chunk-G77ZY4QG.js} +1 -1
- package/dist/{chunk-KN5C4TR4.cjs → chunk-GDTZQSJ6.cjs} +2 -2
- package/dist/{chunk-536VWSZK.cjs → chunk-GFJ6AETU.cjs} +4 -4
- package/dist/chunk-GR7VWN63.js +613 -0
- package/dist/{chunk-PVM5I5WI.js → chunk-GWIAMKKF.js} +1 -1
- package/dist/{chunk-XAM7SFVB.cjs → chunk-GWXXFQ3F.cjs} +2 -2
- package/dist/{chunk-REPKBECD.cjs → chunk-JHFH3N4U.cjs} +2 -2
- package/dist/{chunk-4L5WYXHN.js → chunk-KH7BCZJN.js} +1 -1
- package/dist/{chunk-JXOXZTMA.js → chunk-L5ZFPWHY.js} +54 -6
- package/dist/chunk-MDWULS57.js +288 -0
- package/dist/{chunk-6LP2GO5C.js → chunk-MJFBVQHB.js} +2 -2
- package/dist/{chunk-MWLAHCU7.js → chunk-NI3BQXKU.js} +1 -1
- package/dist/{chunk-63XGCFCC.cjs → chunk-NYQVQYIF.cjs} +6 -103
- package/dist/{chunk-SKU4M27Z.js → chunk-OBV3UUIL.js} +1 -1
- package/dist/{chunk-27ISZOFA.js → chunk-P2Z6GDEN.js} +1 -1
- package/dist/{chunk-XTHHDIBG.cjs → chunk-PMMSDR44.cjs} +16 -1
- package/dist/chunk-PR53E47T.cjs +613 -0
- package/dist/{chunk-URY4AS4L.cjs → chunk-PU534KPO.cjs} +4 -4
- package/dist/chunk-Q3WCMY3Z.js +104 -0
- package/dist/{chunk-EYBIKL2I.js → chunk-QXAPHGEW.js} +4 -101
- package/dist/chunk-SFGJQPGC.cjs +288 -0
- package/dist/{chunk-53YDUYNS.cjs → chunk-SLISYSP4.cjs} +2 -2
- package/dist/{chunk-2E2COWKB.cjs → chunk-SYJLMBLP.cjs} +66 -10
- package/dist/chunk-U5WIP4HS.js +674 -0
- package/dist/{chunk-7HB7GSQF.js → chunk-UL7YPRCU.js} +1 -1
- package/dist/chunk-VDZJ3W4M.cjs +104 -0
- package/dist/{chunk-LUKMRIKJ.cjs → chunk-VEDIYPWY.cjs} +2 -2
- package/dist/{chunk-C2NFLFHH.js → chunk-VPAN5H7Q.js} +1 -1
- package/dist/chunk-WH3D42BQ.js +299 -0
- package/dist/{chunk-2FSQPRPJ.js → chunk-WIUGUR5T.js} +59 -3
- package/dist/{chunk-QMVTT55Y.cjs → chunk-WQSWU2QA.cjs} +4 -4
- package/dist/chunk-XFPITUFJ.cjs +674 -0
- package/dist/chunk-XFQS2VGT.cjs +736 -0
- package/dist/{chunk-HYTYXN2G.cjs → chunk-YAGD43KA.cjs} +10 -10
- package/dist/constants-G2PLP5HH.cjs +20 -0
- package/dist/{constants-QYBEF3DB.js → constants-ZLG6M5SI.js} +3 -1
- package/dist/{defaultHooks-3G3DVF6I.js → defaultHooks-R56VYG7I.js} +315 -1
- package/dist/{defaultHooks-Z4KA6U5C.cjs → defaultHooks-WLMRQUXG.cjs} +315 -1
- package/dist/{feedback-PZ2PINDU.js → feedback-HZBCTSFG.js} +2 -2
- package/dist/feedback-JBQ3UPGZ.cjs +10 -0
- package/dist/index.cjs +2669 -978
- package/dist/index.js +2657 -966
- package/dist/language-KODBDE5R.js +12 -0
- package/dist/language-SJT475NW.cjs +12 -0
- package/dist/localProjectPermissions-AYQYGTOE.cjs +17 -0
- package/dist/{localProjectPermissions-DURCNDZG.js → localProjectPermissions-YFFAKLUZ.js} +2 -2
- package/dist/login-TC2KROQI.js +14 -0
- package/dist/login-TYMR2ZD3.cjs +14 -0
- package/dist/logout-2ECV365P.js +12 -0
- package/dist/logout-CO3CPYZJ.cjs +12 -0
- package/dist/resume-EPOEF3WV.cjs +9 -0
- package/dist/{resume-2NERFSTD.js → resume-LOYD5MMP.js} +2 -1
- package/dist/share-544SIZOY.js +10 -0
- package/dist/share-OETK2GUF.cjs +10 -0
- package/dist/{skills-CRFOVWEQ.js → skills-3YEEODHK.js} +1 -1
- package/dist/skills-CRM55MKM.cjs +12 -0
- package/dist/{skills-install-Z27KPEGF.cjs → skills-install-FTGOHOZ4.cjs} +5 -5
- package/dist/{skills-install-RMPXN6RK.js → skills-install-KAXAQSN6.js} +2 -2
- package/dist/skills-new-JF4FKNUT.cjs +11 -0
- package/dist/{skills-new-S2YPO635.js → skills-new-JYX2GBKM.js} +2 -2
- package/dist/{status-VRYDAEBT.js → status-7LCXYYY4.js} +2 -1
- package/dist/status-E7MZEQ26.cjs +9 -0
- package/dist/sync-3B7SNBYC.js +14 -0
- package/dist/sync-4RARBQIH.cjs +39 -0
- package/dist/sync-H4UHHLKU.js +39 -0
- package/dist/sync-YZ6YZ42H.cjs +14 -0
- package/dist/theme-3XV5BWUB.js +12 -0
- package/dist/theme-Z2WS5XWZ.cjs +12 -0
- package/package.json +5 -2
- package/dist/CommunitySkillsCache-X3X237QQ.cjs +0 -7
- package/dist/HookManager-EOMUXKJ4.cjs +0 -6
- package/dist/MemoryManager-UVHILGV5.js +0 -7
- package/dist/MemoryManager-WO3KUZVA.cjs +0 -7
- package/dist/PermissionManager-PMTQN263.cjs +0 -10
- package/dist/SessionManager-VZNWGX4O.cjs +0 -9
- package/dist/SkillsRegistry-OINIPILA.cjs +0 -8
- package/dist/agents-GRAFXZY3.cjs +0 -9
- package/dist/agents-new-67NJJSDA.cjs +0 -10
- package/dist/chunk-55DQY6B5.js +0 -49
- package/dist/chunk-RYY5I7QN.cjs +0 -49
- package/dist/constants-PE5DLI7Q.cjs +0 -18
- package/dist/feedback-R66B3B3C.cjs +0 -10
- package/dist/localProjectPermissions-75X3ZGKH.cjs +0 -17
- package/dist/login-NYWZRZO5.js +0 -12
- package/dist/login-QNJ5C42G.cjs +0 -12
- package/dist/logout-MBS7L3ZW.js +0 -12
- package/dist/logout-MVUP7GPU.cjs +0 -12
- package/dist/resume-OYZMJRNO.cjs +0 -8
- package/dist/skills-6PIGHOWS.cjs +0 -12
- package/dist/skills-new-3QJUST7P.cjs +0 -11
- package/dist/status-CYVPCW7G.cjs +0 -8
- package/dist/theme-CVY6MVEK.cjs +0 -12
- package/dist/theme-CY7WF4M6.js +0 -12
|
@@ -0,0 +1,299 @@
|
|
|
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
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkWQSWU2QAcjs = require('./chunk-WQSWU2QA.cjs');
|
|
5
|
+
|
|
6
|
+
// src/commands/sync.ts
|
|
7
|
+
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
8
|
+
var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);
|
|
9
|
+
var metadata = {
|
|
10
|
+
command: "/sync",
|
|
11
|
+
description: "Manage settings sync (view status, enable/disable, trigger sync)",
|
|
12
|
+
implemented: true
|
|
13
|
+
};
|
|
14
|
+
var globalSyncService = null;
|
|
15
|
+
function setSyncService(service) {
|
|
16
|
+
globalSyncService = service;
|
|
17
|
+
}
|
|
18
|
+
function getSyncService() {
|
|
19
|
+
return globalSyncService;
|
|
20
|
+
}
|
|
21
|
+
async function sync(ctx) {
|
|
22
|
+
const config = await _chunkWQSWU2QAcjs.loadConfig.call(void 0, );
|
|
23
|
+
const isLoggedIn = Boolean(_optionalChain([config, 'access', _ => _.auth, 'optionalAccess', _2 => _2.token]) && _optionalChain([config, 'access', _3 => _3.auth, 'optionalAccess', _4 => _4.user]));
|
|
24
|
+
if (!isLoggedIn) {
|
|
25
|
+
console.log(_chalk2.default.yellow("\nSettings sync requires authentication."));
|
|
26
|
+
console.log(_chalk2.default.gray("Run /login to sign in and enable cloud sync.\n"));
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const data = await gatherSyncData(ctx, config);
|
|
30
|
+
await renderSyncUI(data, ctx);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
async function gatherSyncData(ctx, config) {
|
|
34
|
+
const syncService = globalSyncService;
|
|
35
|
+
let status = {
|
|
36
|
+
enabled: false,
|
|
37
|
+
syncing: false,
|
|
38
|
+
lastSync: null,
|
|
39
|
+
fileCount: 0,
|
|
40
|
+
totalSize: 0
|
|
41
|
+
};
|
|
42
|
+
if (syncService) {
|
|
43
|
+
try {
|
|
44
|
+
status = await syncService.getStatus();
|
|
45
|
+
} catch (e) {
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
enabled: _optionalChain([config, 'access', _5 => _5.sync, 'optionalAccess', _6 => _6.enabled]) !== false,
|
|
50
|
+
isRunning: _nullishCoalesce(_optionalChain([syncService, 'optionalAccess', _7 => _7.isRunning]), () => ( false)),
|
|
51
|
+
lastSync: status.lastSync,
|
|
52
|
+
fileCount: status.fileCount,
|
|
53
|
+
totalSize: status.totalSize,
|
|
54
|
+
interval: _nullishCoalesce(_optionalChain([config, 'access', _8 => _8.sync, 'optionalAccess', _9 => _9.interval]), () => ( 3e5)),
|
|
55
|
+
syncService,
|
|
56
|
+
isLoggedIn: Boolean(_optionalChain([config, 'access', _10 => _10.auth, 'optionalAccess', _11 => _11.token])),
|
|
57
|
+
includeTelemetry: _nullishCoalesce(_optionalChain([config, 'access', _12 => _12.sync, 'optionalAccess', _13 => _13.includeTelemetry]), () => ( false)),
|
|
58
|
+
includeFeedback: _nullishCoalesce(_optionalChain([config, 'access', _14 => _14.sync, 'optionalAccess', _15 => _15.includeFeedback]), () => ( false))
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function renderSyncUI(data, ctx) {
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
const tabs = ["Status", "Settings", "Activity"];
|
|
64
|
+
let currentTab = 0;
|
|
65
|
+
let needsRefresh = false;
|
|
66
|
+
const input = process.stdin;
|
|
67
|
+
const isTTY = input.isTTY;
|
|
68
|
+
const wasRaw = input.isRaw;
|
|
69
|
+
const wasPaused = typeof input.isPaused === "function" ? input.isPaused() : false;
|
|
70
|
+
if (wasPaused && typeof input.resume === "function") {
|
|
71
|
+
input.resume();
|
|
72
|
+
}
|
|
73
|
+
if (isTTY) {
|
|
74
|
+
_readline2.default.emitKeypressEvents(input);
|
|
75
|
+
if (!wasRaw && typeof input.setRawMode === "function") {
|
|
76
|
+
input.setRawMode(true);
|
|
77
|
+
}
|
|
78
|
+
if (typeof input.setEncoding === "function") {
|
|
79
|
+
input.setEncoding("utf8");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const render = () => {
|
|
83
|
+
process.stdout.write("\x1B[2J\x1B[H");
|
|
84
|
+
renderTabHeader(tabs, currentTab);
|
|
85
|
+
renderTabContent(tabs[currentTab], data);
|
|
86
|
+
console.log(_chalk2.default.gray("\nEsc to exit | Tab to cycle | s: sync now | e: toggle enabled"));
|
|
87
|
+
};
|
|
88
|
+
let buffer = "";
|
|
89
|
+
const handler = async (chunk) => {
|
|
90
|
+
buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
91
|
+
const processNext = async () => {
|
|
92
|
+
if (!buffer.length) return false;
|
|
93
|
+
const first = buffer[0];
|
|
94
|
+
if (first === "\x1B") {
|
|
95
|
+
if (buffer.length === 1) return false;
|
|
96
|
+
if (buffer[1] === "[") {
|
|
97
|
+
if (buffer.length < 3) return false;
|
|
98
|
+
const seq = buffer.slice(0, 3);
|
|
99
|
+
buffer = buffer.slice(3);
|
|
100
|
+
await handleSequence(seq);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
buffer = buffer.slice(1);
|
|
104
|
+
await handleSequence("\x1B");
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
buffer = buffer.slice(1);
|
|
108
|
+
await handleSequence(first);
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
while (await processNext()) {
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const handleSequence = async (sequence) => {
|
|
115
|
+
switch (sequence) {
|
|
116
|
+
case "\x1B":
|
|
117
|
+
// ESC
|
|
118
|
+
case "":
|
|
119
|
+
cleanup();
|
|
120
|
+
resolve();
|
|
121
|
+
return;
|
|
122
|
+
case " ":
|
|
123
|
+
// Tab
|
|
124
|
+
case "\x1B[C":
|
|
125
|
+
currentTab = (currentTab + 1) % tabs.length;
|
|
126
|
+
render();
|
|
127
|
+
return;
|
|
128
|
+
case "\x1B[Z":
|
|
129
|
+
// Shift+Tab
|
|
130
|
+
case "\x1B[D":
|
|
131
|
+
currentTab = (currentTab - 1 + tabs.length) % tabs.length;
|
|
132
|
+
render();
|
|
133
|
+
return;
|
|
134
|
+
case "s":
|
|
135
|
+
case "S":
|
|
136
|
+
if (data.syncService) {
|
|
137
|
+
console.log(_chalk2.default.cyan("\nSyncing..."));
|
|
138
|
+
try {
|
|
139
|
+
const result = await data.syncService.sync();
|
|
140
|
+
if (result.success) {
|
|
141
|
+
console.log(_chalk2.default.green(`Sync complete! Uploaded: ${result.uploaded}, Downloaded: ${result.downloaded}`));
|
|
142
|
+
} else {
|
|
143
|
+
console.log(_chalk2.default.red(`Sync failed: ${result.error}`));
|
|
144
|
+
}
|
|
145
|
+
const config = await _chunkWQSWU2QAcjs.loadConfig.call(void 0, );
|
|
146
|
+
Object.assign(data, await gatherSyncData(ctx, config));
|
|
147
|
+
} catch (err) {
|
|
148
|
+
console.log(_chalk2.default.red(`Sync error: ${err}`));
|
|
149
|
+
}
|
|
150
|
+
await sleep(1500);
|
|
151
|
+
render();
|
|
152
|
+
}
|
|
153
|
+
return;
|
|
154
|
+
case "e":
|
|
155
|
+
case "E":
|
|
156
|
+
try {
|
|
157
|
+
const config = await _chunkWQSWU2QAcjs.loadConfig.call(void 0, );
|
|
158
|
+
const newEnabled = _optionalChain([config, 'access', _16 => _16.sync, 'optionalAccess', _17 => _17.enabled]) === false;
|
|
159
|
+
config.sync = { ...config.sync, enabled: newEnabled };
|
|
160
|
+
await _chunkWQSWU2QAcjs.saveConfig.call(void 0, config);
|
|
161
|
+
data.enabled = newEnabled;
|
|
162
|
+
console.log(_chalk2.default.cyan(`
|
|
163
|
+
Sync ${newEnabled ? "enabled" : "disabled"}`));
|
|
164
|
+
await sleep(1e3);
|
|
165
|
+
render();
|
|
166
|
+
} catch (err) {
|
|
167
|
+
console.log(_chalk2.default.red(`Error toggling sync: ${err}`));
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
default:
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const cleanup = () => {
|
|
175
|
+
input.off("data", handler);
|
|
176
|
+
if (isTTY && !wasRaw && typeof input.setRawMode === "function") {
|
|
177
|
+
input.setRawMode(false);
|
|
178
|
+
}
|
|
179
|
+
if (wasPaused && typeof input.pause === "function") {
|
|
180
|
+
input.pause();
|
|
181
|
+
}
|
|
182
|
+
process.stdout.write("\x1B[2J\x1B[H");
|
|
183
|
+
};
|
|
184
|
+
input.on("data", handler);
|
|
185
|
+
render();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
function renderTabHeader(tabs, currentIndex) {
|
|
189
|
+
const header = tabs.map((tab, i) => {
|
|
190
|
+
return i === currentIndex ? _chalk2.default.bgWhite.black(` ${tab} `) : _chalk2.default.gray(` ${tab} `);
|
|
191
|
+
}).join(" ");
|
|
192
|
+
console.log(`Settings Sync: ${header} ${_chalk2.default.gray("(tab to cycle)")}
|
|
193
|
+
`);
|
|
194
|
+
}
|
|
195
|
+
function renderTabContent(tab, data) {
|
|
196
|
+
switch (tab) {
|
|
197
|
+
case "Status":
|
|
198
|
+
renderStatusTab(data);
|
|
199
|
+
break;
|
|
200
|
+
case "Settings":
|
|
201
|
+
renderSettingsTab(data);
|
|
202
|
+
break;
|
|
203
|
+
case "Activity":
|
|
204
|
+
renderActivityTab(data);
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function renderStatusTab(data) {
|
|
209
|
+
console.log(_chalk2.default.bold("Sync Status\n"));
|
|
210
|
+
const statusIcon = data.enabled ? _chalk2.default.green("\u2713") : _chalk2.default.red("\u2717");
|
|
211
|
+
const runningIcon = data.isRunning ? _chalk2.default.green("\u2713") : _chalk2.default.yellow("\u25CB");
|
|
212
|
+
console.log(` ${_chalk2.default.cyan("Enabled".padEnd(20))} ${statusIcon} ${data.enabled ? "Yes" : "No"}`);
|
|
213
|
+
console.log(` ${_chalk2.default.cyan("Service Running".padEnd(20))} ${runningIcon} ${data.isRunning ? "Yes" : "No"}`);
|
|
214
|
+
console.log(` ${_chalk2.default.cyan("Last Sync".padEnd(20))} ${data.lastSync ? formatDate(data.lastSync) : _chalk2.default.gray("Never")}`);
|
|
215
|
+
console.log(` ${_chalk2.default.cyan("Files Tracked".padEnd(20))} ${data.fileCount}`);
|
|
216
|
+
console.log(` ${_chalk2.default.cyan("Total Size".padEnd(20))} ${formatSize(data.totalSize)}`);
|
|
217
|
+
console.log(` ${_chalk2.default.cyan("Sync Interval".padEnd(20))} ${formatInterval(data.interval)}`);
|
|
218
|
+
}
|
|
219
|
+
function renderSettingsTab(data) {
|
|
220
|
+
console.log(_chalk2.default.bold("Sync Settings\n"));
|
|
221
|
+
console.log(` ${_chalk2.default.cyan("Enabled".padEnd(25))} ${data.enabled ? _chalk2.default.green("true") : _chalk2.default.gray("false")}`);
|
|
222
|
+
console.log(` ${_chalk2.default.cyan("Interval".padEnd(25))} ${formatInterval(data.interval)}`);
|
|
223
|
+
console.log(` ${_chalk2.default.cyan("Include Telemetry".padEnd(25))} ${data.includeTelemetry ? _chalk2.default.green("true") : _chalk2.default.gray("false")}`);
|
|
224
|
+
console.log(` ${_chalk2.default.cyan("Include Feedback".padEnd(25))} ${data.includeFeedback ? _chalk2.default.green("true") : _chalk2.default.gray("false")}`);
|
|
225
|
+
console.log(_chalk2.default.bold("\nWhat Gets Synced\n"));
|
|
226
|
+
console.log(_chalk2.default.gray(" \u2713 config.json (API keys encrypted)"));
|
|
227
|
+
console.log(_chalk2.default.gray(" \u2713 agents/ (custom agents)"));
|
|
228
|
+
console.log(_chalk2.default.gray(" \u2713 skills/ (custom skills)"));
|
|
229
|
+
console.log(_chalk2.default.gray(" \u2713 hooks/ (user hooks)"));
|
|
230
|
+
console.log(_chalk2.default.gray(" \u2713 memory/ (user memory)"));
|
|
231
|
+
console.log(_chalk2.default.gray(" \u2713 sessions/ (session history)"));
|
|
232
|
+
console.log(_chalk2.default.gray(" \u2713 projects/ (project knowledge)"));
|
|
233
|
+
console.log(_chalk2.default.bold("\nNot Synced\n"));
|
|
234
|
+
console.log(_chalk2.default.gray(" \u2717 device-id (unique per device)"));
|
|
235
|
+
console.log(_chalk2.default.gray(" \u2717 error.log (local only)"));
|
|
236
|
+
console.log(_chalk2.default.gray(" \u2717 version-*.json (cache files)"));
|
|
237
|
+
}
|
|
238
|
+
function renderActivityTab(data) {
|
|
239
|
+
console.log(_chalk2.default.bold("Recent Sync Activity\n"));
|
|
240
|
+
if (!data.lastSync) {
|
|
241
|
+
console.log(_chalk2.default.gray(" No sync activity yet."));
|
|
242
|
+
console.log(_chalk2.default.gray(' Press "s" to trigger a manual sync.'));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
console.log(` ${_chalk2.default.cyan("Last successful sync:")} ${formatDate(data.lastSync)}`);
|
|
246
|
+
console.log(` ${_chalk2.default.cyan("Files synced:")} ${data.fileCount}`);
|
|
247
|
+
console.log(` ${_chalk2.default.cyan("Data transferred:")} ${formatSize(data.totalSize)}`);
|
|
248
|
+
console.log(_chalk2.default.bold("\nTips\n"));
|
|
249
|
+
console.log(_chalk2.default.gray(" - Sync runs automatically every 5 minutes"));
|
|
250
|
+
console.log(_chalk2.default.gray(' - Press "s" anytime to trigger a manual sync'));
|
|
251
|
+
console.log(_chalk2.default.gray(" - Cloud data takes priority on conflicts"));
|
|
252
|
+
}
|
|
253
|
+
function formatDate(isoString) {
|
|
254
|
+
try {
|
|
255
|
+
const date = new Date(isoString);
|
|
256
|
+
const now = /* @__PURE__ */ new Date();
|
|
257
|
+
const diff = now.getTime() - date.getTime();
|
|
258
|
+
if (diff < 6e4) {
|
|
259
|
+
return "Just now";
|
|
260
|
+
} else if (diff < 36e5) {
|
|
261
|
+
const mins = Math.floor(diff / 6e4);
|
|
262
|
+
return `${mins} minute${mins > 1 ? "s" : ""} ago`;
|
|
263
|
+
} else if (diff < 864e5) {
|
|
264
|
+
const hours = Math.floor(diff / 36e5);
|
|
265
|
+
return `${hours} hour${hours > 1 ? "s" : ""} ago`;
|
|
266
|
+
} else {
|
|
267
|
+
return date.toLocaleDateString() + " " + date.toLocaleTimeString();
|
|
268
|
+
}
|
|
269
|
+
} catch (e2) {
|
|
270
|
+
return isoString;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function formatSize(bytes) {
|
|
274
|
+
if (bytes === 0) return "0 B";
|
|
275
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
276
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
277
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
278
|
+
}
|
|
279
|
+
function formatInterval(ms) {
|
|
280
|
+
const minutes = Math.floor(ms / 6e4);
|
|
281
|
+
if (minutes < 60) return `${minutes} minute${minutes > 1 ? "s" : ""}`;
|
|
282
|
+
const hours = Math.floor(minutes / 60);
|
|
283
|
+
return `${hours} hour${hours > 1 ? "s" : ""}`;
|
|
284
|
+
}
|
|
285
|
+
function sleep(ms) {
|
|
286
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
exports.metadata = metadata; exports.setSyncService = setSyncService; exports.getSyncService = getSyncService; exports.sync = sync;
|
|
295
|
+
/**
|
|
296
|
+
* @license
|
|
297
|
+
* Copyright 2025 Autohand AI LLC
|
|
298
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
299
|
+
*/
|
|
@@ -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
|
|
3
|
+
var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
|
|
4
4
|
|
|
5
5
|
// src/commands/agents.ts
|
|
6
6
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
@@ -20,7 +20,7 @@ var AgentRegistry = class _AgentRegistry {
|
|
|
20
20
|
constructor() {
|
|
21
21
|
this.agents = /* @__PURE__ */ new Map();
|
|
22
22
|
this.externalPaths = [];
|
|
23
|
-
this.agentsDir =
|
|
23
|
+
this.agentsDir = _chunkPMMSDR44cjs.AUTOHAND_PATHS.agents;
|
|
24
24
|
}
|
|
25
25
|
static getInstance() {
|
|
26
26
|
if (!_AgentRegistry.instance) {
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AUTOHAND_PATHS
|
|
3
|
+
} from "./chunk-EKY5PKQI.js";
|
|
4
|
+
|
|
5
|
+
// src/commands/resume.ts
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import enquirer from "enquirer";
|
|
8
|
+
import fs from "fs-extra";
|
|
9
|
+
import path from "path";
|
|
10
|
+
var metadata = {
|
|
11
|
+
command: "/resume",
|
|
12
|
+
description: "resume a previous session",
|
|
13
|
+
implemented: true
|
|
14
|
+
};
|
|
15
|
+
async function getSessionTitle(sessionMeta) {
|
|
16
|
+
if (sessionMeta.summary && sessionMeta.summary.trim()) {
|
|
17
|
+
return sessionMeta.summary.slice(0, 60);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const conversationPath = path.join(AUTOHAND_PATHS.sessions, sessionMeta.sessionId, "conversation.jsonl");
|
|
21
|
+
if (await fs.pathExists(conversationPath)) {
|
|
22
|
+
const content = await fs.readFile(conversationPath, "utf-8");
|
|
23
|
+
const lines = content.trim().split("\n").filter((line) => line);
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
try {
|
|
26
|
+
const msg = JSON.parse(line);
|
|
27
|
+
if (msg.role === "user" && msg.content) {
|
|
28
|
+
const cleanContent = msg.content.replace(/\n/g, " ").replace(/\s+/g, " ").trim();
|
|
29
|
+
return cleanContent.slice(0, 60) + (cleanContent.length > 60 ? "..." : "");
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
return chalk.gray("(no title)");
|
|
38
|
+
}
|
|
39
|
+
function formatSessionChoice(sessionMeta, title) {
|
|
40
|
+
const date = new Date(sessionMeta.createdAt);
|
|
41
|
+
const timeAgo = getTimeAgo(date);
|
|
42
|
+
const msgCount = sessionMeta.messageCount;
|
|
43
|
+
return {
|
|
44
|
+
name: sessionMeta.sessionId,
|
|
45
|
+
message: title,
|
|
46
|
+
hint: `${timeAgo} - ${msgCount} messages - ${sessionMeta.projectName}`
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function getTimeAgo(date) {
|
|
50
|
+
const now = /* @__PURE__ */ new Date();
|
|
51
|
+
const diffMs = now.getTime() - date.getTime();
|
|
52
|
+
const diffMins = Math.floor(diffMs / (1e3 * 60));
|
|
53
|
+
const diffHours = Math.floor(diffMs / (1e3 * 60 * 60));
|
|
54
|
+
const diffDays = Math.floor(diffMs / (1e3 * 60 * 60 * 24));
|
|
55
|
+
if (diffMins < 1) return "just now";
|
|
56
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
57
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
58
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
59
|
+
return date.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
60
|
+
}
|
|
61
|
+
async function resume(ctx) {
|
|
62
|
+
const sessionId = ctx.args[0];
|
|
63
|
+
if (sessionId) {
|
|
64
|
+
return resumeSession(ctx.sessionManager, sessionId);
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const allSessions = await ctx.sessionManager.listSessions();
|
|
68
|
+
if (allSessions.length === 0) {
|
|
69
|
+
console.log(chalk.gray("\nNo sessions found."));
|
|
70
|
+
console.log(chalk.gray("Start a new conversation to create a session.\n"));
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
console.log(chalk.cyan("\nSelect a session to resume:\n"));
|
|
74
|
+
const choices = [];
|
|
75
|
+
const recentSessions = allSessions.slice(0, 20);
|
|
76
|
+
for (const session of recentSessions) {
|
|
77
|
+
const title = await getSessionTitle(session);
|
|
78
|
+
choices.push(formatSessionChoice(session, title));
|
|
79
|
+
}
|
|
80
|
+
if (allSessions.length > 20) {
|
|
81
|
+
choices.push({
|
|
82
|
+
name: "__more__",
|
|
83
|
+
message: chalk.gray(`... ${allSessions.length - 20} more sessions`),
|
|
84
|
+
hint: "Use /sessions to see all"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const { selected } = await enquirer.prompt([
|
|
88
|
+
{
|
|
89
|
+
type: "select",
|
|
90
|
+
name: "selected",
|
|
91
|
+
message: "Choose a session",
|
|
92
|
+
choices
|
|
93
|
+
}
|
|
94
|
+
]);
|
|
95
|
+
if (selected === "__more__") {
|
|
96
|
+
console.log(chalk.gray("\nUse /sessions to see all sessions, then /resume <id>"));
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return resumeSession(ctx.sessionManager, selected);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (error.name === "ExitPromptError" || error.message?.includes("canceled")) {
|
|
102
|
+
console.log(chalk.gray("\nResume cancelled."));
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
console.error(chalk.red(`Failed to list sessions: ${error.message}`));
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function resumeSession(sessionManager, sessionId) {
|
|
110
|
+
try {
|
|
111
|
+
const session = await sessionManager.loadSession(sessionId);
|
|
112
|
+
const messages = session.getMessages();
|
|
113
|
+
const firstUserMessage = messages.find((m) => m.role === "user");
|
|
114
|
+
const title = session.metadata.summary || firstUserMessage?.content.slice(0, 50) || "Untitled session";
|
|
115
|
+
console.log(chalk.cyan(`
|
|
116
|
+
Resuming: ${title}`));
|
|
117
|
+
console.log(chalk.gray(` Project: ${session.metadata.projectPath}`));
|
|
118
|
+
console.log(chalk.gray(` Started: ${new Date(session.metadata.createdAt).toLocaleString()}`));
|
|
119
|
+
console.log(chalk.gray(` Messages: ${messages.length}`));
|
|
120
|
+
console.log();
|
|
121
|
+
if (messages.length > 0) {
|
|
122
|
+
console.log(chalk.cyan("Recent conversation:"));
|
|
123
|
+
console.log(chalk.gray("\u2500".repeat(60)));
|
|
124
|
+
const recentMessages = messages.slice(-5);
|
|
125
|
+
for (const msg of recentMessages) {
|
|
126
|
+
const role = msg.role === "user" ? chalk.green("You") : msg.role === "assistant" ? chalk.blue("Assistant") : chalk.gray(msg.role);
|
|
127
|
+
if (msg.role === "tool") continue;
|
|
128
|
+
const preview = msg.content.replace(/\n/g, " ").replace(/\s+/g, " ").slice(0, 100);
|
|
129
|
+
const truncated = msg.content.length > 100 ? "..." : "";
|
|
130
|
+
console.log(`${role}: ${chalk.white(preview)}${truncated}`);
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.gray("\u2500".repeat(60)));
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
console.log(chalk.green("Session resumed. Continue typing to chat.\n"));
|
|
136
|
+
return "SESSION_RESUMED";
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.error(chalk.red(`Failed to resume session: ${error.message}`));
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
metadata,
|
|
145
|
+
resume
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* @license
|
|
149
|
+
* Copyright 2025 Autohand AI LLC
|
|
150
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
151
|
+
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var _chunkJHGIWNHLcjs = require('./chunk-JHGIWNHL.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
|
|
7
7
|
|
|
8
8
|
// src/skills/SkillsRegistry.ts
|
|
9
9
|
var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
|
|
@@ -232,7 +232,7 @@ var SkillsRegistry = class {
|
|
|
232
232
|
this.workspaceRoot = workspaceRoot;
|
|
233
233
|
const claudeProjectSkillsDir = _path2.default.join(workspaceRoot, ".claude", "skills");
|
|
234
234
|
await this.loadFromDirectory(claudeProjectSkillsDir, "claude-project", false);
|
|
235
|
-
const autohandProjectSkillsDir = _path2.default.join(workspaceRoot,
|
|
235
|
+
const autohandProjectSkillsDir = _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, "skills");
|
|
236
236
|
await this.loadFromDirectory(autohandProjectSkillsDir, "autohand-project", true);
|
|
237
237
|
}
|
|
238
238
|
/**
|
|
@@ -291,7 +291,7 @@ var SkillsRegistry = class {
|
|
|
291
291
|
async setWorkspaceWithAutoCopy(workspaceRoot) {
|
|
292
292
|
this.workspaceRoot = workspaceRoot;
|
|
293
293
|
const claudeProjectSkillsDir = _path2.default.join(workspaceRoot, ".claude", "skills");
|
|
294
|
-
const autohandProjectSkillsDir = _path2.default.join(workspaceRoot,
|
|
294
|
+
const autohandProjectSkillsDir = _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, "skills");
|
|
295
295
|
await this.addLocationWithAutoCopy(
|
|
296
296
|
claudeProjectSkillsDir,
|
|
297
297
|
"claude-project",
|
|
@@ -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
|
|
3
|
+
var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.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,
|
|
10
|
+
return _path2.default.join(workspaceRoot, _chunkPMMSDR44cjs.PROJECT_DIR_NAME, LOCAL_SETTINGS_FILE);
|
|
11
11
|
}
|
|
12
12
|
async function loadLocalProjectSettings(workspaceRoot) {
|
|
13
13
|
const settingsPath = getLocalSettingsPath(workspaceRoot);
|
|
@@ -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 _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
|
|
3
|
+
var _chunkPMMSDR44cjs = require('./chunk-PMMSDR44.cjs');
|
|
4
4
|
|
|
5
5
|
// src/session/SessionManager.ts
|
|
6
6
|
var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
|
|
@@ -10,7 +10,7 @@ var SessionManager = class {
|
|
|
10
10
|
constructor(baseDir) {
|
|
11
11
|
this.currentSession = null;
|
|
12
12
|
this.index = null;
|
|
13
|
-
this.sessionsDir = _nullishCoalesce(baseDir, () => (
|
|
13
|
+
this.sessionsDir = _nullishCoalesce(baseDir, () => ( _chunkPMMSDR44cjs.AUTOHAND_PATHS.sessions));
|
|
14
14
|
}
|
|
15
15
|
async initialize() {
|
|
16
16
|
await _fsextra2.default.ensureDir(this.sessionsDir);
|
|
@@ -20,6 +20,8 @@ var SessionManager = class {
|
|
|
20
20
|
const sessionId = this.generateSessionId();
|
|
21
21
|
const sessionDir = _path2.default.join(this.sessionsDir, sessionId);
|
|
22
22
|
await _fsextra2.default.ensureDir(sessionDir);
|
|
23
|
+
const client = process.env.AUTOHAND_CLIENT_NAME || "terminal";
|
|
24
|
+
const clientVersion = process.env.AUTOHAND_CLIENT_VERSION;
|
|
23
25
|
const metadata = {
|
|
24
26
|
sessionId,
|
|
25
27
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -28,7 +30,9 @@ var SessionManager = class {
|
|
|
28
30
|
projectName: _path2.default.basename(projectPath),
|
|
29
31
|
model,
|
|
30
32
|
messageCount: 0,
|
|
31
|
-
status: "active"
|
|
33
|
+
status: "active",
|
|
34
|
+
client,
|
|
35
|
+
clientVersion
|
|
32
36
|
};
|
|
33
37
|
const session = new Session(sessionDir, metadata);
|
|
34
38
|
await session.save();
|