@xfey/tutti 0.1.111 → 0.1.113

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 (67) hide show
  1. package/dist/approvals/decision-command.d.ts +2 -2
  2. package/dist/chat-assistant/index.d.ts +1 -1
  3. package/dist/chat-assistant/index.js +19 -6
  4. package/dist/collaboration-ingestion/clarification.d.ts +25 -0
  5. package/dist/collaboration-ingestion/clarification.js +63 -0
  6. package/dist/collaboration-ingestion/external-source.d.ts +2 -0
  7. package/dist/collaboration-ingestion/external-source.js +35 -0
  8. package/dist/collaboration-ingestion/index.d.ts +2 -0
  9. package/dist/collaboration-ingestion/index.js +2 -0
  10. package/dist/collaboration-ingestion/platform-clarification.d.ts +10 -0
  11. package/dist/collaboration-ingestion/platform-clarification.js +42 -0
  12. package/dist/collaboration-state/clarification-messages.js +3 -2
  13. package/dist/collaboration-state/clarification-records.d.ts +1 -1
  14. package/dist/collaboration-state/clarification-records.js +7 -5
  15. package/dist/collaboration-state/clarification-rounds.js +5 -5
  16. package/dist/collaboration-state/clarification-snapshot.d.ts +228 -0
  17. package/dist/collaboration-state/clarification-snapshot.js +29 -0
  18. package/dist/collaboration-state/clarification-successors.js +6 -6
  19. package/dist/collaboration-state/index.d.ts +1 -0
  20. package/dist/collaboration-state/index.js +1 -0
  21. package/dist/collaboration-state/run-recording.js +1 -1
  22. package/dist/collaboration-state/task-compile-context.d.ts +1 -1
  23. package/dist/collaboration-state/types.d.ts +1 -0
  24. package/dist/control-plane/clarification-commands.d.ts +3 -2
  25. package/dist/control-plane/clarification-commands.js +13 -4
  26. package/dist/control-plane/follow-up-context.js +8 -14
  27. package/dist/control-plane/index.d.ts +3 -2
  28. package/dist/control-plane/task-compile-clarification-context.js +7 -2
  29. package/dist/control-plane/types.d.ts +1 -0
  30. package/dist/control-plane/workflows/openai.js +5 -4
  31. package/dist/platform-outbound/repository.js +83 -4
  32. package/dist/server-shell/cli/host-lifecycle.js +1 -0
  33. package/dist/server-shell/cli/host-server-runtime.d.ts +2 -1
  34. package/dist/server-shell/cli/host-server-runtime.js +4 -2
  35. package/dist/server-shell/cli/relay-registration.js +1 -0
  36. package/dist/server-shell/http/host-tunnel.d.ts +2 -1
  37. package/dist/server-shell/http/host-tunnel.js +4 -1
  38. package/dist/server-shell/http/integration-clarification-dispatch.d.ts +6 -0
  39. package/dist/server-shell/http/integration-clarification-dispatch.js +43 -0
  40. package/dist/server-shell/http/routes/project-api/clarification-routes.js +16 -42
  41. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +2 -0
  42. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +1 -0
  43. package/dist/server-shell/http/routes/project-api/openapi.d.ts +3 -0
  44. package/dist/server-shell/http/routes/project-api/schemas.d.ts +1 -0
  45. package/migrations/0022_clarification_projection_cursors.sql +7 -0
  46. package/node_modules/@tutti/relay-client/dist/host-control.d.ts +1 -0
  47. package/node_modules/@tutti/relay-client/dist/host-control.js +3 -0
  48. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +13 -1
  49. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.js +9 -2
  50. package/node_modules/@tutti/shared/dist/schemas/internal/index.d.ts +2 -0
  51. package/node_modules/@tutti/shared/dist/schemas/internal/index.js +2 -0
  52. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification-content.d.ts +15 -0
  53. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification-content.js +24 -0
  54. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification.d.ts +354 -0
  55. package/node_modules/@tutti/shared/dist/schemas/internal/platform-clarification.js +94 -0
  56. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.d.ts +89 -3
  57. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.js +15 -3
  58. package/node_modules/@tutti/shared/dist/utils/clarification-participants.d.ts +4 -0
  59. package/node_modules/@tutti/shared/dist/utils/clarification-participants.js +11 -0
  60. package/node_modules/@tutti/shared/dist/utils/index.d.ts +1 -0
  61. package/node_modules/@tutti/shared/dist/utils/index.js +1 -0
  62. package/package.json +1 -1
  63. package/prompts/procedures/follow-up-check.md +4 -4
  64. package/web/assets/{homepage-motion-scene-TmkKf8wQ.js → homepage-motion-scene-BwdH6Iss.js} +1 -1
  65. package/web/assets/index-B29RuNsd.js +69 -0
  66. package/web/index.html +1 -1
  67. package/web/assets/index-B1oL1p9_.js +0 -69
@@ -1,9 +1,8 @@
1
1
  import { ActiveClarificationProjectionSchema, GetClarificationRoundMessagesRequestSchema, GetClarificationRoundResponseSchema, GetClarificationThreadResponseSchema, MessageWindowSchema, SendClarificationRoundMessageBodySchema, SendClarificationRoundMessageResponseSchema, SubmitClarificationRoundBodySchema, SubmitClarificationRoundResponseSchema, } from "@tutti/shared/schemas/api";
2
2
  import { readActiveClarificationProjection, readClarificationRoundMessagesWindow, readClarificationRoundProjection, readClarificationThreadResponse, } from "../../../../collaboration-state/index.js";
3
- import { executeIdempotentCommand } from "../../../command-idempotency/index.js";
3
+ import { ingestClarificationMessage, submitClarificationAnswers, } from "../../../../collaboration-ingestion/index.js";
4
4
  import { HOST_PROJECT_API_BASE_PATH } from "./constants.js";
5
5
  import { HostProjectNotFoundError } from "./errors.js";
6
- import { clarificationRoundInvalidates } from "./invalidations.js";
7
6
  import { requireValidMessageWindowRequest, requireValidRoundMessagePayload, } from "./payload-validation.js";
8
7
  import { ClarificationRoundParamsSchema, ClarificationThreadParamsSchema, } from "./schemas.js";
9
8
  import { requireControlPlane, requireHostProjectSession, requireProjectStore, } from "./session-requirements.js";
@@ -85,35 +84,20 @@ export function registerClarificationRoutes(app, options) {
85
84
  const store = requireProjectStore(options);
86
85
  const controlPlane = requireControlPlane(options);
87
86
  const payload = requireValidRoundMessagePayload(request.body.payload);
88
- const execution = executeIdempotentCommand({
89
- db: store.db,
90
- command_id: request.body.command_id,
91
- command_name: "clarification.message.create",
92
- target_ref: request.params.roundId,
93
- payload: {
94
- body: payload.body,
95
- author_ref: session.account.account_ref,
96
- },
97
- ...(options.now === undefined ? {} : { now: options.now }),
98
- execute: () => controlPlane.sendClarificationRoundMessage(request.params.roundId, payload, {
87
+ return ingestClarificationMessage({
88
+ store,
89
+ controlPlane,
90
+ commandId: request.body.command_id,
91
+ roundId: request.params.roundId,
92
+ payload,
93
+ author: {
99
94
  account_ref: session.account.account_ref,
100
95
  display_name: session.account.display_name,
101
96
  avatar: session.account.avatar,
102
- }),
97
+ },
98
+ ...(options.now === undefined ? {} : { now: options.now }),
99
+ ...(options.chatAssistant === undefined ? {} : { chatAssistant: options.chatAssistant }),
103
100
  });
104
- const response = {
105
- command_id: execution.command_id,
106
- disposition: execution.disposition,
107
- invalidates: clarificationRoundInvalidates(request.params.roundId),
108
- };
109
- if (execution.result !== undefined) {
110
- response.result = execution.result;
111
- }
112
- const message = execution.result?.message;
113
- if (!execution.replayed && message !== undefined) {
114
- options.chatAssistant?.enqueue({ message });
115
- }
116
- return response;
117
101
  });
118
102
  app.post(`${HOST_PROJECT_API_BASE_PATH}/clarifications/rounds/:roundId/submit`, {
119
103
  schema: {
@@ -127,24 +111,14 @@ export function registerClarificationRoutes(app, options) {
127
111
  requireHostProjectSession(request, options);
128
112
  const store = requireProjectStore(options);
129
113
  const controlPlane = requireControlPlane(options);
130
- const execution = executeIdempotentCommand({
131
- db: store.db,
132
- command_id: request.body.command_id,
133
- command_name: "clarification.round.submit",
134
- target_ref: request.params.roundId,
114
+ return submitClarificationAnswers({
115
+ store,
116
+ controlPlane,
117
+ commandId: request.body.command_id,
118
+ roundId: request.params.roundId,
135
119
  payload: request.body.payload,
136
120
  ...(options.now === undefined ? {} : { now: options.now }),
137
- execute: () => controlPlane.submitClarificationRound(request.params.roundId, request.body.payload, request.body.command_id),
138
121
  });
139
- const response = {
140
- command_id: execution.command_id,
141
- disposition: execution.disposition,
142
- invalidates: clarificationRoundInvalidates(request.params.roundId),
143
- };
144
- if (execution.result !== undefined) {
145
- response.result = execution.result;
146
- }
147
- return response;
148
122
  });
149
123
  }
150
124
  //# sourceMappingURL=clarification-routes.js.map
@@ -266,6 +266,7 @@ export declare const HOST_PROJECT_COLLABORATION_OPENAPI_ROUTES: ({
266
266
  }>;
267
267
  card_message_id: import("@sinclair/typebox").TString;
268
268
  opening_message_id: import("@sinclair/typebox").TString;
269
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
269
270
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
270
271
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
271
272
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -421,6 +422,7 @@ export declare const HOST_PROJECT_COLLABORATION_OPENAPI_ROUTES: ({
421
422
  }>;
422
423
  card_message_id: import("@sinclair/typebox").TString;
423
424
  opening_message_id: import("@sinclair/typebox").TString;
425
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
424
426
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
425
427
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
426
428
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -1117,6 +1117,7 @@ export declare const HOST_PROJECT_WORKSPACE_OPENAPI_ROUTES: ({
1117
1117
  }>;
1118
1118
  card_message_id: import("@sinclair/typebox").TString;
1119
1119
  opening_message_id: import("@sinclair/typebox").TString;
1120
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1120
1121
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1121
1122
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
1122
1123
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -410,6 +410,7 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
410
410
  }>;
411
411
  card_message_id: import("@sinclair/typebox").TString;
412
412
  opening_message_id: import("@sinclair/typebox").TString;
413
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
413
414
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
414
415
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
415
416
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -565,6 +566,7 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
565
566
  }>;
566
567
  card_message_id: import("@sinclair/typebox").TString;
567
568
  opening_message_id: import("@sinclair/typebox").TString;
569
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
568
570
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
569
571
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
570
572
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -2400,6 +2402,7 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
2400
2402
  }>;
2401
2403
  card_message_id: import("@sinclair/typebox").TString;
2402
2404
  opening_message_id: import("@sinclair/typebox").TString;
2405
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
2403
2406
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2404
2407
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
2405
2408
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -1081,6 +1081,7 @@ export declare const BootstrapResponseSchema: {
1081
1081
  }>;
1082
1082
  card_message_id: import("@sinclair/typebox").TString;
1083
1083
  opening_message_id: import("@sinclair/typebox").TString;
1084
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1084
1085
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1085
1086
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
1086
1087
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -0,0 +1,7 @@
1
+ CREATE TABLE platform_clarification_projection_cursors (
2
+ round_id TEXT PRIMARY KEY REFERENCES clarification_rounds(id),
3
+ binding_ref TEXT NOT NULL,
4
+ version INTEGER NOT NULL CHECK (version >= 0),
5
+ closed INTEGER NOT NULL DEFAULT 0 CHECK (closed IN (0, 1))
6
+ );
7
+ CREATE INDEX idx_platform_clarification_live ON platform_clarification_projection_cursors(closed);
@@ -45,6 +45,7 @@ export type RegisterRelayHostConnectionPayload = {
45
45
  repo_viewer: boolean;
46
46
  integration_source_ingestion_v1?: boolean;
47
47
  integration_development_bot_v1?: boolean;
48
+ integration_clarification_v1?: boolean;
48
49
  integration_external_references_v1?: boolean;
49
50
  integration_attachment_ingestion_v1?: boolean;
50
51
  integration_managed_reference_ingestion_v1?: boolean;
@@ -65,6 +65,9 @@ function createRegisterPayload(options) {
65
65
  integration_managed_reference_ingestion_v1: capabilities.integration_managed_reference_ingestion_v1 ?? false,
66
66
  integration_outbound_v1: capabilities.integration_outbound_v1 ?? false,
67
67
  integration_approval_decision_v1: capabilities.integration_approval_decision_v1 ?? false,
68
+ ...(capabilities.integration_clarification_v1 === true
69
+ ? { integration_clarification_v1: true }
70
+ : {}),
68
71
  },
69
72
  },
70
73
  };
@@ -201,6 +201,7 @@ export declare const ClarificationRoundProjectionSchema: import("@sinclair/typeb
201
201
  }>;
202
202
  card_message_id: import("@sinclair/typebox").TString;
203
203
  opening_message_id: import("@sinclair/typebox").TString;
204
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
204
205
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
205
206
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
206
207
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -299,6 +300,7 @@ export declare const ActiveClarificationProjectionSchema: import("@sinclair/type
299
300
  }>;
300
301
  card_message_id: import("@sinclair/typebox").TString;
301
302
  opening_message_id: import("@sinclair/typebox").TString;
303
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
302
304
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
303
305
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
304
306
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -437,6 +439,7 @@ export declare const GetClarificationRoundResponseSchema: import("@sinclair/type
437
439
  }>;
438
440
  card_message_id: import("@sinclair/typebox").TString;
439
441
  opening_message_id: import("@sinclair/typebox").TString;
442
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
440
443
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
441
444
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
442
445
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -471,6 +474,7 @@ export declare const SendClarificationRoundMessagePayloadSchema: import("@sincla
471
474
  }>;
472
475
  export declare const SendClarificationRoundMessageDispositionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
473
476
  kind: import("@sinclair/typebox").TLiteral<"created">;
477
+ message_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
474
478
  }>, import("@sinclair/typebox").TObject<{
475
479
  kind: import("@sinclair/typebox").TLiteral<"stale_round">;
476
480
  current_round_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -706,9 +710,16 @@ export declare const SendClarificationRoundMessageResultSchema: import("@sinclai
706
710
  }>;
707
711
  export declare const SendClarificationRoundMessageBodySchema: import("@sinclair/typebox").TSchema;
708
712
  export declare const SendClarificationRoundMessageResponseSchema: import("@sinclair/typebox").TSchema;
709
- export declare const SubmitClarificationRoundPayloadSchema: import("@sinclair/typebox").TObject<{}>;
713
+ export declare const SubmitClarificationRoundPayloadSchema: import("@sinclair/typebox").TObject<{
714
+ expected_answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
715
+ }>;
710
716
  export declare const SubmitClarificationRoundDispositionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
711
717
  kind: import("@sinclair/typebox").TLiteral<"accepted">;
718
+ }>, import("@sinclair/typebox").TObject<{
719
+ kind: import("@sinclair/typebox").TLiteral<"no_answers">;
720
+ }>, import("@sinclair/typebox").TObject<{
721
+ kind: import("@sinclair/typebox").TLiteral<"answers_changed">;
722
+ current_answer_revision: import("@sinclair/typebox").TInteger;
712
723
  }>, import("@sinclair/typebox").TObject<{
713
724
  kind: import("@sinclair/typebox").TLiteral<"already_submitted">;
714
725
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -790,6 +801,7 @@ export declare const SubmitClarificationRoundResultSchema: import("@sinclair/typ
790
801
  }>;
791
802
  card_message_id: import("@sinclair/typebox").TString;
792
803
  opening_message_id: import("@sinclair/typebox").TString;
804
+ answer_revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
793
805
  submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
794
806
  submitted_message_refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
795
807
  successor_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"not_materialized">, import("@sinclair/typebox").TLiteral<"materialized">]>;
@@ -119,6 +119,8 @@ export const ClarificationRoundProjectionSchema = Type.Object({
119
119
  request_payload: ClarificationRequestPayloadSchema,
120
120
  card_message_id: MessageIdSchema,
121
121
  opening_message_id: MessageIdSchema,
122
+ // Append-only eligible answers. Optional for compatibility with older Hosts.
123
+ answer_revision: Type.Optional(Type.Integer({ minimum: 0 })),
122
124
  submitted_at: Type.Optional(IsoDateTimeStringSchema),
123
125
  submitted_message_refs: Type.Optional(Type.Array(MessageIdSchema)),
124
126
  successor_status: Type.Union([Type.Literal("not_materialized"), Type.Literal("materialized")]),
@@ -168,7 +170,7 @@ export const SendClarificationRoundMessagePayloadSchema = Type.Object({
168
170
  body: Type.String({ minLength: 1, maxLength: 8000 }),
169
171
  }, { additionalProperties: false });
170
172
  export const SendClarificationRoundMessageDispositionSchema = Type.Union([
171
- Type.Object({ kind: Type.Literal("created") }, { additionalProperties: false }),
173
+ Type.Object({ kind: Type.Literal("created"), message_id: Type.Optional(MessageIdSchema) }, { additionalProperties: false }),
172
174
  Type.Object({
173
175
  kind: Type.Literal("stale_round"),
174
176
  current_round_id: Type.Optional(ClarificationRoundRefSchema),
@@ -181,9 +183,14 @@ export const SendClarificationRoundMessageResultSchema = Type.Object({
181
183
  }, { additionalProperties: false });
182
184
  export const SendClarificationRoundMessageBodySchema = commandEnvelopeSchema(SendClarificationRoundMessagePayloadSchema);
183
185
  export const SendClarificationRoundMessageResponseSchema = commandResponseWithResultSchema(SendClarificationRoundMessageDispositionSchema, SendClarificationRoundMessageResultSchema);
184
- export const SubmitClarificationRoundPayloadSchema = Type.Object({}, { additionalProperties: false });
186
+ export const SubmitClarificationRoundPayloadSchema = Type.Object({ expected_answer_revision: Type.Optional(Type.Integer({ minimum: 0 })) }, { additionalProperties: false });
185
187
  export const SubmitClarificationRoundDispositionSchema = Type.Union([
186
188
  Type.Object({ kind: Type.Literal("accepted") }, { additionalProperties: false }),
189
+ Type.Object({ kind: Type.Literal("no_answers") }, { additionalProperties: false }),
190
+ Type.Object({
191
+ kind: Type.Literal("answers_changed"),
192
+ current_answer_revision: Type.Integer({ minimum: 0 }),
193
+ }, { additionalProperties: false }),
187
194
  Type.Object({
188
195
  kind: Type.Literal("already_submitted"),
189
196
  successor_status: Type.Union([
@@ -75,4 +75,6 @@ export * from "./platform-integration.js";
75
75
  export * from "./feishu-user-credentials.js";
76
76
  export * from "./feishu-documents.js";
77
77
  export * from "./external-references.js";
78
+ export * from "./platform-clarification-content.js";
79
+ export * from "./platform-clarification.js";
78
80
  //# sourceMappingURL=index.d.ts.map
@@ -69,4 +69,6 @@ export * from "./platform-integration.js";
69
69
  export * from "./feishu-user-credentials.js";
70
70
  export * from "./feishu-documents.js";
71
71
  export * from "./external-references.js";
72
+ export * from "./platform-clarification-content.js";
73
+ export * from "./platform-clarification.js";
72
74
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,15 @@
1
+ import type { Static } from "@sinclair/typebox";
2
+ /** Immutable request plus a monotonic Host projection, never Integration-owned round truth. */
3
+ export declare const PlatformClarificationContentSchema: import("@sinclair/typebox").TObject<{
4
+ kind: import("@sinclair/typebox").TLiteral<"clarification">;
5
+ round_id: import("@sinclair/typebox").TString;
6
+ version: import("@sinclair/typebox").TInteger;
7
+ answer_revision: import("@sinclair/typebox").TInteger;
8
+ 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">]>>;
9
+ 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">]>;
10
+ title: import("@sinclair/typebox").TString;
11
+ request: import("@sinclair/typebox").TString;
12
+ opened_at: import("@sinclair/typebox").TString;
13
+ }>;
14
+ export type PlatformClarificationContent = Static<typeof PlatformClarificationContentSchema>;
15
+ //# sourceMappingURL=platform-clarification-content.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { ClarificationRoundRefSchema, IsoDateTimeStringSchema } from "../domain/index.js";
3
+ /** Immutable request plus a monotonic Host projection, never Integration-owned round truth. */
4
+ export const PlatformClarificationContentSchema = Type.Object({
5
+ kind: Type.Literal("clarification"),
6
+ round_id: ClarificationRoundRefSchema,
7
+ version: Type.Integer({ minimum: 0 }),
8
+ answer_revision: Type.Integer({ minimum: 0 }),
9
+ closed_reason: Type.Optional(Type.Union([
10
+ Type.Literal("resolved"),
11
+ Type.Literal("contract_changed"),
12
+ Type.Literal("cancelled"),
13
+ ])),
14
+ state: Type.Union([
15
+ Type.Literal("writable"),
16
+ Type.Literal("submitted"),
17
+ Type.Literal("continued"),
18
+ Type.Literal("closed"),
19
+ ]),
20
+ title: Type.String({ minLength: 1, maxLength: 512 }),
21
+ request: Type.String({ minLength: 1, maxLength: 4_000 }),
22
+ opened_at: IsoDateTimeStringSchema,
23
+ }, { additionalProperties: false });
24
+ //# sourceMappingURL=platform-clarification-content.js.map