@paradow/ledge 0.26.0 → 0.27.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-SCMMRWYI.js → action-7SJJTIEA.js} +4 -4
  2. package/dist/cli/{attach-EFIN5VU6.js → attach-V7UPHVB2.js} +8 -8
  3. package/dist/cli/{bridge-QT5X6TWJ.js → bridge-JK3PMG7T.js} +1 -1
  4. package/dist/cli/{chunk-L3GYGJRE.js → chunk-2N7PSP7C.js} +3 -3
  5. package/dist/cli/{chunk-QRD74KPO.js → chunk-37G5F75H.js} +27 -4
  6. package/dist/cli/{chunk-NYGLT5G2.js → chunk-7GIUG73R.js} +1 -1
  7. package/dist/cli/{chunk-TYNRKZFE.js → chunk-7JRQCKBP.js} +2 -2
  8. package/dist/cli/{chunk-JHUIHBC7.js → chunk-7OGFH6KJ.js} +2 -2
  9. package/dist/cli/{chunk-PTY4LXTG.js → chunk-ADAGKOFO.js} +1 -1
  10. package/dist/cli/{chunk-2V2OJR2N.js → chunk-CVHX7GUB.js} +77 -18
  11. package/dist/cli/chunk-HMTOPOJG.js +6 -0
  12. package/dist/cli/{chunk-SYXW4YB6.js → chunk-IGAGJVRZ.js} +3 -3
  13. package/dist/cli/{chunk-WYVMCF2K.js → chunk-ISNHG5SJ.js} +5 -5
  14. package/dist/cli/{chunk-6F6JTPMC.js → chunk-RA3OIXEQ.js} +2 -2
  15. package/dist/cli/{chunk-5PTC732E.js → chunk-TOSPL5H2.js} +3 -3
  16. package/dist/cli/{chunk-II6VRGLU.js → chunk-UPKJO3BZ.js} +1 -1
  17. package/dist/cli/{chunk-HCTXTN2X.js → chunk-YLN3VOGV.js} +2 -2
  18. package/dist/cli/{daemon-U6NA6PVD.js → daemon-YUPB5NUG.js} +34 -15
  19. package/dist/cli/{decide-XOUTZT3S.js → decide-HFI2WQXI.js} +3 -3
  20. package/dist/cli/{handover-6CQKUZJV.js → handover-GKORMXZ2.js} +4 -4
  21. package/dist/cli/{hook-ZIJACTCF.js → hook-TJJEFV54.js} +9 -9
  22. package/dist/cli/index.js +16 -16
  23. package/dist/cli/{launch-QWPA2P66.js → launch-QKQZZSIM.js} +8 -8
  24. package/dist/cli/{send-T5IOOVGX.js → send-RI7JOO5K.js} +4 -4
  25. package/dist/cli/{status-EZPFE5CL.js → status-RQRS26S2.js} +2 -2
  26. package/dist/cli/{task-B2QVGHDF.js → task-U2XHBUKW.js} +4 -4
  27. package/dist/cli/{team-V6VPO3CB.js → team-NFC4XEIA.js} +6 -6
  28. package/dist/cli/{tui-MM64KSQ2.js → tui-UWR7SDYF.js} +8 -8
  29. package/dist/cli/{version-SK4VC4AE.js → version-YYNMMWKJ.js} +1 -1
  30. package/dist/cli/{who-XXZUCJPD.js → who-WW6IL4KD.js} +3 -3
  31. package/package.json +1 -1
  32. package/dist/cli/chunk-3PLC745L.js +0 -6
@@ -8,10 +8,10 @@ import {
8
8
  resultLine,
9
9
  runClose,
10
10
  runOnClient
11
- } from "./chunk-SYXW4YB6.js";
12
- import "./chunk-PTY4LXTG.js";
13
- import "./chunk-NYGLT5G2.js";
14
- import "./chunk-QRD74KPO.js";
11
+ } from "./chunk-IGAGJVRZ.js";
12
+ import "./chunk-ADAGKOFO.js";
13
+ import "./chunk-7GIUG73R.js";
14
+ import "./chunk-37G5F75H.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-WYVMCF2K.js";
4
- import "./chunk-2V2OJR2N.js";
3
+ } from "./chunk-ISNHG5SJ.js";
4
+ import "./chunk-CVHX7GUB.js";
5
5
  import "./chunk-OLLQBK6N.js";
6
- import "./chunk-HCTXTN2X.js";
7
- import "./chunk-TYNRKZFE.js";
8
- import "./chunk-II6VRGLU.js";
9
- import "./chunk-PTY4LXTG.js";
6
+ import "./chunk-YLN3VOGV.js";
7
+ import "./chunk-7JRQCKBP.js";
8
+ import "./chunk-UPKJO3BZ.js";
9
+ import "./chunk-ADAGKOFO.js";
10
10
  import {
11
11
  connect
12
- } from "./chunk-NYGLT5G2.js";
12
+ } from "./chunk-7GIUG73R.js";
13
13
  import {
14
14
  PROTOCOL_PORT,
15
15
  backendOf
16
- } from "./chunk-QRD74KPO.js";
16
+ } from "./chunk-37G5F75H.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-QRD74KPO.js";
10
+ } from "./chunk-37G5F75H.js";
11
11
  import "./chunk-HOOHS3MX.js";
12
12
  import "./chunk-U67V476Y.js";
13
13
 
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-NYGLT5G2.js";
6
+ } from "./chunk-7GIUG73R.js";
7
7
  import {
8
8
  BRIEF_MAX
9
- } from "./chunk-QRD74KPO.js";
9
+ } from "./chunk-37G5F75H.js";
10
10
 
11
11
  // src/cli/handover.ts
12
12
  import { randomUUID } from "crypto";
@@ -1960,7 +1960,7 @@ var AssertionSchema = z26.object({
1960
1960
  signature: B64U2.max(1024)
1961
1961
  });
1962
1962
  var TeamsDigestSchema = z26.string().regex(/^[0-9a-f]{64}$/);
1963
- var ConfirmPurposeSchema = z26.enum(["register", "decide", "launch", "close", "act", "define", "team"]);
1963
+ var ConfirmPurposeSchema = z26.enum(["register", "decide", "launch", "close", "act", "define", "team", "pc"]);
1964
1964
  var PhoneChatStepSchema = ChatStepSchema.pick({ kind: true, id: true, name: true }).strict();
1965
1965
  var PhoneChatProposalSchema = z26.object({
1966
1966
  project: z26.string().max(80),
@@ -2077,6 +2077,8 @@ var sessionId = z26.string().min(1).max(100);
2077
2077
  var PhoneExpectSchema = PendingSchema.pick({ kind: true, text: true }).extend({ key: z26.string().min(1).max(64) });
2078
2078
  var CardRowsSchema = z26.array(z26.number().int().min(0).max(MAX_PROPOSALS - 1)).min(1).max(MAX_PROPOSALS).refine((r) => new Set(r).size === r.length, "a row twice");
2079
2079
  var teamsOp = { op: OperationIdSchema, assertion: AssertionSchema.optional() };
2080
+ var PcActionSchema = z26.enum(["update", "restart"]);
2081
+ var pcSubject = (action, version) => action === "update" ? `update@${version ?? ""}` : "restart";
2080
2082
  var teamsScope = { scope: DefinitionScopeSchema, project: z26.string().min(1).max(80).optional() };
2081
2083
  var PhoneClientMessageSchema = z26.discriminatedUnion("type", [
2082
2084
  z26.object({ type: z26.literal("snapshot.request") }),
@@ -2094,7 +2096,10 @@ var PhoneClientMessageSchema = z26.discriminatedUnion("type", [
2094
2096
  expect: PhoneExpectSchema.optional(),
2095
2097
  qid: OperationIdSchema.optional(),
2096
2098
  /** sha256 of the `define` or `team` operation the challenge is for (`teamsDigest`). */
2097
- digest: TeamsDigestSchema.optional()
2099
+ digest: TeamsDigestSchema.optional(),
2100
+ /** A `pc` challenge: what it is for, and for an update the version it covers. */
2101
+ action: PcActionSchema.optional(),
2102
+ version: z26.string().regex(SEMVER).optional()
2098
2103
  }),
2099
2104
  z26.object({ type: z26.literal("credential.register"), op: OperationIdSchema, credential: CredentialSchema }),
2100
2105
  z26.object({
@@ -2181,13 +2186,25 @@ var PhoneClientMessageSchema = z26.discriminatedUnion("type", [
2181
2186
  z26.object({ type: z26.literal("team.launch"), ...teamsOp, project: z26.string().min(1).max(80), name: TeamNameSchema, seats: PhoneSeatsSchema, template: z26.string().min(1).max(64).optional() }).strict(),
2182
2187
  z26.object({ type: z26.literal("team.compose"), ...teamsOp, team: TeamIdSchema, seats: PhoneSeatsSchema }).strict(),
2183
2188
  z26.object({ type: z26.literal("team.seat"), ...teamsOp, team: TeamIdSchema, role: RoleIdSchema, action: z26.enum(["start", "restart"]) }).strict(),
2184
- z26.object({ type: z26.literal("team.dissolve"), ...teamsOp, team: TeamIdSchema }).strict()
2189
+ z26.object({ type: z26.literal("team.dissolve"), ...teamsOp, team: TeamIdSchema }).strict(),
2190
+ /** Installs `version` on the PC, then restarts its daemon; the phone asks for its own build's version. Passkey, purpose `pc`. */
2191
+ z26.object({ type: z26.literal("daemon.update"), ...teamsOp, version: z26.string().regex(SEMVER) }).strict(),
2192
+ /** Restarts the PC's daemon without installing anything. Passkey, purpose `pc`. */
2193
+ z26.object({ type: z26.literal("daemon.restart"), ...teamsOp }).strict()
2185
2194
  ]).superRefine((m, ctx) => {
2186
2195
  const issue = "scope" in m ? scopeIssue(m) : null;
2187
2196
  if (issue) ctx.addIssue({ code: z26.ZodIssueCode.custom, message: issue, path: ["project"] });
2188
2197
  });
2189
2198
  var PhoneServerMessageSchema = z26.discriminatedUnion("type", [
2190
- z26.object({ type: z26.literal("snapshot"), protocol: z26.literal(PHONE_PROTOCOL), sessions: z26.array(PhoneSessionSchema), capabilities: CapabilitiesByToolSchema, daemon: z26.object({ version: z26.string(), name: z26.string().max(40), boot: z26.string().uuid().optional() }), 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() }),
2199
+ z26.object({ type: z26.literal("snapshot"), protocol: z26.literal(PHONE_PROTOCOL), sessions: z26.array(PhoneSessionSchema), capabilities: CapabilitiesByToolSchema, daemon: z26.object({
2200
+ version: z26.string(),
2201
+ name: z26.string().max(40),
2202
+ boot: z26.string().uuid().optional(),
2203
+ teams: z26.literal(true).optional(),
2204
+ /** `update`: the daemon can install a version and restart (npm, systemd); `restart`: it can restart (systemd). */
2205
+ update: z26.literal(true).optional(),
2206
+ restart: z26.literal(true).optional()
2207
+ }), 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() }),
2191
2208
  z26.object({
2192
2209
  type: z26.literal("confirm.challenge"),
2193
2210
  purpose: ConfirmPurposeSchema,
@@ -2214,6 +2231,10 @@ var PhoneServerMessageSchema = z26.discriminatedUnion("type", [
2214
2231
  z26.object({ type: z26.literal("chat.done"), qid: OperationIdSchema, turn: PhoneChatTurnSchema }),
2215
2232
  z26.object({ type: z26.literal("chat.error"), qid: OperationIdSchema, code: ChatErrorCodeSchema }),
2216
2233
  z26.object({ type: z26.literal("teams.catalog"), catalog: PhoneCatalogSchema }),
2234
+ /** The daemon updating or restarting itself, whoever asked: npm runs, then the service restarts (the link drops right after). */
2235
+ z26.object({ type: z26.literal("daemon.progress"), version: z26.string().max(40), step: z26.enum(["installing", "restarting"]) }),
2236
+ /** Nothing was changed. Never npm's output nor a command: both hold the PC's paths. */
2237
+ z26.object({ type: z26.literal("daemon.failed"), version: z26.string().max(40), reason: UpdateFailureSchema }),
2217
2238
  z26.object({ type: z26.literal("teams.role"), role: PhoneRoleSchema }),
2218
2239
  /** The live teams, after each snapshot and on every change. */
2219
2240
  z26.object({ type: z26.literal("teams"), teams: z26.array(PhoneTeamSchema).max(50) }),
@@ -2429,6 +2450,7 @@ export {
2429
2450
  PROTOCOL_PORT,
2430
2451
  RefusalCodeSchema,
2431
2452
  RecentSchema,
2453
+ SEMVER,
2432
2454
  MESSAGE_MAX,
2433
2455
  SUMMARY_MAX,
2434
2456
  parseClientMessage,
@@ -2463,6 +2485,7 @@ export {
2463
2485
  OperationIdSchema,
2464
2486
  UNTYPABLE,
2465
2487
  CHAT_HISTORY_BUDGET,
2488
+ pcSubject,
2466
2489
  PhoneClientMessageSchema,
2467
2490
  teamsPurpose,
2468
2491
  teamsDigest,
@@ -4,7 +4,7 @@ import {
4
4
  SUMMARY_MAX,
5
5
  parseServerMessage,
6
6
  readDaemonToken
7
- } from "./chunk-QRD74KPO.js";
7
+ } from "./chunk-37G5F75H.js";
8
8
 
9
9
  // src/client.ts
10
10
  import WebSocket from "ws";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ledgeTitleRest
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  cleanTopic,
6
6
  isArchived,
7
7
  sessionTitle
8
- } from "./chunk-QRD74KPO.js";
8
+ } from "./chunk-37G5F75H.js";
9
9
 
10
10
  // src/daemon/seat.ts
11
11
  function teammates(team, sessions) {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  connect
3
- } from "./chunk-NYGLT5G2.js";
3
+ } from "./chunk-7GIUG73R.js";
4
4
  import {
5
5
  isArchived
6
- } from "./chunk-QRD74KPO.js";
6
+ } from "./chunk-37G5F75H.js";
7
7
 
8
8
  // src/cli/who.ts
9
9
  import { basename } from "path";
@@ -3,7 +3,7 @@ import {
3
3
  SESSION_KEY_VAR,
4
4
  pickName,
5
5
  sessionKey
6
- } from "./chunk-QRD74KPO.js";
6
+ } from "./chunk-37G5F75H.js";
7
7
  import {
8
8
  paths
9
9
  } from "./chunk-HOOHS3MX.js";
@@ -10,7 +10,7 @@ import {
10
10
  templateExists,
11
11
  templateId,
12
12
  templateText
13
- } from "./chunk-HCTXTN2X.js";
13
+ } from "./chunk-YLN3VOGV.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-TYNRKZFE.js";
42
+ } from "./chunk-7JRQCKBP.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-II6VRGLU.js";
50
+ } from "./chunk-UPKJO3BZ.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-PTY4LXTG.js";
60
+ } from "./chunk-ADAGKOFO.js";
61
61
  import {
62
62
  ACTIONS,
63
63
  ATTACHMENT_ID,
@@ -95,6 +95,7 @@ import {
95
95
  RefusalCodeSchema,
96
96
  RoleIdSchema,
97
97
  RouteResultSchema,
98
+ SEMVER,
98
99
  SESSION_KEY_VAR,
99
100
  SNAPSHOT_BODY_MAX,
100
101
  SshAliasSchema,
@@ -131,6 +132,7 @@ import {
131
132
  parseServerMessage,
132
133
  parseTaskBlock,
133
134
  parseTeamBlock,
135
+ pcSubject,
134
136
  pendingKey,
135
137
  pickName,
136
138
  projectOf,
@@ -145,7 +147,7 @@ import {
145
147
  teamsPurpose,
146
148
  tokenEquals,
147
149
  transmissions
148
- } from "./chunk-QRD74KPO.js";
150
+ } from "./chunk-37G5F75H.js";
149
151
  import {
150
152
  log
151
153
  } from "./chunk-6IYPRUQG.js";
@@ -2276,12 +2278,12 @@ var RpcError = class extends Error {
2276
2278
  };
2277
2279
  function lineReader(max, onLine, onBad) {
2278
2280
  const decoder = new TextDecoder("utf-8", { fatal: true });
2279
- let parts = [];
2281
+ let parts2 = [];
2280
2282
  let size = 0;
2281
2283
  let skipping = false;
2282
2284
  const flush = () => {
2283
- const whole = parts.length === 1 ? parts[0] : Buffer.concat(parts);
2284
- parts = [];
2285
+ const whole = parts2.length === 1 ? parts2[0] : Buffer.concat(parts2);
2286
+ parts2 = [];
2285
2287
  size = 0;
2286
2288
  let text;
2287
2289
  try {
@@ -2301,10 +2303,10 @@ function lineReader(max, onLine, onBad) {
2301
2303
  size += end - from;
2302
2304
  if (size > max) {
2303
2305
  skipping = true;
2304
- parts = [];
2306
+ parts2 = [];
2305
2307
  size = 0;
2306
2308
  onBad(`frame over ${max} bytes`);
2307
- } else if (end > from) parts.push(chunk.subarray(from, end));
2309
+ } else if (end > from) parts2.push(chunk.subarray(from, end));
2308
2310
  }
2309
2311
  if (nl === -1) return;
2310
2312
  if (skipping) skipping = false;
@@ -3959,9 +3961,9 @@ function createForge(deps = {}) {
3959
3961
  index.push(`- ${name}: no repository on this machine`);
3960
3962
  return;
3961
3963
  }
3962
- const parts = await Promise.all(local.map((r) => section(r.path)));
3963
- await writeFile5(join9(ctx.dir, file), parts.flatMap((s) => s.lines).join("\n"));
3964
- const sources = parts.flatMap((s) => s.source ? [s.source] : []);
3964
+ const parts2 = await Promise.all(local.map((r) => section(r.path)));
3965
+ await writeFile5(join9(ctx.dir, file), parts2.flatMap((s) => s.lines).join("\n"));
3966
+ const sources = parts2.flatMap((s) => s.source ? [s.source] : []);
3965
3967
  ctx.steps.set(file, { kind: "repo", name, path: sources.join(", ") || file });
3966
3968
  index.push(`- ${name}: ${file}`);
3967
3969
  }));
@@ -5061,18 +5063,18 @@ async function readAt(request, path) {
5061
5063
  if (!stat4.isFile()) return failure(request, "not_file");
5062
5064
  if (stat4.size > DOCUMENT_MAX_BYTES) return failure(request, "too_large");
5063
5065
  const chunk = Buffer.allocUnsafe(64 * 1024);
5064
- const parts = [];
5066
+ const parts2 = [];
5065
5067
  let bytes4 = 0;
5066
5068
  while (bytes4 <= DOCUMENT_MAX_BYTES) {
5067
5069
  const { bytesRead } = await file.read(chunk, 0, Math.min(chunk.length, DOCUMENT_MAX_BYTES + 1 - bytes4), null);
5068
5070
  if (!bytesRead) break;
5069
- parts.push(Buffer.from(chunk.subarray(0, bytesRead)));
5071
+ parts2.push(Buffer.from(chunk.subarray(0, bytesRead)));
5070
5072
  bytes4 += bytesRead;
5071
5073
  }
5072
5074
  if (bytes4 > DOCUMENT_MAX_BYTES) return failure(request, "too_large");
5073
5075
  let text;
5074
5076
  try {
5075
- text = new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(parts, bytes4));
5077
+ text = new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(parts2, bytes4));
5076
5078
  } catch {
5077
5079
  return failure(request, "invalid_utf8");
5078
5080
  }
@@ -5674,6 +5676,18 @@ function serveSsh(ws, alias, opts = {}) {
5674
5676
  // src/mobile/gateway.ts
5675
5677
  import { hostname } from "os";
5676
5678
 
5679
+ // ../ui/src/semver.ts
5680
+ var parts = (v) => v.split("-")[0].split(".").map((n) => Number.parseInt(n, 10) || 0);
5681
+ function compareVersions(a, b2) {
5682
+ const x = parts(a);
5683
+ const y = parts(b2);
5684
+ for (let i = 0; i < 3; i++) {
5685
+ const d = (x[i] ?? 0) - (y[i] ?? 0);
5686
+ if (d) return d > 0 ? 1 : -1;
5687
+ }
5688
+ return a === b2 ? 0 : a.includes("-") ? -1 : b2.includes("-") ? 1 : 0;
5689
+ }
5690
+
5677
5691
  // src/mobile/chat.ts
5678
5692
  var HISTORY_TURNS = 50;
5679
5693
  function errorCode2(message) {
@@ -6755,7 +6769,7 @@ function createPhoneGateway(deps) {
6755
6769
  protocol: PHONE_PROTOCOL,
6756
6770
  sessions: deps.sessions().filter((s) => !isArchived(s)).map((s) => projected(deviceId, s)),
6757
6771
  capabilities: capabilities(),
6758
- daemon: { version: deps.version, boot: deps.boot, name: clip(hostname(), 40).text },
6772
+ 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 } : {} },
6759
6773
  device: { confirm: deps.credential(deviceId) !== null, push: push2, ...deps.chats ? { chat: true } : {}, ...deps.contextNear ? { contextNear: deps.contextNear() } : {} }
6760
6774
  };
6761
6775
  };
@@ -7019,7 +7033,23 @@ function createPhoneGateway(deps) {
7019
7033
  push: (deviceId, m) => push(deviceId, m),
7020
7034
  log: log2
7021
7035
  }) : void 0;
7036
+ const pcOperation = (deviceId, msg) => {
7037
+ const pc = deps.pc;
7038
+ const update = msg.type === "daemon.update";
7039
+ if (!pc || !(update ? pc.canUpdate : pc.canRestart)) return { status: "rejected", reason: "unavailable" };
7040
+ if (update && (!SEMVER.test(deps.version) || compareVersions(msg.version, deps.version) <= 0)) return { status: "rejected", reason: "invalid" };
7041
+ const refused = checkAssertion(deviceId, msg.assertion, "pc", update ? pcSubject("update", msg.version) : pcSubject("restart"));
7042
+ if (refused) return refused;
7043
+ const reply = (m) => {
7044
+ if (m.type === "update.failed") push(deviceId, { type: "daemon.failed", version: m.version, reason: m.reason });
7045
+ };
7046
+ log2(`phone: device ${deviceId} asked the daemon to ${update ? `update to ${msg.version}` : "restart"}`);
7047
+ if (update) pc.update(msg.version, reply);
7048
+ else pc.restart(reply);
7049
+ return { status: "applied" };
7050
+ };
7022
7051
  const run2 = async (deviceId, msg) => {
7052
+ if (msg.type === "daemon.update" || msg.type === "daemon.restart") return pcOperation(deviceId, msg);
7023
7053
  if (isTeamsOperation(msg)) return teamsOps ? teamsOps.run(deviceId, msg) : { status: "rejected", reason: "unavailable" };
7024
7054
  if (msg.type === "chat.ignore") return chatIgnore(deviceId, msg);
7025
7055
  if (msg.type === "chat.team") return chatTeam(deviceId, msg);
@@ -7223,6 +7253,15 @@ function createPhoneGateway(deps) {
7223
7253
  const challenge = deps.challenges.issue({ deviceId, purpose: msg.purpose, subject: msg.digest });
7224
7254
  return push(deviceId, { type: "confirm.challenge", purpose: msg.purpose, challenge, rpId: rp.rpId, credentialId: cred.id, expiresInMs: CHALLENGE_TTL_MS, digest: msg.digest });
7225
7255
  }
7256
+ if (msg.purpose === "pc") {
7257
+ const pc = deps.pc;
7258
+ if (!pc || !msg.action || msg.action === "update" !== (msg.version !== void 0)) return invalid2();
7259
+ if (!(msg.action === "update" ? pc.canUpdate : pc.canRestart)) return invalid2();
7260
+ const cred = deps.credential(deviceId);
7261
+ if (!cred || cred.rpId !== rp.rpId) return invalid2();
7262
+ const challenge = deps.challenges.issue({ deviceId, purpose: "pc", subject: pcSubject(msg.action, msg.version) });
7263
+ return push(deviceId, { type: "confirm.challenge", purpose: "pc", challenge, rpId: rp.rpId, credentialId: cred.id, expiresInMs: CHALLENGE_TTL_MS });
7264
+ }
7226
7265
  const unhandled = msg.purpose;
7227
7266
  void unhandled;
7228
7267
  return invalid2();
@@ -7324,6 +7363,13 @@ function createPhoneGateway(deps) {
7324
7363
  }
7325
7364
  return;
7326
7365
  }
7366
+ // The daemon updating or restarting itself, whoever asked. Never npm's output nor a command: both hold the PC's paths.
7367
+ case "update.progress":
7368
+ for (const [deviceId, f] of followers) if (f.subscribed) push(deviceId, { type: "daemon.progress", version: m.version, step: m.step });
7369
+ return;
7370
+ case "update.failed":
7371
+ for (const [deviceId, f] of followers) if (f.subscribed) push(deviceId, { type: "daemon.failed", version: m.version, reason: m.reason });
7372
+ return;
7327
7373
  case "session.preview":
7328
7374
  for (const [deviceId, f] of followers) {
7329
7375
  if (f.watching === m.id) push(deviceId, { type: "session.preview", id: m.id, lines: [...m.lines] }, `session.preview:${m.id}`);
@@ -9060,7 +9106,20 @@ ${now2.prompt}` });
9060
9106
  projectName: (id) => id ? projects.projects.find((p) => p.id === id)?.name ?? null : null,
9061
9107
  // A project's folder is its first local repo: only a project with one can be named by the phone.
9062
9108
  projectByName: (name) => projects.projects.find((p) => p.name === name && p.repos.some((r) => r.machine === "local"))?.id ?? null,
9063
- teamCatalog: true
9109
+ teamCatalog: true,
9110
+ // The phone's « Mettre à jour le PC » and « Redémarrer le daemon »: the updater Desktop's `update.daemon` uses, progress broadcast.
9111
+ ...opts.updater && opts.daemon ? {
9112
+ pc: {
9113
+ canUpdate: opts.daemon.install === "npm" && opts.daemon.systemd,
9114
+ canRestart: opts.daemon.systemd,
9115
+ update: (version, reply) => {
9116
+ void opts.updater.update(version, broadcast, reply);
9117
+ },
9118
+ restart: (reply) => {
9119
+ void opts.updater.restart(broadcast, reply);
9120
+ }
9121
+ }
9122
+ } : {}
9064
9123
  });
9065
9124
  let unsubscribePush;
9066
9125
  if (mobile) {
@@ -0,0 +1,6 @@
1
+ // src/version.ts
2
+ var LEDGE_VERSION = true ? "0.27.0" : "0.0.0-dev";
3
+
4
+ export {
5
+ LEDGE_VERSION
6
+ };
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-NYGLT5G2.js";
6
+ } from "./chunk-7GIUG73R.js";
7
7
  import {
8
8
  SESSION_KEY_VAR,
9
9
  actionById
10
- } from "./chunk-QRD74KPO.js";
10
+ } from "./chunk-37G5F75H.js";
11
11
 
12
12
  // src/cli/action.ts
13
13
  import { randomUUID } from "crypto";
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  EFFORT_ARGS,
3
3
  MODEL_ARGS
4
- } from "./chunk-2V2OJR2N.js";
4
+ } from "./chunk-CVHX7GUB.js";
5
5
  import {
6
6
  findRole
7
- } from "./chunk-II6VRGLU.js";
7
+ } from "./chunk-UPKJO3BZ.js";
8
8
  import {
9
9
  exitFile,
10
10
  spawnSession
11
- } from "./chunk-PTY4LXTG.js";
11
+ } from "./chunk-ADAGKOFO.js";
12
12
  import {
13
13
  DaemonRefusedError,
14
14
  connect
15
- } from "./chunk-NYGLT5G2.js";
15
+ } from "./chunk-7GIUG73R.js";
16
16
  import {
17
17
  PROTOCOL_PORT,
18
18
  autonomyArgs
19
- } from "./chunk-QRD74KPO.js";
19
+ } from "./chunk-37G5F75H.js";
20
20
  import {
21
21
  realTmux
22
22
  } from "./chunk-NLL2EQJ2.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  connect,
6
6
  sendMessageAndAwaitAck
7
- } from "./chunk-NYGLT5G2.js";
7
+ } from "./chunk-7GIUG73R.js";
8
8
 
9
9
  // src/cli/send.ts
10
10
  import { randomUUID } from "crypto";
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-NYGLT5G2.js";
6
+ } from "./chunk-7GIUG73R.js";
7
7
  import {
8
8
  LEDGE_GIVER,
9
9
  TASK_TEXT_MAX,
10
10
  TASK_TITLE_MAX
11
- } from "./chunk-QRD74KPO.js";
11
+ } from "./chunk-37G5F75H.js";
12
12
 
13
13
  // src/cli/task.ts
14
14
  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-QRD74KPO.js";
5
+ } from "./chunk-37G5F75H.js";
6
6
  import {
7
7
  log
8
8
  } from "./chunk-6IYPRUQG.js";
@@ -6,11 +6,11 @@ import {
6
6
  quoteScalar,
7
7
  readSmall,
8
8
  scalarValue
9
- } from "./chunk-II6VRGLU.js";
9
+ } from "./chunk-UPKJO3BZ.js";
10
10
  import {
11
11
  SeatsSchema,
12
12
  TeamNameSchema
13
- } from "./chunk-QRD74KPO.js";
13
+ } from "./chunk-37G5F75H.js";
14
14
  import {
15
15
  log
16
16
  } from "./chunk-6IYPRUQG.js";
@@ -9,9 +9,9 @@ import {
9
9
  startServer,
10
10
  tasksJournal,
11
11
  teamsJournal
12
- } from "./chunk-2V2OJR2N.js";
12
+ } from "./chunk-CVHX7GUB.js";
13
13
  import "./chunk-OLLQBK6N.js";
14
- import "./chunk-HCTXTN2X.js";
14
+ import "./chunk-YLN3VOGV.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-TYNRKZFE.js";
30
- import "./chunk-II6VRGLU.js";
29
+ } from "./chunk-7JRQCKBP.js";
30
+ import "./chunk-UPKJO3BZ.js";
31
31
  import {
32
32
  agentMessages
33
- } from "./chunk-PTY4LXTG.js";
33
+ } from "./chunk-ADAGKOFO.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-QRD74KPO.js";
47
+ } from "./chunk-37G5F75H.js";
48
48
  import {
49
49
  LEDGE_VERSION
50
- } from "./chunk-3PLC745L.js";
50
+ } from "./chunk-HMTOPOJG.js";
51
51
  import {
52
52
  SERVICE,
53
53
  inDaemonService,
@@ -799,6 +799,16 @@ var npmEnv = (execPath, env) => ({ ...env, PATH: `${dirname3(execPath)}:${env.PA
799
799
  function createDaemonUpdater(deps) {
800
800
  let busy = false;
801
801
  let restarting = false;
802
+ const restartService = async (version, send) => {
803
+ send({ type: "update.progress", version, step: "restarting" });
804
+ await deps.save();
805
+ const code = await deps.restart();
806
+ if (code !== 0) {
807
+ log(`update: systemctl restart failed (${code})`);
808
+ return send({ type: "update.failed", version, reason: "no-systemd", command: RESTART_COMMAND });
809
+ }
810
+ restarting = true;
811
+ };
802
812
  return {
803
813
  running: () => busy,
804
814
  /** `reply` reaches only the asking client: a busy refusal must not fail the flow other overlays are following. */
@@ -820,20 +830,29 @@ function createDaemonUpdater(deps) {
820
830
  ${r.output}`);
821
831
  return send({ type: "update.failed", version, reason: "npm-failed", detail: lastLines(r.output), command: shown });
822
832
  }
823
- send({ type: "update.progress", version, step: "restarting" });
824
- await deps.save();
825
- const code = await deps.restart();
826
- if (code !== 0) {
827
- log(`update: systemctl restart failed (${code})`);
828
- return send({ type: "update.failed", version, reason: "no-systemd", command: RESTART_COMMAND });
829
- }
830
- restarting = true;
833
+ await restartService(version, send);
831
834
  } catch (e) {
832
835
  log(`update: ${e.stack ?? String(e)}`);
833
836
  send({ type: "update.failed", version, reason: "npm-failed", detail: e instanceof Error ? e.message : String(e) });
834
837
  } finally {
835
838
  if (!restarting) busy = false;
836
839
  }
840
+ },
841
+ /** The restart alone, for the phone (spec 2026-10-28 mobile daemon update): the update's guards but npm, then the same restart. */
842
+ async restart(send, reply = send) {
843
+ const version = deps.info().version;
844
+ if (busy) return reply({ type: "update.failed", version, reason: "busy" });
845
+ if (!deps.info().systemd) return send({ type: "update.failed", version, reason: "no-systemd", command: RESTART_COMMAND });
846
+ busy = true;
847
+ try {
848
+ if (await deps.atRisk()) return send({ type: "update.failed", version, reason: "sessions-at-risk" });
849
+ await restartService(version, send);
850
+ } catch (e) {
851
+ log(`restart: ${e.stack ?? String(e)}`);
852
+ send({ type: "update.failed", version, reason: "no-systemd", command: RESTART_COMMAND });
853
+ } finally {
854
+ if (!restarting) busy = false;
855
+ }
837
856
  }
838
857
  };
839
858
  }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  CODEX_HOOK_VAR
3
- } from "./chunk-PTY4LXTG.js";
3
+ } from "./chunk-ADAGKOFO.js";
4
4
  import {
5
5
  connect
6
- } from "./chunk-NYGLT5G2.js";
6
+ } from "./chunk-7GIUG73R.js";
7
7
  import {
8
8
  LEDGE_GIVER,
9
9
  TASK_TEXT_MAX
10
- } from "./chunk-QRD74KPO.js";
10
+ } from "./chunk-37G5F75H.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-L3GYGJRE.js";
7
- import "./chunk-PTY4LXTG.js";
8
- import "./chunk-NYGLT5G2.js";
9
- import "./chunk-QRD74KPO.js";
6
+ } from "./chunk-2N7PSP7C.js";
7
+ import "./chunk-ADAGKOFO.js";
8
+ import "./chunk-7GIUG73R.js";
9
+ import "./chunk-37G5F75H.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-TYNRKZFE.js";
11
+ } from "./chunk-7JRQCKBP.js";
12
12
  import {
13
13
  findRole
14
- } from "./chunk-II6VRGLU.js";
14
+ } from "./chunk-UPKJO3BZ.js";
15
15
  import {
16
16
  parseLedgeCommand,
17
17
  readOnClient,
18
18
  sendOnClient
19
- } from "./chunk-6F6JTPMC.js";
19
+ } from "./chunk-RA3OIXEQ.js";
20
20
  import {
21
21
  taskOnClient
22
- } from "./chunk-5PTC732E.js";
22
+ } from "./chunk-TOSPL5H2.js";
23
23
  import {
24
24
  handoverOnClient
25
- } from "./chunk-L3GYGJRE.js";
25
+ } from "./chunk-2N7PSP7C.js";
26
26
  import {
27
27
  CODEX_ENV_VAR,
28
28
  CODEX_HOOK_VAR,
29
29
  codexPlan
30
- } from "./chunk-PTY4LXTG.js";
30
+ } from "./chunk-ADAGKOFO.js";
31
31
  import {
32
32
  formatWho
33
- } from "./chunk-JHUIHBC7.js";
33
+ } from "./chunk-7OGFH6KJ.js";
34
34
  import {
35
35
  connect,
36
36
  sendMessageAndAwaitAck
37
- } from "./chunk-NYGLT5G2.js";
37
+ } from "./chunk-7GIUG73R.js";
38
38
  import {
39
39
  taskClosed
40
- } from "./chunk-QRD74KPO.js";
40
+ } from "./chunk-37G5F75H.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-ZIJACTCF.js");
28
+ const { runHook } = await import("./hook-TJJEFV54.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-U6NA6PVD.js");
40
+ const { startDaemon } = await import("./daemon-YUPB5NUG.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-SK4VC4AE.js");
48
+ const { LEDGE_VERSION } = await import("./version-YYNMMWKJ.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-EZPFE5CL.js");
69
+ const { printStatus } = await import("./status-RQRS26S2.js");
70
70
  console.log(await printStatus());
71
71
  return 0;
72
72
  }
73
73
  case "who": {
74
- const { printWho } = await import("./who-XXZUCJPD.js");
74
+ const { printWho } = await import("./who-WW6IL4KD.js");
75
75
  console.log(await printWho());
76
76
  return 0;
77
77
  }
78
78
  case "send": {
79
- const { sendMessage } = await import("./send-T5IOOVGX.js");
79
+ const { sendMessage } = await import("./send-RI7JOO5K.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-T5IOOVGX.js");
85
+ const { readMessage } = await import("./send-RI7JOO5K.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-B2QVGHDF.js");
91
+ const { runTask } = await import("./task-U2XHBUKW.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-XOUTZT3S.js");
97
+ const { runDecide } = await import("./decide-HFI2WQXI.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-6CQKUZJV.js");
103
+ const { runHandover } = await import("./handover-GKORMXZ2.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-SCMMRWYI.js");
109
+ const { runClose } = await import("./action-7SJJTIEA.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-V6VPO3CB.js");
115
+ const { runTeam } = await import("./team-NFC4XEIA.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-MM64KSQ2.js");
121
+ const { runTui } = await import("./tui-UWR7SDYF.js");
122
122
  return runTui(rest);
123
123
  }
124
124
  case "bridge": {
125
- const { bridge } = await import("./bridge-QT5X6TWJ.js");
125
+ const { bridge } = await import("./bridge-JK3PMG7T.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-QWPA2P66.js");
132
+ const { launch } = await import("./launch-QKQZZSIM.js");
133
133
  return launch(cmd, rest);
134
134
  }
135
135
  case "attach": {
136
- const { attach } = await import("./attach-EFIN5VU6.js");
136
+ const { attach } = await import("./attach-V7UPHVB2.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-WYVMCF2K.js";
10
- import "./chunk-2V2OJR2N.js";
9
+ } from "./chunk-ISNHG5SJ.js";
10
+ import "./chunk-CVHX7GUB.js";
11
11
  import "./chunk-OLLQBK6N.js";
12
- import "./chunk-HCTXTN2X.js";
13
- import "./chunk-TYNRKZFE.js";
14
- import "./chunk-II6VRGLU.js";
12
+ import "./chunk-YLN3VOGV.js";
13
+ import "./chunk-7JRQCKBP.js";
14
+ import "./chunk-UPKJO3BZ.js";
15
15
  import {
16
16
  agentEnv,
17
17
  exitFile
18
- } from "./chunk-PTY4LXTG.js";
19
- import "./chunk-NYGLT5G2.js";
20
- import "./chunk-QRD74KPO.js";
18
+ } from "./chunk-ADAGKOFO.js";
19
+ import "./chunk-7GIUG73R.js";
20
+ import "./chunk-37G5F75H.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-6F6JTPMC.js";
8
- import "./chunk-PTY4LXTG.js";
9
- import "./chunk-NYGLT5G2.js";
10
- import "./chunk-QRD74KPO.js";
7
+ } from "./chunk-RA3OIXEQ.js";
8
+ import "./chunk-ADAGKOFO.js";
9
+ import "./chunk-7GIUG73R.js";
10
+ import "./chunk-37G5F75H.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-NYGLT5G2.js";
4
- import "./chunk-QRD74KPO.js";
3
+ } from "./chunk-7GIUG73R.js";
4
+ import "./chunk-37G5F75H.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-5PTC732E.js";
8
- import "./chunk-PTY4LXTG.js";
9
- import "./chunk-NYGLT5G2.js";
10
- import "./chunk-QRD74KPO.js";
7
+ } from "./chunk-TOSPL5H2.js";
8
+ import "./chunk-ADAGKOFO.js";
9
+ import "./chunk-7GIUG73R.js";
10
+ import "./chunk-37G5F75H.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-SYXW4YB6.js";
7
+ } from "./chunk-IGAGJVRZ.js";
8
8
  import {
9
9
  listDefinitions
10
- } from "./chunk-HCTXTN2X.js";
11
- import "./chunk-II6VRGLU.js";
12
- import "./chunk-PTY4LXTG.js";
10
+ } from "./chunk-YLN3VOGV.js";
11
+ import "./chunk-UPKJO3BZ.js";
12
+ import "./chunk-ADAGKOFO.js";
13
13
  import {
14
14
  connect
15
- } from "./chunk-NYGLT5G2.js";
15
+ } from "./chunk-7GIUG73R.js";
16
16
  import {
17
17
  RoleIdSchema,
18
18
  SeatsSchema,
19
19
  ToolSchema
20
- } from "./chunk-QRD74KPO.js";
20
+ } from "./chunk-37G5F75H.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-WYVMCF2K.js";
3
+ } from "./chunk-ISNHG5SJ.js";
4
4
  import {
5
5
  imageInfo
6
- } from "./chunk-2V2OJR2N.js";
6
+ } from "./chunk-CVHX7GUB.js";
7
7
  import {
8
8
  MAX_FRAME
9
9
  } from "./chunk-OLLQBK6N.js";
10
- import "./chunk-HCTXTN2X.js";
11
- import "./chunk-TYNRKZFE.js";
12
- import "./chunk-II6VRGLU.js";
13
- import "./chunk-PTY4LXTG.js";
14
- import "./chunk-NYGLT5G2.js";
10
+ import "./chunk-YLN3VOGV.js";
11
+ import "./chunk-7JRQCKBP.js";
12
+ import "./chunk-UPKJO3BZ.js";
13
+ import "./chunk-ADAGKOFO.js";
14
+ import "./chunk-7GIUG73R.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-QRD74KPO.js";
46
+ } from "./chunk-37G5F75H.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-3PLC745L.js";
3
+ } from "./chunk-HMTOPOJG.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-JHUIHBC7.js";
5
- import "./chunk-NYGLT5G2.js";
6
- import "./chunk-QRD74KPO.js";
4
+ } from "./chunk-7OGFH6KJ.js";
5
+ import "./chunk-7GIUG73R.js";
6
+ import "./chunk-37G5F75H.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.26.0",
3
+ "version": "0.27.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.26.0" : "0.0.0-dev";
3
-
4
- export {
5
- LEDGE_VERSION
6
- };