Skip to content

Interface: WorkspaceService

Defined in: packages/sdk/src/workspace-service.ts:232

Consumer API for workspace state, exposed as ExtensionContext.workspaces. Read via getState / subscribe; drive via the create/rename/ close methods. Opening editor tabs lives on ExtensionContext.editors, not here.

Methods

getState()

ts
getState(): WorkspaceState;

Defined in: packages/sdk/src/workspace-service.ts:234

Current frozen view of workspace state.

Returns

WorkspaceState


subscribe()

ts
subscribe(listener): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:235

Parameters

listener

(s) => void

Returns

Disposable


get()

ts
get(id): Workspace | undefined;

Defined in: packages/sdk/src/workspace-service.ts:240

The workspace with this id, or undefined. A one-shot lookup for event handlers; for reactive reads use useServiceState over the state.

Parameters

id

string

Returns

Workspace | undefined


createFromFolderPicker()

ts
createFromFolderPicker(): Promise<Workspace | null>;

Defined in: packages/sdk/src/workspace-service.ts:242

Show a folder picker and create a workspace from the chosen folder.

Returns

Promise<Workspace | null>


create()

ts
create(input): Workspace;

Defined in: packages/sdk/src/workspace-service.ts:243

Parameters

input

CreateWorkspaceInput

Returns

Workspace


rename()

ts
rename(id, name): void;

Defined in: packages/sdk/src/workspace-service.ts:244

Parameters

id

string

name

string

Returns

void


reorder()

ts
reorder(
   from, 
   to, 
   position): void;

Defined in: packages/sdk/src/workspace-service.ts:251

Move a workspace to a new position relative to a reference workspace.

Parameters

from

string

Id of the workspace being dragged / moved.

to

string

Id of the reference workspace (the insertion anchor).

position

"before" | "after"

Whether to place from before or after to.

Returns

void


activate()

ts
activate(id): void;

Defined in: packages/sdk/src/workspace-service.ts:253

Activate (and reopen if closed).

Parameters

id

string

Returns

void


close()

ts
close(id): void;

Defined in: packages/sdk/src/workspace-service.ts:255

Soft close — workspace stays saved but is hidden from the active list.

Parameters

id

string

Returns

void


reopen()

ts
reopen(id): void;

Defined in: packages/sdk/src/workspace-service.ts:257

Reverse of close.

Parameters

id

string

Returns

void


addFolder()

ts
addFolder(id, folder): void;

Defined in: packages/sdk/src/workspace-service.ts:259

Add an extra folder to a workspace (no-op if already present or is the primary).

Parameters

id

string

folder

string

Returns

void


removeFolder()

ts
removeFolder(id, folder): void;

Defined in: packages/sdk/src/workspace-service.ts:261

Remove an extra folder from a workspace.

Parameters

id

string

folder

string

Returns

void


delete()

ts
delete(id): Promise<void>;

Defined in: packages/sdk/src/workspace-service.ts:270

Hard delete — permanent removal. Also reaps every terminal in the workspace (removes records and kills live PTY sessions); callers do not need a separate TerminalService.closeWorkspace step. The entry is removed from state synchronously (before this returns); the returned promise resolves once the reaped PTYs have actually been killed, for callers (e.g. tests) that need that guarantee. Most callers can ignore it.

Parameters

id

string

Returns

Promise<void>


setStatus()

ts
setStatus(workspaceId, row): void;

Defined in: packages/sdk/src/workspace-service.ts:276

Imperatively adorn a workspace row with a status line. row.id is the adornment key for WorkspaceService.clearStatus.

Parameters

workspaceId

string

row

WorkspaceStatusRow

Returns

void


clearStatus()

ts
clearStatus(workspaceId, rowId): void;

Defined in: packages/sdk/src/workspace-service.ts:279

Remove an imperative status row previously set via WorkspaceService.setStatus.

Parameters

workspaceId

string

rowId

string

Returns

void


bindStatus()

ts
bindStatus(binder): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:299

Keep a status projection in sync for every workspace. provide returns an array of rows (may be empty). Prefer this over repeatedly calling WorkspaceService.setStatus.

Parameters

binder

WorkspaceStatusProvider

Returns

Disposable

Example

ts
ctx.subscriptions.push(
  ctx.workspaces.bindStatus({
    id: "my-ext.status",
    provide(workspaceId) {
      const running = getRunningTasks(workspaceId);
      return running.map(t => ({ id: t.id, activity: "working", label: t.name, startedAt: t.startedAt }));
    },
  }),
);

registerStatus()

ts
registerStatus(provider): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:304

Parameters

provider

WorkspaceStatusProvider

Returns

Disposable

Deprecated

Prefer WorkspaceService.bindStatus.


getStatus()

ts
getStatus(workspaceId): WorkspaceStatusRow[];

Defined in: packages/sdk/src/workspace-service.ts:311

Concatenate imperative rows and all binders' rows for one workspace (in binder registration order). Called synchronously during panel render — binders must be fast and side-effect-free.

Parameters

workspaceId

string

Returns

WorkspaceStatusRow[]


invalidateStatus()

ts
invalidateStatus(): void;

Defined in: packages/sdk/src/workspace-service.ts:322

Signal that binder data has changed. Fires all listeners registered via WorkspaceService.subscribeStatus, causing the Workspaces panel to re-query binders and re-render the status rows.

Call this after any mutation to the state your provide function reads. Imperative WorkspaceService.setStatus / WorkspaceService.clearStatus already notify listeners.

Returns

void


subscribeStatus()

ts
subscribeStatus(listener): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:330

Subscribe to status invalidations. The listener is called whenever WorkspaceService.invalidateStatus is invoked (or imperative set/clear runs). Returns a Disposable that cancels the subscription.

Parameters

listener

() => void

Returns

Disposable


registerSection()

ts
registerSection(provider): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:354

Register a section provider that mounts a React component inside workspace rows in the Workspaces side panel. Returns a Disposable that unregisters the provider and unmounts the component from all rows.

Return null from your component for workspaces where the section should not appear — this produces no DOM node and no visual gap.

Parameters

provider

WorkspaceSectionProvider

Returns

Disposable

Example

tsx
ctx.subscriptions.push(
  ctx.workspaces.registerSection({
    id: "my-ext.section",
    component: ({ workspaceId }) => {
      const ws = ctx.workspaces.get(workspaceId);
      if (!ws?.terminals.length) return null;
      return <MyCard terminals={ws.terminals} />;
    },
  }),
);

subscribeSection()

ts
subscribeSection(listener): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:371

Subscribe to section registration changes. The listener is called whenever a WorkspaceSectionProvider is registered or unregistered. Returns a Disposable that cancels the subscription.

The Workspaces panel subscribes internally to re-render when providers are added or removed.

No invalidateSection by design. Unlike status rows and badges, a section is a live React component that re-renders on its own internal or context-driven state changes — it is not a snapshot returned from a provide() call, so there is nothing for the host to re-query. If a section needs to trigger a full workspace-panel refresh (rare), it should update its own state directly.

Parameters

listener

() => void

Returns

Disposable


registerPropertyPage()

ts
registerPropertyPage(page): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:396

Register a property page that adds a tab to the workspace properties modal. The host composes all registered pages into the modal's tab bar, after the built-in General tab. The extension is responsible for persisting its settings via ctx.storage.workspace, immediately on change — the modal has no Save button.

Returns a Disposable that unregisters the page and unmounts the component from any open properties modal.

Parameters

page

WorkspacePropertyPage

Returns

Disposable

Example

tsx
ctx.subscriptions.push(
  ctx.workspaces.registerPropertyPage({
    id: "silo.github-actions.properties",
    title: "GitHub Actions",
    icon: <IconGitHub size={14} />,
    component: GhActionsWorkspaceSettings,
    visible: (ws) => hasDetectedRepo(ws.id),
  }),
);

getOpenWorkspaceMenuItems()

ts
getOpenWorkspaceMenuItems(): Promise<MenuEntry[]>;

Defined in: packages/sdk/src/workspace-service.ts:422

The rows of the Open Workspace menu — the same menu the Navigator's + button opens: any saved groups, then closed workspaces to reopen (a missing folder is flagged), a separator, then "New workspace…" and "New Group…".

Use it to offer workspace switching from your own UI without rebuilding the list — the returned entries drop straight into UiService.showMenu, including as a submenu of one of your own rows. Async because the closed-workspace rows check whether each folder still exists on disk.

Returns

Promise<MenuEntry[]>

Example

ts
ctx.ui.showMenu({
  items: [
    { label: "Refresh", run: refresh },
    { type: "separator" },
    { label: "Workspace", submenu: await ctx.workspaces.getOpenWorkspaceMenuItems() },
  ],
  anchor,
});

getWorkspaceMenuItems()

ts
getWorkspaceMenuItems(workspaceId): MenuEntry[];

Defined in: packages/sdk/src/workspace-service.ts:450

The rows of one workspace's context menu — Properties…, Close, then whatever extensions contributed on the "workspace"surface.

Use it when your own UI names a workspace without being the workspace list — an agent row showing which workspace its terminal lives in, a search result grouped by workspace — so the same actions are one right-click away there too. Returns an empty array for an unknown id.

Group membership actions (Move to Group, Remove from Group) are not included: group state is host-internal (ADR 0023), so the Workspaces view appends those itself.

Parameters

workspaceId

string

Returns

MenuEntry[]

Example

ts
ctx.ui.showMenu({
  items: [
    { label: "Mark as seen", run: acknowledge },
    { type: "separator" },
    { label: ws.name, submenu: ctx.workspaces.getWorkspaceMenuItems(ws.id) },
  ],
  at: { x: e.clientX, y: e.clientY },
});

setBadge()

ts
setBadge(workspaceId, badge): void;

Defined in: packages/sdk/src/workspace-service.ts:456

Imperatively adorn a workspace name with a badge. badge.id is the adornment key for WorkspaceService.clearBadge.

Parameters

workspaceId

string

badge

WorkspaceBadge

Returns

void


clearBadge()

ts
clearBadge(workspaceId, badgeId): void;

Defined in: packages/sdk/src/workspace-service.ts:459

Remove an imperative badge previously set via WorkspaceService.setBadge.

Parameters

workspaceId

string

badgeId

string

Returns

void


bindBadge()

ts
bindBadge(binder): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:479

Keep a badge projection in sync for every workspace. provide returns an array of badges (may be empty).

Parameters

binder

WorkspaceBadgeProvider

Returns

Disposable

Example

ts
ctx.subscriptions.push(
  ctx.workspaces.bindBadge({
    id: "my-ext.badges",
    provide(workspaceId) {
      const status = getStatus(workspaceId);
      if (!status) return [];
      return [{ id: "status", text: status.label, color: status.color }];
    },
  }),
);

registerBadge()

ts
registerBadge(provider): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:484

Parameters

provider

WorkspaceBadgeProvider

Returns

Disposable

Deprecated

Prefer WorkspaceService.bindBadge.


getBadges()

ts
getBadges(workspaceId): WorkspaceBadge[];

Defined in: packages/sdk/src/workspace-service.ts:490

Concatenate imperative badges and all binders' badges for one workspace (in binder registration order).

Parameters

workspaceId

string

Returns

WorkspaceBadge[]


invalidateBadges()

ts
invalidateBadges(): void;

Defined in: packages/sdk/src/workspace-service.ts:496

Signal that badge binder data has changed. Imperative set/clear already notify listeners.

Returns

void


subscribeBadges()

ts
subscribeBadges(listener): Disposable;

Defined in: packages/sdk/src/workspace-service.ts:501

Subscribe to badge invalidations.

Parameters

listener

() => void

Returns

Disposable