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/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 DB_FILE_PATH = join(homedir(), ".local/share/opencode/tasks.db");
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, "../../drizzle");
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
- console.error("[supertask] migration failed:", err instanceof Error ? err.message : String(err));
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
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="showDetail(${t.id})">\u8BE6\u60C5</button>
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 });