primitive-admin 1.1.0 → 1.2.0-alpha.1

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 (71) hide show
  1. package/README.md +14 -13
  2. package/assets/skill/skills/primitive-platform/SKILL.md +6 -0
  3. package/dist/src/commands/collections.js +20 -17
  4. package/dist/src/commands/collections.js.map +1 -1
  5. package/dist/src/commands/connections.js +1 -5
  6. package/dist/src/commands/connections.js.map +1 -1
  7. package/dist/src/commands/database-types.js +13 -313
  8. package/dist/src/commands/database-types.js.map +1 -1
  9. package/dist/src/commands/databases.js +7 -128
  10. package/dist/src/commands/databases.js.map +1 -1
  11. package/dist/src/commands/groups.js +16 -0
  12. package/dist/src/commands/groups.js.map +1 -1
  13. package/dist/src/commands/llm.js +9 -6
  14. package/dist/src/commands/llm.js.map +1 -1
  15. package/dist/src/commands/sessions.js +3 -8
  16. package/dist/src/commands/sessions.js.map +1 -1
  17. package/dist/src/commands/settings.d.ts +18 -0
  18. package/dist/src/commands/settings.js +54 -0
  19. package/dist/src/commands/settings.js.map +1 -0
  20. package/dist/src/commands/sync.d.ts +77 -7
  21. package/dist/src/commands/sync.js +368 -198
  22. package/dist/src/commands/sync.js.map +1 -1
  23. package/dist/src/commands/tokens.js +1 -6
  24. package/dist/src/commands/tokens.js.map +1 -1
  25. package/dist/src/commands/workflows.js +3 -3
  26. package/dist/src/commands/workflows.js.map +1 -1
  27. package/dist/src/lib/api-client.d.ts +3 -70
  28. package/dist/src/lib/api-client.js +20 -106
  29. package/dist/src/lib/api-client.js.map +1 -1
  30. package/dist/src/lib/app-match-guard.d.ts +44 -0
  31. package/dist/src/lib/app-match-guard.js +72 -0
  32. package/dist/src/lib/app-match-guard.js.map +1 -0
  33. package/dist/src/lib/collection-export.d.ts +37 -9
  34. package/dist/src/lib/collection-export.js +48 -12
  35. package/dist/src/lib/collection-export.js.map +1 -1
  36. package/dist/src/lib/config-object-descriptor.js +2 -3
  37. package/dist/src/lib/config-object-descriptor.js.map +1 -1
  38. package/dist/src/lib/function-triggers.d.ts +66 -0
  39. package/dist/src/lib/function-triggers.js +285 -0
  40. package/dist/src/lib/function-triggers.js.map +1 -0
  41. package/dist/src/lib/generated-allowlist.js +0 -1
  42. package/dist/src/lib/generated-allowlist.js.map +1 -1
  43. package/dist/src/lib/generated-config-surfaces.d.ts +4 -2
  44. package/dist/src/lib/generated-config-surfaces.js +138 -68
  45. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  46. package/dist/src/lib/generated-sdk-types.d.ts +1 -1
  47. package/dist/src/lib/generated-sdk-types.js +1 -1
  48. package/dist/src/lib/generated-sdk-types.js.map +1 -1
  49. package/dist/src/lib/generated-workflow-model-fields.d.ts +20 -0
  50. package/dist/src/lib/generated-workflow-model-fields.js +53 -0
  51. package/dist/src/lib/generated-workflow-model-fields.js.map +1 -0
  52. package/dist/src/lib/google-client-secret-status.d.ts +35 -0
  53. package/dist/src/lib/google-client-secret-status.js +56 -0
  54. package/dist/src/lib/google-client-secret-status.js.map +1 -0
  55. package/dist/src/lib/log-inspection.d.ts +1 -6
  56. package/dist/src/lib/log-inspection.js +5 -7
  57. package/dist/src/lib/log-inspection.js.map +1 -1
  58. package/dist/src/lib/migration-nag.d.ts +2 -2
  59. package/dist/src/lib/migration-nag.js +4 -3
  60. package/dist/src/lib/migration-nag.js.map +1 -1
  61. package/dist/src/lib/paginate.d.ts +8 -24
  62. package/dist/src/lib/paginate.js +8 -21
  63. package/dist/src/lib/paginate.js.map +1 -1
  64. package/dist/src/lib/sync-dir-selector.d.ts +1 -1
  65. package/dist/src/lib/sync-dir-selector.js +1 -1
  66. package/dist/src/lib/toml-database-config.js +2 -2
  67. package/dist/src/lib/toml-database-config.js.map +1 -1
  68. package/dist/src/lib/workflow-field-descriptor.d.ts +91 -0
  69. package/dist/src/lib/workflow-field-descriptor.js +153 -0
  70. package/dist/src/lib/workflow-field-descriptor.js.map +1 -0
  71. package/package.json +2 -2
@@ -94,7 +94,8 @@ export function writableFieldNames(table, mode) {
94
94
  * The field names the server PERSISTS for this table in `mode`: the writable
95
95
  * fields, plus the `deprecated` classifications — "still writable, superseded
96
96
  * by another field" is what that kind means (`types.ts`), so a superseded key
97
- * a handler still honors (`accessPolicy`, `passkeyRpId`) belongs in every
97
+ * a handler still honors (`passkeyRpId`, or a flat chat key such as
98
+ * `systemPrompt` under `[[configs]]`, #3626) belongs in every
98
99
  * accepted set, and a field that is NOT writable belongs in none of them.
99
100
  *
100
101
  * Stated once here because three consumers need the same answer: the generated
@@ -2265,6 +2266,23 @@ export function unknownRequestKeysMessage(keys) {
2265
2266
  `${keys.join(", ")}. This endpoint rejects keys it does not accept rather ` +
2266
2267
  "than ignoring them.");
2267
2268
  }
2269
+ // #3997 — the three type configs author their rule-set reference by name
2270
+ // (#2644): an id names a row in one app and resolves to nothing in another, so
2271
+ // a copied file failed instead of resolving. One sentence serves all three
2272
+ // tables. The `request` half is never surfaced: `ruleSetId` is the live body key
2273
+ // on all three routes, and both `rememberRetiredKeys` (`request-schema.ts`) and
2274
+ // the admin API's unknown-key path skip a key the schema accepts. It exists
2275
+ // because the interface requires both halves.
2276
+ const RULE_SET_ID_RETIRED = {
2277
+ toml: "`ruleSetId` is no longer authored in TOML (#3997). A rule-set id names " +
2278
+ "a row in one app and resolves to nothing in another, so the reference " +
2279
+ 'is authored by name: replace this line with `ruleSetName = "<name>"`, ' +
2280
+ "where the name is the `name` the rule set's own `rule-sets/<key>.toml` " +
2281
+ "declares, and push again. A file pulled since #2644 already spells it " +
2282
+ "that way.",
2283
+ request: "`ruleSetId` is the live request key on this surface; only its TOML " +
2284
+ "spelling is retired (#3997). Send the rule set's id.",
2285
+ };
2268
2286
  export const RETIRED_CONFIG_KEYS = {
2269
2287
  // #2891 — the app-settings auth surface was reshaped so that `app.toml` can
2270
2288
  // state what the server holds. All five keys below stay DECLARED in
@@ -2346,6 +2364,27 @@ export const RETIRED_CONFIG_KEYS = {
2346
2364
  "send `emailSignInEnabled`.",
2347
2365
  },
2348
2366
  },
2367
+ // #3996 — a bucket's access is `preset` (#1020). The old spelling stayed
2368
+ // accepted as an alias, which left two vocabularies for one decision —
2369
+ // `owner-only` still read as "the uploader", the bug #1020 fixed — and an
2370
+ // echo whose value depended on the row's age. A file or body that still
2371
+ // carries it is refused rather than mapped, so the author meets the new
2372
+ // vocabulary once. The model attribute stays declared: a pre-#1020 row
2373
+ // still resolves to its preset (`resolveBucketPreset`).
2374
+ bucket: {
2375
+ accessPolicy: {
2376
+ toml: "`accessPolicy` is no longer authored in TOML (#3996): a bucket's " +
2377
+ "access is `preset`. Map the value — `public-read` → `public`, " +
2378
+ "`authenticated` → `authenticated`, `owner-only` → `admin-only` (it " +
2379
+ "always meant app admins; `personal-uploads` is the per-uploader " +
2380
+ "preset). Replace the line and push again, or `config pull` rewrites " +
2381
+ "the file.",
2382
+ request: "`accessPolicy` is retired (#3996): send `preset`. `public-read` → " +
2383
+ "`public`, `authenticated` → `authenticated`, `owner-only` → " +
2384
+ "`admin-only` (app admins; `personal-uploads` is the per-uploader " +
2385
+ "preset).",
2386
+ },
2387
+ },
2349
2388
  // #2645 — pausing moved off `state` onto its own field, so `state` stopped
2350
2389
  // being author-writable rather than becoming a second way to say "paused".
2351
2390
  // Every pre-#2645 pull wrote the line, so existing repos hit this on their
@@ -2381,6 +2420,12 @@ export const RETIRED_CONFIG_KEYS = {
2381
2420
  "`primitive cron-triggers archive` to retire the trigger (#2907).",
2382
2421
  },
2383
2422
  },
2423
+ // #3997 — keyed by each table's TOML prefix. Only `database-type-config`
2424
+ // uses `[type]`, so that entry cannot reach another surface; the blob
2425
+ // bucket's `[bucket] ruleSetId` is its live key and is not listed.
2426
+ type: { ruleSetId: RULE_SET_ID_RETIRED },
2427
+ groupTypeConfig: { ruleSetId: RULE_SET_ID_RETIRED },
2428
+ collectionTypeConfig: { ruleSetId: RULE_SET_ID_RETIRED },
2384
2429
  // #2803 — the OBJECT-level availability leaves TOML. The per-version
2385
2430
  // `[[configs]] status` (`active | archived`) is a different question — which
2386
2431
  // named config is retired — and stays authorable.
@@ -2396,6 +2441,26 @@ export const RETIRED_CONFIG_KEYS = {
2396
2441
  "`primitive prompts archive` to retire the prompt (#2907).",
2397
2442
  },
2398
2443
  },
2444
+ // #3999 — the prompt `[[configs]]` table (its TOML path is `configs`; no
2445
+ // other field table has that path — the workflow file's `[[configs]]` is a
2446
+ // document key with its own retired list). The live-config marker has one
2447
+ // spelling since #2645, `active`. The legacy `isActive` is refused rather
2448
+ // than ignored: a file whose only marker it is would otherwise push without
2449
+ // activating anything and leave a different config live.
2450
+ configs: {
2451
+ isActive: {
2452
+ toml: "`isActive` is no longer accepted on a `[[configs]]` entry (#3999). " +
2453
+ "The live-config marker has one spelling since #2645: write " +
2454
+ "`active = true` on exactly one entry (pull writes it there), delete " +
2455
+ "the `isActive` line and push again. The line is refused rather than " +
2456
+ "ignored because a file that still carries it would otherwise leave a " +
2457
+ "different config live.",
2458
+ request: "`isActive` is not a config-body key (#3999). Which config a prompt " +
2459
+ "runs is set through " +
2460
+ "`POST …/prompts/{promptId}/configs/{configId}/activate`; omit the " +
2461
+ "field.",
2462
+ },
2463
+ },
2399
2464
  integration: {
2400
2465
  status: {
2401
2466
  toml: "`status` is no longer authored in TOML (#2803), and `draft` no longer " +
@@ -2477,6 +2542,47 @@ export const RETIRED_CONFIG_KEYS = {
2477
2542
  "Omit the field.",
2478
2543
  },
2479
2544
  },
2545
+ // #3998 — a test-case sidecar names what it pins: the configuration it runs
2546
+ // under and its judge prompt, by name, so the file means the same thing in
2547
+ // every app. The id spellings were deprecated TOML-only keys that won over
2548
+ // the name, and — unlike every other retired key — `config pull` still WROTE
2549
+ // them whenever its id→name lookup missed, so the spelling kept being
2550
+ // generated. Pull now reports such a case instead of writing an id.
2551
+ //
2552
+ // The three stay the stored references the admin API accepts on create and
2553
+ // update, so the `request` wording below is never shown: `rememberRetiredKeys`
2554
+ // and the admin API's unknown-key check both skip a key the wire accepts. It
2555
+ // is here because the entry's shape requires it.
2556
+ test: {
2557
+ configId: {
2558
+ toml: "`configId` is no longer authored in TOML (#3998): a test case names " +
2559
+ "the configuration it runs under, so the file means the same thing in " +
2560
+ "every app. Replace the line with `configName = \"…\"` (a " +
2561
+ "`[[configs]]` name of the block this sidecar belongs to), or delete it " +
2562
+ "to run the active configuration, and push again.",
2563
+ request: "`configId` is the stored configuration reference; only its TOML " +
2564
+ "spelling is retired (#3998). Sidecars author it as `configName`.",
2565
+ },
2566
+ evaluatorPromptId: {
2567
+ toml: "`evaluatorPromptId` is no longer authored in TOML (#3998): a test " +
2568
+ "case names its judge prompt, so the file means the same thing in " +
2569
+ "every app. Replace the line with `evaluatorPromptKey = \"…\"` (the " +
2570
+ "judge prompt's key) and push again.",
2571
+ request: "`evaluatorPromptId` is the stored judge-prompt reference; only its " +
2572
+ "TOML spelling is retired (#3998). Sidecars author it as " +
2573
+ "`evaluatorPromptKey`.",
2574
+ },
2575
+ evaluatorConfigId: {
2576
+ toml: "`evaluatorConfigId` is no longer authored in TOML (#3998): a test " +
2577
+ "case names its judge's configuration, so the file means the same " +
2578
+ "thing in every app. Replace the line with " +
2579
+ "`evaluatorConfigName = \"…\"` (a `[[configs]]` name of the prompt " +
2580
+ "`evaluatorPromptKey` names) and push again.",
2581
+ request: "`evaluatorConfigId` is the stored judge-configuration reference; only " +
2582
+ "its TOML spelling is retired (#3998). Sidecars author it as " +
2583
+ "`evaluatorConfigName`.",
2584
+ },
2585
+ },
2480
2586
  // #2803 — availability is one server-owned `status`. As a TOML key it made
2481
2587
  // `config push` a second writer: pushing a file pulled before an operator ran
2482
2588
  // `workflows disable` put the workflow back in service as a side effect.
@@ -5365,7 +5471,8 @@ export function resolveDecisionsRunQuestions(questions, runCriteria) {
5365
5471
  }
5366
5472
  /**
5367
5473
  * Move the deprecated flat chat keys of one `[[configs]]` entry under `chat`
5368
- * — #3626 §4, the blob-bucket `accessPolicy` precedent made reusable.
5474
+ * — #3626 §4, the deprecated-TOML-key pattern blob buckets used until #3996
5475
+ * retired theirs, made reusable.
5369
5476
  *
5370
5477
  * Push keeps accepting the nine keys flat so no existing file breaks, and pull
5371
5478
  * rewrites them, so one pull-then-push migrates a file. A key present in BOTH
@@ -6829,7 +6936,8 @@ const SHARED_WITH_AGENT = ["chat", "agent"];
6829
6936
  /**
6830
6937
  * #3626 §4 — the nine chat keys, still accepted FLAT under `[[configs]]`.
6831
6938
  *
6832
- * The blob-bucket `accessPolicy` precedent: declared `deprecated`, so
6939
+ * The deprecated-TOML-key pattern blob buckets used until #3996 retired
6940
+ * theirs: declared `deprecated`, so
6833
6941
  * `config push` keeps taking a file written before the `[configs.chat]` block
6834
6942
  * existed, while `config pull` never writes the spelling again. One
6835
6943
  * pull-then-push migrates a file. `hoistDeprecatedChatKeys` moves them into the
@@ -7335,20 +7443,13 @@ export const PROMPT_SURFACE = {
7335
7443
  // carry `active = true`; pull writes it on the active entry and push
7336
7444
  // honors it on create AND update by calling the activate endpoint
7337
7445
  // (activatePromptConfig). It is a control, never a key in the config
7338
- // body.
7446
+ // body. It has one spelling (#3999, `retired-keys.ts`).
7339
7447
  active: {
7340
7448
  kind: "structural",
7341
7449
  note: "Which config the prompt runs (#2645). Pull writes it on the " +
7342
7450
  "active entry; push enacts it through the activate endpoint " +
7343
7451
  "(activatePromptConfig), never as a config-body key.",
7344
7452
  },
7345
- isActive: {
7346
- kind: "structural",
7347
- note: "Legacy spelling of `active` — the create leg read it before pull " +
7348
- "ever wrote a marker. Declared here so the unrecognized-key " +
7349
- "rejection does not fail a file that has always used it; pull " +
7350
- "never writes it.",
7351
- },
7352
7453
  // #3626 §4 — the nine chat keys in their pre-kind FLAT spelling.
7353
7454
  ...DEPRECATED_FLAT_CHAT_KEYS,
7354
7455
  },
@@ -8178,8 +8279,9 @@ export const CRON_TRIGGER_SURFACE = {
8178
8279
  *
8179
8280
  * `ttlTier` is `writableOn: ["create"]`: the update handler does not read it, so
8180
8281
  * the retention tier is fixed at creation. `preset` and `ruleSetId` are the two
8181
- * halves of the access model (#1020) — at most one may change per request, which
8182
- * is the controller's rule and stays there.
8282
+ * halves of the access model (#1020), and the only access keys: at most one may
8283
+ * change per request, which is the controller's rule and stays there. The
8284
+ * pre-#1020 `accessPolicy` spelling is a retired key (#3996, `retired-keys.ts`).
8183
8285
  */
8184
8286
  const BLOB_BUCKET_HANDLER = "src/app-api/controllers/blob-buckets-controller.ts";
8185
8287
  export const BLOB_BUCKET_SURFACE = {
@@ -8258,11 +8360,11 @@ export const BLOB_BUCKET_SURFACE = {
8258
8360
  "TOML spelling is declared in tomlOnlyKeys as `key`.",
8259
8361
  },
8260
8362
  accessPolicy: {
8261
- kind: "deprecated",
8262
- note: "#1020 — the legacy access field, superseded by `preset`. Still " +
8263
- "accepted on the wire and returned as a read alias, but authors " +
8264
- "write `preset`, so pull does not emit it (writing both would " +
8265
- "author the same decision twice).",
8363
+ kind: "server-owned",
8364
+ note: "RETIRED from the write surface by #3996, superseded by `preset` " +
8365
+ "(#1020). The attribute stays declared so `resolveBucketPreset` " +
8366
+ "can read a pre-#1020 row; no write path accepts it and no " +
8367
+ "serializer emits it.",
8266
8368
  },
8267
8369
  createdBy: {
8268
8370
  kind: "server-owned",
@@ -8283,12 +8385,6 @@ export const BLOB_BUCKET_SURFACE = {
8283
8385
  note: "The bucket key. `config pull` writes it for readability; push takes " +
8284
8386
  "the identity from the file name and attaches `bucketKey` itself.",
8285
8387
  },
8286
- accessPolicy: {
8287
- kind: "deprecated",
8288
- note: "Accepted in existing files as the pre-#1020 spelling of `preset` " +
8289
- "and forwarded on push, so an unmigrated file still pushes. Pull " +
8290
- "writes `preset`.",
8291
- },
8292
8388
  },
8293
8389
  responseOnlyKeys: {},
8294
8390
  },
@@ -8517,7 +8613,8 @@ export const DATABASE_TYPE_SURFACE = {
8517
8613
  emit: "always",
8518
8614
  writableOn: BOTH,
8519
8615
  // Authored as a portable name and sent as an id; the server checks
8520
- // the set exists and has `resourceType: "database"`.
8616
+ // the set exists and has `resourceType: "database"`. The id
8617
+ // spelling is retired in TOML (#3997): `retired-keys.ts`, `type`.
8521
8618
  validation: handledBy(DB_TYPE_HANDLER, "DatabaseTypeConfigController", "apply"),
8522
8619
  },
8523
8620
  {
@@ -8604,11 +8701,6 @@ export const DATABASE_TYPE_SURFACE = {
8604
8701
  },
8605
8702
  },
8606
8703
  tomlOnlyKeys: {
8607
- ruleSetId: {
8608
- kind: "deprecated",
8609
- note: "The legacy id-based rule-set reference. Still accepted on push " +
8610
- "so an unmigrated file pushes unchanged; pull writes `ruleSetName`.",
8611
- },
8612
8704
  metadataAccess: {
8613
8705
  kind: "deprecated",
8614
8706
  note: "The legacy spelling of `celContextAccess`. Read on push when the " +
@@ -8785,8 +8877,8 @@ export const RULE_SET_SURFACE = {
8785
8877
  * `ruleSetName`, because a name is portable across apps and an id is not. The
8786
8878
  * name → id resolution is the CLI's (`config push` resolves against the app's
8787
8879
  * rule sets); the server validates that the id exists and has
8788
- * `resourceType: "group"`. The legacy id spelling stays accepted on push and is
8789
- * declared in `tomlOnlyKeys`.
8880
+ * `resourceType: "group"`. The id spelling is refused on push (#3997), with
8881
+ * the guidance in `retired-keys.ts`.
8790
8882
  */
8791
8883
  const GROUP_TYPE_HANDLER = "src/app-api/controllers/group-type-config-controller.ts";
8792
8884
  export const GROUP_TYPE_CONFIG_SURFACE = {
@@ -8815,7 +8907,9 @@ export const GROUP_TYPE_CONFIG_SURFACE = {
8815
8907
  emit: "always",
8816
8908
  writableOn: BOTH,
8817
8909
  // Authored as a name, sent as an id; existence and resourceType are
8818
- // checked server-side, and an empty value clears the reference.
8910
+ // checked server-side, and an empty value clears the reference. The
8911
+ // id spelling is retired in TOML (#3997): `retired-keys.ts`,
8912
+ // `groupTypeConfig`.
8819
8913
  validation: handledBy(GROUP_TYPE_HANDLER, "GroupTypeConfigController", "apply"),
8820
8914
  },
8821
8915
  {
@@ -8855,13 +8949,7 @@ export const GROUP_TYPE_CONFIG_SURFACE = {
8855
8949
  note: "User who created the config; assigned server-side.",
8856
8950
  },
8857
8951
  },
8858
- tomlOnlyKeys: {
8859
- ruleSetId: {
8860
- kind: "deprecated",
8861
- note: "The legacy id-based rule-set reference. Still accepted on push " +
8862
- "so an unmigrated file pushes unchanged; pull writes `ruleSetName`.",
8863
- },
8864
- },
8952
+ tomlOnlyKeys: {},
8865
8953
  responseOnlyKeys: {},
8866
8954
  },
8867
8955
  ],
@@ -8908,7 +8996,9 @@ export const COLLECTION_TYPE_CONFIG_SURFACE = {
8908
8996
  emit: "always",
8909
8997
  writableOn: BOTH,
8910
8998
  // Authored as a name, sent as an id; existence and resourceType are
8911
- // checked server-side, and an empty value clears the reference.
8999
+ // checked server-side, and an empty value clears the reference. The
9000
+ // id spelling is retired in TOML (#3997): `retired-keys.ts`,
9001
+ // `collectionTypeConfig`.
8912
9002
  validation: handledBy(COLLECTION_TYPE_HANDLER, "CollectionTypeConfigController", "apply"),
8913
9003
  },
8914
9004
  ],
@@ -8938,13 +9028,7 @@ export const COLLECTION_TYPE_CONFIG_SURFACE = {
8938
9028
  note: "User who created the config; assigned server-side.",
8939
9029
  },
8940
9030
  },
8941
- tomlOnlyKeys: {
8942
- ruleSetId: {
8943
- kind: "deprecated",
8944
- note: "The legacy id-based rule-set reference. Still accepted on push " +
8945
- "so an unmigrated file pushes unchanged; pull writes `ruleSetName`.",
8946
- },
8947
- },
9031
+ tomlOnlyKeys: {},
8948
9032
  responseOnlyKeys: {},
8949
9033
  },
8950
9034
  ],
@@ -9528,11 +9612,13 @@ export const SERVER_FUNCTION_SURFACE = {
9528
9612
  * which is exactly why the spec names them explicitly: nothing that syncs sits
9529
9613
  * outside the registry.
9530
9614
  *
9531
- * Three fields are stored as ids and AUTHORED as keys — `configId` /
9615
+ * Three fields are stored as ids and AUTHORED as names — `configId` /
9532
9616
  * `evaluatorPromptId` / `evaluatorConfigId` become `configName` /
9533
9617
  * `evaluatorPromptKey` / `evaluatorConfigName` — so a test file is portable
9534
- * across apps. The legacy id spellings stay accepted on push and are declared
9535
- * in `tomlOnlyKeys`.
9618
+ * across apps. The id spellings are retired from the TOML surface (#3998):
9619
+ * `config push` refuses a sidecar that still carries one, with the guidance in
9620
+ * `retired-keys.ts`, and `config pull` reports a reference it cannot resolve
9621
+ * rather than writing an id. On the wire the three stay ids.
9536
9622
  *
9537
9623
  * Three more are stored as JSON strings and carried in TOML as JSON strings
9538
9624
  * (`inputVariables`, `expectedOutputContains`, `expectedJsonSubset`) while the
@@ -9709,23 +9795,7 @@ export const TEST_CASE_SURFACE = {
9709
9795
  note: "Timestamp, assigned server-side.",
9710
9796
  },
9711
9797
  },
9712
- tomlOnlyKeys: {
9713
- configId: {
9714
- kind: "deprecated",
9715
- note: "The legacy id-based config reference. Still accepted on push so " +
9716
- "an unmigrated file pushes unchanged; pull writes `configName`.",
9717
- },
9718
- evaluatorPromptId: {
9719
- kind: "deprecated",
9720
- note: "The legacy id-based evaluator-prompt reference; pull writes " +
9721
- "`evaluatorPromptKey`.",
9722
- },
9723
- evaluatorConfigId: {
9724
- kind: "deprecated",
9725
- note: "The legacy id-based evaluator-config reference; pull writes " +
9726
- "`evaluatorConfigName`.",
9727
- },
9728
- },
9798
+ tomlOnlyKeys: {},
9729
9799
  responseOnlyKeys: {},
9730
9800
  },
9731
9801
  ],