@paradow/ledge 0.10.0 → 0.12.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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pickName
3
- } from "./chunk-JOCNCNRP.js";
3
+ } from "./chunk-VY45MACP.js";
4
4
  import {
5
5
  paths
6
6
  } from "./chunk-FGOFRWIB.js";
@@ -143,9 +143,22 @@ function claudeSessionId(tool, args) {
143
143
  function exitFile(id) {
144
144
  return join2(paths().dir, `exit-${id}`);
145
145
  }
146
+ var PARENT_AGENT_VARS = [
147
+ "CLAUDECODE",
148
+ "CLAUDE_CODE_CHILD_SESSION",
149
+ "CLAUDE_CODE_SESSION_ID",
150
+ "CLAUDE_CODE_SESSION_ATTENDED",
151
+ "CLAUDE_CODE_ENTRYPOINT",
152
+ "CLAUDE_CODE_EXECPATH",
153
+ "CLAUDE_CODE_MESSAGING_SOCKET",
154
+ "CLAUDE_CODE_MESSAGING_TOKEN",
155
+ "CLAUDE_PID",
156
+ "CLAUDE_EFFORT"
157
+ ];
158
+ var PARENT_AGENT = new Set(PARENT_AGENT_VARS);
146
159
  function agentEnv(base, extra) {
147
160
  const env = {};
148
- for (const [k, v] of Object.entries(base)) if (v !== void 0 && k !== "TMUX" && !k.startsWith("TMUX_")) env[k] = v;
161
+ for (const [k, v] of Object.entries(base)) if (v !== void 0 && k !== "TMUX" && !k.startsWith("TMUX_") && !PARENT_AGENT.has(k)) env[k] = v;
149
162
  return { ...env, ...extra };
150
163
  }
151
164
  async function spawnSession(opts) {
@@ -163,7 +176,7 @@ async function spawnSession(opts) {
163
176
  const env = opts.env ?? process.env;
164
177
  const transcriptPath = agentSessionId ? claudeTranscriptPath(opts.cwd, agentSessionId, env) : void 0;
165
178
  const command = opts.recordExit ? ["sh", "-c", '"$@"; echo $? > "$0"', exitFile(id), ...agent] : agent;
166
- await opts.tmux.newSession({ name: tmuxSession, cwd: opts.cwd, env: agentEnv(env, { LEDGE_SESSION: id, LEDGE_NAME: name, ...opts.tool === "codex" ? { [CODEX_ENV_VAR]: id } : {} }), command });
179
+ await opts.tmux.newSession({ name: tmuxSession, cwd: opts.cwd, env: agentEnv(env, { LEDGE_SESSION: id, LEDGE_NAME: name, ...opts.tool === "codex" ? { [CODEX_ENV_VAR]: id } : {} }), unset: PARENT_AGENT_VARS, command });
167
180
  const at = now();
168
181
  return { id, name, tool: opts.tool, cwd: opts.cwd, project, title: `${name} \xB7 ${project}`, tmuxSession, state: "starting", helpers: [], startedAt: at, lastActivityAt: at, source: "launcher", ...agentSessionId ? { agentSessionId } : {}, ...transcriptPath ? { transcriptPath } : {} };
169
182
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-TO4XO2ML.js";
3
+ } from "./chunk-ZEHTNFPV.js";
4
4
  import {
5
5
  ensureLedgeDir,
6
6
  paths
@@ -1,11 +1,18 @@
1
1
  import {
2
+ MESSAGE_MAX,
2
3
  PROTOCOL_PORT,
4
+ SUMMARY_MAX,
3
5
  parseServerMessage,
4
6
  readDaemonToken
5
- } from "./chunk-JOCNCNRP.js";
7
+ } from "./chunk-VY45MACP.js";
6
8
 
7
9
  // src/client.ts
8
10
  import WebSocket from "ws";
11
+ async function sendMessageAndAwaitAck(client, msg, timeoutMs) {
12
+ if (msg.text.length > MESSAGE_MAX) return { type: "message.ack", rid: msg.rid, outcome: "refused", reason: `message trop long (${msg.text.length} caract\xE8res, ${MESSAGE_MAX} au plus)` };
13
+ client.send(msg.summary && msg.summary.length > SUMMARY_MAX ? { ...msg, summary: msg.summary.slice(0, SUMMARY_MAX) } : msg);
14
+ return client.next("message.ack", timeoutMs);
15
+ }
9
16
  var DaemonRefusedError = class extends Error {
10
17
  };
11
18
  function connect(opts = {}) {
@@ -82,6 +89,7 @@ function connect(opts = {}) {
82
89
  }
83
90
 
84
91
  export {
92
+ sendMessageAndAwaitAck,
85
93
  DaemonRefusedError,
86
94
  connect
87
95
  };
@@ -30,8 +30,9 @@ function realTmux(socket = "ledge", opts = {}) {
30
30
  const base = () => ["-L", socket, "-f", paths().tmuxConf];
31
31
  const t = (args, env) => run([...base(), ...args], env);
32
32
  return {
33
- async newSession({ name, cwd, env, command }) {
33
+ async newSession({ name, cwd, env, unset = [], command }) {
34
34
  const envArgs = Object.entries(env).flatMap(([k, v]) => ["-e", `${k}=${v}`]);
35
+ if (unset.length) command = ["env", ...unset.flatMap((v) => ["-u", v]), ...command];
35
36
  const clientEnv = env.PATH === void 0 ? void 0 : { ...process.env, PATH: env.PATH };
36
37
  const args = [...base(), "new-session", "-d", "-s", name, "-c", cwd, "-x", "200", "-y", "50", ...envArgs, "--", ...command];
37
38
  const serverUp = (await t(["list-sessions"])).code === 0;
@@ -80,8 +81,8 @@ function realTmux(socket = "ledge", opts = {}) {
80
81
  async killSession(name) {
81
82
  await t(["kill-session", "-t", `=${name}`]);
82
83
  },
83
- attachArgs(name) {
84
- return [...base(), "attach-session", "-t", `=${name}`];
84
+ attachArgs(name, opts2) {
85
+ return [...base(), "attach-session", ...opts2?.readOnly ? ["-r"] : [], "-t", `=${name}`];
85
86
  }
86
87
  };
87
88
  }
@@ -1,20 +1,20 @@
1
+ import {
2
+ DaemonRefusedError,
3
+ connect
4
+ } from "./chunk-XXFUYME7.js";
1
5
  import {
2
6
  exitFile,
3
7
  spawnSession
4
- } from "./chunk-GMKS55KF.js";
8
+ } from "./chunk-X34LPKG7.js";
9
+ import {
10
+ PROTOCOL_PORT
11
+ } from "./chunk-VY45MACP.js";
5
12
  import {
6
13
  realTmux
7
- } from "./chunk-TO4XO2ML.js";
14
+ } from "./chunk-ZEHTNFPV.js";
8
15
  import {
9
16
  log
10
17
  } from "./chunk-YUSY3E47.js";
11
- import {
12
- DaemonRefusedError,
13
- connect
14
- } from "./chunk-TC3XJUJA.js";
15
- import {
16
- PROTOCOL_PORT
17
- } from "./chunk-JOCNCNRP.js";
18
18
  import {
19
19
  ensureLedgeDir
20
20
  } from "./chunk-FGOFRWIB.js";