primitive-admin 1.1.0-alpha.55 → 1.1.0-alpha.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/assets/skill/skills/primitive-platform/SKILL.md +20 -8
- package/dist/bin/primitive.js +8 -2
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/connections.js +12 -7
- package/dist/src/commands/connections.js.map +1 -1
- package/dist/src/commands/databases.js +14 -8
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.js +52 -23
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/init.js +142 -43
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/sessions.js +17 -5
- package/dist/src/commands/sessions.js.map +1 -1
- package/dist/src/commands/sync-app-settings.d.ts +19 -0
- package/dist/src/commands/sync-app-settings.js +39 -5
- package/dist/src/commands/sync-app-settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +38 -0
- package/dist/src/commands/sync.js +165 -44
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +8 -2
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/webhooks.js +31 -12
- package/dist/src/commands/webhooks.js.map +1 -1
- package/dist/src/commands/workflows.d.ts +17 -12
- package/dist/src/commands/workflows.js +44 -20
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.d.ts +24 -8
- package/dist/src/lib/api-client.js +26 -6
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.js +5 -3
- package/dist/src/lib/app-settings-descriptor.js.map +1 -1
- package/dist/src/lib/canonical-json.d.ts +12 -0
- package/dist/src/lib/canonical-json.js +35 -0
- package/dist/src/lib/canonical-json.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +8 -0
- package/dist/src/lib/cli-manifest.js +1 -0
- package/dist/src/lib/cli-manifest.js.map +1 -1
- package/dist/src/lib/google-client-secret-status.d.ts +35 -0
- package/dist/src/lib/google-client-secret-status.js +56 -0
- package/dist/src/lib/google-client-secret-status.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +5 -1
- package/dist/src/lib/init-config.js +9 -0
- package/dist/src/lib/init-config.js.map +1 -1
- package/dist/src/lib/log-inspection.d.ts +10 -1
- package/dist/src/lib/log-inspection.js +12 -1
- package/dist/src/lib/log-inspection.js.map +1 -1
- package/dist/src/lib/output.d.ts +13 -0
- package/dist/src/lib/output.js +25 -0
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/package-manager.d.ts +140 -0
- package/dist/src/lib/package-manager.js +305 -0
- package/dist/src/lib/package-manager.js.map +1 -0
- package/dist/src/lib/paginate.d.ts +49 -0
- package/dist/src/lib/paginate.js +52 -0
- package/dist/src/lib/paginate.js.map +1 -1
- package/dist/src/lib/project-config.js +11 -1
- package/dist/src/lib/project-config.js.map +1 -1
- package/dist/src/lib/record-filter.d.ts +3 -2
- package/dist/src/lib/record-filter.js +3 -2
- package/dist/src/lib/record-filter.js.map +1 -1
- package/dist/src/lib/resolve-init-server.d.ts +71 -0
- package/dist/src/lib/resolve-init-server.js +94 -0
- package/dist/src/lib/resolve-init-server.js.map +1 -0
- package/dist/src/lib/run-status.d.ts +38 -0
- package/dist/src/lib/run-status.js +63 -0
- package/dist/src/lib/run-status.js.map +1 -0
- package/dist/src/lib/signing-secret-status.d.ts +19 -0
- package/dist/src/lib/signing-secret-status.js +30 -0
- package/dist/src/lib/signing-secret-status.js.map +1 -0
- package/dist/src/lib/skill-installer.js +6 -3
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/sync-resource-types.js +8 -1
- package/dist/src/lib/sync-resource-types.js.map +1 -1
- package/dist/src/lib/template.d.ts +2 -1
- package/dist/src/lib/template.js +6 -3
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/user-selector.d.ts +24 -0
- package/dist/src/lib/user-selector.js +33 -0
- package/dist/src/lib/user-selector.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +25 -0
- package/dist/src/lib/version-check.js +76 -7
- package/dist/src/lib/version-check.js.map +1 -1
- package/dist/src/lib/workflow-include-preserve.d.ts +71 -0
- package/dist/src/lib/workflow-include-preserve.js +153 -0
- package/dist/src/lib/workflow-include-preserve.js.map +1 -0
- package/dist/src/types/index.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { Option } from "commander";
|
|
1
2
|
import { ApiClient } from "../lib/api-client.js";
|
|
2
3
|
import { resolveAppId } from "../lib/config.js";
|
|
3
4
|
import { error, info, formatTable, formatDate, json, } from "../lib/output.js";
|
|
5
|
+
import { resolveUserSelector } from "../lib/user-selector.js";
|
|
4
6
|
export function registerSessionsCommands(program) {
|
|
5
7
|
const sessions = program
|
|
6
8
|
.command("sessions")
|
|
@@ -11,19 +13,29 @@ expired — an expired session that has not yet been swept still appears, with
|
|
|
11
13
|
ACTIVE = false. Authentication tokens are never returned.
|
|
12
14
|
|
|
13
15
|
Examples:
|
|
14
|
-
$ primitive sessions list --user 01HXY...
|
|
15
|
-
$ primitive sessions list --user 01HXY... --limit 50
|
|
16
|
-
$ primitive sessions list --user 01HXY... --json
|
|
16
|
+
$ primitive sessions list --user-id 01HXY...
|
|
17
|
+
$ primitive sessions list --user-id 01HXY... --limit 50
|
|
18
|
+
$ primitive sessions list --user-id 01HXY... --json
|
|
17
19
|
`);
|
|
18
20
|
sessions
|
|
19
21
|
.command("list")
|
|
20
22
|
.description("List a user's sessions")
|
|
21
23
|
.option("--app <app-id>", "App ID (uses current app if not specified)")
|
|
22
|
-
|
|
24
|
+
// `--user-id` is canonical (#2357). It cannot be a `requiredOption` any
|
|
25
|
+
// more, because the deprecated `--user` alias also satisfies the
|
|
26
|
+
// requirement — commander would reject `--user 01H…` before the alias
|
|
27
|
+
// resolution runs. The explicit check below keeps the same contract.
|
|
28
|
+
.option("--user-id <user-id>", "List sessions for this user")
|
|
29
|
+
.addOption(new Option("--user <user-id>", "Deprecated alias of --user-id").hideHelp())
|
|
23
30
|
.option("--limit <n>", "Maximum rows to return (default 25, max 100)")
|
|
24
31
|
.option("--cursor <cursor>", "Pagination cursor from a previous page")
|
|
25
32
|
.option("--json", "Output as JSON")
|
|
26
33
|
.action(async (options) => {
|
|
34
|
+
const userId = resolveUserSelector(options, "sessions list");
|
|
35
|
+
if (!userId) {
|
|
36
|
+
error("required option '--user-id <user-id>' not specified");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
27
39
|
const resolvedAppId = resolveAppId(undefined, options);
|
|
28
40
|
const client = new ApiClient();
|
|
29
41
|
const limit = options.limit ? Number(options.limit) : undefined;
|
|
@@ -33,7 +45,7 @@ Examples:
|
|
|
33
45
|
process.exit(1);
|
|
34
46
|
}
|
|
35
47
|
try {
|
|
36
|
-
const { items, nextCursor } = await client.listSessions(resolvedAppId,
|
|
48
|
+
const { items, nextCursor } = await client.listSessions(resolvedAppId, userId, { limit, cursor: options.cursor });
|
|
37
49
|
if (options.json) {
|
|
38
50
|
json({ items, nextCursor });
|
|
39
51
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/commands/sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,25 @@ export declare function serializeAppSettings(settings: any): string;
|
|
|
41
41
|
* the same hash.
|
|
42
42
|
*/
|
|
43
43
|
export declare function writeAppSettingsToml(configDir: string, settings: any): string;
|
|
44
|
+
/**
|
|
45
|
+
* The pull-time warning for a `googleClientSecret` the server withheld, or
|
|
46
|
+
* `null` when the stored value is a reference (or unset).
|
|
47
|
+
*
|
|
48
|
+
* Shared by `settings pull` and `sync pull` so both report the same thing —
|
|
49
|
+
* neither one could say anything at all before (#2307). A withheld value is
|
|
50
|
+
* absent from the `app.toml` they just wrote AND absent from a push built out
|
|
51
|
+
* of that file, and a settings write that does not carry a `googleClientSecret`
|
|
52
|
+
* is exactly what the server rejects while the stored value is unmigrated
|
|
53
|
+
* (`validateGoogleClientSecretMigration`). So the pulled file is not pushable
|
|
54
|
+
* until the field is migrated, and pull is where the operator can still act on
|
|
55
|
+
* that.
|
|
56
|
+
*
|
|
57
|
+
* `subject` lets `sync pull` name the file and match the indentation of its
|
|
58
|
+
* other per-entity lines.
|
|
59
|
+
*/
|
|
60
|
+
export declare function pulledGoogleClientSecretWarning(settings: any, options?: {
|
|
61
|
+
subject?: string;
|
|
62
|
+
}): string | null;
|
|
44
63
|
/**
|
|
45
64
|
* Validate a parsed `app.toml` for push and return the fatal errors (a type
|
|
46
65
|
* mismatch). An empty array means the push may proceed. Warnings (unrecognized
|
|
@@ -29,6 +29,7 @@ import { createHash } from "crypto";
|
|
|
29
29
|
import { parseConfigToml, stringifyConfigToml } from "../lib/config-toml.js";
|
|
30
30
|
import { APP_SETTINGS_DESCRIPTOR, APP_SETTINGS_SECTIONS, serializeAppSettingsToToml, parseTomlToAppSettings, } from "../lib/app-settings-descriptor.js";
|
|
31
31
|
import { getServerUrl } from "../lib/config.js";
|
|
32
|
+
import { googleClientSecretStatusWarning } from "../lib/google-client-secret-status.js";
|
|
32
33
|
import { success, error, info, warn, json, result as printResult, divider, } from "../lib/output.js";
|
|
33
34
|
/** The app-settings file name inside a sync directory. */
|
|
34
35
|
export const APP_TOML_FILENAME = "app.toml";
|
|
@@ -62,6 +63,29 @@ export function writeAppSettingsToml(configDir, settings) {
|
|
|
62
63
|
writeFileSync(path, serializeAppSettings(settings));
|
|
63
64
|
return contentHashOfFile(path);
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* The pull-time warning for a `googleClientSecret` the server withheld, or
|
|
68
|
+
* `null` when the stored value is a reference (or unset).
|
|
69
|
+
*
|
|
70
|
+
* Shared by `settings pull` and `sync pull` so both report the same thing —
|
|
71
|
+
* neither one could say anything at all before (#2307). A withheld value is
|
|
72
|
+
* absent from the `app.toml` they just wrote AND absent from a push built out
|
|
73
|
+
* of that file, and a settings write that does not carry a `googleClientSecret`
|
|
74
|
+
* is exactly what the server rejects while the stored value is unmigrated
|
|
75
|
+
* (`validateGoogleClientSecretMigration`). So the pulled file is not pushable
|
|
76
|
+
* until the field is migrated, and pull is where the operator can still act on
|
|
77
|
+
* that.
|
|
78
|
+
*
|
|
79
|
+
* `subject` lets `sync pull` name the file and match the indentation of its
|
|
80
|
+
* other per-entity lines.
|
|
81
|
+
*/
|
|
82
|
+
export function pulledGoogleClientSecretWarning(settings, options = {}) {
|
|
83
|
+
return googleClientSecretStatusWarning(settings?.googleClientSecretStatus, {
|
|
84
|
+
subject: options.subject ?? "googleClientSecret",
|
|
85
|
+
withheldFrom: "the app.toml just written",
|
|
86
|
+
blocks: "pushing this app.toml back is rejected",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
65
89
|
/**
|
|
66
90
|
* Validate a parsed `app.toml` for push and return the fatal errors (a type
|
|
67
91
|
* mismatch). An empty array means the push may proceed. Warnings (unrecognized
|
|
@@ -168,12 +192,14 @@ export async function showAppSettings(client, appId, options = {}) {
|
|
|
168
192
|
}
|
|
169
193
|
// `googleClientSecretStatus` is not a descriptor field (it is derived, and
|
|
170
194
|
// never written back), so it prints here rather than in a section.
|
|
171
|
-
|
|
195
|
+
const statusWarning = googleClientSecretStatusWarning(settings.googleClientSecretStatus, {
|
|
196
|
+
subject: "googleClientSecret",
|
|
197
|
+
withheldFrom: "this output",
|
|
198
|
+
blocks: "the next settings write will be rejected",
|
|
199
|
+
});
|
|
200
|
+
if (statusWarning) {
|
|
172
201
|
divider();
|
|
173
|
-
warn(
|
|
174
|
-
"so it is withheld from this output. Google sign-in keeps working, but the value is " +
|
|
175
|
-
"deprecated and the next settings write will be rejected until it is migrated. " +
|
|
176
|
-
'Store the value with `primitive secrets set KEY --value <value>` and set googleClientSecret = "{{secrets.KEY}}".');
|
|
202
|
+
warn(statusWarning);
|
|
177
203
|
}
|
|
178
204
|
}
|
|
179
205
|
catch (err) {
|
|
@@ -195,6 +221,14 @@ export async function pullAppSettings(client, appId, configDir, options = {}) {
|
|
|
195
221
|
ensureDir(configDir);
|
|
196
222
|
const contentHash = writeAppSettingsToml(configDir, settings);
|
|
197
223
|
stampAppContentHash(configDir, appId, contentHash);
|
|
224
|
+
// A withheld value is never written to the TOML, so pull is where an
|
|
225
|
+
// operator finds out the app is still on an unmigrated literal — and that
|
|
226
|
+
// pushing the file back will be rejected until it is fixed. Emitted before
|
|
227
|
+
// the `--json` return because `warn` writes to stderr: the JSON payload on
|
|
228
|
+
// stdout stays machine-readable either way.
|
|
229
|
+
const statusWarning = pulledGoogleClientSecretWarning(settings);
|
|
230
|
+
if (statusWarning)
|
|
231
|
+
warn(statusWarning);
|
|
198
232
|
if (options.json) {
|
|
199
233
|
json({ wrote: true, path: appTomlPath(configDir), contentHash });
|
|
200
234
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-app-settings.js","sourceRoot":"","sources":["../../../src/commands/sync-app-settings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync-app-settings.js","sourceRoot":"","sources":["../../../src/commands/sync-app-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -119,6 +119,44 @@ export declare function planVarsPull(outcome: {
|
|
|
119
119
|
content: string | null;
|
|
120
120
|
varEntities: Record<string, VarEntity>;
|
|
121
121
|
};
|
|
122
|
+
/**
|
|
123
|
+
* Validate a `sync push`'s webhook writes against the server's per-app cap.
|
|
124
|
+
* Returns a list of human-readable errors (empty when the push may proceed).
|
|
125
|
+
*
|
|
126
|
+
* Run in `sync push`'s up-front preflight (the `planVarsPush` cap pattern) so a
|
|
127
|
+
* push that would run past the cap aborts BEFORE any mutation. Without it the
|
|
128
|
+
* push creates webhooks one at a time until the server rejects one at the cap,
|
|
129
|
+
* leaving a partial push.
|
|
130
|
+
*
|
|
131
|
+
* **Only creates are capped.** The server grandfathers apps that already hold
|
|
132
|
+
* more webhooks than the cap: it refuses new creates and nothing else. A plain
|
|
133
|
+
* file count would break that — `sync pull` writes one toml per webhook, so a
|
|
134
|
+
* grandfathered app pulls more files than the cap and could then never push
|
|
135
|
+
* again, its workflows, databases and vars included. So the check compares the
|
|
136
|
+
* local keys against the keys already on the server: a push that creates
|
|
137
|
+
* nothing new is always allowed, however far over the cap the app is, and a
|
|
138
|
+
* push that does create is rejected only when the resulting row count would
|
|
139
|
+
* exceed the cap.
|
|
140
|
+
*
|
|
141
|
+
* The remote key list this runs against comes from `GET
|
|
142
|
+
* /admin/api/apps/{appId}/webhooks`, which applies no default status filter, so
|
|
143
|
+
* archived rows are in `remoteKeys` exactly as they are in the server's count.
|
|
144
|
+
* The two therefore agree on what is already on the server.
|
|
145
|
+
*
|
|
146
|
+
* Still advisory rather than authoritative: this counts creates the way the
|
|
147
|
+
* *config dir* implies, while the apply loop decides create-vs-update from
|
|
148
|
+
* local sync state, so a checkout with missing sync state issues creates this
|
|
149
|
+
* check did not predict. Those creates name keys the server already holds, and
|
|
150
|
+
* the server does not cap a create that adds no row — it answers 409
|
|
151
|
+
* `WEBHOOK_KEY_EXISTS`, which `adoptByKeyOnCreate409` converges on. A push
|
|
152
|
+
* allowed here can still be rejected server-side (concurrent writes, a stale
|
|
153
|
+
* list); that rejection carries `WEBHOOK_LIMIT_REACHED` and names the limit.
|
|
154
|
+
*
|
|
155
|
+
* Planned prunes are deliberately NOT netted out of the count: `--prune` runs
|
|
156
|
+
* after the webhook create loop, so a push that only fits once its prunes land
|
|
157
|
+
* would still fail mid-apply. Prune first, then push the additions.
|
|
158
|
+
*/
|
|
159
|
+
export declare function validateWebhookCapForPush(localKeys: string[], remoteKeys: string[]): string[];
|
|
122
160
|
/**
|
|
123
161
|
* Validate a parsed `vars.toml` table against the same key/value constraints
|
|
124
162
|
* the server enforces (key format, string type, non-empty, size cap) plus the
|
|
@@ -14,14 +14,17 @@ import { createSnapshot, listSnapshots, resolveSnapshot, restoreSnapshot, pruneS
|
|
|
14
14
|
import { validateWorkflowToml, formatWorkflowTomlErrors, validateWorkflowExpressionsToml, validateWorkflowExpressionsRawToml, } from "../lib/workflow-toml-validator.js";
|
|
15
15
|
import { expandWorkflowTomlData } from "../lib/workflow-fragments.js";
|
|
16
16
|
import { parseConfigToml, stringifyConfigToml } from "../lib/config-toml.js";
|
|
17
|
+
import { canonicalJsonStringify } from "../lib/canonical-json.js";
|
|
18
|
+
import { reconcileWorkflowIncludes } from "../lib/workflow-include-preserve.js";
|
|
17
19
|
import { serializeSection, parseTomlToAppSettings, } from "../lib/app-settings-descriptor.js";
|
|
18
|
-
import { serializeAppSettings, collectAppSettingsPushErrors, } from "./sync-app-settings.js";
|
|
20
|
+
import { serializeAppSettings, collectAppSettingsPushErrors, pulledGoogleClientSecretWarning, } from "./sync-app-settings.js";
|
|
19
21
|
import { applyWorkflowBody } from "../lib/workflow-apply.js";
|
|
20
22
|
import { buildWorkflowPayloadFromToml, parseWorkflowExpressionsToml, } from "../lib/workflow-payload.js";
|
|
21
23
|
import { detectLayout, migrateLegacyToV2 } from "../lib/block-layout.js";
|
|
22
24
|
import { ABSENT_FROM_EXPORT, LOCAL_ONLY_ABSENT, LOCAL_ONLY_NEW, PUSH_PRUNE_SPECS, REMOTE_ONLY_UNMANAGED, REMOTE_ONLY_WILL_DELETE, SYNC_RESOURCE_TYPES, applyPrune, attemptFetch, classifyLocalOnly, classifyRemoteOnly, collectPushPruneCandidates, decidePushPruneCandidate, hasUncommittedChanges, planPrune, preserveUnwrittenEntries, removePrunedSidecar, ruleSetFileKey, } from "../lib/sync-resource-types.js";
|
|
23
25
|
import { success, error, printApiError, info, warn, keyValue, json, divider, } from "../lib/output.js";
|
|
24
26
|
import { confirmPrompt, ConfirmPromptError } from "../lib/confirm-prompt.js";
|
|
27
|
+
import { signingSecretStatusWarning } from "../lib/signing-secret-status.js";
|
|
25
28
|
import chalk from "chalk";
|
|
26
29
|
function ensureDir(dirPath) {
|
|
27
30
|
if (!existsSync(dirPath)) {
|
|
@@ -91,36 +94,6 @@ export function shouldPushFile(filePath, storedHash) {
|
|
|
91
94
|
return true;
|
|
92
95
|
return computeFileHash(filePath) !== storedHash;
|
|
93
96
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Canonical-JSON serializer for hash computation.
|
|
96
|
-
*
|
|
97
|
-
* Sorts object keys at every level so two semantically-equivalent JSON
|
|
98
|
-
* blobs produce the same string. Arrays preserve order (step order
|
|
99
|
-
* matters in workflows). Used by `computeExpandedContentHash`.
|
|
100
|
-
*/
|
|
101
|
-
function canonicalJsonStringify(value) {
|
|
102
|
-
if (value === null || typeof value !== "object") {
|
|
103
|
-
return JSON.stringify(value);
|
|
104
|
-
}
|
|
105
|
-
if (Array.isArray(value)) {
|
|
106
|
-
return "[" + value.map((v) => canonicalJsonStringify(v)).join(",") + "]";
|
|
107
|
-
}
|
|
108
|
-
// Honor `toJSON` before the key walk. A `Date` — or smol-toml's `TomlDate`,
|
|
109
|
-
// what a TOML datetime literal parses to — has no enumerable own keys, so
|
|
110
|
-
// the `Object.keys()` walk below would collapse it to "{}" and every
|
|
111
|
-
// datetime would hash identically (issue #1919). Both implement `toJSON`,
|
|
112
|
-
// returning the ISO string; recursing on it makes date-like values (nested
|
|
113
|
-
// ones too) participate in the hash. Matches JSON.stringify's own semantics.
|
|
114
|
-
if (typeof value.toJSON === "function") {
|
|
115
|
-
return canonicalJsonStringify(value.toJSON());
|
|
116
|
-
}
|
|
117
|
-
const keys = Object.keys(value).sort();
|
|
118
|
-
return ("{" +
|
|
119
|
-
keys
|
|
120
|
-
.map((k) => JSON.stringify(k) + ":" + canonicalJsonStringify(value[k]))
|
|
121
|
-
.join(",") +
|
|
122
|
-
"}");
|
|
123
|
-
}
|
|
124
97
|
/**
|
|
125
98
|
* Hash the *expanded* (post-fragment-splice) content of a workflow TOML.
|
|
126
99
|
*
|
|
@@ -351,6 +324,71 @@ const MAX_VAR_VALUE_BYTES = 2048;
|
|
|
351
324
|
* import the Worker service module.
|
|
352
325
|
*/
|
|
353
326
|
const MAX_VARS_PER_APP = 100;
|
|
327
|
+
/**
|
|
328
|
+
* Maximum number of webhooks per app — mirrors the server's
|
|
329
|
+
* `MAX_WEBHOOKS_PER_APP` (`src/app-api/services/webhook-limits.ts`, #2232).
|
|
330
|
+
* Kept in sync manually because the CLI can't import the Worker service module;
|
|
331
|
+
* a CLI integration test asserts the server's rejection message names this same
|
|
332
|
+
* number.
|
|
333
|
+
*/
|
|
334
|
+
const MAX_WEBHOOKS_PER_APP = 50;
|
|
335
|
+
/**
|
|
336
|
+
* Validate a `sync push`'s webhook writes against the server's per-app cap.
|
|
337
|
+
* Returns a list of human-readable errors (empty when the push may proceed).
|
|
338
|
+
*
|
|
339
|
+
* Run in `sync push`'s up-front preflight (the `planVarsPush` cap pattern) so a
|
|
340
|
+
* push that would run past the cap aborts BEFORE any mutation. Without it the
|
|
341
|
+
* push creates webhooks one at a time until the server rejects one at the cap,
|
|
342
|
+
* leaving a partial push.
|
|
343
|
+
*
|
|
344
|
+
* **Only creates are capped.** The server grandfathers apps that already hold
|
|
345
|
+
* more webhooks than the cap: it refuses new creates and nothing else. A plain
|
|
346
|
+
* file count would break that — `sync pull` writes one toml per webhook, so a
|
|
347
|
+
* grandfathered app pulls more files than the cap and could then never push
|
|
348
|
+
* again, its workflows, databases and vars included. So the check compares the
|
|
349
|
+
* local keys against the keys already on the server: a push that creates
|
|
350
|
+
* nothing new is always allowed, however far over the cap the app is, and a
|
|
351
|
+
* push that does create is rejected only when the resulting row count would
|
|
352
|
+
* exceed the cap.
|
|
353
|
+
*
|
|
354
|
+
* The remote key list this runs against comes from `GET
|
|
355
|
+
* /admin/api/apps/{appId}/webhooks`, which applies no default status filter, so
|
|
356
|
+
* archived rows are in `remoteKeys` exactly as they are in the server's count.
|
|
357
|
+
* The two therefore agree on what is already on the server.
|
|
358
|
+
*
|
|
359
|
+
* Still advisory rather than authoritative: this counts creates the way the
|
|
360
|
+
* *config dir* implies, while the apply loop decides create-vs-update from
|
|
361
|
+
* local sync state, so a checkout with missing sync state issues creates this
|
|
362
|
+
* check did not predict. Those creates name keys the server already holds, and
|
|
363
|
+
* the server does not cap a create that adds no row — it answers 409
|
|
364
|
+
* `WEBHOOK_KEY_EXISTS`, which `adoptByKeyOnCreate409` converges on. A push
|
|
365
|
+
* allowed here can still be rejected server-side (concurrent writes, a stale
|
|
366
|
+
* list); that rejection carries `WEBHOOK_LIMIT_REACHED` and names the limit.
|
|
367
|
+
*
|
|
368
|
+
* Planned prunes are deliberately NOT netted out of the count: `--prune` runs
|
|
369
|
+
* after the webhook create loop, so a push that only fits once its prunes land
|
|
370
|
+
* would still fail mid-apply. Prune first, then push the additions.
|
|
371
|
+
*/
|
|
372
|
+
export function validateWebhookCapForPush(localKeys, remoteKeys) {
|
|
373
|
+
const remote = new Set(remoteKeys);
|
|
374
|
+
const creates = [...new Set(localKeys)].filter((k) => !remote.has(k));
|
|
375
|
+
if (creates.length === 0)
|
|
376
|
+
return [];
|
|
377
|
+
const finalCount = remote.size + creates.length;
|
|
378
|
+
if (finalCount <= MAX_WEBHOOKS_PER_APP)
|
|
379
|
+
return [];
|
|
380
|
+
// The overshoot is measured against the cap, but never ask for more files
|
|
381
|
+
// than exist: on a grandfathered over-cap app (remote.size > the cap) the
|
|
382
|
+
// overshoot exceeds `creates.length`, and removing every new file is enough
|
|
383
|
+
// — a push that creates nothing is always allowed.
|
|
384
|
+
const excess = Math.min(creates.length, finalCount - MAX_WEBHOOKS_PER_APP);
|
|
385
|
+
return [
|
|
386
|
+
`webhooks/ would create ${creates.length} new webhook(s), leaving ${finalCount} on the server ` +
|
|
387
|
+
`(it already holds ${remote.size}), exceeding the maximum of ${MAX_WEBHOOKS_PER_APP} webhooks per app. ` +
|
|
388
|
+
`Remove ${excess} new webhook file(s), or hard-delete webhooks you no longer ` +
|
|
389
|
+
`need (\`primitive webhooks delete <id> --hard\`), before pushing.`,
|
|
390
|
+
];
|
|
391
|
+
}
|
|
354
392
|
/**
|
|
355
393
|
* Validate a parsed `vars.toml` table against the same key/value constraints
|
|
356
394
|
* the server enforces (key format, string type, non-empty, size cap) plus the
|
|
@@ -2322,6 +2360,16 @@ Directory Structure:
|
|
|
2322
2360
|
const appTomlPath = join(configDir, "app.toml");
|
|
2323
2361
|
writeFileSync(appTomlPath, serializeAppSettings(settings));
|
|
2324
2362
|
info(" Wrote app.toml");
|
|
2363
|
+
// A googleClientSecret the server withheld is not in the file, so
|
|
2364
|
+
// pull time is where an operator finds out: a legacy literal from
|
|
2365
|
+
// before reference-only still signs in (#2256), a malformed
|
|
2366
|
+
// reference does not — and either one makes a push of this file
|
|
2367
|
+
// fail. Same wording as `settings pull` and `settings show`.
|
|
2368
|
+
const googleSecretWarning = pulledGoogleClientSecretWarning(settings, {
|
|
2369
|
+
subject: " app.toml: googleClientSecret",
|
|
2370
|
+
});
|
|
2371
|
+
if (googleSecretWarning)
|
|
2372
|
+
warn(googleSecretWarning);
|
|
2325
2373
|
}
|
|
2326
2374
|
// Write config vars (issue #1423). A single flat vars.toml at the
|
|
2327
2375
|
// sync-dir root (like app.toml), holding the per-environment non-secret
|
|
@@ -2383,14 +2431,16 @@ Directory Structure:
|
|
|
2383
2431
|
modifiedAt: webhook.modifiedAt || new Date().toISOString(),
|
|
2384
2432
|
contentHash: computeFileHash(filePath),
|
|
2385
2433
|
};
|
|
2386
|
-
// A
|
|
2387
|
-
//
|
|
2388
|
-
//
|
|
2389
|
-
//
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
}
|
|
2434
|
+
// A stored value that is not a reference is never written to TOML, so
|
|
2435
|
+
// pull time is where an operator finds out: a legacy literal from
|
|
2436
|
+
// before reference-only still verifies deliveries (#2254, #2332), a
|
|
2437
|
+
// malformed reference does not. Same wording as `webhooks get`.
|
|
2438
|
+
const signingSecretWarning = signingSecretStatusWarning(webhook.signingSecretStatus, {
|
|
2439
|
+
subject: ` webhooks/${filename}: signingSecret for '${webhook.webhookKey}'`,
|
|
2440
|
+
blocks: "pushing this webhook is rejected",
|
|
2441
|
+
});
|
|
2442
|
+
if (signingSecretWarning)
|
|
2443
|
+
warn(signingSecretWarning);
|
|
2394
2444
|
}
|
|
2395
2445
|
info(` Pulled ${webhooks.length} webhook(s)`);
|
|
2396
2446
|
// Pull cron triggers. An older server without the route (or any other
|
|
@@ -2451,19 +2501,45 @@ Directory Structure:
|
|
|
2451
2501
|
for (const { workflow, draft, configs } of workflows) {
|
|
2452
2502
|
const filename = `${workflow.workflowKey}.toml`;
|
|
2453
2503
|
const filePath = join(configDir, "workflows", filename);
|
|
2454
|
-
|
|
2504
|
+
const remoteToml = serializeWorkflow(workflow, draft, configs || [], (msg) => info(` ${msg}`));
|
|
2505
|
+
// #2416 — a locally fragment-authored workflow (`[[include]]`) must
|
|
2506
|
+
// survive the pull. `reconcileWorkflowIncludes` leaves the file
|
|
2507
|
+
// alone when it already expands to what the server runs, and
|
|
2508
|
+
// re-emits it with the include blocks intact when the server
|
|
2509
|
+
// drifted in a way fragments can still express. Files without an
|
|
2510
|
+
// `include` key take the unchanged write-the-server-form path.
|
|
2511
|
+
const reconciled = reconcileWorkflowIncludes({
|
|
2512
|
+
workflowKey: workflow.workflowKey,
|
|
2513
|
+
localPath: filePath,
|
|
2514
|
+
localContent: existsSync(filePath)
|
|
2515
|
+
? readFileSync(filePath, "utf-8")
|
|
2516
|
+
: undefined,
|
|
2517
|
+
remoteToml,
|
|
2518
|
+
hashParsedToml: hashWorkflowTomlForDiff,
|
|
2519
|
+
});
|
|
2520
|
+
if (reconciled.message) {
|
|
2521
|
+
info(` ${reconciled.message}`);
|
|
2522
|
+
}
|
|
2523
|
+
if (reconciled.action === "write-merged") {
|
|
2524
|
+
writeFileSync(filePath, reconciled.content);
|
|
2525
|
+
}
|
|
2526
|
+
else if (reconciled.action === "write-expanded") {
|
|
2527
|
+
writeFileSync(filePath, remoteToml);
|
|
2528
|
+
}
|
|
2455
2529
|
// Hash the expanded (post-fragment-splice) form so subsequent pushes
|
|
2456
2530
|
// can detect fragment-only edits. See `computeExpandedContentHash`.
|
|
2457
|
-
//
|
|
2458
|
-
//
|
|
2459
|
-
// the
|
|
2531
|
+
// `parseTomlFile` re-reads whatever is now on disk and expands it, so
|
|
2532
|
+
// a preserved fragment file hashes by its expansion — the same value
|
|
2533
|
+
// the fully expanded form would have produced.
|
|
2460
2534
|
workflowEntities[workflow.workflowKey] = {
|
|
2461
2535
|
id: workflow.workflowId,
|
|
2462
2536
|
modifiedAt: workflow.modifiedAt || new Date().toISOString(),
|
|
2463
2537
|
activeConfigId: workflow.activeConfigId,
|
|
2464
2538
|
contentHash: computeExpandedContentHash(parseTomlFile(filePath)),
|
|
2465
2539
|
};
|
|
2466
|
-
|
|
2540
|
+
if (reconciled.action !== "skip") {
|
|
2541
|
+
info(` Wrote workflows/${filename}`);
|
|
2542
|
+
}
|
|
2467
2543
|
}
|
|
2468
2544
|
// #1660 — remove any pre-fix stray `workflows/__internal.*.toml` a prior
|
|
2469
2545
|
// (buggy) pull exported. Match on the RESOLVED `[workflow].key`, never on
|
|
@@ -3311,6 +3387,51 @@ Directory Structure:
|
|
|
3311
3387
|
`delete unneeded vars, then push again.`);
|
|
3312
3388
|
}
|
|
3313
3389
|
}
|
|
3390
|
+
// Per-app webhook cap (#2232) — checked here, before ANY mutation, so a
|
|
3391
|
+
// push that would run past the cap aborts instead of creating webhooks
|
|
3392
|
+
// one at a time until the server rejects one and leaves a partial push.
|
|
3393
|
+
//
|
|
3394
|
+
// Compares the local keys against the keys already on the server rather
|
|
3395
|
+
// than counting `webhooks/*.toml` files: the server grandfathers apps
|
|
3396
|
+
// already over the cap and refuses only new creates, and `sync pull`
|
|
3397
|
+
// writes one file per webhook, so a file count would lock a
|
|
3398
|
+
// grandfathered app out of pushing anything at all.
|
|
3399
|
+
const preflightWebhooksDir = join(configDir, "webhooks");
|
|
3400
|
+
if (existsSync(preflightWebhooksDir)) {
|
|
3401
|
+
const localWebhookKeys = readdirSync(preflightWebhooksDir)
|
|
3402
|
+
.filter((f) => f.endsWith(".toml"))
|
|
3403
|
+
.map((f) => {
|
|
3404
|
+
try {
|
|
3405
|
+
const parsed = parseTomlFile(join(preflightWebhooksDir, f));
|
|
3406
|
+
return parsed?.webhook?.key || basename(f, ".toml");
|
|
3407
|
+
}
|
|
3408
|
+
catch {
|
|
3409
|
+
// A malformed file already failed validation elsewhere in the
|
|
3410
|
+
// push; fall back to the filename so the count stays right.
|
|
3411
|
+
return basename(f, ".toml");
|
|
3412
|
+
}
|
|
3413
|
+
});
|
|
3414
|
+
let remoteWebhookKeys = null;
|
|
3415
|
+
try {
|
|
3416
|
+
const remoteItems = await fetchAll((p) => client.listWebhooks(resolvedAppId, p));
|
|
3417
|
+
remoteWebhookKeys = remoteItems.map((w) => w.webhookKey);
|
|
3418
|
+
}
|
|
3419
|
+
catch (err) {
|
|
3420
|
+
// Advisory check only — the server enforces the cap itself with a
|
|
3421
|
+
// `WEBHOOK_LIMIT_REACHED` 400. Skipping is better than guessing:
|
|
3422
|
+
// treating an unreadable list as "the app is empty" would block a
|
|
3423
|
+
// grandfathered app's legitimate push.
|
|
3424
|
+
warn(` Could not list existing webhooks to pre-check the ${MAX_WEBHOOKS_PER_APP}-webhook limit ` +
|
|
3425
|
+
`(${err?.message || String(err)}); the server will enforce it.`);
|
|
3426
|
+
}
|
|
3427
|
+
if (remoteWebhookKeys) {
|
|
3428
|
+
const capErrors = validateWebhookCapForPush(localWebhookKeys, remoteWebhookKeys);
|
|
3429
|
+
if (capErrors.length > 0) {
|
|
3430
|
+
throw new Error(`Aborting push: ${capErrors.length} webhook limit error(s) — no changes were applied.\n` +
|
|
3431
|
+
capErrors.map((e) => ` ${e}`).join("\n"));
|
|
3432
|
+
}
|
|
3433
|
+
}
|
|
3434
|
+
}
|
|
3314
3435
|
// Process app settings
|
|
3315
3436
|
const appTomlPath = join(configDir, "app.toml");
|
|
3316
3437
|
if (existsSync(appTomlPath)) {
|