@linkshell/host 0.4.69 → 0.4.71

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 (109) hide show
  1. package/dist/host/src/acp-settings.js +1 -1
  2. package/dist/host/src/acp-settings.js.map +1 -1
  3. package/dist/host/src/computer-preview.d.ts +1 -9
  4. package/dist/host/src/drivers/acp/antigravity.d.ts +13 -0
  5. package/dist/host/src/drivers/acp/antigravity.js +13 -0
  6. package/dist/host/src/drivers/acp/antigravity.js.map +1 -1
  7. package/dist/host/src/drivers/acp/driver.d.ts +14 -1
  8. package/dist/host/src/drivers/acp/driver.js +45 -3
  9. package/dist/host/src/drivers/acp/driver.js.map +1 -1
  10. package/dist/host/src/drivers/acp/mapper.d.ts +2 -0
  11. package/dist/host/src/drivers/acp/mapper.js +6 -1
  12. package/dist/host/src/drivers/acp/mapper.js.map +1 -1
  13. package/dist/host/src/drivers/acp/questions.js +2 -2
  14. package/dist/host/src/drivers/acp/questions.js.map +1 -1
  15. package/dist/host/src/drivers/claude/app-sessions.d.ts +58 -0
  16. package/dist/host/src/drivers/claude/app-sessions.js +183 -0
  17. package/dist/host/src/drivers/claude/app-sessions.js.map +1 -0
  18. package/dist/host/src/drivers/claude/driver.d.ts +22 -1
  19. package/dist/host/src/drivers/claude/driver.js +99 -11
  20. package/dist/host/src/drivers/claude/driver.js.map +1 -1
  21. package/dist/host/src/drivers/claude/holders.d.ts +3 -1
  22. package/dist/host/src/drivers/claude/holders.js +4 -0
  23. package/dist/host/src/drivers/claude/holders.js.map +1 -1
  24. package/dist/host/src/drivers/claude/routing.d.ts +19 -0
  25. package/dist/host/src/drivers/claude/routing.js +145 -0
  26. package/dist/host/src/drivers/claude/routing.js.map +1 -0
  27. package/dist/host/src/drivers/claude/tasks.d.ts +3 -3
  28. package/dist/host/src/drivers/claude/transcript.d.ts +393 -348
  29. package/dist/host/src/drivers/claude/transcript.js +97 -22
  30. package/dist/host/src/drivers/claude/transcript.js.map +1 -1
  31. package/dist/host/src/drivers/codex/driver.d.ts +15 -0
  32. package/dist/host/src/drivers/codex/driver.js +47 -9
  33. package/dist/host/src/drivers/codex/driver.js.map +1 -1
  34. package/dist/host/src/drivers/codex/mapper.d.ts +41 -7
  35. package/dist/host/src/drivers/codex/mapper.js +167 -26
  36. package/dist/host/src/drivers/codex/mapper.js.map +1 -1
  37. package/dist/host/src/drivers/codex/mcp-apps.d.ts +69 -0
  38. package/dist/host/src/drivers/codex/mcp-apps.js +340 -0
  39. package/dist/host/src/drivers/codex/mcp-apps.js.map +1 -0
  40. package/dist/host/src/drivers/codex/settings.d.ts +13 -0
  41. package/dist/host/src/drivers/codex/settings.js +22 -6
  42. package/dist/host/src/drivers/codex/settings.js.map +1 -1
  43. package/dist/host/src/drivers/types.d.ts +50 -1
  44. package/dist/host/src/fs.d.ts +9 -9
  45. package/dist/host/src/hub.d.ts +118 -81
  46. package/dist/host/src/hub.js +157 -13
  47. package/dist/host/src/hub.js.map +1 -1
  48. package/dist/host/src/input.d.ts +43 -89
  49. package/dist/host/src/input.js +1 -1
  50. package/dist/host/src/input.js.map +1 -1
  51. package/dist/host/src/rpc/mcp.d.ts +8 -0
  52. package/dist/host/src/rpc/mcp.js +33 -0
  53. package/dist/host/src/rpc/mcp.js.map +1 -0
  54. package/dist/host/src/rpc/server.js +16 -2
  55. package/dist/host/src/rpc/server.js.map +1 -1
  56. package/dist/host/src/screen-session.d.ts +3 -17
  57. package/dist/host/src/screen-session.js +2 -2
  58. package/dist/host/src/screen-session.js.map +1 -1
  59. package/dist/host/src/store.d.ts +7 -0
  60. package/dist/host/src/store.js +27 -3
  61. package/dist/host/src/store.js.map +1 -1
  62. package/dist/host/src/terminals.d.ts +12 -6
  63. package/dist/host/src/terminals.js +29 -2
  64. package/dist/host/src/terminals.js.map +1 -1
  65. package/dist/host/src/usage.d.ts +5 -0
  66. package/dist/host/src/usage.js +10 -2
  67. package/dist/host/src/usage.js.map +1 -1
  68. package/dist/host/tsconfig.tsbuildinfo +1 -1
  69. package/dist/wire/src/acp.d.ts +68 -430
  70. package/dist/wire/src/acp.js +5 -5
  71. package/dist/wire/src/acp.js.map +1 -1
  72. package/dist/wire/src/async-questions.d.ts +2 -10
  73. package/dist/wire/src/computer-preview.d.ts +1 -15
  74. package/dist/wire/src/computer-preview.js +1 -1
  75. package/dist/wire/src/computer-preview.js.map +1 -1
  76. package/dist/wire/src/content.d.ts +207 -372
  77. package/dist/wire/src/content.js +4 -4
  78. package/dist/wire/src/content.js.map +1 -1
  79. package/dist/wire/src/editor.d.ts +48 -592
  80. package/dist/wire/src/envelopes.d.ts +53 -0
  81. package/dist/wire/src/envelopes.js +263 -0
  82. package/dist/wire/src/envelopes.js.map +1 -0
  83. package/dist/wire/src/goal.d.ts +15 -48
  84. package/dist/wire/src/index.d.ts +2 -0
  85. package/dist/wire/src/index.js +2 -0
  86. package/dist/wire/src/index.js.map +1 -1
  87. package/dist/wire/src/live-activity.d.ts +83 -212
  88. package/dist/wire/src/live-activity.js +1 -1
  89. package/dist/wire/src/live-activity.js.map +1 -1
  90. package/dist/wire/src/model.d.ts +458 -2281
  91. package/dist/wire/src/model.js +24 -0
  92. package/dist/wire/src/model.js.map +1 -1
  93. package/dist/wire/src/relay.d.ts +41 -267
  94. package/dist/wire/src/relay.js +1 -1
  95. package/dist/wire/src/relay.js.map +1 -1
  96. package/dist/wire/src/rpc-mcp.d.ts +84 -0
  97. package/dist/wire/src/rpc-mcp.js +78 -0
  98. package/dist/wire/src/rpc-mcp.js.map +1 -0
  99. package/dist/wire/src/rpc.d.ts +6891 -31073
  100. package/dist/wire/src/rpc.js +35 -7
  101. package/dist/wire/src/rpc.js.map +1 -1
  102. package/dist/wire/src/side.d.ts +13 -61
  103. package/dist/wire/src/updates.d.ts +1771 -6680
  104. package/dist/wire/src/updates.js +14 -1
  105. package/dist/wire/src/updates.js.map +1 -1
  106. package/dist/wire/src/usage.d.ts +17 -195
  107. package/dist/wire/src/watch.d.ts +223 -1141
  108. package/dist/wire/src/workflow.d.ts +46 -139
  109. package/package.json +4 -4
@@ -0,0 +1,145 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { promisify } from "node:util";
4
+ const execFileAsync = promisify(execFile);
5
+ // Which API a Claude talks to is in its environment, and the Claude that has a
6
+ // session open on the computer may have been given one the host never sees: the
7
+ // desktop app injects the provider chosen in its own settings, a terminal may
8
+ // export a relay, a switcher may have edited settings.json since. A device
9
+ // continuing that session should reach the same API, wherever that is.
10
+ /** Variables that decide where Claude sends its requests and with what credentials. */
11
+ const ROUTING_NAMES = [
12
+ "ANTHROPIC_BASE_URL",
13
+ "ANTHROPIC_AUTH_TOKEN",
14
+ "ANTHROPIC_API_KEY",
15
+ "ANTHROPIC_CUSTOM_HEADERS",
16
+ "ANTHROPIC_BEDROCK_BASE_URL",
17
+ "ANTHROPIC_VERTEX_BASE_URL",
18
+ "ANTHROPIC_VERTEX_PROJECT_ID",
19
+ "ANTHROPIC_FOUNDRY_BASE_URL",
20
+ "ANTHROPIC_FOUNDRY_RESOURCE",
21
+ "ANTHROPIC_FOUNDRY_API_KEY",
22
+ "CLAUDE_CODE_USE_BEDROCK",
23
+ "CLAUDE_CODE_USE_VERTEX",
24
+ "CLAUDE_CODE_USE_FOUNDRY",
25
+ "CLAUDE_CODE_USE_GATEWAY",
26
+ "CLAUDE_CODE_USE_MANTLE",
27
+ "CLAUDE_CODE_USE_ANTHROPIC_AWS",
28
+ "CLAUDE_CODE_USE_ANTHROPIC_GOOGLE_CLOUD",
29
+ "CLAUDE_CODE_SKIP_BEDROCK_AUTH",
30
+ "CLAUDE_CODE_SKIP_VERTEX_AUTH",
31
+ "CLAUDE_CODE_SKIP_FOUNDRY_AUTH",
32
+ "AWS_REGION",
33
+ "AWS_PROFILE",
34
+ "AWS_BEARER_TOKEN_BEDROCK",
35
+ "CLOUD_ML_REGION",
36
+ "HTTPS_PROXY",
37
+ "https_proxy",
38
+ "HTTP_PROXY",
39
+ "http_proxy",
40
+ "ALL_PROXY",
41
+ "all_proxy",
42
+ "NO_PROXY",
43
+ "no_proxy",
44
+ "NODE_EXTRA_CA_CERTS",
45
+ "NODE_USE_SYSTEM_CA",
46
+ "API_TIMEOUT_MS",
47
+ // What "opus" or "sonnet" means is the provider's to say: a relay may serve
48
+ // only the ids it was configured with.
49
+ "ANTHROPIC_MODEL",
50
+ "ANTHROPIC_SMALL_FAST_MODEL",
51
+ "ANTHROPIC_DEFAULT_OPUS_MODEL",
52
+ "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME",
53
+ "ANTHROPIC_DEFAULT_SONNET_MODEL",
54
+ "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME",
55
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL",
56
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME",
57
+ "ANTHROPIC_DEFAULT_FABLE_MODEL",
58
+ "ANTHROPIC_DEFAULT_FABLE_MODEL_NAME",
59
+ "ANTHROPIC_DEFAULT_MYTHOS_MODEL",
60
+ "ANTHROPIC_DEFAULT_MYTHOS_MODEL_NAME",
61
+ "CLAUDE_CODE_SUBAGENT_MODEL",
62
+ ];
63
+ /**
64
+ * Set by a host that hands Claude its provider: Claude then takes the API from
65
+ * its environment over settings.json's `env`, which otherwise wins. Mirrored
66
+ * only as the holder has it, so the device's Claude resolves its API the same way.
67
+ */
68
+ const MANAGED = "CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST";
69
+ /** Proxies follow the API they belong to, but alone don't make a different one. */
70
+ const DECIDES = [...ROUTING_NAMES.filter((name) => !/proxy/i.test(name)), MANAGED];
71
+ /**
72
+ * The environment to give a Claude continuing a session `holder` has open, so
73
+ * it reaches the same API: the holder's routing variables, and empty values for
74
+ * the ones the host has and the holder doesn't (Claude treats empty as unset).
75
+ * Undefined when there's nothing to follow: the holder routes as the host
76
+ * already would, or it is signed in to a Claude account, whose token the
77
+ * desktop app renews (a copy would expire) and the host's Claude has its own of.
78
+ */
79
+ export function routingFrom(holder, own) {
80
+ if (holder.CLAUDE_CODE_OAUTH_TOKEN && !holder.ANTHROPIC_AUTH_TOKEN && !holder.ANTHROPIC_API_KEY)
81
+ return undefined;
82
+ if (DECIDES.every((name) => (holder[name] ?? "") === (own[name] ?? "")))
83
+ return undefined;
84
+ const routing = {};
85
+ for (const name of [...ROUTING_NAMES, MANAGED]) {
86
+ const value = holder[name] ?? (own[name] ? "" : undefined);
87
+ if (value !== undefined)
88
+ routing[name] = value;
89
+ }
90
+ return routing;
91
+ }
92
+ /** A process's environment, where the system lets another process of the same user read it. */
93
+ export async function processEnv(pid) {
94
+ try {
95
+ if (process.platform === "linux")
96
+ return parseEnviron(await readFile(`/proc/${pid}/environ`, "utf8"));
97
+ if (process.platform !== "darwin")
98
+ return undefined;
99
+ // -E appends the environment to the command line, one space between entries.
100
+ const [plain, full] = await Promise.all([
101
+ execFileAsync("/bin/ps", ["-ww", "-o", "command=", "-p", String(pid)], { timeout: 3000, maxBuffer: 4 * 1024 * 1024 }),
102
+ execFileAsync("/bin/ps", ["-wwE", "-o", "command=", "-p", String(pid)], { timeout: 3000, maxBuffer: 4 * 1024 * 1024 }),
103
+ ]);
104
+ return parsePsEnvironment(plain.stdout.trimEnd(), full.stdout.trimEnd());
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ export function parseEnviron(raw) {
111
+ const env = {};
112
+ for (const entry of raw.split("\0")) {
113
+ const index = entry.indexOf("=");
114
+ if (index > 0)
115
+ env[entry.slice(0, index)] = entry.slice(index + 1);
116
+ }
117
+ return env;
118
+ }
119
+ /**
120
+ * `ps -E` output with the command line taken off. Entries are joined by single
121
+ * spaces and values may hold spaces too, so a word starts a new entry only when
122
+ * it looks like NAME=; anything else belongs to the value before it.
123
+ */
124
+ export function parsePsEnvironment(command, withEnvironment) {
125
+ if (!withEnvironment.startsWith(command))
126
+ return undefined;
127
+ const rest = withEnvironment.slice(command.length).replace(/^ /, "");
128
+ // macOS shows nothing after the command for a process it protects.
129
+ if (!rest)
130
+ return undefined;
131
+ const env = {};
132
+ let name;
133
+ for (const word of rest.split(" ")) {
134
+ const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/s.exec(word);
135
+ if (match) {
136
+ name = match[1];
137
+ env[name] = match[2];
138
+ }
139
+ else if (name) {
140
+ env[name] += ` ${word}`;
141
+ }
142
+ }
143
+ return env;
144
+ }
145
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../../../src/drivers/claude/routing.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,14 @@ import type { BackgroundTask } from "@linkshell/wire";
3
3
  export declare class ClaudeTasks {
4
4
  private readonly emit;
5
5
  readonly records: Map<string, {
6
- title: string;
7
- kind: "shell" | "monitor";
8
6
  id: string;
7
+ kind: "shell" | "monitor";
8
+ title: string;
9
9
  state: "unknown" | "completed" | "failed" | "running" | "stopped";
10
10
  startedAt: number;
11
11
  toolCallId?: string | undefined;
12
- endedAt?: number | undefined;
13
12
  command?: string | undefined;
13
+ endedAt?: number | undefined;
14
14
  summary?: string | undefined;
15
15
  exitCode?: number | undefined;
16
16
  output?: boolean | undefined;