workday-daemon 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +246 -44
- package/dist/cli.js.map +1 -1
- package/dist/collectors/churn-scanner.d.ts +19 -0
- package/dist/collectors/churn-scanner.js +80 -0
- package/dist/collectors/churn-scanner.js.map +1 -0
- package/dist/collectors/git-client.js +4 -1
- package/dist/collectors/git-client.js.map +1 -1
- package/dist/collectors/git-tracker.js +15 -6
- package/dist/collectors/git-tracker.js.map +1 -1
- package/dist/collectors/snapshot-parser.d.ts +30 -10
- package/dist/collectors/snapshot-parser.js +80 -19
- package/dist/collectors/snapshot-parser.js.map +1 -1
- package/dist/core/activity-evaluator.d.ts +2 -2
- package/dist/core/activity-evaluator.js +19 -10
- package/dist/core/activity-evaluator.js.map +1 -1
- package/dist/core/constants.d.ts +27 -0
- package/dist/core/constants.js +51 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/daily-log.d.ts +28 -2
- package/dist/core/daily-log.js +114 -5
- package/dist/core/daily-log.js.map +1 -1
- package/dist/core/session-tracker.d.ts +26 -1
- package/dist/core/session-tracker.js +32 -2
- package/dist/core/session-tracker.js.map +1 -1
- package/dist/core/types.d.ts +59 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/update-manager.d.ts +42 -0
- package/dist/core/update-manager.js +86 -0
- package/dist/core/update-manager.js.map +1 -0
- package/dist/daemon.d.ts +27 -1
- package/dist/daemon.js +120 -1
- package/dist/daemon.js.map +1 -1
- package/dist/http-server.d.ts +10 -1
- package/dist/http-server.js +123 -2
- package/dist/http-server.js.map +1 -1
- package/dist/push/activity-types.d.ts +10 -0
- package/dist/push/activity-types.js +75 -0
- package/dist/push/activity-types.js.map +1 -0
- package/dist/push/report-builder.js +18 -1
- package/dist/push/report-builder.js.map +1 -1
- package/dist/push/tempo-client.d.ts +13 -0
- package/dist/push/tempo-client.js +17 -14
- package/dist/push/tempo-client.js.map +1 -1
- package/dist/push/tempo-pusher.js +86 -80
- package/dist/push/tempo-pusher.js.map +1 -1
- package/package.json +2 -2
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AA8B5E,2EAA2E;AAE3E,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,qCAAiB,CAAA;IACjB,uCAAmB,CAAA;IACnB,0CAAsB,CAAA;AACxB,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AA0BD,2EAA2E;AAE3E,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,2CAA4B,CAAA;IAC5B,wCAAyB,CAAA;AAC3B,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAQD,4EAA4E;AAE5E,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AACnB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,qDAAyC,CAAA;IACzC,wCAA4B,CAAA;IAC5B,sCAA0B,CAAA;IAC1B,wCAA4B,CAAA;IAC5B,sCAA0B,CAAA;IAC1B,gDAAoC,CAAA;AACtC,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AA8B5E,2EAA2E;AAE3E,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,qCAAiB,CAAA;IACjB,uCAAmB,CAAA;IACnB,0CAAsB,CAAA;AACxB,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AA0BD,2EAA2E;AAE3E,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,2CAA4B,CAAA;IAC5B,wCAAyB,CAAA;AAC3B,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAQD,4EAA4E;AAE5E,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AACnB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,qDAAyC,CAAA;IACzC,wCAA4B,CAAA;IAC5B,sCAA0B,CAAA;IAC1B,wCAA4B,CAAA;IAC5B,sCAA0B,CAAA;IAC1B,gDAAoC,CAAA;AACtC,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;AA6ED,4EAA4E;AAE5E,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,4CAA8B,CAAA;IAC9B,+BAAiB,CAAA;IACjB,mCAAqB,CAAA;AACvB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAyBD,4EAA4E;AAE5E,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;AACnB,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,CAAN,IAAY,OAKX;AALD,WAAY,OAAO;IACjB,8BAAmB,CAAA;IACnB,8BAAmB,CAAA;IACnB,8BAAmB,CAAA;IACnB,gCAAqB,CAAA;AACvB,CAAC,EALW,OAAO,KAAP,OAAO,QAKlB;AA8GD,2EAA2E;AAE3E,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;AACnB,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { UpdateCheckResponse } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Daemon self-update: registry check + pinned global install + on-disk verify.
|
|
4
|
+
*
|
|
5
|
+
* Hard rules learned from the field:
|
|
6
|
+
* - never stop anything before the new version is installed and verified;
|
|
7
|
+
* - install a PINNED version (the one the check returned), not @latest —
|
|
8
|
+
* a release landing mid-flow must not produce a version we never checked;
|
|
9
|
+
* - verification reads package.json from the global install dir: if npm
|
|
10
|
+
* exited 0 but the tree wasn't replaced, we must not restart into the
|
|
11
|
+
* old code believing it's new.
|
|
12
|
+
*
|
|
13
|
+
* The actual restart is owned by the Daemon (quiet-window policy lives there).
|
|
14
|
+
*/
|
|
15
|
+
type ExecRunner = (cmd: string, args: string[], timeoutMs: number) => Promise<void>;
|
|
16
|
+
type FetchLike = typeof fetch;
|
|
17
|
+
export declare class UpdateManager {
|
|
18
|
+
private readonly fetchFn;
|
|
19
|
+
private readonly execRunner;
|
|
20
|
+
private readonly readInstalledVersion;
|
|
21
|
+
constructor(overrides?: {
|
|
22
|
+
fetchFn?: FetchLike;
|
|
23
|
+
execRunner?: ExecRunner;
|
|
24
|
+
readInstalledVersion?: () => string;
|
|
25
|
+
});
|
|
26
|
+
getCurrentVersion(): string;
|
|
27
|
+
/** Ask the npm registry for the latest published version. Throws on network failure. */
|
|
28
|
+
checkForUpdate(): Promise<UpdateCheckResponse>;
|
|
29
|
+
/**
|
|
30
|
+
* Install the pinned version globally and verify it landed on disk.
|
|
31
|
+
* Returns normally only when package.json in the install dir reports
|
|
32
|
+
* exactly `version`. The running process keeps executing old code —
|
|
33
|
+
* the caller decides when to restart.
|
|
34
|
+
*/
|
|
35
|
+
installVersion(version: string): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Strictly-newer semver compare on the numeric triple. Prerelease versions
|
|
39
|
+
* are rejected outright — auto-update must never install a beta.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isNewerVersion(latest: string, current: string): boolean;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getPackageRoot } from './config.js';
|
|
5
|
+
import { NPM_PACKAGE_NAME, NPM_REGISTRY_LATEST_URL, UPDATE_CHECK_TIMEOUT_MS, NPM_INSTALL_TIMEOUT_MS, } from './constants.js';
|
|
6
|
+
export class UpdateManager {
|
|
7
|
+
fetchFn;
|
|
8
|
+
execRunner;
|
|
9
|
+
readInstalledVersion;
|
|
10
|
+
constructor(overrides) {
|
|
11
|
+
this.fetchFn = overrides?.fetchFn ?? fetch;
|
|
12
|
+
this.execRunner = overrides?.execRunner ?? defaultExecRunner;
|
|
13
|
+
this.readInstalledVersion = overrides?.readInstalledVersion ?? readPackageVersion;
|
|
14
|
+
}
|
|
15
|
+
getCurrentVersion() {
|
|
16
|
+
return this.readInstalledVersion();
|
|
17
|
+
}
|
|
18
|
+
/** Ask the npm registry for the latest published version. Throws on network failure. */
|
|
19
|
+
async checkForUpdate() {
|
|
20
|
+
const current = this.readInstalledVersion();
|
|
21
|
+
const res = await this.fetchFn(NPM_REGISTRY_LATEST_URL, {
|
|
22
|
+
signal: AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS),
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
throw new Error(`registry responded ${res.status}`);
|
|
26
|
+
}
|
|
27
|
+
const data = await res.json();
|
|
28
|
+
if (!data.version) {
|
|
29
|
+
throw new Error('registry response has no version');
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
current,
|
|
33
|
+
latest: data.version,
|
|
34
|
+
updateAvailable: isNewerVersion(data.version, current),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Install the pinned version globally and verify it landed on disk.
|
|
39
|
+
* Returns normally only when package.json in the install dir reports
|
|
40
|
+
* exactly `version`. The running process keeps executing old code —
|
|
41
|
+
* the caller decides when to restart.
|
|
42
|
+
*/
|
|
43
|
+
async installVersion(version) {
|
|
44
|
+
await this.execRunner('npm', ['install', '-g', `${NPM_PACKAGE_NAME}@${version}`], NPM_INSTALL_TIMEOUT_MS);
|
|
45
|
+
const onDisk = this.readInstalledVersion();
|
|
46
|
+
if (onDisk !== version) {
|
|
47
|
+
throw new Error(`install verification failed: expected ${version}, found ${onDisk} on disk`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Strictly-newer semver compare on the numeric triple. Prerelease versions
|
|
53
|
+
* are rejected outright — auto-update must never install a beta.
|
|
54
|
+
*/
|
|
55
|
+
export function isNewerVersion(latest, current) {
|
|
56
|
+
if (latest.includes('-'))
|
|
57
|
+
return false;
|
|
58
|
+
const l = latest.split('.').map(Number);
|
|
59
|
+
const c = current.split('.').map(Number);
|
|
60
|
+
for (let i = 0; i < 3; i++) {
|
|
61
|
+
if (l[i] > c[i])
|
|
62
|
+
return true;
|
|
63
|
+
if (l[i] < c[i])
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function readPackageVersion() {
|
|
69
|
+
const pkgPath = join(getPackageRoot(), 'package.json');
|
|
70
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
71
|
+
return pkg.version;
|
|
72
|
+
}
|
|
73
|
+
function defaultExecRunner(cmd, args, timeoutMs) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
// shell: true — npm is npm.cmd on Windows
|
|
76
|
+
execFile(cmd, args, { timeout: timeoutMs, shell: true, windowsHide: true }, (err, _stdout, stderr) => {
|
|
77
|
+
if (err) {
|
|
78
|
+
reject(new Error(`${cmd} ${args.join(' ')} failed: ${err.message}${stderr ? ` — ${stderr.slice(0, 300)}` : ''}`));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
resolve();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=update-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-manager.js","sourceRoot":"","sources":["../../src/core/update-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AppConfig } from './core/types.js';
|
|
1
|
+
import type { AppConfig, UpdateApplyResponse } from './core/types.js';
|
|
2
2
|
export declare class Daemon {
|
|
3
3
|
private config;
|
|
4
4
|
private secrets;
|
|
@@ -9,6 +9,10 @@ export declare class Daemon {
|
|
|
9
9
|
private statusRenderer;
|
|
10
10
|
private pollTimer;
|
|
11
11
|
private dayBoundaryTimer;
|
|
12
|
+
private updateTimer;
|
|
13
|
+
private updateManager;
|
|
14
|
+
private pendingRestartVersion;
|
|
15
|
+
private updateInFlight;
|
|
12
16
|
private currentDate;
|
|
13
17
|
private running;
|
|
14
18
|
private foreground;
|
|
@@ -41,6 +45,28 @@ export declare class Daemon {
|
|
|
41
45
|
*/
|
|
42
46
|
pollTick(): Promise<void>;
|
|
43
47
|
private runTickBody;
|
|
48
|
+
private restarting;
|
|
49
|
+
/** First check ~1h after start, then every UPDATE_CHECK_INTERVAL_HOURS. */
|
|
50
|
+
private scheduleUpdateCheck;
|
|
51
|
+
private runScheduledUpdateCheck;
|
|
52
|
+
/**
|
|
53
|
+
* Quiet-window gate: a pending update restarts the daemon only when no
|
|
54
|
+
* open session is actively worked on (all paused or none open). Re-tested
|
|
55
|
+
* on every day-boundary timer tick, so the restart lands within ~1 min of
|
|
56
|
+
* the workspace going quiet — and the nightly boundary is a guaranteed slot.
|
|
57
|
+
*/
|
|
58
|
+
private maybeRestartIntoUpdate;
|
|
59
|
+
/**
|
|
60
|
+
* Immediate update path for POST /api/update/apply (tray button).
|
|
61
|
+
* Skips the quiet window — the user asked for it explicitly.
|
|
62
|
+
*/
|
|
63
|
+
applyUpdateNow(): Promise<UpdateApplyResponse>;
|
|
64
|
+
/**
|
|
65
|
+
* Graceful swap: full stop (final poll, flush, port released, PID file
|
|
66
|
+
* removed), then respawn this same script path — npm has already replaced
|
|
67
|
+
* its content with the new version — and exit.
|
|
68
|
+
*/
|
|
69
|
+
private selfRestart;
|
|
44
70
|
/** Scan recent daily logs for orphaned sessions (cross-day crash) */
|
|
45
71
|
private recoverOrphanedLogs;
|
|
46
72
|
private checkDayBoundary;
|
package/dist/daemon.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
2
3
|
import { join, resolve, basename } from 'node:path';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
4
5
|
import { loadConfig, loadSecrets, getDataDir, computeWorkingDate, writeConfig } from './core/config.js';
|
|
@@ -6,10 +7,11 @@ import { readDailyLog, writeDailyLog, getOpenPause } from './core/daily-log.js';
|
|
|
6
7
|
import { GitTracker } from './collectors/git-tracker.js';
|
|
7
8
|
import { SessionTracker } from './core/session-tracker.js';
|
|
8
9
|
import { ActivityEvaluator } from './core/activity-evaluator.js';
|
|
10
|
+
import { UpdateManager } from './core/update-manager.js';
|
|
9
11
|
import { HttpServer } from './http-server.js';
|
|
10
12
|
import { StatusRenderer } from './core/status-renderer.js';
|
|
11
13
|
import { ClosedBy } from './core/types.js';
|
|
12
|
-
import { PID_FILE_NAME, CRASH_RECOVERY_LOOKBACK_DAYS } from './core/constants.js';
|
|
14
|
+
import { PID_FILE_NAME, CRASH_RECOVERY_LOOKBACK_DAYS, UPDATE_CHECK_INTERVAL_HOURS, UPDATE_CHECK_JITTER_MINUTES, } from './core/constants.js';
|
|
13
15
|
export class Daemon {
|
|
14
16
|
config;
|
|
15
17
|
secrets;
|
|
@@ -20,6 +22,11 @@ export class Daemon {
|
|
|
20
22
|
statusRenderer = null;
|
|
21
23
|
pollTimer = null;
|
|
22
24
|
dayBoundaryTimer = null;
|
|
25
|
+
updateTimer = null;
|
|
26
|
+
updateManager = new UpdateManager();
|
|
27
|
+
// Version installed on disk and waiting for a quiet window to restart into.
|
|
28
|
+
pendingRestartVersion = null;
|
|
29
|
+
updateInFlight = false;
|
|
23
30
|
currentDate = '';
|
|
24
31
|
running = false;
|
|
25
32
|
foreground = false;
|
|
@@ -65,6 +72,9 @@ export class Daemon {
|
|
|
65
72
|
applyConfigUpdate: (patch) => this.applyConfigUpdate(patch),
|
|
66
73
|
addRepo: (path) => this.addRepo(path),
|
|
67
74
|
removeRepo: (path) => this.removeRepo(path),
|
|
75
|
+
getVersion: () => this.updateManager.getCurrentVersion(),
|
|
76
|
+
checkUpdate: () => this.updateManager.checkForUpdate(),
|
|
77
|
+
applyUpdate: () => this.applyUpdateNow(),
|
|
68
78
|
};
|
|
69
79
|
this.httpServer = new HttpServer(this.config.apiPort, deps);
|
|
70
80
|
await this.httpServer.start();
|
|
@@ -86,6 +96,7 @@ export class Daemon {
|
|
|
86
96
|
this.pollTimer = setInterval(() => void this.pollTick(), pollMs);
|
|
87
97
|
const boundaryMs = this.config.session.dayBoundaryCheckSeconds * 1000;
|
|
88
98
|
this.dayBoundaryTimer = setInterval(() => this.checkDayBoundary(), boundaryMs);
|
|
99
|
+
this.scheduleUpdateCheck(true);
|
|
89
100
|
if (!this.foreground) {
|
|
90
101
|
console.log(`Daemon started (PID ${process.pid})`);
|
|
91
102
|
console.log(` API: http://127.0.0.1:${this.config.apiPort}`);
|
|
@@ -168,6 +179,8 @@ export class Daemon {
|
|
|
168
179
|
clearInterval(this.pollTimer);
|
|
169
180
|
if (this.dayBoundaryTimer)
|
|
170
181
|
clearInterval(this.dayBoundaryTimer);
|
|
182
|
+
if (this.updateTimer)
|
|
183
|
+
clearTimeout(this.updateTimer);
|
|
171
184
|
// Final poll to capture last-moment activity before shutdown
|
|
172
185
|
await this.pollTick();
|
|
173
186
|
this.running = false;
|
|
@@ -231,6 +244,109 @@ export class Daemon {
|
|
|
231
244
|
}
|
|
232
245
|
}
|
|
233
246
|
}
|
|
247
|
+
// ─── Self-update ───────────────────────────────────────────────────────
|
|
248
|
+
//
|
|
249
|
+
// Order is sacred: install new version → verify on disk → only then
|
|
250
|
+
// restart. The daemon never stops itself before the replacement is
|
|
251
|
+
// confirmed; a failed npm install leaves the old version running.
|
|
252
|
+
restarting = false;
|
|
253
|
+
/** First check ~1h after start, then every UPDATE_CHECK_INTERVAL_HOURS. */
|
|
254
|
+
scheduleUpdateCheck(initial) {
|
|
255
|
+
const jitterMs = Math.random() * UPDATE_CHECK_JITTER_MINUTES * 60_000;
|
|
256
|
+
const baseMs = (initial ? 1 : UPDATE_CHECK_INTERVAL_HOURS) * 3_600_000;
|
|
257
|
+
this.updateTimer = setTimeout(() => void this.runScheduledUpdateCheck(), baseMs + jitterMs);
|
|
258
|
+
}
|
|
259
|
+
async runScheduledUpdateCheck() {
|
|
260
|
+
try {
|
|
261
|
+
if (this.pendingRestartVersion === null && !this.updateInFlight) {
|
|
262
|
+
this.updateInFlight = true;
|
|
263
|
+
try {
|
|
264
|
+
const check = await this.updateManager.checkForUpdate();
|
|
265
|
+
if (check.updateAvailable) {
|
|
266
|
+
console.log(`[update] ${check.current} → ${check.latest}: installing...`);
|
|
267
|
+
await this.updateManager.installVersion(check.latest);
|
|
268
|
+
this.pendingRestartVersion = check.latest;
|
|
269
|
+
console.log(`[update] v${check.latest} installed — restart at the next quiet window`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
this.updateInFlight = false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
this.maybeRestartIntoUpdate();
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
console.warn(`[update] check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
if (this.running && !this.restarting)
|
|
283
|
+
this.scheduleUpdateCheck(false);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Quiet-window gate: a pending update restarts the daemon only when no
|
|
288
|
+
* open session is actively worked on (all paused or none open). Re-tested
|
|
289
|
+
* on every day-boundary timer tick, so the restart lands within ~1 min of
|
|
290
|
+
* the workspace going quiet — and the nightly boundary is a guaranteed slot.
|
|
291
|
+
*/
|
|
292
|
+
maybeRestartIntoUpdate() {
|
|
293
|
+
if (this.pendingRestartVersion === null || this.restarting)
|
|
294
|
+
return;
|
|
295
|
+
if (this.sessionTracker.hasActiveWork())
|
|
296
|
+
return;
|
|
297
|
+
void this.selfRestart(this.pendingRestartVersion);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Immediate update path for POST /api/update/apply (tray button).
|
|
301
|
+
* Skips the quiet window — the user asked for it explicitly.
|
|
302
|
+
*/
|
|
303
|
+
async applyUpdateNow() {
|
|
304
|
+
if (this.restarting) {
|
|
305
|
+
return { updating: true, target: this.pendingRestartVersion ?? '', message: 'Restart already in progress' };
|
|
306
|
+
}
|
|
307
|
+
if (this.pendingRestartVersion !== null) {
|
|
308
|
+
const v = this.pendingRestartVersion;
|
|
309
|
+
setTimeout(() => void this.selfRestart(v), 500);
|
|
310
|
+
return { updating: true, target: v, message: `v${v} already installed — daemon restarting` };
|
|
311
|
+
}
|
|
312
|
+
if (this.updateInFlight) {
|
|
313
|
+
return { updating: true, target: '', message: 'Update check already in progress' };
|
|
314
|
+
}
|
|
315
|
+
this.updateInFlight = true;
|
|
316
|
+
try {
|
|
317
|
+
const check = await this.updateManager.checkForUpdate();
|
|
318
|
+
if (!check.updateAvailable) {
|
|
319
|
+
return { updating: false, target: check.current, message: `Already up to date (v${check.current})` };
|
|
320
|
+
}
|
|
321
|
+
await this.updateManager.installVersion(check.latest);
|
|
322
|
+
this.pendingRestartVersion = check.latest;
|
|
323
|
+
// Respond first; restart a beat later so the HTTP response flushes.
|
|
324
|
+
setTimeout(() => void this.selfRestart(check.latest), 500);
|
|
325
|
+
return { updating: true, target: check.latest, message: `Installed v${check.latest} — daemon restarting` };
|
|
326
|
+
}
|
|
327
|
+
finally {
|
|
328
|
+
this.updateInFlight = false;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Graceful swap: full stop (final poll, flush, port released, PID file
|
|
333
|
+
* removed), then respawn this same script path — npm has already replaced
|
|
334
|
+
* its content with the new version — and exit.
|
|
335
|
+
*/
|
|
336
|
+
async selfRestart(targetVersion) {
|
|
337
|
+
if (this.restarting)
|
|
338
|
+
return;
|
|
339
|
+
this.restarting = true;
|
|
340
|
+
console.log(`[update] restarting into v${targetVersion}...`);
|
|
341
|
+
await this.stop();
|
|
342
|
+
const script = fileURLToPath(import.meta.url);
|
|
343
|
+
const child = spawn(process.execPath, [...process.execArgv, script], {
|
|
344
|
+
detached: true,
|
|
345
|
+
stdio: 'ignore',
|
|
346
|
+
});
|
|
347
|
+
child.unref();
|
|
348
|
+
process.exit(0);
|
|
349
|
+
}
|
|
234
350
|
// ─── Crash recovery ────────────────────────────────────────────────────
|
|
235
351
|
/** Scan recent daily logs for orphaned sessions (cross-day crash) */
|
|
236
352
|
recoverOrphanedLogs() {
|
|
@@ -257,6 +373,9 @@ export class Daemon {
|
|
|
257
373
|
}
|
|
258
374
|
// ─── Day boundary ─────────────────────────────────────────────────────
|
|
259
375
|
checkDayBoundary() {
|
|
376
|
+
// Piggyback on the 60s boundary timer: pending updates wait here for a
|
|
377
|
+
// quiet window instead of having their own restart poller.
|
|
378
|
+
this.maybeRestartIntoUpdate();
|
|
260
379
|
const newDate = computeWorkingDate(Date.now(), this.config.schedule.end, this.config.timezone);
|
|
261
380
|
if (newDate === this.currentDate)
|
|
262
381
|
return;
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAElF,MAAM,OAAO,MAAM;IACT,MAAM,CAAa;IACnB,OAAO,CAAW;IAClB,UAAU,CAAc;IACxB,cAAc,CAAkB;IAChC,iBAAiB,CAAqB;IACtC,UAAU,GAAsB,IAAI,CAAC;IACrC,cAAc,GAA0B,IAAI,CAAC;IAC7C,SAAS,GAA0C,IAAI,CAAC;IACxD,gBAAgB,GAA0C,IAAI,CAAC;IAC/D,WAAW,GAAW,EAAE,CAAC;IACzB,OAAO,GAAY,KAAK,CAAC;IACzB,UAAU,GAAY,KAAK,CAAC;IAC5B,SAAS,GAAW,CAAC,CAAC;IACtB,qBAAqB,GAAY,KAAK,CAAC;IAC/C,sEAAsE;IACtE,qDAAqD;IAC7C,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE9C,KAAK,CAAC,KAAK,CAAC,OAAkC;QACnD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;QAE7B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAElC,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClG,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5D,6DAA6D;QAC7D,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,mDAAmD;QACnD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QAChE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAEnE,sEAAsE;QACtE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAChE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B,YAAY,6BAA6B,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACpF,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAErG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,kBAAkB;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAmB;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;YACtC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS;YAClC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW;YACtC,aAAa,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,CAAC,CAAC;YAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC3D,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACrC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5C,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC;gBACvC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe;gBAChD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACtE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,UAAU,CAAC,CAAC;QAE/E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,yEAAyE;IAEzE;;;;OAIG;IACI,iBAAiB,CAAC,KAAyB;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,qBAAqB,CAAC,KAAyB;QACrD,QAAQ;QACR,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,KAAK;gBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAuC,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;QAED,cAAc;QACd,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrF,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC3E,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAuC,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxG,8DAA8D;YAC9D,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/F,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3E,IAAI,CAAC,MAA+B,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/F,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC;QAED,mEAAmE;QACnE,IAAI,KAAK,CAAC,WAAW,EAAE,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAChG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,QAAgB;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACvF,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1E,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAgB;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QACtF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QAC3F,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvF,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,IAAI,CAAC,SAAS;YAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,gBAAgB;YAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEhE,6DAA6D;QAC7D,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0EAA0E;IAE1E;;;OAGG;IACI,QAAQ;QACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAExD,kCAAkC;YAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YAED,qCAAqC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAEhE,6CAA6C;YAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAE3E,8DAA8D;YAC9D,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAE1D,2DAA2D;YAC3D,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC5C,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAChC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAE5B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E,qEAAqE;IAC7D,mBAAmB;QACzB,MAAM,YAAY,GAAG,4BAA4B,CAAC;QAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;YACpD,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAEnI,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG;gBAAE,SAAS;YAEnB,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAExC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,KAAK;oBAAE,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;gBACzC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC1C,CAAC;YAED,aAAa,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,4BAA4B,YAAY,CAAC,MAAM,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED,yEAAyE;IAEjE,gBAAgB;QACtB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/F,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC;QACvD,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAE3B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,YAAY,YAAY,gBAAgB,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,0EAA0E;IAElE,cAAc;QACpB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QAEjC,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,uCAAuC;YACvC,UAAU,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,6DAA6D;QAC7D,IAAI,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,GAAG,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,kCAAkC,MAAM,oBAAoB,CAAC,CAAC;QAC3E,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,OAAO,aAAa,EAAE;gBAC5E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACzC,IAAI,CAAC;YACH,iEAAiE;YACjE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,UAAU,CAAC,OAAO,CAAC;gBAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,0EAA0E;IAElE,wBAAwB;QAC9B,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAE7C,+DAA+D;QAC/D,2DAA2D;QAC3D,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,WAAW,CAAI,CAAe,EAAE,CAAe;IACtD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAE5E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;QAC5C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAErD,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/http-server.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SessionTracker } from './core/session-tracker.js';
|
|
2
|
-
import type { AppConfig } from './core/types.js';
|
|
2
|
+
import type { AppConfig, UpdateCheckResponse, UpdateApplyResponse } from './core/types.js';
|
|
3
3
|
export interface HttpServerDeps {
|
|
4
4
|
readonly sessionTracker: SessionTracker;
|
|
5
5
|
readonly config: AppConfig;
|
|
@@ -25,6 +25,12 @@ export interface HttpServerDeps {
|
|
|
25
25
|
ok: boolean;
|
|
26
26
|
error?: string;
|
|
27
27
|
}>;
|
|
28
|
+
/** Installed daemon version (from package.json on disk). */
|
|
29
|
+
readonly getVersion: () => string;
|
|
30
|
+
/** Ask npm registry whether a newer daemon exists. */
|
|
31
|
+
readonly checkUpdate: () => Promise<UpdateCheckResponse>;
|
|
32
|
+
/** Install latest + graceful self-restart (skips the quiet window). */
|
|
33
|
+
readonly applyUpdate: () => Promise<UpdateApplyResponse>;
|
|
28
34
|
}
|
|
29
35
|
export declare class HttpServer {
|
|
30
36
|
private server;
|
|
@@ -42,6 +48,9 @@ export declare class HttpServer {
|
|
|
42
48
|
private handleResume;
|
|
43
49
|
private handleAdjust;
|
|
44
50
|
private handleSetStart;
|
|
51
|
+
private handleAddManualEntry;
|
|
52
|
+
private handleUpdateManualEntry;
|
|
53
|
+
private handleActivityTypes;
|
|
45
54
|
private handleGetSettings;
|
|
46
55
|
private handlePostSettings;
|
|
47
56
|
private handleAddRepo;
|
package/dist/http-server.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { isAbsolute, join } from 'node:path';
|
|
4
|
-
import { computeEffectiveDuration, computeTotalPauseDuration, computeManualMinutes, computeBudgetMs, computeTotalClaimedMs, getRemainingBudgetMs, computeActiveIntervals, computeDaySummary, resolveUiDayStart, readDailyLog, getOpenPause, listAvailableDates, } from './core/daily-log.js';
|
|
4
|
+
import { computeEffectiveDuration, computeTotalPauseDuration, computeManualMinutes, computeBudgetMs, computeTotalClaimedMs, computeTotalManualEntryMs, getRemainingBudgetMs, computeActiveIntervals, computeDaySummary, resolveUiDayStart, readDailyLog, getOpenPause, findManualEntry, resolveManualEntryTarget, listAvailableDates, } from './core/daily-log.js';
|
|
5
|
+
import { resolveActivityTypes } from './push/activity-types.js';
|
|
5
6
|
import { computeWorkingDate, buildTimestamp, buildPatchedConfig, writeConfig, writeSecrets, loadSecrets, } from './core/config.js';
|
|
6
|
-
import { MAX_BODY_BYTES, API_VERSION } from './core/constants.js';
|
|
7
|
+
import { MAX_BODY_BYTES, API_VERSION, MS_PER_MINUTE, DEFAULT_MANUAL_ACTIVITY } from './core/constants.js';
|
|
7
8
|
import { SensitivityLevel } from './core/types.js';
|
|
8
9
|
export class HttpServer {
|
|
9
10
|
server = null;
|
|
@@ -78,6 +79,17 @@ export class HttpServer {
|
|
|
78
79
|
const body = await this.readBody(req);
|
|
79
80
|
return this.sendJson(res, 200, await this.handleSetStart(body));
|
|
80
81
|
}
|
|
82
|
+
if (method === 'POST' && path === '/api/manual-entry') {
|
|
83
|
+
const body = await this.readBody(req);
|
|
84
|
+
return this.sendJson(res, 200, await this.handleAddManualEntry(body));
|
|
85
|
+
}
|
|
86
|
+
if (method === 'POST' && path === '/api/manual-entry/update') {
|
|
87
|
+
const body = await this.readBody(req);
|
|
88
|
+
return this.sendJson(res, 200, await this.handleUpdateManualEntry(body));
|
|
89
|
+
}
|
|
90
|
+
if (method === 'GET' && path === '/api/activity-types') {
|
|
91
|
+
return this.sendJson(res, 200, await this.handleActivityTypes());
|
|
92
|
+
}
|
|
81
93
|
if (method === 'GET' && path === '/api/day') {
|
|
82
94
|
const date = url.searchParams.get('date');
|
|
83
95
|
return this.sendJson(res, 200, this.handleDay(date));
|
|
@@ -106,6 +118,26 @@ export class HttpServer {
|
|
|
106
118
|
const body = await this.readBody(req);
|
|
107
119
|
return this.sendJson(res, 200, await this.handleRemoveRepo(body));
|
|
108
120
|
}
|
|
121
|
+
if (method === 'GET' && path === '/api/update/check') {
|
|
122
|
+
try {
|
|
123
|
+
const data = await this.deps.checkUpdate();
|
|
124
|
+
return this.sendJson(res, 200, { ok: true, data });
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
128
|
+
return this.sendJson(res, 200, { ok: false, error: `Update check failed: ${message}` });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (method === 'POST' && path === '/api/update/apply') {
|
|
132
|
+
try {
|
|
133
|
+
const data = await this.deps.applyUpdate();
|
|
134
|
+
return this.sendJson(res, 200, { ok: true, data });
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
138
|
+
return this.sendJson(res, 200, { ok: false, error: `Update failed: ${message}` });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
109
141
|
this.sendJson(res, 404, { ok: false, error: 'Not found' });
|
|
110
142
|
}
|
|
111
143
|
catch (err) {
|
|
@@ -123,6 +155,7 @@ export class HttpServer {
|
|
|
123
155
|
data: {
|
|
124
156
|
running: true,
|
|
125
157
|
pid: process.pid,
|
|
158
|
+
version: this.deps.getVersion(),
|
|
126
159
|
date: this.deps.getCurrentDate(),
|
|
127
160
|
uptime: Math.floor((Date.now() - this.deps.getStartedAt()) / 1000),
|
|
128
161
|
openSessions: summaries,
|
|
@@ -148,6 +181,7 @@ export class HttpServer {
|
|
|
148
181
|
dayType: log.dayType,
|
|
149
182
|
status: log.status,
|
|
150
183
|
sessions,
|
|
184
|
+
manualEntries: log.manualEntries ?? [],
|
|
151
185
|
totalEffectiveMs,
|
|
152
186
|
signalCount: log.signals.length,
|
|
153
187
|
budgetMs: computeBudgetMs(log, config),
|
|
@@ -276,6 +310,91 @@ export class HttpServer {
|
|
|
276
310
|
await this.deps.forceTick();
|
|
277
311
|
return response;
|
|
278
312
|
}
|
|
313
|
+
// ─── Manual entries ──────────────────────────────────────────────
|
|
314
|
+
async handleAddManualEntry(body) {
|
|
315
|
+
const task = typeof body.task === 'string' ? body.task : '';
|
|
316
|
+
const minutes = typeof body.minutes === 'number' ? body.minutes : NaN;
|
|
317
|
+
const description = typeof body.description === 'string' ? body.description : '';
|
|
318
|
+
const activity = typeof body.activity === 'string' && body.activity.trim()
|
|
319
|
+
? body.activity
|
|
320
|
+
: DEFAULT_MANUAL_ACTIVITY;
|
|
321
|
+
if (!task)
|
|
322
|
+
return { ok: false, error: 'Missing task' };
|
|
323
|
+
if (!description)
|
|
324
|
+
return { ok: false, error: 'Missing description' };
|
|
325
|
+
const tracker = this.deps.sessionTracker;
|
|
326
|
+
const result = tracker.addManualEntry({ task, minutes, description, activity });
|
|
327
|
+
if (!result.ok || !result.entry) {
|
|
328
|
+
return { ok: false, error: result.error };
|
|
329
|
+
}
|
|
330
|
+
tracker.flush();
|
|
331
|
+
const log = tracker.getDailyLog();
|
|
332
|
+
const entry = result.entry;
|
|
333
|
+
const response = {
|
|
334
|
+
ok: true,
|
|
335
|
+
data: {
|
|
336
|
+
id: entry.id,
|
|
337
|
+
task: entry.task,
|
|
338
|
+
minutes: entry.minutes,
|
|
339
|
+
description: entry.description,
|
|
340
|
+
activity: entry.activity,
|
|
341
|
+
totalManualMinutes: Math.round(computeTotalManualEntryMs(log) / MS_PER_MINUTE),
|
|
342
|
+
remainingBudgetMs: getRemainingBudgetMs(log, this.deps.config),
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
// Manual time counts toward budget — settle exhaustion before next read.
|
|
346
|
+
await this.deps.forceTick();
|
|
347
|
+
return response;
|
|
348
|
+
}
|
|
349
|
+
async handleUpdateManualEntry(body) {
|
|
350
|
+
const target = typeof body.target === 'string' ? body.target
|
|
351
|
+
: (typeof body.id === 'string' ? body.id : '');
|
|
352
|
+
if (!target)
|
|
353
|
+
return { ok: false, error: 'Missing target (manual entry #index or id)' };
|
|
354
|
+
const patch = {};
|
|
355
|
+
if (typeof body.minutes === 'number')
|
|
356
|
+
patch.minutes = body.minutes;
|
|
357
|
+
if (typeof body.description === 'string')
|
|
358
|
+
patch.description = body.description;
|
|
359
|
+
if (typeof body.activity === 'string')
|
|
360
|
+
patch.activity = body.activity;
|
|
361
|
+
const tracker = this.deps.sessionTracker;
|
|
362
|
+
const found = resolveManualEntryTarget(tracker.getDailyLog(), target);
|
|
363
|
+
if (!found)
|
|
364
|
+
return { ok: false, error: `Manual entry not found: ${target}` };
|
|
365
|
+
const result = tracker.editManualEntry(found.id, patch);
|
|
366
|
+
if (!result.ok)
|
|
367
|
+
return { ok: false, error: result.error };
|
|
368
|
+
tracker.flush();
|
|
369
|
+
const log = tracker.getDailyLog();
|
|
370
|
+
const entry = findManualEntry(log, found.id);
|
|
371
|
+
if (!entry)
|
|
372
|
+
return { ok: false, error: 'Manual entry not found after update' };
|
|
373
|
+
const response = {
|
|
374
|
+
ok: true,
|
|
375
|
+
data: {
|
|
376
|
+
id: entry.id,
|
|
377
|
+
task: entry.task,
|
|
378
|
+
minutes: entry.minutes,
|
|
379
|
+
description: entry.description,
|
|
380
|
+
activity: entry.activity,
|
|
381
|
+
totalManualMinutes: Math.round(computeTotalManualEntryMs(log) / MS_PER_MINUTE),
|
|
382
|
+
remainingBudgetMs: getRemainingBudgetMs(log, this.deps.config),
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
await this.deps.forceTick();
|
|
386
|
+
return response;
|
|
387
|
+
}
|
|
388
|
+
async handleActivityTypes() {
|
|
389
|
+
try {
|
|
390
|
+
const secrets = loadSecrets();
|
|
391
|
+
const data = await resolveActivityTypes(secrets);
|
|
392
|
+
return { ok: true, data };
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
279
398
|
// ─── Settings ────────────────────────────────────────────────────
|
|
280
399
|
handleGetSettings() {
|
|
281
400
|
const c = this.deps.config;
|
|
@@ -301,6 +420,7 @@ export class HttpServer {
|
|
|
301
420
|
},
|
|
302
421
|
},
|
|
303
422
|
secretsMeta: { jiraConfigured, tempoConfigured },
|
|
423
|
+
daemonVersion: this.deps.getVersion(),
|
|
304
424
|
},
|
|
305
425
|
};
|
|
306
426
|
}
|
|
@@ -416,6 +536,7 @@ export class HttpServer {
|
|
|
416
536
|
dayType: log.dayType,
|
|
417
537
|
status: log.status,
|
|
418
538
|
sessions,
|
|
539
|
+
manualEntries: log.manualEntries ?? [],
|
|
419
540
|
totalEffectiveMs,
|
|
420
541
|
signalCount: log.signals.length,
|
|
421
542
|
budgetMs: computeBudgetMs(log, config),
|