open-agents-ai 0.187.305 → 0.187.308
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/index.js +307 -30
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -88532,7 +88532,7 @@ var require_auto = __commonJS({
|
|
|
88532
88532
|
// ../node_modules/acme-client/src/client.js
|
|
88533
88533
|
var require_client = __commonJS({
|
|
88534
88534
|
"../node_modules/acme-client/src/client.js"(exports, module) {
|
|
88535
|
-
var { createHash:
|
|
88535
|
+
var { createHash: createHash11 } = __require("crypto");
|
|
88536
88536
|
var { getPemBodyAsB64u } = require_crypto();
|
|
88537
88537
|
var { log: log22 } = require_logger();
|
|
88538
88538
|
var HttpClient = require_http();
|
|
@@ -88843,14 +88843,14 @@ var require_client = __commonJS({
|
|
|
88843
88843
|
*/
|
|
88844
88844
|
async getChallengeKeyAuthorization(challenge) {
|
|
88845
88845
|
const jwk = this.http.getJwk();
|
|
88846
|
-
const keysum =
|
|
88846
|
+
const keysum = createHash11("sha256").update(JSON.stringify(jwk));
|
|
88847
88847
|
const thumbprint = keysum.digest("base64url");
|
|
88848
88848
|
const result = `${challenge.token}.${thumbprint}`;
|
|
88849
88849
|
if (challenge.type === "http-01") {
|
|
88850
88850
|
return result;
|
|
88851
88851
|
}
|
|
88852
88852
|
if (challenge.type === "dns-01") {
|
|
88853
|
-
return
|
|
88853
|
+
return createHash11("sha256").update(result).digest("base64url");
|
|
88854
88854
|
}
|
|
88855
88855
|
if (challenge.type === "tls-alpn-01") {
|
|
88856
88856
|
return result;
|
|
@@ -231530,7 +231530,7 @@ var require_websocket2 = __commonJS({
|
|
|
231530
231530
|
var http6 = __require("http");
|
|
231531
231531
|
var net5 = __require("net");
|
|
231532
231532
|
var tls2 = __require("tls");
|
|
231533
|
-
var { randomBytes: randomBytes23, createHash:
|
|
231533
|
+
var { randomBytes: randomBytes23, createHash: createHash11 } = __require("crypto");
|
|
231534
231534
|
var { Duplex: Duplex3, Readable } = __require("stream");
|
|
231535
231535
|
var { URL: URL3 } = __require("url");
|
|
231536
231536
|
var PerMessageDeflate2 = require_permessage_deflate2();
|
|
@@ -232190,7 +232190,7 @@ var require_websocket2 = __commonJS({
|
|
|
232190
232190
|
abortHandshake(websocket, socket, "Invalid Upgrade header");
|
|
232191
232191
|
return;
|
|
232192
232192
|
}
|
|
232193
|
-
const digest3 =
|
|
232193
|
+
const digest3 = createHash11("sha1").update(key + GUID).digest("base64");
|
|
232194
232194
|
if (res.headers["sec-websocket-accept"] !== digest3) {
|
|
232195
232195
|
abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
|
|
232196
232196
|
return;
|
|
@@ -232557,7 +232557,7 @@ var require_websocket_server = __commonJS({
|
|
|
232557
232557
|
var EventEmitter11 = __require("events");
|
|
232558
232558
|
var http6 = __require("http");
|
|
232559
232559
|
var { Duplex: Duplex3 } = __require("stream");
|
|
232560
|
-
var { createHash:
|
|
232560
|
+
var { createHash: createHash11 } = __require("crypto");
|
|
232561
232561
|
var extension2 = require_extension2();
|
|
232562
232562
|
var PerMessageDeflate2 = require_permessage_deflate2();
|
|
232563
232563
|
var subprotocol2 = require_subprotocol();
|
|
@@ -232858,7 +232858,7 @@ var require_websocket_server = __commonJS({
|
|
|
232858
232858
|
);
|
|
232859
232859
|
}
|
|
232860
232860
|
if (this._state > RUNNING) return abortHandshake(socket, 503);
|
|
232861
|
-
const digest3 =
|
|
232861
|
+
const digest3 = createHash11("sha1").update(key + GUID).digest("base64");
|
|
232862
232862
|
const headers = [
|
|
232863
232863
|
"HTTP/1.1 101 Switching Protocols",
|
|
232864
232864
|
"Upgrade: websocket",
|
|
@@ -240032,7 +240032,7 @@ var require_compile = __commonJS({
|
|
|
240032
240032
|
var fill = require_fill_range();
|
|
240033
240033
|
var utils = require_utils3();
|
|
240034
240034
|
var compile = (ast, options2 = {}) => {
|
|
240035
|
-
const
|
|
240035
|
+
const walk2 = (node, parent = {}) => {
|
|
240036
240036
|
const invalidBlock = utils.isInvalidBrace(parent);
|
|
240037
240037
|
const invalidNode = node.invalid === true && options2.escapeInvalid === true;
|
|
240038
240038
|
const invalid = invalidBlock === true || invalidNode === true;
|
|
@@ -240066,12 +240066,12 @@ var require_compile = __commonJS({
|
|
|
240066
240066
|
}
|
|
240067
240067
|
if (node.nodes) {
|
|
240068
240068
|
for (const child of node.nodes) {
|
|
240069
|
-
output +=
|
|
240069
|
+
output += walk2(child, node);
|
|
240070
240070
|
}
|
|
240071
240071
|
}
|
|
240072
240072
|
return output;
|
|
240073
240073
|
};
|
|
240074
|
-
return
|
|
240074
|
+
return walk2(ast);
|
|
240075
240075
|
};
|
|
240076
240076
|
module.exports = compile;
|
|
240077
240077
|
}
|
|
@@ -240108,7 +240108,7 @@ var require_expand = __commonJS({
|
|
|
240108
240108
|
};
|
|
240109
240109
|
var expand2 = (ast, options2 = {}) => {
|
|
240110
240110
|
const rangeLimit = options2.rangeLimit === void 0 ? 1e3 : options2.rangeLimit;
|
|
240111
|
-
const
|
|
240111
|
+
const walk2 = (node, parent = {}) => {
|
|
240112
240112
|
node.queue = [];
|
|
240113
240113
|
let p2 = parent;
|
|
240114
240114
|
let q = parent.queue;
|
|
@@ -240160,12 +240160,12 @@ var require_expand = __commonJS({
|
|
|
240160
240160
|
continue;
|
|
240161
240161
|
}
|
|
240162
240162
|
if (child.nodes) {
|
|
240163
|
-
|
|
240163
|
+
walk2(child, node);
|
|
240164
240164
|
}
|
|
240165
240165
|
}
|
|
240166
240166
|
return queue;
|
|
240167
240167
|
};
|
|
240168
|
-
return utils.flatten(
|
|
240168
|
+
return utils.flatten(walk2(ast));
|
|
240169
240169
|
};
|
|
240170
240170
|
module.exports = expand2;
|
|
240171
240171
|
}
|
|
@@ -244128,14 +244128,14 @@ var require_out3 = __commonJS({
|
|
|
244128
244128
|
var sync_1 = require_sync4();
|
|
244129
244129
|
var settings_1 = require_settings3();
|
|
244130
244130
|
exports.Settings = settings_1.default;
|
|
244131
|
-
function
|
|
244131
|
+
function walk2(directory, optionsOrSettingsOrCallback, callback) {
|
|
244132
244132
|
if (typeof optionsOrSettingsOrCallback === "function") {
|
|
244133
244133
|
new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);
|
|
244134
244134
|
return;
|
|
244135
244135
|
}
|
|
244136
244136
|
new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);
|
|
244137
244137
|
}
|
|
244138
|
-
exports.walk =
|
|
244138
|
+
exports.walk = walk2;
|
|
244139
244139
|
function walkSync(directory, optionsOrSettings) {
|
|
244140
244140
|
const settings = getSettings(optionsOrSettings);
|
|
244141
244141
|
const provider = new sync_1.default(directory, settings);
|
|
@@ -245665,13 +245665,13 @@ Justification: ${justification || "(none provided)"}`,
|
|
|
245665
245665
|
}
|
|
245666
245666
|
const snapshot = JSON.stringify(this.selfState, null, 2);
|
|
245667
245667
|
try {
|
|
245668
|
-
const { createHash:
|
|
245668
|
+
const { createHash: createHash11 } = await import("node:crypto");
|
|
245669
245669
|
const snapshotDir = join23(this.cwd, ".oa", "identity", "snapshots");
|
|
245670
245670
|
await mkdir6(snapshotDir, { recursive: true });
|
|
245671
245671
|
const version4 = this.selfState.version;
|
|
245672
245672
|
const snapshotPath = join23(snapshotDir, `v${version4}.json`);
|
|
245673
245673
|
await writeFile11(snapshotPath, snapshot, "utf8");
|
|
245674
|
-
const hash =
|
|
245674
|
+
const hash = createHash11("sha256").update(snapshot).digest("hex");
|
|
245675
245675
|
await writeFile11(join23(this.cwd, ".oa", "identity", "latest-hash.txt"), hash, "utf8");
|
|
245676
245676
|
let ipfsCid = "";
|
|
245677
245677
|
try {
|
|
@@ -245804,8 +245804,8 @@ New: ${newNarrative.slice(0, 200)}...`,
|
|
|
245804
245804
|
}
|
|
245805
245805
|
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
245806
245806
|
createDefaultState() {
|
|
245807
|
-
const { createHash:
|
|
245808
|
-
const machineId =
|
|
245807
|
+
const { createHash: createHash11 } = __require("node:crypto");
|
|
245808
|
+
const machineId = createHash11("sha256").update(this.cwd).digest("hex").slice(0, 12);
|
|
245809
245809
|
return {
|
|
245810
245810
|
self_id: `oa-${machineId}`,
|
|
245811
245811
|
version: 1,
|
|
@@ -245887,9 +245887,9 @@ New: ${newNarrative.slice(0, 200)}...`,
|
|
|
245887
245887
|
let cid;
|
|
245888
245888
|
if (this.selfState.version > prevVersion) {
|
|
245889
245889
|
try {
|
|
245890
|
-
const { createHash:
|
|
245890
|
+
const { createHash: createHash11 } = await import("node:crypto");
|
|
245891
245891
|
const stateJson = JSON.stringify(this.selfState);
|
|
245892
|
-
const hash =
|
|
245892
|
+
const hash = createHash11("sha256").update(stateJson).digest("hex").slice(0, 32);
|
|
245893
245893
|
const cidsPath = join23(this.cwd, ".oa", "identity", "cids.json");
|
|
245894
245894
|
const cidsData = { latest: "", hash, version: this.selfState.version };
|
|
245895
245895
|
try {
|
|
@@ -280714,7 +280714,7 @@ var require_websocket3 = __commonJS({
|
|
|
280714
280714
|
var http6 = __require("http");
|
|
280715
280715
|
var net5 = __require("net");
|
|
280716
280716
|
var tls2 = __require("tls");
|
|
280717
|
-
var { randomBytes: randomBytes23, createHash:
|
|
280717
|
+
var { randomBytes: randomBytes23, createHash: createHash11 } = __require("crypto");
|
|
280718
280718
|
var { Duplex: Duplex3, Readable } = __require("stream");
|
|
280719
280719
|
var { URL: URL3 } = __require("url");
|
|
280720
280720
|
var PerMessageDeflate2 = require_permessage_deflate3();
|
|
@@ -281374,7 +281374,7 @@ var require_websocket3 = __commonJS({
|
|
|
281374
281374
|
abortHandshake(websocket, socket, "Invalid Upgrade header");
|
|
281375
281375
|
return;
|
|
281376
281376
|
}
|
|
281377
|
-
const digest3 =
|
|
281377
|
+
const digest3 = createHash11("sha1").update(key + GUID).digest("base64");
|
|
281378
281378
|
if (res.headers["sec-websocket-accept"] !== digest3) {
|
|
281379
281379
|
abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
|
|
281380
281380
|
return;
|
|
@@ -281741,7 +281741,7 @@ var require_websocket_server2 = __commonJS({
|
|
|
281741
281741
|
var EventEmitter11 = __require("events");
|
|
281742
281742
|
var http6 = __require("http");
|
|
281743
281743
|
var { Duplex: Duplex3 } = __require("stream");
|
|
281744
|
-
var { createHash:
|
|
281744
|
+
var { createHash: createHash11 } = __require("crypto");
|
|
281745
281745
|
var extension2 = require_extension3();
|
|
281746
281746
|
var PerMessageDeflate2 = require_permessage_deflate3();
|
|
281747
281747
|
var subprotocol2 = require_subprotocol2();
|
|
@@ -282042,7 +282042,7 @@ var require_websocket_server2 = __commonJS({
|
|
|
282042
282042
|
);
|
|
282043
282043
|
}
|
|
282044
282044
|
if (this._state > RUNNING) return abortHandshake(socket, 503);
|
|
282045
|
-
const digest3 =
|
|
282045
|
+
const digest3 = createHash11("sha1").update(key + GUID).digest("base64");
|
|
282046
282046
|
const headers = [
|
|
282047
282047
|
"HTTP/1.1 101 Switching Protocols",
|
|
282048
282048
|
"Upgrade: websocket",
|
|
@@ -299192,6 +299192,106 @@ The session corrections MUST become hard rules in the SKILL.md Rules section.`;
|
|
|
299192
299192
|
}
|
|
299193
299193
|
return "handled";
|
|
299194
299194
|
}
|
|
299195
|
+
case "scheduler": {
|
|
299196
|
+
const tokens = (arg || "").trim().length ? (arg || "").trim().split(/\s+/) : [];
|
|
299197
|
+
const sub = (tokens[0] || "menu").toLowerCase();
|
|
299198
|
+
const base3 = `http://127.0.0.1:${process.env["OA_PORT"] || "11435"}`;
|
|
299199
|
+
const doFetch = async (path5, init2) => {
|
|
299200
|
+
const url = base3 + path5;
|
|
299201
|
+
return await fetch(url, init2);
|
|
299202
|
+
};
|
|
299203
|
+
if (sub === "menu") {
|
|
299204
|
+
try {
|
|
299205
|
+
const r2 = await doFetch("/v1/scheduled");
|
|
299206
|
+
const d2 = await r2.json();
|
|
299207
|
+
const tasks = Array.isArray(d2.tasks) ? d2.tasks : [];
|
|
299208
|
+
if (!tasks.length) {
|
|
299209
|
+
renderInfo2("No scheduled tasks found.");
|
|
299210
|
+
return "handled";
|
|
299211
|
+
}
|
|
299212
|
+
const items = tasks.map((t2) => ({
|
|
299213
|
+
key: t2.id,
|
|
299214
|
+
label: `${t2.enabled ? "●" : "○"} ${t2.name || "(task)"} ${t2.schedule ? "[" + t2.schedule + "]" : ""}`,
|
|
299215
|
+
detail: `${t2.file}#${t2.index}`
|
|
299216
|
+
}));
|
|
299217
|
+
items.push({ key: "__kill__", label: "Kill OA schedulers", detail: "Stop scheduler/nexus background processes" });
|
|
299218
|
+
const result = await tuiSelect({
|
|
299219
|
+
items,
|
|
299220
|
+
title: "Scheduled Tasks",
|
|
299221
|
+
onEnter: (item, { done }) => {
|
|
299222
|
+
(async () => {
|
|
299223
|
+
if (item.key === "__kill__") {
|
|
299224
|
+
await doFetch("/v1/scheduled/kill", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) });
|
|
299225
|
+
renderInfo2("Kill signal sent to OA scheduler processes.");
|
|
299226
|
+
done();
|
|
299227
|
+
return;
|
|
299228
|
+
}
|
|
299229
|
+
const task = tasks.find((t2) => t2.id === item.key);
|
|
299230
|
+
if (!task) {
|
|
299231
|
+
done();
|
|
299232
|
+
return;
|
|
299233
|
+
}
|
|
299234
|
+
const next = !task.enabled;
|
|
299235
|
+
const rr = await doFetch(`/v1/scheduled/${encodeURIComponent(task.id)}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ enabled: next }) });
|
|
299236
|
+
if (rr.ok) {
|
|
299237
|
+
task.enabled = next;
|
|
299238
|
+
item.label = `${next ? "●" : "○"} ${task.name || "(task)"} ${task.schedule ? "[" + task.schedule + "]" : ""}`;
|
|
299239
|
+
renderInfo2(`${next ? "Enabled" : "Disabled"} ${task.id}`);
|
|
299240
|
+
} else {
|
|
299241
|
+
renderWarning2(`Failed to toggle ${task.id}`);
|
|
299242
|
+
}
|
|
299243
|
+
done();
|
|
299244
|
+
})();
|
|
299245
|
+
return true;
|
|
299246
|
+
}
|
|
299247
|
+
});
|
|
299248
|
+
void result;
|
|
299249
|
+
} catch (e2) {
|
|
299250
|
+
renderError2(e2?.message || String(e2));
|
|
299251
|
+
}
|
|
299252
|
+
return "handled";
|
|
299253
|
+
}
|
|
299254
|
+
if (sub === "list") {
|
|
299255
|
+
try {
|
|
299256
|
+
const r2 = await doFetch("/v1/scheduled");
|
|
299257
|
+
const d2 = await r2.json();
|
|
299258
|
+
const tasks = Array.isArray(d2.tasks) ? d2.tasks : [];
|
|
299259
|
+
if (!tasks.length) {
|
|
299260
|
+
renderInfo2("No scheduled tasks found.");
|
|
299261
|
+
return "handled";
|
|
299262
|
+
}
|
|
299263
|
+
for (const t2 of tasks) {
|
|
299264
|
+
renderInfo2(`${t2.enabled ? "[on ]" : "[off]"} ${t2.id} ${t2.name || "(task)"} ${t2.schedule || ""}`);
|
|
299265
|
+
renderInfo2(` ${t2.file}#${t2.index}`);
|
|
299266
|
+
}
|
|
299267
|
+
} catch (e2) {
|
|
299268
|
+
renderError2(e2?.message || String(e2));
|
|
299269
|
+
}
|
|
299270
|
+
return "handled";
|
|
299271
|
+
}
|
|
299272
|
+
if ((sub === "enable" || sub === "disable") && tokens[1]) {
|
|
299273
|
+
const id = tokens[1];
|
|
299274
|
+
try {
|
|
299275
|
+
const r2 = await doFetch(`/v1/scheduled/${encodeURIComponent(id)}`, { method: "POST", body: JSON.stringify({ enabled: sub === "enable" }), headers: { "Content-Type": "application/json" } });
|
|
299276
|
+
if (r2.ok) renderInfo2(`${sub}d ${id}`);
|
|
299277
|
+
else renderWarning2(`Failed to ${sub} ${id}`);
|
|
299278
|
+
} catch (e2) {
|
|
299279
|
+
renderError2(e2?.message || String(e2));
|
|
299280
|
+
}
|
|
299281
|
+
return "handled";
|
|
299282
|
+
}
|
|
299283
|
+
if (sub === "kill") {
|
|
299284
|
+
try {
|
|
299285
|
+
await doFetch("/v1/scheduled/kill", { method: "POST", body: JSON.stringify({}), headers: { "Content-Type": "application/json" } });
|
|
299286
|
+
renderInfo2("Kill signal sent to OA scheduler processes.");
|
|
299287
|
+
} catch (e2) {
|
|
299288
|
+
renderError2(e2?.message || String(e2));
|
|
299289
|
+
}
|
|
299290
|
+
return "handled";
|
|
299291
|
+
}
|
|
299292
|
+
renderInfo2("Usage: /scheduler [list|enable <id>|disable <id>|kill]");
|
|
299293
|
+
return "handled";
|
|
299294
|
+
}
|
|
299195
299295
|
case "listen":
|
|
299196
299296
|
case "mic": {
|
|
299197
299297
|
if (!ctx3.listenToggle) {
|
|
@@ -320291,6 +320391,7 @@ body {
|
|
|
320291
320391
|
<div id="jobs-panel" style="display:none;flex:1;overflow-y:auto;padding:12px 16px">
|
|
320292
320392
|
<div id="dashboard-health" style="display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap"></div>
|
|
320293
320393
|
<div id="dashboard-daemons" style="margin-bottom:16px"></div>
|
|
320394
|
+
<div id="dashboard-scheduled" style="margin-bottom:16px"></div>
|
|
320294
320395
|
<div id="dashboard-usage" style="margin-bottom:16px"></div>
|
|
320295
320396
|
<h3 style="color:#b2920a;font-size:0.7rem;margin-bottom:8px">Job History</h3>
|
|
320296
320397
|
<div id="jobs-list" style="font-size:0.78rem"></div>
|
|
@@ -321470,6 +321571,50 @@ async function loadDaemons() {
|
|
|
321470
321571
|
} catch {}
|
|
321471
321572
|
}
|
|
321472
321573
|
|
|
321574
|
+
// Scheduled jobs panel
|
|
321575
|
+
async function loadScheduled() {
|
|
321576
|
+
try {
|
|
321577
|
+
const r = await fetch('/v1/scheduled', { headers: headers() });
|
|
321578
|
+
const d = await r.json();
|
|
321579
|
+
const el = document.getElementById('dashboard-scheduled');
|
|
321580
|
+
if (!el) return;
|
|
321581
|
+
const tasks = Array.isArray(d.tasks) ? d.tasks : [];
|
|
321582
|
+
if (tasks.length === 0) {
|
|
321583
|
+
el.innerHTML = '<div style="background:#1e1e22;border:1px solid #2a2a30;border-radius:3px;padding:8px 12px;color:#555;font-size:0.7rem">No scheduled tasks found</div>';
|
|
321584
|
+
return;
|
|
321585
|
+
}
|
|
321586
|
+
const rows = tasks.map(t => {
|
|
321587
|
+
const enabled = !!t.enabled;
|
|
321588
|
+
const btn = enabled
|
|
321589
|
+
? '<button onclick="toggleScheduled('' + t.id + '',false)" style="background:#2a2a30;border:1px solid #5a2a2a;color:#b25f5f;padding:2px 6px;border-radius:3px;font-size:0.65rem;cursor:pointer">disable</button>'
|
|
321590
|
+
: '<button onclick="toggleScheduled('' + t.id + '',true)" style="background:#2a2a30;border:1px solid #2a3a2a;color:#4ec94e;padding:2px 6px;border-radius:3px;font-size:0.65rem;cursor:pointer">enable</button>';
|
|
321591
|
+
const color = enabled ? '#4ec94e' : '#5a2a2a';
|
|
321592
|
+
const row = '<div style="background:#1e1e22;border-left:2px solid ' + color + ';padding:6px 10px;margin:4px 0;font-size:0.72rem">'
|
|
321593
|
+
+ '<div style="color:#b0b0b0">' + (t.name || '(task)') + ' <span style="color:#555">' + (t.schedule || '') + '</span></div>'
|
|
321594
|
+
+ '<div style="color:#555;font-size:0.6rem">' + t.file + '#' + t.index + '</div>'
|
|
321595
|
+
+ '<div style="margin-top:4px">' + btn + '</div>'
|
|
321596
|
+
+ '</div>';
|
|
321597
|
+
return row;
|
|
321598
|
+
}).join('');
|
|
321599
|
+
el.innerHTML = '<h3 style="color:#b2920a;font-size:0.7rem;margin-bottom:8px">Scheduled Tasks</h3>' + rows
|
|
321600
|
+
+ '<div style="margin-top:6px"><button onclick="killScheduled()" title="Kill OA scheduler processes" style="background:#2a2a30;border:1px solid #5a2a2a;color:#b25f5f;padding:3px 8px;border-radius:3px;font-size:0.65rem;cursor:pointer">kill OA schedulers</button></div>';
|
|
321601
|
+
} catch {}
|
|
321602
|
+
}
|
|
321603
|
+
|
|
321604
|
+
(window as any).toggleScheduled = async function(id: string, enabled: boolean) {
|
|
321605
|
+
try {
|
|
321606
|
+
await fetch('/v1/scheduled/' + encodeURIComponent(id), { method:'POST', headers: headers(), body: JSON.stringify({enabled}) });
|
|
321607
|
+
loadScheduled();
|
|
321608
|
+
} catch {}
|
|
321609
|
+
}
|
|
321610
|
+
|
|
321611
|
+
(window as any).killScheduled = async function() {
|
|
321612
|
+
try {
|
|
321613
|
+
await fetch('/v1/scheduled/kill', { method:'POST', headers: headers(), body: JSON.stringify({}) });
|
|
321614
|
+
alert('Kill signal sent to OA scheduler processes');
|
|
321615
|
+
} catch {}
|
|
321616
|
+
}
|
|
321617
|
+
|
|
321473
321618
|
// Agent task
|
|
321474
321619
|
let currentRunId = null;
|
|
321475
321620
|
async function loadProfiles() {
|
|
@@ -322599,6 +322744,7 @@ async function doUpdate() {
|
|
|
322599
322744
|
try { loadModels(); } catch {}
|
|
322600
322745
|
try { checkHealth(); } catch {}
|
|
322601
322746
|
try { pollMetrics(); } catch {}
|
|
322747
|
+
try { loadScheduled(); } catch {}
|
|
322602
322748
|
|
|
322603
322749
|
btn.textContent = 'updated v' + newVersion;
|
|
322604
322750
|
btn.style.background = '#1a3a1a';
|
|
@@ -323232,6 +323378,7 @@ updateAgentRunSelect(); // WO-TASK-02 — populate agent runs dropdown
|
|
|
323232
323378
|
restoreChatSession(); // WO-CHAT-RESUME — rehydrate from server state
|
|
323233
323379
|
setInterval(checkHealth, 30000);
|
|
323234
323380
|
setInterval(pollMetrics, 10000);
|
|
323381
|
+
setInterval(loadScheduled, 15000);
|
|
323235
323382
|
setInterval(pollVersionBump, 5000);
|
|
323236
323383
|
input.focus();
|
|
323237
323384
|
</script>
|
|
@@ -324523,8 +324670,9 @@ import { fileURLToPath as fileURLToPath17 } from "node:url";
|
|
|
324523
324670
|
import { dirname as dirname29, join as join99, resolve as resolve35 } from "node:path";
|
|
324524
324671
|
import { homedir as homedir38 } from "node:os";
|
|
324525
324672
|
import { spawn as spawn25, execSync as execSync55 } from "node:child_process";
|
|
324526
|
-
import { mkdirSync as mkdirSync51, readFileSync as readFileSync65, readdirSync as readdirSync28, existsSync as existsSync83, watch as fsWatch3 } from "node:fs";
|
|
324673
|
+
import { mkdirSync as mkdirSync51, writeFileSync as writeFileSync45, readFileSync as readFileSync65, readdirSync as readdirSync28, existsSync as existsSync83, watch as fsWatch3 } from "node:fs";
|
|
324527
324674
|
import { randomBytes as randomBytes21, randomUUID as randomUUID11 } from "node:crypto";
|
|
324675
|
+
import { createHash as createHash9 } from "node:crypto";
|
|
324528
324676
|
function getVersion3() {
|
|
324529
324677
|
try {
|
|
324530
324678
|
const require3 = createRequire4(import.meta.url);
|
|
@@ -327269,6 +327417,31 @@ async function handleRequest(req2, res, ollamaUrl, verbose) {
|
|
|
327269
327417
|
});
|
|
327270
327418
|
return;
|
|
327271
327419
|
}
|
|
327420
|
+
if (pathname === "/v1/scheduled" && method === "GET") {
|
|
327421
|
+
jsonResponse(res, 200, { tasks: listScheduledTasks() });
|
|
327422
|
+
return;
|
|
327423
|
+
}
|
|
327424
|
+
if (pathname?.startsWith("/v1/scheduled/") && method === "POST") {
|
|
327425
|
+
const parts = pathname.split("/");
|
|
327426
|
+
const id = parts[3] ?? "";
|
|
327427
|
+
const body = await parseJsonBody(req2);
|
|
327428
|
+
const enabled2 = typeof body?.enabled === "boolean" ? body.enabled : void 0;
|
|
327429
|
+
if (!id || typeof enabled2 === "undefined") {
|
|
327430
|
+
jsonResponse(res, 400, { error: "Missing id or enabled flag" });
|
|
327431
|
+
return;
|
|
327432
|
+
}
|
|
327433
|
+
const ok2 = setScheduledEnabled(id, enabled2);
|
|
327434
|
+
jsonResponse(res, ok2 ? 200 : 404, ok2 ? { id, enabled: enabled2 } : { error: "Not found" });
|
|
327435
|
+
return;
|
|
327436
|
+
}
|
|
327437
|
+
if (pathname === "/v1/scheduled/kill" && method === "POST") {
|
|
327438
|
+
const body = await parseJsonBody(req2);
|
|
327439
|
+
const pids = Array.isArray(body?.pids) ? body.pids.filter((n2) => Number.isInteger(n2)) : void 0;
|
|
327440
|
+
const pattern = typeof body?.pattern === "string" && body.pattern.trim() ? body.pattern.trim() : "(/bin/oa|open-agents-ai|nexus-daemon|OPEN-AGENTS-SCHEDULED)";
|
|
327441
|
+
const killed = killScheduledProcesses(pids, pattern);
|
|
327442
|
+
jsonResponse(res, 200, { killed_count: killed.length, killed });
|
|
327443
|
+
return;
|
|
327444
|
+
}
|
|
327272
327445
|
if ((pathname === "/v1/chat" || pathname === "/api/chat") && method === "POST") {
|
|
327273
327446
|
if (!checkAuth(req2, res, "run")) {
|
|
327274
327447
|
status = 401;
|
|
@@ -328144,6 +328317,110 @@ ${steering}`;
|
|
|
328144
328317
|
});
|
|
328145
328318
|
}
|
|
328146
328319
|
}
|
|
328320
|
+
function getScheduleRoots() {
|
|
328321
|
+
const rootsEnv = process.env["OA_SCHEDULE_ROOTS"] || "";
|
|
328322
|
+
const roots = rootsEnv.split(rootsEnv.includes(";") ? ";" : ":").filter(Boolean);
|
|
328323
|
+
const defaults3 = [process.cwd(), join99(homedir38(), "Documents")];
|
|
328324
|
+
const set = /* @__PURE__ */ new Set([...defaults3, ...roots]);
|
|
328325
|
+
return [...set];
|
|
328326
|
+
}
|
|
328327
|
+
function listScheduledTasks() {
|
|
328328
|
+
const results = [];
|
|
328329
|
+
const seen = /* @__PURE__ */ new Set();
|
|
328330
|
+
const roots = getScheduleRoots();
|
|
328331
|
+
const maxDepth = 6;
|
|
328332
|
+
for (const root of roots) {
|
|
328333
|
+
try {
|
|
328334
|
+
walk(root, 0, (dir) => {
|
|
328335
|
+
if (dir.endsWith(`${join99(".oa", "scheduled")}`) || dir.includes(`${join99(".oa", "scheduled")}`)) {
|
|
328336
|
+
const file = join99(dir, "tasks.json");
|
|
328337
|
+
try {
|
|
328338
|
+
const raw = readFileSync65(file, "utf-8");
|
|
328339
|
+
const json = JSON.parse(raw);
|
|
328340
|
+
const tasks = Array.isArray(json?.tasks) ? json.tasks : Array.isArray(json) ? json : [];
|
|
328341
|
+
tasks.forEach((t2, i2) => {
|
|
328342
|
+
const name11 = String(t2?.name || t2?.task || t2?.command || `task-${i2}`);
|
|
328343
|
+
const schedule = String(t2?.schedule || t2?.cron || t2?.when || "");
|
|
328344
|
+
const enabled2 = typeof t2?.enabled === "boolean" ? t2.enabled : true;
|
|
328345
|
+
const uid = createHash9("sha1").update(`${file}#${i2}`).digest("hex").slice(0, 16);
|
|
328346
|
+
const key = `${uid}`;
|
|
328347
|
+
if (seen.has(key)) return;
|
|
328348
|
+
seen.add(key);
|
|
328349
|
+
results.push({ id: uid, file, index: i2, name: name11, schedule, enabled: enabled2 });
|
|
328350
|
+
});
|
|
328351
|
+
} catch {
|
|
328352
|
+
}
|
|
328353
|
+
}
|
|
328354
|
+
}, maxDepth);
|
|
328355
|
+
} catch {
|
|
328356
|
+
}
|
|
328357
|
+
}
|
|
328358
|
+
return results;
|
|
328359
|
+
}
|
|
328360
|
+
function walk(dir, depth, onDir, maxDepth) {
|
|
328361
|
+
if (depth > maxDepth) return;
|
|
328362
|
+
onDir(dir);
|
|
328363
|
+
let entries = [];
|
|
328364
|
+
try {
|
|
328365
|
+
entries = readdirSync28(dir, { withFileTypes: true });
|
|
328366
|
+
} catch {
|
|
328367
|
+
return;
|
|
328368
|
+
}
|
|
328369
|
+
for (const e2 of entries) {
|
|
328370
|
+
if (!e2.isDirectory()) continue;
|
|
328371
|
+
if (e2.name === "node_modules" || e2.name.startsWith(".")) {
|
|
328372
|
+
if (e2.name !== ".oa") continue;
|
|
328373
|
+
}
|
|
328374
|
+
const child = join99(dir, e2.name);
|
|
328375
|
+
walk(child, depth + 1, onDir, maxDepth);
|
|
328376
|
+
}
|
|
328377
|
+
}
|
|
328378
|
+
function setScheduledEnabled(id, enabled2) {
|
|
328379
|
+
const tasks = listScheduledTasks();
|
|
328380
|
+
const target = tasks.find((t2) => t2.id === id);
|
|
328381
|
+
if (!target) return false;
|
|
328382
|
+
try {
|
|
328383
|
+
const raw = readFileSync65(target.file, "utf-8");
|
|
328384
|
+
const json = JSON.parse(raw);
|
|
328385
|
+
const arr = Array.isArray(json?.tasks) ? json.tasks : Array.isArray(json) ? json : [];
|
|
328386
|
+
if (!arr[target.index]) return false;
|
|
328387
|
+
arr[target.index].enabled = enabled2;
|
|
328388
|
+
if (Array.isArray(json?.tasks)) {
|
|
328389
|
+
json.tasks = arr;
|
|
328390
|
+
writeFileSync45(target.file, JSON.stringify(json, null, 2));
|
|
328391
|
+
} else if (Array.isArray(json)) {
|
|
328392
|
+
writeFileSync45(target.file, JSON.stringify(arr, null, 2));
|
|
328393
|
+
} else {
|
|
328394
|
+
writeFileSync45(target.file, JSON.stringify({ tasks: arr }, null, 2));
|
|
328395
|
+
}
|
|
328396
|
+
return true;
|
|
328397
|
+
} catch {
|
|
328398
|
+
return false;
|
|
328399
|
+
}
|
|
328400
|
+
}
|
|
328401
|
+
function killScheduledProcesses(pids, pattern) {
|
|
328402
|
+
const killed = [];
|
|
328403
|
+
try {
|
|
328404
|
+
const { execSync: es } = __require("node:child_process");
|
|
328405
|
+
if (pids && pids.length > 0) {
|
|
328406
|
+
for (const pid of pids) {
|
|
328407
|
+
try {
|
|
328408
|
+
process.kill(pid, "SIGTERM");
|
|
328409
|
+
killed.push({ pid, ok: true });
|
|
328410
|
+
} catch {
|
|
328411
|
+
killed.push({ pid, ok: false });
|
|
328412
|
+
}
|
|
328413
|
+
}
|
|
328414
|
+
} else {
|
|
328415
|
+
try {
|
|
328416
|
+
es(`pkill -f '${pattern.replace(/'/g, "'")}'`);
|
|
328417
|
+
} catch {
|
|
328418
|
+
}
|
|
328419
|
+
}
|
|
328420
|
+
} catch {
|
|
328421
|
+
}
|
|
328422
|
+
return killed;
|
|
328423
|
+
}
|
|
328147
328424
|
function startApiServer(options2 = {}) {
|
|
328148
328425
|
if (options2.quiet) setQuiet(true);
|
|
328149
328426
|
const log22 = options2.quiet ? (_msg) => {
|
|
@@ -335281,13 +335558,13 @@ ${fullInput}`;
|
|
|
335281
335558
|
writeContent(() => renderError2(errMsg));
|
|
335282
335559
|
if (failureStore) {
|
|
335283
335560
|
try {
|
|
335284
|
-
const { createHash:
|
|
335561
|
+
const { createHash: createHash11 } = await import("node:crypto");
|
|
335285
335562
|
failureStore.insert({
|
|
335286
335563
|
taskId: "",
|
|
335287
335564
|
sessionId: `${Date.now()}`,
|
|
335288
335565
|
repoRoot,
|
|
335289
335566
|
failureType: "runtime-error",
|
|
335290
|
-
fingerprint:
|
|
335567
|
+
fingerprint: createHash11("sha256").update(errMsg.slice(0, 200)).digest("hex").slice(0, 16),
|
|
335291
335568
|
filePath: null,
|
|
335292
335569
|
errorMessage: errMsg.slice(0, 500),
|
|
335293
335570
|
context: null,
|
|
@@ -336140,7 +336417,7 @@ var init_run = __esm({
|
|
|
336140
336417
|
import { glob as glob2 } from "glob";
|
|
336141
336418
|
import ignore from "ignore";
|
|
336142
336419
|
import { readFile as readFile23, stat as stat5 } from "node:fs/promises";
|
|
336143
|
-
import { createHash as
|
|
336420
|
+
import { createHash as createHash10 } from "node:crypto";
|
|
336144
336421
|
import { join as join102, relative as relative5, extname as extname12, basename as basename18 } from "node:path";
|
|
336145
336422
|
var DEFAULT_EXCLUDE, LANGUAGE_MAP, CodebaseIndexer;
|
|
336146
336423
|
var init_codebase_indexer = __esm({
|
|
@@ -336206,7 +336483,7 @@ var init_codebase_indexer = __esm({
|
|
|
336206
336483
|
if (fileStat.size > this.config.maxFileSize)
|
|
336207
336484
|
continue;
|
|
336208
336485
|
const content = await readFile23(fullPath);
|
|
336209
|
-
const hash =
|
|
336486
|
+
const hash = createHash10("sha256").update(content).digest("hex");
|
|
336210
336487
|
const ext = extname12(relativePath);
|
|
336211
336488
|
indexed.push({
|
|
336212
336489
|
path: fullPath,
|
package/package.json
CHANGED