Skip to content

Manage Sitemap

The Sitemap SDK allows you to interact with the Sitemap page, manage entries, work with the tree structure, control scope, add indicators, and extend editors with custom functionality.

Entry Management

Getting Tree Entries

To retrieve all sitemap entries in tree format:

ts
const entries = sdk.sitemap.getTreeEntries();

This returns root entries (SitemapRootEntry) that contain the full tree structure. Each entry has:

  • id - The unique identifier
  • label - The display label
  • kind - The entry type (Domain, Directory, Request, etc.)
  • parentId - Optional parent entry ID
  • childState - Whether children are loaded, loading, or not loaded

Loading Children

To load children for a specific entry (if they haven't been loaded yet):

ts
const children = await sdk.sitemap.getChildren(entryId);

This will fetch and load children asynchronously if they haven't been loaded yet.

Entry Kinds

Sitemap entries can be of different kinds:

ts
import { SitemapEntryKind } from "@caido/sdk-frontend";

// Available kinds:
SitemapEntryKind.Domain      // "DOMAIN"
SitemapEntryKind.Directory   // "DIRECTORY"
SitemapEntryKind.Request     // "REQUEST"
SitemapEntryKind.RequestBody // "REQUEST_BODY"
SitemapEntryKind.RequestQuery // "REQUEST_QUERY"

Scope Management

Getting Current Scope

To get the current scope ID:

ts
const scopeId = sdk.sitemap.getScopeId();

Returns undefined if no scope is currently set.

Setting Scope

To set the current scope:

ts
await sdk.sitemap.setScope(scopeId);

Pass undefined to clear the current scope.

TIP

For more information on scopes, see the Scopes guide.

Adding Indicators

Indicators are visual badges displayed next to entry names in the sitemap tree. They're useful for highlighting important entries or showing status information.

Adding an Entry Indicator

ts
const indicator = sdk.sitemap.addEntryIndicator(entryId, {
  icon: "fas fa-exclamation-triangle",
  description: "Security warning",
});

The addEntryIndicator method returns a handle object with a remove method to remove the indicator later:

ts
// Later, remove the indicator
indicator.remove();

Listening to Child State Updates

You can listen for changes to entry child states (when children are loaded, loading, etc.):

ts
const handle = sdk.sitemap.onEntryChildStateUpdate((event) => {
  console.log(`Entry ${event.entryId} child state changed:`, event.newChildState);
});

// Later, stop listening
handle.stop();

The event contains:

  • entryId - The ID of the entry that changed
  • newChildState - The new child state ("LOADED", "LOADING", or "NOT_LOADED")

Extending Editors

You can add CodeMirror extensions to the request editor on the Sitemap page:

ts
import { Extension } from "@codemirror/state";

const myExtension: Extension = [
  // Your CodeMirror extension configuration
];

sdk.sitemap.addRequestEditorExtension(myExtension);

For more information on creating editor extensions, see the Extend Editors guide.

Adding View Modes

You can add custom request and response view modes to the Sitemap page:

Request View Modes

ts
sdk.sitemap.addRequestViewMode({
  label: "My Custom View",
  view: {
    component: MyComponent,
  },
});

Response View Modes

ts
sdk.sitemap.addResponseViewMode({
  label: "My Custom Response View",
  view: {
    component: MyResponseComponent,
  },
});

For more information on creating view modes, see the Add View Modes guide.

Page Context

You can access the Sitemap page context to get information about the current state:

ts
const context = sdk.window.getPageContext();
if (context?.kind === "Sitemap") {
  // Access Sitemap-specific context
  const { entrySelection, requestSelection } = context;
}

The Sitemap page context includes:

  • kind - Always "Sitemap"
  • entrySelection - Current entry selection
  • requestSelection - Current request selection

Examples

Entry Highlighter Plugin

This example adds indicators to entries based on their type:

ts
import type { Caido } from "@caido/sdk-frontend";
import { SitemapEntryKind } from "@caido/sdk-frontend";

export type CaidoSDK = Caido;

export const init = (sdk: CaidoSDK) => {
  const highlightEntries = () => {
    const entries = sdk.sitemap.getTreeEntries();
    
    const processEntry = (entry: any) => {
      // Add indicator for request entries
      if (entry.kind === SitemapEntryKind.Request) {
        sdk.sitemap.addEntryIndicator(entry.id, {
          icon: "fas fa-file-code",
          description: "Request entry",
        });
      }
      
      // Recursively process children if they exist
      if (entry.children) {
        entry.children.forEach(processEntry);
      }
    };
    
    entries.forEach(processEntry);
  };

  // Highlight entries when sitemap is accessed
  sdk.navigation.onPageChange((page) => {
    if (page.id === "sitemap") {
      highlightEntries();
    }
  });
};

Scope-Based Entry Filter

This example monitors scope changes and highlights entries that match the current scope:

ts
import type { Caido } from "@caido/sdk-frontend";

export type CaidoSDK = Caido;

export const init = (sdk: CaidoSDK) => {
  let currentScopeId: string | undefined;
  const indicators = new Map<string, any>();

  const updateHighlights = () => {
    // Remove old indicators
    indicators.forEach((indicator) => indicator.remove());
    indicators.clear();

    if (!currentScopeId) return;

    const entries = sdk.sitemap.getTreeEntries();
    
    const processEntry = (entry: any) => {
      // Add indicator for entries in scope
      // (This is a simplified example - you'd check actual scope matching)
      if (entry.kind === "REQUEST") {
        const indicator = sdk.sitemap.addEntryIndicator(entry.id, {
          icon: "fas fa-check-circle",
          description: "In scope",
        });
        indicators.set(entry.id, indicator);
      }
      
      if (entry.children) {
        entry.children.forEach(processEntry);
      }
    };
    
    entries.forEach(processEntry);
  };

  // Listen for scope changes
  sdk.navigation.onPageChange((page) => {
    if (page.id === "sitemap") {
      const newScopeId = sdk.sitemap.getScopeId();
      if (newScopeId !== currentScopeId) {
        currentScopeId = newScopeId;
        updateHighlights();
      }
    }
  });
};

Child State Monitor

This example monitors child state changes and logs when entries are being loaded:

ts
import type { Caido } from "@caido/sdk-frontend";

export type CaidoSDK = Caido;

export const init = (sdk: CaidoSDK) => {
  const handle = sdk.sitemap.onEntryChildStateUpdate((event) => {
    if (event.newChildState === "LOADING") {
      sdk.log.info(`Loading children for entry: ${event.entryId}`);
    } else if (event.newChildState === "LOADED") {
      sdk.log.info(`Children loaded for entry: ${event.entryId}`);
    }
  });

  // Cleanup on plugin unload (if your plugin supports it)
  // handle.stop();
};