@dendelion/paper-camp 0.38.0 → 0.41.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/chunks/{daemon-state.BeDnhzBY.js → daemon-state.Evil_jr0.js} +93 -104
- package/dist/chunks/daemon-state.Evil_jr0.js.map +1 -0
- package/dist/chunks/needs.CUNwDixH.js +3516 -0
- package/dist/chunks/needs.CUNwDixH.js.map +1 -0
- package/dist/cli/index.js +4556 -4296
- package/dist/cli/index.js.map +1 -1
- package/dist/core/chat-file.d.ts +1 -0
- package/dist/core/chat-file.d.ts.map +1 -1
- package/dist/core/ci/ci-release.d.ts +5 -0
- package/dist/core/ci/ci-release.d.ts.map +1 -1
- package/dist/core/daemon-state/daemon-state.d.ts +3 -11
- package/dist/core/daemon-state/daemon-state.d.ts.map +1 -1
- package/dist/core/decision-text.d.ts +9 -0
- package/dist/core/decision-text.d.ts.map +1 -0
- package/dist/core/decision-text.test.d.ts +2 -0
- package/dist/core/decision-text.test.d.ts.map +1 -0
- package/dist/core/desk-discovery/evidence.d.ts +1 -0
- package/dist/core/desk-discovery/evidence.d.ts.map +1 -1
- package/dist/core/doctor/checks/structural.d.ts.map +1 -1
- package/dist/core/doctor/checks/tooling.d.ts.map +1 -1
- package/dist/core/doctor/doctor.d.ts +2 -0
- package/dist/core/doctor/doctor.d.ts.map +1 -1
- package/dist/core/doctor/fix.d.ts +1 -1
- package/dist/core/doctor/fix.d.ts.map +1 -1
- package/dist/core/doctor/rules.d.ts +15 -0
- package/dist/core/doctor/rules.d.ts.map +1 -1
- package/dist/core/entity-view.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +192 -178
- package/dist/core/needs-status.d.ts +4 -0
- package/dist/core/needs-status.d.ts.map +1 -0
- package/dist/core/needs.d.ts +32 -0
- package/dist/core/needs.d.ts.map +1 -0
- package/dist/core/needs.test.d.ts +2 -0
- package/dist/core/needs.test.d.ts.map +1 -0
- package/dist/core/parked-questions.d.ts +0 -1
- package/dist/core/parked-questions.d.ts.map +1 -1
- package/dist/core/parse/parser.d.ts.map +1 -1
- package/dist/core/parse/schemas.d.ts +4 -0
- package/dist/core/parse/schemas.d.ts.map +1 -1
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/run-filters.d.ts +2 -0
- package/dist/core/run-filters.d.ts.map +1 -1
- package/dist/core/run-order.d.ts +5 -1
- package/dist/core/run-order.d.ts.map +1 -1
- package/dist/core/run-rows.d.ts.map +1 -1
- package/dist/core/scaffold/scaffold.d.ts +1 -0
- package/dist/core/scaffold/scaffold.d.ts.map +1 -1
- package/dist/core/scaffold/templates.d.ts +6 -0
- package/dist/core/scaffold/templates.d.ts.map +1 -1
- package/dist/core/sections.d.ts.map +1 -1
- package/dist/core/sections.test.d.ts +2 -0
- package/dist/core/sections.test.d.ts.map +1 -0
- package/dist/core/serialize/entity-file.d.ts +6 -2
- package/dist/core/serialize/entity-file.d.ts.map +1 -1
- package/dist/core/status/status.d.ts.map +1 -1
- package/dist/toolbar/toolbar.js +3323 -3318
- package/dist/toolbar/toolbar.js.map +1 -1
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +16 -15
- package/dist/types/index.js.map +1 -1
- package/dist/vite/index.js +1 -1
- package/package.json +6 -2
- package/dist/chunks/daemon-state.BeDnhzBY.js.map +0 -1
- package/dist/chunks/phase-progress.6zt0NNtr.js +0 -3140
- package/dist/chunks/phase-progress.6zt0NNtr.js.map +0 -1
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { randomBytes as
|
|
2
|
-
import { readFile as p, mkdir as
|
|
3
|
-
import { join as c, dirname as
|
|
4
|
-
import { MACHINE_PROJECTS_PATH as
|
|
5
|
-
import { homedir as
|
|
6
|
-
function
|
|
1
|
+
import { randomBytes as y } from "node:crypto";
|
|
2
|
+
import { readFile as p, mkdir as $, writeFile as j, rename as w, readdir as S, access as N, rm as b } from "node:fs/promises";
|
|
3
|
+
import { join as c, dirname as P, resolve as k, basename as d } from "node:path";
|
|
4
|
+
import { MACHINE_PROJECTS_PATH as v, MACHINE_NIGHT_PATH as D } from "../types/index.js";
|
|
5
|
+
import { homedir as R } from "node:os";
|
|
6
|
+
function m(t, n) {
|
|
7
7
|
return t.toFixed(n).replace(/\.0+$/, "").replace(/(\.\d*?)0+$/, "$1");
|
|
8
8
|
}
|
|
9
|
-
function
|
|
9
|
+
function M(t) {
|
|
10
10
|
const n = Math.round(t / 1e3), e = Math.floor(n / 3600), o = Math.floor(n % 3600 / 60), r = n % 60;
|
|
11
11
|
return e > 0 ? o > 0 ? `${e}h${o}m` : `${e}h` : o > 0 ? r > 0 ? `${o}m${r}s` : `${o}m` : `${r}s`;
|
|
12
12
|
}
|
|
13
|
-
function
|
|
13
|
+
function A(t) {
|
|
14
14
|
const n = t.match(/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/);
|
|
15
15
|
if (!n || !n[1] && !n[2] && !n[3]) return null;
|
|
16
16
|
const e = Number(n[1] ?? 0), o = Number(n[2] ?? 0), r = Number(n[3] ?? 0);
|
|
17
17
|
return (e * 3600 + o * 60 + r) * 1e3;
|
|
18
18
|
}
|
|
19
|
-
function
|
|
20
|
-
return t >= 1e6 ? `${
|
|
19
|
+
function h(t) {
|
|
20
|
+
return t >= 1e6 ? `${m(t / 1e6, 1)}M` : t >= 1e3 ? `${m(t / 1e3, 1)}k` : `${Math.round(t)}`;
|
|
21
21
|
}
|
|
22
|
-
function
|
|
22
|
+
function g(t) {
|
|
23
23
|
const n = t.match(/^([\d.]+)([kM]?)$/);
|
|
24
24
|
if (!n) return 0;
|
|
25
25
|
const e = Number(n[1]);
|
|
26
26
|
return Number.isFinite(e) ? n[2] === "M" ? Math.round(e * 1e6) : n[2] === "k" ? Math.round(e * 1e3) : Math.round(e) : 0;
|
|
27
27
|
}
|
|
28
|
-
function
|
|
28
|
+
function E(t) {
|
|
29
29
|
return t.replace(/^(?:[\w.]+\.)?anthropic\./, "").replace(/^claude-/, "").replace(/-\d{6,8}$/, "");
|
|
30
30
|
}
|
|
31
31
|
function tt(t) {
|
|
32
32
|
const n = [
|
|
33
|
-
|
|
34
|
-
`${
|
|
35
|
-
`${
|
|
33
|
+
M(t.durationMs),
|
|
34
|
+
`${h(t.inputTokens)} in`,
|
|
35
|
+
`${h(t.outputTokens)} out`
|
|
36
36
|
];
|
|
37
37
|
return t.model && n.push(t.model), t.attempts > 1 && n.push(`×${t.attempts}`), t.sessionId && n.push(`sess:${t.sessionId}`), n.join(" · ");
|
|
38
38
|
}
|
|
39
39
|
function nt(t) {
|
|
40
40
|
const n = t.split("·").map((r) => r.trim()).filter(Boolean);
|
|
41
41
|
if (n.length === 0) return;
|
|
42
|
-
const e =
|
|
42
|
+
const e = A(n[0]);
|
|
43
43
|
if (e === null) return;
|
|
44
44
|
const o = {
|
|
45
45
|
durationMs: e,
|
|
@@ -49,7 +49,7 @@ function nt(t) {
|
|
|
49
49
|
};
|
|
50
50
|
for (const r of n.slice(1)) {
|
|
51
51
|
const s = r.match(/^(.+)\s+in$/), u = r.match(/^(.+)\s+out$/), i = r.match(/^×(\d+)$/), a = r.match(/^sess:(.+)$/);
|
|
52
|
-
s ? o.inputTokens =
|
|
52
|
+
s ? o.inputTokens = g(s[1]) : u ? o.outputTokens = g(u[1]) : i ? o.attempts = Number(i[1]) : a ? o.sessionId = a[1] : o.model = r;
|
|
53
53
|
}
|
|
54
54
|
return o;
|
|
55
55
|
}
|
|
@@ -58,29 +58,29 @@ function et(t, n, e) {
|
|
|
58
58
|
durationMs: ((t == null ? void 0 : t.durationMs) ?? 0) + n.durationMs,
|
|
59
59
|
inputTokens: ((t == null ? void 0 : t.inputTokens) ?? 0) + n.inputTokens,
|
|
60
60
|
outputTokens: ((t == null ? void 0 : t.outputTokens) ?? 0) + n.outputTokens,
|
|
61
|
-
model: n.model ?
|
|
61
|
+
model: n.model ? E(n.model) : t == null ? void 0 : t.model,
|
|
62
62
|
attempts: ((t == null ? void 0 : t.attempts) ?? 0) + 1,
|
|
63
63
|
sessionId: e ?? (t == null ? void 0 : t.sessionId)
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
const f = { version: 1, projects: [] };
|
|
67
|
-
function
|
|
68
|
-
return process.env.PAPERCAMP_CONFIG_DIR ?? c(
|
|
67
|
+
function l() {
|
|
68
|
+
return process.env.PAPERCAMP_CONFIG_DIR ?? c(R(), ".config", "paper-camp");
|
|
69
69
|
}
|
|
70
70
|
function ot() {
|
|
71
|
-
return c(
|
|
71
|
+
return c(l(), "projects.json");
|
|
72
72
|
}
|
|
73
|
-
function
|
|
73
|
+
function C(t) {
|
|
74
74
|
const n = t;
|
|
75
75
|
return typeof n == "object" && n !== null && typeof n.slug == "string" && typeof n.path == "string" && typeof n.name == "string";
|
|
76
76
|
}
|
|
77
|
-
function
|
|
77
|
+
function I(t) {
|
|
78
78
|
const n = t;
|
|
79
79
|
return typeof n == "object" && n !== null && typeof n.slug == "string" && (n.pausedUntil === void 0 || typeof n.pausedUntil == "number");
|
|
80
80
|
}
|
|
81
81
|
function _(t) {
|
|
82
82
|
const n = t;
|
|
83
|
-
return typeof n == "object" && n !== null && n.version === 1 && Array.isArray(n.projects) && n.projects.every(
|
|
83
|
+
return typeof n == "object" && n !== null && n.version === 1 && Array.isArray(n.projects) && n.projects.every(C) && (n.night === void 0 || I(n.night));
|
|
84
84
|
}
|
|
85
85
|
async function rt(t) {
|
|
86
86
|
let n;
|
|
@@ -97,12 +97,12 @@ async function rt(t) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
async function st(t, n) {
|
|
100
|
-
await
|
|
101
|
-
const e = `${t}.${
|
|
102
|
-
await
|
|
103
|
-
`, "utf-8"), await
|
|
100
|
+
await $(P(t), { recursive: !0 });
|
|
101
|
+
const e = `${t}.${y(6).toString("hex")}.tmp`;
|
|
102
|
+
await j(e, `${JSON.stringify(n, null, 2)}
|
|
103
|
+
`, "utf-8"), await w(e, t);
|
|
104
104
|
}
|
|
105
|
-
function
|
|
105
|
+
function O(t) {
|
|
106
106
|
return t.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "project";
|
|
107
107
|
}
|
|
108
108
|
function x(t, n) {
|
|
@@ -112,9 +112,9 @@ function x(t, n) {
|
|
|
112
112
|
return `${t}-${e}`;
|
|
113
113
|
}
|
|
114
114
|
function at(t, n, e) {
|
|
115
|
-
const o =
|
|
115
|
+
const o = k(n), r = t.projects.find((a) => a.path === o);
|
|
116
116
|
if (r) return { registry: t, entry: r, created: !1 };
|
|
117
|
-
const s = new Set(t.projects.map((a) => a.slug)), i = { slug: x(
|
|
117
|
+
const s = new Set(t.projects.map((a) => a.slug)), i = { slug: x(O(d(o)), s), path: o, name: e ?? d(o) };
|
|
118
118
|
return {
|
|
119
119
|
registry: { ...t, projects: [...t.projects, i] },
|
|
120
120
|
entry: i,
|
|
@@ -138,7 +138,7 @@ function ft(t) {
|
|
|
138
138
|
const { night: n, ...e } = t;
|
|
139
139
|
return e;
|
|
140
140
|
}
|
|
141
|
-
function
|
|
141
|
+
function pt(t, n) {
|
|
142
142
|
if (!t.night) return t;
|
|
143
143
|
if (n === null) {
|
|
144
144
|
const { pausedUntil: e, ...o } = t.night;
|
|
@@ -146,7 +146,7 @@ function lt(t, n) {
|
|
|
146
146
|
}
|
|
147
147
|
return { ...t, night: { ...t.night, pausedUntil: n } };
|
|
148
148
|
}
|
|
149
|
-
async function
|
|
149
|
+
async function lt(t) {
|
|
150
150
|
try {
|
|
151
151
|
return await N(c(t, "papercamp", "config.json")), !1;
|
|
152
152
|
} catch {
|
|
@@ -171,7 +171,7 @@ async function F(t, n) {
|
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
async function dt(t) {
|
|
174
|
-
const n =
|
|
174
|
+
const n = k(t), e = await S(n, { withFileTypes: !0 }), o = [];
|
|
175
175
|
for (const r of e) {
|
|
176
176
|
if (!r.isDirectory()) continue;
|
|
177
177
|
const s = c(n, r.name), u = c(s, "papercamp", "config.json"), { hasConfig: i, name: a } = await F(u, r.name);
|
|
@@ -179,23 +179,16 @@ async function dt(t) {
|
|
|
179
179
|
}
|
|
180
180
|
return o.sort((r, s) => r.name.localeCompare(s.name));
|
|
181
181
|
}
|
|
182
|
-
function mt(
|
|
183
|
-
return
|
|
182
|
+
function mt() {
|
|
183
|
+
return c(l(), "daemon.json");
|
|
184
184
|
}
|
|
185
185
|
function ht() {
|
|
186
|
-
return c(
|
|
187
|
-
}
|
|
188
|
-
function gt() {
|
|
189
|
-
return c(d(), "daemon.log");
|
|
190
|
-
}
|
|
191
|
-
function l(t) {
|
|
192
|
-
return t === void 0 || typeof t == "string";
|
|
186
|
+
return c(l(), "daemon.log");
|
|
193
187
|
}
|
|
194
188
|
function H(t) {
|
|
195
|
-
|
|
196
|
-
return typeof n == "object" && n !== null && typeof n.host == "string" && l(n.network) && l(n.tailnet) && l(n.tunnel);
|
|
189
|
+
return t === void 0 || typeof t == "string";
|
|
197
190
|
}
|
|
198
|
-
function
|
|
191
|
+
function L(t) {
|
|
199
192
|
const n = t;
|
|
200
193
|
if (typeof n != "object" || n === null) return !1;
|
|
201
194
|
switch (n.kind) {
|
|
@@ -209,11 +202,11 @@ function J(t) {
|
|
|
209
202
|
return !1;
|
|
210
203
|
}
|
|
211
204
|
}
|
|
212
|
-
function
|
|
205
|
+
function J(t) {
|
|
213
206
|
const n = t;
|
|
214
|
-
return typeof n == "object" && n !== null && typeof n.pid == "number" && typeof n.port == "number" && typeof n.version == "string" && typeof n.startedAt == "string" && typeof n.share == "boolean" && typeof n.tailnet == "boolean" && (n.updateEvent === void 0 ||
|
|
207
|
+
return typeof n == "object" && n !== null && typeof n.pid == "number" && typeof n.port == "number" && typeof n.version == "string" && typeof n.startedAt == "string" && typeof n.share == "boolean" && typeof n.tailnet == "boolean" && (n.updateEvent === void 0 || L(n.updateEvent)) && (n.updatePendingVersion === void 0 || n.updatePendingVersion === null || typeof n.updatePendingVersion == "string") && H(n.tailnetName);
|
|
215
208
|
}
|
|
216
|
-
async function
|
|
209
|
+
async function U(t) {
|
|
217
210
|
let n;
|
|
218
211
|
try {
|
|
219
212
|
n = await p(t, "utf-8");
|
|
@@ -222,7 +215,7 @@ async function B(t) {
|
|
|
222
215
|
}
|
|
223
216
|
try {
|
|
224
217
|
const e = JSON.parse(n);
|
|
225
|
-
return
|
|
218
|
+
return J(e) ? e : void 0;
|
|
226
219
|
} catch {
|
|
227
220
|
return;
|
|
228
221
|
}
|
|
@@ -234,103 +227,99 @@ function V(t) {
|
|
|
234
227
|
return !1;
|
|
235
228
|
}
|
|
236
229
|
}
|
|
237
|
-
const
|
|
238
|
-
async function
|
|
230
|
+
const T = 2e3;
|
|
231
|
+
async function B(t) {
|
|
239
232
|
try {
|
|
240
|
-
const n = await fetch(`http://localhost:${t}${
|
|
241
|
-
signal: AbortSignal.timeout(
|
|
233
|
+
const n = await fetch(`http://localhost:${t}${v}`, {
|
|
234
|
+
signal: AbortSignal.timeout(T)
|
|
242
235
|
});
|
|
243
236
|
return n.ok ? (await n.json()).projects : null;
|
|
244
237
|
} catch {
|
|
245
238
|
return null;
|
|
246
239
|
}
|
|
247
240
|
}
|
|
248
|
-
async function
|
|
249
|
-
return await
|
|
241
|
+
async function G(t) {
|
|
242
|
+
return await B(t) !== null;
|
|
250
243
|
}
|
|
251
|
-
async function
|
|
244
|
+
async function gt(t) {
|
|
252
245
|
try {
|
|
253
|
-
const n = await fetch(`http://localhost:${t}${
|
|
254
|
-
signal: AbortSignal.timeout(
|
|
246
|
+
const n = await fetch(`http://localhost:${t}${D}`, {
|
|
247
|
+
signal: AbortSignal.timeout(T)
|
|
255
248
|
});
|
|
256
249
|
return n.ok ? await n.json() : null;
|
|
257
250
|
} catch {
|
|
258
251
|
return null;
|
|
259
252
|
}
|
|
260
253
|
}
|
|
261
|
-
async function
|
|
262
|
-
const n = await
|
|
263
|
-
return n !== void 0 && V(n.pid) && await
|
|
254
|
+
async function yt(t) {
|
|
255
|
+
const n = await U(t);
|
|
256
|
+
return n !== void 0 && V(n.pid) && await G(n.port) ? n : (await Y(t), null);
|
|
264
257
|
}
|
|
265
|
-
function
|
|
266
|
-
const n =
|
|
258
|
+
function $t(t) {
|
|
259
|
+
const n = M(Date.now() - Date.parse(t.startedAt)), e = [t.share && "share", t.tailnet && "tailnet"].filter(Boolean).join(", ");
|
|
267
260
|
return `paper-camp: daemon running — pid ${t.pid}, port ${t.port}, v${t.version}, up ${n}${e ? `, ${e}` : ""}`;
|
|
268
261
|
}
|
|
269
|
-
function
|
|
262
|
+
function q(t) {
|
|
270
263
|
const n = new Date(t), e = (o) => String(o).padStart(2, "0");
|
|
271
264
|
return `${e(n.getHours())}:${e(n.getMinutes())}`;
|
|
272
265
|
}
|
|
273
|
-
function
|
|
266
|
+
function jt(t) {
|
|
274
267
|
if (t.updatePendingVersion)
|
|
275
268
|
return `paper-camp: update to ${t.updatePendingVersion} pending, waiting for idle`;
|
|
276
269
|
const n = t.updateEvent;
|
|
277
270
|
if (!n) return "paper-camp: no update check yet";
|
|
278
271
|
switch (n.kind) {
|
|
279
272
|
case "hooked":
|
|
280
|
-
return `paper-camp: hooked ${n.version} at ${
|
|
273
|
+
return `paper-camp: hooked ${n.version} at ${q(n.at)}`;
|
|
281
274
|
case "boot check current":
|
|
282
275
|
return "paper-camp: boot check current";
|
|
283
276
|
case "failed":
|
|
284
277
|
return `paper-camp: ${n.version} installed but did not take effect — run \`paper-camp update\``;
|
|
285
278
|
}
|
|
286
279
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
["Tailnet", t.tailnet],
|
|
292
|
-
["Tunnel", t.tunnel]
|
|
293
|
-
].filter((r) => r[1] !== void 0), o = Math.max(...e.map(([r]) => r.length));
|
|
294
|
-
return e.map(([r, s]) => `${r.padEnd(o)} ${s}`).join(`
|
|
280
|
+
const z = "Run `paper-camp pair` to connect a device.";
|
|
281
|
+
function wt(t) {
|
|
282
|
+
const n = t ? [`Tailnet ${t}`] : [];
|
|
283
|
+
return n.push(z), n.join(`
|
|
295
284
|
`);
|
|
296
285
|
}
|
|
297
|
-
async function
|
|
298
|
-
await
|
|
299
|
-
const e = `${t}.${
|
|
300
|
-
await
|
|
301
|
-
`, "utf-8"), await
|
|
286
|
+
async function Pt(t, n) {
|
|
287
|
+
await $(P(t), { recursive: !0 });
|
|
288
|
+
const e = `${t}.${y(6).toString("hex")}.tmp`;
|
|
289
|
+
await j(e, `${JSON.stringify(n, null, 2)}
|
|
290
|
+
`, "utf-8"), await w(e, t);
|
|
302
291
|
}
|
|
303
292
|
async function Y(t) {
|
|
304
|
-
await
|
|
293
|
+
await b(t, { force: !0 });
|
|
305
294
|
}
|
|
306
295
|
export {
|
|
307
|
-
|
|
308
|
-
|
|
296
|
+
et as A,
|
|
297
|
+
z as P,
|
|
309
298
|
at as a,
|
|
310
|
-
|
|
299
|
+
mt as b,
|
|
311
300
|
ft as c,
|
|
312
|
-
|
|
301
|
+
ht as d,
|
|
313
302
|
ot as e,
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
303
|
+
gt as f,
|
|
304
|
+
B as g,
|
|
305
|
+
$t as h,
|
|
306
|
+
wt as i,
|
|
307
|
+
jt as j,
|
|
319
308
|
V as k,
|
|
320
|
-
|
|
309
|
+
lt as l,
|
|
321
310
|
ct as m,
|
|
322
311
|
rt as n,
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
312
|
+
l as o,
|
|
313
|
+
G as p,
|
|
314
|
+
Y as q,
|
|
315
|
+
yt as r,
|
|
316
|
+
it as s,
|
|
317
|
+
st as t,
|
|
318
|
+
dt as u,
|
|
319
|
+
pt as v,
|
|
320
|
+
ut as w,
|
|
321
|
+
Pt as x,
|
|
322
|
+
nt as y,
|
|
323
|
+
tt as z
|
|
335
324
|
};
|
|
336
|
-
//# sourceMappingURL=daemon-state.
|
|
325
|
+
//# sourceMappingURL=daemon-state.Evil_jr0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-state.Evil_jr0.js","sources":["../../src/core/phase-run.ts","../../src/core/machine-registry/machine-registry.ts","../../src/core/daemon-state/daemon-state.ts"],"sourcesContent":["import type { PhaseRun, RunUsage, TaskLogEntry } from '../types/index';\n\nfunction trimDecimal(value: number, places: number): string {\n return value\n .toFixed(places)\n .replace(/\\.0+$/, '')\n .replace(/(\\.\\d*?)0+$/, '$1');\n}\n\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return minutes > 0 ? `${hours}h${minutes}m` : `${hours}h`;\n if (minutes > 0) return seconds > 0 ? `${minutes}m${seconds}s` : `${minutes}m`;\n return `${seconds}s`;\n}\n\nfunction parseDuration(text: string): number | null {\n const match = text.match(/^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/);\n if (!match || (!match[1] && !match[2] && !match[3])) return null;\n const hours = Number(match[1] ?? 0);\n const minutes = Number(match[2] ?? 0);\n const seconds = Number(match[3] ?? 0);\n return (hours * 3600 + minutes * 60 + seconds) * 1000;\n}\n\nexport function formatTokens(n: number): string {\n if (n >= 1_000_000) return `${trimDecimal(n / 1_000_000, 1)}M`;\n if (n >= 1000) return `${trimDecimal(n / 1000, 1)}k`;\n return `${Math.round(n)}`;\n}\n\nfunction parseTokens(text: string): number {\n const match = text.match(/^([\\d.]+)([kM]?)$/);\n if (!match) return 0;\n const value = Number(match[1]);\n if (!Number.isFinite(value)) return 0;\n if (match[2] === 'M') return Math.round(value * 1_000_000);\n if (match[2] === 'k') return Math.round(value * 1000);\n return Math.round(value);\n}\n\nexport function shortModel(model: string): string {\n return model\n .replace(/^(?:[\\w.]+\\.)?anthropic\\./, '')\n .replace(/^claude-/, '')\n .replace(/-\\d{6,8}$/, '');\n}\n\nexport function formatRunSummary(run: PhaseRun): string {\n const base = `${formatTokens(run.inputTokens + run.outputTokens)} tokens · ${formatDuration(run.durationMs)}${run.attempts > 1 ? ` ×${run.attempts}` : ''}${run.model ? ` · ${run.model}` : ''}`;\n return run.sessionId ? `${base} · session ${run.sessionId.slice(0, 8)}` : base;\n}\n\nexport function formatRunLine(run: PhaseRun): string {\n const parts = [\n formatDuration(run.durationMs),\n `${formatTokens(run.inputTokens)} in`,\n `${formatTokens(run.outputTokens)} out`,\n ];\n if (run.model) parts.push(run.model);\n if (run.attempts > 1) parts.push(`×${run.attempts}`);\n if (run.sessionId) parts.push(`sess:${run.sessionId}`);\n return parts.join(' · ');\n}\n\nexport function parseRunLine(value: string): PhaseRun | undefined {\n const segments = value\n .split('·')\n .map((s) => s.trim())\n .filter(Boolean);\n if (segments.length === 0) return undefined;\n const durationMs = parseDuration(segments[0]);\n if (durationMs === null) return undefined;\n const run: PhaseRun = {\n durationMs,\n inputTokens: 0,\n outputTokens: 0,\n attempts: 1,\n };\n for (const segment of segments.slice(1)) {\n const inMatch = segment.match(/^(.+)\\s+in$/);\n const outMatch = segment.match(/^(.+)\\s+out$/);\n const attemptMatch = segment.match(/^×(\\d+)$/);\n const sessionMatch = segment.match(/^sess:(.+)$/);\n if (inMatch) run.inputTokens = parseTokens(inMatch[1]);\n else if (outMatch) run.outputTokens = parseTokens(outMatch[1]);\n else if (attemptMatch) run.attempts = Number(attemptMatch[1]);\n else if (sessionMatch) run.sessionId = sessionMatch[1];\n else run.model = segment;\n }\n return run;\n}\n\nexport function mergeRun(\n prev: PhaseRun | undefined,\n usage: RunUsage,\n sessionId?: string,\n): PhaseRun {\n return {\n durationMs: (prev?.durationMs ?? 0) + usage.durationMs,\n inputTokens: (prev?.inputTokens ?? 0) + usage.inputTokens,\n outputTokens: (prev?.outputTokens ?? 0) + usage.outputTokens,\n model: usage.model ? shortModel(usage.model) : prev?.model,\n attempts: (prev?.attempts ?? 0) + 1,\n sessionId: sessionId ?? prev?.sessionId,\n };\n}\n\nexport interface UsageRollup {\n runs: number;\n durationMs: number;\n inputTokens: number;\n outputTokens: number;\n cacheCreationTokens: number;\n cacheReadTokens: number;\n}\n\nexport function rollupUsage(taskRuns: TaskLogEntry[], planId?: string): UsageRollup {\n const rollup: UsageRollup = {\n runs: 0,\n durationMs: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n };\n const add = (usage: RunUsage) => {\n rollup.runs += 1;\n rollup.durationMs += usage.durationMs;\n rollup.inputTokens += usage.inputTokens;\n rollup.outputTokens += usage.outputTokens;\n rollup.cacheCreationTokens += usage.cacheCreationTokens;\n rollup.cacheReadTokens += usage.cacheReadTokens;\n };\n for (const entry of taskRuns) {\n if (planId && entry.planId !== planId) continue;\n if (entry.phaseRuns?.length) for (const p of entry.phaseRuns) add(p.usage);\n else if (entry.usage) add(entry.usage);\n }\n return rollup;\n}\n","import { randomBytes } from 'node:crypto';\nimport { access, mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, dirname, join, resolve } from 'node:path';\n\nexport interface MachineProject {\n slug: string;\n path: string;\n name: string;\n}\n\nexport interface NightSelection {\n slug: string;\n pausedUntil?: number;\n}\n\nexport interface MachineRegistry {\n version: 1;\n projects: MachineProject[];\n /** The one project `paper-camp daemon` runs the night shift for (IDEA-241); absent means off. */\n night?: NightSelection;\n}\n\nconst EMPTY_REGISTRY: MachineRegistry = { version: 1, projects: [] };\n\nexport function machineConfigDir(): string {\n return process.env.PAPERCAMP_CONFIG_DIR ?? join(homedir(), '.config', 'paper-camp');\n}\n\nexport function defaultRegistryPath(): string {\n return join(machineConfigDir(), 'projects.json');\n}\n\nfunction isMachineProject(value: unknown): value is MachineProject {\n const v = value as Partial<MachineProject> | null;\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof v.slug === 'string' &&\n typeof v.path === 'string' &&\n typeof v.name === 'string'\n );\n}\n\nfunction isNightSelection(value: unknown): value is NightSelection {\n const v = value as Partial<NightSelection> | null;\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof v.slug === 'string' &&\n (v.pausedUntil === undefined || typeof v.pausedUntil === 'number')\n );\n}\n\nfunction isMachineRegistry(value: unknown): value is MachineRegistry {\n const v = value as Partial<MachineRegistry> | null;\n return (\n typeof v === 'object' &&\n v !== null &&\n v.version === 1 &&\n Array.isArray(v.projects) &&\n v.projects.every(isMachineProject) &&\n (v.night === undefined || isNightSelection(v.night))\n );\n}\n\n/** Resolves the empty registry on a missing or malformed file — same first-boot\n * path a revoked or never-written file takes. */\nexport async function loadRegistry(path: string): Promise<MachineRegistry> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.error('paper-camp: could not read machine registry:', error);\n }\n return EMPTY_REGISTRY;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return isMachineRegistry(parsed) ? parsed : EMPTY_REGISTRY;\n } catch {\n return EMPTY_REGISTRY;\n }\n}\n\n/** Written to a sibling temp path and renamed into place, so a crash mid-write\n * never leaves `loadRegistry` a truncated file to trip over. */\nexport async function saveRegistry(path: string, registry: MachineRegistry): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmpPath = `${path}.${randomBytes(6).toString('hex')}.tmp`;\n await writeFile(tmpPath, `${JSON.stringify(registry, null, 2)}\\n`, 'utf-8');\n await rename(tmpPath, path);\n}\n\nfunction slugify(input: string): string {\n const slug = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'project';\n}\n\nfunction uniqueSlug(base: string, taken: ReadonlySet<string>): string {\n if (!taken.has(base)) return base;\n let suffix = 2;\n while (taken.has(`${base}-${suffix}`)) suffix++;\n return `${base}-${suffix}`;\n}\n\nexport interface AddProjectResult {\n registry: MachineRegistry;\n entry: MachineProject;\n created: boolean;\n}\n\n/** Dedupes by resolved absolute path — re-adding an already-registered project\n * returns its existing entry rather than minting a second slug for it. */\nexport function addProject(\n registry: MachineRegistry,\n projectPath: string,\n name?: string,\n): AddProjectResult {\n const path = resolve(projectPath);\n const existing = registry.projects.find((project) => project.path === path);\n if (existing) return { registry, entry: existing, created: false };\n\n const taken = new Set(registry.projects.map((project) => project.slug));\n const slug = uniqueSlug(slugify(basename(path)), taken);\n const entry: MachineProject = { slug, path, name: name ?? basename(path) };\n return {\n registry: { ...registry, projects: [...registry.projects, entry] },\n entry,\n created: true,\n };\n}\n\nexport interface RemoveProjectResult {\n registry: MachineRegistry;\n removed: boolean;\n}\n\nexport function removeProject(registry: MachineRegistry, slug: string): RemoveProjectResult {\n if (!registry.projects.some((project) => project.slug === slug)) {\n return { registry, removed: false };\n }\n return {\n registry: { ...registry, projects: registry.projects.filter((p) => p.slug !== slug) },\n removed: true,\n };\n}\n\nexport function listProjects(registry: MachineRegistry): MachineProject[] {\n return [...registry.projects].sort((a, b) => a.slug.localeCompare(b.slug));\n}\n\nexport interface SetNightProjectResult {\n registry: MachineRegistry;\n ok: boolean;\n}\n\n/** Fails for a slug not in `projects` — the night shift only ever runs a registered project. */\nexport function setNightProject(registry: MachineRegistry, slug: string): SetNightProjectResult {\n if (!registry.projects.some((project) => project.slug === slug)) {\n return { registry, ok: false };\n }\n return { registry: { ...registry, night: { slug } }, ok: true };\n}\n\nexport function clearNightProject(registry: MachineRegistry): MachineRegistry {\n if (!registry.night) return registry;\n const { night: _night, ...rest } = registry;\n return rest;\n}\n\nexport function setNightPause(\n registry: MachineRegistry,\n pausedUntil: number | null,\n): MachineRegistry {\n if (!registry.night) return registry;\n if (pausedUntil === null) {\n const { pausedUntil: _pausedUntil, ...rest } = registry.night;\n return { ...registry, night: rest };\n }\n return { ...registry, night: { ...registry.night, pausedUntil } };\n}\n\n/** A registered path is missing once its `papercamp/config.json` is gone — the\n * mounter, the machine-projects endpoint, and `ls`/`status` all key off this. */\nexport async function isProjectMissing(path: string): Promise<boolean> {\n try {\n await access(join(path, 'papercamp', 'config.json'));\n return false;\n } catch {\n return true;\n }\n}\n\nexport interface ScanEntry {\n path: string;\n name: string;\n hasConfig: boolean;\n}\n\nasync function inspectProject(\n configPath: string,\n fallbackName: string,\n): Promise<{ hasConfig: boolean; name: string }> {\n let raw: string;\n try {\n raw = await readFile(configPath, 'utf-8');\n } catch {\n return { hasConfig: false, name: fallbackName };\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n const projectName = (parsed as { projectName?: unknown })?.projectName;\n return {\n hasConfig: true,\n name: typeof projectName === 'string' && projectName ? projectName : fallbackName,\n };\n } catch {\n return { hasConfig: true, name: fallbackName };\n }\n}\n\n/** One level deep only — a project's own subdirectories are its concern, not the scan root's. */\nexport async function scanForProjects(dir: string): Promise<ScanEntry[]> {\n const root = resolve(dir);\n const dirents = await readdir(root, { withFileTypes: true });\n const entries: ScanEntry[] = [];\n for (const dirent of dirents) {\n if (!dirent.isDirectory()) continue;\n const projectPath = join(root, dirent.name);\n const configPath = join(projectPath, 'papercamp', 'config.json');\n const { hasConfig, name } = await inspectProject(configPath, dirent.name);\n entries.push({ path: projectPath, name, hasConfig });\n }\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { randomBytes } from 'node:crypto';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport {\n MACHINE_NIGHT_PATH,\n MACHINE_PROJECTS_PATH,\n type MachineNightGateResponse,\n type MachineProjectSummary,\n} from '../../types/index';\nimport { machineConfigDir } from '../machine-registry';\nimport { formatDuration } from '../phase-run';\n\nexport type UpdateEvent =\n | { kind: 'hooked'; version: string; at: string }\n | { kind: 'boot check current' }\n | { kind: 'failed'; version: string; output: string };\n\nexport interface DaemonState {\n pid: number;\n port: number;\n version: string;\n startedAt: string;\n share: boolean;\n tailnet: boolean;\n updateEvent?: UpdateEvent;\n updatePendingVersion?: string | null;\n tailnetName?: string;\n}\n\nexport function daemonStatePath(): string {\n return join(machineConfigDir(), 'daemon.json');\n}\n\nexport function daemonLogPath(): string {\n return join(machineConfigDir(), 'daemon.log');\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === 'string';\n}\n\nfunction isUpdateEvent(value: unknown): value is UpdateEvent {\n const v = value as { kind?: unknown; version?: unknown; at?: unknown; output?: unknown } | null;\n if (typeof v !== 'object' || v === null) return false;\n switch (v.kind) {\n case 'hooked':\n return typeof v.version === 'string' && typeof v.at === 'string';\n case 'boot check current':\n return true;\n case 'failed':\n return typeof v.version === 'string' && typeof v.output === 'string';\n default:\n return false;\n }\n}\n\nfunction isDaemonState(value: unknown): value is DaemonState {\n const v = value as Partial<DaemonState> | null;\n return (\n typeof v === 'object' &&\n v !== null &&\n typeof v.pid === 'number' &&\n typeof v.port === 'number' &&\n typeof v.version === 'string' &&\n typeof v.startedAt === 'string' &&\n typeof v.share === 'boolean' &&\n typeof v.tailnet === 'boolean' &&\n (v.updateEvent === undefined || isUpdateEvent(v.updateEvent)) &&\n (v.updatePendingVersion === undefined ||\n v.updatePendingVersion === null ||\n typeof v.updatePendingVersion === 'string') &&\n isOptionalString(v.tailnetName)\n );\n}\n\n/** Resolves `undefined` on a missing or malformed file — same first-boot and\n * stale-file shape every other config-dir reader resolves to. */\nasync function loadDaemonState(path: string): Promise<DaemonState | undefined> {\n let raw: string;\n try {\n raw = await readFile(path, 'utf-8');\n } catch {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return isDaemonState(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nconst PROBE_TIMEOUT_MS = 2_000;\n\nexport async function fetchMachineProjects(port: number): Promise<MachineProjectSummary[] | null> {\n try {\n const response = await fetch(`http://localhost:${port}${MACHINE_PROJECTS_PATH}`, {\n signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),\n });\n if (!response.ok) return null;\n const body = (await response.json()) as { projects: MachineProjectSummary[] };\n return body.projects;\n } catch {\n return null;\n }\n}\n\n/** A response at all is proof the port is a live daemon, not just a live pid\n * (pids get reused, ports get taken by something else). */\nexport async function probeMachineEndpoint(port: number): Promise<boolean> {\n return (await fetchMachineProjects(port)) !== null;\n}\n\nexport async function fetchMachineNightGate(\n port: number,\n): Promise<MachineNightGateResponse | null> {\n try {\n const response = await fetch(`http://localhost:${port}${MACHINE_NIGHT_PATH}`, {\n signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),\n });\n if (!response.ok) return null;\n return (await response.json()) as MachineNightGateResponse;\n } catch {\n return null;\n }\n}\n\n/** The one truth every lifecycle command reads: a state file, a live pid, and\n * a daemon answering on its port. Anything less is stale, so this prunes the\n * file before reporting not-running. */\nexport async function readRunningDaemonState(path: string): Promise<DaemonState | null> {\n const state = await loadDaemonState(path);\n const alive =\n state !== undefined && isProcessAlive(state.pid) && (await probeMachineEndpoint(state.port));\n if (!alive) {\n await removeDaemonState(path);\n return null;\n }\n return state;\n}\n\nexport function formatDaemonStatusLine(state: DaemonState): string {\n const uptime = formatDuration(Date.now() - Date.parse(state.startedAt));\n const flags = [state.share && 'share', state.tailnet && 'tailnet'].filter(Boolean).join(', ');\n return (\n `paper-camp: daemon running — pid ${state.pid}, port ${state.port}, ` +\n `v${state.version}, up ${uptime}${flags ? `, ${flags}` : ''}`\n );\n}\n\nfunction formatClockTime(iso: string): string {\n const date = new Date(iso);\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(date.getHours())}:${pad(date.getMinutes())}`;\n}\n\nexport function formatUpdateStatusLine(state: DaemonState): string {\n if (state.updatePendingVersion) {\n return `paper-camp: update to ${state.updatePendingVersion} pending, waiting for idle`;\n }\n const event = state.updateEvent;\n if (!event) return 'paper-camp: no update check yet';\n switch (event.kind) {\n case 'hooked':\n return `paper-camp: hooked ${event.version} at ${formatClockTime(event.at)}`;\n case 'boot check current':\n return 'paper-camp: boot check current';\n case 'failed':\n return `paper-camp: ${event.version} installed but did not take effect — run \\`paper-camp update\\``;\n }\n}\n\nexport const PAIR_HINT = 'Run `paper-camp pair` to connect a device.';\n\nexport function formatDaemonTailnetLine(tailnetName: string | undefined): string {\n const lines = tailnetName ? [`Tailnet ${tailnetName}`] : [];\n lines.push(PAIR_HINT);\n return lines.join('\\n');\n}\n\n/** Written to a sibling temp path and renamed into place, so a crash mid-write\n * never leaves a stale-file reader a truncated file to trip over. */\nexport async function writeDaemonState(path: string, state: DaemonState): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmpPath = `${path}.${randomBytes(6).toString('hex')}.tmp`;\n await writeFile(tmpPath, `${JSON.stringify(state, null, 2)}\\n`, 'utf-8');\n await rename(tmpPath, path);\n}\n\nexport async function removeDaemonState(path: string): Promise<void> {\n await rm(path, { force: true });\n}\n"],"names":["trimDecimal","value","places","formatDuration","ms","totalSeconds","hours","minutes","seconds","parseDuration","text","match","formatTokens","n","parseTokens","shortModel","model","formatRunLine","run","parts","parseRunLine","segments","s","durationMs","segment","inMatch","outMatch","attemptMatch","sessionMatch","mergeRun","prev","usage","sessionId","EMPTY_REGISTRY","machineConfigDir","join","homedir","defaultRegistryPath","isMachineProject","v","isNightSelection","isMachineRegistry","loadRegistry","path","raw","readFile","error","parsed","saveRegistry","registry","mkdir","dirname","tmpPath","randomBytes","writeFile","rename","slugify","input","uniqueSlug","base","taken","suffix","addProject","projectPath","name","resolve","existing","project","entry","basename","removeProject","slug","p","listProjects","a","b","setNightProject","clearNightProject","_night","rest","setNightPause","pausedUntil","_pausedUntil","isProjectMissing","access","inspectProject","configPath","fallbackName","projectName","scanForProjects","dir","root","dirents","readdir","entries","dirent","hasConfig","daemonStatePath","daemonLogPath","isOptionalString","isUpdateEvent","isDaemonState","loadDaemonState","isProcessAlive","pid","PROBE_TIMEOUT_MS","fetchMachineProjects","port","response","MACHINE_PROJECTS_PATH","probeMachineEndpoint","fetchMachineNightGate","MACHINE_NIGHT_PATH","readRunningDaemonState","state","removeDaemonState","formatDaemonStatusLine","uptime","flags","formatClockTime","iso","date","pad","formatUpdateStatusLine","event","PAIR_HINT","formatDaemonTailnetLine","tailnetName","lines","writeDaemonState","rm"],"mappings":"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"}
|