@paradow/ledge 0.28.0 → 0.29.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.
Files changed (32) hide show
  1. package/dist/cli/{action-NQRSZEC5.js → action-MAPPYLUM.js} +4 -4
  2. package/dist/cli/{attach-KXOSFUHO.js → attach-OC64CLB2.js} +8 -8
  3. package/dist/cli/{bridge-XCTXVWKH.js → bridge-TWX4V37E.js} +1 -1
  4. package/dist/cli/{chunk-CR3LGTZQ.js → chunk-353WRRGG.js} +3 -3
  5. package/dist/cli/{chunk-JHFKBKSO.js → chunk-73YNZ3BN.js} +1 -1
  6. package/dist/cli/{chunk-VKRFHDRK.js → chunk-7S7ZLGIY.js} +28 -6
  7. package/dist/cli/{chunk-CIQAFCX3.js → chunk-ETGOWBUL.js} +3 -3
  8. package/dist/cli/chunk-JZEWCO6X.js +6 -0
  9. package/dist/cli/{chunk-LG3XFIPV.js → chunk-K3SDHHZF.js} +1 -1
  10. package/dist/cli/{chunk-3CF4FQWG.js → chunk-MZVMW356.js} +2 -2
  11. package/dist/cli/{chunk-VMGACWNP.js → chunk-RFFTWAAF.js} +1 -1
  12. package/dist/cli/{chunk-3NQNWGDX.js → chunk-TNYBWWRO.js} +2 -2
  13. package/dist/cli/{chunk-OYDTU6AP.js → chunk-TREGH6WM.js} +63 -15
  14. package/dist/cli/{chunk-ZI47U5CQ.js → chunk-UWDE365N.js} +2 -2
  15. package/dist/cli/{chunk-QSRB3F5Y.js → chunk-WCBXS3EU.js} +2 -2
  16. package/dist/cli/{chunk-RYZ6FHYT.js → chunk-WIUJNSAZ.js} +5 -5
  17. package/dist/cli/{chunk-JLUHY5AB.js → chunk-XZYQMKKO.js} +3 -3
  18. package/dist/cli/{daemon-ZUHJKLSL.js → daemon-ZTZ7VMYA.js} +7 -7
  19. package/dist/cli/{decide-OSSTI3FE.js → decide-4BIYS3Y2.js} +3 -3
  20. package/dist/cli/{handover-2G7OEWIG.js → handover-IS7BJYGZ.js} +4 -4
  21. package/dist/cli/{hook-XY4E5H7O.js → hook-3VKVD4IP.js} +9 -9
  22. package/dist/cli/index.js +16 -16
  23. package/dist/cli/{launch-7WOARLZM.js → launch-XAPN2M3Q.js} +8 -8
  24. package/dist/cli/{send-RUHGKLMA.js → send-ZLF2ZXMJ.js} +4 -4
  25. package/dist/cli/{status-4Z2VJFID.js → status-NONO6E2S.js} +2 -2
  26. package/dist/cli/{task-2GESYTOL.js → task-47MVWDCY.js} +4 -4
  27. package/dist/cli/{team-MTSKNMAE.js → team-EJ4YIXJH.js} +6 -6
  28. package/dist/cli/{tui-4IRYQXYU.js → tui-CAP4O4YQ.js} +8 -8
  29. package/dist/cli/{version-L2Y7MRH6.js → version-EHBPJO7K.js} +1 -1
  30. package/dist/cli/{who-PSKHASMK.js → who-FHAXYCM2.js} +3 -3
  31. package/package.json +1 -1
  32. package/dist/cli/chunk-UME2F7VM.js +0 -6
@@ -8,10 +8,10 @@ import {
8
8
  resultLine,
9
9
  runClose,
10
10
  runOnClient
11
- } from "./chunk-CR3LGTZQ.js";
12
- import "./chunk-LG3XFIPV.js";
13
- import "./chunk-VMGACWNP.js";
14
- import "./chunk-VKRFHDRK.js";
11
+ } from "./chunk-353WRRGG.js";
12
+ import "./chunk-K3SDHHZF.js";
13
+ import "./chunk-RFFTWAAF.js";
14
+ import "./chunk-7S7ZLGIY.js";
15
15
  import "./chunk-HOOHS3MX.js";
16
16
  import "./chunk-U67V476Y.js";
17
17
  export {
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  attachEnv
3
- } from "./chunk-RYZ6FHYT.js";
4
- import "./chunk-OYDTU6AP.js";
3
+ } from "./chunk-WIUJNSAZ.js";
4
+ import "./chunk-TREGH6WM.js";
5
5
  import "./chunk-OLLQBK6N.js";
6
- import "./chunk-QSRB3F5Y.js";
7
- import "./chunk-ZI47U5CQ.js";
8
- import "./chunk-JHFKBKSO.js";
9
- import "./chunk-LG3XFIPV.js";
6
+ import "./chunk-WCBXS3EU.js";
7
+ import "./chunk-UWDE365N.js";
8
+ import "./chunk-73YNZ3BN.js";
9
+ import "./chunk-K3SDHHZF.js";
10
10
  import {
11
11
  connect
12
- } from "./chunk-VMGACWNP.js";
12
+ } from "./chunk-RFFTWAAF.js";
13
13
  import {
14
14
  PROTOCOL_PORT,
15
15
  backendOf
16
- } from "./chunk-VKRFHDRK.js";
16
+ } from "./chunk-7S7ZLGIY.js";
17
17
  import {
18
18
  realTmux
19
19
  } from "./chunk-NLL2EQJ2.js";
@@ -7,7 +7,7 @@ import {
7
7
  parseClientMessage,
8
8
  parseServerMessage,
9
9
  readDaemonToken
10
- } from "./chunk-VKRFHDRK.js";
10
+ } from "./chunk-7S7ZLGIY.js";
11
11
  import "./chunk-HOOHS3MX.js";
12
12
  import "./chunk-U67V476Y.js";
13
13
 
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-VMGACWNP.js";
6
+ } from "./chunk-RFFTWAAF.js";
7
7
  import {
8
8
  SESSION_KEY_VAR,
9
9
  actionById
10
- } from "./chunk-VKRFHDRK.js";
10
+ } from "./chunk-7S7ZLGIY.js";
11
11
 
12
12
  // src/cli/action.ts
13
13
  import { randomUUID } from "crypto";
@@ -2,7 +2,7 @@ import {
2
2
  ROLE_LABEL_MAX,
3
3
  ROLE_PROMPT_MAX,
4
4
  RoleSchema
5
- } from "./chunk-VKRFHDRK.js";
5
+ } from "./chunk-7S7ZLGIY.js";
6
6
  import {
7
7
  log
8
8
  } from "./chunk-6IYPRUQG.js";
@@ -1967,13 +1967,17 @@ var PhoneSessionSchema = SwitchableSessionSchema.pick({
1967
1967
  team: true,
1968
1968
  /** Its context and its relief (context handover spec §3.2): the phone shows the gauge; the relief is started from the PC. */
1969
1969
  context: true,
1970
- relieves: true
1970
+ relieves: true,
1971
+ /** When it ended: « Terminée · à 18:42 » in the list. */
1972
+ exitedAt: true
1971
1973
  }).extend({
1972
1974
  pending: PhonePendingSchema.optional(),
1973
1975
  unread: z26.boolean(),
1974
1976
  handover: z26.object({ state: HandoverStateSchema, toName: z26.string().max(80).optional() }).strict().optional(),
1975
1977
  /** Absent: the agent has no checklist. */
1976
- checklist: PhoneChecklistSummarySchema.optional()
1978
+ checklist: PhoneChecklistSummarySchema.optional(),
1979
+ /** Started without Ledge (`hook_only`): the phone can neither close nor resume it. */
1980
+ readOnly: z26.literal(true).optional()
1977
1981
  });
1978
1982
  var B64U2 = z26.string().regex(/^[A-Za-z0-9_-]*$/);
1979
1983
  var CredentialSchema = z26.object({
@@ -2009,11 +2013,12 @@ var PhoneChatRelaySchema = z26.object({
2009
2013
  sentAt: z26.string().datetime().optional(),
2010
2014
  failed: z26.literal(true).optional()
2011
2015
  }).strict();
2016
+ var CloseHowSchema = z26.enum(["exit", "killed"]);
2012
2017
  var PhoneChatCloseSchema = z26.object({
2013
2018
  id: z26.string().min(1),
2014
2019
  name: z26.string(),
2015
2020
  tool: ToolSchema,
2016
- how: z26.enum(["exit", "killed"]).optional(),
2021
+ how: CloseHowSchema.optional(),
2017
2022
  closedAt: z26.string().datetime().optional(),
2018
2023
  failed: z26.literal(true).optional()
2019
2024
  }).strict();
@@ -2119,7 +2124,10 @@ var PhoneClientMessageSchema = z26.discriminatedUnion("type", [
2119
2124
  /** The session whose terminal the phone shows; null when it shows none. */
2120
2125
  z26.object({ type: z26.literal("session.watch"), id: sessionId.nullable() }),
2121
2126
  z26.object({ type: z26.literal("session.read"), id: sessionId, at: z26.string().datetime() }),
2122
- /** Asks for a challenge. One object for both purposes: the gateway refuses a `decide` without `id` and `expect`. */
2127
+ /**
2128
+ * Asks for a challenge. One object for every purpose: the gateway refuses a `decide` without `id` and `expect`. A `close`
2129
+ * or `act` names a turn of the chat (`qid`) or a session (`id`, for `session.close` and `session.resume`).
2130
+ */
2123
2131
  z26.object({
2124
2132
  type: z26.literal("confirm.prepare"),
2125
2133
  purpose: ConfirmPurposeSchema,
@@ -2165,6 +2173,10 @@ var PhoneClientMessageSchema = z26.discriminatedUnion("type", [
2165
2173
  expect: PhoneExpectSchema
2166
2174
  }),
2167
2175
  z26.object({ type: z26.literal("session.interrupt"), op: OperationIdSchema, id: sessionId }),
2176
+ /** Ends a live session as `/exit` would, killed as a last resort; answered with its `how`. Passkey, purpose `close`, over the session. */
2177
+ z26.object({ type: z26.literal("session.close"), op: OperationIdSchema, id: sessionId, assertion: AssertionSchema.optional() }),
2178
+ /** Starts an ended session again on its conversation. Passkey, purpose `act`, over the session. */
2179
+ z26.object({ type: z26.literal("session.resume"), op: OperationIdSchema, id: sessionId, assertion: AssertionSchema.optional() }),
2168
2180
  /** Changes a live session's model and effort, `null` for the agent's own default; answered by `operation.result` and, when refused, `session.model.failed`. */
2169
2181
  z26.object({ type: z26.literal("session.model"), op: OperationIdSchema, id: sessionId, model: ModelIdSchema.nullable(), effort: EffortSchema.nullable() }),
2170
2182
  /** The models an agent offers on the PC. */
@@ -2251,7 +2263,9 @@ var PhoneServerMessageSchema = z26.discriminatedUnion("type", [
2251
2263
  checklist: z26.literal(true).optional(),
2252
2264
  /** `update`: the daemon can install a version and restart (npm, systemd); `restart`: it can restart (systemd). */
2253
2265
  update: z26.literal(true).optional(),
2254
- restart: z26.literal(true).optional()
2266
+ restart: z26.literal(true).optional(),
2267
+ /** The daemon takes `session.close` and `session.resume`. */
2268
+ sessionClose: z26.literal(true).optional()
2255
2269
  }), device: z26.object({ confirm: z26.boolean(), push: z26.enum(["on", "off", "stale", "unavailable"]).optional(), chat: z26.literal(true).optional(), contextNear: ContextPrefsSchema.shape.near.optional() }).optional() }),
2256
2270
  z26.object({
2257
2271
  type: z26.literal("confirm.challenge"),
@@ -2273,7 +2287,15 @@ var PhoneServerMessageSchema = z26.discriminatedUnion("type", [
2273
2287
  /** `cut`: the ids of the items shortened; `more`: older items were left out. */
2274
2288
  z26.object({ type: z26.literal("session.thread"), id: z26.string(), items: z26.array(ThreadItemSchema), cut: z26.array(z26.string()), more: z26.boolean() }),
2275
2289
  z26.object({ type: z26.literal("session.thread.item"), id: z26.string(), item: ThreadItemSchema, cut: z26.literal(true).optional() }),
2276
- z26.object({ type: z26.literal("operation.result"), op: OperationIdSchema, status: OperationStatusSchema, reason: OperationReasonSchema.optional(), models: z26.array(PhoneSeatModelSchema).max(16).optional() }),
2290
+ z26.object({
2291
+ type: z26.literal("operation.result"),
2292
+ op: OperationIdSchema,
2293
+ status: OperationStatusSchema,
2294
+ reason: OperationReasonSchema.optional(),
2295
+ models: z26.array(PhoneSeatModelSchema).max(16).optional(),
2296
+ /** How an applied `session.close` ended the agent: `killed` when it had to be forced. */
2297
+ how: CloseHowSchema.optional()
2298
+ }),
2277
2299
  /** The models an agent offers; `error`: it could not be asked, `models` is then what Ledge knows without it. */
2278
2300
  z26.object({ type: z26.literal("models.listing"), tool: ToolSchema, models: z26.array(PhoneModelChoiceSchema).max(40), error: z26.literal(true).optional() }),
2279
2301
  /** A model change that was accepted and then failed (the agent could not restart). */
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-VMGACWNP.js";
6
+ } from "./chunk-RFFTWAAF.js";
7
7
  import {
8
8
  LEDGE_GIVER,
9
9
  TASK_TEXT_MAX,
10
10
  TASK_TITLE_MAX
11
- } from "./chunk-VKRFHDRK.js";
11
+ } from "./chunk-7S7ZLGIY.js";
12
12
 
13
13
  // src/cli/task.ts
14
14
  import { randomUUID } from "crypto";
@@ -0,0 +1,6 @@
1
+ // src/version.ts
2
+ var LEDGE_VERSION = true ? "0.29.0" : "0.0.0-dev";
3
+
4
+ export {
5
+ LEDGE_VERSION
6
+ };
@@ -3,7 +3,7 @@ import {
3
3
  SESSION_KEY_VAR,
4
4
  pickName,
5
5
  sessionKey
6
- } from "./chunk-VKRFHDRK.js";
6
+ } from "./chunk-7S7ZLGIY.js";
7
7
  import {
8
8
  paths
9
9
  } from "./chunk-HOOHS3MX.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  connect,
6
6
  sendMessageAndAwaitAck
7
- } from "./chunk-VMGACWNP.js";
7
+ } from "./chunk-RFFTWAAF.js";
8
8
 
9
9
  // src/cli/send.ts
10
10
  import { randomUUID } from "crypto";
@@ -4,7 +4,7 @@ import {
4
4
  SUMMARY_MAX,
5
5
  parseServerMessage,
6
6
  readDaemonToken
7
- } from "./chunk-VKRFHDRK.js";
7
+ } from "./chunk-7S7ZLGIY.js";
8
8
 
9
9
  // src/client.ts
10
10
  import WebSocket from "ws";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  connect
3
- } from "./chunk-VMGACWNP.js";
3
+ } from "./chunk-RFFTWAAF.js";
4
4
  import {
5
5
  isArchived
6
- } from "./chunk-VKRFHDRK.js";
6
+ } from "./chunk-7S7ZLGIY.js";
7
7
 
8
8
  // src/cli/who.ts
9
9
  import { basename } from "path";
@@ -10,7 +10,7 @@ import {
10
10
  templateExists,
11
11
  templateId,
12
12
  templateText
13
- } from "./chunk-QSRB3F5Y.js";
13
+ } from "./chunk-WCBXS3EU.js";
14
14
  import {
15
15
  NO_ALWAYS,
16
16
  NO_NOTE,
@@ -39,7 +39,7 @@ import {
39
39
  shownCommand,
40
40
  teammates,
41
41
  withImages
42
- } from "./chunk-ZI47U5CQ.js";
42
+ } from "./chunk-UWDE365N.js";
43
43
  import {
44
44
  definitionFiles,
45
45
  definitionHash,
@@ -47,7 +47,7 @@ import {
47
47
  loadRole,
48
48
  quoteScalar,
49
49
  repoRoot
50
- } from "./chunk-JHFKBKSO.js";
50
+ } from "./chunk-73YNZ3BN.js";
51
51
  import {
52
52
  PARENT_AGENT_VARS,
53
53
  agentEnv,
@@ -57,7 +57,7 @@ import {
57
57
  labelTranscript,
58
58
  resumeLabel,
59
59
  spawnSession
60
- } from "./chunk-LG3XFIPV.js";
60
+ } from "./chunk-K3SDHHZF.js";
61
61
  import {
62
62
  ACTIONS,
63
63
  ATTACHMENT_ID,
@@ -154,7 +154,7 @@ import {
154
154
  teamsPurpose,
155
155
  tokenEquals,
156
156
  transmissions
157
- } from "./chunk-VKRFHDRK.js";
157
+ } from "./chunk-7S7ZLGIY.js";
158
158
  import {
159
159
  log
160
160
  } from "./chunk-6IYPRUQG.js";
@@ -6062,7 +6062,7 @@ var OperationRegistry = class {
6062
6062
  return { kind: "fresh", record: { ...record } };
6063
6063
  }
6064
6064
  /** An operation already forgotten (expired) is left forgotten. */
6065
- finish(op, status, reason, models) {
6065
+ finish(op, status, reason, models, how) {
6066
6066
  const r = this.records.get(op);
6067
6067
  if (!r) return;
6068
6068
  r.status = status;
@@ -6070,6 +6070,8 @@ var OperationRegistry = class {
6070
6070
  else delete r.reason;
6071
6071
  if (models) r.models = models;
6072
6072
  else delete r.models;
6073
+ if (how) r.how = how;
6074
+ else delete r.how;
6073
6075
  }
6074
6076
  get(op) {
6075
6077
  this.expire();
@@ -6254,7 +6256,9 @@ function toPhoneSession(s, readAt2, checklist) {
6254
6256
  lastActivityAt: s.lastActivityAt,
6255
6257
  // Topics are already cut to TOPIC_MAX where they are set; clipped again so no source can swell a snapshot.
6256
6258
  ...s.topic !== void 0 ? { topic: clip(s.topic, TOPIC_MAX).text } : {},
6257
- ...pickSet(s, ["repo", "branch", "worktree", "role", "roleLabel", "team", "context", "relieves"]),
6259
+ ...pickSet(s, ["repo", "branch", "worktree", "role", "roleLabel", "team", "context", "relieves", "exitedAt"]),
6260
+ // Known up front: the phone shows neither Close nor Resume for it, rather than learning it from a refusal.
6261
+ ...s.source === "hook_only" ? { readOnly: true } : {},
6258
6262
  // Its relief's state only (context handover spec §3.2): the phone shows it, the PC starts it.
6259
6263
  ...s.handover ? { handover: { state: s.handover.state, ...s.handover.toName ? { toName: s.handover.toName.slice(0, 80) } : {} } } : {},
6260
6264
  // Its model, effort and the change waiting for its next free moment (#58), cut to the bounds of a model id and an effort.
@@ -6853,7 +6857,7 @@ function createPhoneGateway(deps) {
6853
6857
  protocol: PHONE_PROTOCOL,
6854
6858
  sessions: deps.sessions().filter((s) => !isArchived(s)).map((s) => projected(deviceId, s)),
6855
6859
  capabilities: capabilities(),
6856
- daemon: { version: deps.version, boot: deps.boot, name: clip(hostname(), 40).text, ...teamsOps ? { teams: true } : {}, ...deps.pc?.canUpdate ? { update: true } : {}, ...deps.pc?.canRestart ? { restart: true } : {}, checklist: true },
6860
+ daemon: { version: deps.version, boot: deps.boot, name: clip(hostname(), 40).text, ...teamsOps ? { teams: true } : {}, ...deps.pc?.canUpdate ? { update: true } : {}, ...deps.pc?.canRestart ? { restart: true } : {}, checklist: true, ...deps.closeSession ? { sessionClose: true } : {} },
6857
6861
  device: { confirm: deps.credential(deviceId) !== null, push: push2, ...deps.chats ? { chat: true } : {}, ...deps.contextNear ? { contextNear: deps.contextNear() } : {} }
6858
6862
  };
6859
6863
  return deps.models ? { ...message, daemon: { ...message.daemon, models: true } } : message;
@@ -6906,9 +6910,9 @@ function createPhoneGateway(deps) {
6906
6910
  const s = live3(m.id);
6907
6911
  if (reason.success && s) modelFailures.set(m.id, { reason: reason.data, model: s.model, effort: s.effort });
6908
6912
  };
6909
- const result = (deviceId, op, status, reason, models) => {
6913
+ const result = (deviceId, op, status, reason, models, how) => {
6910
6914
  if (stopped2 || !approved(deviceId)) return;
6911
- push(deviceId, { type: "operation.result", op, status, ...reason ? { reason } : {}, ...models ? { models } : {} });
6915
+ push(deviceId, { type: "operation.result", op, status, ...reason ? { reason } : {}, ...models ? { models } : {}, ...how ? { how } : {} });
6912
6916
  };
6913
6917
  const needsAssertion = (msg, s) => {
6914
6918
  if (msg.type === "session.decide") return msg.decision !== "deny" && riskOf2(s)?.risk !== "low";
@@ -7095,6 +7099,39 @@ function createPhoneGateway(deps) {
7095
7099
  throw e;
7096
7100
  }
7097
7101
  };
7102
+ const sessionSubject = (id) => `session:${id}`;
7103
+ const sessionEnd = async (deviceId, msg) => {
7104
+ const close = deps.closeSession;
7105
+ if (!close) return { status: "rejected", reason: "unavailable" };
7106
+ const closing = msg.type === "session.close";
7107
+ const s = live3(msg.id);
7108
+ if (!s) return { status: "rejected", reason: "unknown_session" };
7109
+ if (s.source === "hook_only") return { status: "rejected", reason: "read_only" };
7110
+ if (closing && s.state === "exited") return { status: "rejected", reason: "ended" };
7111
+ if (!closing && s.state !== "exited") return { status: "rejected", reason: "busy" };
7112
+ if (deps.credential(deviceId) === null) return { status: "rejected", reason: "confirm_required" };
7113
+ const refused = checkAssertion(deviceId, msg.assertion, closing ? "close" : "act", sessionSubject(msg.id));
7114
+ if (refused) return refused;
7115
+ if (!closing) {
7116
+ let error;
7117
+ await deps.dispatch({ type: "session.resume", id: msg.id }, (m) => {
7118
+ if (m.type === "error" && m.request === "session.resume") error ??= { code: m.code };
7119
+ });
7120
+ if (!error) return { status: "applied" };
7121
+ return error.code === "no_conversation" ? { status: "rejected", reason: "no_conversation" } : outcomeOf(error.code);
7122
+ }
7123
+ try {
7124
+ const { how } = await close(msg.id);
7125
+ log2(`phone: device ${deviceId} closed ${msg.id} (${how})`);
7126
+ return { status: "applied", how };
7127
+ } catch (e) {
7128
+ if (live3(msg.id)?.state === "exited") return { status: "rejected", reason: "ended" };
7129
+ const code = RefusalCodeSchema.safeParse(e instanceof Error ? e.code : void 0);
7130
+ if (code.success) return { status: "rejected", reason: code.data };
7131
+ log2(`phone session.close failed (${e instanceof Error ? e.name : "error"})`);
7132
+ return { status: "failed" };
7133
+ }
7134
+ };
7098
7135
  const ask = async (out, ok2, opts = {}) => {
7099
7136
  let outcome;
7100
7137
  await deps.dispatch(out, (m) => {
@@ -7220,6 +7257,7 @@ function createPhoneGateway(deps) {
7220
7257
  if (msg.type === "chat.launch") return chatLaunch(deviceId, msg);
7221
7258
  if (msg.type === "chat.close") return chatClose(deviceId, msg);
7222
7259
  if (msg.type === "chat.act") return chatAct(deviceId, msg);
7260
+ if (msg.type === "session.close" || msg.type === "session.resume") return sessionEnd(deviceId, msg);
7223
7261
  const refused = precheck(deviceId, msg);
7224
7262
  if (refused) return refused;
7225
7263
  const out = local(msg);
@@ -7233,7 +7271,7 @@ function createPhoneGateway(deps) {
7233
7271
  const write = async (deviceId, msg) => {
7234
7272
  const begun = registry.begin(deviceId, msg.op, fingerprint(msg));
7235
7273
  if (begun.kind === "conflict") return result(deviceId, msg.op, "rejected", "conflict");
7236
- if (begun.kind === "replay") return result(deviceId, msg.op, begun.record.status, begun.record.reason, begun.record.models);
7274
+ if (begun.kind === "replay") return result(deviceId, msg.op, begun.record.status, begun.record.reason, begun.record.models, begun.record.how);
7237
7275
  let outcome;
7238
7276
  try {
7239
7277
  result(deviceId, msg.op, "received");
@@ -7242,8 +7280,8 @@ function createPhoneGateway(deps) {
7242
7280
  log2(`phone ${msg.type} failed (${e instanceof Error ? e.name : "error"})`);
7243
7281
  outcome = { status: "failed" };
7244
7282
  }
7245
- registry.finish(msg.op, outcome.status, outcome.reason, outcome.models);
7246
- result(deviceId, msg.op, outcome.status, outcome.reason, outcome.models);
7283
+ registry.finish(msg.op, outcome.status, outcome.reason, outcome.models, outcome.how);
7284
+ result(deviceId, msg.op, outcome.status, outcome.reason, outcome.models, outcome.how);
7247
7285
  if (msg.type === "credential.register" && outcome.status === "applied" && approved(deviceId)) push(deviceId, snapshot(deviceId), "snapshot");
7248
7286
  if (msg.type === "device.forget" && outcome.status === "applied") {
7249
7287
  let timer;
@@ -7380,6 +7418,14 @@ function createPhoneGateway(deps) {
7380
7418
  const challenge = deps.challenges.issue({ deviceId, purpose: "launch", subject: msg.qid });
7381
7419
  return push(deviceId, { type: "confirm.challenge", purpose: "launch", challenge, rpId: rp.rpId, credentialId: cred.id, expiresInMs: CHALLENGE_TTL_MS });
7382
7420
  }
7421
+ if ((msg.purpose === "close" || msg.purpose === "act") && msg.qid === void 0 && msg.id !== void 0) {
7422
+ if (!deps.closeSession) return invalid2();
7423
+ if (!live3(msg.id)) return push(deviceId, { type: "error", code: "unknown_session", request: msg.type });
7424
+ const cred = deps.credential(deviceId);
7425
+ if (!cred || cred.rpId !== rp.rpId) return invalid2();
7426
+ const challenge = deps.challenges.issue({ deviceId, purpose: msg.purpose, subject: sessionSubject(msg.id) });
7427
+ return push(deviceId, { type: "confirm.challenge", purpose: msg.purpose, challenge, rpId: rp.rpId, credentialId: cred.id, expiresInMs: CHALLENGE_TTL_MS });
7428
+ }
7383
7429
  if (msg.purpose === "close") {
7384
7430
  if (msg.qid === void 0 || !ownTurn(deviceId, msg.qid)) return invalid2();
7385
7431
  const cred = deps.credential(deviceId);
@@ -7444,7 +7490,7 @@ function createPhoneGateway(deps) {
7444
7490
  log2(`phone message refused: ${request ?? "?"}`);
7445
7491
  const op = OperationIdSchema.safeParse(raw?.op);
7446
7492
  if (request === "session.model" && op.success && approved(deviceId)) return push(deviceId, { type: "operation.result", op: op.data, status: "rejected", reason: "invalid" });
7447
- if ((request !== void 0 && TEAMS_OPERATION_TYPES.includes(request) || request === "push.subscribe" || request === "chat.launch" || request === "chat.close" || request === "chat.act" || request === "chat.ignore" || request === "chat.team" || request === "chat.task" || request === "team.resume" || request === "task.seen") && op.success && approved(deviceId)) return push(deviceId, { type: "operation.result", op: op.data, status: "rejected", reason: "invalid" });
7493
+ if ((request !== void 0 && TEAMS_OPERATION_TYPES.includes(request) || request === "push.subscribe" || request === "chat.launch" || request === "chat.close" || request === "chat.act" || request === "chat.ignore" || request === "chat.team" || request === "chat.task" || request === "team.resume" || request === "task.seen" || request === "session.close" || request === "session.resume") && op.success && approved(deviceId)) return push(deviceId, { type: "operation.result", op: op.data, status: "rejected", reason: "invalid" });
7448
7494
  return push(deviceId, { type: "error", code: "invalid", ...request !== void 0 ? { request } : {} });
7449
7495
  }
7450
7496
  const msg = parsed.data;
@@ -9072,7 +9118,7 @@ ${now2.prompt}` });
9072
9118
  if (!s) return refuse(unknownSession(), msg.id);
9073
9119
  if (s.state !== "exited") return refuse(new Refusal("the session is still running", "busy"), msg.id);
9074
9120
  const key = resumeKey(s);
9075
- if (!key) return refuse("no conversation to resume", msg.id);
9121
+ if (!key) return refuse({ message: "no conversation to resume", code: "no_conversation" }, msg.id);
9076
9122
  const refused = await respawn(s, key, s.model, s.effort);
9077
9123
  if (refused) refuse(refused, msg.id);
9078
9124
  return;
@@ -9363,6 +9409,8 @@ ${now2.prompt}` });
9363
9409
  teamCatalog: true,
9364
9410
  // The phone's model switch (#58): `session.model` answers with a code, and `models.list` asks this machine's agents.
9365
9411
  models: true,
9412
+ // A session's « Fermer » on the phone: the cards' close, so a close under way (a card's, another phone's) is shared.
9413
+ closeSession: closeForCard,
9366
9414
  // The phone's « Mettre à jour le PC » and « Redémarrer le daemon »: the updater Desktop's `update.daemon` uses, progress broadcast.
9367
9415
  ...opts.updater && opts.daemon ? {
9368
9416
  pc: {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ledgeTitleRest
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  cleanTopic,
6
6
  isArchived,
7
7
  sessionTitle
8
- } from "./chunk-VKRFHDRK.js";
8
+ } from "./chunk-7S7ZLGIY.js";
9
9
 
10
10
  // src/daemon/seat.ts
11
11
  function teammates(team, sessions) {
@@ -6,11 +6,11 @@ import {
6
6
  quoteScalar,
7
7
  readSmall,
8
8
  scalarValue
9
- } from "./chunk-JHFKBKSO.js";
9
+ } from "./chunk-73YNZ3BN.js";
10
10
  import {
11
11
  SeatsSchema,
12
12
  TeamNameSchema
13
- } from "./chunk-VKRFHDRK.js";
13
+ } from "./chunk-7S7ZLGIY.js";
14
14
  import {
15
15
  log
16
16
  } from "./chunk-6IYPRUQG.js";
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  EFFORT_ARGS,
3
3
  MODEL_ARGS
4
- } from "./chunk-OYDTU6AP.js";
4
+ } from "./chunk-TREGH6WM.js";
5
5
  import {
6
6
  findRole
7
- } from "./chunk-JHFKBKSO.js";
7
+ } from "./chunk-73YNZ3BN.js";
8
8
  import {
9
9
  exitFile,
10
10
  spawnSession
11
- } from "./chunk-LG3XFIPV.js";
11
+ } from "./chunk-K3SDHHZF.js";
12
12
  import {
13
13
  DaemonRefusedError,
14
14
  connect
15
- } from "./chunk-VMGACWNP.js";
15
+ } from "./chunk-RFFTWAAF.js";
16
16
  import {
17
17
  PROTOCOL_PORT,
18
18
  autonomyArgs
19
- } from "./chunk-VKRFHDRK.js";
19
+ } from "./chunk-7S7ZLGIY.js";
20
20
  import {
21
21
  realTmux
22
22
  } from "./chunk-NLL2EQJ2.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-VMGACWNP.js";
6
+ } from "./chunk-RFFTWAAF.js";
7
7
  import {
8
8
  BRIEF_MAX
9
- } from "./chunk-VKRFHDRK.js";
9
+ } from "./chunk-7S7ZLGIY.js";
10
10
 
11
11
  // src/cli/handover.ts
12
12
  import { randomUUID } from "crypto";
@@ -9,9 +9,9 @@ import {
9
9
  startServer,
10
10
  tasksJournal,
11
11
  teamsJournal
12
- } from "./chunk-OYDTU6AP.js";
12
+ } from "./chunk-TREGH6WM.js";
13
13
  import "./chunk-OLLQBK6N.js";
14
- import "./chunk-QSRB3F5Y.js";
14
+ import "./chunk-WCBXS3EU.js";
15
15
  import {
16
16
  QUESTION_TOOLS,
17
17
  crossSession,
@@ -26,11 +26,11 @@ import {
26
26
  readPeers,
27
27
  reduce,
28
28
  stripNote
29
- } from "./chunk-ZI47U5CQ.js";
30
- import "./chunk-JHFKBKSO.js";
29
+ } from "./chunk-UWDE365N.js";
30
+ import "./chunk-73YNZ3BN.js";
31
31
  import {
32
32
  agentMessages
33
- } from "./chunk-LG3XFIPV.js";
33
+ } from "./chunk-K3SDHHZF.js";
34
34
  import {
35
35
  DEFAULT_RELAY_URL,
36
36
  DevicePollResponseSchema,
@@ -44,10 +44,10 @@ import {
44
44
  SealedFrameSchema,
45
45
  SessionSchema,
46
46
  backendOf
47
- } from "./chunk-VKRFHDRK.js";
47
+ } from "./chunk-7S7ZLGIY.js";
48
48
  import {
49
49
  LEDGE_VERSION
50
- } from "./chunk-UME2F7VM.js";
50
+ } from "./chunk-JZEWCO6X.js";
51
51
  import {
52
52
  SERVICE,
53
53
  inDaemonService,
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-LG3XFIPV.js";
3
+ } from "./chunk-K3SDHHZF.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-VMGACWNP.js";
6
+ } from "./chunk-RFFTWAAF.js";
7
7
  import {
8
8
  LEDGE_GIVER,
9
9
  TASK_TEXT_MAX
10
- } from "./chunk-VKRFHDRK.js";
10
+ } from "./chunk-7S7ZLGIY.js";
11
11
  import "./chunk-HOOHS3MX.js";
12
12
  import "./chunk-U67V476Y.js";
13
13
 
@@ -3,10 +3,10 @@ import {
3
3
  handoverArgs,
4
4
  handoverOnClient,
5
5
  runHandover
6
- } from "./chunk-JLUHY5AB.js";
7
- import "./chunk-LG3XFIPV.js";
8
- import "./chunk-VMGACWNP.js";
9
- import "./chunk-VKRFHDRK.js";
6
+ } from "./chunk-XZYQMKKO.js";
7
+ import "./chunk-K3SDHHZF.js";
8
+ import "./chunk-RFFTWAAF.js";
9
+ import "./chunk-7S7ZLGIY.js";
10
10
  import "./chunk-HOOHS3MX.js";
11
11
  import "./chunk-U67V476Y.js";
12
12
  export {
@@ -8,36 +8,36 @@ import {
8
8
  seatContext,
9
9
  takeImages,
10
10
  teammates
11
- } from "./chunk-ZI47U5CQ.js";
11
+ } from "./chunk-UWDE365N.js";
12
12
  import {
13
13
  findRole
14
- } from "./chunk-JHFKBKSO.js";
14
+ } from "./chunk-73YNZ3BN.js";
15
15
  import {
16
16
  parseLedgeCommand,
17
17
  readOnClient,
18
18
  sendOnClient
19
- } from "./chunk-3CF4FQWG.js";
19
+ } from "./chunk-MZVMW356.js";
20
20
  import {
21
21
  taskOnClient
22
- } from "./chunk-CIQAFCX3.js";
22
+ } from "./chunk-ETGOWBUL.js";
23
23
  import {
24
24
  handoverOnClient
25
- } from "./chunk-JLUHY5AB.js";
25
+ } from "./chunk-XZYQMKKO.js";
26
26
  import {
27
27
  CODEX_ENV_VAR,
28
28
  CODEX_HOOK_VAR,
29
29
  codexPlan
30
- } from "./chunk-LG3XFIPV.js";
30
+ } from "./chunk-K3SDHHZF.js";
31
31
  import {
32
32
  formatWho
33
- } from "./chunk-3NQNWGDX.js";
33
+ } from "./chunk-TNYBWWRO.js";
34
34
  import {
35
35
  connect,
36
36
  sendMessageAndAwaitAck
37
- } from "./chunk-VMGACWNP.js";
37
+ } from "./chunk-RFFTWAAF.js";
38
38
  import {
39
39
  taskClosed
40
- } from "./chunk-VKRFHDRK.js";
40
+ } from "./chunk-7S7ZLGIY.js";
41
41
  import {
42
42
  log
43
43
  } from "./chunk-6IYPRUQG.js";
package/dist/cli/index.js CHANGED
@@ -25,7 +25,7 @@ async function hookMain(args) {
25
25
  try {
26
26
  const chunks = [];
27
27
  for await (const c of process.stdin) chunks.push(c);
28
- const { runHook } = await import("./hook-XY4E5H7O.js");
28
+ const { runHook } = await import("./hook-3VKVD4IP.js");
29
29
  const out = await runHook(event, Buffer.concat(chunks).toString("utf8"), { tool });
30
30
  if (out) process.stdout.write(`${out}
31
31
  `);
@@ -37,7 +37,7 @@ async function main(argv) {
37
37
  const [cmd, ...rest] = argv;
38
38
  switch (cmd) {
39
39
  case "daemon": {
40
- const { startDaemon } = await import("./daemon-ZUHJKLSL.js");
40
+ const { startDaemon } = await import("./daemon-ZTZ7VMYA.js");
41
41
  await startDaemon();
42
42
  await new Promise(() => {
43
43
  });
@@ -45,7 +45,7 @@ async function main(argv) {
45
45
  }
46
46
  case "--version":
47
47
  case "version": {
48
- const { LEDGE_VERSION } = await import("./version-L2Y7MRH6.js");
48
+ const { LEDGE_VERSION } = await import("./version-EHBPJO7K.js");
49
49
  console.log(LEDGE_VERSION);
50
50
  return 0;
51
51
  }
@@ -66,74 +66,74 @@ async function main(argv) {
66
66
  return r.ok ? 0 : 1;
67
67
  }
68
68
  case "status": {
69
- const { printStatus } = await import("./status-4Z2VJFID.js");
69
+ const { printStatus } = await import("./status-NONO6E2S.js");
70
70
  console.log(await printStatus());
71
71
  return 0;
72
72
  }
73
73
  case "who": {
74
- const { printWho } = await import("./who-PSKHASMK.js");
74
+ const { printWho } = await import("./who-FHAXYCM2.js");
75
75
  console.log(await printWho());
76
76
  return 0;
77
77
  }
78
78
  case "send": {
79
- const { sendMessage } = await import("./send-RUHGKLMA.js");
79
+ const { sendMessage } = await import("./send-ZLF2ZXMJ.js");
80
80
  const r = await sendMessage(rest);
81
81
  console.log(r.line);
82
82
  return r.code;
83
83
  }
84
84
  case "read": {
85
- const { readMessage } = await import("./send-RUHGKLMA.js");
85
+ const { readMessage } = await import("./send-ZLF2ZXMJ.js");
86
86
  const r = await readMessage(rest);
87
87
  console.log(r.line);
88
88
  return r.code;
89
89
  }
90
90
  case "task": {
91
- const { runTask } = await import("./task-2GESYTOL.js");
91
+ const { runTask } = await import("./task-47MVWDCY.js");
92
92
  const r = await runTask(rest);
93
93
  console.log(r.line);
94
94
  return r.code;
95
95
  }
96
96
  case "decide": {
97
- const { runDecide } = await import("./decide-OSSTI3FE.js");
97
+ const { runDecide } = await import("./decide-4BIYS3Y2.js");
98
98
  const r = await runDecide(rest);
99
99
  console.log(r.line);
100
100
  return r.code;
101
101
  }
102
102
  case "handover": {
103
- const { runHandover } = await import("./handover-2G7OEWIG.js");
103
+ const { runHandover } = await import("./handover-IS7BJYGZ.js");
104
104
  const r = await runHandover(rest);
105
105
  console.log(r.line);
106
106
  return r.code;
107
107
  }
108
108
  case "close": {
109
- const { runClose } = await import("./action-NQRSZEC5.js");
109
+ const { runClose } = await import("./action-MAPPYLUM.js");
110
110
  const r = await runClose(rest);
111
111
  console.log(r.line);
112
112
  return r.code;
113
113
  }
114
114
  case "team": {
115
- const { runTeam } = await import("./team-MTSKNMAE.js");
115
+ const { runTeam } = await import("./team-EJ4YIXJH.js");
116
116
  const r = await runTeam(rest);
117
117
  console.log(r.line);
118
118
  return r.code;
119
119
  }
120
120
  case "tui": {
121
- const { runTui } = await import("./tui-4IRYQXYU.js");
121
+ const { runTui } = await import("./tui-CAP4O4YQ.js");
122
122
  return runTui(rest);
123
123
  }
124
124
  case "bridge": {
125
- const { bridge } = await import("./bridge-XCTXVWKH.js");
125
+ const { bridge } = await import("./bridge-TWX4V37E.js");
126
126
  await bridge();
127
127
  return 0;
128
128
  }
129
129
  case "claude":
130
130
  case "codex":
131
131
  case "cursor": {
132
- const { launch } = await import("./launch-7WOARLZM.js");
132
+ const { launch } = await import("./launch-XAPN2M3Q.js");
133
133
  return launch(cmd, rest);
134
134
  }
135
135
  case "attach": {
136
- const { attach } = await import("./attach-KXOSFUHO.js");
136
+ const { attach } = await import("./attach-OC64CLB2.js");
137
137
  return attach(rest.find((a) => !a.startsWith("--")) ?? "", { readOnly: rest.includes("--read-only") });
138
138
  }
139
139
  default:
@@ -6,18 +6,18 @@ import {
6
6
  launch,
7
7
  parseLaunchArgs,
8
8
  roleArgs
9
- } from "./chunk-RYZ6FHYT.js";
10
- import "./chunk-OYDTU6AP.js";
9
+ } from "./chunk-WIUJNSAZ.js";
10
+ import "./chunk-TREGH6WM.js";
11
11
  import "./chunk-OLLQBK6N.js";
12
- import "./chunk-QSRB3F5Y.js";
13
- import "./chunk-ZI47U5CQ.js";
14
- import "./chunk-JHFKBKSO.js";
12
+ import "./chunk-WCBXS3EU.js";
13
+ import "./chunk-UWDE365N.js";
14
+ import "./chunk-73YNZ3BN.js";
15
15
  import {
16
16
  agentEnv,
17
17
  exitFile
18
- } from "./chunk-LG3XFIPV.js";
19
- import "./chunk-VMGACWNP.js";
20
- import "./chunk-VKRFHDRK.js";
18
+ } from "./chunk-K3SDHHZF.js";
19
+ import "./chunk-RFFTWAAF.js";
20
+ import "./chunk-7S7ZLGIY.js";
21
21
  import "./chunk-NLL2EQJ2.js";
22
22
  import "./chunk-6IYPRUQG.js";
23
23
  import "./chunk-HOOHS3MX.js";
@@ -4,10 +4,10 @@ import {
4
4
  readOnClient,
5
5
  sendMessage,
6
6
  sendOnClient
7
- } from "./chunk-3CF4FQWG.js";
8
- import "./chunk-LG3XFIPV.js";
9
- import "./chunk-VMGACWNP.js";
10
- import "./chunk-VKRFHDRK.js";
7
+ } from "./chunk-MZVMW356.js";
8
+ import "./chunk-K3SDHHZF.js";
9
+ import "./chunk-RFFTWAAF.js";
10
+ import "./chunk-7S7ZLGIY.js";
11
11
  import "./chunk-HOOHS3MX.js";
12
12
  import "./chunk-U67V476Y.js";
13
13
  export {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  connect
3
- } from "./chunk-VMGACWNP.js";
4
- import "./chunk-VKRFHDRK.js";
3
+ } from "./chunk-RFFTWAAF.js";
4
+ import "./chunk-7S7ZLGIY.js";
5
5
  import "./chunk-HOOHS3MX.js";
6
6
  import "./chunk-U67V476Y.js";
7
7
 
@@ -4,10 +4,10 @@ import {
4
4
  runTask,
5
5
  taskArgs,
6
6
  taskOnClient
7
- } from "./chunk-CIQAFCX3.js";
8
- import "./chunk-LG3XFIPV.js";
9
- import "./chunk-VMGACWNP.js";
10
- import "./chunk-VKRFHDRK.js";
7
+ } from "./chunk-ETGOWBUL.js";
8
+ import "./chunk-K3SDHHZF.js";
9
+ import "./chunk-RFFTWAAF.js";
10
+ import "./chunk-7S7ZLGIY.js";
11
11
  import "./chunk-HOOHS3MX.js";
12
12
  import "./chunk-U67V476Y.js";
13
13
  export {
@@ -4,20 +4,20 @@ import {
4
4
  callerOf,
5
5
  resultLine,
6
6
  runOnClient
7
- } from "./chunk-CR3LGTZQ.js";
7
+ } from "./chunk-353WRRGG.js";
8
8
  import {
9
9
  listDefinitions
10
- } from "./chunk-QSRB3F5Y.js";
11
- import "./chunk-JHFKBKSO.js";
12
- import "./chunk-LG3XFIPV.js";
10
+ } from "./chunk-WCBXS3EU.js";
11
+ import "./chunk-73YNZ3BN.js";
12
+ import "./chunk-K3SDHHZF.js";
13
13
  import {
14
14
  connect
15
- } from "./chunk-VMGACWNP.js";
15
+ } from "./chunk-RFFTWAAF.js";
16
16
  import {
17
17
  RoleIdSchema,
18
18
  SeatsSchema,
19
19
  ToolSchema
20
- } from "./chunk-VKRFHDRK.js";
20
+ } from "./chunk-7S7ZLGIY.js";
21
21
  import "./chunk-6IYPRUQG.js";
22
22
  import "./chunk-HOOHS3MX.js";
23
23
  import "./chunk-U67V476Y.js";
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  attachEnv
3
- } from "./chunk-RYZ6FHYT.js";
3
+ } from "./chunk-WIUJNSAZ.js";
4
4
  import {
5
5
  imageInfo
6
- } from "./chunk-OYDTU6AP.js";
6
+ } from "./chunk-TREGH6WM.js";
7
7
  import {
8
8
  MAX_FRAME
9
9
  } from "./chunk-OLLQBK6N.js";
10
- import "./chunk-QSRB3F5Y.js";
11
- import "./chunk-ZI47U5CQ.js";
12
- import "./chunk-JHFKBKSO.js";
13
- import "./chunk-LG3XFIPV.js";
14
- import "./chunk-VMGACWNP.js";
10
+ import "./chunk-WCBXS3EU.js";
11
+ import "./chunk-UWDE365N.js";
12
+ import "./chunk-73YNZ3BN.js";
13
+ import "./chunk-K3SDHHZF.js";
14
+ import "./chunk-RFFTWAAF.js";
15
15
  import {
16
16
  ACTION_ERROR_CODES,
17
17
  ATTACHMENTS_MAX,
@@ -43,7 +43,7 @@ import {
43
43
  readDaemonToken,
44
44
  taskClosed,
45
45
  transmissions
46
- } from "./chunk-VKRFHDRK.js";
46
+ } from "./chunk-7S7ZLGIY.js";
47
47
  import "./chunk-NLL2EQJ2.js";
48
48
  import "./chunk-6IYPRUQG.js";
49
49
  import {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  LEDGE_VERSION
3
- } from "./chunk-UME2F7VM.js";
3
+ } from "./chunk-JZEWCO6X.js";
4
4
  import "./chunk-U67V476Y.js";
5
5
  export {
6
6
  LEDGE_VERSION
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  formatWho,
3
3
  printWho
4
- } from "./chunk-3NQNWGDX.js";
5
- import "./chunk-VMGACWNP.js";
6
- import "./chunk-VKRFHDRK.js";
4
+ } from "./chunk-TNYBWWRO.js";
5
+ import "./chunk-RFFTWAAF.js";
6
+ import "./chunk-7S7ZLGIY.js";
7
7
  import "./chunk-HOOHS3MX.js";
8
8
  import "./chunk-U67V476Y.js";
9
9
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paradow/ledge",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Follow and answer your WSL agent sessions (Claude Code, Codex, Cursor Agent) from the Ledge island on Windows.",
5
5
  "type": "module",
6
6
  "bin": { "ledge": "dist/cli/index.js" },
@@ -1,6 +0,0 @@
1
- // src/version.ts
2
- var LEDGE_VERSION = true ? "0.28.0" : "0.0.0-dev";
3
-
4
- export {
5
- LEDGE_VERSION
6
- };