openship 0.6.6 → 0.6.7

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 (58) hide show
  1. package/dist/bare-7QD623QV.js +29 -0
  2. package/dist/{chunk-Q7WGTQQ5.js → chunk-2ANV5ZQ5.js} +1 -1
  3. package/dist/{chunk-UJ6JZM65.js → chunk-2VSW6Q6C.js} +601 -382
  4. package/dist/{chunk-PCPVTH6M.js → chunk-5T4UVOM3.js} +6 -4
  5. package/dist/{chunk-YMMQRE5J.js → chunk-BLEXTYRK.js} +1 -1
  6. package/dist/{chunk-OBPKYXQL.js → chunk-CIJV43LH.js} +71 -32
  7. package/dist/{chunk-NK5N5LXN.js → chunk-DDFUESPJ.js} +24 -9
  8. package/dist/{chunk-6FH4AXVY.js → chunk-E2X26PXR.js} +1 -1
  9. package/dist/{chunk-HKRQXPTI.js → chunk-FYPFEDPZ.js} +1 -1
  10. package/dist/{chunk-UVNMQM7W.js → chunk-FZ6QCF6B.js} +8 -6
  11. package/dist/{chunk-MLYSEZQB.js → chunk-GGIAIGUL.js} +15 -66
  12. package/dist/{chunk-2YM3NI2E.js → chunk-GIPJNNI5.js} +38 -44
  13. package/dist/{chunk-ZFJXPCQP.js → chunk-H3WT3A6R.js} +4 -3
  14. package/dist/chunk-H4FS5BED.js +936 -0
  15. package/dist/{chunk-CBLD2HS5.js → chunk-J2XM3QSP.js} +8 -5
  16. package/dist/{chunk-FE7ZZQSE.js → chunk-J3K6XABC.js} +3 -3
  17. package/dist/{chunk-77QDF6UD.js → chunk-LHFXSC36.js} +428 -93
  18. package/dist/{chunk-YIMOCZBZ.js → chunk-MEE6OZFP.js} +3 -3
  19. package/dist/chunk-N5YZMO33.js +111 -0
  20. package/dist/{chunk-QVW76WDL.js → chunk-NRTJRNAE.js} +58 -16
  21. package/dist/{chunk-WVAML4H6.js → chunk-PPEBIY5F.js} +247 -61
  22. package/dist/{chunk-4I2BM2DT.js → chunk-PVP4RGWT.js} +3 -3
  23. package/dist/{chunk-RSR7PFIQ.js → chunk-QHMDCYZ3.js} +4 -4
  24. package/dist/chunk-R4VDPFLS.js +106 -0
  25. package/dist/{chunk-VTGPEC6B.js → chunk-RDXT4BQB.js} +6 -4
  26. package/dist/{chunk-LFE5KQ7Y.js → chunk-S6B2Z3OO.js} +142 -57
  27. package/dist/chunk-UWEV6XTS.js +249 -0
  28. package/dist/{chunk-5DMWSTOM.js → chunk-VQM6JHJB.js} +940 -224
  29. package/dist/{chunk-SM26HDS2.js → chunk-VSTFHUCV.js} +44 -50
  30. package/dist/chunk-WU54BXFE.js +70 -0
  31. package/dist/{chunk-LUKYPVJ4.js → chunk-XWHWTHEL.js} +313 -469
  32. package/dist/{chunk-A4GXYE4L.js → chunk-ZPJ74LXE.js} +22 -20
  33. package/dist/cloud-KNNABE3O.js +40 -0
  34. package/dist/{detect-OIE5V3VZ.js → detect-G4DR3U2N.js} +9 -6
  35. package/dist/{docker-VTR2GK5Y.js → docker-YOVPCIB4.js} +11 -8
  36. package/dist/{docker-edge-executor-22IBXNYJ.js → docker-edge-executor-QFXD3337.js} +8 -6
  37. package/dist/edge-import-CRFVSR6P.js +56 -0
  38. package/dist/{edge-preflight-GBNCPNVU.js → edge-preflight-MXERVAMG.js} +15 -12
  39. package/dist/{ensure-container-edge-KPI2CVXJ.js → ensure-container-edge-F4JUNQIK.js} +13 -10
  40. package/dist/{executor-7LXXZPBR.js → executor-CVPAYYHR.js} +8 -6
  41. package/dist/host-channel-preflight-QTDNGLCK.js +54 -0
  42. package/dist/index.js +84 -48
  43. package/dist/{local-executor-WOFZD72X.js → local-executor-ODC6RANU.js} +3 -2
  44. package/dist/{nginx-KUFMLMAC.js → nginx-KLFF43TC.js} +11 -8
  45. package/dist/{openresty-lua-ATTH35BE.js → openresty-lua-VKWUV4GB.js} +6 -5
  46. package/dist/{privilege-I4W3ZNZK.js → privilege-7D3SSOL3.js} +6 -5
  47. package/dist/server/index.js +8813 -5232
  48. package/dist/setup-I5AJC6NJ.js +25 -0
  49. package/dist/{ssh-client-JBMA7SN4.js → ssh-client-625VWGKP.js} +3 -2
  50. package/dist/up-QXTOOVXC.js +61 -0
  51. package/package.json +1 -1
  52. package/dist/bare-OXJVW3AK.js +0 -25
  53. package/dist/chunk-LH2PLRQO.js +0 -434
  54. package/dist/cloud-75VIT4KV.js +0 -37
  55. package/dist/edge-import-WJUB4M7F.js +0 -52
  56. package/dist/host-channel-preflight-KE6OONYK.js +0 -50
  57. package/dist/setup-XGLGUUFW.js +0 -22
  58. package/dist/up-K4BV7466.js +0 -57
@@ -6,6 +6,57 @@ import {
6
6
  __export
7
7
  } from "./chunk-PXKCZB2I.js";
8
8
 
9
+ // ../../packages/core/src/shell-split.ts
10
+ function shellQuote(value) {
11
+ return `'${value.replace(/'/g, "'\\''")}'`;
12
+ }
13
+ function shellSplitWords(value) {
14
+ const words = [];
15
+ let current = "";
16
+ let quoted = false;
17
+ let inSingle = false;
18
+ let inDouble = false;
19
+ let escaped = false;
20
+ for (const char of value.trim()) {
21
+ if (escaped) {
22
+ current += char;
23
+ escaped = false;
24
+ continue;
25
+ }
26
+ if (char === "\\" && !inSingle) {
27
+ escaped = true;
28
+ continue;
29
+ }
30
+ if (char === "'" && !inDouble) {
31
+ inSingle = !inSingle;
32
+ quoted = true;
33
+ continue;
34
+ }
35
+ if (char === '"' && !inSingle) {
36
+ inDouble = !inDouble;
37
+ quoted = true;
38
+ continue;
39
+ }
40
+ if (/\s/.test(char) && !inSingle && !inDouble) {
41
+ if (current || quoted) {
42
+ words.push(current);
43
+ current = "";
44
+ quoted = false;
45
+ }
46
+ continue;
47
+ }
48
+ current += char;
49
+ }
50
+ if (escaped) current += "\\";
51
+ if (current || quoted) words.push(current);
52
+ return words;
53
+ }
54
+ function commandToArgv(command) {
55
+ if (command == null) return null;
56
+ if (Array.isArray(command)) return command.map((part) => String(part));
57
+ return shellSplitWords(command);
58
+ }
59
+
9
60
  // ../../packages/core/src/stacks.ts
10
61
  var LANGUAGES = {
11
62
  javascript: {
@@ -831,6 +882,21 @@ function packageManagerEnsureCommand(packageManager) {
831
882
  if (packageManager !== "pnpm" && packageManager !== "yarn") return "";
832
883
  return `(corepack enable ${packageManager} || corepack enable || npm i -g ${packageManager}) >/dev/null 2>&1 || true`;
833
884
  }
885
+ var NODE_BIN_PACKAGE_MANAGERS = /* @__PURE__ */ new Set(["npm", "yarn", "pnpm", "bun"]);
886
+ function nodeBinDirs(packageManager, roots) {
887
+ if (!packageManager || !NODE_BIN_PACKAGE_MANAGERS.has(packageManager)) return [];
888
+ const dirs = [];
889
+ for (const root of roots) {
890
+ const dir = `${root.replace(/\/+$/, "")}/node_modules/.bin`;
891
+ if (!dirs.includes(dir)) dirs.push(dir);
892
+ }
893
+ return dirs;
894
+ }
895
+ function nodeBinPathExport(packageManager, roots) {
896
+ const dirs = nodeBinDirs(packageManager, roots);
897
+ if (dirs.length === 0) return "";
898
+ return `export PATH=${dirs.map(shellQuote).join(":")}:"$PATH"`;
899
+ }
834
900
  var DI = "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons";
835
901
  var STACK_ICONS = {
836
902
  // JS/TS - Frontend & Fullstack
@@ -2561,57 +2627,6 @@ function isAwsS3Endpoint(endpoint2) {
2561
2627
  return !endpoint2 || endpoint2.includes(".amazonaws.com");
2562
2628
  }
2563
2629
 
2564
- // ../../packages/core/src/shell-split.ts
2565
- function shellQuote(value) {
2566
- return `'${value.replace(/'/g, "'\\''")}'`;
2567
- }
2568
- function shellSplitWords(value) {
2569
- const words = [];
2570
- let current = "";
2571
- let quoted = false;
2572
- let inSingle = false;
2573
- let inDouble = false;
2574
- let escaped = false;
2575
- for (const char of value.trim()) {
2576
- if (escaped) {
2577
- current += char;
2578
- escaped = false;
2579
- continue;
2580
- }
2581
- if (char === "\\" && !inSingle) {
2582
- escaped = true;
2583
- continue;
2584
- }
2585
- if (char === "'" && !inDouble) {
2586
- inSingle = !inSingle;
2587
- quoted = true;
2588
- continue;
2589
- }
2590
- if (char === '"' && !inSingle) {
2591
- inDouble = !inDouble;
2592
- quoted = true;
2593
- continue;
2594
- }
2595
- if (/\s/.test(char) && !inSingle && !inDouble) {
2596
- if (current || quoted) {
2597
- words.push(current);
2598
- current = "";
2599
- quoted = false;
2600
- }
2601
- continue;
2602
- }
2603
- current += char;
2604
- }
2605
- if (escaped) current += "\\";
2606
- if (current || quoted) words.push(current);
2607
- return words;
2608
- }
2609
- function commandToArgv(command) {
2610
- if (command == null) return null;
2611
- if (Array.isArray(command)) return command.map((part) => String(part));
2612
- return shellSplitWords(command);
2613
- }
2614
-
2615
2630
  // ../../packages/core/src/mail-image-ref.ts
2616
2631
  function buildMailImageRef(opts) {
2617
2632
  return buildImageRef(opts, {
@@ -2621,6 +2636,284 @@ function buildMailImageRef(opts) {
2621
2636
  });
2622
2637
  }
2623
2638
 
2639
+ // ../../packages/core/src/backup-catalog.ts
2640
+ var PAYLOAD_KINDS = [
2641
+ "pg_dump",
2642
+ "mysql_dump",
2643
+ "redis_rdb",
2644
+ "mongo_dump",
2645
+ "custom_command",
2646
+ "path",
2647
+ "volume"
2648
+ ];
2649
+ var PAYLOAD_CONFIG_KEYS = [
2650
+ "sourceIds",
2651
+ "exclude",
2652
+ "quiesce",
2653
+ "compression",
2654
+ "paths",
2655
+ "clearPath",
2656
+ "produceCommand",
2657
+ "command",
2658
+ "restoreCommand",
2659
+ "artifactName"
2660
+ ];
2661
+ var UNIVERSAL_PAYLOAD_CONFIG_KEYS = ["verifyOnPrepare", "mail"];
2662
+ var ALL_PAYLOAD_CONFIG_KEYS = [
2663
+ ...PAYLOAD_CONFIG_KEYS,
2664
+ ...UNIVERSAL_PAYLOAD_CONFIG_KEYS
2665
+ ];
2666
+ var HOUR_MS = 60 * 60 * 1e3;
2667
+ var BACKUP_PAYLOADS = {
2668
+ pg_dump: {
2669
+ kind: "pg_dump",
2670
+ label: "PostgreSQL",
2671
+ method: "pg_dump",
2672
+ shape: "database",
2673
+ images: { names: ["postgres", "postgis/postgis"] },
2674
+ restoreNeedsLiveContainer: true,
2675
+ restoreAppliesAfterBounce: false,
2676
+ restoreTimeoutMs: HOUR_MS,
2677
+ // Inert: `pg_restore --clean --if-exists` owns replacement.
2678
+ restoreClearsTargetByDefault: false,
2679
+ // The only kind that can claim this, and only since `producers/pg-dump.ts` restores
2680
+ // under `--single-transaction`. Before that flag, a DROP blocked by a dependent view
2681
+ // was skipped and the archive's rows were loaded ON TOP of the live ones — one table
2682
+ // holding a merge of two points in time, reported as "errors ignored on restore".
2683
+ restoreFailureLeavesTargetIntact: true,
2684
+ requiresRestoreCommand: false,
2685
+ operatorSelectable: true,
2686
+ configKeys: []
2687
+ },
2688
+ mysql_dump: {
2689
+ kind: "mysql_dump",
2690
+ label: "MySQL/MariaDB",
2691
+ method: "mysqldump",
2692
+ shape: "database",
2693
+ // `percona/percona-server` and `percona/percona-server-mongodb` are kept apart by
2694
+ // the `(:|$)` anchor: what follows `percona-server` in the MongoDB image is `-`,
2695
+ // which is neither a tag separator nor the end of the string.
2696
+ images: { names: ["mysql", "mariadb", "percona/percona-server"] },
2697
+ restoreNeedsLiveContainer: true,
2698
+ restoreAppliesAfterBounce: false,
2699
+ restoreTimeoutMs: HOUR_MS,
2700
+ restoreClearsTargetByDefault: false,
2701
+ // MySQL has no transactional DDL: replaying a dump commits each statement as it
2702
+ // goes, so a failure halfway leaves half the schema and part of the data.
2703
+ restoreFailureLeavesTargetIntact: false,
2704
+ requiresRestoreCommand: false,
2705
+ operatorSelectable: true,
2706
+ configKeys: []
2707
+ },
2708
+ redis_rdb: {
2709
+ kind: "redis_rdb",
2710
+ label: "Redis",
2711
+ method: "RDB snapshot",
2712
+ shape: "database",
2713
+ images: { names: ["redis"], namespaces: ["redis"] },
2714
+ restoreNeedsLiveContainer: true,
2715
+ // The one kind whose write is inert until the service restarts. See the field doc.
2716
+ restoreAppliesAfterBounce: true,
2717
+ restoreTimeoutMs: 30 * 60 * 1e3,
2718
+ restoreClearsTargetByDefault: false,
2719
+ // The write is a stream into `dump.rdb`. A failure halfway leaves a TRUNCATED
2720
+ // snapshot — which the running server has not read (see restoreAppliesAfterBounce)
2721
+ // but the next start will, and refuse.
2722
+ restoreFailureLeavesTargetIntact: false,
2723
+ requiresRestoreCommand: false,
2724
+ operatorSelectable: true,
2725
+ configKeys: []
2726
+ },
2727
+ mongo_dump: {
2728
+ kind: "mongo_dump",
2729
+ label: "MongoDB",
2730
+ method: "mongodump",
2731
+ shape: "database",
2732
+ images: { names: ["mongo", "percona/percona-server-mongodb"] },
2733
+ restoreNeedsLiveContainer: true,
2734
+ restoreAppliesAfterBounce: false,
2735
+ restoreTimeoutMs: HOUR_MS,
2736
+ restoreClearsTargetByDefault: false,
2737
+ // `mongorestore --drop` drops and reloads per collection, so a failure between two
2738
+ // collections leaves one restored and the next dropped.
2739
+ restoreFailureLeavesTargetIntact: false,
2740
+ requiresRestoreCommand: false,
2741
+ operatorSelectable: true,
2742
+ configKeys: []
2743
+ },
2744
+ custom_command: {
2745
+ kind: "custom_command",
2746
+ label: "Custom command",
2747
+ method: "your command",
2748
+ shape: "opaque",
2749
+ restoreNeedsLiveContainer: true,
2750
+ restoreAppliesAfterBounce: false,
2751
+ restoreTimeoutMs: HOUR_MS,
2752
+ // Inert: the operator's own inverse command decides what it replaces.
2753
+ restoreClearsTargetByDefault: false,
2754
+ // We cannot reason about someone else's command. `opaque` in, opaque out.
2755
+ restoreFailureLeavesTargetIntact: false,
2756
+ requiresRestoreCommand: true,
2757
+ operatorSelectable: true,
2758
+ configKeys: ["produceCommand", "command", "restoreCommand", "artifactName"]
2759
+ },
2760
+ path: {
2761
+ kind: "path",
2762
+ label: "Files and folders",
2763
+ method: "tar",
2764
+ shape: "filesystem",
2765
+ // Explicit-only: a path is something the operator names. Nothing about an image
2766
+ // says "back up /var/www", and guessing would either miss the data or archive an
2767
+ // OS.
2768
+ restoreNeedsLiveContainer: true,
2769
+ restoreAppliesAfterBounce: false,
2770
+ // Matches the docker helper's own absolute ceiling for the volume directions, so
2771
+ // one number covers all three: a tree big enough to need hours to capture needs
2772
+ // hours to restore.
2773
+ restoreTimeoutMs: 6 * HOUR_MS,
2774
+ // Merge, unless the policy sets `clearPath`. A folder is not necessarily this
2775
+ // artifact's alone.
2776
+ restoreClearsTargetByDefault: false,
2777
+ // `tar -x` writes file by file: a failure halfway leaves the tree part-updated,
2778
+ // and with `clearPath` set it leaves it part-updated on top of an emptied folder.
2779
+ restoreFailureLeavesTargetIntact: false,
2780
+ requiresRestoreCommand: false,
2781
+ operatorSelectable: true,
2782
+ configKeys: ["paths", "exclude", "compression", "clearPath"]
2783
+ },
2784
+ volume: {
2785
+ kind: "volume",
2786
+ label: "Volume snapshot",
2787
+ method: "tar",
2788
+ shape: "filesystem",
2789
+ // No `images`: this is the fallback the registry uses when nothing else detects,
2790
+ // not a match on anything.
2791
+ //
2792
+ // A volume restore extracts through a SEPARATE helper container mounted on the
2793
+ // volume, so it is the only kind that can restore into a service whose container
2794
+ // is gone — or that never deployed.
2795
+ restoreNeedsLiveContainer: false,
2796
+ restoreAppliesAfterBounce: false,
2797
+ restoreTimeoutMs: 6 * HOUR_MS,
2798
+ // Replace: a volume is a single-purpose store, so a merge would leave files this
2799
+ // artifact never held.
2800
+ restoreClearsTargetByDefault: true,
2801
+ // Clear-then-extract, and the clear happens in the helper's PRELUDE — so by the
2802
+ // time any error escapes, the volume is already empty. This is the case the
2803
+ // orchestrator's old inference was built around, and it is still exactly right.
2804
+ restoreFailureLeavesTargetIntact: false,
2805
+ requiresRestoreCommand: false,
2806
+ operatorSelectable: true,
2807
+ configKeys: ["sourceIds", "exclude", "quiesce", "compression"]
2808
+ }
2809
+ };
2810
+ function payloadSpec(kind) {
2811
+ const spec = BACKUP_PAYLOADS[kind];
2812
+ if (!spec) {
2813
+ throw new Error(
2814
+ `Unknown backup payload kind "${kind}". Known kinds: ${PAYLOAD_KINDS.join(", ")}.`
2815
+ );
2816
+ }
2817
+ return spec;
2818
+ }
2819
+ function payloadSpecs() {
2820
+ return PAYLOAD_KINDS.map((k) => BACKUP_PAYLOADS[k]);
2821
+ }
2822
+ function imageDetectableSpecs() {
2823
+ return payloadSpecs().filter(
2824
+ (s) => !!s.images
2825
+ );
2826
+ }
2827
+ var SYSTEM_ROOTS = [
2828
+ "/bin",
2829
+ "/boot",
2830
+ "/dev",
2831
+ "/etc",
2832
+ "/lib",
2833
+ "/lib32",
2834
+ "/lib64",
2835
+ "/libx32",
2836
+ "/proc",
2837
+ "/root",
2838
+ "/run",
2839
+ "/sbin",
2840
+ "/sys",
2841
+ "/usr",
2842
+ "/var"
2843
+ ];
2844
+ function normalizeBackupPath(input) {
2845
+ const collapsed = input.trim().replace(/\/{2,}/g, "/");
2846
+ if (collapsed === "/") return "/";
2847
+ return collapsed.replace(/\/+$/, "");
2848
+ }
2849
+ function validateBackupPath(input) {
2850
+ const path = normalizeBackupPath(input);
2851
+ if (path === "") return "A backup path cannot be empty.";
2852
+ if (!path.startsWith("/")) {
2853
+ return `Backup path "${input}" must be absolute \u2014 it is resolved inside the service, where there is no meaningful working directory.`;
2854
+ }
2855
+ if (path.includes("\0")) return `Backup path "${input}" contains a NUL byte.`;
2856
+ if (path.split("/").includes("..")) {
2857
+ return `Backup path "${input}" contains "..". Name the directory you mean directly; a traversal segment would archive somewhere other than what is shown here.`;
2858
+ }
2859
+ if (path === "/") {
2860
+ return "Refusing to archive `/` \u2014 that is the whole filesystem, including /proc and /sys. Name the data directory instead.";
2861
+ }
2862
+ return null;
2863
+ }
2864
+ function validateClearPath(input) {
2865
+ const path = normalizeBackupPath(input);
2866
+ const invalid = validateBackupPath(path);
2867
+ if (invalid) return invalid;
2868
+ const segments = path.split("/").filter(Boolean);
2869
+ if (segments.length < 2) {
2870
+ return `Refusing to clear "${path}" before restoring: it is a top-level directory. Name a subdirectory, or leave clearing off so the restore extracts over the existing files.`;
2871
+ }
2872
+ const top = `/${segments[0]}`;
2873
+ if (SYSTEM_ROOTS.includes(top)) {
2874
+ return `Refusing to clear "${path}" before restoring: it is inside ${top}, which holds the operating system rather than your data. Leave clearing off, or restore into a path you own.`;
2875
+ }
2876
+ return null;
2877
+ }
2878
+
2879
+ // ../../packages/core/src/backup-image-detect.ts
2880
+ var escapeRe = (n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
2881
+ function matcherFor(names, namespaces = []) {
2882
+ const exact = `^(?:${names.map(escapeRe).join("|")})(?::|$)`;
2883
+ if (namespaces.length === 0) return new RegExp(exact, "i");
2884
+ return new RegExp(`${exact}|^(?:${namespaces.map(escapeRe).join("|")})/`, "i");
2885
+ }
2886
+ var MATCHERS = imageDetectableSpecs().map(
2887
+ (spec) => ({
2888
+ re: matcherFor(spec.images.names, spec.images.namespaces),
2889
+ match: { payloadKind: spec.kind, label: spec.label, method: spec.method }
2890
+ })
2891
+ );
2892
+ function normalizeImageRef(image) {
2893
+ let ref = image.trim();
2894
+ const at = ref.indexOf("@");
2895
+ if (at > 0) ref = ref.slice(0, at);
2896
+ const parts = ref.split("/");
2897
+ const first = parts[0] ?? "";
2898
+ if (parts.length > 1 && (first.includes(".") || first.includes(":") || first === "localhost")) {
2899
+ parts.shift();
2900
+ }
2901
+ const library = parts.lastIndexOf("library");
2902
+ if (library >= 0 && library < parts.length - 1) parts.splice(0, library + 1);
2903
+ return parts.join("/");
2904
+ }
2905
+ function detectDbImage(image) {
2906
+ const img = normalizeImageRef(image ?? "");
2907
+ if (!img) return null;
2908
+ for (const { re, match } of MATCHERS) {
2909
+ if (re.test(img)) return match;
2910
+ }
2911
+ return null;
2912
+ }
2913
+ function isDbImage(image, kind) {
2914
+ return detectDbImage(image)?.payloadKind === kind;
2915
+ }
2916
+
2624
2917
  // ../../packages/core/src/runtime-config.ts
2625
2918
  var DEFAULT_PORT = {
2626
2919
  web: 3e3,
@@ -22928,6 +23221,25 @@ var planLimitsSchema = external_exports.object({
22928
23221
  * `null` = uncapped (enterprise).
22929
23222
  */
22930
23223
  maxResourceTier: external_exports.enum(RESOURCE_TIER_ORDER).nullable(),
23224
+ /**
23225
+ * App runtime included per month, in COMPUTE MINUTES — one minute of a `low`
23226
+ * machine. Bigger machines burn proportionally more (`computeUnitsPerMinute`:
23227
+ * medium 2×, high 4×, xlarge 8×), so one published number covers every size
23228
+ * without quoting a separate allowance per tier of machine.
23229
+ *
23230
+ * This replaced an authored `credits` blob whose numbers meant nothing: 60,000
23231
+ * credits against a 43,200-minute month, on a tier advertising 50 running
23232
+ * services — i.e. not enough to run ONE app around the clock. The unit now has
23233
+ * a definition, and `planMonthlyCredits()` derives the Oblien grant from it.
23234
+ *
23235
+ * `runningServices` is a CONCURRENCY cap, this is the METER. A tier may allow
23236
+ * more always-on apps than its minutes cover; that is what "up to" means and is
23237
+ * how metered compute works everywhere.
23238
+ *
23239
+ * 0 is meaningful and correct for a static-only tier: the edge serves static
23240
+ * sites, `runningServices` is already 0, so no app compute is consumed.
23241
+ */
23242
+ computeMinutesPerMonth: limitNumber,
22931
23243
  buildMinutesPerMonth: limitNumber,
22932
23244
  freeSubdomains: limitNumber,
22933
23245
  customDomains: limitNumber,
@@ -22949,10 +23261,6 @@ var planSchema = external_exports.object({
22949
23261
  support: external_exports.enum(["community", "email", "priority", "dedicated"]),
22950
23262
  /** Tier whose features this one builds on — drives the "Everything in X" line. */
22951
23263
  inherits: external_exports.string().min(1).optional(),
22952
- credits: external_exports.object({
22953
- /** Milli-credits granted per period; null = granted by hand (enterprise). */
22954
- monthlyMilli: external_exports.number().int().positive().nullable()
22955
- }),
22956
23264
  limits: planLimitsSchema,
22957
23265
  /** Copy keys, in display order. Each must exist in `locales/en.json#features`. */
22958
23266
  features: external_exports.array(external_exports.string().min(1)).min(1)
@@ -23025,6 +23333,20 @@ var pricingCatalogSchema = external_exports.object({
23025
23333
  campaigns: external_exports.array(campaignSchema),
23026
23334
  plans: external_exports.array(planSchema).min(1),
23027
23335
  creditPacks: external_exports.array(creditPackSchema),
23336
+ /**
23337
+ * Copy for what EVERY cloud tier includes, stated once instead of repeated
23338
+ * down each column.
23339
+ *
23340
+ * This exists because the per-tier lists had become the differentiator, and
23341
+ * they were differentiating on nothing: the audit log, live logs and metrics
23342
+ * are ungated for everyone, so listing them only under Team implied a paywall
23343
+ * that no code enforces. A tier's bullets are now its NUMBERS; anything true
23344
+ * everywhere belongs here.
23345
+ *
23346
+ * Only put a key here that is actually shipped and reachable on cloud — the
23347
+ * defect this block replaces was advertising capability, not describing it.
23348
+ */
23349
+ standard: external_exports.object({ features: external_exports.array(external_exports.string().min(1)).min(1) }),
23028
23350
  selfHosted: external_exports.object({ features: external_exports.array(external_exports.string().min(1)).min(1) })
23029
23351
  }).superRefine((data, ctx) => {
23030
23352
  if (data.schemaVersion > MAX_SUPPORTED_PRICING_SCHEMA) {
@@ -23123,7 +23445,13 @@ var pricingCopySchema = external_exports.object({
23123
23445
  billedMonthly: external_exports.string(),
23124
23446
  campaignBadge: external_exports.string(),
23125
23447
  campaignEnds: external_exports.string(),
23126
- wasPrice: external_exports.string()
23448
+ wasPrice: external_exports.string(),
23449
+ /** Heading over the `standard.features` block. Lives here, not in an app
23450
+ * dictionary, because the marketing site has no i18n framework. */
23451
+ standardTitle: external_exports.string(),
23452
+ /** What a top-up pack buys, in recognisable units. Interpolates
23453
+ * `{appHours}` and `{buildMinutes}`, both derived from the catalog. */
23454
+ creditPackNote: external_exports.string()
23127
23455
  }).partial().optional()
23128
23456
  });
23129
23457
 
@@ -23159,9 +23487,6 @@ var pricing_default = {
23159
23487
  popular: false,
23160
23488
  contactSales: null,
23161
23489
  support: "community",
23162
- credits: {
23163
- monthlyMilli: 5e5
23164
- },
23165
23490
  limits: {
23166
23491
  workloads: [
23167
23492
  "static"
@@ -23170,7 +23495,8 @@ var pricing_default = {
23170
23495
  runningServices: 0,
23171
23496
  maxProjects: 3,
23172
23497
  maxResourceTier: "low",
23173
- buildMinutesPerMonth: 15,
23498
+ computeMinutesPerMonth: 0,
23499
+ buildMinutesPerMonth: 500,
23174
23500
  freeSubdomains: 10,
23175
23501
  customDomains: null,
23176
23502
  seats: null
@@ -23178,10 +23504,8 @@ var pricing_default = {
23178
23504
  features: [
23179
23505
  "staticOnly",
23180
23506
  "buildMinutes",
23181
- "freeSubdomains",
23182
- "customDomains",
23183
23507
  "projects",
23184
- "unlimitedSeats",
23508
+ "freeSubdomains",
23185
23509
  "communitySupport"
23186
23510
  ]
23187
23511
  },
@@ -23199,9 +23523,6 @@ var pricing_default = {
23199
23523
  contactSales: null,
23200
23524
  support: "email",
23201
23525
  inherits: "free",
23202
- credits: {
23203
- monthlyMilli: 2e6
23204
- },
23205
23526
  limits: {
23206
23527
  workloads: [
23207
23528
  "static",
@@ -23210,9 +23531,10 @@ var pricing_default = {
23210
23531
  ],
23211
23532
  services: true,
23212
23533
  runningServices: 3,
23213
- maxProjects: 5,
23534
+ maxProjects: 10,
23214
23535
  maxResourceTier: "medium",
23215
- buildMinutesPerMonth: 400,
23536
+ computeMinutesPerMonth: 15e4,
23537
+ buildMinutesPerMonth: 3e3,
23216
23538
  freeSubdomains: 25,
23217
23539
  customDomains: null,
23218
23540
  seats: null
@@ -23220,15 +23542,11 @@ var pricing_default = {
23220
23542
  features: [
23221
23543
  "everythingIn",
23222
23544
  "anyWorkload",
23223
- "managedServices",
23224
23545
  "runningServices",
23546
+ "computeMinutes",
23547
+ "buildMinutes",
23225
23548
  "power",
23226
23549
  "projects",
23227
- "buildMinutes",
23228
- "credits",
23229
- "meteredCredits",
23230
- "freeSubdomains",
23231
- "previewDeploys",
23232
23550
  "emailSupport"
23233
23551
  ]
23234
23552
  },
@@ -23246,9 +23564,6 @@ var pricing_default = {
23246
23564
  contactSales: null,
23247
23565
  support: "priority",
23248
23566
  inherits: "starter",
23249
- credits: {
23250
- monthlyMilli: 1e7
23251
- },
23252
23567
  limits: {
23253
23568
  workloads: [
23254
23569
  "static",
@@ -23257,9 +23572,10 @@ var pricing_default = {
23257
23572
  ],
23258
23573
  services: true,
23259
23574
  runningServices: 10,
23260
- maxProjects: 25,
23575
+ maxProjects: 50,
23261
23576
  maxResourceTier: "high",
23262
- buildMinutesPerMonth: 2e3,
23577
+ computeMinutesPerMonth: 6e5,
23578
+ buildMinutesPerMonth: 12e3,
23263
23579
  freeSubdomains: 100,
23264
23580
  customDomains: null,
23265
23581
  seats: null
@@ -23267,15 +23583,10 @@ var pricing_default = {
23267
23583
  features: [
23268
23584
  "everythingIn",
23269
23585
  "runningServices",
23586
+ "computeMinutes",
23587
+ "buildMinutes",
23270
23588
  "power",
23271
23589
  "projects",
23272
- "buildMinutes",
23273
- "credits",
23274
- "meteredCredits",
23275
- "freeSubdomains",
23276
- "backups",
23277
- "observability",
23278
- "mailServer",
23279
23590
  "prioritySupport"
23280
23591
  ]
23281
23592
  },
@@ -23293,9 +23604,6 @@ var pricing_default = {
23293
23604
  contactSales: null,
23294
23605
  support: "priority",
23295
23606
  inherits: "pro",
23296
- credits: {
23297
- monthlyMilli: 6e7
23298
- },
23299
23607
  limits: {
23300
23608
  workloads: [
23301
23609
  "static",
@@ -23306,7 +23614,8 @@ var pricing_default = {
23306
23614
  runningServices: 50,
23307
23615
  maxProjects: null,
23308
23616
  maxResourceTier: "xlarge",
23309
- buildMinutesPerMonth: 6e3,
23617
+ computeMinutesPerMonth: 22e5,
23618
+ buildMinutesPerMonth: 36e3,
23310
23619
  freeSubdomains: null,
23311
23620
  customDomains: null,
23312
23621
  seats: null
@@ -23314,14 +23623,11 @@ var pricing_default = {
23314
23623
  features: [
23315
23624
  "everythingIn",
23316
23625
  "runningServices",
23626
+ "computeMinutes",
23627
+ "buildMinutes",
23317
23628
  "power",
23318
23629
  "projectsUnlimited",
23319
- "buildMinutes",
23320
- "credits",
23321
- "meteredCredits",
23322
23630
  "freeSubdomainsUnlimited",
23323
- "auditLog",
23324
- "sharedChannel",
23325
23631
  "prioritySupport"
23326
23632
  ]
23327
23633
  },
@@ -23339,9 +23645,6 @@ var pricing_default = {
23339
23645
  contactSales: "mailto:sales@openship.io",
23340
23646
  support: "dedicated",
23341
23647
  inherits: "team",
23342
- credits: {
23343
- monthlyMilli: null
23344
- },
23345
23648
  limits: {
23346
23649
  workloads: [
23347
23650
  "static",
@@ -23352,6 +23655,7 @@ var pricing_default = {
23352
23655
  runningServices: null,
23353
23656
  maxProjects: null,
23354
23657
  maxResourceTier: null,
23658
+ computeMinutesPerMonth: null,
23355
23659
  buildMinutesPerMonth: null,
23356
23660
  freeSubdomains: null,
23357
23661
  customDomains: null,
@@ -23390,6 +23694,15 @@ var pricing_default = {
23390
23694
  sortOrder: 30
23391
23695
  }
23392
23696
  ],
23697
+ standard: {
23698
+ features: [
23699
+ "gitDeploys",
23700
+ "customDomains",
23701
+ "deployLogs",
23702
+ "auditLog",
23703
+ "unlimitedSeats"
23704
+ ]
23705
+ },
23393
23706
  selfHosted: {
23394
23707
  features: [
23395
23708
  "selfHostedOpenSource",
@@ -23429,20 +23742,20 @@ var en_default2 = {
23429
23742
  features: {
23430
23743
  everythingIn: "Everything in {inherited}, plus:",
23431
23744
  staticOnly: "Static sites only \u2014 SSG, SPA, and plain HTML",
23432
- anyWorkload: "Run anything \u2014 containers, Compose stacks, and workers",
23433
- managedServices: "Managed Postgres, Redis, and the full app catalog",
23745
+ anyWorkload: "Run anything \u2014 containers, Compose, workers, Postgres, Redis",
23746
+ runningServices: "{runningServices} running apps, databases or workers",
23747
+ computeMinutes: "{computeMinutes} compute minutes per month",
23434
23748
  buildMinutes: "{buildMinutes} build minutes per month",
23435
- credits: "{credits} compute credits per month",
23749
+ power: "Up to {powerCpu} vCPU and {powerRamGb} GB RAM per app",
23750
+ projects: "{maxProjects} projects",
23751
+ projectsUnlimited: "Unlimited projects",
23436
23752
  freeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains",
23437
23753
  freeSubdomainsUnlimited: "Unlimited free {freeDomainSuffix} subdomains",
23754
+ gitDeploys: "Deploy from GitHub, GitLab, or any Git remote",
23438
23755
  customDomains: "Unlimited custom domains, TLS included",
23756
+ deployLogs: "Live build and deploy logs",
23757
+ auditLog: "Audit log of every change",
23439
23758
  unlimitedSeats: "Unlimited team members \u2014 never pay per seat",
23440
- previewDeploys: "Preview deploys on every push",
23441
- backups: "Daily backups with point-in-time recovery",
23442
- observability: "Live logs, metrics, and health alerts",
23443
- mailServer: "Built-in mail server \u2014 SMTP, IMAP, and webmail",
23444
- auditLog: "Audit log with extended retention",
23445
- sharedChannel: "Shared Slack or Discord channel",
23446
23759
  sso: "SSO and SAML",
23447
23760
  customLimits: "Custom limits, negotiated per contract",
23448
23761
  dedicatedInfra: "Dedicated infrastructure and regions",
@@ -23455,12 +23768,7 @@ var en_default2 = {
23455
23768
  selfHostedUnlimited: "Unlimited deploys, projects, servers, and domains",
23456
23769
  selfHostedServices: "Every managed service \u2014 Postgres, Redis, mail",
23457
23770
  selfHostedClients: "CLI, web, and desktop \u2014 one backend",
23458
- selfHostedFreeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains when you connect to Cloud",
23459
- runningServices: "{runningServices} running services \u2014 apps, databases, workers",
23460
- power: "Up to {powerCpu} vCPU and {powerRamGb} GB RAM per service",
23461
- projects: "{maxProjects} projects",
23462
- projectsUnlimited: "Unlimited projects",
23463
- meteredCredits: "Compute, bandwidth and storage all draw from your monthly credits"
23771
+ selfHostedFreeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains when you connect to Cloud"
23464
23772
  },
23465
23773
  selfHosted: {
23466
23774
  name: "Self-hosted",
@@ -23470,9 +23778,9 @@ var en_default2 = {
23470
23778
  cta: "Start self-hosting"
23471
23779
  },
23472
23780
  creditPacks: {
23473
- pack_5k: "{credits} credits",
23474
- pack_25k: "{credits} credits",
23475
- pack_100k: "{credits} credits"
23781
+ pack_5k: "{computeMinutes} compute minutes",
23782
+ pack_25k: "{computeMinutes} compute minutes",
23783
+ pack_100k: "{computeMinutes} compute minutes"
23476
23784
  },
23477
23785
  ui: {
23478
23786
  perMonth: "/mo",
@@ -23488,7 +23796,9 @@ var en_default2 = {
23488
23796
  billedMonthly: "billed monthly, cancel anytime",
23489
23797
  campaignBadge: "{percentOff}% off",
23490
23798
  campaignEnds: "Offer ends {date}",
23491
- wasPrice: "was {price}"
23799
+ wasPrice: "was {price}",
23800
+ standardTitle: "In every plan",
23801
+ creditPackNote: "\u2248 {appHours} hours of a small app, or {buildMinutes} build minutes"
23492
23802
  }
23493
23803
  };
23494
23804
 
@@ -23519,20 +23829,20 @@ var ar_default2 = {
23519
23829
  features: {
23520
23830
  everythingIn: "\u0643\u0644 \u0645\u0627 \u0641\u064A \u062E\u0637\u0629 \xAB{inherited}\xBB\u060C \u0628\u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649:",
23521
23831
  staticOnly: "\u0627\u0644\u0645\u0648\u0627\u0642\u0639 \u0627\u0644\u062B\u0627\u0628\u062A\u0629 \u0641\u0642\u0637 \u2014 SSG \u0648SPA \u0648HTML \u0639\u0627\u062F\u064A",
23522
- anyWorkload: "\u0634\u063A\u0651\u0644 \u0623\u064A \u0634\u064A\u0621 \u2014 \u062D\u0627\u0648\u064A\u0627\u062A \u0648\u062D\u0650\u0632\u0645 Compose \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062E\u0644\u0641\u064A\u0629",
23523
- managedServices: "\u062E\u062F\u0645\u0627\u062A Postgres \u0648Redis \u0645\u064F\u062F\u0627\u0631\u0629\u060C \u0645\u0639 \u0643\u062A\u0627\u0644\u0648\u062C \u0627\u0644\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0627\u0644\u0643\u0627\u0645\u0644",
23832
+ anyWorkload: "\u0634\u063A\u0651\u0644 \u0623\u064A \u0634\u064A\u0621 \u2014 \u062D\u0627\u0648\u064A\u0627\u062A \u0648Compose \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062E\u0644\u0641\u064A\u0629 \u0648Postgres \u0648Redis",
23833
+ runningServices: "{runningServices} \u062A\u0637\u0628\u064A\u0642 \u0623\u0648 \u0642\u0627\u0639\u062F\u0629 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648 \u0639\u0645\u0644\u064A\u0629 \u062E\u0644\u0641\u064A\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
23834
+ computeMinutes: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629 \u0634\u0647\u0631\u064A\u064B\u0627",
23524
23835
  buildMinutes: "{buildMinutes} \u062F\u0642\u064A\u0642\u0629 \u0628\u0646\u0627\u0621 \u0634\u0647\u0631\u064A\u064B\u0627",
23525
- credits: "{credits} \u0648\u062D\u062F\u0629 \u0631\u0635\u064A\u062F \u062D\u0648\u0633\u0628\u0629 \u0634\u0647\u0631\u064A\u064B\u0627",
23836
+ power: "\u062D\u062A\u0649 {powerCpu} vCPU \u0648{powerRamGb} GB RAM \u0644\u0643\u0644 \u062A\u0637\u0628\u064A\u0642",
23837
+ projects: "{maxProjects} \u0645\u0634\u0631\u0648\u0639",
23838
+ projectsUnlimited: "\u0645\u0634\u0627\u0631\u064A\u0639 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
23526
23839
  freeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix}",
23527
23840
  freeSubdomainsUnlimited: "\u0646\u0637\u0627\u0642\u0627\u062A \u0641\u0631\u0639\u064A\u0629 \u0645\u062C\u0627\u0646\u064A\u0629 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629 \u0639\u0644\u0649 {freeDomainSuffix}",
23841
+ gitDeploys: "\u0627\u0644\u0646\u0634\u0631 \u0645\u0646 GitHub \u0623\u0648 GitLab \u0623\u0648 \u0623\u064A \u0645\u0633\u062A\u0648\u062F\u0639 Git",
23528
23842
  customDomains: "\u0646\u0637\u0627\u0642\u0627\u062A \u0645\u062E\u0635\u0651\u0635\u0629 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629\u060C \u0645\u0639 TLS",
23843
+ deployLogs: "\u0633\u062C\u0644\u0627\u062A \u062D\u064A\u0651\u0629 \u0644\u0644\u0628\u0646\u0627\u0621 \u0648\u0627\u0644\u0646\u0634\u0631",
23844
+ auditLog: "\u0633\u062C\u0644 \u062A\u062F\u0642\u064A\u0642 \u0644\u0643\u0644 \u062A\u063A\u064A\u064A\u0631",
23529
23845
  unlimitedSeats: "\u0623\u0639\u0636\u0627\u0621 \u0641\u0631\u064A\u0642 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u064A\u0646 \u2014 \u0628\u0644\u0627 \u0631\u0633\u0648\u0645 \u0639\u0644\u0649 \u0643\u0644 \u0645\u0633\u062A\u062E\u062F\u0645",
23530
- previewDeploys: "\u0646\u0634\u0631 \u0645\u0639\u0627\u064A\u0646\u0629 \u0639\u0646\u062F \u0643\u0644 \u062F\u0641\u0639 \u0644\u0644\u0643\u0648\u062F",
23531
- backups: "\u0646\u0633\u062E \u0627\u062D\u062A\u064A\u0627\u0637\u064A \u064A\u0648\u0645\u064A \u0645\u0639 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0625\u0644\u0649 \u0644\u062D\u0638\u0629 \u0632\u0645\u0646\u064A\u0629 \u0645\u062D\u062F\u0651\u062F\u0629",
23532
- observability: "\u0633\u062C\u0644\u0627\u062A \u062D\u064A\u0651\u0629 \u0648\u0645\u0642\u0627\u064A\u064A\u0633 \u0648\u062A\u0646\u0628\u064A\u0647\u0627\u062A \u0644\u0635\u062D\u0629 \u0627\u0644\u062E\u062F\u0645\u0629",
23533
- mailServer: "\u062E\u0627\u062F\u0645 \u0628\u0631\u064A\u062F \u0645\u062F\u0645\u062C \u2014 SMTP \u0648IMAP \u0648\u0628\u0631\u064A\u062F \u0639\u0644\u0649 \u0627\u0644\u0648\u064A\u0628",
23534
- auditLog: "\u0633\u062C\u0644 \u062A\u062F\u0642\u064A\u0642 \u0628\u0645\u062F\u0629 \u062D\u0641\u0638 \u0645\u0645\u062A\u062F\u0629",
23535
- sharedChannel: "\u0642\u0646\u0627\u0629 \u0645\u0634\u062A\u0631\u0643\u0629 \u0639\u0644\u0649 Slack \u0623\u0648 Discord",
23536
23846
  sso: "SSO \u0648SAML",
23537
23847
  customLimits: "\u062D\u062F\u0648\u062F \u0645\u062E\u0635\u0651\u0635\u0629 \u064A\u064F\u062A\u0641\u0642 \u0639\u0644\u064A\u0647\u0627 \u0641\u064A \u0627\u0644\u0639\u0642\u062F",
23538
23848
  dedicatedInfra: "\u0628\u0646\u064A\u0629 \u062A\u062D\u062A\u064A\u0629 \u0648\u0645\u0646\u0627\u0637\u0642 \u0645\u062E\u0635\u0651\u0635\u0629",
@@ -23545,12 +23855,7 @@ var ar_default2 = {
23545
23855
  selfHostedUnlimited: "\u0639\u0645\u0644\u064A\u0627\u062A \u0646\u0634\u0631 \u0648\u0645\u0634\u0627\u0631\u064A\u0639 \u0648\u062E\u0648\u0627\u062F\u0645 \u0648\u0646\u0637\u0627\u0642\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
23546
23856
  selfHostedServices: "\u0643\u0644 \u0627\u0644\u062E\u062F\u0645\u0627\u062A \u0627\u0644\u0645\u064F\u062F\u0627\u0631\u0629 \u2014 Postgres \u0648Redis \u0648\u0627\u0644\u0628\u0631\u064A\u062F",
23547
23857
  selfHostedClients: "CLI \u0648\u0648\u0627\u062C\u0647\u0629 \u0648\u064A\u0628 \u0648\u062A\u0637\u0628\u064A\u0642 \u0633\u0637\u062D \u0645\u0643\u062A\u0628 \u2014 \u062E\u062F\u0645\u0629 \u062E\u0644\u0641\u064A\u0629 \u0648\u0627\u062D\u062F\u0629",
23548
- selfHostedFreeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix} \u0639\u0646\u062F \u0627\u0644\u0631\u0628\u0637 \u0645\u0639 Openship Cloud",
23549
- runningServices: "{runningServices} \u062E\u062F\u0645\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u2014 \u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0648\u0642\u0648\u0627\u0639\u062F \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062E\u0644\u0641\u064A\u0629",
23550
- power: "\u062D\u062A\u0649 {powerCpu} vCPU \u0648{powerRamGb} GB RAM \u0644\u0643\u0644 \u062E\u062F\u0645\u0629",
23551
- projects: "{maxProjects} \u0645\u0634\u0631\u0648\u0639",
23552
- projectsUnlimited: "\u0645\u0634\u0627\u0631\u064A\u0639 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
23553
- meteredCredits: "\u0627\u0644\u062D\u0648\u0633\u0628\u0629 \u0648\u0627\u0644\u0646\u0637\u0627\u0642 \u0627\u0644\u062A\u0631\u062F\u062F\u064A \u0648\u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u062A\u064F\u062E\u0635\u0645 \u0643\u0644\u0647\u0627 \u0645\u0646 \u0631\u0635\u064A\u062F\u0643 \u0627\u0644\u0634\u0647\u0631\u064A"
23858
+ selfHostedFreeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix} \u0639\u0646\u062F \u0627\u0644\u0631\u0628\u0637 \u0645\u0639 Openship Cloud"
23554
23859
  },
23555
23860
  selfHosted: {
23556
23861
  name: "\u0627\u0633\u062A\u0636\u0627\u0641\u0629 \u0630\u0627\u062A\u064A\u0629",
@@ -23560,9 +23865,9 @@ var ar_default2 = {
23560
23865
  cta: "\u0627\u0628\u062F\u0623 \u0627\u0644\u0627\u0633\u062A\u0636\u0627\u0641\u0629 \u0627\u0644\u0630\u0627\u062A\u064A\u0629"
23561
23866
  },
23562
23867
  creditPacks: {
23563
- pack_5k: "{credits} \u0648\u062D\u062F\u0629 \u0631\u0635\u064A\u062F",
23564
- pack_25k: "{credits} \u0648\u062D\u062F\u0629 \u0631\u0635\u064A\u062F",
23565
- pack_100k: "{credits} \u0648\u062D\u062F\u0629 \u0631\u0635\u064A\u062F"
23868
+ pack_5k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629",
23869
+ pack_25k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629",
23870
+ pack_100k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629"
23566
23871
  },
23567
23872
  ui: {
23568
23873
  perMonth: "/\u0634\u0647\u0631",
@@ -23578,7 +23883,9 @@ var ar_default2 = {
23578
23883
  billedMonthly: "\u0641\u0627\u062A\u0648\u0631\u0629 \u0634\u0647\u0631\u064A\u0629\u060C \u0648\u0627\u0644\u0625\u0644\u063A\u0627\u0621 \u0645\u062A\u0627\u062D \u0641\u064A \u0623\u064A \u0648\u0642\u062A",
23579
23884
  campaignBadge: "\u062E\u0635\u0645 {percentOff}%",
23580
23885
  campaignEnds: "\u064A\u0646\u062A\u0647\u064A \u0627\u0644\u0639\u0631\u0636 \u0641\u064A {date}",
23581
- wasPrice: "\u0633\u0627\u0628\u0642\u064B\u0627 {price}"
23886
+ wasPrice: "\u0633\u0627\u0628\u0642\u064B\u0627 {price}",
23887
+ standardTitle: "\u0641\u064A \u0643\u0644 \u0627\u0644\u062E\u0637\u0637",
23888
+ creditPackNote: "\u2248 {appHours} \u0633\u0627\u0639\u0629 \u0644\u062A\u0637\u0628\u064A\u0642 \u0635\u063A\u064A\u0631\u060C \u0623\u0648 {buildMinutes} \u062F\u0642\u064A\u0642\u0629 \u0628\u0646\u0627\u0621"
23582
23889
  }
23583
23890
  };
23584
23891
 
@@ -23609,20 +23916,20 @@ var de_default2 = {
23609
23916
  features: {
23610
23917
  everythingIn: "Alles aus {inherited}, plus:",
23611
23918
  staticOnly: "Nur statische Websites \u2013 SSG, SPA und reines HTML",
23612
- anyWorkload: "Beliebige Workloads \u2013 Container, Compose-Stacks und Worker",
23613
- managedServices: "Managed Postgres, Redis und der komplette App-Katalog",
23919
+ anyWorkload: "Beliebige Workloads \u2013 Container, Compose, Worker, Postgres, Redis",
23920
+ runningServices: "{runningServices} laufende Apps, Datenbanken oder Worker",
23921
+ computeMinutes: "{computeMinutes} Compute-Minuten pro Monat",
23614
23922
  buildMinutes: "{buildMinutes} Build-Minuten pro Monat",
23615
- credits: "{credits} Compute-Credits pro Monat",
23923
+ power: "Bis zu {powerCpu} vCPU und {powerRamGb} GB RAM pro App",
23924
+ projects: "{maxProjects} Projekte",
23925
+ projectsUnlimited: "Unbegrenzt viele Projekte",
23616
23926
  freeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix}",
23617
23927
  freeSubdomainsUnlimited: "Unbegrenzt viele kostenlose Subdomains unter {freeDomainSuffix}",
23928
+ gitDeploys: "Deployen von GitHub, GitLab oder jedem Git-Remote",
23618
23929
  customDomains: "Unbegrenzt viele eigene Domains, TLS inklusive",
23930
+ deployLogs: "Live-Logs f\xFCr Build und Deployment",
23931
+ auditLog: "Audit-Log f\xFCr jede \xC4nderung",
23619
23932
  unlimitedSeats: "Unbegrenzt viele Teammitglieder \u2013 nie Kosten pro Nutzer",
23620
- previewDeploys: "Preview-Deploys bei jedem Push",
23621
- backups: "T\xE4gliche Backups mit Point-in-Time-Recovery",
23622
- observability: "Live-Logs, Metriken und Health-Alerts",
23623
- mailServer: "Integrierter Mailserver \u2013 SMTP, IMAP und Webmail",
23624
- auditLog: "Audit-Log mit verl\xE4ngerter Aufbewahrungsdauer",
23625
- sharedChannel: "Gemeinsamer Slack- oder Discord-Channel",
23626
23933
  sso: "SSO und SAML",
23627
23934
  customLimits: "Individuelle Limits, vertraglich vereinbart",
23628
23935
  dedicatedInfra: "Dedizierte Infrastruktur und Regionen",
@@ -23635,12 +23942,7 @@ var de_default2 = {
23635
23942
  selfHostedUnlimited: "Unbegrenzt viele Deploys, Projekte, Server und Domains",
23636
23943
  selfHostedServices: "Alle Managed Services \u2013 Postgres, Redis, Mail",
23637
23944
  selfHostedClients: "CLI, Web und Desktop \u2013 ein Backend",
23638
- selfHostedFreeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix} bei Verbindung mit Openship Cloud",
23639
- runningServices: "{runningServices} laufende Services \u2013 Apps, Datenbanken, Worker",
23640
- power: "Bis zu {powerCpu} vCPU und {powerRamGb} GB RAM pro Service",
23641
- projects: "{maxProjects} Projekte",
23642
- projectsUnlimited: "Unbegrenzt viele Projekte",
23643
- meteredCredits: "Compute, Daten\xFCbertragung und Speicher werden alle \xFCber die monatlichen Credits abgerechnet"
23945
+ selfHostedFreeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix} bei Verbindung mit Openship Cloud"
23644
23946
  },
23645
23947
  selfHosted: {
23646
23948
  name: "Selbst gehostet",
@@ -23650,9 +23952,9 @@ var de_default2 = {
23650
23952
  cta: "Self-Hosting starten"
23651
23953
  },
23652
23954
  creditPacks: {
23653
- pack_5k: "{credits} Credits",
23654
- pack_25k: "{credits} Credits",
23655
- pack_100k: "{credits} Credits"
23955
+ pack_5k: "{computeMinutes} Compute-Minuten",
23956
+ pack_25k: "{computeMinutes} Compute-Minuten",
23957
+ pack_100k: "{computeMinutes} Compute-Minuten"
23656
23958
  },
23657
23959
  ui: {
23658
23960
  perMonth: "/Mon.",
@@ -23668,7 +23970,9 @@ var de_default2 = {
23668
23970
  billedMonthly: "monatliche Abrechnung, jederzeit k\xFCndbar",
23669
23971
  campaignBadge: "{percentOff} % Rabatt",
23670
23972
  campaignEnds: "Angebot endet am {date}",
23671
- wasPrice: "vorher {price}"
23973
+ wasPrice: "vorher {price}",
23974
+ standardTitle: "In jedem Plan enthalten",
23975
+ creditPackNote: "\u2248 {appHours} Stunden einer kleinen App oder {buildMinutes} Build-Minuten"
23672
23976
  }
23673
23977
  };
23674
23978
 
@@ -23699,20 +24003,20 @@ var es_default2 = {
23699
24003
  features: {
23700
24004
  everythingIn: "Todo lo de {inherited}, y adem\xE1s:",
23701
24005
  staticOnly: "Solo sitios est\xE1ticos: SSG, SPA y HTML puro",
23702
- anyWorkload: "Ejecuta lo que sea: contenedores, stacks de Compose y workers",
23703
- managedServices: "Postgres y Redis gestionados, y el cat\xE1logo completo de apps",
24006
+ anyWorkload: "Ejecuta lo que sea: contenedores, Compose, workers, Postgres, Redis",
24007
+ runningServices: "{runningServices} apps, bases de datos o workers en ejecuci\xF3n",
24008
+ computeMinutes: "{computeMinutes} minutos de c\xF3mputo al mes",
23704
24009
  buildMinutes: "{buildMinutes} minutos de build al mes",
23705
- credits: "{credits} cr\xE9ditos de c\xF3mputo al mes",
24010
+ power: "Hasta {powerCpu} vCPU y {powerRamGb} GB de RAM por app",
24011
+ projects: "{maxProjects} proyectos",
24012
+ projectsUnlimited: "Proyectos ilimitados",
23706
24013
  freeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis",
23707
24014
  freeSubdomainsUnlimited: "Subdominios {freeDomainSuffix} gratis e ilimitados",
24015
+ gitDeploys: "Despliega desde GitHub, GitLab o cualquier remoto Git",
23708
24016
  customDomains: "Dominios propios ilimitados, con TLS incluido",
24017
+ deployLogs: "Logs en vivo de build y despliegue",
24018
+ auditLog: "Registro de auditor\xEDa de cada cambio",
23709
24019
  unlimitedSeats: "Miembros de equipo ilimitados: nunca pagas por usuario",
23710
- previewDeploys: "Despliegues de vista previa en cada push",
23711
- backups: "Copias de seguridad diarias con recuperaci\xF3n a un punto en el tiempo",
23712
- observability: "Logs en vivo, m\xE9tricas y alertas de estado",
23713
- mailServer: "Servidor de correo integrado: SMTP, IMAP y webmail",
23714
- auditLog: "Registro de auditor\xEDa con retenci\xF3n ampliada",
23715
- sharedChannel: "Canal compartido en Slack o Discord",
23716
24020
  sso: "SSO y SAML",
23717
24021
  customLimits: "L\xEDmites a medida, negociados por contrato",
23718
24022
  dedicatedInfra: "Infraestructura y regiones dedicadas",
@@ -23725,12 +24029,7 @@ var es_default2 = {
23725
24029
  selfHostedUnlimited: "Despliegues, proyectos, servidores y dominios ilimitados",
23726
24030
  selfHostedServices: "Todos los servicios gestionados: Postgres, Redis, correo",
23727
24031
  selfHostedClients: "CLI, web y escritorio: un solo backend",
23728
- selfHostedFreeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis al conectarte a Cloud",
23729
- runningServices: "{runningServices} servicios en ejecuci\xF3n: apps, bases de datos, workers",
23730
- power: "Hasta {powerCpu} vCPU y {powerRamGb} GB de RAM por servicio",
23731
- projects: "{maxProjects} proyectos",
23732
- projectsUnlimited: "Proyectos ilimitados",
23733
- meteredCredits: "El c\xF3mputo, el ancho de banda y el almacenamiento se descuentan de tus cr\xE9ditos mensuales"
24032
+ selfHostedFreeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis al conectarte a Cloud"
23734
24033
  },
23735
24034
  selfHosted: {
23736
24035
  name: "Autoalojado",
@@ -23740,9 +24039,9 @@ var es_default2 = {
23740
24039
  cta: "Empezar a autoalojar"
23741
24040
  },
23742
24041
  creditPacks: {
23743
- pack_5k: "{credits} cr\xE9ditos",
23744
- pack_25k: "{credits} cr\xE9ditos",
23745
- pack_100k: "{credits} cr\xE9ditos"
24042
+ pack_5k: "{computeMinutes} minutos de c\xF3mputo",
24043
+ pack_25k: "{computeMinutes} minutos de c\xF3mputo",
24044
+ pack_100k: "{computeMinutes} minutos de c\xF3mputo"
23746
24045
  },
23747
24046
  ui: {
23748
24047
  perMonth: "/mes",
@@ -23758,7 +24057,9 @@ var es_default2 = {
23758
24057
  billedMonthly: "facturaci\xF3n mensual, cancela cuando quieras",
23759
24058
  campaignBadge: "{percentOff}% de descuento",
23760
24059
  campaignEnds: "La oferta termina el {date}",
23761
- wasPrice: "antes {price}"
24060
+ wasPrice: "antes {price}",
24061
+ standardTitle: "En todos los planes",
24062
+ creditPackNote: "\u2248 {appHours} horas de una app peque\xF1a, o {buildMinutes} minutos de build"
23762
24063
  }
23763
24064
  };
23764
24065
 
@@ -23789,20 +24090,20 @@ var fr_default2 = {
23789
24090
  features: {
23790
24091
  everythingIn: "Tout ce que contient {inherited}, plus :",
23791
24092
  staticOnly: "Sites statiques uniquement \u2014 SSG, SPA et HTML brut",
23792
- anyWorkload: "Ex\xE9cutez ce que vous voulez \u2014 conteneurs, stacks Compose et workers",
23793
- managedServices: "Postgres et Redis manag\xE9s, et tout le catalogue d'applications",
24093
+ anyWorkload: "Ex\xE9cutez tout \u2014 conteneurs, Compose, workers, Postgres, Redis",
24094
+ runningServices: "{runningServices} applications, bases de donn\xE9es ou workers actifs",
24095
+ computeMinutes: "{computeMinutes} minutes de calcul par mois",
23794
24096
  buildMinutes: "{buildMinutes} minutes de build par mois",
23795
- credits: "{credits} cr\xE9dits de calcul par mois",
24097
+ power: "Jusqu'\xE0 {powerCpu} vCPU et {powerRamGb} GB de RAM par application",
24098
+ projects: "{maxProjects} projets",
24099
+ projectsUnlimited: "Projets illimit\xE9s",
23796
24100
  freeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits",
23797
24101
  freeSubdomainsUnlimited: "Sous-domaines {freeDomainSuffix} gratuits en illimit\xE9",
24102
+ gitDeploys: "D\xE9ployez depuis GitHub, GitLab ou n'importe quel d\xE9p\xF4t Git",
23798
24103
  customDomains: "Domaines personnalis\xE9s illimit\xE9s, TLS inclus",
24104
+ deployLogs: "Logs de build et de d\xE9ploiement en direct",
24105
+ auditLog: "Journal d'audit de chaque modification",
23799
24106
  unlimitedSeats: "Membres d'\xE9quipe illimit\xE9s \u2014 jamais de facturation par utilisateur",
23800
- previewDeploys: "D\xE9ploiements de pr\xE9visualisation \xE0 chaque push",
23801
- backups: "Sauvegardes quotidiennes avec restauration \xE0 un instant pr\xE9cis",
23802
- observability: "Logs en direct, m\xE9triques et alertes de sant\xE9",
23803
- mailServer: "Serveur mail int\xE9gr\xE9 \u2014 SMTP, IMAP et webmail",
23804
- auditLog: "Journal d'audit avec r\xE9tention \xE9tendue",
23805
- sharedChannel: "Canal Slack ou Discord partag\xE9",
23806
24107
  sso: "SSO et SAML",
23807
24108
  customLimits: "Limites sur mesure, n\xE9goci\xE9es par contrat",
23808
24109
  dedicatedInfra: "Infrastructure et r\xE9gions d\xE9di\xE9es",
@@ -23815,12 +24116,7 @@ var fr_default2 = {
23815
24116
  selfHostedUnlimited: "D\xE9ploiements, projets, serveurs et domaines illimit\xE9s",
23816
24117
  selfHostedServices: "Tous les services manag\xE9s \u2014 Postgres, Redis, mail",
23817
24118
  selfHostedClients: "CLI, web et desktop \u2014 un seul backend",
23818
- selfHostedFreeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits en vous connectant au Cloud",
23819
- runningServices: "{runningServices} services actifs \u2014 applications, bases de donn\xE9es, workers",
23820
- power: "Jusqu'\xE0 {powerCpu} vCPU et {powerRamGb} GB de RAM par service",
23821
- projects: "{maxProjects} projets",
23822
- projectsUnlimited: "Projets illimit\xE9s",
23823
- meteredCredits: "Le calcul, la bande passante et le stockage sont tous d\xE9duits de vos cr\xE9dits mensuels"
24119
+ selfHostedFreeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits en vous connectant au Cloud"
23824
24120
  },
23825
24121
  selfHosted: {
23826
24122
  name: "Auto-h\xE9berg\xE9",
@@ -23830,9 +24126,9 @@ var fr_default2 = {
23830
24126
  cta: "Commencer l'auto-h\xE9bergement"
23831
24127
  },
23832
24128
  creditPacks: {
23833
- pack_5k: "{credits} cr\xE9dits",
23834
- pack_25k: "{credits} cr\xE9dits",
23835
- pack_100k: "{credits} cr\xE9dits"
24129
+ pack_5k: "{computeMinutes} minutes de calcul",
24130
+ pack_25k: "{computeMinutes} minutes de calcul",
24131
+ pack_100k: "{computeMinutes} minutes de calcul"
23836
24132
  },
23837
24133
  ui: {
23838
24134
  perMonth: "/mois",
@@ -23848,7 +24144,9 @@ var fr_default2 = {
23848
24144
  billedMonthly: "factur\xE9 mensuellement, r\xE9siliable \xE0 tout moment",
23849
24145
  campaignBadge: "{percentOff} % de remise",
23850
24146
  campaignEnds: "L'offre se termine le {date}",
23851
- wasPrice: "avant {price}"
24147
+ wasPrice: "avant {price}",
24148
+ standardTitle: "Dans tous les forfaits",
24149
+ creditPackNote: "\u2248 {appHours} heures d'une petite application, ou {buildMinutes} minutes de build"
23852
24150
  }
23853
24151
  };
23854
24152
 
@@ -23879,20 +24177,20 @@ var ja_default2 = {
23879
24177
  features: {
23880
24178
  everythingIn: "{inherited} \u306E\u5168\u6A5F\u80FD\u306B\u52A0\u3048\u3066:",
23881
24179
  staticOnly: "\u9759\u7684\u30B5\u30A4\u30C8\u306E\u307F \u2014 SSG\u3001SPA\u3001\u7D20\u306E HTML",
23882
- anyWorkload: "\u4F55\u3067\u3082\u52D5\u304B\u305B\u308B \u2014 \u30B3\u30F3\u30C6\u30CA\u3001Compose \u30B9\u30BF\u30C3\u30AF\u3001\u30EF\u30FC\u30AB\u30FC",
23883
- managedServices: "\u30DE\u30CD\u30FC\u30B8\u30C9\u306E Postgres \u3068 Redis\u3001\u30A2\u30D7\u30EA\u30AB\u30BF\u30ED\u30B0\u3059\u3079\u3066",
24180
+ anyWorkload: "\u4F55\u3067\u3082\u52D5\u304B\u305B\u308B \u2014 \u30B3\u30F3\u30C6\u30CA\u3001Compose\u3001\u30EF\u30FC\u30AB\u30FC\u3001Postgres\u3001Redis",
24181
+ runningServices: "\u540C\u6642\u306B\u7A3C\u50CD\u3059\u308B\u30A2\u30D7\u30EA\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30FB\u30EF\u30FC\u30AB\u30FC {runningServices} \u500B",
24182
+ computeMinutes: "\u6BCE\u6708 {computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
23884
24183
  buildMinutes: "\u6BCE\u6708 {buildMinutes} \u5206\u306E\u30D3\u30EB\u30C9\u6642\u9593",
23885
- credits: "\u6BCE\u6708 {credits} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u30AF\u30EC\u30B8\u30C3\u30C8",
24184
+ power: "\u30A2\u30D7\u30EA 1 \u3064\u3042\u305F\u308A\u6700\u5927 {powerCpu} vCPU \u3068 {powerRamGb} GB RAM",
24185
+ projects: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8 {maxProjects} \u500B",
24186
+ projectsUnlimited: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u7121\u5236\u9650",
23886
24187
  freeSubdomains: "\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3 {freeSubdomains} \u500B",
23887
24188
  freeSubdomainsUnlimited: "\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C\u7121\u5236\u9650",
24189
+ gitDeploys: "GitHub\u3001GitLab\u3001\u4EFB\u610F\u306E Git \u30EA\u30E2\u30FC\u30C8\u304B\u3089\u30C7\u30D7\u30ED\u30A4",
23888
24190
  customDomains: "\u30AB\u30B9\u30BF\u30E0\u30C9\u30E1\u30A4\u30F3\u306F\u7121\u5236\u9650\u3001TLS \u8FBC\u307F",
24191
+ deployLogs: "\u30D3\u30EB\u30C9\u3068\u30C7\u30D7\u30ED\u30A4\u306E\u30E9\u30A4\u30D6\u30ED\u30B0",
24192
+ auditLog: "\u3059\u3079\u3066\u306E\u5909\u66F4\u3092\u8A18\u9332\u3059\u308B\u76E3\u67FB\u30ED\u30B0",
23889
24193
  unlimitedSeats: "\u30C1\u30FC\u30E0\u30E1\u30F3\u30D0\u30FC\u306F\u7121\u5236\u9650 \u2014 \u4EBA\u6570\u8AB2\u91D1\u306F\u4E00\u5207\u306A\u3057",
23890
- previewDeploys: "\u30D7\u30C3\u30B7\u30E5\u3054\u3068\u306B\u30D7\u30EC\u30D3\u30E5\u30FC\u30C7\u30D7\u30ED\u30A4",
23891
- backups: "\u65E5\u6B21\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3068\u30DD\u30A4\u30F3\u30C8\u30A4\u30F3\u30BF\u30A4\u30E0\u30EA\u30AB\u30D0\u30EA",
23892
- observability: "\u30E9\u30A4\u30D6\u30ED\u30B0\u3001\u30E1\u30C8\u30EA\u30AF\u30B9\u3001\u30D8\u30EB\u30B9\u30A2\u30E9\u30FC\u30C8",
23893
- mailServer: "\u30E1\u30FC\u30EB\u30B5\u30FC\u30D0\u30FC\u5185\u8535 \u2014 SMTP\u3001IMAP\u3001\u30A6\u30A7\u30D6\u30E1\u30FC\u30EB",
23894
- auditLog: "\u4FDD\u6301\u671F\u9593\u3092\u5EF6\u9577\u3057\u305F\u76E3\u67FB\u30ED\u30B0",
23895
- sharedChannel: "Slack \u307E\u305F\u306F Discord \u306E\u5171\u6709\u30C1\u30E3\u30F3\u30CD\u30EB",
23896
24194
  sso: "SSO \u3068 SAML",
23897
24195
  customLimits: "\u5951\u7D04\u3054\u3068\u306B\u8ABF\u6574\u3059\u308B\u30AB\u30B9\u30BF\u30E0\u306E\u4E0A\u9650",
23898
24196
  dedicatedInfra: "\u5C02\u7528\u30A4\u30F3\u30D5\u30E9\u3068\u5C02\u7528\u30EA\u30FC\u30B8\u30E7\u30F3",
@@ -23905,12 +24203,7 @@ var ja_default2 = {
23905
24203
  selfHostedUnlimited: "\u30C7\u30D7\u30ED\u30A4\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30B5\u30FC\u30D0\u30FC\u3001\u30C9\u30E1\u30A4\u30F3\u3059\u3079\u3066\u7121\u5236\u9650",
23906
24204
  selfHostedServices: "\u30DE\u30CD\u30FC\u30B8\u30C9\u30B5\u30FC\u30D3\u30B9\u306F\u3059\u3079\u3066\u5229\u7528\u53EF\u80FD \u2014 Postgres\u3001Redis\u3001\u30E1\u30FC\u30EB",
23907
24205
  selfHostedClients: "CLI\u3001Web\u3001\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7 \u2014 \u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u306F\u4E00\u3064",
23908
- selfHostedFreeSubdomains: "Openship Cloud \u306B\u63A5\u7D9A\u3059\u308B\u3068\u3001\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C {freeSubdomains} \u500B",
23909
- runningServices: "\u540C\u6642\u306B\u7A3C\u50CD\u3059\u308B\u30B5\u30FC\u30D3\u30B9 {runningServices} \u500B \u2014 \u30A2\u30D7\u30EA\u3001\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3001\u30EF\u30FC\u30AB\u30FC",
23910
- power: "\u30B5\u30FC\u30D3\u30B9 1 \u3064\u3042\u305F\u308A\u6700\u5927 {powerCpu} vCPU \u3068 {powerRamGb} GB RAM",
23911
- projects: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8 {maxProjects} \u500B",
23912
- projectsUnlimited: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u7121\u5236\u9650",
23913
- meteredCredits: "\u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u3001\u5E2F\u57DF\u5E45\u3001\u30B9\u30C8\u30EC\u30FC\u30B8\u306F\u3059\u3079\u3066\u6BCE\u6708\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u304B\u3089\u6D88\u8CBB\u3055\u308C\u307E\u3059"
24206
+ selfHostedFreeSubdomains: "Openship Cloud \u306B\u63A5\u7D9A\u3059\u308B\u3068\u3001\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C {freeSubdomains} \u500B"
23914
24207
  },
23915
24208
  selfHosted: {
23916
24209
  name: "\u30BB\u30EB\u30D5\u30DB\u30B9\u30C8",
@@ -23920,9 +24213,9 @@ var ja_default2 = {
23920
24213
  cta: "\u30BB\u30EB\u30D5\u30DB\u30B9\u30C8\u3092\u59CB\u3081\u308B"
23921
24214
  },
23922
24215
  creditPacks: {
23923
- pack_5k: "{credits} \u30AF\u30EC\u30B8\u30C3\u30C8",
23924
- pack_25k: "{credits} \u30AF\u30EC\u30B8\u30C3\u30C8",
23925
- pack_100k: "{credits} \u30AF\u30EC\u30B8\u30C3\u30C8"
24216
+ pack_5k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
24217
+ pack_25k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
24218
+ pack_100k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206"
23926
24219
  },
23927
24220
  ui: {
23928
24221
  perMonth: "/\u6708",
@@ -23938,7 +24231,9 @@ var ja_default2 = {
23938
24231
  billedMonthly: "\u6708\u984D\u8ACB\u6C42\u3001\u3044\u3064\u3067\u3082\u30AD\u30E3\u30F3\u30BB\u30EB\u53EF\u80FD",
23939
24232
  campaignBadge: "{percentOff}% \u30AA\u30D5",
23940
24233
  campaignEnds: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306F {date} \u307E\u3067",
23941
- wasPrice: "\u901A\u5E38 {price}"
24234
+ wasPrice: "\u901A\u5E38 {price}",
24235
+ standardTitle: "\u3059\u3079\u3066\u306E\u30D7\u30E9\u30F3\u306B\u542B\u307E\u308C\u308B\u3082\u306E",
24236
+ creditPackNote: "\u5C0F\u898F\u6A21\u30A2\u30D7\u30EA\u7D04 {appHours} \u6642\u9593\u3001\u307E\u305F\u306F\u30D3\u30EB\u30C9 {buildMinutes} \u5206"
23942
24237
  }
23943
24238
  };
23944
24239
 
@@ -23969,20 +24264,20 @@ var pt_default2 = {
23969
24264
  features: {
23970
24265
  everythingIn: "Tudo do {inherited}, e mais:",
23971
24266
  staticOnly: "Somente sites est\xE1ticos: SSG, SPA e HTML puro",
23972
- anyWorkload: "Execute qualquer coisa: cont\xEAineres, stacks do Compose e workers",
23973
- managedServices: "Postgres e Redis gerenciados, e o cat\xE1logo completo de apps",
24267
+ anyWorkload: "Execute qualquer coisa: cont\xEAineres, Compose, workers, Postgres, Redis",
24268
+ runningServices: "{runningServices} apps, bancos de dados ou workers em execu\xE7\xE3o",
24269
+ computeMinutes: "{computeMinutes} minutos de computa\xE7\xE3o por m\xEAs",
23974
24270
  buildMinutes: "{buildMinutes} minutos de build por m\xEAs",
23975
- credits: "{credits} cr\xE9ditos de computa\xE7\xE3o por m\xEAs",
24271
+ power: "At\xE9 {powerCpu} vCPU e {powerRamGb} GB de RAM por app",
24272
+ projects: "{maxProjects} projetos",
24273
+ projectsUnlimited: "Projetos ilimitados",
23976
24274
  freeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos",
23977
24275
  freeSubdomainsUnlimited: "Subdom\xEDnios {freeDomainSuffix} gratuitos e ilimitados",
24276
+ gitDeploys: "Fa\xE7a deploy do GitHub, GitLab ou qualquer remoto Git",
23978
24277
  customDomains: "Dom\xEDnios pr\xF3prios ilimitados, com TLS inclu\xEDdo",
24278
+ deployLogs: "Logs de build e deploy em tempo real",
24279
+ auditLog: "Log de auditoria de cada altera\xE7\xE3o",
23979
24280
  unlimitedSeats: "Membros de equipe ilimitados: nunca pague por usu\xE1rio",
23980
- previewDeploys: "Deploys de pr\xE9-visualiza\xE7\xE3o a cada push",
23981
- backups: "Backups di\xE1rios com recupera\xE7\xE3o para um ponto no tempo",
23982
- observability: "Logs em tempo real, m\xE9tricas e alertas de sa\xFAde",
23983
- mailServer: "Servidor de e-mail integrado: SMTP, IMAP e webmail",
23984
- auditLog: "Log de auditoria com reten\xE7\xE3o estendida",
23985
- sharedChannel: "Canal compartilhado no Slack ou Discord",
23986
24281
  sso: "SSO e SAML",
23987
24282
  customLimits: "Limites sob medida, negociados por contrato",
23988
24283
  dedicatedInfra: "Infraestrutura e regi\xF5es dedicadas",
@@ -23995,12 +24290,7 @@ var pt_default2 = {
23995
24290
  selfHostedUnlimited: "Deploys, projetos, servidores e dom\xEDnios ilimitados",
23996
24291
  selfHostedServices: "Todos os servi\xE7os gerenciados: Postgres, Redis, e-mail",
23997
24292
  selfHostedClients: "CLI, web e desktop: um \xFAnico backend",
23998
- selfHostedFreeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos ao conectar \xE0 Cloud",
23999
- runningServices: "{runningServices} servi\xE7os em execu\xE7\xE3o: apps, bancos de dados, workers",
24000
- power: "At\xE9 {powerCpu} vCPU e {powerRamGb} GB de RAM por servi\xE7o",
24001
- projects: "{maxProjects} projetos",
24002
- projectsUnlimited: "Projetos ilimitados",
24003
- meteredCredits: "Computa\xE7\xE3o, largura de banda e armazenamento consomem os seus cr\xE9ditos mensais"
24293
+ selfHostedFreeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos ao conectar \xE0 Cloud"
24004
24294
  },
24005
24295
  selfHosted: {
24006
24296
  name: "Auto-hospedado",
@@ -24010,9 +24300,9 @@ var pt_default2 = {
24010
24300
  cta: "Come\xE7ar a auto-hospedar"
24011
24301
  },
24012
24302
  creditPacks: {
24013
- pack_5k: "{credits} cr\xE9ditos",
24014
- pack_25k: "{credits} cr\xE9ditos",
24015
- pack_100k: "{credits} cr\xE9ditos"
24303
+ pack_5k: "{computeMinutes} minutos de computa\xE7\xE3o",
24304
+ pack_25k: "{computeMinutes} minutos de computa\xE7\xE3o",
24305
+ pack_100k: "{computeMinutes} minutos de computa\xE7\xE3o"
24016
24306
  },
24017
24307
  ui: {
24018
24308
  perMonth: "/m\xEAs",
@@ -24028,7 +24318,9 @@ var pt_default2 = {
24028
24318
  billedMonthly: "cobran\xE7a mensal, cancele quando quiser",
24029
24319
  campaignBadge: "{percentOff}% de desconto",
24030
24320
  campaignEnds: "Oferta termina em {date}",
24031
- wasPrice: "antes {price}"
24321
+ wasPrice: "antes {price}",
24322
+ standardTitle: "Em todos os planos",
24323
+ creditPackNote: "\u2248 {appHours} horas de um app pequeno, ou {buildMinutes} minutos de build"
24032
24324
  }
24033
24325
  };
24034
24326
 
@@ -24059,20 +24351,20 @@ var tr_default2 = {
24059
24351
  features: {
24060
24352
  everythingIn: "{inherited} plan\u0131ndaki her \u015Fey, ayr\u0131ca:",
24061
24353
  staticOnly: "Yaln\u0131zca statik siteler \u2014 SSG, SPA ve d\xFCz HTML",
24062
- anyWorkload: "Her \u015Feyi \xE7al\u0131\u015Ft\u0131r\u0131n \u2014 container'lar, Compose y\u0131\u011F\u0131nlar\u0131 ve worker'lar",
24063
- managedServices: "Y\xF6netilen Postgres, Redis ve uygulama katalo\u011Funun tamam\u0131",
24354
+ anyWorkload: "Her \u015Feyi \xE7al\u0131\u015Ft\u0131r\u0131n \u2014 container, Compose, worker, Postgres, Redis",
24355
+ runningServices: "{runningServices} \xE7al\u0131\u015Fan uygulama, veritaban\u0131 veya worker",
24356
+ computeMinutes: "Ayda {computeMinutes} hesaplama dakikas\u0131",
24064
24357
  buildMinutes: "Ayda {buildMinutes} build dakikas\u0131",
24065
- credits: "Ayda {credits} hesaplama kredisi",
24358
+ power: "Uygulama ba\u015F\u0131na en fazla {powerCpu} vCPU ve {powerRamGb} GB RAM",
24359
+ projects: "{maxProjects} proje",
24360
+ projectsUnlimited: "S\u0131n\u0131rs\u0131z proje",
24066
24361
  freeSubdomains: "{freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131",
24067
24362
  freeSubdomainsUnlimited: "S\u0131n\u0131rs\u0131z \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131",
24363
+ gitDeploys: "GitHub, GitLab veya herhangi bir Git uzak deposundan da\u011F\u0131t\u0131n",
24068
24364
  customDomains: "S\u0131n\u0131rs\u0131z \xF6zel alan ad\u0131, TLS dahil",
24365
+ deployLogs: "Canl\u0131 derleme ve da\u011F\u0131t\u0131m loglar\u0131",
24366
+ auditLog: "Her de\u011Fi\u015Fikli\u011Fin denetim kayd\u0131",
24069
24367
  unlimitedSeats: "S\u0131n\u0131rs\u0131z ekip \xFCyesi \u2014 kullan\u0131c\u0131 ba\u015F\u0131na \xF6deme yok",
24070
- previewDeploys: "Her push'ta \xF6nizleme da\u011F\u0131t\u0131m\u0131",
24071
- backups: "G\xFCnl\xFCk yedekler ve belirli bir ana geri d\xF6n\xFC\u015F",
24072
- observability: "Canl\u0131 loglar, metrikler ve sa\u011Fl\u0131k uyar\u0131lar\u0131",
24073
- mailServer: "Dahili posta sunucusu \u2014 SMTP, IMAP ve webmail",
24074
- auditLog: "Denetim kayd\u0131, uzat\u0131lm\u0131\u015F saklama s\xFCresiyle",
24075
- sharedChannel: "Payla\u015F\u0131ml\u0131 Slack veya Discord kanal\u0131",
24076
24368
  sso: "SSO ve SAML",
24077
24369
  customLimits: "S\xF6zle\u015Fmeye g\xF6re belirlenen \xF6zel limitler",
24078
24370
  dedicatedInfra: "Size ayr\u0131lm\u0131\u015F altyap\u0131 ve b\xF6lgeler",
@@ -24085,12 +24377,7 @@ var tr_default2 = {
24085
24377
  selfHostedUnlimited: "S\u0131n\u0131rs\u0131z da\u011F\u0131t\u0131m, proje, sunucu ve alan ad\u0131",
24086
24378
  selfHostedServices: "T\xFCm y\xF6netilen servisler \u2014 Postgres, Redis, posta",
24087
24379
  selfHostedClients: "CLI, web ve masa\xFCst\xFC \u2014 tek backend",
24088
- selfHostedFreeSubdomains: "Cloud'a ba\u011Fland\u0131\u011F\u0131n\u0131zda {freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131",
24089
- runningServices: "{runningServices} \xE7al\u0131\u015Fan servis \u2014 uygulamalar, veritabanlar\u0131, worker'lar",
24090
- power: "Servis ba\u015F\u0131na en fazla {powerCpu} vCPU ve {powerRamGb} GB RAM",
24091
- projects: "{maxProjects} proje",
24092
- projectsUnlimited: "S\u0131n\u0131rs\u0131z proje",
24093
- meteredCredits: "Hesaplama, bant geni\u015Fli\u011Fi ve depolaman\u0131n tamam\u0131 ayl\u0131k kredilerinizden d\xFC\u015Fer"
24380
+ selfHostedFreeSubdomains: "Cloud'a ba\u011Fland\u0131\u011F\u0131n\u0131zda {freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131"
24094
24381
  },
24095
24382
  selfHosted: {
24096
24383
  name: "Kendi sunucunuzda",
@@ -24100,9 +24387,9 @@ var tr_default2 = {
24100
24387
  cta: "Kendi sunucunuzda ba\u015Flay\u0131n"
24101
24388
  },
24102
24389
  creditPacks: {
24103
- pack_5k: "{credits} kredi",
24104
- pack_25k: "{credits} kredi",
24105
- pack_100k: "{credits} kredi"
24390
+ pack_5k: "{computeMinutes} hesaplama dakikas\u0131",
24391
+ pack_25k: "{computeMinutes} hesaplama dakikas\u0131",
24392
+ pack_100k: "{computeMinutes} hesaplama dakikas\u0131"
24106
24393
  },
24107
24394
  ui: {
24108
24395
  perMonth: "/ay",
@@ -24118,7 +24405,9 @@ var tr_default2 = {
24118
24405
  billedMonthly: "ayl\u0131k faturalan\u0131r, istedi\u011Finiz zaman iptal edin",
24119
24406
  campaignBadge: "%{percentOff} indirim",
24120
24407
  campaignEnds: "Kampanya {date} tarihinde sona eriyor",
24121
- wasPrice: "eski fiyat {price}"
24408
+ wasPrice: "eski fiyat {price}",
24409
+ standardTitle: "T\xFCm planlarda",
24410
+ creditPackNote: "\u2248 K\xFC\xE7\xFCk bir uygulama i\xE7in {appHours} saat veya {buildMinutes} derleme dakikas\u0131"
24122
24411
  }
24123
24412
  };
24124
24413
 
@@ -24149,20 +24438,20 @@ var zh_default = {
24149
24438
  features: {
24150
24439
  everythingIn: "\u5305\u542B {inherited} \u7684\u5168\u90E8\u529F\u80FD,\u53E6\u6709:",
24151
24440
  staticOnly: "\u4EC5\u652F\u6301\u9759\u6001\u7AD9\u70B9:SSG\u3001SPA \u548C\u7EAF HTML",
24152
- anyWorkload: "\u4EFB\u610F\u5DE5\u4F5C\u8D1F\u8F7D\u90FD\u80FD\u8FD0\u884C:\u5BB9\u5668\u3001Compose \u7F16\u6392\u548C\u540E\u53F0\u4EFB\u52A1",
24153
- managedServices: "\u6258\u7BA1\u7684 Postgres\u3001Redis \u548C\u5B8C\u6574\u5E94\u7528\u76EE\u5F55",
24441
+ anyWorkload: "\u4EFB\u610F\u5DE5\u4F5C\u8D1F\u8F7D:\u5BB9\u5668\u3001Compose\u3001\u540E\u53F0\u4EFB\u52A1\u3001Postgres\u3001Redis",
24442
+ runningServices: "{runningServices} \u4E2A\u540C\u65F6\u8FD0\u884C\u7684\u5E94\u7528\u3001\u6570\u636E\u5E93\u6216\u540E\u53F0\u4EFB\u52A1",
24443
+ computeMinutes: "\u6BCF\u6708 {computeMinutes} \u8BA1\u7B97\u5206\u949F",
24154
24444
  buildMinutes: "\u6BCF\u6708 {buildMinutes} \u5206\u949F\u6784\u5EFA\u65F6\u957F",
24155
- credits: "\u6BCF\u6708 {credits} \u8BA1\u7B97\u79EF\u5206",
24445
+ power: "\u6BCF\u4E2A\u5E94\u7528\u6700\u9AD8\u53EF\u8FBE {powerCpu} vCPU \u548C {powerRamGb} GB RAM",
24446
+ projects: "{maxProjects} \u4E2A\u9879\u76EE",
24447
+ projectsUnlimited: "\u9879\u76EE\u4E0D\u9650\u6570\u91CF",
24156
24448
  freeSubdomains: "{freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D",
24157
24449
  freeSubdomainsUnlimited: "\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D\u4E0D\u9650\u6570\u91CF",
24450
+ gitDeploys: "\u4ECE GitHub\u3001GitLab \u6216\u4EFB\u610F Git \u8FDC\u7AEF\u90E8\u7F72",
24158
24451
  customDomains: "\u81EA\u5B9A\u4E49\u57DF\u540D\u4E0D\u9650\u6570\u91CF,\u542B TLS",
24452
+ deployLogs: "\u5B9E\u65F6\u6784\u5EFA\u4E0E\u90E8\u7F72\u65E5\u5FD7",
24453
+ auditLog: "\u8BB0\u5F55\u6BCF\u4E00\u6B21\u53D8\u66F4\u7684\u5BA1\u8BA1\u65E5\u5FD7",
24159
24454
  unlimitedSeats: "\u56E2\u961F\u6210\u5458\u4E0D\u9650\u4EBA\u6570,\u6C38\u4E0D\u6309\u5E2D\u4F4D\u8BA1\u8D39",
24160
- previewDeploys: "\u6BCF\u6B21\u63A8\u9001\u90FD\u751F\u6210\u9884\u89C8\u90E8\u7F72",
24161
- backups: "\u6BCF\u65E5\u5907\u4EFD,\u652F\u6301\u6309\u65F6\u95F4\u70B9\u6062\u590D",
24162
- observability: "\u5B9E\u65F6\u65E5\u5FD7\u3001\u6307\u6807\u548C\u5065\u5EB7\u544A\u8B66",
24163
- mailServer: "\u5185\u7F6E\u90AE\u4EF6\u670D\u52A1\u5668:SMTP\u3001IMAP \u548C\u7F51\u9875\u90AE\u7BB1",
24164
- auditLog: "\u5BA1\u8BA1\u65E5\u5FD7,\u4FDD\u7559\u671F\u66F4\u957F",
24165
- sharedChannel: "\u5171\u4EAB\u7684 Slack \u6216 Discord \u9891\u9053",
24166
24455
  sso: "SSO \u4E0E SAML",
24167
24456
  customLimits: "\u81EA\u5B9A\u4E49\u914D\u989D,\u6309\u5408\u540C\u5546\u5B9A",
24168
24457
  dedicatedInfra: "\u4E13\u5C5E\u57FA\u7840\u8BBE\u65BD\u4E0E\u4E13\u5C5E\u533A\u57DF",
@@ -24175,12 +24464,7 @@ var zh_default = {
24175
24464
  selfHostedUnlimited: "\u90E8\u7F72\u3001\u9879\u76EE\u3001\u670D\u52A1\u5668\u548C\u57DF\u540D\u5747\u4E0D\u9650\u6570\u91CF",
24176
24465
  selfHostedServices: "\u5168\u90E8\u6258\u7BA1\u670D\u52A1:Postgres\u3001Redis\u3001\u90AE\u4EF6\u670D\u52A1",
24177
24466
  selfHostedClients: "CLI\u3001\u7F51\u9875\u7AEF\u548C\u684C\u9762\u7AEF,\u5171\u7528\u4E00\u4E2A\u540E\u7AEF",
24178
- selfHostedFreeSubdomains: "\u8FDE\u63A5 Cloud \u540E\u53EF\u83B7\u5F97 {freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D",
24179
- runningServices: "{runningServices} \u4E2A\u540C\u65F6\u8FD0\u884C\u7684\u670D\u52A1:\u5E94\u7528\u3001\u6570\u636E\u5E93\u3001\u540E\u53F0\u4EFB\u52A1",
24180
- power: "\u6BCF\u4E2A\u670D\u52A1\u6700\u9AD8\u53EF\u8FBE {powerCpu} vCPU \u548C {powerRamGb} GB RAM",
24181
- projects: "{maxProjects} \u4E2A\u9879\u76EE",
24182
- projectsUnlimited: "\u9879\u76EE\u4E0D\u9650\u6570\u91CF",
24183
- meteredCredits: "\u8BA1\u7B97\u3001\u6D41\u91CF\u548C\u5B58\u50A8\u90FD\u4ECE\u4F60\u7684\u6BCF\u6708\u79EF\u5206\u4E2D\u6263\u9664"
24467
+ selfHostedFreeSubdomains: "\u8FDE\u63A5 Cloud \u540E\u53EF\u83B7\u5F97 {freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D"
24184
24468
  },
24185
24469
  selfHosted: {
24186
24470
  name: "\u81EA\u6258\u7BA1",
@@ -24190,9 +24474,9 @@ var zh_default = {
24190
24474
  cta: "\u5F00\u59CB\u81EA\u6258\u7BA1"
24191
24475
  },
24192
24476
  creditPacks: {
24193
- pack_5k: "{credits} \u79EF\u5206",
24194
- pack_25k: "{credits} \u79EF\u5206",
24195
- pack_100k: "{credits} \u79EF\u5206"
24477
+ pack_5k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F",
24478
+ pack_25k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F",
24479
+ pack_100k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F"
24196
24480
  },
24197
24481
  ui: {
24198
24482
  perMonth: "/\u6708",
@@ -24208,7 +24492,9 @@ var zh_default = {
24208
24492
  billedMonthly: "\u6309\u6708\u8BA1\u8D39,\u53EF\u968F\u65F6\u53D6\u6D88",
24209
24493
  campaignBadge: "\u7ACB\u51CF {percentOff}%",
24210
24494
  campaignEnds: "\u4F18\u60E0\u622A\u6B62 {date}",
24211
- wasPrice: "\u539F\u4EF7 {price}"
24495
+ wasPrice: "\u539F\u4EF7 {price}",
24496
+ standardTitle: "\u6240\u6709\u5957\u9910\u5747\u5305\u542B",
24497
+ creditPackNote: "\u2248 \u5C0F\u578B\u5E94\u7528\u8FD0\u884C {appHours} \u5C0F\u65F6,\u6216 {buildMinutes} \u6784\u5EFA\u5206\u949F"
24212
24498
  }
24213
24499
  };
24214
24500
 
@@ -24258,6 +24544,17 @@ function featureTemplate(key, locale) {
24258
24544
  return copyFor(locale).features?.[key] ?? en_default2.features[key] ?? null;
24259
24545
  }
24260
24546
  var PLAN_BY_ID = new Map(PRICING.plans.map((p) => [p.id, p]));
24547
+ var MILLI_PER_COMPUTE_MINUTE = 1e3;
24548
+ function buildUnitsPerMinute() {
24549
+ return PRICING.oblien.buildResources.cpuCores / RESOURCE_TIER_SPECS.low.cpuCores;
24550
+ }
24551
+ function planMonthlyCredits(planId) {
24552
+ const plan = PLAN_BY_ID.get(planId ?? "") ?? PLAN_BY_ID.get(DEFAULT_PLAN_TIER);
24553
+ const { computeMinutesPerMonth, buildMinutesPerMonth } = plan.limits;
24554
+ if (computeMinutesPerMonth === null || buildMinutesPerMonth === null) return null;
24555
+ const units = computeMinutesPerMonth + buildMinutesPerMonth * buildUnitsPerMinute();
24556
+ return Math.round(units * MILLI_PER_COMPUTE_MINUTE);
24557
+ }
24261
24558
  function toOblienLimits(limits) {
24262
24559
  const { runningServices, maxResourceTier } = limits;
24263
24560
  if (runningServices === null && maxResourceTier === null) return null;
@@ -24287,11 +24584,12 @@ function placeholders(plan, locale) {
24287
24584
  powerCpu: svc ? formatDecimal(svc.cpuCores, locale) : unlimited,
24288
24585
  powerRamGb: svc ? formatDecimal(svc.memoryMb / 1024, locale) : unlimited,
24289
24586
  powerDiskGb: svc ? formatCount(Math.round(svc.diskMb / 1024), locale) : unlimited,
24290
- credits: plan.credits.monthlyMilli === null ? unlimited : formatCount(plan.credits.monthlyMilli / 1e3, locale),
24587
+ computeMinutes: n(limits.computeMinutesPerMonth),
24291
24588
  inherited: plan.inherits ? planName(plan.inherits, locale) : "",
24292
24589
  freeDomainSuffix: PRICING.freeDomainSuffix
24293
24590
  };
24294
24591
  }
24592
+ var EVERYTHING_IN_KEY = "everythingIn";
24295
24593
  function resolvePlan(planId, locale = "en") {
24296
24594
  const plan = PLAN_BY_ID.get(planId) ?? PLAN_BY_ID.get(DEFAULT_PLAN_TIER);
24297
24595
  const values = placeholders(plan, locale);
@@ -24300,10 +24598,14 @@ function resolvePlan(planId, locale = "en") {
24300
24598
  name: planName(plan.id, locale),
24301
24599
  description: planTagline(plan.id, locale),
24302
24600
  price: plan.price,
24303
- monthlyCredits: plan.credits.monthlyMilli,
24601
+ monthlyCredits: planMonthlyCredits(plan.id),
24304
24602
  oblienLimits: toOblienLimits(plan.limits),
24305
24603
  limits: plan.limits,
24306
- features: plan.features.map((key) => {
24604
+ ...(() => {
24605
+ const lead = plan.features.includes(EVERYTHING_IN_KEY) ? featureTemplate(EVERYTHING_IN_KEY, locale) : null;
24606
+ return lead === null ? {} : { inheritedFrom: fill(lead, values) };
24607
+ })(),
24608
+ features: plan.features.filter((key) => key !== EVERYTHING_IN_KEY).map((key) => {
24307
24609
  const template = featureTemplate(key, locale);
24308
24610
  return template === null ? null : fill(template, values);
24309
24611
  }).filter((s) => s !== null),
@@ -24317,10 +24619,17 @@ var PLANS = Object.fromEntries(
24317
24619
  );
24318
24620
  function resolveCreditPacks(locale = "en") {
24319
24621
  return [...PRICING.creditPacks].sort((a, b) => a.sortOrder - b.sortOrder).map((pack) => {
24320
- const template = copyFor(locale).creditPacks?.[pack.id] ?? en_default2.creditPacks[pack.id] ?? "{credits}";
24622
+ const template = copyFor(locale).creditPacks?.[pack.id] ?? en_default2.creditPacks[pack.id] ?? "{computeMinutes}";
24623
+ const minutes = pack.creditsMilli / MILLI_PER_COMPUTE_MINUTE;
24624
+ const amount = formatCount(minutes, locale);
24625
+ const noteTemplate = copyFor(locale).ui?.creditPackNote ?? en_default2.ui.creditPackNote;
24321
24626
  return {
24322
24627
  id: pack.id,
24323
- name: fill(template, { credits: formatCount(pack.creditsMilli / 1e3, locale) }),
24628
+ name: fill(template, { computeMinutes: amount, credits: amount }),
24629
+ explains: fill(noteTemplate, {
24630
+ appHours: formatCount(Math.round(minutes / 60), locale),
24631
+ buildMinutes: formatCount(Math.round(minutes / buildUnitsPerMinute()), locale)
24632
+ }),
24324
24633
  credits_milli: pack.creditsMilli,
24325
24634
  price_cents: pack.priceCents,
24326
24635
  sortOrder: pack.sortOrder
@@ -24688,6 +24997,13 @@ var AUDIT_EVENTS = {
24688
24997
  label: "Server removed",
24689
24998
  tone: "danger"
24690
24999
  },
25000
+ "server.removal.rejected": {
25001
+ category: "servers",
25002
+ action: "tried to remove the server",
25003
+ label: "Server removal refused",
25004
+ tone: "warning",
25005
+ description: "A removal was refused because a workload could not be torn down, or was destroyed but left a resource behind for cleanup. The server row was kept so those resources can still be reclaimed."
25006
+ },
24691
25007
  "server.exec": {
24692
25008
  category: "servers",
24693
25009
  action: "ran a command on the server",
@@ -25451,108 +25767,18 @@ function idSuffix(distroId) {
25451
25767
  return distroId ? ` (os-release ID=${JSON.stringify(distroId)})` : "";
25452
25768
  }
25453
25769
 
25454
- // ../../packages/adapters/src/system/errors.ts
25455
- var SSH_AUTH_ERROR_PATTERNS = [
25456
- "All configured authentication methods failed"
25457
- ];
25458
- var RETRYABLE_CONNECTION_ERROR_PATTERNS = [
25459
- "ECONNRESET",
25460
- "ECONNREFUSED",
25461
- "ETIMEDOUT",
25462
- "EHOSTUNREACH",
25463
- "ENETUNREACH",
25464
- "Timed out",
25465
- "Not connected",
25466
- "Connection lost",
25467
- "read ECONNRESET",
25468
- "Handshake failed",
25469
- "keepalive timeout",
25470
- "SSH connection closed before ready",
25471
- // ssh2 emits "Channel open failure: open failed" / "Channel open failure: …"
25472
- // when the SSH SERVER refuses a new channel - typically because the cached
25473
- // connection has gone half-dead (peer-side LOGOUT, network blip,
25474
- // remote sshd MaxSessions). The inner SshExecutor retries `exec`/
25475
- // `streamExec` on this, but `pipeLocal`, `transferIn`, and any other
25476
- // channel-bearing op bubble it up. Listing it here lets `withExecutor`
25477
- // drop the dead connection and retry transparently - fixes the
25478
- // "first redeploy fails, second click works" pattern.
25479
- "Channel open failure",
25480
- "open failed"
25481
- // NOT "socket hang up": it is what an HTTP client reports for ANY far end that vanished
25482
- // mid-request, including a permission-denied Docker socket and a wedged channel, neither
25483
- // of which a fresh connection fixes. A match here makes `withExecutor` replay its whole
25484
- // callback — and those callbacks install mail, create mailboxes and ensure the edge, so a
25485
- // non-retryable cause becomes a repeated mutation. `core/connectivity.ts` labels it
25486
- // without retrying, `api/lib/remote-state.ts` still maps it to a 503, and the bridge's
25487
- // 502 carries the real reason — so leaving it out here costs no diagnosis.
25488
- ];
25489
- var SshDisconnectedError = class extends Error {
25490
- constructor(message = "SSH connection lost") {
25491
- super(message);
25492
- this.name = "SshDisconnectedError";
25493
- }
25494
- };
25495
- function isSshDisconnectedError(err) {
25496
- return err instanceof SshDisconnectedError || err instanceof Error && err.name === "SshDisconnectedError";
25497
- }
25498
- function isSshAuthError(err) {
25499
- if (!(err instanceof Error)) return false;
25500
- return SSH_AUTH_ERROR_PATTERNS.some((pattern) => err.message.includes(pattern));
25501
- }
25502
- var HostChannelUnavailableError = class extends Error {
25503
- code;
25504
- constructor(code, message) {
25505
- super(message);
25506
- this.name = "HostChannelUnavailableError";
25507
- this.code = code;
25508
- }
25509
- };
25510
- function isRetryableRemoteConnectionError(err) {
25511
- if (isSshDisconnectedError(err)) return true;
25512
- if (!(err instanceof Error)) return false;
25513
- return RETRYABLE_CONNECTION_ERROR_PATTERNS.some(
25514
- (pattern) => err.message.includes(pattern)
25515
- );
25516
- }
25517
- function isRemoteConnectionError(err) {
25518
- return isSshAuthError(err) || isRetryableRemoteConnectionError(err);
25519
- }
25520
- var MAX_COMMAND_CHARS = 120;
25521
- function commandForError(command) {
25522
- const oneLine = command.trim().replace(/\s+/g, " ");
25523
- return oneLine.length > MAX_COMMAND_CHARS ? `${oneLine.slice(0, MAX_COMMAND_CHARS)}\u2026 (${command.length} chars)` : oneLine;
25524
- }
25525
- function isRuntimeNotFoundError(err) {
25526
- if (!err || typeof err !== "object") return false;
25527
- const e = err;
25528
- if (e.statusCode === 404) return true;
25529
- return typeof e.message === "string" && /no such (container|image|volume|network)/i.test(e.message);
25530
- }
25531
-
25532
- // ../../packages/adapters/src/system/debug.ts
25533
- function isTruthy(value) {
25534
- if (!value) return false;
25535
- return ["1", "true", "yes", "on", "debug"].includes(value.toLowerCase());
25536
- }
25537
- function isSystemDebugEnabled() {
25538
- return isTruthy(process.env.SYSTEM_DEBUG_LOGS);
25539
- }
25540
- function systemDebug(scope, message) {
25541
- if (!isSystemDebugEnabled()) return;
25542
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
25543
- console.log(`[system-debug] ${timestamp} [${scope}] ${message}`);
25544
- }
25545
- function formatDuration(startMs) {
25546
- return `${Date.now() - startMs}ms`;
25547
- }
25548
-
25549
25770
  export {
25771
+ shellQuote,
25772
+ shellSplitWords,
25773
+ commandToArgv,
25550
25774
  LANGUAGES,
25551
25775
  STACKS,
25552
25776
  TRANSFER_EXCLUDES,
25553
25777
  buildOutputTransferExcludes,
25554
25778
  PACKAGE_ROOT_ONLY_EXCLUDES,
25555
25779
  packageManagerEnsureCommand,
25780
+ nodeBinDirs,
25781
+ nodeBinPathExport,
25556
25782
  appVolumeTargets,
25557
25783
  parseComposeNamespace,
25558
25784
  ownsNetworkEndpoint,
@@ -25561,9 +25787,6 @@ export {
25561
25787
  composePortToSpec,
25562
25788
  isAwsS3Endpoint,
25563
25789
  DEFAULT_IMAGE_REGISTRY,
25564
- shellQuote,
25565
- shellSplitWords,
25566
- commandToArgv,
25567
25790
  registryForImage,
25568
25791
  registryConfigKeys,
25569
25792
  buildEdgeImageRef,
@@ -25577,6 +25800,11 @@ export {
25577
25800
  AppError,
25578
25801
  DeployError,
25579
25802
  safeErrorMessage,
25803
+ payloadSpec,
25804
+ normalizeBackupPath,
25805
+ validateBackupPath,
25806
+ validateClearPath,
25807
+ isDbImage,
25580
25808
  LOCAL_DASHBOARD_URL,
25581
25809
  LOCAL_API_URL,
25582
25810
  CLOUD_DASHBOARD_URL,
@@ -25622,14 +25850,5 @@ export {
25622
25850
  summarizeHostChannelCause,
25623
25851
  hostChannelRuleScope,
25624
25852
  hostFirewallRule,
25625
- hostFirewallRuleRemoval,
25626
- SshDisconnectedError,
25627
- isSshAuthError,
25628
- HostChannelUnavailableError,
25629
- isRetryableRemoteConnectionError,
25630
- isRemoteConnectionError,
25631
- commandForError,
25632
- isRuntimeNotFoundError,
25633
- systemDebug,
25634
- formatDuration
25853
+ hostFirewallRuleRemoval
25635
25854
  };