opencode-supertask 0.1.17 → 0.1.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/README.md +87 -76
- package/dist/cli/index.js +67 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/gateway/index.js +45 -19
- package/dist/gateway/index.js.map +1 -1
- package/dist/plugin/supertask.js +20356 -20952
- package/dist/plugin/supertask.js.map +1 -1
- package/dist/web/index.js +26 -14
- package/dist/web/index.js.map +1 -1
- package/dist/worker/index.js +12 -8
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -1
package/dist/web/index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
1
|
var __create = Object.create;
|
|
4
2
|
var __defProp = Object.defineProperty;
|
|
5
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -16561,13 +16559,14 @@ import { existsSync, mkdirSync } from "fs";
|
|
|
16561
16559
|
import { homedir } from "os";
|
|
16562
16560
|
import { join, dirname } from "path";
|
|
16563
16561
|
import { fileURLToPath } from "url";
|
|
16564
|
-
var
|
|
16562
|
+
var DEFAULT_DB_PATH = join(homedir(), ".local/share/opencode/tasks.db");
|
|
16563
|
+
var DB_FILE_PATH = process.env.SUPERTASK_DB_PATH || DEFAULT_DB_PATH;
|
|
16565
16564
|
var _sqlite = null;
|
|
16566
16565
|
var _db = null;
|
|
16567
16566
|
var _migrationRan = false;
|
|
16568
16567
|
function getMigrationsFolder() {
|
|
16569
16568
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16570
|
-
return join(__dirname, "
|
|
16569
|
+
return join(__dirname, "../../../drizzle");
|
|
16571
16570
|
}
|
|
16572
16571
|
function initDb() {
|
|
16573
16572
|
const dataDir = dirname(DB_FILE_PATH);
|
|
@@ -16591,7 +16590,9 @@ function initDb() {
|
|
|
16591
16590
|
try {
|
|
16592
16591
|
migrate(_db, { migrationsFolder: getMigrationsFolder() });
|
|
16593
16592
|
} catch (err) {
|
|
16594
|
-
|
|
16593
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
16594
|
+
console.error(`[supertask] migration failed: ${msg}`);
|
|
16595
|
+
throw new Error(`[supertask] DB migration failed: ${msg}`);
|
|
16595
16596
|
}
|
|
16596
16597
|
}
|
|
16597
16598
|
return _db;
|
|
@@ -17143,6 +17144,10 @@ function formatDate(ts) {
|
|
|
17143
17144
|
const d = ts instanceof Date ? ts : new Date(ts);
|
|
17144
17145
|
return d.toLocaleString("zh-CN", { month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" });
|
|
17145
17146
|
}
|
|
17147
|
+
function esc(s) {
|
|
17148
|
+
if (!s) return "";
|
|
17149
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
17150
|
+
}
|
|
17146
17151
|
function readCurrentConfig() {
|
|
17147
17152
|
if (!existsSync3(CONFIG_PATH)) return {};
|
|
17148
17153
|
try {
|
|
@@ -17238,6 +17243,7 @@ async function retryTask(id){if(!confirm('\u786E\u5B9A\u91CD\u8BD5\u4EFB\u52A1 #
|
|
|
17238
17243
|
async function deleteTask(id){if(!confirm('\u786E\u5B9A\u5220\u9664\u4EFB\u52A1 #'+id+'?'))return;await fetch('/api/tasks/'+id,{method:'DELETE'});location.reload();}
|
|
17239
17244
|
async function showDetail(id){try{const r=await fetch('/api/tasks/'+id);const t=await r.json();document.getElementById('dc').textContent=JSON.stringify(t,null,2);document.getElementById('dd').showModal();}catch(e){alert('\u83B7\u53D6\u8BE6\u60C5\u5931\u8D25');}}
|
|
17240
17245
|
async function showRunDetail(id){try{const r=await fetch('/api/runs/'+id);const t=await r.json();document.getElementById('dc').textContent=JSON.stringify(t,null,2);document.getElementById('dd').showModal();}catch(e){alert('\u83B7\u53D6\u8BE6\u60C5\u5931\u8D25');}}
|
|
17246
|
+
async function showTemplateDetail(id){try{const r=await fetch('/api/templates/'+id);const t=await r.json();document.getElementById('dc').textContent=JSON.stringify(t,null,2);document.getElementById('dd').showModal();}catch(e){alert('\u83B7\u53D6\u8BE6\u60C5\u5931\u8D25');}}
|
|
17241
17247
|
async function enableTmpl(id){await fetch('/api/templates/'+id+'/enable',{method:'POST'});location.reload();}
|
|
17242
17248
|
async function disableTmpl(id){if(!confirm('\u786E\u5B9A\u7981\u7528\u6B64\u6A21\u677F?'))return;await fetch('/api/templates/'+id+'/disable',{method:'POST'});location.reload();}
|
|
17243
17249
|
async function deleteTmpl(id){if(!confirm('\u786E\u5B9A\u5220\u9664\u6B64\u6A21\u677F? \u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D!'))return;await fetch('/api/templates/'+id,{method:'DELETE'});location.reload();}
|
|
@@ -17334,8 +17340,8 @@ app.get("/", async (c) => {
|
|
|
17334
17340
|
const st = (task.status ?? "").toUpperCase();
|
|
17335
17341
|
rows += `<tr>
|
|
17336
17342
|
<td class="mu">#${task.id}</td>
|
|
17337
|
-
<td><div style="font-weight:500">${task.name}</div><div class="mu sm el">${task.prompt.substring(0, 120)}</div></td>
|
|
17338
|
-
<td><span class="tag">${task.agent}</span></td>
|
|
17343
|
+
<td><div style="font-weight:500">${esc(task.name)}</div><div class="mu sm el">${esc(task.prompt.substring(0, 120))}</div></td>
|
|
17344
|
+
<td><span class="tag">${esc(task.agent)}</span></td>
|
|
17339
17345
|
<td><span class="badge b-${task.status}">${st}</span></td>
|
|
17340
17346
|
<td class="sm ${task.status === "running" ? "" : "mu"}">${formatDuration(task.startedAt, task.finishedAt)}</td>
|
|
17341
17347
|
<td class="mu sm">${(task.retryCount ?? 0) > 0 ? task.retryCount : "-"}</td>
|
|
@@ -17391,15 +17397,15 @@ app.get("/templates", async (c) => {
|
|
|
17391
17397
|
const toggleBtn = t.enabled ? `<button class="btn btn-sm btn-warn" onclick="disableTmpl(${t.id})">\u7981\u7528</button>` : `<button class="btn btn-sm" onclick="enableTmpl(${t.id})">\u542F\u7528</button>`;
|
|
17392
17398
|
rows += `<tr>
|
|
17393
17399
|
<td class="mu">#${t.id}</td>
|
|
17394
|
-
<td><div style="font-weight:500">${t.name}</div><div class="mu sm el">${t.prompt.substring(0, 100)}</div>
|
|
17395
|
-
<div class="sm" style="margin-top:2px"><span class="tag">${t.agent}</span>${t.model && t.model !== "default" ? ` <span class="tag">${t.model}</span>` : ""}</div></td>
|
|
17400
|
+
<td><div style="font-weight:500">${esc(t.name)}</div><div class="mu sm el">${esc(t.prompt.substring(0, 100))}</div>
|
|
17401
|
+
<div class="sm" style="margin-top:2px"><span class="tag">${esc(t.agent)}</span>${t.model && t.model !== "default" ? ` <span class="tag">${esc(t.model)}</span>` : ""}</div></td>
|
|
17396
17402
|
<td><span class="${typeClass}">${typeLabel}</span></td>
|
|
17397
17403
|
<td class="m sm">${rule}</td>
|
|
17398
17404
|
<td>${statusBadge}</td>
|
|
17399
17405
|
<td class="sm">${t.lastRunAt ? timeAgo(t.lastRunAt) : "-"}</td>
|
|
17400
17406
|
<td class="sm">${t.nextRunAt ? timeUntil(t.nextRunAt) : "-"}</td>
|
|
17401
17407
|
<td>
|
|
17402
|
-
<button class="btn btn-sm" onclick="
|
|
17408
|
+
<button class="btn btn-sm" onclick="showTemplateDetail(${t.id})">\u8BE6\u60C5</button>
|
|
17403
17409
|
<button class="btn btn-sm btn-primary" onclick="triggerTmpl(${t.id})">\u89E6\u53D1</button>
|
|
17404
17410
|
${toggleBtn}
|
|
17405
17411
|
<button class="btn btn-sm btn-danger" onclick="deleteTmpl(${t.id})">\u5220\u9664</button>
|
|
@@ -17451,9 +17457,9 @@ app.get("/runs", async (c) => {
|
|
|
17451
17457
|
const logBtn = run.log ? `<button class="btn btn-sm" onclick="toggleLog(${run.id})">\u65E5\u5FD7</button>` : "";
|
|
17452
17458
|
rows += `<tr>
|
|
17453
17459
|
<td class="mu">#${run.id}</td>
|
|
17454
|
-
<td><div style="font-weight:500">${run.taskName} <span class="mu">(#${run.taskId})</span></div>
|
|
17455
|
-
${run.model ? `<div class="sm"><span class="tag">${run.model}</span></div>` : ""}</td>
|
|
17456
|
-
<td><span class="tag">${run.taskAgent}</span></td>
|
|
17460
|
+
<td><div style="font-weight:500">${esc(run.taskName)} <span class="mu">(#${run.taskId})</span></div>
|
|
17461
|
+
${run.model ? `<div class="sm"><span class="tag">${esc(run.model)}</span></div>` : ""}</td>
|
|
17462
|
+
<td><span class="tag">${esc(run.taskAgent)}</span></td>
|
|
17457
17463
|
<td><span class="badge b-${run.status}">${(run.status ?? "").toUpperCase()}</span></td>
|
|
17458
17464
|
<td class="sm">${formatDuration(run.startedAt, run.finishedAt)}</td>
|
|
17459
17465
|
<td class="sm mu">${run.heartbeatAt ? timeAgo(run.heartbeatAt) : "-"}</td>
|
|
@@ -17499,7 +17505,7 @@ app.get("/system", async (c) => {
|
|
|
17499
17505
|
runRows += `<tr>
|
|
17500
17506
|
<td class="mu">#${run.id}</td><td>#${run.taskId}</td>
|
|
17501
17507
|
<td class="m sm">${shortS}</td>
|
|
17502
|
-
<td class="sm">${run.model || "-"}</td>
|
|
17508
|
+
<td class="sm">${esc(run.model) || "-"}</td>
|
|
17503
17509
|
<td class="sm">${formatDate(run.startedAt)}</td>
|
|
17504
17510
|
<td class="sm">${run.heartbeatAt ? timeAgo(run.heartbeatAt) : "-"}</td>
|
|
17505
17511
|
<td class="m sm">W:${run.workerPid ?? "-"} C:${run.childPid ?? "-"}</td>
|
|
@@ -17588,6 +17594,12 @@ app.get("/api/runs/:id", async (c) => {
|
|
|
17588
17594
|
if (!run) return c.json({ error: "not found" }, 404);
|
|
17589
17595
|
return c.json(run);
|
|
17590
17596
|
});
|
|
17597
|
+
app.get("/api/templates/:id", async (c) => {
|
|
17598
|
+
const id = Number(c.req.param("id"));
|
|
17599
|
+
const tmpl = await TaskTemplateService.getById(id);
|
|
17600
|
+
if (!tmpl) return c.json({ error: "not found" }, 404);
|
|
17601
|
+
return c.json(tmpl);
|
|
17602
|
+
});
|
|
17591
17603
|
app.post("/api/tasks/:id/retry", async (c) => {
|
|
17592
17604
|
await TaskService.retry(Number(c.req.param("id")));
|
|
17593
17605
|
return c.json({ success: true });
|