@aight-cool/aight-utils 0.1.20 → 0.1.21

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.
Files changed (48) hide show
  1. package/dist/hooks/aight-bootstrap/HOOK.md +20 -0
  2. package/dist/hooks/aight-bootstrap/handler.d.ts +19 -0
  3. package/dist/hooks/aight-bootstrap/handler.js +16 -266
  4. package/dist/hooks/aight-bootstrap/handler.js.map +1 -1
  5. package/dist/index.d.ts +42 -0
  6. package/dist/index.js +63 -3799
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/bootstrap.d.ts +6 -0
  9. package/dist/src/bootstrap.js +267 -0
  10. package/dist/src/bootstrap.js.map +1 -0
  11. package/dist/src/config.d.ts +18 -0
  12. package/dist/src/config.js +100 -0
  13. package/dist/src/config.js.map +1 -0
  14. package/dist/src/defaults.d.ts +4 -0
  15. package/dist/src/defaults.js +5 -0
  16. package/dist/src/defaults.js.map +1 -0
  17. package/dist/src/groups.d.ts +10 -0
  18. package/dist/src/groups.js +61 -0
  19. package/dist/src/groups.js.map +1 -0
  20. package/dist/src/health.d.ts +8 -0
  21. package/dist/src/health.js +58 -0
  22. package/dist/src/health.js.map +1 -0
  23. package/dist/src/items.d.ts +51 -0
  24. package/dist/src/items.js +208 -0
  25. package/dist/src/items.js.map +1 -0
  26. package/dist/src/notif-prefs.d.ts +26 -0
  27. package/dist/src/notif-prefs.js +96 -0
  28. package/dist/src/notif-prefs.js.map +1 -0
  29. package/dist/src/push-hook.d.ts +5 -0
  30. package/dist/src/push-hook.js +131 -0
  31. package/dist/src/push-hook.js.map +1 -0
  32. package/dist/src/push-net.d.ts +17 -0
  33. package/dist/src/push-net.js +58 -0
  34. package/dist/src/push-net.js.map +1 -0
  35. package/dist/src/push-store.d.ts +15 -0
  36. package/dist/src/push-store.js +45 -0
  37. package/dist/src/push-store.js.map +1 -0
  38. package/dist/src/push.d.ts +16 -0
  39. package/dist/src/push.js +86 -0
  40. package/dist/src/push.js.map +1 -0
  41. package/dist/src/reminders.d.ts +6 -0
  42. package/dist/src/reminders.js +66 -0
  43. package/dist/src/reminders.js.map +1 -0
  44. package/dist/src/version.d.ts +8 -0
  45. package/dist/src/version.js +52 -0
  46. package/dist/src/version.js.map +1 -0
  47. package/openclaw.plugin.json +1 -1
  48. package/package.json +2 -2
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Push Notifications — aight.push.register, aight.push.unregister, aight.push.test
3
+ *
4
+ * Auth model: the relay has a master secret. During device registration, the
5
+ * plugin calls relay /register with the device push token. The relay returns
6
+ * a sendKey = HMAC(masterSecret, pushToken). The plugin stores the sendKey
7
+ * alongside the device token. When sending a push, the plugin includes the
8
+ * sendKey. The relay recomputes the HMAC and verifies — zero state, no shared secrets.
9
+ */
10
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
11
+ import type { AightConfig } from "./config.js";
12
+ export { loadTokens, saveTokens, registerToken, unregisterToken } from "./push-store.js";
13
+ export { sendPush, obtainSendKey } from "./push-net.js";
14
+ export type { DeviceToken } from "./push-store.js";
15
+ export type { PushPayload } from "./push-net.js";
16
+ export declare function registerPush(api: OpenClawPluginApi, _config: AightConfig): void;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Push Notifications — aight.push.register, aight.push.unregister, aight.push.test
3
+ *
4
+ * Auth model: the relay has a master secret. During device registration, the
5
+ * plugin calls relay /register with the device push token. The relay returns
6
+ * a sendKey = HMAC(masterSecret, pushToken). The plugin stores the sendKey
7
+ * alongside the device token. When sending a push, the plugin includes the
8
+ * sendKey. The relay recomputes the HMAC and verifies — zero state, no shared secrets.
9
+ */
10
+ import { DEFAULT_RELAY_URL } from "./defaults.js";
11
+ import { loadTokens, registerToken, unregisterToken } from "./push-store.js";
12
+ import { obtainSendKey, sendPush } from "./push-net.js";
13
+ // Re-export for consumers
14
+ export { loadTokens, saveTokens, registerToken, unregisterToken } from "./push-store.js";
15
+ export { sendPush, obtainSendKey } from "./push-net.js";
16
+ // ── Registration ──
17
+ export function registerPush(api, _config) {
18
+ api.registerGatewayMethod("aight.push.register", ({ params, respond }) => {
19
+ if (!params ||
20
+ typeof params !== "object" ||
21
+ typeof params.deviceId !== "string" ||
22
+ typeof params.pushToken !== "string" ||
23
+ (params.platform !== "ios" && params.platform !== "android")) {
24
+ respond(false, { error: "deviceId, pushToken, and platform (ios|android) required" });
25
+ return;
26
+ }
27
+ const deviceId = params.deviceId;
28
+ const pushToken = params.pushToken;
29
+ const platform = params.platform;
30
+ const sandbox = !!params.sandbox;
31
+ // Register immediately (respond fast)
32
+ registerToken({
33
+ deviceId,
34
+ pushToken,
35
+ platform,
36
+ sandbox,
37
+ registeredAt: new Date().toISOString(),
38
+ });
39
+ respond(true, { ok: true, deviceId });
40
+ api.logger.info(`[aight-utils] Push token registered for device ${deviceId}`);
41
+ // Obtain sendKey from relay in background
42
+ const relayUrl = _config.push?.relayUrl ?? DEFAULT_RELAY_URL;
43
+ obtainSendKey(relayUrl, pushToken)
44
+ .then((sendKey) => {
45
+ // Update the token with the sendKey
46
+ registerToken({
47
+ deviceId,
48
+ pushToken,
49
+ platform,
50
+ sandbox,
51
+ sendKey,
52
+ registeredAt: new Date().toISOString(),
53
+ });
54
+ api.logger.info(`[aight-utils] sendKey obtained for device ${deviceId}`);
55
+ })
56
+ .catch((err) => {
57
+ const msg = err instanceof Error ? err.message : String(err);
58
+ api.logger.warn(`[aight-utils] Failed to obtain sendKey: ${msg}`);
59
+ });
60
+ });
61
+ api.registerGatewayMethod("aight.push.unregister", ({ params, respond }) => {
62
+ const deviceId = typeof params?.deviceId === "string" ? params.deviceId : "";
63
+ if (!deviceId) {
64
+ respond(false, { error: "deviceId required" });
65
+ return;
66
+ }
67
+ const ok = unregisterToken(deviceId);
68
+ respond(true, { ok, deviceId });
69
+ });
70
+ api.registerGatewayMethod("aight.push.test", async ({ params, respond }) => {
71
+ const deviceId = typeof params?.deviceId === "string" ? params.deviceId : "";
72
+ const tokens = loadTokens();
73
+ const device = deviceId ? tokens.find((t) => t.deviceId === deviceId) : tokens[0];
74
+ if (!device) {
75
+ respond(false, { error: "No registered device" });
76
+ return;
77
+ }
78
+ // Test always sends a visible push regardless of privacy mode
79
+ const result = await sendPush(device, {
80
+ title: "Aight 🤙",
81
+ body: "Push notifications are working!",
82
+ }, { ..._config, push: { ..._config.push, mode: "rich" } });
83
+ respond(true, result);
84
+ });
85
+ }
86
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reminders Service — background service checking scheduled items every 30s
3
+ */
4
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
5
+ import type { AightConfig } from "./config.js";
6
+ export declare function registerReminders(api: OpenClawPluginApi, config: AightConfig): void;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Reminders Service — background service checking scheduled items every 30s
3
+ */
4
+ import { loadItems, saveItems } from "./items.js";
5
+ import { loadTokens } from "./push-store.js";
6
+ import { sendPush } from "./push-net.js";
7
+ const CHECK_INTERVAL_MS = 30_000;
8
+ export function registerReminders(api, config) {
9
+ let timer = null;
10
+ async function checkReminders() {
11
+ const now = Date.now();
12
+ const items = loadItems();
13
+ let changed = false;
14
+ const dueItems = items.filter((i) => i.type === "trigger" &&
15
+ i.status === "active" &&
16
+ i.scheduledFor &&
17
+ new Date(i.scheduledFor).getTime() <= now);
18
+ if (dueItems.length === 0)
19
+ return;
20
+ const tokens = loadTokens();
21
+ for (const item of dueItems) {
22
+ item.status = "fired";
23
+ item.updatedAt = new Date().toISOString();
24
+ changed = true;
25
+ api.logger.info(`[aight-utils] Trigger fired: ${item.title} (${item.id})`);
26
+ for (const device of tokens) {
27
+ try {
28
+ await sendPush(device, {
29
+ title: "Reminder",
30
+ body: item.title,
31
+ data: { itemId: item.id, type: "trigger" },
32
+ }, config);
33
+ }
34
+ catch (err) {
35
+ api.logger.error(`[aight-utils] Push failed for ${device.deviceId}: ${err instanceof Error ? err.message : String(err)}`);
36
+ }
37
+ }
38
+ }
39
+ if (changed) {
40
+ saveItems(items);
41
+ }
42
+ }
43
+ api.registerService({
44
+ id: "aight-reminders",
45
+ start: () => {
46
+ if (config.today?.enabled === false) {
47
+ api.logger.info("[aight-utils] Today view disabled, skipping reminders service");
48
+ return;
49
+ }
50
+ timer = setInterval(() => {
51
+ checkReminders().catch((err) => {
52
+ api.logger.error(`[aight-utils] Reminder check error: ${err instanceof Error ? err.message : String(err)}`);
53
+ });
54
+ }, CHECK_INTERVAL_MS);
55
+ api.logger.info("[aight-utils] Reminders service started (30s interval)");
56
+ },
57
+ stop: () => {
58
+ if (timer) {
59
+ clearInterval(timer);
60
+ timer = null;
61
+ }
62
+ api.logger.info("[aight-utils] Reminders service stopped");
63
+ },
64
+ });
65
+ }
66
+ //# sourceMappingURL=reminders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminders.js","sourceRoot":"","sources":["../../src/reminders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,GAAsB,EAAE,MAAmB;IAC3E,IAAI,KAAK,GAA0C,IAAI,CAAC;IAExD,KAAK,UAAU,cAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,SAAS;YACpB,CAAC,CAAC,MAAM,KAAK,QAAQ;YACrB,CAAC,CAAC,YAAY;YACd,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAC5C,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC;YAEf,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAE3E,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,QAAQ,CACZ,MAAM,EACN;wBACE,KAAK,EAAE,UAAU;wBACjB,IAAI,EAAE,IAAI,CAAC,KAAK;wBAChB,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAC3C,EACD,MAAM,CACP,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,iCAAiC,MAAM,CAAC,QAAQ,KAC9C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,eAAe,CAAC;QAClB,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;gBACpC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YACD,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,uCACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Version RPC — aight.version
3
+ *
4
+ * Returns current installed version and latest available on npm.
5
+ * Uses Node built-ins only (no child_process).
6
+ */
7
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
8
+ export declare function registerVersion(api: OpenClawPluginApi): void;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Version RPC — aight.version
3
+ *
4
+ * Returns current installed version and latest available on npm.
5
+ * Uses Node built-ins only (no child_process).
6
+ */
7
+ /** Updated by scripts/release.sh — do not edit manually. */
8
+ const VERSION = "0.1.21";
9
+ const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
10
+ const npmCache = new Map();
11
+ async function getLatestNpmVersion(pkg) {
12
+ const cached = npmCache.get(pkg);
13
+ if (cached && Date.now() - cached.checkedAt < CACHE_TTL_MS) {
14
+ return cached.version;
15
+ }
16
+ try {
17
+ const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkg)}/latest`, {
18
+ headers: { accept: "application/json" },
19
+ signal: AbortSignal.timeout(5000),
20
+ });
21
+ if (!res.ok)
22
+ return "unknown";
23
+ const data = (await res.json());
24
+ const version = data.version ?? "unknown";
25
+ npmCache.set(pkg, { version, checkedAt: Date.now() });
26
+ return version;
27
+ }
28
+ catch {
29
+ return cached?.version ?? "unknown";
30
+ }
31
+ }
32
+ export function registerVersion(api) {
33
+ api.registerGatewayMethod("aight.version", async ({ respond }) => {
34
+ try {
35
+ const current = VERSION;
36
+ const latest = await getLatestNpmVersion("@aight-cool/aight-utils");
37
+ const gatewayLatest = await getLatestNpmVersion("openclaw");
38
+ respond(true, {
39
+ current,
40
+ latest,
41
+ updateAvailable: latest !== "unknown" && current !== latest,
42
+ gatewayLatest,
43
+ });
44
+ }
45
+ catch (err) {
46
+ respond(false, {
47
+ error: err instanceof Error ? err.message : String(err),
48
+ });
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,4DAA4D;AAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEzB,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;AAE3E,KAAK,UAAU,mBAAmB,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE;YACtF,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAsB;IACpD,GAAG,CAAC,qBAAqB,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,OAAO,EAAgC,EAAE,EAAE;QAC7F,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,EAAE;gBACZ,OAAO;gBACP,MAAM;gBACN,eAAe,EAAE,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM;gBAC3D,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,EAAE;gBACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -2,7 +2,7 @@
2
2
  "id": "aight-utils",
3
3
  "name": "Aight App Utils",
4
4
  "description": "Aight App: Push notifications, Today items, config RPC, and agent bootstrap",
5
- "version": "0.1.20",
5
+ "version": "0.1.21",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aight-cool/aight-utils",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "OpenClaw gateway plugin for Aight App: push notifications, Today items, config RPC, and agent bootstrap",
5
5
  "type": "module",
6
6
  "files": [
@@ -28,7 +28,7 @@
28
28
  "lint": "eslint . --ext .ts",
29
29
  "format": "prettier --check .",
30
30
  "format:fix": "prettier --write .",
31
- "build": "tsup",
31
+ "build": "tsc && cp hooks/aight-bootstrap/HOOK.md dist/hooks/aight-bootstrap/",
32
32
  "prepublishOnly": "npm run build",
33
33
  "ci": "npm run typecheck && npm run lint && npm run format && npm test"
34
34
  },