Get Started

Your agent can start subagents and schedule messages to itself. Ask for a briefing at six, a check every hour, or three searches at once, and Link Harness has it on already.

You need the agents plugins, which lnk up agents installs and which bring Link Scheduler, and a harness that reads who a message is from. Link Harness does. There's nothing to set up, because each start gives the agent its scheduler.

What your agent can do

Your agent can start a subagent, schedule a message to itself, and list or cancel either. It sees them as four tools, scheduler__task, scheduler__schedule, scheduler__list and scheduler__cancel.

  • task starts a subagent, a new conversation of its own that begins now with the task it's given. The subagent has the same tools, or fewer if task is given a list of names, and it sees nothing else of the conversation it came from. Its answer comes back to that conversation, so your agent can start three, say so, and answer when they're in.
  • schedule sends your agent a message later in this conversation, at a time such as 18:00, in a while such as 10m or 2h, or every so often by cron, as 0 6 * * 1-5 for six on weekdays. Times are in the agent's time zone, this machine's unless its spec names one. The answer comes to you on this chat, or with answer = "nowhere" stays in the conversation.
  • list shows what's scheduled in this conversation and the subagents it started that haven't answered, and cancel cancels one by its id. A conversation never sees or cancels another's.

Your agent does these without asking you. Set [tool.scheduler] ask = true in its spec and each waits for you to allow it, as any tool's call you haven't allowed does (lnk sandbox asks). A message from a schedule or a subagent is never taken for yours, and your agent is told who's speaking.

Turn it off

Turn the scheduler off in your agent's spec, which you give with lnk agent start --spec <file>.

[tool.scheduler]
enabled = false

How it runs

Your agent's bridge fires each job when it's due. The jobs are kept in the agent's folder (~/Link/Agents/<agent>/Scheduler), and the bridge is the background service that carries its channels and starts again with your computer.

A job is kept until its firing ends, and a restart loses nothing. A message cut off by a restart may come twice. A firing that fails, say because the bridge isn't up yet or the model provider is unreachable, is tried again a minute later, then two, four, eight and sixteen minutes later. After that it's given up, and the bridge's log says so. A firing that takes longer than the agent's firing limit, 30 minutes by default, is given up too, and never sent again.

A computer that was asleep through a firing fires it once on waking, or skips it, as [tool.scheduler] late says. A recurring job never fires once for every time it missed.

The answer goes where the job says: to the chat, to the conversation a subagent came from, or nowhere. On Telegram, Slack and Discord the chat is only the one you talk to your agent in. On WhatsApp and Signal, and in a group, an answer nobody waits for stays in the conversation.

Its limits and settings

Link's limits are 100 messages a day, 5 subagents at work at once, and chains 8 deep, as when a subagent starts a subagent. They are keys of your agent's spec under [tool.scheduler], and Agent Spec lists them all.

The day is the one in the agent's time zone. Past the day's cap the tool says so and nothing fires: a job due once waits for the next day, and a recurring one for its next time. The cap is what bounds how many messages agents send each other.

Developing it: dev.md.