autohand-cli 0.6.3 → 0.6.4

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 (81) hide show
  1. package/dist/agents-EHLYBJLK.cjs +10 -0
  2. package/dist/{agents-7GZ2VBYU.js → agents-OJWYZN6X.js} +1 -0
  3. package/dist/agents-new-7VPASCBV.cjs +10 -0
  4. package/dist/{agents-new-VALZG4B5.js → agents-new-WQLJOXSS.js} +1 -0
  5. package/dist/chunk-27JNK5TE.cjs +252 -0
  6. package/dist/chunk-3Y6G5DUX.cjs +105 -0
  7. package/dist/chunk-4AMTDSQ3.cjs +30 -0
  8. package/dist/{chunk-KZ4QOKII.js → chunk-6MCXWSR3.js} +2 -2
  9. package/dist/chunk-7RRX7H2X.cjs +104 -0
  10. package/dist/chunk-AD4O67ZA.cjs +93 -0
  11. package/dist/chunk-AL4Z4WKG.cjs +59 -0
  12. package/dist/chunk-BEIG7V7Q.cjs +51 -0
  13. package/dist/chunk-C3IFF3EH.cjs +373 -0
  14. package/dist/chunk-DD2YPHP5.cjs +133 -0
  15. package/dist/chunk-FFA4LDAO.cjs +55 -0
  16. package/dist/chunk-G7SYGATA.cjs +197 -0
  17. package/dist/chunk-IHJDYAYJ.cjs +77 -0
  18. package/dist/chunk-JBKP2CLA.cjs +364 -0
  19. package/dist/chunk-JSBRDJBE.js +30 -0
  20. package/dist/chunk-KNLBEUAV.cjs +57 -0
  21. package/dist/chunk-M4LKQQHU.cjs +168 -0
  22. package/dist/chunk-M7RVTUWE.cjs +145 -0
  23. package/dist/chunk-MFK6HE47.cjs +33 -0
  24. package/dist/chunk-N254NRHT.cjs +30 -0
  25. package/dist/chunk-QCMC2WOC.cjs +1135 -0
  26. package/dist/chunk-RDEROLKA.cjs +79 -0
  27. package/dist/chunk-RYY5I7QN.cjs +49 -0
  28. package/dist/chunk-V5MTBGM4.cjs +20 -0
  29. package/dist/chunk-VMMGT42E.cjs +60 -0
  30. package/dist/chunk-WBDPILKI.cjs +19 -0
  31. package/dist/chunk-XT4OSHSB.cjs +20 -0
  32. package/dist/chunk-Z4J4W6YQ.cjs +339 -0
  33. package/dist/chunk-Z6SGIQWH.cjs +191 -0
  34. package/dist/chunk-ZTA2ASFW.cjs +304 -0
  35. package/dist/completion-AMEZDTFT.cjs +11 -0
  36. package/dist/{completion-Y42FKDT3.js → completion-HR3ZT55J.js} +1 -0
  37. package/dist/{export-WJ5P6E5Z.js → export-MYBJZD3H.js} +1 -0
  38. package/dist/export-ULYYSO5V.cjs +9 -0
  39. package/dist/{feedback-RJNBUBDQ.js → feedback-3THCLEBE.js} +1 -0
  40. package/dist/feedback-PATTKRH5.cjs +10 -0
  41. package/dist/{formatters-UG6VZJJ5.js → formatters-3POW3KMP.js} +1 -0
  42. package/dist/formatters-UMUJYWV5.cjs +9 -0
  43. package/dist/help-2PR7P4UJ.cjs +11 -0
  44. package/dist/{help-PKC6QCNG.js → help-AW4QPGIW.js} +1 -0
  45. package/dist/index.cjs +3579 -6515
  46. package/dist/index.js +1735 -62
  47. package/dist/{init-DML7AOII.js → init-HAQKREMF.js} +1 -0
  48. package/dist/init-OLSCW7ZC.cjs +9 -0
  49. package/dist/lint-D5UOJWIK.cjs +9 -0
  50. package/dist/{lint-TA2ZHVLM.js → lint-NJPZWVN2.js} +1 -0
  51. package/dist/{login-MBMAXHG6.js → login-QJROML5I.js} +1 -0
  52. package/dist/login-X66DSV75.cjs +12 -0
  53. package/dist/logout-3Z7R3F7J.cjs +12 -0
  54. package/dist/{logout-VI6YMV7P.js → logout-RJ5OAXRI.js} +1 -0
  55. package/dist/memory-77SWEZYB.cjs +9 -0
  56. package/dist/{memory-4GSP7NKV.js → memory-F3V5FW6W.js} +1 -0
  57. package/dist/model-B2PE6XFS.cjs +9 -0
  58. package/dist/{model-HKEFSH5E.js → model-JC53RT7A.js} +1 -0
  59. package/dist/{new-EEZC4XXV.js → new-356ITOM7.js} +1 -0
  60. package/dist/new-J3ABPMW4.cjs +9 -0
  61. package/dist/{permissions-XJKYKDBG.js → permissions-CYW62ZK3.js} +1 -0
  62. package/dist/permissions-NOC5DMOH.cjs +9 -0
  63. package/dist/{quit-RSYIERO5.js → quit-2QWJ75GZ.js} +1 -0
  64. package/dist/quit-DQ57J67A.cjs +9 -0
  65. package/dist/resume-43XMN4CL.cjs +9 -0
  66. package/dist/{resume-2NERFSTD.js → resume-GA7YZJSO.js} +1 -0
  67. package/dist/session-BSU2L5UI.cjs +9 -0
  68. package/dist/{session-H5QWKE5E.js → session-SZMRN5KG.js} +1 -0
  69. package/dist/sessions-CVOZGTKR.cjs +9 -0
  70. package/dist/{sessions-4KXIT76T.js → sessions-OJ4DRK3P.js} +1 -0
  71. package/dist/{skills-POKNCIQV.js → skills-HF4SAF5O.js} +1 -0
  72. package/dist/skills-U6J6DFLK.cjs +11 -0
  73. package/dist/{skills-new-5VCNKQDP.js → skills-new-QDTNEG3R.js} +1 -0
  74. package/dist/skills-new-UPVBHIF2.cjs +10 -0
  75. package/dist/status-GR73LEEN.cjs +9 -0
  76. package/dist/{status-XQSGXTHN.js → status-SLYYTKXD.js} +2 -1
  77. package/dist/{theme-B5QZLGKP.js → theme-THMQ5AIN.js} +1 -0
  78. package/dist/theme-YDANJLZR.cjs +13 -0
  79. package/dist/{undo-7QJBXARS.js → undo-3Q44LSVS.js} +1 -0
  80. package/dist/undo-WF5HB5VU.cjs +9 -0
  81. package/package.json +2 -2
@@ -0,0 +1,59 @@
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
+
3
+ var _chunkM4LKQQHUcjs = require('./chunk-M4LKQQHU.cjs');
4
+
5
+
6
+ var _chunkQCMC2WOCcjs = require('./chunk-QCMC2WOC.cjs');
7
+
8
+ // src/commands/logout.ts
9
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
10
+ var _enquirer = require('enquirer'); var _enquirer2 = _interopRequireDefault(_enquirer);
11
+ var metadata = {
12
+ command: "/logout",
13
+ description: "sign out of your Autohand account",
14
+ implemented: true
15
+ };
16
+ async function logout(ctx) {
17
+ const config = ctx.config;
18
+ if (!_optionalChain([config, 'optionalAccess', _ => _.auth, 'optionalAccess', _2 => _2.token])) {
19
+ console.log(_chalk2.default.yellow("You are not currently logged in."));
20
+ console.log(_chalk2.default.gray("Use /login to sign in to your Autohand account."));
21
+ return null;
22
+ }
23
+ const userName = _optionalChain([config, 'access', _3 => _3.auth, 'access', _4 => _4.user, 'optionalAccess', _5 => _5.name]) || _optionalChain([config, 'access', _6 => _6.auth, 'access', _7 => _7.user, 'optionalAccess', _8 => _8.email]) || "user";
24
+ const { confirm } = await _enquirer2.default.prompt({
25
+ type: "confirm",
26
+ name: "confirm",
27
+ message: `Log out from ${_chalk2.default.cyan(userName)}?`,
28
+ initial: true
29
+ });
30
+ if (!confirm) {
31
+ console.log(_chalk2.default.gray("Logout cancelled."));
32
+ return null;
33
+ }
34
+ const authClient = _chunkM4LKQQHUcjs.getAuthClient.call(void 0, );
35
+ try {
36
+ await authClient.logout(config.auth.token);
37
+ } catch (e) {
38
+ }
39
+ const updatedConfig = {
40
+ ...config,
41
+ auth: void 0
42
+ };
43
+ await _chunkQCMC2WOCcjs.saveConfig.call(void 0, updatedConfig);
44
+ console.log();
45
+ console.log(_chalk2.default.green("Successfully logged out."));
46
+ console.log(_chalk2.default.gray("Your local session has been cleared."));
47
+ console.log();
48
+ return null;
49
+ }
50
+
51
+
52
+
53
+
54
+ exports.metadata = metadata; exports.logout = logout;
55
+ /**
56
+ * @license
57
+ * Copyright 2025 Autohand AI LLC
58
+ * SPDX-License-Identifier: Apache-2.0
59
+ */
@@ -0,0 +1,51 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/commands/help.ts
2
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
3
+ var _terminallink = require('terminal-link'); var _terminallink2 = _interopRequireDefault(_terminallink);
4
+ async function help() {
5
+ console.log(_chalk2.default.cyan("\n\u{1F4DA} Available Commands:\n"));
6
+ const commands = [
7
+ { cmd: "/quit", desc: "Exit Autohand" },
8
+ { cmd: "/model", desc: "Configure providers (OpenRouter, Ollama, OpenAI, llama.cpp)" },
9
+ { cmd: "/theme", desc: "Change the color theme" },
10
+ { cmd: "/session", desc: "Show current session info" },
11
+ { cmd: "/sessions", desc: "List sessions" },
12
+ { cmd: "/resume", desc: "Resume a session by id" },
13
+ { cmd: "/init", desc: "Create AGENTS.md file" },
14
+ { cmd: "/agents", desc: "List available sub-agents" },
15
+ { cmd: "/feedback", desc: "Send feedback with env details" },
16
+ { cmd: "/help / ?", desc: "Show this help" }
17
+ ];
18
+ commands.forEach(({ cmd, desc }) => {
19
+ console.log(` ${_chalk2.default.yellow(cmd.padEnd(14))} ${_chalk2.default.gray(desc)}`);
20
+ });
21
+ console.log(_chalk2.default.cyan("\n\u{1F4A1} Tips:\n"));
22
+ console.log(_chalk2.default.gray(" \u2022 Type @ to mention files for the AI"));
23
+ console.log(_chalk2.default.gray(" \u2022 Use arrow keys to navigate file suggestions"));
24
+ console.log(_chalk2.default.gray(" \u2022 Press Tab to autocomplete file paths"));
25
+ console.log(_chalk2.default.gray(" \u2022 Press Esc to cancel current operation\n"));
26
+ const docLink = _terminallink2.default.call(void 0, "docs.autohand.ai", "https://docs.autohand.ai");
27
+ console.log(_chalk2.default.gray(`For more information, visit ${docLink}
28
+ `));
29
+ return null;
30
+ }
31
+ var metadata = {
32
+ command: "/help",
33
+ description: "describe available slash commands and tips",
34
+ implemented: true
35
+ };
36
+ var aliasMetadata = {
37
+ command: "/?",
38
+ description: "alias for /help",
39
+ implemented: true
40
+ };
41
+
42
+
43
+
44
+
45
+
46
+ exports.help = help; exports.metadata = metadata; exports.aliasMetadata = aliasMetadata;
47
+ /**
48
+ * @license
49
+ * Copyright 2025 Autohand AI LLC
50
+ * SPDX-License-Identifier: Apache-2.0
51
+ */
@@ -0,0 +1,373 @@
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; }// src/commands/export.ts
2
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
3
+ var _path = require('path'); var _path2 = _interopRequireDefault(_path);
4
+ var _enquirer = require('enquirer'); var _enquirer2 = _interopRequireDefault(_enquirer);
5
+
6
+ // src/session/exportSession.ts
7
+ var _fsextra = require('fs-extra'); var _fsextra2 = _interopRequireDefault(_fsextra);
8
+
9
+ var DEFAULT_OPTIONS = {
10
+ includeToolOutputs: true,
11
+ includeTimestamps: false,
12
+ includeMetadata: true,
13
+ maxCodeBlockLength: 500,
14
+ includeToc: false
15
+ };
16
+ function formatCodeBlock(code, language, maxLength) {
17
+ let content = code;
18
+ if (maxLength && content.length > maxLength) {
19
+ content = content.slice(0, maxLength) + "\n... (truncated)";
20
+ }
21
+ const lang = language || "";
22
+ return "```" + lang + "\n" + content + "\n```";
23
+ }
24
+ function detectLanguage(content, context) {
25
+ if (context) {
26
+ const extMatch = context.match(/\.(\w+)$/);
27
+ if (extMatch) {
28
+ const ext = extMatch[1].toLowerCase();
29
+ const langMap = {
30
+ ts: "typescript",
31
+ tsx: "typescript",
32
+ js: "javascript",
33
+ jsx: "javascript",
34
+ py: "python",
35
+ rs: "rust",
36
+ go: "go",
37
+ rb: "ruby",
38
+ java: "java",
39
+ cpp: "cpp",
40
+ c: "c",
41
+ sh: "bash",
42
+ bash: "bash",
43
+ json: "json",
44
+ yaml: "yaml",
45
+ yml: "yaml",
46
+ md: "markdown",
47
+ sql: "sql",
48
+ html: "html",
49
+ css: "css"
50
+ };
51
+ return langMap[ext] || ext;
52
+ }
53
+ }
54
+ if (content.includes("function") || content.includes("const ") || content.includes("let ")) {
55
+ return "javascript";
56
+ }
57
+ if (content.includes("def ") || content.includes("import ") && content.includes(":")) {
58
+ return "python";
59
+ }
60
+ if (content.includes("fn ") || content.includes("let mut")) {
61
+ return "rust";
62
+ }
63
+ if (content.includes("func ") || content.includes("package ")) {
64
+ return "go";
65
+ }
66
+ return "";
67
+ }
68
+ function formatTimestamp(timestamp) {
69
+ const date = new Date(timestamp);
70
+ return date.toLocaleString("en-US", {
71
+ month: "short",
72
+ day: "numeric",
73
+ hour: "2-digit",
74
+ minute: "2-digit"
75
+ });
76
+ }
77
+ function formatMessage(message, options, index) {
78
+ const parts = [];
79
+ const roleEmoji = {
80
+ user: "\u{1F464}",
81
+ assistant: "\u{1F916}",
82
+ tool: "\u{1F527}",
83
+ system: "\u2699\uFE0F"
84
+ };
85
+ const emoji = roleEmoji[message.role] || "\u{1F4AC}";
86
+ const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);
87
+ const timestamp = options.includeTimestamps && message.timestamp ? ` (${formatTimestamp(message.timestamp)})` : "";
88
+ parts.push(`### ${emoji} ${roleLabel}${timestamp}`);
89
+ parts.push("");
90
+ if (message.role === "tool") {
91
+ if (options.includeToolOutputs) {
92
+ const toolName = message.name || "Tool";
93
+ parts.push(`**${toolName}**`);
94
+ parts.push("");
95
+ if (message.content.includes("\n") || message.content.length > 100) {
96
+ const lang = detectLanguage(message.content, message.name);
97
+ parts.push(formatCodeBlock(message.content, lang, options.maxCodeBlockLength));
98
+ } else {
99
+ parts.push(`> ${message.content}`);
100
+ }
101
+ } else {
102
+ parts.push("*Tool output omitted*");
103
+ }
104
+ } else {
105
+ const content = message.content;
106
+ const codeBlockRegex = /```(\w*)\n([\s\S]*?)```/g;
107
+ let lastIndex = 0;
108
+ let match;
109
+ while ((match = codeBlockRegex.exec(content)) !== null) {
110
+ if (match.index > lastIndex) {
111
+ parts.push(content.slice(lastIndex, match.index).trim());
112
+ }
113
+ const lang = match[1] || "";
114
+ const code = match[2];
115
+ parts.push(formatCodeBlock(code, lang, options.maxCodeBlockLength));
116
+ lastIndex = match.index + match[0].length;
117
+ }
118
+ if (lastIndex < content.length) {
119
+ const remaining = content.slice(lastIndex).trim();
120
+ if (remaining) {
121
+ parts.push(remaining);
122
+ }
123
+ }
124
+ }
125
+ parts.push("");
126
+ parts.push("---");
127
+ parts.push("");
128
+ return parts.join("\n");
129
+ }
130
+ function exportToMarkdown(metadata2, messages, options = {}) {
131
+ const opts = { ...DEFAULT_OPTIONS, ...options };
132
+ const parts = [];
133
+ parts.push(`# ${metadata2.projectName} - Session ${metadata2.sessionId.slice(0, 8)}`);
134
+ parts.push("");
135
+ if (opts.includeMetadata) {
136
+ parts.push("## Session Info");
137
+ parts.push("");
138
+ parts.push(`| Property | Value |`);
139
+ parts.push(`|----------|-------|`);
140
+ parts.push(`| **Project** | ${metadata2.projectName} |`);
141
+ parts.push(`| **Started** | ${formatTimestamp(metadata2.createdAt)} |`);
142
+ if (metadata2.closedAt) {
143
+ parts.push(`| **Ended** | ${formatTimestamp(metadata2.closedAt)} |`);
144
+ }
145
+ parts.push(`| **Model** | ${metadata2.model} |`);
146
+ parts.push(`| **Messages** | ${metadata2.messageCount} |`);
147
+ parts.push(`| **Status** | ${metadata2.status} |`);
148
+ parts.push("");
149
+ if (metadata2.summary) {
150
+ parts.push("### Summary");
151
+ parts.push("");
152
+ parts.push(metadata2.summary);
153
+ parts.push("");
154
+ }
155
+ parts.push("---");
156
+ parts.push("");
157
+ }
158
+ if (opts.includeToc) {
159
+ parts.push("## Table of Contents");
160
+ parts.push("");
161
+ let userCount2 = 0;
162
+ for (const message of messages) {
163
+ if (message.role === "user") {
164
+ userCount2++;
165
+ const preview = message.content.slice(0, 50).replace(/\n/g, " ");
166
+ parts.push(`${userCount2}. [${preview}...](#message-${userCount2})`);
167
+ }
168
+ }
169
+ parts.push("");
170
+ parts.push("---");
171
+ parts.push("");
172
+ }
173
+ parts.push("## Conversation");
174
+ parts.push("");
175
+ let userCount = 0;
176
+ for (let i = 0; i < messages.length; i++) {
177
+ const message = messages[i];
178
+ if (opts.includeToc && message.role === "user") {
179
+ userCount++;
180
+ parts.push(`<a name="message-${userCount}"></a>`);
181
+ parts.push("");
182
+ }
183
+ parts.push(formatMessage(message, opts, i));
184
+ }
185
+ parts.push("---");
186
+ parts.push("");
187
+ parts.push(`*Exported from Autohand CLI on ${(/* @__PURE__ */ new Date()).toLocaleString()}*`);
188
+ return parts.join("\n");
189
+ }
190
+ function exportToJson(metadata2, messages, pretty = true) {
191
+ const data = {
192
+ metadata: metadata2,
193
+ messages,
194
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
195
+ version: "1.0"
196
+ };
197
+ return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
198
+ }
199
+ function exportToHtml(metadata2, messages, options = {}) {
200
+ const markdown = exportToMarkdown(metadata2, messages, options);
201
+ const html = markdown.replace(/^### (.*$)/gm, "<h3>$1</h3>").replace(/^## (.*$)/gm, "<h2>$1</h2>").replace(/^# (.*$)/gm, "<h1>$1</h1>").replace(/\*\*(.*?)\*\*/g, "<strong>$1</strong>").replace(/\*(.*?)\*/g, "<em>$1</em>").replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code class="language-$1">$2</code></pre>').replace(/`([^`]+)`/g, "<code>$1</code>").replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>').replace(/\|([^|]+)\|/g, "<td>$1</td>").replace(/^> (.*$)/gm, "<blockquote>$1</blockquote>").replace(/^---$/gm, "<hr>").replace(/\n\n/g, "</p><p>").replace(/\n/g, "<br>");
202
+ return `<!DOCTYPE html>
203
+ <html lang="en">
204
+ <head>
205
+ <meta charset="UTF-8">
206
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
207
+ <title>${metadata2.projectName} - Session ${metadata2.sessionId.slice(0, 8)}</title>
208
+ <style>
209
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 2rem; line-height: 1.6; }
210
+ h1, h2, h3 { color: #333; }
211
+ pre { background: #f5f5f5; padding: 1rem; border-radius: 4px; overflow-x: auto; }
212
+ code { background: #f5f5f5; padding: 0.2rem 0.4rem; border-radius: 3px; font-size: 0.9em; }
213
+ pre code { background: none; padding: 0; }
214
+ blockquote { border-left: 4px solid #ddd; margin: 0; padding-left: 1rem; color: #666; }
215
+ hr { border: none; border-top: 1px solid #ddd; margin: 1.5rem 0; }
216
+ table { border-collapse: collapse; width: 100%; }
217
+ td, th { border: 1px solid #ddd; padding: 0.5rem; text-align: left; }
218
+ </style>
219
+ </head>
220
+ <body>
221
+ <p>${html}</p>
222
+ </body>
223
+ </html>`;
224
+ }
225
+ async function saveExport(content, filePath) {
226
+ await _fsextra2.default.ensureDir(_path2.default.dirname(filePath));
227
+ await _fsextra2.default.writeFile(filePath, content, "utf8");
228
+ }
229
+ function getSuggestedFilename(metadata2, format) {
230
+ const date = new Date(metadata2.createdAt);
231
+ const dateStr = date.toISOString().split("T")[0];
232
+ const projectSlug = metadata2.projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-");
233
+ const sessionShort = metadata2.sessionId.slice(0, 8);
234
+ return `${projectSlug}-${dateStr}-${sessionShort}.${format}`;
235
+ }
236
+
237
+ // src/commands/export.ts
238
+ var metadata = {
239
+ command: "/export",
240
+ description: "Export current session to markdown",
241
+ implemented: true
242
+ };
243
+ async function execute(args, context) {
244
+ if (!_optionalChain([context, 'optionalAccess', _ => _.sessionManager])) {
245
+ console.log(_chalk2.default.red("Session manager not available."));
246
+ return;
247
+ }
248
+ const { sessionManager, currentSession, workspaceRoot } = context;
249
+ let session = currentSession;
250
+ if (!session) {
251
+ const sessions = await sessionManager.listSessions();
252
+ if (sessions.length === 0) {
253
+ console.log(_chalk2.default.yellow("No sessions found to export."));
254
+ return;
255
+ }
256
+ const { Select: Select2 } = _enquirer2.default;
257
+ const sessionPrompt = new Select2({
258
+ name: "session",
259
+ message: "Select a session to export:",
260
+ choices: sessions.slice(0, 10).map((s) => ({
261
+ name: s.sessionId,
262
+ message: `${s.projectName} - ${new Date(s.createdAt).toLocaleString()} (${s.messageCount} messages)`
263
+ }))
264
+ });
265
+ try {
266
+ const selectedId = await sessionPrompt.run();
267
+ session = await sessionManager.loadSession(selectedId);
268
+ } catch (e) {
269
+ console.log(_chalk2.default.gray("Cancelled."));
270
+ return;
271
+ }
272
+ }
273
+ const metadata2 = session.metadata;
274
+ const messages = session.getMessages();
275
+ if (messages.length === 0) {
276
+ console.log(_chalk2.default.yellow("No messages in session to export."));
277
+ return;
278
+ }
279
+ const { Select, Confirm, Input } = _enquirer2.default;
280
+ const formatPrompt = new Select({
281
+ name: "format",
282
+ message: "Export format:",
283
+ choices: [
284
+ { name: "md", message: "Markdown (.md)" },
285
+ { name: "json", message: "JSON (.json)" },
286
+ { name: "html", message: "HTML (.html)" }
287
+ ]
288
+ });
289
+ let format;
290
+ try {
291
+ format = await formatPrompt.run();
292
+ } catch (e2) {
293
+ console.log(_chalk2.default.gray("Cancelled."));
294
+ return;
295
+ }
296
+ const options = {};
297
+ if (format === "md" || format === "html") {
298
+ const includeToolsPrompt = new Confirm({
299
+ name: "includeTools",
300
+ message: "Include tool outputs?",
301
+ initial: true
302
+ });
303
+ try {
304
+ options.includeToolOutputs = await includeToolsPrompt.run();
305
+ } catch (e3) {
306
+ options.includeToolOutputs = true;
307
+ }
308
+ const includeTocPrompt = new Confirm({
309
+ name: "includeToc",
310
+ message: "Include table of contents?",
311
+ initial: false
312
+ });
313
+ try {
314
+ options.includeToc = await includeTocPrompt.run();
315
+ } catch (e4) {
316
+ options.includeToc = false;
317
+ }
318
+ }
319
+ const suggestedFilename = getSuggestedFilename(metadata2, format);
320
+ const filenamePrompt = new Input({
321
+ name: "filename",
322
+ message: "Save as:",
323
+ initial: suggestedFilename
324
+ });
325
+ let filename;
326
+ try {
327
+ filename = await filenamePrompt.run();
328
+ } catch (e5) {
329
+ console.log(_chalk2.default.gray("Cancelled."));
330
+ return;
331
+ }
332
+ let content;
333
+ switch (format) {
334
+ case "md":
335
+ content = exportToMarkdown(metadata2, messages, options);
336
+ break;
337
+ case "json":
338
+ content = exportToJson(metadata2, messages);
339
+ break;
340
+ case "html":
341
+ content = exportToHtml(metadata2, messages, options);
342
+ break;
343
+ }
344
+ const filePath = _path2.default.isAbsolute(filename) ? filename : _path2.default.join(workspaceRoot, filename);
345
+ try {
346
+ await saveExport(content, filePath);
347
+ console.log();
348
+ console.log(_chalk2.default.green("Session exported successfully!"));
349
+ console.log(_chalk2.default.cyan(` ${filePath}`));
350
+ console.log(_chalk2.default.gray(` ${messages.length} messages, ${(Buffer.byteLength(content, "utf8") / 1024).toFixed(1)} KB`));
351
+ console.log();
352
+ } catch (error) {
353
+ console.log(_chalk2.default.red(`Failed to save export: ${error.message}`));
354
+ }
355
+ }
356
+
357
+
358
+
359
+
360
+ exports.metadata = metadata; exports.execute = execute;
361
+ /**
362
+ * @license
363
+ * Copyright 2025 Autohand AI LLC
364
+ * SPDX-License-Identifier: Apache-2.0
365
+ *
366
+ * Session Export
367
+ * Export sessions to markdown and other formats
368
+ */
369
+ /**
370
+ * @license
371
+ * Copyright 2025 Autohand AI LLC
372
+ * SPDX-License-Identifier: Apache-2.0
373
+ */
@@ -0,0 +1,133 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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
+
3
+ var _chunkM4LKQQHUcjs = require('./chunk-M4LKQQHU.cjs');
4
+
5
+
6
+ var _chunkQCMC2WOCcjs = require('./chunk-QCMC2WOC.cjs');
7
+
8
+
9
+ var _chunkIHJDYAYJcjs = require('./chunk-IHJDYAYJ.cjs');
10
+
11
+ // src/commands/login.ts
12
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
13
+ var _enquirer = require('enquirer'); var _enquirer2 = _interopRequireDefault(_enquirer);
14
+ var metadata = {
15
+ command: "/login",
16
+ description: "sign in to your Autohand account",
17
+ implemented: true
18
+ };
19
+ async function openBrowser(url) {
20
+ try {
21
+ const open = await Promise.resolve().then(() => _interopRequireWildcard(require("open"))).then((m) => m.default).catch(() => null);
22
+ if (open) {
23
+ await open(url);
24
+ return true;
25
+ }
26
+ const { exec } = await Promise.resolve().then(() => _interopRequireWildcard(require("child_process")));
27
+ const { promisify } = await Promise.resolve().then(() => _interopRequireWildcard(require("util")));
28
+ const execAsync = promisify(exec);
29
+ const platform = process.platform;
30
+ let command;
31
+ if (platform === "darwin") {
32
+ command = `open "${url}"`;
33
+ } else if (platform === "win32") {
34
+ command = `start "" "${url}"`;
35
+ } else {
36
+ command = `xdg-open "${url}"`;
37
+ }
38
+ await execAsync(command);
39
+ return true;
40
+ } catch (e) {
41
+ return false;
42
+ }
43
+ }
44
+ function sleep(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ async function login(ctx) {
48
+ const config = ctx.config;
49
+ if (_optionalChain([config, 'optionalAccess', _ => _.auth, 'optionalAccess', _2 => _2.token]) && _optionalChain([config, 'optionalAccess', _3 => _3.auth, 'optionalAccess', _4 => _4.user])) {
50
+ const { continueLogin } = await _enquirer2.default.prompt({
51
+ type: "confirm",
52
+ name: "continueLogin",
53
+ message: `Already logged in as ${_chalk2.default.cyan(config.auth.user.email)}. Log in with a different account?`,
54
+ initial: false
55
+ });
56
+ if (!continueLogin) {
57
+ console.log(_chalk2.default.gray("Login cancelled."));
58
+ return null;
59
+ }
60
+ }
61
+ const authClient = _chunkM4LKQQHUcjs.getAuthClient.call(void 0, );
62
+ console.log(_chalk2.default.gray("Initiating authentication..."));
63
+ const initResult = await authClient.initiateDeviceAuth();
64
+ if (!initResult.success || !initResult.deviceCode || !initResult.userCode) {
65
+ console.log(_chalk2.default.red(`Failed to start login: ${initResult.error || "Unknown error"}`));
66
+ return null;
67
+ }
68
+ console.log();
69
+ console.log(_chalk2.default.bold("To sign in, visit:"));
70
+ console.log(_chalk2.default.cyan.underline(initResult.verificationUriComplete || `${_chunkIHJDYAYJcjs.AUTH_CONFIG.authorizationUrl}?code=${initResult.userCode}`));
71
+ console.log();
72
+ console.log(_chalk2.default.gray("Or enter this code manually:"));
73
+ console.log(_chalk2.default.bold.yellow(` ${initResult.userCode}`));
74
+ console.log();
75
+ const browserOpened = await openBrowser(
76
+ initResult.verificationUriComplete || `${_chunkIHJDYAYJcjs.AUTH_CONFIG.authorizationUrl}?code=${initResult.userCode}`
77
+ );
78
+ if (browserOpened) {
79
+ console.log(_chalk2.default.gray("Browser opened. Complete the login in your browser."));
80
+ } else {
81
+ console.log(_chalk2.default.yellow("Could not open browser automatically. Please visit the URL above."));
82
+ }
83
+ console.log();
84
+ console.log(_chalk2.default.gray("Waiting for authorization..."));
85
+ console.log(_chalk2.default.gray("(Press Ctrl+C to cancel)"));
86
+ const startTime = Date.now();
87
+ const timeout = _chunkIHJDYAYJcjs.AUTH_CONFIG.authTimeout;
88
+ const pollInterval = initResult.interval ? initResult.interval * 1e3 : _chunkIHJDYAYJcjs.AUTH_CONFIG.pollInterval;
89
+ let dots = 0;
90
+ const maxDots = 3;
91
+ while (Date.now() - startTime < timeout) {
92
+ process.stdout.write(`\r${_chalk2.default.gray("Waiting" + ".".repeat(dots + 1) + " ".repeat(maxDots - dots))}`);
93
+ dots = (dots + 1) % (maxDots + 1);
94
+ await sleep(pollInterval);
95
+ const pollResult = await authClient.pollDeviceAuth(initResult.deviceCode);
96
+ if (pollResult.status === "authorized" && pollResult.token && pollResult.user) {
97
+ process.stdout.write("\r" + " ".repeat(20) + "\r");
98
+ const expiresAt = new Date(Date.now() + _chunkIHJDYAYJcjs.AUTH_CONFIG.sessionExpiryDays * 24 * 60 * 60 * 1e3).toISOString();
99
+ const updatedConfig = {
100
+ ...config,
101
+ auth: {
102
+ token: pollResult.token,
103
+ user: pollResult.user,
104
+ expiresAt
105
+ }
106
+ };
107
+ await _chunkQCMC2WOCcjs.saveConfig.call(void 0, updatedConfig);
108
+ console.log();
109
+ console.log(_chalk2.default.green("Login successful!"));
110
+ console.log(_chalk2.default.cyan(`Welcome, ${pollResult.user.name || pollResult.user.email}!`));
111
+ console.log();
112
+ return null;
113
+ }
114
+ if (pollResult.status === "expired") {
115
+ process.stdout.write("\r" + " ".repeat(20) + "\r");
116
+ console.log(_chalk2.default.red("Authorization code expired. Please try again."));
117
+ return null;
118
+ }
119
+ }
120
+ process.stdout.write("\r" + " ".repeat(20) + "\r");
121
+ console.log(_chalk2.default.red("Authorization timed out. Please try again."));
122
+ return null;
123
+ }
124
+
125
+
126
+
127
+
128
+ exports.metadata = metadata; exports.login = login;
129
+ /**
130
+ * @license
131
+ * Copyright 2025 Autohand AI LLC
132
+ * SPDX-License-Identifier: Apache-2.0
133
+ */
@@ -0,0 +1,55 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/commands/undo.ts
2
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
3
+ var _child_process = require('child_process');
4
+ async function undo(ctx) {
5
+ console.log();
6
+ console.log(_chalk2.default.bold.yellow("Undoing changes..."));
7
+ const statusResult = _child_process.spawnSync.call(void 0, "git", ["status", "--porcelain"], {
8
+ cwd: ctx.workspaceRoot,
9
+ encoding: "utf8"
10
+ });
11
+ const hasGitChanges = statusResult.status === 0 && statusResult.stdout.trim().length > 0;
12
+ if (hasGitChanges) {
13
+ const checkoutResult = _child_process.spawnSync.call(void 0, "git", ["checkout", "--", "."], {
14
+ cwd: ctx.workspaceRoot,
15
+ encoding: "utf8"
16
+ });
17
+ if (checkoutResult.status === 0) {
18
+ console.log(_chalk2.default.green(" Reverted tracked file changes"));
19
+ }
20
+ const cleanResult = _child_process.spawnSync.call(void 0, "git", ["clean", "-fd"], {
21
+ cwd: ctx.workspaceRoot,
22
+ encoding: "utf8"
23
+ });
24
+ if (cleanResult.status === 0 && cleanResult.stdout.trim()) {
25
+ console.log(_chalk2.default.green(" Removed untracked files"));
26
+ }
27
+ } else {
28
+ console.log(_chalk2.default.gray(" No git changes to revert"));
29
+ }
30
+ try {
31
+ await ctx.undoFileMutation();
32
+ console.log(_chalk2.default.green(" Reverted last file mutation from undo stack"));
33
+ } catch (e) {
34
+ }
35
+ ctx.removeLastTurn();
36
+ console.log(_chalk2.default.green(" Removed last conversation turn"));
37
+ console.log();
38
+ console.log(_chalk2.default.cyan("Undo complete. Ready for new instructions."));
39
+ return null;
40
+ }
41
+ var metadata = {
42
+ command: "/undo",
43
+ description: "revert git changes and remove last conversation turn",
44
+ implemented: true
45
+ };
46
+
47
+
48
+
49
+
50
+ exports.undo = undo; exports.metadata = metadata;
51
+ /**
52
+ * @license
53
+ * Copyright 2025 Autohand AI LLC
54
+ * SPDX-License-Identifier: Apache-2.0
55
+ */