@chainingintention/pi-web-cn 1.202607.10 → 1.202608.2

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 (111) hide show
  1. package/README.md +9 -9
  2. package/dist/cli.js +27 -12
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/{CodeViewer-5vQNxhKQ.js → CodeViewer-j37b7YHz.js} +1 -1
  5. package/dist/client/assets/{TerminalPanel-Ctz1zP84.js → TerminalPanel-DqDiXDrk.js} +15 -15
  6. package/dist/client/assets/{UnifiedDiffViewer-DXLMHyO2.js → UnifiedDiffViewer-AQTSNI1y.js} +3 -3
  7. package/dist/client/assets/index-DDuQX9_Y.js +4101 -0
  8. package/dist/client/index.html +1 -1
  9. package/dist/config.js +36 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/nativeServices/servicePlan.js +3 -2
  12. package/dist/nativeServices/servicePlan.js.map +1 -1
  13. package/dist/nativeServices/serviceProbe.js +7 -5
  14. package/dist/nativeServices/serviceProbe.js.map +1 -1
  15. package/dist/pi-web-plugins/info/infoInternals.js +223 -0
  16. package/dist/pi-web-plugins/info/pi-web-plugin.js +19 -22
  17. package/dist/pi-web-plugins/relays/markdownDocument.js +81 -0
  18. package/dist/pi-web-plugins/relays/package.json +9 -0
  19. package/dist/pi-web-plugins/relays/pi-web-plugin.js +44 -0
  20. package/dist/pi-web-plugins/relays/relayDiscovery.js +96 -0
  21. package/dist/pi-web-plugins/relays/relaysPanelElement.js +327 -0
  22. package/dist/pi-web-plugins/relays/vendor/README.md +24 -0
  23. package/dist/pi-web-plugins/relays/vendor/marked.esm.js +76 -0
  24. package/dist/pi-web-plugins/updates/pi-web-plugin.js +100 -100
  25. package/dist/pi-web-plugins/updates/updatesLogic.js +8 -5
  26. package/dist/plugin-api.d.ts +5 -1
  27. package/dist/server/configRoutes.js +11 -0
  28. package/dist/server/configRoutes.js.map +1 -1
  29. package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
  30. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
  31. package/dist/server/git/gitService.js +176 -5
  32. package/dist/server/git/gitService.js.map +1 -1
  33. package/dist/server/piWebStatus.js +7 -4
  34. package/dist/server/piWebStatus.js.map +1 -1
  35. package/dist/server/realtime/sessionEventHub.js +25 -4
  36. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  37. package/dist/server/sessiond/sessionDaemonStartup.js +0 -42
  38. package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -1
  39. package/dist/server/sessiond/sessionServiceDependencies.js +31 -0
  40. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -0
  41. package/dist/server/sessions/askUserTool.js +105 -0
  42. package/dist/server/sessions/askUserTool.js.map +1 -0
  43. package/dist/server/sessions/authProviderOptions.js +26 -29
  44. package/dist/server/sessions/authProviderOptions.js.map +1 -1
  45. package/dist/server/sessions/authRoutes.js +9 -1
  46. package/dist/server/sessions/authRoutes.js.map +1 -1
  47. package/dist/server/sessions/authService.js +143 -33
  48. package/dist/server/sessions/authService.js.map +1 -1
  49. package/dist/server/sessions/globalProviderPolicy.js +167 -0
  50. package/dist/server/sessions/globalProviderPolicy.js.map +1 -0
  51. package/dist/server/sessions/modelCatalogRefresher.js +192 -0
  52. package/dist/server/sessions/modelCatalogRefresher.js.map +1 -0
  53. package/dist/server/sessions/oauthLoginFlowService.js +181 -56
  54. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
  55. package/dist/server/sessions/parentSessionLocator.js +75 -0
  56. package/dist/server/sessions/parentSessionLocator.js.map +1 -0
  57. package/dist/server/sessions/pendingAskStore.js +278 -0
  58. package/dist/server/sessions/pendingAskStore.js.map +1 -0
  59. package/dist/server/sessions/piSessionService.js +1329 -214
  60. package/dist/server/sessions/piSessionService.js.map +1 -1
  61. package/dist/server/sessions/plainTextTheme.js +112 -0
  62. package/dist/server/sessions/plainTextTheme.js.map +1 -0
  63. package/dist/server/sessions/projectAuthService.js +3 -3
  64. package/dist/server/sessions/projectAuthService.js.map +1 -1
  65. package/dist/server/sessions/sessionActivityCoordinator.js +38 -0
  66. package/dist/server/sessions/sessionActivityCoordinator.js.map +1 -0
  67. package/dist/server/sessions/sessionCommandService.js +60 -5
  68. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  69. package/dist/server/sessions/sessionContentSearch.js +74 -0
  70. package/dist/server/sessions/sessionContentSearch.js.map +1 -0
  71. package/dist/server/sessions/sessionFileHeader.js +45 -0
  72. package/dist/server/sessions/sessionFileHeader.js.map +1 -0
  73. package/dist/server/sessions/sessionNotificationStore.js +484 -0
  74. package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
  75. package/dist/server/sessions/sessionRoutes.js +265 -1
  76. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  77. package/dist/server/sessions/sessionTreeProjection.js +250 -0
  78. package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
  79. package/dist/server/sessions/sessionUnreadStore.js +520 -0
  80. package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
  81. package/dist/server/sessions/spawnSubsessionTool.js +10 -12
  82. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  83. package/dist/server/sessions/spawnTargetResolver.js +3 -16
  84. package/dist/server/sessions/spawnTargetResolver.js.map +1 -1
  85. package/dist/server/terminals/terminalService.js +8 -2
  86. package/dist/server/terminals/terminalService.js.map +1 -1
  87. package/dist/server/workspaces/gitWorktreeDiscovery.js +9 -0
  88. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -1
  89. package/dist/server/workspaces/projectWorkspaceCwds.js +22 -0
  90. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -0
  91. package/dist/server/workspaces/workspaceService.js +15 -2
  92. package/dist/server/workspaces/workspaceService.js.map +1 -1
  93. package/dist/shared/activity.js +9 -1
  94. package/dist/shared/activity.js.map +1 -1
  95. package/dist/shared/apiTypes.d.ts +434 -8
  96. package/dist/shared/apiTypes.js +26 -0
  97. package/dist/shared/apiTypes.js.map +1 -1
  98. package/dist/shared/capabilities.js +9 -0
  99. package/dist/shared/capabilities.js.map +1 -1
  100. package/dist/shared/federatedRoutes.js +14 -0
  101. package/dist/shared/federatedRoutes.js.map +1 -1
  102. package/dist/shared/thinkingLevels.d.ts +2 -0
  103. package/dist/shared/thinkingLevels.js +25 -0
  104. package/dist/shared/thinkingLevels.js.map +1 -1
  105. package/docs/config.md +76 -9
  106. package/docs/plugins.md +72 -16
  107. package/install.sh +1 -1
  108. package/package.json +10 -8
  109. package/dist/client/assets/index-Jmsbve6u.js +0 -3173
  110. package/dist/server/sessions/sessionArchiveMigration.js +0 -590
  111. package/dist/server/sessions/sessionArchiveMigration.js.map +0 -1
@@ -7,6 +7,9 @@ export declare const PI_WEB_CAPABILITIES: {
7
7
  readonly sessionsReload: "sessions.reload";
8
8
  readonly sessionsClearQueue: "sessions.clearQueue";
9
9
  readonly sessionsPersistedState: "sessions.persistedState";
10
+ readonly sessionsNotifications: "sessions.notifications";
11
+ readonly sessionsUnread: "sessions.unread";
12
+ readonly sessionsAskUser: "sessions.askUser";
10
13
  readonly promptAttachments: "prompt.attachments";
11
14
  readonly workspaceFileSuggestions: "workspace.fileSuggestions";
12
15
  readonly piPackagesManage: "piPackages.manage";
@@ -86,6 +89,11 @@ export interface PiWebConfigValues {
86
89
  * while the capability stabilizes. Requires spawnSessions to be enabled.
87
90
  */
88
91
  subsessions?: boolean;
92
+ /**
93
+ * When true, LLMs can post a question set to the browser via the ask_user
94
+ * tool. On by default; set to `false` to remove the tool from the runtime.
95
+ */
96
+ askUser?: boolean;
89
97
  /** Desired Pi-compatible agent profile and companion CLI (Pi by default). */
90
98
  agent?: PiWebAgentConfig;
91
99
  }
@@ -158,6 +166,7 @@ export interface PiWebConfigEnvOverrides {
158
166
  allowedHosts: boolean;
159
167
  spawnSessions: boolean;
160
168
  subsessions: boolean;
169
+ askUser: boolean;
161
170
  agentCommand: boolean;
162
171
  agentDir: boolean;
163
172
  /** The configured directory environment source, even when Pi compatibility is inactive for the desired command. */
@@ -171,16 +180,16 @@ export interface PiWebConfigResponse {
171
180
  effectiveConfig: PiWebConfigValues;
172
181
  envOverrides: PiWebConfigEnvOverrides;
173
182
  }
174
- export interface NormalAuthStatusResponse {
175
- configured: boolean;
176
- authenticated: boolean;
177
- }
178
183
  export interface Project {
179
184
  id: string;
180
185
  name: string;
181
186
  path: string;
182
187
  createdAt: string;
183
188
  }
189
+ export interface NormalAuthStatusResponse {
190
+ configured: boolean;
191
+ authenticated: boolean;
192
+ }
184
193
  export interface WorkspaceEffectiveConfig {
185
194
  uploads?: PiWebUploadsConfig;
186
195
  }
@@ -200,6 +209,116 @@ export interface SessionRef {
200
209
  id: string;
201
210
  cwd: string;
202
211
  }
212
+ export declare const SESSION_UNREAD_LIMIT = 1000;
213
+ export declare const SESSION_UNREAD_SESSION_ID_MAX_LENGTH = 512;
214
+ export declare const SESSION_UNREAD_CWD_MAX_LENGTH: number;
215
+ export declare const SESSION_UNREAD_CATALOG_ID_MAX_LENGTH = 512;
216
+ export declare const SESSION_UNREAD_COMPLETED_AT_MAX_LENGTH = 64;
217
+ export interface SessionUnreadSummary {
218
+ sessionId: string;
219
+ cwd: string;
220
+ /** Monotonic within a catalog and never greater than its containing revision. */
221
+ completionOrder: number;
222
+ completedAt: string;
223
+ }
224
+ export interface SessionUnreadCatalogSnapshot {
225
+ /** Stable for one persisted catalog epoch; changes when unread state is reset. */
226
+ catalogId: string;
227
+ /** Monotonic catalog mutation revision; at least every contained completion order. */
228
+ catalogRevision: number;
229
+ /** Bounded by `SESSION_UNREAD_LIMIT` and ordered newest completion first. */
230
+ sessions: SessionUnreadSummary[];
231
+ }
232
+ export interface SessionUnreadAcknowledgeRequest {
233
+ cwd: string;
234
+ /** The catalog epoch in which `throughCompletionOrder` was observed. */
235
+ catalogId: string;
236
+ throughCompletionOrder: number;
237
+ }
238
+ /** Authoritative delta for one session in the daemon-owned unread catalog. */
239
+ export interface SessionUnreadEvent {
240
+ type: "sessions.unread";
241
+ catalogId: string;
242
+ /** At least `unread.completionOrder` when carrying an unread summary. */
243
+ catalogRevision: number;
244
+ sessionId: string;
245
+ cwd: string;
246
+ unread: SessionUnreadSummary | null;
247
+ }
248
+ export declare const SESSION_NOTIFICATION_LIMIT = 100;
249
+ export declare const SESSION_NOTIFICATION_MESSAGE_BYTES: number;
250
+ export type SessionNotificationSeverity = "info" | "warning" | "error";
251
+ export interface SessionNotification {
252
+ id: string;
253
+ message: string;
254
+ truncated: boolean;
255
+ severity: SessionNotificationSeverity;
256
+ receivedAt: string;
257
+ order: number;
258
+ }
259
+ export interface SessionNotificationSummary {
260
+ sessionId: string;
261
+ cwd: string;
262
+ inboxRevision: number;
263
+ retainedCount: number;
264
+ discardedCount: number;
265
+ highestSeverity?: SessionNotificationSeverity;
266
+ }
267
+ export interface SessionNotificationDismissThrough {
268
+ order: number;
269
+ overflowWatermark: number;
270
+ }
271
+ export interface SessionNotificationInboxSnapshot {
272
+ daemonInstanceId: string;
273
+ catalogRevision: number;
274
+ summary: SessionNotificationSummary;
275
+ notifications: SessionNotification[];
276
+ dismissThrough: SessionNotificationDismissThrough;
277
+ }
278
+ export interface SessionNotificationCatalogSnapshot {
279
+ daemonInstanceId: string;
280
+ catalogRevision: number;
281
+ sessions: SessionNotificationSummary[];
282
+ }
283
+ export interface SessionNotificationDismissRequest {
284
+ cwd: string;
285
+ daemonInstanceId: string;
286
+ notificationId: string;
287
+ }
288
+ export interface SessionNotificationDismissAllRequest {
289
+ cwd: string;
290
+ daemonInstanceId: string;
291
+ throughOrder: number;
292
+ throughOverflowWatermark: number;
293
+ }
294
+ export type SessionNotificationClearReason = "runtime-close" | "archive" | "delete" | "restore" | "archive-reconcile" | "replacement" | "initialization-failed" | "service-dispose";
295
+ export type SessionNotificationInboxDelta = {
296
+ kind: "added";
297
+ notification: SessionNotification;
298
+ evictedNotificationId?: string;
299
+ } | {
300
+ kind: "dismissed";
301
+ notificationIds: string[];
302
+ } | {
303
+ kind: "cleared";
304
+ reason: SessionNotificationClearReason;
305
+ } | {
306
+ kind: "resync";
307
+ };
308
+ export interface SessionNotificationInboxEvent {
309
+ type: "notifications.inbox";
310
+ daemonInstanceId: string;
311
+ catalogRevision: number;
312
+ summary: SessionNotificationSummary;
313
+ dismissThrough: SessionNotificationDismissThrough;
314
+ delta: SessionNotificationInboxDelta;
315
+ }
316
+ export interface SessionNotificationSummaryEvent {
317
+ type: "notifications.summary";
318
+ daemonInstanceId: string;
319
+ catalogRevision: number;
320
+ summary: SessionNotificationSummary;
321
+ }
203
322
  export interface SessionInfo extends SessionRef {
204
323
  path: string;
205
324
  /** True when the server has verified a backing session file exists; false when known transient. */
@@ -210,9 +329,46 @@ export interface SessionInfo extends SessionRef {
210
329
  messageCount: number;
211
330
  firstMessage: string;
212
331
  parentSessionPath?: string;
332
+ /**
333
+ * Working directory of the parent session, read from the parent session file
334
+ * header. Only populated when the parent is outside this listing's cwd, so a
335
+ * child whose parent lives in another worktree can point at it instead of
336
+ * only reporting that the parent is unavailable here.
337
+ */
338
+ parentSessionCwd?: string;
339
+ /** Session id of an out-of-cwd parent, so the browser can select it after switching workspace. */
340
+ parentSessionId?: string;
341
+ /**
342
+ * Number of sessions in other workspaces of the same project that record this
343
+ * session as their parent. Only set when non-zero, so a parent can show that
344
+ * it has children which are not nested beneath it in this workspace.
345
+ */
346
+ childSessionsElsewhere?: number;
213
347
  archived?: boolean;
214
348
  archivedAt?: string;
215
349
  }
350
+ export interface SessionContentSearchExcerpt {
351
+ text: string;
352
+ matchRanges: {
353
+ start: number;
354
+ length: number;
355
+ }[];
356
+ }
357
+ export interface SessionContentSearchMatch {
358
+ messageIndex: number;
359
+ role: "user" | "assistant";
360
+ excerpts: SessionContentSearchExcerpt[];
361
+ occurrenceCount: number;
362
+ }
363
+ export interface SessionContentSearchResult {
364
+ session: SessionInfo;
365
+ matches: SessionContentSearchMatch[];
366
+ }
367
+ export interface SessionContentSearchResponse {
368
+ results: SessionContentSearchResult[];
369
+ matchCount: number;
370
+ truncated: boolean;
371
+ }
216
372
  export interface SessionPinnedIdsResponse {
217
373
  sessionIds: string[];
218
374
  }
@@ -288,11 +444,155 @@ export interface SessionActivity {
288
444
  label: string;
289
445
  detail?: string;
290
446
  at: string;
447
+ /**
448
+ * Set only on the startup window's own reports. A startup phase is genuinely
449
+ * in progress, so it is published as `active` and rendered like any other
450
+ * activity, but *starting* a session is not *working* in it: there is nothing
451
+ * to stop, nothing that blocks reloading from disk, and no workspace-level
452
+ * work to report. `isSessionActive()` reads this to keep the two apart.
453
+ */
454
+ startup?: boolean;
291
455
  }
292
456
  export interface QueuedSessionMessage {
293
457
  kind: "steer" | "followUp";
294
458
  text: string;
295
459
  }
460
+ /**
461
+ * `customType` of the follow-up custom message that carries a closed ask back to
462
+ * the model and into the transcript. Its `details` are an {@link AskUserOutcome}.
463
+ */
464
+ export declare const ASK_USER_ANSWERS_CUSTOM_TYPE = "pi-web.ask.answers";
465
+ /** Largest question set one `ask_user` call may post. */
466
+ export declare const ASK_USER_QUESTION_LIMIT = 20;
467
+ /** Largest option list one question may offer. */
468
+ export declare const ASK_USER_OPTION_LIMIT = 12;
469
+ /** Length bound for ids: the ask id, question ids, and option values. */
470
+ export declare const ASK_USER_ID_MAX_LENGTH = 128;
471
+ /** Length bound for model-authored prose: questions, details, and option labels. */
472
+ export declare const ASK_USER_TEXT_MAX_LENGTH = 1000;
473
+ /** Length bound for the free text a user types as a custom answer. */
474
+ export declare const ASK_USER_OTHER_TEXT_MAX_LENGTH = 4000;
475
+ /** One selectable option of an {@link AskUserQuestion}. */
476
+ export interface AskUserQuestionOption {
477
+ /** Stable machine value reported back to the model. */
478
+ value: string;
479
+ /** Short human label rendered in the browser. */
480
+ label: string;
481
+ /** Optional clarifying line rendered under the label. */
482
+ detail?: string;
483
+ }
484
+ /**
485
+ * One question of an `ask_user` set. Questions are never required: the user may
486
+ * submit while leaving any of them untouched, and unanswered questions are
487
+ * reported to the model as such.
488
+ */
489
+ export interface AskUserQuestion {
490
+ /** Unique within the ask; used as the answer key. */
491
+ id: string;
492
+ /** The question itself, as one plain-text line. */
493
+ question: string;
494
+ /** Optional supporting context rendered under the question. */
495
+ detail?: string;
496
+ /** Offered options; may be empty when only free text makes sense. */
497
+ options: AskUserQuestionOption[];
498
+ /**
499
+ * Compatibility marker for older clients. Canonical questions set this to
500
+ * true because every question offers a custom free-text answer.
501
+ */
502
+ allowOther?: boolean;
503
+ /** When true, several options may be selected at once. */
504
+ multiple?: boolean;
505
+ }
506
+ /**
507
+ * The open, unanswered question set of a session. Daemon-owned and reported in
508
+ * {@link SessionStatus}, so a reconnecting or reloading browser rehydrates it
509
+ * without depending on having seen the `ask.opened` event.
510
+ */
511
+ export interface PendingAskUser {
512
+ askId: string;
513
+ askedAt: string;
514
+ questions: AskUserQuestion[];
515
+ }
516
+ /** Why an ask stopped being the session's open ask. */
517
+ export type AskUserCloseReason = "submitted" | "superseded" | "cancelled";
518
+ /**
519
+ * What the user replied to one question. Absent from a submission means the
520
+ * question was left untouched; an empty `values` with no `otherText` means the
521
+ * same thing.
522
+ */
523
+ export interface AskUserAnswer {
524
+ /** Matches an {@link AskUserQuestion.id} of the open ask. */
525
+ id: string;
526
+ /** Selected {@link AskUserQuestionOption.value} entries; several only when the question allows it. */
527
+ values: string[];
528
+ /** Free text typed as the question's custom answer. */
529
+ otherText?: string;
530
+ }
531
+ /** One submit of the open ask: answers for some or all of its questions. */
532
+ export interface AskUserSubmission {
533
+ answers: AskUserAnswer[];
534
+ }
535
+ /**
536
+ * One question of a closed ask paired with what came back for it. Carries the
537
+ * question itself so the record renders without the original ask still existing.
538
+ */
539
+ export interface AskUserQuestionRecord {
540
+ question: AskUserQuestion;
541
+ /** True when at least one option was selected or custom text was given. */
542
+ answered: boolean;
543
+ values: string[];
544
+ otherText?: string;
545
+ }
546
+ /**
547
+ * The complete result of an ask, computed when it closes. Shared by the
548
+ * model-facing follow-up message and the browser's read-only record, so both
549
+ * report the same answered and unanswered questions.
550
+ */
551
+ export interface AskUserOutcome {
552
+ askId: string;
553
+ reason: AskUserCloseReason;
554
+ askedAt: string;
555
+ closedAt: string;
556
+ questions: AskUserQuestionRecord[];
557
+ answeredCount: number;
558
+ /** Ids of the questions left unanswered, in the order they were asked. */
559
+ unansweredIds: string[];
560
+ /** One line, for example `Answered 3 of 5; unanswered: q2, q5`. */
561
+ summary: string;
562
+ }
563
+ /**
564
+ * Result of the browser closing an ask by submitting or cancelling it.
565
+ *
566
+ * `"stale"` is an ordinary race rather than an error: the named ask was already
567
+ * submitted, superseded by a newer one, or gone with its session runtime. The
568
+ * browser drops its card and trusts `sessionStatus`, which is returned in both
569
+ * cases so closing an ask needs no follow-up status request.
570
+ */
571
+ export interface AskUserCloseResponse {
572
+ result: "closed" | "stale";
573
+ /** Present only when this call is the one that closed the ask. */
574
+ outcome?: AskUserOutcome;
575
+ sessionStatus: SessionStatus;
576
+ }
577
+ /**
578
+ * Progress of the session startup window, where the daemon is still
579
+ * constructing the agent session and no `PiAgentSession` exists yet, so
580
+ * `activity.update` cannot be published for it.
581
+ *
582
+ * `startupToken` is the opaque label a create request supplied, echoed back so a
583
+ * browser row still waiting for a session id recognises its own construction.
584
+ * The daemon never interprets it and it never becomes the session id:
585
+ * `activity.sessionId` always carries the real id, which is how an *open* of a
586
+ * session the browser already knows is routed instead.
587
+ *
588
+ * `activity.phase === "idle"` means the startup window ended with nothing left
589
+ * to report, so a browser that substituted its own text should restore it.
590
+ */
591
+ export interface SessionStartupProgressEvent {
592
+ type: "session.startup";
593
+ startupToken?: string;
594
+ activity: SessionActivity;
595
+ }
296
596
  /**
297
597
  * A pi-native image attachment carried with a prompt. The wire format mirrors
298
598
  * pi's own `ImageContent` shape (`{ type: "image", data, mimeType }`) so these
@@ -351,6 +651,8 @@ export interface AuthProviderOption {
351
651
  name: string;
352
652
  authType: AuthType;
353
653
  status: AuthProviderStatus;
654
+ /** Additive hint: use the generic AuthInteraction transport instead of the legacy one-secret form. */
655
+ loginFlow?: "interactive";
354
656
  }
355
657
  export interface AuthProvidersResponse {
356
658
  providers: AuthProviderOption[];
@@ -363,12 +665,19 @@ export interface OAuthFlowState {
363
665
  auth?: {
364
666
  url: string;
365
667
  instructions?: string;
668
+ deviceCode?: {
669
+ userCode: string;
670
+ intervalSeconds?: number;
671
+ expiresInSeconds?: number;
672
+ };
366
673
  };
367
674
  prompt?: {
368
675
  requestId: string;
369
676
  message: string;
370
677
  placeholder?: string;
371
678
  allowEmpty?: boolean;
679
+ /** Additive semantic detail; legacy peers continue to use `kind`. */
680
+ promptType?: "text" | "secret" | "manual_code";
372
681
  kind: "prompt" | "manual";
373
682
  };
374
683
  select?: {
@@ -377,6 +686,13 @@ export interface OAuthFlowState {
377
686
  options: CommandOption[];
378
687
  };
379
688
  progress: string[];
689
+ info?: {
690
+ message: string;
691
+ links?: {
692
+ url: string;
693
+ label?: string;
694
+ }[];
695
+ }[];
380
696
  error?: string;
381
697
  }
382
698
  export interface ModelSelectionResponse {
@@ -385,6 +701,30 @@ export interface ModelSelectionResponse {
385
701
  export interface ThinkingLevelsResponse {
386
702
  levels: string[];
387
703
  }
704
+ export type SessionWarningSeverity = "info" | "warning" | "error";
705
+ /**
706
+ * A live, runtime-scoped warning surfaced to the browser (skill/resource
707
+ * diagnostics, extension load errors, subscription-auth billing notice, etc.).
708
+ *
709
+ * Warnings are recomputed whenever the runtime is (re)built inside sessiond and
710
+ * are not persisted chat messages. `source` is an optional short origin label
711
+ * (e.g. `"skill"`, `"extension"`, `"anthropic"`); `path` carries a related file
712
+ * path when the warning came from a resource diagnostic.
713
+ *
714
+ * `dismiss` is present only when the warning has a durable, first-class
715
+ * off-switch in the underlying `pi` agent (not a UI-only hide). Its `id` is the
716
+ * opaque token the server maps back to that suppression; the client renders a
717
+ * dismiss control for any warning carrying it, without knowing what it means.
718
+ */
719
+ export interface SessionWarning {
720
+ severity: SessionWarningSeverity;
721
+ message: string;
722
+ source?: string;
723
+ path?: string;
724
+ dismiss?: {
725
+ id: string;
726
+ };
727
+ }
388
728
  export interface SessionStatus {
389
729
  sessionId: string;
390
730
  /** True when the server has verified a backing session file exists; false when known transient. */
@@ -410,6 +750,18 @@ export interface SessionStatus {
410
750
  contextWindow: number;
411
751
  percent: number | null;
412
752
  };
753
+ /**
754
+ * Live, runtime-scoped warnings for this session (skill/resource diagnostics,
755
+ * extension load errors, Anthropic subscription-auth billing notice, etc.).
756
+ * Recomputed on each status read from the current runtime; absent/empty when
757
+ * there are none. See {@link SessionWarning}.
758
+ */
759
+ warnings?: SessionWarning[];
760
+ /**
761
+ * The session's open `ask_user` question set, when one is waiting for the
762
+ * user. Daemon-owned, so it survives browser reload and web/API restarts.
763
+ */
764
+ pendingAsk?: PendingAskUser;
413
765
  }
414
766
  export interface WorkspaceActivity {
415
767
  cwd: string;
@@ -493,6 +845,8 @@ export interface GitStatusFile {
493
845
  oldPath?: string;
494
846
  index: GitFileState;
495
847
  workingTree: GitFileState;
848
+ submoduleFromCommit?: string;
849
+ submoduleToCommit?: string;
496
850
  }
497
851
  export interface GitStatusResponse {
498
852
  isGitRepo: boolean;
@@ -502,6 +856,7 @@ export interface GitStatusResponse {
502
856
  ahead?: number;
503
857
  behind?: number;
504
858
  files: GitStatusFile[];
859
+ submodules: string[];
505
860
  }
506
861
  export interface GitDiffResponse {
507
862
  path?: string;
@@ -656,11 +1011,62 @@ export interface CommandOption {
656
1011
  label: string;
657
1012
  description?: string;
658
1013
  }
1014
+ export type SessionTreeNodeKind = "user" | "assistant" | "tool-result" | "bash" | "custom-message" | "compaction" | "branch-summary" | "model-change" | "thinking-level-change" | "session-info" | "label" | "custom" | "other";
1015
+ export interface SessionTreeNode {
1016
+ id: string;
1017
+ parentId: string | null;
1018
+ kind: SessionTreeNodeKind;
1019
+ summary: string;
1020
+ timestamp?: string;
1021
+ label?: string;
1022
+ }
1023
+ export interface SessionTreeSnapshot {
1024
+ /** Pre-order, parent-linked projection of all retained roots and descendants. */
1025
+ nodes: SessionTreeNode[];
1026
+ activeLeafId: string | null;
1027
+ /** Root-to-leaf IDs for explicit, non-color-only active-path rendering. */
1028
+ activePathIds: string[];
1029
+ }
1030
+ export declare const SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH = 10000;
1031
+ export type SessionTreeSummaryChoice = {
1032
+ mode: "none";
1033
+ } | {
1034
+ mode: "default";
1035
+ } | {
1036
+ mode: "custom";
1037
+ instructions: string;
1038
+ };
1039
+ export interface SessionTreeNavigateRequest {
1040
+ targetId: string;
1041
+ /** Leaf shown when the navigator opened; null is valid for an empty/root position. */
1042
+ expectedLeafId: string | null;
1043
+ summary: SessionTreeSummaryChoice;
1044
+ }
1045
+ export type SessionTreeNavigateResult = {
1046
+ cancelled: false;
1047
+ editorText?: string;
1048
+ } | {
1049
+ cancelled: true;
1050
+ aborted?: boolean;
1051
+ };
659
1052
  export interface MessagePage {
660
1053
  messages: unknown[];
661
1054
  start: number;
662
1055
  total: number;
663
1056
  }
1057
+ /**
1058
+ * Join-time snapshot of a session's in-flight assistant stream. `seq` is the
1059
+ * `SessionEventHub` watermark captured together with `partial` in a single tick,
1060
+ * so a joining client can seed `partial` and then apply only buffered live events
1061
+ * with `seq > snapshot.seq` (exactly-once). `partial` is a browser-projected
1062
+ * in-flight `AssistantMessage` (thinking signatures stripped), or `null` when the
1063
+ * session is not mid assistant-message stream.
1064
+ */
1065
+ export interface SessionStreamSnapshot {
1066
+ seq: number;
1067
+ /** Browser-projected in-flight `AssistantMessage`, or `null` when idle. */
1068
+ partial: unknown;
1069
+ }
664
1070
  export type CommandResult = {
665
1071
  type: "done";
666
1072
  message?: string;
@@ -671,11 +1077,23 @@ export type CommandResult = {
671
1077
  requestId: string;
672
1078
  title: string;
673
1079
  options: CommandOption[];
1080
+ } | {
1081
+ type: "tree";
1082
+ tree: SessionTreeSnapshot;
674
1083
  } | {
675
1084
  type: "unsupported";
676
1085
  message: string;
677
1086
  };
678
- export type SessionUiEvent = {
1087
+ /**
1088
+ * Transport-level per-session sequence stamp. `SessionEventHub.publish` assigns a
1089
+ * monotonic `seq` to every per-session event as it is serialized to the socket.
1090
+ * Clients use it as a watermark against the join-time stream snapshot so buffered
1091
+ * live events are applied exactly once. Existing consumers may ignore it.
1092
+ */
1093
+ export type SessionUiEvent = SessionUiEventBody & {
1094
+ seq?: number;
1095
+ };
1096
+ type SessionUiEventBody = {
679
1097
  type: "message.append";
680
1098
  message: unknown;
681
1099
  } | {
@@ -737,9 +1155,17 @@ export type SessionUiEvent = {
737
1155
  type: "command.output";
738
1156
  level: "info" | "success" | "error";
739
1157
  message: string;
740
- } | {
1158
+ notificationId?: string;
1159
+ } | SessionNotificationInboxEvent | {
741
1160
  type: "session.error";
742
1161
  message: string;
1162
+ } | {
1163
+ type: "ask.opened";
1164
+ ask: PendingAskUser;
1165
+ } | {
1166
+ type: "ask.closed";
1167
+ askId: string;
1168
+ reason: AskUserCloseReason;
743
1169
  } | {
744
1170
  type: "session.name";
745
1171
  sessionId: string;
@@ -751,7 +1177,7 @@ export type SessionUiEvent = {
751
1177
  type: "pi.event";
752
1178
  eventType: string;
753
1179
  };
754
- export type GlobalSessionEvent = Extract<SessionUiEvent, {
1180
+ export type GlobalSessionEvent = Extract<SessionUiEventBody, {
755
1181
  type: "status.update" | "activity.update" | "session.name" | "session.created";
756
- }>;
1182
+ }> | SessionNotificationSummaryEvent | SessionUnreadEvent | SessionStartupProgressEvent;
757
1183
  export type RealtimeEvent = GlobalSessionEvent | TerminalUiEvent | WorkspaceActivityUiEvent;
@@ -5,10 +5,36 @@ export const PI_WEB_CAPABILITIES = {
5
5
  sessionsReload: "sessions.reload",
6
6
  sessionsClearQueue: "sessions.clearQueue",
7
7
  sessionsPersistedState: "sessions.persistedState",
8
+ sessionsNotifications: "sessions.notifications",
9
+ sessionsUnread: "sessions.unread",
10
+ sessionsAskUser: "sessions.askUser",
8
11
  promptAttachments: "prompt.attachments",
9
12
  workspaceFileSuggestions: "workspace.fileSuggestions",
10
13
  piPackagesManage: "piPackages.manage",
11
14
  selectedMachineSettings: "settings.selectedMachine",
12
15
  agentProfileConfig: "settings.agentProfile",
13
16
  };
17
+ export const SESSION_UNREAD_LIMIT = 1_000;
18
+ export const SESSION_UNREAD_SESSION_ID_MAX_LENGTH = 512;
19
+ export const SESSION_UNREAD_CWD_MAX_LENGTH = 32 * 1024;
20
+ export const SESSION_UNREAD_CATALOG_ID_MAX_LENGTH = 512;
21
+ export const SESSION_UNREAD_COMPLETED_AT_MAX_LENGTH = 64;
22
+ export const SESSION_NOTIFICATION_LIMIT = 100;
23
+ export const SESSION_NOTIFICATION_MESSAGE_BYTES = 8 * 1024;
24
+ /**
25
+ * `customType` of the follow-up custom message that carries a closed ask back to
26
+ * the model and into the transcript. Its `details` are an {@link AskUserOutcome}.
27
+ */
28
+ export const ASK_USER_ANSWERS_CUSTOM_TYPE = "pi-web.ask.answers";
29
+ /** Largest question set one `ask_user` call may post. */
30
+ export const ASK_USER_QUESTION_LIMIT = 20;
31
+ /** Largest option list one question may offer. */
32
+ export const ASK_USER_OPTION_LIMIT = 12;
33
+ /** Length bound for ids: the ask id, question ids, and option values. */
34
+ export const ASK_USER_ID_MAX_LENGTH = 128;
35
+ /** Length bound for model-authored prose: questions, details, and option labels. */
36
+ export const ASK_USER_TEXT_MAX_LENGTH = 1_000;
37
+ /** Length bound for the free text a user types as a custom answer. */
38
+ export const ASK_USER_OTHER_TEXT_MAX_LENGTH = 4_000;
39
+ export const SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH = 10_000;
14
40
  //# sourceMappingURL=apiTypes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;CACnC,CAAC"}
1
+ {"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,kBAAkB;IACnC,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;CACnC,CAAC;AAkOX,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAqCzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,IAAI,CAAC;AAkP3D;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AAEjE,yDAAyD;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,sEAAsE;AACtE,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAsmBpD,MAAM,CAAC,MAAM,2CAA2C,GAAG,MAAM,CAAC"}
@@ -9,6 +9,9 @@ export const WEB_RUNTIME_CAPABILITIES = [
9
9
  PI_WEB_CAPABILITIES.sessionsReload,
10
10
  PI_WEB_CAPABILITIES.sessionsClearQueue,
11
11
  PI_WEB_CAPABILITIES.sessionsPersistedState,
12
+ PI_WEB_CAPABILITIES.sessionsNotifications,
13
+ PI_WEB_CAPABILITIES.sessionsUnread,
14
+ PI_WEB_CAPABILITIES.sessionsAskUser,
12
15
  PI_WEB_CAPABILITIES.promptAttachments,
13
16
  PI_WEB_CAPABILITIES.workspaceFileSuggestions,
14
17
  PI_WEB_CAPABILITIES.piPackagesManage,
@@ -22,6 +25,9 @@ export const SESSIOND_RUNTIME_CAPABILITIES = [
22
25
  PI_WEB_CAPABILITIES.sessionsReload,
23
26
  PI_WEB_CAPABILITIES.sessionsClearQueue,
24
27
  PI_WEB_CAPABILITIES.sessionsPersistedState,
28
+ PI_WEB_CAPABILITIES.sessionsNotifications,
29
+ PI_WEB_CAPABILITIES.sessionsUnread,
30
+ PI_WEB_CAPABILITIES.sessionsAskUser,
25
31
  PI_WEB_CAPABILITIES.promptAttachments,
26
32
  ];
27
33
  const EFFECTIVE_CAPABILITY_REQUIREMENTS = {
@@ -31,6 +37,9 @@ const EFFECTIVE_CAPABILITY_REQUIREMENTS = {
31
37
  [PI_WEB_CAPABILITIES.sessionsReload]: ["web", "sessiond"],
32
38
  [PI_WEB_CAPABILITIES.sessionsClearQueue]: ["web", "sessiond"],
33
39
  [PI_WEB_CAPABILITIES.sessionsPersistedState]: ["web", "sessiond"],
40
+ [PI_WEB_CAPABILITIES.sessionsNotifications]: ["web", "sessiond"],
41
+ [PI_WEB_CAPABILITIES.sessionsUnread]: ["web", "sessiond"],
42
+ [PI_WEB_CAPABILITIES.sessionsAskUser]: ["web", "sessiond"],
34
43
  [PI_WEB_CAPABILITIES.promptAttachments]: ["web", "sessiond"],
35
44
  [PI_WEB_CAPABILITIES.workspaceFileSuggestions]: ["web"],
36
45
  [PI_WEB_CAPABILITIES.piPackagesManage]: ["web"],
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"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"}