Skip to content

feat(cues): client.cues.fire(send_at=...) (hosted PR #618 port)#30

Closed
mikemolinet wants to merge 2 commits into
mainfrom
feat/sdk-fire-send-at-port-618
Closed

feat(cues): client.cues.fire(send_at=...) (hosted PR #618 port)#30
mikemolinet wants to merge 2 commits into
mainfrom
feat/sdk-fire-send-at-port-618

Conversation

@mikemolinet
Copy link
Copy Markdown
Collaborator

Summary

Parity port for hosted cueapi/cueapi#618. Adds optional send_at kwarg to client.cues.fire() for per-fire scheduling.

client.cues.fire("cue_x", send_at="2026-05-04T20:00:00Z")
client.cues.fire("cue_x", payload_override={"task": "demo"}, send_at="2026-05-04T22:00:00Z")

Behavior

  • Server gates dispatch on dispatch_outbox.scheduled_at <= now(). Past timestamps are forgiving (server treats as 'fire now' — idempotent, no error).
  • ISO 8601 string passed through as-is. Server's FireRequest.send_at is Optional[datetime]; Pydantic parses ISO strings cleanly.

Tests

3 new (4 → 7 in TestFire). Pinned:

  • send_at as ISO string lands in body unchanged
  • send_at omitted from body when default None (no null leakage)
  • Combines correctly with payload_override + merge_strategy

Depends on

cueapi/cueapi#618 merging to staging → prod for user-visible behavior. PR can merge independently — sending an unknown send_at field against an old server is silently ignored.

Companion

cueapi-cli parity PR ships the same surface as cueapi fire --send-at.

🤖 Generated with Claude Code

Adds optional `send_at` kwarg to `client.cues.fire()` for per-fire
scheduling. Server-side FireRequest gained `send_at: Optional[datetime]`
in #618; the dispatcher gates on dispatch_outbox.scheduled_at.

Past timestamps are forgiving (server treats as 'fire now', idempotent —
no error for a few-ms-late caller).

Tests: 3 new (4 → 7 in TestFire). Pinned: send_at omitted from body when
default None; combines correctly with payload_override + merge_strategy.

Depends on cueapi/cueapi#618 merging to staging then prod for user-visible
behavior. PR can merge independently — sending an unknown send_at field
against an old server is silently ignored (Pydantic extra='ignore'
default on FireRequest).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
govindkavaturi-art pushed a commit that referenced this pull request May 6, 2026
#32)

* ci(test): spin up cueapi-core locally instead of hitting staging with ARGUS_STAGING_KEY

The `test` job's `pytest tests/` runs the SDK's CRUD tests against a real
CueAPI server. Previously that server was remote staging, authenticated by
`secrets.ARGUS_STAGING_KEY`. Argus was retired 2026-05-02 (cueapi PR #539)
and that key/user is no longer valid — every PR's `test` job has been
red for ~3 days with `AuthenticationError: Invalid API key`, blocking
PRs #30 and #31 (and any future SDK PRs).

This switches the job to the same self-contained pattern that's already
proven by the passing `sdk-integration` job: clone cueapi-core, install,
migrate, boot uvicorn locally, register a fresh test user via
POST /v1/auth/register (gated by ALLOW_REGISTER=true), capture the key,
plumb it through the existing `CUEAPI_STAGING_URL` / `CUEAPI_STAGING_API_KEY`
env vars (no SDK code change needed — `tests/conftest.py` already reads
them from env).

Workflow-only diff. No SDK behavior change.

Note: `notify-merge` still references `secrets.ARGUS_CUEAPI_KEY` for the
post-merge prod telemetry cue. That key is also stale, but the step runs
after auto-merge so it doesn't gate the PR — leaving for a follow-up that
needs a new prod key minted by an operator.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci(test): replace alembic with Base.metadata.create_all (matches cueapi-core conftest)

First push failed because OSS migration set ends at 023 while the User
model declares an `api_key_encrypted` column with no migration backing it.
That's a parity drift in cueapi-core (private migration 019 in the hosted
repo includes the column; the OSS port renamed/replaced it with the
alert-webhook bits but kept the column on the model). `alembic upgrade
head` produced a schema missing that column → register endpoint 500'd
on the User SELECT.

Switch the CI bootstrap to model-driven schema init via
`Base.metadata.create_all`, which is the exact pattern cueapi-core's own
`tests/conftest.py` uses (and which is robust to model/migration drift
because the model is the source of truth for tests).

Imports the same model list as conftest so all tables register before
create_all runs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mikemolinet
Copy link
Copy Markdown
Collaborator Author

Closing in favor of #33 (cueapi-secondary's broader scope: #618 send_at + #632 exit_criteria + #683 idempotency_key in a single PR, with body-vs-header cascade fix + xfail on staging-replay verification already shipped). #33 subsumes the send_at port from this PR + adds two more features. Coordinated via cue (token CUEAPI-SECONDARY-LANE-OVERLAP-FLAG).

@mikemolinet mikemolinet closed this May 7, 2026
auto-merge was automatically disabled May 7, 2026 01:27

Pull request was closed

mikemolinet added a commit that referenced this pull request May 9, 2026
…t recent ports (#36)

Manifest was 3 days stale; many endpoints listed as missing have
been ported since the last audit.

Moved from endpoints_missing → endpoints_covered (with PR refs):

  - POST /v1/cues/{id}/fire (PR #23; in-flight kwargs in #33)
  - POST /v1/executions/{id}/replay (PR #25)
  - GET /v1/executions/claimable (PR #23)
  - POST /v1/executions/{id}/claim (PR #23)
  - POST /v1/executions/claim (PR #23)
  - GET /v1/workers + DELETE /v1/workers/{id} (PR #26)
  - GET /v1/usage (PR #26)
  - POST /v1/agents + GET/PATCH/DELETE /v1/agents/{ref}
    + GET /v1/agents/{ref}/webhook-secret
    + GET /v1/agents/{ref}/inbox + /sent (PR #27)
  - POST /v1/messages + GET/read/ack (PR #28)

Added in-flight refs (open PRs):

  - GET /v1/agents/roster (in-flight PR #35; cueapi #630 parity)
  - GET /v1/agents/{ref}/presence (in-flight PR #35; cueapi #662 parity)
  - send_at + exit_criteria + idempotency_key kwargs on fire (PR #33)
  - send_at kwarg on messages.send (PR #34)

New endpoints_missing items (post-audit):

  - POST /v1/agents/{ref}/webhook-secret/regenerate (destructive; tracked)
  - DELETE /v1/messages bulk (cueapi #650; bounded by cueapi-cli upstream)
  - POST /v1/executions/{id}/live-claim (cueapi #664; handler-runtime, not SDK)

New "in_flight_ports_2026_05_07" section listing all 4 currently-open
SDK PRs with PR-overlap notes (PR #30/#33 lane-flagged with cueapi-main).

Bumped sdk_version_at_audit 0.1.3 → 0.2.x.

This refresh closes the Backlog row "Refresh cueapi-python parity-manifest.json"
filed earlier today (Self-flag 2026-05-07).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant