@psychout98/tadaima 1.0.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/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +8 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +91 -0
- package/dist/daemon.js.map +1 -0
- package/dist/download-handler.d.ts +15 -0
- package/dist/download-handler.d.ts.map +1 -0
- package/dist/download-handler.js +203 -0
- package/dist/download-handler.js.map +1 -0
- package/dist/downloader.d.ts +11 -0
- package/dist/downloader.d.ts.map +1 -0
- package/dist/downloader.js +65 -0
- package/dist/downloader.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +271 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +74 -0
- package/dist/logger.js.map +1 -0
- package/dist/organizer.d.ts +12 -0
- package/dist/organizer.d.ts.map +1 -0
- package/dist/organizer.js +42 -0
- package/dist/organizer.js.map +1 -0
- package/dist/rd-client.d.ts +25 -0
- package/dist/rd-client.d.ts.map +1 -0
- package/dist/rd-client.js +129 -0
- package/dist/rd-client.js.map +1 -0
- package/dist/service.d.ts +3 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +186 -0
- package/dist/service.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +92 -0
- package/dist/setup.js.map +1 -0
- package/dist/status-writer.d.ts +20 -0
- package/dist/status-writer.d.ts.map +1 -0
- package/dist/status-writer.js +34 -0
- package/dist/status-writer.js.map +1 -0
- package/dist/tui.d.ts +14 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +73 -0
- package/dist/tui.js.map +1 -0
- package/dist/updater.d.ts +27 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +191 -0
- package/dist/updater.js.map +1 -0
- package/dist/ws-client.d.ts +26 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +155 -0
- package/dist/ws-client.js.map +1 -0
- package/package.json +62 -0
package/dist/service.js
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { writeFileSync, unlinkSync, existsSync } from "node:fs";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { platform, homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const SERVICE_NAME = "tadaima-agent";
|
|
6
|
+
export function installService() {
|
|
7
|
+
const os = platform();
|
|
8
|
+
if (os === "linux") {
|
|
9
|
+
installSystemd();
|
|
10
|
+
}
|
|
11
|
+
else if (os === "darwin") {
|
|
12
|
+
installLaunchd();
|
|
13
|
+
}
|
|
14
|
+
else if (os === "win32") {
|
|
15
|
+
installWindows();
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.log(`Unsupported platform: ${os}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function uninstallService() {
|
|
22
|
+
const os = platform();
|
|
23
|
+
if (os === "linux") {
|
|
24
|
+
uninstallSystemd();
|
|
25
|
+
}
|
|
26
|
+
else if (os === "darwin") {
|
|
27
|
+
uninstallLaunchd();
|
|
28
|
+
}
|
|
29
|
+
else if (os === "win32") {
|
|
30
|
+
uninstallWindows();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(`Unsupported platform: ${os}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// ── Windows Service (sc.exe) ──────────────────────────────────
|
|
37
|
+
function installWindows() {
|
|
38
|
+
const execPath = process.execPath;
|
|
39
|
+
const scriptPath = process.argv[1];
|
|
40
|
+
const serviceName = "TadaimaAgent";
|
|
41
|
+
try {
|
|
42
|
+
execSync(`sc create ${serviceName} binPath= "\\"${execPath}\\" \\"${scriptPath}\\" start" start= auto DisplayName= "Tadaima Agent"`);
|
|
43
|
+
execSync(`sc description ${serviceName} "Tadaima media download agent"`);
|
|
44
|
+
// Recovery: restart on failure with escalating delays (5s, 10s, 30s)
|
|
45
|
+
execSync(`sc failure ${serviceName} reset= 60 actions= restart/5000/restart/10000/restart/30000`);
|
|
46
|
+
execSync(`sc start ${serviceName}`);
|
|
47
|
+
console.log(`Windows Service installed and started: ${serviceName}`);
|
|
48
|
+
console.log(` Status: sc query ${serviceName}`);
|
|
49
|
+
console.log(` Stop: sc stop ${serviceName}`);
|
|
50
|
+
console.log("");
|
|
51
|
+
console.log("Note: The service runs as LocalSystem by default. If it needs access");
|
|
52
|
+
console.log("to user directories, configure it to run as your user account:");
|
|
53
|
+
console.log(` sc config ${serviceName} obj= ".\\USERNAME" password= "PASSWORD"`);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error("Failed to install Windows Service. Try running as Administrator.", err instanceof Error ? err.message : "");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function uninstallWindows() {
|
|
60
|
+
const serviceName = "TadaimaAgent";
|
|
61
|
+
try {
|
|
62
|
+
execSync(`sc stop ${serviceName}`);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// May not be running
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
execSync(`sc delete ${serviceName}`);
|
|
69
|
+
console.log(`Windows Service removed: ${serviceName}`);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("Failed to uninstall Windows Service. Try running as Administrator.", err instanceof Error ? err.message : "");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ── systemd (Linux) ────────────────────────────────────────────
|
|
76
|
+
function installSystemd() {
|
|
77
|
+
const execPath = process.execPath;
|
|
78
|
+
const scriptPath = process.argv[1];
|
|
79
|
+
const user = process.env.USER ?? "root";
|
|
80
|
+
const unit = `[Unit]
|
|
81
|
+
Description=Tadaima Agent
|
|
82
|
+
After=network-online.target
|
|
83
|
+
Wants=network-online.target
|
|
84
|
+
|
|
85
|
+
[Service]
|
|
86
|
+
Type=simple
|
|
87
|
+
User=${user}
|
|
88
|
+
ExecStart=${execPath} ${scriptPath} start
|
|
89
|
+
Restart=on-failure
|
|
90
|
+
RestartSec=5
|
|
91
|
+
Environment=NODE_ENV=production
|
|
92
|
+
|
|
93
|
+
[Install]
|
|
94
|
+
WantedBy=multi-user.target
|
|
95
|
+
`;
|
|
96
|
+
const unitPath = `/etc/systemd/system/${SERVICE_NAME}.service`;
|
|
97
|
+
try {
|
|
98
|
+
writeFileSync(unitPath, unit);
|
|
99
|
+
execSync("systemctl daemon-reload");
|
|
100
|
+
execSync(`systemctl enable ${SERVICE_NAME}`);
|
|
101
|
+
execSync(`systemctl start ${SERVICE_NAME}`);
|
|
102
|
+
console.log(`Service installed and started: ${SERVICE_NAME}`);
|
|
103
|
+
console.log(` Status: systemctl status ${SERVICE_NAME}`);
|
|
104
|
+
console.log(` Logs: journalctl -u ${SERVICE_NAME} -f`);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error("Failed to install service. Try running with sudo.", err instanceof Error ? err.message : "");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function uninstallSystemd() {
|
|
111
|
+
const unitPath = `/etc/systemd/system/${SERVICE_NAME}.service`;
|
|
112
|
+
try {
|
|
113
|
+
execSync(`systemctl stop ${SERVICE_NAME}`).toString();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// May not be running
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
execSync(`systemctl disable ${SERVICE_NAME}`);
|
|
120
|
+
if (existsSync(unitPath))
|
|
121
|
+
unlinkSync(unitPath);
|
|
122
|
+
execSync("systemctl daemon-reload");
|
|
123
|
+
console.log(`Service removed: ${SERVICE_NAME}`);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.error("Failed to uninstall service. Try running with sudo.", err instanceof Error ? err.message : "");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ── launchd (macOS) ────────────────────────────────────────────
|
|
130
|
+
function installLaunchd() {
|
|
131
|
+
const execPath = process.execPath;
|
|
132
|
+
const scriptPath = process.argv[1];
|
|
133
|
+
const label = `com.tadaima.agent`;
|
|
134
|
+
const plistPath = join(homedir(), "Library/LaunchAgents", `${label}.plist`);
|
|
135
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
136
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
137
|
+
<plist version="1.0">
|
|
138
|
+
<dict>
|
|
139
|
+
<key>Label</key>
|
|
140
|
+
<string>${label}</string>
|
|
141
|
+
<key>ProgramArguments</key>
|
|
142
|
+
<array>
|
|
143
|
+
<string>${execPath}</string>
|
|
144
|
+
<string>${scriptPath}</string>
|
|
145
|
+
<string>start</string>
|
|
146
|
+
</array>
|
|
147
|
+
<key>RunAtLoad</key>
|
|
148
|
+
<true/>
|
|
149
|
+
<key>KeepAlive</key>
|
|
150
|
+
<true/>
|
|
151
|
+
<key>StandardOutPath</key>
|
|
152
|
+
<string>${join(homedir(), ".config/tadaima/logs/tadaima.log")}</string>
|
|
153
|
+
<key>StandardErrorPath</key>
|
|
154
|
+
<string>${join(homedir(), ".config/tadaima/logs/tadaima.log")}</string>
|
|
155
|
+
</dict>
|
|
156
|
+
</plist>
|
|
157
|
+
`;
|
|
158
|
+
try {
|
|
159
|
+
writeFileSync(plistPath, plist);
|
|
160
|
+
execSync(`launchctl load ${plistPath}`);
|
|
161
|
+
console.log(`Service installed and started: ${label}`);
|
|
162
|
+
console.log(` Plist: ${plistPath}`);
|
|
163
|
+
console.log(` Stop: launchctl unload ${plistPath}`);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
console.error("Failed to install service.", err instanceof Error ? err.message : "");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function uninstallLaunchd() {
|
|
170
|
+
const label = `com.tadaima.agent`;
|
|
171
|
+
const plistPath = join(homedir(), "Library/LaunchAgents", `${label}.plist`);
|
|
172
|
+
try {
|
|
173
|
+
execSync(`launchctl unload ${plistPath}`);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// May not be loaded
|
|
177
|
+
}
|
|
178
|
+
if (existsSync(plistPath)) {
|
|
179
|
+
unlinkSync(plistPath);
|
|
180
|
+
console.log(`Service removed: ${label}`);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log("Service not installed.");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtB,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,cAAc,EAAE,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtB,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;IACrB,CAAC;SAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,gBAAgB,EAAE,CAAC;IACrB,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,gBAAgB,EAAE,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,iEAAiE;AAEjE,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,cAAc,CAAC;IAEnC,IAAI,CAAC;QACH,QAAQ,CACN,aAAa,WAAW,iBAAiB,QAAQ,UAAU,UAAU,qDAAqD,CAC3H,CAAC;QACF,QAAQ,CACN,kBAAkB,WAAW,iCAAiC,CAC/D,CAAC;QACF,qEAAqE;QACrE,QAAQ,CACN,cAAc,WAAW,8DAA8D,CACxF,CAAC;QACF,QAAQ,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,0CAA0C,WAAW,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAe,WAAW,0CAA0C,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,kEAAkE,EAClE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,WAAW,GAAG,cAAc,CAAC;IAEnC,IAAI,CAAC;QACH,QAAQ,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,oEAAoE,EACpE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAElE,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;IAExC,MAAM,IAAI,GAAG;;;;;;;OAOR,IAAI;YACC,QAAQ,IAAI,UAAU;;;;;;;CAOjC,CAAC;IAEA,MAAM,QAAQ,GAAG,uBAAuB,YAAY,UAAU,CAAC;IAE/D,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9B,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACpC,QAAQ,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QAC7C,QAAQ,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,KAAK,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,mDAAmD,EACnD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,uBAAuB,YAAY,UAAU,CAAC;IAE/D,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,qDAAqD,EACrD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAElE,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,mBAAmB,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG;;;;;YAKJ,KAAK;;;cAGH,QAAQ;cACR,UAAU;;;;;;;;YAQZ,IAAI,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC;;YAEnD,IAAI,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC;;;CAG9D,CAAC;IAEA,IAAI,CAAC;QACH,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChC,QAAQ,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,4BAA4B,EAC5B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,mBAAmB,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,QAAQ,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAoBA,wBAAsB,QAAQ,kBA8F7B"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import prompts from "prompts";
|
|
2
|
+
import { hostname, platform } from "node:os";
|
|
3
|
+
import { config } from "./config.js";
|
|
4
|
+
function detectDeviceName() {
|
|
5
|
+
return hostname().toLowerCase().replace(/\.local$/, "");
|
|
6
|
+
}
|
|
7
|
+
function detectPlatform() {
|
|
8
|
+
const p = platform();
|
|
9
|
+
switch (p) {
|
|
10
|
+
case "darwin":
|
|
11
|
+
return "macos";
|
|
12
|
+
case "win32":
|
|
13
|
+
return "windows";
|
|
14
|
+
default:
|
|
15
|
+
return p;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function runSetup() {
|
|
19
|
+
console.log("\n Tadaima Agent Setup\n");
|
|
20
|
+
const { relayUrl } = await prompts({
|
|
21
|
+
type: "text",
|
|
22
|
+
name: "relayUrl",
|
|
23
|
+
message: "Relay URL",
|
|
24
|
+
initial: config.get("relay") || "http://localhost:3000",
|
|
25
|
+
validate: (v) => (v.startsWith("http") ? true : "Must start with http:// or https://"),
|
|
26
|
+
});
|
|
27
|
+
if (!relayUrl) {
|
|
28
|
+
console.log("Setup cancelled.");
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
const { code } = await prompts({
|
|
32
|
+
type: "text",
|
|
33
|
+
name: "code",
|
|
34
|
+
message: "Pairing code (from web app)",
|
|
35
|
+
validate: (v) => (v.length === 6 ? true : "Code must be 6 characters"),
|
|
36
|
+
});
|
|
37
|
+
if (!code) {
|
|
38
|
+
console.log("Setup cancelled.");
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
const deviceName = detectDeviceName();
|
|
42
|
+
const devicePlatform = detectPlatform();
|
|
43
|
+
console.log(`\n Pairing as "${deviceName}" (${devicePlatform})...`);
|
|
44
|
+
// Claim the pairing code
|
|
45
|
+
const res = await fetch(`${relayUrl}/api/devices/pair/claim`, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
headers: { "Content-Type": "application/json" },
|
|
48
|
+
body: JSON.stringify({
|
|
49
|
+
code: code.toUpperCase(),
|
|
50
|
+
name: deviceName,
|
|
51
|
+
platform: devicePlatform,
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
const err = (await res.json().catch(() => ({ detail: res.statusText })));
|
|
56
|
+
console.error(`\n Pairing failed: ${err.detail || err.error}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const { deviceId, deviceToken, rdApiKey, wsUrl } = (await res.json());
|
|
60
|
+
// Prompt for media directories
|
|
61
|
+
const { moviesDir } = await prompts({
|
|
62
|
+
type: "text",
|
|
63
|
+
name: "moviesDir",
|
|
64
|
+
message: "Movies directory",
|
|
65
|
+
initial: config.get("directories.movies") || "/mnt/media/Movies",
|
|
66
|
+
validate: (v) => v.trim().length > 0 && v.startsWith("/") ? true : "Must be a non-empty absolute path",
|
|
67
|
+
});
|
|
68
|
+
const { tvDir } = await prompts({
|
|
69
|
+
type: "text",
|
|
70
|
+
name: "tvDir",
|
|
71
|
+
message: "TV Shows directory",
|
|
72
|
+
initial: config.get("directories.tv") || "/mnt/media/TV",
|
|
73
|
+
validate: (v) => v.trim().length > 0 && v.startsWith("/") ? true : "Must be a non-empty absolute path",
|
|
74
|
+
});
|
|
75
|
+
if (!moviesDir || !tvDir) {
|
|
76
|
+
console.log("Setup cancelled.");
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}
|
|
79
|
+
// Save config
|
|
80
|
+
config.set("relay", relayUrl);
|
|
81
|
+
config.set("deviceToken", deviceToken);
|
|
82
|
+
config.set("deviceId", deviceId);
|
|
83
|
+
config.set("deviceName", deviceName);
|
|
84
|
+
config.set("directories.movies", moviesDir || "/mnt/media/Movies");
|
|
85
|
+
config.set("directories.tv", tvDir || "/mnt/media/TV");
|
|
86
|
+
config.set("directories.staging", "/tmp/tadaima/staging");
|
|
87
|
+
config.set("realDebrid.apiKey", rdApiKey);
|
|
88
|
+
console.log(`\n Connected! This device is now paired as "${deviceName}".`);
|
|
89
|
+
console.log(` Config saved to: ${config.path}`);
|
|
90
|
+
console.log(` WebSocket URL: ${wsUrl}\n`);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface AgentStatus {
|
|
2
|
+
pid: number;
|
|
3
|
+
version: string;
|
|
4
|
+
connected: boolean;
|
|
5
|
+
relay: string;
|
|
6
|
+
deviceName: string;
|
|
7
|
+
activeDownloads: number;
|
|
8
|
+
lastHeartbeat: string;
|
|
9
|
+
updateAvailable: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Atomically write the agent status file.
|
|
13
|
+
* The menu bar / tray app reads this file to display status.
|
|
14
|
+
*/
|
|
15
|
+
export declare function writeStatus(status: AgentStatus): void;
|
|
16
|
+
/**
|
|
17
|
+
* Remove the status file on shutdown so tray apps know the agent is stopped.
|
|
18
|
+
*/
|
|
19
|
+
export declare function removeStatus(): void;
|
|
20
|
+
//# sourceMappingURL=status-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-writer.d.ts","sourceRoot":"","sources":["../src/status-writer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAWrD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { writeFileSync, unlinkSync, renameSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { config } from "./config.js";
|
|
4
|
+
function getStatusPath() {
|
|
5
|
+
return join(dirname(config.path), "status.json");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Atomically write the agent status file.
|
|
9
|
+
* The menu bar / tray app reads this file to display status.
|
|
10
|
+
*/
|
|
11
|
+
export function writeStatus(status) {
|
|
12
|
+
const statusPath = getStatusPath();
|
|
13
|
+
const tmpPath = statusPath + ".tmp";
|
|
14
|
+
try {
|
|
15
|
+
mkdirSync(dirname(statusPath), { recursive: true });
|
|
16
|
+
writeFileSync(tmpPath, JSON.stringify(status, null, 2));
|
|
17
|
+
renameSync(tmpPath, statusPath);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Non-fatal — status file is for the tray app, not critical
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Remove the status file on shutdown so tray apps know the agent is stopped.
|
|
25
|
+
*/
|
|
26
|
+
export function removeStatus() {
|
|
27
|
+
try {
|
|
28
|
+
unlinkSync(getStatusPath());
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// File may not exist
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=status-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-writer.js","sourceRoot":"","sources":["../src/status-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAEpC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,CAAC"}
|
package/dist/tui.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class TUI {
|
|
2
|
+
private connected;
|
|
3
|
+
private profileName;
|
|
4
|
+
private version;
|
|
5
|
+
private interval;
|
|
6
|
+
private recentCompleted;
|
|
7
|
+
constructor(version: string);
|
|
8
|
+
setConnected(connected: boolean): void;
|
|
9
|
+
addCompleted(title: string, size: number): void;
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
private render;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AASA,qBAAa,GAAG;IACd,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,eAAe,CAAwB;gBAEnC,OAAO,EAAE,MAAM;IAK3B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/C,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,MAAM;CAkCf"}
|
package/dist/tui.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { freemem } from "node:os";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
export class TUI {
|
|
4
|
+
connected = false;
|
|
5
|
+
profileName = "";
|
|
6
|
+
version = "0.0.0";
|
|
7
|
+
interval = null;
|
|
8
|
+
recentCompleted = [];
|
|
9
|
+
constructor(version) {
|
|
10
|
+
this.version = version;
|
|
11
|
+
this.profileName = config.get("profileName") || "Unknown";
|
|
12
|
+
}
|
|
13
|
+
setConnected(connected) {
|
|
14
|
+
this.connected = connected;
|
|
15
|
+
}
|
|
16
|
+
addCompleted(title, size) {
|
|
17
|
+
this.recentCompleted.unshift({ title, size, completedAt: Date.now() });
|
|
18
|
+
if (this.recentCompleted.length > 5)
|
|
19
|
+
this.recentCompleted.pop();
|
|
20
|
+
}
|
|
21
|
+
start() {
|
|
22
|
+
// Hide cursor
|
|
23
|
+
process.stdout.write("\x1b[?25l");
|
|
24
|
+
this.render();
|
|
25
|
+
this.interval = setInterval(() => this.render(), 1000);
|
|
26
|
+
}
|
|
27
|
+
stop() {
|
|
28
|
+
if (this.interval)
|
|
29
|
+
clearInterval(this.interval);
|
|
30
|
+
// Show cursor
|
|
31
|
+
process.stdout.write("\x1b[?25h");
|
|
32
|
+
}
|
|
33
|
+
render() {
|
|
34
|
+
const lines = [];
|
|
35
|
+
const status = this.connected ? "Connected" : "Disconnected";
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push(` tadaima v${this.version} — ${status} to relay (${this.profileName})`);
|
|
38
|
+
lines.push(` ${"─".repeat(50)}`);
|
|
39
|
+
if (this.recentCompleted.length === 0) {
|
|
40
|
+
lines.push(` Waiting for downloads...`);
|
|
41
|
+
}
|
|
42
|
+
// Recently completed
|
|
43
|
+
for (const entry of this.recentCompleted) {
|
|
44
|
+
const ago = formatTimeAgo(entry.completedAt);
|
|
45
|
+
lines.push(` ✓ ${entry.title.padEnd(35)} ${formatSize(entry.size).padStart(10)} ただいま — completed ${ago}`);
|
|
46
|
+
}
|
|
47
|
+
lines.push(` ${"─".repeat(50)}`);
|
|
48
|
+
const diskFree = formatSize(freemem());
|
|
49
|
+
lines.push(` ${diskFree} free`);
|
|
50
|
+
lines.push("");
|
|
51
|
+
// Clear screen and write
|
|
52
|
+
process.stdout.write("\x1b[2J\x1b[H");
|
|
53
|
+
process.stdout.write(lines.join("\n"));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatSize(bytes) {
|
|
57
|
+
const gb = bytes / (1024 * 1024 * 1024);
|
|
58
|
+
if (gb >= 1)
|
|
59
|
+
return `${gb.toFixed(1)} GB`;
|
|
60
|
+
const mb = bytes / (1024 * 1024);
|
|
61
|
+
return `${mb.toFixed(0)} MB`;
|
|
62
|
+
}
|
|
63
|
+
function formatTimeAgo(timestamp) {
|
|
64
|
+
const diff = Date.now() - timestamp;
|
|
65
|
+
const secs = Math.floor(diff / 1000);
|
|
66
|
+
if (secs < 60)
|
|
67
|
+
return `${secs}s ago`;
|
|
68
|
+
const mins = Math.floor(secs / 60);
|
|
69
|
+
if (mins < 60)
|
|
70
|
+
return `${mins}m ago`;
|
|
71
|
+
return `${Math.floor(mins / 60)}h ago`;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=tui.js.map
|
package/dist/tui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface UpdateResult {
|
|
2
|
+
version: string;
|
|
3
|
+
downloadUrl: string;
|
|
4
|
+
checksumUrl: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Check the GitHub Releases API for a newer version.
|
|
8
|
+
* Returns null if already up-to-date or unsupported platform.
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkForUpdate(currentVersion: string): Promise<UpdateResult | null>;
|
|
11
|
+
/**
|
|
12
|
+
* Download, verify, and replace the current binary with the update.
|
|
13
|
+
*/
|
|
14
|
+
export declare function applyUpdate(update: UpdateResult): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if enough time has passed since the last update check.
|
|
17
|
+
*/
|
|
18
|
+
export declare function shouldCheckNow(trigger: "startup" | "periodic"): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Restore the previous binary from backup.
|
|
21
|
+
*/
|
|
22
|
+
export declare function rollback(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Log an update advisory for npm/Docker users who can't self-update.
|
|
25
|
+
*/
|
|
26
|
+
export declare function logUpdateAdvisory(currentVersion: string, latestVersion: string): void;
|
|
27
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AA2BD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiDzF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAUvE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAiB/B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAIrF"}
|