# groovy-pebble — Agent Command Catalog > The public command catalog for groovy-pebble, the AI-native charting engine. Every capability a human reaches through any UI surface is dispatchable by an agent through a registered command with the SAME name and args (Law 3). This index lists the public-tier commands (developer / internal / host-only commands are omitted) grouped by category; each linked file carries the args JSON Schema, examples, and idempotent / destructive flags per command. 296 public commands across 16 categories. Generated by `scripts/build-catalog-docs.mjs` (`npm run docs:catalog`). ## Addresses - [/](/): the application these commands run in. - [/agent-surface.json](/agent-surface.json): the generated agent-surface metric — command and tool counts, per-command freedom tiers, and the build sha they were counted on. ## appearance See [llms/appearance.md](llms/appearance.md). - [appearance.applyPreset](llms/appearance.md#appearanceapplypreset): Apply a named appearance PRESET to the active cell and APPLY it LIVE (the capstone one-call AI-vision layout). - [appearance.applyToAll](llms/appearance.md#appearanceapplytoall): Copy the (active) cell's appearance to ALL open cells (TradingView's Apply to all). - [appearance.resetToDefault](llms/appearance.md#appearanceresettodefault): Reset the (active) cell's appearance back to the GLOBAL default (`settings.defaultAppearance`, or the built-in baseline when no settings store is wired). - [appearance.saveAsDefault](llms/appearance.md#appearancesaveasdefault): Write the (active) cell's appearance to the GLOBAL default (`settings.defaultAppearance`) so NEW cells inherit it (TradingView's Save as default). - [appearance.set](llms/appearance.md#appearanceset): Merge a partial appearance patch onto a cell and APPLY it LIVE (the TradingView chart Settings → Symbol / Canvas / Scales / Status line / Alerts tabs). ## cache See [llms/cache.md](llms/cache.md). - [cache.clear](llms/cache.md#cacheclear): Drop cached bars. - [cache.disable](llms/cache.md#cachedisable): Turn the local bar cache OFF (sets `cacheEnabled` false). - [cache.enable](llms/cache.md#cacheenable): Turn the local bar cache ON (sets the `cacheEnabled` setting). - [cache.setLocation](llms/cache.md#cachesetlocation): Point the local bar cache at a real DISK FOLDER (desktop / companion-backed) instead of browser storage. - [cache.setQuota](llms/cache.md#cachesetquota): Set the local bar-cache size cap, in BYTES (sets the `cacheQuota` setting; default 3 GB). ## cockpit See [llms/cockpit.md](llms/cockpit.md). - [cockpit.say](llms/cockpit.md#cockpitsay): Post a message to the cockpit chat (the human↔agent conversation surface). ## data See [llms/data.md](llms/data.md). - [alert.ack](llms/data.md#alertack): Acknowledge an alert's latest trigger (clears its unacked badge in the panel and the `chart.diagnostics().alerts.unacked` count). - [alert.create](llms/data.md#alertcreate): Create a live alert: a CONDITION evaluated on the {source, symbol, interval} scope's live feed. - [alert.createForWatchlist](llms/data.md#alertcreateforwatchlist): P2.5 alert-on-watchlist — fan out ONE alert per watchlist item: each {source, symbol} on the list gets its own alert with scope {source, symbol, interval} and… - [alert.delete](llms/data.md#alertdelete): Delete an alert by id (releases its feed subscription when it was the scope's last alert). - [alert.disable](llms/data.md#alertdisable): Disable an alert by id without deleting it: evaluation stops and its feed subscription is released (re-acquired on enable). - [alert.enable](llms/data.md#alertenable): Enable an alert by id. - [alert.update](llms/data.md#alertupdate): Edit an alert's name / scope / condition / trigger / message / expiry by id. - [chart.setChartType](llms/data.md#chartsetcharttype): Chart-type menu — set the cell's render style (`style`: candle | bar | hollow | line | area | baseline | heikin | footprint) and/or bar formation (`formation`:… - [compare.add](llms/data.md#compareadd): COMPARE / OVERLAY (TV-PARITY P6) — overlay a second symbol on the active cell's chart, aligned to the primary series by exact timestamp and rebased to the prim… - [compare.list](llms/data.md#comparelist): COMPARE / OVERLAY (TV-PARITY P6) — list the active compares as DATA (each {id, symbol, source, interval, color}). - [compare.remove](llms/data.md#compareremove): COMPARE / OVERLAY (TV-PARITY P6) — remove a compare/overlay by `symbol` (or its `id`). - [data.clearBrokerCredential](llms/data.md#dataclearbrokercredential): BYO-BROKER B2 — remove the stored brokerage credential for a data source. - [data.closeBrokerGuide](llms/data.md#dataclosebrokerguide): BYO-BROKER F3 — close the broker-onboarding guide overlay. - [data.extendHistory](llms/data.md#dataextendhistory): DF-4 — prepend OLDER history onto the active kline binding (cache-first; only uncovered sub-ranges hit the venue). - [data.load](llms/data.md#dataload): TD.12c — swap the chart's data feed. - [data.openBrokerGuide](llms/data.md#dataopenbrokerguide): BYO-BROKER F3 — open the broker-onboarding guide overlay (the Alpaca connect wizard) on the Home host (where the guide is registered and mounted). - [data.setBrokerCredential](llms/data.md#datasetbrokercredential): BYO-BROKER B2 — store the user's brokerage API credential for a data source (e.g. - [data.setSource](llms/data.md#datasetsource): D3 — switch the cell's data venue (`binance` | `bitstamp` | `coinbase` | `kraken` | `forex` | `alpaca` | `onchain-hyperliquid`) while keeping the current symbo… - [data.testBrokerCredential](llms/data.md#datatestbrokercredential): BYO-BROKER F3 — validate the STORED broker credential for a source by running the adapter's authenticated `listSymbols()` read (`/v2/assets`; NO new adapter me… - [export.data](llms/data.md#exportdata): EXPORT (TV-PARITY P8) — serialize chart data to a CSV download. - [export.image](llms/data.md#exportimage): EXPORT (TV-PARITY P8) — capture the chart as a PNG. - [onchain.repair.run](llms/data.md#onchainrepairrun): ON-CHAIN REPAIR — the explicit, GATED trigger: repair ONE on-chain feed by {family, identity} (optionally pin ONE coverage hole OR reorg by {fromBlock, toBlock… - [watchlist.addSymbol](llms/data.md#watchlistaddsymbol): Add a {source, symbol} item to a watchlist by id (idempotent — re-adding an item already on the list succeeds without duplicating). - [watchlist.create](llms/data.md#watchlistcreate): Create a named watchlist (empty). - [watchlist.delete](llms/data.md#watchlistdelete): Delete a watchlist by id (its items go with it; symbols themselves are unaffected). - [watchlist.moveSymbol](llms/data.md#watchlistmovesymbol): Reorder a watchlist: move the {source, symbol} item to `toIndex` (0-based, clamped to the list length). - [watchlist.removeSymbol](llms/data.md#watchlistremovesymbol): Remove a {source, symbol} item from a watchlist by id. - [watchlist.rename](llms/data.md#watchlistrename): Rename a watchlist by id. ## debug See [llms/debug.md](llms/debug.md). - [diagnostics.stutter.start](llms/debug.md#diagnosticsstutterstart): Start the in-app STUTTER RECORDER — a bounded capture window (default 30 s, max 120 s) for diagnosing intermittent UI hitches while you reproduce them. - [diagnostics.stutter.stop](llms/debug.md#diagnosticsstutterstop): Stop the running stutter recording EARLY and finalize its report (the recorder otherwise auto-stops when its window elapses). ## drawing See [llms/drawing.md](llms/drawing.md). - [drawing.acceptTool](llms/drawing.md#drawingaccepttool): ACCEPT a PENDING AI-authored drawing tool by key (from `drawing.defineTool`) — re-registers it as a permanent tool (it now appears in the Pebble) and persists… - [drawing.andrews-pitchfork.activate](llms/drawing.md#drawingandrews-pitchforkactivate): Arm the Andrews' Pitchfork (3-point median + parallel tines) drawing tool. - [drawing.cancel](llms/drawing.md#drawingcancel): Cancel in-progress drawing operations in priority order: active drag → tool-active draft → deselect any selected drawing. - [drawing.defineTool](llms/drawing.md#drawingdefinetool): Author a NEW drawing tool / instrument — TWO input modes. - [drawing.deleteTool](llms/drawing.md#drawingdeletetool): Remove an ACCEPTED (persisted) user-authored drawing tool by key — unregisters it (it disappears from the Pebble + can no longer be activated) and deletes its… - [drawing.horizontal-line.activate](llms/drawing.md#drawinghorizontal-lineactivate): Arm the Horizontal Line (1-point, full-width) drawing tool. - [drawing.inside-pitchfork.activate](llms/drawing.md#drawinginside-pitchforkactivate): Arm the Inside Pitchfork (handle pulled into triangle interior) drawing tool. - [drawing.modified-schiff-pitchfork.activate](llms/drawing.md#drawingmodified-schiff-pitchforkactivate): Arm the Modified Schiff Pitchfork (handle at p1-p2 midpoint) drawing tool. - [drawing.paste](llms/drawing.md#drawingpaste): Paste the most recently copied drawing at a small offset from its original position. - [drawing.placePoints](llms/drawing.md#drawingplacepoints): TD.12b — programmatically place a drawing of `toolKey` at the given data-domain points. - [drawing.ray.activate](llms/drawing.md#drawingrayactivate): Arm the Ray (2-point, extends past second endpoint) drawing tool. - [drawing.rectangle.activate](llms/drawing.md#drawingrectangleactivate): Arm the Rectangle (2-point box, optional fill) drawing tool. - [drawing.rejectTool](llms/drawing.md#drawingrejecttool): REJECT a PENDING AI-authored drawing tool by key (from `drawing.defineTool`) — unregisters + discards it (it was never persisted, so it simply disappears). - [drawing.schiff-pitchfork.activate](llms/drawing.md#drawingschiff-pitchforkactivate): Arm the Schiff Pitchfork (price-only midpoint) drawing tool. - [drawing.select](llms/drawing.md#drawingselect): Programmatically select a drawing by mark ID. - [drawing.trendline.activate](llms/drawing.md#drawingtrendlineactivate): Arm the Trendline (2-point line) drawing tool. - [drawing.vertical-line.activate](llms/drawing.md#drawingvertical-lineactivate): Arm the Vertical Line (1-point, full-height) drawing tool. ## drawing-orbit See [llms/drawing-orbit.md](llms/drawing-orbit.md). - [drawing.deleteAll](llms/drawing-orbit.md#drawingdeleteall): Remove every drawing mark from the chart (anything with id prefix `drawing.`). - [drawing.hidden.toggle](llms/drawing-orbit.md#drawinghiddentoggle): Toggle the global Hide flag. - [drawing.locked.toggle](llms/drawing-orbit.md#drawinglockedtoggle): Toggle the global Lock flag. - [drawing.magnet.toggle](llms/drawing-orbit.md#drawingmagnettoggle): Cycle the magnet snap mode: off → weak → strong → off. - [drawing.measure.activate](llms/drawing-orbit.md#drawingmeasureactivate): Arm the Measure tool. - [drawing.stayInTool.toggle](llms/drawing-orbit.md#drawingstayintooltoggle): Toggle "stay in drawing tool after each finalize" mode. ## drawing-selected See [llms/drawing-selected.md](llms/drawing-selected.md). - [drawing.selected.clone](llms/drawing-selected.md#drawingselectedclone): Duplicate the currently-selected drawing in place with a small offset. - [drawing.selected.copy](llms/drawing-selected.md#drawingselectedcopy): Copy the currently-selected drawing into the layout-shared clipboard (single-chart mode uses a per-chart clipboard). - [drawing.selected.openSettings](llms/drawing-selected.md#drawingselectedopensettings): Open the floating Settings dialog for the currently-selected drawing (the TradingView right-click → Settings… popover). - [drawing.selected.remove](llms/drawing-selected.md#drawingselectedremove): Permanently dispose the currently-selected drawing. - [drawing.selected.setForkType](llms/drawing-selected.md#drawingselectedsetforktype): Change the currently-selected Pitchfork's TYPE in place (the TradingView Type submenu): Original (Andrews) / Schiff / Modified Schiff / Inside. - [drawing.selected.toggleFlip](llms/drawing-selected.md#drawingselectedtoggleflip): Toggle the vertical (price-axis) FLIP on the currently-selected capture drawing (bars-pattern): the captured content inverts inside the SAME box — anchors, siz… - [drawing.selected.toggleHide](llms/drawing-selected.md#drawingselectedtogglehide): Toggle the visible flag on the currently-selected drawing. - [drawing.selected.toggleLock](llms/drawing-selected.md#drawingselectedtogglelock): Toggle the locked flag on the currently-selected drawing. - [drawing.selected.toggleMirror](llms/drawing-selected.md#drawingselectedtogglemirror): Toggle the horizontal (time-axis) MIRROR on the currently-selected capture drawing (bars-pattern): the captured content reverses inside the SAME box — anchors,… ## idea See [llms/idea.md](llms/idea.md). - [community.chat.closePanel](llms/idea.md#communitychatclosepanel): Close the Org Chat side panel. - [community.chat.delete](llms/idea.md#communitychatdelete): Soft-delete a chat message (its author, or an org owner/admin — moderation). - [community.chat.history](llms/idea.md#communitychathistory): Load a page of chat scrollback for an org (newest-first, cursor-paginated ≤ 100/page; tombstoned messages arrive body-less). - [community.chat.markRead](llms/idea.md#communitychatmarkread): Mark an org's chat as read up to the newest seen message (the local last-read marker — client-side, storageKey-persisted). - [community.chat.openPanel](llms/idea.md#communitychatopenpanel): Open the Org Chat side panel (message history + live fan-out for the selected org; unread badge clears as messages are seen). - [community.chat.send](llms/idea.md#communitychatsend): Send a chat message to an organization (members only; sanitized text ≤ 2000 chars + an optional published-idea reference BY ID — never idea content, never mark… - [community.chat.unread](llms/idea.md#communitychatunread): Read the current unread state (Law-4 reader for community.chat.send/markRead): emits community.chat.unread with the per-org count (when slug is given) and the… - [community.closePanel](llms/idea.md#communityclosepanel): Close the Community side panel. - [community.comment](llms/idea.md#communitycomment): Post a flat comment on a community idea (auth; body ≤ 2000 chars, sanitized + rate-limited server-side). - [community.deleteComment](llms/idea.md#communitydeletecomment): Delete a comment you authored (or, as a moderator, any comment). - [community.feed.loadMore](llms/idea.md#communityfeedloadmore): Append the next page of the Home community feed's current tab (cursor pagination). - [community.feed.refresh](llms/idea.md#communityfeedrefresh): Re-read the Home community feed's current tab from the backend (newest first, resets pagination). - [community.feed.setTab](llms/idea.md#communityfeedsettab): Switch the Home community feed between the Organization tab (member-only ideas of the selected org — the signed-in-member default) and the Public tab. - [community.invite.email](llms/idea.md#communityinviteemail): Invite someone to an organization by EMAIL (owner/admin only). - [community.like](llms/idea.md#communitylike): Like a published community idea (auth; idempotent — a repeat like is a no-op). - [community.mod.ban](llms/idea.md#communitymodban): Moderator-only: ban an author from community actions (publish/comment/like). - [community.mod.takedown](llms/idea.md#communitymodtakedown): Moderator-only: take down (soft-delete) a published idea. - [community.open](llms/idea.md#communityopen): Open a PUBLISHED community idea by its server id: resolves the recipe (CloudShareTarget.resolve → upcast) then opens it via the committed idea.openInCell path… - [community.openPanel](llms/idea.md#communityopenpanel): Open the Community side panel (public feed of published ideas + the per-symbol stream for the active cell's symbol + author profiles + your handle settings). - [community.org.create](llms/idea.md#communityorgcreate): Create an organization (you become its owner). - [community.org.invite](llms/idea.md#communityorginvite): Mint an invite for an organization (owner/admin only). - [community.org.inviteAccept](llms/idea.md#communityorginviteaccept): Accept an organization invite by its token — you join at the invite's role (idempotent for an existing member; no use consumed). - [community.org.invitePrompt](llms/idea.md#communityorginviteprompt): Open the Community panel to the Orgs tab and show the accept-confirm box for an invite token (the human affordance behind the ?org-invite= boot deep lin… - [community.org.leave](llms/idea.md#communityorgleave): Leave an organization (you remove yourself — the same DELETE route with self-leave semantics). - [community.org.memberRemove](llms/idea.md#communityorgmemberremove): Remove a member from an organization (owner/admin; an admin cannot remove an owner). - [community.org.memberSetRole](llms/idea.md#communityorgmembersetrole): Change a member's role in an organization (owner-only). - [community.org.select](llms/idea.md#communityorgselect): Open an organization's detail + member-only feed in the Community panel (navigation parity — no server mutation). - [community.profileSet](llms/idea.md#communityprofileset): Claim or change your community handle (+ optional display name). - [community.publish.closeDialog](llms/idea.md#communitypublishclosedialog): Close the Publish dialog without publishing. - [community.publish.openDialog](llms/idea.md#communitypublishopendialog): Open the Publish dialog for the active cell's captured idea: Private (stays on this device — the default), Organization (member-only; an org picker when you be… - [community.report](llms/idea.md#communityreport): Report a published idea for moderator review (auth; reason required). - [community.room.join](llms/idea.md#communityroomjoin): Join an organization's LIVE shared-annotation room (org members only — the relay enforces live membership before the socket opens). - [community.room.leave](llms/idea.md#communityroomleave): Leave the live shared-annotation room: closes the WebSocket, clears the remote-drawing/cursor overlay and stops broadcasting (no reconnect until the next join). - [community.unlike](llms/idea.md#communityunlike): Remove your like from a community idea (auth; idempotent). - [idea.capture](llms/idea.md#ideacapture): Capture the current chart as a portable Idea Document — a thin metadata envelope (title / thesis / direction / type / tags) wrapping the engine's own ChartSnap… - [idea.closePanel](llms/idea.md#ideaclosepanel): Close the "My Ideas" side panel. - [idea.delete](llms/idea.md#ideadelete): Delete a saved idea by id from the current profile's store. - [idea.describe](llms/idea.md#ideadescribe): Return the full saved Idea Document for an id (Law 4 reader), or null if absent / no profile wired. - [idea.export](llms/idea.md#ideaexport): Export an Idea Document to a portable, local-first artifact (NO network egress — a download / clipboard write is not a fetch). - [idea.import](llms/idea.md#ideaimport): Import an Idea Document from a pasted payload (JSON string or pre-parsed object) OR a share url, then open it onto the chart (composes the restore path — Law 1… - [idea.importToStore](llms/idea.md#ideaimporttostore): Import an Idea Document from a pasted payload (JSON string or pre-parsed object) OR a share url and PERSIST it into the store — it does NOT restore/wipe the ac… - [idea.list](llms/idea.md#idealist): List the ideas saved under the current profile (Law 4 reader for the idea store). - [idea.open](llms/idea.md#ideaopen): Open an Idea Document by restoring its embedded ChartSnapshot onto the chart (Law 1 — composes chart.restore). - [idea.openCaptureDialog](llms/idea.md#ideaopencapturedialog): Open the floating Capture-idea dialog (title / thesis / direction / type / tags + the author-warranty gate + the non-dismissable educational-only disclaimer). - [idea.openImportDialog](llms/idea.md#ideaopenimportdialog): Open the floating Import-idea dialog (File / Paste URL / Paste JSON source modes + the three-way merge chooser + a read-only preview of the parsed idea). - [idea.openInCell](llms/idea.md#ideaopenincell): Open an Idea Document into a FRESH cell without wiping the active one (the source-cell invariant). - [idea.openPanel](llms/idea.md#ideaopenpanel): Open the "My Ideas" side panel — the human-facing VIEW over the profile-scoped Idea store (Law 2). - [idea.publish](llms/idea.md#ideapublish): EXPLICITLY publish an Idea Document to the cloud community backend (tapebench.com/community) — local-first: nothing auto-publishes. - [idea.publishedUrl](llms/idea.md#ideapublishedurl): Law-4 reader for idea.publish — returns the cloud publish record for a local idea id ({ localId, serverId, permalink, visibility, title, symbol, publishedAtMs… - [idea.save](llms/idea.md#ideasave): Persist a freshly-captured Idea Document into the current profile's store (the second half of the capture flow — idea.capture produces the doc, idea.save persi… - [idea.shareToX](llms/idea.md#ideasharetox): Share to X (Twitter), Tier 1 (no X API, no keys, works for logged-out viewers): opens the X web-intent composer for a PUBLISHED idea in a new tab, pre-filled w… - [idea.unpublish](llms/idea.md#ideaunpublish): Unpublish a published idea you authored (soft-delete on the community backend — the permalink 404s, the feed row disappears; your LOCAL Idea Document is untouc… ## lab See [llms/lab.md](llms/lab.md). - [lab.acceptTool](llms/lab.md#labaccepttool): ACCEPT a tool authored into the lab (from lab.defineTool), by key — re-creates it on the user's LIVE chart and persists it to the per-user library (it now appe… - [lab.close](llms/lab.md#labclose): Close + tear down your laboratory (disposes the lab chart; your lab drawings are lost; the live chart is untouched). - [lab.defineTool](llms/lab.md#labdefinetool): Author a NEW drawing tool / instrument INTO THE LAB (NOT the live chart, NOT persisted). - [lab.discard](llms/lab.md#labdiscard): Remove drawing(s) from the LAB (the live chart is untouched; the seed candle series is kept). - [lab.open](llms/lab.md#labopen): Open your PRIVATE laboratory — an isolated, off-screen chart seeded with a COPY of the live chart's bars where you build + verify drawings BEFORE they touch th… - [lab.place](llms/lab.md#labplace): Place a drawing in the LAB (not the live chart) at data-domain points — the lab equivalent of drawing.placePoints. - [lab.promote](llms/lab.md#labpromote): Promote verified lab drawing(s) to the user's LIVE chart by re-creating them via drawing.placePoints (Law 1; COPIES, never moves — the lab keeps its copy; the… - [lab.rejectTool](llms/lab.md#labrejecttool): REJECT a tool you authored into the lab (from lab.defineTool), by key — discards it from the lab. ## layout See [llms/layout.md](llms/layout.md). - [desk.create](llms/layout.md#deskcreate): Create a new DESK (a named, saved session — a whole set of workspaces, one level above workspaces). - [desk.delete](llms/layout.md#deskdelete): Delete desk `id`. - [desk.duplicate](llms/layout.md#deskduplicate): Duplicate desk `id` (a deep copy of its whole workspace-set), inserted right after the source. - [desk.open](llms/layout.md#deskopen): Open desk `id` — checkpoint the CURRENT desk (its live state is saved), then load the target desk's workspace set onto the live layout (the same serialize/rest… - [desk.quickLook](llms/layout.md#deskquicklook): QUICK-LOOK a symbol — chart it on the reusable "Quick look" scratch desk (created on first use, then OVERWRITTEN in place on each quick-look so the saved-desks… - [desk.rename](llms/layout.md#deskrename): Rename desk `id`. - [desk.reorder](llms/layout.md#deskreorder): Move desk `id` to index `toIndex` in the set order (clamped). - [desk.saveActive](llms/layout.md#desksaveactive): Checkpoint the ACTIVE desk from the live layout (write its current workspaces back + persist) without opening another. - [desk.saveAs](llms/layout.md#desksaveas): SAVE the CURRENT live layout as a NEW desk named `name`: checkpoint the active desk (the exact capture path `desk.open` runs on the outgoing desk), deep-copy i… - [desk.setDefaultMode](llms/layout.md#desksetdefaultmode): LAUNCHER P1 — set desk `id`'s DEFAULT MODE for NEW workspaces: "classic" | "orderflow" (Vasil's D1: mode lives per WORKSPACE; the desk holds the default for ne… - [desk.setDefaults](llms/layout.md#desksetdefaults): LAUNCHER P4 — patch desk `id`'s cell DEFAULTS: `interval` (any bar-clock interval code — time "1m"/"1h"/… or activity "T1000"/"V10"/"D1000000"; ONE enumeration… - [layout.maximizeCell](llms/layout.md#layoutmaximizecell): Maximize one chart cell so it fills the whole workspace, hiding + render-suspending the others (LAW 3 — the same capability as the per-cell corner button + Ctr… - [layout.restoreSplit](llms/layout.md#layoutrestoresplit): Restore the normal multi-cell grid after a `layout.maximizeCell` — un-maximizes (re-shows + resumes the other cells at their split geometry). - [layout.setActive](llms/layout.md#layoutsetactive): AI-layer H2 — make cell `index` the ACTIVE cell (LAW 3 — the same capability a human reaches by clicking a cell; keyboard, toolbox, and the agent-facing MCP fa… - [layout.setSplit](llms/layout.md#layoutsetsplit): Set the multi-cell grid layout to a preset (LAW 3 — the same capability the demo's layout picker, the command palette, and an agent all reach). - [layout.spawnCell](llms/layout.md#layoutspawncell): P5f — open a symbol/interval in a layout cell + optionally anchor the view on a historical bar range. - [layout.toggleMaximize](llms/layout.md#layouttogglemaximize): Toggle maximize for a chart cell — maximize it if not maximized, restore the grid if it is (LAW 3 — what the corner button + Ctrl+Shift+F do). - [pane.maximize](llms/layout.md#panemaximize): W3 (indicator-pane polish) — TOGGLE maximize on a pane: first dispatch gives the target pane the lion's share of the plot (every other pane drops to the 0.05 f… - [pane.move](llms/layout.md#panemove): W3 (indicator-pane polish) — reorder a SUBPANE one step up or down in the pane stack. - [pane.resetScale](llms/layout.md#paneresetscale): W3 (indicator-pane polish) — re-enable auto-scale on ONE pane's price scale so the next frame re-fits its value range to the visible data. - [pane.resize](llms/layout.md#paneresize): SP-4 — resize a pane to the given heightFraction (0..1). - [workspace.activateAll](llms/layout.md#workspaceactivateall): WS-2 — wake EVERY idle workspace at once: for each workspace not already Live, one-shot load current data + start its live feed (render stays suspended for the… - [workspace.capture](llms/layout.md#workspacecapture): WS-1 — write the CURRENT live layout state (split + per-cell config + drawings/indicators/scale snapshots) back into the active workspace, then persist. - [workspace.create](llms/layout.md#workspacecreate): Create a new workspace (a named layout you flip between like an OS virtual desktop). - [workspace.delete](llms/layout.md#workspacedelete): WS-1 — delete workspace `id`. - [workspace.duplicate](llms/layout.md#workspaceduplicate): WS-1 — duplicate workspace `id` (a deep copy of its captured split + per-cell config + snapshots), inserted right after the source. - [workspace.expo](llms/layout.md#workspaceexpo): WS-3 — toggle the Expo overview: a full-area overlay showing every workspace as a card (proportional split preview + per-cell symbol/interval), the active one… - [workspace.rename](llms/layout.md#workspacerename): WS-1 — rename workspace `id`. - [workspace.reorder](llms/layout.md#workspacereorder): WS-1 — move workspace `id` to index `toIndex` in the dock order (clamped). - [workspace.setMode](llms/layout.md#workspacesetmode): LAUNCHER P1 — set workspace `id`'s MODE: "classic" (the pre-MMT surface — the order-flow chrome affordances are hidden: the cvd/delta/volume-profile indicator… - [workspace.switch](llms/layout.md#workspaceswitch): WS-1 — make workspace `id` the live layout. ## privacy See [llms/privacy.md](llms/privacy.md). - [account.signIn.email.start](llms/privacy.md#accountsigninemailstart): F4 — begin email sign-in: the server rate-limits and mails a 6-digit OTP to `email`. - [account.signIn.email.verify](llms/privacy.md#accountsigninemailverify): F4 — verify the 6-digit OTP and open the session (sets the HttpOnly session cookie). - [account.signIn.oauth](llms/privacy.md#accountsigninoauth): F4 — begin an OAuth sign-in redirect (Google / GitHub via Arctic). - [account.signOut](llms/privacy.md#accountsignout): F4 — revoke this session (or, with `everywhere:true`, all sessions AND the trusted-device DEK). - [account.status](llms/privacy.md#accountstatus): F4 reader (Law 4) — the account session state: `{ signedIn, email?, userId?, provider?, providersAvailable, pendingEmail?, hasSync }`. - [privacy.setLocalOnly](llms/privacy.md#privacysetlocalonly): Set LOCAL-ONLY privacy mode (sets the `localOnly` setting; default ON). - [sync.device.trust](llms/privacy.md#syncdevicetrust): F4 — after unlock, store (`trust:true`) or forget (`trust:false`) the non-extractable device DEK for this device. - [sync.disable](llms/privacy.md#syncdisable): F4 — turn off sync: delete the account's server documents + key wrappers; this device drops to local-only. - [sync.enable](llms/privacy.md#syncenable): F4 — turn on E2E zero-knowledge sync: generate a random 256-bit DEK, derive `KEK=PBKDF2(passphrase,600k)`, wrap the DEK, generate + wrap a recovery key, PUT bo… - [sync.now](llms/privacy.md#syncnow): F4 — force a push of pending changes + a pull (drains the offline outbox too). - [sync.passphrase.change](llms/privacy.md#syncpassphrasechange): F4 — change the sync passphrase. - [sync.recovery.generate](llms/privacy.md#syncrecoverygenerate): F4 — generate a FRESH recovery key, wrap the live DEK with `HKDF(R)`, PUT the recovery wrapper (replaces any prior). - [sync.recovery.restore](llms/privacy.md#syncrecoveryrestore): F4 — recover access when the passphrase is lost: unwrap the DEK via the recovery key, then re-wrap with a NEW passphrase (the old one is unknown). - [sync.status](llms/privacy.md#syncstatus): F4 reader (Law 4) — the sync state: `{ enabled, state, locked, deviceTrusted, hasRecoveryKey, lastSyncedAtMs?, pendingCount, passphraseUpdatedAtMs?, recoveryUp… - [sync.unlock](llms/privacy.md#syncunlock): F4 — unlock the DEK on THIS device (new device / after sign-out). ## scale See [llms/scale.md](llms/scale.md). - [scale.reset](llms/scale.md#scalereset): Reset the price scale mode to linear, un-invert, and re-enable autoscale. - [scale.setMode](llms/scale.md#scalesetmode): Set the price scale projection mode explicitly. - [scale.setTimeMode](llms/scale.md#scalesettimemode): Set the HORIZONTAL axis label mode. - [scale.squareFit](llms/scale.md#scalesquarefit): PRICE/TIME SQUARING — recenter a locked Gann "square" on the visible data WITHOUT discarding it: keeps `R` (so the 1×1 stays a true 45°) and re-frames the pric… - [scale.squareFromMove](llms/scale.md#scalesquarefrommove): PRICE/TIME SQUARING — lock a Gann "square" from a two-point reference move (the Gann-correct primary): `R = |p2.price − p1.price| / |p2.bar − p1.bar|` becomes… - [scale.squareFromSelection](llms/scale.md#scalesquarefromselection): PRICE/TIME SQUARING — lock a Gann "square" from the CURRENTLY-SELECTED drawing: its first two anchors become the 1×1 (`R = |Δprice| / |Δbar|`). - [scale.squareLock](llms/scale.md#scalesquarelock): PRICE/TIME SQUARING — lock the main price axis to a Gann "square": pin price-units-per-bar-index `R` (`pricePerBar`, must be finite and > 0) so the 1×1 line re… - [scale.squareNatural](llms/scale.md#scalesquarenatural): PRICE/TIME SQUARING — a NATURAL square: span the VISIBLE DATA price range across `bars` bar-indexes ⇒ `R = visibleDataPriceSpan / bars`. - [scale.squareUnlock](llms/scale.md#scalesquareunlock): PRICE/TIME SQUARING — remove the Gann "square" lock from the main price axis and restore the floating (auto-scaled) axis exactly as before the lock. - [scale.toggleInvert](llms/scale.md#scaletoggleinvert): Flip the price axis upside-down (high prices at bottom). - [scale.toggleLog](llms/scale.md#scaletogglelog): Toggle the price scale between linear and log mode. - [scale.togglePercent](llms/scale.md#scaletogglepercent): Toggle between linear mode and percent mode. ## settings See [llms/settings.md](llms/settings.md). - [interval.favorite.pin](llms/settings.md#intervalfavoritepin): Pin an interval code as a QUICK favourite of its OWN bar formation (the TradingView starred-interval set). - [interval.favorite.unpin](llms/settings.md#intervalfavoriteunpin): Unpin an interval code from its bar formation's QUICK favourites (the mirror of `interval.favorite.pin`; removes the toolbar quick button). - [settings.reset](llms/settings.md#settingsreset): Reset ALL global settings to their defaults (profile-scoped). - [settings.set](llms/settings.md#settingsset): Set a GLOBAL engine setting (profile-scoped) — authoritative system-wide; existing desks read it live on render (no per-desk copy). ## ui See [llms/ui.md](llms/ui.md). - [alert.closeDialog](llms/ui.md#alertclosedialog): Close the Create/Edit Alert dialog without saving. - [alert.closePanel](llms/ui.md#alertclosepanel): Close the Alerts side panel. - [alert.openDialog](llms/ui.md#alertopendialog): Open the compact floating Create/Edit Alert dialog (TradingView's Create Alert modal shape: condition · trigger · expiration · name · message · Cancel/Create). - [alert.openPanel](llms/ui.md#alertopenpanel): Open the Alerts right-docked side panel — the MANAGER view over the alert set (state chips + enable toggles + edit/delete, a triggered-log tab, a "+ Create ale… - [backtest.closeReport](llms/ui.md#backtestclosereport): Close the Backtest Report overlay. - [backtest.openReport](llms/ui.md#backtestopenreport): Open the expandable full Backtest Report overlay for the most recently completed run — a tabbed Strategy Tester (Overview → Performance → Trades → Risk ratios… - [chart.settings.open](llms/ui.md#chartsettingsopen): Open the floating chart Settings dialog (the TradingView right-click empty chart space → Settings… dialog; also a gear button). - [data.closeSymbolSearch](llms/ui.md#dataclosesymbolsearch): Close the symbol-search overlay. - [data.openSymbolSearch](llms/ui.md#dataopensymbolsearch): TV-PARITY P2 (fork F-5) — open the symbol-search overlay: a centered type-ahead over the venues' tradable catalogs (a flat ranked list, filterable by asset-cla… - [drawing.rail.preset.create](llms/ui.md#drawingrailpresetcreate): Create a new CUSTOM Drawing Rail toolbar with EMPTY slots and make it active (the legacy preset name for `drawing.rail.toolbar.create`). - [drawing.rail.preset.delete](llms/ui.md#drawingrailpresetdelete): Delete a custom Drawing Rail toolbar by `id` (the legacy preset name for the toolbar delete). - [drawing.rail.preset.duplicate](llms/ui.md#drawingrailpresetduplicate): Legacy preset name — on the slot model this creates a fresh CUSTOM toolbar with EMPTY slots named `name` and makes it active (slot contents are NOT copied; `id… - [drawing.rail.preset.rename](llms/ui.md#drawingrailpresetrename): Rename a custom Drawing Rail toolbar (the legacy preset name for the toolbar rename). - [drawing.rail.preset.select](llms/ui.md#drawingrailpresetselect): Switch the active Drawing Rail toolbar to `id` (the legacy preset name for the toolbar select) — `default` for the built-in Default, or a custom toolbar id who… - [drawing.rail.reset](llms/ui.md#drawingrailreset): RETIRED (slot model) — a no-op that emits a warning. - [drawing.rail.slot.clear](llms/ui.md#drawingrailslotclear): Clear a custom Drawing Rail toolbar slot to EMPTY in place. - [drawing.rail.slot.set](llms/ui.md#drawingrailslotset): Set a custom Drawing Rail toolbar slot's WHOLE configuration ATOMICALLY: its MAIN tool (the slot's fixed button face) AND its SECONDARY tools (the extra tools… - [drawing.rail.slot.setMain](llms/ui.md#drawingrailslotsetmain): Set the MAIN tool of a custom Drawing Rail toolbar slot. - [drawing.rail.toggle](llms/ui.md#drawingrailtoggle): Collapse or expand the Drawing Rail — the persistent left-column drawing toolbar (cursor + the tool group/slot buttons + the utility cluster). - [drawing.rail.toolbar.create](llms/ui.md#drawingrailtoolbarcreate): Create a new CUSTOM Drawing Rail toolbar with 6 EMPTY slots and make it the active toolbar (in edit mode). - [edit.redo](llms/ui.md#editredo): Re-apply the most recently undone drawing operation on this cell. - [edit.undo](llms/ui.md#editundo): Undo the most recent drawing operation on this cell (create / delete / move / anchor edit / lock / hide / flip / mirror). - [indicator.acceptLibraryEntry](llms/ui.md#indicatoracceptlibraryentry): H1 accept gate — mark a PENDING library entry as accepted, binding the acceptance to the entry's current CODE HASH (a later save with different code re-pends i… - [indicator.applyTemplate](llms/ui.md#indicatorapplytemplate): TV-PARITY P8.3 — attach a saved template's indicator set onto the active cell. - [indicator.attach](llms/ui.md#indicatorattach): Attach an indicator by key to the active cell's chart. - [indicator.closeEditor](llms/ui.md#indicatorcloseeditor): Close the custom indicator editor. - [indicator.closePicker](llms/ui.md#indicatorclosepicker): Close the indicator picker dialog. - [indicator.closeSettings](llms/ui.md#indicatorclosesettings): Close the indicator inputs panel. - [indicator.closeTray](llms/ui.md#indicatorclosetray): Close the Indicator tray. - [indicator.deleteFromLibrary](llms/ui.md#indicatordeletefromlibrary): Permanently remove a library entry from localStorage. - [indicator.deleteTemplate](llms/ui.md#indicatordeletetemplate): TV-PARITY P8.3 — permanently remove a saved indicator template from the profile's localStorage. - [indicator.duplicate](llms/ui.md#indicatorduplicate): Clone an attached indicator with the same params. - [indicator.listTemplates](llms/ui.md#indicatorlisttemplates): TV-PARITY P8.3 — list the profile's saved indicator templates as DATA (each {name, count, savedAt}, newest first). - [indicator.loadFromLibrary](llms/ui.md#indicatorloadfromlibrary): Re-load a library entry into the registry (calls `loadFromCode` with the stored source). - [indicator.openEditor](llms/ui.md#indicatoropeneditor): Open the custom indicator editor — Monaco-backed bottom-docked panel (Ctrl+Shift+I). - [indicator.openPicker](llms/ui.md#indicatoropenpicker): Open the indicator picker dialog (Ctrl+I). - [indicator.openSettings](llms/ui.md#indicatoropensettings): Open the inputs panel for the indicator handle. - [indicator.openTray](llms/ui.md#indicatoropentray): Open the Indicator tray — the right-docked panel where agent-authored (and gate-held human) library entries wait PENDING with their provenance (authoredBy, mod… - [indicator.pinDefaults](llms/ui.md#indicatorpindefaults): Save the indicator handle's current params as the user's preferred defaults for that indicator key. - [indicator.remove](llms/ui.md#indicatorremove): Detach + dispose the indicator handle. - [indicator.saveTemplate](llms/ui.md#indicatorsavetemplate): TV-PARITY P8.3 — save the active cell's CURRENT attached indicators as a NAMED template (`{key, params, pane placement}`), profile-scoped in localStorage. - [indicator.saveToLibrary](llms/ui.md#indicatorsavetolibrary): Save an indicator def's source code to the per-user library (localStorage). - [indicator.setParams](llms/ui.md#indicatorsetparams): Update an attached indicator handle's params (period, source, etc.). - [indicator.setStyle](llms/ui.md#indicatorsetstyle): Update an attached indicator handle's per-output style overrides (color / line width / line style). - [indicator.toggleVisibility](llms/ui.md#indicatortogglevisibility): Flip the visibility of every mark owned by the indicator handle. - [inventory.close](llms/ui.md#inventoryclose): Close the Inventory panel if it is open. - [inventory.open](llms/ui.md#inventoryopen): Open the Inventory panel (browsable drawing-tool catalog) if it is closed. - [inventory.openForRail](llms/ui.md#inventoryopenforrail): Open the Inventory panel in FILL-SLOT mode — the browsable drawing-tool catalog as a MULTI-SELECT slot builder. - [inventory.toggle](llms/ui.md#inventorytoggle): Open or close the Inventory panel — the browsable catalog of EVERY drawing tool grouped by TradingView category (the full ~90-tool set, vs the Pebble's curated… - [journal.checkpoint](llms/ui.md#journalcheckpoint): Write a checkpoint to the reasoning journal — a tagged note (the operator's save-point / current thesis) surfaced prominently as `chart.journal.briefing().last… - [journal.closePanel](llms/ui.md#journalclosepanel): Close the BT-Journal side panel. - [journal.decision](llms/ui.md#journaldecision): Record a typed decision in the reasoning journal — a human-readable `reason` plus an optional coarse `decisionType` and/or a rich `action`. - [journal.hypothesis](llms/ui.md#journalhypothesis): Open a research hypothesis in the reasoning journal — a claim to test (status starts "open"). - [journal.note](llms/ui.md#journalnote): Append a free-form note to the chart-scoped reasoning journal (BT-Journal) — durable working memory that survives a context boundary (compaction / agent handof… - [journal.openPanel](llms/ui.md#journalopenpanel): Open the BT-Journal right-docked side panel — the human-facing VIEW over the reasoning journal (a chronological timeline with kind-filter chips + JSON/markdown… - [journal.resolve](llms/ui.md#journalresolve): Resolve an open hypothesis or watch in the reasoning journal (append-only — the original "open" entry is kept in the log; the projection shows the resolved sta… - [journal.watch](llms/ui.md#journalwatch): Add a watch to the reasoning journal — a standing intention in reasoning form ("if BTC loses 78k, exit"), status "open". - [objectTree.close](llms/ui.md#objecttreeclose): Close the Object Tree side-panel if it is open. - [objectTree.open](llms/ui.md#objecttreeopen): Open the Object Tree side-panel if it is closed. - [objectTree.toggle](llms/ui.md#objecttreetoggle): Open or close the Object Tree side-panel. - [replay.addBreakpoint](llms/ui.md#replayaddbreakpoint): Add a replay breakpoint — the clock pauses + a `replay.breakpoint` event fires when the condition first holds (rising edge, so a level reads as a CROSSING). - [replay.closeBar](llms/ui.md#replayclosebar): UI-only — dismiss the Replay HUD. - [replay.create](llms/ui.md#replaycreate): Build the active visual replay over the chart's loaded bars (replaces any prior active replay). - [replay.jumpToLive](llms/ui.md#replayjumptolive): Reveal to the latest loaded bar WITHOUT disposing the replay — jumps the clock to the last close so every cell reveals its final bar and parks there. - [replay.openBar](llms/ui.md#replayopenbar): UI-only — summon the Replay HUD (the transport shell). - [replay.pause](llms/ui.md#replaypause): Pause the active replay clock (stops the animation; keeps the current time so `replay.start` resumes). - [replay.pickStart](llms/ui.md#replaypickstart): UI-only — arm the chart-click start-picker: the next click on a bar becomes `replay.create({startTs: that bar's open})` (the create fires on click). - [replay.removeBreakpoint](llms/ui.md#replayremovebreakpoint): Remove a replay breakpoint by id (read ids from `chart.replay.state().breakpoints`). - [replay.rewind](llms/ui.md#replayrewind): Pause the active replay and seek back to the start. - [replay.seek](llms/ui.md#replayseek): Index-native seek — the scrubber's spine. - [replay.setNow](llms/ui.md#replaysetnow): Seek the replay clock to an absolute synthetic time (tsNanos as a string). - [replay.setSpeed](llms/ui.md#replaysetspeed): Set the replay speed multiplier (synthetic-time per real-time; clamped to ≥ 0, 0 = paused). - [replay.start](llms/ui.md#replaystart): Start (or resume) the active replay clock — animates via requestAnimationFrame, revealing bars as synthetic time advances at the current speed. - [replay.step](llms/ui.md#replaystep): Reveal exactly the next bar (event-driven — seeks the clock to the soonest next bar-close across the replayed cells). - [replay.stepBack](llms/ui.md#replaystepback): Step one bar backward on the primary cell (the mirror of `replay.step`) — seeks the clock to the primary's previous bar-close so it reveals one fewer bar. - [replay.stop](llms/ui.md#replaystop): Tear down the active visual replay entirely — disposes the clock + sync bus + rAF pump + any attached strategy/breakpoints + watchdog and returns the chart to… - [sandbox.accept](llms/ui.md#sandboxaccept): Accept a ghost proposal by id — promotes it to a real, persisted, editable drawing and removes the ghost. - [sandbox.clearProposals](llms/ui.md#sandboxclearproposals): Discard ALL outstanding ghost proposals at once (none are promoted to drawings). - [sandbox.propose](llms/ui.md#sandboxpropose): Render finder candidates as GHOST drawings of a registered drawing tool (`toolKey`) for the human to accept/reject — the geometric "scan → propose candidates"… - [sandbox.reject](llms/ui.md#sandboxreject): Reject (discard) a single ghost proposal by id. - [sandbox.reset](llms/ui.md#sandboxreset): RESET the per-user sandbox overlay — clears all ghost proposals + unregisters and un-persists every AI-authored DRAWING TOOL (from `drawing.defineTool`), retur… - [sandbox.run](llms/ui.md#sandboxrun): Run an AI-authored geometric FINDER algo in an isolated, killable Web Worker (the per-user sandbox). - [strategy.acceptStrategy](llms/ui.md#strategyacceptstrategy): ACCEPT a PENDING source-compiled strategy by key (one authored over the wire via `strategy.register` with `def.source`) — clears the pending flag (the strategy… - [strategy.closeBacktestSidebar](llms/ui.md#strategyclosebacktestsidebar): Close the BT-1 Backtest sidebar. - [strategy.openBacktestSidebar](llms/ui.md#strategyopenbacktestsidebar): Open the BT-1 right-docked Backtest sidebar — the human-facing panel that picks a strategy, sets params, runs a backtest, and reads metrics + equity curve. - [strategy.rejectStrategy](llms/ui.md#strategyrejectstrategy): REJECT a PENDING source-compiled strategy by key — unregisters + discards it (it was never persisted, so it simply disappears; any persisted entry is also remo… - [strategy.runBacktest](llms/ui.md#strategyrunbacktest): Run a backtest of the registered strategy against the chart's primary bars. - [strategy.unregister](llms/ui.md#strategyunregister): Remove a strategy from the registry by key. - [watchlist.closePanel](llms/ui.md#watchlistclosepanel): Close the Watchlist side panel. - [watchlist.openPanel](llms/ui.md#watchlistopenpanel): Open the Watchlist right-docked side panel: list picker (+ new / ✎ rename / 🗑 delete), rows with LIVE last price + day % (one shared 1d-kline subscription per… - [widgets.close](llms/ui.md#widgetsclose): Close (remove) the open Order Flow widget instance of `kind` from the host. - [widgets.closePanel](llms/ui.md#widgetsclosepanel): Close (hide) the Order Flow widget host. - [widgets.open](llms/ui.md#widgetsopen): Open an Order Flow widget INSTANCE of `kind` inside the host panel (opens the host first if closed; at most ONE instance per kind — a re-open is an idempotent… - [widgets.openPanel](llms/ui.md#widgetsopenpanel): Open the ORDER FLOW widget host — the right-docked panel that stacks the open OF widget instances (Trades tape, later DOM / Order Book) vertically. - [widgets.setOption](llms/ui.md#widgetssetoption): Set one of an open Order Flow widget instance's OWN options (per-widget, independent of the cells — the MMT model). - [widgets.setSymbol](llms/ui.md#widgetssetsymbol): Set an open Order Flow widget instance's OWN `{symbol, source}` binding (per-widget, independent of the cells — the MMT model). - [widgets.toggle](llms/ui.md#widgetstoggle): Toggle the Order Flow widget instance of `kind`: closed → open (host shown first), open → removed. ## viewport See [llms/viewport.md](llms/viewport.md). - [viewport.fitContent](llms/viewport.md#viewportfitcontent): Reset the chart to show all loaded data and re-enable per-pane autoscale. - [viewport.frameLatest](llms/viewport.md#viewportframelatest): Open the chart well-framed: last `count` bars (default 1000) with a right-side gap, latest price centred vertically, autoscale locked off. - [viewport.showBarRange](llms/viewport.md#viewportshowbarrange): Snap the horizontal viewport to a specific bar-index range [from, to] and lock the horizontal scale so the per-frame auto-fit doesn't override it. - [viewport.showLastBars](llms/viewport.md#viewportshowlastbars): Snap the horizontal viewport to the last N bars across the union of all series and lock the horizontal scale so the per-frame auto-fit doesn't override it.