@xfey/tutti 0.1.15 → 0.1.17

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 (36) hide show
  1. package/dist/collaboration-state/index.d.ts +2 -2
  2. package/dist/collaboration-state/index.js +1 -1
  3. package/dist/collaboration-state/scratchpad.d.ts +2 -2
  4. package/dist/collaboration-state/scratchpad.js +94 -7
  5. package/dist/collaboration-state/storage-types.d.ts +14 -0
  6. package/dist/collaboration-state/types.d.ts +9 -1
  7. package/dist/control-plane/task-compile-output.js +7 -3
  8. package/dist/control-plane/task-compile-start.d.ts +3 -0
  9. package/dist/control-plane/task-compile-start.js +47 -11
  10. package/dist/server-shell/cli/cli.js +3 -22
  11. package/dist/server-shell/cli/machine-local.d.ts +4 -0
  12. package/dist/server-shell/cli/machine-local.js +15 -1
  13. package/dist/server-shell/cli/project-resolver.d.ts +8 -0
  14. package/dist/server-shell/cli/project-resolver.js +67 -5
  15. package/dist/server-shell/cli/provider-tui.d.ts +12 -0
  16. package/dist/server-shell/cli/provider-tui.js +15 -20
  17. package/dist/server-shell/cli/runtime-commands.d.ts +10 -1
  18. package/dist/server-shell/cli/runtime-commands.js +45 -7
  19. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +14 -1
  20. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +14 -1
  21. package/dist/server-shell/http/routes/project-api/openapi.d.ts +28 -2
  22. package/dist/server-shell/http/routes/project-api/schemas.d.ts +14 -1
  23. package/migrations/0012_scratchpad_receipts.sql +31 -0
  24. package/migrations/README.md +2 -1
  25. package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +1 -1
  26. package/node_modules/@tutti/shared/dist/schemas/api/index.js +1 -1
  27. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.d.ts +14 -1
  28. package/node_modules/@tutti/shared/dist/schemas/api/types.d.ts +2 -1
  29. package/node_modules/@tutti/shared/dist/schemas/api/work-items.d.ts +24 -1
  30. package/node_modules/@tutti/shared/dist/schemas/api/work-items.js +15 -1
  31. package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.d.ts +28 -2
  32. package/package.json +1 -1
  33. package/web/assets/index-BhNJQ717.js +29 -0
  34. package/web/assets/{index-CohZfGSh.css → index-mXkNKFjm.css} +1 -1
  35. package/web/index.html +2 -2
  36. package/web/assets/index-YQvFdpG8.js +0 -29
@@ -9,54 +9,51 @@ const SHOW_CURSOR = "\u001B[?25h";
9
9
  const BLINK_ON = "\u001B[5m";
10
10
  const BLINK_OFF = "\u001B[25m";
11
11
  const CLEAR = "\u001B[2J\u001B[H";
12
- const DIVIDER = "----------------------------------------------------------------";
12
+ const FIELD_UNDERLINE = "------------------------------------------------------------";
13
13
  function providerSetupCancelled() {
14
14
  return new LaunchError("provider_setup_cancelled", "Provider setup cancelled.", "Run the command again when you are ready.");
15
15
  }
16
- function fieldLine(options) {
16
+ function renderFieldInput(options) {
17
17
  const value = options.secret && options.value.length > 0 ? "*".repeat(options.value.length) : options.value;
18
- return `> ${options.label}: ${value}${BLINK_ON}_${BLINK_OFF}`;
18
+ return [options.label, `${value}${BLINK_ON}_${BLINK_OFF}`, FIELD_UNDERLINE];
19
19
  }
20
20
  function renderProviderField(state) {
21
21
  if (state.step === "base-url") {
22
22
  return [
23
- "Step 1 of 2 - Base URL",
24
- "Enter the base URL for your OpenAI-compatible provider.",
23
+ "Step 1/2 Base URL",
24
+ "OpenAI-compatible Responses API base URL; must expose POST /responses.",
25
25
  "",
26
- fieldLine({
26
+ ...renderFieldInput({
27
27
  label: "Base URL",
28
28
  value: state.baseUrl,
29
29
  }),
30
30
  "",
31
- "[Enter] to continue",
31
+ "[Enter] Continue [Esc] Cancel",
32
32
  ];
33
33
  }
34
34
  return [
35
- "Step 2 of 2 - API Key",
36
- "Enter the API key for this provider. It will be stored only in the machine-local Tutti credential store.",
35
+ "Step 2/2 API Key",
36
+ "Stored only in the machine-local Tutti credential store.",
37
37
  "",
38
- fieldLine({
38
+ ...renderFieldInput({
39
39
  label: "API Key",
40
40
  value: state.apiKey,
41
41
  secret: true,
42
42
  }),
43
43
  "",
44
44
  state.error === undefined
45
- ? "[Enter] to validate [Esc] to edit Base URL"
46
- : "[Enter] to retry [Esc] to edit Base URL",
45
+ ? "[Enter] Validate [Esc] Back to Base URL"
46
+ : "[Enter] Retry [Esc] Back to Base URL",
47
47
  ];
48
48
  }
49
- function renderProviderForm(options) {
49
+ export function renderProviderForm(options) {
50
50
  const lines = [
51
51
  CLEAR,
52
52
  HIDE_CURSOR,
53
53
  renderTuttiTerminalLogo({ tty: options.tty === true }),
54
54
  "",
55
55
  "Provider setup",
56
- DIVIDER,
57
- "Tutti uses an OpenAI-compatible Responses API provider.",
58
- "The base URL should expose POST /responses under the entered URL.",
59
- DIVIDER,
56
+ "Connect a provider compatible with OpenAI's Responses API.",
60
57
  "",
61
58
  ...renderProviderField(options.state),
62
59
  "",
@@ -209,9 +206,7 @@ function renderChecking(frame, tty) {
209
206
  renderTuttiTerminalLogo({ tty }),
210
207
  "",
211
208
  "Provider setup",
212
- DIVIDER,
213
- "Validating the provider with the configured Responses API endpoint.",
214
- DIVIDER,
209
+ "Validating the configured Responses API endpoint.",
215
210
  "",
216
211
  `${indicator} Checking provider connection with ${DEFAULT_OPENAI_MODEL}...`,
217
212
  ].join("\n");
@@ -1,6 +1,7 @@
1
1
  import { type ProjectId } from "@tutti/shared/ids";
2
2
  import { type FetchLike } from "./host-runtime-endpoint.js";
3
3
  import { type MachineRuntimeEndpointRecord } from "./machine-local.js";
4
+ import type { LocalControlFetch } from "./local-control-client.js";
4
5
  export type RuntimeProjectRow = {
5
6
  project_id: ProjectId;
6
7
  status: "online" | "stale";
@@ -22,10 +23,18 @@ export declare function runPsManageCommand(options?: {
22
23
  stdin?: NodeJS.ReadStream;
23
24
  stdout?: NodeJS.WriteStream;
24
25
  }): Promise<void>;
25
- export declare function runStopCommand(target?: string): Promise<string>;
26
+ export declare function runStopCommand(target?: string, options?: {
27
+ cwd?: string;
28
+ env?: NodeJS.ProcessEnv;
29
+ fetchImpl?: LocalControlFetch;
30
+ }): Promise<string>;
26
31
  export declare function runInviteCommand(target?: string): Promise<string>;
27
32
  export declare function runProviderStatusCommand(target?: string): string;
28
33
  export declare function runLogsCommand(target?: string, tailLines?: number): string;
34
+ export declare function runDoctorCommand(target?: string, options?: {
35
+ cwd?: string;
36
+ env?: NodeJS.ProcessEnv;
37
+ }): string;
29
38
  export declare function readRuntimeEndpointForProject(tuttiHome: string, projectId: ProjectId): MachineRuntimeEndpointRecord | null;
30
39
  export declare function runtimeEndpointPathForProject(tuttiHome: string, projectId: ProjectId): string;
31
40
  export declare function projectLocalStoreRoot(tuttiHome: string, projectId: ProjectId): string;
@@ -4,16 +4,19 @@ import { emitKeypressEvents } from "node:readline";
4
4
  import { ID_PREFIXES, isPrefixedId } from "@tutti/shared/ids";
5
5
  import { redactText } from "@tutti/shared/utils";
6
6
  import { createRuntimeEndpointProbe } from "./host-runtime-endpoint.js";
7
- import { getHostLogFilePath, getMachineRuntimeEndpointPath, getProjectLocalStoreRoot, readMachineProjectBinding, readMachineRuntimeEndpoint, } from "./machine-local.js";
7
+ import { deleteMachineProjectLocalState, getHostLogFilePath, getMachineRuntimeEndpointPath, getProjectLocalStoreRoot, readMachineProjectBinding, readMachineRuntimeEndpoint, } from "./machine-local.js";
8
8
  import { readHostLocalLaunchStatus, readHostLocalProject, readHostLocalProviderConfig, requestHostLocalShutdown, rotateHostLocalInvite, } from "./local-control-client.js";
9
9
  import { formatCliErrorReason, LaunchError } from "./errors.js";
10
- import { resolveExistingProjectContext } from "./project-resolver.js";
10
+ import { resolveManagedProjectContext } from "./project-resolver.js";
11
11
  import { formatJoinLinkValidity, renderTerminalQr } from "./terminal-qr.js";
12
12
  import { resolveTuttiHome } from "../../providers/openai/index.js";
13
+ import { readCliVersion } from "./version.js";
13
14
  const PROJECT_ID_DISPLAY_MIN_LENGTH = 12;
14
- function resolveProject(target) {
15
- return resolveExistingProjectContext({
15
+ function resolveProject(target, options = {}) {
16
+ return resolveManagedProjectContext({
16
17
  ...(target === undefined ? {} : { target }),
18
+ ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
19
+ ...(options.env === undefined ? {} : { env: options.env }),
17
20
  });
18
21
  }
19
22
  function projectIdsFromTuttiHome(tuttiHome) {
@@ -271,18 +274,35 @@ export async function runPsManageCommand(options = {}) {
271
274
  stdout.write(SHOW_CURSOR);
272
275
  }
273
276
  }
274
- export async function runStopCommand(target) {
275
- const project = resolveProject(target);
277
+ export async function runStopCommand(target, options = {}) {
278
+ const project = resolveProject(target, options);
276
279
  const endpoint = project.runtime_endpoint;
277
280
  if (endpoint === null) {
281
+ if (!project.workspace_exists) {
282
+ deleteMachineProjectLocalState({
283
+ tuttiHome: project.tutti_home,
284
+ projectId: project.project_id,
285
+ });
286
+ return `Deleted ${project.display_name}; the workspace no longer exists.`;
287
+ }
278
288
  return "Tutti host is not running for this project.";
279
289
  }
280
290
  try {
281
- await requestHostLocalShutdown({ endpoint });
291
+ await requestHostLocalShutdown({
292
+ endpoint,
293
+ ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
294
+ });
282
295
  }
283
296
  catch (error) {
284
297
  throw new LaunchError("existing_server_unhealthy", `Could not stop the host: ${formatCliErrorReason(error)}`, "Run `tutti ps` to inspect the runtime state, or stop the host process manually.");
285
298
  }
299
+ if (!project.workspace_exists) {
300
+ deleteMachineProjectLocalState({
301
+ tuttiHome: project.tutti_home,
302
+ projectId: project.project_id,
303
+ });
304
+ return `Stopped and deleted ${project.display_name}; the workspace no longer exists.`;
305
+ }
286
306
  return `Stopped ${project.display_name}.`;
287
307
  }
288
308
  export async function runInviteCommand(target) {
@@ -339,6 +359,24 @@ export function runLogsCommand(target, tailLines = 120) {
339
359
  const lines = readFileSync(logPath, "utf8").split(/\r?\n/u).filter(Boolean).slice(-tailLines);
340
360
  return lines.length === 0 ? "Host log is empty." : lines.join("\n");
341
361
  }
362
+ export function runDoctorCommand(target, options = {}) {
363
+ const checks = [];
364
+ checks.push(`Node: ${process.version}`);
365
+ checks.push(`Tutti: ${readCliVersion()}`);
366
+ try {
367
+ const project = resolveProject(target, options);
368
+ checks.push(`Project: ${project.display_name}`);
369
+ checks.push(`Project ID: ${project.project_id}`);
370
+ checks.push(`Workspace: ${project.workspace_exists ? redactText(project.workspace_root) : "missing"}`);
371
+ checks.push(`Provider: ${project.provider_config.status}`);
372
+ checks.push(`Host: ${project.runtime_endpoint === null ? "not running" : project.runtime_endpoint.base_url}`);
373
+ }
374
+ catch (error) {
375
+ checks.push("Project: unavailable");
376
+ checks.push(`Project detail: ${formatCliErrorReason(error)}`);
377
+ }
378
+ return checks.join("\n");
379
+ }
342
380
  export function readRuntimeEndpointForProject(tuttiHome, projectId) {
343
381
  return readEndpointFile(tuttiHome, projectId);
344
382
  }
@@ -88,7 +88,7 @@ export declare const HOST_PROJECT_COLLABORATION_OPENAPI_ROUTES: ({
88
88
  description: string;
89
89
  schema: import("@sinclair/typebox").TObject<{
90
90
  id: import("@sinclair/typebox").TLiteral<"current">;
91
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
91
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
92
92
  topic: import("@sinclair/typebox").TString;
93
93
  background_summary: import("@sinclair/typebox").TString;
94
94
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -96,6 +96,19 @@ export declare const HOST_PROJECT_COLLABORATION_OPENAPI_ROUTES: ({
96
96
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
97
97
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
98
98
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
99
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
100
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
101
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
102
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
103
+ workflow_ref: import("@sinclair/typebox").TString;
104
+ activity_ref: import("@sinclair/typebox").TString;
105
+ topic: import("@sinclair/typebox").TString;
106
+ background_summary: import("@sinclair/typebox").TString;
107
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
108
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
109
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
110
+ submitted_at: import("@sinclair/typebox").TString;
111
+ }>>;
99
112
  }>;
100
113
  contentType?: never;
101
114
  };
@@ -949,7 +949,7 @@ export declare const HOST_PROJECT_WORKSPACE_OPENAPI_ROUTES: ({
949
949
  readonly main_chat: import("@sinclair/typebox").TSchema;
950
950
  readonly scratchpad: import("@sinclair/typebox").TObject<{
951
951
  id: import("@sinclair/typebox").TLiteral<"current">;
952
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
952
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
953
953
  topic: import("@sinclair/typebox").TString;
954
954
  background_summary: import("@sinclair/typebox").TString;
955
955
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -957,6 +957,19 @@ export declare const HOST_PROJECT_WORKSPACE_OPENAPI_ROUTES: ({
957
957
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
958
958
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
959
959
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
960
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
961
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
962
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
963
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
964
+ workflow_ref: import("@sinclair/typebox").TString;
965
+ activity_ref: import("@sinclair/typebox").TString;
966
+ topic: import("@sinclair/typebox").TString;
967
+ background_summary: import("@sinclair/typebox").TString;
968
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
969
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
970
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
971
+ submitted_at: import("@sinclair/typebox").TString;
972
+ }>>;
960
973
  }>;
961
974
  readonly worklist: import("@sinclair/typebox").TObject<{
962
975
  modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
@@ -250,7 +250,7 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
250
250
  description: string;
251
251
  schema: import("@sinclair/typebox").TObject<{
252
252
  id: import("@sinclair/typebox").TLiteral<"current">;
253
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
253
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
254
254
  topic: import("@sinclair/typebox").TString;
255
255
  background_summary: import("@sinclair/typebox").TString;
256
256
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -258,6 +258,19 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
258
258
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
259
259
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
260
260
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
261
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
262
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
263
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
264
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
265
+ workflow_ref: import("@sinclair/typebox").TString;
266
+ activity_ref: import("@sinclair/typebox").TString;
267
+ topic: import("@sinclair/typebox").TString;
268
+ background_summary: import("@sinclair/typebox").TString;
269
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
270
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
271
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
272
+ submitted_at: import("@sinclair/typebox").TString;
273
+ }>>;
261
274
  }>;
262
275
  contentType?: never;
263
276
  };
@@ -2102,7 +2115,7 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
2102
2115
  readonly main_chat: import("@sinclair/typebox").TSchema;
2103
2116
  readonly scratchpad: import("@sinclair/typebox").TObject<{
2104
2117
  id: import("@sinclair/typebox").TLiteral<"current">;
2105
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
2118
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
2106
2119
  topic: import("@sinclair/typebox").TString;
2107
2120
  background_summary: import("@sinclair/typebox").TString;
2108
2121
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -2110,6 +2123,19 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
2110
2123
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
2111
2124
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2112
2125
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2126
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2127
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2128
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2129
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
2130
+ workflow_ref: import("@sinclair/typebox").TString;
2131
+ activity_ref: import("@sinclair/typebox").TString;
2132
+ topic: import("@sinclair/typebox").TString;
2133
+ background_summary: import("@sinclair/typebox").TString;
2134
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
2135
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
2136
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
2137
+ submitted_at: import("@sinclair/typebox").TString;
2138
+ }>>;
2113
2139
  }>;
2114
2140
  readonly worklist: import("@sinclair/typebox").TObject<{
2115
2141
  modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
@@ -931,7 +931,7 @@ export declare const BootstrapResponseSchema: {
931
931
  readonly main_chat: import("@sinclair/typebox").TSchema;
932
932
  readonly scratchpad: import("@sinclair/typebox").TObject<{
933
933
  id: import("@sinclair/typebox").TLiteral<"current">;
934
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
934
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
935
935
  topic: import("@sinclair/typebox").TString;
936
936
  background_summary: import("@sinclair/typebox").TString;
937
937
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -939,6 +939,19 @@ export declare const BootstrapResponseSchema: {
939
939
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
940
940
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
941
941
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
942
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
943
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
944
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
945
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
946
+ workflow_ref: import("@sinclair/typebox").TString;
947
+ activity_ref: import("@sinclair/typebox").TString;
948
+ topic: import("@sinclair/typebox").TString;
949
+ background_summary: import("@sinclair/typebox").TString;
950
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
951
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
952
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
953
+ submitted_at: import("@sinclair/typebox").TString;
954
+ }>>;
942
955
  }>;
943
956
  readonly worklist: import("@sinclair/typebox").TObject<{
944
957
  modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
@@ -0,0 +1,31 @@
1
+ ALTER TABLE scratchpad
2
+ ADD COLUMN state TEXT NOT NULL DEFAULT 'ready' CHECK (state IN ('ready', 'submitted'));
3
+
4
+ ALTER TABLE scratchpad
5
+ ADD COLUMN submitted_by_activity_ref TEXT;
6
+
7
+ ALTER TABLE scratchpad
8
+ ADD COLUMN submitted_by_workflow_ref TEXT;
9
+
10
+ ALTER TABLE scratchpad
11
+ ADD COLUMN submitted_at TEXT;
12
+
13
+ CREATE TABLE IF NOT EXISTS scratchpad_receipts (
14
+ workflow_ref TEXT PRIMARY KEY,
15
+ activity_ref TEXT NOT NULL,
16
+ topic TEXT NOT NULL,
17
+ background_summary TEXT NOT NULL,
18
+ current_consensus_json TEXT NOT NULL CHECK (
19
+ json_valid(current_consensus_json) AND json_type(current_consensus_json) = 'array'
20
+ ),
21
+ open_questions_json TEXT NOT NULL CHECK (
22
+ json_valid(open_questions_json) AND json_type(open_questions_json) = 'array'
23
+ ),
24
+ task_changes_json TEXT NOT NULL CHECK (
25
+ json_valid(task_changes_json) AND json_type(task_changes_json) = 'array'
26
+ ),
27
+ submitted_at TEXT NOT NULL
28
+ );
29
+
30
+ CREATE INDEX IF NOT EXISTS idx_scratchpad_receipts_submitted_at
31
+ ON scratchpad_receipts (submitted_at DESC, workflow_ref DESC);
@@ -24,10 +24,11 @@
24
24
  - `0009_project_timeline_events.sql`:新增 Timeline 专用 append-only durable event 表,用于记录缺少其他稳定 record 的 context sync、reference summary 与 promotion reconcile 轻量可观测性节点。
25
25
  - `0010_project_brief.sql`:新增 host-local Project Brief projection 表,用于保存四个 baseline Project Docs 的短摘要和 source fingerprint。
26
26
  - `0011_message_author_avatar.sql`:为消息作者增加可选 Relay account avatar 快照,保证跨浏览器查看历史消息时不依赖当前 viewer profile 或 presence sample。
27
+ - `0012_scratchpad_receipts.sql`:为当前 Scratchpad 增加 `submitted` 状态字段,并新增已提交 Scratchpad 小票历史表。
27
28
 
28
29
  ## 当前实现状态
29
30
 
30
- - `0001_init.sql`、`0002_allow_sealed_round_successor_note.sql`、`0003_drop_scratchpad_source_message_refs.sql`、`0004_read_state.sql`、`0005_provider_usage.sql`、`0006_scratchpad_source_state.sql`、`0007_workspace_signal_read_state_scopes.sql`、`0008_provider_usage_anchors.sql`、`0009_project_timeline_events.sql`、`0010_project_brief.sql` 与 `0011_message_author_avatar.sql` 已存在,代表当前 host project SQLite schema contract。
31
+ - `0001_init.sql`、`0002_allow_sealed_round_successor_note.sql`、`0003_drop_scratchpad_source_message_refs.sql`、`0004_read_state.sql`、`0005_provider_usage.sql`、`0006_scratchpad_source_state.sql`、`0007_workspace_signal_read_state_scopes.sql`、`0008_provider_usage_anchors.sql`、`0009_project_timeline_events.sql`、`0010_project_brief.sql`、`0011_message_author_avatar.sql` 与 `0012_scratchpad_receipts.sql` 已存在,代表当前 host project SQLite schema contract。
31
32
  - SQLite adapter、migration runner、checksum 校验、store metadata 初始化、transaction helper 与 command recovery scan helper 已实现。
32
33
  - 协作 repository 与 Control Plane 已实现第一批业务读写;Phase 7 首批已复用 `0001_init.sql` 中的 `tasks.latest_run_result_id`、`task_details.result_json` 与 `run_results` 表完成 Run result / checks / promotion 摘要持久化。Control Plane recovery resolver 与 task-bound continuation / retry 复用现有 schema;deterministic promotion reconcile 的业务 truth 仍写入最终 Run result / task detail result,Timeline 轻量节点写入 `project_timeline_events`,merge workspace 不进入 SQLite truth。`provider_usage_events` 只保存 token 计数、调用来源、模型名、记录时间和可空 anchor,不保存 provider secret、prompt 或 raw response。store 基础设施本身已经可以创建并迁移 `tutti.sqlite`。
33
34
 
@@ -7,7 +7,7 @@ export { ProjectTimelineItemKindSchema, ProjectTimelineItemSchema, ProjectTimeli
7
7
  export { MAX_REFERENCE_STAGED_UPLOAD_BYTES, MAX_SKILL_ZIP_STAGED_UPLOAD_BYTES, MAX_STAGED_UPLOAD_BYTES, PresignedUploadPutSchema, ReferenceFileStartRelayUploadPayloadSchema, ReferenceStagedUploadReferenceProperties, RelayUploadProjectionSchema, RelayUploadPurposeSchema, Sha256DigestSchema, SkillZipStartRelayUploadPayloadSchema, SkillZipStagedUploadReferenceProperties, StagedUploadReferenceProperties, StagedUploadReferenceSchema, StartRelayUploadBodySchema, StartRelayUploadDispositionSchema, StartRelayUploadPayloadSchema, StartRelayUploadResponseSchema, StartRelayUploadResultSchema, maxStagedUploadBytesForPurpose, } from "./uploads.js";
8
8
  export { MarkReadBodySchema, MarkReadDispositionSchema, MarkReadPayloadSchema, MarkReadResponseSchema, MarkReadResultSchema, ReadStateScopeProjectionSchema, ReadStateScopeSchema, ReadStateSummaryProjectionSchema, } from "./read-state.js";
9
9
  export { GetMessagesRequestSchema, MessageAuthorSchema, MessageCreatedEventPayloadSchema, MessageKindSchema, MessageProjectionSchema, MessageReferenceFileRefSchema, MessageRefsSchema, MessageScopeSchema, MessageWindowSchema, ReferenceFileCategorySchema, SendMainChatMessageBodySchema, SendMainChatMessageCreatedDispositionSchema, SendMainChatMessageDispositionSchema, SendMainChatMessagePayloadSchema, SendMainChatMessageResponseSchema, SendMainChatMessageResultSchema, WorklistFeedbackItemSchema, WorklistFeedbackRefSchema, } from "./messages.js";
10
- export { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummariesResponseSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, ResultAnchorSchema, RunLineageSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskRunResultsPageSchema, TaskStatusSchema, WorklistProjectionSchema, } from "./work-items.js";
10
+ export { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummariesResponseSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, ResultAnchorSchema, RunLineageSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, ScratchpadReceiptProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskRunResultsPageSchema, TaskStatusSchema, WorklistProjectionSchema, } from "./work-items.js";
11
11
  export { ActiveApprovalProjectionSchema, ApprovalCommandProjectionSchema, ApprovalDecisionKindSchema, ApprovalDecisionOptionProjectionSchema, ApprovalDecisionToneSchema, ApprovalFileChangeProjectionSchema, ApprovalPermissionsProjectionSchema, ApprovalRequestKindSchema, ApprovalRequestProjectionSchema, ApprovalResolutionOutcomeSchema, ApprovalResolutionProjectionSchema, DecideApprovalBodySchema, DecideApprovalDispositionSchema, DecideApprovalPayloadSchema, DecideApprovalResponseSchema, DecideApprovalResultSchema, } from "./approvals.js";
12
12
  export { ActiveClarificationProjectionSchema, ClarificationChangedEventPayloadSchema, ClarificationOwnerProjectionSchema, ClarificationRequestPayloadSchema, ClarificationRoundProjectionSchema, ClarificationRoundSummaryProjectionSchema, ClarificationSuccessorRefSchema, ClarificationThreadProjectionSchema, ContextRefSchema, GetClarificationRoundMessagesRequestSchema, GetClarificationRoundResponseSchema, GetClarificationThreadResponseSchema, HumanInteractionPayloadSchema, HumanRequestPayloadSchema, SendClarificationRoundMessageBodySchema, SendClarificationRoundMessageDispositionSchema, SendClarificationRoundMessagePayloadSchema, SendClarificationRoundMessageResponseSchema, SendClarificationRoundMessageResultSchema, SubmitClarificationRoundBodySchema, SubmitClarificationRoundDispositionSchema, SubmitClarificationRoundPayloadSchema, SubmitClarificationRoundResponseSchema, SubmitClarificationRoundResultSchema, } from "./clarifications.js";
13
13
  export { GetProjectDocRequestSchema, GetProjectDocResponseSchema, GetProjectDocsResponseSchema, GetReferenceFilesRequestSchema, GetReferenceFilesResponseSchema, GetViewerAssetRequestSchema, GetViewerFileRequestSchema, GetViewerFileResponseSchema, GetViewerTreeRequestSchema, GetViewerTreeResponseSchema, ProjectDocKeySchema, ProjectDocParamsSchema, ProjectDocSummaryProjectionSchema, ReferenceDirectoryProjectionSchema, ReferenceFileProjectionSchema, ReferenceSummaryProjectionSchema, ReferenceTextReadBlockedReasonSchema, RefreshReferenceSummariesBodySchema, RefreshReferenceSummariesDispositionSchema, RefreshReferenceSummariesPayloadSchema, RefreshReferenceSummariesResponseSchema, RefreshReferenceSummariesResultSchema, UploadReferenceFileBodySchema, UploadReferenceFileDispositionSchema, UploadReferenceFilePayloadSchema, UploadReferenceFileResponseSchema, UploadReferenceFileResultSchema, ViewerAssetVariantSchema, ViewerFileContentProjectionSchema, ViewerFileProjectionSchema, ViewerPageSchema, ViewerPathSchema, ViewerRepoSnapshotSchema, ViewerTreeEntryProjectionSchema, ViewerTreeTextReadBlockedReasonSchema, ViewerUnreadableReasonSchema, } from "./viewer-reference.js";
@@ -6,7 +6,7 @@ export { ProjectTimelineItemKindSchema, ProjectTimelineItemSchema, ProjectTimeli
6
6
  export { MAX_REFERENCE_STAGED_UPLOAD_BYTES, MAX_SKILL_ZIP_STAGED_UPLOAD_BYTES, MAX_STAGED_UPLOAD_BYTES, PresignedUploadPutSchema, ReferenceFileStartRelayUploadPayloadSchema, ReferenceStagedUploadReferenceProperties, RelayUploadProjectionSchema, RelayUploadPurposeSchema, Sha256DigestSchema, SkillZipStartRelayUploadPayloadSchema, SkillZipStagedUploadReferenceProperties, StagedUploadReferenceProperties, StagedUploadReferenceSchema, StartRelayUploadBodySchema, StartRelayUploadDispositionSchema, StartRelayUploadPayloadSchema, StartRelayUploadResponseSchema, StartRelayUploadResultSchema, maxStagedUploadBytesForPurpose, } from "./uploads.js";
7
7
  export { MarkReadBodySchema, MarkReadDispositionSchema, MarkReadPayloadSchema, MarkReadResponseSchema, MarkReadResultSchema, ReadStateScopeProjectionSchema, ReadStateScopeSchema, ReadStateSummaryProjectionSchema, } from "./read-state.js";
8
8
  export { GetMessagesRequestSchema, MessageAuthorSchema, MessageCreatedEventPayloadSchema, MessageKindSchema, MessageProjectionSchema, MessageReferenceFileRefSchema, MessageRefsSchema, MessageScopeSchema, MessageWindowSchema, ReferenceFileCategorySchema, SendMainChatMessageBodySchema, SendMainChatMessageCreatedDispositionSchema, SendMainChatMessageDispositionSchema, SendMainChatMessagePayloadSchema, SendMainChatMessageResponseSchema, SendMainChatMessageResultSchema, WorklistFeedbackItemSchema, WorklistFeedbackRefSchema, } from "./messages.js";
9
- export { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummariesResponseSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, ResultAnchorSchema, RunLineageSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskRunResultsPageSchema, TaskStatusSchema, WorklistProjectionSchema, } from "./work-items.js";
9
+ export { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummariesResponseSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, ResultAnchorSchema, RunLineageSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, ScratchpadReceiptProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskRunResultsPageSchema, TaskStatusSchema, WorklistProjectionSchema, } from "./work-items.js";
10
10
  export { ActiveApprovalProjectionSchema, ApprovalCommandProjectionSchema, ApprovalDecisionKindSchema, ApprovalDecisionOptionProjectionSchema, ApprovalDecisionToneSchema, ApprovalFileChangeProjectionSchema, ApprovalPermissionsProjectionSchema, ApprovalRequestKindSchema, ApprovalRequestProjectionSchema, ApprovalResolutionOutcomeSchema, ApprovalResolutionProjectionSchema, DecideApprovalBodySchema, DecideApprovalDispositionSchema, DecideApprovalPayloadSchema, DecideApprovalResponseSchema, DecideApprovalResultSchema, } from "./approvals.js";
11
11
  export { ActiveClarificationProjectionSchema, ClarificationChangedEventPayloadSchema, ClarificationOwnerProjectionSchema, ClarificationRequestPayloadSchema, ClarificationRoundProjectionSchema, ClarificationRoundSummaryProjectionSchema, ClarificationSuccessorRefSchema, ClarificationThreadProjectionSchema, ContextRefSchema, GetClarificationRoundMessagesRequestSchema, GetClarificationRoundResponseSchema, GetClarificationThreadResponseSchema, HumanInteractionPayloadSchema, HumanRequestPayloadSchema, SendClarificationRoundMessageBodySchema, SendClarificationRoundMessageDispositionSchema, SendClarificationRoundMessagePayloadSchema, SendClarificationRoundMessageResponseSchema, SendClarificationRoundMessageResultSchema, SubmitClarificationRoundBodySchema, SubmitClarificationRoundDispositionSchema, SubmitClarificationRoundPayloadSchema, SubmitClarificationRoundResponseSchema, SubmitClarificationRoundResultSchema, } from "./clarifications.js";
12
12
  export { GetProjectDocRequestSchema, GetProjectDocResponseSchema, GetProjectDocsResponseSchema, GetReferenceFilesRequestSchema, GetReferenceFilesResponseSchema, GetViewerAssetRequestSchema, GetViewerFileRequestSchema, GetViewerFileResponseSchema, GetViewerTreeRequestSchema, GetViewerTreeResponseSchema, ProjectDocKeySchema, ProjectDocParamsSchema, ProjectDocSummaryProjectionSchema, ReferenceDirectoryProjectionSchema, ReferenceFileProjectionSchema, ReferenceSummaryProjectionSchema, ReferenceTextReadBlockedReasonSchema, RefreshReferenceSummariesBodySchema, RefreshReferenceSummariesDispositionSchema, RefreshReferenceSummariesPayloadSchema, RefreshReferenceSummariesResponseSchema, RefreshReferenceSummariesResultSchema, UploadReferenceFileBodySchema, UploadReferenceFileDispositionSchema, UploadReferenceFilePayloadSchema, UploadReferenceFileResponseSchema, UploadReferenceFileResultSchema, ViewerAssetVariantSchema, ViewerFileContentProjectionSchema, ViewerFileProjectionSchema, ViewerPageSchema, ViewerPathSchema, ViewerRepoSnapshotSchema, ViewerTreeEntryProjectionSchema, ViewerTreeTextReadBlockedReasonSchema, ViewerUnreadableReasonSchema, } from "./viewer-reference.js";
@@ -494,7 +494,7 @@ export declare const TaskDetailUpdatedEventPayloadSchema: import("@sinclair/type
494
494
  export declare const ScratchpadUpdatedEventPayloadSchema: import("@sinclair/typebox").TObject<{
495
495
  scratchpad: import("@sinclair/typebox").TObject<{
496
496
  id: import("@sinclair/typebox").TLiteral<"current">;
497
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
497
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
498
498
  topic: import("@sinclair/typebox").TString;
499
499
  background_summary: import("@sinclair/typebox").TString;
500
500
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -502,6 +502,19 @@ export declare const ScratchpadUpdatedEventPayloadSchema: import("@sinclair/type
502
502
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
503
503
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
504
504
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
505
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
506
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
507
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
508
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
509
+ workflow_ref: import("@sinclair/typebox").TString;
510
+ activity_ref: import("@sinclair/typebox").TString;
511
+ topic: import("@sinclair/typebox").TString;
512
+ background_summary: import("@sinclair/typebox").TString;
513
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
514
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
515
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
516
+ submitted_at: import("@sinclair/typebox").TString;
517
+ }>>;
505
518
  }>;
506
519
  activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
507
520
  }>;
@@ -7,7 +7,7 @@ import type { ProjectTimelineItemKindSchema, ProjectTimelineItemSchema, ProjectT
7
7
  import type { PresignedUploadPutSchema, RelayUploadProjectionSchema, RelayUploadPurposeSchema, Sha256DigestSchema, StagedUploadReferenceSchema, StartRelayUploadDispositionSchema, StartRelayUploadPayloadSchema, StartRelayUploadResultSchema } from "./uploads.js";
8
8
  import type { MarkReadDispositionSchema, MarkReadPayloadSchema, MarkReadResultSchema, ReadStateScopeProjectionSchema, ReadStateScopeSchema, ReadStateSummaryProjectionSchema } from "./read-state.js";
9
9
  import type { GetMessagesRequestSchema, MessageCreatedEventPayloadSchema, MessageProjectionSchema, MessageReferenceFileRefSchema, ReferenceFileCategorySchema, SendMainChatMessageCreatedDispositionSchema, SendMainChatMessageDispositionSchema, SendMainChatMessagePayloadSchema, SendMainChatMessageResultSchema, WorklistFeedbackItemSchema, WorklistFeedbackRefSchema } from "./messages.js";
10
- import type { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskStatusSchema, WorklistProjectionSchema } from "./work-items.js";
10
+ import type { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, ScratchpadReceiptProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskStatusSchema, WorklistProjectionSchema } from "./work-items.js";
11
11
  import type { ActiveApprovalProjectionSchema, ApprovalCommandProjectionSchema, ApprovalDecisionKindSchema, ApprovalDecisionOptionProjectionSchema, ApprovalFileChangeProjectionSchema, ApprovalPermissionsProjectionSchema, ApprovalRequestKindSchema, ApprovalRequestProjectionSchema, ApprovalResolutionOutcomeSchema, ApprovalResolutionProjectionSchema, DecideApprovalDispositionSchema, DecideApprovalPayloadSchema, DecideApprovalResultSchema } from "./approvals.js";
12
12
  import type { ActiveClarificationProjectionSchema, ClarificationChangedEventPayloadSchema, ClarificationOwnerProjectionSchema, ClarificationRequestPayloadSchema, ClarificationRoundProjectionSchema, ClarificationRoundSummaryProjectionSchema, ClarificationSuccessorRefSchema, ClarificationThreadProjectionSchema, ContextRefSchema, GetClarificationRoundMessagesRequestSchema, GetClarificationRoundResponseSchema, GetClarificationThreadResponseSchema, HumanInteractionPayloadSchema, HumanRequestPayloadSchema, SendClarificationRoundMessageDispositionSchema, SendClarificationRoundMessagePayloadSchema, SendClarificationRoundMessageResultSchema, SubmitClarificationRoundDispositionSchema, SubmitClarificationRoundPayloadSchema, SubmitClarificationRoundResultSchema } from "./clarifications.js";
13
13
  import type { GetProjectDocRequestSchema, GetProjectDocResponseSchema, GetProjectDocsResponseSchema, GetReferenceFilesRequestSchema, GetReferenceFilesResponseSchema, GetViewerAssetRequestSchema, GetViewerFileRequestSchema, GetViewerFileResponseSchema, GetViewerTreeRequestSchema, GetViewerTreeResponseSchema, ProjectDocKeySchema, ProjectDocParamsSchema, ProjectDocSummaryProjectionSchema, ReferenceDirectoryProjectionSchema, ReferenceFileProjectionSchema, ReferenceSummaryProjectionSchema, ReferenceTextReadBlockedReasonSchema, RefreshReferenceSummariesDispositionSchema, RefreshReferenceSummariesPayloadSchema, RefreshReferenceSummariesResultSchema, UploadReferenceFileDispositionSchema, UploadReferenceFilePayloadSchema, UploadReferenceFileResultSchema, ViewerAssetVariantSchema, ViewerFileContentProjectionSchema, ViewerFileProjectionSchema, ViewerPathSchema, ViewerRepoSnapshotSchema, ViewerTreeEntryProjectionSchema, ViewerTreeTextReadBlockedReasonSchema, ViewerUnreadableReasonSchema } from "./viewer-reference.js";
@@ -110,6 +110,7 @@ export type GetMessagesRequest = Static<typeof GetMessagesRequestSchema>;
110
110
  export type SendMainChatMessageResponse = CommandResponse<SendMainChatMessageDisposition, SendMainChatMessageResult>;
111
111
  export type MessageCreatedEventPayload = Static<typeof MessageCreatedEventPayloadSchema>;
112
112
  export type ScratchpadProjection = Static<typeof ScratchpadProjectionSchema>;
113
+ export type ScratchpadReceiptProjection = Static<typeof ScratchpadReceiptProjectionSchema>;
113
114
  export type TaskStatus = Static<typeof TaskStatusSchema>;
114
115
  export type TaskModuleProjection = Static<typeof TaskModuleProjectionSchema>;
115
116
  export type TaskProjection = Static<typeof TaskProjectionSchema>;
@@ -16,9 +16,19 @@ export declare const ResultAnchorSchema: import("@sinclair/typebox").TUnion<[imp
16
16
  kind: import("@sinclair/typebox").TLiteral<"clarification_round">;
17
17
  clarification_round_ref: import("@sinclair/typebox").TString;
18
18
  }>]>;
19
+ export declare const ScratchpadReceiptProjectionSchema: import("@sinclair/typebox").TObject<{
20
+ workflow_ref: import("@sinclair/typebox").TString;
21
+ activity_ref: import("@sinclair/typebox").TString;
22
+ topic: import("@sinclair/typebox").TString;
23
+ background_summary: import("@sinclair/typebox").TString;
24
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
25
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
26
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
27
+ submitted_at: import("@sinclair/typebox").TString;
28
+ }>;
19
29
  export declare const ScratchpadProjectionSchema: import("@sinclair/typebox").TObject<{
20
30
  id: import("@sinclair/typebox").TLiteral<"current">;
21
- state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">]>;
31
+ state: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"empty">, import("@sinclair/typebox").TLiteral<"ready">, import("@sinclair/typebox").TLiteral<"submitted">]>;
22
32
  topic: import("@sinclair/typebox").TString;
23
33
  background_summary: import("@sinclair/typebox").TString;
24
34
  current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -26,6 +36,19 @@ export declare const ScratchpadProjectionSchema: import("@sinclair/typebox").TOb
26
36
  task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
27
37
  updated_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
38
  updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
39
+ submitted_by_activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
40
+ submitted_by_workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
41
+ submitted_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
42
+ receipts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
43
+ workflow_ref: import("@sinclair/typebox").TString;
44
+ activity_ref: import("@sinclair/typebox").TString;
45
+ topic: import("@sinclair/typebox").TString;
46
+ background_summary: import("@sinclair/typebox").TString;
47
+ current_consensus: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
48
+ open_questions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
49
+ task_changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
50
+ submitted_at: import("@sinclair/typebox").TString;
51
+ }>>;
29
52
  }>;
30
53
  export declare const TaskStatusSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"todo">, import("@sinclair/typebox").TLiteral<"running">, import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"done">, import("@sinclair/typebox").TLiteral<"failed">]>;
31
54
  export declare const TaskModuleProjectionSchema: import("@sinclair/typebox").TObject<{
@@ -20,9 +20,19 @@ export const ResultAnchorSchema = Type.Union([
20
20
  clarification_round_ref: ClarificationRoundRefSchema,
21
21
  }, { additionalProperties: false }),
22
22
  ]);
23
+ export const ScratchpadReceiptProjectionSchema = Type.Object({
24
+ workflow_ref: WorkflowInvocationRefSchema,
25
+ activity_ref: ActivityRefSchema,
26
+ topic: Type.String(),
27
+ background_summary: Type.String(),
28
+ current_consensus: Type.Array(Type.String()),
29
+ open_questions: Type.Array(Type.String()),
30
+ task_changes: Type.Array(Type.String()),
31
+ submitted_at: IsoDateTimeStringSchema,
32
+ }, { additionalProperties: false });
23
33
  export const ScratchpadProjectionSchema = Type.Object({
24
34
  id: Type.Literal("current"),
25
- state: Type.Union([Type.Literal("empty"), Type.Literal("ready")]),
35
+ state: Type.Union([Type.Literal("empty"), Type.Literal("ready"), Type.Literal("submitted")]),
26
36
  topic: Type.String(),
27
37
  background_summary: Type.String(),
28
38
  current_consensus: Type.Array(Type.String()),
@@ -30,6 +40,10 @@ export const ScratchpadProjectionSchema = Type.Object({
30
40
  task_changes: Type.Array(Type.String()),
31
41
  updated_by_activity_ref: Type.Optional(ActivityRefSchema),
32
42
  updated_at: Type.Optional(IsoDateTimeStringSchema),
43
+ submitted_by_activity_ref: Type.Optional(ActivityRefSchema),
44
+ submitted_by_workflow_ref: Type.Optional(WorkflowInvocationRefSchema),
45
+ submitted_at: Type.Optional(IsoDateTimeStringSchema),
46
+ receipts: Type.Array(ScratchpadReceiptProjectionSchema),
33
47
  }, { additionalProperties: false });
34
48
  export const TaskStatusSchema = Type.Union([
35
49
  Type.Literal("todo"),