linkshell-cli 0.5.42 → 0.6.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.
Files changed (135) hide show
  1. package/dist/cli/src/commands/host.d.ts +30 -0
  2. package/dist/cli/src/commands/host.js +278 -0
  3. package/dist/cli/src/commands/host.js.map +1 -0
  4. package/dist/cli/src/commands/pair.d.ts +1 -0
  5. package/dist/cli/src/commands/pair.js +51 -0
  6. package/dist/cli/src/commands/pair.js.map +1 -0
  7. package/dist/cli/src/index.js +69 -0
  8. package/dist/cli/src/index.js.map +1 -1
  9. package/dist/cli/src/utils/daemon.d.ts +1 -1
  10. package/dist/cli/src/utils/daemon.js +3 -2
  11. package/dist/cli/src/utils/daemon.js.map +1 -1
  12. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  13. package/dist/host/src/drivers/acp/connection.d.ts +61 -0
  14. package/dist/host/src/drivers/acp/connection.js +121 -0
  15. package/dist/host/src/drivers/acp/connection.js.map +1 -0
  16. package/dist/host/src/drivers/acp/driver.d.ts +110 -0
  17. package/dist/host/src/drivers/acp/driver.js +438 -0
  18. package/dist/host/src/drivers/acp/driver.js.map +1 -0
  19. package/dist/host/src/drivers/acp/mapper.d.ts +49 -0
  20. package/dist/host/src/drivers/acp/mapper.js +411 -0
  21. package/dist/host/src/drivers/acp/mapper.js.map +1 -0
  22. package/dist/host/src/drivers/auth.d.ts +7 -0
  23. package/dist/host/src/drivers/auth.js +57 -0
  24. package/dist/host/src/drivers/auth.js.map +1 -0
  25. package/dist/host/src/drivers/claude/driver.d.ts +76 -0
  26. package/dist/host/src/drivers/claude/driver.js +331 -0
  27. package/dist/host/src/drivers/claude/driver.js.map +1 -0
  28. package/dist/host/src/drivers/claude/transcript.d.ts +335 -0
  29. package/dist/host/src/drivers/claude/transcript.js +516 -0
  30. package/dist/host/src/drivers/claude/transcript.js.map +1 -0
  31. package/dist/host/src/drivers/codex/app-server.d.ts +36 -0
  32. package/dist/host/src/drivers/codex/app-server.js +144 -0
  33. package/dist/host/src/drivers/codex/app-server.js.map +1 -0
  34. package/dist/host/src/drivers/codex/driver.d.ts +89 -0
  35. package/dist/host/src/drivers/codex/driver.js +452 -0
  36. package/dist/host/src/drivers/codex/driver.js.map +1 -0
  37. package/dist/host/src/drivers/codex/mapper.d.ts +61 -0
  38. package/dist/host/src/drivers/codex/mapper.js +623 -0
  39. package/dist/host/src/drivers/codex/mapper.js.map +1 -0
  40. package/dist/host/src/drivers/codex/settings.d.ts +51 -0
  41. package/dist/host/src/drivers/codex/settings.js +107 -0
  42. package/dist/host/src/drivers/codex/settings.js.map +1 -0
  43. package/dist/host/src/drivers/images.d.ts +11 -0
  44. package/dist/host/src/drivers/images.js +34 -0
  45. package/dist/host/src/drivers/images.js.map +1 -0
  46. package/dist/host/src/drivers/nesting.d.ts +6 -0
  47. package/dist/host/src/drivers/nesting.js +25 -0
  48. package/dist/host/src/drivers/nesting.js.map +1 -0
  49. package/dist/host/src/drivers/registry.d.ts +21 -0
  50. package/dist/host/src/drivers/registry.js +30 -0
  51. package/dist/host/src/drivers/registry.js.map +1 -0
  52. package/dist/host/src/drivers/types.d.ts +105 -0
  53. package/dist/host/src/drivers/types.js +2 -0
  54. package/dist/host/src/drivers/types.js.map +1 -0
  55. package/dist/host/src/fs.d.ts +69 -0
  56. package/dist/host/src/fs.js +198 -0
  57. package/dist/host/src/fs.js.map +1 -0
  58. package/dist/host/src/gateway.d.ts +55 -0
  59. package/dist/host/src/gateway.js +263 -0
  60. package/dist/host/src/gateway.js.map +1 -0
  61. package/dist/host/src/host.d.ts +51 -0
  62. package/dist/host/src/host.js +133 -0
  63. package/dist/host/src/host.js.map +1 -0
  64. package/dist/host/src/hub.d.ts +89 -0
  65. package/dist/host/src/hub.js +592 -0
  66. package/dist/host/src/hub.js.map +1 -0
  67. package/dist/host/src/index.d.ts +10 -0
  68. package/dist/host/src/index.js +10 -0
  69. package/dist/host/src/index.js.map +1 -0
  70. package/dist/host/src/ports.d.ts +24 -0
  71. package/dist/host/src/ports.js +201 -0
  72. package/dist/host/src/ports.js.map +1 -0
  73. package/dist/host/src/rpc/client.d.ts +9 -0
  74. package/dist/host/src/rpc/client.js +42 -0
  75. package/dist/host/src/rpc/client.js.map +1 -0
  76. package/dist/host/src/rpc/server.d.ts +52 -0
  77. package/dist/host/src/rpc/server.js +293 -0
  78. package/dist/host/src/rpc/server.js.map +1 -0
  79. package/dist/host/src/screen.d.ts +30 -0
  80. package/dist/host/src/screen.js +230 -0
  81. package/dist/host/src/screen.js.map +1 -0
  82. package/dist/host/src/shell-env.d.ts +8 -0
  83. package/dist/host/src/shell-env.js +39 -0
  84. package/dist/host/src/shell-env.js.map +1 -0
  85. package/dist/host/src/store.d.ts +75 -0
  86. package/dist/host/src/store.js +265 -0
  87. package/dist/host/src/store.js.map +1 -0
  88. package/dist/host/src/terminals.d.ts +55 -0
  89. package/dist/host/src/terminals.js +367 -0
  90. package/dist/host/src/terminals.js.map +1 -0
  91. package/dist/shared-protocol/src/index.d.ts +3345 -3345
  92. package/dist/wire/src/crypto.d.ts +65 -0
  93. package/dist/wire/src/crypto.js +253 -0
  94. package/dist/wire/src/crypto.js.map +1 -0
  95. package/dist/wire/src/index.d.ts +8 -0
  96. package/dist/wire/src/index.js +9 -0
  97. package/dist/wire/src/index.js.map +1 -0
  98. package/dist/wire/src/model.d.ts +704 -0
  99. package/dist/wire/src/model.js +163 -0
  100. package/dist/wire/src/model.js.map +1 -0
  101. package/dist/wire/src/peer.d.ts +42 -0
  102. package/dist/wire/src/peer.js +143 -0
  103. package/dist/wire/src/peer.js.map +1 -0
  104. package/dist/wire/src/relay-client.d.ts +82 -0
  105. package/dist/wire/src/relay-client.js +259 -0
  106. package/dist/wire/src/relay-client.js.map +1 -0
  107. package/dist/wire/src/relay.d.ts +481 -0
  108. package/dist/wire/src/relay.js +129 -0
  109. package/dist/wire/src/relay.js.map +1 -0
  110. package/dist/wire/src/rpc.d.ts +4170 -0
  111. package/dist/wire/src/rpc.js +332 -0
  112. package/dist/wire/src/rpc.js.map +1 -0
  113. package/dist/wire/src/shell.d.ts +2 -0
  114. package/dist/wire/src/shell.js +62 -0
  115. package/dist/wire/src/shell.js.map +1 -0
  116. package/dist/wire/src/updates.d.ts +3325 -0
  117. package/dist/wire/src/updates.js +210 -0
  118. package/dist/wire/src/updates.js.map +1 -0
  119. package/package.json +8 -3
  120. package/src/commands/host.ts +297 -0
  121. package/src/commands/pair.ts +52 -0
  122. package/src/index.ts +74 -0
  123. package/src/utils/daemon.ts +4 -3
  124. package/dist/cli/src/commands/hook.d.ts +0 -6
  125. package/dist/cli/src/commands/hook.js +0 -120
  126. package/dist/cli/src/commands/hook.js.map +0 -1
  127. package/dist/cli/src/runtime/acp/agent-workspace-git.d.ts +0 -63
  128. package/dist/cli/src/runtime/acp/agent-workspace-git.js +0 -297
  129. package/dist/cli/src/runtime/acp/agent-workspace-git.js.map +0 -1
  130. package/dist/cli/src/runtime/acp-relay.d.ts +0 -23
  131. package/dist/cli/src/runtime/acp-relay.js +0 -73
  132. package/dist/cli/src/runtime/acp-relay.js.map +0 -1
  133. package/dist/cli/src/runtime/hook-permission-server.d.ts +0 -36
  134. package/dist/cli/src/runtime/hook-permission-server.js +0 -147
  135. package/dist/cli/src/runtime/hook-permission-server.js.map +0 -1
@@ -0,0 +1,133 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir, hostname, platform } from "node:os";
3
+ import { join } from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import { defaultDrivers } from "./drivers/registry.js";
6
+ import { SessionHub } from "./hub.js";
7
+ import { connectHost } from "./rpc/client.js";
8
+ import { HostRpcServer } from "./rpc/server.js";
9
+ import { GatewayLink } from "./gateway.js";
10
+ import { HostStore } from "./store.js";
11
+ import { TerminalManager } from "./terminals.js";
12
+ /** macOS sun_path is 104 bytes including the terminator. */
13
+ const MAX_SOCKET_PATH = 100;
14
+ /** `~/.linkshell`, or `$LINKSHELL_HOME` (tests, multiple instances). */
15
+ export function defaultHome() {
16
+ return process.env.LINKSHELL_HOME || join(homedir(), ".linkshell");
17
+ }
18
+ export function hostPaths(home = defaultHome()) {
19
+ let runDir = join(home, "run");
20
+ if (join(runDir, "codex.sock").length > MAX_SOCKET_PATH) {
21
+ // Very long home directories: fall back to a short per-user directory.
22
+ runDir = join("/tmp", `linkshell-${process.getuid?.() ?? "user"}`);
23
+ }
24
+ return {
25
+ home,
26
+ runDir,
27
+ hostSocket: join(runDir, "host.sock"),
28
+ codexSocket: join(runDir, "codex.sock"),
29
+ database: join(home, "state.db"),
30
+ };
31
+ }
32
+ function loadMachineId(home) {
33
+ const path = join(home, "machine.json");
34
+ try {
35
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
36
+ if (typeof parsed.machineId === "string" && parsed.machineId)
37
+ return parsed.machineId;
38
+ }
39
+ catch {
40
+ // Missing or unreadable: mint a new identity below.
41
+ }
42
+ const machineId = randomUUID();
43
+ writeFileSync(path, `${JSON.stringify({ machineId, createdAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
44
+ return machineId;
45
+ }
46
+ /** True when another host already answers on the socket. */
47
+ export async function isHostRunning(socketPath) {
48
+ if (!existsSync(socketPath))
49
+ return false;
50
+ try {
51
+ const client = await connectHost(socketPath);
52
+ client.close();
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ export async function startHost(options) {
60
+ const log = options.log ?? ((message) => process.stderr.write(`${message}\n`));
61
+ const paths = hostPaths(options.home);
62
+ mkdirSync(paths.home, { recursive: true, mode: 0o700 });
63
+ mkdirSync(paths.runDir, { recursive: true, mode: 0o700 });
64
+ chmodSync(paths.runDir, 0o700);
65
+ if (await isHostRunning(paths.hostSocket)) {
66
+ throw new Error(`a LinkShell host is already running (${paths.hostSocket})`);
67
+ }
68
+ const machineId = loadMachineId(paths.home);
69
+ const drivers = options.drivers
70
+ ? options.drivers(paths)
71
+ : defaultDrivers({
72
+ env: options.env,
73
+ hostVersion: options.version,
74
+ codexSocket: paths.codexSocket,
75
+ codexCommand: options.codexCommand,
76
+ claudeCommand: options.claudeCommand,
77
+ claudeAdapter: options.claudeAdapter,
78
+ });
79
+ const store = new HostStore(paths.database);
80
+ const hub = new SessionHub(store, drivers, log);
81
+ await hub.start({ discoveryIntervalMs: options.discoveryIntervalMs });
82
+ const machineInfo = () => ({
83
+ machineId,
84
+ hostname: hostname(),
85
+ platform: platform(),
86
+ hostVersion: options.version,
87
+ agents: hub.agents(),
88
+ });
89
+ const terminals = new TerminalManager(options.env, store);
90
+ const server = new HostRpcServer({
91
+ hub,
92
+ terminals,
93
+ machineInfo,
94
+ socketPath: paths.hostSocket,
95
+ tcpPort: options.tcpPort,
96
+ log,
97
+ });
98
+ await server.start();
99
+ let gateway;
100
+ if (options.gateway) {
101
+ gateway = new GatewayLink({
102
+ url: options.gateway.url,
103
+ home: paths.home,
104
+ token: options.gateway.token,
105
+ name: options.gateway.name,
106
+ serve: (transport) => server.connect(transport),
107
+ onChange: (status) => server.broadcast("gateway.changed", status),
108
+ onPaired: (device) => server.broadcast("pairing.done", { device }),
109
+ log,
110
+ });
111
+ server.setGateway(gateway);
112
+ gateway.start();
113
+ }
114
+ let stopping;
115
+ return {
116
+ paths,
117
+ hub,
118
+ server,
119
+ gateway,
120
+ machineInfo,
121
+ stop() {
122
+ stopping ??= (async () => {
123
+ gateway?.stop();
124
+ await server.stop();
125
+ terminals.stop();
126
+ await hub.stop();
127
+ store.close();
128
+ })();
129
+ return stopping;
130
+ },
131
+ };
132
+ }
133
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../../host/src/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type AgentInfo, type ContentBlock, type SessionEvent, type SessionSummary } from "@linkshell/wire";
2
+ import type { AgentDriver, DesktopController, DesktopLaunchContext, DriverHost, LaunchSpec } from "./drivers/types.js";
3
+ import type { HostStore } from "./store.js";
4
+ export interface Subscriber {
5
+ event(event: SessionEvent): void;
6
+ }
7
+ /**
8
+ * The host's source of truth for sessions. Drivers push native events in;
9
+ * the hub logs them with a per-session seq, keeps summaries current and fans
10
+ * events out to subscribed clients.
11
+ */
12
+ export declare class SessionHub {
13
+ private readonly store;
14
+ private readonly log;
15
+ private readonly drivers;
16
+ private readonly live;
17
+ private readonly summaryListeners;
18
+ private readonly auth;
19
+ /** Terminals (`linkshell <agent>`) currently driving handoff sessions. */
20
+ private readonly desktops;
21
+ private discoveryTimer?;
22
+ private authRefreshing?;
23
+ readonly driverHost: DriverHost;
24
+ constructor(store: HostStore, drivers: AgentDriver[], log?: (message: string) => void);
25
+ start(options?: {
26
+ discoveryIntervalMs?: number;
27
+ }): Promise<void>;
28
+ /** Re-lists recent sessions from every running agent. */
29
+ refreshDiscovery(limit?: number): Promise<void>;
30
+ stop(): Promise<void>;
31
+ agents(): AgentInfo[];
32
+ /** Re-checks login state in the background when the cached answer is older than `maxAgeMs`. */
33
+ refreshAuthIfStale(maxAgeMs?: number): Promise<void>;
34
+ private refreshAuth;
35
+ onSummary(listener: (summary: SessionSummary) => void): () => void;
36
+ listSessions(options: {
37
+ limit?: number;
38
+ before?: number;
39
+ includeArchived?: boolean;
40
+ }): {
41
+ sessions: SessionSummary[];
42
+ nextBefore?: number;
43
+ };
44
+ listProjects(limit?: number): {
45
+ cwd: string;
46
+ name: string;
47
+ lastActiveAt: number;
48
+ sessionCount: number;
49
+ }[];
50
+ getSession(sessionId: string): SessionSummary;
51
+ /** Adds the live-only fields (current activity, first pending permission) to a stored summary. */
52
+ private decorate;
53
+ createSession(input: {
54
+ agent: string;
55
+ cwd: string;
56
+ model?: string;
57
+ prompt?: ContentBlock[];
58
+ clientMessageId?: string;
59
+ }): Promise<SessionSummary>;
60
+ /**
61
+ * Sends everything after `fromSeq`, then streams live events. The backlog read
62
+ * and the subscriber registration happen in one synchronous step, so no event
63
+ * can fall between them.
64
+ */
65
+ subscribe(sessionId: string, fromSeq: number, subscriber: Subscriber): Promise<SessionSummary>;
66
+ unsubscribe(sessionId: string, subscriber: Subscriber): void;
67
+ prompt(sessionId: string, clientMessageId: string, content: ContentBlock[]): Promise<"started" | "steered" | "queued" | "duplicate">;
68
+ /** Retries attaching a session that just became joinable. */
69
+ private attachWhenReady;
70
+ cancel(sessionId: string): Promise<void>;
71
+ respondPermission(sessionId: string, requestId: string, optionId: string): Promise<void>;
72
+ desktopLaunch(agent: string, args: string[], sessionId: string | undefined, context: DesktopLaunchContext): Promise<LaunchSpec & {
73
+ sessionId?: string;
74
+ }>;
75
+ /** Registers the terminal driving a handoff session; returns the unregister function. */
76
+ registerDesktop(sessionId: string, controller: DesktopController): () => void;
77
+ takeover(sessionId: string): Promise<SessionSummary>;
78
+ reclaim(sessionId: string, context: DesktopLaunchContext): Promise<LaunchSpec>;
79
+ setConfig(sessionId: string, optionId: string, value: string): Promise<void>;
80
+ private requireDriver;
81
+ private liveFor;
82
+ /** Never throws synchronously: failures always arrive as a rejected promise. */
83
+ private ensureAttached;
84
+ private recordDiscovered;
85
+ private ingest;
86
+ private commit;
87
+ private applyToSummary;
88
+ private emitSummary;
89
+ }