@planckspace/cli 0.1.1 → 0.2.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/README.md +24 -1
- package/dist/anomaly/constants.d.ts +13 -0
- package/dist/anomaly/constants.d.ts.map +1 -0
- package/dist/anomaly/constants.js +13 -0
- package/dist/anomaly/constants.js.map +1 -0
- package/dist/anomaly/detector.d.ts +12 -0
- package/dist/anomaly/detector.d.ts.map +1 -0
- package/dist/anomaly/detector.js +98 -0
- package/dist/anomaly/detector.js.map +1 -0
- package/dist/anomaly/types.d.ts +19 -0
- package/dist/anomaly/types.d.ts.map +1 -0
- package/dist/anomaly/types.js +2 -0
- package/dist/anomaly/types.js.map +1 -0
- package/dist/commands/budget.d.ts +26 -0
- package/dist/commands/budget.d.ts.map +1 -0
- package/dist/commands/budget.js +91 -0
- package/dist/commands/budget.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +45 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect.d.ts +17 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +191 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/daemon.d.ts +8 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +310 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/diagnose.d.ts +2 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +81 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +40 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +184 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.d.ts +2 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +71 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +81 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/integrations.d.ts +2 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +46 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +45 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/metrics.d.ts +6 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +85 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/reconcile.d.ts +2 -0
- package/dist/commands/reconcile.d.ts.map +1 -0
- package/dist/commands/reconcile.js +63 -0
- package/dist/commands/reconcile.js.map +1 -0
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +53 -10
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +84 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/subscription.d.ts +15 -0
- package/dist/commands/subscription.d.ts.map +1 -0
- package/dist/commands/subscription.js +62 -0
- package/dist/commands/subscription.js.map +1 -0
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +77 -10
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/value.d.ts +5 -0
- package/dist/commands/value.d.ts.map +1 -0
- package/dist/commands/value.js +95 -0
- package/dist/commands/value.js.map +1 -0
- package/dist/config.d.ts +28 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/correlate.d.ts +7 -0
- package/dist/correlate.d.ts.map +1 -1
- package/dist/correlate.js +102 -15
- package/dist/correlate.js.map +1 -1
- package/dist/daemon/daemon.d.ts +2 -0
- package/dist/daemon/daemon.d.ts.map +1 -0
- package/dist/daemon/daemon.js +188 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/daemonState.d.ts +25 -0
- package/dist/daemon/daemonState.d.ts.map +1 -0
- package/dist/daemon/daemonState.js +82 -0
- package/dist/daemon/daemonState.js.map +1 -0
- package/dist/daemon/logger.d.ts +7 -0
- package/dist/daemon/logger.d.ts.map +1 -0
- package/dist/daemon/logger.js +61 -0
- package/dist/daemon/logger.js.map +1 -0
- package/dist/daemon/syncLoop.d.ts +38 -0
- package/dist/daemon/syncLoop.d.ts.map +1 -0
- package/dist/daemon/syncLoop.js +119 -0
- package/dist/daemon/syncLoop.js.map +1 -0
- package/dist/daemon/watcher.d.ts +26 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +187 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/db/store.d.ts +123 -2
- package/dist/db/store.d.ts.map +1 -1
- package/dist/db/store.js +397 -11
- package/dist/db/store.js.map +1 -1
- package/dist/detectors/cache-gap.d.ts +3 -0
- package/dist/detectors/cache-gap.d.ts.map +1 -0
- package/dist/detectors/cache-gap.js +70 -0
- package/dist/detectors/cache-gap.js.map +1 -0
- package/dist/detectors/context-bloat.d.ts +3 -0
- package/dist/detectors/context-bloat.d.ts.map +1 -0
- package/dist/detectors/context-bloat.js +68 -0
- package/dist/detectors/context-bloat.js.map +1 -0
- package/dist/detectors/fileTokens.d.ts +3 -0
- package/dist/detectors/fileTokens.d.ts.map +1 -0
- package/dist/detectors/fileTokens.js +12 -0
- package/dist/detectors/fileTokens.js.map +1 -0
- package/dist/detectors/index.d.ts +20 -0
- package/dist/detectors/index.d.ts.map +1 -0
- package/dist/detectors/index.js +41 -0
- package/dist/detectors/index.js.map +1 -0
- package/dist/detectors/model-routing.d.ts +3 -0
- package/dist/detectors/model-routing.d.ts.map +1 -0
- package/dist/detectors/model-routing.js +71 -0
- package/dist/detectors/model-routing.js.map +1 -0
- package/dist/detectors/repeat-read.d.ts +3 -0
- package/dist/detectors/repeat-read.d.ts.map +1 -0
- package/dist/detectors/repeat-read.js +69 -0
- package/dist/detectors/repeat-read.js.map +1 -0
- package/dist/detectors/seat-efficiency.d.ts +4 -0
- package/dist/detectors/seat-efficiency.d.ts.map +1 -0
- package/dist/detectors/seat-efficiency.js +86 -0
- package/dist/detectors/seat-efficiency.js.map +1 -0
- package/dist/detectors/types.d.ts +46 -0
- package/dist/detectors/types.d.ts.map +1 -0
- package/dist/detectors/types.js +2 -0
- package/dist/detectors/types.js.map +1 -0
- package/dist/health.d.ts +59 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +106 -0
- package/dist/health.js.map +1 -0
- package/dist/index.js +389 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics.d.ts +29 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +205 -0
- package/dist/metrics.js.map +1 -0
- package/dist/scrapers/claudeCode.d.ts +1 -0
- package/dist/scrapers/claudeCode.d.ts.map +1 -1
- package/dist/scrapers/claudeCode.js +43 -13
- package/dist/scrapers/claudeCode.js.map +1 -1
- package/dist/scrapers/cursor.d.ts +3 -2
- package/dist/scrapers/cursor.d.ts.map +1 -1
- package/dist/scrapers/cursor.js +56 -16
- package/dist/scrapers/cursor.js.map +1 -1
- package/dist/scrapers/jetbrains.d.ts +15 -0
- package/dist/scrapers/jetbrains.d.ts.map +1 -0
- package/dist/scrapers/jetbrains.js +232 -0
- package/dist/scrapers/jetbrains.js.map +1 -0
- package/dist/scrapers/types.d.ts +4 -1
- package/dist/scrapers/types.d.ts.map +1 -1
- package/dist/scrapers/windsurf.d.ts +3 -2
- package/dist/scrapers/windsurf.d.ts.map +1 -1
- package/dist/scrapers/windsurf.js +25 -9
- package/dist/scrapers/windsurf.js.map +1 -1
- package/dist/sync/payload.d.ts +4 -5
- package/dist/sync/payload.d.ts.map +1 -1
- package/dist/sync/payload.js +88 -7
- package/dist/sync/payload.js.map +1 -1
- package/dist/sync/syncEngine.d.ts +19 -3
- package/dist/sync/syncEngine.d.ts.map +1 -1
- package/dist/sync/syncEngine.js +116 -10
- package/dist/sync/syncEngine.js.map +1 -1
- package/install.sh +27 -10
- package/package.json +43 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function installDaemon(): void;
|
|
2
|
+
export declare function uninstallDaemon(): void;
|
|
3
|
+
export declare function statusDaemon(opts: {
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
}): void;
|
|
6
|
+
/** Entry point for `planck daemon run` — starts the long-running daemon loop. */
|
|
7
|
+
export declare function runDaemonCommand(): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AA6PA,wBAAgB,aAAa,IAAI,IAAI,CAWpC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAyC9D;AAED,iFAAiF;AACjF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import os from "os";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { execSync, spawn } from "child_process";
|
|
6
|
+
import { readDaemonState, readPid, isPidRunning, formatUptime, formatAgo, } from "../daemon/daemonState.js";
|
|
7
|
+
import { readRecentLogs } from "../daemon/logger.js";
|
|
8
|
+
import { runDaemon } from "../daemon/daemon.js";
|
|
9
|
+
import { PLANCKSPACE_DIR } from "../db/store.js";
|
|
10
|
+
// ── Platform-specific registration ────────────────────────────────────────────
|
|
11
|
+
const TASK_NAME = "PlanckSpaceSync"; // Windows schtasks (flat — no subfolder, no admin needed)
|
|
12
|
+
const LAUNCHD_LABEL = "dev.planckspace.sync"; // macOS
|
|
13
|
+
const SYSTEMD_UNIT = "planckspace-sync.service"; // Linux
|
|
14
|
+
/** Absolute path to the node binary running this process. */
|
|
15
|
+
function nodeBin() {
|
|
16
|
+
return process.execPath;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Always returns the compiled dist/index.js entry point, regardless of
|
|
20
|
+
* whether the process was started via `npx tsx src/index.ts` (dev) or
|
|
21
|
+
* the compiled `planck` binary.
|
|
22
|
+
*
|
|
23
|
+
* Strategy: this module lives at <root>/src/commands/daemon.ts (source) or
|
|
24
|
+
* <root>/dist/commands/daemon.js (compiled). Two levels up is always the
|
|
25
|
+
* project root, so we can reliably locate dist/index.js.
|
|
26
|
+
*/
|
|
27
|
+
function resolveCompiledScript() {
|
|
28
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
29
|
+
const root = path.resolve(path.dirname(__filename), "..", "..");
|
|
30
|
+
return path.join(root, "dist", "index.js");
|
|
31
|
+
}
|
|
32
|
+
// ── macOS ──────────────────────────────────────────────────────────────────────
|
|
33
|
+
function macosPlists() {
|
|
34
|
+
const node = nodeBin();
|
|
35
|
+
const script = resolveCompiledScript();
|
|
36
|
+
const logFile = path.join(PLANCKSPACE_DIR, "daemon.log");
|
|
37
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
38
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
39
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
40
|
+
<plist version="1.0">
|
|
41
|
+
<dict>
|
|
42
|
+
<key>Label</key> <string>${LAUNCHD_LABEL}</string>
|
|
43
|
+
<key>ProgramArguments</key>
|
|
44
|
+
<array>
|
|
45
|
+
<string>${node}</string>
|
|
46
|
+
<string>${script}</string>
|
|
47
|
+
<string>daemon</string>
|
|
48
|
+
<string>run</string>
|
|
49
|
+
</array>
|
|
50
|
+
<key>RunAtLoad</key> <true/>
|
|
51
|
+
<key>KeepAlive</key> <true/>
|
|
52
|
+
<key>ThrottleInterval</key> <integer>30</integer>
|
|
53
|
+
<key>StandardOutPath</key> <string>${logFile}</string>
|
|
54
|
+
<key>StandardErrorPath</key> <string>${logFile}</string>
|
|
55
|
+
<key>EnvironmentVariables</key>
|
|
56
|
+
<dict>
|
|
57
|
+
<key>HOME</key><string>${os.homedir()}</string>
|
|
58
|
+
</dict>
|
|
59
|
+
</dict>
|
|
60
|
+
</plist>`;
|
|
61
|
+
}
|
|
62
|
+
function macosInstall() {
|
|
63
|
+
const agentsDir = path.join(os.homedir(), "Library", "LaunchAgents");
|
|
64
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
65
|
+
const plistPath = path.join(agentsDir, `${LAUNCHD_LABEL}.plist`);
|
|
66
|
+
// Unload existing registration before rewriting (idempotent).
|
|
67
|
+
try {
|
|
68
|
+
execSync(`launchctl unload "${plistPath}" 2>/dev/null`, { stdio: "pipe" });
|
|
69
|
+
}
|
|
70
|
+
catch { /* not loaded */ }
|
|
71
|
+
fs.writeFileSync(plistPath, macosPlists(), "utf-8");
|
|
72
|
+
execSync(`launchctl load "${plistPath}"`);
|
|
73
|
+
console.log(`Daemon registered: ${plistPath}`);
|
|
74
|
+
console.log("The daemon will start now and on every login.");
|
|
75
|
+
}
|
|
76
|
+
function macosUninstall() {
|
|
77
|
+
const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`);
|
|
78
|
+
try {
|
|
79
|
+
execSync(`launchctl unload "${plistPath}"`, { stdio: "pipe" });
|
|
80
|
+
}
|
|
81
|
+
catch { /* not loaded */ }
|
|
82
|
+
try {
|
|
83
|
+
fs.unlinkSync(plistPath);
|
|
84
|
+
}
|
|
85
|
+
catch { /* already gone */ }
|
|
86
|
+
console.log("Daemon unregistered (LaunchAgent removed).");
|
|
87
|
+
}
|
|
88
|
+
// ── Linux ─────────────────────────────────────────────────────────────────────
|
|
89
|
+
function linuxServiceContent() {
|
|
90
|
+
const node = nodeBin();
|
|
91
|
+
const script = resolveCompiledScript();
|
|
92
|
+
return `[Unit]
|
|
93
|
+
Description=PlanckSpace background sync daemon
|
|
94
|
+
After=network-online.target
|
|
95
|
+
|
|
96
|
+
[Service]
|
|
97
|
+
Type=simple
|
|
98
|
+
ExecStart=${node} ${script} daemon run
|
|
99
|
+
Restart=on-failure
|
|
100
|
+
RestartSec=5s
|
|
101
|
+
Environment=HOME=${os.homedir()}
|
|
102
|
+
|
|
103
|
+
[Install]
|
|
104
|
+
WantedBy=default.target
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
107
|
+
function linuxSystemdDir() {
|
|
108
|
+
return path.join(os.homedir(), ".config", "systemd", "user");
|
|
109
|
+
}
|
|
110
|
+
function linuxInstall() {
|
|
111
|
+
const unitDir = linuxSystemdDir();
|
|
112
|
+
fs.mkdirSync(unitDir, { recursive: true });
|
|
113
|
+
const unitPath = path.join(unitDir, SYSTEMD_UNIT);
|
|
114
|
+
fs.writeFileSync(unitPath, linuxServiceContent(), "utf-8");
|
|
115
|
+
execSync(`systemctl --user daemon-reload`);
|
|
116
|
+
execSync(`systemctl --user enable --now ${SYSTEMD_UNIT}`);
|
|
117
|
+
console.log(`Daemon registered: ${unitPath}`);
|
|
118
|
+
console.log("The daemon is running and will start on every login.");
|
|
119
|
+
}
|
|
120
|
+
function linuxUninstall() {
|
|
121
|
+
try {
|
|
122
|
+
execSync(`systemctl --user disable --now ${SYSTEMD_UNIT}`, { stdio: "pipe" });
|
|
123
|
+
}
|
|
124
|
+
catch { /* not enabled */ }
|
|
125
|
+
try {
|
|
126
|
+
fs.unlinkSync(path.join(linuxSystemdDir(), SYSTEMD_UNIT));
|
|
127
|
+
execSync(`systemctl --user daemon-reload`, { stdio: "pipe" });
|
|
128
|
+
}
|
|
129
|
+
catch { /* already gone */ }
|
|
130
|
+
console.log("Daemon unregistered (systemd unit removed).");
|
|
131
|
+
}
|
|
132
|
+
// ── Windows ───────────────────────────────────────────────────────────────────
|
|
133
|
+
// Two-tier install strategy (no admin needed for either):
|
|
134
|
+
// Tier 1: Task Scheduler via PowerShell Register-ScheduledTask.
|
|
135
|
+
// Gives automatic restart-on-failure every 60s (999 retries).
|
|
136
|
+
// Falls through to Tier 2 if Group Policy blocks schtasks.
|
|
137
|
+
// Tier 2: HKCU Run key + VBScript silent launcher.
|
|
138
|
+
// No restart-on-crash, but survives machine reboots.
|
|
139
|
+
const WIN_REG_KEY = "HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
|
|
140
|
+
const WIN_REG_VALUE = "PlanckSpaceSync";
|
|
141
|
+
/** Path to the silent-launch VBScript placed in AppData. */
|
|
142
|
+
function windowsVbsPath() {
|
|
143
|
+
return path.join(os.homedir(), "AppData", "Roaming", "planckspace-daemon.vbs");
|
|
144
|
+
}
|
|
145
|
+
function windowsVbsContent(node, script) {
|
|
146
|
+
return [
|
|
147
|
+
`Set sh = CreateObject("WScript.Shell")`,
|
|
148
|
+
`sh.Run Chr(34) & "${node}" & Chr(34) & " " & Chr(34) & "${script}" & Chr(34) & " daemon run", 0, False`,
|
|
149
|
+
].join("\r\n") + "\r\n";
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Register as a Task Scheduler task (restart-on-failure, no console window).
|
|
153
|
+
* Returns true on success, false if blocked by Group Policy or any error.
|
|
154
|
+
*/
|
|
155
|
+
function windowsTryScheduler(node, script) {
|
|
156
|
+
const tmpPs1 = path.join(os.tmpdir(), "planckspace-task.ps1");
|
|
157
|
+
const taskName = TASK_NAME;
|
|
158
|
+
// Escape paths for PowerShell single-quoted strings (backslash-only, no special chars).
|
|
159
|
+
const nodeSafe = node.replace(/'/g, "''");
|
|
160
|
+
const scriptSafe = script.replace(/'/g, "''");
|
|
161
|
+
const ps1 = [
|
|
162
|
+
// Promote all errors to terminating so the script exits non-zero on failure.
|
|
163
|
+
`$ErrorActionPreference = 'Stop'`,
|
|
164
|
+
`try { Stop-ScheduledTask -TaskName '${taskName}' -ErrorAction SilentlyContinue } catch {}`,
|
|
165
|
+
`$action = New-ScheduledTaskAction -Execute '${nodeSafe}' -Argument '"${scriptSafe}" daemon run'`,
|
|
166
|
+
`$trigger = New-ScheduledTaskTrigger -AtLogOn`,
|
|
167
|
+
`$settings = New-ScheduledTaskSettingsSet \``,
|
|
168
|
+
` -RestartCount 999 \``,
|
|
169
|
+
` -RestartInterval (New-TimeSpan -Minutes 1) \``,
|
|
170
|
+
` -ExecutionTimeLimit ([TimeSpan]::Zero) \``,
|
|
171
|
+
` -MultipleInstances IgnoreNew`,
|
|
172
|
+
`Register-ScheduledTask -TaskName '${taskName}' -Action $action -Trigger $trigger -Settings $settings -RunLevel Limited -Force | Out-Null`,
|
|
173
|
+
].join("\n");
|
|
174
|
+
try {
|
|
175
|
+
fs.writeFileSync(tmpPs1, ps1, "utf-8");
|
|
176
|
+
execSync(`powershell.exe -NonInteractive -ExecutionPolicy Bypass -File "${tmpPs1}"`, { stdio: "pipe" });
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
try {
|
|
184
|
+
fs.unlinkSync(tmpPs1);
|
|
185
|
+
}
|
|
186
|
+
catch { /* ignore */ }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function windowsInstall() {
|
|
190
|
+
const node = nodeBin().replace(/\//g, "\\");
|
|
191
|
+
const script = resolveCompiledScript().replace(/\//g, "\\");
|
|
192
|
+
// ── Persistence registration (login auto-start) ──────────────────────────
|
|
193
|
+
const usedScheduler = windowsTryScheduler(node, script);
|
|
194
|
+
if (!usedScheduler) {
|
|
195
|
+
// Fallback: HKCU Run key + VBScript (no admin, no restart-on-crash).
|
|
196
|
+
const vbsPath = windowsVbsPath();
|
|
197
|
+
fs.writeFileSync(vbsPath, windowsVbsContent(node, script), "utf-8");
|
|
198
|
+
const regCmd = `REG ADD "${WIN_REG_KEY}" /v "${WIN_REG_VALUE}" /t REG_SZ /d "wscript.exe \\"${vbsPath}\\"" /f`;
|
|
199
|
+
execSync(regCmd, { stdio: "pipe", shell: "cmd.exe" });
|
|
200
|
+
console.log(`Daemon registered for auto-start at login (HKCU Run key).`);
|
|
201
|
+
console.log(`VBScript launcher: ${vbsPath}`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.log(`Daemon registered in Task Scheduler (auto-restart on crash, task: ${TASK_NAME}).`);
|
|
205
|
+
}
|
|
206
|
+
// ── Immediate start (always, regardless of persistence method) ────────────
|
|
207
|
+
const child = spawn(nodeBin(), [script, "daemon", "run"], {
|
|
208
|
+
detached: true,
|
|
209
|
+
stdio: "ignore",
|
|
210
|
+
windowsHide: true,
|
|
211
|
+
});
|
|
212
|
+
child.unref();
|
|
213
|
+
console.log("The daemon is running now and will start on every login.");
|
|
214
|
+
}
|
|
215
|
+
function windowsUninstall() {
|
|
216
|
+
// Remove Task Scheduler task (if present).
|
|
217
|
+
try {
|
|
218
|
+
execSync(`powershell.exe -NonInteractive -Command "Unregister-ScheduledTask -TaskName '${TASK_NAME}' -Confirm:$false"`, { stdio: "pipe" });
|
|
219
|
+
}
|
|
220
|
+
catch { /* not registered */ }
|
|
221
|
+
// Remove HKCU Run key fallback (if present).
|
|
222
|
+
try {
|
|
223
|
+
execSync(`REG DELETE "${WIN_REG_KEY}" /v "${WIN_REG_VALUE}" /f`, {
|
|
224
|
+
stdio: "pipe",
|
|
225
|
+
shell: "cmd.exe",
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch { /* key may not exist */ }
|
|
229
|
+
try {
|
|
230
|
+
fs.unlinkSync(windowsVbsPath());
|
|
231
|
+
}
|
|
232
|
+
catch { /* file may not exist */ }
|
|
233
|
+
console.log("Daemon unregistered (Task Scheduler task and Run key removed).");
|
|
234
|
+
}
|
|
235
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
236
|
+
export function installDaemon() {
|
|
237
|
+
if (process.platform === "darwin") {
|
|
238
|
+
macosInstall();
|
|
239
|
+
}
|
|
240
|
+
else if (process.platform === "linux") {
|
|
241
|
+
linuxInstall();
|
|
242
|
+
}
|
|
243
|
+
else if (process.platform === "win32") {
|
|
244
|
+
windowsInstall();
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.warn(`Unsupported platform: ${process.platform}. Daemon not registered.`);
|
|
248
|
+
console.warn("You can start the daemon manually with: planck daemon run");
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function uninstallDaemon() {
|
|
252
|
+
if (process.platform === "darwin") {
|
|
253
|
+
macosUninstall();
|
|
254
|
+
}
|
|
255
|
+
else if (process.platform === "linux") {
|
|
256
|
+
linuxUninstall();
|
|
257
|
+
}
|
|
258
|
+
else if (process.platform === "win32") {
|
|
259
|
+
windowsUninstall();
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.warn(`Unsupported platform: ${process.platform}. Nothing to uninstall.`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export function statusDaemon(opts) {
|
|
266
|
+
const pid = readPid();
|
|
267
|
+
const state = readDaemonState();
|
|
268
|
+
const running = pid !== null && isPidRunning(pid);
|
|
269
|
+
console.log("Daemon status");
|
|
270
|
+
console.log("─────────────────────────────────────");
|
|
271
|
+
console.log(`running: ${running ? "yes" : "no"}`);
|
|
272
|
+
if (running && state) {
|
|
273
|
+
console.log(`pid: ${state.pid}`);
|
|
274
|
+
console.log(`uptime: ${formatUptime(state.startedAt)}`);
|
|
275
|
+
console.log(`last event: ${formatAgo(state.lastEventAt)}${state.lastEventType ? ` (${state.lastEventType})` : ""}`);
|
|
276
|
+
console.log(`queue depth: ${state.queueDepth} pending`);
|
|
277
|
+
console.log(`last sync: ${formatAgo(state.lastSyncAt)}${state.lastSyncCount > 0 ? `, ${state.lastSyncCount} session(s)` : ""}`);
|
|
278
|
+
console.log(`last error: ${state.lastError ? `${state.lastError} (${formatAgo(state.lastErrorAt)})` : "(none)"}`);
|
|
279
|
+
}
|
|
280
|
+
else if (!running) {
|
|
281
|
+
if (pid !== null) {
|
|
282
|
+
console.log(`(stale PID ${pid} — process not found)`);
|
|
283
|
+
}
|
|
284
|
+
if (state?.lastSyncAt) {
|
|
285
|
+
console.log(`last sync: ${formatAgo(state.lastSyncAt)}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (opts.verbose) {
|
|
289
|
+
console.log("");
|
|
290
|
+
console.log("Recent events (last 50):");
|
|
291
|
+
const events = readRecentLogs(50);
|
|
292
|
+
if (events.length === 0) {
|
|
293
|
+
console.log(" (no log entries found)");
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
for (const e of events) {
|
|
297
|
+
const { ts, event, ...rest } = e;
|
|
298
|
+
const detail = Object.keys(rest).length > 0
|
|
299
|
+
? " " + JSON.stringify(rest)
|
|
300
|
+
: "";
|
|
301
|
+
console.log(` ${String(ts ?? "").slice(0, 19).replace("T", " ")} ${String(event).padEnd(24)}${detail}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/** Entry point for `planck daemon run` — starts the long-running daemon loop. */
|
|
307
|
+
export async function runDaemonCommand() {
|
|
308
|
+
await runDaemon();
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,eAAe,EACf,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,SAAS,GACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,iFAAiF;AAEjF,MAAM,SAAS,GAAO,iBAAiB,CAAC,CAAY,0DAA0D;AAC9G,MAAM,aAAa,GAAG,sBAAsB,CAAC,CAAM,QAAQ;AAC3D,MAAM,YAAY,GAAI,0BAA0B,CAAC,CAAE,QAAQ;AAE3D,6DAA6D;AAC7D,SAAS,OAAO;IACd,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAElF,SAAS,WAAW;IAClB,MAAM,IAAI,GAAK,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACzD,OAAO;;;;;yCAKgC,aAAa;;;cAGxC,IAAI;cACJ,MAAM;;;;;;;yCAOqB,OAAO;yCACP,OAAO;;;6BAGnB,EAAE,CAAC,OAAO,EAAE;;;SAGhC,CAAC;AACV,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,aAAa,QAAQ,CAAC,CAAC;IAEjE,8DAA8D;IAC9D,IAAI,CAAC;QAAC,QAAQ,CAAC,qBAAqB,SAAS,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAE9G,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;IACpD,QAAQ,CAAC,mBAAmB,SAAS,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,aAAa,QAAQ,CAClE,CAAC;IACF,IAAI,CAAC;QAAC,QAAQ,CAAC,qBAAqB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAClG,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC;AAED,iFAAiF;AAEjF,SAAS,mBAAmB;IAC1B,MAAM,IAAI,GAAK,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,OAAO;;;;;;YAMG,IAAI,IAAI,MAAM;;;mBAGP,EAAE,CAAC,OAAO,EAAE;;;;CAI9B,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,gCAAgC,CAAC,CAAC;IAC3C,QAAQ,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QAAC,QAAQ,CAAC,kCAAkC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAClH,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;AAC7D,CAAC;AAED,iFAAiF;AACjF,0DAA0D;AAC1D,kEAAkE;AAClE,wEAAwE;AACxE,qEAAqE;AACrE,qDAAqD;AACrD,+DAA+D;AAE/D,MAAM,WAAW,GAAK,yDAAyD,CAAC;AAChF,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC,4DAA4D;AAC5D,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAc;IACrD,OAAO;QACL,wCAAwC;QACxC,qBAAqB,IAAI,kCAAkC,MAAM,uCAAuC;KACzG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,MAAc;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC;IAC3B,wFAAwF;IACxF,MAAM,QAAQ,GAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG;QACV,6EAA6E;QAC7E,iCAAiC;QACjC,uCAAuC,QAAQ,4CAA4C;QAC3F,iDAAiD,QAAQ,iBAAiB,UAAU,eAAe;QACnG,+CAA+C;QAC/C,6CAA6C;QAC7C,oCAAoC;QACpC,6DAA6D;QAC7D,yDAAyD;QACzD,4CAA4C;QAC5C,qCAAqC,QAAQ,6FAA6F;KAC3I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACvC,QAAQ,CACN,iEAAiE,MAAM,GAAG,EAC1E,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,IAAI,GAAK,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5D,4EAA4E;IAC5E,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,qEAAqE;QACrE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,YAAY,WAAW,SAAS,aAAa,kCAAkC,OAAO,SAAS,CAAC;QAC/G,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qEAAqE,SAAS,IAAI,CAAC,CAAC;IAClG,CAAC;IAED,6EAA6E;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE;QACxD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,gBAAgB;IACvB,2CAA2C;IAC3C,IAAI,CAAC;QACH,QAAQ,CACN,gFAAgF,SAAS,oBAAoB,EAC7G,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAChC,6CAA6C;IAC7C,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,WAAW,SAAS,aAAa,MAAM,EAAE;YAC/D,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACnC,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;AAChF,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,QAAQ,0BAA0B,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,gBAAgB,EAAE,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,QAAQ,yBAAyB,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA2B;IACtD,MAAM,GAAG,GAAK,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrH,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,UAAU,UAAU,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrH,CAAC;SAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,uBAAuB,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;oBACzC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC7B,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,IAAI,IAAI,CAgFlC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { resolveModelRate } from "@planckspace/core";
|
|
2
|
+
import { initDb, getSessions } from "../db/store.js";
|
|
3
|
+
export function runDiagnose() {
|
|
4
|
+
initDb();
|
|
5
|
+
const sessions = getSessions();
|
|
6
|
+
if (sessions.length === 0) {
|
|
7
|
+
console.log("No sessions found. Run `planck scan` first.");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Collect model ID counts from every turn across all sessions.
|
|
11
|
+
const modelCounts = new Map(); // modelId → total turns
|
|
12
|
+
for (const row of sessions) {
|
|
13
|
+
let turns = [];
|
|
14
|
+
try {
|
|
15
|
+
turns = JSON.parse(row.turnsJson);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// turnsJson corrupt — fall back to session-level model
|
|
19
|
+
}
|
|
20
|
+
if (turns.length > 0) {
|
|
21
|
+
for (const t of turns) {
|
|
22
|
+
if (t.model)
|
|
23
|
+
modelCounts.set(t.model, (modelCounts.get(t.model) ?? 0) + 1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (row.model) {
|
|
27
|
+
modelCounts.set(row.model, (modelCounts.get(row.model) ?? 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Partition into matched / unmatched.
|
|
31
|
+
const matched = [];
|
|
32
|
+
const unmatched = [];
|
|
33
|
+
for (const [modelId, count] of modelCounts) {
|
|
34
|
+
if (resolveModelRate(modelId) !== null) {
|
|
35
|
+
matched.push([modelId, count]);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
unmatched.push([modelId, count]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
matched.sort((a, b) => b[1] - a[1]);
|
|
42
|
+
unmatched.sort((a, b) => b[1] - a[1]);
|
|
43
|
+
// Sessions by costType.
|
|
44
|
+
const byCostType = new Map();
|
|
45
|
+
for (const row of sessions) {
|
|
46
|
+
const ct = row.costType ?? "imputed";
|
|
47
|
+
byCostType.set(ct, (byCostType.get(ct) ?? 0) + 1);
|
|
48
|
+
}
|
|
49
|
+
console.log("PlanckSpace Diagnose");
|
|
50
|
+
console.log("─────────────────────────────────────");
|
|
51
|
+
console.log(`\nSessions: ${sessions.length}`);
|
|
52
|
+
console.log(" by costType:");
|
|
53
|
+
for (const [ct, n] of [...byCostType.entries()].sort()) {
|
|
54
|
+
console.log(` ${ct.padEnd(10)}: ${n}`);
|
|
55
|
+
}
|
|
56
|
+
console.log(`\nDistinct model IDs seen across all turns:`);
|
|
57
|
+
if (matched.length === 0 && unmatched.length === 0) {
|
|
58
|
+
console.log(" (none)");
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const allModels = [...matched, ...unmatched].sort((a, b) => b[1] - a[1]);
|
|
62
|
+
for (const [modelId, count] of allModels) {
|
|
63
|
+
const priceable = resolveModelRate(modelId) !== null;
|
|
64
|
+
const tag = priceable ? "" : " ← UNMATCHED";
|
|
65
|
+
console.log(` ${String(count).padStart(5)} turn(s) ${modelId}${tag}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (unmatched.length > 0) {
|
|
69
|
+
const totalUnpricedTurns = unmatched.reduce((s, [, n]) => s + n, 0);
|
|
70
|
+
console.log(`\nUnmatched model IDs (pricing bypassed — cost excluded, not zeroed):`);
|
|
71
|
+
for (const [modelId, count] of unmatched) {
|
|
72
|
+
console.log(` ${modelId} (${count} turn(s))`);
|
|
73
|
+
}
|
|
74
|
+
console.log(`\n Total unpriced turns: ${totalUnpricedTurns}`);
|
|
75
|
+
console.log(` To fix: add these IDs to resolveModelRate() in @planckspace/core.`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log(`\nAll model IDs are priced correctly.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAqBA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD/C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { readConfig, resolveApiUrl } from "../config.js";
|
|
2
|
+
import { initDb, getConnectionState, getSessionCount, getUnsyncedSessions, } from "../db/store.js";
|
|
3
|
+
import { preflightHealth } from "../health.js";
|
|
4
|
+
function maskToken(token) {
|
|
5
|
+
if (!token)
|
|
6
|
+
return "(none)";
|
|
7
|
+
if (token.length <= 4)
|
|
8
|
+
return "****";
|
|
9
|
+
return `...${token.slice(-4)}`;
|
|
10
|
+
}
|
|
11
|
+
function shortId(id) {
|
|
12
|
+
if (!id)
|
|
13
|
+
return "(unknown)";
|
|
14
|
+
return id.slice(0, 8);
|
|
15
|
+
}
|
|
16
|
+
export async function runDoctor() {
|
|
17
|
+
initDb();
|
|
18
|
+
const config = readConfig();
|
|
19
|
+
const apiUrl = resolveApiUrl();
|
|
20
|
+
const lastDbInstanceId = getConnectionState("last_backend_db_instance_id");
|
|
21
|
+
const lastWorkspaceId = getConnectionState("last_workspace_id");
|
|
22
|
+
const lastHealthCheckAt = getConnectionState("last_health_check_at");
|
|
23
|
+
const total = getSessionCount();
|
|
24
|
+
const unsynced = getUnsyncedSessions().length;
|
|
25
|
+
const synced = total - unsynced;
|
|
26
|
+
// Live health check (read-only — no side effects, does not commit state).
|
|
27
|
+
const health = await preflightHealth();
|
|
28
|
+
let healthLine;
|
|
29
|
+
if (health.ok) {
|
|
30
|
+
healthLine = `ok — workspace ${health.workspaceName}, db instance ${health.dbInstanceId}`;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
switch (health.reason) {
|
|
34
|
+
case "no-token":
|
|
35
|
+
healthLine = "no token";
|
|
36
|
+
break;
|
|
37
|
+
case "invalid-token":
|
|
38
|
+
healthLine = "invalid token (401)";
|
|
39
|
+
break;
|
|
40
|
+
case "network":
|
|
41
|
+
healthLine = `unreachable (${apiUrl})`;
|
|
42
|
+
break;
|
|
43
|
+
case "db-reset":
|
|
44
|
+
healthLine = `db-reset detected (${health.previous} → ${health.current})`;
|
|
45
|
+
break;
|
|
46
|
+
case "workspace-changed":
|
|
47
|
+
healthLine = `workspace-changed detected (${health.previous} → ${health.current})`;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log("PlanckSpace Doctor");
|
|
52
|
+
console.log("─────────────────────────────────────");
|
|
53
|
+
console.log(`API URL : ${apiUrl}`);
|
|
54
|
+
console.log(`Workspace ID : ${config.workspaceId ?? "(not set)"}`);
|
|
55
|
+
console.log(`Workspace Name : ${config.workspaceName ?? "(not set)"}`);
|
|
56
|
+
console.log(`Token : ${maskToken(config.token)}`);
|
|
57
|
+
console.log(`Last DB instance : ${shortId(lastDbInstanceId)}`);
|
|
58
|
+
console.log(`Last workspace ID : ${lastWorkspaceId ?? "(not set)"}`);
|
|
59
|
+
console.log(`Last health check : ${lastHealthCheckAt ?? "never"}`);
|
|
60
|
+
console.log("");
|
|
61
|
+
console.log(`Sessions — total : ${total}`);
|
|
62
|
+
console.log(`Sessions — synced : ${synced}`);
|
|
63
|
+
console.log(`Sessions — unsynced : ${unsynced}`);
|
|
64
|
+
console.log("");
|
|
65
|
+
console.log(`Health (live) : ${healthLine}`);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ExportSessionRow } from "../db/store.js";
|
|
2
|
+
import { type TeamMapping } from "../config.js";
|
|
3
|
+
export type ExportChargebackOptions = {
|
|
4
|
+
month: string;
|
|
5
|
+
out: string;
|
|
6
|
+
};
|
|
7
|
+
export type ExportSessionsOptions = {
|
|
8
|
+
month: string;
|
|
9
|
+
out: string;
|
|
10
|
+
};
|
|
11
|
+
export type ChargebackRow = {
|
|
12
|
+
month: string;
|
|
13
|
+
costCenter: string;
|
|
14
|
+
team: string;
|
|
15
|
+
repo: string;
|
|
16
|
+
developerEmail?: string;
|
|
17
|
+
tool: string;
|
|
18
|
+
model: string;
|
|
19
|
+
costType: string;
|
|
20
|
+
costUsd: number;
|
|
21
|
+
consumptionValueUsd: number;
|
|
22
|
+
shippedPrCount: number;
|
|
23
|
+
sessions: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Aggregate session rows into chargeback rows.
|
|
27
|
+
*
|
|
28
|
+
* In collaborative mode the developerEmail property is omitted from every row,
|
|
29
|
+
* and rows are grouped by (team, repo, tool, model, costType) only.
|
|
30
|
+
* In individual mode developerEmail is included as an additional group-by dimension.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildChargebackRows(sessions: ExportSessionRow[], opts: {
|
|
33
|
+
month: string;
|
|
34
|
+
costCenter: string;
|
|
35
|
+
teamMappings: TeamMapping[];
|
|
36
|
+
privacyMode: "individual" | "collaborative";
|
|
37
|
+
}): ChargebackRow[];
|
|
38
|
+
export declare function runExportChargeback(opts: ExportChargebackOptions): void;
|
|
39
|
+
export declare function runExportSessions(opts: ExportSessionsOptions): void;
|
|
40
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAkDF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,YAAY,GAAG,eAAe,CAAC;CAC7C,GACA,aAAa,EAAE,CA4DjB;AAiCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAqBvE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAyCnE"}
|