linkshell-cli 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -6
- package/dist/cli/src/commands/gateway.d.ts +2 -0
- package/dist/cli/src/commands/gateway.js +29 -0
- package/dist/cli/src/commands/gateway.js.map +1 -0
- package/dist/cli/src/commands/host.d.ts +2 -0
- package/dist/cli/src/commands/host.js +12 -2
- package/dist/cli/src/commands/host.js.map +1 -1
- package/dist/cli/src/commands/setup.js +4 -2
- package/dist/cli/src/commands/setup.js.map +1 -1
- package/dist/cli/src/index.js +12 -334
- package/dist/cli/src/index.js.map +1 -1
- package/dist/cli/src/utils/daemon.d.ts +0 -7
- package/dist/cli/src/utils/daemon.js +1 -18
- package/dist/cli/src/utils/daemon.js.map +1 -1
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/dist/gateway/src/accounts.d.ts +6 -0
- package/dist/gateway/src/accounts.js +32 -0
- package/dist/gateway/src/accounts.js.map +1 -0
- package/dist/gateway/src/index.d.ts +4 -0
- package/dist/gateway/src/index.js +5 -0
- package/dist/gateway/src/index.js.map +1 -0
- package/dist/gateway/src/main.d.ts +1 -0
- package/dist/gateway/src/main.js +57 -0
- package/dist/gateway/src/main.js.map +1 -0
- package/dist/gateway/src/rate-limit.d.ts +22 -0
- package/dist/gateway/src/rate-limit.js +66 -0
- package/dist/gateway/src/rate-limit.js.map +1 -0
- package/dist/gateway/src/relay.d.ts +84 -0
- package/dist/gateway/src/relay.js +434 -0
- package/dist/gateway/src/relay.js.map +1 -0
- package/dist/gateway/src/serve.d.ts +34 -0
- package/dist/gateway/src/serve.js +102 -0
- package/dist/gateway/src/serve.js.map +1 -0
- package/dist/gateway/src/store.d.ts +35 -0
- package/dist/gateway/src/store.js +109 -0
- package/dist/gateway/src/store.js.map +1 -0
- package/dist/gateway/src/subscription.d.ts +18 -0
- package/dist/gateway/src/subscription.js +46 -0
- package/dist/gateway/src/subscription.js.map +1 -0
- package/dist/host/src/drivers/claude/transcript.d.ts +23 -23
- package/dist/host/src/drivers/codex/app-server.d.ts +31 -6
- package/dist/host/src/drivers/codex/app-server.js +99 -24
- package/dist/host/src/drivers/codex/app-server.js.map +1 -1
- package/dist/host/src/drivers/codex/desktop-ipc.d.ts +8 -0
- package/dist/host/src/drivers/codex/desktop-ipc.js +124 -0
- package/dist/host/src/drivers/codex/desktop-ipc.js.map +1 -0
- package/dist/host/src/drivers/codex/driver.d.ts +111 -2
- package/dist/host/src/drivers/codex/driver.js +629 -63
- package/dist/host/src/drivers/codex/driver.js.map +1 -1
- package/dist/host/src/drivers/codex/mapper.d.ts +21 -0
- package/dist/host/src/drivers/codex/mapper.js +45 -6
- package/dist/host/src/drivers/codex/mapper.js.map +1 -1
- package/dist/host/src/drivers/types.d.ts +6 -0
- package/dist/host/src/fs.d.ts +3 -3
- package/dist/host/src/hub.js +8 -1
- package/dist/host/src/hub.js.map +1 -1
- package/dist/host/src/input.d.ts +4 -4
- package/dist/host/src/terminals.d.ts +1 -1
- package/dist/wire/src/model.d.ts +6 -6
- package/dist/wire/src/relay.d.ts +8 -8
- package/dist/wire/src/rpc.d.ts +818 -818
- package/dist/wire/src/updates.d.ts +18 -18
- package/package.json +5 -14
- package/src/commands/gateway.ts +31 -0
- package/src/commands/host.ts +13 -2
- package/src/commands/setup.ts +4 -2
- package/src/index.ts +14 -429
- package/src/utils/daemon.ts +2 -27
- package/dist/cli/src/config.d.ts +0 -14
- package/dist/cli/src/config.js +0 -23
- package/dist/cli/src/config.js.map +0 -1
- package/dist/cli/src/machine-id.d.ts +0 -6
- package/dist/cli/src/machine-id.js +0 -50
- package/dist/cli/src/machine-id.js.map +0 -1
- package/dist/cli/src/providers.d.ts +0 -13
- package/dist/cli/src/providers.js +0 -77
- package/dist/cli/src/providers.js.map +0 -1
- package/dist/cli/src/runtime/acp/acp-client.d.ts +0 -128
- package/dist/cli/src/runtime/acp/acp-client.js +0 -430
- package/dist/cli/src/runtime/acp/acp-client.js.map +0 -1
- package/dist/cli/src/runtime/acp/agent-process-discovery.d.ts +0 -48
- package/dist/cli/src/runtime/acp/agent-process-discovery.js +0 -278
- package/dist/cli/src/runtime/acp/agent-process-discovery.js.map +0 -1
- package/dist/cli/src/runtime/acp/agent-session.d.ts +0 -62
- package/dist/cli/src/runtime/acp/agent-session.js +0 -1081
- package/dist/cli/src/runtime/acp/agent-session.js.map +0 -1
- package/dist/cli/src/runtime/acp/agent-workspace.d.ts +0 -311
- package/dist/cli/src/runtime/acp/agent-workspace.js +0 -6083
- package/dist/cli/src/runtime/acp/agent-workspace.js.map +0 -1
- package/dist/cli/src/runtime/acp/claude-sdk-client.d.ts +0 -121
- package/dist/cli/src/runtime/acp/claude-sdk-client.js +0 -1147
- package/dist/cli/src/runtime/acp/claude-sdk-client.js.map +0 -1
- package/dist/cli/src/runtime/acp/claude-stream-json-client.d.ts +0 -53
- package/dist/cli/src/runtime/acp/claude-stream-json-client.js +0 -552
- package/dist/cli/src/runtime/acp/claude-stream-json-client.js.map +0 -1
- package/dist/cli/src/runtime/acp/json-rpc.d.ts +0 -22
- package/dist/cli/src/runtime/acp/json-rpc.js +0 -160
- package/dist/cli/src/runtime/acp/json-rpc.js.map +0 -1
- package/dist/cli/src/runtime/acp/provider-resolver.d.ts +0 -16
- package/dist/cli/src/runtime/acp/provider-resolver.js +0 -132
- package/dist/cli/src/runtime/acp/provider-resolver.js.map +0 -1
- package/dist/cli/src/runtime/bridge-session.d.ts +0 -97
- package/dist/cli/src/runtime/bridge-session.js +0 -1364
- package/dist/cli/src/runtime/bridge-session.js.map +0 -1
- package/dist/cli/src/runtime/hook-command.d.ts +0 -9
- package/dist/cli/src/runtime/hook-command.js +0 -80
- package/dist/cli/src/runtime/hook-command.js.map +0 -1
- package/dist/cli/src/runtime/screen-fallback.d.ts +0 -22
- package/dist/cli/src/runtime/screen-fallback.js +0 -202
- package/dist/cli/src/runtime/screen-fallback.js.map +0 -1
- package/dist/cli/src/runtime/screen-share.d.ts +0 -34
- package/dist/cli/src/runtime/screen-share.js +0 -376
- package/dist/cli/src/runtime/screen-share.js.map +0 -1
- package/dist/cli/src/runtime/scrollback.d.ts +0 -11
- package/dist/cli/src/runtime/scrollback.js +0 -33
- package/dist/cli/src/runtime/scrollback.js.map +0 -1
- package/dist/cli/src/runtime/usage-report.d.ts +0 -34
- package/dist/cli/src/runtime/usage-report.js +0 -332
- package/dist/cli/src/runtime/usage-report.js.map +0 -1
- package/dist/cli/src/utils/keep-awake.d.ts +0 -6
- package/dist/cli/src/utils/keep-awake.js +0 -48
- package/dist/cli/src/utils/keep-awake.js.map +0 -1
- package/dist/cli/src/utils/lan-ip.d.ts +0 -9
- package/dist/cli/src/utils/lan-ip.js +0 -61
- package/dist/cli/src/utils/lan-ip.js.map +0 -1
- package/dist/host/src/input-helper.d.ts +0 -1
- package/dist/host/src/input-helper.js +0 -564
- package/dist/host/src/input-helper.js.map +0 -1
- package/dist/shared-protocol/src/index.d.ts +0 -17029
- package/dist/shared-protocol/src/index.js +0 -1064
- package/dist/shared-protocol/src/index.js.map +0 -1
- package/scripts/copy-web.mjs +0 -34
- package/src/config.ts +0 -36
- package/src/machine-id.ts +0 -61
- package/src/providers.ts +0 -97
- package/src/runtime/acp/acp-client.ts +0 -521
- package/src/runtime/acp/agent-process-discovery.ts +0 -308
- package/src/runtime/acp/agent-session.ts +0 -1186
- package/src/runtime/acp/agent-workspace.ts +0 -6590
- package/src/runtime/acp/claude-sdk-client.ts +0 -1221
- package/src/runtime/acp/claude-stream-json-client.ts +0 -633
- package/src/runtime/acp/json-rpc.ts +0 -184
- package/src/runtime/acp/provider-resolver.ts +0 -154
- package/src/runtime/bridge-session.ts +0 -1549
- package/src/runtime/hook-command.ts +0 -73
- package/src/runtime/screen-fallback.ts +0 -235
- package/src/runtime/screen-share.ts +0 -426
- package/src/runtime/scrollback.ts +0 -43
- package/src/runtime/usage-report.ts +0 -342
- package/src/utils/keep-awake.ts +0 -61
- package/src/utils/lan-ip.ts +0 -61
- package/web/assets/FileBrowser-wOAfY-xj.js +0 -2
- package/web/assets/PortPreview-Cbvv7yzA.js +0 -2
- package/web/assets/TerminalPanel-CTSklkct.js +0 -1
- package/web/assets/UsageDashboard-CJ1AsNmd.js +0 -1
- package/web/assets/index-BsnDaeCt.css +0 -33
- package/web/assets/index-q85psYZ5.js +0 -36
- package/web/assets/vendor-highlight-NXWAAyIv.js +0 -5
- package/web/assets/vendor-react-M7xG3qiw.js +0 -49
- package/web/assets/vendor-xterm-D15THcI4.js +0 -9
- package/web/index.html +0 -37
- package/web/logos/claude.png +0 -0
- package/web/logos/codex.png +0 -0
- package/web/logos/copilot.png +0 -0
- package/web/logos/gemini.png +0 -0
- package/web/logos/linkshell-1024.png +0 -0
- package/web/logos/linkshell-splash.png +0 -0
- package/web/logos/linkshell.png +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export class GatewayStore {
|
|
3
|
+
db;
|
|
4
|
+
constructor(path) {
|
|
5
|
+
this.db = new DatabaseSync(path);
|
|
6
|
+
this.db.exec(`
|
|
7
|
+
PRAGMA journal_mode = WAL;
|
|
8
|
+
CREATE TABLE IF NOT EXISTS peers (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
role TEXT NOT NULL,
|
|
11
|
+
sign_key TEXT NOT NULL,
|
|
12
|
+
box_key TEXT NOT NULL,
|
|
13
|
+
name TEXT NOT NULL,
|
|
14
|
+
platform TEXT,
|
|
15
|
+
user_id TEXT,
|
|
16
|
+
last_seen INTEGER NOT NULL
|
|
17
|
+
);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS peers_by_user ON peers (user_id);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS links (
|
|
20
|
+
machine_id TEXT NOT NULL,
|
|
21
|
+
device_id TEXT NOT NULL,
|
|
22
|
+
created_at INTEGER NOT NULL,
|
|
23
|
+
PRIMARY KEY (machine_id, device_id)
|
|
24
|
+
) WITHOUT ROWID;
|
|
25
|
+
CREATE INDEX IF NOT EXISTS links_by_device ON links (device_id);
|
|
26
|
+
`);
|
|
27
|
+
}
|
|
28
|
+
close() {
|
|
29
|
+
this.db.close();
|
|
30
|
+
}
|
|
31
|
+
peer(id) {
|
|
32
|
+
const row = this.db.prepare("SELECT * FROM peers WHERE id = ?").get(id);
|
|
33
|
+
return row ? toPeer(row) : undefined;
|
|
34
|
+
}
|
|
35
|
+
upsertPeer(peer) {
|
|
36
|
+
this.db
|
|
37
|
+
.prepare(`INSERT INTO peers (id, role, sign_key, box_key, name, platform, user_id, last_seen)
|
|
38
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
39
|
+
ON CONFLICT(id) DO UPDATE SET box_key = excluded.box_key, name = excluded.name,
|
|
40
|
+
platform = excluded.platform, user_id = excluded.user_id, last_seen = excluded.last_seen`)
|
|
41
|
+
.run(peer.id, peer.role, peer.signKey, peer.boxKey, peer.name, peer.platform ?? null, peer.userId ?? null, peer.lastSeen);
|
|
42
|
+
}
|
|
43
|
+
touch(id, at = Date.now()) {
|
|
44
|
+
this.db.prepare("UPDATE peers SET last_seen = ? WHERE id = ?").run(at, id);
|
|
45
|
+
}
|
|
46
|
+
link(machineId, deviceId, at = Date.now()) {
|
|
47
|
+
this.db.prepare("INSERT OR IGNORE INTO links (machine_id, device_id, created_at) VALUES (?, ?, ?)").run(machineId, deviceId, at);
|
|
48
|
+
}
|
|
49
|
+
unlink(machineId, deviceId) {
|
|
50
|
+
return this.db.prepare("DELETE FROM links WHERE machine_id = ? AND device_id = ?").run(machineId, deviceId).changes > 0;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Takes a peer off its account: the account's other peers no longer reach it, or list it. Its
|
|
54
|
+
* keys and pairings stay, and signing in again puts it back.
|
|
55
|
+
*/
|
|
56
|
+
disown(id) {
|
|
57
|
+
return this.db.prepare("UPDATE peers SET user_id = NULL WHERE id = ? AND user_id IS NOT NULL").run(id).changes > 0;
|
|
58
|
+
}
|
|
59
|
+
linkedAt(machineId, deviceId) {
|
|
60
|
+
const row = this.db.prepare("SELECT created_at FROM links WHERE machine_id = ? AND device_id = ?").get(machineId, deviceId);
|
|
61
|
+
return row?.created_at;
|
|
62
|
+
}
|
|
63
|
+
/** Peers of the other role that `id` may reach: linked, or owned by the same account. */
|
|
64
|
+
reachable(id) {
|
|
65
|
+
const self = this.peer(id);
|
|
66
|
+
if (!self)
|
|
67
|
+
return [];
|
|
68
|
+
const other = self.role === "machine" ? "device" : "machine";
|
|
69
|
+
const linked = (self.role === "machine"
|
|
70
|
+
? this.db.prepare("SELECT p.*, l.created_at AS paired_at FROM links l JOIN peers p ON p.id = l.device_id WHERE l.machine_id = ?").all(id)
|
|
71
|
+
: this.db.prepare("SELECT p.*, l.created_at AS paired_at FROM links l JOIN peers p ON p.id = l.machine_id WHERE l.device_id = ?").all(id));
|
|
72
|
+
const out = new Map();
|
|
73
|
+
for (const row of linked)
|
|
74
|
+
out.set(String(row.id), { peer: toPeer(row), via: "paired", pairedAt: Number(row.paired_at) });
|
|
75
|
+
if (self.userId) {
|
|
76
|
+
const owned = this.db.prepare("SELECT * FROM peers WHERE user_id = ? AND role = ?").all(self.userId, other);
|
|
77
|
+
for (const row of owned)
|
|
78
|
+
if (!out.has(String(row.id)))
|
|
79
|
+
out.set(String(row.id), { peer: toPeer(row), via: "account" });
|
|
80
|
+
}
|
|
81
|
+
return [...out.values()];
|
|
82
|
+
}
|
|
83
|
+
/** How `from` may reach `to`, or undefined when it may not. */
|
|
84
|
+
route(from, to) {
|
|
85
|
+
const a = this.peer(from);
|
|
86
|
+
const b = this.peer(to);
|
|
87
|
+
if (!a || !b || a.role === b.role)
|
|
88
|
+
return undefined;
|
|
89
|
+
const [machine, device] = a.role === "machine" ? [a, b] : [b, a];
|
|
90
|
+
if (this.linkedAt(machine.id, device.id) !== undefined)
|
|
91
|
+
return "paired";
|
|
92
|
+
if (a.userId && a.userId === b.userId)
|
|
93
|
+
return "account";
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function toPeer(row) {
|
|
98
|
+
return {
|
|
99
|
+
id: String(row.id),
|
|
100
|
+
role: row.role,
|
|
101
|
+
signKey: String(row.sign_key),
|
|
102
|
+
boxKey: String(row.box_key),
|
|
103
|
+
name: String(row.name),
|
|
104
|
+
platform: row.platform ? String(row.platform) : undefined,
|
|
105
|
+
userId: row.user_id ? String(row.user_id) : undefined,
|
|
106
|
+
lastSeen: Number(row.last_seen),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../gateway/src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GatewayOptions } from "./relay.js";
|
|
2
|
+
export interface SubscriptionCheck {
|
|
3
|
+
/** "unknown": the lookup itself failed, which says nothing about the account. */
|
|
4
|
+
status: "active" | "inactive" | "unknown";
|
|
5
|
+
reason?: string;
|
|
6
|
+
}
|
|
7
|
+
export type CheckSubscription = (userId: string) => Promise<SubscriptionCheck>;
|
|
8
|
+
export declare function supabaseSubscriptions(supabase: {
|
|
9
|
+
url: string;
|
|
10
|
+
anonKey: string;
|
|
11
|
+
serviceRoleKey: string;
|
|
12
|
+
}): CheckSubscription;
|
|
13
|
+
/**
|
|
14
|
+
* The official gateway's rule for who may connect: a computer needs an active
|
|
15
|
+
* Pro account. Devices only reach computers they're paired with or share an
|
|
16
|
+
* account with, so they need nothing more.
|
|
17
|
+
*/
|
|
18
|
+
export declare function requirePro(check: CheckSubscription, warn: (message: string) => void): NonNullable<GatewayOptions["admit"]>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function supabaseSubscriptions(supabase) {
|
|
2
|
+
return async (userId) => {
|
|
3
|
+
if (!supabase.url || !supabase.anonKey)
|
|
4
|
+
return { status: "unknown", reason: "missing_supabase_config" };
|
|
5
|
+
if (!supabase.serviceRoleKey)
|
|
6
|
+
return { status: "unknown", reason: "missing_service_role_key" };
|
|
7
|
+
try {
|
|
8
|
+
const response = await fetch(`${supabase.url}/rest/v1/profiles?id=eq.${userId}&select=plan,plan_expires_at&limit=1`, {
|
|
9
|
+
headers: { Authorization: `Bearer ${supabase.serviceRoleKey}`, apikey: supabase.anonKey },
|
|
10
|
+
signal: AbortSignal.timeout(5_000),
|
|
11
|
+
});
|
|
12
|
+
if (!response.ok)
|
|
13
|
+
return { status: "unknown", reason: `profile_lookup_http_${response.status}` };
|
|
14
|
+
const profiles = (await response.json());
|
|
15
|
+
const profile = profiles[0];
|
|
16
|
+
if (!profile)
|
|
17
|
+
return { status: "unknown", reason: "profile_not_found" };
|
|
18
|
+
const active = profile.plan === "pro" && !!profile.plan_expires_at && new Date(profile.plan_expires_at) > new Date();
|
|
19
|
+
return { status: active ? "active" : "inactive" };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { status: "unknown", reason: "profile_lookup_failed" };
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The official gateway's rule for who may connect: a computer needs an active
|
|
28
|
+
* Pro account. Devices only reach computers they're paired with or share an
|
|
29
|
+
* account with, so they need nothing more.
|
|
30
|
+
*/
|
|
31
|
+
export function requirePro(check, warn) {
|
|
32
|
+
return async ({ role, userId }) => {
|
|
33
|
+
if (role !== "machine")
|
|
34
|
+
return undefined;
|
|
35
|
+
if (!userId)
|
|
36
|
+
return "官方网关需要登录 Pro 账号:在电脑上运行 linkshell login";
|
|
37
|
+
const subscription = await check(userId);
|
|
38
|
+
// A lookup failure isn't a lapsed subscription; don't lock people out over it.
|
|
39
|
+
if (subscription.status === "inactive")
|
|
40
|
+
return "官方网关需要 Pro 订阅:https://itool.tech";
|
|
41
|
+
if (subscription.status === "unknown")
|
|
42
|
+
warn(`subscription check unavailable (${subscription.reason}); admitting ${userId}`);
|
|
43
|
+
return undefined;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../../gateway/src/subscription.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,qBAAqB,CAAC,QAAkE;IACtG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;QACxG,IAAI,CAAC,QAAQ,CAAC,cAAc;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC/F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,2BAA2B,MAAM,sCAAsC,EAAE;gBACnH,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE;gBACzF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,uBAAuB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACjG,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuD,CAAC;YAC/F,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YACxE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACrH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;QAChE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,IAA+B;IAClF,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAChC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,OAAO,wCAAwC,CAAC;QAC7D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,+EAA+E;QAC/E,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,kCAAkC,CAAC;QAClF,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,mCAAmC,YAAY,CAAC,MAAM,gBAAgB,MAAM,EAAE,CAAC,CAAC;QAC5H,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -33,7 +33,6 @@ export declare function transcriptLine(raw: string, options?: {
|
|
|
33
33
|
/** Parses a whole transcript file. */
|
|
34
34
|
/** When each transcript update happened, for history import. */
|
|
35
35
|
export declare const transcriptTimes: WeakMap<{
|
|
36
|
-
sessionUpdate: "user_message_chunk";
|
|
37
36
|
content: {
|
|
38
37
|
type: "text";
|
|
39
38
|
text: string;
|
|
@@ -43,15 +42,14 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
43
42
|
data?: string | undefined;
|
|
44
43
|
uri?: string | undefined;
|
|
45
44
|
} | {
|
|
46
|
-
name: string;
|
|
47
45
|
type: "resource_link";
|
|
46
|
+
name: string;
|
|
48
47
|
uri: string;
|
|
49
48
|
kind?: "agent" | "file" | "skill" | undefined;
|
|
50
49
|
};
|
|
50
|
+
sessionUpdate: "user_message_chunk";
|
|
51
51
|
messageId?: string | undefined;
|
|
52
52
|
} | {
|
|
53
|
-
sessionUpdate: "agent_message_chunk";
|
|
54
|
-
messageId: string;
|
|
55
53
|
content: {
|
|
56
54
|
type: "text";
|
|
57
55
|
text: string;
|
|
@@ -61,15 +59,15 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
61
59
|
data?: string | undefined;
|
|
62
60
|
uri?: string | undefined;
|
|
63
61
|
} | {
|
|
64
|
-
name: string;
|
|
65
62
|
type: "resource_link";
|
|
63
|
+
name: string;
|
|
66
64
|
uri: string;
|
|
67
65
|
kind?: "agent" | "file" | "skill" | undefined;
|
|
68
66
|
};
|
|
67
|
+
sessionUpdate: "agent_message_chunk";
|
|
68
|
+
messageId: string;
|
|
69
69
|
parentToolCallId?: string | undefined;
|
|
70
70
|
} | {
|
|
71
|
-
sessionUpdate: "agent_thought_chunk";
|
|
72
|
-
messageId: string;
|
|
73
71
|
content: {
|
|
74
72
|
type: "text";
|
|
75
73
|
text: string;
|
|
@@ -79,16 +77,18 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
79
77
|
data?: string | undefined;
|
|
80
78
|
uri?: string | undefined;
|
|
81
79
|
} | {
|
|
82
|
-
name: string;
|
|
83
80
|
type: "resource_link";
|
|
81
|
+
name: string;
|
|
84
82
|
uri: string;
|
|
85
83
|
kind?: "agent" | "file" | "skill" | undefined;
|
|
86
84
|
};
|
|
85
|
+
sessionUpdate: "agent_thought_chunk";
|
|
86
|
+
messageId: string;
|
|
87
87
|
parentToolCallId?: string | undefined;
|
|
88
88
|
} | {
|
|
89
|
-
status: "
|
|
89
|
+
status: "failed" | "pending" | "in_progress" | "completed";
|
|
90
|
+
kind: "search" | "read" | "edit" | "delete" | "move" | "execute" | "think" | "fetch" | "other";
|
|
90
91
|
title: string;
|
|
91
|
-
kind: "read" | "edit" | "delete" | "move" | "search" | "execute" | "think" | "fetch" | "other";
|
|
92
92
|
toolCallId: string;
|
|
93
93
|
sessionUpdate: "tool_call";
|
|
94
94
|
detail?: {
|
|
@@ -98,12 +98,12 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
98
98
|
} | {
|
|
99
99
|
type: "subagent";
|
|
100
100
|
action: "message" | "spawn" | "wait" | "stop" | "resume" | "list";
|
|
101
|
-
model?: string | undefined;
|
|
102
101
|
task?: string | undefined;
|
|
103
102
|
agentType?: string | undefined;
|
|
103
|
+
model?: string | undefined;
|
|
104
104
|
} | {
|
|
105
|
-
name: string;
|
|
106
105
|
type: "skill";
|
|
106
|
+
name: string;
|
|
107
107
|
description?: string | undefined;
|
|
108
108
|
} | {
|
|
109
109
|
type: "web_search";
|
|
@@ -132,8 +132,8 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
132
132
|
data?: string | undefined;
|
|
133
133
|
uri?: string | undefined;
|
|
134
134
|
} | {
|
|
135
|
-
name: string;
|
|
136
135
|
type: "resource_link";
|
|
136
|
+
name: string;
|
|
137
137
|
uri: string;
|
|
138
138
|
kind?: "agent" | "file" | "skill" | undefined;
|
|
139
139
|
};
|
|
@@ -161,6 +161,8 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
161
161
|
} | {
|
|
162
162
|
toolCallId: string;
|
|
163
163
|
sessionUpdate: "tool_call_update";
|
|
164
|
+
status?: "failed" | "pending" | "in_progress" | "completed" | undefined;
|
|
165
|
+
title?: string | undefined;
|
|
164
166
|
detail?: {
|
|
165
167
|
type: "mcp";
|
|
166
168
|
tool: string;
|
|
@@ -168,12 +170,12 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
168
170
|
} | {
|
|
169
171
|
type: "subagent";
|
|
170
172
|
action: "message" | "spawn" | "wait" | "stop" | "resume" | "list";
|
|
171
|
-
model?: string | undefined;
|
|
172
173
|
task?: string | undefined;
|
|
173
174
|
agentType?: string | undefined;
|
|
175
|
+
model?: string | undefined;
|
|
174
176
|
} | {
|
|
175
|
-
name: string;
|
|
176
177
|
type: "skill";
|
|
178
|
+
name: string;
|
|
177
179
|
description?: string | undefined;
|
|
178
180
|
} | {
|
|
179
181
|
type: "web_search";
|
|
@@ -191,8 +193,6 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
191
193
|
text: string;
|
|
192
194
|
more?: number | undefined;
|
|
193
195
|
} | undefined;
|
|
194
|
-
status?: "pending" | "in_progress" | "completed" | "failed" | undefined;
|
|
195
|
-
title?: string | undefined;
|
|
196
196
|
content?: ({
|
|
197
197
|
type: "content";
|
|
198
198
|
content: {
|
|
@@ -204,8 +204,8 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
204
204
|
data?: string | undefined;
|
|
205
205
|
uri?: string | undefined;
|
|
206
206
|
} | {
|
|
207
|
-
name: string;
|
|
208
207
|
type: "resource_link";
|
|
208
|
+
name: string;
|
|
209
209
|
uri: string;
|
|
210
210
|
kind?: "agent" | "file" | "skill" | undefined;
|
|
211
211
|
};
|
|
@@ -259,14 +259,14 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
259
259
|
parentToolCallId?: string | undefined;
|
|
260
260
|
} | {
|
|
261
261
|
options: {
|
|
262
|
-
name: string;
|
|
263
262
|
values: {
|
|
264
|
-
name: string;
|
|
265
263
|
value: string;
|
|
264
|
+
name: string;
|
|
266
265
|
description?: string | undefined;
|
|
267
266
|
}[];
|
|
268
267
|
id: string;
|
|
269
|
-
|
|
268
|
+
name: string;
|
|
269
|
+
category: "mode" | "other" | "model" | "effort";
|
|
270
270
|
current: string;
|
|
271
271
|
}[];
|
|
272
272
|
sessionUpdate: "ls_config";
|
|
@@ -283,15 +283,15 @@ export declare const transcriptTimes: WeakMap<{
|
|
|
283
283
|
stopReason?: "error" | "end_turn" | "cancelled" | "max_tokens" | "refusal" | undefined;
|
|
284
284
|
} | {
|
|
285
285
|
options: {
|
|
286
|
+
optionId: string;
|
|
286
287
|
name: string;
|
|
287
288
|
kind: "allow_once" | "allow_always" | "reject_once" | "reject_always";
|
|
288
|
-
optionId: string;
|
|
289
289
|
}[];
|
|
290
290
|
title: string;
|
|
291
291
|
requestId: string;
|
|
292
292
|
sessionUpdate: "ls_permission";
|
|
293
|
-
detail?: string | undefined;
|
|
294
293
|
toolCallId?: string | undefined;
|
|
294
|
+
detail?: string | undefined;
|
|
295
295
|
questions?: {
|
|
296
296
|
id: string;
|
|
297
297
|
kind: "text" | "choice" | "choices";
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import { type RpcId } from "@linkshell/wire";
|
|
2
|
-
export interface
|
|
2
|
+
export interface CodexConnectionOptions {
|
|
3
3
|
/** Unix socket path; must stay under the ~104-byte sun_path limit. */
|
|
4
4
|
socketPath: string;
|
|
5
|
-
command?: string;
|
|
6
|
-
env?: NodeJS.ProcessEnv;
|
|
7
5
|
clientVersion: string;
|
|
8
|
-
log: (message: string) => void;
|
|
9
6
|
onNotification: (method: string, params: unknown) => void;
|
|
10
7
|
/** Server → client requests (approvals). Return ABANDON to leave one to other clients. */
|
|
11
8
|
onRequest: (method: string, params: unknown, id: RpcId) => unknown;
|
|
12
9
|
/** Called when the app-server process or its socket goes away unexpectedly. */
|
|
13
10
|
onDown: (reason: string) => void;
|
|
14
11
|
}
|
|
12
|
+
export interface CodexAppServerOptions extends CodexConnectionOptions {
|
|
13
|
+
command?: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
log: (message: string) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where Codex's own background server listens: the one a plain `codex` in a
|
|
19
|
+
* terminal starts and talks to (`codex app-server daemon`), unless it is run
|
|
20
|
+
* with `--no-daemon` or with configuration overrides.
|
|
21
|
+
*/
|
|
22
|
+
export declare function sharedServerSocket(env?: NodeJS.ProcessEnv): string;
|
|
15
23
|
export declare function detectCodex(command?: string, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
|
|
16
24
|
/** The `--enable` arguments for the wanted features this Codex knows and hasn't removed. */
|
|
17
25
|
export declare function featureArgs(command?: string, env?: NodeJS.ProcessEnv): Promise<string[]>;
|
|
@@ -21,8 +29,6 @@ export declare function enableArgs(listing: string): string[];
|
|
|
21
29
|
* Owns one `codex app-server --listen unix://…` process and a client connection
|
|
22
30
|
* to it. The same socket is what `codex --remote` attaches the desktop TUI to,
|
|
23
31
|
* so the TUI and LinkShell are peers on the same threads.
|
|
24
|
-
*
|
|
25
|
-
* The socket speaks WebSocket; permessage-deflate must be off or the upgrade is reset.
|
|
26
32
|
*/
|
|
27
33
|
export declare class CodexAppServer {
|
|
28
34
|
private readonly options;
|
|
@@ -38,3 +44,22 @@ export declare class CodexAppServer {
|
|
|
38
44
|
private connectWhenReady;
|
|
39
45
|
private connect;
|
|
40
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* A client connection to Codex's own background server, which this host
|
|
49
|
+
* neither starts nor stops. A thread that lives there (opened by a plain
|
|
50
|
+
* `codex`) can't be loaded anywhere else, but any number of clients can be on
|
|
51
|
+
* it there: joining it is how the phone and that terminal share a thread.
|
|
52
|
+
*/
|
|
53
|
+
export declare class CodexSharedServer {
|
|
54
|
+
private readonly options;
|
|
55
|
+
private socket?;
|
|
56
|
+
private peer?;
|
|
57
|
+
private connecting?;
|
|
58
|
+
private closing;
|
|
59
|
+
constructor(options: CodexConnectionOptions);
|
|
60
|
+
/** Connects if that server is running; false when it isn't (it is never started from here). */
|
|
61
|
+
connect(): Promise<boolean>;
|
|
62
|
+
request<T>(method: string, params: unknown, timeoutMs?: number): Promise<T>;
|
|
63
|
+
close(): void;
|
|
64
|
+
private dropped;
|
|
65
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { spawn, execFile } from "node:child_process";
|
|
2
2
|
import { existsSync, rmSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
3
5
|
import { promisify } from "node:util";
|
|
4
6
|
import WebSocket from "ws";
|
|
5
7
|
import { ABANDON, RpcPeer } from "@linkshell/wire";
|
|
@@ -20,6 +22,51 @@ const OPT_OUT_NOTIFICATIONS = [
|
|
|
20
22
|
"thread/goal/cleared",
|
|
21
23
|
"thread/goal/updated",
|
|
22
24
|
];
|
|
25
|
+
/**
|
|
26
|
+
* Where Codex's own background server listens: the one a plain `codex` in a
|
|
27
|
+
* terminal starts and talks to (`codex app-server daemon`), unless it is run
|
|
28
|
+
* with `--no-daemon` or with configuration overrides.
|
|
29
|
+
*/
|
|
30
|
+
export function sharedServerSocket(env = process.env) {
|
|
31
|
+
return join(env.CODEX_HOME || join(homedir(), ".codex"), "app-server-control", "app-server-control.sock");
|
|
32
|
+
}
|
|
33
|
+
/** A client connection to an app-server socket. The socket speaks WebSocket; permessage-deflate must be off or the upgrade is reset. */
|
|
34
|
+
async function openConnection(options, closing) {
|
|
35
|
+
const socket = new WebSocket(`ws+unix://${options.socketPath}:/`, { perMessageDeflate: false, handshakeTimeout: 10_000 });
|
|
36
|
+
await new Promise((resolve, reject) => {
|
|
37
|
+
socket.once("open", () => resolve());
|
|
38
|
+
socket.once("error", reject);
|
|
39
|
+
});
|
|
40
|
+
const peer = new RpcPeer({
|
|
41
|
+
send: (text) => socket.send(text),
|
|
42
|
+
onNotification: (method, params) => options.onNotification(method, params),
|
|
43
|
+
onRequest: (method, params, id) => options.onRequest(method, params, id) ?? ABANDON,
|
|
44
|
+
requestTimeoutMs: 60_000,
|
|
45
|
+
});
|
|
46
|
+
socket.on("message", (data) => peer.receive(data.toString()));
|
|
47
|
+
let ready = false;
|
|
48
|
+
socket.on("close", () => {
|
|
49
|
+
peer.close("codex app-server connection closed");
|
|
50
|
+
if (ready && !closing())
|
|
51
|
+
options.onDown("codex app-server connection closed");
|
|
52
|
+
});
|
|
53
|
+
// A failure after the handshake arrives as "close" too; this only keeps it from being thrown.
|
|
54
|
+
socket.on("error", () => { });
|
|
55
|
+
try {
|
|
56
|
+
await peer.request("initialize", {
|
|
57
|
+
clientInfo: { name: "linkshell", title: "LinkShell", version: options.clientVersion },
|
|
58
|
+
// experimentalApi: plan mode (`collaborationMode`) and the questions Codex asks (`item/tool/requestUserInput`) need it.
|
|
59
|
+
capabilities: { experimentalApi: true, requestAttestation: false, optOutNotificationMethods: OPT_OUT_NOTIFICATIONS },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
socket.close();
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
peer.notify("initialized", {});
|
|
67
|
+
ready = true;
|
|
68
|
+
return { socket, peer };
|
|
69
|
+
}
|
|
23
70
|
export async function detectCodex(command = "codex", env) {
|
|
24
71
|
try {
|
|
25
72
|
const { stdout } = await execFileAsync(command, ["--version"], { env, timeout: 10_000 });
|
|
@@ -58,8 +105,6 @@ export function enableArgs(listing) {
|
|
|
58
105
|
* Owns one `codex app-server --listen unix://…` process and a client connection
|
|
59
106
|
* to it. The same socket is what `codex --remote` attaches the desktop TUI to,
|
|
60
107
|
* so the TUI and LinkShell are peers on the same threads.
|
|
61
|
-
*
|
|
62
|
-
* The socket speaks WebSocket; permessage-deflate must be off or the upgrade is reset.
|
|
63
108
|
*/
|
|
64
109
|
export class CodexAppServer {
|
|
65
110
|
options;
|
|
@@ -140,31 +185,61 @@ export class CodexAppServer {
|
|
|
140
185
|
throw new Error(`codex app-server did not accept connections: ${lastError instanceof Error ? lastError.message : "timeout"}`);
|
|
141
186
|
}
|
|
142
187
|
async connect() {
|
|
143
|
-
const socket =
|
|
144
|
-
await new Promise((resolve, reject) => {
|
|
145
|
-
socket.once("open", () => resolve());
|
|
146
|
-
socket.once("error", reject);
|
|
147
|
-
});
|
|
148
|
-
const peer = new RpcPeer({
|
|
149
|
-
send: (text) => socket.send(text),
|
|
150
|
-
onNotification: (method, params) => this.options.onNotification(method, params),
|
|
151
|
-
onRequest: (method, params, id) => this.options.onRequest(method, params, id) ?? ABANDON,
|
|
152
|
-
requestTimeoutMs: 60_000,
|
|
153
|
-
});
|
|
154
|
-
socket.on("message", (data) => peer.receive(data.toString()));
|
|
155
|
-
socket.on("close", () => {
|
|
156
|
-
peer.close("codex app-server connection closed");
|
|
157
|
-
if (!this.stopping)
|
|
158
|
-
this.options.onDown("codex app-server connection closed");
|
|
159
|
-
});
|
|
188
|
+
const { socket, peer } = await openConnection(this.options, () => this.stopping);
|
|
160
189
|
this.socket = socket;
|
|
161
190
|
this.peer = peer;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* A client connection to Codex's own background server, which this host
|
|
195
|
+
* neither starts nor stops. A thread that lives there (opened by a plain
|
|
196
|
+
* `codex`) can't be loaded anywhere else, but any number of clients can be on
|
|
197
|
+
* it there: joining it is how the phone and that terminal share a thread.
|
|
198
|
+
*/
|
|
199
|
+
export class CodexSharedServer {
|
|
200
|
+
options;
|
|
201
|
+
socket;
|
|
202
|
+
peer;
|
|
203
|
+
connecting;
|
|
204
|
+
closing = false;
|
|
205
|
+
constructor(options) {
|
|
206
|
+
this.options = options;
|
|
207
|
+
}
|
|
208
|
+
/** Connects if that server is running; false when it isn't (it is never started from here). */
|
|
209
|
+
connect() {
|
|
210
|
+
if (this.peer)
|
|
211
|
+
return Promise.resolve(true);
|
|
212
|
+
if (!existsSync(this.options.socketPath))
|
|
213
|
+
return Promise.resolve(false);
|
|
214
|
+
this.closing = false;
|
|
215
|
+
this.connecting ??= openConnection({ ...this.options, onDown: (reason) => this.dropped(reason) }, () => this.closing)
|
|
216
|
+
.then(({ socket, peer }) => {
|
|
217
|
+
this.socket = socket;
|
|
218
|
+
this.peer = peer;
|
|
219
|
+
return true;
|
|
220
|
+
})
|
|
221
|
+
.catch(() => false)
|
|
222
|
+
.finally(() => {
|
|
223
|
+
this.connecting = undefined;
|
|
166
224
|
});
|
|
167
|
-
|
|
225
|
+
return this.connecting;
|
|
226
|
+
}
|
|
227
|
+
request(method, params, timeoutMs) {
|
|
228
|
+
if (!this.peer)
|
|
229
|
+
return Promise.reject(new Error("Codex's background server is not connected"));
|
|
230
|
+
return this.peer.request(method, params, timeoutMs);
|
|
231
|
+
}
|
|
232
|
+
close() {
|
|
233
|
+
this.closing = true;
|
|
234
|
+
this.peer?.close("stopping");
|
|
235
|
+
this.socket?.close();
|
|
236
|
+
this.peer = undefined;
|
|
237
|
+
this.socket = undefined;
|
|
238
|
+
}
|
|
239
|
+
dropped(reason) {
|
|
240
|
+
this.peer = undefined;
|
|
241
|
+
this.socket = undefined;
|
|
242
|
+
this.options.onDown(reason);
|
|
168
243
|
}
|
|
169
244
|
}
|
|
170
245
|
//# sourceMappingURL=app-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-server.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/codex/app-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAc,MAAM,iBAAiB,CAAC;AAE/D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,4EAA4E;AAC5E,MAAM,qBAAqB,GAAG;IAC5B,4BAA4B;IAC5B,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,iCAAiC;IACjC,uBAAuB;IACvB,2BAA2B;IAC3B,8BAA8B;IAC9B,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-server.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/codex/app-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAc,MAAM,iBAAiB,CAAC;AAE/D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,4EAA4E;AAC5E,MAAM,qBAAqB,GAAG;IAC5B,4BAA4B;IAC5B,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,iCAAiC;IACjC,uBAAuB;IACvB,2BAA2B;IAC3B,8BAA8B;IAC9B,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAmBF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;AAC5G,CAAC;AAED,wIAAwI;AACxI,KAAK,UAAU,cAAc,CAAC,OAA+B,EAAE,OAAsB;IACnF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1H,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC;QACvB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1E,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,OAAO;QACnF,gBAAgB,EAAE,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACjD,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,8FAA8F;IAC9F,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;YACrF,wHAAwH;YACxH,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE;SACrH,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC/B,KAAK,GAAG,IAAI,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,GAAuB;IAC1E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAE5D,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,GAAuB;IAC1E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAsB,EAAE;QACvD,MAAM,KAAK,GAAG,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,CACH,CAAC;IACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACpI,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAMI;IALrB,KAAK,CAAgB;IACrB,MAAM,CAAa;IACnB,IAAI,CAAW;IACf,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAE/D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,KAAK,CACjB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAC/B,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAC/H,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC7D,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,UAAU,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,4BAA4B,MAAM,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1G,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAI,MAAc,EAAE,MAAe,EAAE,SAAkB;QAC5D,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,IAAI,SAAkB,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gDAAgD,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAC7G,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IAMC;IALrB,MAAM,CAAa;IACnB,IAAI,CAAW;IACf,UAAU,CAAoB;IAC9B,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;IAAG,CAAC;IAEhE,+FAA+F;IAC/F,OAAO;QACL,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,KAAK,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAClH,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;aAClB,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,OAAO,CAAI,MAAc,EAAE,MAAe,EAAE,SAAkB;QAC5D,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEO,OAAO,CAAC,MAAc;QAC5B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Where the desktop app's bus listens (the first Codex window to start serves it). */
|
|
2
|
+
export declare function desktopBusSocket(env?: NodeJS.ProcessEnv): string;
|
|
3
|
+
/**
|
|
4
|
+
* Asks whichever Codex window runs `threadId` to stop its turn, as its own
|
|
5
|
+
* Stop button does. Resolves when that window says it has; rejects when no
|
|
6
|
+
* window runs the thread, none answers in time, or the app isn't there.
|
|
7
|
+
*/
|
|
8
|
+
export declare function interruptThroughDesktop(socketPath: string, threadId: string, turnId: string | undefined, timeoutMs?: number): Promise<void>;
|