@percher/core 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-files-manifest.d.ts +28 -0
- package/dist/ai-files-manifest.d.ts.map +1 -0
- package/dist/ai-files-manifest.js +96 -0
- package/dist/ai-files-manifest.js.map +1 -0
- package/dist/commands/account.d.ts +51 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +88 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/ai-files.d.ts +73 -0
- package/dist/commands/ai-files.d.ts.map +1 -0
- package/dist/commands/ai-files.js +179 -0
- package/dist/commands/ai-files.js.map +1 -0
- package/dist/commands/billing.d.ts +1 -1
- package/dist/commands/billing.d.ts.map +1 -1
- package/dist/commands/billing.js +1 -1
- package/dist/commands/billing.js.map +1 -1
- package/dist/commands/continue.d.ts +48 -0
- package/dist/commands/continue.d.ts.map +1 -0
- package/dist/commands/continue.js +121 -0
- package/dist/commands/continue.js.map +1 -0
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +1 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dashboard.d.ts +15 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +33 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/data-export.d.ts +21 -0
- package/dist/commands/data-export.d.ts.map +1 -0
- package/dist/commands/data-export.js +36 -0
- package/dist/commands/data-export.js.map +1 -0
- package/dist/commands/data.d.ts +1 -1
- package/dist/commands/data.d.ts.map +1 -1
- package/dist/commands/data.js +1 -1
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/delete.d.ts +1 -1
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +1 -1
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/deploys.d.ts +2 -2
- package/dist/commands/deploys.d.ts.map +1 -1
- package/dist/commands/deploys.js +21 -5
- package/dist/commands/deploys.js.map +1 -1
- package/dist/commands/dev.d.ts +1 -9
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +77 -23
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/diagnose.d.ts +1 -1
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +1 -1
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/doctor.d.ts +63 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +792 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.d.ts +1 -1
- package/dist/commands/domains.d.ts.map +1 -1
- package/dist/commands/domains.js +1 -1
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/env-scan.d.ts +2 -0
- package/dist/commands/env-scan.d.ts.map +1 -0
- package/dist/commands/env-scan.js +92 -0
- package/dist/commands/env-scan.js.map +1 -0
- package/dist/commands/env.d.ts +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +1 -1
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/export.d.ts +1 -1
- package/dist/commands/export.js +1 -1
- package/dist/commands/generate.d.ts +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +14 -9
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/github.d.ts +60 -0
- package/dist/commands/github.d.ts.map +1 -0
- package/dist/commands/github.js +112 -0
- package/dist/commands/github.js.map +1 -0
- package/dist/commands/import-project.d.ts +1 -1
- package/dist/commands/import-project.d.ts.map +1 -1
- package/dist/commands/import-project.js +1 -1
- package/dist/commands/import-project.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.d.ts +1 -1
- package/dist/commands/insights.d.ts.map +1 -1
- package/dist/commands/insights.js +1 -1
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.d.ts +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +1 -1
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/publish-failure.d.ts +31 -0
- package/dist/commands/publish-failure.d.ts.map +1 -0
- package/dist/commands/publish-failure.js +142 -0
- package/dist/commands/publish-failure.js.map +1 -0
- package/dist/commands/publish-node.d.ts +13 -0
- package/dist/commands/publish-node.d.ts.map +1 -0
- package/dist/commands/publish-node.js +38 -0
- package/dist/commands/publish-node.js.map +1 -0
- package/dist/commands/publish.d.ts +87 -3
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +589 -156
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/push.d.ts +45 -8
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +215 -22
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/redeploy.d.ts +28 -0
- package/dist/commands/redeploy.d.ts.map +1 -0
- package/dist/commands/redeploy.js +417 -0
- package/dist/commands/redeploy.js.map +1 -0
- package/dist/commands/rename.d.ts +1 -1
- package/dist/commands/rename.d.ts.map +1 -1
- package/dist/commands/rename.js +1 -1
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/reproduce.d.ts +64 -0
- package/dist/commands/reproduce.d.ts.map +1 -0
- package/dist/commands/reproduce.js +211 -0
- package/dist/commands/reproduce.js.map +1 -0
- package/dist/commands/reset-superuser.d.ts +1 -1
- package/dist/commands/reset-superuser.d.ts.map +1 -1
- package/dist/commands/reset-superuser.js +1 -1
- package/dist/commands/reset-superuser.js.map +1 -1
- package/dist/commands/restore.d.ts +79 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +164 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/resume.d.ts +1 -1
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/rollback.d.ts +20 -8
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +11 -6
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/unsuspend.d.ts +35 -0
- package/dist/commands/unsuspend.d.ts.map +1 -0
- package/dist/commands/unsuspend.js +27 -0
- package/dist/commands/unsuspend.js.map +1 -0
- package/dist/commands/versions.d.ts +1 -1
- package/dist/commands/versions.d.ts.map +1 -1
- package/dist/commands/versions.js +1 -1
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/wait-deploy.d.ts +92 -0
- package/dist/commands/wait-deploy.d.ts.map +1 -0
- package/dist/commands/wait-deploy.js +225 -0
- package/dist/commands/wait-deploy.js.map +1 -0
- package/dist/env-scan-source.d.ts +39 -0
- package/dist/env-scan-source.d.ts.map +1 -0
- package/dist/env-scan-source.js +332 -0
- package/dist/env-scan-source.js.map +1 -0
- package/dist/error-classifier.d.ts.map +1 -1
- package/dist/error-classifier.js +67 -4
- package/dist/error-classifier.js.map +1 -1
- package/dist/errors.d.ts +8 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/plans.d.ts +11 -0
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +10 -0
- package/dist/plans.js.map +1 -1
- package/dist/poll-deployment.d.ts +47 -0
- package/dist/poll-deployment.d.ts.map +1 -0
- package/dist/poll-deployment.js +57 -0
- package/dist/poll-deployment.js.map +1 -0
- package/dist/recovery.d.ts +356 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +299 -0
- package/dist/recovery.js.map +1 -0
- package/dist/stream-utils.d.ts +21 -0
- package/dist/stream-utils.d.ts.map +1 -0
- package/dist/stream-utils.js +41 -0
- package/dist/stream-utils.js.map +1 -0
- package/dist/templates/ai-files/claude-md.d.ts +7 -0
- package/dist/templates/ai-files/claude-md.d.ts.map +1 -0
- package/dist/templates/ai-files/claude-md.js +78 -0
- package/dist/templates/ai-files/claude-md.js.map +1 -0
- package/dist/templates/ai-files/cursor-percher-mdc.d.ts +7 -0
- package/dist/templates/ai-files/cursor-percher-mdc.d.ts.map +1 -0
- package/dist/templates/ai-files/cursor-percher-mdc.js +111 -0
- package/dist/templates/ai-files/cursor-percher-mdc.js.map +1 -0
- package/dist/templates/ai-files/index.d.ts +8 -0
- package/dist/templates/ai-files/index.d.ts.map +1 -0
- package/dist/templates/ai-files/index.js +4 -0
- package/dist/templates/ai-files/index.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { PercherApiError } from "@percher/client";
|
|
2
|
+
import { z } from "zod/v3";
|
|
3
|
+
import { readPercherTomlAppName } from "../app-name";
|
|
4
|
+
import { pollDeployment } from "../poll-deployment";
|
|
5
|
+
import { RECOVERY_NEEDS_LOGIN, RECOVERY_NONE, recoveryAsk, recoveryEnv, recoveryFixConfig, recoveryFromErrorClass, recoveryRetry, } from "../recovery";
|
|
6
|
+
export const redeployInputSchema = z.object({
|
|
7
|
+
app: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("App name. Defaults to the [app].name in the current directory's percher.toml."),
|
|
11
|
+
deployId: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Specific deploy id (e.g. dep_abc123). Defaults to the latest live deploy for the app."),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* FUTURE1 Phase 3.2 — re-run an existing deploy without re-uploading
|
|
18
|
+
* source. Wraps the API's POST /apps/:appRef/deploys/:deployId/rerun
|
|
19
|
+
* (Phase 3.1, b6887ea + 335a893) and polls to terminal status. Returns
|
|
20
|
+
* the same PublishResult shape as `publish` so CLI/MCP consumers can
|
|
21
|
+
* reuse rendering and recovery logic.
|
|
22
|
+
*
|
|
23
|
+
* Typical wall-clock: <10s when the cache is hot (the source's
|
|
24
|
+
* build_input_hash matches an existing image and the build skips).
|
|
25
|
+
* Falls back to a normal build (no cache hit) if the cache row was
|
|
26
|
+
* evicted or anything in the build env changed.
|
|
27
|
+
*/
|
|
28
|
+
export async function redeploy(ctx, input = {}) {
|
|
29
|
+
const t0 = Date.now();
|
|
30
|
+
const appName = input.app ?? readPercherTomlAppName(ctx.cwd);
|
|
31
|
+
if (!appName) {
|
|
32
|
+
return failureResult({
|
|
33
|
+
title: "App name required",
|
|
34
|
+
explanation: "redeploy needs either an explicit `app` argument or a percher.toml in the current directory.",
|
|
35
|
+
suggestion: "Pass --app=<name>, or cd into a project that has a percher.toml.",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
let app;
|
|
39
|
+
try {
|
|
40
|
+
app = await ctx.client.apps.get(appName);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err instanceof PercherApiError) {
|
|
44
|
+
// Codex P2 follow-up on 6ad76be: only 404 is a "wrong app name"
|
|
45
|
+
// signal. 401 is auth, anything else (5xx, network, rate-limit
|
|
46
|
+
// on the read path) is a real driftfel — bubble so the caller
|
|
47
|
+
// sees the actual API error instead of a misleading
|
|
48
|
+
// "App not found" that points the user the wrong way.
|
|
49
|
+
if (err.status === 401) {
|
|
50
|
+
return {
|
|
51
|
+
status: "needs_login",
|
|
52
|
+
fileCount: 0,
|
|
53
|
+
bytes: 0,
|
|
54
|
+
recovery: RECOVERY_NEEDS_LOGIN,
|
|
55
|
+
summary: "Not logged in — run `bunx percher login` first.",
|
|
56
|
+
configPath: "",
|
|
57
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (err.status === 404) {
|
|
61
|
+
return failureResult({
|
|
62
|
+
title: "App not found",
|
|
63
|
+
explanation: `Could not resolve app "${appName}".`,
|
|
64
|
+
suggestion: "Check the app name with `bunx percher whoami` or your dashboard.",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
// Resolve source deploy: explicit id wins; otherwise the latest live
|
|
71
|
+
// deploy. We deliberately don't fall back to the most recent FAILED
|
|
72
|
+
// deploy — re-running a known-bad deploy has no value when the
|
|
73
|
+
// tarball is unchanged (you'd just hit cache and produce the same
|
|
74
|
+
// failure). The user must opt into re-running a specific id if
|
|
75
|
+
// that's really what they want.
|
|
76
|
+
let sourceDeployId = input.deployId;
|
|
77
|
+
if (!sourceDeployId) {
|
|
78
|
+
const recent = await ctx.client.apps.listDeploys(app.id, { limit: 20 });
|
|
79
|
+
const lastLive = recent.find((d) => d.status === "live" && d.type !== "preview");
|
|
80
|
+
if (!lastLive) {
|
|
81
|
+
return failureResult({
|
|
82
|
+
title: "No live deploy to re-run",
|
|
83
|
+
explanation: `App "${appName}" has no successful live deploy in the last 20 entries.`,
|
|
84
|
+
suggestion: "Pass an explicit --deploy-id, or run `bunx percher publish` to make a fresh deploy first.",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
sourceDeployId = lastLive.id;
|
|
88
|
+
}
|
|
89
|
+
ctx.status(`Re-running ${sourceDeployId}...`);
|
|
90
|
+
let initial;
|
|
91
|
+
try {
|
|
92
|
+
initial = await ctx.client.apps.rerunDeploy(app.id, sourceDeployId);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (err instanceof PercherApiError) {
|
|
96
|
+
// Codex P2 follow-up on 6ad76be: the canonical code is
|
|
97
|
+
// DEPLOY_RATE_LIMIT (singular, matches the API's throw site at
|
|
98
|
+
// routes/deploys.ts:370+675). The previous DEPLOY_RATE_LIMITED
|
|
99
|
+
// never matched, so hourly-limit hits bubbled as raw
|
|
100
|
+
// PercherApiError instead of a structured PublishResult.
|
|
101
|
+
switch (err.code) {
|
|
102
|
+
case "TARBALL_GONE":
|
|
103
|
+
return failureResult({
|
|
104
|
+
title: "Source tarball is gone",
|
|
105
|
+
explanation: "The deploy you tried to re-run has been retention-evicted. Percher only keeps tarballs for a bounded window per plan.",
|
|
106
|
+
suggestion: "Run `bunx percher publish` to upload a fresh tarball, then redeploy that one in the future.",
|
|
107
|
+
});
|
|
108
|
+
case "DAILY_QUOTA_EXCEEDED": {
|
|
109
|
+
// Mirror publish.ts's structured quota mapping so agents
|
|
110
|
+
// see kind/used/limit/resetAt and can advise the user when
|
|
111
|
+
// the counter resets. Codex P2 follow-up on 6ad76be — the
|
|
112
|
+
// generic ask_user fallback dropped these fields and made
|
|
113
|
+
// /redeploy a worse recovery path than /publish for the
|
|
114
|
+
// same failure.
|
|
115
|
+
const extra = err.extra ?? {};
|
|
116
|
+
const kind = extra.kind ?? "live";
|
|
117
|
+
const used = extra.used ?? 0;
|
|
118
|
+
const limit = extra.limit ?? 0;
|
|
119
|
+
const resetAt = extra.resetAt ?? "";
|
|
120
|
+
const otherKind = kind === "live" ? "preview" : "live";
|
|
121
|
+
return {
|
|
122
|
+
status: "failed",
|
|
123
|
+
app,
|
|
124
|
+
fileCount: 0,
|
|
125
|
+
bytes: 0,
|
|
126
|
+
error: {
|
|
127
|
+
title: "Daily deploy quota reached",
|
|
128
|
+
explanation: `You've used ${used} of ${limit} ${kind} deploys today on this account. Counter resets at ${resetAt}.`,
|
|
129
|
+
suggestion: `Wait until the counter resets, deploy a ${otherKind} instead, or upgrade your plan at https://percher.app/settings to raise this cap.`,
|
|
130
|
+
},
|
|
131
|
+
recovery: recoveryAsk({
|
|
132
|
+
prompt: `Daily ${kind}-deploy quota reached (${used}/${limit}). Counter resets at ${resetAt}. Wait until then, deploy a ${otherKind} instead, or upgrade at https://percher.app/settings.`,
|
|
133
|
+
options: ["wait", `deploy ${otherKind}`, "upgrade"],
|
|
134
|
+
reasonCode: "quota_exceeded",
|
|
135
|
+
}),
|
|
136
|
+
summary: `Daily ${kind}-deploy quota reached (${used}/${limit}). Resets ${resetAt}.`,
|
|
137
|
+
configPath: "",
|
|
138
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
case "DEPLOY_RATE_LIMIT":
|
|
142
|
+
// Per-app hourly cap from deploysPerHour. Throw site:
|
|
143
|
+
// routes/deploys.ts:640 (also :370 for POST /deploys).
|
|
144
|
+
return failureResult({
|
|
145
|
+
title: "Deploy rate limit reached",
|
|
146
|
+
explanation: err.message,
|
|
147
|
+
suggestion: "Wait a minute or two and try again. Hourly limits scale with your plan; upgrade at https://percher.app/settings to raise it.",
|
|
148
|
+
});
|
|
149
|
+
case "DEPLOY_RATE_LIMITED": {
|
|
150
|
+
// Per-app burst limit from middleware/rate-limit.ts:241.
|
|
151
|
+
// The middleware carries `retryAfterSec` in extra — surface
|
|
152
|
+
// it on recovery.args so agents can wait the correct
|
|
153
|
+
// duration instead of guessing. Codex P2 follow-up on
|
|
154
|
+
// ee194f4 — the previous fix removed this case thinking it
|
|
155
|
+
// was a typo, but the two codes are distinct gates that
|
|
156
|
+
// both fire from /rerun.
|
|
157
|
+
//
|
|
158
|
+
// Codex P2 follow-up on 1851aa4: include app + deployId in
|
|
159
|
+
// recovery.args so an agent can deterministically retry
|
|
160
|
+
// THIS redeploy via percher_redeploy. Without them, the
|
|
161
|
+
// fallback resolution ("latest live") would re-pick at
|
|
162
|
+
// retry time and could hit a different deploy than the
|
|
163
|
+
// user originally targeted.
|
|
164
|
+
const extra = err.extra ?? {};
|
|
165
|
+
const retryAfterSec = extra.retryAfterSec ?? 60;
|
|
166
|
+
return {
|
|
167
|
+
status: "failed",
|
|
168
|
+
app,
|
|
169
|
+
fileCount: 0,
|
|
170
|
+
bytes: 0,
|
|
171
|
+
error: {
|
|
172
|
+
title: "Deploy burst limit reached",
|
|
173
|
+
explanation: err.message,
|
|
174
|
+
suggestion: `Wait ${retryAfterSec}s and try again — this is a short-window burst limit, not the daily quota.`,
|
|
175
|
+
},
|
|
176
|
+
recovery: recoveryRetry({
|
|
177
|
+
suggestedTool: "percher_redeploy",
|
|
178
|
+
args: {
|
|
179
|
+
app: app.name,
|
|
180
|
+
deployId: sourceDeployId,
|
|
181
|
+
retryAfterSec,
|
|
182
|
+
code: "DEPLOY_RATE_LIMITED",
|
|
183
|
+
},
|
|
184
|
+
reasonCode: "infra_transient",
|
|
185
|
+
}),
|
|
186
|
+
summary: `Deploy burst limit hit. Retry in ${retryAfterSec}s.`,
|
|
187
|
+
configPath: "",
|
|
188
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
case "ACCOUNT_SUSPENDED":
|
|
192
|
+
case "APP_SUSPENDED":
|
|
193
|
+
case "EMAIL_NOT_VERIFIED":
|
|
194
|
+
case "PREVIEW_LIMIT_REACHED":
|
|
195
|
+
return failureResult({
|
|
196
|
+
title: err.message,
|
|
197
|
+
explanation: err.message,
|
|
198
|
+
suggestion: "See the suggestion in the API error response. This affordance is also surfaced via percher_publish on the next attempt.",
|
|
199
|
+
});
|
|
200
|
+
case "RETRY_LIMIT_REACHED": {
|
|
201
|
+
// Codex round 12 P1 fix — /rerun now mirrors POST /deploys's
|
|
202
|
+
// retry-state guard. Surface as ask_user with reasonCode
|
|
203
|
+
// retry_limit_reached so agents stop auto-retrying after the
|
|
204
|
+
// one allowed retry inside the 10-minute window.
|
|
205
|
+
const extra = err.extra ?? {};
|
|
206
|
+
const resetAt = extra.resetAt ?? "";
|
|
207
|
+
return {
|
|
208
|
+
status: "failed",
|
|
209
|
+
app,
|
|
210
|
+
fileCount: 0,
|
|
211
|
+
bytes: 0,
|
|
212
|
+
error: {
|
|
213
|
+
title: "Retry limit reached",
|
|
214
|
+
explanation: err.message,
|
|
215
|
+
suggestion: "Percher already retried once after an infrastructure failure for this app. Wait until the window resets or surface to the user.",
|
|
216
|
+
},
|
|
217
|
+
recovery: recoveryAsk({
|
|
218
|
+
prompt: `Percher already retried once after an infrastructure failure on ${app.name}. Wait until ${resetAt} or surface to the user.`,
|
|
219
|
+
options: ["wait before retrying", "inspect status"],
|
|
220
|
+
reasonCode: "retry_limit_reached",
|
|
221
|
+
retryable: false,
|
|
222
|
+
}),
|
|
223
|
+
summary: `Retry limit reached for ${app.name}. Resets ${resetAt}.`,
|
|
224
|
+
configPath: "",
|
|
225
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case "REQUIRED_ENV_MISSING": {
|
|
229
|
+
// Codex round 12 P1 fix — /rerun now runs the Phase 6c env
|
|
230
|
+
// gate. Mirror publish.ts's mapping so agents get
|
|
231
|
+
// set_env_vars with the exact keys to set.
|
|
232
|
+
const extra = err.extra ?? {};
|
|
233
|
+
const keys = extra.keys ?? [];
|
|
234
|
+
return {
|
|
235
|
+
status: "failed",
|
|
236
|
+
app,
|
|
237
|
+
fileCount: 0,
|
|
238
|
+
bytes: 0,
|
|
239
|
+
error: {
|
|
240
|
+
title: "Missing required env keys",
|
|
241
|
+
explanation: err.message,
|
|
242
|
+
suggestion: `Set ${keys.length === 1 ? "it" : "them"} with \`bunx percher env set KEY=value\` and re-run.`,
|
|
243
|
+
errorClass: "missing_env",
|
|
244
|
+
missingEnvVars: keys,
|
|
245
|
+
},
|
|
246
|
+
recovery: recoveryEnv({
|
|
247
|
+
app: app.name,
|
|
248
|
+
keys,
|
|
249
|
+
reasonCode: "missing_env",
|
|
250
|
+
}),
|
|
251
|
+
summary: `Missing required env ${keys.length === 1 ? "key" : "keys"} on ${app.name}: ${keys.join(", ")}.`,
|
|
252
|
+
configPath: "",
|
|
253
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
case "ENV_KEY_UNDECLARED": {
|
|
257
|
+
// Codex round 12 P1 fix — /rerun now runs the Phase 6c env
|
|
258
|
+
// gate. Mirror publish.ts's fix_config mapping so agents
|
|
259
|
+
// get the per-ref problems for direct file edits.
|
|
260
|
+
const extra = err.extra ?? {};
|
|
261
|
+
const apiProblems = extra.problems ?? [];
|
|
262
|
+
const problems = apiProblems
|
|
263
|
+
.filter((p) => p.file)
|
|
264
|
+
.map((p) => ({
|
|
265
|
+
file: p.file,
|
|
266
|
+
line: p.line,
|
|
267
|
+
message: `Source references env key \`${p.key ?? "?"}\` not declared in [env]. Add it to [env].required, [env].optional, or [env].ignore in percher.toml.${p.context ? `\nContext: ${p.context}` : ""}`,
|
|
268
|
+
}));
|
|
269
|
+
return {
|
|
270
|
+
status: "failed",
|
|
271
|
+
app,
|
|
272
|
+
fileCount: 0,
|
|
273
|
+
bytes: 0,
|
|
274
|
+
error: {
|
|
275
|
+
title: "Env keys not declared",
|
|
276
|
+
explanation: err.message,
|
|
277
|
+
suggestion: "Add each undeclared key to [env].required / [env].optional / [env].ignore in percher.toml, then re-run.",
|
|
278
|
+
},
|
|
279
|
+
recovery: recoveryFixConfig({
|
|
280
|
+
problems,
|
|
281
|
+
reasonCode: "env_key_undeclared",
|
|
282
|
+
}),
|
|
283
|
+
summary: `${problems.length} undeclared env reference${problems.length === 1 ? "" : "s"} on ${app.name}.`,
|
|
284
|
+
configPath: "",
|
|
285
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
// Poll the new deployment to terminal status. Mirrors publish's
|
|
293
|
+
// 5-minute timeout + heartbeat pattern, just compressed (no upload
|
|
294
|
+
// step to wait through).
|
|
295
|
+
const buildStart = Date.now();
|
|
296
|
+
const timeoutMs = 5 * 60 * 1000;
|
|
297
|
+
let lastStatus;
|
|
298
|
+
let nextHeartbeatMs = 15_000;
|
|
299
|
+
let deployment = initial;
|
|
300
|
+
let timedOut = null;
|
|
301
|
+
try {
|
|
302
|
+
deployment = await pollDeployment({
|
|
303
|
+
ctx,
|
|
304
|
+
appId: app.id,
|
|
305
|
+
initial,
|
|
306
|
+
intervalMs: 2000,
|
|
307
|
+
timeoutMs,
|
|
308
|
+
appName: app.name,
|
|
309
|
+
onTick: (d) => {
|
|
310
|
+
const elapsedMs = Date.now() - buildStart;
|
|
311
|
+
if (d.status !== lastStatus) {
|
|
312
|
+
ctx.status(`${d.status}...`);
|
|
313
|
+
lastStatus = d.status;
|
|
314
|
+
nextHeartbeatMs = elapsedMs + 15_000;
|
|
315
|
+
}
|
|
316
|
+
else if (elapsedMs >= nextHeartbeatMs) {
|
|
317
|
+
ctx.status(`${d.status}... (${Math.round(elapsedMs / 1000)}s elapsed)`);
|
|
318
|
+
nextHeartbeatMs = elapsedMs + 15_000;
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
onTimeout: (d) => {
|
|
322
|
+
timedOut = { deployment: d };
|
|
323
|
+
throw new (class PollTimeoutSentinel extends Error {
|
|
324
|
+
})("__poll_timeout__");
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
if (!timedOut) {
|
|
330
|
+
return failureResult({
|
|
331
|
+
title: "Redeploy did not complete",
|
|
332
|
+
explanation: err instanceof Error
|
|
333
|
+
? err.message
|
|
334
|
+
: "The deploy stopped responding before reaching a terminal state.",
|
|
335
|
+
suggestion: `Inspect with \`bunx percher deploys inspect ${initial.id}\`.`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (timedOut) {
|
|
340
|
+
const stuck = timedOut.deployment;
|
|
341
|
+
return failureResult({
|
|
342
|
+
title: "Redeploy timed out",
|
|
343
|
+
explanation: "The redeploy did not complete within 5 minutes.",
|
|
344
|
+
suggestion: `Inspect with \`bunx percher deploys inspect ${stuck.id}\`.`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
const totalSeconds = (Date.now() - t0) / 1000;
|
|
348
|
+
const url = deployment.previewUrl ?? deployment.url ?? app.url;
|
|
349
|
+
if (deployment.status === "failed") {
|
|
350
|
+
const recovery = recoveryFromErrorClass("build_failed", {
|
|
351
|
+
deployId: deployment.id,
|
|
352
|
+
appName: app.name,
|
|
353
|
+
problems: deployment.problems,
|
|
354
|
+
});
|
|
355
|
+
return {
|
|
356
|
+
status: "failed",
|
|
357
|
+
app,
|
|
358
|
+
deployment,
|
|
359
|
+
fileCount: 0,
|
|
360
|
+
bytes: 0,
|
|
361
|
+
error: {
|
|
362
|
+
title: "Redeploy failed",
|
|
363
|
+
explanation: deployment.errorMessage ?? "The redeploy did not succeed.",
|
|
364
|
+
suggestion: `Inspect with \`bunx percher deploys inspect ${deployment.id}\`.`,
|
|
365
|
+
problems: deployment.problems,
|
|
366
|
+
},
|
|
367
|
+
recovery,
|
|
368
|
+
summary: `${appName} redeploy failed (${deployment.id}).`,
|
|
369
|
+
configPath: "",
|
|
370
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
// FUTURE1 Phase 1.6 — detect cache hit so the summary tells the
|
|
374
|
+
// user "cached, Ns" when the build skipped. Best-effort; left
|
|
375
|
+
// undefined on fetch failure (caller distinguishes that from
|
|
376
|
+
// confirmed false).
|
|
377
|
+
let cacheHit;
|
|
378
|
+
try {
|
|
379
|
+
const { events } = await ctx.client.apps.getDeployEvents(app.id, deployment.id);
|
|
380
|
+
cacheHit = events.some((e) => e.stage === "build" && e.status === "ok" && e.subStage === "cache_hit");
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
/* leave undefined */
|
|
384
|
+
}
|
|
385
|
+
ctx.status(`Live at ${url} (${totalSeconds.toFixed(0)}s)`);
|
|
386
|
+
const cacheTag = cacheHit ? "cached, " : "";
|
|
387
|
+
return {
|
|
388
|
+
status: "live",
|
|
389
|
+
app,
|
|
390
|
+
deployment,
|
|
391
|
+
url,
|
|
392
|
+
timing: { totalSeconds, packageMs: 0, uploadMs: 0, buildMs: Date.now() - buildStart },
|
|
393
|
+
fileCount: 0,
|
|
394
|
+
bytes: 0,
|
|
395
|
+
cacheHit,
|
|
396
|
+
recovery: RECOVERY_NONE,
|
|
397
|
+
summary: `${appName} redeployed (${cacheTag}${totalSeconds.toFixed(0)}s) → ${url}`,
|
|
398
|
+
configPath: "",
|
|
399
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
function failureResult(error) {
|
|
403
|
+
return {
|
|
404
|
+
status: "failed",
|
|
405
|
+
fileCount: 0,
|
|
406
|
+
bytes: 0,
|
|
407
|
+
error,
|
|
408
|
+
recovery: recoveryAsk({
|
|
409
|
+
prompt: `${error.title}: ${error.explanation} ${error.suggestion}`.trim(),
|
|
410
|
+
reasonCode: "unknown",
|
|
411
|
+
}),
|
|
412
|
+
summary: error.title,
|
|
413
|
+
configPath: "",
|
|
414
|
+
bundle: { fileCount: 0, bytes: 0 },
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=redeploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CASpF"}
|
package/dist/commands/rename.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAChC,CAAC,CAAC;AAUH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAY,EAAE,KAAkB;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,EAAE;YACvE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,6DAA6D;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from "zod/v3";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const reproduceInputSchema: z.ZodObject<{
|
|
4
|
+
app: z.ZodOptional<z.ZodString>;
|
|
5
|
+
deployId: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
deployId: string;
|
|
8
|
+
app?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
deployId: string;
|
|
11
|
+
app?: string | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export type ReproduceInput = z.infer<typeof reproduceInputSchema>;
|
|
14
|
+
export interface ReproduceResult {
|
|
15
|
+
status: "extracted" | "extracted_and_built" | "needs_login" | "failed";
|
|
16
|
+
/** Absolute path to the extracted source. Always set on extracted/built. */
|
|
17
|
+
tmpDir?: string;
|
|
18
|
+
/** Path to the downloaded .tar.gz when extraction failed and the user
|
|
19
|
+
* should run `tar -xzf` manually. Set when status === "extracted" and
|
|
20
|
+
* no extraction took place. */
|
|
21
|
+
tarballPath?: string;
|
|
22
|
+
/** App name resolved at the start. Echoed back so an agent can pass
|
|
23
|
+
* it to follow-up tools without re-resolving. */
|
|
24
|
+
appName?: string;
|
|
25
|
+
/** Deploy id passed in. Echoed back for the same reason. */
|
|
26
|
+
deployId: string;
|
|
27
|
+
/**
|
|
28
|
+
* Env keys (NOT values) currently configured on the app. These reflect
|
|
29
|
+
* the *current* state of the env store, NOT a snapshot taken at the
|
|
30
|
+
* failed deploy's build time — Percher doesn't persist a per-deploy
|
|
31
|
+
* env snapshot today (Phase 1's image cache hashes them, but doesn't
|
|
32
|
+
* store them). If the user rotated keys between the failure and the
|
|
33
|
+
* reproduce, this list reflects the rotation. Treat as a starting
|
|
34
|
+
* hint, not a deploy-time inventory. Codex P2 follow-up on 3b609f9.
|
|
35
|
+
*/
|
|
36
|
+
currentAppEnvKeys?: string[];
|
|
37
|
+
/** Whether nixpacks was found and ran successfully against the
|
|
38
|
+
* extracted source. False when nixpacks isn't installed locally OR
|
|
39
|
+
* when the local build also failed (in which case the user has the
|
|
40
|
+
* same error reproduced and can iterate from there). */
|
|
41
|
+
builtLocally?: boolean;
|
|
42
|
+
/** Human-readable summary echoed verbatim to humans. Always set. */
|
|
43
|
+
summary: string;
|
|
44
|
+
/** Optional error envelope when status === "failed". */
|
|
45
|
+
error?: {
|
|
46
|
+
title: string;
|
|
47
|
+
explanation: string;
|
|
48
|
+
suggestion: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* FUTURE1 Phase 4.2 — download a deploy's source tarball + (optionally)
|
|
53
|
+
* run nixpacks against it locally. The intended use is "build failed
|
|
54
|
+
* in cloud, reproduce here to fix" — surfaced via
|
|
55
|
+
* `recovery.alternativeActions[]` after `inspect_build_log` didn't
|
|
56
|
+
* yield a clear fix.
|
|
57
|
+
*
|
|
58
|
+
* Privacy invariant: env values are NEVER fetched. The endpoint
|
|
59
|
+
* surfaces only env *keys* so the user knows what to set locally; the
|
|
60
|
+
* values come from their own machine (or stay missing if compile-only
|
|
61
|
+
* errors are what we're debugging).
|
|
62
|
+
*/
|
|
63
|
+
export declare function reproduce(ctx: Context, input: ReproduceInput): Promise<ReproduceResult>;
|
|
64
|
+
//# sourceMappingURL=reproduce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce.d.ts","sourceRoot":"","sources":["../../src/commands/reproduce.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,oBAAoB;;;;;;;;;EAU/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,GAAG,qBAAqB,GAAG,aAAa,GAAG,QAAQ,CAAC;IACvE,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;oCAEgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;sDACkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;6DAGyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAgM7F"}
|