npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@unblocklabs/openclaw-keep-going

v0.3.4

Published

OpenClaw Slack continuation plugin that starts a same-session follow-up run when the validator sees unfinished work

Readme

Keep Going banner

Keep Going

keep-going is a native OpenClaw plugin that watches completed Slack turns and starts one same-session follow-up run when an LLM validator believes the assistant stopped before the task was actually done.

The plugin is intentionally narrow:

  • Slack sessions only
  • one follow-up run per completed turn
  • no resume-in-place mutation of the original run
  • no continuation for heartbeat, cron, subagent, or spawned-session runs

How It Works

The runtime flow is:

  1. Turn A completes normally.
  2. The plugin receives agent_end.
  3. The plugin reconstructs the session route and recent transcript window.
  4. The validator decides whether the assistant still owns remaining work.
  5. If yes, the plugin starts Turn B on the same session and Slack thread.

Turn B is advisory. It is explicitly told to stop immediately if the previous turn was already complete or truly blocked.

Install

Prerequisites:

  • OpenClaw 2026.5.3 or newer
  • an OpenAI validator key configured through validator.llm.apiKeyRef, validator.llm.apiKey, KEEP_GOING_OPENAI_API_KEY, or shared OPENAI_API_KEY

Remote install:

openclaw plugins install keep-going --marketplace unblocklabs-ai/keep-going
openclaw plugins enable keep-going

Local iteration:

git clone https://github.com/unblocklabs-ai/keep-going.git
cd keep-going
npm install
npm run build
cd ..
openclaw plugins install --link ./keep-going
openclaw plugins enable keep-going

Then restart the gateway and verify:

openclaw plugins list --enabled
openclaw plugins inspect keep-going

Config

The plugin exposes a small config surface through openclaw.plugin.json:

{
  "enabled": true,
  "debug_logs": false,
  "channels": ["slack"],
  "timeoutMs": 120000,
  "continuationReaction": {
    "enabled": true
  },
  "continuationNotice": {
    "mode": "fallbackOnly",
    "text": ":eyes: continuing..."
  },
  "validator": {
    "llm": {
      "model": "gpt-5.4-mini",
      "systemPrompt": "Optional override for the built-in continuation validator prompt.",
      "apiKeyRef": {
        "source": "file",
        "provider": "openai_keys",
        "id": "/KEEP_GOING_OPENAI_API_KEY"
      },
      "apiKeyEnv": "KEEP_GOING_OPENAI_API_KEY",
      "maxMessages": 10,
      "maxChars": 20000,
      "includeCurrentTurnOnly": true,
      "recentUserMessages": 3,
      "temperature": 0.2,
      "timeoutMs": 15000
    }
  }
}

Notes:

  • enabled defaults to true
  • channels defaults to ["slack"]; other channels are ignored
  • continuationReaction.enabled defaults to true; when enabled, the plugin adds an eyes reaction to the assistant Slack message only after the validator approves a continuation and the assistant message id is a Slack timestamp
  • continuationNotice.mode defaults to fallbackOnly; if the reaction is skipped or fails, the plugin posts :eyes: continuing... in the Slack thread so users can see the continuation fired
  • validator.llm.model defaults to gpt-5.4-mini
  • validator.llm.apiKeyRef accepts an OpenClaw SecretRef and takes precedence over inline/env key settings when it resolves successfully
  • validator.llm.apiKey is supported as the inline override after apiKeyRef, but usually not desirable
  • validator.llm.apiKeyEnv defaults to KEEP_GOING_OPENAI_API_KEY, which overrides the shared OPENAI_API_KEY when set
  • OPENAI_API_KEY is used as the fallback validator credential from OpenClaw config env, configured OpenAI provider auth, or process env so normal OpenClaw OpenAI config works without extra plugin setup
  • includeCurrentTurnOnly keeps the validator focused on the current task while still allowing a small amount of recent context
  • debug_logs: true enables structured step-by-step plugin logging; when false, only error logs are emitted

For the apiKeyRef example above, define the matching file provider in OpenClaw config:

{
  "secrets": {
    "providers": {
      "openai_keys": {
        "source": "file",
        "path": "~/.openclaw/secrets.json",
        "mode": "json"
      }
    }
  }
}

Runtime Behavior

The plugin includes a few guards to avoid bad continuations:

  • plugin-started follow-up runs are tagged and skipped on re-entry
  • only top-level Slack sessions are eligible
  • the parent turn is skipped while child subagents are still active
  • continuation launch is aborted if newer session activity appears during validation
  • model, provider, auth profile, and Slack routing are reused from the existing session route

The validator is called directly against OpenAI and does not create its own OpenClaw run. When reaction posting is enabled, the wake marker is a Slack reaction. If the reaction target cannot be confirmed as a Slack message timestamp or Slack rejects the reaction, Keep Going falls back to a short in-thread continuation notice.

Development

Run the plugin tests with:

npm test

Run the local plugin preflight with:

npm run preflight

The preflight follows the same narrow check shape as OpenClaw's Kitchen Sink fixture: runtime checks, plugin-inspector package inspection, install-shape checks, package dry-run, and runtime dependency audit. Set OPENCLAW_CHECKOUT=/path/to/openclaw to force inspector compatibility checks against a specific local OpenClaw checkout. The inspector step fails if no checkout is available unless CHECK_INSPECTOR_ALLOW_NO_OPENCLAW=1 is set.

Repository Layout

  • index.ts registers the native plugin entry
  • dist/index.js is the compiled plugin entry loaded by OpenClaw
  • src/plugin.ts wires the event hooks, validator call, and continuation launch flow
  • src/llm-validator.ts builds the transcript window and calls the structured validator response
  • src/session-route.ts restores Slack routing and auth continuity from session metadata
  • src/launcher.ts starts the same-session follow-up run

Maintainer release notes live in docs/RELEASE.md.

License

MIT