openryoko 2026.8.18 → 2026.8.19
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/package.json +1 -1
- package/dist/src/connectors/cron/index.d.ts +5 -0
- package/dist/src/connectors/cron/index.d.ts.map +1 -1
- package/dist/src/connectors/cron/index.js +17 -2
- package/dist/src/connectors/cron/index.js.map +1 -1
- package/dist/src/cron/runner.d.ts.map +1 -1
- package/dist/src/cron/runner.js +92 -2
- package/dist/src/cron/runner.js.map +1 -1
- package/dist/src/gateway/api.d.ts.map +1 -1
- package/dist/src/gateway/api.js +38 -2
- package/dist/src/gateway/api.js.map +1 -1
- package/dist/src/shared/paths.d.ts +1 -0
- package/dist/src/shared/paths.d.ts.map +1 -1
- package/dist/src/shared/paths.js +1 -0
- package/dist/src/shared/paths.js.map +1 -1
- package/dist/src/shared/types.d.ts +3 -0
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/updates/checker.d.ts +24 -0
- package/dist/src/updates/checker.d.ts.map +1 -0
- package/dist/src/updates/checker.js +102 -0
- package/dist/src/updates/checker.js.map +1 -0
- package/dist/src/updates/notification-state.d.ts +3 -0
- package/dist/src/updates/notification-state.d.ts.map +1 -0
- package/dist/src/updates/notification-state.js +29 -0
- package/dist/src/updates/notification-state.js.map +1 -0
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +11 -11
- package/dist/web/__next._full.txt +12 -12
- package/dist/web/__next._tree.txt +2 -2
- package/dist/web/_next/static/chunks/{3ce2mykde4i6k.js → 0y5p4spyfs35l.js} +1 -1
- package/dist/web/_next/static/chunks/13onw-m8t1drh.css +1 -0
- package/dist/web/_next/static/chunks/1b-2_mk61vu6k.js +1 -0
- package/dist/web/_next/static/chunks/24rxa6wngonnl.js +1 -0
- package/dist/web/_next/static/chunks/{2_ryia_vq1u62.js → 39eyhhcdqji59.js} +1 -1
- package/dist/web/_next/static/chunks/3hm8h0nmd2_4z.js +1 -0
- package/dist/web/_next/static/chunks/3sylxch44y9--.js +1 -0
- package/dist/web/_next/static/chunks/{3eg9bwyl64wev.js → 3vbt6hluyegkb.js} +1 -1
- package/dist/web/_not-found/__next._full.txt +10 -10
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +9 -9
- package/dist/web/_not-found/__next._tree.txt +2 -2
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +10 -10
- package/dist/web/chat/__next._full.txt +12 -12
- package/dist/web/chat/__next._tree.txt +2 -2
- package/dist/web/chat/__next.chat.__PAGE__.txt +11 -11
- package/dist/web/chat.html +1 -1
- package/dist/web/chat.txt +12 -12
- package/dist/web/cron/__next._full.txt +12 -12
- package/dist/web/cron/__next._tree.txt +2 -2
- package/dist/web/cron/__next.cron.__PAGE__.txt +11 -11
- package/dist/web/cron.html +1 -1
- package/dist/web/cron.txt +12 -12
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +12 -12
- package/dist/web/kanban/__next._full.txt +12 -12
- package/dist/web/kanban/__next._tree.txt +2 -2
- package/dist/web/kanban/__next.kanban.__PAGE__.txt +11 -11
- package/dist/web/kanban.html +1 -1
- package/dist/web/kanban.txt +12 -12
- package/dist/web/logs/__next._full.txt +12 -12
- package/dist/web/logs/__next._tree.txt +2 -2
- package/dist/web/logs/__next.logs.__PAGE__.txt +11 -11
- package/dist/web/logs.html +1 -1
- package/dist/web/logs.txt +12 -12
- package/dist/web/org/__next._full.txt +12 -12
- package/dist/web/org/__next._tree.txt +2 -2
- package/dist/web/org/__next.org.__PAGE__.txt +11 -11
- package/dist/web/org.html +1 -1
- package/dist/web/org.txt +12 -12
- package/dist/web/sessions/__next._full.txt +10 -10
- package/dist/web/sessions/__next._tree.txt +2 -2
- package/dist/web/sessions/__next.sessions.__PAGE__.txt +9 -9
- package/dist/web/sessions.html +1 -1
- package/dist/web/sessions.txt +10 -10
- package/dist/web/settings/__next._full.txt +12 -12
- package/dist/web/settings/__next._tree.txt +2 -2
- package/dist/web/settings/__next.settings.__PAGE__.txt +11 -11
- package/dist/web/settings.html +1 -1
- package/dist/web/settings.txt +12 -12
- package/dist/web/skills/__next._full.txt +12 -12
- package/dist/web/skills/__next._tree.txt +2 -2
- package/dist/web/skills/__next.skills.__PAGE__.txt +11 -11
- package/dist/web/skills.html +1 -1
- package/dist/web/skills.txt +12 -12
- package/package.json +1 -1
- package/template/AGENTS.md +2 -0
- package/template/CLAUDE.md +3 -1
- package/template/docs/cron.md +7 -0
- package/dist/web/_next/static/chunks/1jnnqt5av9wfv.js +0 -1
- package/dist/web/_next/static/chunks/1qhsv_sh-mf5s.js +0 -1
- package/dist/web/_next/static/chunks/2hd-8093zcl3t.css +0 -1
- package/dist/web/_next/static/chunks/31gy5a7oi1faq.js +0 -1
- package/dist/web/_next/static/chunks/3c4prmduldwvn.js +0 -1
- /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_ssgManifest.js +0 -0
package/dist/package.json
CHANGED
|
@@ -4,6 +4,8 @@ export declare class CronConnector implements Connector {
|
|
|
4
4
|
private readonly delivery?;
|
|
5
5
|
name: string;
|
|
6
6
|
private handler;
|
|
7
|
+
private deliveredMessages;
|
|
8
|
+
private deliveredTexts;
|
|
7
9
|
constructor(connectors: Map<string, Connector>, delivery?: CronDelivery | undefined);
|
|
8
10
|
start(): Promise<void>;
|
|
9
11
|
stop(): Promise<void>;
|
|
@@ -16,6 +18,9 @@ export declare class CronConnector implements Connector {
|
|
|
16
18
|
removeReaction(): Promise<void>;
|
|
17
19
|
editMessage(target: Target, text: string): Promise<void>;
|
|
18
20
|
onMessage(handler: (msg: IncomingMessage) => void): void;
|
|
21
|
+
/** Number of messages the underlying connector accepted during this run. */
|
|
22
|
+
getDeliveredMessageCount(): number;
|
|
23
|
+
hasDeliveredTextContaining(fragment: string): boolean;
|
|
19
24
|
private forward;
|
|
20
25
|
}
|
|
21
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/cron/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,MAAM,EACP,MAAM,uBAAuB,CAAC;AAU/B,qBAAa,aAAc,YAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/cron/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,MAAM,EACP,MAAM,uBAAuB,CAAC;AAU/B,qBAAa,aAAc,YAAW,SAAS;IAO3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAP5B,IAAI,SAAU;IACd,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAgB;gBAGnB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAClC,QAAQ,CAAC,EAAE,YAAY,YAAA;IAGpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,eAAe,IAAI,qBAAqB;IAIxC,SAAS,IAAI,eAAe;IAO5B,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM;IAS/C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIjE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIlE,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAE5B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIxD,4EAA4E;IAC5E,wBAAwB,IAAI,MAAM;IAIlC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;YAIvC,OAAO;CAqCtB"}
|
|
@@ -10,6 +10,8 @@ export class CronConnector {
|
|
|
10
10
|
delivery;
|
|
11
11
|
name = "cron";
|
|
12
12
|
handler = null;
|
|
13
|
+
deliveredMessages = 0;
|
|
14
|
+
deliveredTexts = [];
|
|
13
15
|
constructor(connectors, delivery) {
|
|
14
16
|
this.connectors = connectors;
|
|
15
17
|
this.delivery = delivery;
|
|
@@ -52,6 +54,13 @@ export class CronConnector {
|
|
|
52
54
|
onMessage(handler) {
|
|
53
55
|
this.handler = handler;
|
|
54
56
|
}
|
|
57
|
+
/** Number of messages the underlying connector accepted during this run. */
|
|
58
|
+
getDeliveredMessageCount() {
|
|
59
|
+
return this.deliveredMessages;
|
|
60
|
+
}
|
|
61
|
+
hasDeliveredTextContaining(fragment) {
|
|
62
|
+
return this.deliveredTexts.some((text) => text.includes(fragment));
|
|
63
|
+
}
|
|
55
64
|
async forward(target, text, asReply) {
|
|
56
65
|
if (!this.delivery)
|
|
57
66
|
return undefined;
|
|
@@ -76,9 +85,15 @@ export class CronConnector {
|
|
|
76
85
|
replyContext: target.replyContext,
|
|
77
86
|
};
|
|
78
87
|
if (asReply) {
|
|
79
|
-
|
|
88
|
+
const result = await connector.replyMessage(resolvedTarget, text);
|
|
89
|
+
this.deliveredMessages++;
|
|
90
|
+
this.deliveredTexts.push(text);
|
|
91
|
+
return result;
|
|
80
92
|
}
|
|
81
|
-
|
|
93
|
+
const result = await connector.sendMessage(resolvedTarget, text);
|
|
94
|
+
this.deliveredMessages++;
|
|
95
|
+
this.deliveredTexts.push(text);
|
|
96
|
+
return result;
|
|
82
97
|
}
|
|
83
98
|
}
|
|
84
99
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/connectors/cron/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,YAAY,GAA0B;IAC1C,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF,MAAM,OAAO,aAAa;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/connectors/cron/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,EACZ,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Lf"}
|
package/dist/src/cron/runner.js
CHANGED
|
@@ -2,10 +2,90 @@ import { logger } from "../shared/logger.js";
|
|
|
2
2
|
import { appendRunLog } from "./jobs.js";
|
|
3
3
|
import { scanOrg, findEmployee } from "../gateway/org.js";
|
|
4
4
|
import { CronConnector } from "../connectors/cron/index.js";
|
|
5
|
+
import { buildUpdateNotificationPrompt, checkForUpdates } from "../updates/checker.js";
|
|
6
|
+
import { getLastNotifiedVersion, markVersionNotified } from "../updates/notification-state.js";
|
|
7
|
+
const updateNotificationRuns = new Set();
|
|
5
8
|
export async function runCronJob(job, sessionManager, config, connectors) {
|
|
6
9
|
const startTime = Date.now();
|
|
7
10
|
logger.info(`Cron job "${job.name}" (${job.id}) starting`);
|
|
8
11
|
const delivery = job.delivery || config.cron?.defaultDelivery;
|
|
12
|
+
const startedAt = new Date().toISOString();
|
|
13
|
+
if (job.kind === "update-notification") {
|
|
14
|
+
if (updateNotificationRuns.has(job.id)) {
|
|
15
|
+
appendRunLog(job.id, {
|
|
16
|
+
timestamp: startedAt,
|
|
17
|
+
status: "skipped",
|
|
18
|
+
durationMs: Date.now() - startTime,
|
|
19
|
+
reason: "already-running",
|
|
20
|
+
});
|
|
21
|
+
logger.info(`Cron job "${job.name}" skipped because a previous update check is still running`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!delivery?.connector || !delivery.channel) {
|
|
25
|
+
appendRunLog(job.id, {
|
|
26
|
+
timestamp: startedAt,
|
|
27
|
+
status: "skipped",
|
|
28
|
+
durationMs: Date.now() - startTime,
|
|
29
|
+
reason: "delivery-not-configured",
|
|
30
|
+
});
|
|
31
|
+
logger.warn(`Cron job "${job.name}" has no update notification delivery target`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!connectors.has(delivery.connector)) {
|
|
35
|
+
appendRunLog(job.id, {
|
|
36
|
+
timestamp: startedAt,
|
|
37
|
+
status: "skipped",
|
|
38
|
+
durationMs: Date.now() - startTime,
|
|
39
|
+
reason: "delivery-connector-unavailable",
|
|
40
|
+
});
|
|
41
|
+
logger.warn(`Cron job "${job.name}" delivery connector "${delivery.connector}" is unavailable`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
updateNotificationRuns.add(job.id);
|
|
45
|
+
}
|
|
46
|
+
let updateVersion;
|
|
47
|
+
let prompt = job.prompt;
|
|
48
|
+
if (job.kind === "update-notification") {
|
|
49
|
+
const status = await checkForUpdates({ force: true });
|
|
50
|
+
if (status.error && !status.latestVersion) {
|
|
51
|
+
appendRunLog(job.id, {
|
|
52
|
+
timestamp: startedAt,
|
|
53
|
+
status: "skipped",
|
|
54
|
+
durationMs: Date.now() - startTime,
|
|
55
|
+
reason: "update-check-unavailable",
|
|
56
|
+
});
|
|
57
|
+
updateNotificationRuns.delete(job.id);
|
|
58
|
+
logger.warn(`Cron job "${job.name}" could not reach the OpenRyoko package registry`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!status.updateAvailable || !status.latestVersion) {
|
|
62
|
+
appendRunLog(job.id, {
|
|
63
|
+
timestamp: startedAt,
|
|
64
|
+
status: "skipped",
|
|
65
|
+
durationMs: Date.now() - startTime,
|
|
66
|
+
reason: "up-to-date",
|
|
67
|
+
currentVersion: status.currentVersion,
|
|
68
|
+
latestVersion: status.latestVersion,
|
|
69
|
+
});
|
|
70
|
+
updateNotificationRuns.delete(job.id);
|
|
71
|
+
logger.info(`Cron job "${job.name}" found no newer OpenRyoko release`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (getLastNotifiedVersion(job.id) === status.latestVersion) {
|
|
75
|
+
appendRunLog(job.id, {
|
|
76
|
+
timestamp: startedAt,
|
|
77
|
+
status: "skipped",
|
|
78
|
+
durationMs: Date.now() - startTime,
|
|
79
|
+
reason: "already-notified",
|
|
80
|
+
latestVersion: status.latestVersion,
|
|
81
|
+
});
|
|
82
|
+
updateNotificationRuns.delete(job.id);
|
|
83
|
+
logger.info(`Cron job "${job.name}" already notified release ${status.latestVersion}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
updateVersion = status.latestVersion;
|
|
87
|
+
prompt = buildUpdateNotificationPrompt(status);
|
|
88
|
+
}
|
|
9
89
|
const cooSlug = config.portal?.portalName?.toLowerCase() || "jinn";
|
|
10
90
|
if (delivery && job.employee && job.employee !== cooSlug) {
|
|
11
91
|
logger.debug(`Cron job "${job.name}" targets employee "${job.employee}" directly (skipping COO delegation).`);
|
|
@@ -16,7 +96,6 @@ export async function runCronJob(job, sessionManager, config, connectors) {
|
|
|
16
96
|
employee = findEmployee(job.employee, orgRegistry);
|
|
17
97
|
}
|
|
18
98
|
const connector = new CronConnector(connectors, delivery);
|
|
19
|
-
const startedAt = new Date().toISOString();
|
|
20
99
|
const sessionKey = `cron:${job.id}:${Date.now()}`;
|
|
21
100
|
try {
|
|
22
101
|
const routeResult = await sessionManager.route({
|
|
@@ -35,7 +114,7 @@ export async function runCronJob(job, sessionManager, config, connectors) {
|
|
|
35
114
|
thread: undefined,
|
|
36
115
|
user: "system",
|
|
37
116
|
userId: "system",
|
|
38
|
-
text:
|
|
117
|
+
text: prompt,
|
|
39
118
|
attachments: [],
|
|
40
119
|
raw: { jobId: job.id, trigger: "cron" },
|
|
41
120
|
transportMeta: {
|
|
@@ -50,6 +129,10 @@ export async function runCronJob(job, sessionManager, config, connectors) {
|
|
|
50
129
|
model: job.model || employee?.model || config.engines[(job.engine || config.engines.default)]?.model,
|
|
51
130
|
title: job.name,
|
|
52
131
|
});
|
|
132
|
+
if (updateVersion && (connector.getDeliveredMessageCount() === 0 ||
|
|
133
|
+
!connector.hasDeliveredTextContaining(updateVersion))) {
|
|
134
|
+
throw new Error(`Update notification ${updateVersion} completed without a verified chat delivery`);
|
|
135
|
+
}
|
|
53
136
|
appendRunLog(job.id, {
|
|
54
137
|
timestamp: startedAt,
|
|
55
138
|
sessionKey,
|
|
@@ -58,7 +141,10 @@ export async function runCronJob(job, sessionManager, config, connectors) {
|
|
|
58
141
|
durationMs: Date.now() - startTime,
|
|
59
142
|
error: null,
|
|
60
143
|
resultPreview: null,
|
|
144
|
+
...(updateVersion ? { updateVersion } : {}),
|
|
61
145
|
});
|
|
146
|
+
if (updateVersion)
|
|
147
|
+
markVersionNotified(job.id, updateVersion);
|
|
62
148
|
logger.info(`Cron job "${job.name}" completed in ${Date.now() - startTime}ms`);
|
|
63
149
|
}
|
|
64
150
|
catch (err) {
|
|
@@ -84,5 +170,9 @@ export async function runCronJob(job, sessionManager, config, connectors) {
|
|
|
84
170
|
}
|
|
85
171
|
}
|
|
86
172
|
}
|
|
173
|
+
finally {
|
|
174
|
+
if (job.kind === "update-notification")
|
|
175
|
+
updateNotificationRuns.delete(job.id);
|
|
176
|
+
}
|
|
87
177
|
}
|
|
88
178
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/gateway/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/gateway/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAOhF,OAAO,KAAK,EAAoC,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAExG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAqF7D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,UAAU,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAChE,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrG;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAChG;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC;;;;OAIG;IACH,gCAAgC,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,oBAAoB,EAAE,YAAY,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CA4CpE;AA+MD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCnH;AA4CD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAk1Df"}
|
package/dist/src/gateway/api.js
CHANGED
|
@@ -3,6 +3,7 @@ import crypto from "node:crypto";
|
|
|
3
3
|
import fs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import yaml from "js-yaml";
|
|
6
|
+
import cron from "node-cron";
|
|
6
7
|
import { isInterruptibleEngine } from "../shared/types.js";
|
|
7
8
|
import { buildContext } from "../sessions/context.js";
|
|
8
9
|
import { initDb, listSessions, getSession, createSession, updateSession, deleteSession, deleteSessions, duplicateSession, insertMessage, getMessages, enqueueQueueItem, insertNotificationWithQueueItem, cancelQueueItem, getQueueItems, cancelAllPendingQueueItems, listAllPendingQueueItems, getFile, getMessagePage, getMessageWindow, isFtsBackfillPending, listSessionPage, searchMessages, } from "../sessions/registry.js";
|
|
@@ -21,6 +22,7 @@ import { getClaudeExpectedResetAt, recordClaudeRateLimit } from "../shared/usage
|
|
|
21
22
|
import { loadJobs, saveJobs } from "../cron/jobs.js";
|
|
22
23
|
import { reloadScheduler } from "../cron/scheduler.js";
|
|
23
24
|
import { runCronJob } from "../cron/runner.js";
|
|
25
|
+
import { checkForUpdates } from "../updates/checker.js";
|
|
24
26
|
import QRCode from "qrcode";
|
|
25
27
|
import { handleFilesRequest } from "./files.js";
|
|
26
28
|
import { notifyParentSession, notifyRateLimited, notifyRateLimitResumed, notifyDiscordChannel } from "../sessions/callbacks.js";
|
|
@@ -428,6 +430,13 @@ export async function handleApiRequest(req, res, context) {
|
|
|
428
430
|
storage: getDiskSpaceStatus(),
|
|
429
431
|
});
|
|
430
432
|
}
|
|
433
|
+
// GET /api/update — fixed-origin npm registry check with a shared cache.
|
|
434
|
+
// `refresh=1` is used only by an explicit user action; normal dashboard
|
|
435
|
+
// loads reuse the six-hour cache to avoid unnecessary external traffic.
|
|
436
|
+
if (method === "GET" && pathname === "/api/update") {
|
|
437
|
+
res.setHeader("Cache-Control", "no-store");
|
|
438
|
+
return json(res, await checkForUpdates({ force: url.searchParams.get("refresh") === "1" }));
|
|
439
|
+
}
|
|
431
440
|
// Live Claude subscription buckets, including model-scoped weekly limits.
|
|
432
441
|
// The collector returns only a fixed projection; OAuth credentials and raw
|
|
433
442
|
// provider failures never cross the gateway boundary.
|
|
@@ -1068,11 +1077,16 @@ export async function handleApiRequest(req, res, context) {
|
|
|
1068
1077
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1069
1078
|
const body = _parsed.body;
|
|
1070
1079
|
const jobs = loadJobs();
|
|
1080
|
+
const newJobId = typeof body.id === "string" && body.id.trim() ? body.id.trim() : crypto.randomUUID();
|
|
1081
|
+
if (jobs.some((job) => job.id === newJobId)) {
|
|
1082
|
+
return json(res, { error: `Cron job id already exists: ${newJobId}` }, 409);
|
|
1083
|
+
}
|
|
1071
1084
|
const newJob = {
|
|
1072
|
-
id:
|
|
1085
|
+
id: newJobId,
|
|
1073
1086
|
name: body.name || "untitled",
|
|
1074
1087
|
enabled: body.enabled ?? true,
|
|
1075
1088
|
schedule: body.schedule || "0 * * * *",
|
|
1089
|
+
kind: body.kind === "update-notification" ? "update-notification" : "prompt",
|
|
1076
1090
|
timezone: body.timezone,
|
|
1077
1091
|
engine: body.engine,
|
|
1078
1092
|
model: body.model,
|
|
@@ -1080,6 +1094,15 @@ export async function handleApiRequest(req, res, context) {
|
|
|
1080
1094
|
prompt: body.prompt || "",
|
|
1081
1095
|
delivery: body.delivery,
|
|
1082
1096
|
};
|
|
1097
|
+
if (newJob.kind === "update-notification") {
|
|
1098
|
+
if (!cron.validate(newJob.schedule))
|
|
1099
|
+
return badRequest(res, "Invalid cron schedule");
|
|
1100
|
+
if (newJob.enabled && (!newJob.delivery ||
|
|
1101
|
+
typeof newJob.delivery.connector !== "string" || !newJob.delivery.connector.trim() ||
|
|
1102
|
+
typeof newJob.delivery.channel !== "string" || !newJob.delivery.channel.trim())) {
|
|
1103
|
+
return badRequest(res, "Enabled update notifications require a delivery connector and channel");
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1083
1106
|
jobs.push(newJob);
|
|
1084
1107
|
saveJobs(jobs);
|
|
1085
1108
|
reloadScheduler(jobs);
|
|
@@ -1097,7 +1120,20 @@ export async function handleApiRequest(req, res, context) {
|
|
|
1097
1120
|
return;
|
|
1098
1121
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1099
1122
|
const body = _parsed.body;
|
|
1100
|
-
|
|
1123
|
+
const updated = { ...jobs[idx], ...body, id: params.id };
|
|
1124
|
+
if (updated.kind !== undefined && updated.kind !== "prompt" && updated.kind !== "update-notification") {
|
|
1125
|
+
return badRequest(res, "Invalid cron job kind");
|
|
1126
|
+
}
|
|
1127
|
+
if (updated.kind === "update-notification") {
|
|
1128
|
+
if (!cron.validate(updated.schedule))
|
|
1129
|
+
return badRequest(res, "Invalid cron schedule");
|
|
1130
|
+
if (updated.enabled && (!updated.delivery ||
|
|
1131
|
+
typeof updated.delivery.connector !== "string" || !updated.delivery.connector.trim() ||
|
|
1132
|
+
typeof updated.delivery.channel !== "string" || !updated.delivery.channel.trim())) {
|
|
1133
|
+
return badRequest(res, "Enabled update notifications require a delivery connector and channel");
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
jobs[idx] = updated;
|
|
1101
1137
|
saveJobs(jobs);
|
|
1102
1138
|
reloadScheduler(jobs);
|
|
1103
1139
|
return json(res, jobs[idx]);
|