Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e9e2fd9
test(control-plane): characterize failure, replay and restart paths
itsmihir Oct 30, 2026
1279564
test(control-plane): tighten characterization tests
itsmihir Oct 30, 2026
8283fe0
refactor(control-plane): route outbound messages through integration …
itsmihir Oct 30, 2026
877c016
test(control-plane): cover Linear-outage holds and webhook-off failures
itsmihir Oct 30, 2026
d865046
feat(control-plane): hold retryable sends and bound delivery time
itsmihir Oct 30, 2026
cf8fa6c
feat(control-plane): run integration side effects as lifecycle hooks
itsmihir Oct 30, 2026
17e77a8
feat(harness): channel-neutral follow-up prompt; pin agent_error formats
itsmihir Oct 30, 2026
f6a2adf
fix(control-plane): renew lease per event and tighten holds
itsmihir Oct 30, 2026
221f737
chore(deploy): raise the control-plane grace period to 150s
itsmihir Oct 30, 2026
7c5c617
feat(control-plane): case-insensitive task keys and a per-kind inbox …
itsmihir Oct 30, 2026
fab93aa
feat(control-plane): create and follow up tasks through TaskIntake
itsmihir Oct 30, 2026
a9d7173
feat(cli): derive ls --source choices from ApiTaskSource
itsmihir Oct 30, 2026
e8b440e
feat(control-plane): integration registry with webhooks, status and S…
itsmihir Oct 30, 2026
34c4192
feat(deploy): plumb SLACK_NOTIFY_SOURCES through the chart and docs
itsmihir Oct 30, 2026
040b0c9
fix(control-plane): migration lock order and upgrade notes
itsmihir Oct 30, 2026
a81f0e9
fix(control-plane): test gaps and log fields for intake and the registry
itsmihir Oct 30, 2026
4541e09
fix(control-plane): keep leases warm and bound shutdown
itsmihir Oct 30, 2026
757cb73
refactor(control-plane): keep integration specifics out of core
itsmihir Oct 30, 2026
2149936
fix(control-plane): validate delegation order; API-only restart
itsmihir Oct 30, 2026
b7f72f1
fix(control-plane): renew all leases during long reconciles
itsmihir Oct 30, 2026
9ef33fd
chore(control-plane): make comments stand on their own
itsmihir Oct 30, 2026
1827f6d
chore(control-plane): drop a leftover design reference from a comment
itsmihir Oct 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,8 @@ To report a vulnerability, see [SECURITY.md](SECURITY.md).
reasoning, on port 80 or 443 under a DNS name.
- New tasks come from the CLI and Linear. On GitHub, DevBox only picks up
follow-ups on its own pull requests; it doesn't start work from GitHub
issues. Slack gets only completion updates for Linear tasks. No Jira and no
web UI.
issues. Slack gets only completion updates, for Linear tasks unless
configured for API tasks too. No Jira and no web UI.
- Stopping a task from Linear isn't supported yet.
- No stable extension interface. [docs/extending.md](docs/extending.md) shows where hooks would go.

Expand Down
4 changes: 3 additions & 1 deletion cli/interface/commands/ls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ export type LsArgs = CommonArgs & {
};

const HEADER = ["KEY", "STATE", "TITLE", "DESCRIPTION", "CREATOR", "AGE"];
// Every task source; the compiler fails here until a new one is listed.
const SOURCES = Object.keys({ api: true, linear: true } satisfies Record<ApiTaskSource, true>);

export function render(
tasks: ApiTask[],
Expand Down Expand Up @@ -73,7 +75,7 @@ export const ls: CommandModule = {
.command("ls")
.description("List tasks, newest first")
.addOption(
new Option("--source <source>", "only tasks from this source").choices(["api", "linear"]),
new Option("--source <source>", "only tasks from this source").choices(SOURCES),
)
.option("--mine", "only tasks created with your token")
.addOption(
Expand Down
3 changes: 3 additions & 0 deletions control-plane/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ LINEAR_ENABLED=false
SLACK_ENABLED=false
# SLACK_BOT_TOKEN=<slack-bot-token>
# SLACK_CHANNEL_ID=<slack-channel-id>
# Task sources whose finished tasks post, comma-separated: linear, api.
# Default: linear.
# SLACK_NOTIFY_SOURCES=linear

# The CP's own GitHub token. The Docker Compose stack (`bun run up`) does not
# read this file: it passes GITHUB_TOKEN from the shell, `gh auth token` or a
Expand Down
4 changes: 4 additions & 0 deletions control-plane/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ services:
image: devbox-control-plane
build: *control-plane-build
restart: unless-stopped
# Shutdown finishes the event it is handling (the rest of a task's
# reconcile: up to 90s when platforms are slow), then drains for
# SHUTDOWN_DRAIN_MS (10s); Compose's default 10s would cut both short.
stop_grace_period: 150s
# Explicit, with no env_file. Only allowlisted HARNESS_* settings cross
# into sandboxes, and a forwarded name must never hold a real secret.
environment:
Expand Down
2 changes: 2 additions & 0 deletions control-plane/drizzle/0001_inbox_source_kind_external.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
SET LOCAL lock_timeout = '5s';--> statement-breakpoint
CREATE UNIQUE INDEX "inbox_source_kind_external_uniq" ON "inbox" USING btree ("source","kind","external_id");
3 changes: 3 additions & 0 deletions control-plane/drizzle/0002_tasks_key_lower.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SET LOCAL lock_timeout = '5s';--> statement-breakpoint
CREATE UNIQUE INDEX "tasks_key_lower_uniq" ON "tasks" USING btree (lower("key"));--> statement-breakpoint
DROP INDEX "tasks_key_uniq";
Loading
Loading