Skip to content

[feat] pulse: add list operation to enable management of created timer tasks #9

Description

@MeadowMuse

What package would this affect?

  • packages/psycheros
  • packages/entity-core
  • packages/entity-loom
  • packages/launcher
  • New package or cross-cutting

What problem are you trying to solve?

The pulse tool currently supports only three operations: create, trigger, and delete. It is missing a list operation, which means the agent has no way to discover what Pulses currently exist in the system. This leads to several concrete problems:

1. Created Pulses become undiscoverable

After calling pulse.create, the agent receives a pulse_id. If the agent does not record this ID externally, there is no way to retrieve it later. When the agent's context is refreshed, restarted, or the session changes, previously created Pulses become effectively "unknowable."

2. Orphaned Pulses accumulate

Once created, a Pulse continues to fire on schedule regardless of whether the agent remembers it. Without the pulse_id, the agent cannot:

  • View the Pulse's details (name, trigger conditions, configuration, etc.)
  • Modify the Pulse (requires delete + recreate, which needs the ID)
  • Manually trigger the Pulse
  • Delete the Pulse

The Pulse persists and fires indefinitely — a completely unmanageable "orphaned task."

3. No clean way to update tasks

When requirements change, the standard workflow is:

  1. Find the old Pulse → requires list
  2. Delete the old Pulse → requires pulse_id
  3. Create a new Pulse

Without list, step 1 is impossible. The old Pulse keeps firing and conflicts with the new one.

Proposed approach

Add a list operation to the pulse tool that returns a summary of all active Pulses.

Request format

{
  "operation": "list",
  "filter": {
    "trigger_type": "cron",
    "enabled": true
  }
}
  • filter is optional; omit to return all Pulses
  • filter.trigger_type: filter by trigger type (cron / inactivity / webhook)
  • filter.enabled: filter by enabled status

Suggested response format

{
  "pulses": [
    {
      "pulse_id": "abc123def456",
      "name": "Daily check-in reminder",
      "description": "Remind user to check in daily at 8 AM",
      "trigger_type": "cron",
      "cron_expression": "0 8 * * *",
      "chat_mode": "visible",
      "auto_delete": true,
      "enabled": true,
      "created_at": "2026-06-14T00:00:00Z"
    }
  ],
  "total": 1
}

Each Pulse entry should include at minimum:

  • pulse_id — unique identifier (required for trigger / delete)
  • name — task name
  • description — task description
  • trigger_type — trigger type
  • Scheduling fields (cron_expression / interval_seconds / run_at / inactivity_threshold_seconds, returned based on actual trigger type)
  • chat_mode — chat mode on trigger
  • auto_delete — whether to auto-delete after trigger
  • enabled — whether enabled
  • created_at — creation timestamp

Alternatives considered

Manual external ID tracking: The agent can record every pulse_id returned by pulse.create into an external store (local file, database, etc.) and query that store as a proxy for list. However, this is a workaround that bypasses tool capability, not a reliable solution:

  • If the external record is lost or corrupted, the Pulses become unmanageable immediately
  • The agent cannot verify whether its external records are consistent with the actual system state
  • Every agent implementation must duplicate this bookkeeping logic

A native list operation would complete the pulse tool's CRUD operations (adding the R in CRUD), enabling reliable Pulse lifecycle management directly within the tool.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions