@timurproko/a1 0.1.8-dev.512 → 0.1.8-dev.521

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 (66) hide show
  1. package/README.md +64 -20
  2. package/dist/app/session-shell/index.d.ts +1 -1
  3. package/dist/app/session-shell/prompt-suggestion-controller.d.ts +2 -0
  4. package/dist/app/session-shell/prompt-suggestion-controller.js +12 -0
  5. package/dist/app/session-shell/session-shell-root.d.ts +10 -0
  6. package/dist/app/session-shell/session-shell-root.js +12 -2
  7. package/dist/app/session-shell/session-shell.d.ts +8 -1
  8. package/dist/app/session-shell/session-shell.js +217 -18
  9. package/dist/composition/index.d.ts +1 -1
  10. package/dist/composition/owned-ui.js +21 -3
  11. package/dist/composition/settings-route-host.d.ts +17 -4
  12. package/dist/composition/settings-route-host.js +47 -16
  13. package/dist/contracts/owned-ui/index.d.ts +1 -1
  14. package/dist/contracts/owned-ui/model.d.ts +1 -5
  15. package/dist/features/owned-ui/index.d.ts +3 -0
  16. package/dist/features/owned-ui/index.js +2 -0
  17. package/dist/features/owned-ui/reference-routes.d.ts +6 -0
  18. package/dist/features/owned-ui/reference-routes.js +6 -0
  19. package/dist/features/owned-ui/reference-screen-app.d.ts +37 -0
  20. package/dist/features/owned-ui/reference-screen-app.js +232 -0
  21. package/dist/features/owned-ui/settings-app.js +2 -7
  22. package/dist/integrations/pi/components/index.d.ts +4 -2
  23. package/dist/integrations/pi/components/index.js +2 -1
  24. package/dist/integrations/pi/components/models-dialog.d.ts +55 -0
  25. package/dist/integrations/pi/components/models-dialog.js +310 -0
  26. package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +10 -0
  27. package/dist/integrations/pi/components/shell-editor-autocomplete.js +29 -5
  28. package/dist/integrations/pi/components/shell-footer-status.js +2 -1
  29. package/dist/integrations/pi/components/shell-presenters-info.d.ts +10 -0
  30. package/dist/integrations/pi/components/shell-presenters-info.js +31 -11
  31. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +11 -1
  32. package/dist/integrations/pi/components/shell-selectors-dialogs.js +13 -0
  33. package/dist/integrations/pi/components/shell-shared-facade.d.ts +8 -0
  34. package/dist/integrations/pi/components/skills-command.d.ts +47 -0
  35. package/dist/integrations/pi/components/skills-command.js +118 -0
  36. package/dist/integrations/pi/components/skills-dialog.d.ts +9 -0
  37. package/dist/integrations/pi/components/skills-dialog.js +123 -0
  38. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -2
  39. package/dist/integrations/pi/components/upstream/components/owned-editor.js +42 -7
  40. package/dist/integrations/pi/engine/adapter.d.ts +5 -1
  41. package/dist/integrations/pi/engine/adapter.js +13 -1
  42. package/dist/integrations/pi/engine/index.d.ts +2 -2
  43. package/dist/integrations/pi/engine/index.js +1 -1
  44. package/dist/integrations/pi/engine/resource-catalog.d.ts +2 -1
  45. package/dist/integrations/pi/engine/resource-catalog.js +19 -9
  46. package/dist/integrations/pi/engine/workflow-contexts.d.ts +8 -1
  47. package/dist/integrations/pi/engine/workflow-contexts.js +52 -8
  48. package/dist/integrations/pi/engine/workflow-runner.js +98 -74
  49. package/dist/integrations/pi/engine/workflows.d.ts +26 -2
  50. package/dist/integrations/pi/engine/workflows.js +8 -0
  51. package/dist/native/darwin-arm64/manifest.json +1 -1
  52. package/dist/native/linux-x64/manifest.json +1 -1
  53. package/dist/native/win32-x64/manifest.json +2 -2
  54. package/dist/native/win32-x64/process-guardian.exe +0 -0
  55. package/dist/ui/apps/contracts.d.ts +9 -1
  56. package/dist/ui/apps/index.d.ts +1 -1
  57. package/dist/ui/settings/declarations.d.ts +15 -29
  58. package/dist/ui/settings/declarations.js +14 -25
  59. package/dist/ui/settings/index.d.ts +1 -1
  60. package/dist/ui/settings/index.js +1 -1
  61. package/dist/ui/settings/migrations.js +18 -0
  62. package/docs/architecture/prompt-suggestions.md +1 -1
  63. package/docs/architecture/ui-reference-provenance.md +1 -0
  64. package/docs/ci-release-runbook.md +31 -23
  65. package/docs/features/modal-content-interaction.md +3 -2
  66. package/package.json +1 -1
package/README.md CHANGED
@@ -53,10 +53,40 @@ shown on the level name in the status bar, not on the input bars.
53
53
 
54
54
  In bare A1, **Ctrl+L cycles the thinking level**. **Shift+Tab is unassigned** and
55
55
  performs no agent-input action, including while a suggestion is visible. Model
56
- selection has **no default shortcut**; use `/model`. Explicit keybinding overrides
56
+ selection has **no default shortcut**; use `/models`. Explicit keybinding overrides
57
57
  remain configurable, and `/hotkeys` shows the resolved bindings. The `a1 pi`
58
58
  comparison profile keeps its original presentation and shortcuts.
59
59
 
60
+ ## Models
61
+
62
+ Bare A1 has one model command, `/models`, which replaces the pinned `/model` and
63
+ `/scoped-models` pair (those remain in the `a1 pi` comparison profile). The dialog
64
+ lists every authenticated model with `all` and `scoped` filters (Tab), a search box,
65
+ a scope marker before each model id, and the active checkmark after `[provider]`.
66
+ Enter switches to the highlighted model and persists it as the default; Space adds or
67
+ removes it from the Ctrl+P cycling scope for this session only; Ctrl+S saves that scope
68
+ to settings. While the scope or its order differs from the last save, the title reads
69
+ `Models (unsaved)`; Escape closes without saving and keeps the session-only scope.
70
+ `/models <text>` seeds the search instead of switching. The bulk, provider, and reorder
71
+ scope actions keep their existing bindings and appear under `/hotkeys`.
72
+
73
+ ## Reference screens
74
+
75
+ In bare A1, `/changelog` and `/hotkeys` open a full-screen read-only reference
76
+ screen over the session instead of appending a long document to the
77
+ conversation: `What's New` shows the complete pinned changelog and
78
+ `Keyboard Shortcuts` shows the bare-A1 keybinding tables, including extension
79
+ shortcuts as bound when the screen opens. Scroll with ↑/↓, PageUp/PageDown,
80
+ Home/End, the mouse wheel, or the scrollbar rail, which follows the
81
+ `/settings` → Scroll appearance, style, and speed; press `Esc` to close. The
82
+ screen is framed between two border-coloured rules with the hint below, as the
83
+ v2 extension drew it. After
84
+ an upgrade, the release notes newer than the last acknowledged version open the
85
+ same `What's New` screen once at startup while the feed keeps only the
86
+ `Run /changelog to view the full release notes.` hint. If another dialog is up
87
+ at that moment, the screen is not opened for that launch. The `a1 pi`
88
+ comparison profile keeps Pi's in-feed changelog and hotkeys documents.
89
+
60
90
  ## Prompt suggestions
61
91
 
62
92
  Bare A1's `/settings` → Agent → Prompt suggestions controls faint next-prompt
@@ -71,6 +101,19 @@ preferred when consistent with your intent; genuinely unclear cases can remain
71
101
  empty. [Private diagnostic capture](docs/architecture/prompt-suggestions.md)
72
102
  explains how to distinguish skipped, empty, rejected, and timed-out suggestions.
73
103
 
104
+ ## Skills
105
+
106
+ Bare A1's `/settings` → Agent → Skills chooses how discovered skills appear in the
107
+ slash-command menu. `collapse` (the default) replaces the per-skill `/skill:<name>`
108
+ entries with one `/skills` command: bare `/skills` opens a searchable Skills dialog,
109
+ `/skills <name> [args]` applies a skill directly (an unknown name reports
110
+ `Unknown skill: <name>`), and typing `/skills:` lists every skill inline so
111
+ `/skills:<name> args` runs as `/skill:<name> args`. With the `skills` row selected in
112
+ the menu, typing `:` completes to `/skills:`. `expand` lists every `/skill:<name>`
113
+ command as before. Both take effect immediately; a typed `/skill:<name>` always
114
+ works, and the engine's own Skill commands toggle still governs whether skills are
115
+ offered at all. The `a1 pi` comparison profile is unchanged.
116
+
74
117
  ## Quitting
75
118
 
76
119
  `/quit`, `Ctrl+C` twice, and `Ctrl+D` on an empty prompt end a bare A1 session.
@@ -187,29 +230,30 @@ a1 update --develop 0.1.8-dev.107 # install that exact full preview versio
187
230
  ### Stable
188
231
 
189
232
  ```sh
190
- npm run release -- patch # 0.1.8-dev -> 0.1.8; already-stable 0.1.8 -> 0.1.9
233
+ npm run release -- patch # 0.1.8-dev -> 0.1.8
191
234
  npm run release -- minor # 0.1.8-dev -> 0.2.0
192
235
  npm run release -- major # 0.1.8-dev -> 1.0.0
193
236
  npm run release -- 0.4.0 # an exact stable version
194
237
  ```
195
238
 
196
- Run from the repository root on a clean `develop` matching `origin/develop`.
197
- A target is required; bare `npm run release` displays usage and releases nothing.
198
- `patch` promotes the current prerelease rather than skipping its stable version.
199
-
200
- The command prepares a version-only PR in an isolated detached worktree, prints
201
- its URL, and waits for you to validate and **merge it manually**. Neither this PR
202
- nor the next-development PR is auto-merged, and green CI alone does not advance
203
- the release. After the stable PR merges, the command dispatches publication for
204
- that exact authoritative commit and waits for success. CI validates the packed
205
- release on Windows, Linux, and macOS, publishes to npm `latest` with provenance,
206
- then writes the `v<version>` tag and GitHub Release and fast-forwards `master`.
207
-
208
- Only after confirmed publication of `0.1.8` does the command prepare the separate
209
- `0.1.9-dev` PR. It reports development reopened only after you manually merge that
210
- PR too. Work added to your checkout during either wait is preserved, not reset.
211
- If publication fails or is uncertain, no reopening PR is prepared. If publication
212
- succeeded but reopening failed, inspect the reported phase and PR; do not republish
213
- the immutable stable version.
239
+ Run from the repository root on a clean `develop` matching `origin/develop` that
240
+ declares the open `-dev` version. A target is required; bare `npm run release`
241
+ displays usage and releases nothing. `patch` promotes the current prerelease rather
242
+ than skipping its stable version.
243
+
244
+ The stable version is never committed. The command dispatches publication for the
245
+ exact authoritative `develop` commit with the stable version named in the request,
246
+ and waits for success. CI stamps that version on the checked-out source before
247
+ packing, validates the packed release on Windows, Linux, and macOS, publishes to
248
+ npm `latest` with provenance, then writes the `v<version>` tag on that same
249
+ `develop` commit, records the GitHub Release, and fast-forwards `master`.
250
+
251
+ Only after confirmed publication of `0.1.8` does the command prepare the one
252
+ version-only PR, `0.1.9-dev`, in an isolated detached worktree, print its URL, and
253
+ wait for you to **merge it manually**. It is not auto-merged, and green CI alone does
254
+ not advance the release. Work added to your checkout during the wait is preserved,
255
+ not reset. If publication fails or is uncertain, no reopening PR is prepared. If
256
+ publication succeeded but reopening failed, merge or repair the reported PR by
257
+ hand; do not republish the immutable stable version.
214
258
 
215
259
  `docs/ci-release-runbook.md` has the full picture.
@@ -2,6 +2,6 @@ export { ClipboardDiagnosticCapture } from "./clipboard-diagnostics.js";
2
2
  export { ContextualPromptSuggestionController, samePromptSuggestionIdentity } from "./prompt-suggestion-controller.js";
3
3
  export type { ContextualPromptSuggestionControllerOptions, ContextualPromptSuggestionSurface } from "./prompt-suggestion-controller.js";
4
4
  export { OwnedUiSessionShell, OwnedUiSessionShellRoot, formatSessionResumeCommand, quoteCommandArgument } from "./session-shell.js";
5
- export type { OwnedUiSessionShellOptions, OwnedUiShellDiagnosticOptions, OwnedUiShellEngineOptions, OwnedUiShellHistoryOptions, OwnedUiShellPresentationOptions, OwnedUiShellSuggestionOptions, SessionResumeCommandMetadata, } from "./session-shell.js";
5
+ export type { OwnedUiSessionShellOptions, OwnedUiShellDiagnosticOptions, OwnedUiShellEngineOptions, OwnedUiShellHistoryOptions, OwnedUiShellPresentationOptions, OwnedUiShellSkillsOptions, OwnedUiShellSuggestionOptions, SessionResumeCommandMetadata, } from "./session-shell.js";
6
6
  export { STREAM_PRESENTATION_INTERVAL_MS, StreamPresentationCoalescer } from "./stream-presentation-coalescer.js";
7
7
  export type { StreamPresentationScheduler } from "./stream-presentation-coalescer.js";
@@ -29,6 +29,8 @@ export declare class ContextualPromptSuggestionController {
29
29
  settle(identity: OwnedUiPromptSuggestionIdentity): void;
30
30
  accept(): void;
31
31
  invalidate(): void;
32
+ /** Retires only a generating request; a prepared or available suggestion survives the draft edit. */
33
+ abortPending(): void;
32
34
  dispose(): void;
33
35
  }
34
36
  export declare function samePromptSuggestionIdentity(left: OwnedUiPromptSuggestionIdentity, right: OwnedUiPromptSuggestionIdentity): boolean;
@@ -88,6 +88,18 @@ export class ContextualPromptSuggestionController {
88
88
  }
89
89
  accept() { this.#invalidate(false); }
90
90
  invalidate() { this.#invalidate(true); }
91
+ /** Retires only a generating request; a prepared or available suggestion survives the draft edit. */
92
+ abortPending() {
93
+ if (this.#state.status !== "generating")
94
+ return;
95
+ const request = this.#request;
96
+ this.#request = null;
97
+ this.#state = { status: "idle" };
98
+ if (request === null)
99
+ return;
100
+ this.#finish(request, "cancelled");
101
+ request.abort.abort();
102
+ }
91
103
  dispose() {
92
104
  this.#disposed = true;
93
105
  this.invalidate();
@@ -4,6 +4,7 @@ import type { UiRouteHost } from "../../ui/apps/contracts.js";
4
4
  import type { TranscriptViewportFrame, TranscriptViewportFrameDescriptor } from "../../ui/components/transcript-viewport.js";
5
5
  import type { PiEngineAdapter } from "../../integrations/pi/engine/adapter.js";
6
6
  import type { PiWorkflowMessage, PiWorkflowResult } from "../../integrations/pi/engine/workflows.js";
7
+ import { type PiShellHotkeysPresentation } from "../../integrations/pi/components/shell-presenters-info.js";
7
8
  import { type PiShellClipboardContent, type PiShellComponentPort, type PiShellEditorPort, type PiShellExtensionRendererResolver, type PiShellHeaderOptions, type PiShellHeaderPort, type PiShellImageAssetResolver, type PiShellLoadedResourcesPort, type PiShellResourceEntry, type PiShellTranscriptComponentPort } from "../../integrations/pi/components/shell-shared-facade.js";
8
9
  import { type PiTuiInputCoordinationScheduler, type PiTuiInputSurfaceKind } from "../../integrations/pi/tui-runtime/input-presentation-coordinator.js";
9
10
  import type { PiTuiComponentPort, PiTuiInputDiagnosticsEvent, PiTuiLayoutNode, PiTuiTerminalPort } from "../../integrations/pi/tui-runtime/contracts.js";
@@ -109,12 +110,19 @@ export interface OwnedUiShellDiagnosticOptions {
109
110
  /** Test seams for isolated paste preparation: an in-process starter, or the forked helper's entry. */
110
111
  readonly pastePreparation?: Omit<PastePreparationClientOptions, "onEvent" | "spareIdleMs">;
111
112
  }
113
+ /** The skills presentation choice: collapse the per-skill commands into one skills command or expand them. */
114
+ export interface OwnedUiShellSkillsOptions {
115
+ readonly presentation: () => "collapse" | "expand";
116
+ readonly onChange: (listener: () => void) => () => void;
117
+ }
112
118
  /** What composes an owned session shell, grouped by the collaborator that provides each part. */
113
119
  export interface OwnedUiSessionShellOptions {
114
120
  readonly engine: OwnedUiShellEngineOptions;
115
121
  readonly presentation?: OwnedUiShellPresentationOptions;
116
122
  readonly history?: OwnedUiShellHistoryOptions;
117
123
  readonly suggestions?: OwnedUiShellSuggestionOptions;
124
+ /** Supplied only to the bare-A1 composition; absent keeps the pinned per-skill command list. */
125
+ readonly skills?: OwnedUiShellSkillsOptions;
118
126
  readonly diagnostics?: OwnedUiShellDiagnosticOptions;
119
127
  }
120
128
  /** Composes backend session state into the owned transcript, viewport, editor, and dock presentation. */
@@ -152,6 +160,7 @@ export declare class OwnedUiSessionShellRoot implements PiTuiComponentPort {
152
160
  readonly captureClipboardPaste?: () => PasteSource;
153
161
  readonly pasteDiagnostics?: (event: PasteEvent) => void;
154
162
  readonly pastePreparation?: Omit<PastePreparationClientOptions, "onEvent">;
163
+ readonly skillsPresentation?: () => "collapse" | "expand";
155
164
  }, startup?: PiShellHeaderOptions, agentDir?: string, extensionRenderers?: PiShellExtensionRendererResolver, sessionLayout?: "pinned" | "custom-viewport", imageAssets?: PiShellImageAssetResolver);
156
165
  setEditorPaddingX(padding: number): void;
157
166
  setAutocompleteMaxVisible(maxVisible: number): void;
@@ -244,6 +253,7 @@ export declare class OwnedUiSessionShellRoot implements PiTuiComponentPort {
244
253
  setExtensionFooter(component: PiShellComponentPort | null): void;
245
254
  setExtensionStatus(key: string, text: string | undefined): void;
246
255
  setExtensionWorking(message: string | undefined, visible?: boolean): void;
256
+ hotkeysPresentation(): PiShellHotkeysPresentation;
247
257
  resetWorkflowPresentation(): void;
248
258
  resetExtensionUi(): void;
249
259
  addExtensionNotification(message: string, type: "info" | "warning" | "error"): void;
@@ -682,7 +682,9 @@ export class OwnedUiSessionShellRoot {
682
682
  .flatMap(diagnostic => renderPiShellPackageUpdateNotice(diagnostic.message.split("\n").filter(line => line.startsWith("- ")).map(line => line.slice(2)), width)));
683
683
  rows.push(...diagnostics
684
684
  .filter(diagnostic => diagnostic.code === "changelog-collapsed" || diagnostic.code === "changelog-expanded")
685
- .flatMap(diagnostic => diagnostic.code === "changelog-collapsed"
685
+ // Rationale: the custom viewport shows the new entries on the What's New screen, so its feed
686
+ // carries only the hint for either diagnostic; the pinned layout keeps the full document.
687
+ .flatMap(diagnostic => diagnostic.code === "changelog-collapsed" || this.#customViewport
686
688
  ? createPiShellCollapsedChangelog().render(width)
687
689
  : createPiShellChangelog(diagnostic.message).render(width)));
688
690
  rows.push(...diagnostics
@@ -809,7 +811,8 @@ export class OwnedUiSessionShellRoot {
809
811
  }
810
812
  if (result.command === "hotkeys" && result.outcome === "completed") {
811
813
  this.#lastWorkflowStatusId = undefined;
812
- const hotkeys = createPiShellHotkeys(this.editor.keybindingConfig(), bindings => this.#extensionRenderers.getShortcuts?.(bindings) ?? [], this.#customViewport ? "a1" : "pi");
814
+ const presentation = this.hotkeysPresentation();
815
+ const hotkeys = createPiShellHotkeys(presentation.bindings, presentation.getShortcuts, presentation.profile);
813
816
  this.#appendAnchoredWorkflowComponent(width => hotkeys.render(width), () => hotkeys.dispose?.());
814
817
  return;
815
818
  }
@@ -903,6 +906,13 @@ export class OwnedUiSessionShellRoot {
903
906
  this.#status.setWorkingOverride(visible ? message : undefined);
904
907
  this.invalidate();
905
908
  }
909
+ hotkeysPresentation() {
910
+ return {
911
+ bindings: this.editor.keybindingConfig(),
912
+ getShortcuts: bindings => this.#extensionRenderers.getShortcuts?.(bindings) ?? [],
913
+ profile: this.#customViewport ? "a1" : "pi",
914
+ };
915
+ }
906
916
  resetWorkflowPresentation() {
907
917
  this.#dockNotice = undefined;
908
918
  for (const id of this.#workflowStatusAnchors.keys()) {
@@ -1,12 +1,14 @@
1
1
  import type { OwnedUiSessionViewModel, OwnedUiThinkingLevel } from "../../contracts/owned-ui/index.js";
2
2
  import type { AdapterCommandResult } from "../../integrations/pi/engine/adapter.js";
3
3
  import type { PiWorkflowRequest } from "../../integrations/pi/engine/workflows.js";
4
+ import { type PiShellSkillSummary } from "../../integrations/pi/components/skills-command.js";
5
+ import { type PiShellHotkeysPresentation } from "../../integrations/pi/components/shell-presenters-info.js";
4
6
  import type { PiShellSelectorOption } from "../../integrations/pi/components/shell-shared-facade.js";
5
7
  import { type PiTuiDamageDecision } from "../../integrations/pi/tui-runtime/damage-aware-terminal.js";
6
8
  import { PiTuiRuntimeAdapter } from "../../integrations/pi/tui-runtime/adapter.js";
7
9
  import type { PiTuiOverlayHandle } from "../../integrations/pi/tui-runtime/contracts.js";
8
10
  import { OwnedUiSessionShellRoot, type OwnedUiBackendPort, type OwnedUiSessionShellOptions } from "./session-shell-root.js";
9
- export { OwnedUiSessionShellRoot, type OwnedUiSessionShellOptions, type OwnedUiShellDiagnosticOptions, type OwnedUiShellEngineOptions, type OwnedUiShellHistoryOptions, type OwnedUiShellPresentationOptions, type OwnedUiShellSuggestionOptions, } from "./session-shell-root.js";
11
+ export { OwnedUiSessionShellRoot, type OwnedUiSessionShellOptions, type OwnedUiShellDiagnosticOptions, type OwnedUiShellEngineOptions, type OwnedUiShellHistoryOptions, type OwnedUiShellPresentationOptions, type OwnedUiShellSkillsOptions, type OwnedUiShellSuggestionOptions, } from "./session-shell-root.js";
10
12
  /** Coordinates backend, owned presentation, and Pi TUI lifecycles for one interactive session. */
11
13
  export declare class OwnedUiSessionShell {
12
14
  #private;
@@ -35,6 +37,8 @@ export declare class OwnedUiSessionShell {
35
37
  restoreQueuedInput(): void;
36
38
  showSelector(title: string, options: readonly PiShellSelectorOption[], onSelect: (id: string) => void, onCancel?: () => void): PiTuiOverlayHandle;
37
39
  showThinkingSelector(): void;
40
+ /** The Skills dialog: a replacement input like the model selector, applying the chosen skill through the prompt path. */
41
+ showSkillsSelector(skills?: readonly PiShellSkillSummary[]): void;
38
42
  showModelSelector(initialSearchInput?: string): void;
39
43
  showForkSelector(): void;
40
44
  showLogoutSelector(): Promise<void>;
@@ -48,7 +52,10 @@ export declare class OwnedUiSessionShell {
48
52
  runWorkflow(request: PiWorkflowRequest): Promise<AdapterCommandResult>;
49
53
  showTrustSelector(): void;
50
54
  showScopedModelsSelector(): void;
55
+ /** The bare-A1 unified Models dialog: switch on Enter, scope on Space, persist on Ctrl+S, all through the engine. */
56
+ showModelsDialog(initialQuery?: string): void;
51
57
  dispose(): Promise<void>;
58
+ hotkeysPresentation(): PiShellHotkeysPresentation;
52
59
  }
53
60
  export interface SessionResumeCommandMetadata {
54
61
  readonly sessionId: string;