jinn-cli 0.1.0
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/bin/jimmy.d.ts +3 -0
- package/dist/bin/jimmy.d.ts.map +1 -0
- package/dist/bin/jimmy.js +148 -0
- package/dist/bin/jimmy.js.map +1 -0
- package/dist/src/cli/chrome-allow.d.ts +5 -0
- package/dist/src/cli/chrome-allow.d.ts.map +1 -0
- package/dist/src/cli/chrome-allow.js +241 -0
- package/dist/src/cli/chrome-allow.js.map +1 -0
- package/dist/src/cli/create.d.ts +2 -0
- package/dist/src/cli/create.d.ts.map +1 -0
- package/dist/src/cli/create.js +72 -0
- package/dist/src/cli/create.js.map +1 -0
- package/dist/src/cli/instances.d.ts +14 -0
- package/dist/src/cli/instances.d.ts.map +1 -0
- package/dist/src/cli/instances.js +43 -0
- package/dist/src/cli/instances.js.map +1 -0
- package/dist/src/cli/list.d.ts +2 -0
- package/dist/src/cli/list.d.ts.map +1 -0
- package/dist/src/cli/list.js +38 -0
- package/dist/src/cli/list.js.map +1 -0
- package/dist/src/cli/migrate.d.ts +5 -0
- package/dist/src/cli/migrate.d.ts.map +1 -0
- package/dist/src/cli/migrate.js +203 -0
- package/dist/src/cli/migrate.js.map +1 -0
- package/dist/src/cli/nuke.d.ts +2 -0
- package/dist/src/cli/nuke.d.ts.map +1 -0
- package/dist/src/cli/nuke.js +91 -0
- package/dist/src/cli/nuke.js.map +1 -0
- package/dist/src/cli/remove.d.ts +4 -0
- package/dist/src/cli/remove.d.ts.map +1 -0
- package/dist/src/cli/remove.js +47 -0
- package/dist/src/cli/remove.js.map +1 -0
- package/dist/src/cli/setup.d.ts +4 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +483 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/skills.d.ts +28 -0
- package/dist/src/cli/skills.d.ts.map +1 -0
- package/dist/src/cli/skills.js +284 -0
- package/dist/src/cli/skills.js.map +1 -0
- package/dist/src/cli/start.d.ts +5 -0
- package/dist/src/cli/start.d.ts.map +1 -0
- package/dist/src/cli/start.js +34 -0
- package/dist/src/cli/start.js.map +1 -0
- package/dist/src/cli/status.d.ts +2 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +60 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/stop.d.ts +2 -0
- package/dist/src/cli/stop.d.ts.map +1 -0
- package/dist/src/cli/stop.js +11 -0
- package/dist/src/cli/stop.js.map +1 -0
- package/dist/src/connectors/slack/format.d.ts +10 -0
- package/dist/src/connectors/slack/format.d.ts.map +1 -0
- package/dist/src/connectors/slack/format.js +55 -0
- package/dist/src/connectors/slack/format.js.map +1 -0
- package/dist/src/connectors/slack/index.d.ts +18 -0
- package/dist/src/connectors/slack/index.d.ts.map +1 -0
- package/dist/src/connectors/slack/index.js +122 -0
- package/dist/src/connectors/slack/index.js.map +1 -0
- package/dist/src/connectors/slack/threads.d.ts +2 -0
- package/dist/src/connectors/slack/threads.d.ts.map +1 -0
- package/dist/src/connectors/slack/threads.js +10 -0
- package/dist/src/connectors/slack/threads.js.map +1 -0
- package/dist/src/cron/jobs.d.ts +5 -0
- package/dist/src/cron/jobs.d.ts.map +1 -0
- package/dist/src/cron/jobs.js +23 -0
- package/dist/src/cron/jobs.js.map +1 -0
- package/dist/src/cron/runner.d.ts +3 -0
- package/dist/src/cron/runner.d.ts.map +1 -0
- package/dist/src/cron/runner.js +118 -0
- package/dist/src/cron/runner.js.map +1 -0
- package/dist/src/cron/scheduler.d.ts +5 -0
- package/dist/src/cron/scheduler.d.ts.map +1 -0
- package/dist/src/cron/scheduler.js +39 -0
- package/dist/src/cron/scheduler.js.map +1 -0
- package/dist/src/engines/claude.d.ts +14 -0
- package/dist/src/engines/claude.d.ts.map +1 -0
- package/dist/src/engines/claude.js +264 -0
- package/dist/src/engines/claude.js.map +1 -0
- package/dist/src/engines/codex.d.ts +15 -0
- package/dist/src/engines/codex.d.ts.map +1 -0
- package/dist/src/engines/codex.js +346 -0
- package/dist/src/engines/codex.js.map +1 -0
- package/dist/src/gateway/api.d.ts +13 -0
- package/dist/src/gateway/api.d.ts.map +1 -0
- package/dist/src/gateway/api.js +819 -0
- package/dist/src/gateway/api.js.map +1 -0
- package/dist/src/gateway/daemon-entry.d.ts +2 -0
- package/dist/src/gateway/daemon-entry.d.ts.map +1 -0
- package/dist/src/gateway/daemon-entry.js +12 -0
- package/dist/src/gateway/daemon-entry.js.map +1 -0
- package/dist/src/gateway/lifecycle.d.ts +10 -0
- package/dist/src/gateway/lifecycle.d.ts.map +1 -0
- package/dist/src/gateway/lifecycle.js +124 -0
- package/dist/src/gateway/lifecycle.js.map +1 -0
- package/dist/src/gateway/org.d.ts +10 -0
- package/dist/src/gateway/org.d.ts.map +1 -0
- package/dist/src/gateway/org.js +71 -0
- package/dist/src/gateway/org.js.map +1 -0
- package/dist/src/gateway/server.d.ts +4 -0
- package/dist/src/gateway/server.d.ts.map +1 -0
- package/dist/src/gateway/server.js +301 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/watcher.d.ts +14 -0
- package/dist/src/gateway/watcher.d.ts.map +1 -0
- package/dist/src/gateway/watcher.js +104 -0
- package/dist/src/gateway/watcher.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/sessions/context.d.ts +20 -0
- package/dist/src/sessions/context.d.ts.map +1 -0
- package/dist/src/sessions/context.js +532 -0
- package/dist/src/sessions/context.js.map +1 -0
- package/dist/src/sessions/manager.d.ts +38 -0
- package/dist/src/sessions/manager.d.ts.map +1 -0
- package/dist/src/sessions/manager.js +208 -0
- package/dist/src/sessions/manager.js.map +1 -0
- package/dist/src/sessions/queue.d.ts +14 -0
- package/dist/src/sessions/queue.d.ts.map +1 -0
- package/dist/src/sessions/queue.js +42 -0
- package/dist/src/sessions/queue.js.map +1 -0
- package/dist/src/sessions/registry.d.ts +46 -0
- package/dist/src/sessions/registry.d.ts.map +1 -0
- package/dist/src/sessions/registry.js +193 -0
- package/dist/src/sessions/registry.js.map +1 -0
- package/dist/src/shared/config.d.ts +3 -0
- package/dist/src/shared/config.d.ts.map +1 -0
- package/dist/src/shared/config.js +11 -0
- package/dist/src/shared/config.js.map +1 -0
- package/dist/src/shared/logger.d.ts +12 -0
- package/dist/src/shared/logger.d.ts.map +1 -0
- package/dist/src/shared/logger.js +35 -0
- package/dist/src/shared/logger.js.map +1 -0
- package/dist/src/shared/paths.d.ts +19 -0
- package/dist/src/shared/paths.d.ts.map +1 -0
- package/dist/src/shared/paths.js +31 -0
- package/dist/src/shared/paths.js.map +1 -0
- package/dist/src/shared/types.d.ts +166 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +4 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/src/shared/version.d.ts +15 -0
- package/dist/src/shared/version.d.ts.map +1 -0
- package/dist/src/shared/version.js +56 -0
- package/dist/src/shared/version.js.map +1 -0
- package/dist/web/404.html +1 -0
- package/dist/web/_next/static/chunks/198-fd91406a158c5c25.js +1 -0
- package/dist/web/_next/static/chunks/517.62389e8d3c929c43.js +1 -0
- package/dist/web/_next/static/chunks/534-17c49c944e0d0fe1.js +1 -0
- package/dist/web/_next/static/chunks/573-070537ec2452d03e.js +1 -0
- package/dist/web/_next/static/chunks/590-2c34156c7417317e.js +1 -0
- package/dist/web/_next/static/chunks/704-af2893821e1d18dc.js +1 -0
- package/dist/web/_next/static/chunks/7273c211.06e3b6021d90b73f.js +1 -0
- package/dist/web/_next/static/chunks/73-c226535579393e21.js +1 -0
- package/dist/web/_next/static/chunks/743-5bb03adbb0e4ddec.js +1 -0
- package/dist/web/_next/static/chunks/874.97d5a27895061057.js +1 -0
- package/dist/web/_next/static/chunks/8e6518bb-c26e82767f1faf66.js +1 -0
- package/dist/web/_next/static/chunks/app/_not-found/page-bb075b0779827928.js +1 -0
- package/dist/web/_next/static/chunks/app/chat/page-6d5bc707a45c92c6.js +1 -0
- package/dist/web/_next/static/chunks/app/costs/page-d6c03718defdb599.js +1 -0
- package/dist/web/_next/static/chunks/app/cron/page-4c563eef2b6231fe.js +1 -0
- package/dist/web/_next/static/chunks/app/kanban/page-55a73165a36f4077.js +1 -0
- package/dist/web/_next/static/chunks/app/layout-5129b67d5f126cf0.js +1 -0
- package/dist/web/_next/static/chunks/app/logs/page-e18889d67e48c9c9.js +1 -0
- package/dist/web/_next/static/chunks/app/org/page-d5cd8d9b7864737b.js +1 -0
- package/dist/web/_next/static/chunks/app/page-b81992940fd1dbc6.js +1 -0
- package/dist/web/_next/static/chunks/app/sessions/page-2eef6ac7882a28ba.js +1 -0
- package/dist/web/_next/static/chunks/app/settings/page-4fb01b9b09500170.js +1 -0
- package/dist/web/_next/static/chunks/app/skills/page-df9465e314561bb5.js +1 -0
- package/dist/web/_next/static/chunks/framework-077b27ad7787463c.js +1 -0
- package/dist/web/_next/static/chunks/main-app-437f51faf74fbb3b.js +1 -0
- package/dist/web/_next/static/chunks/main-f1c74cefd4965abf.js +1 -0
- package/dist/web/_next/static/chunks/pages/_app-77a85fe7d6bca671.js +1 -0
- package/dist/web/_next/static/chunks/pages/_error-68febf4b34900064.js +1 -0
- package/dist/web/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/web/_next/static/chunks/webpack-0f39b7e91dce9791.js +1 -0
- package/dist/web/_next/static/css/4a6a5bca9238c104.css +1 -0
- package/dist/web/_next/static/vLvOwhC8JocJzSHTHKKOv/_buildManifest.js +1 -0
- package/dist/web/_next/static/vLvOwhC8JocJzSHTHKKOv/_ssgManifest.js +1 -0
- package/dist/web/chat.html +1 -0
- package/dist/web/chat.txt +20 -0
- package/dist/web/costs.html +16 -0
- package/dist/web/costs.txt +20 -0
- package/dist/web/cron.html +1 -0
- package/dist/web/cron.txt +20 -0
- package/dist/web/index.html +1 -0
- package/dist/web/index.txt +20 -0
- package/dist/web/kanban.html +1 -0
- package/dist/web/kanban.txt +20 -0
- package/dist/web/logs.html +7 -0
- package/dist/web/logs.txt +20 -0
- package/dist/web/org.html +1 -0
- package/dist/web/org.txt +20 -0
- package/dist/web/sessions.html +1 -0
- package/dist/web/sessions.txt +20 -0
- package/dist/web/settings.html +1 -0
- package/dist/web/settings.txt +20 -0
- package/dist/web/skills.html +1 -0
- package/dist/web/skills.txt +20 -0
- package/package.json +43 -0
- package/template/AGENTS.md +167 -0
- package/template/CLAUDE.md +106 -0
- package/template/config.default.yaml +27 -0
- package/template/docs/architecture.md +74 -0
- package/template/docs/connectors.md +72 -0
- package/template/docs/cron.md +137 -0
- package/template/docs/org.md +105 -0
- package/template/docs/overview.md +39 -0
- package/template/docs/self-modification.md +65 -0
- package/template/docs/skills.md +58 -0
- package/template/knowledge/.gitkeep +0 -0
- package/template/migrations/.gitkeep +0 -0
- package/template/migrations/0.1.0/MIGRATION.md +25 -0
- package/template/skills/cron-manager/SKILL.md +127 -0
- package/template/skills/find-and-install/SKILL.md +92 -0
- package/template/skills/management/SKILL.md +203 -0
- package/template/skills/migrate/SKILL.md +154 -0
- package/template/skills/new/SKILL.md +19 -0
- package/template/skills/onboarding/SKILL.md +106 -0
- package/template/skills/self-heal/SKILL.md +114 -0
- package/template/skills/skill-creator/SKILL.md +112 -0
- package/template/skills/status/SKILL.md +19 -0
- package/template/skills/sync/SKILL.md +67 -0
- package/template/skills.json +3 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { App } from "@slack/bolt";
|
|
2
|
+
import { deriveSourceRef } from "./threads.js";
|
|
3
|
+
import { formatResponse, downloadAttachment } from "./format.js";
|
|
4
|
+
import { TMP_DIR } from "../../shared/paths.js";
|
|
5
|
+
import { logger } from "../../shared/logger.js";
|
|
6
|
+
export class SlackConnector {
|
|
7
|
+
name = "slack";
|
|
8
|
+
app;
|
|
9
|
+
handler = null;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.app = new App({
|
|
12
|
+
token: config.botToken,
|
|
13
|
+
appToken: config.appToken,
|
|
14
|
+
socketMode: true,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async start() {
|
|
18
|
+
this.app.message(async ({ event }) => {
|
|
19
|
+
// Skip bot's own messages
|
|
20
|
+
if (event.bot_id)
|
|
21
|
+
return;
|
|
22
|
+
if (!this.handler)
|
|
23
|
+
return;
|
|
24
|
+
const sourceRef = deriveSourceRef(event);
|
|
25
|
+
// Download attachments if present
|
|
26
|
+
const attachments = [];
|
|
27
|
+
if (event.files) {
|
|
28
|
+
for (const file of event.files) {
|
|
29
|
+
try {
|
|
30
|
+
const localPath = await downloadAttachment(file.url_private, this.app.client.token, TMP_DIR);
|
|
31
|
+
attachments.push({
|
|
32
|
+
name: file.name,
|
|
33
|
+
url: file.url_private,
|
|
34
|
+
mimeType: file.mimetype,
|
|
35
|
+
localPath,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
logger.warn(`Failed to download attachment: ${err}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const msg = {
|
|
44
|
+
source: "slack",
|
|
45
|
+
channel: event.channel,
|
|
46
|
+
thread: event.thread_ts,
|
|
47
|
+
user: event.user,
|
|
48
|
+
userId: event.user,
|
|
49
|
+
text: event.text || "",
|
|
50
|
+
attachments,
|
|
51
|
+
raw: event,
|
|
52
|
+
};
|
|
53
|
+
this.handler(msg);
|
|
54
|
+
});
|
|
55
|
+
await this.app.start();
|
|
56
|
+
logger.info("Slack connector started (socket mode)");
|
|
57
|
+
}
|
|
58
|
+
async stop() {
|
|
59
|
+
await this.app.stop();
|
|
60
|
+
logger.info("Slack connector stopped");
|
|
61
|
+
}
|
|
62
|
+
async sendMessage(target, text) {
|
|
63
|
+
if (!text || !text.trim())
|
|
64
|
+
return undefined;
|
|
65
|
+
const chunks = formatResponse(text);
|
|
66
|
+
let lastTs;
|
|
67
|
+
for (const chunk of chunks) {
|
|
68
|
+
if (!chunk.trim())
|
|
69
|
+
continue;
|
|
70
|
+
const res = await this.app.client.chat.postMessage({
|
|
71
|
+
channel: target.channel,
|
|
72
|
+
thread_ts: target.thread,
|
|
73
|
+
text: chunk,
|
|
74
|
+
});
|
|
75
|
+
lastTs = res.ts;
|
|
76
|
+
}
|
|
77
|
+
return lastTs;
|
|
78
|
+
}
|
|
79
|
+
async addReaction(target, emoji) {
|
|
80
|
+
if (!target.messageTs)
|
|
81
|
+
return;
|
|
82
|
+
try {
|
|
83
|
+
await this.app.client.reactions.add({
|
|
84
|
+
channel: target.channel,
|
|
85
|
+
timestamp: target.messageTs,
|
|
86
|
+
name: emoji,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logger.warn(`Failed to add reaction: ${err}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async removeReaction(target, emoji) {
|
|
94
|
+
if (!target.messageTs)
|
|
95
|
+
return;
|
|
96
|
+
try {
|
|
97
|
+
await this.app.client.reactions.remove({
|
|
98
|
+
channel: target.channel,
|
|
99
|
+
timestamp: target.messageTs,
|
|
100
|
+
name: emoji,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.warn(`Failed to remove reaction: ${err}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async editMessage(target, text) {
|
|
108
|
+
if (!target.messageTs)
|
|
109
|
+
return;
|
|
110
|
+
if (!text || !text.trim())
|
|
111
|
+
return;
|
|
112
|
+
await this.app.client.chat.update({
|
|
113
|
+
channel: target.channel,
|
|
114
|
+
ts: target.messageTs,
|
|
115
|
+
text,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
onMessage(handler) {
|
|
119
|
+
this.handler = handler;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/connectors/slack/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAQlD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function deriveSourceRef(event) {
|
|
2
|
+
if (event.channel_type === "im") {
|
|
3
|
+
return `slack:dm:${event.user}`;
|
|
4
|
+
}
|
|
5
|
+
if (event.thread_ts && event.thread_ts !== event.ts) {
|
|
6
|
+
return `slack:${event.channel}:${event.thread_ts}`;
|
|
7
|
+
}
|
|
8
|
+
return `slack:${event.channel}`;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAU;IACxC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QACpD,OAAO,SAAS,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,SAAS,KAAK,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/cron/jobs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,wBAAgB,QAAQ,IAAI,OAAO,EAAE,CAOpC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CRON_JOBS, CRON_RUNS } from "../shared/paths.js";
|
|
4
|
+
export function loadJobs() {
|
|
5
|
+
try {
|
|
6
|
+
const raw = fs.readFileSync(CRON_JOBS, "utf-8");
|
|
7
|
+
return JSON.parse(raw);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function saveJobs(jobs) {
|
|
14
|
+
const dir = path.dirname(CRON_JOBS);
|
|
15
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
16
|
+
fs.writeFileSync(CRON_JOBS, JSON.stringify(jobs, null, 2) + "\n", "utf-8");
|
|
17
|
+
}
|
|
18
|
+
export function appendRunLog(jobId, entry) {
|
|
19
|
+
fs.mkdirSync(CRON_RUNS, { recursive: true });
|
|
20
|
+
const logPath = path.join(CRON_RUNS, `${jobId}.jsonl`);
|
|
21
|
+
fs.appendFileSync(logPath, JSON.stringify(entry) + "\n", "utf-8");
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/cron/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAe;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa;IACvD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;IACvD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQjF,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAmIf"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { buildContext } from "../sessions/context.js";
|
|
2
|
+
import { createSession, updateSession, insertMessage } from "../sessions/registry.js";
|
|
3
|
+
import { JINN_HOME } from "../shared/paths.js";
|
|
4
|
+
import { logger } from "../shared/logger.js";
|
|
5
|
+
import { appendRunLog } from "./jobs.js";
|
|
6
|
+
import { scanOrg, findEmployee } from "../gateway/org.js";
|
|
7
|
+
export async function runCronJob(job, engines, config, connectors) {
|
|
8
|
+
const startTime = Date.now();
|
|
9
|
+
logger.info(`Cron job "${job.name}" (${job.id}) starting`);
|
|
10
|
+
// 1. Determine engine + model
|
|
11
|
+
const engineName = job.engine || config.engines.default;
|
|
12
|
+
const engine = engines.get(engineName);
|
|
13
|
+
if (!engine) {
|
|
14
|
+
logger.error(`Engine "${engineName}" not found for cron job "${job.name}"`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const model = job.model || config.engines[engineName]?.model;
|
|
18
|
+
// 2. Warn if a non-COO employee has delivery configured (anti-pattern)
|
|
19
|
+
const delivery = job.delivery || config.cron?.defaultDelivery;
|
|
20
|
+
const cooSlug = config.portal?.portalName?.toLowerCase() || "jinn";
|
|
21
|
+
if (delivery && job.employee && job.employee !== cooSlug) {
|
|
22
|
+
logger.warn(`Cron job "${job.name}" targets employee "${job.employee}" with delivery to ${delivery.connector}:${delivery.channel}. ` +
|
|
23
|
+
`Recommended pattern: target "${cooSlug}" and let the COO delegate to "${job.employee}" via a child session for output review/filtering.`);
|
|
24
|
+
}
|
|
25
|
+
// 3. Resolve employee
|
|
26
|
+
let employee;
|
|
27
|
+
if (job.employee) {
|
|
28
|
+
const orgRegistry = scanOrg();
|
|
29
|
+
employee = findEmployee(job.employee, orgRegistry);
|
|
30
|
+
}
|
|
31
|
+
// 4. Create a proper session in the DB
|
|
32
|
+
const sourceRef = `cron:${job.id}`;
|
|
33
|
+
const session = createSession({
|
|
34
|
+
engine: engineName,
|
|
35
|
+
source: "cron",
|
|
36
|
+
sourceRef,
|
|
37
|
+
employee: employee?.name,
|
|
38
|
+
model,
|
|
39
|
+
title: job.name,
|
|
40
|
+
prompt: job.prompt,
|
|
41
|
+
portalName: config.portal?.portalName,
|
|
42
|
+
});
|
|
43
|
+
insertMessage(session.id, "user", job.prompt);
|
|
44
|
+
// 5. Build context
|
|
45
|
+
const ctx = buildContext({
|
|
46
|
+
source: "cron",
|
|
47
|
+
channel: job.id,
|
|
48
|
+
user: "system",
|
|
49
|
+
employee,
|
|
50
|
+
config,
|
|
51
|
+
connectors: Array.from(connectors.keys()),
|
|
52
|
+
sessionId: session.id,
|
|
53
|
+
});
|
|
54
|
+
updateSession(session.id, {
|
|
55
|
+
status: "running",
|
|
56
|
+
lastActivity: new Date().toISOString(),
|
|
57
|
+
});
|
|
58
|
+
// 6. Run engine (fresh session, no resume)
|
|
59
|
+
try {
|
|
60
|
+
const result = await engine.run({
|
|
61
|
+
prompt: job.prompt,
|
|
62
|
+
systemPrompt: ctx,
|
|
63
|
+
cwd: JINN_HOME,
|
|
64
|
+
model,
|
|
65
|
+
});
|
|
66
|
+
const durationMs = Date.now() - startTime;
|
|
67
|
+
const responseText = result.result?.trim()
|
|
68
|
+
? result.result
|
|
69
|
+
: result.error || "(No response from engine)";
|
|
70
|
+
// Persist assistant response
|
|
71
|
+
insertMessage(session.id, "assistant", responseText);
|
|
72
|
+
// Update session with engine session id
|
|
73
|
+
updateSession(session.id, {
|
|
74
|
+
engineSessionId: result.sessionId,
|
|
75
|
+
status: result.error ? "error" : "idle",
|
|
76
|
+
lastActivity: new Date().toISOString(),
|
|
77
|
+
lastError: result.error ?? null,
|
|
78
|
+
});
|
|
79
|
+
// 7. If delivery configured (job-level or default), send result to connector
|
|
80
|
+
if (delivery && result.result) {
|
|
81
|
+
const connector = connectors.get(delivery.connector);
|
|
82
|
+
if (connector) {
|
|
83
|
+
await connector.sendMessage({ channel: delivery.channel }, result.result);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger.warn(`Delivery connector "${delivery.connector}" not found`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 8. Log run
|
|
90
|
+
appendRunLog(job.id, {
|
|
91
|
+
timestamp: new Date().toISOString(),
|
|
92
|
+
sessionId: session.id,
|
|
93
|
+
status: result.error ? "error" : "success",
|
|
94
|
+
durationMs,
|
|
95
|
+
error: result.error || null,
|
|
96
|
+
resultPreview: result.result?.slice(0, 500) || null,
|
|
97
|
+
});
|
|
98
|
+
logger.info(`Cron job "${job.name}" completed in ${durationMs}ms`);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const durationMs = Date.now() - startTime;
|
|
102
|
+
updateSession(session.id, {
|
|
103
|
+
status: "error",
|
|
104
|
+
lastActivity: new Date().toISOString(),
|
|
105
|
+
lastError: err.message,
|
|
106
|
+
});
|
|
107
|
+
appendRunLog(job.id, {
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
sessionId: session.id,
|
|
110
|
+
status: "error",
|
|
111
|
+
durationMs,
|
|
112
|
+
error: err.message,
|
|
113
|
+
resultPreview: null,
|
|
114
|
+
});
|
|
115
|
+
logger.error(`Cron job "${job.name}" failed: ${err.message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/cron/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CronJob, Engine, JinnConfig, Connector } from "../shared/types.js";
|
|
2
|
+
export declare function startScheduler(jobs: CronJob[], engines: Map<string, Engine>, config: JinnConfig, connectors: Map<string, Connector>): void;
|
|
3
|
+
export declare function reloadScheduler(jobs: CronJob[]): void;
|
|
4
|
+
export declare function stopScheduler(): void;
|
|
5
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/cron/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,UAAU,EACV,SAAS,EACV,MAAM,oBAAoB,CAAC;AAS5B,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GACjC,IAAI,CAKN;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAGrD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import cron from "node-cron";
|
|
2
|
+
import { runCronJob } from "./runner.js";
|
|
3
|
+
import { logger } from "../shared/logger.js";
|
|
4
|
+
let tasks = [];
|
|
5
|
+
let currentEngines;
|
|
6
|
+
let currentConfig;
|
|
7
|
+
let currentConnectors;
|
|
8
|
+
export function startScheduler(jobs, engines, config, connectors) {
|
|
9
|
+
currentEngines = engines;
|
|
10
|
+
currentConfig = config;
|
|
11
|
+
currentConnectors = connectors;
|
|
12
|
+
scheduleJobs(jobs);
|
|
13
|
+
}
|
|
14
|
+
export function reloadScheduler(jobs) {
|
|
15
|
+
stopScheduler();
|
|
16
|
+
scheduleJobs(jobs);
|
|
17
|
+
}
|
|
18
|
+
export function stopScheduler() {
|
|
19
|
+
for (const task of tasks) {
|
|
20
|
+
task.stop();
|
|
21
|
+
}
|
|
22
|
+
tasks = [];
|
|
23
|
+
}
|
|
24
|
+
function scheduleJobs(jobs) {
|
|
25
|
+
for (const job of jobs) {
|
|
26
|
+
if (!job.enabled)
|
|
27
|
+
continue;
|
|
28
|
+
if (!cron.validate(job.schedule)) {
|
|
29
|
+
logger.warn(`Invalid cron schedule for job "${job.name}": ${job.schedule}`);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const task = cron.schedule(job.schedule, () => {
|
|
33
|
+
runCronJob(job, currentEngines, currentConfig, currentConnectors);
|
|
34
|
+
}, { timezone: job.timezone });
|
|
35
|
+
tasks.push(task);
|
|
36
|
+
logger.info(`Scheduled cron job "${job.name}" (${job.schedule})`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/cron/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,IAAI,KAAK,GAAyB,EAAE,CAAC;AACrC,IAAI,cAAmC,CAAC;AACxC,IAAI,aAAyB,CAAC;AAC9B,IAAI,iBAAyC,CAAC;AAE9C,MAAM,UAAU,cAAc,CAC5B,IAAe,EACf,OAA4B,EAC5B,MAAkB,EAClB,UAAkC;IAElC,cAAc,GAAG,OAAO,CAAC;IACzB,aAAa,GAAG,MAAM,CAAC;IACvB,iBAAiB,GAAG,UAAU,CAAC;IAC/B,YAAY,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAe;IAC7C,aAAa,EAAE,CAAC;IAChB,YAAY,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IACD,KAAK,GAAG,EAAE,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAe;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,SAAS;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CACT,kCAAkC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,QAAQ,EAAE,CAC/D,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CACxB,GAAG,CAAC,QAAQ,EACZ,GAAG,EAAE;YACH,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACpE,CAAC,EACD,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAC3B,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InterruptibleEngine, EngineRunOpts, EngineResult } from "../shared/types.js";
|
|
2
|
+
export declare class ClaudeEngine implements InterruptibleEngine {
|
|
3
|
+
name: "claude";
|
|
4
|
+
private liveProcesses;
|
|
5
|
+
kill(sessionId: string, reason?: string): void;
|
|
6
|
+
killAll(): void;
|
|
7
|
+
isAlive(sessionId: string): boolean;
|
|
8
|
+
run(opts: EngineRunOpts): Promise<EngineResult>;
|
|
9
|
+
private processStreamLine;
|
|
10
|
+
private extractResult;
|
|
11
|
+
private buildCleanEnv;
|
|
12
|
+
private signalProcess;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/engines/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAQxG,qBAAa,YAAa,YAAW,mBAAmB;IACtD,IAAI,EAAG,QAAQ,CAAU;IACzB,OAAO,CAAC,aAAa,CAAkC;IAEvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAgB,GAAG,IAAI;IAcrD,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK7B,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkKrD,OAAO,CAAC,iBAAiB;IA+DzB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;CAYtB"}
|