Sorry, the diff of this file is too big to display
@@ -32,3 +32,3 @@ <!doctype html> | ||
| </style> | ||
| <script type="module" crossorigin src="/assets/index-C2vJwVT6.js"></script> | ||
| <script type="module" crossorigin src="/assets/index-CLbOnpJ6.js"></script> | ||
| <link rel="stylesheet" crossorigin href="/assets/index-C3SH6MsN.css"> | ||
@@ -35,0 +35,0 @@ </head> |
@@ -201,6 +201,7 @@ // cloud-client.mjs - the OPTIONAL, gated client for the proprietary pendpost-cloud | ||
| try { consolidateCloudKey(); } catch { /* consolidation is best-effort */ } | ||
| // connectWorkspace already turns the active client's brand always-on (writeCloudConfig | ||
| // with enabled:true). Then reconcile EVERY brand's flag to the freshly-connected | ||
| // workspace so its billing + worker fence match local intent immediately (no manual | ||
| // per-brand toggle). Best-effort: a flag-sync failure must not undo a successful connect. | ||
| // CONNECT LINKS ONLY: connectWorkspace links the workspace WITHOUT enabling any brand | ||
| // (no auto-bill). Then reconcile EVERY brand's flag to the freshly-connected workspace - | ||
| // all OFF on a fresh connect, which also heals any stale always-on row left in the cloud | ||
| // so billing matches local intent. Enabling a brand is a separate, explicit, billable | ||
| // toggle. Best-effort: a flag-sync failure must not undo a successful connect. | ||
| await connectWorkspace({ baseUrl, workspaceId: claimed.workspaceId }); | ||
@@ -207,0 +208,0 @@ let brands = null; |
@@ -174,4 +174,4 @@ // cloud-config.mjs - the OPTIONAL managed-cloud configuration + the secret-tier | ||
| // shape, now backed by the global connection + the ACTIVE client's brand: `enabled` | ||
| // is the active client's always-on. So the existing connect/enable transport keeps | ||
| // working unchanged while the new multi-client view uses the brand functions above. | ||
| // (read) is the active client's always-on. So the existing connect transport keeps | ||
| // working while the new multi-client view uses the brand functions above. | ||
@@ -184,5 +184,7 @@ export function readCloudConfig() { | ||
| // CONNECT LINKS ONLY: writing the connection NEVER auto-enables a brand's always-on | ||
| // (that is an explicit, billable toggle via setCloudEnabled / setBrandAlwaysOn). So | ||
| // `next.enabled` is intentionally ignored here - a fresh connect leaves every brand OFF. | ||
| export function writeCloudConfig(next) { | ||
| setConnection({ baseUrl: next.baseUrl, workspaceId: next.workspaceId }); | ||
| setBrandAlwaysOn(currentClientId(), Boolean(next.enabled)); | ||
| } | ||
@@ -189,0 +191,0 @@ |
+19
-1
@@ -130,2 +130,20 @@ // multi-client.mjs - the per-client registry + the idempotent, zero-loss boot | ||
| // Move a legacy item into the default client. A same-filesystem rename is atomic; | ||
| // across a mount boundary it throws EXDEV - notably a Docker overlay, where the | ||
| // legacy `data/*` baked into the image (read-only lower layer) is moved to a path | ||
| // in the writable upper layer (e.g. `npx pendpost --stdio` inside a container, the | ||
| // path Glama and other registries introspect with). Fall back to a recursive copy + | ||
| // delete, which is equivalent for this one-time migration and preserves the | ||
| // crash-safe re-entry property: `src` survives until the copy lands, so a crash | ||
| // mid-move re-enters and re-copies a still-present source. | ||
| function movePath(src, dest) { | ||
| try { | ||
| fs.renameSync(src, dest); | ||
| } catch (e) { | ||
| if (e.code !== 'EXDEV') throw e; | ||
| fs.cpSync(src, dest, { recursive: true }); | ||
| fs.rmSync(src, { recursive: true, force: true }); | ||
| } | ||
| } | ||
| // Idempotent, zero-loss, crash-safe boot migration. | ||
@@ -160,3 +178,3 @@ // | ||
| fs.mkdirSync(path.dirname(dest), { recursive: true }); | ||
| fs.renameSync(it.src, dest); | ||
| movePath(it.src, dest); | ||
| moved += 1; | ||
@@ -163,0 +181,0 @@ } |
+1
-1
@@ -20,3 +20,3 @@ // util.mjs - shared helpers for the pendpost server (zero-dep). | ||
| export const DATA_ROOT = path.join(WORKSPACE_ROOT, 'data'); | ||
| export const VERSION = '1.1.0'; | ||
| export const VERSION = '1.1.1'; | ||
@@ -23,0 +23,0 @@ // The .env now lives in the ACTIVE client subtree, not at WORKSPACE_ROOT. |
+1
-1
| { | ||
| "name": "pendpost", | ||
| "version": "1.1.0", | ||
| "version": "1.1.1", | ||
| "description": "pendpost is a free, open-source (MIT), local-first social media planner where an AI agent drafts and schedules posts across Instagram, Facebook, LinkedIn, YouTube, and X behind a human approval gate you control.", | ||
@@ -5,0 +5,0 @@ "type": "module", |
Sorry, the diff of this file is too big to display
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 3 instances
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 3 instances
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
2370599
0.08%17629
0.13%