@aight-cool/aight-utils 0.1.15 → 0.1.18
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/{src/bootstrap.ts → dist/hooks/aight-bootstrap/handler.js} +54 -56
- package/dist/hooks/aight-bootstrap/handler.js.map +1 -0
- package/dist/index.js +3835 -0
- package/dist/index.js.map +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +7 -5
- package/hooks/aight-bootstrap/handler.ts +0 -34
- package/index.ts +0 -76
- package/src/config.ts +0 -126
- package/src/defaults.ts +0 -5
- package/src/groups.ts +0 -71
- package/src/health.ts +0 -95
- package/src/items.ts +0 -252
- package/src/push-hook.ts +0 -136
- package/src/push.ts +0 -242
- package/src/reminders.ts +0 -91
- package/src/version.ts +0 -95
package/src/reminders.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reminders Service — background service checking scheduled items every 30s
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
6
|
-
import type { AightConfig } from "./config.js";
|
|
7
|
-
import { loadItems, saveItems } from "./items.js";
|
|
8
|
-
import { sendPush, loadTokens } from "./push.js";
|
|
9
|
-
|
|
10
|
-
const CHECK_INTERVAL_MS = 30_000;
|
|
11
|
-
|
|
12
|
-
export function registerReminders(api: OpenClawPluginApi, config: AightConfig) {
|
|
13
|
-
let timer: ReturnType<typeof setInterval> | null = null;
|
|
14
|
-
|
|
15
|
-
async function checkReminders() {
|
|
16
|
-
const now = Date.now();
|
|
17
|
-
const items = loadItems();
|
|
18
|
-
let changed = false;
|
|
19
|
-
|
|
20
|
-
const dueItems = items.filter(
|
|
21
|
-
(i) =>
|
|
22
|
-
i.type === "trigger" &&
|
|
23
|
-
i.status === "active" &&
|
|
24
|
-
i.scheduledFor &&
|
|
25
|
-
new Date(i.scheduledFor).getTime() <= now,
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
if (dueItems.length === 0) return;
|
|
29
|
-
|
|
30
|
-
const tokens = loadTokens();
|
|
31
|
-
|
|
32
|
-
for (const item of dueItems) {
|
|
33
|
-
item.status = "fired";
|
|
34
|
-
item.updatedAt = new Date().toISOString();
|
|
35
|
-
changed = true;
|
|
36
|
-
|
|
37
|
-
api.logger.info(`[aight-utils] Trigger fired: ${item.title} (${item.id})`);
|
|
38
|
-
|
|
39
|
-
for (const device of tokens) {
|
|
40
|
-
try {
|
|
41
|
-
await sendPush(
|
|
42
|
-
device.deviceId,
|
|
43
|
-
{
|
|
44
|
-
title: "Reminder",
|
|
45
|
-
body: item.title,
|
|
46
|
-
data: { itemId: item.id, type: "trigger" },
|
|
47
|
-
},
|
|
48
|
-
config,
|
|
49
|
-
);
|
|
50
|
-
} catch (err) {
|
|
51
|
-
api.logger.error(
|
|
52
|
-
`[aight-utils] Push failed for ${device.deviceId}: ${
|
|
53
|
-
err instanceof Error ? err.message : String(err)
|
|
54
|
-
}`,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (changed) {
|
|
61
|
-
saveItems(items);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
api.registerService({
|
|
66
|
-
id: "aight-reminders",
|
|
67
|
-
start: () => {
|
|
68
|
-
if (config.today?.enabled === false) {
|
|
69
|
-
api.logger.info("[aight-utils] Today view disabled, skipping reminders service");
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
timer = setInterval(() => {
|
|
73
|
-
checkReminders().catch((err) => {
|
|
74
|
-
api.logger.error(
|
|
75
|
-
`[aight-utils] Reminder check error: ${
|
|
76
|
-
err instanceof Error ? err.message : String(err)
|
|
77
|
-
}`,
|
|
78
|
-
);
|
|
79
|
-
});
|
|
80
|
-
}, CHECK_INTERVAL_MS);
|
|
81
|
-
api.logger.info("[aight-utils] Reminders service started (30s interval)");
|
|
82
|
-
},
|
|
83
|
-
stop: () => {
|
|
84
|
-
if (timer) {
|
|
85
|
-
clearInterval(timer);
|
|
86
|
-
timer = null;
|
|
87
|
-
}
|
|
88
|
-
api.logger.info("[aight-utils] Reminders service stopped");
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
}
|
package/src/version.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version RPC — aight.version
|
|
3
|
-
*
|
|
4
|
-
* Returns current installed version and latest available on npm.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { OpenClawPluginApi, GatewayRequestHandlerOptions } from "openclaw/plugin-sdk";
|
|
8
|
-
import { execSync } from "node:child_process";
|
|
9
|
-
import { createRequire } from "node:module";
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
import { join, dirname } from "node:path";
|
|
12
|
-
import { fileURLToPath } from "node:url";
|
|
13
|
-
|
|
14
|
-
let cachedVersion: string | null = null;
|
|
15
|
-
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
16
|
-
|
|
17
|
-
function getCurrentVersion(): string {
|
|
18
|
-
if (cachedVersion) return cachedVersion;
|
|
19
|
-
try {
|
|
20
|
-
const dir = dirname(fileURLToPath(import.meta.url));
|
|
21
|
-
const pkg = JSON.parse(readFileSync(join(dir, "..", "package.json"), "utf8"));
|
|
22
|
-
cachedVersion = pkg.version ?? "unknown";
|
|
23
|
-
} catch {
|
|
24
|
-
cachedVersion = "unknown";
|
|
25
|
-
}
|
|
26
|
-
return cachedVersion!;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let cachedGatewayVersion: string | null = null;
|
|
30
|
-
|
|
31
|
-
function getGatewayVersion(): string {
|
|
32
|
-
if (cachedGatewayVersion) return cachedGatewayVersion;
|
|
33
|
-
try {
|
|
34
|
-
const out = execSync("openclaw --version", { timeout: 5000 }).toString().trim();
|
|
35
|
-
cachedGatewayVersion = out || "unknown";
|
|
36
|
-
} catch {
|
|
37
|
-
// Try to find openclaw's package.json via require.resolve
|
|
38
|
-
try {
|
|
39
|
-
const require_ = createRequire(import.meta.url);
|
|
40
|
-
const resolved = require_.resolve("openclaw");
|
|
41
|
-
const pkgPath = join(dirname(resolved), "package.json");
|
|
42
|
-
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
43
|
-
cachedGatewayVersion = pkg.version ?? "unknown";
|
|
44
|
-
} catch {
|
|
45
|
-
cachedGatewayVersion = "unknown";
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return cachedGatewayVersion!;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const npmCache = new Map<string, { version: string; checkedAt: number }>();
|
|
52
|
-
|
|
53
|
-
async function getLatestNpmVersion(pkg: string): Promise<string> {
|
|
54
|
-
const cached = npmCache.get(pkg);
|
|
55
|
-
if (cached && Date.now() - cached.checkedAt < CACHE_TTL_MS) {
|
|
56
|
-
return cached.version;
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`, {
|
|
60
|
-
headers: { accept: "application/json" },
|
|
61
|
-
signal: AbortSignal.timeout(5000),
|
|
62
|
-
});
|
|
63
|
-
if (!res.ok) return "unknown";
|
|
64
|
-
const data = (await res.json()) as { version?: string };
|
|
65
|
-
const version = data.version ?? "unknown";
|
|
66
|
-
npmCache.set(pkg, { version, checkedAt: Date.now() });
|
|
67
|
-
return version;
|
|
68
|
-
} catch {
|
|
69
|
-
return cached?.version ?? "unknown";
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function registerVersion(api: OpenClawPluginApi) {
|
|
74
|
-
api.registerGatewayMethod("aight.version", async ({ respond }: GatewayRequestHandlerOptions) => {
|
|
75
|
-
try {
|
|
76
|
-
const current = getCurrentVersion();
|
|
77
|
-
const latest = await getLatestNpmVersion("@aight-cool/aight-utils");
|
|
78
|
-
const gateway = getGatewayVersion();
|
|
79
|
-
const gatewayLatest = await getLatestNpmVersion("openclaw");
|
|
80
|
-
respond(true, {
|
|
81
|
-
current,
|
|
82
|
-
latest,
|
|
83
|
-
updateAvailable: latest !== "unknown" && current !== latest,
|
|
84
|
-
gatewayVersion: gateway,
|
|
85
|
-
gatewayLatest,
|
|
86
|
-
gatewayUpdateAvailable:
|
|
87
|
-
gatewayLatest !== "unknown" && gateway !== "unknown" && gateway !== gatewayLatest,
|
|
88
|
-
});
|
|
89
|
-
} catch (err) {
|
|
90
|
-
respond(false, {
|
|
91
|
-
error: err instanceof Error ? err.message : String(err),
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|