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.
Files changed (96) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/connectors/cron/index.d.ts +5 -0
  3. package/dist/src/connectors/cron/index.d.ts.map +1 -1
  4. package/dist/src/connectors/cron/index.js +17 -2
  5. package/dist/src/connectors/cron/index.js.map +1 -1
  6. package/dist/src/cron/runner.d.ts.map +1 -1
  7. package/dist/src/cron/runner.js +92 -2
  8. package/dist/src/cron/runner.js.map +1 -1
  9. package/dist/src/gateway/api.d.ts.map +1 -1
  10. package/dist/src/gateway/api.js +38 -2
  11. package/dist/src/gateway/api.js.map +1 -1
  12. package/dist/src/shared/paths.d.ts +1 -0
  13. package/dist/src/shared/paths.d.ts.map +1 -1
  14. package/dist/src/shared/paths.js +1 -0
  15. package/dist/src/shared/paths.js.map +1 -1
  16. package/dist/src/shared/types.d.ts +3 -0
  17. package/dist/src/shared/types.d.ts.map +1 -1
  18. package/dist/src/updates/checker.d.ts +24 -0
  19. package/dist/src/updates/checker.d.ts.map +1 -0
  20. package/dist/src/updates/checker.js +102 -0
  21. package/dist/src/updates/checker.js.map +1 -0
  22. package/dist/src/updates/notification-state.d.ts +3 -0
  23. package/dist/src/updates/notification-state.d.ts.map +1 -0
  24. package/dist/src/updates/notification-state.js +29 -0
  25. package/dist/src/updates/notification-state.js.map +1 -0
  26. package/dist/web/404.html +1 -1
  27. package/dist/web/__next.__PAGE__.txt +11 -11
  28. package/dist/web/__next._full.txt +12 -12
  29. package/dist/web/__next._tree.txt +2 -2
  30. package/dist/web/_next/static/chunks/{3ce2mykde4i6k.js → 0y5p4spyfs35l.js} +1 -1
  31. package/dist/web/_next/static/chunks/13onw-m8t1drh.css +1 -0
  32. package/dist/web/_next/static/chunks/1b-2_mk61vu6k.js +1 -0
  33. package/dist/web/_next/static/chunks/24rxa6wngonnl.js +1 -0
  34. package/dist/web/_next/static/chunks/{2_ryia_vq1u62.js → 39eyhhcdqji59.js} +1 -1
  35. package/dist/web/_next/static/chunks/3hm8h0nmd2_4z.js +1 -0
  36. package/dist/web/_next/static/chunks/3sylxch44y9--.js +1 -0
  37. package/dist/web/_next/static/chunks/{3eg9bwyl64wev.js → 3vbt6hluyegkb.js} +1 -1
  38. package/dist/web/_not-found/__next._full.txt +10 -10
  39. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +9 -9
  40. package/dist/web/_not-found/__next._tree.txt +2 -2
  41. package/dist/web/_not-found.html +1 -1
  42. package/dist/web/_not-found.txt +10 -10
  43. package/dist/web/chat/__next._full.txt +12 -12
  44. package/dist/web/chat/__next._tree.txt +2 -2
  45. package/dist/web/chat/__next.chat.__PAGE__.txt +11 -11
  46. package/dist/web/chat.html +1 -1
  47. package/dist/web/chat.txt +12 -12
  48. package/dist/web/cron/__next._full.txt +12 -12
  49. package/dist/web/cron/__next._tree.txt +2 -2
  50. package/dist/web/cron/__next.cron.__PAGE__.txt +11 -11
  51. package/dist/web/cron.html +1 -1
  52. package/dist/web/cron.txt +12 -12
  53. package/dist/web/index.html +1 -1
  54. package/dist/web/index.txt +12 -12
  55. package/dist/web/kanban/__next._full.txt +12 -12
  56. package/dist/web/kanban/__next._tree.txt +2 -2
  57. package/dist/web/kanban/__next.kanban.__PAGE__.txt +11 -11
  58. package/dist/web/kanban.html +1 -1
  59. package/dist/web/kanban.txt +12 -12
  60. package/dist/web/logs/__next._full.txt +12 -12
  61. package/dist/web/logs/__next._tree.txt +2 -2
  62. package/dist/web/logs/__next.logs.__PAGE__.txt +11 -11
  63. package/dist/web/logs.html +1 -1
  64. package/dist/web/logs.txt +12 -12
  65. package/dist/web/org/__next._full.txt +12 -12
  66. package/dist/web/org/__next._tree.txt +2 -2
  67. package/dist/web/org/__next.org.__PAGE__.txt +11 -11
  68. package/dist/web/org.html +1 -1
  69. package/dist/web/org.txt +12 -12
  70. package/dist/web/sessions/__next._full.txt +10 -10
  71. package/dist/web/sessions/__next._tree.txt +2 -2
  72. package/dist/web/sessions/__next.sessions.__PAGE__.txt +9 -9
  73. package/dist/web/sessions.html +1 -1
  74. package/dist/web/sessions.txt +10 -10
  75. package/dist/web/settings/__next._full.txt +12 -12
  76. package/dist/web/settings/__next._tree.txt +2 -2
  77. package/dist/web/settings/__next.settings.__PAGE__.txt +11 -11
  78. package/dist/web/settings.html +1 -1
  79. package/dist/web/settings.txt +12 -12
  80. package/dist/web/skills/__next._full.txt +12 -12
  81. package/dist/web/skills/__next._tree.txt +2 -2
  82. package/dist/web/skills/__next.skills.__PAGE__.txt +11 -11
  83. package/dist/web/skills.html +1 -1
  84. package/dist/web/skills.txt +12 -12
  85. package/package.json +1 -1
  86. package/template/AGENTS.md +2 -0
  87. package/template/CLAUDE.md +3 -1
  88. package/template/docs/cron.md +7 -0
  89. package/dist/web/_next/static/chunks/1jnnqt5av9wfv.js +0 -1
  90. package/dist/web/_next/static/chunks/1qhsv_sh-mf5s.js +0 -1
  91. package/dist/web/_next/static/chunks/2hd-8093zcl3t.css +0 -1
  92. package/dist/web/_next/static/chunks/31gy5a7oi1faq.js +0 -1
  93. package/dist/web/_next/static/chunks/3c4prmduldwvn.js +0 -1
  94. /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_buildManifest.js +0 -0
  95. /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_clientMiddlewareManifest.js +0 -0
  96. /package/dist/web/_next/static/{13Bm9viiacGRTqfGftny_ → qeykWjfc1T7SjJSULdD7s}/_ssgManifest.js +0 -0
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openryoko",
3
- "version": "2026.8.18",
3
+ "version": "2026.8.19",
4
4
  "description": "OpenRyoko — Slackで空気を読んで働くAIアシスタント・ゲートウェイ(Jinnベース、Claude Code/Codex/Gemini CLI対応)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -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;IAK3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAL5B,IAAI,SAAU;IACd,OAAO,CAAC,OAAO,CAAiD;gBAG7C,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;YAI1C,OAAO;CA+BtB"}
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
- return connector.replyMessage(resolvedTarget, text);
88
+ const result = await connector.replyMessage(resolvedTarget, text);
89
+ this.deliveredMessages++;
90
+ this.deliveredTexts.push(text);
91
+ return result;
80
92
  }
81
- return connector.sendMessage(resolvedTarget, text);
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":"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"}
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;AAE7D,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,CAgGf"}
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"}
@@ -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: job.prompt,
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":"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"}
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;AAMhF,OAAO,KAAK,EAAoC,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAExG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAoF7D,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,CA6yDf"}
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"}
@@ -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: body.id || crypto.randomUUID(),
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
- jobs[idx] = { ...jobs[idx], ...body, id: params.id };
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]);