@xfey/tutti 0.1.10 → 0.1.12

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 (57) hide show
  1. package/dist/control-plane/context-sync.js +1 -0
  2. package/dist/control-plane/event-publishers.js +21 -12
  3. package/dist/control-plane/execution-status.js +4 -0
  4. package/dist/control-plane/project-context-bootstrap.d.ts +2 -0
  5. package/dist/control-plane/project-context-bootstrap.js +1 -0
  6. package/dist/control-plane/reference-summary-refresh.js +4 -0
  7. package/dist/control-plane/run-start.js +1 -0
  8. package/dist/control-plane/task-compile-continuation.js +1 -0
  9. package/dist/control-plane/task-compile-start.d.ts +2 -1
  10. package/dist/control-plane/task-compile-start.js +5 -0
  11. package/dist/control-plane/types.d.ts +2 -1
  12. package/dist/control-plane/workflows/openai.js +19 -0
  13. package/dist/control-plane/workflows/types.d.ts +6 -1
  14. package/dist/procedure-engine/index.d.ts +10 -1
  15. package/dist/procedure-engine/index.js +34 -4
  16. package/dist/providers/openai/app-server/json-rpc.d.ts +6 -1
  17. package/dist/providers/openai/app-server/json-rpc.js +15 -1
  18. package/dist/providers/openai/app-server/read-only-procedure.d.ts +2 -0
  19. package/dist/providers/openai/app-server/read-only-procedure.js +13 -1
  20. package/dist/providers/openai/app-server/runtime-telemetry.d.ts +18 -0
  21. package/dist/providers/openai/app-server/runtime-telemetry.js +130 -0
  22. package/dist/providers/openai/app-server/workspace-write-run.d.ts +2 -0
  23. package/dist/providers/openai/app-server/workspace-write-run.js +13 -1
  24. package/dist/run-engine/index.d.ts +2 -1
  25. package/dist/run-engine/index.js +14 -1
  26. package/dist/run-pipeline/task-run-invocation.js +9 -0
  27. package/dist/server-shell/cli/args.d.ts +9 -9
  28. package/dist/server-shell/cli/args.js +31 -31
  29. package/dist/server-shell/cli/cli.js +27 -27
  30. package/dist/server-shell/cli/errors.d.ts +2 -1
  31. package/dist/server-shell/cli/errors.js +55 -12
  32. package/dist/server-shell/cli/host-lifecycle.js +7 -0
  33. package/dist/server-shell/cli/launch-command.d.ts +2 -2
  34. package/dist/server-shell/cli/launch-command.js +25 -11
  35. package/dist/server-shell/cli/launch.js +0 -3
  36. package/dist/server-shell/cli/managed-host.d.ts +2 -0
  37. package/dist/server-shell/cli/managed-host.js +9 -18
  38. package/dist/server-shell/cli/project-resolver.d.ts +6 -0
  39. package/dist/server-shell/cli/project-resolver.js +125 -3
  40. package/dist/server-shell/cli/provider-tui.d.ts +19 -0
  41. package/dist/server-shell/cli/provider-tui.js +64 -38
  42. package/dist/server-shell/cli/runtime-commands.d.ts +5 -5
  43. package/dist/server-shell/cli/runtime-commands.js +68 -25
  44. package/dist/server-shell/cli/terminal-qr.d.ts +5 -0
  45. package/dist/server-shell/cli/terminal-qr.js +17 -0
  46. package/dist/server-shell/http/routes/project-api/openapi-execution-routes.d.ts +14 -0
  47. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +14 -0
  48. package/dist/server-shell/http/routes/project-api/openapi.d.ts +28 -0
  49. package/dist/server-shell/http/routes/project-api/schemas.d.ts +14 -0
  50. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.d.ts +50 -0
  51. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.js +25 -0
  52. package/node_modules/@tutti/shared/dist/schemas/api/types.d.ts +4 -1
  53. package/package.json +1 -1
  54. package/web/assets/index-CDUT1Etl.js +29 -0
  55. package/web/assets/{index-D8xJY8Gr.css → index-DIQpGeKY.css} +1 -1
  56. package/web/index.html +2 -2
  57. package/web/assets/index-BMMQgQjz.js +0 -29
@@ -1,17 +1,19 @@
1
1
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
- import { join, resolve } from "node:path";
2
+ import { join } from "node:path";
3
3
  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
7
  import { getHostLogFilePath, getMachineRuntimeEndpointPath, getProjectLocalStoreRoot, readMachineProjectBinding, readMachineRuntimeEndpoint, } from "./machine-local.js";
8
8
  import { readHostLocalLaunchStatus, readHostLocalProject, readHostLocalProviderConfig, requestHostLocalShutdown, rotateHostLocalInvite, } from "./local-control-client.js";
9
+ import { formatCliErrorReason, LaunchError } from "./errors.js";
9
10
  import { resolveExistingProjectContext } from "./project-resolver.js";
10
- import { renderTerminalQr } from "./terminal-qr.js";
11
+ import { formatJoinLinkValidity, renderTerminalQr } from "./terminal-qr.js";
11
12
  import { resolveTuttiHome } from "../../providers/openai/index.js";
12
- function resolveProject(workspacePath) {
13
+ const PROJECT_ID_DISPLAY_MIN_LENGTH = 12;
14
+ function resolveProject(target) {
13
15
  return resolveExistingProjectContext({
14
- ...(workspacePath === undefined ? {} : { workspacePath }),
16
+ ...(target === undefined ? {} : { target }),
15
17
  });
16
18
  }
17
19
  function projectIdsFromTuttiHome(tuttiHome) {
@@ -32,6 +34,23 @@ function readEndpointFile(tuttiHome, projectId) {
32
34
  return null;
33
35
  }
34
36
  }
37
+ function readBindingFile(tuttiHome, projectId) {
38
+ try {
39
+ return readMachineProjectBinding(tuttiHome, projectId);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export function formatProjectIdForDisplay(projectId, projectIds) {
46
+ for (let length = Math.min(PROJECT_ID_DISPLAY_MIN_LENGTH, projectId.length); length <= projectId.length; length += 1) {
47
+ const prefix = projectId.slice(0, length);
48
+ if (projectIds.every((candidate) => candidate === projectId || !candidate.startsWith(prefix))) {
49
+ return prefix;
50
+ }
51
+ }
52
+ return projectId;
53
+ }
35
54
  export async function listRuntimeProjects(options = {}) {
36
55
  const cwd = options.cwd ?? process.cwd();
37
56
  const tuttiHome = resolveTuttiHome(options.env?.TUTTI_HOME, cwd);
@@ -42,7 +61,7 @@ export async function listRuntimeProjects(options = {}) {
42
61
  if (endpoint === null) {
43
62
  continue;
44
63
  }
45
- const binding = readMachineProjectBinding(tuttiHome, projectId);
64
+ const binding = readBindingFile(tuttiHome, projectId);
46
65
  const health = await probe(endpoint);
47
66
  if (health.kind === "stale") {
48
67
  rows.push({
@@ -84,9 +103,11 @@ function formatTable(rows) {
84
103
  if (rows.length === 0) {
85
104
  return "No Tutti host processes found.";
86
105
  }
87
- const header = ["STATUS", "PROJECT", "PROVIDER", "WORKSPACE"];
106
+ const header = ["STATUS", "ID", "PROJECT", "PROVIDER", "WORKSPACE"];
107
+ const projectIds = rows.map((row) => row.project_id);
88
108
  const data = rows.map((row) => [
89
109
  row.status,
110
+ formatProjectIdForDisplay(row.project_id, projectIds),
90
111
  row.display_name,
91
112
  row.provider_status ?? "-",
92
113
  redactText(row.workspace_root),
@@ -123,10 +144,12 @@ function renderManager(options) {
123
144
  "",
124
145
  ];
125
146
  if (options.rows.length > 0) {
126
- const header = ["", "STATUS", "PROJECT", "PROVIDER", "WORKSPACE"];
147
+ const header = ["", "STATUS", "ID", "PROJECT", "PROVIDER", "WORKSPACE"];
148
+ const projectIds = options.rows.map((row) => row.project_id);
127
149
  const data = options.rows.map((row, index) => [
128
150
  index === options.selectedIndex ? ">" : " ",
129
151
  row.status,
152
+ formatProjectIdForDisplay(row.project_id, projectIds),
130
153
  row.display_name,
131
154
  row.provider_status ?? "-",
132
155
  redactText(row.workspace_root),
@@ -212,7 +235,7 @@ export async function runPsManageCommand(options = {}) {
212
235
  message = `Invite refreshed for ${project.display_name}.`;
213
236
  }
214
237
  catch (error) {
215
- message = error instanceof Error ? error.message : "Invite refresh failed.";
238
+ message = formatCliErrorReason(error);
216
239
  detail = undefined;
217
240
  }
218
241
  render();
@@ -232,7 +255,7 @@ export async function runPsManageCommand(options = {}) {
232
255
  detail = undefined;
233
256
  }
234
257
  catch (error) {
235
- message = error instanceof Error ? error.message : "Stop failed.";
258
+ message = formatCliErrorReason(error);
236
259
  detail = undefined;
237
260
  }
238
261
  render();
@@ -248,30 +271,53 @@ export async function runPsManageCommand(options = {}) {
248
271
  stdout.write(SHOW_CURSOR);
249
272
  }
250
273
  }
251
- export async function runStopCommand(workspacePath) {
252
- const project = resolveProject(workspacePath);
274
+ export async function runStopCommand(target) {
275
+ const project = resolveProject(target);
253
276
  const endpoint = project.runtime_endpoint;
254
277
  if (endpoint === null) {
255
278
  return "Tutti host is not running for this project.";
256
279
  }
257
- await requestHostLocalShutdown({ endpoint });
280
+ try {
281
+ await requestHostLocalShutdown({ endpoint });
282
+ }
283
+ catch (error) {
284
+ 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
+ }
258
286
  return `Stopped ${project.display_name}.`;
259
287
  }
260
- export async function runInviteCommand(workspacePath) {
261
- const project = resolveProject(workspacePath);
288
+ export async function runInviteCommand(target) {
289
+ const project = resolveProject(target);
262
290
  const endpoint = project.runtime_endpoint;
263
291
  if (endpoint === null) {
264
- throw new Error("Tutti host is not running for this project.");
292
+ throw new LaunchError("host_not_running", "Tutti host is not running for this project.", "Run `tutti launch` first, then retry `tutti invite`.");
293
+ }
294
+ let status;
295
+ try {
296
+ status = await rotateHostLocalInvite({ endpoint });
297
+ }
298
+ catch (error) {
299
+ throw new LaunchError("existing_server_unhealthy", `Could not refresh the invite: ${formatCliErrorReason(error)}`, "Run `tutti launch` to restart or reconnect the host, then retry `tutti invite`.");
265
300
  }
266
- const status = await rotateHostLocalInvite({ endpoint });
267
301
  const joinUrl = status.relay?.join_url;
268
302
  if (joinUrl === undefined) {
269
- throw new Error("Relay did not return a visible join URL.");
303
+ throw new LaunchError("relay_registration_failed", "Relay did not return a visible join URL.", "Retry `tutti invite`; if it keeps failing, run `tutti launch` to reconnect the host.");
270
304
  }
271
- return [`Join URL: ${joinUrl}`, "", renderTerminalQr(joinUrl)].join("\n");
305
+ return [
306
+ `Join URL: ${joinUrl}`,
307
+ formatJoinLinkValidity({
308
+ ...(status.relay?.join_token_expires_at === undefined
309
+ ? {}
310
+ : { expiresAt: status.relay.join_token_expires_at }),
311
+ ...(status.relay?.join_token_reusable === undefined
312
+ ? {}
313
+ : { reusable: status.relay.join_token_reusable }),
314
+ }),
315
+ "",
316
+ renderTerminalQr(joinUrl),
317
+ ].join("\n");
272
318
  }
273
- export function runProviderStatusCommand(workspacePath) {
274
- const project = resolveProject(workspacePath);
319
+ export function runProviderStatusCommand(target) {
320
+ const project = resolveProject(target);
275
321
  return [
276
322
  `Project: ${project.display_name}`,
277
323
  `Provider: ${project.provider_config.status}`,
@@ -284,8 +330,8 @@ export function runProviderStatusCommand(workspacePath) {
284
330
  : []),
285
331
  ].join("\n");
286
332
  }
287
- export function runLogsCommand(workspacePath, tailLines = 120) {
288
- const project = resolveProject(workspacePath);
333
+ export function runLogsCommand(target, tailLines = 120) {
334
+ const project = resolveProject(target);
289
335
  const logPath = getHostLogFilePath(project.tutti_home);
290
336
  if (!existsSync(logPath)) {
291
337
  return `No host log exists yet at ${redactText(logPath)}.`;
@@ -302,7 +348,4 @@ export function runtimeEndpointPathForProject(tuttiHome, projectId) {
302
348
  export function projectLocalStoreRoot(tuttiHome, projectId) {
303
349
  return getProjectLocalStoreRoot(tuttiHome, projectId);
304
350
  }
305
- export function resolveWorkspacePath(value) {
306
- return resolve(process.cwd(), value ?? ".");
307
- }
308
351
  //# sourceMappingURL=runtime-commands.js.map
@@ -1,2 +1,7 @@
1
1
  export declare function renderTerminalQr(input: string): string;
2
+ export declare function formatJoinLinkValidity(options: {
3
+ expiresAt?: string;
4
+ reusable?: boolean;
5
+ now?: Date;
6
+ }): string;
2
7
  //# sourceMappingURL=terminal-qr.d.ts.map
@@ -8,4 +8,21 @@ export function renderTerminalQr(input) {
8
8
  });
9
9
  return output.trimEnd();
10
10
  }
11
+ export function formatJoinLinkValidity(options) {
12
+ if (options.expiresAt !== undefined) {
13
+ const expiresAt = new Date(options.expiresAt);
14
+ if (!Number.isNaN(expiresAt.getTime())) {
15
+ const now = options.now ?? new Date();
16
+ const remainingMs = expiresAt.getTime() - now.getTime();
17
+ const suffix = remainingMs <= 0
18
+ ? "expired"
19
+ : `about ${Math.ceil(remainingMs / 60_000).toString()} min`;
20
+ return `Join link valid until: ${options.expiresAt} (${suffix})`;
21
+ }
22
+ }
23
+ if (options.reusable === true) {
24
+ return "Join link validity: reusable; expiration was not reported.";
25
+ }
26
+ return "Join link validity: expiration was not reported.";
27
+ }
11
28
  //# sourceMappingURL=terminal-qr.js.map
@@ -189,6 +189,20 @@ export declare const HOST_PROJECT_EXECUTION_OPENAPI_ROUTES: ({
189
189
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
190
190
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
191
191
  }>>>;
192
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
193
+ activity_ref: import("@sinclair/typebox").TString;
194
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
195
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
196
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
197
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
198
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
199
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
200
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
201
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
202
+ total_tokens: import("@sinclair/typebox").TInteger;
203
+ }>>;
204
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
205
+ }>>;
192
206
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
193
207
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
194
208
  thread_id: import("@sinclair/typebox").TString;
@@ -1211,6 +1211,20 @@ export declare const HOST_PROJECT_WORKSPACE_OPENAPI_ROUTES: ({
1211
1211
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
1212
1212
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1213
1213
  }>>>;
1214
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1215
+ activity_ref: import("@sinclair/typebox").TString;
1216
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1217
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1218
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1219
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1220
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1221
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1222
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1223
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1224
+ total_tokens: import("@sinclair/typebox").TInteger;
1225
+ }>>;
1226
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
1227
+ }>>;
1214
1228
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1215
1229
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
1216
1230
  thread_id: import("@sinclair/typebox").TString;
@@ -799,6 +799,20 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
799
799
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
800
800
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
801
801
  }>>>;
802
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
803
+ activity_ref: import("@sinclair/typebox").TString;
804
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
805
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
806
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
807
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
808
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
809
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
810
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
811
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
812
+ total_tokens: import("@sinclair/typebox").TInteger;
813
+ }>>;
814
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
815
+ }>>;
802
816
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
803
817
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
804
818
  thread_id: import("@sinclair/typebox").TString;
@@ -2350,6 +2364,20 @@ export declare const HOST_PROJECT_OPENAPI_ROUTES: ({
2350
2364
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
2351
2365
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2352
2366
  }>>>;
2367
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
2368
+ activity_ref: import("@sinclair/typebox").TString;
2369
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2370
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2371
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
2372
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
2373
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
2374
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
2375
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
2376
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
2377
+ total_tokens: import("@sinclair/typebox").TInteger;
2378
+ }>>;
2379
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
2380
+ }>>;
2353
2381
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
2354
2382
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
2355
2383
  thread_id: import("@sinclair/typebox").TString;
@@ -1193,6 +1193,20 @@ export declare const BootstrapResponseSchema: {
1193
1193
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
1194
1194
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1195
1195
  }>>>;
1196
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1197
+ activity_ref: import("@sinclair/typebox").TString;
1198
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1199
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1200
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
1201
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
1202
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1203
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1204
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1205
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
1206
+ total_tokens: import("@sinclair/typebox").TInteger;
1207
+ }>>;
1208
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
1209
+ }>>;
1196
1210
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
1197
1211
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
1198
1212
  thread_id: import("@sinclair/typebox").TString;
@@ -8,6 +8,28 @@ export declare const ExecutionActivitySummarySchema: import("@sinclair/typebox")
8
8
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
9
9
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
10
  }>;
11
+ export declare const ExecutionRuntimeActionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>;
12
+ export declare const ExecutionRuntimeTokenUsageSchema: import("@sinclair/typebox").TObject<{
13
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
14
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
15
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
16
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
17
+ total_tokens: import("@sinclair/typebox").TInteger;
18
+ }>;
19
+ export declare const ExecutionRuntimeSnapshotSchema: import("@sinclair/typebox").TObject<{
20
+ activity_ref: import("@sinclair/typebox").TString;
21
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
22
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
24
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
25
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
26
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
27
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
28
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
29
+ total_tokens: import("@sinclair/typebox").TInteger;
30
+ }>>;
31
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
32
+ }>;
11
33
  export declare const ExecutionStatusProjectionSchema: import("@sinclair/typebox").TObject<{
12
34
  status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"idle">, import("@sinclair/typebox").TLiteral<"running">, import("@sinclair/typebox").TLiteral<"pending">, import("@sinclair/typebox").TLiteral<"failed">]>;
13
35
  summary: import("@sinclair/typebox").TString;
@@ -41,6 +63,20 @@ export declare const ExecutionStatusProjectionSchema: import("@sinclair/typebox"
41
63
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
42
64
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
43
65
  }>>>;
66
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
67
+ activity_ref: import("@sinclair/typebox").TString;
68
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
69
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
70
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
71
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
72
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
73
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
74
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
75
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
76
+ total_tokens: import("@sinclair/typebox").TInteger;
77
+ }>>;
78
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
79
+ }>>;
44
80
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
45
81
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
46
82
  thread_id: import("@sinclair/typebox").TString;
@@ -164,6 +200,20 @@ export declare const ExecutionStatusChangedEventPayloadSchema: import("@sinclair
164
200
  lane: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"foreground">, import("@sinclair/typebox").TLiteral<"scratchpad_background">]>>;
165
201
  started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
166
202
  }>>>;
203
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
204
+ activity_ref: import("@sinclair/typebox").TString;
205
+ stage_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
206
+ started_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
207
+ updated_at: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
208
+ token_usage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
209
+ input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
210
+ cached_input_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
211
+ output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
212
+ reasoning_output_tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
213
+ total_tokens: import("@sinclair/typebox").TInteger;
214
+ }>>;
215
+ current_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"reading_context">, import("@sinclair/typebox").TLiteral<"planning">, import("@sinclair/typebox").TLiteral<"editing_files">, import("@sinclair/typebox").TLiteral<"running_command">, import("@sinclair/typebox").TLiteral<"using_tool">, import("@sinclair/typebox").TLiteral<"waiting_for_approval">, import("@sinclair/typebox").TLiteral<"finalizing">]>>;
216
+ }>>;
167
217
  blocked_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
168
218
  kind: import("@sinclair/typebox").TLiteral<"clarification">;
169
219
  thread_id: import("@sinclair/typebox").TString;
@@ -22,12 +22,37 @@ export const ExecutionActivitySummarySchema = Type.Object({
22
22
  lane: Type.Optional(ProcedureLaneSchema),
23
23
  started_at: Type.Optional(IsoDateTimeStringSchema),
24
24
  }, { additionalProperties: false });
25
+ export const ExecutionRuntimeActionSchema = Type.Union([
26
+ Type.Literal("reading_context"),
27
+ Type.Literal("planning"),
28
+ Type.Literal("editing_files"),
29
+ Type.Literal("running_command"),
30
+ Type.Literal("using_tool"),
31
+ Type.Literal("waiting_for_approval"),
32
+ Type.Literal("finalizing"),
33
+ ]);
34
+ export const ExecutionRuntimeTokenUsageSchema = Type.Object({
35
+ input_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
36
+ cached_input_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
37
+ output_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
38
+ reasoning_output_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
39
+ total_tokens: Type.Integer({ minimum: 0 }),
40
+ }, { additionalProperties: false });
41
+ export const ExecutionRuntimeSnapshotSchema = Type.Object({
42
+ activity_ref: ActivityRefSchema,
43
+ stage_id: Type.Optional(Type.String()),
44
+ started_at: Type.Optional(IsoDateTimeStringSchema),
45
+ updated_at: Type.Optional(IsoDateTimeStringSchema),
46
+ token_usage: Type.Optional(ExecutionRuntimeTokenUsageSchema),
47
+ current_action: Type.Optional(ExecutionRuntimeActionSchema),
48
+ }, { additionalProperties: false });
25
49
  export const ExecutionStatusProjectionSchema = Type.Object({
26
50
  status: ExecutionStatusKindSchema,
27
51
  summary: Type.String(),
28
52
  active_task: Type.Optional(TaskProjectionSchema),
29
53
  active_activity: Type.Optional(ExecutionActivitySummarySchema),
30
54
  active_activities: Type.Optional(Type.Array(ExecutionActivitySummarySchema)),
55
+ runtime: Type.Optional(ExecutionRuntimeSnapshotSchema),
31
56
  blocked_by: Type.Optional(Type.Union([
32
57
  Type.Object({
33
58
  kind: Type.Literal("clarification"),
@@ -13,7 +13,7 @@ import type { ActiveClarificationProjectionSchema, ClarificationChangedEventPayl
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";
14
14
  import type { ArtifactKindSchema, ArtifactManifestPathSchema, ArtifactManifestSchema, ArtifactPreviewCommandPayloadSchema, ArtifactPreviewCommandResultSchema, ArtifactPreviewProjectionSchema, ArtifactPreviewStatusSchema, ArtifactProjectionSchema, ArtifactServerManifestSchema, ArtifactStaticManifestSchema, ArtifactSummaryProjectionSchema, GetArtifactsResponseSchema, HeartbeatArtifactPreviewDispositionSchema, StartArtifactPreviewDispositionSchema, StopArtifactPreviewDispositionSchema } from "./artifacts.js";
15
15
  import type { DeleteSkillDispositionSchema, DeleteSkillPayloadSchema, GetSkillParamsSchema, GetSkillResponseSchema, GetSkillsResponseSchema, ImportSkillZipDispositionSchema, ImportSkillZipPayloadSchema, ImportSkillZipResultSchema, SkillDetailProjectionSchema, SkillNameSchema, SkillProjectionSchema } from "./skills.js";
16
- import type { ActivityEventProjectionSchema, ActivityEventSsePayloadSchema, ApprovalChangedEventPayloadSchema, ActivityProjectionSchema, ConnectionReadyEventPayloadSchema, ExecutionActivitySummarySchema, ExecutionStatusChangedEventPayloadSchema, ExecutionStatusKindSchema, ExecutionStatusProjectionSchema, ProcedureLaneSchema, ProviderConfigChangedEventPayloadSchema, QueryInvalidateEventPayloadSchema, ScratchpadUpdatedEventPayloadSchema, TaskDetailUpdatedEventPayloadSchema, TaskUpdatedEventPayloadSchema, WorklistChangedEventPayloadSchema, WorkspaceRecoveredEventPayloadSchema } from "./runtime-events.js";
16
+ import type { ActivityEventProjectionSchema, ActivityEventSsePayloadSchema, ApprovalChangedEventPayloadSchema, ActivityProjectionSchema, ConnectionReadyEventPayloadSchema, ExecutionActivitySummarySchema, ExecutionRuntimeActionSchema, ExecutionRuntimeSnapshotSchema, ExecutionRuntimeTokenUsageSchema, ExecutionStatusChangedEventPayloadSchema, ExecutionStatusKindSchema, ExecutionStatusProjectionSchema, ProcedureLaneSchema, ProviderConfigChangedEventPayloadSchema, QueryInvalidateEventPayloadSchema, ScratchpadUpdatedEventPayloadSchema, TaskDetailUpdatedEventPayloadSchema, TaskUpdatedEventPayloadSchema, WorklistChangedEventPayloadSchema, WorkspaceRecoveredEventPayloadSchema } from "./runtime-events.js";
17
17
  import type { ContextSyncDispositionSchema, ContextSyncPayloadSchema, ContextSyncResultSchema, InitializeProjectDocsDispositionSchema, InitializeProjectDocsPayloadSchema, InitializeProjectDocsResultSchema, RefreshScratchpadDispositionSchema, RefreshScratchpadResultSchema, RunSchedulerNowDispositionSchema, RunSchedulerNowPayloadSchema, SubmitWorklistDispositionSchema, SubmitWorklistPayloadSchema, SubmitWorklistResultSchema, UpdateProjectDisplayNameDispositionSchema, UpdateProjectDisplayNamePayloadSchema, UpdateProjectDisplayNameResultSchema } from "./workspace-commands.js";
18
18
  export type CursorPageRequest = Static<typeof CursorPageRequestSchema>;
19
19
  export type CursorPage<TItem> = {
@@ -128,6 +128,9 @@ export type GetRecoverySummaryResponse = Static<typeof GetRecoverySummaryRespons
128
128
  export type ExecutionStatusKind = Static<typeof ExecutionStatusKindSchema>;
129
129
  export type ProcedureLane = Static<typeof ProcedureLaneSchema>;
130
130
  export type ExecutionActivitySummary = Static<typeof ExecutionActivitySummarySchema>;
131
+ export type ExecutionRuntimeAction = Static<typeof ExecutionRuntimeActionSchema>;
132
+ export type ExecutionRuntimeTokenUsage = Static<typeof ExecutionRuntimeTokenUsageSchema>;
133
+ export type ExecutionRuntimeSnapshot = Static<typeof ExecutionRuntimeSnapshotSchema>;
131
134
  export type ExecutionStatusProjection = Static<typeof ExecutionStatusProjectionSchema>;
132
135
  export type ActivityProjection = Static<typeof ActivityProjectionSchema>;
133
136
  export type ActivityEventProjection = Static<typeof ActivityEventProjectionSchema>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfey/tutti",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",