@claude-tools-i-use/teleport 1.0.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/api.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { TeleportPayload, TeleportResponse, TeleportReturnPayload } from "./types.js";
2
+ /**
3
+ * Upload a teleport payload and get back a URL
4
+ */
5
+ export declare function uploadTeleport(payload: TeleportPayload): Promise<TeleportResponse>;
6
+ /**
7
+ * Fetch a teleport payload by ID
8
+ */
9
+ export declare function fetchTeleport(teleportId: string): Promise<TeleportPayload>;
10
+ /**
11
+ * Fetch return payload (messages added in web)
12
+ */
13
+ export declare function fetchReturnPayload(teleportId: string): Promise<TeleportReturnPayload | null>;
14
+ /**
15
+ * Submit return payload (from web to CLI)
16
+ */
17
+ export declare function submitReturnPayload(teleportId: string, payload: TeleportReturnPayload): Promise<void>;
18
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAmB3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAW1B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAWvC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAef"}
package/dist/api.js ADDED
@@ -0,0 +1,62 @@
1
+ const API_BASE = process.env.TELEPORT_API_URL || "https://tools.joshduffy.dev";
2
+ /**
3
+ * Upload a teleport payload and get back a URL
4
+ */
5
+ export async function uploadTeleport(payload) {
6
+ const response = await fetch(`${API_BASE}/api/teleport`, {
7
+ method: "POST",
8
+ headers: {
9
+ "Content-Type": "application/json",
10
+ },
11
+ body: JSON.stringify(payload),
12
+ });
13
+ if (!response.ok) {
14
+ const error = await response
15
+ .json()
16
+ .catch(() => ({ error: "Unknown error" }));
17
+ throw new Error(`Failed to upload teleport: ${error.error || response.statusText}`);
18
+ }
19
+ return response.json();
20
+ }
21
+ /**
22
+ * Fetch a teleport payload by ID
23
+ */
24
+ export async function fetchTeleport(teleportId) {
25
+ const response = await fetch(`${API_BASE}/api/teleport/${teleportId}`);
26
+ if (!response.ok) {
27
+ if (response.status === 404) {
28
+ throw new Error("Teleport not found or expired");
29
+ }
30
+ throw new Error(`Failed to fetch teleport: ${response.statusText}`);
31
+ }
32
+ return response.json();
33
+ }
34
+ /**
35
+ * Fetch return payload (messages added in web)
36
+ */
37
+ export async function fetchReturnPayload(teleportId) {
38
+ const response = await fetch(`${API_BASE}/api/teleport/${teleportId}/return`);
39
+ if (!response.ok) {
40
+ if (response.status === 404) {
41
+ return null; // No return payload yet
42
+ }
43
+ throw new Error(`Failed to fetch return payload: ${response.statusText}`);
44
+ }
45
+ return response.json();
46
+ }
47
+ /**
48
+ * Submit return payload (from web to CLI)
49
+ */
50
+ export async function submitReturnPayload(teleportId, payload) {
51
+ const response = await fetch(`${API_BASE}/api/teleport/${teleportId}/return`, {
52
+ method: "POST",
53
+ headers: {
54
+ "Content-Type": "application/json",
55
+ },
56
+ body: JSON.stringify(payload),
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(`Failed to submit return payload: ${response.statusText}`);
60
+ }
61
+ }
62
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,6BAA6B,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAwB;IAExB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ;aACzB,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,8BAA+B,KAA4B,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAA+B,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAEvE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAA8B,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,iBAAiB,UAAU,SAAS,CAAC,CAAC;IAE9E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACvC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAoC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,QAAQ,iBAAiB,UAAU,SAAS,EAC/C;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "commander";
3
+ import open from "open";
4
+ import { listSessions, getCurrentSession, findSession, createTeleportPayload, } from "./session.js";
5
+ import { uploadTeleport, fetchTeleport, fetchReturnPayload } from "./api.js";
6
+ program
7
+ .name("teleport")
8
+ .description("Teleport Claude Code sessions to web for reading/refining")
9
+ .version("1.0.0");
10
+ program
11
+ .command("send")
12
+ .description("Teleport current or specified session to web")
13
+ .option("-s, --session <id>", "Session ID to teleport (default: most recent)")
14
+ .option("-e, --exchanges <n>", "Number of recent exchanges to include", "5")
15
+ .option("--no-summary", "Don't include summary of older context")
16
+ .option("--no-open", "Don't automatically open browser")
17
+ .action(async (options) => {
18
+ try {
19
+ let session;
20
+ if (options.session) {
21
+ session = await findSession(options.session);
22
+ if (!session) {
23
+ console.error(`Session not found: ${options.session}`);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ else {
28
+ session = await getCurrentSession();
29
+ if (!session) {
30
+ console.error("No sessions found. Run Claude Code first.");
31
+ process.exit(1);
32
+ }
33
+ }
34
+ console.log(`Teleporting session: ${session.firstPrompt.slice(0, 50)}...`);
35
+ console.log(` Project: ${session.projectPath}`);
36
+ const { payload, stats } = await createTeleportPayload(session, {
37
+ recentExchanges: parseInt(options.exchanges, 10),
38
+ includeSummary: options.summary,
39
+ });
40
+ const payloadSize = JSON.stringify(payload).length;
41
+ console.log(`\n Windowing:`);
42
+ console.log(` Total exchanges: ${stats.totalExchanges}`);
43
+ console.log(` Included: ${stats.includedExchanges} recent`);
44
+ if (stats.excludedExchanges > 0) {
45
+ console.log(` Summarized: ${stats.excludedExchanges} older`);
46
+ }
47
+ console.log(` Messages: ${payload.messages.length}`);
48
+ console.log(` Size: ${(payloadSize / 1024).toFixed(1)}KB`);
49
+ console.log(` Est. tokens: ~${stats.estimatedTokens.toLocaleString()}`);
50
+ console.log("\nUploading...");
51
+ const response = await uploadTeleport(payload);
52
+ console.log(`\n✓ Teleport ready!`);
53
+ console.log(` URL: ${response.url}`);
54
+ console.log(` Expires: ${new Date(response.expiresAt).toLocaleString()}`);
55
+ if (options.open) {
56
+ console.log("\nOpening in browser...");
57
+ await open(response.url);
58
+ }
59
+ console.log("\nRefine your conversation in the browser, then teleport back.");
60
+ }
61
+ catch (error) {
62
+ console.error("Error:", error instanceof Error ? error.message : String(error));
63
+ process.exit(1);
64
+ }
65
+ });
66
+ program
67
+ .command("receive <teleport-id>")
68
+ .description("Import a teleport return payload into CLI")
69
+ .action(async (teleportId) => {
70
+ try {
71
+ console.log(`Checking for return payload: ${teleportId}`);
72
+ const returnPayload = await fetchReturnPayload(teleportId);
73
+ if (!returnPayload) {
74
+ console.log("No return payload yet. Continue refining in the browser.");
75
+ console.log("Run this command again when ready to merge.");
76
+ return;
77
+ }
78
+ console.log(`\n✓ Found ${returnPayload.newMessages.length} new messages!`);
79
+ console.log("\nNew messages from web:");
80
+ for (const msg of returnPayload.newMessages) {
81
+ const preview = msg.content.slice(0, 100) + (msg.content.length > 100 ? "..." : "");
82
+ console.log(` [${msg.role}] ${preview}`);
83
+ }
84
+ // TODO: Actually merge into local session JSONL
85
+ console.log("\n⚠ Note: Auto-merge not yet implemented.");
86
+ console.log("The new messages have been displayed above for manual reference.");
87
+ }
88
+ catch (error) {
89
+ console.error("Error:", error instanceof Error ? error.message : String(error));
90
+ process.exit(1);
91
+ }
92
+ });
93
+ program
94
+ .command("list")
95
+ .description("List available sessions")
96
+ .option("-n, --limit <number>", "Number of sessions to show", "10")
97
+ .action(async (options) => {
98
+ try {
99
+ const sessions = await listSessions();
100
+ const limit = parseInt(options.limit, 10);
101
+ if (sessions.length === 0) {
102
+ console.log("No sessions found.");
103
+ return;
104
+ }
105
+ console.log(`Recent sessions (showing ${Math.min(limit, sessions.length)} of ${sessions.length}):\n`);
106
+ for (const session of sessions.slice(0, limit)) {
107
+ const modified = new Date(session.modified).toLocaleString();
108
+ const prompt = session.firstPrompt.slice(0, 60);
109
+ console.log(`${session.sessionId.slice(0, 8)} ${modified}`);
110
+ console.log(` ${prompt}${session.firstPrompt.length > 60 ? "..." : ""}`);
111
+ console.log(` ${session.projectPath} (${session.messageCount} messages)`);
112
+ console.log();
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.error("Error:", error instanceof Error ? error.message : String(error));
117
+ process.exit(1);
118
+ }
119
+ });
120
+ program
121
+ .command("view <teleport-id>")
122
+ .description("View a teleport payload (for debugging)")
123
+ .action(async (teleportId) => {
124
+ try {
125
+ const payload = await fetchTeleport(teleportId);
126
+ console.log("Teleport Payload:");
127
+ console.log(` Session: ${payload.sessionId}`);
128
+ console.log(` Messages: ${payload.messages.length}`);
129
+ console.log(` Model: ${payload.model}`);
130
+ console.log(` Working Dir: ${payload.context.workingDirectory}`);
131
+ console.log(` Git Branch: ${payload.context.gitBranch || "(none)"}`);
132
+ console.log(` Created: ${payload.created}`);
133
+ console.log("\nMessages:");
134
+ for (const msg of payload.messages) {
135
+ const preview = msg.content.slice(0, 100) + (msg.content.length > 100 ? "..." : "");
136
+ const time = new Date(msg.timestamp).toLocaleTimeString();
137
+ console.log(` [${time}] ${msg.role}: ${preview}`);
138
+ }
139
+ }
140
+ catch (error) {
141
+ console.error("Error:", error instanceof Error ? error.message : String(error));
142
+ process.exit(1);
143
+ }
144
+ });
145
+ // Default command (no subcommand) - same as 'send'
146
+ program
147
+ .argument("[session-id]", "Session ID to teleport (default: most recent)")
148
+ .option("--no-open", "Don't automatically open browser")
149
+ .action(async (sessionId, _options) => {
150
+ // If no arguments and no options, show help
151
+ if (!sessionId && process.argv.length === 2) {
152
+ program.help();
153
+ return;
154
+ }
155
+ // Otherwise, run send command
156
+ await program.commands
157
+ .find((c) => c.name() === "send")
158
+ .parseAsync(sessionId
159
+ ? ["node", "teleport", "send", "-s", sessionId]
160
+ : ["node", "teleport", "send"]);
161
+ });
162
+ program.parse();
163
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { ClaudeSessionMessage, SessionEntry, TeleportMessage, TeleportPayload } from "./types.js";
2
+ export interface TeleportOptions {
3
+ recentExchanges: number;
4
+ includeSummary: boolean;
5
+ maxTokens: number;
6
+ }
7
+ /**
8
+ * Get list of all available sessions across all projects
9
+ */
10
+ export declare function listSessions(): Promise<SessionEntry[]>;
11
+ /**
12
+ * Get the most recent session
13
+ */
14
+ export declare function getMostRecentSession(): Promise<SessionEntry | null>;
15
+ /**
16
+ * Find a session by ID
17
+ */
18
+ export declare function findSession(sessionId: string): Promise<SessionEntry | null>;
19
+ /**
20
+ * Read and parse a session's JSONL file
21
+ */
22
+ export declare function readSessionMessages(sessionPath: string): Promise<ClaudeSessionMessage[]>;
23
+ /**
24
+ * Convert Claude session messages to teleport format
25
+ */
26
+ export declare function convertToTeleportMessages(messages: ClaudeSessionMessage[]): TeleportMessage[];
27
+ /**
28
+ * Apply exchange windowing to reduce payload size
29
+ */
30
+ export declare function applyExchangeWindowing(messages: TeleportMessage[], options?: TeleportOptions): {
31
+ messages: TeleportMessage[];
32
+ summary: string | null;
33
+ stats: WindowingStats;
34
+ };
35
+ export interface WindowingStats {
36
+ totalExchanges: number;
37
+ includedExchanges: number;
38
+ excludedExchanges: number;
39
+ estimatedTokens: number;
40
+ }
41
+ /**
42
+ * Create a teleport payload from a session with exchange windowing
43
+ */
44
+ export declare function createTeleportPayload(session: SessionEntry, options?: Partial<TeleportOptions>): Promise<{
45
+ payload: TeleportPayload;
46
+ stats: WindowingStats;
47
+ }>;
48
+ /**
49
+ * Get current session from environment or most recent
50
+ */
51
+ export declare function getCurrentSession(): Promise<SessionEntry | null>;
52
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EAGpB,YAAY,EACZ,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CA0B5D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG9B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAmBjC;AAmLD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,eAAe,EAAE,CAgCnB;AA2ED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,GAAE,eAAiC,GACzC;IACD,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;CACvB,CAoDA;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GACrC,OAAO,CAAC;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC,CA4C9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAUtE"}
@@ -0,0 +1,422 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ const CLAUDE_DIR = join(homedir(), ".claude");
6
+ const PROJECTS_DIR = join(CLAUDE_DIR, "projects");
7
+ const DEFAULT_OPTIONS = {
8
+ recentExchanges: 5,
9
+ includeSummary: true,
10
+ maxTokens: 10000,
11
+ };
12
+ /**
13
+ * Get list of all available sessions across all projects
14
+ */
15
+ export async function listSessions() {
16
+ const allSessions = [];
17
+ if (!existsSync(PROJECTS_DIR)) {
18
+ return allSessions;
19
+ }
20
+ const projectDirs = await readdir(PROJECTS_DIR);
21
+ for (const projectDir of projectDirs) {
22
+ const indexPath = join(PROJECTS_DIR, projectDir, "sessions-index.json");
23
+ if (existsSync(indexPath)) {
24
+ try {
25
+ const indexContent = await readFile(indexPath, "utf-8");
26
+ const index = JSON.parse(indexContent);
27
+ allSessions.push(...index.entries);
28
+ }
29
+ catch {
30
+ // Skip malformed index files
31
+ }
32
+ }
33
+ }
34
+ // Sort by modified date, most recent first
35
+ return allSessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
36
+ }
37
+ /**
38
+ * Get the most recent session
39
+ */
40
+ export async function getMostRecentSession() {
41
+ const sessions = await listSessions();
42
+ return sessions[0] || null;
43
+ }
44
+ /**
45
+ * Find a session by ID
46
+ */
47
+ export async function findSession(sessionId) {
48
+ const sessions = await listSessions();
49
+ return sessions.find((s) => s.sessionId === sessionId) || null;
50
+ }
51
+ /**
52
+ * Read and parse a session's JSONL file
53
+ */
54
+ export async function readSessionMessages(sessionPath) {
55
+ const content = await readFile(sessionPath, "utf-8");
56
+ const lines = content.trim().split("\n");
57
+ const messages = [];
58
+ for (const line of lines) {
59
+ if (!line.trim())
60
+ continue;
61
+ try {
62
+ const msg = JSON.parse(line);
63
+ // Only include actual user/assistant messages, not tool results embedded in user messages
64
+ if (msg.type === "user" || msg.type === "assistant") {
65
+ messages.push(msg);
66
+ }
67
+ }
68
+ catch {
69
+ // Skip malformed lines
70
+ }
71
+ }
72
+ return messages;
73
+ }
74
+ /**
75
+ * Extract readable text content from a message
76
+ */
77
+ function extractTextContent(content) {
78
+ if (typeof content === "string") {
79
+ return content;
80
+ }
81
+ const textParts = [];
82
+ for (const block of content) {
83
+ if (block.type === "text") {
84
+ textParts.push(block.text);
85
+ }
86
+ else if (block.type === "tool_use") {
87
+ // Include tool use as summary
88
+ textParts.push(`[Tool: ${block.name}]`);
89
+ }
90
+ // Skip thinking blocks and tool results for readability
91
+ }
92
+ return textParts.join("\n\n");
93
+ }
94
+ /**
95
+ * Check if message content is noise that should be filtered
96
+ */
97
+ function isNoiseMessage(content) {
98
+ const noisePatterns = [
99
+ /^\[Request interrupted by user/i,
100
+ /^<task-notification>/i,
101
+ /^<system-reminder>/i,
102
+ /^Background command .* (completed|failed)/i,
103
+ /^Read the output file to retrieve the result:/i,
104
+ /\/private\/tmp\/claude\//,
105
+ /\.output\s+(completed|failed)/,
106
+ /^\[Tool: \w+\]$/, // Bare tool calls with no other content
107
+ ];
108
+ const trimmed = content.trim();
109
+ return noisePatterns.some((pattern) => pattern.test(trimmed));
110
+ }
111
+ /**
112
+ * Check if assistant message is low-value filler (e.g., "Let me check...")
113
+ */
114
+ function isFillerMessage(content) {
115
+ const trimmed = content.trim();
116
+ // Must be short to be considered filler (longer messages have substance)
117
+ if (trimmed.length > 200)
118
+ return false;
119
+ const fillerPatterns = [
120
+ // "Let me X" / "I'll X" patterns
121
+ /^(Let me|I'll|I will|I'm going to|I need to|I should) (check|read|look|explore|search|examine|review|find|see|verify|investigate|analyze|start|continue|begin)/i,
122
+ // "Looking at" / "Reading" patterns
123
+ /^(Looking at|Reading|Checking|Exploring|Searching|Examining|Reviewing|Finding|Investigating|Analyzing|Starting|Continuing)/i,
124
+ // "Now I'll" patterns
125
+ /^Now (let me|I'll|I will|I'm going to)/i,
126
+ // Short tool-only messages
127
+ /^(\[Tool: \w+\]\s*)+$/,
128
+ // Just acknowledgments
129
+ /^(OK|Okay|Sure|Alright|Got it|Understood)[.,!]?\s*$/i,
130
+ ];
131
+ return fillerPatterns.some((pattern) => pattern.test(trimmed));
132
+ }
133
+ /**
134
+ * Check if message is a Claude context compaction summary
135
+ */
136
+ function isCompactionSummary(content) {
137
+ const compactionPatterns = [
138
+ /^This session is being continued from a previous conversation/i,
139
+ /^This conversation is being continued from a previous session/i,
140
+ /^The summary below covers the earlier portion/i,
141
+ /^If you need specific details from before compaction/i,
142
+ ];
143
+ return compactionPatterns.some((pattern) => pattern.test(content.trim()));
144
+ }
145
+ /**
146
+ * Condense a compaction summary to just the key info
147
+ */
148
+ function condenseCompactionSummary(content) {
149
+ // Extract just the "Primary Request and Intent" or "Current Work" sections if present
150
+ const sections = [
151
+ /Primary Request and Intent[:\s]*([\s\S]*?)(?=Key Technical|Files and Code|Problem Solving|$)/i,
152
+ /Current Work[:\s]*([\s\S]*?)(?=Key Technical|Files and Code|Problem Solving|Optional Next|$)/i,
153
+ /Pending Tasks[:\s]*([\s\S]*?)(?=Current Work|Optional Next|$)/i,
154
+ ];
155
+ const extracted = [];
156
+ for (const pattern of sections) {
157
+ const match = content.match(pattern);
158
+ if (match && match[1]) {
159
+ const section = match[1].trim();
160
+ if (section.length > 20 && section.length < 500) {
161
+ extracted.push(section);
162
+ }
163
+ }
164
+ }
165
+ if (extracted.length > 0) {
166
+ return `[Compacted context: ${extracted.slice(0, 2).join(" | ")}]`.slice(0, 300);
167
+ }
168
+ // If no sections found, return null to skip entirely
169
+ return null;
170
+ }
171
+ /**
172
+ * Clean message content by removing system tags
173
+ */
174
+ function cleanMessageContent(content) {
175
+ return content
176
+ .replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, "")
177
+ .replace(/<task-notification>[\s\S]*?<\/task-notification>/g, "")
178
+ .trim();
179
+ }
180
+ /**
181
+ * Truncate large code blocks to save tokens
182
+ */
183
+ function truncateCodeBlocks(content, maxLines = 15) {
184
+ // Match fenced code blocks: ```lang\ncode\n```
185
+ const codeBlockRegex = /```(\w*)\n([\s\S]*?)```/g;
186
+ return content.replace(codeBlockRegex, (match, lang, code) => {
187
+ const lines = code.split("\n");
188
+ const lineCount = lines.length;
189
+ // Keep small code blocks as-is
190
+ if (lineCount <= maxLines) {
191
+ return match;
192
+ }
193
+ // Detect language from content if not specified
194
+ const detectedLang = lang || detectLanguage(code);
195
+ // Extract first few lines for context
196
+ const preview = lines.slice(0, 5).join("\n");
197
+ // Create truncated block with summary
198
+ return `\`\`\`${detectedLang}\n${preview}\n// ... ${lineCount - 5} more lines truncated\n\`\`\`\n[Code block: ${detectedLang || "code"}, ${lineCount} lines]`;
199
+ });
200
+ }
201
+ /**
202
+ * Simple language detection from code content
203
+ */
204
+ function detectLanguage(code) {
205
+ const patterns = [
206
+ [
207
+ /^import .* from ['"]|^export (const|function|class|interface|type)/m,
208
+ "typescript",
209
+ ],
210
+ [/^const |^let |^var |^function |=>\s*{/m, "javascript"],
211
+ [/^def |^class |^import |^from .* import/m, "python"],
212
+ [/^package |^func |^import "/m, "go"],
213
+ [/^use |^fn |^let mut |^impl /m, "rust"],
214
+ [/<\/?[a-z][\s\S]*>/i, "html"],
215
+ [/^\s*\{[\s\S]*"[\w]+":/m, "json"],
216
+ [/^#!\/(bin|usr)/m, "bash"],
217
+ ];
218
+ for (const [pattern, lang] of patterns) {
219
+ if (pattern.test(code))
220
+ return lang;
221
+ }
222
+ return "";
223
+ }
224
+ /**
225
+ * Convert Claude session messages to teleport format
226
+ */
227
+ export function convertToTeleportMessages(messages) {
228
+ const result = [];
229
+ for (const msg of messages) {
230
+ if (msg.isSidechain)
231
+ continue; // Skip sub-agent messages
232
+ let content = cleanMessageContent(extractTextContent(msg.message.content));
233
+ if (!content.trim())
234
+ continue;
235
+ if (isNoiseMessage(content))
236
+ continue;
237
+ // Filter low-value filler messages from assistant
238
+ if (msg.type === "assistant" && isFillerMessage(content))
239
+ continue;
240
+ // Handle verbose compaction summaries
241
+ if (isCompactionSummary(content)) {
242
+ const condensed = condenseCompactionSummary(content);
243
+ if (!condensed)
244
+ continue; // Skip if can't extract useful info
245
+ content = condensed;
246
+ }
247
+ // Truncate large code blocks to save tokens
248
+ content = truncateCodeBlocks(content);
249
+ result.push({
250
+ role: msg.type,
251
+ content,
252
+ timestamp: msg.timestamp,
253
+ });
254
+ }
255
+ return result;
256
+ }
257
+ /**
258
+ * Group messages into exchanges (user message + assistant response pairs)
259
+ */
260
+ function groupIntoExchanges(messages) {
261
+ const exchanges = [];
262
+ let currentExchange = {};
263
+ for (const msg of messages) {
264
+ if (msg.role === "user") {
265
+ // Start new exchange
266
+ if (currentExchange.user) {
267
+ // Previous exchange had no response, save it anyway
268
+ exchanges.push({
269
+ user: currentExchange.user,
270
+ assistant: currentExchange.assistant || null,
271
+ });
272
+ }
273
+ currentExchange = { user: msg };
274
+ }
275
+ else if (msg.role === "assistant" && currentExchange.user) {
276
+ // Complete the exchange
277
+ currentExchange.assistant = msg;
278
+ exchanges.push({
279
+ user: currentExchange.user,
280
+ assistant: currentExchange.assistant,
281
+ });
282
+ currentExchange = {};
283
+ }
284
+ }
285
+ // Handle trailing user message without response
286
+ if (currentExchange.user) {
287
+ exchanges.push({
288
+ user: currentExchange.user,
289
+ assistant: currentExchange.assistant || null,
290
+ });
291
+ }
292
+ return exchanges;
293
+ }
294
+ /**
295
+ * Generate a brief summary of older exchanges
296
+ */
297
+ function generateContextSummary(exchanges) {
298
+ if (exchanges.length === 0)
299
+ return "";
300
+ // Extract key topics from user messages
301
+ const topics = [];
302
+ for (const ex of exchanges.slice(0, 10)) {
303
+ // Sample first 10 exchanges
304
+ const content = ex.user.content.toLowerCase();
305
+ // Extract first sentence or first 100 chars as topic hint
306
+ const firstSentence = content.split(/[.!?\n]/)[0].trim();
307
+ if (firstSentence.length > 10 && firstSentence.length < 100) {
308
+ topics.push(firstSentence);
309
+ }
310
+ }
311
+ if (topics.length === 0) {
312
+ return `[Prior context: ${exchanges.length} earlier exchanges in this session]`;
313
+ }
314
+ const topicList = topics.slice(0, 3).join("; ");
315
+ return `[Prior context: ${exchanges.length} earlier exchanges including: ${topicList}...]`;
316
+ }
317
+ /**
318
+ * Estimate token count (rough: 1 token ≈ 4 chars)
319
+ */
320
+ function estimateTokens(text) {
321
+ return Math.ceil(text.length / 4);
322
+ }
323
+ /**
324
+ * Apply exchange windowing to reduce payload size
325
+ */
326
+ export function applyExchangeWindowing(messages, options = DEFAULT_OPTIONS) {
327
+ const exchanges = groupIntoExchanges(messages);
328
+ const stats = {
329
+ totalExchanges: exchanges.length,
330
+ includedExchanges: 0,
331
+ excludedExchanges: 0,
332
+ estimatedTokens: 0,
333
+ };
334
+ // If few enough exchanges, include all
335
+ if (exchanges.length <= options.recentExchanges) {
336
+ stats.includedExchanges = exchanges.length;
337
+ stats.estimatedTokens = estimateTokens(JSON.stringify(messages));
338
+ return { messages, summary: null, stats };
339
+ }
340
+ // Split into older (to summarize) and recent (to include fully)
341
+ const olderExchanges = exchanges.slice(0, -options.recentExchanges);
342
+ const recentExchanges = exchanges.slice(-options.recentExchanges);
343
+ stats.excludedExchanges = olderExchanges.length;
344
+ stats.includedExchanges = recentExchanges.length;
345
+ // Generate summary of older context
346
+ const summary = options.includeSummary
347
+ ? generateContextSummary(olderExchanges)
348
+ : null;
349
+ // Flatten recent exchanges back to messages
350
+ const windowedMessages = [];
351
+ // Add summary as a synthetic "context" message if present
352
+ // Mark with special prefix so viewer can style it differently
353
+ if (summary) {
354
+ windowedMessages.push({
355
+ role: "assistant",
356
+ content: `__CONTEXT_SUMMARY__${summary}`,
357
+ timestamp: recentExchanges[0]?.user.timestamp || Date.now(),
358
+ });
359
+ }
360
+ for (const ex of recentExchanges) {
361
+ windowedMessages.push(ex.user);
362
+ if (ex.assistant) {
363
+ windowedMessages.push(ex.assistant);
364
+ }
365
+ }
366
+ stats.estimatedTokens = estimateTokens(JSON.stringify(windowedMessages));
367
+ return { messages: windowedMessages, summary, stats };
368
+ }
369
+ /**
370
+ * Create a teleport payload from a session with exchange windowing
371
+ */
372
+ export async function createTeleportPayload(session, options = {}) {
373
+ const opts = { ...DEFAULT_OPTIONS, ...options };
374
+ const messages = await readSessionMessages(session.fullPath);
375
+ const teleportMessages = convertToTeleportMessages(messages);
376
+ // Apply exchange windowing to reduce size
377
+ const { messages: windowedMessages, stats } = applyExchangeWindowing(teleportMessages, opts);
378
+ // Extract model from last assistant message if available
379
+ let model = "claude-sonnet-4-20250514";
380
+ const lastAssistant = messages
381
+ .slice()
382
+ .reverse()
383
+ .find((m) => m.type === "assistant");
384
+ if (lastAssistant && "requestId" in lastAssistant) {
385
+ // Try to extract model from message metadata
386
+ const msgAny = lastAssistant;
387
+ if (msgAny.message &&
388
+ typeof msgAny.message === "object" &&
389
+ "model" in msgAny.message) {
390
+ model = msgAny.message.model;
391
+ }
392
+ }
393
+ const payload = {
394
+ version: "1.0",
395
+ sessionId: session.sessionId,
396
+ branchPoint: windowedMessages.length,
397
+ messages: windowedMessages,
398
+ context: {
399
+ workingDirectory: session.projectPath,
400
+ gitBranch: session.gitBranch || undefined,
401
+ summary: session.firstPrompt,
402
+ },
403
+ model,
404
+ created: new Date().toISOString(),
405
+ };
406
+ return { payload, stats };
407
+ }
408
+ /**
409
+ * Get current session from environment or most recent
410
+ */
411
+ export async function getCurrentSession() {
412
+ // Check if we're in a Claude Code session (would have CLAUDE_SESSION_ID env var)
413
+ const currentSessionId = process.env.CLAUDE_SESSION_ID;
414
+ if (currentSessionId) {
415
+ const session = await findSession(currentSessionId);
416
+ if (session)
417
+ return session;
418
+ }
419
+ // Fall back to most recent session
420
+ return getMostRecentSession();
421
+ }
422
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ export interface TeleportPayload {
2
+ version: "1.0";
3
+ sessionId: string;
4
+ branchPoint: number;
5
+ messages: TeleportMessage[];
6
+ context: {
7
+ workingDirectory: string;
8
+ gitBranch?: string;
9
+ summary?: string;
10
+ };
11
+ model: string;
12
+ created: string;
13
+ }
14
+ export interface TeleportMessage {
15
+ role: "user" | "assistant";
16
+ content: string;
17
+ timestamp: number;
18
+ }
19
+ export interface TeleportReturnPayload {
20
+ version: "1.0";
21
+ sessionId: string;
22
+ branchPoint: number;
23
+ newMessages: TeleportMessage[];
24
+ }
25
+ export interface ClaudeSessionMessage {
26
+ parentUuid?: string;
27
+ isSidechain?: boolean;
28
+ userType?: string;
29
+ cwd?: string;
30
+ sessionId: string;
31
+ version?: string;
32
+ gitBranch?: string;
33
+ type: "user" | "assistant";
34
+ message: {
35
+ role: "user" | "assistant";
36
+ content: string | ContentBlock[];
37
+ };
38
+ uuid: string;
39
+ timestamp: number;
40
+ }
41
+ export type ContentBlock = {
42
+ type: "text";
43
+ text: string;
44
+ } | {
45
+ type: "thinking";
46
+ thinking: string;
47
+ } | {
48
+ type: "tool_use";
49
+ id: string;
50
+ name: string;
51
+ input: Record<string, unknown>;
52
+ } | {
53
+ type: "tool_result";
54
+ tool_use_id: string;
55
+ content: string;
56
+ };
57
+ export interface SessionIndex {
58
+ version: number;
59
+ entries: SessionEntry[];
60
+ }
61
+ export interface SessionEntry {
62
+ sessionId: string;
63
+ fullPath: string;
64
+ fileMtime: number;
65
+ firstPrompt: string;
66
+ messageCount: number;
67
+ created: string;
68
+ modified: string;
69
+ customTitle?: string;
70
+ gitBranch?: string;
71
+ projectPath: string;
72
+ isSidechain: boolean;
73
+ }
74
+ export interface TeleportResponse {
75
+ teleportId: string;
76
+ url: string;
77
+ expiresAt: string;
78
+ }
79
+ export interface TeleportError {
80
+ error: string;
81
+ code: string;
82
+ }
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAID,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAC3B,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;KAClC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAID,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Teleport payload types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yBAAyB"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@claude-tools-i-use/teleport",
3
+ "version": "1.0.0",
4
+ "description": "Teleport Claude Code CLI sessions to web for reading/refining",
5
+ "type": "module",
6
+ "bin": {
7
+ "teleport": "./dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "start": "node dist/cli.js",
13
+ "deploy": "wrangler deploy",
14
+ "clean": "rm -rf dist",
15
+ "lint": "tsc --noEmit"
16
+ },
17
+ "keywords": [
18
+ "claude",
19
+ "claude-code",
20
+ "teleport",
21
+ "ai-tools"
22
+ ],
23
+ "author": "Josh Duffy",
24
+ "license": "MIT",
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/joshduffy/claude-tools.git",
31
+ "directory": "packages/teleport"
32
+ },
33
+ "homepage": "https://joshduffy.dev/tools/teleport",
34
+ "devDependencies": {
35
+ "@cloudflare/workers-types": "^4.20241218.0",
36
+ "@types/node": "^22.10.0",
37
+ "typescript": "^5.7.0",
38
+ "wrangler": "^3.99.0"
39
+ },
40
+ "dependencies": {
41
+ "commander": "^12.1.0",
42
+ "open": "^10.1.0"
43
+ }
44
+ }