@walkeros/cli 4.5.0 → 4.6.0-next-1788817472881

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.
package/dist/index.d.ts CHANGED
@@ -331,8 +331,31 @@ declare function bundle(configOrPath: unknown, options?: {
331
331
  */
332
332
  type Platform = 'web' | 'server';
333
333
 
334
- declare function getToken(): string | undefined;
335
- declare function getAuthHeaders(): Record<string, string>;
334
+ /**
335
+ * Resolve a bearer for an API call, refreshing the stored session when needed.
336
+ *
337
+ * Priority: `WALKEROS_TOKEN`, then a legacy static token, then the OAuth
338
+ * session. Returns null when nothing can be resolved, which callers render as
339
+ * "run `walkeros login`".
340
+ *
341
+ * Throws when a refresh was needed but could not be carried out, which is a
342
+ * different problem from having no session and must not be reported as one.
343
+ */
344
+ declare function resolveAccessToken(opts?: {
345
+ fetch?: typeof fetch;
346
+ now?: () => number;
347
+ }): Promise<string | null>;
348
+ /**
349
+ * Authorization header for the resolved credential, or an empty object when
350
+ * there is none. Async because resolving may have to refresh the session.
351
+ */
352
+ declare function getAuthHeaders(): Promise<Record<string, string>>;
353
+ /**
354
+ * Where a credential would come from, without resolving or refreshing it.
355
+ * For commands that want to send someone to `walkeros login` before spending
356
+ * a network round trip.
357
+ */
358
+ declare function credentialSource(): 'env' | 'config' | null;
336
359
  declare function requireProjectId(): string;
337
360
 
338
361
  /**
@@ -725,64 +748,87 @@ interface LoginCommandOptions extends GlobalOptions {
725
748
  url?: string;
726
749
  json?: boolean;
727
750
  }
728
- interface DeviceCodeResult {
729
- deviceCode: string;
730
- userCode: string;
731
- verificationUri: string;
732
- verificationUriComplete?: string;
733
- expiresIn: number;
734
- interval: number;
735
- }
736
- interface DeviceCodeOptions {
737
- url?: string;
738
- fetch?: typeof globalThis.fetch;
751
+ interface LoginResult {
752
+ success: boolean;
753
+ email?: string;
754
+ configPath?: string;
755
+ error?: string;
739
756
  }
740
- interface PollOptions {
757
+ interface LoginOptions {
741
758
  url?: string;
759
+ /** Override browser opener for testing */
760
+ openUrl?: (url: string) => Promise<void>;
761
+ /** Override fetch for testing */
742
762
  fetch?: typeof globalThis.fetch;
743
- /** Timeout in milliseconds. Defaults to 60000 (60s). */
744
- timeoutMs?: number;
745
- /** Poll interval in milliseconds. Defaults to 5000. */
746
- intervalMs?: number;
763
+ /** Max poll attempts before giving up (for testing) */
764
+ maxPollAttempts?: number;
765
+ /** Poll interval, replacing the server's stated one (for testing) */
766
+ pollIntervalMs?: number;
747
767
  }
748
- type PollResult = {
749
- success: true;
750
- status: 'authenticated';
751
- email: string;
752
- configPath: string;
768
+ /**
769
+ * The outcome of finishing a device authorization.
770
+ *
771
+ * It carries no token material. `completeDeviceLogin` stores the session
772
+ * itself, so the credential file keeps exactly one writer and a caller can
773
+ * neither persist nor leak what came back.
774
+ *
775
+ * `pending` and `slow_down` both mean the window closed with the approval
776
+ * still outstanding: the device code is untouched, so the same code can be
777
+ * handed back in. `slow_down` is that same situation with the server asking
778
+ * for a wider gap before the next attempt.
779
+ */
780
+ type DeviceLoginResult = {
781
+ status: 'ok';
753
782
  } | {
754
- success: false;
755
783
  status: 'pending';
756
784
  } | {
757
- success: false;
785
+ status: 'slow_down';
786
+ } | {
787
+ status: 'denied';
788
+ } | {
789
+ status: 'expired';
790
+ } | {
758
791
  status: 'error';
759
792
  error: string;
760
793
  };
794
+ interface CompleteDeviceLoginOptions {
795
+ /** App to poll. Defaults to the resolved app URL. */
796
+ url?: string;
797
+ /** Stop polling after this long. */
798
+ timeoutMs?: number;
799
+ /** Wait between polls, before any `slow_down` widens it. */
800
+ intervalMs?: number;
801
+ /** Override fetch for testing */
802
+ fetch?: typeof globalThis.fetch;
803
+ /** Max poll attempts before giving up (for testing) */
804
+ maxPollAttempts?: number;
805
+ }
761
806
  declare function loginCommand(options: LoginCommandOptions): Promise<void>;
762
807
  /**
763
- * Request a device code from the auth server.
764
- * First step of the device code flow — returns data needed to show
765
- * the user a code and URL, then poll for the token.
766
- */
767
- declare function requestDeviceCode(options?: DeviceCodeOptions): Promise<DeviceCodeResult>;
768
- /**
769
- * Poll the auth server until the device code is authorized, times out, or fails.
770
- * Second step of the device code flow.
771
- *
772
- * On success: writes config and returns authenticated result.
773
- * On timeout: returns pending (NOT an error — caller can retry).
774
- * On real error (denied, expired): returns error result.
808
+ * Poll a device authorization to its end and store the session it yields.
775
809
  *
776
- * In-flight fetch requests are bounded by the remaining time to the deadline
777
- * via AbortController, so a hanging fetch cannot exceed the configured timeout.
778
- * Malformed JSON responses return an error result instead of throwing.
810
+ * Split out from `login` so a caller holding only a device code can finish an
811
+ * authorization that is already under way. `login` cannot serve that: it
812
+ * starts a fresh authorization on every call, which would strand the code the
813
+ * person is looking at.
779
814
  */
780
- declare function pollForToken(deviceCode: string, options?: PollOptions): Promise<PollResult>;
815
+ declare function completeDeviceLogin(deviceCode: string, options?: CompleteDeviceLoginOptions): Promise<DeviceLoginResult>;
816
+ declare function login(options?: LoginOptions): Promise<LoginResult>;
781
817
 
782
818
  interface LogoutCommandOptions extends GlobalOptions {
783
819
  json?: boolean;
784
820
  }
785
821
  declare function logoutCommand(options: LogoutCommandOptions): Promise<void>;
822
+ /**
823
+ * Revoke the stored refresh token, then drop the local config.
824
+ *
825
+ * Revocation first, because deleting the file alone would leave a credential
826
+ * alive on the server that nothing can ever reach to retire. It is best
827
+ * effort: a logout on a plane still has to clear the machine.
828
+ */
829
+ declare function logout(): Promise<{
830
+ deleted: boolean;
831
+ }>;
786
832
 
787
833
  declare function whoami(): Promise<{
788
834
  userId: string;
@@ -3693,7 +3739,7 @@ interface paths {
3693
3739
  put?: never;
3694
3740
  /**
3695
3741
  * Deploy settings
3696
- * @description Start a deployment for a specific settings entry. Detects platform from the settings.
3742
+ * @description Start a deployment for a specific settings entry. Detects platform from the settings. The body is optional and carries only `humanText`, the reason for the change, which becomes the description of the release this deploy produces; it is ignored when the release already has one.
3697
3743
  */
3698
3744
  post: {
3699
3745
  parameters: {
@@ -3706,7 +3752,11 @@ interface paths {
3706
3752
  };
3707
3753
  cookie?: never;
3708
3754
  };
3709
- requestBody?: never;
3755
+ requestBody?: {
3756
+ content: {
3757
+ 'application/json': components['schemas']['DeploySettingsRequest'];
3758
+ };
3759
+ };
3710
3760
  responses: {
3711
3761
  /** @description Deployment started */
3712
3762
  201: {
@@ -6845,8 +6895,9 @@ interface paths {
6845
6895
  [name: string]: unknown;
6846
6896
  };
6847
6897
  content: {
6848
- 'application/json': components['schemas']['BillingDetailsResponse'] &
6849
- (Record<string, never> | null);
6898
+ 'application/json':
6899
+ | components['schemas']['BillingDetailsResponse']
6900
+ | null;
6850
6901
  };
6851
6902
  };
6852
6903
  /** @description Unauthorized */
@@ -7434,13 +7485,14 @@ interface paths {
7434
7485
  };
7435
7486
  /**
7436
7487
  * List flow releases
7437
- * @description List the release history for a flow across all of its deployment lineages, newest first, paginated. Each entry is a deployed version joined to its parent deployment (slug and type). Requires member role.
7488
+ * @description List the release history for a flow across all of its deployment lineages, newest first, paginated. Each entry is a deployed version joined to its parent deployment (slug and type). `rationale=true` joins each row's stored rationale summary on, which requires the `hub` feature; without it the `rationale` key is absent from every row rather than null, and no feature beyond member role is needed. Requires member role.
7438
7489
  */
7439
7490
  get: {
7440
7491
  parameters: {
7441
7492
  query?: {
7442
7493
  limit?: number;
7443
7494
  offset?: number | null;
7495
+ rationale?: 'true' | 'false';
7444
7496
  };
7445
7497
  header?: never;
7446
7498
  path: {
@@ -7506,6 +7558,184 @@ interface paths {
7506
7558
  patch?: never;
7507
7559
  trace?: never;
7508
7560
  };
7561
+ '/api/projects/{projectId}/flows/{flowId}/releases/{versionId}': {
7562
+ parameters: {
7563
+ query?: never;
7564
+ header?: never;
7565
+ path?: never;
7566
+ cookie?: never;
7567
+ };
7568
+ /**
7569
+ * Read one release in full
7570
+ * @description One release of this flow with its rationale and its diff. The path segment is either the spine version id (`ver_...`) or the flow-unique spine number, and the route decides which it was, so a caller holding only the number needs no lookup first. The diff is computed server-side from the two stored snapshots and is never accepted from a caller; its predecessor is the next LOWER spine number, not the previous row by time, because spine rows are reused across redeploys of identical content. `diff.text` is rendered from masked content, so an empty string can still mean the releases differ inside an inline secret: `diff.contentIdentical`, compared over the unmasked hashes, is the trustworthy answer. `diff` is null for the flow's oldest release. An unknown address, a sibling flow's version, and an autosave revision all answer 404 alike. Requires member role and the `hub` feature.
7571
+ */
7572
+ get: {
7573
+ parameters: {
7574
+ query?: never;
7575
+ header?: never;
7576
+ path: {
7577
+ projectId: string;
7578
+ flowId: string;
7579
+ /** @description Spine version id of the release (ver_...) or its spine number */
7580
+ versionId: string;
7581
+ };
7582
+ cookie?: never;
7583
+ };
7584
+ requestBody?: never;
7585
+ responses: {
7586
+ /** @description The release, its rationale, and its diff */
7587
+ 200: {
7588
+ headers: {
7589
+ [name: string]: unknown;
7590
+ };
7591
+ content: {
7592
+ 'application/json': components['schemas']['ReleaseDetailResponse'];
7593
+ };
7594
+ };
7595
+ /** @description Invalid release reference */
7596
+ 400: {
7597
+ headers: {
7598
+ [name: string]: unknown;
7599
+ };
7600
+ content: {
7601
+ 'application/json': components['schemas']['ErrorResponse'];
7602
+ };
7603
+ };
7604
+ /** @description Unauthorized */
7605
+ 401: {
7606
+ headers: {
7607
+ [name: string]: unknown;
7608
+ };
7609
+ content: {
7610
+ 'application/json': components['schemas']['ErrorResponse'];
7611
+ };
7612
+ };
7613
+ /** @description Forbidden */
7614
+ 403: {
7615
+ headers: {
7616
+ [name: string]: unknown;
7617
+ };
7618
+ content: {
7619
+ 'application/json': components['schemas']['ErrorResponse'];
7620
+ };
7621
+ };
7622
+ /** @description Not found */
7623
+ 404: {
7624
+ headers: {
7625
+ [name: string]: unknown;
7626
+ };
7627
+ content: {
7628
+ 'application/json': components['schemas']['ErrorResponse'];
7629
+ };
7630
+ };
7631
+ /** @description Rate limited */
7632
+ 429: {
7633
+ headers: {
7634
+ [name: string]: unknown;
7635
+ };
7636
+ content: {
7637
+ 'application/json': components['schemas']['ErrorResponse'];
7638
+ };
7639
+ };
7640
+ };
7641
+ };
7642
+ put?: never;
7643
+ post?: never;
7644
+ delete?: never;
7645
+ options?: never;
7646
+ head?: never;
7647
+ patch?: never;
7648
+ trace?: never;
7649
+ };
7650
+ '/api/projects/{projectId}/flows/{flowId}/releases/{versionId}/content': {
7651
+ parameters: {
7652
+ query?: never;
7653
+ header?: never;
7654
+ path?: never;
7655
+ cookie?: never;
7656
+ };
7657
+ /**
7658
+ * Read a release snapshot
7659
+ * @description The flow config one release of this flow froze, addressed by its spine version id. This is the only route that serves a release snapshot: the positional `/versions/{versionNumber}` route numbers the autosave revisions, a disjoint set of rows, so a release number handed to it addresses an unrelated revision or nothing. Inline secret literals are masked. An unknown id, a sibling flow's version, and an autosave revision all answer 404 alike. Requires member role and the `hub` feature.
7660
+ */
7661
+ get: {
7662
+ parameters: {
7663
+ query?: never;
7664
+ header?: never;
7665
+ path: {
7666
+ projectId: string;
7667
+ flowId: string;
7668
+ /** @description Spine version ID of the release (ver_...) */
7669
+ versionId: string;
7670
+ };
7671
+ cookie?: never;
7672
+ };
7673
+ requestBody?: never;
7674
+ responses: {
7675
+ /** @description The release snapshot */
7676
+ 200: {
7677
+ headers: {
7678
+ [name: string]: unknown;
7679
+ };
7680
+ content: {
7681
+ 'application/json': components['schemas']['ReleaseContentResponse'];
7682
+ };
7683
+ };
7684
+ /** @description Invalid version id */
7685
+ 400: {
7686
+ headers: {
7687
+ [name: string]: unknown;
7688
+ };
7689
+ content: {
7690
+ 'application/json': components['schemas']['ErrorResponse'];
7691
+ };
7692
+ };
7693
+ /** @description Unauthorized */
7694
+ 401: {
7695
+ headers: {
7696
+ [name: string]: unknown;
7697
+ };
7698
+ content: {
7699
+ 'application/json': components['schemas']['ErrorResponse'];
7700
+ };
7701
+ };
7702
+ /** @description Forbidden */
7703
+ 403: {
7704
+ headers: {
7705
+ [name: string]: unknown;
7706
+ };
7707
+ content: {
7708
+ 'application/json': components['schemas']['ErrorResponse'];
7709
+ };
7710
+ };
7711
+ /** @description Not found */
7712
+ 404: {
7713
+ headers: {
7714
+ [name: string]: unknown;
7715
+ };
7716
+ content: {
7717
+ 'application/json': components['schemas']['ErrorResponse'];
7718
+ };
7719
+ };
7720
+ /** @description Rate limited */
7721
+ 429: {
7722
+ headers: {
7723
+ [name: string]: unknown;
7724
+ };
7725
+ content: {
7726
+ 'application/json': components['schemas']['ErrorResponse'];
7727
+ };
7728
+ };
7729
+ };
7730
+ };
7731
+ put?: never;
7732
+ post?: never;
7733
+ delete?: never;
7734
+ options?: never;
7735
+ head?: never;
7736
+ patch?: never;
7737
+ trace?: never;
7738
+ };
7509
7739
  '/api/projects/{projectId}/flows/{flowId}/releases/annotations': {
7510
7740
  parameters: {
7511
7741
  query?: never;
@@ -8057,7 +8287,7 @@ interface paths {
8057
8287
  };
8058
8288
  trace?: never;
8059
8289
  };
8060
- '/api/projects/{projectId}/flows/{flowId}/releases/step-history': {
8290
+ '/api/projects/{projectId}/knowledge': {
8061
8291
  parameters: {
8062
8292
  query?: never;
8063
8293
  header?: never;
@@ -8065,35 +8295,36 @@ interface paths {
8065
8295
  cookie?: never;
8066
8296
  };
8067
8297
  /**
8068
- * List the releases that touched one step
8069
- * @description The releases of this flow that added, changed, or removed one step, newest first, each carrying the rationale stored for it. `step` is a `type.name` key over source, transformer, destination, store, and contract. `flow` narrows the scan to one named flow inside the config and is ignored for a contract key. `limit` bounds the releases scanned, not the entries returned. When nothing matched, `knownSteps` lists the addressable keys of the newest scanned release. Requires member role.
8298
+ * List knowledge captured in this project
8299
+ * @description What people wrote on the frames of a page, most recently active first. Two kinds come back together and `kind` separates them: a `thread` carries its text in messages, a `description` carries one body and cannot be replied to. `pageKey` narrows to a whole page, resolved server-side to every frame that page holds at any depth; `frameId` narrows to one frame; `markId` narrows to one mark within it and is refused without `frameId`, since a mark id alone addresses nothing. `includeMessages=true` attaches message bodies and holds the page to a much smaller ceiling, so `hasMoreEntries` is what separates a complete answer from a truncated one. `validity` says when an entry was true and `freshness` compares that against the flow’s newest release; neither is a verdict. Requires member role.
8070
8300
  */
8071
8301
  get: {
8072
8302
  parameters: {
8073
- query: {
8074
- step: string;
8075
- flow?: string;
8076
- limit?: number | null;
8303
+ query?: {
8304
+ pageKey?: string;
8305
+ frameId?: string;
8306
+ markId?: string;
8307
+ includeMessages?: 'true' | 'false';
8308
+ limit?: number;
8077
8309
  };
8078
8310
  header?: never;
8079
8311
  path: {
8080
8312
  projectId: string;
8081
- flowId: string;
8082
8313
  };
8083
8314
  cookie?: never;
8084
8315
  };
8085
8316
  requestBody?: never;
8086
8317
  responses: {
8087
- /** @description The releases that touched the step */
8318
+ /** @description Knowledge in this project */
8088
8319
  200: {
8089
8320
  headers: {
8090
8321
  [name: string]: unknown;
8091
8322
  };
8092
8323
  content: {
8093
- 'application/json': components['schemas']['StepHistoryResponse'];
8324
+ 'application/json': components['schemas']['ListKnowledgeResponse'];
8094
8325
  };
8095
8326
  };
8096
- /** @description Invalid step key or query */
8327
+ /** @description Invalid query, or a mark filter with no frame */
8097
8328
  400: {
8098
8329
  headers: {
8099
8330
  [name: string]: unknown;
@@ -8141,25 +8372,9 @@ interface paths {
8141
8372
  };
8142
8373
  };
8143
8374
  put?: never;
8144
- post?: never;
8145
- delete?: never;
8146
- options?: never;
8147
- head?: never;
8148
- patch?: never;
8149
- trace?: never;
8150
- };
8151
- '/api/projects/{projectId}/flows/{flowId}/releases/summarize': {
8152
- parameters: {
8153
- query?: never;
8154
- header?: never;
8155
- path?: never;
8156
- cookie?: never;
8157
- };
8158
- get?: never;
8159
- put?: never;
8160
8375
  /**
8161
- * Summarize or check a release
8162
- * @description Describe what one release of this flow changed against an earlier release, or check a written note against that same change. In `draft` mode the generated text is stored as the release's generated summary; in `check` mode nothing is stored and the response says whether the note matches. The diff is always recomputed from the two stored snapshots, with secret literals masked, and is never taken from the request. Both versions must be numbered releases of this flow, and `prevVersionId` must be the earlier of the two. Requires member role and the `hub` feature.
8376
+ * Open a thread on a mark or a frame
8377
+ * @description Open a thread on one mark of one frame, or on the frame itself with `anchorType` `page` and no `markId`, with its first message. A thread never exists empty, so `text` is required and may not be blank. `clientThreadId` and `clientMessageId` are minted by the client at compose time and are what make a replay idempotent: repeating a known `clientThreadId` hands back the existing thread and writes nothing, so an offline queue can drain repeatedly without duplicating what a person wrote once. `flowId` binds the capture to a flow or is explicitly null; a flow this project cannot see answers 404, never 403. A frame this project does not hold answers 404 with `FRAME_NOT_FOUND`, which a draining client waits on and retries, because the frame’s own write may not have landed yet. The server decides the composed anchor key, the born release, the author and the source: a client cannot assert any of them. Requires member role.
8163
8378
  */
8164
8379
  post: {
8165
8380
  parameters: {
@@ -8167,34 +8382,43 @@ interface paths {
8167
8382
  header?: never;
8168
8383
  path: {
8169
8384
  projectId: string;
8170
- flowId: string;
8171
8385
  };
8172
8386
  cookie?: never;
8173
8387
  };
8174
8388
  requestBody?: {
8175
8389
  content: {
8176
8390
  'application/json': {
8177
- /** @example ver_a1b2c3d4 */
8178
- versionId: string;
8179
- /** @example ver_a1b2c3d4 */
8180
- prevVersionId: string;
8181
- /** @enum {string} */
8182
- mode: 'draft' | 'check';
8183
- currentText?: string;
8391
+ /**
8392
+ * @example tag
8393
+ * @enum {string}
8394
+ */
8395
+ anchorType: 'tag' | 'page';
8396
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
8397
+ frameId: string;
8398
+ markId?: string;
8399
+ anchorLabel?: string;
8400
+ flowId: string | null;
8401
+ subjectKey?: string;
8402
+ spatial?: components['schemas']['KnowledgeSpatial'];
8403
+ /** @example ct_7f3a91 */
8404
+ clientThreadId: string;
8405
+ text: string;
8406
+ /** @example ct_7f3a91 */
8407
+ clientMessageId: string;
8184
8408
  };
8185
8409
  };
8186
8410
  };
8187
8411
  responses: {
8188
- /** @description The generated summary or the check verdict */
8189
- 200: {
8412
+ /** @description The thread, with its first message */
8413
+ 201: {
8190
8414
  headers: {
8191
8415
  [name: string]: unknown;
8192
8416
  };
8193
8417
  content: {
8194
- 'application/json': components['schemas']['SummarizeReleaseResponse'];
8418
+ 'application/json': components['schemas']['KnowledgeThreadResponse'];
8195
8419
  };
8196
8420
  };
8197
- /** @description Invalid body, a target is not a release, the pair is out of order, or no LLM provider is configured */
8421
+ /** @description Invalid body */
8198
8422
  400: {
8199
8423
  headers: {
8200
8424
  [name: string]: unknown;
@@ -8221,7 +8445,7 @@ interface paths {
8221
8445
  'application/json': components['schemas']['ErrorResponse'];
8222
8446
  };
8223
8447
  };
8224
- /** @description Not found */
8448
+ /** @description The named flow or frame is not in this project */
8225
8449
  404: {
8226
8450
  headers: {
8227
8451
  [name: string]: unknown;
@@ -8239,15 +8463,6 @@ interface paths {
8239
8463
  'application/json': components['schemas']['ErrorResponse'];
8240
8464
  };
8241
8465
  };
8242
- /** @description The model call failed or returned no usable text */
8243
- 502: {
8244
- headers: {
8245
- [name: string]: unknown;
8246
- };
8247
- content: {
8248
- 'application/json': components['schemas']['ErrorResponse'];
8249
- };
8250
- };
8251
8466
  };
8252
8467
  };
8253
8468
  delete?: never;
@@ -8256,36 +8471,56 @@ interface paths {
8256
8471
  patch?: never;
8257
8472
  trace?: never;
8258
8473
  };
8259
- '/api/projects/{projectId}/deployments/{deploymentId}/versions/current/content': {
8474
+ '/api/projects/{projectId}/knowledge/{threadId}/messages': {
8260
8475
  parameters: {
8261
8476
  query?: never;
8262
8477
  header?: never;
8263
8478
  path?: never;
8264
8479
  cookie?: never;
8265
8480
  };
8481
+ get?: never;
8482
+ put?: never;
8266
8483
  /**
8267
- * Get current deployed content
8268
- * @description Get the active deployed per-setting content for a deployment, used to diff changes since deploy. Content is masked and display-only; every field is null when there is no deployed baseline. Requires member role.
8484
+ * Reply to a knowledge thread
8485
+ * @description Append a message to a thread and get the whole thread back, so a surface renders the new exchange without a second read. `text` may not be blank: a message cannot be cleared, so empty is invalid rather than a way to erase one. Repeating a `clientMessageId` already on the thread appends nothing and leaves `updatedAt` alone, so a retrying drain never keeps bumping a thread to the top of every list. A description has no conversation and cannot be replied to; addressing one answers 404. Requires member role.
8269
8486
  */
8270
- get: {
8487
+ post: {
8271
8488
  parameters: {
8272
8489
  query?: never;
8273
8490
  header?: never;
8274
8491
  path: {
8275
8492
  projectId: string;
8276
- deploymentId: string;
8493
+ /** @description Thread ID (thr_...) */
8494
+ threadId: string;
8277
8495
  };
8278
8496
  cookie?: never;
8279
8497
  };
8280
- requestBody?: never;
8498
+ requestBody?: {
8499
+ content: {
8500
+ 'application/json': {
8501
+ text: string;
8502
+ /** @example ct_7f3a91 */
8503
+ clientMessageId: string;
8504
+ };
8505
+ };
8506
+ };
8281
8507
  responses: {
8282
- /** @description Deployed content (or a null baseline) */
8283
- 200: {
8508
+ /** @description The thread, with the new message */
8509
+ 201: {
8284
8510
  headers: {
8285
8511
  [name: string]: unknown;
8286
8512
  };
8287
8513
  content: {
8288
- 'application/json': components['schemas']['DeployedContentResponse'];
8514
+ 'application/json': components['schemas']['KnowledgeThreadResponse'];
8515
+ };
8516
+ };
8517
+ /** @description Invalid body */
8518
+ 400: {
8519
+ headers: {
8520
+ [name: string]: unknown;
8521
+ };
8522
+ content: {
8523
+ 'application/json': components['schemas']['ErrorResponse'];
8289
8524
  };
8290
8525
  };
8291
8526
  /** @description Unauthorized */
@@ -8326,51 +8561,69 @@ interface paths {
8326
8561
  };
8327
8562
  };
8328
8563
  };
8329
- put?: never;
8330
- post?: never;
8331
8564
  delete?: never;
8332
8565
  options?: never;
8333
8566
  head?: never;
8334
8567
  patch?: never;
8335
8568
  trace?: never;
8336
8569
  };
8337
- '/api/projects/{projectId}/deployments/{deploymentId}/heartbeats': {
8570
+ '/api/projects/{projectId}/knowledge/description': {
8338
8571
  parameters: {
8339
8572
  query?: never;
8340
8573
  header?: never;
8341
8574
  path?: never;
8342
8575
  cookie?: never;
8343
8576
  };
8577
+ get?: never;
8344
8578
  /**
8345
- * List deployment heartbeats
8346
- * @description List heartbeat records for a deployment with optional from/to time-range filtering and pagination. Requires member role.
8579
+ * Write the description of a mark or a frame
8580
+ * @description Write the one description of one anchor, a mark or the frame itself, replacing whatever it said before. There is no id to mint: the anchor is the key, so a replayed write lands on the same row by construction, which is why this is a PUT. An empty `body` is refused rather than stored, so a drain that arrives with nothing to say can never erase what a person wrote. The response is 200 whether the description was opened or replaced. Requires member role.
8347
8581
  */
8348
- get: {
8582
+ put: {
8349
8583
  parameters: {
8350
- query?: {
8351
- /** @description ISO start of the time range. */
8352
- from?: string;
8353
- /** @description ISO end of the time range. */
8354
- to?: string;
8355
- limit?: number;
8356
- offset?: number | null;
8357
- };
8584
+ query?: never;
8358
8585
  header?: never;
8359
8586
  path: {
8360
8587
  projectId: string;
8361
- deploymentId: string;
8362
8588
  };
8363
8589
  cookie?: never;
8364
8590
  };
8365
- requestBody?: never;
8591
+ requestBody?: {
8592
+ content: {
8593
+ 'application/json': {
8594
+ /**
8595
+ * @example tag
8596
+ * @enum {string}
8597
+ */
8598
+ anchorType: 'tag' | 'page';
8599
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
8600
+ frameId: string;
8601
+ markId?: string;
8602
+ anchorLabel?: string;
8603
+ flowId: string | null;
8604
+ subjectKey?: string;
8605
+ spatial?: components['schemas']['KnowledgeSpatial'];
8606
+ body: string;
8607
+ };
8608
+ };
8609
+ };
8366
8610
  responses: {
8367
- /** @description Heartbeat history */
8611
+ /** @description The stored description */
8368
8612
  200: {
8369
8613
  headers: {
8370
8614
  [name: string]: unknown;
8371
8615
  };
8372
8616
  content: {
8373
- 'application/json': components['schemas']['ListHeartbeatsResponse'];
8617
+ 'application/json': components['schemas']['KnowledgeDescriptionResponse'];
8618
+ };
8619
+ };
8620
+ /** @description Invalid body */
8621
+ 400: {
8622
+ headers: {
8623
+ [name: string]: unknown;
8624
+ };
8625
+ content: {
8626
+ 'application/json': components['schemas']['ErrorResponse'];
8374
8627
  };
8375
8628
  };
8376
8629
  /** @description Unauthorized */
@@ -8391,7 +8644,7 @@ interface paths {
8391
8644
  'application/json': components['schemas']['ErrorResponse'];
8392
8645
  };
8393
8646
  };
8394
- /** @description Not found */
8647
+ /** @description The named flow or frame is not in this project */
8395
8648
  404: {
8396
8649
  headers: {
8397
8650
  [name: string]: unknown;
@@ -8400,9 +8653,17 @@ interface paths {
8400
8653
  'application/json': components['schemas']['ErrorResponse'];
8401
8654
  };
8402
8655
  };
8656
+ /** @description Rate limited */
8657
+ 429: {
8658
+ headers: {
8659
+ [name: string]: unknown;
8660
+ };
8661
+ content: {
8662
+ 'application/json': components['schemas']['ErrorResponse'];
8663
+ };
8664
+ };
8403
8665
  };
8404
8666
  };
8405
- put?: never;
8406
8667
  post?: never;
8407
8668
  delete?: never;
8408
8669
  options?: never;
@@ -8410,38 +8671,48 @@ interface paths {
8410
8671
  patch?: never;
8411
8672
  trace?: never;
8412
8673
  };
8413
- '/api/projects/{projectId}/deployments/{deploymentId}/rotate-ingest-token': {
8674
+ '/api/projects/{projectId}/frames': {
8414
8675
  parameters: {
8415
8676
  query?: never;
8416
8677
  header?: never;
8417
8678
  path?: never;
8418
8679
  cookie?: never;
8419
8680
  };
8420
- get?: never;
8421
- put?: never;
8422
8681
  /**
8423
- * Rotate ingest token
8424
- * @description Rotate the ingest token for a deployment. Owner-only. No grace window: the previous token is immediately invalidated and the new token is returned once.
8682
+ * List the frames of a page, or of the whole project
8683
+ * @description A frame is a named rectangle with marks inside it, the spatial unit of a measurement plan. Naming a `pageKey` returns that page’s frames at any depth, marks and all, newest updated first: the walk starts at the page’s top-level frames and descends containment, so a child is reachable through its parent rather than by carrying a page of its own. Naming no page returns every live frame of the project WITHOUT its marks, which is what makes that read cheap enough to answer "what does this project have": the marks are the bulk of a frame and a listing never renders them. That lean read asks nothing about containment, so a frame whose parent cannot be resolved still appears. Requires member role.
8425
8684
  */
8426
- post: {
8685
+ get: {
8427
8686
  parameters: {
8428
- query?: never;
8687
+ query?: {
8688
+ pageKey?: string;
8689
+ };
8429
8690
  header?: never;
8430
8691
  path: {
8431
8692
  projectId: string;
8432
- deploymentId: string;
8433
8693
  };
8434
8694
  cookie?: never;
8435
8695
  };
8436
8696
  requestBody?: never;
8437
8697
  responses: {
8438
- /** @description New ingest token */
8698
+ /** @description The page’s frames with their marks, or the project’s frames without them */
8439
8699
  200: {
8440
8700
  headers: {
8441
8701
  [name: string]: unknown;
8442
8702
  };
8443
8703
  content: {
8444
- 'application/json': components['schemas']['RotateIngestTokenResponse'];
8704
+ 'application/json':
8705
+ | components['schemas']['FrameListResponse']
8706
+ | components['schemas']['FrameLeanListResponse'];
8707
+ };
8708
+ };
8709
+ /** @description Validation error */
8710
+ 400: {
8711
+ headers: {
8712
+ [name: string]: unknown;
8713
+ };
8714
+ content: {
8715
+ 'application/json': components['schemas']['ErrorResponse'];
8445
8716
  };
8446
8717
  };
8447
8718
  /** @description Unauthorized */
@@ -8471,15 +8742,26 @@ interface paths {
8471
8742
  'application/json': components['schemas']['ErrorResponse'];
8472
8743
  };
8473
8744
  };
8745
+ /** @description Rate limited */
8746
+ 429: {
8747
+ headers: {
8748
+ [name: string]: unknown;
8749
+ };
8750
+ content: {
8751
+ 'application/json': components['schemas']['ErrorResponse'];
8752
+ };
8753
+ };
8474
8754
  };
8475
8755
  };
8756
+ put?: never;
8757
+ post?: never;
8476
8758
  delete?: never;
8477
8759
  options?: never;
8478
8760
  head?: never;
8479
8761
  patch?: never;
8480
8762
  trace?: never;
8481
8763
  };
8482
- '/api/projects/{projectId}/deployments/{deploymentId}/usage': {
8764
+ '/api/projects/{projectId}/frames/{frameId}': {
8483
8765
  parameters: {
8484
8766
  query?: never;
8485
8767
  header?: never;
@@ -8487,34 +8769,32 @@ interface paths {
8487
8769
  cookie?: never;
8488
8770
  };
8489
8771
  /**
8490
- * Deployment usage
8491
- * @description Aggregate usage summary plus bucketed chart data for a deployment over the requested period. Requires member role.
8772
+ * Read one frame
8773
+ * @description One frame with its marks. A frame of another project reads back as nothing and answers 404, never 403, so this route cannot become an oracle for what exists elsewhere. A deleted frame is gone to every read. Requires member role.
8492
8774
  */
8493
8775
  get: {
8494
8776
  parameters: {
8495
- query?: {
8496
- /** @description Time window for the usage summary. */
8497
- period?: '1h' | '24h' | '7d' | '30d';
8498
- };
8777
+ query?: never;
8499
8778
  header?: never;
8500
8779
  path: {
8501
8780
  projectId: string;
8502
- deploymentId: string;
8781
+ /** @description Frame ID (frm_...) */
8782
+ frameId: string;
8503
8783
  };
8504
8784
  cookie?: never;
8505
8785
  };
8506
8786
  requestBody?: never;
8507
8787
  responses: {
8508
- /** @description Usage summary and chart buckets */
8788
+ /** @description The frame */
8509
8789
  200: {
8510
8790
  headers: {
8511
8791
  [name: string]: unknown;
8512
8792
  };
8513
8793
  content: {
8514
- 'application/json': components['schemas']['DeploymentUsageResponse'];
8794
+ 'application/json': components['schemas']['Frame'];
8515
8795
  };
8516
8796
  };
8517
- /** @description Validation error */
8797
+ /** @description The path segment does not address a frame */
8518
8798
  400: {
8519
8799
  headers: {
8520
8800
  [name: string]: unknown;
@@ -8550,46 +8830,58 @@ interface paths {
8550
8830
  'application/json': components['schemas']['ErrorResponse'];
8551
8831
  };
8552
8832
  };
8833
+ /** @description Rate limited */
8834
+ 429: {
8835
+ headers: {
8836
+ [name: string]: unknown;
8837
+ };
8838
+ content: {
8839
+ 'application/json': components['schemas']['ErrorResponse'];
8840
+ };
8841
+ };
8553
8842
  };
8554
8843
  };
8555
- put?: never;
8556
- post?: never;
8557
- delete?: never;
8558
- options?: never;
8559
- head?: never;
8560
- patch?: never;
8561
- trace?: never;
8562
- };
8563
- '/api/projects/{projectId}/flows/{flowId}/custom-domains': {
8564
- parameters: {
8565
- query?: never;
8566
- header?: never;
8567
- path?: never;
8568
- cookie?: never;
8569
- };
8570
8844
  /**
8571
- * List custom domains
8572
- * @description List custom domains attached to any deployment of this flow. Requires member role and the customDomains feature.
8845
+ * Create or replace one frame
8846
+ * @description The path is the identity, so the body carries no id: a create is a write to an absent row at `baseVersion` 0 and everything else is a replace. `clientWriteId` is minted at compose time and is what makes a replayed drain exact: a write whose id already produced the stored version landed once and is answered with that version, writing nothing, so an offline queue drains repeatedly without turning one edit into two versions. A write against a version someone else has moved past answers 409 `FRAME_VERSION_CONFLICT` carrying the head, which is what lets a client raise keep-mine against load-theirs on the one frame that conflicted instead of dropping what a person drew. A name another live frame already holds is a distinct 409 `FRAME_NAME_EXISTS`. A relation naming a frame this project does not hold, or one that would place a frame inside itself, is 400 `INVALID_FRAME`. The screenshot is never touched here: a frame write carries no capture. Requires member role.
8573
8847
  */
8574
- get: {
8848
+ put: {
8575
8849
  parameters: {
8576
8850
  query?: never;
8577
8851
  header?: never;
8578
8852
  path: {
8579
8853
  projectId: string;
8580
- flowId: string;
8854
+ /** @description Frame ID (frm_...) */
8855
+ frameId: string;
8581
8856
  };
8582
8857
  cookie?: never;
8583
8858
  };
8584
- requestBody?: never;
8859
+ requestBody?: {
8860
+ content: {
8861
+ 'application/json': {
8862
+ frame: components['schemas']['FrameInput'];
8863
+ baseVersion: number;
8864
+ clientWriteId: string;
8865
+ };
8866
+ };
8867
+ };
8585
8868
  responses: {
8586
- /** @description Custom domains for the flow */
8869
+ /** @description The stored version */
8587
8870
  200: {
8588
8871
  headers: {
8589
8872
  [name: string]: unknown;
8590
8873
  };
8591
8874
  content: {
8592
- 'application/json': components['schemas']['ListCustomDomainsResponse'];
8875
+ 'application/json': components['schemas']['PutFrameResponse'];
8876
+ };
8877
+ };
8878
+ /** @description Invalid body, a bad relation, or a path segment that addresses no frame */
8879
+ 400: {
8880
+ headers: {
8881
+ [name: string]: unknown;
8882
+ };
8883
+ content: {
8884
+ 'application/json': components['schemas']['ErrorResponse'];
8593
8885
  };
8594
8886
  };
8595
8887
  /** @description Unauthorized */
@@ -8610,39 +8902,63 @@ interface paths {
8610
8902
  'application/json': components['schemas']['ErrorResponse'];
8611
8903
  };
8612
8904
  };
8905
+ /** @description Not found */
8906
+ 404: {
8907
+ headers: {
8908
+ [name: string]: unknown;
8909
+ };
8910
+ content: {
8911
+ 'application/json': components['schemas']['ErrorResponse'];
8912
+ };
8913
+ };
8914
+ /** @description A stale base version, carrying the head, or a name another live frame already holds. Only the version conflict carries `head`: a name clash needs no frame to resolve, since the client already knows the name it sent. */
8915
+ 409: {
8916
+ headers: {
8917
+ [name: string]: unknown;
8918
+ };
8919
+ content: {
8920
+ 'application/json':
8921
+ | components['schemas']['FrameConflictResponse']
8922
+ | components['schemas']['ErrorResponse'];
8923
+ };
8924
+ };
8925
+ /** @description Rate limited */
8926
+ 429: {
8927
+ headers: {
8928
+ [name: string]: unknown;
8929
+ };
8930
+ content: {
8931
+ 'application/json': components['schemas']['ErrorResponse'];
8932
+ };
8933
+ };
8613
8934
  };
8614
8935
  };
8615
- put?: never;
8936
+ post?: never;
8616
8937
  /**
8617
- * Attach custom domain
8618
- * @description Attach a custom domain to the flow's latest server deployment, or to an explicit deployment supplied in the body. Requires member role and the customDomains feature.
8938
+ * Delete one frame
8939
+ * @description Soft-delete the frame and, transitively, every variation of what this delete removes. Children are not variations and survive: each live frame under a removed one is re-parented to its nearest live ancestor in the same transaction, and one left with no live ancestor becomes top-level and inherits the page it hung under, so nothing is left unreachable. Those re-parents are server writes that bump their own versions, so a client still holding a pre-delete version meets a conflict carrying the new parent. A frame this project does not hold answers 404: a delete that removed nothing is not a delete that succeeded. Requires member role.
8619
8940
  */
8620
- post: {
8941
+ delete: {
8621
8942
  parameters: {
8622
8943
  query?: never;
8623
8944
  header?: never;
8624
8945
  path: {
8625
8946
  projectId: string;
8626
- flowId: string;
8947
+ /** @description Frame ID (frm_...) */
8948
+ frameId: string;
8627
8949
  };
8628
8950
  cookie?: never;
8629
8951
  };
8630
- requestBody?: {
8631
- content: {
8632
- 'application/json': components['schemas']['CreateCustomDomainRequest'];
8633
- };
8634
- };
8952
+ requestBody?: never;
8635
8953
  responses: {
8636
- /** @description Custom domain attached */
8637
- 201: {
8954
+ /** @description The frame is deleted */
8955
+ 204: {
8638
8956
  headers: {
8639
8957
  [name: string]: unknown;
8640
8958
  };
8641
- content: {
8642
- 'application/json': components['schemas']['CustomDomain'];
8643
- };
8959
+ content?: never;
8644
8960
  };
8645
- /** @description Validation error */
8961
+ /** @description The path segment does not address a frame */
8646
8962
  400: {
8647
8963
  headers: {
8648
8964
  [name: string]: unknown;
@@ -8678,8 +8994,8 @@ interface paths {
8678
8994
  'application/json': components['schemas']['ErrorResponse'];
8679
8995
  };
8680
8996
  };
8681
- /** @description Conflict */
8682
- 409: {
8997
+ /** @description Rate limited */
8998
+ 429: {
8683
8999
  headers: {
8684
9000
  [name: string]: unknown;
8685
9001
  };
@@ -8689,13 +9005,12 @@ interface paths {
8689
9005
  };
8690
9006
  };
8691
9007
  };
8692
- delete?: never;
8693
9008
  options?: never;
8694
9009
  head?: never;
8695
9010
  patch?: never;
8696
9011
  trace?: never;
8697
9012
  };
8698
- '/api/projects/{projectId}/flows/{flowId}/custom-domains/{domainId}': {
9013
+ '/api/projects/{projectId}/frames/{frameId}/screenshot': {
8699
9014
  parameters: {
8700
9015
  query?: never;
8701
9016
  header?: never;
@@ -8704,30 +9019,47 @@ interface paths {
8704
9019
  };
8705
9020
  get?: never;
8706
9021
  put?: never;
8707
- post?: never;
8708
9022
  /**
8709
- * Detach custom domain
8710
- * @description Detach a custom domain from its deployment and remove the Scaleway record. Idempotent: a missing domain still returns 204.
9023
+ * Store the capture of one frame
9024
+ * @description Store one screenshot and set it on its frame. The image arrives as base64 rather than multipart, because the extension relay carries string bodies only. The server decides everything about the bytes: it decodes them, counts the DECODED length against a 4 MB cap, reads the type from the file’s own magic bytes, and hashes them, so nothing the client claims about size or type is consulted. Captures are deduplicated by content within a project: identical pixels resolve to one asset and one upload, and `reused` says whether that happened, which is the common answer rather than the rare one because re-capturing an unchanged frame produces identical bytes. A body past the cap is 413 `PAYLOAD_TOO_LARGE` and one that is not a PNG is 415 `UNSUPPORTED_MEDIA_TYPE`. The capture bumps no frame version: it is not an edit, so an upload never conflicts with the frame write the client queued beside it. Requires member role.
8711
9025
  */
8712
- delete: {
9026
+ post: {
8713
9027
  parameters: {
8714
9028
  query?: never;
8715
9029
  header?: never;
8716
9030
  path: {
8717
9031
  projectId: string;
8718
- flowId: string;
8719
- domainId: string;
9032
+ /** @description Frame ID (frm_...) */
9033
+ frameId: string;
8720
9034
  };
8721
9035
  cookie?: never;
8722
9036
  };
8723
- requestBody?: never;
9037
+ requestBody?: {
9038
+ content: {
9039
+ 'application/json': {
9040
+ imageBase64: string;
9041
+ meta: components['schemas']['FrameScreenshotMeta'];
9042
+ };
9043
+ };
9044
+ };
8724
9045
  responses: {
8725
- /** @description Custom domain detached */
8726
- 204: {
9046
+ /** @description The asset the bytes resolved to, and whether it already existed */
9047
+ 200: {
8727
9048
  headers: {
8728
9049
  [name: string]: unknown;
8729
9050
  };
8730
- content?: never;
9051
+ content: {
9052
+ 'application/json': components['schemas']['ScreenshotUploadResponse'];
9053
+ };
9054
+ };
9055
+ /** @description Invalid body, or a path segment that addresses no frame */
9056
+ 400: {
9057
+ headers: {
9058
+ [name: string]: unknown;
9059
+ };
9060
+ content: {
9061
+ 'application/json': components['schemas']['ErrorResponse'];
9062
+ };
8731
9063
  };
8732
9064
  /** @description Unauthorized */
8733
9065
  401: {
@@ -8747,14 +9079,51 @@ interface paths {
8747
9079
  'application/json': components['schemas']['ErrorResponse'];
8748
9080
  };
8749
9081
  };
9082
+ /** @description This project does not hold the named frame */
9083
+ 404: {
9084
+ headers: {
9085
+ [name: string]: unknown;
9086
+ };
9087
+ content: {
9088
+ 'application/json': components['schemas']['ErrorResponse'];
9089
+ };
9090
+ };
9091
+ /** @description The decoded image is past the 4 MB cap */
9092
+ 413: {
9093
+ headers: {
9094
+ [name: string]: unknown;
9095
+ };
9096
+ content: {
9097
+ 'application/json': components['schemas']['ErrorResponse'];
9098
+ };
9099
+ };
9100
+ /** @description The bytes are not a PNG */
9101
+ 415: {
9102
+ headers: {
9103
+ [name: string]: unknown;
9104
+ };
9105
+ content: {
9106
+ 'application/json': components['schemas']['ErrorResponse'];
9107
+ };
9108
+ };
9109
+ /** @description Rate limited */
9110
+ 429: {
9111
+ headers: {
9112
+ [name: string]: unknown;
9113
+ };
9114
+ content: {
9115
+ 'application/json': components['schemas']['ErrorResponse'];
9116
+ };
9117
+ };
8750
9118
  };
8751
9119
  };
9120
+ delete?: never;
8752
9121
  options?: never;
8753
9122
  head?: never;
8754
9123
  patch?: never;
8755
9124
  trace?: never;
8756
9125
  };
8757
- '/api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy-token': {
9126
+ '/api/projects/{projectId}/assets/{assetId}': {
8758
9127
  parameters: {
8759
9128
  query?: never;
8760
9129
  header?: never;
@@ -8762,29 +9131,230 @@ interface paths {
8762
9131
  cookie?: never;
8763
9132
  };
8764
9133
  /**
8765
- * Self-hosted deploy-token status
8766
- * @description Report whether a self-hosted deploy token exists for this config, plus the deployment health summary when present. Requires member role.
9134
+ * Read one stored capture
9135
+ * @description The bytes of one frame screenshot, for the app canvas. The extension keeps its own capture locally and never reads assets back. Same-origin and session-authenticated: the response carries `Cross-Origin-Resource-Policy: same-origin`, so no other site can embed a tenant capture off the reader’s session. The bytes are immutable by construction, since the object key is their own content hash, which is why they are cacheable for a year, and `private` keeps a shared cache from serving one tenant’s capture to the next request for the same URL. An asset another project holds answers 404, never 403. Requires member role.
8767
9136
  */
8768
9137
  get: {
8769
9138
  parameters: {
8770
9139
  query?: never;
8771
9140
  header?: never;
9141
+ path: {
9142
+ projectId: string;
9143
+ /** @description Asset ID (fas_...) */
9144
+ assetId: string;
9145
+ };
9146
+ cookie?: never;
9147
+ };
9148
+ requestBody?: never;
9149
+ responses: {
9150
+ /** @description The image bytes */
9151
+ 200: {
9152
+ headers: {
9153
+ [name: string]: unknown;
9154
+ };
9155
+ content: {
9156
+ 'image/png': string;
9157
+ };
9158
+ };
9159
+ /** @description The path segment does not address an asset */
9160
+ 400: {
9161
+ headers: {
9162
+ [name: string]: unknown;
9163
+ };
9164
+ content: {
9165
+ 'application/json': components['schemas']['ErrorResponse'];
9166
+ };
9167
+ };
9168
+ /** @description Unauthorized */
9169
+ 401: {
9170
+ headers: {
9171
+ [name: string]: unknown;
9172
+ };
9173
+ content: {
9174
+ 'application/json': components['schemas']['ErrorResponse'];
9175
+ };
9176
+ };
9177
+ /** @description Forbidden */
9178
+ 403: {
9179
+ headers: {
9180
+ [name: string]: unknown;
9181
+ };
9182
+ content: {
9183
+ 'application/json': components['schemas']['ErrorResponse'];
9184
+ };
9185
+ };
9186
+ /** @description Not found */
9187
+ 404: {
9188
+ headers: {
9189
+ [name: string]: unknown;
9190
+ };
9191
+ content: {
9192
+ 'application/json': components['schemas']['ErrorResponse'];
9193
+ };
9194
+ };
9195
+ /** @description Rate limited */
9196
+ 429: {
9197
+ headers: {
9198
+ [name: string]: unknown;
9199
+ };
9200
+ content: {
9201
+ 'application/json': components['schemas']['ErrorResponse'];
9202
+ };
9203
+ };
9204
+ };
9205
+ };
9206
+ put?: never;
9207
+ post?: never;
9208
+ delete?: never;
9209
+ options?: never;
9210
+ head?: never;
9211
+ patch?: never;
9212
+ trace?: never;
9213
+ };
9214
+ '/api/projects/{projectId}/flows/{flowId}/releases/step-history': {
9215
+ parameters: {
9216
+ query?: never;
9217
+ header?: never;
9218
+ path?: never;
9219
+ cookie?: never;
9220
+ };
9221
+ /**
9222
+ * List the releases that touched one step
9223
+ * @description The releases of this flow that added, changed, or removed one step, newest first, each carrying the rationale stored for it. `step` is a `type.name` key over source, transformer, destination, store, and contract. `flow` narrows the scan to one named flow inside the config and is ignored for a contract key. `limit` bounds the releases scanned, not the entries returned. When nothing matched, `knownSteps` lists the addressable keys of the newest scanned release. Requires member role.
9224
+ */
9225
+ get: {
9226
+ parameters: {
9227
+ query: {
9228
+ step: string;
9229
+ flow?: string;
9230
+ limit?: number | null;
9231
+ };
9232
+ header?: never;
8772
9233
  path: {
8773
9234
  projectId: string;
8774
9235
  flowId: string;
8775
- settingsId: string;
8776
9236
  };
8777
9237
  cookie?: never;
8778
9238
  };
8779
9239
  requestBody?: never;
8780
9240
  responses: {
8781
- /** @description Deploy-token status */
9241
+ /** @description The releases that touched the step */
8782
9242
  200: {
8783
9243
  headers: {
8784
9244
  [name: string]: unknown;
8785
9245
  };
8786
9246
  content: {
8787
- 'application/json': components['schemas']['DeployTokenStatusResponse'];
9247
+ 'application/json': components['schemas']['StepHistoryResponse'];
9248
+ };
9249
+ };
9250
+ /** @description Invalid step key or query */
9251
+ 400: {
9252
+ headers: {
9253
+ [name: string]: unknown;
9254
+ };
9255
+ content: {
9256
+ 'application/json': components['schemas']['ErrorResponse'];
9257
+ };
9258
+ };
9259
+ /** @description Unauthorized */
9260
+ 401: {
9261
+ headers: {
9262
+ [name: string]: unknown;
9263
+ };
9264
+ content: {
9265
+ 'application/json': components['schemas']['ErrorResponse'];
9266
+ };
9267
+ };
9268
+ /** @description Forbidden */
9269
+ 403: {
9270
+ headers: {
9271
+ [name: string]: unknown;
9272
+ };
9273
+ content: {
9274
+ 'application/json': components['schemas']['ErrorResponse'];
9275
+ };
9276
+ };
9277
+ /** @description Not found */
9278
+ 404: {
9279
+ headers: {
9280
+ [name: string]: unknown;
9281
+ };
9282
+ content: {
9283
+ 'application/json': components['schemas']['ErrorResponse'];
9284
+ };
9285
+ };
9286
+ /** @description Rate limited */
9287
+ 429: {
9288
+ headers: {
9289
+ [name: string]: unknown;
9290
+ };
9291
+ content: {
9292
+ 'application/json': components['schemas']['ErrorResponse'];
9293
+ };
9294
+ };
9295
+ };
9296
+ };
9297
+ put?: never;
9298
+ post?: never;
9299
+ delete?: never;
9300
+ options?: never;
9301
+ head?: never;
9302
+ patch?: never;
9303
+ trace?: never;
9304
+ };
9305
+ '/api/projects/{projectId}/flows/{flowId}/releases/summarize': {
9306
+ parameters: {
9307
+ query?: never;
9308
+ header?: never;
9309
+ path?: never;
9310
+ cookie?: never;
9311
+ };
9312
+ get?: never;
9313
+ put?: never;
9314
+ /**
9315
+ * Summarize or check a release
9316
+ * @description Describe what one release of this flow changed against an earlier release, or check a written note against that same change. In `draft` mode the generated text is stored as the release's generated summary; in `check` mode nothing is stored and the response says whether the note matches. The diff is always recomputed from the two stored snapshots, with secret literals masked, and is never taken from the request. Both versions must be numbered releases of this flow, and `prevVersionId` must be the earlier of the two. Requires member role and the `hub` feature.
9317
+ */
9318
+ post: {
9319
+ parameters: {
9320
+ query?: never;
9321
+ header?: never;
9322
+ path: {
9323
+ projectId: string;
9324
+ flowId: string;
9325
+ };
9326
+ cookie?: never;
9327
+ };
9328
+ requestBody?: {
9329
+ content: {
9330
+ 'application/json': {
9331
+ /** @example ver_a1b2c3d4 */
9332
+ versionId: string;
9333
+ /** @example ver_a1b2c3d4 */
9334
+ prevVersionId: string;
9335
+ /** @enum {string} */
9336
+ mode: 'draft' | 'check';
9337
+ currentText?: string;
9338
+ };
9339
+ };
9340
+ };
9341
+ responses: {
9342
+ /** @description The generated summary or the check verdict */
9343
+ 200: {
9344
+ headers: {
9345
+ [name: string]: unknown;
9346
+ };
9347
+ content: {
9348
+ 'application/json': components['schemas']['SummarizeReleaseResponse'];
9349
+ };
9350
+ };
9351
+ /** @description Invalid body, a target is not a release, the pair is out of order, or no LLM provider is configured */
9352
+ 400: {
9353
+ headers: {
9354
+ [name: string]: unknown;
9355
+ };
9356
+ content: {
9357
+ 'application/json': components['schemas']['ErrorResponse'];
8788
9358
  };
8789
9359
  };
8790
9360
  /** @description Unauthorized */
@@ -8814,46 +9384,1127 @@ interface paths {
8814
9384
  'application/json': components['schemas']['ErrorResponse'];
8815
9385
  };
8816
9386
  };
9387
+ /** @description Rate limited */
9388
+ 429: {
9389
+ headers: {
9390
+ [name: string]: unknown;
9391
+ };
9392
+ content: {
9393
+ 'application/json': components['schemas']['ErrorResponse'];
9394
+ };
9395
+ };
9396
+ /** @description The model call failed or returned no usable text */
9397
+ 502: {
9398
+ headers: {
9399
+ [name: string]: unknown;
9400
+ };
9401
+ content: {
9402
+ 'application/json': components['schemas']['ErrorResponse'];
9403
+ };
9404
+ };
9405
+ };
9406
+ };
9407
+ delete?: never;
9408
+ options?: never;
9409
+ head?: never;
9410
+ patch?: never;
9411
+ trace?: never;
9412
+ };
9413
+ '/api/projects/{projectId}/deployments/{deploymentId}/versions/current/content': {
9414
+ parameters: {
9415
+ query?: never;
9416
+ header?: never;
9417
+ path?: never;
9418
+ cookie?: never;
9419
+ };
9420
+ /**
9421
+ * Get current deployed content
9422
+ * @description Get the active deployed per-setting content for a deployment, used to diff changes since deploy. Content is masked and display-only; every field is null when there is no deployed baseline. Requires member role.
9423
+ */
9424
+ get: {
9425
+ parameters: {
9426
+ query?: never;
9427
+ header?: never;
9428
+ path: {
9429
+ projectId: string;
9430
+ deploymentId: string;
9431
+ };
9432
+ cookie?: never;
9433
+ };
9434
+ requestBody?: never;
9435
+ responses: {
9436
+ /** @description Deployed content (or a null baseline) */
9437
+ 200: {
9438
+ headers: {
9439
+ [name: string]: unknown;
9440
+ };
9441
+ content: {
9442
+ 'application/json': components['schemas']['DeployedContentResponse'];
9443
+ };
9444
+ };
9445
+ /** @description Unauthorized */
9446
+ 401: {
9447
+ headers: {
9448
+ [name: string]: unknown;
9449
+ };
9450
+ content: {
9451
+ 'application/json': components['schemas']['ErrorResponse'];
9452
+ };
9453
+ };
9454
+ /** @description Forbidden */
9455
+ 403: {
9456
+ headers: {
9457
+ [name: string]: unknown;
9458
+ };
9459
+ content: {
9460
+ 'application/json': components['schemas']['ErrorResponse'];
9461
+ };
9462
+ };
9463
+ /** @description Not found */
9464
+ 404: {
9465
+ headers: {
9466
+ [name: string]: unknown;
9467
+ };
9468
+ content: {
9469
+ 'application/json': components['schemas']['ErrorResponse'];
9470
+ };
9471
+ };
9472
+ /** @description Rate limited */
9473
+ 429: {
9474
+ headers: {
9475
+ [name: string]: unknown;
9476
+ };
9477
+ content: {
9478
+ 'application/json': components['schemas']['ErrorResponse'];
9479
+ };
9480
+ };
9481
+ };
9482
+ };
9483
+ put?: never;
9484
+ post?: never;
9485
+ delete?: never;
9486
+ options?: never;
9487
+ head?: never;
9488
+ patch?: never;
9489
+ trace?: never;
9490
+ };
9491
+ '/api/projects/{projectId}/deployments/{deploymentId}/heartbeats': {
9492
+ parameters: {
9493
+ query?: never;
9494
+ header?: never;
9495
+ path?: never;
9496
+ cookie?: never;
9497
+ };
9498
+ /**
9499
+ * List deployment heartbeats
9500
+ * @description List heartbeat records for a deployment with optional from/to time-range filtering and pagination. Requires member role.
9501
+ */
9502
+ get: {
9503
+ parameters: {
9504
+ query?: {
9505
+ /** @description ISO start of the time range. */
9506
+ from?: string;
9507
+ /** @description ISO end of the time range. */
9508
+ to?: string;
9509
+ limit?: number;
9510
+ offset?: number | null;
9511
+ };
9512
+ header?: never;
9513
+ path: {
9514
+ projectId: string;
9515
+ deploymentId: string;
9516
+ };
9517
+ cookie?: never;
9518
+ };
9519
+ requestBody?: never;
9520
+ responses: {
9521
+ /** @description Heartbeat history */
9522
+ 200: {
9523
+ headers: {
9524
+ [name: string]: unknown;
9525
+ };
9526
+ content: {
9527
+ 'application/json': components['schemas']['ListHeartbeatsResponse'];
9528
+ };
9529
+ };
9530
+ /** @description Unauthorized */
9531
+ 401: {
9532
+ headers: {
9533
+ [name: string]: unknown;
9534
+ };
9535
+ content: {
9536
+ 'application/json': components['schemas']['ErrorResponse'];
9537
+ };
9538
+ };
9539
+ /** @description Forbidden */
9540
+ 403: {
9541
+ headers: {
9542
+ [name: string]: unknown;
9543
+ };
9544
+ content: {
9545
+ 'application/json': components['schemas']['ErrorResponse'];
9546
+ };
9547
+ };
9548
+ /** @description Not found */
9549
+ 404: {
9550
+ headers: {
9551
+ [name: string]: unknown;
9552
+ };
9553
+ content: {
9554
+ 'application/json': components['schemas']['ErrorResponse'];
9555
+ };
9556
+ };
9557
+ };
9558
+ };
9559
+ put?: never;
9560
+ post?: never;
9561
+ delete?: never;
9562
+ options?: never;
9563
+ head?: never;
9564
+ patch?: never;
9565
+ trace?: never;
9566
+ };
9567
+ '/api/projects/{projectId}/deployments/{deploymentId}/rotate-ingest-token': {
9568
+ parameters: {
9569
+ query?: never;
9570
+ header?: never;
9571
+ path?: never;
9572
+ cookie?: never;
9573
+ };
9574
+ get?: never;
9575
+ put?: never;
9576
+ /**
9577
+ * Rotate ingest token
9578
+ * @description Rotate the ingest token for a deployment. Owner-only. No grace window: the previous token is immediately invalidated and the new token is returned once.
9579
+ */
9580
+ post: {
9581
+ parameters: {
9582
+ query?: never;
9583
+ header?: never;
9584
+ path: {
9585
+ projectId: string;
9586
+ deploymentId: string;
9587
+ };
9588
+ cookie?: never;
9589
+ };
9590
+ requestBody?: never;
9591
+ responses: {
9592
+ /** @description New ingest token */
9593
+ 200: {
9594
+ headers: {
9595
+ [name: string]: unknown;
9596
+ };
9597
+ content: {
9598
+ 'application/json': components['schemas']['RotateIngestTokenResponse'];
9599
+ };
9600
+ };
9601
+ /** @description Unauthorized */
9602
+ 401: {
9603
+ headers: {
9604
+ [name: string]: unknown;
9605
+ };
9606
+ content: {
9607
+ 'application/json': components['schemas']['ErrorResponse'];
9608
+ };
9609
+ };
9610
+ /** @description Forbidden */
9611
+ 403: {
9612
+ headers: {
9613
+ [name: string]: unknown;
9614
+ };
9615
+ content: {
9616
+ 'application/json': components['schemas']['ErrorResponse'];
9617
+ };
9618
+ };
9619
+ /** @description Not found */
9620
+ 404: {
9621
+ headers: {
9622
+ [name: string]: unknown;
9623
+ };
9624
+ content: {
9625
+ 'application/json': components['schemas']['ErrorResponse'];
9626
+ };
9627
+ };
9628
+ };
9629
+ };
9630
+ delete?: never;
9631
+ options?: never;
9632
+ head?: never;
9633
+ patch?: never;
9634
+ trace?: never;
9635
+ };
9636
+ '/api/projects/{projectId}/deployments/{deploymentId}/usage': {
9637
+ parameters: {
9638
+ query?: never;
9639
+ header?: never;
9640
+ path?: never;
9641
+ cookie?: never;
9642
+ };
9643
+ /**
9644
+ * Deployment usage
9645
+ * @description Aggregate usage summary plus bucketed chart data for a deployment over the requested period. Requires member role.
9646
+ */
9647
+ get: {
9648
+ parameters: {
9649
+ query?: {
9650
+ /** @description Time window for the usage summary. */
9651
+ period?: '1h' | '24h' | '7d' | '30d';
9652
+ };
9653
+ header?: never;
9654
+ path: {
9655
+ projectId: string;
9656
+ deploymentId: string;
9657
+ };
9658
+ cookie?: never;
9659
+ };
9660
+ requestBody?: never;
9661
+ responses: {
9662
+ /** @description Usage summary and chart buckets */
9663
+ 200: {
9664
+ headers: {
9665
+ [name: string]: unknown;
9666
+ };
9667
+ content: {
9668
+ 'application/json': components['schemas']['DeploymentUsageResponse'];
9669
+ };
9670
+ };
9671
+ /** @description Validation error */
9672
+ 400: {
9673
+ headers: {
9674
+ [name: string]: unknown;
9675
+ };
9676
+ content: {
9677
+ 'application/json': components['schemas']['ErrorResponse'];
9678
+ };
9679
+ };
9680
+ /** @description Unauthorized */
9681
+ 401: {
9682
+ headers: {
9683
+ [name: string]: unknown;
9684
+ };
9685
+ content: {
9686
+ 'application/json': components['schemas']['ErrorResponse'];
9687
+ };
9688
+ };
9689
+ /** @description Forbidden */
9690
+ 403: {
9691
+ headers: {
9692
+ [name: string]: unknown;
9693
+ };
9694
+ content: {
9695
+ 'application/json': components['schemas']['ErrorResponse'];
9696
+ };
9697
+ };
9698
+ /** @description Not found */
9699
+ 404: {
9700
+ headers: {
9701
+ [name: string]: unknown;
9702
+ };
9703
+ content: {
9704
+ 'application/json': components['schemas']['ErrorResponse'];
9705
+ };
9706
+ };
9707
+ };
9708
+ };
9709
+ put?: never;
9710
+ post?: never;
9711
+ delete?: never;
9712
+ options?: never;
9713
+ head?: never;
9714
+ patch?: never;
9715
+ trace?: never;
9716
+ };
9717
+ '/api/projects/{projectId}/flows/{flowId}/custom-domains': {
9718
+ parameters: {
9719
+ query?: never;
9720
+ header?: never;
9721
+ path?: never;
9722
+ cookie?: never;
9723
+ };
9724
+ /**
9725
+ * List custom domains
9726
+ * @description List custom domains attached to any deployment of this flow. Requires member role and the customDomains feature.
9727
+ */
9728
+ get: {
9729
+ parameters: {
9730
+ query?: never;
9731
+ header?: never;
9732
+ path: {
9733
+ projectId: string;
9734
+ flowId: string;
9735
+ };
9736
+ cookie?: never;
9737
+ };
9738
+ requestBody?: never;
9739
+ responses: {
9740
+ /** @description Custom domains for the flow */
9741
+ 200: {
9742
+ headers: {
9743
+ [name: string]: unknown;
9744
+ };
9745
+ content: {
9746
+ 'application/json': components['schemas']['ListCustomDomainsResponse'];
9747
+ };
9748
+ };
9749
+ /** @description Unauthorized */
9750
+ 401: {
9751
+ headers: {
9752
+ [name: string]: unknown;
9753
+ };
9754
+ content: {
9755
+ 'application/json': components['schemas']['ErrorResponse'];
9756
+ };
9757
+ };
9758
+ /** @description Forbidden */
9759
+ 403: {
9760
+ headers: {
9761
+ [name: string]: unknown;
9762
+ };
9763
+ content: {
9764
+ 'application/json': components['schemas']['ErrorResponse'];
9765
+ };
9766
+ };
9767
+ };
9768
+ };
9769
+ put?: never;
9770
+ /**
9771
+ * Attach custom domain
9772
+ * @description Attach a custom domain to the flow's latest server deployment, or to an explicit deployment supplied in the body. Requires member role and the customDomains feature.
9773
+ */
9774
+ post: {
9775
+ parameters: {
9776
+ query?: never;
9777
+ header?: never;
9778
+ path: {
9779
+ projectId: string;
9780
+ flowId: string;
9781
+ };
9782
+ cookie?: never;
9783
+ };
9784
+ requestBody?: {
9785
+ content: {
9786
+ 'application/json': components['schemas']['CreateCustomDomainRequest'];
9787
+ };
9788
+ };
9789
+ responses: {
9790
+ /** @description Custom domain attached */
9791
+ 201: {
9792
+ headers: {
9793
+ [name: string]: unknown;
9794
+ };
9795
+ content: {
9796
+ 'application/json': components['schemas']['CustomDomain'];
9797
+ };
9798
+ };
9799
+ /** @description Validation error */
9800
+ 400: {
9801
+ headers: {
9802
+ [name: string]: unknown;
9803
+ };
9804
+ content: {
9805
+ 'application/json': components['schemas']['ErrorResponse'];
9806
+ };
9807
+ };
9808
+ /** @description Unauthorized */
9809
+ 401: {
9810
+ headers: {
9811
+ [name: string]: unknown;
9812
+ };
9813
+ content: {
9814
+ 'application/json': components['schemas']['ErrorResponse'];
9815
+ };
9816
+ };
9817
+ /** @description Forbidden */
9818
+ 403: {
9819
+ headers: {
9820
+ [name: string]: unknown;
9821
+ };
9822
+ content: {
9823
+ 'application/json': components['schemas']['ErrorResponse'];
9824
+ };
9825
+ };
9826
+ /** @description Not found */
9827
+ 404: {
9828
+ headers: {
9829
+ [name: string]: unknown;
9830
+ };
9831
+ content: {
9832
+ 'application/json': components['schemas']['ErrorResponse'];
9833
+ };
9834
+ };
9835
+ /** @description Conflict */
9836
+ 409: {
9837
+ headers: {
9838
+ [name: string]: unknown;
9839
+ };
9840
+ content: {
9841
+ 'application/json': components['schemas']['ErrorResponse'];
9842
+ };
9843
+ };
9844
+ };
9845
+ };
9846
+ delete?: never;
9847
+ options?: never;
9848
+ head?: never;
9849
+ patch?: never;
9850
+ trace?: never;
9851
+ };
9852
+ '/api/projects/{projectId}/flows/{flowId}/custom-domains/{domainId}': {
9853
+ parameters: {
9854
+ query?: never;
9855
+ header?: never;
9856
+ path?: never;
9857
+ cookie?: never;
9858
+ };
9859
+ get?: never;
9860
+ put?: never;
9861
+ post?: never;
9862
+ /**
9863
+ * Detach custom domain
9864
+ * @description Detach a custom domain from its deployment and remove the Scaleway record. Idempotent: a missing domain still returns 204.
9865
+ */
9866
+ delete: {
9867
+ parameters: {
9868
+ query?: never;
9869
+ header?: never;
9870
+ path: {
9871
+ projectId: string;
9872
+ flowId: string;
9873
+ domainId: string;
9874
+ };
9875
+ cookie?: never;
9876
+ };
9877
+ requestBody?: never;
9878
+ responses: {
9879
+ /** @description Custom domain detached */
9880
+ 204: {
9881
+ headers: {
9882
+ [name: string]: unknown;
9883
+ };
9884
+ content?: never;
9885
+ };
9886
+ /** @description Unauthorized */
9887
+ 401: {
9888
+ headers: {
9889
+ [name: string]: unknown;
9890
+ };
9891
+ content: {
9892
+ 'application/json': components['schemas']['ErrorResponse'];
9893
+ };
9894
+ };
9895
+ /** @description Forbidden */
9896
+ 403: {
9897
+ headers: {
9898
+ [name: string]: unknown;
9899
+ };
9900
+ content: {
9901
+ 'application/json': components['schemas']['ErrorResponse'];
9902
+ };
9903
+ };
9904
+ };
9905
+ };
9906
+ options?: never;
9907
+ head?: never;
9908
+ patch?: never;
9909
+ trace?: never;
9910
+ };
9911
+ '/api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy-token': {
9912
+ parameters: {
9913
+ query?: never;
9914
+ header?: never;
9915
+ path?: never;
9916
+ cookie?: never;
9917
+ };
9918
+ /**
9919
+ * Self-hosted deploy-token status
9920
+ * @description Report whether a self-hosted deploy token exists for this config, plus the deployment health summary when present. Requires member role.
9921
+ */
9922
+ get: {
9923
+ parameters: {
9924
+ query?: never;
9925
+ header?: never;
9926
+ path: {
9927
+ projectId: string;
9928
+ flowId: string;
9929
+ settingsId: string;
9930
+ };
9931
+ cookie?: never;
9932
+ };
9933
+ requestBody?: never;
9934
+ responses: {
9935
+ /** @description Deploy-token status */
9936
+ 200: {
9937
+ headers: {
9938
+ [name: string]: unknown;
9939
+ };
9940
+ content: {
9941
+ 'application/json': components['schemas']['DeployTokenStatusResponse'];
9942
+ };
9943
+ };
9944
+ /** @description Unauthorized */
9945
+ 401: {
9946
+ headers: {
9947
+ [name: string]: unknown;
9948
+ };
9949
+ content: {
9950
+ 'application/json': components['schemas']['ErrorResponse'];
9951
+ };
9952
+ };
9953
+ /** @description Forbidden */
9954
+ 403: {
9955
+ headers: {
9956
+ [name: string]: unknown;
9957
+ };
9958
+ content: {
9959
+ 'application/json': components['schemas']['ErrorResponse'];
9960
+ };
9961
+ };
9962
+ /** @description Not found */
9963
+ 404: {
9964
+ headers: {
9965
+ [name: string]: unknown;
9966
+ };
9967
+ content: {
9968
+ 'application/json': components['schemas']['ErrorResponse'];
9969
+ };
9970
+ };
9971
+ };
9972
+ };
9973
+ put?: never;
9974
+ /**
9975
+ * Mint self-hosted deploy token
9976
+ * @description Create a self-hosted deployment (if none exists) and mint a flow+deployment-bound runner token. Admin-only. The raw token is returned once and never stored in plaintext.
9977
+ */
9978
+ post: {
9979
+ parameters: {
9980
+ query?: never;
9981
+ header?: never;
9982
+ path: {
9983
+ projectId: string;
9984
+ flowId: string;
9985
+ settingsId: string;
9986
+ };
9987
+ cookie?: never;
9988
+ };
9989
+ requestBody?: never;
9990
+ responses: {
9991
+ /** @description Deploy token minted */
9992
+ 201: {
9993
+ headers: {
9994
+ [name: string]: unknown;
9995
+ };
9996
+ content: {
9997
+ 'application/json': components['schemas']['CreateDeployTokenResponse'];
9998
+ };
9999
+ };
10000
+ /** @description Unauthorized */
10001
+ 401: {
10002
+ headers: {
10003
+ [name: string]: unknown;
10004
+ };
10005
+ content: {
10006
+ 'application/json': components['schemas']['ErrorResponse'];
10007
+ };
10008
+ };
10009
+ /** @description Forbidden */
10010
+ 403: {
10011
+ headers: {
10012
+ [name: string]: unknown;
10013
+ };
10014
+ content: {
10015
+ 'application/json': components['schemas']['ErrorResponse'];
10016
+ };
10017
+ };
10018
+ /** @description Not found */
10019
+ 404: {
10020
+ headers: {
10021
+ [name: string]: unknown;
10022
+ };
10023
+ content: {
10024
+ 'application/json': components['schemas']['ErrorResponse'];
10025
+ };
10026
+ };
10027
+ };
10028
+ };
10029
+ delete?: never;
10030
+ options?: never;
10031
+ head?: never;
10032
+ patch?: never;
10033
+ trace?: never;
10034
+ };
10035
+ '/api/projects/{projectId}/entitlements': {
10036
+ parameters: {
10037
+ query?: never;
10038
+ header?: never;
10039
+ path?: never;
10040
+ cookie?: never;
10041
+ };
10042
+ /**
10043
+ * Resolved entitlements
10044
+ * @description Return resolved feature entitlements for the authenticated user and project. Used by CLI/API clients; the web UI uses SSR-resolved entitlements. Requires viewer role.
10045
+ */
10046
+ get: {
10047
+ parameters: {
10048
+ query?: never;
10049
+ header?: never;
10050
+ path: {
10051
+ projectId: string;
10052
+ };
10053
+ cookie?: never;
10054
+ };
10055
+ requestBody?: never;
10056
+ responses: {
10057
+ /** @description Resolved entitlements */
10058
+ 200: {
10059
+ headers: {
10060
+ [name: string]: unknown;
10061
+ };
10062
+ content: {
10063
+ 'application/json': components['schemas']['EntitlementsResponse'];
10064
+ };
10065
+ };
10066
+ /** @description Unauthorized */
10067
+ 401: {
10068
+ headers: {
10069
+ [name: string]: unknown;
10070
+ };
10071
+ content: {
10072
+ 'application/json': components['schemas']['ErrorResponse'];
10073
+ };
10074
+ };
10075
+ /** @description Forbidden */
10076
+ 403: {
10077
+ headers: {
10078
+ [name: string]: unknown;
10079
+ };
10080
+ content: {
10081
+ 'application/json': components['schemas']['ErrorResponse'];
10082
+ };
10083
+ };
10084
+ };
10085
+ };
10086
+ put?: never;
10087
+ post?: never;
10088
+ delete?: never;
10089
+ options?: never;
10090
+ head?: never;
10091
+ patch?: never;
10092
+ trace?: never;
10093
+ };
10094
+ '/api/projects/{projectId}/settings/llm': {
10095
+ parameters: {
10096
+ query?: never;
10097
+ header?: never;
10098
+ path?: never;
10099
+ cookie?: never;
10100
+ };
10101
+ /**
10102
+ * Active LLM provider
10103
+ * @description Report which LLM provider is currently active for the project and where billing is sourced. Never returns the apiKey. Requires member role and the chat feature.
10104
+ */
10105
+ get: {
10106
+ parameters: {
10107
+ query?: never;
10108
+ header?: never;
10109
+ path: {
10110
+ projectId: string;
10111
+ };
10112
+ cookie?: never;
10113
+ };
10114
+ requestBody?: never;
10115
+ responses: {
10116
+ /** @description Active LLM provider status */
10117
+ 200: {
10118
+ headers: {
10119
+ [name: string]: unknown;
10120
+ };
10121
+ content: {
10122
+ 'application/json': components['schemas']['LlmConfigStatusResponse'];
10123
+ };
10124
+ };
10125
+ /** @description Unauthorized */
10126
+ 401: {
10127
+ headers: {
10128
+ [name: string]: unknown;
10129
+ };
10130
+ content: {
10131
+ 'application/json': components['schemas']['ErrorResponse'];
10132
+ };
10133
+ };
10134
+ /** @description Forbidden */
10135
+ 403: {
10136
+ headers: {
10137
+ [name: string]: unknown;
10138
+ };
10139
+ content: {
10140
+ 'application/json': components['schemas']['ErrorResponse'];
10141
+ };
10142
+ };
10143
+ /** @description No platform LLM provider configured */
10144
+ 503: {
10145
+ headers: {
10146
+ [name: string]: unknown;
10147
+ };
10148
+ content: {
10149
+ 'application/json': components['schemas']['LlmConfigStatusResponse'];
10150
+ };
10151
+ };
10152
+ };
10153
+ };
10154
+ put?: never;
10155
+ /**
10156
+ * Set LLM provider
10157
+ * @description Set or clear the project LLM provider override. Admin-only, gated by the chat feature. The apiKey is write-only: it is encrypted and never returned.
10158
+ */
10159
+ post: {
10160
+ parameters: {
10161
+ query?: never;
10162
+ header?: never;
10163
+ path: {
10164
+ projectId: string;
10165
+ };
10166
+ cookie?: never;
10167
+ };
10168
+ requestBody?: {
10169
+ content: {
10170
+ 'application/json': components['schemas']['SetLlmConfigRequest'];
10171
+ };
10172
+ };
10173
+ responses: {
10174
+ /** @description LLM config saved or cleared */
10175
+ 200: {
10176
+ headers: {
10177
+ [name: string]: unknown;
10178
+ };
10179
+ content: {
10180
+ 'application/json': components['schemas']['SetLlmConfigResponse'];
10181
+ };
10182
+ };
10183
+ /** @description Validation error */
10184
+ 400: {
10185
+ headers: {
10186
+ [name: string]: unknown;
10187
+ };
10188
+ content: {
10189
+ 'application/json': components['schemas']['ErrorResponse'];
10190
+ };
10191
+ };
10192
+ /** @description Unauthorized */
10193
+ 401: {
10194
+ headers: {
10195
+ [name: string]: unknown;
10196
+ };
10197
+ content: {
10198
+ 'application/json': components['schemas']['ErrorResponse'];
10199
+ };
10200
+ };
10201
+ /** @description Forbidden */
10202
+ 403: {
10203
+ headers: {
10204
+ [name: string]: unknown;
10205
+ };
10206
+ content: {
10207
+ 'application/json': components['schemas']['ErrorResponse'];
10208
+ };
10209
+ };
10210
+ /** @description Not found */
10211
+ 404: {
10212
+ headers: {
10213
+ [name: string]: unknown;
10214
+ };
10215
+ content: {
10216
+ 'application/json': components['schemas']['ErrorResponse'];
10217
+ };
10218
+ };
10219
+ };
10220
+ };
10221
+ delete?: never;
10222
+ options?: never;
10223
+ head?: never;
10224
+ patch?: never;
10225
+ trace?: never;
10226
+ };
10227
+ '/api/projects/{projectId}/chat/sessions': {
10228
+ parameters: {
10229
+ query?: never;
10230
+ header?: never;
10231
+ path?: never;
10232
+ cookie?: never;
10233
+ };
10234
+ /**
10235
+ * List chat sessions
10236
+ * @description List the caller's recent chat sessions for a project, ordered by last activity. Requires member role and the chat feature.
10237
+ */
10238
+ get: {
10239
+ parameters: {
10240
+ query?: {
10241
+ limit?: number;
10242
+ offset?: number | null;
10243
+ };
10244
+ header?: never;
10245
+ path: {
10246
+ projectId: string;
10247
+ };
10248
+ cookie?: never;
10249
+ };
10250
+ requestBody?: never;
10251
+ responses: {
10252
+ /** @description Chat session list */
10253
+ 200: {
10254
+ headers: {
10255
+ [name: string]: unknown;
10256
+ };
10257
+ content: {
10258
+ 'application/json': components['schemas']['ListChatSessionsResponse'];
10259
+ };
10260
+ };
10261
+ /** @description Unauthorized */
10262
+ 401: {
10263
+ headers: {
10264
+ [name: string]: unknown;
10265
+ };
10266
+ content: {
10267
+ 'application/json': components['schemas']['ErrorResponse'];
10268
+ };
10269
+ };
10270
+ /** @description Forbidden */
10271
+ 403: {
10272
+ headers: {
10273
+ [name: string]: unknown;
10274
+ };
10275
+ content: {
10276
+ 'application/json': components['schemas']['ErrorResponse'];
10277
+ };
10278
+ };
10279
+ };
10280
+ };
10281
+ put?: never;
10282
+ post?: never;
10283
+ delete?: never;
10284
+ options?: never;
10285
+ head?: never;
10286
+ patch?: never;
10287
+ trace?: never;
10288
+ };
10289
+ '/api/projects/{projectId}/chat/sessions/{sessionId}': {
10290
+ parameters: {
10291
+ query?: never;
10292
+ header?: never;
10293
+ path?: never;
10294
+ cookie?: never;
10295
+ };
10296
+ /**
10297
+ * Get chat session
10298
+ * @description Return a chat session and its full message history when the caller owns it. Foreign or unknown sessions return 404 (never 403) so existence is not leaked. Requires member role and the chat feature.
10299
+ */
10300
+ get: {
10301
+ parameters: {
10302
+ query?: never;
10303
+ header?: never;
10304
+ path: {
10305
+ projectId: string;
10306
+ sessionId: string;
10307
+ };
10308
+ cookie?: never;
10309
+ };
10310
+ requestBody?: never;
10311
+ responses: {
10312
+ /** @description Chat session with messages */
10313
+ 200: {
10314
+ headers: {
10315
+ [name: string]: unknown;
10316
+ };
10317
+ content: {
10318
+ 'application/json': components['schemas']['ChatSessionDetailResponse'];
10319
+ };
10320
+ };
10321
+ /** @description Unauthorized */
10322
+ 401: {
10323
+ headers: {
10324
+ [name: string]: unknown;
10325
+ };
10326
+ content: {
10327
+ 'application/json': components['schemas']['ErrorResponse'];
10328
+ };
10329
+ };
10330
+ /** @description Forbidden */
10331
+ 403: {
10332
+ headers: {
10333
+ [name: string]: unknown;
10334
+ };
10335
+ content: {
10336
+ 'application/json': components['schemas']['ErrorResponse'];
10337
+ };
10338
+ };
10339
+ /** @description Not found */
10340
+ 404: {
10341
+ headers: {
10342
+ [name: string]: unknown;
10343
+ };
10344
+ content: {
10345
+ 'application/json': components['schemas']['ErrorResponse'];
10346
+ };
10347
+ };
10348
+ };
10349
+ };
10350
+ put?: never;
10351
+ post?: never;
10352
+ delete?: never;
10353
+ options?: never;
10354
+ head?: never;
10355
+ patch?: never;
10356
+ trace?: never;
10357
+ };
10358
+ '/api/projects/{projectId}/chat/elicit': {
10359
+ parameters: {
10360
+ query?: never;
10361
+ header?: never;
10362
+ path?: never;
10363
+ cookie?: never;
10364
+ };
10365
+ get?: never;
10366
+ put?: never;
10367
+ /**
10368
+ * Answer elicitation prompt
10369
+ * @description Answer a pending MCP elicitation prompt (accept, decline, or cancel), unblocking the waiting tool invocation. Requires member role and the chat feature.
10370
+ */
10371
+ post: {
10372
+ parameters: {
10373
+ query?: never;
10374
+ header?: never;
10375
+ path: {
10376
+ projectId: string;
10377
+ };
10378
+ cookie?: never;
10379
+ };
10380
+ requestBody?: {
10381
+ content: {
10382
+ 'application/json': components['schemas']['ElicitRequest'];
10383
+ };
10384
+ };
10385
+ responses: {
10386
+ /** @description Elicitation resolved */
10387
+ 200: {
10388
+ headers: {
10389
+ [name: string]: unknown;
10390
+ };
10391
+ content: {
10392
+ 'application/json': components['schemas']['ElicitResponse'];
10393
+ };
10394
+ };
10395
+ /** @description Validation error */
10396
+ 400: {
10397
+ headers: {
10398
+ [name: string]: unknown;
10399
+ };
10400
+ content: {
10401
+ 'application/json': components['schemas']['ErrorResponse'];
10402
+ };
10403
+ };
10404
+ /** @description Unauthorized */
10405
+ 401: {
10406
+ headers: {
10407
+ [name: string]: unknown;
10408
+ };
10409
+ content: {
10410
+ 'application/json': components['schemas']['ErrorResponse'];
10411
+ };
10412
+ };
10413
+ /** @description Forbidden */
10414
+ 403: {
10415
+ headers: {
10416
+ [name: string]: unknown;
10417
+ };
10418
+ content: {
10419
+ 'application/json': components['schemas']['ErrorResponse'];
10420
+ };
10421
+ };
10422
+ /** @description Not found */
10423
+ 404: {
10424
+ headers: {
10425
+ [name: string]: unknown;
10426
+ };
10427
+ content: {
10428
+ 'application/json': components['schemas']['ErrorResponse'];
10429
+ };
10430
+ };
10431
+ };
10432
+ };
10433
+ delete?: never;
10434
+ options?: never;
10435
+ head?: never;
10436
+ patch?: never;
10437
+ trace?: never;
10438
+ };
10439
+ '/api/mcp/tokens': {
10440
+ parameters: {
10441
+ query?: never;
10442
+ header?: never;
10443
+ path?: never;
10444
+ cookie?: never;
10445
+ };
10446
+ /**
10447
+ * List MCP tokens
10448
+ * @description List the authenticated user's personal MCP tokens. No secret material is returned.
10449
+ */
10450
+ get: {
10451
+ parameters: {
10452
+ query?: never;
10453
+ header?: never;
10454
+ path?: never;
10455
+ cookie?: never;
10456
+ };
10457
+ requestBody?: never;
10458
+ responses: {
10459
+ /** @description MCP token list */
10460
+ 200: {
10461
+ headers: {
10462
+ [name: string]: unknown;
10463
+ };
10464
+ content: {
10465
+ 'application/json': components['schemas']['ListMcpTokensResponse'];
10466
+ };
10467
+ };
10468
+ /** @description Unauthorized */
10469
+ 401: {
10470
+ headers: {
10471
+ [name: string]: unknown;
10472
+ };
10473
+ content: {
10474
+ 'application/json': components['schemas']['ErrorResponse'];
10475
+ };
10476
+ };
8817
10477
  };
8818
10478
  };
8819
10479
  put?: never;
8820
10480
  /**
8821
- * Mint self-hosted deploy token
8822
- * @description Create a self-hosted deployment (if none exists) and mint a flow+deployment-bound runner token. Admin-only. The raw token is returned once and never stored in plaintext.
10481
+ * Issue MCP token
10482
+ * @description Issue a personal MCP token. The raw token is returned exactly once and is never retrievable afterwards.
8823
10483
  */
8824
10484
  post: {
8825
10485
  parameters: {
8826
10486
  query?: never;
8827
10487
  header?: never;
8828
- path: {
8829
- projectId: string;
8830
- flowId: string;
8831
- settingsId: string;
8832
- };
10488
+ path?: never;
8833
10489
  cookie?: never;
8834
10490
  };
8835
- requestBody?: never;
10491
+ requestBody?: {
10492
+ content: {
10493
+ 'application/json': components['schemas']['CreateMcpTokenRequest'];
10494
+ };
10495
+ };
8836
10496
  responses: {
8837
- /** @description Deploy token minted */
10497
+ /** @description MCP token issued */
8838
10498
  201: {
8839
10499
  headers: {
8840
10500
  [name: string]: unknown;
8841
10501
  };
8842
10502
  content: {
8843
- 'application/json': components['schemas']['CreateDeployTokenResponse'];
8844
- };
8845
- };
8846
- /** @description Unauthorized */
8847
- 401: {
8848
- headers: {
8849
- [name: string]: unknown;
8850
- };
8851
- content: {
8852
- 'application/json': components['schemas']['ErrorResponse'];
10503
+ 'application/json': components['schemas']['CreateMcpTokenResponse'];
8853
10504
  };
8854
10505
  };
8855
- /** @description Forbidden */
8856
- 403: {
10506
+ /** @description Validation error */
10507
+ 400: {
8857
10508
  headers: {
8858
10509
  [name: string]: unknown;
8859
10510
  };
@@ -8861,8 +10512,8 @@ interface paths {
8861
10512
  'application/json': components['schemas']['ErrorResponse'];
8862
10513
  };
8863
10514
  };
8864
- /** @description Not found */
8865
- 404: {
10515
+ /** @description Unauthorized */
10516
+ 401: {
8866
10517
  headers: {
8867
10518
  [name: string]: unknown;
8868
10519
  };
@@ -8878,36 +10529,37 @@ interface paths {
8878
10529
  patch?: never;
8879
10530
  trace?: never;
8880
10531
  };
8881
- '/api/projects/{projectId}/entitlements': {
10532
+ '/api/mcp/tokens/{tokenId}': {
8882
10533
  parameters: {
8883
10534
  query?: never;
8884
10535
  header?: never;
8885
10536
  path?: never;
8886
10537
  cookie?: never;
8887
10538
  };
10539
+ get?: never;
10540
+ put?: never;
10541
+ post?: never;
8888
10542
  /**
8889
- * Resolved entitlements
8890
- * @description Return resolved feature entitlements for the authenticated user and project. Used by CLI/API clients; the web UI uses SSR-resolved entitlements. Requires viewer role.
10543
+ * Revoke MCP token
10544
+ * @description Revoke a personal MCP token by id.
8891
10545
  */
8892
- get: {
10546
+ delete: {
8893
10547
  parameters: {
8894
10548
  query?: never;
8895
10549
  header?: never;
8896
10550
  path: {
8897
- projectId: string;
10551
+ tokenId: string;
8898
10552
  };
8899
10553
  cookie?: never;
8900
10554
  };
8901
10555
  requestBody?: never;
8902
10556
  responses: {
8903
- /** @description Resolved entitlements */
8904
- 200: {
10557
+ /** @description MCP token revoked */
10558
+ 204: {
8905
10559
  headers: {
8906
10560
  [name: string]: unknown;
8907
10561
  };
8908
- content: {
8909
- 'application/json': components['schemas']['EntitlementsResponse'];
8910
- };
10562
+ content?: never;
8911
10563
  };
8912
10564
  /** @description Unauthorized */
8913
10565
  401: {
@@ -8918,26 +10570,14 @@ interface paths {
8918
10570
  'application/json': components['schemas']['ErrorResponse'];
8919
10571
  };
8920
10572
  };
8921
- /** @description Forbidden */
8922
- 403: {
8923
- headers: {
8924
- [name: string]: unknown;
8925
- };
8926
- content: {
8927
- 'application/json': components['schemas']['ErrorResponse'];
8928
- };
8929
- };
8930
10573
  };
8931
10574
  };
8932
- put?: never;
8933
- post?: never;
8934
- delete?: never;
8935
10575
  options?: never;
8936
10576
  head?: never;
8937
10577
  patch?: never;
8938
10578
  trace?: never;
8939
10579
  };
8940
- '/api/projects/{projectId}/settings/llm': {
10580
+ '/api/projects/{projectId}/runners': {
8941
10581
  parameters: {
8942
10582
  query?: never;
8943
10583
  header?: never;
@@ -8945,8 +10585,8 @@ interface paths {
8945
10585
  cookie?: never;
8946
10586
  };
8947
10587
  /**
8948
- * Active LLM provider
8949
- * @description Report which LLM provider is currently active for the project and where billing is sourced. Never returns the apiKey. Requires member role and the chat feature.
10588
+ * List runners (deprecated)
10589
+ * @description Deprecated: runners migrated to deployments (origin=self-hosted). Always returns an empty list for backward compatibility. Requires member role.
8950
10590
  */
8951
10591
  get: {
8952
10592
  parameters: {
@@ -8959,13 +10599,13 @@ interface paths {
8959
10599
  };
8960
10600
  requestBody?: never;
8961
10601
  responses: {
8962
- /** @description Active LLM provider status */
10602
+ /** @description Empty runner list */
8963
10603
  200: {
8964
10604
  headers: {
8965
10605
  [name: string]: unknown;
8966
10606
  };
8967
10607
  content: {
8968
- 'application/json': components['schemas']['LlmConfigStatusResponse'];
10608
+ 'application/json': components['schemas']['ListRunnersResponse'];
8969
10609
  };
8970
10610
  };
8971
10611
  /** @description Unauthorized */
@@ -8986,21 +10626,28 @@ interface paths {
8986
10626
  'application/json': components['schemas']['ErrorResponse'];
8987
10627
  };
8988
10628
  };
8989
- /** @description No platform LLM provider configured */
8990
- 503: {
8991
- headers: {
8992
- [name: string]: unknown;
8993
- };
8994
- content: {
8995
- 'application/json': components['schemas']['LlmConfigStatusResponse'];
8996
- };
8997
- };
8998
10629
  };
8999
10630
  };
9000
10631
  put?: never;
10632
+ post?: never;
10633
+ delete?: never;
10634
+ options?: never;
10635
+ head?: never;
10636
+ patch?: never;
10637
+ trace?: never;
10638
+ };
10639
+ '/api/projects/{projectId}/runners/heartbeat': {
10640
+ parameters: {
10641
+ query?: never;
10642
+ header?: never;
10643
+ path?: never;
10644
+ cookie?: never;
10645
+ };
10646
+ get?: never;
10647
+ put?: never;
9001
10648
  /**
9002
- * Set LLM provider
9003
- * @description Set or clear the project LLM provider override. Admin-only, gated by the chat feature. The apiKey is write-only: it is encrypted and never returned.
10649
+ * Runner heartbeat
10650
+ * @description Accept a self-hosted runner heartbeat with usage counters. Authenticated by a flow+deployment-bound runner token. Updates deployment liveness and records an immutable usage row.
9004
10651
  */
9005
10652
  post: {
9006
10653
  parameters: {
@@ -9013,17 +10660,17 @@ interface paths {
9013
10660
  };
9014
10661
  requestBody?: {
9015
10662
  content: {
9016
- 'application/json': components['schemas']['SetLlmConfigRequest'];
10663
+ 'application/json': components['schemas']['HeartbeatRequest'];
9017
10664
  };
9018
10665
  };
9019
10666
  responses: {
9020
- /** @description LLM config saved or cleared */
10667
+ /** @description Heartbeat accepted */
9021
10668
  200: {
9022
10669
  headers: {
9023
10670
  [name: string]: unknown;
9024
10671
  };
9025
10672
  content: {
9026
- 'application/json': components['schemas']['SetLlmConfigResponse'];
10673
+ 'application/json': components['schemas']['RunnerHeartbeatResponse'];
9027
10674
  };
9028
10675
  };
9029
10676
  /** @description Validation error */
@@ -9044,15 +10691,6 @@ interface paths {
9044
10691
  'application/json': components['schemas']['ErrorResponse'];
9045
10692
  };
9046
10693
  };
9047
- /** @description Forbidden */
9048
- 403: {
9049
- headers: {
9050
- [name: string]: unknown;
9051
- };
9052
- content: {
9053
- 'application/json': components['schemas']['ErrorResponse'];
9054
- };
9055
- };
9056
10694
  /** @description Not found */
9057
10695
  404: {
9058
10696
  headers: {
@@ -9070,7 +10708,7 @@ interface paths {
9070
10708
  patch?: never;
9071
10709
  trace?: never;
9072
10710
  };
9073
- '/api/projects/{projectId}/chat/sessions': {
10711
+ '/api/packages': {
9074
10712
  parameters: {
9075
10713
  query?: never;
9076
10714
  header?: never;
@@ -9078,34 +10716,34 @@ interface paths {
9078
10716
  cookie?: never;
9079
10717
  };
9080
10718
  /**
9081
- * List chat sessions
9082
- * @description List the caller's recent chat sessions for a project, ordered by last activity. Requires member role and the chat feature.
10719
+ * Package catalog
10720
+ * @description Resolved `@walkeros/*` package catalog for the add-step picker, optionally filtered by type and platform.
9083
10721
  */
9084
10722
  get: {
9085
10723
  parameters: {
9086
10724
  query?: {
9087
- limit?: number;
9088
- offset?: number | null;
10725
+ /** @description Filter by package type. */
10726
+ type?: string;
10727
+ /** @description Filter by platform. */
10728
+ platform?: string;
9089
10729
  };
9090
10730
  header?: never;
9091
- path: {
9092
- projectId: string;
9093
- };
10731
+ path?: never;
9094
10732
  cookie?: never;
9095
10733
  };
9096
10734
  requestBody?: never;
9097
10735
  responses: {
9098
- /** @description Chat session list */
10736
+ /** @description Package catalog */
9099
10737
  200: {
9100
10738
  headers: {
9101
10739
  [name: string]: unknown;
9102
10740
  };
9103
10741
  content: {
9104
- 'application/json': components['schemas']['ListChatSessionsResponse'];
10742
+ 'application/json': components['schemas']['PackageCatalogResponse'];
9105
10743
  };
9106
10744
  };
9107
- /** @description Unauthorized */
9108
- 401: {
10745
+ /** @description Validation error */
10746
+ 400: {
9109
10747
  headers: {
9110
10748
  [name: string]: unknown;
9111
10749
  };
@@ -9113,8 +10751,8 @@ interface paths {
9113
10751
  'application/json': components['schemas']['ErrorResponse'];
9114
10752
  };
9115
10753
  };
9116
- /** @description Forbidden */
9117
- 403: {
10754
+ /** @description Package catalog unavailable */
10755
+ 502: {
9118
10756
  headers: {
9119
10757
  [name: string]: unknown;
9120
10758
  };
@@ -9132,7 +10770,7 @@ interface paths {
9132
10770
  patch?: never;
9133
10771
  trace?: never;
9134
10772
  };
9135
- '/api/projects/{projectId}/chat/sessions/{sessionId}': {
10773
+ '/api/packages/search': {
9136
10774
  parameters: {
9137
10775
  query?: never;
9138
10776
  header?: never;
@@ -9140,32 +10778,29 @@ interface paths {
9140
10778
  cookie?: never;
9141
10779
  };
9142
10780
  /**
9143
- * Get chat session
9144
- * @description Return a chat session and its full message history when the caller owns it. Foreign or unknown sessions return 404 (never 403) so existence is not leaked. Requires member role and the chat feature.
10781
+ * Search packages
10782
+ * @description Returns the full @walkeros/* package catalog; clients filter locally.
9145
10783
  */
9146
10784
  get: {
9147
10785
  parameters: {
9148
10786
  query?: never;
9149
10787
  header?: never;
9150
- path: {
9151
- projectId: string;
9152
- sessionId: string;
9153
- };
10788
+ path?: never;
9154
10789
  cookie?: never;
9155
10790
  };
9156
10791
  requestBody?: never;
9157
10792
  responses: {
9158
- /** @description Chat session with messages */
10793
+ /** @description Search results */
9159
10794
  200: {
9160
10795
  headers: {
9161
10796
  [name: string]: unknown;
9162
10797
  };
9163
10798
  content: {
9164
- 'application/json': components['schemas']['ChatSessionDetailResponse'];
10799
+ 'application/json': components['schemas']['PackageSearchResponse'];
9165
10800
  };
9166
10801
  };
9167
- /** @description Unauthorized */
9168
- 401: {
10802
+ /** @description Package search unavailable */
10803
+ 502: {
9169
10804
  headers: {
9170
10805
  [name: string]: unknown;
9171
10806
  };
@@ -9173,17 +10808,35 @@ interface paths {
9173
10808
  'application/json': components['schemas']['ErrorResponse'];
9174
10809
  };
9175
10810
  };
9176
- /** @description Forbidden */
9177
- 403: {
10811
+ };
10812
+ };
10813
+ put?: never;
10814
+ /**
10815
+ * Log a settled search
10816
+ * @description Records one settled search outcome (the term the user paused on and whether the catalog matched it). Fire-and-forget; returns 204.
10817
+ */
10818
+ post: {
10819
+ parameters: {
10820
+ query?: never;
10821
+ header?: never;
10822
+ path?: never;
10823
+ cookie?: never;
10824
+ };
10825
+ requestBody?: {
10826
+ content: {
10827
+ 'application/json': components['schemas']['PackageSearchLogRequest'];
10828
+ };
10829
+ };
10830
+ responses: {
10831
+ /** @description Search logged */
10832
+ 204: {
9178
10833
  headers: {
9179
10834
  [name: string]: unknown;
9180
10835
  };
9181
- content: {
9182
- 'application/json': components['schemas']['ErrorResponse'];
9183
- };
10836
+ content?: never;
9184
10837
  };
9185
- /** @description Not found */
9186
- 404: {
10838
+ /** @description Validation error */
10839
+ 400: {
9187
10840
  headers: {
9188
10841
  [name: string]: unknown;
9189
10842
  };
@@ -9193,15 +10846,13 @@ interface paths {
9193
10846
  };
9194
10847
  };
9195
10848
  };
9196
- put?: never;
9197
- post?: never;
9198
10849
  delete?: never;
9199
10850
  options?: never;
9200
10851
  head?: never;
9201
10852
  patch?: never;
9202
10853
  trace?: never;
9203
10854
  };
9204
- '/api/projects/{projectId}/chat/elicit': {
10855
+ '/api/observe/timing': {
9205
10856
  parameters: {
9206
10857
  query?: never;
9207
10858
  header?: never;
@@ -9211,32 +10862,28 @@ interface paths {
9211
10862
  get?: never;
9212
10863
  put?: never;
9213
10864
  /**
9214
- * Answer elicitation prompt
9215
- * @description Answer a pending MCP elicitation prompt (accept, decline, or cancel), unblocking the waiting tool invocation. Requires member role and the chat feature.
10865
+ * Report connect timing
10866
+ * @description Fire-and-forget beacon for client-side connect timing SLIs. No auth required; carries no secrets. Returns 204.
9216
10867
  */
9217
10868
  post: {
9218
10869
  parameters: {
9219
10870
  query?: never;
9220
10871
  header?: never;
9221
- path: {
9222
- projectId: string;
9223
- };
10872
+ path?: never;
9224
10873
  cookie?: never;
9225
10874
  };
9226
10875
  requestBody?: {
9227
10876
  content: {
9228
- 'application/json': components['schemas']['ElicitRequest'];
10877
+ 'application/json': components['schemas']['ObserveTimingRequest'];
9229
10878
  };
9230
10879
  };
9231
10880
  responses: {
9232
- /** @description Elicitation resolved */
9233
- 200: {
10881
+ /** @description Timing recorded */
10882
+ 204: {
9234
10883
  headers: {
9235
10884
  [name: string]: unknown;
9236
10885
  };
9237
- content: {
9238
- 'application/json': components['schemas']['ElicitResponse'];
9239
- };
10886
+ content?: never;
9240
10887
  };
9241
10888
  /** @description Validation error */
9242
10889
  400: {
@@ -9247,26 +10894,60 @@ interface paths {
9247
10894
  'application/json': components['schemas']['ErrorResponse'];
9248
10895
  };
9249
10896
  };
9250
- /** @description Unauthorized */
9251
- 401: {
10897
+ };
10898
+ };
10899
+ delete?: never;
10900
+ options?: never;
10901
+ head?: never;
10902
+ patch?: never;
10903
+ trace?: never;
10904
+ };
10905
+ '/api/oauth/register': {
10906
+ parameters: {
10907
+ query?: never;
10908
+ header?: never;
10909
+ path?: never;
10910
+ cookie?: never;
10911
+ };
10912
+ get?: never;
10913
+ put?: never;
10914
+ /**
10915
+ * Register a client
10916
+ * @description RFC 7591 dynamic client registration. Unauthenticated: a client registers itself before it holds any credential. Issues public clients only (`token_endpoint_auth_method: none`), which prove themselves with PKCE. Errors use the RFC 7591 section 3.2.2 shape, not the standard error envelope.
10917
+ */
10918
+ post: {
10919
+ parameters: {
10920
+ query?: never;
10921
+ header?: never;
10922
+ path?: never;
10923
+ cookie?: never;
10924
+ };
10925
+ requestBody?: {
10926
+ content: {
10927
+ 'application/json': components['schemas']['OAuthClientRegistrationRequest'];
10928
+ };
10929
+ };
10930
+ responses: {
10931
+ /** @description Client registered */
10932
+ 201: {
9252
10933
  headers: {
9253
10934
  [name: string]: unknown;
9254
10935
  };
9255
10936
  content: {
9256
- 'application/json': components['schemas']['ErrorResponse'];
10937
+ 'application/json': components['schemas']['OAuthClientRegistrationResponse'];
9257
10938
  };
9258
10939
  };
9259
- /** @description Forbidden */
9260
- 403: {
10940
+ /** @description Invalid client metadata or redirect URI */
10941
+ 400: {
9261
10942
  headers: {
9262
10943
  [name: string]: unknown;
9263
10944
  };
9264
10945
  content: {
9265
- 'application/json': components['schemas']['ErrorResponse'];
10946
+ 'application/json': components['schemas']['OAuthRegistrationError'];
9266
10947
  };
9267
10948
  };
9268
- /** @description Not found */
9269
- 404: {
10949
+ /** @description Registration ceiling reached (Retry-After header) */
10950
+ 429: {
9270
10951
  headers: {
9271
10952
  [name: string]: unknown;
9272
10953
  };
@@ -9282,50 +10963,79 @@ interface paths {
9282
10963
  patch?: never;
9283
10964
  trace?: never;
9284
10965
  };
9285
- '/api/mcp/tokens': {
10966
+ '/api/oauth/device_authorization': {
9286
10967
  parameters: {
9287
10968
  query?: never;
9288
10969
  header?: never;
9289
10970
  path?: never;
9290
10971
  cookie?: never;
9291
10972
  };
10973
+ get?: never;
10974
+ put?: never;
9292
10975
  /**
9293
- * List MCP tokens
9294
- * @description List the authenticated user's personal MCP tokens. No secret material is returned.
10976
+ * Start a device authorization
10977
+ * @description RFC 8628 section 3.1. A client that cannot host a browser redirect asks for a device code and a user code here, then polls the token endpoint while the person approves the user code at `/oauth/device`. Unauthenticated, and public clients only: the code is worth nothing until a signed-in person approves it. Body is `application/x-www-form-urlencoded`; errors use the RFC 6749 section 5.2 shape, not the standard error envelope.
9295
10978
  */
9296
- get: {
10979
+ post: {
9297
10980
  parameters: {
9298
10981
  query?: never;
9299
10982
  header?: never;
9300
10983
  path?: never;
9301
10984
  cookie?: never;
9302
10985
  };
9303
- requestBody?: never;
10986
+ requestBody?: {
10987
+ content: {
10988
+ 'application/x-www-form-urlencoded': components['schemas']['DeviceAuthorizationRequest'];
10989
+ };
10990
+ };
9304
10991
  responses: {
9305
- /** @description MCP token list */
10992
+ /** @description Device authorization opened */
9306
10993
  200: {
9307
10994
  headers: {
9308
10995
  [name: string]: unknown;
9309
10996
  };
9310
10997
  content: {
9311
- 'application/json': components['schemas']['ListMcpTokensResponse'];
10998
+ 'application/json': components['schemas']['DeviceAuthorizationResponse'];
9312
10999
  };
9313
11000
  };
9314
- /** @description Unauthorized */
11001
+ /** @description invalid_request, unauthorized_client, invalid_scope or invalid_target */
11002
+ 400: {
11003
+ headers: {
11004
+ [name: string]: unknown;
11005
+ };
11006
+ content: {
11007
+ 'application/json': components['schemas']['OAuthError'];
11008
+ };
11009
+ };
11010
+ /** @description invalid_client: unknown, revoked or confidential client */
9315
11011
  401: {
9316
11012
  headers: {
9317
11013
  [name: string]: unknown;
9318
11014
  };
9319
11015
  content: {
9320
- 'application/json': components['schemas']['ErrorResponse'];
11016
+ 'application/json': components['schemas']['OAuthError'];
9321
11017
  };
9322
11018
  };
9323
11019
  };
9324
11020
  };
11021
+ delete?: never;
11022
+ options?: never;
11023
+ head?: never;
11024
+ patch?: never;
11025
+ trace?: never;
11026
+ };
11027
+ '/api/oauth/token': {
11028
+ parameters: {
11029
+ query?: never;
11030
+ header?: never;
11031
+ path?: never;
11032
+ cookie?: never;
11033
+ };
11034
+ get?: never;
9325
11035
  put?: never;
9326
11036
  /**
9327
- * Issue MCP token
9328
- * @description Issue a personal MCP token. The raw token is returned exactly once and is never retrievable afterwards.
11037
+ * Exchange a grant for tokens
11038
+ * @description RFC 6749 section 3.2. Runs the authorization code, refresh token and device code grants. The client authenticates here: a public client with PKCE, a confidential one with HTTP Basic or a form secret. Body is `application/x-www-form-urlencoded` only; errors use the RFC 6749 section 5.2 shape, not the standard error envelope, and a failed Basic authentication is answered with a `WWW-Authenticate: Basic` challenge. Responses are never cacheable. Rate limited per `client_id`.
9329
11039
  */
9330
11040
  post: {
9331
11041
  parameters: {
@@ -9336,30 +11046,39 @@ interface paths {
9336
11046
  };
9337
11047
  requestBody?: {
9338
11048
  content: {
9339
- 'application/json': components['schemas']['CreateMcpTokenRequest'];
11049
+ 'application/x-www-form-urlencoded': components['schemas']['TokenRequest'];
9340
11050
  };
9341
11051
  };
9342
11052
  responses: {
9343
- /** @description MCP token issued */
9344
- 201: {
11053
+ /** @description Tokens issued */
11054
+ 200: {
9345
11055
  headers: {
9346
11056
  [name: string]: unknown;
9347
11057
  };
9348
11058
  content: {
9349
- 'application/json': components['schemas']['CreateMcpTokenResponse'];
11059
+ 'application/json': components['schemas']['TokenResponse'];
9350
11060
  };
9351
11061
  };
9352
- /** @description Validation error */
11062
+ /** @description invalid_request, invalid_grant, invalid_scope, invalid_target, unsupported_grant_type, or a device grant status (authorization_pending, slow_down, access_denied, expired_token) */
9353
11063
  400: {
9354
11064
  headers: {
9355
11065
  [name: string]: unknown;
9356
11066
  };
9357
11067
  content: {
9358
- 'application/json': components['schemas']['ErrorResponse'];
11068
+ 'application/json': components['schemas']['OAuthError'];
9359
11069
  };
9360
11070
  };
9361
- /** @description Unauthorized */
11071
+ /** @description invalid_client: unknown, revoked, or bad credentials */
9362
11072
  401: {
11073
+ headers: {
11074
+ [name: string]: unknown;
11075
+ };
11076
+ content: {
11077
+ 'application/json': components['schemas']['OAuthError'];
11078
+ };
11079
+ };
11080
+ /** @description Per-client token budget reached (Retry-After header) */
11081
+ 429: {
9363
11082
  headers: {
9364
11083
  [name: string]: unknown;
9365
11084
  };
@@ -9375,7 +11094,7 @@ interface paths {
9375
11094
  patch?: never;
9376
11095
  trace?: never;
9377
11096
  };
9378
- '/api/mcp/tokens/{tokenId}': {
11097
+ '/api/oauth/revoke': {
9379
11098
  parameters: {
9380
11099
  query?: never;
9381
11100
  header?: never;
@@ -9384,74 +11103,98 @@ interface paths {
9384
11103
  };
9385
11104
  get?: never;
9386
11105
  put?: never;
9387
- post?: never;
9388
11106
  /**
9389
- * Revoke MCP token
9390
- * @description Revoke a personal MCP token by id.
11107
+ * Revoke a token
11108
+ * @description RFC 7009. Client authentication is the same as at the token endpoint. A refresh token revokes its whole rotation family, an access token only itself. An authenticated request always answers 200 with an empty body, unknown tokens included: a distinguishable answer would be an oracle. Body is `application/x-www-form-urlencoded`.
9391
11109
  */
9392
- delete: {
11110
+ post: {
9393
11111
  parameters: {
9394
11112
  query?: never;
9395
11113
  header?: never;
9396
- path: {
9397
- tokenId: string;
9398
- };
11114
+ path?: never;
9399
11115
  cookie?: never;
9400
11116
  };
9401
- requestBody?: never;
11117
+ requestBody?: {
11118
+ content: {
11119
+ 'application/x-www-form-urlencoded': components['schemas']['RevocationRequest'];
11120
+ };
11121
+ };
9402
11122
  responses: {
9403
- /** @description MCP token revoked */
9404
- 204: {
11123
+ /** @description Revoked, or nothing matched */
11124
+ 200: {
9405
11125
  headers: {
9406
11126
  [name: string]: unknown;
9407
11127
  };
9408
11128
  content?: never;
9409
11129
  };
9410
- /** @description Unauthorized */
11130
+ /** @description invalid_request or unsupported_token_type */
11131
+ 400: {
11132
+ headers: {
11133
+ [name: string]: unknown;
11134
+ };
11135
+ content: {
11136
+ 'application/json': components['schemas']['OAuthError'];
11137
+ };
11138
+ };
11139
+ /** @description invalid_client: unknown, revoked, or bad credentials */
9411
11140
  401: {
9412
11141
  headers: {
9413
11142
  [name: string]: unknown;
9414
11143
  };
9415
11144
  content: {
9416
- 'application/json': components['schemas']['ErrorResponse'];
11145
+ 'application/json': components['schemas']['OAuthError'];
9417
11146
  };
9418
11147
  };
9419
11148
  };
9420
11149
  };
11150
+ delete?: never;
9421
11151
  options?: never;
9422
11152
  head?: never;
9423
11153
  patch?: never;
9424
11154
  trace?: never;
9425
11155
  };
9426
- '/api/projects/{projectId}/runners': {
11156
+ '/api/oauth/device/approve': {
9427
11157
  parameters: {
9428
11158
  query?: never;
9429
11159
  header?: never;
9430
11160
  path?: never;
9431
11161
  cookie?: never;
9432
11162
  };
11163
+ get?: never;
11164
+ put?: never;
9433
11165
  /**
9434
- * List runners (deprecated)
9435
- * @description Deprecated: runners migrated to deployments (origin=self-hosted). Always returns an empty list for backward compatibility. Requires member role.
11166
+ * Decide a device authorization
11167
+ * @description The person's approve or deny decision on a pending device authorization. Session only: a bearer credential is refused with 401 `SESSION_REQUIRED`, so a machine token can never approve its own device. Requires the `X-CSRF-Token` minted with the consent page, bound to this user code.
9436
11168
  */
9437
- get: {
11169
+ post: {
9438
11170
  parameters: {
9439
11171
  query?: never;
9440
11172
  header?: never;
9441
- path: {
9442
- projectId: string;
9443
- };
11173
+ path?: never;
9444
11174
  cookie?: never;
9445
11175
  };
9446
- requestBody?: never;
11176
+ requestBody?: {
11177
+ content: {
11178
+ 'application/json': components['schemas']['DeviceApprovalRequest'];
11179
+ };
11180
+ };
9447
11181
  responses: {
9448
- /** @description Empty runner list */
11182
+ /** @description Decision recorded */
9449
11183
  200: {
9450
11184
  headers: {
9451
11185
  [name: string]: unknown;
9452
11186
  };
9453
11187
  content: {
9454
- 'application/json': components['schemas']['ListRunnersResponse'];
11188
+ 'application/json': components['schemas']['DeviceApprovalResponse'];
11189
+ };
11190
+ };
11191
+ /** @description Validation error */
11192
+ 400: {
11193
+ headers: {
11194
+ [name: string]: unknown;
11195
+ };
11196
+ content: {
11197
+ 'application/json': components['schemas']['ErrorResponse'];
9455
11198
  };
9456
11199
  };
9457
11200
  /** @description Unauthorized */
@@ -9472,17 +11215,24 @@ interface paths {
9472
11215
  'application/json': components['schemas']['ErrorResponse'];
9473
11216
  };
9474
11217
  };
11218
+ /** @description Not found */
11219
+ 404: {
11220
+ headers: {
11221
+ [name: string]: unknown;
11222
+ };
11223
+ content: {
11224
+ 'application/json': components['schemas']['ErrorResponse'];
11225
+ };
11226
+ };
9475
11227
  };
9476
11228
  };
9477
- put?: never;
9478
- post?: never;
9479
11229
  delete?: never;
9480
11230
  options?: never;
9481
11231
  head?: never;
9482
11232
  patch?: never;
9483
11233
  trace?: never;
9484
11234
  };
9485
- '/api/projects/{projectId}/runners/heartbeat': {
11235
+ '/api/oauth/authorize': {
9486
11236
  parameters: {
9487
11237
  query?: never;
9488
11238
  header?: never;
@@ -9492,31 +11242,29 @@ interface paths {
9492
11242
  get?: never;
9493
11243
  put?: never;
9494
11244
  /**
9495
- * Runner heartbeat
9496
- * @description Accept a self-hosted runner heartbeat with usage counters. Authenticated by a flow+deployment-bound runner token. Updates deployment liveness and records an immutable usage row.
11245
+ * Decide a consent request
11246
+ * @description The person's allow or deny decision on the consent screen at `/oauth/authorize`. The ticket is the HMAC-signed authorization request that screen was rendered from, so the decision cannot alter what was validated, and it is bound to the person it was minted for. Session only: a bearer credential is refused with 401 `SESSION_REQUIRED`, so a machine token can never approve a consent. The response says where to send the browser: the client's registered redirect URI, carrying `code` on allow and `error=access_denied` on deny.
9497
11247
  */
9498
11248
  post: {
9499
11249
  parameters: {
9500
11250
  query?: never;
9501
11251
  header?: never;
9502
- path: {
9503
- projectId: string;
9504
- };
11252
+ path?: never;
9505
11253
  cookie?: never;
9506
11254
  };
9507
11255
  requestBody?: {
9508
11256
  content: {
9509
- 'application/json': components['schemas']['HeartbeatRequest'];
11257
+ 'application/json': components['schemas']['OAuthConsentDecisionRequest'];
9510
11258
  };
9511
11259
  };
9512
11260
  responses: {
9513
- /** @description Heartbeat accepted */
11261
+ /** @description Decision recorded */
9514
11262
  200: {
9515
11263
  headers: {
9516
11264
  [name: string]: unknown;
9517
11265
  };
9518
11266
  content: {
9519
- 'application/json': components['schemas']['RunnerHeartbeatResponse'];
11267
+ 'application/json': components['schemas']['OAuthConsentDecisionResponse'];
9520
11268
  };
9521
11269
  };
9522
11270
  /** @description Validation error */
@@ -9537,15 +11285,6 @@ interface paths {
9537
11285
  'application/json': components['schemas']['ErrorResponse'];
9538
11286
  };
9539
11287
  };
9540
- /** @description Not found */
9541
- 404: {
9542
- headers: {
9543
- [name: string]: unknown;
9544
- };
9545
- content: {
9546
- 'application/json': components['schemas']['ErrorResponse'];
9547
- };
9548
- };
9549
11288
  };
9550
11289
  };
9551
11290
  delete?: never;
@@ -9554,7 +11293,7 @@ interface paths {
9554
11293
  patch?: never;
9555
11294
  trace?: never;
9556
11295
  };
9557
- '/api/packages': {
11296
+ '/api/oauth/grants': {
9558
11297
  parameters: {
9559
11298
  query?: never;
9560
11299
  header?: never;
@@ -9562,34 +11301,29 @@ interface paths {
9562
11301
  cookie?: never;
9563
11302
  };
9564
11303
  /**
9565
- * Package catalog
9566
- * @description Resolved `@walkeros/*` package catalog for the add-step picker, optionally filtered by type and platform.
11304
+ * List connected apps
11305
+ * @description The apps the signed-in person has consented to, as the Connected apps page renders them. Revoked grants are absent. Session only: a bearer credential is refused with 401 `SESSION_REQUIRED`, so a machine token cannot read the connections its owner holds.
9567
11306
  */
9568
11307
  get: {
9569
11308
  parameters: {
9570
- query?: {
9571
- /** @description Filter by package type. */
9572
- type?: string;
9573
- /** @description Filter by platform. */
9574
- platform?: string;
9575
- };
11309
+ query?: never;
9576
11310
  header?: never;
9577
11311
  path?: never;
9578
11312
  cookie?: never;
9579
11313
  };
9580
11314
  requestBody?: never;
9581
11315
  responses: {
9582
- /** @description Package catalog */
11316
+ /** @description Connected apps */
9583
11317
  200: {
9584
11318
  headers: {
9585
11319
  [name: string]: unknown;
9586
11320
  };
9587
11321
  content: {
9588
- 'application/json': components['schemas']['PackageCatalogResponse'];
11322
+ 'application/json': components['schemas']['ListOAuthGrantsResponse'];
9589
11323
  };
9590
11324
  };
9591
- /** @description Validation error */
9592
- 400: {
11325
+ /** @description Unauthorized */
11326
+ 401: {
9593
11327
  headers: {
9594
11328
  [name: string]: unknown;
9595
11329
  };
@@ -9597,8 +11331,32 @@ interface paths {
9597
11331
  'application/json': components['schemas']['ErrorResponse'];
9598
11332
  };
9599
11333
  };
9600
- /** @description Package catalog unavailable */
9601
- 502: {
11334
+ };
11335
+ };
11336
+ put?: never;
11337
+ post?: never;
11338
+ /**
11339
+ * Disconnect every app
11340
+ * @description Revoke every grant this person holds and the tokens hanging from them. Automation tokens hang from no grant and survive. Session only: a bearer credential is refused with 401 `SESSION_REQUIRED`, so a read-scoped machine token cannot disconnect everything its owner has connected.
11341
+ */
11342
+ delete: {
11343
+ parameters: {
11344
+ query?: never;
11345
+ header?: never;
11346
+ path?: never;
11347
+ cookie?: never;
11348
+ };
11349
+ requestBody?: never;
11350
+ responses: {
11351
+ /** @description Apps disconnected */
11352
+ 204: {
11353
+ headers: {
11354
+ [name: string]: unknown;
11355
+ };
11356
+ content?: never;
11357
+ };
11358
+ /** @description Unauthorized */
11359
+ 401: {
9602
11360
  headers: {
9603
11361
  [name: string]: unknown;
9604
11362
  };
@@ -9608,15 +11366,60 @@ interface paths {
9608
11366
  };
9609
11367
  };
9610
11368
  };
11369
+ options?: never;
11370
+ head?: never;
11371
+ patch?: never;
11372
+ trace?: never;
11373
+ };
11374
+ '/api/oauth/grants/{grantId}': {
11375
+ parameters: {
11376
+ query?: never;
11377
+ header?: never;
11378
+ path?: never;
11379
+ cookie?: never;
11380
+ };
11381
+ get?: never;
9611
11382
  put?: never;
9612
11383
  post?: never;
9613
- delete?: never;
11384
+ /**
11385
+ * Disconnect one app
11386
+ * @description Revoke one grant and the tokens hanging from it. Idempotent: an unknown grant, another person's grant and an already revoked one all answer 204, and the token sweep runs either way, so pressing Disconnect twice cleans up a token minted inside the first press's window. Session only: a bearer credential is refused with 401 `SESSION_REQUIRED`.
11387
+ */
11388
+ delete: {
11389
+ parameters: {
11390
+ query?: never;
11391
+ header?: never;
11392
+ path: {
11393
+ grantId: string;
11394
+ };
11395
+ cookie?: never;
11396
+ };
11397
+ requestBody?: never;
11398
+ responses: {
11399
+ /** @description App disconnected */
11400
+ 204: {
11401
+ headers: {
11402
+ [name: string]: unknown;
11403
+ };
11404
+ content?: never;
11405
+ };
11406
+ /** @description Unauthorized */
11407
+ 401: {
11408
+ headers: {
11409
+ [name: string]: unknown;
11410
+ };
11411
+ content: {
11412
+ 'application/json': components['schemas']['ErrorResponse'];
11413
+ };
11414
+ };
11415
+ };
11416
+ };
9614
11417
  options?: never;
9615
11418
  head?: never;
9616
11419
  patch?: never;
9617
11420
  trace?: never;
9618
11421
  };
9619
- '/api/packages/search': {
11422
+ '/api/admin/oauth/clients': {
9620
11423
  parameters: {
9621
11424
  query?: never;
9622
11425
  header?: never;
@@ -9624,8 +11427,8 @@ interface paths {
9624
11427
  cookie?: never;
9625
11428
  };
9626
11429
  /**
9627
- * Search packages
9628
- * @description Returns the full @walkeros/* package catalog; clients filter locally.
11430
+ * List OAuth clients
11431
+ * @description Every registered OAuth client, revoked ones included. No secret material is returned. Admin only: a non-admin caller gets 404, not 403, so the endpoint does not confirm its own existence.
9629
11432
  */
9630
11433
  get: {
9631
11434
  parameters: {
@@ -9636,17 +11439,26 @@ interface paths {
9636
11439
  };
9637
11440
  requestBody?: never;
9638
11441
  responses: {
9639
- /** @description Search results */
11442
+ /** @description OAuth client list */
9640
11443
  200: {
9641
11444
  headers: {
9642
11445
  [name: string]: unknown;
9643
11446
  };
9644
11447
  content: {
9645
- 'application/json': components['schemas']['PackageSearchResponse'];
11448
+ 'application/json': components['schemas']['ListOAuthClientsResponse'];
9646
11449
  };
9647
11450
  };
9648
- /** @description Package search unavailable */
9649
- 502: {
11451
+ /** @description Unauthorized */
11452
+ 401: {
11453
+ headers: {
11454
+ [name: string]: unknown;
11455
+ };
11456
+ content: {
11457
+ 'application/json': components['schemas']['ErrorResponse'];
11458
+ };
11459
+ };
11460
+ /** @description Not found */
11461
+ 404: {
9650
11462
  headers: {
9651
11463
  [name: string]: unknown;
9652
11464
  };
@@ -9658,8 +11470,8 @@ interface paths {
9658
11470
  };
9659
11471
  put?: never;
9660
11472
  /**
9661
- * Log a settled search
9662
- * @description Records one settled search outcome (the term the user paused on and whether the catalog matched it). Fire-and-forget; returns 204.
11473
+ * Create a confidential OAuth client
11474
+ * @description Create an OAuth client that authenticates with a secret. The raw secret is returned exactly once and is never retrievable afterwards. Admin only: a non-admin caller gets 404, not 403.
9663
11475
  */
9664
11476
  post: {
9665
11477
  parameters: {
@@ -9670,16 +11482,18 @@ interface paths {
9670
11482
  };
9671
11483
  requestBody?: {
9672
11484
  content: {
9673
- 'application/json': components['schemas']['PackageSearchLogRequest'];
11485
+ 'application/json': components['schemas']['CreateOAuthClientRequest'];
9674
11486
  };
9675
11487
  };
9676
- responses: {
9677
- /** @description Search logged */
9678
- 204: {
11488
+ responses: {
11489
+ /** @description Client created */
11490
+ 201: {
9679
11491
  headers: {
9680
11492
  [name: string]: unknown;
9681
11493
  };
9682
- content?: never;
11494
+ content: {
11495
+ 'application/json': components['schemas']['CreateOAuthClientResponse'];
11496
+ };
9683
11497
  };
9684
11498
  /** @description Validation error */
9685
11499
  400: {
@@ -9690,6 +11504,24 @@ interface paths {
9690
11504
  'application/json': components['schemas']['ErrorResponse'];
9691
11505
  };
9692
11506
  };
11507
+ /** @description Unauthorized */
11508
+ 401: {
11509
+ headers: {
11510
+ [name: string]: unknown;
11511
+ };
11512
+ content: {
11513
+ 'application/json': components['schemas']['ErrorResponse'];
11514
+ };
11515
+ };
11516
+ /** @description Not found */
11517
+ 404: {
11518
+ headers: {
11519
+ [name: string]: unknown;
11520
+ };
11521
+ content: {
11522
+ 'application/json': components['schemas']['ErrorResponse'];
11523
+ };
11524
+ };
9693
11525
  };
9694
11526
  };
9695
11527
  delete?: never;
@@ -9698,7 +11530,7 @@ interface paths {
9698
11530
  patch?: never;
9699
11531
  trace?: never;
9700
11532
  };
9701
- '/api/observe/timing': {
11533
+ '/api/admin/oauth/clients/{clientId}': {
9702
11534
  parameters: {
9703
11535
  query?: never;
9704
11536
  header?: never;
@@ -9707,32 +11539,40 @@ interface paths {
9707
11539
  };
9708
11540
  get?: never;
9709
11541
  put?: never;
11542
+ post?: never;
9710
11543
  /**
9711
- * Report connect timing
9712
- * @description Fire-and-forget beacon for client-side connect timing SLIs. No auth required; carries no secrets. Returns 204.
11544
+ * Revoke an OAuth client
11545
+ * @description Revoke a client together with the grants consented to it and the tokens minted under them. Admin only: a non-admin caller gets 404, not 403, the same answer an unknown client id gets.
9713
11546
  */
9714
- post: {
11547
+ delete: {
9715
11548
  parameters: {
9716
11549
  query?: never;
9717
11550
  header?: never;
9718
- path?: never;
9719
- cookie?: never;
9720
- };
9721
- requestBody?: {
9722
- content: {
9723
- 'application/json': components['schemas']['ObserveTimingRequest'];
11551
+ path: {
11552
+ clientId: string;
9724
11553
  };
11554
+ cookie?: never;
9725
11555
  };
11556
+ requestBody?: never;
9726
11557
  responses: {
9727
- /** @description Timing recorded */
11558
+ /** @description Client revoked */
9728
11559
  204: {
9729
11560
  headers: {
9730
11561
  [name: string]: unknown;
9731
11562
  };
9732
11563
  content?: never;
9733
11564
  };
9734
- /** @description Validation error */
9735
- 400: {
11565
+ /** @description Unauthorized */
11566
+ 401: {
11567
+ headers: {
11568
+ [name: string]: unknown;
11569
+ };
11570
+ content: {
11571
+ 'application/json': components['schemas']['ErrorResponse'];
11572
+ };
11573
+ };
11574
+ /** @description Not found */
11575
+ 404: {
9736
11576
  headers: {
9737
11577
  [name: string]: unknown;
9738
11578
  };
@@ -9742,7 +11582,6 @@ interface paths {
9742
11582
  };
9743
11583
  };
9744
11584
  };
9745
- delete?: never;
9746
11585
  options?: never;
9747
11586
  head?: never;
9748
11587
  patch?: never;
@@ -10127,6 +11966,10 @@ interface components {
10127
11966
  */
10128
11967
  updatedAt: string;
10129
11968
  };
11969
+ DeploySettingsRequest: {
11970
+ flow?: string;
11971
+ humanText?: string;
11972
+ };
10130
11973
  DeploySettingsResponse: {
10131
11974
  deploymentId: string;
10132
11975
  /** @example cfg_a1b2c3d4 */
@@ -10295,9 +12138,9 @@ interface components {
10295
12138
  | 'active'
10296
12139
  | 'stopped'
10297
12140
  | 'failed';
10298
- currentVersion: components['schemas']['DeploymentVersionDetail'];
12141
+ currentVersion: components['schemas']['DeploymentVersionDetail'] | null;
10299
12142
  versions: components['schemas']['DeploymentVersionHistoryEntry'][];
10300
- error: components['schemas']['DeploymentError'];
12143
+ error: components['schemas']['DeploymentError'] | null;
10301
12144
  recentErrors?:
10302
12145
  | {
10303
12146
  message: string;
@@ -10342,7 +12185,7 @@ interface components {
10342
12185
  /** Format: date-time */
10343
12186
  publishedAt: string;
10344
12187
  publishedBy: string | null;
10345
- } | null;
12188
+ };
10346
12189
  DeploymentVersionHistoryEntry: {
10347
12190
  versionNumber: number;
10348
12191
  status: string;
@@ -10363,7 +12206,7 @@ interface components {
10363
12206
  */
10364
12207
  phase: 'preflight' | 'deploy' | 'bundle' | 'publish' | 'provision';
10365
12208
  detail?: string;
10366
- } | null;
12209
+ };
10367
12210
  CreateDeploymentResponse: {
10368
12211
  /** @example dep_a1b2c3d4 */
10369
12212
  id: string;
@@ -10568,9 +12411,48 @@ interface components {
10568
12411
  /** Format: date-time */
10569
12412
  createdAt: string;
10570
12413
  createdBy: string | null;
12414
+ createdByLabel: string | null;
12415
+ rationale?: components['schemas']['ReleaseRationaleSummary'] | null;
10571
12416
  };
10572
- ListVersionAnnotationsResponse: {
10573
- annotations: components['schemas']['VersionAnnotation'][];
12417
+ ReleaseRationaleSummary: {
12418
+ hasHumanText: boolean;
12419
+ hasGeneratedSummary: boolean;
12420
+ firstLine: string | null;
12421
+ };
12422
+ ReleaseContentResponse: {
12423
+ /** @example ver_a1b2c3d4 */
12424
+ versionId: string;
12425
+ /** @example 22 */
12426
+ versionNumber: number;
12427
+ content: components['schemas']['FlowConfig'];
12428
+ /**
12429
+ * Format: date-time
12430
+ * @example 2026-01-26T14:30:00.000Z
12431
+ */
12432
+ createdAt: string;
12433
+ /** @enum {string} */
12434
+ createdBy: 'user' | 'auto_save' | 'restore' | 'deploy' | 'preview';
12435
+ };
12436
+ ReleaseDiff: {
12437
+ /** @example ver_a1b2c3d4 */
12438
+ prevVersionId: string;
12439
+ prevVersionNumber: number;
12440
+ text: string;
12441
+ contentIdentical: boolean;
12442
+ };
12443
+ ReleaseDetailResponse: {
12444
+ /** @example ver_a1b2c3d4 */
12445
+ versionId: string;
12446
+ versionNumber: number;
12447
+ contentHash: string | null;
12448
+ /**
12449
+ * Format: date-time
12450
+ * @example 2026-01-26T14:30:00.000Z
12451
+ */
12452
+ createdAt: string;
12453
+ createdBy: string;
12454
+ rationale: components['schemas']['VersionAnnotation'] | null;
12455
+ diff: components['schemas']['ReleaseDiff'] | null;
10574
12456
  };
10575
12457
  VersionAnnotation: {
10576
12458
  /** @example ver_a1b2c3d4 */
@@ -10590,6 +12472,9 @@ interface components {
10590
12472
  */
10591
12473
  updatedAt: string;
10592
12474
  };
12475
+ ListVersionAnnotationsResponse: {
12476
+ annotations: components['schemas']['VersionAnnotation'][];
12477
+ };
10593
12478
  UpsertVersionAnnotationResponse: {
10594
12479
  /** @example ver_a1b2c3d4 */
10595
12480
  versionId: string;
@@ -10616,75 +12501,414 @@ interface components {
10616
12501
  /** @example thr_a1b2c3d4 */
10617
12502
  id: string;
10618
12503
  /**
10619
- * @example release
12504
+ * @example release
12505
+ * @enum {string}
12506
+ */
12507
+ anchorType: 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
12508
+ anchorKey: string;
12509
+ anchorLabel: string;
12510
+ /**
12511
+ * @example open
12512
+ * @enum {string}
12513
+ */
12514
+ status: 'open' | 'resolved';
12515
+ resolvedByVersionId: string | null;
12516
+ resolvedByVersionNumber: number | null;
12517
+ /**
12518
+ * Format: date-time
12519
+ * @example 2026-01-26T14:30:00.000Z
12520
+ */
12521
+ resolvedAt: string | null;
12522
+ resolvedBy: string | null;
12523
+ createdBy: string;
12524
+ /**
12525
+ * Format: date-time
12526
+ * @example 2026-01-26T14:30:00.000Z
12527
+ */
12528
+ createdAt: string;
12529
+ /**
12530
+ * Format: date-time
12531
+ * @example 2026-01-26T14:30:00.000Z
12532
+ */
12533
+ updatedAt: string;
12534
+ messageCount: number;
12535
+ messages?: components['schemas']['HubMessage'][];
12536
+ hasMoreMessages?: boolean;
12537
+ };
12538
+ HubMessage: {
12539
+ id: string;
12540
+ /** @example user_a1b2c3d4 */
12541
+ author: string;
12542
+ text: string;
12543
+ /**
12544
+ * Format: date-time
12545
+ * @example 2026-01-26T14:30:00.000Z
12546
+ */
12547
+ createdAt: string;
12548
+ };
12549
+ HubThreadResponse: {
12550
+ /** @example thr_a1b2c3d4 */
12551
+ id: string;
12552
+ /**
12553
+ * @example release
12554
+ * @enum {string}
12555
+ */
12556
+ anchorType: 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
12557
+ anchorKey: string;
12558
+ anchorLabel: string;
12559
+ /**
12560
+ * @example open
12561
+ * @enum {string}
12562
+ */
12563
+ status: 'open' | 'resolved';
12564
+ resolvedByVersionId: string | null;
12565
+ resolvedByVersionNumber: number | null;
12566
+ /**
12567
+ * Format: date-time
12568
+ * @example 2026-01-26T14:30:00.000Z
12569
+ */
12570
+ resolvedAt: string | null;
12571
+ resolvedBy: string | null;
12572
+ createdBy: string;
12573
+ /**
12574
+ * Format: date-time
12575
+ * @example 2026-01-26T14:30:00.000Z
12576
+ */
12577
+ createdAt: string;
12578
+ /**
12579
+ * Format: date-time
12580
+ * @example 2026-01-26T14:30:00.000Z
12581
+ */
12582
+ updatedAt: string;
12583
+ messageCount: number;
12584
+ messages?: components['schemas']['HubMessage'][];
12585
+ hasMoreMessages?: boolean;
12586
+ };
12587
+ ListKnowledgeResponse: {
12588
+ entries: components['schemas']['KnowledgeEntry'][];
12589
+ hasMoreEntries: boolean;
12590
+ };
12591
+ KnowledgeEntry:
12592
+ | components['schemas']['KnowledgeThread']
12593
+ | components['schemas']['KnowledgeDescription'];
12594
+ KnowledgeThread: {
12595
+ id: string;
12596
+ anchorKey: string;
12597
+ anchorLabel: string;
12598
+ frameId: string | null;
12599
+ frameName: string | null;
12600
+ flowId: string | null;
12601
+ subjectKey: string | null;
12602
+ spatial: components['schemas']['KnowledgeSpatial'] | null;
12603
+ validity: components['schemas']['KnowledgeValidity'];
12604
+ /** @enum {string} */
12605
+ freshness: 'current' | 'subject_changed' | 'unknown';
12606
+ author: components['schemas']['KnowledgeAuthor'];
12607
+ /** @enum {string} */
12608
+ source: 'tag_mode' | 'hub' | 'mcp';
12609
+ /**
12610
+ * Format: date-time
12611
+ * @example 2026-01-26T14:30:00.000Z
12612
+ */
12613
+ updatedAt: string;
12614
+ /**
12615
+ * @description discriminator enum property added by openapi-typescript
12616
+ * @enum {string}
12617
+ */
12618
+ kind: 'thread';
12619
+ /**
12620
+ * @example tag
12621
+ * @enum {string}
12622
+ */
12623
+ anchorType:
12624
+ | 'step'
12625
+ | 'entity_action'
12626
+ | 'release'
12627
+ | 'contract'
12628
+ | 'tag'
12629
+ | 'page';
12630
+ /**
12631
+ * @example open
12632
+ * @enum {string}
12633
+ */
12634
+ status: 'open' | 'resolved';
12635
+ /**
12636
+ * Format: date-time
12637
+ * @example 2026-01-26T14:30:00.000Z
12638
+ */
12639
+ createdAt: string;
12640
+ messageCount: number;
12641
+ messages?: components['schemas']['KnowledgeMessage'][];
12642
+ hasMoreMessages?: boolean;
12643
+ };
12644
+ KnowledgeSpatial: {
12645
+ at: {
12646
+ x: number;
12647
+ y: number;
12648
+ };
12649
+ element?: {
12650
+ [key: string]: unknown;
12651
+ };
12652
+ };
12653
+ KnowledgeValidity:
12654
+ | {
12655
+ /** @enum {string} */
12656
+ tier: 'release';
12657
+ versionId: string;
12658
+ versionNumber: number;
12659
+ promoted: boolean;
12660
+ }
12661
+ | {
12662
+ /** @enum {string} */
12663
+ tier: 'draft';
12664
+ versionId?: string;
12665
+ }
12666
+ | {
12667
+ /** @enum {string} */
12668
+ tier: 'none';
12669
+ };
12670
+ KnowledgeAuthor: {
12671
+ /** @enum {string} */
12672
+ kind: 'user' | 'preview' | 'agent';
12673
+ id: string | null;
12674
+ label: string;
12675
+ };
12676
+ KnowledgeMessage: {
12677
+ id: string;
12678
+ /** @example user_a1b2c3d4 */
12679
+ author: string;
12680
+ /** @example ayla@elbwalker.com */
12681
+ authorLabel: string;
12682
+ text: string;
12683
+ /**
12684
+ * Format: date-time
12685
+ * @example 2026-01-26T14:30:00.000Z
12686
+ */
12687
+ createdAt: string;
12688
+ clientMessageId: string | null;
12689
+ };
12690
+ KnowledgeDescription: {
12691
+ id: string;
12692
+ anchorKey: string;
12693
+ anchorLabel: string;
12694
+ frameId: string | null;
12695
+ frameName: string | null;
12696
+ flowId: string | null;
12697
+ subjectKey: string | null;
12698
+ spatial: components['schemas']['KnowledgeSpatial'] | null;
12699
+ validity: components['schemas']['KnowledgeValidity'];
12700
+ /** @enum {string} */
12701
+ freshness: 'current' | 'subject_changed' | 'unknown';
12702
+ author: components['schemas']['KnowledgeAuthor'];
12703
+ /** @enum {string} */
12704
+ source: 'tag_mode' | 'hub' | 'mcp';
12705
+ /**
12706
+ * Format: date-time
12707
+ * @example 2026-01-26T14:30:00.000Z
12708
+ */
12709
+ updatedAt: string;
12710
+ /**
12711
+ * @description discriminator enum property added by openapi-typescript
12712
+ * @enum {string}
12713
+ */
12714
+ kind: 'description';
12715
+ /**
12716
+ * @example tag
12717
+ * @enum {string}
12718
+ */
12719
+ anchorType: 'tag' | 'page';
12720
+ body: string;
12721
+ };
12722
+ KnowledgeThreadResponse: {
12723
+ id: string;
12724
+ anchorKey: string;
12725
+ anchorLabel: string;
12726
+ frameId: string | null;
12727
+ frameName: string | null;
12728
+ flowId: string | null;
12729
+ subjectKey: string | null;
12730
+ spatial: components['schemas']['KnowledgeSpatial'] | null;
12731
+ validity: components['schemas']['KnowledgeValidity'];
12732
+ /** @enum {string} */
12733
+ freshness: 'current' | 'subject_changed' | 'unknown';
12734
+ author: components['schemas']['KnowledgeAuthor'];
12735
+ /** @enum {string} */
12736
+ source: 'tag_mode' | 'hub' | 'mcp';
12737
+ /**
12738
+ * Format: date-time
12739
+ * @example 2026-01-26T14:30:00.000Z
12740
+ */
12741
+ updatedAt: string;
12742
+ /** @enum {string} */
12743
+ kind: 'thread';
12744
+ /**
12745
+ * @example tag
10620
12746
  * @enum {string}
10621
12747
  */
10622
- anchorType: 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
10623
- anchorKey: string;
10624
- anchorLabel: string;
12748
+ anchorType:
12749
+ | 'step'
12750
+ | 'entity_action'
12751
+ | 'release'
12752
+ | 'contract'
12753
+ | 'tag'
12754
+ | 'page';
10625
12755
  /**
10626
12756
  * @example open
10627
12757
  * @enum {string}
10628
12758
  */
10629
12759
  status: 'open' | 'resolved';
10630
- resolvedByVersionId: string | null;
10631
- resolvedByVersionNumber: number | null;
10632
- /**
10633
- * Format: date-time
10634
- * @example 2026-01-26T14:30:00.000Z
10635
- */
10636
- resolvedAt: string | null;
10637
- resolvedBy: string | null;
10638
- createdBy: string;
10639
12760
  /**
10640
12761
  * Format: date-time
10641
12762
  * @example 2026-01-26T14:30:00.000Z
10642
12763
  */
10643
12764
  createdAt: string;
12765
+ messageCount: number;
12766
+ messages?: components['schemas']['KnowledgeMessage'][];
12767
+ hasMoreMessages?: boolean;
12768
+ };
12769
+ KnowledgeDescriptionResponse: {
12770
+ id: string;
12771
+ anchorKey: string;
12772
+ anchorLabel: string;
12773
+ frameId: string | null;
12774
+ frameName: string | null;
12775
+ flowId: string | null;
12776
+ subjectKey: string | null;
12777
+ spatial: components['schemas']['KnowledgeSpatial'] | null;
12778
+ validity: components['schemas']['KnowledgeValidity'];
12779
+ /** @enum {string} */
12780
+ freshness: 'current' | 'subject_changed' | 'unknown';
12781
+ author: components['schemas']['KnowledgeAuthor'];
12782
+ /** @enum {string} */
12783
+ source: 'tag_mode' | 'hub' | 'mcp';
10644
12784
  /**
10645
12785
  * Format: date-time
10646
12786
  * @example 2026-01-26T14:30:00.000Z
10647
12787
  */
10648
12788
  updatedAt: string;
10649
- messageCount: number;
10650
- messages?: components['schemas']['HubMessage'][];
10651
- hasMoreMessages?: boolean;
12789
+ /** @enum {string} */
12790
+ kind: 'description';
12791
+ /**
12792
+ * @example tag
12793
+ * @enum {string}
12794
+ */
12795
+ anchorType: 'tag' | 'page';
12796
+ body: string;
10652
12797
  };
10653
- HubMessage: {
12798
+ FrameInput: {
12799
+ name: string;
12800
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
12801
+ parentId: string | null;
12802
+ placements: components['schemas']['FramePlacement'][];
12803
+ size: components['schemas']['PlanSize'];
12804
+ marks: {
12805
+ [key: string]: unknown;
12806
+ };
12807
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
12808
+ extends: string | null;
12809
+ source: components['schemas']['FrameSource'];
12810
+ /** @enum {string} */
12811
+ origin: 'drawn' | 'imported' | 'observed';
12812
+ flowId: string | null;
12813
+ };
12814
+ FramePlacement: {
10654
12815
  id: string;
10655
- /** @example user_a1b2c3d4 */
10656
- author: string;
10657
- text: string;
12816
+ rect: components['schemas']['PlanRect'];
12817
+ selector?: string;
12818
+ anchor?: {
12819
+ [key: string]: unknown;
12820
+ };
12821
+ };
12822
+ PlanRect: {
12823
+ x: number;
12824
+ y: number;
12825
+ w: number;
12826
+ h: number;
12827
+ };
12828
+ PlanSize: {
12829
+ width: number;
12830
+ height: number;
12831
+ };
12832
+ FrameSource:
12833
+ | {
12834
+ /** @enum {string} */
12835
+ kind: 'page';
12836
+ key: string;
12837
+ url: string;
12838
+ }
12839
+ | {
12840
+ /** @enum {string} */
12841
+ kind: 'figma';
12842
+ fileKey: string;
12843
+ nodeId: string;
12844
+ }
12845
+ | {
12846
+ /** @enum {string} */
12847
+ kind: 'image';
12848
+ }
12849
+ | null;
12850
+ Frame: {
12851
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
12852
+ id: string;
12853
+ projectId: string;
12854
+ name: string;
12855
+ parentId: string | null;
12856
+ placements: components['schemas']['FramePlacement'][];
12857
+ size: components['schemas']['PlanSize'];
12858
+ marks: {
12859
+ [key: string]: unknown;
12860
+ };
12861
+ extends: string | null;
12862
+ source: components['schemas']['FrameSource'];
12863
+ /** @enum {string} */
12864
+ origin: 'drawn' | 'imported' | 'observed';
12865
+ flowId: string | null;
12866
+ screenshot: components['schemas']['FrameScreenshot'] | null;
12867
+ version: number;
10658
12868
  /**
10659
12869
  * Format: date-time
10660
12870
  * @example 2026-01-26T14:30:00.000Z
10661
12871
  */
10662
12872
  createdAt: string;
10663
- };
10664
- HubThreadResponse: {
10665
- /** @example thr_a1b2c3d4 */
10666
- id: string;
10667
12873
  /**
10668
- * @example release
10669
- * @enum {string}
12874
+ * Format: date-time
12875
+ * @example 2026-01-26T14:30:00.000Z
10670
12876
  */
10671
- anchorType: 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
10672
- anchorKey: string;
10673
- anchorLabel: string;
12877
+ updatedAt: string;
12878
+ createdBy: string;
12879
+ updatedBy: string;
10674
12880
  /**
10675
- * @example open
10676
- * @enum {string}
12881
+ * Format: date-time
12882
+ * @example 2026-01-26T14:30:00.000Z
10677
12883
  */
10678
- status: 'open' | 'resolved';
10679
- resolvedByVersionId: string | null;
10680
- resolvedByVersionNumber: number | null;
12884
+ deletedAt: string | null;
12885
+ };
12886
+ FrameScreenshot: {
12887
+ assetId: string;
10681
12888
  /**
10682
12889
  * Format: date-time
10683
12890
  * @example 2026-01-26T14:30:00.000Z
10684
12891
  */
10685
- resolvedAt: string | null;
10686
- resolvedBy: string | null;
10687
- createdBy: string;
12892
+ capturedAt: string;
12893
+ size: components['schemas']['PlanSize'];
12894
+ dpr: number;
12895
+ capturedRect: components['schemas']['PlanRect'];
12896
+ };
12897
+ FrameLean: {
12898
+ /** @example frm_V1StGXR8Z5jdHi6BmyT7K */
12899
+ id: string;
12900
+ projectId: string;
12901
+ name: string;
12902
+ parentId: string | null;
12903
+ placements: components['schemas']['FramePlacement'][];
12904
+ size: components['schemas']['PlanSize'];
12905
+ extends: string | null;
12906
+ source: components['schemas']['FrameSource'];
12907
+ /** @enum {string} */
12908
+ origin: 'drawn' | 'imported' | 'observed';
12909
+ flowId: string | null;
12910
+ screenshot: components['schemas']['FrameScreenshot'] | null;
12911
+ version: number;
10688
12912
  /**
10689
12913
  * Format: date-time
10690
12914
  * @example 2026-01-26T14:30:00.000Z
@@ -10695,9 +12919,30 @@ interface components {
10695
12919
  * @example 2026-01-26T14:30:00.000Z
10696
12920
  */
10697
12921
  updatedAt: string;
10698
- messageCount: number;
10699
- messages?: components['schemas']['HubMessage'][];
10700
- hasMoreMessages?: boolean;
12922
+ createdBy: string;
12923
+ updatedBy: string;
12924
+ /**
12925
+ * Format: date-time
12926
+ * @example 2026-01-26T14:30:00.000Z
12927
+ */
12928
+ deletedAt: string | null;
12929
+ };
12930
+ FrameListResponse: {
12931
+ frames: components['schemas']['Frame'][];
12932
+ };
12933
+ FrameLeanListResponse: {
12934
+ frames: components['schemas']['FrameLean'][];
12935
+ };
12936
+ PutFrameResponse: {
12937
+ version: number;
12938
+ };
12939
+ FrameConflictResponse: {
12940
+ error: {
12941
+ /** @enum {string} */
12942
+ code: 'FRAME_VERSION_CONFLICT';
12943
+ message: string;
12944
+ };
12945
+ head: components['schemas']['Frame'];
10701
12946
  };
10702
12947
  SummarizeReleaseResponse: {
10703
12948
  /** @enum {string} */
@@ -10822,8 +13067,8 @@ interface components {
10822
13067
  observedFlowName: string | null;
10823
13068
  serverFlowName: string | null;
10824
13069
  serverEndpoint: string | null;
10825
- web: components['schemas']['ObserveSessionWeb'];
10826
- server: components['schemas']['ObserveSessionServer'];
13070
+ web: components['schemas']['ObserveSessionWeb'] | null;
13071
+ server: components['schemas']['ObserveSessionServer'] | null;
10827
13072
  /** Format: date-time */
10828
13073
  expiresAt: string;
10829
13074
  recordsReceived: number;
@@ -10841,12 +13086,12 @@ interface components {
10841
13086
  /** Format: uri */
10842
13087
  url?: string;
10843
13088
  binding?: string;
10844
- } | null;
13089
+ };
10845
13090
  ObserveSessionServer: {
10846
13091
  /** Format: uri */
10847
13092
  endpoint: string | null;
10848
13093
  env: components['schemas']['ObserveSessionServerEnv'];
10849
- } | null;
13094
+ };
10850
13095
  ObserveSessionServerEnv: {
10851
13096
  /** Format: uri */
10852
13097
  WALKEROS_OBSERVER_URL: string;
@@ -11936,6 +14181,21 @@ interface components {
11936
14181
  DeclineInvitationResponse: {
11937
14182
  message: string;
11938
14183
  };
14184
+ ScreenshotUploadResponse: {
14185
+ /** @example fas_V1StGXR8Z5jdHi6BmyT7K */
14186
+ assetId: string;
14187
+ reused: boolean;
14188
+ };
14189
+ FrameScreenshotMeta: {
14190
+ /**
14191
+ * Format: date-time
14192
+ * @example 2026-01-26T14:30:00.000Z
14193
+ */
14194
+ capturedAt: string;
14195
+ size: components['schemas']['PlanSize'];
14196
+ dpr: number;
14197
+ capturedRect: components['schemas']['PlanRect'];
14198
+ };
11939
14199
  HeartbeatRequest: {
11940
14200
  /** @example a1b2c3d4e5f6 */
11941
14201
  instanceId: string;
@@ -11982,6 +14242,211 @@ interface components {
11982
14242
  message: string;
11983
14243
  }[];
11984
14244
  };
14245
+ OAuthClientRegistrationResponse: {
14246
+ /** @example client_abc */
14247
+ client_id: string;
14248
+ /** @example 1725400000 */
14249
+ client_id_issued_at: number;
14250
+ client_name: string;
14251
+ redirect_uris: string[];
14252
+ /** @enum {string} */
14253
+ token_endpoint_auth_method: 'none';
14254
+ grant_types: string[];
14255
+ response_types: string[];
14256
+ };
14257
+ OAuthRegistrationError: {
14258
+ /** @enum {string} */
14259
+ error: 'invalid_client_metadata' | 'invalid_redirect_uri';
14260
+ error_description: string;
14261
+ };
14262
+ OAuthClientRegistrationRequest: {
14263
+ /**
14264
+ * @example [
14265
+ * "https://claude.ai/api/mcp/auth_callback"
14266
+ * ]
14267
+ */
14268
+ redirect_uris: string[];
14269
+ client_name?: string;
14270
+ /** @enum {string} */
14271
+ token_endpoint_auth_method?: 'none';
14272
+ grant_types?: ('authorization_code' | 'refresh_token')[];
14273
+ response_types?: 'code'[];
14274
+ /** Format: uri */
14275
+ client_uri?: string;
14276
+ /** Format: uri */
14277
+ logo_uri?: string;
14278
+ scope?: string;
14279
+ software_id?: string;
14280
+ software_version?: string;
14281
+ };
14282
+ DeviceAuthorizationResponse: {
14283
+ device_code: string;
14284
+ /** @example WDJB-MJHT */
14285
+ user_code: string;
14286
+ verification_uri: string;
14287
+ verification_uri_complete: string;
14288
+ /** @example 900 */
14289
+ expires_in: number;
14290
+ /** @example 5 */
14291
+ interval: number;
14292
+ };
14293
+ OAuthError: {
14294
+ /** @example invalid_client */
14295
+ error: string;
14296
+ error_description: string;
14297
+ };
14298
+ DeviceAuthorizationRequest: {
14299
+ /** @example walkeros-cli */
14300
+ client_id: string;
14301
+ /** @example read write offline_access */
14302
+ scope?: string;
14303
+ /** @example https://app.walkeros.io/api */
14304
+ resource?: string;
14305
+ };
14306
+ TokenResponse: {
14307
+ access_token: string;
14308
+ /** @enum {string} */
14309
+ token_type: 'Bearer';
14310
+ /** @example 3600 */
14311
+ expires_in: number;
14312
+ refresh_token?: string;
14313
+ /** @example read write offline_access */
14314
+ scope: string;
14315
+ };
14316
+ TokenRequest: {
14317
+ /**
14318
+ * @example authorization_code
14319
+ * @enum {string}
14320
+ */
14321
+ grant_type:
14322
+ | 'authorization_code'
14323
+ | 'refresh_token'
14324
+ | 'urn:ietf:params:oauth:grant-type:device_code';
14325
+ /** @example walkeros-cli */
14326
+ client_id?: string;
14327
+ client_secret?: string;
14328
+ code?: string;
14329
+ redirect_uri?: string;
14330
+ code_verifier?: string;
14331
+ refresh_token?: string;
14332
+ device_code?: string;
14333
+ /** @example read offline_access */
14334
+ scope?: string;
14335
+ /** @example https://app.walkeros.io/api */
14336
+ resource?: string;
14337
+ };
14338
+ RevocationRequest: {
14339
+ token: string;
14340
+ /** @enum {string} */
14341
+ token_type_hint?: 'access_token' | 'refresh_token';
14342
+ client_id?: string;
14343
+ client_secret?: string;
14344
+ };
14345
+ DeviceApprovalResponse: {
14346
+ /** @enum {boolean} */
14347
+ success: true;
14348
+ /** @enum {string} */
14349
+ decision: 'approve' | 'deny';
14350
+ };
14351
+ DeviceApprovalRequest: {
14352
+ /** @example WDJB-MJHT */
14353
+ userCode: string;
14354
+ /** @enum {string} */
14355
+ decision: 'approve' | 'deny';
14356
+ };
14357
+ OAuthConsentDecisionResponse: {
14358
+ /** @example https://claude.ai/api/mcp/auth_callback?code=abc&state=xyz */
14359
+ redirectTo: string;
14360
+ };
14361
+ OAuthConsentDecisionRequest: {
14362
+ ticket: string;
14363
+ /** @enum {string} */
14364
+ decision: 'allow' | 'deny';
14365
+ };
14366
+ ListOAuthGrantsResponse: {
14367
+ grants: components['schemas']['OAuthGrantSummary'][];
14368
+ };
14369
+ OAuthGrantSummary: {
14370
+ id: string;
14371
+ clientId: string;
14372
+ clientName: string;
14373
+ scope: string[];
14374
+ /**
14375
+ * Format: date-time
14376
+ * @example 2026-01-26T14:30:00.000Z
14377
+ */
14378
+ createdAt: string;
14379
+ /**
14380
+ * Format: date-time
14381
+ * @example 2026-01-26T14:30:00.000Z
14382
+ */
14383
+ lastUsedAt: string | null;
14384
+ };
14385
+ ListOAuthClientsResponse: {
14386
+ clients: components['schemas']['OAuthClientSummary'][];
14387
+ };
14388
+ OAuthClientSummary: {
14389
+ clientId: string;
14390
+ /** @enum {string} */
14391
+ kind: 'dcr' | 'cimd' | 'confidential' | 'builtin';
14392
+ name: string;
14393
+ redirectUris: string[];
14394
+ grantTypes: string[];
14395
+ /** @enum {string} */
14396
+ tokenEndpointAuthMethod:
14397
+ | 'none'
14398
+ | 'client_secret_basic'
14399
+ | 'client_secret_post';
14400
+ allowedResources: ('mcp' | 'api')[];
14401
+ /**
14402
+ * Format: date-time
14403
+ * @example 2026-01-26T14:30:00.000Z
14404
+ */
14405
+ revokedAt: string | null;
14406
+ };
14407
+ CreateOAuthClientResponse: {
14408
+ clientId: string;
14409
+ /** @enum {string} */
14410
+ kind: 'dcr' | 'cimd' | 'confidential' | 'builtin';
14411
+ name: string;
14412
+ redirectUris: string[];
14413
+ grantTypes: string[];
14414
+ /** @enum {string} */
14415
+ tokenEndpointAuthMethod:
14416
+ | 'none'
14417
+ | 'client_secret_basic'
14418
+ | 'client_secret_post';
14419
+ allowedResources: ('mcp' | 'api')[];
14420
+ /**
14421
+ * Format: date-time
14422
+ * @example 2026-01-26T14:30:00.000Z
14423
+ */
14424
+ revokedAt: string | null;
14425
+ clientSecret: string;
14426
+ };
14427
+ CreateOAuthClientRequest: {
14428
+ name: string;
14429
+ redirectUris: string[];
14430
+ /**
14431
+ * @default [
14432
+ * "authorization_code",
14433
+ * "refresh_token"
14434
+ * ]
14435
+ */
14436
+ grantTypes: ('authorization_code' | 'refresh_token')[];
14437
+ /**
14438
+ * @default [
14439
+ * "mcp",
14440
+ * "api"
14441
+ * ]
14442
+ */
14443
+ allowedResources: ('mcp' | 'api')[];
14444
+ /**
14445
+ * @default client_secret_basic
14446
+ * @enum {string}
14447
+ */
14448
+ authMethod: 'client_secret_basic' | 'client_secret_post';
14449
+ };
11985
14450
  };
11986
14451
  responses: never;
11987
14452
  parameters: never;
@@ -12492,6 +14957,20 @@ interface WrapSkeletonOptions {
12492
14957
  }
12493
14958
  declare function wrapSkeleton(options: WrapSkeletonOptions): Promise<void>;
12494
14959
 
14960
+ interface DeviceAuthorization {
14961
+ deviceCode: string;
14962
+ userCode: string;
14963
+ verificationUri: string;
14964
+ verificationUriComplete: string;
14965
+ expiresIn: number;
14966
+ interval: number;
14967
+ }
14968
+ /**
14969
+ * RFC 8628 section 3.1. Ask for a device code and the URL to send the person
14970
+ * to. Unauthenticated: the code is worth nothing until somebody approves it.
14971
+ */
14972
+ declare function startDeviceAuthorization(appUrl: string, fetchFn?: typeof fetch): Promise<DeviceAuthorization>;
14973
+
12495
14974
  declare function createApiClient(): openapi_fetch.Client<paths, `${string}/${string}`>;
12496
14975
 
12497
14976
  /**
@@ -12523,8 +15002,8 @@ interface HealthResult {
12523
15002
  }
12524
15003
  /**
12525
15004
  * Tokenless reachability + contract probe of the app's PUBLIC `/api/health`
12526
- * route. Uses a plain `fetch` (never `createApiClient`, which throws logged
12527
- * out) and defensively parses the JSON body. Resolves `{ reachable: false }`
15005
+ * route. Uses a plain `fetch` (never `createApiClient`, whose every request
15006
+ * rejects without a credential) and defensively parses the JSON body. Resolves `{ reachable: false }`
12528
15007
  * only on a real network/timeout failure; a non-2xx status still counts as
12529
15008
  * reachable.
12530
15009
  */
@@ -12731,6 +15210,117 @@ interface EndObserveSessionOptions {
12731
15210
  */
12732
15211
  declare function endObserveSession(options: EndObserveSessionOptions): Promise<void>;
12733
15212
 
15213
+ type VersionAnnotation = components['schemas']['VersionAnnotation'];
15214
+ type StepHistoryResponse = components['schemas']['StepHistoryResponse'];
15215
+ type ListHubThreadsResponse = components['schemas']['ListHubThreadsResponse'];
15216
+ type HubThreadResponse = components['schemas']['HubThreadResponse'];
15217
+ type ListKnowledgeResponse = components['schemas']['ListKnowledgeResponse'];
15218
+ /** The rationale summary a release index row carries when asked for one. */
15219
+ type ReleaseRationaleSummary = components['schemas']['ReleaseRationaleSummary'];
15220
+ /** The release index. Each row carries `rationale` when one was asked for. */
15221
+ type ReleaseIndexResponse = components['schemas']['ListFlowReleasesResponse'];
15222
+ /** The diff a release carries against its spine predecessor. */
15223
+ type ReleaseDiffResponse = components['schemas']['ReleaseDiff'];
15224
+ /** One release in full: rationale plus the diff the server computed. */
15225
+ type ReleaseDetailResponse = components['schemas']['ReleaseDetailResponse'];
15226
+ interface ListReleasesOptions {
15227
+ projectId?: string;
15228
+ flowId: string;
15229
+ limit?: number;
15230
+ offset?: number;
15231
+ }
15232
+ /** The release index WITH its rationale summary. Requires the hub feature. */
15233
+ declare function listReleases(options: ListReleasesOptions): Promise<ReleaseIndexResponse>;
15234
+ /** How a release is addressed: by spine id, or by spine number. */
15235
+ type ReleaseRef = {
15236
+ versionId: string;
15237
+ } | {
15238
+ versionNumber: number;
15239
+ };
15240
+ interface GetReleaseOptions {
15241
+ projectId?: string;
15242
+ flowId: string;
15243
+ ref: ReleaseRef;
15244
+ }
15245
+ /**
15246
+ * One release in full: rationale plus the diff the SERVER computed against the
15247
+ * spine predecessor. The path segment is the id or the number; the app decides
15248
+ * which it was.
15249
+ */
15250
+ declare function getRelease(options: GetReleaseOptions): Promise<ReleaseDetailResponse>;
15251
+ interface ListStepHistoryOptions {
15252
+ projectId?: string;
15253
+ flowId: string;
15254
+ step: string;
15255
+ flow?: string;
15256
+ limit?: number;
15257
+ }
15258
+ declare function listStepHistory(options: ListStepHistoryOptions): Promise<StepHistoryResponse>;
15259
+ interface SetReleaseRationaleOptions {
15260
+ projectId?: string;
15261
+ flowId: string;
15262
+ versionId: string;
15263
+ text: string;
15264
+ }
15265
+ declare function setReleaseRationale(options: SetReleaseRationaleOptions): Promise<VersionAnnotation>;
15266
+ type ThreadAnchorType = 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
15267
+ type ThreadStatus = 'open' | 'resolved';
15268
+ interface ListThreadsOptions {
15269
+ projectId?: string;
15270
+ flowId: string;
15271
+ anchorType?: ThreadAnchorType;
15272
+ anchorKey?: string;
15273
+ status?: ThreadStatus;
15274
+ includeMessages: boolean;
15275
+ limit?: number;
15276
+ }
15277
+ declare function listThreads(options: ListThreadsOptions): Promise<ListHubThreadsResponse>;
15278
+ interface CreateThreadOptions {
15279
+ projectId?: string;
15280
+ flowId: string;
15281
+ anchorType: ThreadAnchorType;
15282
+ anchorKey: string;
15283
+ anchorLabel?: string;
15284
+ text: string;
15285
+ }
15286
+ declare function createThread(options: CreateThreadOptions): Promise<HubThreadResponse>;
15287
+ interface AddThreadMessageOptions {
15288
+ projectId?: string;
15289
+ flowId: string;
15290
+ threadId: string;
15291
+ text: string;
15292
+ }
15293
+ declare function addThreadMessage(options: AddThreadMessageOptions): Promise<HubThreadResponse>;
15294
+ interface ListKnowledgeOptions {
15295
+ projectId?: string;
15296
+ pageKey?: string;
15297
+ frameId?: string;
15298
+ markId?: string;
15299
+ includeMessages: boolean;
15300
+ limit?: number;
15301
+ }
15302
+ declare function listKnowledge(options: ListKnowledgeOptions): Promise<ListKnowledgeResponse>;
15303
+
15304
+ type FrameResponse = components['schemas']['Frame'];
15305
+ type FrameListResponse = components['schemas']['FrameListResponse'];
15306
+ type FrameLeanListResponse = components['schemas']['FrameLeanListResponse'];
15307
+ interface ListFramesOptions {
15308
+ projectId?: string;
15309
+ }
15310
+ /** Every live frame of the project, without marks. Requires the frames feature. */
15311
+ declare function listFrames(options?: ListFramesOptions): Promise<FrameLeanListResponse>;
15312
+ interface ListPageFramesOptions {
15313
+ projectId?: string;
15314
+ pageKey: string;
15315
+ }
15316
+ /** The frames of one page at any depth, with their marks. */
15317
+ declare function listPageFrames(options: ListPageFramesOptions): Promise<FrameListResponse>;
15318
+ interface GetFrameOptions {
15319
+ projectId?: string;
15320
+ frameId: string;
15321
+ }
15322
+ declare function getFrame(options: GetFrameOptions): Promise<FrameResponse>;
15323
+
12734
15324
  interface ListSecretsOptions {
12735
15325
  projectId?: string;
12736
15326
  flowId: string;
@@ -12760,7 +15350,18 @@ declare function deleteSecret(options: DeleteSecretOptions): Promise<{
12760
15350
  }>;
12761
15351
 
12762
15352
  interface WalkerOSConfig {
15353
+ /**
15354
+ * Static bearer written by the pre-OAuth CLI. Honored until it expires, and
15355
+ * the first use in a process prints a one-line notice naming
15356
+ * `walkeros login`, which replaces it with a refreshable session.
15357
+ */
12763
15358
  token?: string;
15359
+ /** Short-lived bearer from the device authorization grant. */
15360
+ accessToken?: string;
15361
+ /** ISO 8601 instant at which `accessToken` stops being accepted. */
15362
+ accessTokenExpiresAt?: string;
15363
+ /** Single-use credential that buys a new `accessToken`. */
15364
+ refreshToken?: string;
12764
15365
  email?: string;
12765
15366
  appUrl?: string;
12766
15367
  anonymousFeedback?: boolean;
@@ -12783,9 +15384,24 @@ interface WalkerOSConfig {
12783
15384
  */
12784
15385
  declare function readConfig(): WalkerOSConfig | null;
12785
15386
  /**
12786
- * Write config to disk with 0600 permissions
15387
+ * Merge `config` into the stored config and write the result.
15388
+ *
15389
+ * Merging rather than replacing, because the file holds fields owned by
15390
+ * unrelated commands: a writer that knows only about tokens would otherwise
15391
+ * drop `defaultProjectId`, `installationId`, `telemetryEnabled` and
15392
+ * `anonymousFeedback` every time somebody logs in.
15393
+ *
15394
+ * A key passed explicitly as `undefined` is removed from the written file,
15395
+ * which is how login drops the legacy static token it replaces.
12787
15396
  */
12788
15397
  declare function writeConfig(config: WalkerOSConfig): void;
15398
+ /**
15399
+ * Remove every credential field, keeping the rest of the config.
15400
+ *
15401
+ * Used when the stored session is known to be dead, so the next command can
15402
+ * say "run `walkeros login`" instead of failing against the API.
15403
+ */
15404
+ declare function clearAuthFields(): void;
12789
15405
  /**
12790
15406
  * Delete the config file (logout)
12791
15407
  */
@@ -13076,4 +15692,4 @@ declare module '@walkeros/core' {
13076
15692
  }
13077
15693
  }
13078
15694
 
13079
- export { ApiError, type ApiErrorDetail, type BuildOptions, type BundleStats, type CLIBuildOptions, type ClientContext, type ClientType, type CompareContractInput, type ContractComparison, type ContractVerdict, type CreatePreviewOptions, type CreateSecretOptions, type DeletePreviewOptions, type DeleteSecretOptions, type DeployOptions, DeploymentAmbiguityError, type DeploymentSummaryForFlow, type DeviceCodeOptions, type DeviceCodeResult, type EndObserveSessionOptions, type ExampleLookupResult, type FeedbackOptions, type GetObserveSessionOptions, type GetPreviewOptions, type GlobalOptions, type HealthResult, type ListDeploymentsOptions, type ListFlowsOptions, type ListJourneysOptions, type ListPreviewsOptions, type ListProjectsOptions, type ListSecretsOptions, type MinifyOptions, type PollOptions, type PollResult, type PrepareInput, type PreparedFlow, type ProjectFlows, type PushResult, type RegrantPreviewOptions, type RunCommandOptions, type RunOptions, type RunResult, type SSEEvent, type SSEParseResult, type SimulateCollectorOptions, type SimulateDataOptions, type SimulateDestinationOptions, type SimulateSourceOptions, type SimulateTransformerOptions, type StartObserveSessionOptions, type UpdateSecretOptions, VERSION, type ValidateResult, type ValidationError, type ValidationType, type ValidationWarning, type WalkerOSConfig, type WrapSkeletonOptions, annotateErrorWithDrift, apiFetch, bakedContractHash, bakedContractVersion, buildDataPayload, bundle, bundleCommand, canonicalContractHash, classifyStepProperties, clientContextHeaders, compareContract, compareOutput, containsCodeMarkers, createApiClient, createDeployCommand, createDeployment, createDeploymentCommand, createFlow, createFlowCommand, createPreview, createProject, createProjectCommand, createSecret, deleteConfig, deleteDeployment, deleteDeploymentByFlowId, deleteDeploymentCommand, deleteFlow, deleteFlowCommand, deletePreview, deleteProject, deleteProjectCommand, deleteSecret, deploy, deployCommand, deployFetch, duplicateFlow, duplicateFlowCommand, endObserveSession, feedback, feedbackCommand, fetchHealth, findExample, getAuthHeaders, getClientContext, getDefaultProject, getDeployment, getDeploymentBySlug, getDeploymentBySlugCommand, getDeploymentCommand, getFeedbackPreference, getFlow, getFlowCommand, getObserveSession, getPreview, getProject, getProjectCommand, getToken, listAllFlows, listDeployments, listDeploymentsCommand, listFlows, listFlowsCommand, listJourneys, listPreviews, listProjects, listProjectsCommand, listSecrets, loadConfig, loadJsonConfig, loginCommand, logoutCommand, mergeAuthHeaders, parseSSEEvents, pollForToken, publicFetch, push, pushCommand, readConfig, regrantPreview, requestDeviceCode, requireProjectId, resetClientContext, resolveAppUrl, resolveToken, run, runCommand, setClientContext, setDefaultProject, setFeedbackPreference, simulateCollector, simulateDestination, simulateSource, simulateTransformer, startObserveSession, index as telemetry, telemetryDisableCommand, telemetryEnableCommand, telemetryStatusCommand, throwApiError, updateFlow, updateFlowCommand, updateProject, updateProjectCommand, updateSecret, validate, validateCommand, validateFlowStructure, whoami, whoamiCommand, wrapSkeleton, writeConfig };
15695
+ export { type AddThreadMessageOptions, ApiError, type ApiErrorDetail, type BuildOptions, type BundleStats, type CLIBuildOptions, type ClientContext, type ClientType, type CompareContractInput, type CompleteDeviceLoginOptions, type ContractComparison, type ContractVerdict, type CreatePreviewOptions, type CreateSecretOptions, type CreateThreadOptions, type DeletePreviewOptions, type DeleteSecretOptions, type DeployOptions, DeploymentAmbiguityError, type DeploymentSummaryForFlow, type DeviceAuthorization, type DeviceLoginResult, type EndObserveSessionOptions, type ExampleLookupResult, type FeedbackOptions, type GetFrameOptions, type GetObserveSessionOptions, type GetPreviewOptions, type GetReleaseOptions, type GlobalOptions, type HealthResult, type ListDeploymentsOptions, type ListFlowsOptions, type ListFramesOptions, type ListJourneysOptions, type ListKnowledgeOptions, type ListPageFramesOptions, type ListPreviewsOptions, type ListProjectsOptions, type ListReleasesOptions, type ListSecretsOptions, type ListStepHistoryOptions, type ListThreadsOptions, type LoginOptions, type LoginResult, type MinifyOptions, type PrepareInput, type PreparedFlow, type ProjectFlows, type PushResult, type RegrantPreviewOptions, type ReleaseDetailResponse, type ReleaseDiffResponse, type ReleaseIndexResponse, type ReleaseRationaleSummary, type ReleaseRef, type RunCommandOptions, type RunOptions, type RunResult, type SSEEvent, type SSEParseResult, type SetReleaseRationaleOptions, type SimulateCollectorOptions, type SimulateDataOptions, type SimulateDestinationOptions, type SimulateSourceOptions, type SimulateTransformerOptions, type StartObserveSessionOptions, type ThreadAnchorType, type ThreadStatus, type UpdateSecretOptions, VERSION, type ValidateResult, type ValidationError, type ValidationType, type ValidationWarning, type WalkerOSConfig, type WrapSkeletonOptions, addThreadMessage, annotateErrorWithDrift, apiFetch, bakedContractHash, bakedContractVersion, buildDataPayload, bundle, bundleCommand, canonicalContractHash, classifyStepProperties, clearAuthFields, clientContextHeaders, compareContract, compareOutput, completeDeviceLogin, containsCodeMarkers, createApiClient, createDeployCommand, createDeployment, createDeploymentCommand, createFlow, createFlowCommand, createPreview, createProject, createProjectCommand, createSecret, createThread, credentialSource, deleteConfig, deleteDeployment, deleteDeploymentByFlowId, deleteDeploymentCommand, deleteFlow, deleteFlowCommand, deletePreview, deleteProject, deleteProjectCommand, deleteSecret, deploy, deployCommand, deployFetch, duplicateFlow, duplicateFlowCommand, endObserveSession, feedback, feedbackCommand, fetchHealth, findExample, getAuthHeaders, getClientContext, getDefaultProject, getDeployment, getDeploymentBySlug, getDeploymentBySlugCommand, getDeploymentCommand, getFeedbackPreference, getFlow, getFlowCommand, getFrame, getObserveSession, getPreview, getProject, getProjectCommand, getRelease, listAllFlows, listDeployments, listDeploymentsCommand, listFlows, listFlowsCommand, listFrames, listJourneys, listKnowledge, listPageFrames, listPreviews, listProjects, listProjectsCommand, listReleases, listSecrets, listStepHistory, listThreads, loadConfig, loadJsonConfig, login, loginCommand, logout, logoutCommand, mergeAuthHeaders, parseSSEEvents, publicFetch, push, pushCommand, readConfig, regrantPreview, requireProjectId, resetClientContext, resolveAccessToken, resolveAppUrl, resolveToken, run, runCommand, setClientContext, setDefaultProject, setFeedbackPreference, setReleaseRationale, simulateCollector, simulateDestination, simulateSource, simulateTransformer, startDeviceAuthorization, startObserveSession, index as telemetry, telemetryDisableCommand, telemetryEnableCommand, telemetryStatusCommand, throwApiError, updateFlow, updateFlowCommand, updateProject, updateProjectCommand, updateSecret, validate, validateCommand, validateFlowStructure, whoami, whoamiCommand, wrapSkeleton, writeConfig };