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.
Files changed (88) hide show
  1. package/README.md +11 -3
  2. package/assets/skill/skills/primitive-platform/SKILL.md +20 -8
  3. package/dist/bin/primitive.js +8 -2
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/connections.js +12 -7
  6. package/dist/src/commands/connections.js.map +1 -1
  7. package/dist/src/commands/databases.js +14 -8
  8. package/dist/src/commands/databases.js.map +1 -1
  9. package/dist/src/commands/documents.js +52 -23
  10. package/dist/src/commands/documents.js.map +1 -1
  11. package/dist/src/commands/init.js +142 -43
  12. package/dist/src/commands/init.js.map +1 -1
  13. package/dist/src/commands/sessions.js +17 -5
  14. package/dist/src/commands/sessions.js.map +1 -1
  15. package/dist/src/commands/sync-app-settings.d.ts +19 -0
  16. package/dist/src/commands/sync-app-settings.js +39 -5
  17. package/dist/src/commands/sync-app-settings.js.map +1 -1
  18. package/dist/src/commands/sync.d.ts +38 -0
  19. package/dist/src/commands/sync.js +165 -44
  20. package/dist/src/commands/sync.js.map +1 -1
  21. package/dist/src/commands/tokens.js +8 -2
  22. package/dist/src/commands/tokens.js.map +1 -1
  23. package/dist/src/commands/webhooks.js +31 -12
  24. package/dist/src/commands/webhooks.js.map +1 -1
  25. package/dist/src/commands/workflows.d.ts +17 -12
  26. package/dist/src/commands/workflows.js +44 -20
  27. package/dist/src/commands/workflows.js.map +1 -1
  28. package/dist/src/lib/api-client.d.ts +24 -8
  29. package/dist/src/lib/api-client.js +26 -6
  30. package/dist/src/lib/api-client.js.map +1 -1
  31. package/dist/src/lib/app-settings-descriptor.js +5 -3
  32. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  33. package/dist/src/lib/canonical-json.d.ts +12 -0
  34. package/dist/src/lib/canonical-json.js +35 -0
  35. package/dist/src/lib/canonical-json.js.map +1 -0
  36. package/dist/src/lib/cli-manifest.d.ts +8 -0
  37. package/dist/src/lib/cli-manifest.js +1 -0
  38. package/dist/src/lib/cli-manifest.js.map +1 -1
  39. package/dist/src/lib/google-client-secret-status.d.ts +35 -0
  40. package/dist/src/lib/google-client-secret-status.js +56 -0
  41. package/dist/src/lib/google-client-secret-status.js.map +1 -0
  42. package/dist/src/lib/init-config.d.ts +5 -1
  43. package/dist/src/lib/init-config.js +9 -0
  44. package/dist/src/lib/init-config.js.map +1 -1
  45. package/dist/src/lib/log-inspection.d.ts +10 -1
  46. package/dist/src/lib/log-inspection.js +12 -1
  47. package/dist/src/lib/log-inspection.js.map +1 -1
  48. package/dist/src/lib/output.d.ts +13 -0
  49. package/dist/src/lib/output.js +25 -0
  50. package/dist/src/lib/output.js.map +1 -1
  51. package/dist/src/lib/package-manager.d.ts +140 -0
  52. package/dist/src/lib/package-manager.js +305 -0
  53. package/dist/src/lib/package-manager.js.map +1 -0
  54. package/dist/src/lib/paginate.d.ts +49 -0
  55. package/dist/src/lib/paginate.js +52 -0
  56. package/dist/src/lib/paginate.js.map +1 -1
  57. package/dist/src/lib/project-config.js +11 -1
  58. package/dist/src/lib/project-config.js.map +1 -1
  59. package/dist/src/lib/record-filter.d.ts +3 -2
  60. package/dist/src/lib/record-filter.js +3 -2
  61. package/dist/src/lib/record-filter.js.map +1 -1
  62. package/dist/src/lib/resolve-init-server.d.ts +71 -0
  63. package/dist/src/lib/resolve-init-server.js +94 -0
  64. package/dist/src/lib/resolve-init-server.js.map +1 -0
  65. package/dist/src/lib/run-status.d.ts +38 -0
  66. package/dist/src/lib/run-status.js +63 -0
  67. package/dist/src/lib/run-status.js.map +1 -0
  68. package/dist/src/lib/signing-secret-status.d.ts +19 -0
  69. package/dist/src/lib/signing-secret-status.js +30 -0
  70. package/dist/src/lib/signing-secret-status.js.map +1 -0
  71. package/dist/src/lib/skill-installer.js +6 -3
  72. package/dist/src/lib/skill-installer.js.map +1 -1
  73. package/dist/src/lib/sync-resource-types.js +8 -1
  74. package/dist/src/lib/sync-resource-types.js.map +1 -1
  75. package/dist/src/lib/template.d.ts +2 -1
  76. package/dist/src/lib/template.js +6 -3
  77. package/dist/src/lib/template.js.map +1 -1
  78. package/dist/src/lib/user-selector.d.ts +24 -0
  79. package/dist/src/lib/user-selector.js +33 -0
  80. package/dist/src/lib/user-selector.js.map +1 -0
  81. package/dist/src/lib/version-check.d.ts +25 -0
  82. package/dist/src/lib/version-check.js +76 -7
  83. package/dist/src/lib/version-check.js.map +1 -1
  84. package/dist/src/lib/workflow-include-preserve.d.ts +71 -0
  85. package/dist/src/lib/workflow-include-preserve.js +153 -0
  86. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  87. package/dist/src/types/index.d.ts +2 -2
  88. 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
- .requiredOption("--user <user-id>", "List sessions for this user")
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, options.user, { limit, cursor: options.cursor });
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":"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"}
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
- if (settings.googleClientSecretStatus === "legacy-literal") {
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("googleClientSecret still holds a raw value rather than a {{secrets.KEY}} reference, " +
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,GAEvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,IAAI,WAAW,EACrB,OAAO,GACR,MAAM,kBAAkB,CAAC;AAE1B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAa;IAChD,OAAO,mBAAmB,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAAa;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAAa,EACb,UAAgC,EAAE;IAElC,OAAO,+BAA+B,CAAC,QAAQ,EAAE,wBAAwB,EAAE;QACzE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,oBAAoB;QAChD,YAAY,EAAE,2BAA2B;QACzC,MAAM,EAAE,wCAAwC;KACjD,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA6B,EAC7B,UAAwC,EAAE;IAE1C,OAAO,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,uEAAuE;AACvE,gFAAgF;AAEhF,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAc,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,KAAgB;IACxD,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,KAAa,EACb,WAAmB;IAEnB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACjE,MAAM,KAAK,GACT,QAAQ,IAAI,CAAC,eAAe;QAC1B,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC;YACE,KAAK;YACL,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,YAAY,EAAE;YAChD,YAAY,EAAE,GAAG;YACjB,QAAQ,EAAE,EAAE;SACb,CAAC;IACR,KAAK,CAAC,QAAQ,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IACtD,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,8EAA8E;AAE9E,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,CAAU,EAAE,CAAU;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,KAAa,EACb,UAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAM,OAA6B,CACpD,CAAC;YACF,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,CAAE,QAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,mEAAmE;QACnE,MAAM,aAAa,GAAG,+BAA+B,CACnD,QAAQ,CAAC,wBAAwB,EACjC;YACE,OAAO,EAAE,oBAAoB;YAC7B,YAAY,EAAE,aAAa;YAC3B,MAAM,EAAE,0CAA0C;SACnD,CACF,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,UAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,gCAAgC,KAAK,GAAG,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9D,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAEnD,qEAAqE;QACrE,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,4CAA4C;QAC5C,MAAM,aAAa,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,aAAa;YAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,SAAS,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,UAAiE,EAAE;IAEnE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,CACH,MAAM,iBAAiB,aAAa,IAAI,wCAAwC,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAE1D,IAAI,QAA6B,CAAC;QAClC,IAAI,CAAC;YACH,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,kCAAkC,iBAAiB,KAAK,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,QAAQ,EAAE;YACtE,cAAc;SACf,CAAC,CAAC;QAEH,+CAA+C;QAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CACH,kBAAkB,MAAM,CAAC,MAAM,2BAA2B,iBAAiB,6BAA6B,CACzG,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uEAAuE;QACvE,MAAM,UAAU,GAAG,cAAc;YAC/B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC;QACtC,MAAM,OAAO,GACX,OAAO,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC;QACzE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,+DAA+D,CAAC,CAAC;YACxE,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,sCAAsC,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChD,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,2EAA2E;QAC3E,4EAA4E;QAC5E,yEAAyE;QACzE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAUD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,UAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,CACH,MAAM,iBAAiB,aAAa,IAAI,wCAAwC,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,QAA6B,CAAC;QAClC,IAAI,CAAC;YACH,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CACH,kCAAkC,iBAAiB,KAAK,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CACtF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAE1D,wEAAwE;QACxE,oCAAoC;QACpC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,QAAQ,EAAE;YACnE,cAAc;SACf,CAAC,CAAC;QAEH,4EAA4E;QAC5E,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CACH,kBAAkB,MAAM,CAAC,MAAM,2BAA2B,iBAAiB,gCAAgC,CAC5G,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,uBAAuB,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC;gBAAE,SAAS;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,SAAS,GAAI,MAA8B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,SAAS;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,oBAAoB,iBAAiB,2BAA2B,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,4BAA4B,iBAAiB,kBAAkB,CAAC,CAAC;QACrF,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAClC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -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 row still holding a raw secret from before signing secrets became
2387
- // reference-only (#2254). It is never written to TOML, and every
2388
- // delivery to it is rejected — pull time is the only place an
2389
- // operator finds out before the rejections start.
2390
- if (webhook.signingSecretStatus === "legacy-literal") {
2391
- warn(` webhooks/${filename}: signingSecret still holds a raw value, so every signed delivery to '${webhook.webhookKey}' is rejected. ` +
2392
- `Store the value with \`primitive secrets set KEY --value <value>\` and set signingSecret = "{{secrets.KEY}}".`);
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
- writeFileSync(filePath, serializeWorkflow(workflow, draft, configs || [], (msg) => info(` ${msg}`)));
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
- // Pulled workflows never carry `include`, so the expander is a
2458
- // no-op here — but we use the same canonical-JSON hash function so
2459
- // the push-side comparison stays consistent.
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
- info(` Wrote workflows/${filename}`);
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)) {