@sakupa/mcp 1.4.0 → 1.4.1

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.
Files changed (3) hide show
  1. package/dist/bin.js +15 -13
  2. package/dist/index.js +15 -13
  3. package/package.json +1 -1
package/dist/bin.js CHANGED
@@ -259,7 +259,8 @@ var DEFAULT_API_BASE_URL = "https://api.sakupa.com";
259
259
  var FREE_SITE_URL_SUFFIX = `.${SERVICE_DOMAIN}`;
260
260
  var TEST_ACCESS_HEADER = "x-sakupa-test-token";
261
261
  var CREDENTIAL_ROTATION_RECOMMEND_AFTER_SECONDS = 7 * 24 * 60 * 60;
262
- var FREE_SITE_TTL_HOURS = 24;
262
+ var FREE_SITE_TTL_DAYS = 30;
263
+ var FREE_SITE_TTL_HOURS = FREE_SITE_TTL_DAYS * 24;
263
264
  var FREE_SITE_MAX_TOTAL_BYTES = 10 * 1024 * 1024;
264
265
  var FREE_ACTIVE_SITES_PER_IP = 3;
265
266
  var PAID_SITE_MAX_TOTAL_BYTES = 2 * 1024 * 1024 * 1024;
@@ -402,7 +403,7 @@ function isFreeSiteAllowanceNetworkReference(value) {
402
403
  }
403
404
 
404
405
  // ../core/dist/domain/version.js
405
- var SAKUPA_MCP_VERSION = "1.4.0";
406
+ var SAKUPA_MCP_VERSION = "1.4.1";
406
407
 
407
408
  // ../core/dist/domain/errors.js
408
409
  var HTTP_STATUS = {
@@ -4419,7 +4420,7 @@ function registerTools(server, baseCtx) {
4419
4420
  "deploy",
4420
4421
  {
4421
4422
  title: "Deploy site",
4422
- description: `Deploy the local static output to Sakupa. First deploy creates a free temporary site (valid ${FREE_SITE_TTL_HOURS}h, public URL like https://${previewHostPattern}) and stores the management credential in .sakupa/site.json. Later runs update the existing site (free sites also refresh their validity; subscription-backed sites have no free-site expiry while the subscription remains active). Runs analyze first and refuses to upload source projects, secrets, .env files, archives, media or server code. The MCP process is locked to the current directory initialized by the no-argument init MCP tool; no tool argument can change that root. outputDir is a separate REQUIRED relative path supplied from the current project inspection. Never uploads anything when analysis says the project is not deployable.`,
4423
+ description: `Deploy the local static output to Sakupa. First deploy creates a free temporary site (valid ${FREE_SITE_TTL_DAYS} days, public URL like https://${previewHostPattern}) and stores the management credential in .sakupa/site.json. Later runs update the existing site (free sites also refresh their validity; subscription-backed sites have no free-site expiry while the subscription remains active). Runs analyze first and refuses to upload source projects, secrets, .env files, archives, media or server code. The MCP process is locked to the current directory initialized by the no-argument init MCP tool; no tool argument can change that root. outputDir is a separate REQUIRED relative path supplied from the current project inspection. Never uploads anything when analysis says the project is not deployable.`,
4423
4424
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
4424
4425
  annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4425
4426
  inputSchema: z2.object({
@@ -4436,7 +4437,7 @@ function registerTools(server, baseCtx) {
4436
4437
  "Override automatic SPA-fallback detection (single index.html + JS auto-enables rewriting unknown paths to index.html; multiple HTML pages auto-disable it). Pass only to force the behavior against the detected structure."
4437
4438
  ),
4438
4439
  publicConfirmed: z2.boolean().optional().describe(
4439
- "Required only for the first deployment: user explicitly confirmed creation of a public 24-hour URL."
4440
+ "Required only for the first deployment: user explicitly confirmed creation of a public URL valid for the free-site window."
4440
4441
  ),
4441
4442
  reuseSiteUrl: z2.string().url().optional().describe(
4442
4443
  "Exact existing free-site URL selected by the user when the three-site free-site allowance is full. Never invent this value; copy it from deploy nextActions."
@@ -4708,9 +4709,10 @@ function registerTools(server, baseCtx) {
4708
4709
  const confirmArguments = { ...args, ...confirmation };
4709
4710
  return presentDecision(baseCtx.decisions, call, "deploy", {
4710
4711
  resultCode: "public_deployment_confirmation_required",
4711
- summary: `First deployment creates a public URL that anyone with the link can open. The free preview stays live for ${FREE_SITE_TTL_HOURS} hours. Nothing has been uploaded or made public yet. The exact confirmation field is publicConfirmed: true.`,
4712
+ summary: `First deployment creates a public URL that anyone with the link can open. The free preview stays live for ${FREE_SITE_TTL_DAYS} days. Nothing has been uploaded or made public yet. The exact confirmation field is publicConfirmed: true.`,
4712
4713
  data: {
4713
4714
  publicUrlLifetimeHours: FREE_SITE_TTL_HOURS,
4715
+ publicUrlLifetimeDays: FREE_SITE_TTL_DAYS,
4714
4716
  confirmationField: "publicConfirmed",
4715
4717
  confirmation,
4716
4718
  confirmArguments
@@ -4720,7 +4722,7 @@ function registerTools(server, baseCtx) {
4720
4722
  callToolDecisionOption({
4721
4723
  id: "create_public_preview",
4722
4724
  label: "Create the public preview",
4723
- description: `Publish the selected files at a public URL for ${FREE_SITE_TTL_HOURS} hours.`,
4725
+ description: `Publish the selected files at a public URL for ${FREE_SITE_TTL_DAYS} days.`,
4724
4726
  consequences: ["Anyone with the generated URL can open the site."],
4725
4727
  tool: "deploy",
4726
4728
  arguments: confirmArguments,
@@ -4932,7 +4934,7 @@ function registerTools(server, baseCtx) {
4932
4934
  ["Credential path", ".sakupa/site.json"]
4933
4935
  ],
4934
4936
  notes: [
4935
- `This is a FREE temporary preview: it stays live for ${FREE_SITE_TTL_HOURS} hours. Deploying again or calling refresh extends the validity; while a subscription remains active, this URL stays live without the free-site expiry. This is conditional on the subscription remaining active: do NOT describe the site as permanent or long-term, and do NOT say the subscription is bound to the site.`,
4937
+ `This is a FREE temporary preview: it stays live for ${FREE_SITE_TTL_DAYS} days. Deploying again or calling refresh extends the validity; while a subscription remains active, this URL stays live without the free-site expiry. This is conditional on the subscription remaining active: do NOT describe the site as permanent or long-term, and do NOT say the subscription is bound to the site.`,
4936
4938
  "The management credential was saved to the exact relative path .sakupa/site.json \u2014 preserve this complete path verbatim and never shorten it to site.json. Keep that file: it is the only way to manage this site.",
4937
4939
  ...[credentialGitReminder(ctx.projectDir)].filter((line) => line.trim().length > 0)
4938
4940
  ],
@@ -5052,7 +5054,7 @@ ${JSON.stringify(finalized2.warnings, null, 2)}
5052
5054
  ...credentialRotationResumed ? [
5053
5055
  "A previously confirmed credential rotation was resumed safely before this deploy; every older credential is revoked."
5054
5056
  ] : [],
5055
- finalized.mode === "free" ? `Reminder: free sites stay live for ${FREE_SITE_TTL_HOURS} hours after the last deploy or refresh call. While a subscription remains active, the site stays live without this free-site expiry.` : "This site is subscription-backed and has no free-site expiry while the subscription remains active.",
5057
+ finalized.mode === "free" ? `Reminder: free sites stay live for ${FREE_SITE_TTL_DAYS} days after the last deploy or refresh call. While a subscription remains active, the site stays live without this free-site expiry.` : "This site is subscription-backed and has no free-site expiry while the subscription remains active.",
5056
5058
  ...credentialSecurity?.rotationRecommended ? [
5057
5059
  `Optional security recommendation: this management credential was created at ${timestampForAgent(credentialSecurity.credentialCreatedAt)} and is older than 7 days. The deploy SUCCEEDED and rotation is not required. Ask the user whether they want to rotate; call rotate without confirmed:true to show the exact revocation preview. Never rotate automatically.`
5058
5060
  ] : []
@@ -5154,7 +5156,7 @@ ${JSON.stringify(finalized.warnings, null, 2)}
5154
5156
  ],
5155
5157
  notes: [
5156
5158
  "NO content was uploaded or changed by this call \u2014 to publish new or edited files, run deploy.",
5157
- `Free sites stay live for ${FREE_SITE_TTL_HOURS} hours after each deploy or refresh.`
5159
+ `Free sites stay live for ${FREE_SITE_TTL_DAYS} days after each deploy or refresh.`
5158
5160
  ],
5159
5161
  next: ["`status`", "`deploy` to publish changed files"]
5160
5162
  }),
@@ -5206,7 +5208,7 @@ ${JSON.stringify(finalized.warnings, null, 2)}
5206
5208
  "subscribe",
5207
5209
  {
5208
5210
  title: "Subscribe (Stripe Checkout)",
5209
- description: `Create a Stripe Checkout link that subscribes THIS site to a Sakupa Hosting monthly plan (${planCatalog()}). While the subscription remains active, its ${previewHostPattern} URL stays live without the free 24-hour expiry. Binding a custom domain afterwards (bind) is an optional included extra and requires DNS control of that domain. Owner-only: requires this project's site credential (.sakupa/site.json) \u2014 deploy first. If the site outgrows its plan, Sakupa shows an over-limit notice and never changes billing automatically. The owner can explicitly choose another plan through Stripe Customer Portal. Card details are entered only on the Stripe-hosted page \u2014 never through the AI tool. Opening and completing Stripe Checkout is the final subscription confirmation.`,
5211
+ description: `Create a Stripe Checkout link that subscribes THIS site to a Sakupa Hosting monthly plan (${planCatalog()}). While the subscription remains active, its ${previewHostPattern} URL stays live without the free 30-day expiry. Binding a custom domain afterwards (bind) is an optional included extra and requires DNS control of that domain. Owner-only: requires this project's site credential (.sakupa/site.json) \u2014 deploy first. If the site outgrows its plan, Sakupa shows an over-limit notice and never changes billing automatically. The owner can explicitly choose another plan through Stripe Customer Portal. Card details are entered only on the Stripe-hosted page \u2014 never through the AI tool. Opening and completing Stripe Checkout is the final subscription confirmation.`,
5210
5212
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
5211
5213
  annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
5212
5214
  inputSchema: z2.object({
@@ -7416,7 +7418,7 @@ Workflow:
7416
7418
  (Vite/Vue/React/Svelte/Astro/Next static export/Nuxt generate), run the build LOCALLY first,
7417
7419
  then re-run analyze.
7418
7420
  2. deploy \u2014 uploads ONLY the built static output. The first deploy creates a free temporary
7419
- site (public URL ${hostPattern}, valid 24 hours, free banner shown) and stores the
7421
+ site (public URL ${hostPattern}, valid 30 days, free banner shown) and stores the
7420
7422
  management credential in .sakupa/site.json. Deploying again updates the site and refreshes
7421
7423
  its validity; refresh extends validity without uploading; status shows the
7422
7424
  current deployment and serving state at any time. Every update checks the credential's
@@ -7425,7 +7427,7 @@ Workflow:
7425
7427
  3. To keep the site live beyond the free period, subscribe it to a monthly hosting plan (plans
7426
7428
  shows the catalog; subscribe -> Stripe-hosted checkout;
7427
7429
  water/personal/share/business). While the subscription remains active, the
7428
- ${hostPattern} URL stays live without the free 24-hour expiry. Usage over the chosen plan
7430
+ ${hostPattern} URL stays live without the free 30-day expiry. Usage over the chosen plan
7429
7431
  shows an over-limit notice by default. An external AI may periodically query usage and
7430
7432
  recommend a plan, but Sakupa never changes a subscription automatically.
7431
7433
  4. Optionally bind a custom domain to the subscribed site (bind): an included extra
@@ -7436,7 +7438,7 @@ Workflow:
7436
7438
  until the new domain's www is confirmed live, then it is replaced automatically.
7437
7439
  Plan changes are confirmed only on Stripe and synchronized by Stripe webhook.
7438
7440
  A cancellation keeps the site paid through the current period. Sakupa reverts it to a free
7439
- 24h site and removes paid data after Stripe sends the signed final-cancellation webhook.
7441
+ 30-day site and removes paid data after Stripe sends the signed final-cancellation webhook.
7440
7442
  Recovery writes the new local credential before downloading content. If a session stops after
7441
7443
  .sakupa/site.json exists, NEVER repeat DNS recovery: resume with recover action "download".
7442
7444
  5. If any Sakupa operation is difficult or fails, call help FIRST. support handles billing,
package/dist/index.js CHANGED
@@ -4,7 +4,8 @@ var DEFAULT_API_BASE_URL = "https://api.sakupa.com";
4
4
  var FREE_SITE_URL_SUFFIX = `.${SERVICE_DOMAIN}`;
5
5
  var TEST_ACCESS_HEADER = "x-sakupa-test-token";
6
6
  var CREDENTIAL_ROTATION_RECOMMEND_AFTER_SECONDS = 7 * 24 * 60 * 60;
7
- var FREE_SITE_TTL_HOURS = 24;
7
+ var FREE_SITE_TTL_DAYS = 30;
8
+ var FREE_SITE_TTL_HOURS = FREE_SITE_TTL_DAYS * 24;
8
9
  var FREE_SITE_MAX_TOTAL_BYTES = 10 * 1024 * 1024;
9
10
  var FREE_ACTIVE_SITES_PER_IP = 3;
10
11
  var PAID_SITE_MAX_TOTAL_BYTES = 2 * 1024 * 1024 * 1024;
@@ -147,7 +148,7 @@ function isFreeSiteAllowanceNetworkReference(value) {
147
148
  }
148
149
 
149
150
  // ../core/dist/domain/version.js
150
- var SAKUPA_MCP_VERSION = "1.4.0";
151
+ var SAKUPA_MCP_VERSION = "1.4.1";
151
152
 
152
153
  // ../core/dist/domain/errors.js
153
154
  var HTTP_STATUS = {
@@ -4529,7 +4530,7 @@ function registerTools(server, baseCtx) {
4529
4530
  "deploy",
4530
4531
  {
4531
4532
  title: "Deploy site",
4532
- description: `Deploy the local static output to Sakupa. First deploy creates a free temporary site (valid ${FREE_SITE_TTL_HOURS}h, public URL like https://${previewHostPattern}) and stores the management credential in .sakupa/site.json. Later runs update the existing site (free sites also refresh their validity; subscription-backed sites have no free-site expiry while the subscription remains active). Runs analyze first and refuses to upload source projects, secrets, .env files, archives, media or server code. The MCP process is locked to the current directory initialized by the no-argument init MCP tool; no tool argument can change that root. outputDir is a separate REQUIRED relative path supplied from the current project inspection. Never uploads anything when analysis says the project is not deployable.`,
4533
+ description: `Deploy the local static output to Sakupa. First deploy creates a free temporary site (valid ${FREE_SITE_TTL_DAYS} days, public URL like https://${previewHostPattern}) and stores the management credential in .sakupa/site.json. Later runs update the existing site (free sites also refresh their validity; subscription-backed sites have no free-site expiry while the subscription remains active). Runs analyze first and refuses to upload source projects, secrets, .env files, archives, media or server code. The MCP process is locked to the current directory initialized by the no-argument init MCP tool; no tool argument can change that root. outputDir is a separate REQUIRED relative path supplied from the current project inspection. Never uploads anything when analysis says the project is not deployable.`,
4533
4534
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
4534
4535
  annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
4535
4536
  inputSchema: z2.object({
@@ -4546,7 +4547,7 @@ function registerTools(server, baseCtx) {
4546
4547
  "Override automatic SPA-fallback detection (single index.html + JS auto-enables rewriting unknown paths to index.html; multiple HTML pages auto-disable it). Pass only to force the behavior against the detected structure."
4547
4548
  ),
4548
4549
  publicConfirmed: z2.boolean().optional().describe(
4549
- "Required only for the first deployment: user explicitly confirmed creation of a public 24-hour URL."
4550
+ "Required only for the first deployment: user explicitly confirmed creation of a public URL valid for the free-site window."
4550
4551
  ),
4551
4552
  reuseSiteUrl: z2.string().url().optional().describe(
4552
4553
  "Exact existing free-site URL selected by the user when the three-site free-site allowance is full. Never invent this value; copy it from deploy nextActions."
@@ -4818,9 +4819,10 @@ function registerTools(server, baseCtx) {
4818
4819
  const confirmArguments = { ...args, ...confirmation };
4819
4820
  return presentDecision(baseCtx.decisions, call, "deploy", {
4820
4821
  resultCode: "public_deployment_confirmation_required",
4821
- summary: `First deployment creates a public URL that anyone with the link can open. The free preview stays live for ${FREE_SITE_TTL_HOURS} hours. Nothing has been uploaded or made public yet. The exact confirmation field is publicConfirmed: true.`,
4822
+ summary: `First deployment creates a public URL that anyone with the link can open. The free preview stays live for ${FREE_SITE_TTL_DAYS} days. Nothing has been uploaded or made public yet. The exact confirmation field is publicConfirmed: true.`,
4822
4823
  data: {
4823
4824
  publicUrlLifetimeHours: FREE_SITE_TTL_HOURS,
4825
+ publicUrlLifetimeDays: FREE_SITE_TTL_DAYS,
4824
4826
  confirmationField: "publicConfirmed",
4825
4827
  confirmation,
4826
4828
  confirmArguments
@@ -4830,7 +4832,7 @@ function registerTools(server, baseCtx) {
4830
4832
  callToolDecisionOption({
4831
4833
  id: "create_public_preview",
4832
4834
  label: "Create the public preview",
4833
- description: `Publish the selected files at a public URL for ${FREE_SITE_TTL_HOURS} hours.`,
4835
+ description: `Publish the selected files at a public URL for ${FREE_SITE_TTL_DAYS} days.`,
4834
4836
  consequences: ["Anyone with the generated URL can open the site."],
4835
4837
  tool: "deploy",
4836
4838
  arguments: confirmArguments,
@@ -5042,7 +5044,7 @@ function registerTools(server, baseCtx) {
5042
5044
  ["Credential path", ".sakupa/site.json"]
5043
5045
  ],
5044
5046
  notes: [
5045
- `This is a FREE temporary preview: it stays live for ${FREE_SITE_TTL_HOURS} hours. Deploying again or calling refresh extends the validity; while a subscription remains active, this URL stays live without the free-site expiry. This is conditional on the subscription remaining active: do NOT describe the site as permanent or long-term, and do NOT say the subscription is bound to the site.`,
5047
+ `This is a FREE temporary preview: it stays live for ${FREE_SITE_TTL_DAYS} days. Deploying again or calling refresh extends the validity; while a subscription remains active, this URL stays live without the free-site expiry. This is conditional on the subscription remaining active: do NOT describe the site as permanent or long-term, and do NOT say the subscription is bound to the site.`,
5046
5048
  "The management credential was saved to the exact relative path .sakupa/site.json \u2014 preserve this complete path verbatim and never shorten it to site.json. Keep that file: it is the only way to manage this site.",
5047
5049
  ...[credentialGitReminder(ctx.projectDir)].filter((line) => line.trim().length > 0)
5048
5050
  ],
@@ -5162,7 +5164,7 @@ ${JSON.stringify(finalized2.warnings, null, 2)}
5162
5164
  ...credentialRotationResumed ? [
5163
5165
  "A previously confirmed credential rotation was resumed safely before this deploy; every older credential is revoked."
5164
5166
  ] : [],
5165
- finalized.mode === "free" ? `Reminder: free sites stay live for ${FREE_SITE_TTL_HOURS} hours after the last deploy or refresh call. While a subscription remains active, the site stays live without this free-site expiry.` : "This site is subscription-backed and has no free-site expiry while the subscription remains active.",
5167
+ finalized.mode === "free" ? `Reminder: free sites stay live for ${FREE_SITE_TTL_DAYS} days after the last deploy or refresh call. While a subscription remains active, the site stays live without this free-site expiry.` : "This site is subscription-backed and has no free-site expiry while the subscription remains active.",
5166
5168
  ...credentialSecurity?.rotationRecommended ? [
5167
5169
  `Optional security recommendation: this management credential was created at ${timestampForAgent(credentialSecurity.credentialCreatedAt)} and is older than 7 days. The deploy SUCCEEDED and rotation is not required. Ask the user whether they want to rotate; call rotate without confirmed:true to show the exact revocation preview. Never rotate automatically.`
5168
5170
  ] : []
@@ -5264,7 +5266,7 @@ ${JSON.stringify(finalized.warnings, null, 2)}
5264
5266
  ],
5265
5267
  notes: [
5266
5268
  "NO content was uploaded or changed by this call \u2014 to publish new or edited files, run deploy.",
5267
- `Free sites stay live for ${FREE_SITE_TTL_HOURS} hours after each deploy or refresh.`
5269
+ `Free sites stay live for ${FREE_SITE_TTL_DAYS} days after each deploy or refresh.`
5268
5270
  ],
5269
5271
  next: ["`status`", "`deploy` to publish changed files"]
5270
5272
  }),
@@ -5316,7 +5318,7 @@ ${JSON.stringify(finalized.warnings, null, 2)}
5316
5318
  "subscribe",
5317
5319
  {
5318
5320
  title: "Subscribe (Stripe Checkout)",
5319
- description: `Create a Stripe Checkout link that subscribes THIS site to a Sakupa Hosting monthly plan (${planCatalog()}). While the subscription remains active, its ${previewHostPattern} URL stays live without the free 24-hour expiry. Binding a custom domain afterwards (bind) is an optional included extra and requires DNS control of that domain. Owner-only: requires this project's site credential (.sakupa/site.json) \u2014 deploy first. If the site outgrows its plan, Sakupa shows an over-limit notice and never changes billing automatically. The owner can explicitly choose another plan through Stripe Customer Portal. Card details are entered only on the Stripe-hosted page \u2014 never through the AI tool. Opening and completing Stripe Checkout is the final subscription confirmation.`,
5321
+ description: `Create a Stripe Checkout link that subscribes THIS site to a Sakupa Hosting monthly plan (${planCatalog()}). While the subscription remains active, its ${previewHostPattern} URL stays live without the free 30-day expiry. Binding a custom domain afterwards (bind) is an optional included extra and requires DNS control of that domain. Owner-only: requires this project's site credential (.sakupa/site.json) \u2014 deploy first. If the site outgrows its plan, Sakupa shows an over-limit notice and never changes billing automatically. The owner can explicitly choose another plan through Stripe Customer Portal. Card details are entered only on the Stripe-hosted page \u2014 never through the AI tool. Opening and completing Stripe Checkout is the final subscription confirmation.`,
5320
5322
  outputSchema: STRUCTURED_TOOL_OUTPUT_SCHEMA,
5321
5323
  annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
5322
5324
  inputSchema: z2.object({
@@ -7384,7 +7386,7 @@ Workflow:
7384
7386
  (Vite/Vue/React/Svelte/Astro/Next static export/Nuxt generate), run the build LOCALLY first,
7385
7387
  then re-run analyze.
7386
7388
  2. deploy \u2014 uploads ONLY the built static output. The first deploy creates a free temporary
7387
- site (public URL ${hostPattern}, valid 24 hours, free banner shown) and stores the
7389
+ site (public URL ${hostPattern}, valid 30 days, free banner shown) and stores the
7388
7390
  management credential in .sakupa/site.json. Deploying again updates the site and refreshes
7389
7391
  its validity; refresh extends validity without uploading; status shows the
7390
7392
  current deployment and serving state at any time. Every update checks the credential's
@@ -7393,7 +7395,7 @@ Workflow:
7393
7395
  3. To keep the site live beyond the free period, subscribe it to a monthly hosting plan (plans
7394
7396
  shows the catalog; subscribe -> Stripe-hosted checkout;
7395
7397
  water/personal/share/business). While the subscription remains active, the
7396
- ${hostPattern} URL stays live without the free 24-hour expiry. Usage over the chosen plan
7398
+ ${hostPattern} URL stays live without the free 30-day expiry. Usage over the chosen plan
7397
7399
  shows an over-limit notice by default. An external AI may periodically query usage and
7398
7400
  recommend a plan, but Sakupa never changes a subscription automatically.
7399
7401
  4. Optionally bind a custom domain to the subscribed site (bind): an included extra
@@ -7404,7 +7406,7 @@ Workflow:
7404
7406
  until the new domain's www is confirmed live, then it is replaced automatically.
7405
7407
  Plan changes are confirmed only on Stripe and synchronized by Stripe webhook.
7406
7408
  A cancellation keeps the site paid through the current period. Sakupa reverts it to a free
7407
- 24h site and removes paid data after Stripe sends the signed final-cancellation webhook.
7409
+ 30-day site and removes paid data after Stripe sends the signed final-cancellation webhook.
7408
7410
  Recovery writes the new local credential before downloading content. If a session stops after
7409
7411
  .sakupa/site.json exists, NEVER repeat DNS recovery: resume with recover action "download".
7410
7412
  5. If any Sakupa operation is difficult or fails, call help FIRST. support handles billing,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sakupa/mcp",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "mcpName": "io.github.myerwang/sakupa",
5
5
  "description": "Sakupa MCP server: publish AI-made static sites from your AI tool. AI-made pages, live in seconds.",
6
6
  "homepage": "https://sakupa.com/manual/",