@walkeros/mcp 4.5.0 → 4.5.1-next-1788726985928

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/README.md CHANGED
@@ -76,7 +76,7 @@ five run locally:
76
76
 
77
77
  ## Tools
78
78
 
79
- The server registers 17 tools.
79
+ The server registers 19 tools.
80
80
 
81
81
  ### Local, no account
82
82
 
@@ -103,6 +103,8 @@ The server registers 17 tools.
103
103
  | `secret_manage` | Manage a flow's `$secret.<NAME>` values. Write-mostly, values are never returned |
104
104
  | `observe_session` | Start, inspect, or stop an Observe session, a time-boxed window on one running flow |
105
105
  | `observe_journeys` | Read the assembled journeys for an observed flow, each event traced across web and server |
106
+ | `hub_manage` | Read a flow's release history and the reasoning behind it, and add to the discussion |
107
+ | `frame_manage` | Read the frames of a measurement plan, the named rectangles and the marks inside them |
106
108
  | `feedback` | Send feedback about walkerOS |
107
109
 
108
110
  ## Resources
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ListFlowsOptions, ListPreviewsOptions, GetPreviewOptions, CreatePreviewOptions, DeletePreviewOptions, ListSecretsOptions, CreateSecretOptions, UpdateSecretOptions, DeleteSecretOptions, DeployOptions, ListDeploymentsOptions, DeviceCodeResult, PollResult, FeedbackOptions } from '@walkeros/cli';
2
2
  import { Journey, JourneyGap, JourneyUnattributed } from '@walkeros/core';
3
- import { ZodRawShape } from 'zod';
3
+ import { ZodRawShape, z } from 'zod';
4
4
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
5
  export { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { WebStandardStreamableHTTPServerTransportOptions } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
@@ -107,6 +107,237 @@ interface ObserveSessionRef {
107
107
  flowId: string;
108
108
  sessionId: string;
109
109
  }
110
+ type ThreadAnchorType = 'step' | 'entity_action' | 'release' | 'contract' | 'tag';
111
+ type StoredAnchorType = ThreadAnchorType | 'page';
112
+ type ThreadStatus = 'open' | 'resolved';
113
+ type ReleaseRef = {
114
+ versionId: string;
115
+ } | {
116
+ versionNumber: number;
117
+ };
118
+ interface ReleaseRationaleSummaryWire {
119
+ hasHumanText: boolean;
120
+ hasGeneratedSummary: boolean;
121
+ firstLine: string | null;
122
+ }
123
+ interface FlowReleaseWire {
124
+ id: string;
125
+ deploymentId: string;
126
+ deploymentSlug: string | null;
127
+ deploymentType: string | null;
128
+ versionNumber: number;
129
+ flowVersionId: string | null;
130
+ flowVersionNumber: number | null;
131
+ status: string;
132
+ source: string;
133
+ errorCode: string | null;
134
+ createdAt: string;
135
+ createdBy: string | null;
136
+ createdByLabel: string | null;
137
+ /** Present only on a read that asked for rationale. */
138
+ rationale?: ReleaseRationaleSummaryWire | null;
139
+ }
140
+ interface ReleaseIndexWire {
141
+ releases: FlowReleaseWire[];
142
+ total: number;
143
+ limit: number;
144
+ offset: number;
145
+ }
146
+ interface VersionAnnotationWire {
147
+ versionId: string;
148
+ humanText: string | null;
149
+ generatedSummary: string | null;
150
+ author: string;
151
+ createdAt: string;
152
+ updatedAt: string;
153
+ }
154
+ interface ReleaseDiffWire {
155
+ prevVersionId: string;
156
+ prevVersionNumber: number;
157
+ text: string;
158
+ contentIdentical: boolean;
159
+ }
160
+ interface ReleaseDetailWire {
161
+ versionId: string;
162
+ versionNumber: number;
163
+ contentHash: string | null;
164
+ createdAt: string;
165
+ createdBy: string;
166
+ rationale: VersionAnnotationWire | null;
167
+ diff: ReleaseDiffWire | null;
168
+ }
169
+ interface StepHistoryEntryWire {
170
+ versionId: string;
171
+ versionNumber: number;
172
+ createdAt: string;
173
+ flow: string | null;
174
+ change: 'added' | 'removed' | 'changed';
175
+ humanText: string | null;
176
+ generatedSummary: string | null;
177
+ }
178
+ interface StepHistoryWire {
179
+ step: string;
180
+ flow: string | null;
181
+ entries: StepHistoryEntryWire[];
182
+ scanned: number;
183
+ truncated: boolean;
184
+ entriesTruncated: boolean;
185
+ knownSteps?: string[];
186
+ }
187
+ interface HubMessageWire {
188
+ id: string;
189
+ author: string;
190
+ text: string;
191
+ createdAt: string;
192
+ }
193
+ interface HubThreadWire {
194
+ id: string;
195
+ anchorType: ThreadAnchorType;
196
+ anchorKey: string;
197
+ anchorLabel: string;
198
+ status: ThreadStatus;
199
+ resolvedByVersionId: string | null;
200
+ resolvedByVersionNumber: number | null;
201
+ resolvedAt: string | null;
202
+ resolvedBy: string | null;
203
+ createdBy: string;
204
+ createdAt: string;
205
+ updatedAt: string;
206
+ messageCount: number;
207
+ messages?: HubMessageWire[];
208
+ hasMoreMessages?: boolean;
209
+ }
210
+ interface ListThreadsWire {
211
+ threads: HubThreadWire[];
212
+ hasMoreThreads: boolean;
213
+ }
214
+ type KnowledgeValidityWire = {
215
+ tier: 'release';
216
+ versionId: string;
217
+ versionNumber: number;
218
+ promoted: boolean;
219
+ } | {
220
+ tier: 'draft';
221
+ versionId?: string;
222
+ } | {
223
+ tier: 'none';
224
+ };
225
+ interface KnowledgeAuthorWire {
226
+ kind: 'user' | 'preview' | 'agent';
227
+ id: string | null;
228
+ label: string;
229
+ }
230
+ interface KnowledgeMessageWire {
231
+ id: string;
232
+ author: string;
233
+ authorLabel: string;
234
+ text: string;
235
+ createdAt: string;
236
+ clientMessageId: string | null;
237
+ }
238
+ interface KnowledgeEntryBaseWire {
239
+ id: string;
240
+ anchorKey: string;
241
+ anchorLabel: string;
242
+ frameId: string | null;
243
+ frameName: string | null;
244
+ flowId: string | null;
245
+ subjectKey: string | null;
246
+ /** Opaque DOM anchor plus a fractional point. Never surfaced by a tool. */
247
+ spatial: {
248
+ at: {
249
+ x: number;
250
+ y: number;
251
+ };
252
+ element?: Record<string, unknown>;
253
+ } | null;
254
+ validity: KnowledgeValidityWire;
255
+ freshness: 'current' | 'subject_changed' | 'unknown';
256
+ author: KnowledgeAuthorWire;
257
+ source: 'tag_mode' | 'hub' | 'mcp';
258
+ updatedAt: string;
259
+ }
260
+ interface KnowledgeThreadWire extends KnowledgeEntryBaseWire {
261
+ kind: 'thread';
262
+ anchorType: StoredAnchorType;
263
+ status: ThreadStatus;
264
+ createdAt: string;
265
+ messageCount: number;
266
+ messages?: KnowledgeMessageWire[];
267
+ hasMoreMessages?: boolean;
268
+ }
269
+ interface KnowledgeDescriptionWire extends KnowledgeEntryBaseWire {
270
+ kind: 'description';
271
+ anchorType: 'tag' | 'page';
272
+ body: string;
273
+ }
274
+ type KnowledgeEntryWire = KnowledgeThreadWire | KnowledgeDescriptionWire;
275
+ interface ListKnowledgeWire {
276
+ entries: KnowledgeEntryWire[];
277
+ hasMoreEntries: boolean;
278
+ }
279
+ interface PlanSizeWire {
280
+ width: number;
281
+ height: number;
282
+ }
283
+ interface PlanRectWire {
284
+ x: number;
285
+ y: number;
286
+ w: number;
287
+ h: number;
288
+ }
289
+ interface FramePlacementWire {
290
+ id: string;
291
+ rect: PlanRectWire;
292
+ selector?: string;
293
+ anchor?: Record<string, unknown>;
294
+ }
295
+ type FrameSourceWire = {
296
+ kind: 'page';
297
+ key: string;
298
+ url: string;
299
+ } | {
300
+ kind: 'figma';
301
+ fileKey: string;
302
+ nodeId: string;
303
+ } | {
304
+ kind: 'image';
305
+ };
306
+ interface FrameScreenshotWire {
307
+ assetId: string;
308
+ capturedAt: string;
309
+ size: PlanSizeWire;
310
+ dpr: number;
311
+ capturedRect: PlanRectWire;
312
+ }
313
+ interface FrameLeanWire {
314
+ id: string;
315
+ projectId: string;
316
+ name: string;
317
+ parentId: string | null;
318
+ placements: FramePlacementWire[];
319
+ size: PlanSizeWire;
320
+ extends: string | null;
321
+ source: FrameSourceWire | null;
322
+ origin: 'drawn' | 'imported' | 'observed';
323
+ flowId: string | null;
324
+ screenshot: FrameScreenshotWire | null;
325
+ version: number;
326
+ createdAt: string;
327
+ updatedAt: string;
328
+ createdBy: string;
329
+ updatedBy: string;
330
+ deletedAt: string | null;
331
+ }
332
+ interface FrameWire extends FrameLeanWire {
333
+ marks: Record<string, unknown>;
334
+ }
335
+ interface FrameListWire {
336
+ frames: FrameWire[];
337
+ }
338
+ interface FrameLeanListWire {
339
+ frames: FrameLeanWire[];
340
+ }
110
341
  /**
111
342
  * Transport-agnostic client for network-reach MCP tools. The stdio build
112
343
  * plugs in HttpToolClient (talks to the walkerOS app over HTTPS via the
@@ -211,6 +442,72 @@ interface ToolClient {
211
442
  startObserveSession?(options: StartObserveSessionOptions): Promise<ObserveSessionResult>;
212
443
  getObserveSession?(options: ObserveSessionRef): Promise<ObserveSessionResult>;
213
444
  endObserveSession?(options: ObserveSessionRef): Promise<void>;
445
+ listReleases(options: {
446
+ projectId: string;
447
+ flowId: string;
448
+ limit?: number;
449
+ offset?: number;
450
+ }): Promise<ReleaseIndexWire>;
451
+ getRelease(options: {
452
+ projectId: string;
453
+ flowId: string;
454
+ ref: ReleaseRef;
455
+ }): Promise<ReleaseDetailWire>;
456
+ listStepHistory(options: {
457
+ projectId: string;
458
+ flowId: string;
459
+ step: string;
460
+ flow?: string;
461
+ limit?: number;
462
+ }): Promise<StepHistoryWire>;
463
+ setReleaseRationale(options: {
464
+ projectId: string;
465
+ flowId: string;
466
+ versionId: string;
467
+ text: string;
468
+ }): Promise<VersionAnnotationWire>;
469
+ listThreads(options: {
470
+ projectId: string;
471
+ flowId: string;
472
+ anchorType?: ThreadAnchorType;
473
+ anchorKey?: string;
474
+ status?: ThreadStatus;
475
+ includeMessages: boolean;
476
+ limit?: number;
477
+ }): Promise<ListThreadsWire>;
478
+ createThread(options: {
479
+ projectId: string;
480
+ flowId: string;
481
+ anchorType: ThreadAnchorType;
482
+ anchorKey: string;
483
+ anchorLabel?: string;
484
+ text: string;
485
+ }): Promise<HubThreadWire>;
486
+ addThreadMessage(options: {
487
+ projectId: string;
488
+ flowId: string;
489
+ threadId: string;
490
+ text: string;
491
+ }): Promise<HubThreadWire>;
492
+ listKnowledge(options: {
493
+ projectId: string;
494
+ pageKey?: string;
495
+ frameId?: string;
496
+ markId?: string;
497
+ includeMessages: boolean;
498
+ limit?: number;
499
+ }): Promise<ListKnowledgeWire>;
500
+ listFrames(options: {
501
+ projectId: string;
502
+ }): Promise<FrameLeanListWire>;
503
+ listPageFrames(options: {
504
+ projectId: string;
505
+ pageKey: string;
506
+ }): Promise<FrameListWire>;
507
+ getFrame(options: {
508
+ projectId: string;
509
+ frameId: string;
510
+ }): Promise<FrameWire>;
214
511
  requestDeviceCode(): Promise<DeviceCodeResult>;
215
512
  pollForToken(deviceCode: string, options?: {
216
513
  timeoutMs?: number;
@@ -381,6 +678,72 @@ declare class HttpToolClient implements ToolClient {
381
678
  startObserveSession(options: StartObserveSessionOptions): Promise<ObserveSessionResult>;
382
679
  getObserveSession(options: ObserveSessionRef): Promise<ObserveSessionResult>;
383
680
  endObserveSession(options: ObserveSessionRef): Promise<void>;
681
+ listReleases(options: {
682
+ projectId: string;
683
+ flowId: string;
684
+ limit?: number;
685
+ offset?: number;
686
+ }): Promise<ReleaseIndexWire>;
687
+ getRelease(options: {
688
+ projectId: string;
689
+ flowId: string;
690
+ ref: ReleaseRef;
691
+ }): Promise<ReleaseDetailWire>;
692
+ listStepHistory(options: {
693
+ projectId: string;
694
+ flowId: string;
695
+ step: string;
696
+ flow?: string;
697
+ limit?: number;
698
+ }): Promise<StepHistoryWire>;
699
+ setReleaseRationale(options: {
700
+ projectId: string;
701
+ flowId: string;
702
+ versionId: string;
703
+ text: string;
704
+ }): Promise<VersionAnnotationWire>;
705
+ listThreads(options: {
706
+ projectId: string;
707
+ flowId: string;
708
+ anchorType?: ThreadAnchorType;
709
+ anchorKey?: string;
710
+ status?: ThreadStatus;
711
+ includeMessages: boolean;
712
+ limit?: number;
713
+ }): Promise<ListThreadsWire>;
714
+ createThread(options: {
715
+ projectId: string;
716
+ flowId: string;
717
+ anchorType: ThreadAnchorType;
718
+ anchorKey: string;
719
+ anchorLabel?: string;
720
+ text: string;
721
+ }): Promise<HubThreadWire>;
722
+ addThreadMessage(options: {
723
+ projectId: string;
724
+ flowId: string;
725
+ threadId: string;
726
+ text: string;
727
+ }): Promise<HubThreadWire>;
728
+ listKnowledge(options: {
729
+ projectId: string;
730
+ pageKey?: string;
731
+ frameId?: string;
732
+ markId?: string;
733
+ includeMessages: boolean;
734
+ limit?: number;
735
+ }): Promise<ListKnowledgeWire>;
736
+ listFrames(options: {
737
+ projectId: string;
738
+ }): Promise<FrameLeanListWire>;
739
+ listPageFrames(options: {
740
+ projectId: string;
741
+ pageKey: string;
742
+ }): Promise<FrameListWire>;
743
+ getFrame(options: {
744
+ projectId: string;
745
+ frameId: string;
746
+ }): Promise<FrameWire>;
384
747
  requestDeviceCode(): Promise<DeviceCodeResult>;
385
748
  pollForToken(deviceCode: string, options?: {
386
749
  timeoutMs?: number;
@@ -445,6 +808,142 @@ declare const HINT_EMPTY_FEED = "recordsReceived is 0: nothing has reached the f
445
808
  declare const HINT_ENDED = "Session ended and both arms detached. Start a new one with observe_session start.";
446
809
  declare const HINT_NO_WINDOW = "No Observe session on this flow. Open one with observe_session start.";
447
810
 
811
+ /**
812
+ * Exported so a host asserts parity against this exact string instead of
813
+ * retyping it.
814
+ */
815
+ declare const HUB_MANAGE_DESCRIPTION: string;
816
+ /**
817
+ * One flat schema with an `action` enum and per-action optional fields, the
818
+ * shape `flow_manage`, `project_manage`, and `secret_manage` already use.
819
+ * Per-action requirements are enforced in the handler, so later actions add a
820
+ * field and an enum member without reshaping what callers already send.
821
+ *
822
+ * Exported so the declarative registry holds the same object rather than a
823
+ * second copy of it.
824
+ */
825
+ declare const HUB_MANAGE_INPUT_SCHEMA: {
826
+ action: z.ZodEnum<{
827
+ releases: "releases";
828
+ release_get: "release_get";
829
+ step_history: "step_history";
830
+ rationale_set: "rationale_set";
831
+ threads: "threads";
832
+ note_add: "note_add";
833
+ knowledge: "knowledge";
834
+ }>;
835
+ projectId: z.ZodOptional<z.ZodString>;
836
+ flowId: z.ZodOptional<z.ZodString>;
837
+ versionId: z.ZodOptional<z.ZodString>;
838
+ versionNumber: z.ZodOptional<z.ZodNumber>;
839
+ step: z.ZodOptional<z.ZodString>;
840
+ flow: z.ZodOptional<z.ZodString>;
841
+ text: z.ZodOptional<z.ZodString>;
842
+ limit: z.ZodOptional<z.ZodNumber>;
843
+ offset: z.ZodOptional<z.ZodNumber>;
844
+ anchorType: z.ZodOptional<z.ZodEnum<{
845
+ step: "step";
846
+ entity_action: "entity_action";
847
+ release: "release";
848
+ contract: "contract";
849
+ tag: "tag";
850
+ }>>;
851
+ anchorKey: z.ZodOptional<z.ZodString>;
852
+ anchorLabel: z.ZodOptional<z.ZodString>;
853
+ threadId: z.ZodOptional<z.ZodString>;
854
+ status: z.ZodOptional<z.ZodEnum<{
855
+ open: "open";
856
+ resolved: "resolved";
857
+ }>>;
858
+ pageKey: z.ZodOptional<z.ZodString>;
859
+ frameId: z.ZodOptional<z.ZodString>;
860
+ markId: z.ZodOptional<z.ZodString>;
861
+ };
862
+ /**
863
+ * Hints carry the verb ladder rather than the description. One constant per
864
+ * sentence the tool can emit, so the surface fixture pins wording and ordering
865
+ * by name and a reword fails a test instead of drifting.
866
+ */
867
+ declare const HUB_HINT_RELEASE_GET = "Use action \"release_get\" with a versionId or versionNumber to read one release in full, with its diff.";
868
+ declare const HUB_HINT_ROWS_ARE_DEPLOYMENTS = "Rows are deployments, not releases: the same versionId on several rows is a redeploy of identical content, so count distinct versionId values, and note that total counts deployments.";
869
+ declare const HUB_HINT_STEP_HISTORY = "Use action \"step_history\" to see which releases touched one step.";
870
+ declare const HUB_HINT_MASKED_ONLY = "The diff is empty because the only changes are inside masked values. Say that the change is not visible here rather than that nothing changed.";
871
+ declare const HUB_HINT_TRACE_STEP = "Use action \"step_history\" to trace one step across releases.";
872
+ declare const HUB_HINT_WRITE_RATIONALE = "This release has no human rationale. Read the diff, then use action \"rationale_set\" to record why it changed.";
873
+ declare const HUB_HINT_SCAN_CAPPED = "The scan stopped at the entry cap, so older releases were not compared. Narrow with \"flow\" to see the whole history of one occurrence.";
874
+ declare const HUB_HINT_NO_MATCH = "No scanned release touched this step. Check the step key against knownSteps, or raise limit to scan further back.";
875
+ declare const HUB_HINT_OPEN_RELEASE = "Use action \"release_get\" on one of these versionIds to read the full diff and rationale.";
876
+ declare const HUB_HINT_RATIONALE_VISIBLE = "The rationale is now visible on this release in the app.";
877
+ declare const HUB_HINT_CONFIRM_INDEX = "Use action \"releases\" to confirm it appears in the index.";
878
+ declare const HUB_HINT_THREADS_PAGE_CAPPED = "More threads match than were returned (the page is capped at 20 when messages are attached). Narrow with anchorType and anchorKey, or with status, rather than treating this as the complete list.";
879
+ declare const HUB_HINT_NOTHING_DISCUSSED = "Nothing is being discussed on this flow. Use action \"note_add\" with a versionId to start a thread on a release.";
880
+ declare const HUB_HINT_NO_THREAD_ON_ANCHOR = "No thread hangs on this anchor yet. Use action \"note_add\" to open one.";
881
+ declare const HUB_HINT_THREADS_INDEX = "This is an index: message bodies are omitted. Pass a versionId, or anchorType with anchorKey, to read one discussion in full.";
882
+ declare const HUB_HINT_MESSAGES_TRUNCATED = "A thread here is marked hasMoreMessages: only its newest messages were returned. Say the discussion is longer than what you read rather than summarizing it as complete.";
883
+ declare const HUB_HINT_REPLY_OR_OPEN = "Use action \"note_add\" with a threadId to reply in one of these threads, or without one to open another.";
884
+ declare const HUB_HINT_RESOLVE_IN_APP = "Resolving a thread into a release is done by a person in the app, not through this tool.";
885
+ declare const HUB_HINT_MESSAGE_VISIBLE = "The message is now visible in this thread in the app.";
886
+ declare const HUB_HINT_STAYS_RESOLVED = "This thread is resolved and stayed resolved: a reply never retracts the release link.";
887
+ declare const HUB_HINT_READ_BACK = "Use action \"threads\" to read the discussion back.";
888
+ declare const HUB_HINT_THREAD_OPEN = "The thread is now open on this anchor in the app.";
889
+ declare const HUB_HINT_KEEP_ONE_THREAD = "Pass its threadId back to action \"note_add\" to keep the conversation in one place instead of opening another thread.";
890
+ declare const HUB_HINT_KNOWLEDGE_PAGE_CAPPED = "More knowledge matches than was returned. Narrow with pageKey, then frameId, then markId, rather than treating this as everything that was written.";
891
+ declare const HUB_HINT_NOTHING_WRITTEN = "Nothing has been written here. Notes are left on the page in Tag Mode, not through this tool.";
892
+ declare const HUB_HINT_KNOWLEDGE_INDEX = "This is an index: message bodies are omitted. Pass markId with frameId to read one mark in full.";
893
+ declare const HUB_HINT_ENTRY_NAMES_FLOW = "An entry names the flow it was written against in flowId, and validity says which release was live at the time.";
894
+ declare const HUB_HINT_KNOWLEDGE_READ_ONLY = "This tool only reads knowledge. Answering a note, and settling it, are done by a person in the app.";
895
+ declare const HUB_HINT_READ_FRAME = "Use frame_manage action \"get\" with the frameId to read the frame and its marks.";
896
+ declare const HUB_NOT_FOUND_HINT = "Use action \"releases\" to find version ids and action \"threads\" to find thread ids.";
897
+
898
+ /**
899
+ * Exported so a host asserts parity against this exact string instead of
900
+ * retyping it.
901
+ */
902
+ declare const FRAME_MANAGE_DESCRIPTION: string;
903
+ /**
904
+ * Exported so the declarative registry holds the same object rather than a
905
+ * second copy of it.
906
+ */
907
+ declare const FRAME_MANAGE_INPUT_SCHEMA: {
908
+ action: z.ZodEnum<{
909
+ page: "page";
910
+ get: "get";
911
+ list: "list";
912
+ }>;
913
+ projectId: z.ZodOptional<z.ZodString>;
914
+ pageKey: z.ZodOptional<z.ZodString>;
915
+ frameId: z.ZodOptional<z.ZodString>;
916
+ };
917
+ /**
918
+ * Hints carry the verb ladder rather than the description. One constant per
919
+ * sentence the tool can emit, so the surface fixture pins wording and ordering
920
+ * by name and a reword fails a test instead of drifting.
921
+ */
922
+ declare const FRAME_HINT_OPEN_PAGE_OR_GET = "Use action \"page\" with a pageKey (a frame\u2019s source.key) to read a page with marks, or action \"get\" with a frameId.";
923
+ declare const FRAME_HINT_NAMES_ARE_DOCUMENTATION = "Frame names are documentation; the marks inside a frame carry the meaning.";
924
+ declare const FRAME_HINT_NONE_YET = "This project has no frames yet. Frames are drawn in Tag Mode or the app, not through this tool.";
925
+ declare const FRAME_HINT_MARK_SPACE = "Marks are in their frame\u2019s own 0..1 space; a child frame sits inside its parent through placements[].rect.";
926
+ declare const FRAME_HINT_READ_KNOWLEDGE = "Use hub_manage action \"knowledge\" with frameId (and markId) to read what people wrote here. A markId is an id from these marks, and an entity action is addressed by its own id, never by its raw text.";
927
+ declare const FRAME_HINT_NONE_ON_PAGE = "No frames on this page. Check the pageKey against the source.key values from action \"list\".";
928
+ declare const FRAME_HINT_EXTENDS_BASE = "This frame extends another and stores only what it adds; read the base frame (extends) for the rest.";
929
+ declare const FRAME_NOT_FOUND_HINT = "Use action \"list\" or \"page\" to find frame ids.";
930
+
931
+ /** The code every door answers a plan or project gate with. */
932
+ declare const FEATURE_NOT_AVAILABLE = "FEATURE_NOT_AVAILABLE";
933
+ /** The features a door can refuse a whole tool for. */
934
+ type GatedFeature = 'hub' | 'frames';
935
+ /**
936
+ * A denial is recognised by its code, never by its wording: the two doors phrase
937
+ * the refusal differently and only the code is contractual.
938
+ */
939
+ declare function isFeatureDenial(error: unknown): boolean;
940
+ /**
941
+ * Names the feature so an agent can tell the person what is missing. Enabling
942
+ * it is a plan or project entitlement change made in the app, never something
943
+ * a tool can do, and the hint says so instead of inviting a retry.
944
+ */
945
+ declare function featureDenialHint(feature: GatedFeature): string;
946
+
448
947
  /**
449
948
  * Wraps a user-writable string in `<user_data>…</user_data>` so the chat
450
949
  * assistant treats it as data, never as instructions. Inner `</user_data>`
@@ -528,4 +1027,4 @@ declare module '@walkeros/core' {
528
1027
  */
529
1028
  declare function createToolHandlers(client: ToolClient, packageVersion?: string): Record<string, ToolSpec>;
530
1029
 
531
- export { type CreateServerOptions, type CreateStreamableHttpHandlerOptions, type FlowCanvasPayload, type FlowCanvasToolResult, HINT_EMPTY_FEED, HINT_ENDED, HINT_NO_WINDOW, HINT_PREVIEW_STREAMS, HINT_READ, HINT_SIMULATE_FIRST, HINT_STOP, HttpToolClient, type JourneysResult, type Logger, DESCRIPTION as OBSERVE_SESSION_DESCRIPTION, type RedactOptions, type SuggestionTile, TOOL_DEFINITIONS, type ToolAnnotations, type ToolClient, type ToolDefinition, type ToolSpec, createStreamableHttpHandler, createToolHandlers, createWalkerOSMcpServer, flowCanvasResult, isFlowCanvasResult, redactNestedStrings, wrapUserData };
1030
+ export { type CreateServerOptions, type CreateStreamableHttpHandlerOptions, FEATURE_NOT_AVAILABLE, FRAME_HINT_EXTENDS_BASE, FRAME_HINT_MARK_SPACE, FRAME_HINT_NAMES_ARE_DOCUMENTATION, FRAME_HINT_NONE_ON_PAGE, FRAME_HINT_NONE_YET, FRAME_HINT_OPEN_PAGE_OR_GET, FRAME_HINT_READ_KNOWLEDGE, FRAME_MANAGE_DESCRIPTION, FRAME_MANAGE_INPUT_SCHEMA, FRAME_NOT_FOUND_HINT, type FlowCanvasPayload, type FlowCanvasToolResult, type FrameLeanListWire, type FrameLeanWire, type FrameListWire, type FrameWire, type GatedFeature, HINT_EMPTY_FEED, HINT_ENDED, HINT_NO_WINDOW, HINT_PREVIEW_STREAMS, HINT_READ, HINT_SIMULATE_FIRST, HINT_STOP, HUB_HINT_CONFIRM_INDEX, HUB_HINT_ENTRY_NAMES_FLOW, HUB_HINT_KEEP_ONE_THREAD, HUB_HINT_KNOWLEDGE_INDEX, HUB_HINT_KNOWLEDGE_PAGE_CAPPED, HUB_HINT_KNOWLEDGE_READ_ONLY, HUB_HINT_MASKED_ONLY, HUB_HINT_MESSAGES_TRUNCATED, HUB_HINT_MESSAGE_VISIBLE, HUB_HINT_NOTHING_DISCUSSED, HUB_HINT_NOTHING_WRITTEN, HUB_HINT_NO_MATCH, HUB_HINT_NO_THREAD_ON_ANCHOR, HUB_HINT_OPEN_RELEASE, HUB_HINT_RATIONALE_VISIBLE, HUB_HINT_READ_BACK, HUB_HINT_READ_FRAME, HUB_HINT_RELEASE_GET, HUB_HINT_REPLY_OR_OPEN, HUB_HINT_RESOLVE_IN_APP, HUB_HINT_ROWS_ARE_DEPLOYMENTS, HUB_HINT_SCAN_CAPPED, HUB_HINT_STAYS_RESOLVED, HUB_HINT_STEP_HISTORY, HUB_HINT_THREADS_INDEX, HUB_HINT_THREADS_PAGE_CAPPED, HUB_HINT_THREAD_OPEN, HUB_HINT_TRACE_STEP, HUB_HINT_WRITE_RATIONALE, HUB_MANAGE_DESCRIPTION, HUB_MANAGE_INPUT_SCHEMA, HUB_NOT_FOUND_HINT, HttpToolClient, type HubThreadWire, type JourneysResult, type KnowledgeEntryWire, type ListKnowledgeWire, type ListThreadsWire, type Logger, DESCRIPTION as OBSERVE_SESSION_DESCRIPTION, type RedactOptions, type ReleaseDetailWire, type ReleaseIndexWire, type ReleaseRef, type StepHistoryWire, type SuggestionTile, TOOL_DEFINITIONS, type ToolAnnotations, type ToolClient, type ToolDefinition, type ToolSpec, type VersionAnnotationWire, createStreamableHttpHandler, createToolHandlers, createWalkerOSMcpServer, featureDenialHint, flowCanvasResult, isFeatureDenial, isFlowCanvasResult, redactNestedStrings, wrapUserData };