@polardbx/pxbaas 0.1.0-beta.3 → 0.1.0-beta.4

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 (103) hide show
  1. package/README.md +40 -8
  2. package/dist/app/local-index.d.ts +70 -0
  3. package/dist/app/local-index.d.ts.map +1 -0
  4. package/dist/app/local-index.js +140 -0
  5. package/dist/app/local-index.js.map +1 -0
  6. package/dist/app/preflight.d.ts +12 -0
  7. package/dist/app/preflight.d.ts.map +1 -1
  8. package/dist/app/preflight.js +30 -17
  9. package/dist/app/preflight.js.map +1 -1
  10. package/dist/cli/root.d.ts.map +1 -1
  11. package/dist/cli/root.js +3 -0
  12. package/dist/cli/root.js.map +1 -1
  13. package/dist/commands/app/index.d.ts.map +1 -1
  14. package/dist/commands/app/index.js +398 -46
  15. package/dist/commands/app/index.js.map +1 -1
  16. package/dist/commands/completion/index.d.ts.map +1 -1
  17. package/dist/commands/completion/index.js +5 -1
  18. package/dist/commands/completion/index.js.map +1 -1
  19. package/dist/commands/data/index.d.ts +52 -0
  20. package/dist/commands/data/index.d.ts.map +1 -1
  21. package/dist/commands/data/index.js +201 -39
  22. package/dist/commands/data/index.js.map +1 -1
  23. package/dist/commands/db/index.d.ts +14 -0
  24. package/dist/commands/db/index.d.ts.map +1 -1
  25. package/dist/commands/db/index.js +126 -28
  26. package/dist/commands/db/index.js.map +1 -1
  27. package/dist/commands/functions/new.d.ts +4 -0
  28. package/dist/commands/functions/new.d.ts.map +1 -1
  29. package/dist/commands/functions/new.js +24 -9
  30. package/dist/commands/functions/new.js.map +1 -1
  31. package/dist/commands/login/index.d.ts.map +1 -1
  32. package/dist/commands/login/index.js +15 -30
  33. package/dist/commands/login/index.js.map +1 -1
  34. package/dist/commands/profile/import-env.d.ts +7 -2
  35. package/dist/commands/profile/import-env.d.ts.map +1 -1
  36. package/dist/commands/profile/import-env.js +141 -16
  37. package/dist/commands/profile/import-env.js.map +1 -1
  38. package/dist/commands/profile/index.d.ts.map +1 -1
  39. package/dist/commands/profile/index.js +13 -1
  40. package/dist/commands/profile/index.js.map +1 -1
  41. package/dist/commands/storage/index.d.ts.map +1 -1
  42. package/dist/commands/storage/index.js +209 -7
  43. package/dist/commands/storage/index.js.map +1 -1
  44. package/dist/commands/tenant/index.d.ts +19 -0
  45. package/dist/commands/tenant/index.d.ts.map +1 -0
  46. package/dist/commands/tenant/index.js +662 -0
  47. package/dist/commands/tenant/index.js.map +1 -0
  48. package/dist/commands/whoami/index.js +19 -0
  49. package/dist/commands/whoami/index.js.map +1 -1
  50. package/dist/credentials/credential-store.d.ts +30 -1
  51. package/dist/credentials/credential-store.d.ts.map +1 -1
  52. package/dist/credentials/credential-store.js +114 -12
  53. package/dist/credentials/credential-store.js.map +1 -1
  54. package/dist/credentials/env-file.d.ts +48 -7
  55. package/dist/credentials/env-file.d.ts.map +1 -1
  56. package/dist/credentials/env-file.js +91 -16
  57. package/dist/credentials/env-file.js.map +1 -1
  58. package/dist/credentials/jwt-introspect.d.ts +7 -0
  59. package/dist/credentials/jwt-introspect.d.ts.map +1 -1
  60. package/dist/credentials/jwt-introspect.js.map +1 -1
  61. package/dist/credentials/masker.d.ts +3 -0
  62. package/dist/credentials/masker.d.ts.map +1 -1
  63. package/dist/credentials/masker.js +3 -0
  64. package/dist/credentials/masker.js.map +1 -1
  65. package/dist/credentials/profile.d.ts +12 -0
  66. package/dist/credentials/profile.d.ts.map +1 -1
  67. package/dist/credentials/profile.js +23 -0
  68. package/dist/credentials/profile.js.map +1 -1
  69. package/dist/credentials/tty-guard.d.ts +10 -0
  70. package/dist/credentials/tty-guard.d.ts.map +1 -1
  71. package/dist/credentials/tty-guard.js +32 -0
  72. package/dist/credentials/tty-guard.js.map +1 -1
  73. package/dist/main.js +21 -2
  74. package/dist/main.js.map +1 -1
  75. package/dist/tenant/bundle.d.ts +66 -0
  76. package/dist/tenant/bundle.d.ts.map +1 -0
  77. package/dist/tenant/bundle.js +132 -0
  78. package/dist/tenant/bundle.js.map +1 -0
  79. package/dist/tenant/guide.d.ts +50 -0
  80. package/dist/tenant/guide.d.ts.map +1 -0
  81. package/dist/tenant/guide.js +152 -0
  82. package/dist/tenant/guide.js.map +1 -0
  83. package/dist/tenant/probe.d.ts +65 -0
  84. package/dist/tenant/probe.d.ts.map +1 -0
  85. package/dist/tenant/probe.js +159 -0
  86. package/dist/tenant/probe.js.map +1 -0
  87. package/dist/tenant/verify.d.ts +37 -0
  88. package/dist/tenant/verify.d.ts.map +1 -0
  89. package/dist/tenant/verify.js +132 -0
  90. package/dist/tenant/verify.js.map +1 -0
  91. package/dist/version.d.ts +29 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +65 -0
  94. package/dist/version.js.map +1 -0
  95. package/package.json +2 -2
  96. package/skills/pxbaas-app-spec/references/runtime-contract.md +1 -1
  97. package/skills/pxbaas-cli/SKILL.md +14 -5
  98. package/skills/pxbaas-cli/references/auth-and-credentials.md +19 -3
  99. package/skills/pxbaas-cli/references/data-postgrest.md +4 -3
  100. package/skills/pxbaas-cli/references/db-and-meta.md +5 -0
  101. package/skills/pxbaas-cli/references/safety-and-two-phase.md +42 -13
  102. package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
  103. package/skills/pxbaas-cli/references/troubleshooting.md +4 -1
package/README.md CHANGED
@@ -39,7 +39,7 @@ pxbaas doctor # connectivity / configuration diagnostics
39
39
  pxbaas status # instance reachability summary
40
40
  ```
41
41
 
42
- Every command accepts `--json` for machine-readable output, and `--profile <name>` to select a profile per invocation (`pxbaas profile list / use / import` manage them).
42
+ Every command accepts `--json` for machine-readable output, and `--profile <name>` to select a profile per invocation (`pxbaas profile ls / use / rm / import` manage them).
43
43
 
44
44
  ### Non-interactive credential setup
45
45
 
@@ -55,7 +55,7 @@ pxbaas login --endpoint https://baas.example.com \
55
55
  <service-role-key>
56
56
  EOF
57
57
 
58
- # 2) import from a Supabase-convention .env file (single-tenant instances only)
58
+ # 2) import from a Supabase-convention .env file (single- or multi-tenant)
59
59
  pxbaas profile import ./instance.env --name prod --json
60
60
  ```
61
61
 
@@ -67,7 +67,11 @@ pxbaas profile import ./instance.env --name prod --json
67
67
  | anon key | `SUPABASE_ANON_KEY`, `ANON_KEY`, `GLOBAL_ANON_KEY` |
68
68
  | service_role key | `SUPABASE_SERVICE_ROLE_KEY`, `SERVICE_ROLE_KEY`, `GLOBAL_SERVICE_ROLE_KEY` |
69
69
 
70
- An env file that sets `MULTI_TENANT_MODE=true` is rejected — supply per-tenant keys via stdin mode with `--tenant-id` instead.
70
+ For a **multi-tenant** instance the env file must carry tenant-level credentials — `MULTI_TENANT_MODE=true`, `DEFAULT_TENANT_ID`, `TENANT_ANON_KEY`, `TENANT_SERVICE_ROLE_KEY`. Platform-global keys (`GLOBAL_*`, whose JWTs have no `tenant_id` claim) are reported as present-but-not-imported: they cannot reach tenant resources.
71
+
72
+ An env file that is multi-tenant but lacks the tenant keys is refused **with a diagnosis and a route**: if the machine can open the tenant admin channel it points you at `pxbaas tenant …`; otherwise it prints a checklist to send to the instance operator. Nothing is created and nothing is imported in that branch.
73
+
74
+ `DASHBOARD_USERNAME` / `DASHBOARD_PASSWORD` in an env file are never absorbed silently — pass `--with-admin` to bind them, and only after they actually authenticate against the admin channel.
71
75
 
72
76
  ## Multi-tenant
73
77
 
@@ -77,13 +81,40 @@ On a `MULTI_TENANT_MODE=true` instance, authenticate with that tenant's own keys
77
81
  pxbaas login --tenant-id <tenant> # paste the tenant's per-tenant anon + service_role keys
78
82
  ```
79
83
 
80
- With a multi-tenant profile, `db query`, `db tables`, `db schema`, `db push`, and `gen types` all run through `/api/tenant-ddl` against the tenant's **own** database using its per-tenant `service_role` key (these previously returned 401 in multi-tenant mode). Notes:
84
+ A tenant-level key is one whose JWT payload contains `tenant_id`; a platform-global key does not and will be rejected on tenant resources.
85
+
86
+ With a multi-tenant profile, `db query`, `db tables`, `db schema`, `db create-table`, `db add-column`, `db push`, and `gen types` all run through `/api/tenant-ddl` against the tenant's **own** database using its per-tenant `service_role` key (these previously returned 401 in multi-tenant mode). Notes:
81
87
 
82
88
  - `db query` always executes as the tenant `service_role` in multi-tenant mode; `--role anon` is not applicable (warned and ignored). `/pg/query` remains platform-admin only.
83
89
  - `db push` / `app db-init` register RLS via the structured `/api/tenant-ddl/rls/*` endpoints (the tenant account has no grant on the central `supabase` registry); `table_schema` is bound server-side and the `__SCHEMA__` placeholder is de-qualified automatically. RLS source is hybrid: declarative `db/rls.json` preferred, else RLS INSERTs parsed from `schema.sql`.
84
- - `db create-table` / `db add-column` remain platform-admin (`/pg/query`) only; as a tenant use `db push`, `app db-init`, or `db query` to create/alter tables.
90
+ - `db create-table` / `db add-column` work for a tenant too: the DDL lands in the tenant database, so `--schema` is ignored (the effective database is printed) and `--role anon` is ignored.
85
91
  - A normal tenant can run the full webapp lifecycle (`db-init` → `deploy` → `publish/rollback/unpublish` → `destroy`) with only its per-tenant key; cross-tenant access is rejected.
86
92
 
93
+ ## Tenant administration (instance operators)
94
+
95
+ Ordinary tenants never use this. It requires the instance dashboard credentials (HTTP Basic), which live in a
96
+ separate keyring account from your tenant API keys and are refused in argv.
97
+
98
+ ```bash
99
+ pxbaas tenant login --endpoint https://<gateway> # masked prompt, or --user-stdin --password-stdin
100
+ pxbaas tenant probe --json # admin / not-admin / single-tenant / metadata-unreadable / unreachable
101
+ pxbaas tenant ls --json # redacted: ids, status, plan, db, key-presence booleans
102
+
103
+ # hand an existing tenant's keys to its user
104
+ pxbaas tenant keys acme --as-profile # into this machine's keyring
105
+ pxbaas tenant keys acme --bundle ./acme.pxbaas.env # 0600 file to hand over
106
+
107
+ # only when a tenant really must be created
108
+ pxbaas tenant create acme --dry-run --json
109
+ pxbaas tenant create acme --as-profile --bundle ./acme.pxbaas.env
110
+ pxbaas tenant repair-keys # preview; --confirm to run
111
+ ```
112
+
113
+ - `tenant create` shows a plan and requires authorization, and **refuses a colliding tenant id** — reusing a soft-deleted id resurrects that tenant and regenerates its keys, so it needs an explicit `--reactivate`.
114
+ - After creating, the CLI verifies the tenant is actually usable (`SELECT DATABASE()`, table count, RLS registry, Realtime registration), because the platform treats those provisioning steps as non-fatal. A failing check exits non-zero.
115
+ - An **access bundle** contains exactly `MULTI_TENANT_MODE`, `SUPABASE_URL`, `DEFAULT_TENANT_ID`, `TENANT_ANON_KEY`, `TENANT_SERVICE_ROLE_KEY` — never `jwt_secret`, `DASHBOARD_*` or `GLOBAL_*` — and is consumed directly by `pxbaas profile import`. The command prints a handoff note with both key fingerprints so the receiver can prove nothing was swapped in transit; `pxbaas tenant handoffs` keeps a local ledger of fingerprints and file hashes.
116
+ - Bundles hold **plaintext, ~10-year, currently irrevocable** credentials. Transmit them over a secure channel and delete the file after import. Rotation is not available: the platform does not accept `jwt_secret` updates, and re-signing keys does not invalidate old ones.
117
+
87
118
  ## Command Reference
88
119
 
89
120
  | Group | Commands |
@@ -95,9 +126,10 @@ With a multi-tenant profile, `db query`, `db tables`, `db schema`, `db push`, an
95
126
  | Edge Functions | `functions new / deploy / list / delete` |
96
127
  | Webapp demos | `app new / deploy / verify / url / list / remove / destroy / templates / db-init / capabilities / publish / rollback / unpublish`, `app share ...` |
97
128
  | Storage | `storage ls / cp / mv / rm` |
98
- | Auth admin | `auth users list / create / invite` |
129
+ | Auth admin | `auth users list / get / create / delete / invite` |
99
130
  | Codegen | `gen types` (TypeScript types from the live schema) |
100
- | Tooling | `skill install / list / remove`, `completion <shell>` |
131
+ | Tenant administration (operator) | `tenant login / logout / probe / ls / create / keys / repair-keys / handoffs` |
132
+ | Tooling | `skill install / list / remove`, `completion <shell>` (not yet implemented) |
101
133
 
102
134
  ### Provisioning (PolarDB-X Zero)
103
135
 
@@ -166,7 +198,7 @@ Installs into supported Agent hosts (`~/.qoder`, `~/.claude`, `~/.cursor`, `~/.q
166
198
  1. **Human-only login**: `pxbaas login` requires an interactive TTY; agents cannot execute it.
167
199
  2. **Agent commands never accept key parameters**: post-login commands read credentials from the keyring.
168
200
  3. **Output masking**: commands show only key fingerprints (sha256 prefix 8 + suffix 4), never plaintext.
169
- 4. **Two-phase operations**: destructive writes support `--plan` / `--confirm`.
201
+ 4. **Two-phase operations**: `db push` / `app db-init` / `data delete` / `tenant create` preview first and require `--dry-run` + `--yes`, and `app remove` / `app destroy` / `app share revoke` / `instance release` / `skill remove` / `tenant repair-keys` require `--confirm`. Commands with **no** gate — `db create-table` / `db add-column`, `functions deploy` / `delete`, `storage rm` / `mv`, `auth users delete`, `rest` writes — execute immediately, so verify the target yourself first.
170
202
  5. **Tenant isolation**: commands validate that the key's tenant matches the profile's tenant before executing.
171
203
 
172
204
  ## Documentation
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Workspace-level side index of deployed App mounts (`.pxbaas/apps.json`).
3
+ *
4
+ * The lifecycle commands address a mount solely through `app.json`'s
5
+ * `deployment` block, so losing that block (instance reinstall, hand edit,
6
+ * re-scaffold, working from another machine) turns a live mount into an orphan:
7
+ * deploy then dies on APP_MOUNT_CONFLICT while destroy dies on
8
+ * APP_DEPLOYMENT_NOT_FOUND, and nothing in the CLI can reach the mount again.
9
+ *
10
+ * This index mirrors `deployment` one level up, keyed by app name, so the CLI can
11
+ * recover the mountId on its own. It is a CACHE, never a source of truth:
12
+ * `app.json` always wins, and an entry is ignored unless it was written against
13
+ * the same endpoint + tenant as the active profile (one workspace can be pointed
14
+ * at several instances, and a mountId from instance A must never be replayed
15
+ * against instance B).
16
+ */
17
+ export declare const LOCAL_INDEX_DIRNAME = ".pxbaas";
18
+ export declare const LOCAL_INDEX_FILENAME = "apps.json";
19
+ export interface LocalAppIndexEntry {
20
+ mountId: string;
21
+ generation: number;
22
+ /** Endpoint the entry was recorded against; guards cross-instance reuse. */
23
+ endpoint: string;
24
+ /** Tenant the entry was recorded against; null for single-tenant profiles. */
25
+ tenantId: string | null;
26
+ updatedAt: string;
27
+ }
28
+ export type LocalAppIndex = Record<string, LocalAppIndexEntry>;
29
+ /** The instance the active profile points at. */
30
+ export interface ProfileScope {
31
+ endpoint: string;
32
+ tenantId?: string | null;
33
+ }
34
+ export interface LocalMountLookup {
35
+ /** The usable entry, or null when there is none / it was ignored. */
36
+ entry: LocalAppIndexEntry | null;
37
+ /** Human-readable reason when an entry existed but was NOT used. */
38
+ ignored: string | null;
39
+ path: string;
40
+ }
41
+ /** Absolute-ish path of the index for an apps directory (`--dir`). */
42
+ export declare function localIndexPath(appsDir: string): string;
43
+ /**
44
+ * Read the raw index. A missing, unreadable or corrupt file degrades to an empty
45
+ * index: the cache must never be able to break a command that would otherwise
46
+ * work off `app.json`.
47
+ */
48
+ export declare function readLocalIndex(appsDir: string): Promise<LocalAppIndex>;
49
+ /**
50
+ * Look up an app's recorded mount, rejecting entries that belong to a different
51
+ * instance or tenant. `ignored` carries the reason so callers can tell the user
52
+ * why a stale entry was skipped instead of silently dropping it.
53
+ */
54
+ export declare function lookupLocalMount(appsDir: string, name: string, scope: ProfileScope): Promise<LocalMountLookup>;
55
+ /**
56
+ * Record a mount after a successful deploy/publish/rollback/adopt. Best effort:
57
+ * returns an error message instead of throwing so a cache write can never fail
58
+ * the operation that already succeeded server-side.
59
+ */
60
+ export declare function recordLocalMount(appsDir: string, name: string, mount: {
61
+ mountId: string;
62
+ generation: number;
63
+ }, scope: ProfileScope): Promise<string | null>;
64
+ /**
65
+ * Drop an app's entry after a successful destroy. `expectedMountId` makes the
66
+ * delete conditional so destroying one mount never erases the record of a
67
+ * different one (e.g. `destroy --mount-id` overriding stale local state).
68
+ */
69
+ export declare function forgetLocalMount(appsDir: string, name: string, expectedMountId?: string): Promise<string | null>;
70
+ //# sourceMappingURL=local-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-index.d.ts","sourceRoot":"","sources":["../../src/app/local-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE/D,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,oEAAoE;IACpE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAUD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B5E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA2B3B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC9C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Workspace-level side index of deployed App mounts (`.pxbaas/apps.json`).
3
+ *
4
+ * The lifecycle commands address a mount solely through `app.json`'s
5
+ * `deployment` block, so losing that block (instance reinstall, hand edit,
6
+ * re-scaffold, working from another machine) turns a live mount into an orphan:
7
+ * deploy then dies on APP_MOUNT_CONFLICT while destroy dies on
8
+ * APP_DEPLOYMENT_NOT_FOUND, and nothing in the CLI can reach the mount again.
9
+ *
10
+ * This index mirrors `deployment` one level up, keyed by app name, so the CLI can
11
+ * recover the mountId on its own. It is a CACHE, never a source of truth:
12
+ * `app.json` always wins, and an entry is ignored unless it was written against
13
+ * the same endpoint + tenant as the active profile (one workspace can be pointed
14
+ * at several instances, and a mountId from instance A must never be replayed
15
+ * against instance B).
16
+ */
17
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
18
+ import { dirname, join } from "node:path";
19
+ export const LOCAL_INDEX_DIRNAME = ".pxbaas";
20
+ export const LOCAL_INDEX_FILENAME = "apps.json";
21
+ /** Absolute-ish path of the index for an apps directory (`--dir`). */
22
+ export function localIndexPath(appsDir) {
23
+ return join(appsDir, LOCAL_INDEX_DIRNAME, LOCAL_INDEX_FILENAME);
24
+ }
25
+ function normalizeEndpoint(endpoint) {
26
+ return endpoint.replace(/\/+$/, "");
27
+ }
28
+ function normalizeTenant(tenantId) {
29
+ return tenantId == null || tenantId === "" ? null : tenantId;
30
+ }
31
+ /**
32
+ * Read the raw index. A missing, unreadable or corrupt file degrades to an empty
33
+ * index: the cache must never be able to break a command that would otherwise
34
+ * work off `app.json`.
35
+ */
36
+ export async function readLocalIndex(appsDir) {
37
+ try {
38
+ const parsed = JSON.parse(await readFile(localIndexPath(appsDir), "utf8"));
39
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
40
+ return {};
41
+ const index = {};
42
+ for (const [name, value] of Object.entries(parsed)) {
43
+ const entry = value;
44
+ if (typeof entry?.mountId !== "string" || !entry.mountId)
45
+ continue;
46
+ index[name] = {
47
+ mountId: entry.mountId,
48
+ generation: typeof entry.generation === "number" && Number.isFinite(entry.generation)
49
+ ? entry.generation
50
+ : 0,
51
+ endpoint: typeof entry.endpoint === "string" ? entry.endpoint : "",
52
+ tenantId: normalizeTenant(entry.tenantId),
53
+ updatedAt: typeof entry.updatedAt === "string" ? entry.updatedAt : "",
54
+ };
55
+ }
56
+ return index;
57
+ }
58
+ catch {
59
+ return {};
60
+ }
61
+ }
62
+ /**
63
+ * Look up an app's recorded mount, rejecting entries that belong to a different
64
+ * instance or tenant. `ignored` carries the reason so callers can tell the user
65
+ * why a stale entry was skipped instead of silently dropping it.
66
+ */
67
+ export async function lookupLocalMount(appsDir, name, scope) {
68
+ const path = localIndexPath(appsDir);
69
+ const entry = (await readLocalIndex(appsDir))[name];
70
+ if (!entry)
71
+ return { entry: null, ignored: null, path };
72
+ const wantEndpoint = normalizeEndpoint(scope.endpoint);
73
+ if (normalizeEndpoint(entry.endpoint) !== wantEndpoint) {
74
+ return {
75
+ entry: null,
76
+ ignored: `Ignoring the ${path} entry for '${name}': it was recorded against endpoint ` +
77
+ `${entry.endpoint || "(unknown)"} but the active profile points at ${wantEndpoint}. ` +
78
+ `A mountId is only valid on the instance that issued it.`,
79
+ path,
80
+ };
81
+ }
82
+ const wantTenant = normalizeTenant(scope.tenantId);
83
+ if (entry.tenantId !== wantTenant) {
84
+ return {
85
+ entry: null,
86
+ ignored: `Ignoring the ${path} entry for '${name}': it was recorded for tenant ` +
87
+ `${entry.tenantId ?? "(none)"} but the active profile is ${wantTenant ?? "(single-tenant)"}.`,
88
+ path,
89
+ };
90
+ }
91
+ return { entry, ignored: null, path };
92
+ }
93
+ /**
94
+ * Record a mount after a successful deploy/publish/rollback/adopt. Best effort:
95
+ * returns an error message instead of throwing so a cache write can never fail
96
+ * the operation that already succeeded server-side.
97
+ */
98
+ export async function recordLocalMount(appsDir, name, mount, scope) {
99
+ const path = localIndexPath(appsDir);
100
+ try {
101
+ const index = await readLocalIndex(appsDir);
102
+ index[name] = {
103
+ mountId: mount.mountId,
104
+ generation: mount.generation,
105
+ endpoint: normalizeEndpoint(scope.endpoint),
106
+ tenantId: normalizeTenant(scope.tenantId),
107
+ updatedAt: new Date().toISOString(),
108
+ };
109
+ await mkdir(dirname(path), { recursive: true });
110
+ await writeFile(path, JSON.stringify(index, null, 2) + "\n", "utf8");
111
+ return null;
112
+ }
113
+ catch (e) {
114
+ return `Could not update the local mount index ${path}: ${e instanceof Error ? e.message : String(e)}`;
115
+ }
116
+ }
117
+ /**
118
+ * Drop an app's entry after a successful destroy. `expectedMountId` makes the
119
+ * delete conditional so destroying one mount never erases the record of a
120
+ * different one (e.g. `destroy --mount-id` overriding stale local state).
121
+ */
122
+ export async function forgetLocalMount(appsDir, name, expectedMountId) {
123
+ const path = localIndexPath(appsDir);
124
+ try {
125
+ const index = await readLocalIndex(appsDir);
126
+ const entry = index[name];
127
+ if (!entry)
128
+ return null;
129
+ if (expectedMountId && entry.mountId !== expectedMountId)
130
+ return null;
131
+ delete index[name];
132
+ await mkdir(dirname(path), { recursive: true });
133
+ await writeFile(path, JSON.stringify(index, null, 2) + "\n", "utf8");
134
+ return null;
135
+ }
136
+ catch (e) {
137
+ return `Could not update the local mount index ${path}: ${e instanceof Error ? e.message : String(e)}`;
138
+ }
139
+ }
140
+ //# sourceMappingURL=local-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-index.js","sourceRoot":"","sources":["../../src/app/local-index.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,18 @@ export declare function scanRootAbsoluteRefs(source: string): string[];
44
44
  /** True when the endpoint host is publicly reachable (not loopback / RFC1918). */
45
45
  export declare function isPublicEndpoint(endpoint: string): boolean;
46
46
  export declare function checkQuota(used: number, limit?: number, source?: QuotaLimitSource): QuotaCheck;
47
+ /**
48
+ * Split a quota check into the blocker/warning text the deploy gates report.
49
+ *
50
+ * Exported separately from runPreflight because the schemaVersion 2 webapp path
51
+ * has no single-file `source`/entrypoint to feed runPreflight — it still needs
52
+ * the identical quota wording, so both paths share this one implementation
53
+ * instead of the webapp branch re-deriving (or skipping) the check.
54
+ */
55
+ export declare function quotaFindings(quota: QuotaCheck): {
56
+ warnings: string[];
57
+ blockers: string[];
58
+ };
47
59
  /** Run all preflight checks and collect warnings/blockers. */
48
60
  export declare function runPreflight(input: PreflightInput): PreflightResult;
49
61
  //# sourceMappingURL=preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/app/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAY7D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY1D;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAuB,EAC5B,MAAM,GAAE,gBAA6B,GACpC,UAAU,CASZ;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAiEnE"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/app/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAY7D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY1D;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAuB,EAC5B,MAAM,GAAE,gBAA6B,GACpC,UAAU,CASZ;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CA0BA;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA4CnE"}
@@ -56,32 +56,45 @@ export function checkQuota(used, limit = FALLBACK_QUOTA_LIMIT, source = "fallbac
56
56
  authoritative: source !== "fallback",
57
57
  };
58
58
  }
59
+ /**
60
+ * Split a quota check into the blocker/warning text the deploy gates report.
61
+ *
62
+ * Exported separately from runPreflight because the schemaVersion 2 webapp path
63
+ * has no single-file `source`/entrypoint to feed runPreflight — it still needs
64
+ * the identical quota wording, so both paths share this one implementation
65
+ * instead of the webapp branch re-deriving (or skipping) the check.
66
+ */
67
+ export function quotaFindings(quota) {
68
+ const warnings = [];
69
+ const blockers = [];
70
+ if (quota.ok) {
71
+ if (quota.near) {
72
+ warnings.push(`Approaching the Edge Function quota (${quota.used}/${quota.limit}, source: ${quota.source}).`);
73
+ }
74
+ return { warnings, blockers };
75
+ }
76
+ const detail = `${quota.used}/${quota.limit}, source: ${quota.source}`;
77
+ if (quota.authoritative) {
78
+ blockers.push(`Edge Function quota reached (${detail}). Remove an existing function (\`pxbaas app remove\` / \`pxbaas functions delete\`) or request a higher quota.`);
79
+ }
80
+ else {
81
+ // No authoritative limit could be read (the instance did not report its
82
+ // quota and no --quota-limit was given). Do NOT hard-block on a client-side
83
+ // guess — the server-side quota trigger is authoritative. Warn instead. (弯路5)
84
+ warnings.push(`Edge Function count is at the client fallback limit (${detail}); the platform limit could not be read. Proceeding — the server enforces the real quota. Pass --quota-limit <n> to make this check authoritative.`);
85
+ }
86
+ return { warnings, blockers };
87
+ }
59
88
  /** Run all preflight checks and collect warnings/blockers. */
60
89
  export function runPreflight(input) {
61
90
  const quotaSource = input.quotaLimitSource ?? (input.quotaLimit != null ? "flag" : "fallback");
62
91
  const quota = checkQuota(input.functionsCount, input.quotaLimit ?? FALLBACK_QUOTA_LIMIT, quotaSource);
63
92
  const rootAbsoluteRefs = scanRootAbsoluteRefs(input.source);
64
93
  const publicReachable = isPublicEndpoint(input.endpoint);
65
- const warnings = [];
66
- const blockers = [];
94
+ const { warnings, blockers } = quotaFindings(quota);
67
95
  if (!input.entrypointExists) {
68
96
  blockers.push("Entrypoint file not found. Run `pxbaas app new <name>` first.");
69
97
  }
70
- if (!quota.ok) {
71
- const detail = `${quota.used}/${quota.limit}, source: ${quota.source}`;
72
- if (quota.authoritative) {
73
- blockers.push(`Edge Function quota reached (${detail}). Remove an existing function (\`pxbaas app remove\` / \`pxbaas functions delete\`) or request a higher quota.`);
74
- }
75
- else {
76
- // No authoritative limit could be read (the instance did not report its
77
- // quota and no --quota-limit was given). Do NOT hard-block on a client-side
78
- // guess — the server-side quota trigger is authoritative. Warn instead. (弯路5)
79
- warnings.push(`Edge Function count is at the client fallback limit (${detail}); the platform limit could not be read. Proceeding — the server enforces the real quota. Pass --quota-limit <n> to make this check authoritative.`);
80
- }
81
- }
82
- else if (quota.near) {
83
- warnings.push(`Approaching the Edge Function quota (${quota.used}/${quota.limit}, source: ${quota.source}).`);
84
- }
85
98
  if (rootAbsoluteRefs.length > 0) {
86
99
  // Root-absolute refs are a hard spec violation and are reported as a BLOCKER
87
100
  // by spec-lint (pxbaas-app-spec). We still surface the raw list here for data,
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/app/preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/app/preflight.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/cli/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4CvD"}
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/cli/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CvD"}
package/dist/cli/root.js CHANGED
@@ -16,6 +16,7 @@ import { registerCompletionCommand } from '../commands/completion/index.js';
16
16
  import { registerSkillCommands } from '../commands/skill/index.js';
17
17
  import { registerInstanceCommands } from '../commands/instance/index.js';
18
18
  import { registerAppCommands } from '../commands/app/index.js';
19
+ import { registerTenantCommands } from '../commands/tenant/index.js';
19
20
  import { maybePrintSkillHint, maybePrintProvisionHint } from '../skill/hint.js';
20
21
  /** Build the invoked command path (e.g. "db query") from an action command. */
21
22
  function commandPath(program, actionCommand) {
@@ -65,5 +66,7 @@ export function registerCommands(program) {
65
66
  registerInstanceCommands(program);
66
67
  // Webapp demos: scaffold/deploy/verify on edge functions
67
68
  registerAppCommands(program);
69
+ // Platform-operator tenant management + dashboard credentials (multi-tenant)
70
+ registerTenantCommands(program);
68
71
  }
69
72
  //# sourceMappingURL=root.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/cli/root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/cli/root.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuO1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsDpC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsQ1D"}