@xfey/tutti 0.1.110 → 0.1.112

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 (81) hide show
  1. package/README.md +1 -1
  2. package/dist/approvals/decision-command.d.ts +2 -2
  3. package/dist/chat-assistant/index.d.ts +1 -1
  4. package/dist/chat-assistant/index.js +26 -6
  5. package/dist/collaboration-ingestion/clarification.d.ts +25 -0
  6. package/dist/collaboration-ingestion/clarification.js +63 -0
  7. package/dist/collaboration-ingestion/external-source.d.ts +2 -0
  8. package/dist/collaboration-ingestion/external-source.js +35 -0
  9. package/dist/collaboration-ingestion/index.d.ts +2 -0
  10. package/dist/collaboration-ingestion/index.js +2 -0
  11. package/dist/collaboration-ingestion/main-chat.js +9 -2
  12. package/dist/collaboration-ingestion/platform-clarification.d.ts +10 -0
  13. package/dist/collaboration-ingestion/platform-clarification.js +42 -0
  14. package/dist/collaboration-ingestion/types.d.ts +1 -0
  15. package/dist/collaboration-state/clarification-messages.js +3 -2
  16. package/dist/collaboration-state/clarification-records.d.ts +1 -1
  17. package/dist/collaboration-state/clarification-records.js +7 -5
  18. package/dist/collaboration-state/clarification-rounds.js +5 -5
  19. package/dist/collaboration-state/clarification-snapshot.d.ts +228 -0
  20. package/dist/collaboration-state/clarification-snapshot.js +29 -0
  21. package/dist/collaboration-state/clarification-successors.js +6 -6
  22. package/dist/collaboration-state/index.d.ts +1 -0
  23. package/dist/collaboration-state/index.js +1 -0
  24. package/dist/collaboration-state/run-recording.js +1 -1
  25. package/dist/collaboration-state/task-compile-context.d.ts +1 -1
  26. package/dist/collaboration-state/types.d.ts +1 -0
  27. package/dist/control-plane/clarification-commands.d.ts +3 -2
  28. package/dist/control-plane/clarification-commands.js +13 -4
  29. package/dist/control-plane/follow-up-context.js +8 -14
  30. package/dist/control-plane/index.d.ts +3 -2
  31. package/dist/control-plane/scratchpad-source-messages.js +9 -3
  32. package/dist/control-plane/task-compile-clarification-context.js +7 -2
  33. package/dist/control-plane/task-source-context-types.d.ts +1 -1
  34. package/dist/control-plane/task-source-context.js +4 -2
  35. package/dist/control-plane/types.d.ts +1 -0
  36. package/dist/control-plane/workflows/openai.js +5 -4
  37. package/dist/platform-outbound/repository.js +83 -4
  38. package/dist/server-shell/cli/host-lifecycle.js +1 -0
  39. package/dist/server-shell/cli/host-server-runtime.d.ts +2 -1
  40. package/dist/server-shell/cli/host-server-runtime.js +4 -2
  41. package/dist/server-shell/cli/relay-registration.js +2 -0
  42. package/dist/server-shell/http/host-tunnel.d.ts +2 -1
  43. package/dist/server-shell/http/host-tunnel.js +4 -1
  44. package/dist/server-shell/http/integration-clarification-dispatch.d.ts +6 -0
  45. package/dist/server-shell/http/integration-clarification-dispatch.js +43 -0
  46. package/dist/server-shell/http/routes/agent-context-reference-routes.js +1 -3
  47. package/dist/server-shell/http/routes/project-api/clarification-routes.js +16 -42
  48. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +2 -0
  49. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +1 -0
  50. package/dist/server-shell/http/routes/project-api/openapi.d.ts +3 -0
  51. package/dist/server-shell/http/routes/project-api/schemas.d.ts +1 -0
  52. package/migrations/0022_clarification_projection_cursors.sql +7 -0
  53. package/node_modules/@tutti/relay-client/dist/host-control.d.ts +2 -0
  54. package/node_modules/@tutti/relay-client/dist/host-control.js +6 -0
  55. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +14 -1
  56. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.js +9 -2
  57. package/node_modules/@tutti/shared/dist/schemas/api/messages.d.ts +4 -0
  58. package/node_modules/@tutti/shared/dist/schemas/api/messages.js +1 -0
  59. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.d.ts +1 -0
  60. package/node_modules/@tutti/shared/dist/schemas/internal/index.d.ts +2 -0
  61. package/node_modules/@tutti/shared/dist/schemas/internal/index.js +2 -0
  62. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification-content.d.ts +15 -0
  63. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification-content.js +24 -0
  64. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification.d.ts +354 -0
  65. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification.js +94 -0
  66. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.d.ts +132 -5
  67. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.js +29 -5
  68. package/node_modules/@tutti/shared/dist/utils/clarification-participants.d.ts +4 -0
  69. package/node_modules/@tutti/shared/dist/utils/clarification-participants.js +11 -0
  70. package/node_modules/@tutti/shared/dist/utils/index.d.ts +1 -0
  71. package/node_modules/@tutti/shared/dist/utils/index.js +1 -0
  72. package/package.json +1 -1
  73. package/prompts/chat-assistant.md +1 -0
  74. package/prompts/procedures/follow-up-check.md +4 -4
  75. package/prompts/procedures/scratchpad-refresh.md +22 -2
  76. package/prompts/procedures/task-compile.md +1 -0
  77. package/prompts/runs/task-execute.md +2 -0
  78. package/web/assets/{homepage-motion-scene-rxYjg-zc.js → homepage-motion-scene-BwdH6Iss.js} +1 -1
  79. package/web/assets/index-B29RuNsd.js +69 -0
  80. package/web/index.html +1 -1
  81. package/web/assets/index-BrKWdtKZ.js +0 -69
@@ -14,6 +14,7 @@ export declare const PlatformConversationLocatorSchema: import("@sinclair/typebo
14
14
  conversation_ref: import("@sinclair/typebox").TString;
15
15
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
16
16
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
18
  }>;
18
19
  export declare const ExternalMessageLocatorSchema: import("@sinclair/typebox").TObject<{
19
20
  conversation: import("@sinclair/typebox").TObject<{
@@ -24,6 +25,7 @@ export declare const ExternalMessageLocatorSchema: import("@sinclair/typebox").T
24
25
  conversation_ref: import("@sinclair/typebox").TString;
25
26
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
26
27
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
27
29
  }>;
28
30
  message_ref: import("@sinclair/typebox").TString;
29
31
  }>;
@@ -65,6 +67,27 @@ export declare const TrustedSystemIntegrationActorContextSchema: import("@sincla
65
67
  binding_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
66
68
  verified_at: import("@sinclair/typebox").TString;
67
69
  }>;
70
+ export declare const TrustedDevelopmentBotActorContextSchema: import("@sinclair/typebox").TObject<{
71
+ kind: import("@sinclair/typebox").TLiteral<"bot">;
72
+ purpose: import("@sinclair/typebox").TLiteral<"development_operator">;
73
+ channel: import("@sinclair/typebox").TLiteral<"platform_chat">;
74
+ account_ref: import("@sinclair/typebox").TString;
75
+ display_name: import("@sinclair/typebox").TString;
76
+ membership: import("@sinclair/typebox").TObject<{
77
+ relay_project_ref: import("@sinclair/typebox").TString;
78
+ label: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"member">]>;
79
+ }>;
80
+ external_subject: import("@sinclair/typebox").TObject<{
81
+ installation: import("@sinclair/typebox").TObject<{
82
+ platform: import("@sinclair/typebox").TString;
83
+ installation_ref: import("@sinclair/typebox").TString;
84
+ }>;
85
+ subject_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"human">, import("@sinclair/typebox").TLiteral<"bot">, import("@sinclair/typebox").TLiteral<"app">, import("@sinclair/typebox").TLiteral<"system">]>;
86
+ subject_ref: import("@sinclair/typebox").TString;
87
+ }>;
88
+ binding_ref: import("@sinclair/typebox").TString;
89
+ verified_at: import("@sinclair/typebox").TString;
90
+ }>;
68
91
  export declare const TrustedIntegrationActorContextSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
69
92
  kind: import("@sinclair/typebox").TLiteral<"human">;
70
93
  account_ref: import("@sinclair/typebox").TString;
@@ -192,6 +215,7 @@ export declare const PreIdentityReferenceAttachmentSourceSchema: import("@sincla
192
215
  conversation_ref: import("@sinclair/typebox").TString;
193
216
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
194
217
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
218
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
195
219
  }>;
196
220
  message_ref: import("@sinclair/typebox").TString;
197
221
  }>;
@@ -232,6 +256,7 @@ export declare const NormalizedConversationSourceSchema: import("@sinclair/typeb
232
256
  conversation_ref: import("@sinclair/typebox").TString;
233
257
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
234
258
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
259
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
235
260
  }>;
236
261
  message_ref: import("@sinclair/typebox").TString;
237
262
  }>;
@@ -308,6 +333,7 @@ export declare const PreIdentityNormalizedConversationSourceSchema: import("@sin
308
333
  conversation_ref: import("@sinclair/typebox").TString;
309
334
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
310
335
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
336
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
311
337
  }>;
312
338
  message_ref: import("@sinclair/typebox").TString;
313
339
  }>;
@@ -377,6 +403,7 @@ export declare const ExternalConversationRevisionObservationSchema: import("@sin
377
403
  conversation_ref: import("@sinclair/typebox").TString;
378
404
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
379
405
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
406
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
380
407
  }>;
381
408
  message_ref: import("@sinclair/typebox").TString;
382
409
  }>;
@@ -435,6 +462,7 @@ export declare const ExternalConversationRevisionObservationSchema: import("@sin
435
462
  conversation_ref: import("@sinclair/typebox").TString;
436
463
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
437
464
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
465
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
438
466
  }>;
439
467
  message_ref: import("@sinclair/typebox").TString;
440
468
  }>;
@@ -493,6 +521,7 @@ export declare const ConversationSourceIngestionEnvelopeSchema: import("@sinclai
493
521
  conversation_ref: import("@sinclair/typebox").TString;
494
522
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
495
523
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
524
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
496
525
  }>;
497
526
  message_ref: import("@sinclair/typebox").TString;
498
527
  }>;
@@ -588,6 +617,7 @@ export declare const ConversationRevisionIngestionEnvelopeSchema: import("@sincl
588
617
  conversation_ref: import("@sinclair/typebox").TString;
589
618
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
590
619
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
620
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
591
621
  }>;
592
622
  message_ref: import("@sinclair/typebox").TString;
593
623
  }>;
@@ -646,6 +676,7 @@ export declare const ConversationRevisionIngestionEnvelopeSchema: import("@sincl
646
676
  conversation_ref: import("@sinclair/typebox").TString;
647
677
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
648
678
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
679
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
649
680
  }>;
650
681
  message_ref: import("@sinclair/typebox").TString;
651
682
  }>;
@@ -694,6 +725,7 @@ export declare const ConversationIngestionEnvelopeSchema: import("@sinclair/type
694
725
  conversation_ref: import("@sinclair/typebox").TString;
695
726
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
696
727
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
728
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
697
729
  }>;
698
730
  message_ref: import("@sinclair/typebox").TString;
699
731
  }>;
@@ -788,6 +820,7 @@ export declare const ConversationIngestionEnvelopeSchema: import("@sinclair/type
788
820
  conversation_ref: import("@sinclair/typebox").TString;
789
821
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
790
822
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
823
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
791
824
  }>;
792
825
  message_ref: import("@sinclair/typebox").TString;
793
826
  }>;
@@ -846,6 +879,7 @@ export declare const ConversationIngestionEnvelopeSchema: import("@sinclair/type
846
879
  conversation_ref: import("@sinclair/typebox").TString;
847
880
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
848
881
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
882
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
849
883
  }>;
850
884
  message_ref: import("@sinclair/typebox").TString;
851
885
  }>;
@@ -885,13 +919,13 @@ export declare const IntegrationDeliveryDispositionSchema: import("@sinclair/typ
885
919
  }>, import("@sinclair/typebox").TObject<{
886
920
  kind: import("@sinclair/typebox").TLiteral<"host_incompatible">;
887
921
  retryable: import("@sinclair/typebox").TLiteral<true>;
888
- reason_code: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"integration_source_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_attachment_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_managed_reference_ingestion_unsupported">]>;
922
+ reason_code: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"integration_source_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_attachment_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_managed_reference_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_clarification_unsupported">]>;
889
923
  }>, import("@sinclair/typebox").TObject<{
890
924
  kind: import("@sinclair/typebox").TLiteral<"invalid">;
891
925
  reason_code: import("@sinclair/typebox").TString;
892
926
  }>]>;
893
927
  export declare const IntegrationConversationSourceDeliveryRequestSchema: import("@sinclair/typebox").TObject<{
894
- protocol_version: import("@sinclair/typebox").TLiteral<2>;
928
+ protocol_version: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<2>, import("@sinclair/typebox").TLiteral<3>]>;
895
929
  command_id: import("@sinclair/typebox").TString;
896
930
  relay_project_ref: import("@sinclair/typebox").TString;
897
931
  binding_ref: import("@sinclair/typebox").TString;
@@ -922,6 +956,7 @@ export declare const IntegrationConversationSourceDeliveryRequestSchema: import(
922
956
  conversation_ref: import("@sinclair/typebox").TString;
923
957
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
924
958
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
959
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
925
960
  }>;
926
961
  message_ref: import("@sinclair/typebox").TString;
927
962
  }>;
@@ -980,6 +1015,7 @@ export declare const IntegrationConversationSourceDeliveryRequestSchema: import(
980
1015
  observed_at: import("@sinclair/typebox").TString;
981
1016
  adapter_version: import("@sinclair/typebox").TString;
982
1017
  }>;
1018
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
983
1019
  }>;
984
1020
  export declare const IntegrationReferenceAttachmentStageRequestSchema: import("@sinclair/typebox").TObject<{
985
1021
  protocol_version: import("@sinclair/typebox").TLiteral<1>;
@@ -1007,6 +1043,7 @@ export declare const IntegrationReferenceAttachmentStageRequestSchema: import("@
1007
1043
  conversation_ref: import("@sinclair/typebox").TString;
1008
1044
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1009
1045
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1046
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1010
1047
  }>;
1011
1048
  message_ref: import("@sinclair/typebox").TString;
1012
1049
  }>;
@@ -1447,7 +1484,7 @@ export declare const TrustedConversationSourceIngestionCommandSchema: import("@s
1447
1484
  received_at: import("@sinclair/typebox").TString;
1448
1485
  attempt: import("@sinclair/typebox").TInteger;
1449
1486
  }>;
1450
- actor: import("@sinclair/typebox").TObject<{
1487
+ actor: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1451
1488
  kind: import("@sinclair/typebox").TLiteral<"human">;
1452
1489
  account_ref: import("@sinclair/typebox").TString;
1453
1490
  display_name: import("@sinclair/typebox").TString;
@@ -1466,7 +1503,27 @@ export declare const TrustedConversationSourceIngestionCommandSchema: import("@s
1466
1503
  }>;
1467
1504
  binding_ref: import("@sinclair/typebox").TString;
1468
1505
  verified_at: import("@sinclair/typebox").TString;
1469
- }>;
1506
+ }>, import("@sinclair/typebox").TObject<{
1507
+ kind: import("@sinclair/typebox").TLiteral<"bot">;
1508
+ purpose: import("@sinclair/typebox").TLiteral<"development_operator">;
1509
+ channel: import("@sinclair/typebox").TLiteral<"platform_chat">;
1510
+ account_ref: import("@sinclair/typebox").TString;
1511
+ display_name: import("@sinclair/typebox").TString;
1512
+ membership: import("@sinclair/typebox").TObject<{
1513
+ relay_project_ref: import("@sinclair/typebox").TString;
1514
+ label: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"member">]>;
1515
+ }>;
1516
+ external_subject: import("@sinclair/typebox").TObject<{
1517
+ installation: import("@sinclair/typebox").TObject<{
1518
+ platform: import("@sinclair/typebox").TString;
1519
+ installation_ref: import("@sinclair/typebox").TString;
1520
+ }>;
1521
+ subject_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"human">, import("@sinclair/typebox").TLiteral<"bot">, import("@sinclair/typebox").TLiteral<"app">, import("@sinclair/typebox").TLiteral<"system">]>;
1522
+ subject_ref: import("@sinclair/typebox").TString;
1523
+ }>;
1524
+ binding_ref: import("@sinclair/typebox").TString;
1525
+ verified_at: import("@sinclair/typebox").TString;
1526
+ }>]>;
1470
1527
  source: import("@sinclair/typebox").TObject<{
1471
1528
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
1472
1529
  source_ref: import("@sinclair/typebox").TString;
@@ -1483,6 +1540,7 @@ export declare const TrustedConversationSourceIngestionCommandSchema: import("@s
1483
1540
  conversation_ref: import("@sinclair/typebox").TString;
1484
1541
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1485
1542
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1543
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1486
1544
  }>;
1487
1545
  message_ref: import("@sinclair/typebox").TString;
1488
1546
  }>;
@@ -1543,6 +1601,7 @@ export declare const TrustedConversationSourceIngestionCommandSchema: import("@s
1543
1601
  observed_at: import("@sinclair/typebox").TString;
1544
1602
  adapter_version: import("@sinclair/typebox").TString;
1545
1603
  }>;
1604
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1546
1605
  }>;
1547
1606
  export declare const IntegrationReferenceAttachmentDeliveryRequestSchema: import("@sinclair/typebox").TObject<{
1548
1607
  protocol_version: import("@sinclair/typebox").TLiteral<1>;
@@ -1570,6 +1629,7 @@ export declare const IntegrationReferenceAttachmentDeliveryRequestSchema: import
1570
1629
  conversation_ref: import("@sinclair/typebox").TString;
1571
1630
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1572
1631
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1632
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1573
1633
  }>;
1574
1634
  message_ref: import("@sinclair/typebox").TString;
1575
1635
  }>;
@@ -1648,6 +1708,7 @@ export declare const TrustedReferenceAttachmentIngestionCommandSchema: import("@
1648
1708
  conversation_ref: import("@sinclair/typebox").TString;
1649
1709
  thread_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1650
1710
  parent_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1711
+ root_message_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1651
1712
  }>;
1652
1713
  message_ref: import("@sinclair/typebox").TString;
1653
1714
  }>;
@@ -1733,7 +1794,7 @@ export declare const IntegrationConversationSourceDeliveryResponseSchema: import
1733
1794
  }>, import("@sinclair/typebox").TObject<{
1734
1795
  kind: import("@sinclair/typebox").TLiteral<"host_incompatible">;
1735
1796
  retryable: import("@sinclair/typebox").TLiteral<true>;
1736
- reason_code: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"integration_source_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_attachment_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_managed_reference_ingestion_unsupported">]>;
1797
+ reason_code: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"integration_source_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_attachment_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_managed_reference_ingestion_unsupported">, import("@sinclair/typebox").TLiteral<"integration_clarification_unsupported">]>;
1737
1798
  }>, import("@sinclair/typebox").TObject<{
1738
1799
  kind: import("@sinclair/typebox").TLiteral<"invalid">;
1739
1800
  reason_code: import("@sinclair/typebox").TString;
@@ -1765,6 +1826,7 @@ export declare const PlatformOutboundApprovalRequestContentSchema: import("@sinc
1765
1826
  export declare const PlatformOutboundContentSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1766
1827
  kind: import("@sinclair/typebox").TLiteral<"text">;
1767
1828
  text: import("@sinclair/typebox").TString;
1829
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1768
1830
  }>, import("@sinclair/typebox").TObject<{
1769
1831
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
1770
1832
  approval_id: import("@sinclair/typebox").TString;
@@ -1780,6 +1842,16 @@ export declare const PlatformOutboundContentSchema: import("@sinclair/typebox").
1780
1842
  label: import("@sinclair/typebox").TString;
1781
1843
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
1782
1844
  }>>;
1845
+ }>, import("@sinclair/typebox").TObject<{
1846
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
1847
+ round_id: import("@sinclair/typebox").TString;
1848
+ version: import("@sinclair/typebox").TInteger;
1849
+ answer_revision: import("@sinclair/typebox").TInteger;
1850
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
1851
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
1852
+ title: import("@sinclair/typebox").TString;
1853
+ request: import("@sinclair/typebox").TString;
1854
+ opened_at: import("@sinclair/typebox").TString;
1783
1855
  }>]>;
1784
1856
  export declare const PlatformOutboundEventSchema: import("@sinclair/typebox").TObject<{
1785
1857
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -1806,6 +1878,7 @@ export declare const PlatformOutboundIntentSchema: import("@sinclair/typebox").T
1806
1878
  readonly content: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1807
1879
  kind: import("@sinclair/typebox").TLiteral<"text">;
1808
1880
  text: import("@sinclair/typebox").TString;
1881
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1809
1882
  }>, import("@sinclair/typebox").TObject<{
1810
1883
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
1811
1884
  approval_id: import("@sinclair/typebox").TString;
@@ -1821,6 +1894,16 @@ export declare const PlatformOutboundIntentSchema: import("@sinclair/typebox").T
1821
1894
  label: import("@sinclair/typebox").TString;
1822
1895
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
1823
1896
  }>>;
1897
+ }>, import("@sinclair/typebox").TObject<{
1898
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
1899
+ round_id: import("@sinclair/typebox").TString;
1900
+ version: import("@sinclair/typebox").TInteger;
1901
+ answer_revision: import("@sinclair/typebox").TInteger;
1902
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
1903
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
1904
+ title: import("@sinclair/typebox").TString;
1905
+ request: import("@sinclair/typebox").TString;
1906
+ opened_at: import("@sinclair/typebox").TString;
1824
1907
  }>]>;
1825
1908
  readonly event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1826
1909
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -1851,6 +1934,7 @@ export declare const RelayAuthorizedPlatformOutboundIntentSchema: import("@sincl
1851
1934
  content: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1852
1935
  kind: import("@sinclair/typebox").TLiteral<"text">;
1853
1936
  text: import("@sinclair/typebox").TString;
1937
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1854
1938
  }>, import("@sinclair/typebox").TObject<{
1855
1939
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
1856
1940
  approval_id: import("@sinclair/typebox").TString;
@@ -1866,6 +1950,16 @@ export declare const RelayAuthorizedPlatformOutboundIntentSchema: import("@sincl
1866
1950
  label: import("@sinclair/typebox").TString;
1867
1951
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
1868
1952
  }>>;
1953
+ }>, import("@sinclair/typebox").TObject<{
1954
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
1955
+ round_id: import("@sinclair/typebox").TString;
1956
+ version: import("@sinclair/typebox").TInteger;
1957
+ answer_revision: import("@sinclair/typebox").TInteger;
1958
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
1959
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
1960
+ title: import("@sinclair/typebox").TString;
1961
+ request: import("@sinclair/typebox").TString;
1962
+ opened_at: import("@sinclair/typebox").TString;
1869
1963
  }>]>;
1870
1964
  event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1871
1965
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -1895,6 +1989,7 @@ export declare const PlatformOutboundTextIntentSchema: import("@sinclair/typebox
1895
1989
  readonly content: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1896
1990
  kind: import("@sinclair/typebox").TLiteral<"text">;
1897
1991
  text: import("@sinclair/typebox").TString;
1992
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1898
1993
  }>, import("@sinclair/typebox").TObject<{
1899
1994
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
1900
1995
  approval_id: import("@sinclair/typebox").TString;
@@ -1910,6 +2005,16 @@ export declare const PlatformOutboundTextIntentSchema: import("@sinclair/typebox
1910
2005
  label: import("@sinclair/typebox").TString;
1911
2006
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
1912
2007
  }>>;
2008
+ }>, import("@sinclair/typebox").TObject<{
2009
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
2010
+ round_id: import("@sinclair/typebox").TString;
2011
+ version: import("@sinclair/typebox").TInteger;
2012
+ answer_revision: import("@sinclair/typebox").TInteger;
2013
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
2014
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
2015
+ title: import("@sinclair/typebox").TString;
2016
+ request: import("@sinclair/typebox").TString;
2017
+ opened_at: import("@sinclair/typebox").TString;
1913
2018
  }>]>;
1914
2019
  readonly event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1915
2020
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -1940,6 +2045,7 @@ export declare const RelayAuthorizedPlatformOutboundTextIntentSchema: import("@s
1940
2045
  content: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1941
2046
  kind: import("@sinclair/typebox").TLiteral<"text">;
1942
2047
  text: import("@sinclair/typebox").TString;
2048
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1943
2049
  }>, import("@sinclair/typebox").TObject<{
1944
2050
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
1945
2051
  approval_id: import("@sinclair/typebox").TString;
@@ -1955,6 +2061,16 @@ export declare const RelayAuthorizedPlatformOutboundTextIntentSchema: import("@s
1955
2061
  label: import("@sinclair/typebox").TString;
1956
2062
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
1957
2063
  }>>;
2064
+ }>, import("@sinclair/typebox").TObject<{
2065
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
2066
+ round_id: import("@sinclair/typebox").TString;
2067
+ version: import("@sinclair/typebox").TInteger;
2068
+ answer_revision: import("@sinclair/typebox").TInteger;
2069
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
2070
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
2071
+ title: import("@sinclair/typebox").TString;
2072
+ request: import("@sinclair/typebox").TString;
2073
+ opened_at: import("@sinclair/typebox").TString;
1958
2074
  }>]>;
1959
2075
  event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1960
2076
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -2147,6 +2263,7 @@ export declare const IntegrationOutboundClaimResponseSchema: import("@sinclair/t
2147
2263
  content: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
2148
2264
  kind: import("@sinclair/typebox").TLiteral<"text">;
2149
2265
  text: import("@sinclair/typebox").TString;
2266
+ clarification_round_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2150
2267
  }>, import("@sinclair/typebox").TObject<{
2151
2268
  kind: import("@sinclair/typebox").TLiteral<"approval_request">;
2152
2269
  approval_id: import("@sinclair/typebox").TString;
@@ -2162,6 +2279,16 @@ export declare const IntegrationOutboundClaimResponseSchema: import("@sinclair/t
2162
2279
  label: import("@sinclair/typebox").TString;
2163
2280
  tone: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"primary">, import("@sinclair/typebox").TLiteral<"neutral">, import("@sinclair/typebox").TLiteral<"danger">]>;
2164
2281
  }>>;
2282
+ }>, import("@sinclair/typebox").TObject<{
2283
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
2284
+ round_id: import("@sinclair/typebox").TString;
2285
+ version: import("@sinclair/typebox").TInteger;
2286
+ answer_revision: import("@sinclair/typebox").TInteger;
2287
+ closed_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resolved">, import("@sinclair/typebox").TLiteral<"contract_changed">, import("@sinclair/typebox").TLiteral<"cancelled">]>>;
2288
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"writable">, import("@sinclair/typebox").TLiteral<"submitted">, import("@sinclair/typebox").TLiteral<"continued">, import("@sinclair/typebox").TLiteral<"closed">]>;
2289
+ title: import("@sinclair/typebox").TString;
2290
+ request: import("@sinclair/typebox").TString;
2291
+ opened_at: import("@sinclair/typebox").TString;
2165
2292
  }>]>;
2166
2293
  event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
2167
2294
  kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chat_response">, import("@sinclair/typebox").TLiteral<"needs_input">, import("@sinclair/typebox").TLiteral<"task_completed">, import("@sinclair/typebox").TLiteral<"task_failed">]>;
@@ -1,7 +1,8 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { Value } from "@sinclair/typebox/value";
3
3
  import { ExternalReferenceDescriptorSchema } from "../api/external-references.js";
4
- import { IdempotencyKeySchema, IsoDateTimeStringSchema, MessageIdSchema, RelayAccountRefSchema, RelayProjectRefSchema, } from "../domain/index.js";
4
+ import { PlatformClarificationContentSchema } from "./platform-clarification-content.js";
5
+ import { IdempotencyKeySchema, ClarificationRoundRefSchema, IsoDateTimeStringSchema, MessageIdSchema, RelayAccountRefSchema, RelayProjectRefSchema, } from "../domain/index.js";
5
6
  import { MAX_REFERENCE_STAGED_UPLOAD_BYTES, PresignedUploadPutSchema, ReferenceStagedUploadReferenceProperties, RelayUploadProjectionSchema, } from "../api/uploads.js";
6
7
  export const PlatformAdapterKeySchema = Type.String({
7
8
  minLength: 1,
@@ -27,6 +28,7 @@ export const PlatformConversationLocatorSchema = Type.Object({
27
28
  conversation_ref: ExternalObjectRefSchema,
28
29
  thread_ref: Type.Optional(ExternalObjectRefSchema),
29
30
  parent_message_ref: Type.Optional(ExternalObjectRefSchema),
31
+ root_message_ref: Type.Optional(ExternalObjectRefSchema),
30
32
  }, { additionalProperties: false });
31
33
  export const ExternalMessageLocatorSchema = Type.Object({
32
34
  conversation: PlatformConversationLocatorSchema,
@@ -74,6 +76,12 @@ export const TrustedSystemIntegrationActorContextSchema = Type.Object({
74
76
  binding_ref: Type.Optional(IntegrationOwnedRefSchema),
75
77
  verified_at: IsoDateTimeStringSchema,
76
78
  }, { additionalProperties: false });
79
+ export const TrustedDevelopmentBotActorContextSchema = Type.Object({
80
+ ...TrustedHumanIntegrationActorContextSchema.properties,
81
+ kind: Type.Literal("bot"),
82
+ purpose: Type.Literal("development_operator"),
83
+ channel: Type.Literal("platform_chat"),
84
+ }, { additionalProperties: false });
77
85
  export const TrustedIntegrationActorContextSchema = Type.Union([
78
86
  TrustedHumanIntegrationActorContextSchema,
79
87
  TrustedSystemIntegrationActorContextSchema,
@@ -238,6 +246,7 @@ export const IntegrationDeliveryDispositionSchema = Type.Union([
238
246
  Type.Literal("integration_source_ingestion_unsupported"),
239
247
  Type.Literal("integration_attachment_ingestion_unsupported"),
240
248
  Type.Literal("integration_managed_reference_ingestion_unsupported"),
249
+ Type.Literal("integration_clarification_unsupported"),
241
250
  ]),
242
251
  }, { additionalProperties: false }),
243
252
  Type.Object({
@@ -246,12 +255,13 @@ export const IntegrationDeliveryDispositionSchema = Type.Union([
246
255
  }, { additionalProperties: false }),
247
256
  ]);
248
257
  export const IntegrationConversationSourceDeliveryRequestSchema = Type.Object({
249
- protocol_version: Type.Literal(2),
258
+ protocol_version: Type.Union([Type.Literal(2), Type.Literal(3)]),
250
259
  command_id: IdempotencyKeySchema,
251
260
  relay_project_ref: RelayProjectRefSchema,
252
261
  binding_ref: IntegrationOwnedRefSchema,
253
262
  receipt: InboundIntegrationEventReceiptSchema,
254
263
  source: PreIdentityNormalizedConversationSourceSchema,
264
+ clarification_round_ref: Type.Optional(ClarificationRoundRefSchema),
255
265
  }, { additionalProperties: false });
256
266
  export const IntegrationReferenceAttachmentStageRequestSchema = Type.Object({
257
267
  protocol_version: Type.Literal(1),
@@ -452,8 +462,12 @@ export const TrustedConversationSourceIngestionCommandSchema = Type.Object({
452
462
  relay_project_ref: RelayProjectRefSchema,
453
463
  binding_ref: IntegrationOwnedRefSchema,
454
464
  receipt: InboundIntegrationEventReceiptSchema,
455
- actor: TrustedHumanIntegrationActorContextSchema,
465
+ actor: Type.Union([
466
+ TrustedHumanIntegrationActorContextSchema,
467
+ TrustedDevelopmentBotActorContextSchema,
468
+ ]),
456
469
  source: NormalizedConversationSourceSchema,
470
+ clarification_round_ref: Type.Optional(ClarificationRoundRefSchema),
457
471
  }, { additionalProperties: false });
458
472
  export const IntegrationReferenceAttachmentDeliveryRequestSchema = Type.Object({
459
473
  protocol_version: Type.Literal(1),
@@ -503,6 +517,7 @@ export const IntegrationConversationSourceDeliveryResponseSchema = Type.Object({
503
517
  const PlatformOutboundTextContentSchema = Type.Object({
504
518
  kind: Type.Literal("text"),
505
519
  text: Type.String({ minLength: 1, maxLength: 4_000 }),
520
+ clarification_round_ref: Type.Optional(ClarificationRoundRefSchema),
506
521
  }, { additionalProperties: false });
507
522
  export const PlatformApprovalCardRevisionSchema = Type.String({
508
523
  minLength: 1,
@@ -537,6 +552,7 @@ export const PlatformOutboundApprovalRequestContentSchema = Type.Object({
537
552
  export const PlatformOutboundContentSchema = Type.Union([
538
553
  PlatformOutboundTextContentSchema,
539
554
  PlatformOutboundApprovalRequestContentSchema,
555
+ PlatformClarificationContentSchema,
540
556
  ]);
541
557
  export const PlatformOutboundEventSchema = Type.Object({
542
558
  kind: Type.Union([
@@ -759,8 +775,13 @@ export function isIntegrationConversationSourceDeliveryRequest(value) {
759
775
  const request = value;
760
776
  const sourceInstallation = request.source.locator.conversation.installation;
761
777
  const sourceSubject = request.source.author.external_subject;
762
- return (request.receipt.event_kind === "conversation_source" &&
763
- sourceSubject.subject_kind === "human" &&
778
+ return ((request.clarification_round_ref === undefined
779
+ ? request.protocol_version === 2
780
+ : request.protocol_version === 3 &&
781
+ (request.source.locator.conversation.parent_message_ref !== undefined ||
782
+ request.source.locator.conversation.root_message_ref !== undefined)) &&
783
+ request.receipt.event_kind === "conversation_source" &&
784
+ (sourceSubject.subject_kind === "human" || sourceSubject.subject_kind === "bot") &&
764
785
  sameInstallation(request.receipt.installation, sourceInstallation) &&
765
786
  sameInstallation(request.receipt.installation, sourceSubject.installation));
766
787
  }
@@ -860,6 +881,9 @@ export function isTrustedConversationSourceIngestionCommand(value) {
860
881
  const sourceInstallation = command.source.locator.conversation.installation;
861
882
  const sourceAuthor = command.source.author;
862
883
  return (command.receipt.event_kind === "conversation_source" &&
884
+ command.actor.external_subject.subject_kind ===
885
+ (command.actor.kind === "bot" ? "bot" : "human") &&
886
+ (command.actor.kind !== "bot" || command.actor.membership.label === "member") &&
863
887
  command.actor.membership.relay_project_ref === command.relay_project_ref &&
864
888
  command.actor.binding_ref === command.binding_ref &&
865
889
  command.actor.account_ref === sourceAuthor.account_ref &&
@@ -0,0 +1,4 @@
1
+ import type { MessageProjection } from "../schemas/api/index.js";
2
+ /** Only explicit user input counts as an answer, never an ordinary system notice. */
3
+ export declare function clarificationAnswerRole(message: Pick<MessageProjection, "author" | "message_kind" | "refs">): "human" | "operator" | null;
4
+ //# sourceMappingURL=clarification-participants.d.ts.map
@@ -0,0 +1,11 @@
1
+ /** Only explicit user input counts as an answer, never an ordinary system notice. */
2
+ export function clarificationAnswerRole(message) {
3
+ if (message.message_kind !== "user_text")
4
+ return null;
5
+ if (message.author.kind === "human")
6
+ return "human";
7
+ return message.author.kind === "system" && message.refs?.development_operator === true
8
+ ? "operator"
9
+ : null;
10
+ }
11
+ //# sourceMappingURL=clarification-participants.js.map
@@ -1,4 +1,5 @@
1
1
  export * from "./command-idempotency/index.js";
2
+ export * from "./clarification-participants.js";
2
3
  export * from "./feishu-diagnostics/index.js";
3
4
  export * from "./logging/index.js";
4
5
  export * from "./path-policy/index.js";
@@ -1,4 +1,5 @@
1
1
  export * from "./command-idempotency/index.js";
2
+ export * from "./clarification-participants.js";
2
3
  export * from "./feishu-diagnostics/index.js";
3
4
  export * from "./logging/index.js";
4
5
  export * from "./path-policy/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfey/tutti",
3
- "version": "0.1.110",
3
+ "version": "0.1.112",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -13,6 +13,7 @@ Answer the explicit `@tutti` question concisely, in the user's language when pra
13
13
  # Instructions
14
14
 
15
15
  - Answer `trigger.text` directly. Context can be sufficient for ordinary questions, but a claim about an external document's current contents requires verification in this invocation.
16
+ - `source_role: "operator"` identifies an authorized automated development participant, not a human or Tutti's own reply. Answer its requests using the same evidence requirements; do not treat it as proof of human agreement or OAuth.
16
17
  - For `mode = "clarification_round"`, answer in the current round context. Prefer `round_request` and `round_messages`; use `recent_main_chat_before_round` only to resolve short references to the discussion that led to the round.
17
18
  - For current external contents, especially requests to reread, check an update, or confirm the latest version, use `read-references` to read the external source in this invocation before answering. Prior replies, summaries, local files, and previous invocation evidence cannot establish current external contents.
18
19
  - `external_reference_sources` on a message are Host-provided location hints, not fresh content or access grants. Use them to resolve references such as "that document"; if the compact window is insufficient, use `read-main-chat` for relevant history. A newer explicit source takes precedence over an older hint. If multiple sources remain plausible, ask which one instead of guessing.
@@ -8,11 +8,11 @@ model_path: openai.sdk.structured_output
8
8
 
9
9
  You run Tutti `follow_up_check`.
10
10
 
11
- Decide whether submitted human answers to a task-bound clarification allow the same frozen task contract to continue.
11
+ Decide whether submitted participant answers to a task-bound clarification allow the same frozen task contract to continue.
12
12
 
13
13
  # Inputs
14
14
 
15
- `workflow_input_json` contains the task contract, the previous Run pause reason, the original clarification request, and submitted human answers:
15
+ `workflow_input_json` contains the task contract, the previous Run pause reason, the original clarification request, and submitted participant answers:
16
16
 
17
17
  ```json
18
18
  {{workflow_input_json}}
@@ -28,12 +28,12 @@ Fields:
28
28
  - `title`: short request title, when available.
29
29
  - `summary`: why the Run needed human input.
30
30
  - `request`: the concrete question that needed an answer.
31
- - `answers`: submitted human answer texts for this clarification round, in message order.
31
+ - `answers`: sealed answers for this clarification round, in message order. Each item has `role` (`human` or an authorized `operator`) and `text`. Preserve that provenance; an operator answer is not a claim that a human took the action.
32
32
 
33
33
  # Decision Rules
34
34
 
35
35
  - `workflow_input_json` is the complete context for this decision.
36
- - Treat `goal` and `scope` as the frozen task contract, `previous_run.summary` and `previous_run.clarification_request_payload` as the identified human decision, and `answers` as the submitted human reply.
36
+ - Treat `goal` and `scope` as the frozen task contract, `previous_run.summary` and `previous_run.clarification_request_payload` as the identified decision, and `answers` as the submitted participant reply.
37
37
  - Evaluate only whether the answers resolve that decision within the same frozen task contract.
38
38
  - Return `resume` when the blocker is resolved without changing the contract.
39
39
  - Return `needs_more_input` when the same human decision remains unresolved but can still be answered within the contract.