@geohar/unbien-cli 0.3.3 → 0.3.5

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.
@@ -0,0 +1,172 @@
1
+ import { requireMachine, connectControlRoom, launchAndWait, waitForRoom, handoffToConnect } from "./machine.js";
2
+ import { pickRaw } from "./picker.js";
3
+ import { Shell } from "./tui.js";
4
+ function relTime(iso) {
5
+ const delta = Date.now() - new Date(iso).getTime();
6
+ const m = Math.round(delta / 60_000);
7
+ if (m < 1)
8
+ return "just now";
9
+ if (m < 60)
10
+ return `${m}m ago`;
11
+ const h = Math.round(m / 60);
12
+ if (h < 24)
13
+ return `${h}h ago`;
14
+ return `${Math.round(h / 24)}d ago`;
15
+ }
16
+ /** Send `sessions_list`, await the correlated result. */
17
+ async function listSessions(client, params, timeoutMs = 10_000) {
18
+ const id = `sl-${Date.now()}`;
19
+ return new Promise((resolve) => {
20
+ let settled = false;
21
+ function onUb(frame) {
22
+ try {
23
+ handle(frame);
24
+ }
25
+ catch (err) {
26
+ // A malformed frame must not crash the verb mid-wait.
27
+ console.error(`frame handling error (ignored): ${String(err).slice(0, 120)}`);
28
+ }
29
+ }
30
+ function handle(frame) {
31
+ if (settled)
32
+ return;
33
+ const type = String(frame.type ?? "");
34
+ if (type === "error") {
35
+ // Daemon gate/launch rejections (unknown_peer, permission_denied…)
36
+ // must reach the user — an empty list would read as "nothing stored".
37
+ settled = true;
38
+ client.off("ub", onUb);
39
+ console.error(`machine rejected the listing: ${String(frame.message ?? frame.code)}`);
40
+ resolve([]);
41
+ return;
42
+ }
43
+ if (type === "sessions_list_result" && frame.in_reply_to === id) {
44
+ settled = true;
45
+ client.off("ub", onUb);
46
+ resolve(Array.isArray(frame.sessions) ? frame.sessions : []);
47
+ }
48
+ }
49
+ // The reply is a ub-FRAMED envelope — SessionClient emits those on
50
+ // "envelope" (raw inner frames land on "control", relay refusals on
51
+ // "relayControl"; both handled above via onError).
52
+ const onEnvelope = (env) => {
53
+ if (env.ub)
54
+ onUb(env.ub);
55
+ };
56
+ client.on("envelope", onEnvelope);
57
+ // Errors arrive on TWO other surfaces, both terminal for this request:
58
+ // - control: the daemon's own error frames (unknown_peer, list_failed…)
59
+ // - relayControl: relay-level refusals (fail-closed content gate)
60
+ const onError = (frame) => {
61
+ if (settled)
62
+ return;
63
+ if (String(frame.type ?? "") === "error") {
64
+ settled = true;
65
+ client.off("ub", onUb);
66
+ client.off("control", onError);
67
+ client.off("relayControl", onError);
68
+ console.error(`machine refused the listing: ${String(frame.code)} — ${String(frame.message ?? "").slice(0, 120)}`);
69
+ resolve([]);
70
+ }
71
+ };
72
+ client.on("control", onError);
73
+ client.on("relayControl", onError);
74
+ client.sendUb("sessions_list", { id, ...params });
75
+ setTimeout(() => {
76
+ if (settled)
77
+ return;
78
+ settled = true;
79
+ client.off("ub", onUb);
80
+ console.error("no reply from the machine (is the launcher daemon installed and the relay up?)");
81
+ resolve([]);
82
+ }, timeoutMs);
83
+ });
84
+ }
85
+ export async function run(argv) {
86
+ const flags = new Map();
87
+ let target = "";
88
+ for (let i = 0; i < argv.length; i++) {
89
+ const a = argv[i];
90
+ if (a === "--dir")
91
+ flags.set("dir", argv[++i] ?? "");
92
+ else if (a === "--filter")
93
+ flags.set("filter", argv[++i] ?? "");
94
+ else if (a === "--name")
95
+ flags.set("name", argv[++i] ?? "");
96
+ else if (a === "--relay")
97
+ flags.set("relay", argv[++i] ?? "");
98
+ else if (a === "--all")
99
+ flags.set("all", "1");
100
+ else if (!a.startsWith("--"))
101
+ target = a;
102
+ }
103
+ const machine = requireMachine(target);
104
+ const label = machine.name ?? machine.epk.slice(0, 12);
105
+ const client = await connectControlRoom(machine, flags.get("relay"));
106
+ // Default GLOBAL: bare `resume-session` must not depend on the daemon's
107
+ // cwd (under launchd that's "/", and scoping to it is meaningless — and
108
+ // was crashing the daemon's lister). --dir opts into directory scope.
109
+ const scope = flags.get("dir") && !flags.get("all") ? "cwd" : "all";
110
+ const cwd = flags.get("dir") || undefined;
111
+ const filter = flags.get("filter") || undefined;
112
+ console.error(`stored sessions on ${label} (${scope === "all" ? "all directories" : cwd ?? "machine cwd"})…`);
113
+ const sessions = await listSessions(client, { scope, cwd, filter });
114
+ if (sessions.length === 0) {
115
+ console.error("no stored sessions matched.");
116
+ Shell.exitAfterDrain(0);
117
+ process.exit(0);
118
+ }
119
+ // Type-to-filter picker, recency order (the daemon sorts). Global scope
120
+ // shows cwd per row — it's the disambiguator there.
121
+ const items = sessions.map((s) => ({
122
+ value: s.path,
123
+ label: `${s.name ?? s.summary.slice(0, 56)} · ${relTime(s.modified)} · ${s.messageCount} msgs`,
124
+ description: scope === "all" ? s.cwd : undefined,
125
+ }));
126
+ // Substring filter over WHAT THE ROWS SHOW (name/summary + cwd) — the
127
+ // SelectList's own setFilter is prefix-on-value (the path), which never
128
+ // matches what a person types.
129
+ const picked = await pickRaw(items, {
130
+ filter: (filter, all) => all.filter((it) => {
131
+ const s = sessions.find((sess) => sess.path === it.value);
132
+ const hay = `${s?.name ?? ""} ${s?.summary ?? ""} ${s?.cwd ?? ""}`.toLowerCase();
133
+ return hay.includes(filter.toLowerCase());
134
+ }),
135
+ });
136
+ if (!picked) {
137
+ console.error("cancelled.");
138
+ Shell.exitAfterDrain(0);
139
+ process.exit(0);
140
+ }
141
+ const chosen = sessions.find((s) => s.path === picked);
142
+ if (!chosen) {
143
+ console.error("picked session vanished — retry.");
144
+ Shell.exitAfterDrain(1);
145
+ process.exit(1);
146
+ }
147
+ const name = flags.get("name") || undefined;
148
+ const outcome = await launchAndWait(client, {
149
+ cwd: chosen.cwd || cwd,
150
+ name,
151
+ resume: chosen.path,
152
+ });
153
+ if (!outcome.ok) {
154
+ console.error(`launch rejected: ${outcome.note}`);
155
+ Shell.exitAfterDrain(1);
156
+ process.exit(1);
157
+ }
158
+ console.error(`launched — waiting for the session to go live…`);
159
+ // pi REUSES the session id on resume (it lives in the session file header),
160
+ // so the resumed room is matchable by sessionId deterministically.
161
+ const room = await waitForRoom(client, (r) => r.sessionId === chosen.id);
162
+ if (!room) {
163
+ console.error(`the session did not come live within 30s — it may still be starting. ` +
164
+ `Attach later with:\n unbien connect ${machine.epk.slice(0, 8)} --session ${chosen.id}`);
165
+ Shell.exitAfterDrain(1);
166
+ process.exit(1);
167
+ }
168
+ console.error(`session is live — attaching…`);
169
+ process.exit(await handoffToConnect(machine, chosen.id));
170
+ }
171
+ await run(process.argv.slice(2));
172
+ //# sourceMappingURL=resume_session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume_session.js","sourceRoot":"","sources":["../src/resume_session.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geohar/unbien-cli",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "unbien — a terminal client for remote Pi coding-agent sessions. Attach over an un-bien relay and render the transcript with pi's own TUI components: markdown, syntax highlighting, native tool cards, and your pi theme.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,7 +41,7 @@
41
41
  "dependencies": {
42
42
  "@earendil-works/pi-coding-agent": ">=0.84.3",
43
43
  "@earendil-works/pi-tui": "^0.84.4",
44
- "@geohar/un-bien": "0.20.3"
44
+ "@geohar/un-bien": "0.20.9"
45
45
  },
46
46
  "files": [
47
47
  "dist",