Effect primitives: - git-provider: GitProvider, connection states, normalized errors, URL normalization, host compatibility, credential freshness window - git-provisioning: validated Puter commands, migration states, idempotency keys, safe replacement rules, owner-safe guards - git-webhook: supported events, signature verification, delivery states - host-repository: provider-neutral credential-safe clone via GIT_ASKPASS Normalized Convex schema: - gitProviderAccounts, refined gitConnections, gitProviderOrganizations, gitRepositories, gitMigrations, gitWebhookDeliveries - projects: gitRepositoryId + instructions fields - Schema fields optional for backward compatibility, with backfill cron Backend: - Connection health: verify action, hourly reconciliation (covers stale active + reauth-required + undefined-state legacy connections) - Puter provisioning: createPuterUser/Organization/Repository with owner binding, startGithubMigration (durable via scheduler), getMigration - Org ownership: explicit member add with admin role + verification - Webhook HTTP actions: HMAC verification, delivery persistence with idempotency, repository resolution, byte-length payload limit - Automatic Puter webhook creation after repo creation/migration with fail-loud state tracking - Repository sync after connection (Gitea + GitHub) - AgentOS execution resolves gitRepositoryId for real clone URL - Credential gating: state + freshness checks before execution and project creation - listForOrganization for cross-project Work filtering Frontend: - /projects onboarding page with GitHub OAuth (linkSocial) and Puter PAT - Zero-project redirect, repository selection, context editor - Provider-aware settings panel (no serverUrl for Puter) - Project selection via ?project= query param - GitHub scopes: repo + read:org Agent runtime: - Clones user repository with GIT_ASKPASS credential helper (no token in URL, args, or git config), provider-aware username - Removed fixed Zopu source path and .env copy
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { cronJobs, makeFunctionReference } from "convex/server";
|
|
|
|
// Reconciles attempts whose worker lease expired (crash/restart). The target
|
|
// is referenced by string so this file does not depend on regenerated codegen.
|
|
const reconcileRef = makeFunctionReference<
|
|
"mutation",
|
|
Record<string, never>,
|
|
{ reconciled: number } | null
|
|
>("workExecution:reconcileExpiredAttempts");
|
|
const reconcileConversationTurnsRef = makeFunctionReference<
|
|
"mutation",
|
|
Record<string, never>,
|
|
{ reconciled: number }
|
|
>("conversationMessages:reconcileExpiredTurns");
|
|
const reconcileGitConnectionsRef = makeFunctionReference<
|
|
"action",
|
|
Record<string, never>,
|
|
{ checked: number }
|
|
>("gitConnectionHealth:reconcileStaleConnections");
|
|
const backfillConnectionsRef = makeFunctionReference<
|
|
"mutation",
|
|
Record<string, never>,
|
|
{ migrated: number }
|
|
>("gitConnectionData:backfillConnections");
|
|
|
|
const crons = cronJobs();
|
|
|
|
crons.interval(
|
|
"reconcile expired work attempts",
|
|
{ seconds: 30 },
|
|
reconcileRef
|
|
);
|
|
crons.interval(
|
|
"reconcile expired conversation turns",
|
|
{ seconds: 30 },
|
|
reconcileConversationTurnsRef
|
|
);
|
|
crons.cron(
|
|
"reconcile stale git connections",
|
|
"0 * * * *",
|
|
reconcileGitConnectionsRef
|
|
);
|
|
// Backfill legacy connections on startup and every 6 hours until all are migrated.
|
|
crons.interval(
|
|
"backfill legacy git connections",
|
|
{ hours: 6 },
|
|
backfillConnectionsRef
|
|
);
|
|
|
|
export default crons;
|