@columenlabs/lumen-tasks

中文文档
0.1.219发布于 2026/11/09MITTypeScriptES Module近 30 天下载 2.5万

Lumen's background jobs on the server: a ledger of the work a person started (state, progress, result), cancel, a reaper for stuck jobs and the routes the header Tasks list calls.

原始使用文档
文档目录3 节
  1. Install
  2. The ledger
  3. The routes

@columenlabs/lumen-tasks

Lumen's background jobs, server side: a ledger of the work a person started (a search, a sync, a backfill) with its state, progress and result, cooperative cancel, a reaper that fails anything stuck, and the routes the header Tasks list calls. It pairs with TasksProvider, TasksButton and useTaskFor in @columenlabs/lumen-ui, which show a ring while something runs, a dot for ended unseen tasks and a toast with Open when one ends. No dependencies beyond @columenlabs/lumen-ui-types: Request, Response and any SQLite, so it runs in a Worker, a Durable Object, Bun or Node.

Install

bun add @columenlabs/lumen-tasks @columenlabs/lumen-ui-types

Pin both to the same exact version as the other Lumen packages.

The ledger

import { createTasks, doSql } from '@columenlabs/lumen-tasks';

const tasks = createTasks({
  db: doSql(ctx.storage.sql),        // or d1Sql(env.DB)
  onEnd: async (t) => { /* email or push for long ones */ },
});

Nothing runs in the ledger. The work runs where its data is (a Durable Object's alarm, a queue, a runner elsewhere) and reports:

const t = await tasks.start({
  owner, app: 'jobs', kind: 'search', title: 'Search · Remote roles',
  link: '/feed', ref: search.id, total: 3, unit: 'sources',
});
for (const [i, source] of sources.entries()) {
  if ((await tasks.progress(t.id, { done: i })).stop) return; // cancelled or reaped
  await source.run();
}
await tasks.finish(t.id, { state: 'done', summary: '14 new jobs' });
  • Cancel is cooperative. It ends the task at once; the engine's next progress answers stop: true. Pass cancellable: false for work that cannot stop.
  • Nothing stays running. A task open past limitMinutes (15) is failed on the next read; no cron needed.
  • Kept 7 days (keepDays), newest first, 100 at most in a list.
  • byRef(owner, kind, ref) finds the newest task for one piece of work, so an engine refuses a second run while one is open.

The routes

import { taskRoutes } from '@columenlabs/lumen-tasks';

const routes = taskRoutes({ base: '/api/tasks', tasks: () => tasks, owner: (req) => callerId(req) });
app.all('/api/tasks/*', (c) => routes(c.req.raw));

GET /, GET /:id, POST /seen, POST /clear, POST /:id/clear, POST /:id/cancel. Writes must be same-origin JSON. tasks may return a stub that forwards to a Durable Object holding the ledger (TasksApi).

版本与发布记录

@columenlabs/lumen-tasks 共发布 128 个版本,首次发布于 2026/10/27;过去 12 个月发布了 128 个版本。

版本发布日期距今
0.1.219latest2026/11/091 天前
0.1.2182026/11/091 天前
0.1.2172026/11/091 天前
0.1.2162026/11/091 天前
0.1.2152026/11/091 天前
0.1.2142026/11/091 天前

关于 @columenlabs/lumen-tasks 的常见问题

@columenlabs/lumen-tasks 是什么?

Lumen's background jobs on the server: a ledger of the work a person started (state, progress, result), cancel, a reaper for stuck jobs and the routes the header Tasks list calls.

如何安装 @columenlabs/lumen-tasks?

在项目目录运行 npm install @columenlabs/lumen-tasks,或使用 pnpm add / yarn add / bun add。

@columenlabs/lumen-tasks 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@columenlabs/lumen-tasks 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@columenlabs/lumen-tasks 可以商用吗?

@columenlabs/lumen-tasks 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@columenlabs/lumen-tasks 的下载量有多少?

根据 npm 官方下载统计,@columenlabs/lumen-tasks 在 2026/10/11 – 2026/11/09 这 30 天内被下载 25,135 次,日均约 838 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@columenlabs/lumen-tasks 还在维护吗?

最新版本 0.1.219 发布于 2026/11/09(1 天前);至今共发布 128 个版本,其中过去 12 个月发布了 128 个;首次发布于 2026/10/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。