@justfortytwo/scheduler 1.0.1 → 1.0.2
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 +3 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +33 -18
- package/dist/index.js.map +1 -1
- package/dist/telegram-push.d.ts +46 -0
- package/dist/telegram-push.js +54 -0
- package/dist/telegram-push.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,7 +81,9 @@ Then: `systemctl enable --now fortytwo-scheduler`
|
|
|
81
81
|
| `CLAUDE_BIN` | no | Path to the `claude` CLI binary the runner spawns (default: `claude` on `PATH`) |
|
|
82
82
|
| `FORTYTWO_TURN_TIMEOUT` | no | Per-turn timeout in seconds for a spawned `claude` run (default: `300`) |
|
|
83
83
|
| `TELEGRAM_BOT_TOKEN` | optional | Telegram bot token — enables push notifications to Telegram |
|
|
84
|
-
| `ALLOWED_CHAT_IDS` | optional | Comma-separated Telegram chat IDs
|
|
84
|
+
| `ALLOWED_CHAT_IDS` | optional | Comma-separated Telegram chat IDs; when set, notifications go to the **first** id. When unset, they go to every chat paired with `fortytwo pair` |
|
|
85
|
+
| `FORTYTWO_ROOT` | no | Project root used to find the Telegram bindings db (default: the working directory) |
|
|
86
|
+
| `TELEGRAM_BINDINGS_DB` | no | Bindings db path, relative to the root (default: `state/telegram-bindings.db`); must match the bridge |
|
|
85
87
|
|
|
86
88
|
### Liveness / `fortytwo doctor`
|
|
87
89
|
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export type { RecurringDef, RegistryDeps } from './handlers/index.js';
|
|
|
11
11
|
export { seedRecurring } from './seed.js';
|
|
12
12
|
export type { SeedStore } from './seed.js';
|
|
13
13
|
export { heartbeatPath, writeHeartbeat } from './heartbeat.js';
|
|
14
|
+
export { bindingChatIds, bindingsDbPath, createTelegramPushNotifier, pushTargets } from './telegram-push.js';
|
|
15
|
+
export type { BoundChat } from './telegram-push.js';
|
|
14
16
|
export { ONEIROS_DEF, seedOneiros, makeOneirosHandler } from './oneiros.js';
|
|
15
17
|
export { loadTranscriptSource } from './oneiros.js';
|
|
16
18
|
export { loadConversationLog, noopConversationLog } from './conversation-log.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { mkdirSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { bindingsDbPath, createTelegramPushNotifier, pushTargets } from './telegram-push.js';
|
|
4
6
|
export { createRegistry } from './registry.js';
|
|
5
7
|
export { tick, backoffAt, RETRY_BACKOFF_MIN } from './tick.js';
|
|
6
8
|
// Phase 3 re-exports.
|
|
@@ -11,6 +13,8 @@ export { RECURRING_DEFS, buildRegistry } from './handlers/index.js';
|
|
|
11
13
|
export { seedRecurring } from './seed.js';
|
|
12
14
|
// Phase 6 re-exports.
|
|
13
15
|
export { heartbeatPath, writeHeartbeat } from './heartbeat.js';
|
|
16
|
+
// Phase 7 re-exports.
|
|
17
|
+
export { bindingChatIds, bindingsDbPath, createTelegramPushNotifier, pushTargets } from './telegram-push.js';
|
|
14
18
|
// ---------------------------------------------------------------------------
|
|
15
19
|
// Bin guard — boot the daemon ONLY when this file is the direct entrypoint.
|
|
16
20
|
// Mirrors telegram/src/bridge.ts `invokedAsBin()` exactly so importing this
|
|
@@ -30,29 +34,40 @@ function invokedAsBin() {
|
|
|
30
34
|
if (invokedAsBin()) {
|
|
31
35
|
const { startDaemon: boot } = await import('./daemon.js');
|
|
32
36
|
const dbPath = process.env['DB_PATH'] ?? 'fortytwo.db';
|
|
33
|
-
// Optional Telegram push: when TELEGRAM_BOT_TOKEN
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// journal write.
|
|
37
|
+
// Optional Telegram push: when TELEGRAM_BOT_TOKEN is set, wire a Telegram
|
|
38
|
+
// notifier so the daemon pushes notifications to Telegram in addition to the
|
|
39
|
+
// journal write. Without the token, only the journal notifier is active.
|
|
37
40
|
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
41
|
+
// Target chats (see ./telegram-push.ts): the first id of ALLOWED_CHAT_IDS
|
|
42
|
+
// (comma-separated, same format as the bridge) when it is set; otherwise the
|
|
43
|
+
// chats paired via `fortytwo pair`, read from the bridge's bindings db on
|
|
44
|
+
// every notification. The bindings db is opened only in that second case.
|
|
42
45
|
const extraNotifiers = await (async () => {
|
|
43
46
|
const token = process.env['TELEGRAM_BOT_TOKEN'];
|
|
44
|
-
|
|
45
|
-
if (!token || !chatIdsRaw)
|
|
47
|
+
if (!token)
|
|
46
48
|
return [];
|
|
47
49
|
try {
|
|
48
50
|
// Lazy import so scheduler can run without @justfortytwo/telegram installed.
|
|
49
|
-
const { Telegram, parseAllowed,
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
const { Telegram, parseAllowed, SqliteBindingStore } = await import('@justfortytwo/telegram');
|
|
52
|
+
const allowed = parseAllowed(process.env['ALLOWED_CHAT_IDS']);
|
|
53
|
+
let listBindings = () => [];
|
|
54
|
+
if (allowed.size === 0) {
|
|
55
|
+
const root = resolve(process.env['FORTYTWO_ROOT'] ?? process.cwd());
|
|
56
|
+
const path = bindingsDbPath(root, process.env['TELEGRAM_BINDINGS_DB']);
|
|
57
|
+
// Same as the bridge: the db may not exist yet on a fresh install.
|
|
58
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
59
|
+
const store = new SqliteBindingStore(path);
|
|
60
|
+
listBindings = () => store.list('telegram');
|
|
61
|
+
}
|
|
62
|
+
const tg = new Telegram(token, allowed);
|
|
63
|
+
return [createTelegramPushNotifier({
|
|
64
|
+
targets: pushTargets({ staticChatIds: [...allowed], listBindings }),
|
|
65
|
+
send: (id, text) => tg.sendMessage(id, text).then(() => undefined),
|
|
66
|
+
onError: (chatId, err) => {
|
|
67
|
+
const where = chatId === null ? 'resolving target chats' : `chat ${chatId}`;
|
|
68
|
+
process.stderr.write(`fortytwo-scheduler: Telegram push failed (${where}): ${err?.message ?? err}\n`);
|
|
69
|
+
},
|
|
70
|
+
})];
|
|
56
71
|
}
|
|
57
72
|
catch (e) {
|
|
58
73
|
process.stderr.write(`fortytwo-scheduler: Telegram notifier wiring failed: ${e?.message ?? e} — journal-only\n`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Notifier } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Telegram push for scheduler notifications: decides WHICH chats receive a
|
|
4
|
+
* notification and delivers it. Transport and the binding store stay in
|
|
5
|
+
* `@justfortytwo/telegram`; everything here takes them as injected functions,
|
|
6
|
+
* so this module never imports that optional peer.
|
|
7
|
+
*
|
|
8
|
+
* Target policy:
|
|
9
|
+
* - `ALLOWED_CHAT_IDS` set -> its first id (the original, explicit behaviour).
|
|
10
|
+
* - `ALLOWED_CHAT_IDS` empty -> every chat paired with `fortytwo pair` /
|
|
11
|
+
* `/login <code>`, read again for each notification so pairing or unbinding
|
|
12
|
+
* takes effect without restarting the daemon.
|
|
13
|
+
*/
|
|
14
|
+
/** The only binding field this module needs (structural, mirrors telegram's `Binding`). */
|
|
15
|
+
export interface BoundChat {
|
|
16
|
+
channelUserId: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Chat ids of the bound PRIVATE chats. Group/channel ids are negative and are
|
|
20
|
+
* never an owner chat (same rule as telegram's `isAuthorized`), so they are
|
|
21
|
+
* dropped along with anything that is not a positive integer.
|
|
22
|
+
*/
|
|
23
|
+
export declare function bindingChatIds(bindings: BoundChat[]): number[];
|
|
24
|
+
/** Builds the per-notification target resolver described in the module header. */
|
|
25
|
+
export declare function pushTargets(opts: {
|
|
26
|
+
/** Parsed `ALLOWED_CHAT_IDS`, in the order written. May be empty. */
|
|
27
|
+
staticChatIds: number[];
|
|
28
|
+
/** Reads the current Telegram bindings. Only called when `staticChatIds` is empty. */
|
|
29
|
+
listBindings: () => BoundChat[];
|
|
30
|
+
}): () => number[];
|
|
31
|
+
/**
|
|
32
|
+
* Notifier that pushes each notification to every current target. It never
|
|
33
|
+
* throws: a chat that fails is reported through `onError` and the remaining
|
|
34
|
+
* chats are still tried. `chatId` is null when resolving the targets failed.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createTelegramPushNotifier(opts: {
|
|
37
|
+
targets: () => number[];
|
|
38
|
+
send: (chatId: number, text: string) => Promise<void>;
|
|
39
|
+
onError: (chatId: number | null, err: unknown) => void;
|
|
40
|
+
}): Notifier;
|
|
41
|
+
/**
|
|
42
|
+
* Path of the Telegram bindings db. MUST match the bridge and `fortytwo pair`
|
|
43
|
+
* (`<root>/state/telegram-bindings.db`, overridable via `TELEGRAM_BINDINGS_DB`
|
|
44
|
+
* resolved against the root), or the scheduler would read a db nobody writes.
|
|
45
|
+
*/
|
|
46
|
+
export declare function bindingsDbPath(root: string, custom: string | undefined): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Chat ids of the bound PRIVATE chats. Group/channel ids are negative and are
|
|
4
|
+
* never an owner chat (same rule as telegram's `isAuthorized`), so they are
|
|
5
|
+
* dropped along with anything that is not a positive integer.
|
|
6
|
+
*/
|
|
7
|
+
export function bindingChatIds(bindings) {
|
|
8
|
+
return bindings
|
|
9
|
+
.map((b) => (/^\d+$/.test(b.channelUserId) ? Number(b.channelUserId) : NaN))
|
|
10
|
+
.filter((id) => Number.isSafeInteger(id) && id > 0);
|
|
11
|
+
}
|
|
12
|
+
/** Builds the per-notification target resolver described in the module header. */
|
|
13
|
+
export function pushTargets(opts) {
|
|
14
|
+
const first = opts.staticChatIds[0];
|
|
15
|
+
if (first !== undefined)
|
|
16
|
+
return () => [first];
|
|
17
|
+
return () => bindingChatIds(opts.listBindings());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Notifier that pushes each notification to every current target. It never
|
|
21
|
+
* throws: a chat that fails is reported through `onError` and the remaining
|
|
22
|
+
* chats are still tried. `chatId` is null when resolving the targets failed.
|
|
23
|
+
*/
|
|
24
|
+
export function createTelegramPushNotifier(opts) {
|
|
25
|
+
return {
|
|
26
|
+
async notify(n) {
|
|
27
|
+
let chatIds;
|
|
28
|
+
try {
|
|
29
|
+
chatIds = opts.targets();
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
opts.onError(null, err);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const chatId of chatIds) {
|
|
36
|
+
try {
|
|
37
|
+
await opts.send(chatId, n.text);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
opts.onError(chatId, err);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Path of the Telegram bindings db. MUST match the bridge and `fortytwo pair`
|
|
48
|
+
* (`<root>/state/telegram-bindings.db`, overridable via `TELEGRAM_BINDINGS_DB`
|
|
49
|
+
* resolved against the root), or the scheduler would read a db nobody writes.
|
|
50
|
+
*/
|
|
51
|
+
export function bindingsDbPath(root, custom) {
|
|
52
|
+
return custom ? resolve(root, custom) : resolve(root, 'state', 'telegram-bindings.db');
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=telegram-push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-push.js","sourceRoot":"","sources":["../src/telegram-push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAqB;IAClD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3E,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAK3B;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAI1C;IACC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,CAAe;YAC1B,IAAI,OAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAA0B;IACrE,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;AACzF,CAAC"}
|
package/package.json
CHANGED