xiaotime 0.1.0

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/dist/auth.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Discord OAuth login flow for xiaotime CLI.
3
+ *
4
+ * xiaotime login:
5
+ * 1. POST /oauth/discord/cli/init → pending_id + auth_url
6
+ * 2. Open browser to auth_url
7
+ * 3. Poll /oauth/discord/cli/token?pending_id=... until complete
8
+ * 4. Store cli_token in ~/.xiaotime/credentials.json
9
+ */
10
+ interface Credentials {
11
+ token: string;
12
+ discord_username?: string;
13
+ issued_at: string;
14
+ }
15
+ export declare function loadCredentials(): Credentials | null;
16
+ export declare function saveCredentials(creds: Credentials): void;
17
+ export declare function getToken(): string;
18
+ export declare function runLogin(): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAOpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAMxD;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAOjC;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC9C"}
package/dist/auth.js ADDED
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * Discord OAuth login flow for xiaotime CLI.
4
+ *
5
+ * xiaotime login:
6
+ * 1. POST /oauth/discord/cli/init → pending_id + auth_url
7
+ * 2. Open browser to auth_url
8
+ * 3. Poll /oauth/discord/cli/token?pending_id=... until complete
9
+ * 4. Store cli_token in ~/.xiaotime/credentials.json
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.loadCredentials = loadCredentials;
46
+ exports.saveCredentials = saveCredentials;
47
+ exports.getToken = getToken;
48
+ exports.runLogin = runLogin;
49
+ const fs = __importStar(require("fs"));
50
+ const os = __importStar(require("os"));
51
+ const path = __importStar(require("path"));
52
+ const config_js_1 = require("./config.js");
53
+ const CREDENTIALS_DIR = path.join(os.homedir(), ".xiaotime");
54
+ const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, "credentials.json");
55
+ function loadCredentials() {
56
+ try {
57
+ const raw = fs.readFileSync(CREDENTIALS_FILE, "utf-8");
58
+ return JSON.parse(raw);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function saveCredentials(creds) {
65
+ fs.mkdirSync(CREDENTIALS_DIR, { recursive: true });
66
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
67
+ encoding: "utf-8",
68
+ mode: 0o600, // owner read/write only
69
+ });
70
+ }
71
+ function getToken() {
72
+ const creds = loadCredentials();
73
+ if (!creds?.token) {
74
+ console.error("Not logged in. Run: xiaotime login");
75
+ process.exit(1);
76
+ }
77
+ return creds.token;
78
+ }
79
+ async function runLogin() {
80
+ console.log("Connecting to xiaotime...\n");
81
+ // Step 1: init
82
+ const initRes = await fetch(`${config_js_1.ORCHESTRATOR_URL}/oauth/discord/cli/init`, {
83
+ method: "POST",
84
+ });
85
+ if (!initRes.ok) {
86
+ const body = await initRes.text();
87
+ throw new Error(`Failed to start login: ${body}`);
88
+ }
89
+ const { pending_id, auth_url } = await initRes.json();
90
+ // Step 2: open browser
91
+ console.log("Opening browser for Discord login...");
92
+ console.log(` ${auth_url}\n`);
93
+ console.log("If the browser does not open, copy the URL above and paste it into your browser.\n");
94
+ openBrowser(auth_url);
95
+ // Step 3: poll
96
+ console.log("Waiting for authentication...");
97
+ const token = await pollForToken(pending_id);
98
+ // Step 4: save
99
+ saveCredentials({
100
+ token,
101
+ issued_at: new Date().toISOString(),
102
+ });
103
+ console.log("\n✓ Logged in. You can now run: xiaotime dev\n");
104
+ }
105
+ async function pollForToken(pendingId, timeoutMs = 120_000) {
106
+ const deadline = Date.now() + timeoutMs;
107
+ const interval = 2000;
108
+ while (Date.now() < deadline) {
109
+ await sleep(interval);
110
+ try {
111
+ const res = await fetch(`${config_js_1.ORCHESTRATOR_URL}/oauth/discord/cli/token?pending_id=${encodeURIComponent(pendingId)}`);
112
+ if (!res.ok) {
113
+ // 410 = expired
114
+ const body = await res.json();
115
+ throw new Error(body.detail || `HTTP ${res.status}`);
116
+ }
117
+ const data = await res.json();
118
+ if (data.status === "complete" && data.token) {
119
+ return data.token;
120
+ }
121
+ }
122
+ catch (err) {
123
+ const msg = err instanceof Error ? err.message : String(err);
124
+ // Non-fatal poll error — keep waiting unless it's a hard error
125
+ if (msg.includes("expired"))
126
+ throw err;
127
+ // else: swallow transient network errors
128
+ }
129
+ }
130
+ throw new Error("Login timed out after 2 minutes. Please try again.");
131
+ }
132
+ function openBrowser(url) {
133
+ // Use spawnSync with an args array — URL is never interpolated into a shell
134
+ // string, so no injection is possible regardless of URL content.
135
+ const { spawnSync } = require("child_process");
136
+ try {
137
+ if (process.platform === "darwin") {
138
+ spawnSync("open", [url], { stdio: "ignore" });
139
+ }
140
+ else if (process.platform === "win32") {
141
+ spawnSync("cmd", ["/c", "start", "", url], { stdio: "ignore" });
142
+ }
143
+ else {
144
+ spawnSync("xdg-open", [url], { stdio: "ignore" });
145
+ }
146
+ }
147
+ catch {
148
+ // Non-fatal — user can copy the URL manually
149
+ }
150
+ }
151
+ function sleep(ms) {
152
+ return new Promise((resolve) => setTimeout(resolve, ms));
153
+ }
154
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Runtime configuration from environment variables.
3
+ */
4
+ export declare const ORCHESTRATOR_URL: string;
5
+ export declare const WS_URL: string;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,gBAAgB,QAC4C,CAAC;AAQ1E,eAAO,MAAM,MAAM,QAA4B,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime configuration from environment variables.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WS_URL = exports.ORCHESTRATOR_URL = void 0;
7
+ exports.ORCHESTRATOR_URL = process.env.XIAOTIME_ORCHESTRATOR_URL || "https://terminal.xiaotime.ai";
8
+ function toWsUrl(url) {
9
+ const parsed = new URL(url);
10
+ parsed.protocol = parsed.protocol === "https:" ? "wss:" : "ws:";
11
+ return parsed.toString().replace(/\/$/, "");
12
+ }
13
+ exports.WS_URL = toWsUrl(exports.ORCHESTRATOR_URL);
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,gBAAgB,GAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,8BAA8B,CAAC;AAE1E,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAEY,QAAA,MAAM,GAAG,OAAO,CAAC,wBAAgB,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Output formatting — streaming text, session list, cost display.
3
+ */
4
+ import type { Session } from "./session.js";
5
+ export declare function printWelcome(sessionId: string, sessionName: string | null, resumed: boolean, messageCount: number): void;
6
+ export declare function printTextDelta(text: string): void;
7
+ export declare function printTurnEnd(costUsd: number): void;
8
+ export declare function printError(message: string): void;
9
+ export declare function printSessionList(sessions: Session[]): void;
10
+ export declare function printPrompt(): void;
11
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../src/display.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAQjH;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,QAE1C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAG3C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAoBnD;AAED,wBAAgB,WAAW,SAE1B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * Output formatting — streaming text, session list, cost display.
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.printWelcome = printWelcome;
10
+ exports.printTextDelta = printTextDelta;
11
+ exports.printTurnEnd = printTurnEnd;
12
+ exports.printError = printError;
13
+ exports.printSessionList = printSessionList;
14
+ exports.printPrompt = printPrompt;
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ function printWelcome(sessionId, sessionName, resumed, messageCount) {
17
+ const name = sessionName || sessionId.slice(0, 8);
18
+ if (resumed) {
19
+ console.log(chalk_1.default.cyan(`\n↩ Resumed: ${name} (${messageCount} previous turns)`));
20
+ }
21
+ else {
22
+ console.log(chalk_1.default.cyan(`\n✦ New session: ${name}`));
23
+ }
24
+ console.log(chalk_1.default.dim("Type your message. Ctrl+C to exit.\n"));
25
+ }
26
+ function printTextDelta(text) {
27
+ process.stdout.write(text);
28
+ }
29
+ function printTurnEnd(costUsd) {
30
+ const costStr = costUsd > 0 ? chalk_1.default.dim(` [$${costUsd.toFixed(4)}]`) : "";
31
+ process.stdout.write(`\n${costStr}\n\n`);
32
+ }
33
+ function printError(message) {
34
+ console.error(chalk_1.default.red(`\nError: ${message}\n`));
35
+ }
36
+ function printSessionList(sessions) {
37
+ if (sessions.length === 0) {
38
+ console.log(chalk_1.default.dim("No sessions found."));
39
+ return;
40
+ }
41
+ console.log(chalk_1.default.bold("\nSessions:\n"));
42
+ for (const s of sessions) {
43
+ const name = s.session_name || chalk_1.default.dim("(unnamed)");
44
+ const id = chalk_1.default.dim(s.id.slice(0, 8));
45
+ const turns = `${s.message_count} turns`;
46
+ const cost = `$${Number(s.total_cost_usd).toFixed(4)}`;
47
+ const lastActive = new Date(s.last_active_at).toLocaleString();
48
+ const status = s.status === "active" ? chalk_1.default.green("●") : chalk_1.default.dim("○");
49
+ console.log(` ${status} ${name} ${id}`);
50
+ console.log(chalk_1.default.dim(` ${turns} · ${cost} · last active ${lastActive}`));
51
+ console.log();
52
+ }
53
+ console.log(chalk_1.default.dim("Resume: xiaotime dev --session <id>"));
54
+ }
55
+ function printPrompt() {
56
+ process.stdout.write(chalk_1.default.bold("you: "));
57
+ }
58
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../src/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * xiaotime — Terminal Developer CLI
4
+ *
5
+ * Usage:
6
+ * xiaotime login # authenticate via Discord OAuth
7
+ * xiaotime dev # new session
8
+ * xiaotime dev --session <id> # resume existing session
9
+ * xiaotime dev --name "my session" # new session with name
10
+ * xiaotime dev --list # list sessions
11
+ * xiaotime dev --archive <id> # archive a session
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
package/dist/index.js ADDED
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * xiaotime — Terminal Developer CLI
5
+ *
6
+ * Usage:
7
+ * xiaotime login # authenticate via Discord OAuth
8
+ * xiaotime dev # new session
9
+ * xiaotime dev --session <id> # resume existing session
10
+ * xiaotime dev --name "my session" # new session with name
11
+ * xiaotime dev --list # list sessions
12
+ * xiaotime dev --archive <id> # archive a session
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const session_js_1 = require("./session.js");
16
+ const ws_js_1 = require("./ws.js");
17
+ const display_js_1 = require("./display.js");
18
+ const auth_js_1 = require("./auth.js");
19
+ async function main() {
20
+ const args = process.argv.slice(2);
21
+ const cmd = args[0];
22
+ // xiaotime login
23
+ if (cmd === "login") {
24
+ await (0, auth_js_1.runLogin)();
25
+ return;
26
+ }
27
+ // xiaotime dev [subcommand] [flags]
28
+ if (cmd === "--list" || cmd === "list") {
29
+ const sessions = await (0, session_js_1.listSessions)();
30
+ (0, display_js_1.printSessionList)(sessions);
31
+ return;
32
+ }
33
+ if (cmd === "--archive" || cmd === "archive") {
34
+ const id = args[1];
35
+ if (!id) {
36
+ console.error("Usage: xiaotime dev --archive <session-id>");
37
+ process.exit(1);
38
+ }
39
+ await (0, session_js_1.archiveSession)(id);
40
+ console.log(`Archived session ${id}`);
41
+ return;
42
+ }
43
+ // Resume or create
44
+ let sessionId;
45
+ const sessionFlagIdx = args.indexOf("--session");
46
+ if (sessionFlagIdx !== -1) {
47
+ sessionId = args[sessionFlagIdx + 1];
48
+ if (!sessionId) {
49
+ console.error("Usage: xiaotime dev --session <session-id>");
50
+ process.exit(1);
51
+ }
52
+ // Verify it exists
53
+ try {
54
+ await (0, session_js_1.getSession)(sessionId);
55
+ }
56
+ catch {
57
+ (0, display_js_1.printError)(`Session ${sessionId} not found.`);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ else {
62
+ // New session
63
+ const nameFlagIdx = args.indexOf("--name");
64
+ const sessionName = nameFlagIdx !== -1 ? args[nameFlagIdx + 1] : undefined;
65
+ const session = await (0, session_js_1.createSession)(sessionName, process.cwd());
66
+ sessionId = session.id;
67
+ }
68
+ await (0, ws_js_1.runSession)(sessionId);
69
+ }
70
+ main().catch((err) => {
71
+ console.error("Fatal:", err.message || err);
72
+ process.exit(1);
73
+ });
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;GAUG;;AAEH,6CAAuF;AACvF,mCAAqC;AACrC,6CAA4D;AAC5D,uCAAqC;AAErC,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,iBAAiB;IACjB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,IAAA,kBAAQ,GAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAY,GAAE,CAAC;QACtC,IAAA,6BAAgB,EAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAA,2BAAc,EAAC,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAiB,CAAC;IAEtB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,SAAS,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,IAAA,uBAAU,EAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,IAAA,uBAAU,EAAC,WAAW,SAAS,aAAa,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAa,EAAC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Session management — REST calls to terminal-orchestrator.
3
+ */
4
+ export interface Session {
5
+ id: string;
6
+ session_name: string | null;
7
+ tenant_id: string;
8
+ status: string;
9
+ context: Record<string, unknown>;
10
+ created_at: string;
11
+ last_active_at: string;
12
+ message_count: number;
13
+ total_cost_usd: number;
14
+ }
15
+ export declare function createSession(sessionName?: string, cwd?: string): Promise<Session>;
16
+ export declare function listSessions(): Promise<Session[]>;
17
+ export declare function getSession(sessionId: string): Promise<Session>;
18
+ export declare function archiveSession(sessionId: string): Promise<void>;
19
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAmBD,wBAAsB,aAAa,CACjC,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAEvD;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * Session management — REST calls to terminal-orchestrator.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSession = createSession;
7
+ exports.listSessions = listSessions;
8
+ exports.getSession = getSession;
9
+ exports.archiveSession = archiveSession;
10
+ const config_js_1 = require("./config.js");
11
+ const auth_js_1 = require("./auth.js");
12
+ async function apiFetch(path, options = {}) {
13
+ const url = `${config_js_1.ORCHESTRATOR_URL}${path}`;
14
+ const res = await fetch(url, {
15
+ ...options,
16
+ headers: {
17
+ "Content-Type": "application/json",
18
+ "x-api-key": (0, auth_js_1.getToken)(),
19
+ ...(options.headers || {}),
20
+ },
21
+ });
22
+ if (!res.ok) {
23
+ const body = await res.text();
24
+ throw new Error(`HTTP ${res.status}: ${body}`);
25
+ }
26
+ return res.json();
27
+ }
28
+ async function createSession(sessionName, cwd = process.cwd()) {
29
+ return apiFetch("/terminal/sessions", {
30
+ method: "POST",
31
+ body: JSON.stringify({
32
+ session_name: sessionName || null,
33
+ tenant_id: "harvey",
34
+ cwd,
35
+ }),
36
+ });
37
+ }
38
+ async function listSessions() {
39
+ return apiFetch("/terminal/sessions?tenant_id=harvey");
40
+ }
41
+ async function getSession(sessionId) {
42
+ return apiFetch(`/terminal/sessions/${sessionId}`);
43
+ }
44
+ async function archiveSession(sessionId) {
45
+ await apiFetch(`/terminal/sessions/${sessionId}`, { method: "DELETE" });
46
+ }
47
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAkCH,sCAYC;AAED,oCAEC;AAED,gCAEC;AAED,wCAEC;AAxDD,2CAA+C;AAC/C,uCAAqC;AAcrC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,UAAuB,EAAE;IAC7D,MAAM,GAAG,GAAG,GAAG,4BAAgB,GAAG,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAA,kBAAQ,GAAE;YACvB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,WAAoB,EACpB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,OAAO,QAAQ,CAAC,oBAAoB,EAAE;QACpC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,WAAW,IAAI,IAAI;YACjC,SAAS,EAAE,QAAQ;YACnB,GAAG;SACJ,CAAC;KACH,CAAqB,CAAC;AACzB,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,OAAO,QAAQ,CAAC,qCAAqC,CAAuB,CAAC;AAC/E,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,OAAO,QAAQ,CAAC,sBAAsB,SAAS,EAAE,CAAqB,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,MAAM,QAAQ,CAAC,sBAAsB,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Local tool execution + approval gate.
3
+ *
4
+ * All tools execute on Harvey's machine. write_file and shell_command
5
+ * require explicit y/N approval before executing.
6
+ */
7
+ export interface ToolCall {
8
+ tool_use_id: string;
9
+ name: string;
10
+ input: Record<string, unknown>;
11
+ }
12
+ export interface ToolResult {
13
+ tool_use_id: string;
14
+ content: string;
15
+ is_error: boolean;
16
+ }
17
+ export declare function setSessionCwd(cwd: string): void;
18
+ export declare function executeTool(call: ToolCall): Promise<ToolResult>;
19
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,QAExC;AAmBD,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAwJrE"}
package/dist/tools.js ADDED
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ /**
3
+ * Local tool execution + approval gate.
4
+ *
5
+ * All tools execute on Harvey's machine. write_file and shell_command
6
+ * require explicit y/N approval before executing.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.setSessionCwd = setSessionCwd;
46
+ exports.executeTool = executeTool;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const child_process = __importStar(require("child_process"));
50
+ const readline = __importStar(require("readline"));
51
+ const diff_1 = require("diff");
52
+ const chalk_1 = __importDefault(require("chalk"));
53
+ // Session cwd — set on connect
54
+ let sessionCwd = process.cwd();
55
+ function setSessionCwd(cwd) {
56
+ sessionCwd = cwd;
57
+ }
58
+ function resolvePath(p) {
59
+ return path.isAbsolute(p) ? p : path.resolve(sessionCwd, p);
60
+ }
61
+ async function promptApproval(prompt) {
62
+ const rl = readline.createInterface({
63
+ input: process.stdin,
64
+ output: process.stdout,
65
+ });
66
+ return new Promise((resolve) => {
67
+ rl.question(`${prompt} [y/N]: `, (answer) => {
68
+ rl.close();
69
+ resolve(answer.toLowerCase() === "y");
70
+ });
71
+ });
72
+ }
73
+ async function executeTool(call) {
74
+ const { tool_use_id, name, input } = call;
75
+ try {
76
+ switch (name) {
77
+ case "read_file": {
78
+ const filePath = resolvePath(input.path);
79
+ const content = fs.readFileSync(filePath, "utf-8");
80
+ const lines = content.split("\n");
81
+ const offset = (input.offset || 1) - 1;
82
+ const limit = input.limit;
83
+ const slice = limit ? lines.slice(offset, offset + limit) : lines.slice(offset);
84
+ const result = slice.map((l, i) => `${offset + i + 1}: ${l}`).join("\n");
85
+ console.log(chalk_1.default.dim(` [read_file] ${filePath} (${slice.length} lines)`));
86
+ return { tool_use_id, content: result, is_error: false };
87
+ }
88
+ case "write_file": {
89
+ const filePath = resolvePath(input.path);
90
+ const newContent = input.content;
91
+ let oldContent = "";
92
+ if (fs.existsSync(filePath)) {
93
+ oldContent = fs.readFileSync(filePath, "utf-8");
94
+ }
95
+ const patch = (0, diff_1.createPatch)(filePath, oldContent, newContent);
96
+ const lines = patch.split("\n").slice(4); // skip header
97
+ const colored = lines.map((l) => {
98
+ if (l.startsWith("+"))
99
+ return chalk_1.default.green(l);
100
+ if (l.startsWith("-"))
101
+ return chalk_1.default.red(l);
102
+ return chalk_1.default.dim(l);
103
+ });
104
+ console.log(chalk_1.default.yellow(`\n[write_file] ${filePath}`));
105
+ console.log(colored.join("\n"));
106
+ const approved = await promptApproval("Approve?");
107
+ if (!approved) {
108
+ return { tool_use_id, content: "Write cancelled by user.", is_error: false };
109
+ }
110
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
111
+ fs.writeFileSync(filePath, newContent, "utf-8");
112
+ console.log(chalk_1.default.green(` ✓ Written`));
113
+ return { tool_use_id, content: `File written: ${filePath}`, is_error: false };
114
+ }
115
+ case "list_directory": {
116
+ const dirPath = resolvePath(input.path);
117
+ const pattern = input.pattern;
118
+ const recursive = input.recursive;
119
+ let entries = [];
120
+ if (recursive) {
121
+ entries = listRecursive(dirPath, pattern);
122
+ }
123
+ else {
124
+ entries = fs.readdirSync(dirPath).map((e) => {
125
+ const full = path.join(dirPath, e);
126
+ const stat = fs.statSync(full);
127
+ return stat.isDirectory() ? `${e}/` : e;
128
+ });
129
+ if (pattern) {
130
+ const regex = globToRegex(pattern);
131
+ entries = entries.filter((e) => regex.test(e));
132
+ }
133
+ }
134
+ console.log(chalk_1.default.dim(` [list_directory] ${dirPath} (${entries.length} entries)`));
135
+ return { tool_use_id, content: entries.join("\n"), is_error: false };
136
+ }
137
+ case "shell_command": {
138
+ const command = input.command;
139
+ const cwd = input.cwd ? resolvePath(input.cwd) : sessionCwd;
140
+ console.log(chalk_1.default.yellow(`\n[shell_command] ${command}`));
141
+ console.log(chalk_1.default.dim(` cwd: ${cwd}`));
142
+ const approved = await promptApproval("Run?");
143
+ if (!approved) {
144
+ return { tool_use_id, content: "Command cancelled by user.", is_error: false };
145
+ }
146
+ const result = child_process.execSync(command, {
147
+ cwd,
148
+ encoding: "utf-8",
149
+ stdio: ["pipe", "pipe", "pipe"],
150
+ timeout: 60000,
151
+ });
152
+ console.log(chalk_1.default.dim(result.slice(0, 500)));
153
+ return { tool_use_id, content: result, is_error: false };
154
+ }
155
+ case "git_status": {
156
+ const out = child_process.execSync("git status", {
157
+ cwd: sessionCwd,
158
+ encoding: "utf-8",
159
+ });
160
+ console.log(chalk_1.default.dim(` [git_status]`));
161
+ return { tool_use_id, content: out, is_error: false };
162
+ }
163
+ case "git_diff": {
164
+ const staged = input.staged;
165
+ const filePath = input.path;
166
+ const args = staged ? "diff --staged" : "diff";
167
+ const cmd = filePath ? `git ${args} -- ${filePath}` : `git ${args}`;
168
+ const out = child_process.execSync(cmd, {
169
+ cwd: sessionCwd,
170
+ encoding: "utf-8",
171
+ });
172
+ console.log(chalk_1.default.dim(` [git_diff${staged ? " --staged" : ""}]`));
173
+ return { tool_use_id, content: out || "(no changes)", is_error: false };
174
+ }
175
+ case "git_commit": {
176
+ const message = input.message;
177
+ // Show what's staged
178
+ const staged = child_process.execSync("git diff --staged --stat", {
179
+ cwd: sessionCwd,
180
+ encoding: "utf-8",
181
+ });
182
+ console.log(chalk_1.default.yellow(`\n[git_commit]`));
183
+ console.log(chalk_1.default.dim(`Staged:\n${staged}`));
184
+ console.log(chalk_1.default.dim(`Message: ${message}`));
185
+ const approved = await promptApproval("Commit?");
186
+ if (!approved) {
187
+ return { tool_use_id, content: "Commit cancelled by user.", is_error: false };
188
+ }
189
+ const out = child_process.execSync(`git commit -m ${JSON.stringify(message)}`, { cwd: sessionCwd, encoding: "utf-8" });
190
+ console.log(chalk_1.default.green(` ✓ Committed`));
191
+ return { tool_use_id, content: out, is_error: false };
192
+ }
193
+ default:
194
+ return {
195
+ tool_use_id,
196
+ content: `Unknown tool: ${name}`,
197
+ is_error: true,
198
+ };
199
+ }
200
+ }
201
+ catch (err) {
202
+ const msg = err instanceof Error ? err.message : String(err);
203
+ return { tool_use_id, content: msg, is_error: true };
204
+ }
205
+ }
206
+ function listRecursive(dir, pattern) {
207
+ const results = [];
208
+ const regex = pattern ? globToRegex(pattern) : null;
209
+ function walk(current, rel) {
210
+ const entries = fs.readdirSync(current);
211
+ for (const entry of entries) {
212
+ if (entry.startsWith("."))
213
+ continue;
214
+ const full = path.join(current, entry);
215
+ const relPath = path.join(rel, entry);
216
+ const stat = fs.statSync(full);
217
+ if (stat.isDirectory()) {
218
+ walk(full, relPath + "/");
219
+ }
220
+ else {
221
+ if (!regex || regex.test(relPath)) {
222
+ results.push(relPath);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ walk(dir, "");
228
+ return results;
229
+ }
230
+ function globToRegex(glob) {
231
+ const escaped = glob
232
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
233
+ .replace(/\*\*/g, ".*")
234
+ .replace(/\*/g, "[^/]*")
235
+ .replace(/\?/g, "[^/]");
236
+ return new RegExp(escaped);
237
+ }
238
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/ws.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * WebSocket connection and main message loop.
3
+ */
4
+ export declare function runSession(sessionId: string): Promise<void>;
5
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0HjE"}
package/dist/ws.js ADDED
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocket connection and main message loop.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.runSession = runSession;
43
+ const ws_1 = __importDefault(require("ws"));
44
+ const readline = __importStar(require("readline"));
45
+ const config_js_1 = require("./config.js");
46
+ const auth_js_1 = require("./auth.js");
47
+ const tools_js_1 = require("./tools.js");
48
+ const display_js_1 = require("./display.js");
49
+ async function runSession(sessionId) {
50
+ const wsUrl = `${config_js_1.WS_URL}/terminal/sessions/${sessionId}/stream`;
51
+ return new Promise((resolve, reject) => {
52
+ const ws = new ws_1.default(wsUrl);
53
+ let connected = false;
54
+ let waitingForToolResult = false;
55
+ let pendingResolve = null;
56
+ // ── Readline for user input ───────────────────────────────────
57
+ const rl = readline.createInterface({
58
+ input: process.stdin,
59
+ output: process.stdout,
60
+ terminal: true,
61
+ });
62
+ ws.on("open", () => {
63
+ // Auth
64
+ ws.send(JSON.stringify({ type: "auth", token: (0, auth_js_1.getToken)() }));
65
+ // Connect with cwd
66
+ ws.send(JSON.stringify({ type: "connect", cwd: process.cwd() }));
67
+ });
68
+ ws.on("message", async (raw) => {
69
+ const msg = JSON.parse(raw.toString());
70
+ switch (msg.type) {
71
+ case "connected":
72
+ connected = true;
73
+ (0, tools_js_1.setSessionCwd)(process.cwd());
74
+ (0, display_js_1.printWelcome)(msg.session_id, msg.session_name, msg.resumed, msg.message_count);
75
+ promptUser();
76
+ break;
77
+ case "text_delta":
78
+ (0, display_js_1.printTextDelta)(msg.content);
79
+ break;
80
+ case "tool_call":
81
+ waitingForToolResult = true;
82
+ (0, tools_js_1.executeTool)({
83
+ tool_use_id: msg.tool_use_id,
84
+ name: msg.name,
85
+ input: msg.input,
86
+ }).then((result) => {
87
+ waitingForToolResult = false;
88
+ ws.send(JSON.stringify({
89
+ type: "tool_result",
90
+ tool_use_id: result.tool_use_id,
91
+ content: result.content,
92
+ is_error: result.is_error,
93
+ }));
94
+ });
95
+ break;
96
+ case "message_stop":
97
+ (0, display_js_1.printTurnEnd)(msg.cost_usd || 0);
98
+ promptUser();
99
+ break;
100
+ case "error":
101
+ (0, display_js_1.printError)(msg.message);
102
+ if (!connected) {
103
+ ws.close();
104
+ reject(new Error(msg.message));
105
+ }
106
+ else {
107
+ promptUser();
108
+ }
109
+ break;
110
+ case "pong":
111
+ break;
112
+ }
113
+ });
114
+ ws.on("close", () => {
115
+ rl.close();
116
+ resolve();
117
+ });
118
+ ws.on("error", (err) => {
119
+ rl.close();
120
+ reject(err);
121
+ });
122
+ // ── Ping keepalive ────────────────────────────────────────────
123
+ const pingInterval = setInterval(() => {
124
+ if (ws.readyState === ws_1.default.OPEN) {
125
+ ws.send(JSON.stringify({ type: "ping" }));
126
+ }
127
+ }, 30000);
128
+ ws.on("close", () => clearInterval(pingInterval));
129
+ // ── User input ────────────────────────────────────────────────
130
+ function promptUser() {
131
+ if (!connected || waitingForToolResult)
132
+ return;
133
+ (0, display_js_1.printPrompt)();
134
+ rl.once("line", (line) => {
135
+ const text = line.trim();
136
+ if (!text) {
137
+ promptUser();
138
+ return;
139
+ }
140
+ if (ws.readyState === ws_1.default.OPEN) {
141
+ ws.send(JSON.stringify({ type: "message", content: text }));
142
+ }
143
+ });
144
+ }
145
+ // Ctrl+C
146
+ rl.on("close", () => {
147
+ console.log("\nSession paused. Resume with: xiaotime dev --session " + sessionId);
148
+ ws.close();
149
+ });
150
+ });
151
+ }
152
+ //# sourceMappingURL=ws.js.map
package/dist/ws.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "xiaotime",
3
+ "version": "0.1.0",
4
+ "description": "Xiaotime Developer — persistent-memory AI coding assistant",
5
+ "bin": {
6
+ "xiaotime": "./dist/index.js"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "files": [
10
+ "dist/"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "ts-node src/index.ts",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "dependencies": {
18
+ "ws": "^8.18.0",
19
+ "diff": "^5.2.0",
20
+ "chalk": "^4.1.2"
21
+ },
22
+ "devDependencies": {
23
+ "@types/ws": "^8.5.12",
24
+ "@types/diff": "^5.2.3",
25
+ "@types/node": "^22.0.0",
26
+ "typescript": "^5.7.0",
27
+ "ts-node": "^10.9.2"
28
+ },
29
+ "engines": {
30
+ "node": ">=18.0.0"
31
+ }
32
+ }