dsh-loop
Agent 与会话 活跃维护

dsh-loop

XiaoWind/dsh-loop

它是AI代理流程循环插件,通过/loop斜杠指令支持自定义执行间隔与循环次数,让AI代理按预设规则自动重复执行任务流,无需手动反复触发,适配周期性迭代的Agent工作流程。

0
Stars 标星
0
Forks 分支
0
Watchers 关注
0
Open Issues
JavaScript
主要语言
MIT
开源协议
23 KB
仓库大小
1 个月前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:XiaoWind/dsh-loop
git clone https://github.com/XiaoWind/dsh-loop.git
git clone git@github.com:XiaoWind/dsh-loop.git
README.md main

dsh-loop

English | 中文

A DeepSeek Harness (DSH)
plugin that adds a human-facing /loop slash command for timed, recurring
agent loops
.

/loop 30m fires one immediate tick, then re-prompts the agent once per
30-minute interval (measured from the moment the agent returns to idle after
the previous tick) until you stop it with /loop stop.

Install

# from GitHub (works immediately — no npm publish required)
dsh plugin --profile web add git+https://github.com/XiaoWind/dsh-loop.git

# or from npm, once published
dsh plugin --profile web add dsh-loop

The dsh plugin command forwards to pnpm inside the web profile directory,
then reconciles the profile's dsh.profile.bundles layer list. Because this
package declares dsh.bundle.patch, it joins the layer stack automatically.
Restart the Web app after installing.

The plugin injects the commands service, so it activates only in profiles
that compose a command adapter — the shipped web profile does.

Update

Pull the latest version of the plugin into an installed profile:

dsh plugin --profile web update dsh-loop

dsh plugin forwards to pnpm update dsh-loop inside the profile directory,
which re-resolves the github:XiaoWind/dsh-loop dependency to the latest commit
on the default branch. The lockfile pins a git dependency by commit hash, so a
version bump is not required for the update to land. If pnpm has cached an old
git resolution, re-pin it explicitly:

dsh plugin --profile web add github:XiaoWind/dsh-loop

Restart the Web app after updating — the bundle layer is composed at boot, so a
running Web process does not hot-reload an installed plugin.

Usage

Command Result
/loop 30m Start a loop: tick now, then once every 30 minutes. Keeps any current objective.
/loop 30m fix the tests Start a 30-minute loop toward an objective.
/loop fix the tests Start a loop toward an objective at the default interval.
/loop 1h30m Combined durations are supported.
/loop resume Resume the loop saved before a restart.
/loop or /loop status Show the running loop.
/loop stop Stop the loop.
/loop help Show help.

Intervals are a whitespace-free sequence of <number><unit> tokens where
unit is one of ms, s, m, h, d — for example 90s, 30m, 1h30m,
2h.

A leading duration token is the interval and the remainder is the objective;
with no leading duration, the whole input is the objective and the default
interval applies.

Semantics

  • First tick is immediate. Each later tick fires interval after the agent
    returns to idle, so a running turn is never interrupted.
  • Saved across restarts. The loop config is persisted to
    $DSH_HOME/dsh-loop/<sessionId>.json. When you reopen the session after a
    restart, the plugin asks whether to continue the saved loop (Continue /
    Stop); /loop resume restarts it manually when no prompt is available.
    /loop stop discards the saved loop.
  • Manual stop. The loop runs until you run /loop stop, the agent is
    disposed, or the plugin is unloaded. There is no automatic completion
    detection.

Configuration

Set config.defaultIntervalMs (milliseconds) to change the interval used by a
bare /loop <objective> with no leading duration token. The default is
600000 (10 minutes).

# your profile's cordis.patch.yml
- id: loop
  config:
    defaultIntervalMs: 900000

Development

# syntax check
node --check lib/index.js

# duration-parser unit test
node test/duration.test.mjs

The plugin is a single-file ESM Cordis function plugin (lib/index.js) with no
build step. It exports apply, inject, and name, and the bundle layer
cordis.patch.yml inserts it into the profile composition.

License

MIT