@slatesvideo/shared 0.7.0 → 0.7.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.
@@ -628,7 +628,7 @@ declare const exportCutsInput: z.ZodObject<{
628
628
  projectId: string;
629
629
  directory: string;
630
630
  manifestId: string;
631
- action?: "start" | "status" | "cancel" | undefined;
631
+ action?: "status" | "start" | "cancel" | undefined;
632
632
  items?: {
633
633
  timelineId: string;
634
634
  format: "mp4" | "xml";
@@ -637,7 +637,7 @@ declare const exportCutsInput: z.ZodObject<{
637
637
  projectId: string;
638
638
  directory: string;
639
639
  manifestId: string;
640
- action?: "start" | "status" | "cancel" | undefined;
640
+ action?: "status" | "start" | "cancel" | undefined;
641
641
  items?: {
642
642
  timelineId: string;
643
643
  format: "mp4" | "xml";
@@ -1036,13 +1036,13 @@ declare const variationSchema: z.ZodObject<{
1036
1036
  to: z.ZodString;
1037
1037
  voice: z.ZodEnum<["keep", "replace"]>;
1038
1038
  }, "strip", z.ZodTypeAny, {
1039
+ voice: "replace" | "keep";
1039
1040
  from: string;
1040
1041
  to: string;
1041
- voice: "keep" | "replace";
1042
1042
  }, {
1043
+ voice: "replace" | "keep";
1043
1044
  from: string;
1044
1045
  to: string;
1045
- voice: "keep" | "replace";
1046
1046
  }>, "many">>;
1047
1047
  assetOverrides: z.ZodOptional<z.ZodArray<z.ZodObject<{
1048
1048
  from: z.ZodString;
@@ -1056,9 +1056,9 @@ declare const variationSchema: z.ZodObject<{
1056
1056
  }>, "many">>;
1057
1057
  idempotencyKey: z.ZodOptional<z.ZodString>;
1058
1058
  }, "strip", z.ZodTypeAny, {
1059
+ name: string;
1059
1060
  storyboardId: string;
1060
1061
  expectedRevision: number;
1061
- name: string;
1062
1062
  choices: {
1063
1063
  sectionId: string;
1064
1064
  alternativeId: string;
@@ -1068,9 +1068,9 @@ declare const variationSchema: z.ZodObject<{
1068
1068
  alternativeId: string;
1069
1069
  }[] | undefined;
1070
1070
  itemOverrides?: {
1071
+ voice: "replace" | "keep";
1071
1072
  from: string;
1072
1073
  to: string;
1073
- voice: "keep" | "replace";
1074
1074
  }[] | undefined;
1075
1075
  assetOverrides?: {
1076
1076
  from: string;
@@ -1078,9 +1078,9 @@ declare const variationSchema: z.ZodObject<{
1078
1078
  }[] | undefined;
1079
1079
  idempotencyKey?: string | undefined;
1080
1080
  }, {
1081
+ name: string;
1081
1082
  storyboardId: string;
1082
1083
  expectedRevision: number;
1083
- name: string;
1084
1084
  choices: {
1085
1085
  sectionId: string;
1086
1086
  alternativeId: string;
@@ -1090,9 +1090,9 @@ declare const variationSchema: z.ZodObject<{
1090
1090
  alternativeId: string;
1091
1091
  }[] | undefined;
1092
1092
  itemOverrides?: {
1093
+ voice: "replace" | "keep";
1093
1094
  from: string;
1094
1095
  to: string;
1095
- voice: "keep" | "replace";
1096
1096
  }[] | undefined;
1097
1097
  assetOverrides?: {
1098
1098
  from: string;
@@ -1132,12 +1132,12 @@ declare const sectionInput: z.ZodObject<{
1132
1132
  expectedRevision: z.ZodNumber;
1133
1133
  }, "strip", z.ZodTypeAny, {
1134
1134
  at: number;
1135
- expectedRevision: number;
1136
1135
  sceneId: string;
1136
+ expectedRevision: number;
1137
1137
  }, {
1138
1138
  at: number;
1139
- expectedRevision: number;
1140
1139
  sceneId: string;
1140
+ expectedRevision: number;
1141
1141
  }>>;
1142
1142
  uses: z.ZodOptional<z.ZodArray<z.ZodObject<{
1143
1143
  sectionId: z.ZodString;
@@ -1154,59 +1154,59 @@ declare const sectionInput: z.ZodObject<{
1154
1154
  start: z.ZodNumber;
1155
1155
  end: z.ZodNumber;
1156
1156
  }, "strip", z.ZodTypeAny, {
1157
- start: number;
1158
- sceneId: string;
1159
1157
  end: number;
1160
- }, {
1161
- start: number;
1162
1158
  sceneId: string;
1159
+ start: number;
1160
+ }, {
1163
1161
  end: number;
1162
+ sceneId: string;
1163
+ start: number;
1164
1164
  }>, "many">>;
1165
1165
  }, "strip", z.ZodTypeAny, {
1166
- action: "create" | "alternative" | "choose" | "save" | "reuse" | "updateUses" | "rename" | "archive" | "tags";
1166
+ action: "tags" | "create" | "rename" | "alternative" | "choose" | "save" | "reuse" | "updateUses" | "archive";
1167
1167
  storyboardId: string;
1168
1168
  expectedRevision: number;
1169
- sectionId?: string | undefined;
1170
- alternativeId?: string | undefined;
1171
- tags?: string[] | undefined;
1172
- parentId?: string | undefined;
1173
1169
  label?: string | undefined;
1174
1170
  target?: {
1175
1171
  at: number;
1176
- expectedRevision: number;
1177
1172
  sceneId: string;
1173
+ expectedRevision: number;
1178
1174
  } | undefined;
1175
+ tags?: string[] | undefined;
1176
+ sectionId?: string | undefined;
1177
+ alternativeId?: string | undefined;
1178
+ parentId?: string | undefined;
1179
1179
  uses?: {
1180
1180
  expectedRevision: number;
1181
1181
  sectionId: string;
1182
1182
  }[] | undefined;
1183
1183
  fragments?: {
1184
- start: number;
1185
- sceneId: string;
1186
1184
  end: number;
1185
+ sceneId: string;
1186
+ start: number;
1187
1187
  }[] | undefined;
1188
1188
  }, {
1189
- action: "create" | "alternative" | "choose" | "save" | "reuse" | "updateUses" | "rename" | "archive" | "tags";
1189
+ action: "tags" | "create" | "rename" | "alternative" | "choose" | "save" | "reuse" | "updateUses" | "archive";
1190
1190
  storyboardId: string;
1191
1191
  expectedRevision: number;
1192
- sectionId?: string | undefined;
1193
- alternativeId?: string | undefined;
1194
- tags?: string[] | undefined;
1195
- parentId?: string | undefined;
1196
1192
  label?: string | undefined;
1197
1193
  target?: {
1198
1194
  at: number;
1199
- expectedRevision: number;
1200
1195
  sceneId: string;
1196
+ expectedRevision: number;
1201
1197
  } | undefined;
1198
+ tags?: string[] | undefined;
1199
+ sectionId?: string | undefined;
1200
+ alternativeId?: string | undefined;
1201
+ parentId?: string | undefined;
1202
1202
  uses?: {
1203
1203
  expectedRevision: number;
1204
1204
  sectionId: string;
1205
1205
  }[] | undefined;
1206
1206
  fragments?: {
1207
- start: number;
1208
- sceneId: string;
1209
1207
  end: number;
1208
+ sceneId: string;
1209
+ start: number;
1210
1210
  }[] | undefined;
1211
1211
  }>;
1212
1212
  export declare const changeScriptSection: Operation<z.infer<typeof sectionInput>>;
@@ -1225,16 +1225,16 @@ declare const suggestionInput: z.ZodObject<{
1225
1225
  replacement: z.ZodString;
1226
1226
  note: z.ZodOptional<z.ZodString>;
1227
1227
  }, "strip", z.ZodTypeAny, {
1228
- start: number;
1229
- sceneId: string;
1230
1228
  end: number;
1229
+ sceneId: string;
1230
+ start: number;
1231
1231
  original: string;
1232
1232
  replacement: string;
1233
1233
  note?: string | undefined;
1234
1234
  }, {
1235
- start: number;
1236
- sceneId: string;
1237
1235
  end: number;
1236
+ sceneId: string;
1237
+ start: number;
1238
1238
  original: string;
1239
1239
  replacement: string;
1240
1240
  note?: string | undefined;
@@ -1245,9 +1245,9 @@ declare const suggestionInput: z.ZodObject<{
1245
1245
  storyboardId: string;
1246
1246
  expectedRevision: number;
1247
1247
  suggestions?: {
1248
- start: number;
1249
- sceneId: string;
1250
1248
  end: number;
1249
+ sceneId: string;
1250
+ start: number;
1251
1251
  original: string;
1252
1252
  replacement: string;
1253
1253
  note?: string | undefined;
@@ -1258,9 +1258,9 @@ declare const suggestionInput: z.ZodObject<{
1258
1258
  storyboardId: string;
1259
1259
  expectedRevision: number;
1260
1260
  suggestions?: {
1261
- start: number;
1262
- sceneId: string;
1263
1261
  end: number;
1262
+ sceneId: string;
1263
+ start: number;
1264
1264
  original: string;
1265
1265
  replacement: string;
1266
1266
  note?: string | undefined;
@@ -1281,14 +1281,14 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1281
1281
  text: z.ZodString;
1282
1282
  }, "strip", z.ZodTypeAny, {
1283
1283
  at: number;
1284
+ text: string;
1284
1285
  sceneId: string;
1285
1286
  removed: number;
1286
- text: string;
1287
1287
  }, {
1288
1288
  at: number;
1289
+ text: string;
1289
1290
  sceneId: string;
1290
1291
  removed: number;
1291
- text: string;
1292
1292
  }>, "many">;
1293
1293
  structures: z.ZodOptional<z.ZodArray<z.ZodObject<{
1294
1294
  sceneId: z.ZodString;
@@ -1304,68 +1304,68 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1304
1304
  end: z.ZodNumber;
1305
1305
  type: z.ZodEnum<["strong", "em"]>;
1306
1306
  }, "strip", z.ZodTypeAny, {
1307
- start: number;
1308
- type: "strong" | "em";
1309
1307
  end: number;
1310
- }, {
1311
- start: number;
1312
1308
  type: "strong" | "em";
1309
+ start: number;
1310
+ }, {
1313
1311
  end: number;
1312
+ type: "strong" | "em";
1313
+ start: number;
1314
1314
  }>, "many">;
1315
1315
  }, "strip", z.ZodTypeAny, {
1316
- start: number;
1317
1316
  end: number;
1318
1317
  id: string;
1319
1318
  kind: "paragraph" | "heading" | "direction";
1319
+ start: number;
1320
1320
  marks: {
1321
- start: number;
1322
- type: "strong" | "em";
1323
1321
  end: number;
1322
+ type: "strong" | "em";
1323
+ start: number;
1324
1324
  }[];
1325
1325
  label?: string | undefined;
1326
- level?: 3 | 2 | undefined;
1326
+ level?: 2 | 3 | undefined;
1327
1327
  }, {
1328
- start: number;
1329
1328
  end: number;
1330
1329
  id: string;
1331
1330
  kind: "paragraph" | "heading" | "direction";
1331
+ start: number;
1332
1332
  marks: {
1333
- start: number;
1334
- type: "strong" | "em";
1335
1333
  end: number;
1334
+ type: "strong" | "em";
1335
+ start: number;
1336
1336
  }[];
1337
1337
  label?: string | undefined;
1338
- level?: 3 | 2 | undefined;
1338
+ level?: 2 | 3 | undefined;
1339
1339
  }>, "many">;
1340
1340
  }, "strip", z.ZodTypeAny, {
1341
1341
  sceneId: string;
1342
1342
  blocks: {
1343
- start: number;
1344
1343
  end: number;
1345
1344
  id: string;
1346
1345
  kind: "paragraph" | "heading" | "direction";
1346
+ start: number;
1347
1347
  marks: {
1348
- start: number;
1349
- type: "strong" | "em";
1350
1348
  end: number;
1349
+ type: "strong" | "em";
1350
+ start: number;
1351
1351
  }[];
1352
1352
  label?: string | undefined;
1353
- level?: 3 | 2 | undefined;
1353
+ level?: 2 | 3 | undefined;
1354
1354
  }[];
1355
1355
  }, {
1356
1356
  sceneId: string;
1357
1357
  blocks: {
1358
- start: number;
1359
1358
  end: number;
1360
1359
  id: string;
1361
1360
  kind: "paragraph" | "heading" | "direction";
1361
+ start: number;
1362
1362
  marks: {
1363
- start: number;
1364
- type: "strong" | "em";
1365
1363
  end: number;
1364
+ type: "strong" | "em";
1365
+ start: number;
1366
1366
  }[];
1367
1367
  label?: string | undefined;
1368
- level?: 3 | 2 | undefined;
1368
+ level?: 2 | 3 | undefined;
1369
1369
  }[];
1370
1370
  }>, "many">>;
1371
1371
  move: z.ZodOptional<z.ZodObject<{
@@ -1387,14 +1387,14 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1387
1387
  end: z.ZodNumber;
1388
1388
  waitingShotId: z.ZodOptional<z.ZodString>;
1389
1389
  }, "strip", z.ZodTypeAny, {
1390
- start: number;
1391
- sceneId: string;
1392
1390
  end: number;
1391
+ sceneId: string;
1392
+ start: number;
1393
1393
  waitingShotId?: string | undefined;
1394
1394
  }, {
1395
- start: number;
1396
- sceneId: string;
1397
1395
  end: number;
1396
+ sceneId: string;
1397
+ start: number;
1398
1398
  waitingShotId?: string | undefined;
1399
1399
  }>, "many">>;
1400
1400
  restoreRevision: z.ZodOptional<z.ZodNumber>;
@@ -1405,45 +1405,45 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1405
1405
  at: z.ZodNumber;
1406
1406
  }, "strip", z.ZodTypeAny, {
1407
1407
  at: number;
1408
- sceneId: string;
1409
1408
  kind: "split";
1409
+ sceneId: string;
1410
1410
  }, {
1411
1411
  at: number;
1412
- sceneId: string;
1413
1412
  kind: "split";
1413
+ sceneId: string;
1414
1414
  }>, z.ZodObject<{
1415
1415
  kind: z.ZodLiteral<"merge">;
1416
1416
  sceneId: z.ZodString;
1417
1417
  }, "strip", z.ZodTypeAny, {
1418
- sceneId: string;
1419
1418
  kind: "merge";
1420
- }, {
1421
1419
  sceneId: string;
1420
+ }, {
1422
1421
  kind: "merge";
1422
+ sceneId: string;
1423
1423
  }>]>>;
1424
1424
  }, "strip", z.ZodTypeAny, {
1425
1425
  storyboardId: string;
1426
1426
  expectedRevision: number;
1427
1427
  edits: {
1428
1428
  at: number;
1429
+ text: string;
1429
1430
  sceneId: string;
1430
1431
  removed: number;
1431
- text: string;
1432
1432
  }[];
1433
1433
  structures?: {
1434
1434
  sceneId: string;
1435
1435
  blocks: {
1436
- start: number;
1437
1436
  end: number;
1438
1437
  id: string;
1439
1438
  kind: "paragraph" | "heading" | "direction";
1439
+ start: number;
1440
1440
  marks: {
1441
- start: number;
1442
- type: "strong" | "em";
1443
1441
  end: number;
1442
+ type: "strong" | "em";
1443
+ start: number;
1444
1444
  }[];
1445
1445
  label?: string | undefined;
1446
- level?: 3 | 2 | undefined;
1446
+ level?: 2 | 3 | undefined;
1447
1447
  }[];
1448
1448
  }[] | undefined;
1449
1449
  move?: {
@@ -1452,44 +1452,44 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1452
1452
  delta: 1 | -1;
1453
1453
  } | undefined;
1454
1454
  makeShots?: {
1455
- start: number;
1456
- sceneId: string;
1457
1455
  end: number;
1456
+ sceneId: string;
1457
+ start: number;
1458
1458
  waitingShotId?: string | undefined;
1459
1459
  }[] | undefined;
1460
1460
  restoreRevision?: number | undefined;
1461
1461
  ensureScene?: boolean | undefined;
1462
1462
  sceneAction?: {
1463
1463
  at: number;
1464
- sceneId: string;
1465
1464
  kind: "split";
1466
- } | {
1467
1465
  sceneId: string;
1466
+ } | {
1468
1467
  kind: "merge";
1468
+ sceneId: string;
1469
1469
  } | undefined;
1470
1470
  }, {
1471
1471
  storyboardId: string;
1472
1472
  expectedRevision: number;
1473
1473
  edits: {
1474
1474
  at: number;
1475
+ text: string;
1475
1476
  sceneId: string;
1476
1477
  removed: number;
1477
- text: string;
1478
1478
  }[];
1479
1479
  structures?: {
1480
1480
  sceneId: string;
1481
1481
  blocks: {
1482
- start: number;
1483
1482
  end: number;
1484
1483
  id: string;
1485
1484
  kind: "paragraph" | "heading" | "direction";
1485
+ start: number;
1486
1486
  marks: {
1487
- start: number;
1488
- type: "strong" | "em";
1489
1487
  end: number;
1488
+ type: "strong" | "em";
1489
+ start: number;
1490
1490
  }[];
1491
1491
  label?: string | undefined;
1492
- level?: 3 | 2 | undefined;
1492
+ level?: 2 | 3 | undefined;
1493
1493
  }[];
1494
1494
  }[] | undefined;
1495
1495
  move?: {
@@ -1498,20 +1498,20 @@ declare const writeScriptDocumentInput: z.ZodObject<{
1498
1498
  delta: 1 | -1;
1499
1499
  } | undefined;
1500
1500
  makeShots?: {
1501
- start: number;
1502
- sceneId: string;
1503
1501
  end: number;
1502
+ sceneId: string;
1503
+ start: number;
1504
1504
  waitingShotId?: string | undefined;
1505
1505
  }[] | undefined;
1506
1506
  restoreRevision?: number | undefined;
1507
1507
  ensureScene?: boolean | undefined;
1508
1508
  sceneAction?: {
1509
1509
  at: number;
1510
- sceneId: string;
1511
1510
  kind: "split";
1512
- } | {
1513
1511
  sceneId: string;
1512
+ } | {
1514
1513
  kind: "merge";
1514
+ sceneId: string;
1515
1515
  } | undefined;
1516
1516
  }>;
1517
1517
  export declare const writeScriptDocument: Operation<z.infer<typeof writeScriptDocumentInput>>;
@@ -6168,7 +6168,10 @@ export const getPromptingGuide = {
6168
6168
  */
6169
6169
  export const loadTools = {
6170
6170
  id: 'slates_load_tools',
6171
- description: 'Discover and load tools on demand. query searches operation names and descriptions and returns a compact list. names loads up to five exact tools with their schemas. group loads a whole task group. A load replaces the previous optional selection; query alone does not change it. Call the discovered tools by their own names. Groups: ' + Object.entries(GROUP_SUMMARY).map(([g, s]) => `${g}: ${s}`).join('; '),
6171
+ // Worded to be true on both surfaces: the desktop agent must load an
6172
+ // extended tool before calling it, while the MCP server lists every tool, so
6173
+ // "missing from your list" never happens there by default.
6174
+ description: 'Find Slates tools by task. query searches tool names and descriptions and returns a compact list. names returns up to five exact tools with their schemas; group returns a whole task group. Call the tools by their own names. If a tool you need is missing from your tool list, a names or group load adds it; a load replaces the previous optional selection, and query alone does not change it. Groups: ' + Object.entries(GROUP_SUMMARY).map(([g, s]) => `${g}: ${s}`).join('; '),
6172
6175
  input: z.object({
6173
6176
  group: z.enum(['script', 'library', 'timeline', 'admin', 'blender']).optional(),
6174
6177
  query: z.string().min(1).max(160).optional().describe('Search for a task such as generate image, create shot, or edit video.'),
@@ -61,7 +61,8 @@ export declare function toolDefinition(op: SurfaceOp): ToolDefinition;
61
61
  * Render a tool surface.
62
62
  *
63
63
  * `desktop` sends `core` plus whatever groups have been loaded this run; `mcp`
64
- * renders all definitions; the MCP server filters its connection listing from that set.
64
+ * renders all definitions, and the MCP server lists all of them unless started with
65
+ * `--tools=compact`.
65
66
  */
66
67
  export declare function toolDefinitions(ops: readonly SurfaceOp[], opts: {
67
68
  surface: 'desktop' | 'mcp';
@@ -11,9 +11,12 @@
11
11
  //
12
12
  // 2. TIERS. 90 ops is 112 KB of descriptions and JSON schemas on EVERY
13
13
  // desktop Studio Agent turn. `core` is what a session needs to work;
14
- // `extended` is selected through `slates_load_tools`. Both surfaces replace
15
- // the optional selection on a named/group load. MCP keeps every direct
16
- // operation callable for compatibility and notifies when its listing changes.
14
+ // `extended` is selected through `slates_load_tools`. Tiers are a DESKTOP
15
+ // mechanism: we build every turn there, so a load reaches the model. The
16
+ // MCP server lists every op and leaves hiding definitions to the host
17
+ // (tiering there left Claude and Codex users unable to generate in 0.6.0;
18
+ // see the TOOLS comment in packages/mcp/src/server.ts). `--tools=compact`
19
+ // is the opt-in exception.
17
20
  //
18
21
  // 3. ONE SCHEMA RENDERER. The desktop rendered `$refStrategy: 'none'` and
19
22
  // the MCP server rendered `target: 'openApi3'`, so "the two surfaces
@@ -238,7 +241,8 @@ export function toolDefinition(op) {
238
241
  * Render a tool surface.
239
242
  *
240
243
  * `desktop` sends `core` plus whatever groups have been loaded this run; `mcp`
241
- * renders all definitions; the MCP server filters its connection listing from that set.
244
+ * renders all definitions, and the MCP server lists all of them unless started with
245
+ * `--tools=compact`.
242
246
  */
243
247
  export function toolDefinitions(ops, opts) {
244
248
  const loaded = new Set(opts.groups ?? []);
@@ -76,13 +76,34 @@ export function buildSkillIndex() {
76
76
  return entries;
77
77
  }
78
78
  // ── Preamble ───────────────────────────────────────────────────────
79
- const PREAMBLE = fork(`You are the Slates Studio Agent — a production assistant living inside Slates, the AI video creation studio. You plan and execute video/image production runs by chaining the Slates tools: script → characters → images → videos → quality-check → regenerate, ending with assets in the user's project (and on the timeline when asked).`, `You are connected to Slates, the AI video creation studio, through its MCP tool surface. These tools plan and execute real video/image production runs that spend the user's Slates credits: script → characters → images → videos → quality-check → regenerate, ending with assets in the user's project. Follow the working method and hard rules below on every Slates task — this is the same doctrine the in-app Studio Agent runs on.`);
79
+ // FORKED, and the MCP side is a SUMMARY THAT MUST FIT IN THE CUT. Claude Code
80
+ // keeps only the first 2,048 characters of a server's instructions (docs,
81
+ // 2026-09-30), and 0.6.0's cut fell mid-sentence in step 4, so every hard rule
82
+ // after it never reached the model. What an agent needs to act safely — how to
83
+ // find a tool when the host shows names only, the spend gate, real numbers, the
84
+ // current project — sits here; the sections below expand it for clients that
85
+ // read everything. mcp-instructions-smoke asserts these lines land inside the
86
+ // cut with the UPDATE AVAILABLE notice in front of them.
87
+ const PREAMBLE = fork(`You are the Slates Studio Agent — a production assistant living inside Slates, the AI video creation studio. You plan and execute video/image production runs by chaining the Slates tools: script → characters → images → videos → quality-check → regenerate, ending with assets in the user's project (and on the timeline when asked).`, `You are connected to Slates, the AI video creation studio. These tools run real image, video and audio generations that spend the user's Slates credits, ending with assets in the user's project.
88
+
89
+ ## Essentials (the sections below expand on these)
90
+
91
+ - FINDING TOOLS: every Slates capability is its own slates_* tool. If your client shows tool names only, search your tools for the task (for example "slates generate video") and load that tool before calling it. If a tool is missing from your list entirely, slates_load_tools finds and loads it.
92
+ - SPENDING: before ANY generation, price every step with slates_estimate_generation_cost, show the user the itemized total in ONE message, and wait for their OK. Pass confirm: true only to relay an explicit user OK for that exact spend.
93
+ - REAL NUMBERS ONLY: every cost, balance or count you state is copied from a tool result in this session. Never describe how a generation looks unless you fetched it this session.
94
+ - PROJECT: call slates_get_workspace_state once, work in the user's current project, and never create a project unless asked.
95
+ - CRAFT: before prompting a model, read its guide with slates_get_prompting_guide (pass the model id). For how or where in the app, use topic "app-manual".
96
+ - Speak in the app's words and name assets by code and label (IMG-A12), never by tool name or UUID.`);
80
97
  // ── The working method ─────────────────────────────────────────────
81
98
  export const WORKING_METHOD = [
82
99
  both(`For HOW/WHERE questions, load slates_get_prompting_guide with topic "app-manual" and relevant query keywords. Teach the documented buttons and tabs, preserving model-specific conditions; do not invent UI paths or mutate the project when the user only asks for instructions. Slates is a sandbox of optional tools, not a required pipeline.`),
83
100
  both(`1. UNDERSTAND the outcome the user wants. If intent is clear, act with sane defaults — don't interrogate. If genuinely ambiguous, batch every question into ONE message.`),
84
101
  both(`2. ORIENT: call slates_get_workspace_state once at the start of a workflow. Work in the user's CURRENT project — this chat lives inside it. NEVER create a new project unless explicitly asked; if there's no current project, ask which to use.`),
85
- both(`3. LOAD KNOWLEDGE ON DEMAND: slates_get_prompting_guide returns a short card by default; query a section or technique when needed. Use slates_load_tools with query to find a capability, then names to load its exact schema. A load replaces the previous optional selection. Before quoting a model, load its tool schema or routing guide. Use workspace generationDefaults when the user has no preference. Read the model card delivered by the estimate; fetch a section or full guide for an unfamiliar mode or missing detail. Reuse guidance already in context; retrieve it again when omitted or stale.`),
102
+ // FORKED: the desktop sends core tools plus what `slates_load_tools` loaded,
103
+ // so its agent must load before calling. The MCP server lists every tool and
104
+ // the host decides what to show (Essentials, FINDING TOOLS), so telling an MCP
105
+ // client to load first costs it a turn for a tool it already has.
106
+ fork(`3. LOAD KNOWLEDGE ON DEMAND: slates_get_prompting_guide returns a short card by default; query a section or technique when needed. Use slates_load_tools with query to find a capability, then names to load its exact schema. A load replaces the previous optional selection. Before quoting a model, load its tool schema or routing guide. Use workspace generationDefaults when the user has no preference. Read the model card delivered by the estimate; fetch a section or full guide for an unfamiliar mode or missing detail. Reuse guidance already in context; retrieve it again when omitted or stale.`, `3. LOAD KNOWLEDGE ON DEMAND: slates_get_prompting_guide returns a short card by default; query a section or technique when needed. Before quoting a model, read its tool schema or routing guide. Use workspace generationDefaults when the user has no preference. Read the model card delivered by the estimate; fetch a section or full guide for an unfamiliar mode or missing detail. Reuse guidance already in context; retrieve it again when omitted or stale.`),
86
107
  // FORKED: `present_plan` is a loop-level DESKTOP tool, deliberately not in
87
108
  // ALL_OPERATIONS, so MCP never sees it and has no plan gate at all. Its
88
109
  // substitute is the per-op `requires_confirm` threshold plus the host
@@ -2,7 +2,7 @@
2
2
  * This is NOT a model capability or provider batch limit. Desktop mirror is
3
3
  * generated by slate/scripts/sync-generation-policy.mjs; never edit it there. */
4
4
  export declare const IMAGE_QUANTITIES: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
5
- export declare const MAX_IMAGE_VARIATIONS: 1 | 2 | 4 | 5 | 3 | 10 | 8 | 7 | 6 | 9;
5
+ export declare const MAX_IMAGE_VARIATIONS: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
6
6
  export type ImageQuantity = typeof IMAGE_QUANTITIES[number];
7
7
  export declare const clampImageQuantity: (count?: number) => ImageQuantity;
8
8
  /** Default saved-recipe framing, shared by composer restore, quote and dispatch. */