@tai42/api-client 22.4.1 → 24.0.0

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 (37) hide show
  1. package/dist/client/conversations-client.d.ts +190 -20
  2. package/dist/client/conversations-client.d.ts.map +1 -1
  3. package/dist/client/index.d.ts +194 -24
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/states-client.d.ts +2 -2
  6. package/dist/client/tools-client.d.ts +2 -2
  7. package/dist/generated/api-routes.d.ts +12 -0
  8. package/dist/generated/api-routes.d.ts.map +1 -1
  9. package/dist/generated/api-routes.js +3 -0
  10. package/dist/generated/api-routes.js.map +1 -1
  11. package/dist/generated/openapi-schemas.d.ts +1070 -52
  12. package/dist/generated/openapi-schemas.d.ts.map +1 -1
  13. package/dist/generated/openapi-schemas.js +24 -11
  14. package/dist/generated/openapi-schemas.js.map +1 -1
  15. package/dist/generated/served-schemas.d.ts +535 -72
  16. package/dist/generated/served-schemas.d.ts.map +1 -1
  17. package/dist/generated/served-schemas.js +501 -80
  18. package/dist/generated/served-schemas.js.map +1 -1
  19. package/dist/schemas/conversations.d.ts +360 -23
  20. package/dist/schemas/conversations.d.ts.map +1 -1
  21. package/dist/schemas/conversations.js +24 -9
  22. package/dist/schemas/conversations.js.map +1 -1
  23. package/dist/schemas/interactions.d.ts +47 -9
  24. package/dist/schemas/interactions.d.ts.map +1 -1
  25. package/dist/schemas/interactions.js +28 -7
  26. package/dist/schemas/interactions.js.map +1 -1
  27. package/dist/schemas/served.d.ts +492 -70
  28. package/dist/schemas/served.d.ts.map +1 -1
  29. package/dist/schemas/states.d.ts +4 -4
  30. package/dist/schemas/tools.d.ts +4 -4
  31. package/dist/tool-runs.d.ts +2 -2
  32. package/package.json +1 -1
  33. package/src/generated/api-routes.ts +3 -0
  34. package/src/generated/openapi-schemas.ts +44 -11
  35. package/src/generated/served-schemas.ts +503 -80
  36. package/src/schemas/conversations.ts +24 -9
  37. package/src/schemas/interactions.ts +28 -7
@@ -187,7 +187,6 @@ export declare const conversationRoute: z.ZodDiscriminatedUnion<[z.ZodObject<{
187
187
  }, z.core.$strict>>>;
188
188
  channel: z.ZodDefault<z.ZodNull>;
189
189
  door: z.ZodLiteral<"api">;
190
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
191
190
  execution_key: z.ZodString;
192
191
  execution_key_fingerprint: z.ZodString;
193
192
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
@@ -217,6 +216,20 @@ export declare const conversationRoute: z.ZodDiscriminatedUnion<[z.ZodObject<{
217
216
  id: z.ZodOptional<z.ZodString>;
218
217
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
219
218
  }, z.core.$strict>>>;
219
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
220
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
221
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
222
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
223
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
224
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
225
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
226
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
227
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
228
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
229
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
230
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
231
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
232
+ }, z.core.$strict>>>;
220
233
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
221
234
  content: z.ZodOptional<z.ZodString>;
222
235
  id: z.ZodOptional<z.ZodString>;
@@ -244,7 +257,6 @@ export declare const conversationRoute: z.ZodDiscriminatedUnion<[z.ZodObject<{
244
257
  }, z.core.$strict>>>;
245
258
  channel: z.ZodString;
246
259
  door: z.ZodLiteral<"channel">;
247
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
248
260
  execution_key: z.ZodString;
249
261
  execution_key_fingerprint: z.ZodString;
250
262
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
@@ -274,6 +286,20 @@ export declare const conversationRoute: z.ZodDiscriminatedUnion<[z.ZodObject<{
274
286
  id: z.ZodOptional<z.ZodString>;
275
287
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
276
288
  }, z.core.$strict>>>;
289
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
290
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
291
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
292
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
293
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
294
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
295
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
296
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
297
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
298
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
299
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
300
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
301
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
302
+ }, z.core.$strict>>>;
277
303
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
278
304
  content: z.ZodOptional<z.ZodString>;
279
305
  id: z.ZodOptional<z.ZodString>;
@@ -302,7 +328,6 @@ export declare const apiConversationRouteCreate: z.ZodObject<{
302
328
  }, z.core.$strict>>>;
303
329
  channel: z.ZodDefault<z.ZodNull>;
304
330
  door: z.ZodLiteral<"api">;
305
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
306
331
  execution_key: z.ZodString;
307
332
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
308
333
  content: z.ZodOptional<z.ZodString>;
@@ -331,6 +356,20 @@ export declare const apiConversationRouteCreate: z.ZodObject<{
331
356
  id: z.ZodOptional<z.ZodString>;
332
357
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
333
358
  }, z.core.$strict>>>;
359
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
360
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
361
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
362
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
363
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
364
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
365
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
366
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
367
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
368
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
369
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
370
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
371
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
372
+ }, z.core.$strict>>>;
334
373
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
335
374
  content: z.ZodOptional<z.ZodString>;
336
375
  id: z.ZodOptional<z.ZodString>;
@@ -359,7 +398,6 @@ export declare const channelConversationRouteCreate: z.ZodObject<{
359
398
  }, z.core.$strict>>>;
360
399
  channel: z.ZodString;
361
400
  door: z.ZodLiteral<"channel">;
362
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
363
401
  execution_key: z.ZodString;
364
402
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
365
403
  content: z.ZodOptional<z.ZodString>;
@@ -388,6 +426,20 @@ export declare const channelConversationRouteCreate: z.ZodObject<{
388
426
  id: z.ZodOptional<z.ZodString>;
389
427
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
390
428
  }, z.core.$strict>>>;
429
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
430
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
431
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
432
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
433
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
434
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
435
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
436
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
437
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
438
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
439
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
440
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
441
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
442
+ }, z.core.$strict>>>;
391
443
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
392
444
  content: z.ZodOptional<z.ZodString>;
393
445
  id: z.ZodOptional<z.ZodString>;
@@ -416,7 +468,6 @@ export declare const conversationRouteCreate: z.ZodDiscriminatedUnion<[z.ZodObje
416
468
  }, z.core.$strict>>>;
417
469
  channel: z.ZodDefault<z.ZodNull>;
418
470
  door: z.ZodLiteral<"api">;
419
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
420
471
  execution_key: z.ZodString;
421
472
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
422
473
  content: z.ZodOptional<z.ZodString>;
@@ -445,6 +496,20 @@ export declare const conversationRouteCreate: z.ZodDiscriminatedUnion<[z.ZodObje
445
496
  id: z.ZodOptional<z.ZodString>;
446
497
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
447
498
  }, z.core.$strict>>>;
499
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
500
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
501
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
502
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
503
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
504
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
505
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
506
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
507
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
508
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
509
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
510
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
511
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
512
+ }, z.core.$strict>>>;
448
513
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
449
514
  content: z.ZodOptional<z.ZodString>;
450
515
  id: z.ZodOptional<z.ZodString>;
@@ -471,7 +536,6 @@ export declare const conversationRouteCreate: z.ZodDiscriminatedUnion<[z.ZodObje
471
536
  }, z.core.$strict>>>;
472
537
  channel: z.ZodString;
473
538
  door: z.ZodLiteral<"channel">;
474
- error_reply_text: z.ZodDefault<z.ZodNullable<z.ZodString>>;
475
539
  execution_key: z.ZodString;
476
540
  extras_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
477
541
  content: z.ZodOptional<z.ZodString>;
@@ -500,6 +564,20 @@ export declare const conversationRouteCreate: z.ZodDiscriminatedUnion<[z.ZodObje
500
564
  id: z.ZodOptional<z.ZodString>;
501
565
  kwargs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
502
566
  }, z.core.$strict>>>;
567
+ reply_texts: z.ZodDefault<z.ZodNullable<z.ZodObject<{
568
+ error: z.ZodDefault<z.ZodNullable<z.ZodString>>;
569
+ pairing_code: z.ZodDefault<z.ZodNullable<z.ZodString>>;
570
+ pairing_code_invalid: z.ZodDefault<z.ZodNullable<z.ZodString>>;
571
+ pairing_link_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
572
+ pairing_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
573
+ pairing_not_linked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
574
+ pairing_unlink_unavailable: z.ZodDefault<z.ZodNullable<z.ZodString>>;
575
+ pairing_unlinked: z.ZodDefault<z.ZodNullable<z.ZodString>>;
576
+ rejected_could_not_receive: z.ZodDefault<z.ZodNullable<z.ZodString>>;
577
+ rejected_too_large: z.ZodDefault<z.ZodNullable<z.ZodString>>;
578
+ rejected_unsupported_type: z.ZodDefault<z.ZodNullable<z.ZodString>>;
579
+ slow_down: z.ZodDefault<z.ZodNullable<z.ZodString>>;
580
+ }, z.core.$strict>>>;
503
581
  resume_expr: z.ZodDefault<z.ZodNullable<z.ZodObject<{
504
582
  content: z.ZodOptional<z.ZodString>;
505
583
  id: z.ZodOptional<z.ZodString>;
@@ -1443,18 +1521,6 @@ export declare const servedDocumentsJson: {
1443
1521
  readonly title: "Door";
1444
1522
  readonly type: "string";
1445
1523
  };
1446
- readonly error_reply_text: {
1447
- readonly anyOf: readonly [{
1448
- readonly maxLength: 2000;
1449
- readonly minLength: 1;
1450
- readonly pattern: "\\S";
1451
- readonly type: "string";
1452
- }, {
1453
- readonly type: "null";
1454
- }];
1455
- readonly default: null;
1456
- readonly title: "Error Reply Text";
1457
- };
1458
1524
  readonly execution_key: {
1459
1525
  readonly description: "The api-key ``user_id`` the turn runs AS; its live stored grants authorize the agent run or tool dispatch and every tool call the turn makes.";
1460
1526
  readonly minLength: 1;
@@ -1535,14 +1601,25 @@ export declare const servedDocumentsJson: {
1535
1601
  readonly language: "jq";
1536
1602
  readonly returns: "the reply: null (silent), a string, or a list of answer parts";
1537
1603
  readonly variables: readonly [{
1538
- readonly blurb: "the turn ids and subject this reply answers ({id, inbound, subject}); null when an out-of-band delivery's originating record has aged out";
1604
+ readonly blurb: "the turn this reply answers ({id, inbound, subject, reply_window}); reply_window {state, closes_at} is read when the turn starts, or at delivery for a late reply: open until closes_at, closed, or none; null when an out-of-band delivery's originating record has aged out";
1539
1605
  readonly name: "turn";
1540
1606
  readonly sample: {
1541
1607
  readonly id: "m-1";
1542
1608
  readonly inbound: {
1543
1609
  readonly id: "i-1";
1544
1610
  readonly kind: "message";
1545
- readonly source: "api";
1611
+ readonly source: "chat-line";
1612
+ };
1613
+ readonly reply_window: {
1614
+ readonly closes_at: "2026-01-02T09:30:00Z";
1615
+ readonly state: "open";
1616
+ };
1617
+ readonly subject: {
1618
+ readonly locale: null;
1619
+ readonly person: null;
1620
+ readonly target_kind: "agent";
1621
+ readonly target_name: "assistant";
1622
+ readonly thread: "t-1";
1546
1623
  };
1547
1624
  };
1548
1625
  }, {
@@ -1568,6 +1645,14 @@ export declare const servedDocumentsJson: {
1568
1645
  }];
1569
1646
  };
1570
1647
  };
1648
+ readonly reply_texts: {
1649
+ readonly anyOf: readonly [{
1650
+ readonly $ref: "#/$defs/ReplyTexts";
1651
+ }, {
1652
+ readonly type: "null";
1653
+ }];
1654
+ readonly default: null;
1655
+ };
1571
1656
  readonly resume_expr: {
1572
1657
  readonly anyOf: readonly [{
1573
1658
  readonly $ref: "#/$defs/TemplatedText";
@@ -1649,13 +1734,16 @@ export declare const servedDocumentsJson: {
1649
1734
  readonly gloss: "a geographic point the participant shared, present only when the inbound carried one";
1650
1735
  readonly name: "location";
1651
1736
  }, {
1652
- readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location when that message carried them)";
1737
+ readonly gloss: "the earlier message this one replies to, {message_id, status, text}; present only when the inbound quoted one";
1738
+ readonly name: "reply_to";
1739
+ }, {
1740
+ readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location/reply_to when that message carried them)";
1653
1741
  readonly name: "messages";
1654
1742
  }, {
1655
1743
  readonly gloss: "overlap deliver=all: messages dropped in favour of this turn, in the same shape; present only when non-empty";
1656
1744
  readonly name: "superseded";
1657
1745
  }, {
1658
- readonly gloss: "the turn ids: {id, inbound: {id, kind, source}}";
1746
+ readonly gloss: "the turn: {id, inbound: {id, kind, source}, subject: {target_kind, target_name, person, thread, locale}, reply_window: {state, closes_at}}; reply_window.state is open (a free-form reply is allowed until closes_at), closed, or none (no window on this channel or address)";
1659
1747
  readonly name: "turn";
1660
1748
  }, {
1661
1749
  readonly gloss: "an event turn's structured payload {id, kind, payload}; absent on a message turn";
@@ -1754,18 +1842,6 @@ export declare const servedDocumentsJson: {
1754
1842
  readonly title: "Door";
1755
1843
  readonly type: "string";
1756
1844
  };
1757
- readonly error_reply_text: {
1758
- readonly anyOf: readonly [{
1759
- readonly maxLength: 2000;
1760
- readonly minLength: 1;
1761
- readonly pattern: "\\S";
1762
- readonly type: "string";
1763
- }, {
1764
- readonly type: "null";
1765
- }];
1766
- readonly default: null;
1767
- readonly title: "Error Reply Text";
1768
- };
1769
1845
  readonly execution_key: {
1770
1846
  readonly description: "The api-key ``user_id`` the turn runs AS; its live stored grants authorize the agent run or tool dispatch and every tool call the turn makes.";
1771
1847
  readonly minLength: 1;
@@ -1846,14 +1922,25 @@ export declare const servedDocumentsJson: {
1846
1922
  readonly language: "jq";
1847
1923
  readonly returns: "the reply: null (silent), a string, or a list of answer parts";
1848
1924
  readonly variables: readonly [{
1849
- readonly blurb: "the turn ids and subject this reply answers ({id, inbound, subject}); null when an out-of-band delivery's originating record has aged out";
1925
+ readonly blurb: "the turn this reply answers ({id, inbound, subject, reply_window}); reply_window {state, closes_at} is read when the turn starts, or at delivery for a late reply: open until closes_at, closed, or none; null when an out-of-band delivery's originating record has aged out";
1850
1926
  readonly name: "turn";
1851
1927
  readonly sample: {
1852
1928
  readonly id: "m-1";
1853
1929
  readonly inbound: {
1854
1930
  readonly id: "i-1";
1855
1931
  readonly kind: "message";
1856
- readonly source: "api";
1932
+ readonly source: "chat-line";
1933
+ };
1934
+ readonly reply_window: {
1935
+ readonly closes_at: "2026-01-02T09:30:00Z";
1936
+ readonly state: "open";
1937
+ };
1938
+ readonly subject: {
1939
+ readonly locale: null;
1940
+ readonly person: null;
1941
+ readonly target_kind: "agent";
1942
+ readonly target_name: "assistant";
1943
+ readonly thread: "t-1";
1857
1944
  };
1858
1945
  };
1859
1946
  }, {
@@ -1879,6 +1966,14 @@ export declare const servedDocumentsJson: {
1879
1966
  }];
1880
1967
  };
1881
1968
  };
1969
+ readonly reply_texts: {
1970
+ readonly anyOf: readonly [{
1971
+ readonly $ref: "#/$defs/ReplyTexts";
1972
+ }, {
1973
+ readonly type: "null";
1974
+ }];
1975
+ readonly default: null;
1976
+ };
1882
1977
  readonly resume_expr: {
1883
1978
  readonly anyOf: readonly [{
1884
1979
  readonly $ref: "#/$defs/TemplatedText";
@@ -1960,13 +2055,16 @@ export declare const servedDocumentsJson: {
1960
2055
  readonly gloss: "a geographic point the participant shared, present only when the inbound carried one";
1961
2056
  readonly name: "location";
1962
2057
  }, {
1963
- readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location when that message carried them)";
2058
+ readonly gloss: "the earlier message this one replies to, {message_id, status, text}; present only when the inbound quoted one";
2059
+ readonly name: "reply_to";
2060
+ }, {
2061
+ readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location/reply_to when that message carried them)";
1964
2062
  readonly name: "messages";
1965
2063
  }, {
1966
2064
  readonly gloss: "overlap deliver=all: messages dropped in favour of this turn, in the same shape; present only when non-empty";
1967
2065
  readonly name: "superseded";
1968
2066
  }, {
1969
- readonly gloss: "the turn ids: {id, inbound: {id, kind, source}}";
2067
+ readonly gloss: "the turn: {id, inbound: {id, kind, source}, subject: {target_kind, target_name, person, thread, locale}, reply_window: {state, closes_at}}; reply_window.state is open (a free-form reply is allowed until closes_at), closed, or none (no window on this channel or address)";
1970
2068
  readonly name: "turn";
1971
2069
  }, {
1972
2070
  readonly gloss: "an event turn's structured payload {id, kind, payload}; absent on a message turn";
@@ -2042,6 +2140,158 @@ export declare const servedDocumentsJson: {
2042
2140
  readonly title: "OverlapPolicy";
2043
2141
  readonly type: "object";
2044
2142
  };
2143
+ readonly ReplyTexts: {
2144
+ readonly additionalProperties: false;
2145
+ readonly description: "The caller's words for the platform's fixed participant replies on one route. Frozen, strict keys.\n\n``error`` is sent when a turn fails and the target gave no reply; ``slow_down`` when an address\nis over the turn cap; ``pairing_linked`` when a pair code was redeemed and the two persons\nmerged; ``pairing_unlinked`` when ``/unlink`` detached the address; ``pairing_not_linked`` when\n``/unlink`` came from an address linked to nothing; ``pairing_code_invalid`` when a redeem was\nrefused; ``pairing_code`` is the ``/link`` reply carrying the fresh code, a template that MUST\nreference ``{pairing_code}`` and may reference ``{expires_at}`` (the code's ISO-8601 expiry),\nwith no conversion or format spec; ``pairing_link_unavailable`` when a redeem met a person being\nerased (its code is consumed, so the reply asks for a new one); ``pairing_unlink_unavailable``\nwhen ``/unlink`` met the sender's person being erased; ``rejected_unsupported_type`` / ``rejected_too_large`` /\n``rejected_could_not_receive`` are the notices for an inbound message the channel cannot\nbridge, a file over the cap, and a file the channel could not fetch. Every member but\n``pairing_code`` is literal text: a ``{`` in it is drawn as written. Each is a\n:data:`~tai42_contract.interactions.ReplyText` in the line's language; absent, the built-in\nEnglish reply is sent. An empty catalogue names nothing and is refused; an unknown key is\nrefused.";
2146
+ readonly properties: {
2147
+ readonly error: {
2148
+ readonly anyOf: readonly [{
2149
+ readonly maxLength: 2000;
2150
+ readonly minLength: 1;
2151
+ readonly pattern: "\\S";
2152
+ readonly type: "string";
2153
+ }, {
2154
+ readonly type: "null";
2155
+ }];
2156
+ readonly default: null;
2157
+ readonly title: "Error";
2158
+ };
2159
+ readonly pairing_code: {
2160
+ readonly anyOf: readonly [{
2161
+ readonly maxLength: 2000;
2162
+ readonly minLength: 1;
2163
+ readonly pattern: "\\S";
2164
+ readonly type: "string";
2165
+ }, {
2166
+ readonly type: "null";
2167
+ }];
2168
+ readonly default: null;
2169
+ readonly title: "Pairing Code";
2170
+ };
2171
+ readonly pairing_code_invalid: {
2172
+ readonly anyOf: readonly [{
2173
+ readonly maxLength: 2000;
2174
+ readonly minLength: 1;
2175
+ readonly pattern: "\\S";
2176
+ readonly type: "string";
2177
+ }, {
2178
+ readonly type: "null";
2179
+ }];
2180
+ readonly default: null;
2181
+ readonly title: "Pairing Code Invalid";
2182
+ };
2183
+ readonly pairing_link_unavailable: {
2184
+ readonly anyOf: readonly [{
2185
+ readonly maxLength: 2000;
2186
+ readonly minLength: 1;
2187
+ readonly pattern: "\\S";
2188
+ readonly type: "string";
2189
+ }, {
2190
+ readonly type: "null";
2191
+ }];
2192
+ readonly default: null;
2193
+ readonly title: "Pairing Link Unavailable";
2194
+ };
2195
+ readonly pairing_linked: {
2196
+ readonly anyOf: readonly [{
2197
+ readonly maxLength: 2000;
2198
+ readonly minLength: 1;
2199
+ readonly pattern: "\\S";
2200
+ readonly type: "string";
2201
+ }, {
2202
+ readonly type: "null";
2203
+ }];
2204
+ readonly default: null;
2205
+ readonly title: "Pairing Linked";
2206
+ };
2207
+ readonly pairing_not_linked: {
2208
+ readonly anyOf: readonly [{
2209
+ readonly maxLength: 2000;
2210
+ readonly minLength: 1;
2211
+ readonly pattern: "\\S";
2212
+ readonly type: "string";
2213
+ }, {
2214
+ readonly type: "null";
2215
+ }];
2216
+ readonly default: null;
2217
+ readonly title: "Pairing Not Linked";
2218
+ };
2219
+ readonly pairing_unlink_unavailable: {
2220
+ readonly anyOf: readonly [{
2221
+ readonly maxLength: 2000;
2222
+ readonly minLength: 1;
2223
+ readonly pattern: "\\S";
2224
+ readonly type: "string";
2225
+ }, {
2226
+ readonly type: "null";
2227
+ }];
2228
+ readonly default: null;
2229
+ readonly title: "Pairing Unlink Unavailable";
2230
+ };
2231
+ readonly pairing_unlinked: {
2232
+ readonly anyOf: readonly [{
2233
+ readonly maxLength: 2000;
2234
+ readonly minLength: 1;
2235
+ readonly pattern: "\\S";
2236
+ readonly type: "string";
2237
+ }, {
2238
+ readonly type: "null";
2239
+ }];
2240
+ readonly default: null;
2241
+ readonly title: "Pairing Unlinked";
2242
+ };
2243
+ readonly rejected_could_not_receive: {
2244
+ readonly anyOf: readonly [{
2245
+ readonly maxLength: 2000;
2246
+ readonly minLength: 1;
2247
+ readonly pattern: "\\S";
2248
+ readonly type: "string";
2249
+ }, {
2250
+ readonly type: "null";
2251
+ }];
2252
+ readonly default: null;
2253
+ readonly title: "Rejected Could Not Receive";
2254
+ };
2255
+ readonly rejected_too_large: {
2256
+ readonly anyOf: readonly [{
2257
+ readonly maxLength: 2000;
2258
+ readonly minLength: 1;
2259
+ readonly pattern: "\\S";
2260
+ readonly type: "string";
2261
+ }, {
2262
+ readonly type: "null";
2263
+ }];
2264
+ readonly default: null;
2265
+ readonly title: "Rejected Too Large";
2266
+ };
2267
+ readonly rejected_unsupported_type: {
2268
+ readonly anyOf: readonly [{
2269
+ readonly maxLength: 2000;
2270
+ readonly minLength: 1;
2271
+ readonly pattern: "\\S";
2272
+ readonly type: "string";
2273
+ }, {
2274
+ readonly type: "null";
2275
+ }];
2276
+ readonly default: null;
2277
+ readonly title: "Rejected Unsupported Type";
2278
+ };
2279
+ readonly slow_down: {
2280
+ readonly anyOf: readonly [{
2281
+ readonly maxLength: 2000;
2282
+ readonly minLength: 1;
2283
+ readonly pattern: "\\S";
2284
+ readonly type: "string";
2285
+ }, {
2286
+ readonly type: "null";
2287
+ }];
2288
+ readonly default: null;
2289
+ readonly title: "Slow Down";
2290
+ };
2291
+ };
2292
+ readonly title: "ReplyTexts";
2293
+ readonly type: "object";
2294
+ };
2045
2295
  readonly TemplatedText: {
2046
2296
  readonly additionalProperties: false;
2047
2297
  readonly description: "A renderable text: its source plus the parameters its render takes.\n\nEXACTLY ONE source is set — ``content`` (the text inline) or ``id`` (the id of a\nstored resource holding the text); neither and both are refused at construction.\n``kwargs`` are the render parameters for the TEXT and apply either way, so moving a\ntext from inline to stored (or back) leaves its parameters untouched.";
@@ -2144,18 +2394,6 @@ export declare const servedDocumentsJson: {
2144
2394
  readonly title: "Door";
2145
2395
  readonly type: "string";
2146
2396
  };
2147
- readonly error_reply_text: {
2148
- readonly anyOf: readonly [{
2149
- readonly maxLength: 2000;
2150
- readonly minLength: 1;
2151
- readonly pattern: "\\S";
2152
- readonly type: "string";
2153
- }, {
2154
- readonly type: "null";
2155
- }];
2156
- readonly default: null;
2157
- readonly title: "Error Reply Text";
2158
- };
2159
2397
  readonly execution_key: {
2160
2398
  readonly description: "The api-key ``user_id`` the turn runs AS; its live stored grants authorize the agent run or tool dispatch and every tool call the turn makes.";
2161
2399
  readonly minLength: 1;
@@ -2230,14 +2468,25 @@ export declare const servedDocumentsJson: {
2230
2468
  readonly language: "jq";
2231
2469
  readonly returns: "the reply: null (silent), a string, or a list of answer parts";
2232
2470
  readonly variables: readonly [{
2233
- readonly blurb: "the turn ids and subject this reply answers ({id, inbound, subject}); null when an out-of-band delivery's originating record has aged out";
2471
+ readonly blurb: "the turn this reply answers ({id, inbound, subject, reply_window}); reply_window {state, closes_at} is read when the turn starts, or at delivery for a late reply: open until closes_at, closed, or none; null when an out-of-band delivery's originating record has aged out";
2234
2472
  readonly name: "turn";
2235
2473
  readonly sample: {
2236
2474
  readonly id: "m-1";
2237
2475
  readonly inbound: {
2238
2476
  readonly id: "i-1";
2239
2477
  readonly kind: "message";
2240
- readonly source: "api";
2478
+ readonly source: "chat-line";
2479
+ };
2480
+ readonly reply_window: {
2481
+ readonly closes_at: "2026-01-02T09:30:00Z";
2482
+ readonly state: "open";
2483
+ };
2484
+ readonly subject: {
2485
+ readonly locale: null;
2486
+ readonly person: null;
2487
+ readonly target_kind: "agent";
2488
+ readonly target_name: "assistant";
2489
+ readonly thread: "t-1";
2241
2490
  };
2242
2491
  };
2243
2492
  }, {
@@ -2263,6 +2512,14 @@ export declare const servedDocumentsJson: {
2263
2512
  }];
2264
2513
  };
2265
2514
  };
2515
+ readonly reply_texts: {
2516
+ readonly anyOf: readonly [{
2517
+ readonly $ref: "#/$defs/ReplyTexts";
2518
+ }, {
2519
+ readonly type: "null";
2520
+ }];
2521
+ readonly default: null;
2522
+ };
2266
2523
  readonly resume_expr: {
2267
2524
  readonly anyOf: readonly [{
2268
2525
  readonly $ref: "#/$defs/TemplatedText";
@@ -2344,13 +2601,16 @@ export declare const servedDocumentsJson: {
2344
2601
  readonly gloss: "a geographic point the participant shared, present only when the inbound carried one";
2345
2602
  readonly name: "location";
2346
2603
  }, {
2347
- readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location when that message carried them)";
2604
+ readonly gloss: "the earlier message this one replies to, {message_id, status, text}; present only when the inbound quoted one";
2605
+ readonly name: "reply_to";
2606
+ }, {
2607
+ readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location/reply_to when that message carried them)";
2348
2608
  readonly name: "messages";
2349
2609
  }, {
2350
2610
  readonly gloss: "overlap deliver=all: messages dropped in favour of this turn, in the same shape; present only when non-empty";
2351
2611
  readonly name: "superseded";
2352
2612
  }, {
2353
- readonly gloss: "the turn ids: {id, inbound: {id, kind, source}}";
2613
+ readonly gloss: "the turn: {id, inbound: {id, kind, source}, subject: {target_kind, target_name, person, thread, locale}, reply_window: {state, closes_at}}; reply_window.state is open (a free-form reply is allowed until closes_at), closed, or none (no window on this channel or address)";
2354
2614
  readonly name: "turn";
2355
2615
  }, {
2356
2616
  readonly gloss: "an event turn's structured payload {id, kind, payload}; absent on a message turn";
@@ -2444,18 +2704,6 @@ export declare const servedDocumentsJson: {
2444
2704
  readonly title: "Door";
2445
2705
  readonly type: "string";
2446
2706
  };
2447
- readonly error_reply_text: {
2448
- readonly anyOf: readonly [{
2449
- readonly maxLength: 2000;
2450
- readonly minLength: 1;
2451
- readonly pattern: "\\S";
2452
- readonly type: "string";
2453
- }, {
2454
- readonly type: "null";
2455
- }];
2456
- readonly default: null;
2457
- readonly title: "Error Reply Text";
2458
- };
2459
2707
  readonly execution_key: {
2460
2708
  readonly description: "The api-key ``user_id`` the turn runs AS; its live stored grants authorize the agent run or tool dispatch and every tool call the turn makes.";
2461
2709
  readonly minLength: 1;
@@ -2530,14 +2778,25 @@ export declare const servedDocumentsJson: {
2530
2778
  readonly language: "jq";
2531
2779
  readonly returns: "the reply: null (silent), a string, or a list of answer parts";
2532
2780
  readonly variables: readonly [{
2533
- readonly blurb: "the turn ids and subject this reply answers ({id, inbound, subject}); null when an out-of-band delivery's originating record has aged out";
2781
+ readonly blurb: "the turn this reply answers ({id, inbound, subject, reply_window}); reply_window {state, closes_at} is read when the turn starts, or at delivery for a late reply: open until closes_at, closed, or none; null when an out-of-band delivery's originating record has aged out";
2534
2782
  readonly name: "turn";
2535
2783
  readonly sample: {
2536
2784
  readonly id: "m-1";
2537
2785
  readonly inbound: {
2538
2786
  readonly id: "i-1";
2539
2787
  readonly kind: "message";
2540
- readonly source: "api";
2788
+ readonly source: "chat-line";
2789
+ };
2790
+ readonly reply_window: {
2791
+ readonly closes_at: "2026-01-02T09:30:00Z";
2792
+ readonly state: "open";
2793
+ };
2794
+ readonly subject: {
2795
+ readonly locale: null;
2796
+ readonly person: null;
2797
+ readonly target_kind: "agent";
2798
+ readonly target_name: "assistant";
2799
+ readonly thread: "t-1";
2541
2800
  };
2542
2801
  };
2543
2802
  }, {
@@ -2563,6 +2822,14 @@ export declare const servedDocumentsJson: {
2563
2822
  }];
2564
2823
  };
2565
2824
  };
2825
+ readonly reply_texts: {
2826
+ readonly anyOf: readonly [{
2827
+ readonly $ref: "#/$defs/ReplyTexts";
2828
+ }, {
2829
+ readonly type: "null";
2830
+ }];
2831
+ readonly default: null;
2832
+ };
2566
2833
  readonly resume_expr: {
2567
2834
  readonly anyOf: readonly [{
2568
2835
  readonly $ref: "#/$defs/TemplatedText";
@@ -2644,13 +2911,16 @@ export declare const servedDocumentsJson: {
2644
2911
  readonly gloss: "a geographic point the participant shared, present only when the inbound carried one";
2645
2912
  readonly name: "location";
2646
2913
  }, {
2647
- readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location when that message carried them)";
2914
+ readonly gloss: "the earlier message this one replies to, {message_id, status, text}; present only when the inbound quoted one";
2915
+ readonly name: "reply_to";
2916
+ }, {
2917
+ readonly gloss: "overlap deliver=all: the batch carried into this turn, in acceptance order, each {id, text, accepted_at} (+ form/form_tag/attachments/location/reply_to when that message carried them)";
2648
2918
  readonly name: "messages";
2649
2919
  }, {
2650
2920
  readonly gloss: "overlap deliver=all: messages dropped in favour of this turn, in the same shape; present only when non-empty";
2651
2921
  readonly name: "superseded";
2652
2922
  }, {
2653
- readonly gloss: "the turn ids: {id, inbound: {id, kind, source}}";
2923
+ readonly gloss: "the turn: {id, inbound: {id, kind, source}, subject: {target_kind, target_name, person, thread, locale}, reply_window: {state, closes_at}}; reply_window.state is open (a free-form reply is allowed until closes_at), closed, or none (no window on this channel or address)";
2654
2924
  readonly name: "turn";
2655
2925
  }, {
2656
2926
  readonly gloss: "an event turn's structured payload {id, kind, payload}; absent on a message turn";
@@ -2726,6 +2996,158 @@ export declare const servedDocumentsJson: {
2726
2996
  readonly title: "OverlapPolicy";
2727
2997
  readonly type: "object";
2728
2998
  };
2999
+ readonly ReplyTexts: {
3000
+ readonly additionalProperties: false;
3001
+ readonly description: "The caller's words for the platform's fixed participant replies on one route. Frozen, strict keys.\n\n``error`` is sent when a turn fails and the target gave no reply; ``slow_down`` when an address\nis over the turn cap; ``pairing_linked`` when a pair code was redeemed and the two persons\nmerged; ``pairing_unlinked`` when ``/unlink`` detached the address; ``pairing_not_linked`` when\n``/unlink`` came from an address linked to nothing; ``pairing_code_invalid`` when a redeem was\nrefused; ``pairing_code`` is the ``/link`` reply carrying the fresh code, a template that MUST\nreference ``{pairing_code}`` and may reference ``{expires_at}`` (the code's ISO-8601 expiry),\nwith no conversion or format spec; ``pairing_link_unavailable`` when a redeem met a person being\nerased (its code is consumed, so the reply asks for a new one); ``pairing_unlink_unavailable``\nwhen ``/unlink`` met the sender's person being erased; ``rejected_unsupported_type`` / ``rejected_too_large`` /\n``rejected_could_not_receive`` are the notices for an inbound message the channel cannot\nbridge, a file over the cap, and a file the channel could not fetch. Every member but\n``pairing_code`` is literal text: a ``{`` in it is drawn as written. Each is a\n:data:`~tai42_contract.interactions.ReplyText` in the line's language; absent, the built-in\nEnglish reply is sent. An empty catalogue names nothing and is refused; an unknown key is\nrefused.";
3002
+ readonly properties: {
3003
+ readonly error: {
3004
+ readonly anyOf: readonly [{
3005
+ readonly maxLength: 2000;
3006
+ readonly minLength: 1;
3007
+ readonly pattern: "\\S";
3008
+ readonly type: "string";
3009
+ }, {
3010
+ readonly type: "null";
3011
+ }];
3012
+ readonly default: null;
3013
+ readonly title: "Error";
3014
+ };
3015
+ readonly pairing_code: {
3016
+ readonly anyOf: readonly [{
3017
+ readonly maxLength: 2000;
3018
+ readonly minLength: 1;
3019
+ readonly pattern: "\\S";
3020
+ readonly type: "string";
3021
+ }, {
3022
+ readonly type: "null";
3023
+ }];
3024
+ readonly default: null;
3025
+ readonly title: "Pairing Code";
3026
+ };
3027
+ readonly pairing_code_invalid: {
3028
+ readonly anyOf: readonly [{
3029
+ readonly maxLength: 2000;
3030
+ readonly minLength: 1;
3031
+ readonly pattern: "\\S";
3032
+ readonly type: "string";
3033
+ }, {
3034
+ readonly type: "null";
3035
+ }];
3036
+ readonly default: null;
3037
+ readonly title: "Pairing Code Invalid";
3038
+ };
3039
+ readonly pairing_link_unavailable: {
3040
+ readonly anyOf: readonly [{
3041
+ readonly maxLength: 2000;
3042
+ readonly minLength: 1;
3043
+ readonly pattern: "\\S";
3044
+ readonly type: "string";
3045
+ }, {
3046
+ readonly type: "null";
3047
+ }];
3048
+ readonly default: null;
3049
+ readonly title: "Pairing Link Unavailable";
3050
+ };
3051
+ readonly pairing_linked: {
3052
+ readonly anyOf: readonly [{
3053
+ readonly maxLength: 2000;
3054
+ readonly minLength: 1;
3055
+ readonly pattern: "\\S";
3056
+ readonly type: "string";
3057
+ }, {
3058
+ readonly type: "null";
3059
+ }];
3060
+ readonly default: null;
3061
+ readonly title: "Pairing Linked";
3062
+ };
3063
+ readonly pairing_not_linked: {
3064
+ readonly anyOf: readonly [{
3065
+ readonly maxLength: 2000;
3066
+ readonly minLength: 1;
3067
+ readonly pattern: "\\S";
3068
+ readonly type: "string";
3069
+ }, {
3070
+ readonly type: "null";
3071
+ }];
3072
+ readonly default: null;
3073
+ readonly title: "Pairing Not Linked";
3074
+ };
3075
+ readonly pairing_unlink_unavailable: {
3076
+ readonly anyOf: readonly [{
3077
+ readonly maxLength: 2000;
3078
+ readonly minLength: 1;
3079
+ readonly pattern: "\\S";
3080
+ readonly type: "string";
3081
+ }, {
3082
+ readonly type: "null";
3083
+ }];
3084
+ readonly default: null;
3085
+ readonly title: "Pairing Unlink Unavailable";
3086
+ };
3087
+ readonly pairing_unlinked: {
3088
+ readonly anyOf: readonly [{
3089
+ readonly maxLength: 2000;
3090
+ readonly minLength: 1;
3091
+ readonly pattern: "\\S";
3092
+ readonly type: "string";
3093
+ }, {
3094
+ readonly type: "null";
3095
+ }];
3096
+ readonly default: null;
3097
+ readonly title: "Pairing Unlinked";
3098
+ };
3099
+ readonly rejected_could_not_receive: {
3100
+ readonly anyOf: readonly [{
3101
+ readonly maxLength: 2000;
3102
+ readonly minLength: 1;
3103
+ readonly pattern: "\\S";
3104
+ readonly type: "string";
3105
+ }, {
3106
+ readonly type: "null";
3107
+ }];
3108
+ readonly default: null;
3109
+ readonly title: "Rejected Could Not Receive";
3110
+ };
3111
+ readonly rejected_too_large: {
3112
+ readonly anyOf: readonly [{
3113
+ readonly maxLength: 2000;
3114
+ readonly minLength: 1;
3115
+ readonly pattern: "\\S";
3116
+ readonly type: "string";
3117
+ }, {
3118
+ readonly type: "null";
3119
+ }];
3120
+ readonly default: null;
3121
+ readonly title: "Rejected Too Large";
3122
+ };
3123
+ readonly rejected_unsupported_type: {
3124
+ readonly anyOf: readonly [{
3125
+ readonly maxLength: 2000;
3126
+ readonly minLength: 1;
3127
+ readonly pattern: "\\S";
3128
+ readonly type: "string";
3129
+ }, {
3130
+ readonly type: "null";
3131
+ }];
3132
+ readonly default: null;
3133
+ readonly title: "Rejected Unsupported Type";
3134
+ };
3135
+ readonly slow_down: {
3136
+ readonly anyOf: readonly [{
3137
+ readonly maxLength: 2000;
3138
+ readonly minLength: 1;
3139
+ readonly pattern: "\\S";
3140
+ readonly type: "string";
3141
+ }, {
3142
+ readonly type: "null";
3143
+ }];
3144
+ readonly default: null;
3145
+ readonly title: "Slow Down";
3146
+ };
3147
+ };
3148
+ readonly title: "ReplyTexts";
3149
+ readonly type: "object";
3150
+ };
2729
3151
  readonly TemplatedText: {
2730
3152
  readonly additionalProperties: false;
2731
3153
  readonly description: "A renderable text: its source plus the parameters its render takes.\n\nEXACTLY ONE source is set — ``content`` (the text inline) or ``id`` (the id of a\nstored resource holding the text); neither and both are refused at construction.\n``kwargs`` are the render parameters for the TEXT and apply either way, so moving a\ntext from inline to stored (or back) leaves its parameters untouched.";