@justfortytwo/scheduler 1.0.0-2 → 1.0.0-4
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 +21 -0
- package/dist/conversation-log.d.ts +18 -0
- package/dist/conversation-log.js +20 -0
- package/dist/conversation-log.js.map +1 -0
- package/dist/daemon.d.ts +13 -9
- package/dist/daemon.js +38 -20
- package/dist/daemon.js.map +1 -1
- package/dist/handlers/index.d.ts +2 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/notifier.d.ts +3 -3
- package/dist/notifier.js +3 -3
- package/dist/oneiros.d.ts +19 -0
- package/dist/oneiros.js +77 -0
- package/dist/oneiros.js.map +1 -0
- package/package.json +9 -4
package/README.md
CHANGED
|
@@ -90,3 +90,24 @@ On boot and on every 30-second poll tick — even while a previous tick is still
|
|
|
90
90
|
## License
|
|
91
91
|
|
|
92
92
|
MIT © 2026 Enrico Deleo
|
|
93
|
+
|
|
94
|
+
## Oneiros maintenance
|
|
95
|
+
|
|
96
|
+
`persona.oneiros` runs daily at `17 3 * * *` UTC, with null payload and the existing
|
|
97
|
+
durable retry/claim mechanism. Installer seeds it after initializing persona's
|
|
98
|
+
checkpoint; daemon boot reconciles the same job when the checkpoint exists.
|
|
99
|
+
The cheap gate checks the memory head and, when the optional `@justfortytwo/transcript`
|
|
100
|
+
peer is installed, the transcript head. Persona validates and applies additions;
|
|
101
|
+
scheduler runs the private prompt through runner in an isolated temporary cwd.
|
|
102
|
+
No tools, MCP, skills or session persistence are enabled, and maintenance emits
|
|
103
|
+
no notification into memory. Authentication/provider configuration is preserved.
|
|
104
|
+
Requires a Claude CLI with `--safe-mode`; unsupported flags fail closed.
|
|
105
|
+
Stop the runtime before upgrading packages and start it again afterwards.
|
|
106
|
+
|
|
107
|
+
## Journal
|
|
108
|
+
|
|
109
|
+
Each job notification is appended to the conversation log (`channel: 'scheduler'`, the
|
|
110
|
+
notification kind in `kind`) when the optional `@justfortytwo/transcript` peer is
|
|
111
|
+
installed; otherwise it is a no-op. It is no longer stored as a memory row
|
|
112
|
+
(`source: 'scheduler:wake'` is retired), so the `learn_review` gate, which counts memory
|
|
113
|
+
rows only, fires less often.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ConversationEvent {
|
|
2
|
+
channel: string;
|
|
3
|
+
direction: 'inbound' | 'outbound' | 'internal';
|
|
4
|
+
actor: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
content: string;
|
|
7
|
+
threadId?: string | null;
|
|
8
|
+
meta?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface ConversationLog {
|
|
11
|
+
append(event: ConversationEvent): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
export declare const noopConversationLog: ConversationLog;
|
|
14
|
+
/**
|
|
15
|
+
* Load the optional @justfortytwo/transcript peer. Any failure (not installed,
|
|
16
|
+
* prepare/create throws) is logged and yields the no-op log.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadConversationLog(h: unknown, embedder: unknown, importer?: (name: string) => Promise<unknown>): Promise<ConversationLog>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Scheduler's own port for writing the conversation. Structural on purpose:
|
|
2
|
+
// no @justfortytwo/transcript (or memory) types are imported. The
|
|
3
|
+
// implementation is loaded dynamically and degrades to a no-op.
|
|
4
|
+
export const noopConversationLog = { append: async () => undefined };
|
|
5
|
+
/**
|
|
6
|
+
* Load the optional @justfortytwo/transcript peer. Any failure (not installed,
|
|
7
|
+
* prepare/create throws) is logged and yields the no-op log.
|
|
8
|
+
*/
|
|
9
|
+
export async function loadConversationLog(h, embedder, importer = (n) => import(n)) {
|
|
10
|
+
try {
|
|
11
|
+
const mod = (await importer('@justfortytwo/transcript'));
|
|
12
|
+
await mod.prepareTranscript(h);
|
|
13
|
+
return mod.createTranscript(h, embedder);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.error(`[scheduler] transcript unavailable (${e?.message ?? e}) — journal entries will NOT be recorded.`);
|
|
17
|
+
return noopConversationLog;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=conversation-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-log.js","sourceRoot":"","sources":["../src/conversation-log.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,kEAAkE;AAClE,gEAAgE;AAgBhE,MAAM,CAAC,MAAM,mBAAmB,GAAoB,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;AAOtF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,CAAU,EACV,QAAiB,EACjB,WAA+C,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,0BAA0B,CAAC,CAAqB,CAAC;QAC7E,MAAM,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,uCAAwC,CAAW,EAAE,OAAO,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC5H,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ConversationLog } from './conversation-log.js';
|
|
1
2
|
import type { Notifier, Registry } from './types.js';
|
|
2
3
|
/** Poll interval: how often `tick` is invoked to drain due jobs. */
|
|
3
4
|
export declare const POLL_MS = 30000;
|
|
@@ -26,6 +27,15 @@ export declare function makePoll(tickFn: () => Promise<void>): {
|
|
|
26
27
|
poll: () => Promise<void>;
|
|
27
28
|
isRunning: () => boolean;
|
|
28
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Journal write backed by a ConversationLog. Fire-and-forget (like the
|
|
32
|
+
* telegram bridge): failures, sync or async, are logged to stderr and never
|
|
33
|
+
* propagate, so a broken transcript cannot affect the job or other notifiers.
|
|
34
|
+
*/
|
|
35
|
+
export declare function makeJournalWrite(log: ConversationLog): (n: {
|
|
36
|
+
kind: string;
|
|
37
|
+
text: string;
|
|
38
|
+
}) => Promise<void>;
|
|
29
39
|
export interface DaemonOptions {
|
|
30
40
|
/** Absolute path to the SQLite database file. */
|
|
31
41
|
dbPath: string;
|
|
@@ -50,15 +60,9 @@ export interface DaemonOptions {
|
|
|
50
60
|
* notify (fanout: journal + optional extras), and the injected registry.
|
|
51
61
|
* 4. Starts a 30-second setInterval poll loop with an overlap guard.
|
|
52
62
|
*
|
|
53
|
-
* Journal write: each notification is
|
|
54
|
-
*
|
|
55
|
-
* EMBED_MODEL is set, else FakeEmbedder
|
|
56
|
-
*
|
|
57
|
-
* CONCERN: using FakeEmbedder in production means scheduler-emitted journal
|
|
58
|
-
* entries are not semantically searchable (fake vectors). This matches the
|
|
59
|
-
* bridge's current pattern for channel events and is acceptable for Phase 3.
|
|
60
|
-
* It should be revisited when a persistent embedder is always available (e.g.
|
|
61
|
-
* Phase 4+ where EMBED_MODEL is part of the required env).
|
|
63
|
+
* Journal write: each notification is appended to the ConversationLog
|
|
64
|
+
* (channel 'scheduler', no-op when @justfortytwo/transcript is absent). The
|
|
65
|
+
* embedder is OllamaEmbedder when EMBED_MODEL is set, else FakeEmbedder.
|
|
62
66
|
*
|
|
63
67
|
* @returns A dispose fn that clears the poll interval.
|
|
64
68
|
*/
|
package/dist/daemon.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { loadTranscriptSource, makeOneirosHandler, oneirosEnabled, seedOneiros } from './oneiros.js';
|
|
3
|
+
import { loadConversationLog } from './conversation-log.js';
|
|
1
4
|
import { Cron } from 'croner';
|
|
2
5
|
import PQueue from 'p-queue';
|
|
3
|
-
import { openDb, runMigrations, claimDue, complete, fail, requeueStale, FakeEmbedder, OllamaEmbedder,
|
|
6
|
+
import { openDb, runMigrations, claimDue, complete, fail, requeueStale, FakeEmbedder, OllamaEmbedder, query, reembed, listActive, enqueue, setRecurrence, countPendingApprovals, } from '@justfortytwo/memory';
|
|
4
7
|
import { createRunner } from '@justfortytwo/runner';
|
|
5
8
|
import { tick } from './tick.js';
|
|
6
9
|
import { heartbeatPath, writeHeartbeat } from './heartbeat.js';
|
|
@@ -59,6 +62,29 @@ export function makePoll(tickFn) {
|
|
|
59
62
|
return { poll, isRunning: () => running };
|
|
60
63
|
}
|
|
61
64
|
// ---------------------------------------------------------------------------
|
|
65
|
+
// makeJournalWrite
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
/**
|
|
68
|
+
* Journal write backed by a ConversationLog. Fire-and-forget (like the
|
|
69
|
+
* telegram bridge): failures, sync or async, are logged to stderr and never
|
|
70
|
+
* propagate, so a broken transcript cannot affect the job or other notifiers.
|
|
71
|
+
*/
|
|
72
|
+
export function makeJournalWrite(log) {
|
|
73
|
+
return async (n) => {
|
|
74
|
+
const reportAppendFailure = (e) => {
|
|
75
|
+
process.stderr.write(`fortytwo-scheduler: journal append failed: ${e?.message ?? e}\n`);
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
void Promise.resolve(log.append({
|
|
79
|
+
channel: 'scheduler', direction: 'outbound', actor: 'assistant', kind: n.kind, content: n.text,
|
|
80
|
+
})).catch(reportAppendFailure);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
reportAppendFailure(e);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
62
88
|
// startDaemon
|
|
63
89
|
// ---------------------------------------------------------------------------
|
|
64
90
|
/**
|
|
@@ -71,15 +97,9 @@ export function makePoll(tickFn) {
|
|
|
71
97
|
* notify (fanout: journal + optional extras), and the injected registry.
|
|
72
98
|
* 4. Starts a 30-second setInterval poll loop with an overlap guard.
|
|
73
99
|
*
|
|
74
|
-
* Journal write: each notification is
|
|
75
|
-
*
|
|
76
|
-
* EMBED_MODEL is set, else FakeEmbedder
|
|
77
|
-
*
|
|
78
|
-
* CONCERN: using FakeEmbedder in production means scheduler-emitted journal
|
|
79
|
-
* entries are not semantically searchable (fake vectors). This matches the
|
|
80
|
-
* bridge's current pattern for channel events and is acceptable for Phase 3.
|
|
81
|
-
* It should be revisited when a persistent embedder is always available (e.g.
|
|
82
|
-
* Phase 4+ where EMBED_MODEL is part of the required env).
|
|
100
|
+
* Journal write: each notification is appended to the ConversationLog
|
|
101
|
+
* (channel 'scheduler', no-op when @justfortytwo/transcript is absent). The
|
|
102
|
+
* embedder is OllamaEmbedder when EMBED_MODEL is set, else FakeEmbedder.
|
|
83
103
|
*
|
|
84
104
|
* @returns A dispose fn that clears the poll interval.
|
|
85
105
|
*/
|
|
@@ -93,24 +113,20 @@ export async function startDaemon(opts) {
|
|
|
93
113
|
const embedder = process.env['EMBED_MODEL']
|
|
94
114
|
? new OllamaEmbedder(process.env['EMBED_MODEL'], process.env['OLLAMA_BASE_URL'])
|
|
95
115
|
: new FakeEmbedder();
|
|
96
|
-
// Journal notifier:
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
content: `[scheduler:${n.kind}] ${n.text}`,
|
|
100
|
-
source: 'scheduler:wake',
|
|
101
|
-
observed: 'internal',
|
|
102
|
-
tags: ['scheduler', n.kind],
|
|
103
|
-
});
|
|
104
|
-
};
|
|
116
|
+
// Journal notifier: appends each Notification to the conversation log.
|
|
117
|
+
const log = await loadConversationLog(h, embedder);
|
|
118
|
+
const journalWrite = makeJournalWrite(log);
|
|
105
119
|
const journalNotifier = createJournalNotifier(journalWrite);
|
|
106
120
|
const allNotifiers = [journalNotifier, ...(opts.extraNotifiers ?? [])];
|
|
107
121
|
const fanout = createFanoutNotifier(allNotifiers);
|
|
108
122
|
// Build the real handler registry (or accept the injected one for tests).
|
|
123
|
+
const transcript = opts.registry ? undefined : await loadTranscriptSource(h);
|
|
109
124
|
const registry = opts.registry ?? (() => {
|
|
110
125
|
const runner = createRunner();
|
|
111
126
|
const reembedOne = (id) => reembed(h, embedder, id);
|
|
112
127
|
return buildRegistry({
|
|
113
|
-
runner,
|
|
128
|
+
runner: async (prompt) => runner.run({ prompt }),
|
|
129
|
+
oneiros: oneirosEnabled(resolve(process.env['FORTYTWO_ROOT'] ?? process.cwd())) ? makeOneirosHandler(resolve(process.env['FORTYTWO_ROOT'] ?? process.cwd()), h, undefined, transcript) : undefined,
|
|
114
130
|
countPendingApprovals: () => countPendingApprovals(h),
|
|
115
131
|
// Compute the 7-day lookback per call so a long-running daemon's window
|
|
116
132
|
// does not drift forward from the boot-time instant.
|
|
@@ -124,6 +140,8 @@ export async function startDaemon(opts) {
|
|
|
124
140
|
enqueue: (j) => enqueue(h, j),
|
|
125
141
|
setRecurrence: (id, rec, at) => setRecurrence(h, id, rec, at),
|
|
126
142
|
}, RECURRING_DEFS, new Date().toISOString(), recurrenceNext);
|
|
143
|
+
if (oneirosEnabled(resolve(process.env['FORTYTWO_ROOT'] ?? process.cwd())))
|
|
144
|
+
seedOneiros(h, new Date().toISOString(), recurrenceNext);
|
|
127
145
|
// Write liveness heartbeat on boot.
|
|
128
146
|
const hbPath = heartbeatPath(opts.dbPath);
|
|
129
147
|
writeHeartbeat(hbPath, process.pid, new Date().toISOString());
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EACL,MAAM,EACN,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Registry } from '../types.js';
|
|
1
|
+
import type { Handler, Registry } from '../types.js';
|
|
2
2
|
import type { RunnerFn } from './recurring.js';
|
|
3
3
|
import type { ReembedOneFn } from './reembed.js';
|
|
4
4
|
export interface RecurringDef {
|
|
@@ -15,6 +15,7 @@ export interface RecurringDef {
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const RECURRING_DEFS: RecurringDef[];
|
|
17
17
|
export interface RegistryDeps {
|
|
18
|
+
oneiros?: Handler;
|
|
18
19
|
/** Bound `createRunner()` return value. */
|
|
19
20
|
runner: RunnerFn;
|
|
20
21
|
/** Returns the count of pending approvals (injected so tests can fake it). */
|
package/dist/handlers/index.js
CHANGED
|
@@ -27,6 +27,7 @@ export const RECURRING_DEFS = [
|
|
|
27
27
|
export function buildRegistry(deps) {
|
|
28
28
|
const { runner, countPendingApprovals, recentCount, reembedOne } = deps;
|
|
29
29
|
return createRegistry([
|
|
30
|
+
...(deps.oneiros ? [deps.oneiros] : []),
|
|
30
31
|
// --- Recurring: ungated ---
|
|
31
32
|
makeRecurringHandler({
|
|
32
33
|
kind: 'daily_briefing',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAclD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,iEAAiE;KAC3E;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,qGAAqG;KAC/G;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,qHAAqH;KAC/H;CACF,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAclD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,iEAAiE;KAC3E;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,qGAAqG;KAC/G;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,qHAAqH;KAC/H;CACF,CAAC;AAqBF,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAExE,OAAO,cAAc,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,6BAA6B;QAC7B,oBAAoB,CAAC;YACnB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAE,CAAC,OAAO;YACzE,MAAM;SACP,CAAC;QAEF,oDAAoD;QACpD,oBAAoB,CAAC;YACnB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAE,CAAC,OAAO;YAChE,MAAM;YACN,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACjD,CAAC;QAEF,kDAAkD;QAClD,oBAAoB,CAAC;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAE,CAAC,OAAO;YACvE,MAAM;YACN,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,GAAG,CAAC;SAC/C,CAAC;QAEF,2BAA2B;QAC3B,wBAAwB,CAAC,MAAM,CAAC;QAChC,gBAAgB,CAAC,MAAM,CAAC;QACxB,mBAAmB,CAAC,MAAM,CAAC;QAE3B,+CAA+C;QAC/C,kBAAkB,CAAC,UAAU,CAAC;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,3 +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 { ONEIROS_DEF, seedOneiros, makeOneirosHandler } from './oneiros.js';
|
|
15
|
+
export { loadTranscriptSource } from './oneiros.js';
|
|
16
|
+
export { loadConversationLog, noopConversationLog } from './conversation-log.js';
|
|
17
|
+
export type { ConversationEvent, ConversationLog } from './conversation-log.js';
|
|
18
|
+
export { makeJournalWrite } from './daemon.js';
|
package/dist/index.js
CHANGED
|
@@ -64,4 +64,8 @@ if (invokedAsBin()) {
|
|
|
64
64
|
process.exit(1);
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
+
export { ONEIROS_DEF, seedOneiros, makeOneirosHandler } from './oneiros.js';
|
|
68
|
+
export { loadTranscriptSource } from './oneiros.js';
|
|
69
|
+
export { loadConversationLog, noopConversationLog } from './conversation-log.js';
|
|
70
|
+
export { makeJournalWrite } from './daemon.js';
|
|
67
71
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/notifier.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Notification, Notifier } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Creates a notifier that forwards every notification to the injected `write`
|
|
4
|
-
* callback. The daemon supplies the real write that
|
|
5
|
-
*
|
|
6
|
-
* opening a real database.
|
|
4
|
+
* callback. The daemon supplies the real write that appends entries to the
|
|
5
|
+
* conversation log (the transcript, or a no-op when it is not installed). Using
|
|
6
|
+
* DI keeps the logging logic testable without opening a real database.
|
|
7
7
|
*/
|
|
8
8
|
export declare function createJournalNotifier(write: (n: Notification) => Promise<void>): Notifier;
|
|
9
9
|
/**
|
package/dist/notifier.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Creates a notifier that forwards every notification to the injected `write`
|
|
3
|
-
* callback. The daemon supplies the real write that
|
|
4
|
-
*
|
|
5
|
-
* opening a real database.
|
|
3
|
+
* callback. The daemon supplies the real write that appends entries to the
|
|
4
|
+
* conversation log (the transcript, or a no-op when it is not installed). Using
|
|
5
|
+
* DI keeps the logging logic testable without opening a real database.
|
|
6
6
|
*/
|
|
7
7
|
export function createJournalNotifier(write) {
|
|
8
8
|
return {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type RunOptions, type RunResult } from '@justfortytwo/runner';
|
|
2
|
+
import { type WorkerInput, type TranscriptSource } from '@justfortytwo/persona';
|
|
3
|
+
import { type DbHandles } from '@justfortytwo/memory';
|
|
4
|
+
import type { Handler } from './types.js';
|
|
5
|
+
import type { RecurringDef } from './handlers/index.js';
|
|
6
|
+
export declare const ONEIROS_DEF: RecurringDef;
|
|
7
|
+
export declare function seedOneiros(h: DbHandles, now: string, next: (cron: string, now: string) => string): void;
|
|
8
|
+
export declare function isolatedWorker(input: WorkerInput, run?: (options: RunOptions) => Promise<RunResult>): Promise<unknown>;
|
|
9
|
+
export declare function oneirosEnabled(root: string): boolean;
|
|
10
|
+
export declare function makeOneirosHandler(root: string, h: DbHandles, worker?: typeof isolatedWorker, transcript?: TranscriptSource): Handler;
|
|
11
|
+
/** Transcript rows per Oneiros round; smaller than the package default to keep the worker input within budget. */
|
|
12
|
+
export declare const TRANSCRIPT_PAGE_LIMIT = 20;
|
|
13
|
+
/**
|
|
14
|
+
* Adapt the optional @justfortytwo/transcript peer into a TranscriptSource.
|
|
15
|
+
* Any failure (not installed, missing exports) yields undefined and is reported
|
|
16
|
+
* on stderr. Persona then refuses to run if a transcript stream was initialised,
|
|
17
|
+
* so a missing source is never silently skipped.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadTranscriptSource(h: unknown, importer?: (name: string) => Promise<unknown>): Promise<TranscriptSource | undefined>;
|
package/dist/oneiros.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Internal maintenance adapter: scheduler owns timing and runner invocation.
|
|
2
|
+
import { mkdtempSync, rmSync, existsSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { createRunner } from '@justfortytwo/runner';
|
|
6
|
+
import { hasWork, refine, workerPrompt } from '@justfortytwo/persona';
|
|
7
|
+
import { memoryHead, memoryDelta, listActive, enqueue, setRecurrence } from '@justfortytwo/memory';
|
|
8
|
+
import { seedRecurring } from './seed.js';
|
|
9
|
+
export const ONEIROS_DEF = { kind: 'persona.oneiros', cron: '17 3 * * *', trigger: '' };
|
|
10
|
+
export function seedOneiros(h, now, next) {
|
|
11
|
+
// Existing seeder, serialized with the jobs DB write lock across installer/daemon.
|
|
12
|
+
h.raw.transaction(() => seedRecurring({ listActive: () => listActive(h), enqueue: j => enqueue(h, j), setRecurrence: (id, rec, at) => setRecurrence(h, id, rec, at) }, [ONEIROS_DEF], now, next)).immediate();
|
|
13
|
+
}
|
|
14
|
+
export async function isolatedWorker(input, run = createRunner().run) {
|
|
15
|
+
const cwd = mkdtempSync(join(tmpdir(), 'fortytwo-oneiros-'));
|
|
16
|
+
try {
|
|
17
|
+
// Safe mode keeps authentication/provider selection while disabling customizations,
|
|
18
|
+
// including hooks, CLAUDE.md and plugins. Unsupported flags fail closed.
|
|
19
|
+
// Provider selectors, OAuth/API credentials and their config directory must
|
|
20
|
+
// survive. Safe mode disables customization without discarding authentication.
|
|
21
|
+
const env = { CLAUDECODE: undefined, CLAUDE_CODE_SESSION_ID: undefined };
|
|
22
|
+
const result = await run({ cwd, env, timeoutMs: 120_000,
|
|
23
|
+
args: ['--safe-mode', '--tools', '', '--strict-mcp-config', '--mcp-config', '{"mcpServers":{}}', '--disable-slash-commands', '--no-session-persistence', '--setting-sources', '', '--system-prompt', workerPrompt],
|
|
24
|
+
prompt: JSON.stringify(input),
|
|
25
|
+
});
|
|
26
|
+
if (!result.ok)
|
|
27
|
+
throw new Error('Oneiros worker failed');
|
|
28
|
+
if (Buffer.byteLength(result.text) > 16_384)
|
|
29
|
+
throw new Error('Oneiros response too large');
|
|
30
|
+
return JSON.parse(result.text);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function oneirosEnabled(root) { return existsSync(join(root, '.fortytwo/oneiros/checkpoint.json')); }
|
|
37
|
+
export function makeOneirosHandler(root, h, worker = isolatedWorker, transcript) {
|
|
38
|
+
const memory = { head: () => memoryHead(h), delta: (cursor) => memoryDelta(h, cursor) };
|
|
39
|
+
return { kind: ONEIROS_DEF.kind,
|
|
40
|
+
hasWork: async () => hasWork(root, memory, transcript),
|
|
41
|
+
run: async () => { await refine({ root, memory, transcript, worker }); return null; },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Transcript rows per Oneiros round; smaller than the package default to keep the worker input within budget. */
|
|
45
|
+
export const TRANSCRIPT_PAGE_LIMIT = 20;
|
|
46
|
+
/**
|
|
47
|
+
* Adapt the optional @justfortytwo/transcript peer into a TranscriptSource.
|
|
48
|
+
* Any failure (not installed, missing exports) yields undefined and is reported
|
|
49
|
+
* on stderr. Persona then refuses to run if a transcript stream was initialised,
|
|
50
|
+
* so a missing source is never silently skipped.
|
|
51
|
+
*/
|
|
52
|
+
export async function loadTranscriptSource(h, importer = (n) => import(n)) {
|
|
53
|
+
let mod;
|
|
54
|
+
try {
|
|
55
|
+
mod = (await importer('@justfortytwo/transcript'));
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
process.stderr.write(`fortytwo-scheduler: transcript source unavailable (import @justfortytwo/transcript failed): ${e?.message ?? e}\n`);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
if (typeof mod?.transcriptHead !== 'function' || typeof mod?.transcriptDelta !== 'function') {
|
|
62
|
+
process.stderr.write('fortytwo-scheduler: transcript source unavailable (@justfortytwo/transcript lacks transcriptHead/transcriptDelta)\n');
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
head: () => mod.transcriptHead(h),
|
|
67
|
+
delta: (cursor) => {
|
|
68
|
+
const d = mod.transcriptDelta(h, cursor, TRANSCRIPT_PAGE_LIMIT);
|
|
69
|
+
// Explicit mapping: exactly the fields persona reads, including the row meta.
|
|
70
|
+
return { cursor: d.cursor, entries: d.entries.map((r) => ({
|
|
71
|
+
id: r.id, channel: r.channel, direction: r.direction, actor: r.actor, kind: r.kind,
|
|
72
|
+
content: r.content, thread_id: r.thread_id, meta: r.meta,
|
|
73
|
+
})) };
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=oneiros.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneiros.js","sourceRoot":"","sources":["../src/oneiros.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justfortytwo/scheduler",
|
|
3
|
-
"version": "1.0.0-
|
|
3
|
+
"version": "1.0.0-4",
|
|
4
4
|
"description": "Durable job scheduler daemon for justfortytwo — drains a jobs queue and fires LLM turns behind a cheap gate.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -34,8 +34,9 @@
|
|
|
34
34
|
"fortytwo-scheduler": "dist/index.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@justfortytwo/memory": "
|
|
38
|
-
"@justfortytwo/
|
|
37
|
+
"@justfortytwo/memory": "1.0.0-3",
|
|
38
|
+
"@justfortytwo/persona": "1.0.0-3",
|
|
39
|
+
"@justfortytwo/runner": "1.0.0-0",
|
|
39
40
|
"croner": "^10.0.0",
|
|
40
41
|
"p-queue": "^9.0.0"
|
|
41
42
|
},
|
|
@@ -49,11 +50,15 @@
|
|
|
49
50
|
"access": "public"
|
|
50
51
|
},
|
|
51
52
|
"peerDependencies": {
|
|
52
|
-
"@justfortytwo/telegram": "^0.1.5 || ^1.0.0-0"
|
|
53
|
+
"@justfortytwo/telegram": "^0.1.5 || ^1.0.0-0",
|
|
54
|
+
"@justfortytwo/transcript": "^1.0.0-0"
|
|
53
55
|
},
|
|
54
56
|
"peerDependenciesMeta": {
|
|
55
57
|
"@justfortytwo/telegram": {
|
|
56
58
|
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"@justfortytwo/transcript": {
|
|
61
|
+
"optional": true
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
64
|
}
|