@paradow/ledge 0.33.0 → 0.35.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/cli/index.js +39003 -46
- package/dist/cli/reduceWorker.js +2037 -0
- package/dist/ledge-guide.md +26 -49
- package/package.json +5 -1
- package/dist/cli/action-QW2ZQQBN.js +0 -27
- package/dist/cli/attach-ULTYWCJ7.js +0 -74
- package/dist/cli/bridge-CSLF7EW6.js +0 -70
- package/dist/cli/chunk-3DB3VOMM.js +0 -723
- package/dist/cli/chunk-4HXJQEUN.js +0 -118
- package/dist/cli/chunk-4VNKZOC2.js +0 -160
- package/dist/cli/chunk-6IYPRUQG.js +0 -17
- package/dist/cli/chunk-ASYAWVFW.js +0 -95
- package/dist/cli/chunk-CCSUP5ZI.js +0 -45
- package/dist/cli/chunk-CPERVAPQ.js +0 -232
- package/dist/cli/chunk-CSLVBADC.js +0 -60
- package/dist/cli/chunk-E3LXONBI.js +0 -6
- package/dist/cli/chunk-GXL3X7M7.js +0 -144
- package/dist/cli/chunk-HOOHS3MX.js +0 -39
- package/dist/cli/chunk-JEGPTNWV.js +0 -270
- package/dist/cli/chunk-K7UEKSB2.js +0 -305
- package/dist/cli/chunk-NLL2EQJ2.js +0 -94
- package/dist/cli/chunk-NWIICISV.js +0 -290
- package/dist/cli/chunk-OLLQBK6N.js +0 -41
- package/dist/cli/chunk-PZ3F4QH3.js +0 -9758
- package/dist/cli/chunk-U67V476Y.js +0 -35
- package/dist/cli/chunk-WXE2NOE5.js +0 -2674
- package/dist/cli/chunk-XOZD4BP5.js +0 -85
- package/dist/cli/daemon-5GT545BB.js +0 -2322
- package/dist/cli/decide-PFHHOCFZ.js +0 -59
- package/dist/cli/handover-EMO6JT7O.js +0 -17
- package/dist/cli/hook-W2BU74H5.js +0 -523
- package/dist/cli/launch-LP7YJR5N.js +0 -36
- package/dist/cli/send-NEI4X33R.js +0 -19
- package/dist/cli/setup-K42IVMHS.js +0 -38
- package/dist/cli/status-U2HGGKHF.js +0 -28
- package/dist/cli/task-PDDCE23D.js +0 -19
- package/dist/cli/team-S3ASP22H.js +0 -205
- package/dist/cli/tui-UPMRMCPC.js +0 -19216
- package/dist/cli/uninstall-4IMMR55T.js +0 -162
- package/dist/cli/version-LUMK3Z3T.js +0 -7
- package/dist/cli/who-NM3GPAPJ.js +0 -12
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runOnClient
|
|
3
|
-
} from "./chunk-XOZD4BP5.js";
|
|
4
|
-
import {
|
|
5
|
-
CODEX_HOOK_VAR
|
|
6
|
-
} from "./chunk-JEGPTNWV.js";
|
|
7
|
-
import {
|
|
8
|
-
connect
|
|
9
|
-
} from "./chunk-ASYAWVFW.js";
|
|
10
|
-
import {
|
|
11
|
-
LEDGE_GIVER,
|
|
12
|
-
TASK_TEXT_MAX
|
|
13
|
-
} from "./chunk-WXE2NOE5.js";
|
|
14
|
-
import "./chunk-HOOHS3MX.js";
|
|
15
|
-
import "./chunk-U67V476Y.js";
|
|
16
|
-
|
|
17
|
-
// src/cli/decide.ts
|
|
18
|
-
import { randomUUID } from "crypto";
|
|
19
|
-
var DECIDE_USAGE = `ledge decide les d\xE9cisions que les sessions attendent de toi
|
|
20
|
-
ledge decide <id> "<r\xE9ponse>" y r\xE9pondre : la session qui l'a demand\xE9e reprend`;
|
|
21
|
-
var ID = /^t[0-9a-f]{6}$/;
|
|
22
|
-
var DECIDE_MS = 4e3;
|
|
23
|
-
function decideArgs(args) {
|
|
24
|
-
if (!args.length) return { op: "list" };
|
|
25
|
-
const [id, text] = args;
|
|
26
|
-
return args.length === 2 && ID.test(id) && text.trim() && text.length <= TASK_TEXT_MAX ? { op: "done", task: id, text } : void 0;
|
|
27
|
-
}
|
|
28
|
-
async function runDecide(args, opts = {}) {
|
|
29
|
-
const op = decideArgs(args);
|
|
30
|
-
if (!op) return { line: DECIDE_USAGE, code: 1 };
|
|
31
|
-
const env = opts.env ?? process.env;
|
|
32
|
-
if (env.LEDGE_SESSION || env[CODEX_HOOK_VAR]) return { line: "refus\xE9 : ledge decide est la r\xE9ponse de l'utilisateur, pas celle d'une session", code: 1 };
|
|
33
|
-
let client;
|
|
34
|
-
try {
|
|
35
|
-
client = await connect({ port: opts.port, timeoutMs: DECIDE_MS });
|
|
36
|
-
} catch {
|
|
37
|
-
return { line: "daemon not running (start a session with `ledge claude`, or run `ledge daemon`)", code: 1 };
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
if (op.op === "list") {
|
|
41
|
-
client.send({ type: "task.cmd", rid: randomUUID(), by: LEDGE_GIVER, op: "list" });
|
|
42
|
-
const asked = ((await client.next("task.result", DECIDE_MS)).tasks ?? []).filter((t) => t.owner === LEDGE_GIVER);
|
|
43
|
-
if (!asked.length) return { line: "aucune d\xE9cision en attente", code: 0 };
|
|
44
|
-
return { line: asked.map((t) => [`${t.id} de ${t.giverName} ${t.title}`, ...t.text ? t.text.split("\n").map((l) => ` ${l}`) : []].join("\n")).join("\n\n"), code: 0 };
|
|
45
|
-
}
|
|
46
|
-
const r = await runOnClient(client, "task.answer", { task: op.task, answer: op.text }, { confirmed: true, ms: DECIDE_MS });
|
|
47
|
-
if (r.reason !== void 0) return { line: `refus\xE9 : ${r.reason}`, code: 1 };
|
|
48
|
-
return { line: `r\xE9ponse envoy\xE9e \xE0 ${r.row?.vars?.session ?? "la session"}`, code: 0 };
|
|
49
|
-
} catch (e) {
|
|
50
|
-
return { line: `pas de r\xE9ponse de Ledge : ${e.message}`, code: 1 };
|
|
51
|
-
} finally {
|
|
52
|
-
await client.close();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export {
|
|
56
|
-
DECIDE_USAGE,
|
|
57
|
-
decideArgs,
|
|
58
|
-
runDecide
|
|
59
|
-
};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
HANDOVER_USAGE,
|
|
3
|
-
handoverArgs,
|
|
4
|
-
handoverOnClient,
|
|
5
|
-
runHandover
|
|
6
|
-
} from "./chunk-CSLVBADC.js";
|
|
7
|
-
import "./chunk-JEGPTNWV.js";
|
|
8
|
-
import "./chunk-ASYAWVFW.js";
|
|
9
|
-
import "./chunk-WXE2NOE5.js";
|
|
10
|
-
import "./chunk-HOOHS3MX.js";
|
|
11
|
-
import "./chunk-U67V476Y.js";
|
|
12
|
-
export {
|
|
13
|
-
HANDOVER_USAGE,
|
|
14
|
-
handoverArgs,
|
|
15
|
-
handoverOnClient,
|
|
16
|
-
runHandover
|
|
17
|
-
};
|
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
QUESTION_TOOLS,
|
|
3
|
-
gitInfo,
|
|
4
|
-
messageNote,
|
|
5
|
-
readPeers,
|
|
6
|
-
resolveRoleAddress,
|
|
7
|
-
resolveTarget,
|
|
8
|
-
seatContext,
|
|
9
|
-
seatKey,
|
|
10
|
-
seatView,
|
|
11
|
-
takeImages,
|
|
12
|
-
teamChangeLine,
|
|
13
|
-
teammates
|
|
14
|
-
} from "./chunk-3DB3VOMM.js";
|
|
15
|
-
import {
|
|
16
|
-
findRole
|
|
17
|
-
} from "./chunk-4VNKZOC2.js";
|
|
18
|
-
import {
|
|
19
|
-
parseLedgeCommand,
|
|
20
|
-
readOnClient,
|
|
21
|
-
sendOnClient
|
|
22
|
-
} from "./chunk-GXL3X7M7.js";
|
|
23
|
-
import {
|
|
24
|
-
taskOnClient
|
|
25
|
-
} from "./chunk-4HXJQEUN.js";
|
|
26
|
-
import {
|
|
27
|
-
handoverOnClient
|
|
28
|
-
} from "./chunk-CSLVBADC.js";
|
|
29
|
-
import {
|
|
30
|
-
CODEX_ENV_VAR,
|
|
31
|
-
CODEX_HOOK_VAR,
|
|
32
|
-
codexPlan
|
|
33
|
-
} from "./chunk-JEGPTNWV.js";
|
|
34
|
-
import {
|
|
35
|
-
formatWho
|
|
36
|
-
} from "./chunk-CCSUP5ZI.js";
|
|
37
|
-
import {
|
|
38
|
-
connect,
|
|
39
|
-
sendMessageAndAwaitAck
|
|
40
|
-
} from "./chunk-ASYAWVFW.js";
|
|
41
|
-
import {
|
|
42
|
-
MESSAGE_MAX,
|
|
43
|
-
taskClosed
|
|
44
|
-
} from "./chunk-WXE2NOE5.js";
|
|
45
|
-
import {
|
|
46
|
-
log
|
|
47
|
-
} from "./chunk-6IYPRUQG.js";
|
|
48
|
-
import {
|
|
49
|
-
paths
|
|
50
|
-
} from "./chunk-HOOHS3MX.js";
|
|
51
|
-
import "./chunk-U67V476Y.js";
|
|
52
|
-
|
|
53
|
-
// src/cli/hook.ts
|
|
54
|
-
import { randomUUID } from "crypto";
|
|
55
|
-
import { readFileSync, openSync, fstatSync, readSync, closeSync } from "fs";
|
|
56
|
-
import { basename, join } from "path";
|
|
57
|
-
var str = (v) => typeof v === "string" ? v : void 0;
|
|
58
|
-
var PROMPT_MAX = MESSAGE_MAX;
|
|
59
|
-
var promptText = (p) => {
|
|
60
|
-
const raw = str(p.prompt)?.trim();
|
|
61
|
-
if (!raw) return {};
|
|
62
|
-
const taken = takeImages(raw, paths().attachments);
|
|
63
|
-
const ids = taken.ids;
|
|
64
|
-
const t = ids.length ? taken.text : raw;
|
|
65
|
-
return { ...t ? { text: t.slice(0, PROMPT_MAX) } : {}, ...ids.length ? { attachments: ids } : {} };
|
|
66
|
-
};
|
|
67
|
-
function describeTool(tool, input) {
|
|
68
|
-
const i = input && typeof input === "object" ? input : {};
|
|
69
|
-
if (tool === "Bash") return str(i.command) ?? "";
|
|
70
|
-
if (tool === "Edit" || tool === "Write" || tool === "MultiEdit" || tool === "Read") return str(i.file_path) ?? "";
|
|
71
|
-
if (tool === "SendMessage") return str(i.summary) || `\u2192 ${str(i.to) ?? ""}`;
|
|
72
|
-
if (tool === "ExitPlanMode") return str(i.plan)?.split("\n")[0] ?? "plan";
|
|
73
|
-
if (tool === "apply_patch") {
|
|
74
|
-
const files = [...(str(i.command) ?? "").matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm)].map((m) => m[1].trim());
|
|
75
|
-
return files.length ? files.join(", ") : "patch";
|
|
76
|
-
}
|
|
77
|
-
return str(i.description) ?? JSON.stringify(i).slice(0, 200);
|
|
78
|
-
}
|
|
79
|
-
var REPLY_MAX = 24e3;
|
|
80
|
-
function lastReply(p) {
|
|
81
|
-
return cap(str(p.last_assistant_message)?.trim());
|
|
82
|
-
}
|
|
83
|
-
function cap(text) {
|
|
84
|
-
if (!text) return void 0;
|
|
85
|
-
return text.length > REPLY_MAX ? `${text.slice(0, REPLY_MAX)}
|
|
86
|
-
|
|
87
|
-
[\u2026]` : text;
|
|
88
|
-
}
|
|
89
|
-
var INPUT_MAX = 8e3;
|
|
90
|
-
function trimInput(input, max = INPUT_MAX) {
|
|
91
|
-
if (!input || typeof input !== "object" || Array.isArray(input)) return void 0;
|
|
92
|
-
const trim = (v) => typeof v === "string" ? v.slice(0, max) : Array.isArray(v) ? v.map(trim) : v && typeof v === "object" ? Object.fromEntries(Object.entries(v).map(([k, x]) => [k, trim(x)])) : v;
|
|
93
|
-
return trim(input);
|
|
94
|
-
}
|
|
95
|
-
function toolOutput(response) {
|
|
96
|
-
if (response === null || response === void 0) return void 0;
|
|
97
|
-
let text;
|
|
98
|
-
if (typeof response === "string") text = response;
|
|
99
|
-
else if (Array.isArray(response)) text = response.map((b) => str(b?.text) ?? "").filter(Boolean).join("\n");
|
|
100
|
-
else if (typeof response === "object" && ("stdout" in response || "stderr" in response)) {
|
|
101
|
-
const r = response;
|
|
102
|
-
text = [str(r.stdout), str(r.stderr)].filter(Boolean).join("\n");
|
|
103
|
-
} else {
|
|
104
|
-
try {
|
|
105
|
-
text = JSON.stringify(response);
|
|
106
|
-
} catch {
|
|
107
|
-
text = String(response);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return text.slice(0, REPLY_MAX);
|
|
111
|
-
}
|
|
112
|
-
var NON_TERMINAL_END_REASONS = /* @__PURE__ */ new Set(["clear", "resume"]);
|
|
113
|
-
function mapClaudeHook(eventName, payload, at) {
|
|
114
|
-
return mapHook("claude", eventName, payload, at);
|
|
115
|
-
}
|
|
116
|
-
function underCodexDaemon(read = (p) => readFileSync(p, "utf8")) {
|
|
117
|
-
let pid = process.pid;
|
|
118
|
-
for (let depth = 0; depth < 8; depth++) {
|
|
119
|
-
try {
|
|
120
|
-
const stat = read(`/proc/${pid}/stat`);
|
|
121
|
-
pid = Number(stat.slice(stat.lastIndexOf(")") + 2).split(" ")[1]);
|
|
122
|
-
if (!pid || pid <= 1) return false;
|
|
123
|
-
if (read(`/proc/${pid}/cmdline`).split("\0").includes("app-server")) return true;
|
|
124
|
-
} catch {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
function codexLedgeId(env = process.env, daemon = underCodexDaemon) {
|
|
131
|
-
if (env[CODEX_HOOK_VAR]) return env[CODEX_HOOK_VAR];
|
|
132
|
-
if (env[CODEX_ENV_VAR] && !daemon()) return env[CODEX_ENV_VAR];
|
|
133
|
-
return void 0;
|
|
134
|
-
}
|
|
135
|
-
function mapHook(agent, eventName, payload, at) {
|
|
136
|
-
if (!payload || typeof payload !== "object") return null;
|
|
137
|
-
const p = payload;
|
|
138
|
-
const ledgeId = (agent === "codex" ? codexLedgeId() : process.env.LEDGE_SESSION) || void 0;
|
|
139
|
-
const launched = !!ledgeId;
|
|
140
|
-
const id = ledgeId || str(p.session_id);
|
|
141
|
-
if (!id) return null;
|
|
142
|
-
const cwd = str(p.cwd) || void 0;
|
|
143
|
-
const event = mapEvent(eventName, p, at, launched);
|
|
144
|
-
if (!event) return null;
|
|
145
|
-
const task = agent === "claude" && event.helperId ? helperDescription(str(p.transcript_path), event.helperId) : void 0;
|
|
146
|
-
const agentSessionId = !event.helperId ? str(p.session_id) : void 0;
|
|
147
|
-
return { id, event: { ...event, ...task ? { task } : {}, ...agentSessionId ? { agentSessionId } : {} }, agent, ...cwd ? { cwd } : {} };
|
|
148
|
-
}
|
|
149
|
-
function helperDescription(transcriptPath, agentId) {
|
|
150
|
-
if (!transcriptPath?.endsWith(".jsonl") || !/^[\w-]+$/.test(agentId)) return void 0;
|
|
151
|
-
try {
|
|
152
|
-
const meta = JSON.parse(readFileSync(join(transcriptPath.slice(0, -".jsonl".length), "subagents", `agent-${agentId}.meta.json`), "utf8"));
|
|
153
|
-
return str(meta.description)?.split("\n")[0]?.trim() || void 0;
|
|
154
|
-
} catch {
|
|
155
|
-
return void 0;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function mapEvent(eventName, p, at, launched) {
|
|
159
|
-
const tool = str(p.tool_name);
|
|
160
|
-
const agentId = str(p.agent_id) || void 0;
|
|
161
|
-
const base = { at, source: "hook", ...agentId ? { helperId: agentId } : {} };
|
|
162
|
-
const toolUseId = str(p.tool_use_id) || void 0;
|
|
163
|
-
const toolInput = trimInput(p.tool_input, tool === "ExitPlanMode" ? REPLY_MAX : INPUT_MAX);
|
|
164
|
-
const call = { ...toolUseId ? { toolUseId } : {}, ...toolInput ? { toolInput } : {} };
|
|
165
|
-
const transcript = str(p.transcript_path) ? { transcriptPath: str(p.transcript_path) } : {};
|
|
166
|
-
const duration = typeof p.duration_ms === "number" && p.duration_ms >= 0 ? { durationMs: p.duration_ms } : {};
|
|
167
|
-
switch (eventName) {
|
|
168
|
-
case "SubagentStart":
|
|
169
|
-
case "SubagentStop": {
|
|
170
|
-
if (!agentId) return null;
|
|
171
|
-
const type = str(p.agent_type) || void 0;
|
|
172
|
-
const task = eventName === "SubagentStart" ? (str(p.description) || str(p.prompt))?.split("\n")[0] : void 0;
|
|
173
|
-
const report = eventName === "SubagentStop" ? lastReply(p) : void 0;
|
|
174
|
-
const agentTranscript = eventName === "SubagentStop" && str(p.agent_transcript_path) ? { transcriptPath: str(p.agent_transcript_path) } : {};
|
|
175
|
-
return { name: eventName, ...base, ...type ? { tool: type } : {}, ...task ? { text: task } : {}, ...report ? { text: report } : {}, ...agentTranscript };
|
|
176
|
-
}
|
|
177
|
-
case "PostToolUse": {
|
|
178
|
-
const output = toolOutput(p.tool_response);
|
|
179
|
-
return { name: "PostToolUse", ...base, tool, ...call, ...output !== void 0 ? { output } : {}, ...duration };
|
|
180
|
-
}
|
|
181
|
-
case "PostToolUseFailure": {
|
|
182
|
-
const error = str(p.error) || void 0;
|
|
183
|
-
return { name: "PostToolUseFailure", ...base, tool, ...call, ...error ? { error } : {}, ...duration, ...p.is_interrupt === true ? { interrupt: true } : {} };
|
|
184
|
-
}
|
|
185
|
-
case "StopFailure": {
|
|
186
|
-
const error = str(p.error);
|
|
187
|
-
const details = str(p.error_details);
|
|
188
|
-
const text = [error, details].filter(Boolean).join(": ").slice(0, 300) || void 0;
|
|
189
|
-
return { name: "StopFailure", ...base, ...text ? { text } : {} };
|
|
190
|
-
}
|
|
191
|
-
// Codex: Esc on a running turn or on an approval. Like Claude's interrupted tool run, no Stop follows.
|
|
192
|
-
case "Interrupt":
|
|
193
|
-
return { name: "PostToolUseFailure", ...base, interrupt: true };
|
|
194
|
-
case "SessionStart":
|
|
195
|
-
return { name: "SessionStart", ...base };
|
|
196
|
-
case "UserPromptSubmit":
|
|
197
|
-
return { name: "UserPromptSubmit", ...base, ...promptText(p), ...transcript };
|
|
198
|
-
case "Stop": {
|
|
199
|
-
const turnId = str(p.turn_id);
|
|
200
|
-
const path = str(p.transcript_path);
|
|
201
|
-
const said = lastReply(p);
|
|
202
|
-
const plan = said ? void 0 : turnId && path ? cap(codexPlan(path, turnId)) : void 0;
|
|
203
|
-
const text = said ?? plan;
|
|
204
|
-
return { name: "Stop", ...base, ...plan ? { kind: "plan" } : {}, ...text ? { text } : {}, ...transcript };
|
|
205
|
-
}
|
|
206
|
-
case "SessionEnd":
|
|
207
|
-
if (launched) return null;
|
|
208
|
-
if (NON_TERMINAL_END_REASONS.has(str(p.reason) ?? "")) return null;
|
|
209
|
-
return { name: "SessionEnd", ...base, exitCode: null };
|
|
210
|
-
case "PermissionRequest":
|
|
211
|
-
return { name: "PermissionRequest", ...base, tool, text: describeTool(tool, p.tool_input), ...call, ...transcript };
|
|
212
|
-
case "PreToolUse": {
|
|
213
|
-
if (tool && QUESTION_TOOLS.has(tool)) {
|
|
214
|
-
const qs = p.tool_input?.questions ?? [];
|
|
215
|
-
const q = qs[0];
|
|
216
|
-
const opts = (q?.options ?? []).filter((o) => !!str(o.label));
|
|
217
|
-
const options = opts.map((o) => str(o.label));
|
|
218
|
-
const optionDetails = opts.map((o) => str(o.description)?.trim() ?? "");
|
|
219
|
-
return { name: "PreToolUse", ...base, tool, text: str(q?.question) ?? "", options, ...optionDetails.some(Boolean) ? { optionDetails } : {}, ...call, ...transcript };
|
|
220
|
-
}
|
|
221
|
-
return { name: "PreToolUse", ...base, tool, text: describeTool(tool, p.tool_input), ...call, ...transcript };
|
|
222
|
-
}
|
|
223
|
-
case "Notification": {
|
|
224
|
-
const type = str(p.notification_type) ?? "";
|
|
225
|
-
const message = str(p.message) ?? "";
|
|
226
|
-
const kind = type === "permission_prompt" || /permission/i.test(message) ? "permission" : void 0;
|
|
227
|
-
return { name: "Notification", ...base, kind, text: message };
|
|
228
|
-
}
|
|
229
|
-
default:
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
function describeCursorTool(input) {
|
|
234
|
-
const i = input && typeof input === "object" ? input : {};
|
|
235
|
-
return str(i.command) ?? str(i.file_path) ?? str(i.path) ?? str(i.description) ?? JSON.stringify(i).slice(0, 200);
|
|
236
|
-
}
|
|
237
|
-
function readTranscript(path, bytes = 512 * 1024) {
|
|
238
|
-
let raw;
|
|
239
|
-
try {
|
|
240
|
-
const fd = openSync(path, "r");
|
|
241
|
-
try {
|
|
242
|
-
const size = fstatSync(fd).size;
|
|
243
|
-
const len = Math.min(size, bytes);
|
|
244
|
-
const buf = Buffer.alloc(len);
|
|
245
|
-
readSync(fd, buf, 0, len, size - len);
|
|
246
|
-
raw = buf.toString("utf8");
|
|
247
|
-
if (len < size) raw = raw.slice(raw.indexOf("\n") + 1);
|
|
248
|
-
} finally {
|
|
249
|
-
closeSync(fd);
|
|
250
|
-
}
|
|
251
|
-
} catch {
|
|
252
|
-
return [];
|
|
253
|
-
}
|
|
254
|
-
const out = [];
|
|
255
|
-
for (const line of raw.split("\n")) {
|
|
256
|
-
try {
|
|
257
|
-
if (line.trim()) out.push(JSON.parse(line));
|
|
258
|
-
} catch {
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return out;
|
|
262
|
-
}
|
|
263
|
-
var blocks = (e) => e.message?.content ?? [];
|
|
264
|
-
var compact = (t) => t.replace(/\s+/g, "");
|
|
265
|
-
function cursorReply(text, entries) {
|
|
266
|
-
let u = entries.length - 1;
|
|
267
|
-
while (u >= 0 && entries[u].role !== "user") u--;
|
|
268
|
-
const parts = entries.slice(u + 1).filter((e) => e.role === "assistant").flatMap(blocks).filter((b) => b.type === "text" && b.text && b.text !== "[REDACTED]").map((b) => b.text.trim()).filter(Boolean);
|
|
269
|
-
const joined = parts.join("\n\n");
|
|
270
|
-
return parts.length > 1 && compact(joined) === compact(text) ? joined : text;
|
|
271
|
-
}
|
|
272
|
-
function unwrapTool(name, input) {
|
|
273
|
-
const i = input && typeof input === "object" ? input : {};
|
|
274
|
-
if (name === "CallDynamicTool" && str(i.toolName)) return { name: str(i.toolName), input: i.arguments && typeof i.arguments === "object" ? i.arguments : {} };
|
|
275
|
-
return { name, input: i };
|
|
276
|
-
}
|
|
277
|
-
function mapCursorHook(eventName, payload, at, env = process.env) {
|
|
278
|
-
if (!payload || typeof payload !== "object") return null;
|
|
279
|
-
const p = payload;
|
|
280
|
-
const sessionId = str(p.session_id) || str(p.conversation_id);
|
|
281
|
-
if (!sessionId) return null;
|
|
282
|
-
const transcript = env.CURSOR_TRANSCRIPT_PATH || void 0;
|
|
283
|
-
const parentId = transcript ? basename(transcript, ".jsonl") : void 0;
|
|
284
|
-
const generation = str(p.generation_id);
|
|
285
|
-
const helper = parentId ? parentId !== sessionId : eventName !== "sessionStart" && generation === sessionId;
|
|
286
|
-
const id = env.LEDGE_SESSION || (helper ? parentId : sessionId);
|
|
287
|
-
if (!id) return null;
|
|
288
|
-
const roots = Array.isArray(p.workspace_roots) ? p.workspace_roots : [];
|
|
289
|
-
const cwd = str(roots[0]) || void 0;
|
|
290
|
-
const event = helper ? mapCursorHelperEvent(eventName, p, at, sessionId) : mapCursorEvent(eventName, p, at, !!env.LEDGE_SESSION, transcript);
|
|
291
|
-
return event ? { id, event: helper || event.helperId ? event : { ...event, agentSessionId: sessionId }, agent: "cursor", ...cwd ? { cwd } : {} } : null;
|
|
292
|
-
}
|
|
293
|
-
function mapCursorHelperEvent(eventName, p, at, helperId) {
|
|
294
|
-
const base = { at, source: "hook", helperId };
|
|
295
|
-
const tool = str(p.tool_name);
|
|
296
|
-
switch (eventName) {
|
|
297
|
-
case "preToolUse":
|
|
298
|
-
return { name: "SubagentStart", ...base };
|
|
299
|
-
case "postToolUse":
|
|
300
|
-
return { name: "PostToolUse", ...base, tool };
|
|
301
|
-
case "postToolUseFailure":
|
|
302
|
-
return { name: "PostToolUseFailure", ...base, tool };
|
|
303
|
-
default:
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
function mapCursorEvent(eventName, p, at, launched, transcript) {
|
|
308
|
-
const { name: tool, input } = unwrapTool(str(p.tool_name), p.tool_input);
|
|
309
|
-
const toolInput = p.tool_input ? trimInput(input) : void 0;
|
|
310
|
-
const base = { at, source: "hook" };
|
|
311
|
-
switch (eventName) {
|
|
312
|
-
case "sessionStart":
|
|
313
|
-
return { name: "SessionStart", ...base };
|
|
314
|
-
case "beforeSubmitPrompt":
|
|
315
|
-
return { name: "UserPromptSubmit", ...base, ...promptText(p) };
|
|
316
|
-
case "preToolUse": {
|
|
317
|
-
if (tool === "Task") {
|
|
318
|
-
const callId = (str(p.tool_use_id) ?? "").split("\n")[0] || at;
|
|
319
|
-
const task = str(input.description) || str(input.prompt)?.split("\n")[0] || "";
|
|
320
|
-
return { name: "SubagentStart", ...base, helperId: `task:${callId}`, tool: str(input.subagent_type) || "subagent", ...task ? { text: task } : {} };
|
|
321
|
-
}
|
|
322
|
-
return { name: "PreToolUse", ...base, tool, text: describeCursorTool(input) };
|
|
323
|
-
}
|
|
324
|
-
case "postToolUse":
|
|
325
|
-
return { name: "PostToolUse", ...base, tool, ...toolInput ? { toolInput } : {} };
|
|
326
|
-
case "postToolUseFailure":
|
|
327
|
-
return { name: "PostToolUseFailure", ...base, tool, ...toolInput ? { toolInput } : {}, ...p.is_interrupt === true ? { interrupt: true } : {} };
|
|
328
|
-
case "stop":
|
|
329
|
-
if (str(p.status) === "error") return { name: "StopFailure", ...base };
|
|
330
|
-
return { name: "Stop", ...base };
|
|
331
|
-
case "afterAgentResponse": {
|
|
332
|
-
const raw = str(p.text) ?? "";
|
|
333
|
-
const text = lastReply({ last_assistant_message: raw && transcript ? cursorReply(raw, readTranscript(transcript)) : raw });
|
|
334
|
-
return { name: "Stop", ...base, ...text ? { text } : {} };
|
|
335
|
-
}
|
|
336
|
-
case "sessionEnd":
|
|
337
|
-
if (launched) return null;
|
|
338
|
-
return { name: "SessionEnd", ...base, exitCode: null };
|
|
339
|
-
default:
|
|
340
|
-
return null;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
var TASKS_TOLD = 10;
|
|
344
|
-
var TASK_STATE = { open: "ouverte", taken: "prise", done: "termin\xE9e", refused: "refus\xE9e", dropped: "abandonn\xE9e" };
|
|
345
|
-
function tasksContext(tasks) {
|
|
346
|
-
if (!tasks.length) return void 0;
|
|
347
|
-
const shown = tasks.slice(0, TASKS_TOLD);
|
|
348
|
-
return [
|
|
349
|
-
"Tes t\xE2ches en cours (elles sont gard\xE9es par Ledge, pas dans ta conversation) :",
|
|
350
|
-
...shown.map((t) => `- ${t.id} \xB7 ${TASK_STATE[t.state]} \xB7 \xAB ${t.title} \xBB \xB7 confi\xE9e par ${t.giverName}`),
|
|
351
|
-
...tasks.length > shown.length ? [`- et ${tasks.length - shown.length} autre(s) : ledge task list`] : [],
|
|
352
|
-
"Relis-en une avec `ledge task show <id>` avant de reprendre."
|
|
353
|
-
].join("\n");
|
|
354
|
-
}
|
|
355
|
-
function identityContext(s) {
|
|
356
|
-
const where = [`projet ${s.repo ?? s.project}`, ...s.branch ? [`branche ${s.branch}`] : [], ...s.worktree ? [`worktree ${basename(s.cwd) || s.cwd}`] : []].join(", ");
|
|
357
|
-
return [
|
|
358
|
-
`Tu es ${s.name}, ${where} : une session lanc\xE9e par Ledge (${s.tool}). Les autres sessions Ledge te connaissent sous le nom ${s.name}.`,
|
|
359
|
-
"Pour voir les autres sessions (nom, outil, \xE9tat, projet, branche, sujet), lance `ledge who`.",
|
|
360
|
-
s.tool === "claude" ? "Pour \xE9crire \xE0 une autre session Ledge, Claude ou Codex, utilise son nom Ledge (donn\xE9 par `ledge who`) comme adresse SendMessage : Ledge le transmet. `ListAgents` montre les noms internes de Claude, pas les noms Ledge." : "Pour \xE9crire \xE0 une autre session Ledge, lance `ledge send <nom> \"<message>\"` (seul, sans && ni |). Ledge ex\xE9cute lui-m\xEAme `ledge send`, `ledge read`, `ledge task` et `ledge who` : leur r\xE9sultat t'arrive comme \xAB Command blocked by PreToolUse hook: \u2026 \xBB, c'est la r\xE9ponse, pas une erreur.",
|
|
361
|
-
"Un long message d'une autre session t'arrive en aper\xE7u avec son id : lance `ledge read <id>` pour le lire en entier. Une `<ledge-notice>` vient de Ledge : soit un de tes messages n'a pas pu \xEAtre remis, soit un changement te concerne (ta consigne de r\xF4le, ton \xE9quipe).",
|
|
362
|
-
'Un message sert \xE0 pr\xE9venir ; pour confier un travail qui ne doit pas se perdre, lance plut\xF4t `ledge task give <nom> "<titre>" "<d\xE9tail>"` (`ledge task` pour le reste). Une `<ledge-task>` t\'en confie une, ou te dit comment une des tiennes a fini : quand on t\'en confie une, prends-la (`ledge task take <id>`) et termine-la toujours (`ledge task done <id> "<r\xE9sultat>"`, ou `refuse`). Une d\xE9cision qui revient \xE0 l\'utilisateur se pose avec `ledge task give ledge "<question>" "<options, ta recommandation>"` : sa r\xE9ponse te r\xE9veille, inutile d\'attendre la fin pour la poser.',
|
|
363
|
-
...s.seat ? [s.seat] : [],
|
|
364
|
-
...s.relieves ? [`Tu as pris la rel\xE8ve de ${s.relieves.name}, dont le contexte \xE9tait plein : relis son bilan avec \`ledge handover show\`.`] : [],
|
|
365
|
-
...s.tasks ? [tasksContext(s.tasks) ?? ""].filter(Boolean) : []
|
|
366
|
-
].join("\n");
|
|
367
|
-
}
|
|
368
|
-
async function identity(agent, cwd, known, deadline, live = { sessions: [], teams: [] }) {
|
|
369
|
-
const name = known?.name ?? process.env.LEDGE_NAME;
|
|
370
|
-
const dir = known?.cwd ?? cwd;
|
|
371
|
-
if (!name || !dir) return void 0;
|
|
372
|
-
const git = known?.branch ? null : await Promise.race([gitInfo(dir).catch(() => null), new Promise((r) => setTimeout(() => r(null), Math.max(0, deadline - Date.now())))]);
|
|
373
|
-
return {
|
|
374
|
-
name,
|
|
375
|
-
tool: known?.tool ?? agent,
|
|
376
|
-
cwd: dir,
|
|
377
|
-
project: known?.project ?? (basename(dir) || dir),
|
|
378
|
-
...known?.repo ?? git?.repo ? { repo: known?.repo ?? git.repo } : {},
|
|
379
|
-
...known?.branch ?? git?.branch ? { branch: known?.branch ?? git.branch } : {},
|
|
380
|
-
...known?.worktree ?? git?.worktree ? { worktree: true } : {},
|
|
381
|
-
...seatOf(known, dir, live)
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
function seatOf(known, dir, live) {
|
|
385
|
-
const roleId = known?.role ?? process.env.LEDGE_ROLE;
|
|
386
|
-
if (!roleId) return {};
|
|
387
|
-
let role;
|
|
388
|
-
try {
|
|
389
|
-
role = findRole(roleId, dir);
|
|
390
|
-
} catch {
|
|
391
|
-
role = void 0;
|
|
392
|
-
}
|
|
393
|
-
const team = known?.team ? live.teams.find((t) => t.id === known.team && t.state !== "dissolved") : void 0;
|
|
394
|
-
const seat = seatContext({ ...role ? { role } : {}, roleId, roleLabel: known?.roleLabel, ...team ? { team: { name: team.name, members: teammates(team, live.sessions).filter((m) => m.name !== known?.name) } } : {} });
|
|
395
|
-
return seat ? { seat } : {};
|
|
396
|
-
}
|
|
397
|
-
var SEAT_REFRESH_MS = 500;
|
|
398
|
-
async function seatChange(client, id, deadline) {
|
|
399
|
-
const left = () => Math.max(0, deadline - Date.now());
|
|
400
|
-
const snapshot = await client.next("snapshot", left()).catch(() => void 0);
|
|
401
|
-
const me = snapshot?.sessions.find((s) => s.id === id);
|
|
402
|
-
if (!snapshot || !me || !me.team && !me.teamSeen) return void 0;
|
|
403
|
-
const teams = me.team ? (await client.next("teams", left()).catch(() => void 0))?.teams : [];
|
|
404
|
-
if (!teams) return void 0;
|
|
405
|
-
const key = seatKey(seatView(id, snapshot.sessions, teams));
|
|
406
|
-
if (key === me.teamSeen) return void 0;
|
|
407
|
-
client.send({ type: "seat.seen", id, key });
|
|
408
|
-
return teamChangeLine(me.teamSeen, key);
|
|
409
|
-
}
|
|
410
|
-
var SEND_MESSAGE_MS = 1500;
|
|
411
|
-
var deny = (reason) => JSON.stringify({ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: reason } });
|
|
412
|
-
async function relayMessage(client, from, toolUseId, input, deadline) {
|
|
413
|
-
if (!toolUseId) return void 0;
|
|
414
|
-
const left = () => Math.max(0, deadline - Date.now());
|
|
415
|
-
const to = input.to;
|
|
416
|
-
const snapshot = await client.next("snapshot", left());
|
|
417
|
-
const sender = snapshot.sessions.find((s) => s.id === from);
|
|
418
|
-
if (sender?.source !== "launcher") return void 0;
|
|
419
|
-
let address = to;
|
|
420
|
-
if (to.startsWith("@")) {
|
|
421
|
-
const teams = sender.team ? (await client.next("teams", left()).catch(() => void 0))?.teams ?? [] : [];
|
|
422
|
-
const role = resolveRoleAddress(to, from, snapshot.sessions, teams);
|
|
423
|
-
if ("reason" in role) return deny(`Ledge n'a pas pu transmettre le message \xE0 ${to} : ${role.reason}`);
|
|
424
|
-
address = role.to;
|
|
425
|
-
}
|
|
426
|
-
const r = resolveTarget(address, snapshot.sessions, readPeers());
|
|
427
|
-
if (r.outcome === "unknown") return void 0;
|
|
428
|
-
if (r.outcome === "refused") return deny(`Ledge n'a pas pu transmettre le message \xE0 ${to} : ${r.reason}`);
|
|
429
|
-
if (r.outcome === "native") {
|
|
430
|
-
const note = messageNote(sender.name, "claude");
|
|
431
|
-
const named = (text) => text.startsWith(note) ? text : `${note} ${text}`;
|
|
432
|
-
const updatedInput = { ...input, to: r.address, message: named(input.message), ...typeof input.content === "string" ? { content: named(input.content) } : {} };
|
|
433
|
-
return JSON.stringify({ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "allow", updatedInput } });
|
|
434
|
-
}
|
|
435
|
-
const tool = r.target.tool;
|
|
436
|
-
const summary = str(input.summary);
|
|
437
|
-
const ack = await sendMessageAndAwaitAck(client, { type: "session.message", rid: toolUseId, from, to: address, text: input.message, ...summary ? { summary } : {}, intercept: true }, left());
|
|
438
|
-
const target = `${to} (${tool})`;
|
|
439
|
-
const reason = ack.outcome === "accepted" ? `Message transmis par Ledge \xE0 ${target} : il le re\xE7oit maintenant.` : ack.outcome === "queued" ? `Message transmis par Ledge \xE0 ${target} : il le recevra d\xE8s qu'il sera libre.` : ack.outcome === "refused" ? `Ledge n'a pas pu transmettre le message \xE0 ${to} : ${ack.reason ?? "raison inconnue"}` : void 0;
|
|
440
|
-
return reason ? deny(reason) : void 0;
|
|
441
|
-
}
|
|
442
|
-
async function runLedgeCommand(client, cmd, from, deadline) {
|
|
443
|
-
const left = () => Math.max(0, deadline - Date.now());
|
|
444
|
-
let line;
|
|
445
|
-
if (cmd.cmd === "who") line = formatWho((await client.next("snapshot", left())).sessions, from);
|
|
446
|
-
else if (cmd.cmd === "read") line = (await readOnClient(client, cmd.args, from, left())).line;
|
|
447
|
-
else if (cmd.cmd === "task") line = (await taskOnClient(client, cmd.args, from, left())).line;
|
|
448
|
-
else if (cmd.cmd === "handover") line = (await handoverOnClient(client, cmd.args, from, left())).line;
|
|
449
|
-
else line = (await sendOnClient(client, cmd.args, from, left())).line;
|
|
450
|
-
return deny(line);
|
|
451
|
-
}
|
|
452
|
-
async function runHook(eventName, stdin, opts = {}) {
|
|
453
|
-
const agent = opts.tool ?? "claude";
|
|
454
|
-
const label = agent === "claude" ? eventName : `${agent} ${eventName}`;
|
|
455
|
-
if (process.env.LEDGE_CHAT === "1") {
|
|
456
|
-
log(`hook ${label} ignored: Ledge chat`);
|
|
457
|
-
return void 0;
|
|
458
|
-
}
|
|
459
|
-
let mapped = null;
|
|
460
|
-
let identify = false;
|
|
461
|
-
let known;
|
|
462
|
-
let live = { sessions: [], teams: [] };
|
|
463
|
-
let deadline = Date.now() + (opts.timeoutMs ?? 100);
|
|
464
|
-
let relayed;
|
|
465
|
-
let seatLine;
|
|
466
|
-
let held = [];
|
|
467
|
-
try {
|
|
468
|
-
const payload = JSON.parse(stdin || "{}");
|
|
469
|
-
mapped = agent === "cursor" ? mapCursorHook(eventName, payload, (/* @__PURE__ */ new Date()).toISOString()) : mapHook(agent, eventName, payload, (/* @__PURE__ */ new Date()).toISOString());
|
|
470
|
-
if (!mapped) {
|
|
471
|
-
log(`hook ${label} ignored: unknown event, malformed payload, non-terminal SessionEnd or subagent event without a session of its own`);
|
|
472
|
-
return void 0;
|
|
473
|
-
}
|
|
474
|
-
const launchedId = agent === "codex" ? codexLedgeId() : agent === "claude" ? process.env.LEDGE_SESSION : void 0;
|
|
475
|
-
identify = eventName === "SessionStart" && !!launchedId && mapped.id === launchedId;
|
|
476
|
-
const refresh = eventName === "UserPromptSubmit" && agent !== "cursor" && !!launchedId && mapped.id === launchedId;
|
|
477
|
-
const input = payload.tool_input ?? {};
|
|
478
|
-
const intercept = agent === "claude" && eventName === "PreToolUse" && str(payload.tool_name) === "SendMessage" && typeof input.to === "string" && typeof input.message === "string" && !!input.message;
|
|
479
|
-
const command = agent === "codex" && eventName === "PreToolUse" && str(payload.tool_name) === "Bash" && typeof input.command === "string" ? parseLedgeCommand(input.command) : void 0;
|
|
480
|
-
const timeoutMs = opts.timeoutMs ?? (identify ? 1e3 : intercept || command ? SEND_MESSAGE_MS : refresh ? SEAT_REFRESH_MS : 100);
|
|
481
|
-
deadline = Date.now() + timeoutMs;
|
|
482
|
-
const client = await connect({ port: opts.port, timeoutMs });
|
|
483
|
-
client.send({ type: "session.event", id: mapped.id, event: mapped.event, agent: mapped.agent, ...mapped.cwd ? { cwd: mapped.cwd } : {} });
|
|
484
|
-
if (identify) {
|
|
485
|
-
const snapshot = await client.next("snapshot", Math.max(0, deadline - Date.now())).catch(() => void 0);
|
|
486
|
-
known = snapshot?.sessions.find((s) => s.id === mapped.id);
|
|
487
|
-
const teamList = known?.team ? (await client.next("teams", Math.max(0, deadline - Date.now())).catch(() => void 0))?.teams : void 0;
|
|
488
|
-
live = { sessions: snapshot?.sessions ?? [], teams: teamList ?? [] };
|
|
489
|
-
if (snapshot && known && (!known.team || teamList)) client.send({ type: "seat.seen", id: known.id, key: seatKey(seatView(known.id, live.sessions, live.teams)) });
|
|
490
|
-
client.send({ type: "task.cmd", rid: randomUUID(), by: mapped.id, op: "list" });
|
|
491
|
-
const listed = await client.next("task.result", Math.max(0, deadline - Date.now())).catch(() => void 0);
|
|
492
|
-
held = (listed?.tasks ?? []).filter((t) => t.owner === mapped.id && !taskClosed(t));
|
|
493
|
-
}
|
|
494
|
-
if (refresh) seatLine = await seatChange(client, mapped.id, deadline);
|
|
495
|
-
if (intercept) relayed = await relayMessage(client, mapped.id, str(payload.tool_use_id), input, deadline);
|
|
496
|
-
if (command) relayed = await runLedgeCommand(client, command, mapped.id, deadline);
|
|
497
|
-
await Promise.race([client.close(), new Promise((r) => setTimeout(r, Math.max(0, deadline - Date.now())))]);
|
|
498
|
-
} catch (e) {
|
|
499
|
-
log(`hook ${label} dropped: ${e.message}`);
|
|
500
|
-
}
|
|
501
|
-
if (relayed) return relayed;
|
|
502
|
-
if (seatLine) return JSON.stringify({ hookSpecificOutput: { hookEventName: "UserPromptSubmit", additionalContext: seatLine } });
|
|
503
|
-
if (!identify || !mapped) return void 0;
|
|
504
|
-
const found = await identity(agent, mapped.cwd, known, deadline, live);
|
|
505
|
-
const who = found ? { ...found, ...held.length ? { tasks: held } : {}, ...known?.relieves ? { relieves: known.relieves } : {} } : void 0;
|
|
506
|
-
return who ? JSON.stringify({ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: identityContext(who) } }) : void 0;
|
|
507
|
-
}
|
|
508
|
-
export {
|
|
509
|
-
INPUT_MAX,
|
|
510
|
-
REPLY_MAX,
|
|
511
|
-
codexLedgeId,
|
|
512
|
-
cursorReply,
|
|
513
|
-
identityContext,
|
|
514
|
-
mapClaudeHook,
|
|
515
|
-
mapCursorHook,
|
|
516
|
-
mapHook,
|
|
517
|
-
readTranscript,
|
|
518
|
-
runHook,
|
|
519
|
-
tasksContext,
|
|
520
|
-
toolOutput,
|
|
521
|
-
trimInput,
|
|
522
|
-
underCodexDaemon
|
|
523
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DaemonError,
|
|
3
|
-
attachEnv,
|
|
4
|
-
createSession,
|
|
5
|
-
ensureDaemon,
|
|
6
|
-
launch,
|
|
7
|
-
parseLaunchArgs,
|
|
8
|
-
roleArgs
|
|
9
|
-
} from "./chunk-CPERVAPQ.js";
|
|
10
|
-
import "./chunk-PZ3F4QH3.js";
|
|
11
|
-
import "./chunk-OLLQBK6N.js";
|
|
12
|
-
import "./chunk-NWIICISV.js";
|
|
13
|
-
import "./chunk-3DB3VOMM.js";
|
|
14
|
-
import "./chunk-4VNKZOC2.js";
|
|
15
|
-
import {
|
|
16
|
-
agentEnv,
|
|
17
|
-
exitFile
|
|
18
|
-
} from "./chunk-JEGPTNWV.js";
|
|
19
|
-
import "./chunk-ASYAWVFW.js";
|
|
20
|
-
import "./chunk-WXE2NOE5.js";
|
|
21
|
-
import "./chunk-E3LXONBI.js";
|
|
22
|
-
import "./chunk-NLL2EQJ2.js";
|
|
23
|
-
import "./chunk-6IYPRUQG.js";
|
|
24
|
-
import "./chunk-HOOHS3MX.js";
|
|
25
|
-
import "./chunk-U67V476Y.js";
|
|
26
|
-
export {
|
|
27
|
-
DaemonError,
|
|
28
|
-
agentEnv,
|
|
29
|
-
attachEnv,
|
|
30
|
-
createSession,
|
|
31
|
-
ensureDaemon,
|
|
32
|
-
exitFile,
|
|
33
|
-
launch,
|
|
34
|
-
parseLaunchArgs,
|
|
35
|
-
roleArgs
|
|
36
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
parseLedgeCommand,
|
|
3
|
-
readMessage,
|
|
4
|
-
readOnClient,
|
|
5
|
-
sendMessage,
|
|
6
|
-
sendOnClient
|
|
7
|
-
} from "./chunk-GXL3X7M7.js";
|
|
8
|
-
import "./chunk-JEGPTNWV.js";
|
|
9
|
-
import "./chunk-ASYAWVFW.js";
|
|
10
|
-
import "./chunk-WXE2NOE5.js";
|
|
11
|
-
import "./chunk-HOOHS3MX.js";
|
|
12
|
-
import "./chunk-U67V476Y.js";
|
|
13
|
-
export {
|
|
14
|
-
parseLedgeCommand,
|
|
15
|
-
readMessage,
|
|
16
|
-
readOnClient,
|
|
17
|
-
sendMessage,
|
|
18
|
-
sendOnClient
|
|
19
|
-
};
|