// biome-ignore-all format: generated file // biome-ignore-all lint: generated file /** * AUTO-GENERATED by scripts/generate-app-sdk.ts — do NOT edit by hand. * Sources: cli/lib/command-registry.ts + cli/lib/app-sdk-surface.ts. * Re-run `bun run app-sdk:generate` after changing either. */ export const APP_SDK_VERSION = "2.0.0"; export type AppSdkOperationInfo = { id: string; group: string; summary: string; cli: string; method: string; path: string; permission: string | null; deprecated?: true; pathParams: string[]; }; export type AppSdkMethodInfo = { kind: "host" | "op" | "api"; permission: string | null; op?: string; deprecated?: string; doc: string; }; /** Every permission scope an app may declare in .dench.yaml. */ export const APP_SDK_SCOPES = [ "agent-config:read", "agent-config:write", "agent:invoke", "ai:chat", "approvals:read", "approvals:write", "apps:message", "apps:read", "apps:write", "auth:write", "billing:read", "billing:write", "browser:read", "browser:write", "campaigns:read", "campaigns:write", "clipboard:read", "clipboard:write", "crm:read", "crm:write", "cron:schedule", "email:read", "email:write", "environments:read", "environments:write", "files:read", "files:write", "http:external", "image:write", "integrations:read", "integrations:write", "lists:read", "lists:write", "meetings:read", "meetings:write", "members:read", "members:write", "memory:read", "memory:write", "notifications:read", "notifications:write", "search:read", "secrets:read", "secrets:write", "settings:read", "settings:write", "store:read", "store:write", "ui", "web:read", "webhooks:receive", "workspace:read", "workspace:write" ] as const; export type AppSdkScope = (typeof APP_SDK_SCOPES)[number]; /** Every public /api/v1 operation reachable through dench.api.call. */ export const APP_SDK_OPERATIONS: readonly AppSdkOperationInfo[] = [ {"id":"environments.list","group":"environments","summary":"List workspace-shared reusable setups and ready revisions (metadata only).","cli":"dench env list","method":"GET","path":"/environments","permission":"environments:read","pathParams":[]}, {"id":"environments.get","group":"environments","summary":"Inspect a saved setup, its manifest, and an optional immutable revision.","cli":"dench env show","method":"GET","path":"/environments/{name}","permission":"environments:read","pathParams":["name"]}, {"id":"environments.upload","group":"environments","summary":"Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving.","cli":"dench env save","method":"POST","path":"/environments/uploads","permission":"environments:write","pathParams":[]}, {"id":"environments.save","group":"environments","summary":"Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task.","cli":"dench env save","method":"POST","path":"/environments/{name}","permission":"environments:write","pathParams":["name"]}, {"id":"environments.delete","group":"environments","summary":"Retire a saved setup from new selection; retain immutable revisions and active job evidence.","cli":"dench env delete","method":"DELETE","path":"/environments/{name}","permission":"environments:write","pathParams":["name"]}, {"id":"secrets.list","group":"secrets","summary":"List workspace-shared credential names, kinds and versions; never values.","cli":"dench secrets list","method":"GET","path":"/secrets","permission":"secrets:read","pathParams":[]}, {"id":"secrets.set","group":"secrets","summary":"Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts.","cli":"dench secrets set","method":"PUT","path":"/secrets/{name}","permission":"secrets:write","pathParams":["name"]}, {"id":"secrets.delete","group":"secrets","summary":"Revoke a workspace credential for future resolution, optionally checking its version.","cli":"dench secrets delete","method":"DELETE","path":"/secrets/{name}","permission":"secrets:write","pathParams":["name"]}, {"id":"campaigns.drafts.create","group":"campaigns","summary":"Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send.","cli":"dench campaign draft","method":"POST","path":"/campaigns/drafts","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.audience.search","group":"campaigns","summary":"Search people by filters without adding CRM records or campaign recipients. Search credits apply; this is not a free provider preview.","cli":"dench campaign search","method":"POST","path":"/campaigns/audience/search","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.people.addFromSearch","group":"campaigns","summary":"Search and add up to 50 people to an existing campaign. New identities become Leads. Search credits apply; use nextPageToken for another page.","cli":"dench campaign add --search","method":"POST","path":"/campaigns/{sequenceId}/people/search","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.people.addBatch","group":"campaigns","summary":"Add up to 50 selected recipients without another search. Deduplicates, applies suppression, and preserves the campaign's launch state.","cli":"dench campaign add --people-file","method":"POST","path":"/campaigns/{sequenceId}/people/batch","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.sources.get","group":"campaigns","summary":"Read a campaign's saved signal source, targeting and schedule.","cli":"dench campaign sources get","method":"GET","path":"/campaigns/{sequenceId}/sources","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.sources.signals","group":"campaigns","summary":"Read signal choices, suggested terms and current source configuration.","cli":"dench campaign sources signals","method":"GET","path":"/campaigns/{sequenceId}/sources/signals","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.sources.update","group":"campaigns","summary":"Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work.","cli":"dench campaign sources set","method":"PATCH","path":"/campaigns/{sequenceId}/sources","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.sources.preview","group":"campaigns","summary":"Preview a signal source using its current audience. Provider credits may apply; does not enroll people.","cli":"dench campaign sources preview","method":"POST","path":"/campaigns/{sequenceId}/sources/preview","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.sources.run","group":"campaigns","summary":"Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour.","cli":"dench campaign sources run","method":"POST","path":"/campaigns/{sequenceId}/sources/run","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.sources.overview","group":"campaigns","summary":"Read the Sources tab: each signal's status, last and next run, people found and anything needing attention.","cli":"dench campaign sources overview","method":"GET","path":"/campaigns/{sequenceId}/sources/overview","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.sources.pending","group":"campaigns","summary":"List people a signal found who are waiting for approval (manual approval mode).","cli":"dench campaign sources pending","method":"GET","path":"/campaigns/{sequenceId}/sources/pending","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.sources.review","group":"campaigns","summary":"Approve people waiting for review (they start the sequence) or reject them.","cli":"dench campaign sources approve|reject","method":"POST","path":"/campaigns/{sequenceId}/sources/review","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.queue","group":"campaigns","summary":"Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits.","cli":"dench campaign queue","method":"GET","path":"/campaigns/{sequenceId}/queue","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.builder.profile","group":"campaigns","summary":"Read the company profile and suggested campaign audience.","cli":"dench campaign builder profile","method":"GET","path":"/campaigns/builder/profile","permission":"campaigns:read","pathParams":[]}, {"id":"campaigns.builder.save","group":"campaigns","summary":"Save a signal campaign's audience, signals and terms idempotently. Does not start a build.","cli":"dench campaign builder save","method":"POST","path":"/campaigns/builder/drafts","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.builder.get","group":"campaigns","summary":"Read signal build progress, preview people, messages and errors.","cli":"dench campaign builder get","method":"GET","path":"/campaigns/builder/drafts/{draftId}","permission":"campaigns:read","pathParams":["draftId"]}, {"id":"campaigns.builder.build","group":"campaigns","summary":"Start the same billable signal/audience/message build used by the UI; poll the draft for progress.","cli":"dench campaign builder build","method":"POST","path":"/campaigns/builder/drafts/{draftId}/build","permission":"campaigns:write","pathParams":["draftId"]}, {"id":"campaigns.builder.create","group":"campaigns","summary":"Create a campaign from a reviewed signal draft. Does not launch the campaign.","cli":"dench campaign builder create","method":"POST","path":"/campaigns/builder/drafts/{draftId}/create","permission":"campaigns:write","pathParams":["draftId"]}, {"id":"campaigns.builder.opener","group":"campaigns","summary":"Edit or reset one preview person's opening line before creating the campaign.","cli":"dench campaign builder opener","method":"PUT","path":"/campaigns/builder/drafts/{draftId}/people/{leadId}/opener","permission":"campaigns:write","pathParams":["draftId","leadId"]}, {"id":"campaigns.builder.drafts","group":"campaigns","summary":"List saved, unfinished campaign drafts that can be resumed.","cli":"dench campaign builder drafts","method":"GET","path":"/campaigns/builder/drafts","permission":"campaigns:read","pathParams":[]}, {"id":"campaigns.builder.resume","group":"campaigns","summary":"Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it.","cli":"dench campaign builder resume","method":"GET","path":"/campaigns/builder/drafts/{draftId}/setup","permission":"campaigns:read","pathParams":["draftId"]}, {"id":"campaigns.builder.discard","group":"campaigns","summary":"Discard a saved draft that has not become a campaign.","cli":"dench campaign builder discard","method":"DELETE","path":"/campaigns/builder/drafts/{draftId}","permission":"campaigns:write","pathParams":["draftId"]}, {"id":"campaigns.builder.outreach","group":"campaigns","summary":"Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval.","cli":"dench campaign builder outreach","method":"PATCH","path":"/campaigns/builder/drafts/{draftId}/outreach","permission":"campaigns:write","pathParams":["draftId"]}, {"id":"campaigns.builder.sequence","group":"campaigns","summary":"Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply.","cli":"dench campaign builder sequence","method":"POST","path":"/campaigns/builder/drafts/{draftId}/sequence","permission":"campaigns:write","pathParams":["draftId"]}, {"id":"campaigns.builder.lookalike","group":"campaigns","summary":"Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply.","cli":"dench campaign builder lookalike","method":"POST","path":"/campaigns/builder/lookalike","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.builder.voices","group":"campaigns","summary":"Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply.","cli":"dench campaign builder voices","method":"POST","path":"/campaigns/builder/voices","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.builder.autofill","group":"campaigns","summary":"Turn an audience description into targeting filters. AI credits apply.","cli":"dench campaign builder autofill","method":"POST","path":"/campaigns/builder/autofill","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.builder.estimate","group":"campaigns","summary":"Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply.","cli":"dench campaign builder estimate","method":"POST","path":"/campaigns/builder/estimate","permission":"campaigns:write","pathParams":[]}, {"id":"commands.list","group":"meta","summary":"List all CLI/API operations and parity classifications.","cli":"dench help","method":"GET","path":"/commands","permission":null,"pathParams":[]}, {"id":"auth.signin.create","group":"auth","summary":"Create an agent sign-in request.","cli":"dench signin","method":"POST","path":"/auth/signin-requests","permission":"auth:write","pathParams":[]}, {"id":"auth.signin.poll","group":"auth","summary":"Poll an agent sign-in request until approval.","cli":"dench signin","method":"POST","path":"/auth/signin-requests/{requestId}/poll","permission":"auth:write","pathParams":["requestId"]}, {"id":"auth.otp.start","group":"auth","summary":"Start the email OTP sign-in flow.","cli":"dench signin --email","method":"POST","path":"/auth/otp/start","permission":"auth:write","pathParams":[]}, {"id":"auth.otp.verify","group":"auth","summary":"Verify an email OTP sign-in code.","cli":"dench signin --email","method":"POST","path":"/auth/otp/verify","permission":"auth:write","pathParams":[]}, {"id":"auth.otp.finalize","group":"auth","summary":"Finalize an email OTP sign-in session.","cli":"dench signin --email","method":"POST","path":"/auth/otp/finalize","permission":"auth:write","pathParams":[]}, {"id":"workspace.context.sections","group":"workspace","summary":"Read selected scoped workspace documents and a compact context index without writes.","cli":"dench context --sections","method":"GET","path":"/context/sections","permission":"workspace:read","pathParams":[]}, {"id":"workspace.context","group":"workspace","summary":"Return the current Dench workspace context for the bearer.","cli":"dench context","method":"GET","path":"/context","permission":"workspace:read","pathParams":[]}, {"id":"workspace.instructions","group":"workspace","summary":"Return the current workspace's standing instructions for external agents.","cli":"dench context --instructions","method":"GET","path":"/context/instructions","permission":"workspace:read","pathParams":[]}, {"id":"workspace.status","group":"workspace","summary":"Return workspace and agent status.","cli":"dench status","method":"GET","path":"/status","permission":"workspace:read","pathParams":[]}, {"id":"workspace.agents","group":"workspace","summary":"List agents visible in the workspace status payload.","cli":"dench agents","method":"GET","path":"/agents","permission":"workspace:read","pathParams":[]}, {"id":"workspace.approvals.list","group":"approvals","summary":"List approval requests visible in the workspace status payload.","cli":"dench approvals","method":"GET","path":"/approvals","permission":"approvals:read","pathParams":[]}, {"id":"workspace.artifacts.list","group":"workspace","summary":"List artifacts for the authenticated workspace.","cli":"dench artifacts","method":"GET","path":"/artifacts","permission":"workspace:read","pathParams":[]}, {"id":"workspace.suggestedWork.list","group":"workspace","summary":"List draft suggested-work artifacts.","cli":"dench suggested-work","method":"GET","path":"/suggested-work","permission":"workspace:read","pathParams":[]}, {"id":"lists.list","group":"lists","summary":"List saved searches (find-result lists) in the workspace, newest first.","cli":"dench lists","method":"GET","path":"/lists","permission":"lists:read","pathParams":[]}, {"id":"lists.rows","group":"lists","summary":"Read saved rows with current enrichment results and original indices; cursor-paged, without repeating a search.","cli":"dench lists rows","method":"GET","path":"/lists/{artifactId}/rows","permission":"lists:read","pathParams":["artifactId"]}, {"id":"lists.enrich","group":"lists","summary":"Buy contact details for 1–100 saved profiles and save them to the list. Skips fields already found, looked up empty, or in flight. Requires a signed-in member or their personal agent.","cli":"dench lists enrich","method":"POST","path":"/lists/{artifactId}/enrich","permission":"lists:write","pathParams":["artifactId"]}, {"id":"lists.import","group":"lists","summary":"Explicitly import selected saved profiles, optionally filtered by enrichment, with a configured Lead status. Reuses CRM records; never sends outreach or triggers conversion.","cli":"dench artifacts import","method":"POST","path":"/lists/{artifactId}/import","permission":"lists:write","pathParams":["artifactId"]}, {"id":"lists.get","group":"lists","summary":"Get one saved search / list by artifact id.","cli":"dench lists show","method":"GET","path":"/lists/{artifactId}","permission":"lists:read","pathParams":["artifactId"]}, {"id":"lists.save","group":"lists","summary":"Save find results as a named list (rows + filters become a workspace artifact).","cli":"dench lists save","method":"POST","path":"/lists","permission":"lists:write","pathParams":[]}, {"id":"lists.update","group":"lists","summary":"Update a saved list in place (title, filters, and/or replacement rows).","cli":"dench lists update","method":"PATCH","path":"/lists/{artifactId}","permission":"lists:write","pathParams":["artifactId"]}, {"id":"lists.rename","group":"lists","summary":"Rename a saved search / list.","cli":"dench lists rename","method":"POST","path":"/lists/{artifactId}/rename","permission":"lists:write","pathParams":["artifactId"]}, {"id":"lists.delete","group":"lists","summary":"Delete a saved search / list, its exported CSV/JSONL files, and any linked watch.","cli":"dench lists delete","method":"DELETE","path":"/lists/{artifactId}","permission":"lists:write","pathParams":["artifactId"]}, {"id":"lists.prospects.reviews","group":"lists","summary":"Read durable enrichment activity (legacy review metadata remains readable). Use lists rows for current saved profiles and contacts.","cli":"dench lists reviews","method":"GET","path":"/lists/{artifactId}/reviews","permission":"lists:read","pathParams":["artifactId"]}, {"id":"lists.prospects.assess","group":"lists","summary":"Suggest ICP fit for one profile. Never changes a human review decision.","cli":"dench lists assess","method":"POST","path":"/lists/{artifactId}/assess","permission":"lists:write","pathParams":["artifactId"]}, {"id":"memory.search","group":"memory","summary":"Search durable workspace memory.","cli":"dench memory search","method":"GET","path":"/memory/search","permission":"memory:read","pathParams":[]}, {"id":"memory.save","group":"memory","summary":"Save a durable workspace memory fact.","cli":"dench memory save","method":"POST","path":"/memory","permission":"memory:write","pathParams":[]}, {"id":"approval.request","group":"approvals","summary":"Request human approval.","cli":"dench approval request","method":"POST","path":"/approvals","permission":"approvals:write","pathParams":[]}, {"id":"approval.decide","group":"approvals","summary":"Record an approval decision.","cli":"dench approval approve|reject","method":"POST","path":"/approvals/{approvalId}/decision","permission":"approvals:write","pathParams":["approvalId"]}, {"id":"billing.status","group":"billing","summary":"Get billing and AI credit status.","cli":"dench billing status","method":"GET","path":"/billing/status","permission":"billing:read","pathParams":[]}, {"id":"billing.topup","group":"billing","summary":"Create an AI credit top-up checkout link.","cli":"dench billing topup","method":"POST","path":"/billing/topup","permission":"billing:write","pathParams":[]}, {"id":"billing.upgrade","group":"billing","summary":"Create a workspace upgrade checkout link.","cli":"dench upgrade","method":"POST","path":"/billing/upgrade","permission":"billing:write","pathParams":[]}, {"id":"chat.list","group":"chat","summary":"List past chat threads.","cli":"dench chat list","method":"GET","path":"/chat/threads","permission":"ai:chat","pathParams":[]}, {"id":"chat.search","group":"chat","summary":"Search past chat messages.","cli":"dench chat search","method":"GET","path":"/chat/search","permission":"ai:chat","pathParams":[]}, {"id":"chat.read","group":"chat","summary":"Read a past chat thread.","cli":"dench chat read","method":"GET","path":"/chat/threads/{threadId}","permission":"ai:chat","pathParams":["threadId"]}, {"id":"chat.tree","group":"chat","summary":"Read the parent-child chat thread hierarchy.","cli":"dench chat tree","method":"GET","path":"/chat/tree","permission":"ai:chat","pathParams":[]}, {"id":"chat.rename","group":"chat","summary":"Rename one or more chat threads.","cli":"dench chat rename","method":"PATCH","path":"/chat/threads","permission":"ai:chat","pathParams":[]}, {"id":"chat.delete","group":"chat","summary":"Delete one or more chat threads.","cli":"dench chat delete","method":"DELETE","path":"/chat/threads","permission":"ai:chat","pathParams":[]}, {"id":"chat.new","group":"chat","summary":"Start a new chat-turn workflow.","cli":"dench chat new","method":"POST","path":"/chat/threads","permission":"ai:chat","pathParams":[]}, {"id":"chat.send","group":"chat","summary":"Send a message to an existing chat thread.","cli":"dench chat send","method":"POST","path":"/chat/threads/{threadId}/messages","permission":"ai:chat","pathParams":["threadId"]}, {"id":"chat.follow","group":"chat","summary":"Follow a live chat response stream.","cli":"dench chat follow","method":"GET","path":"/chat/threads/{threadId}/stream","permission":"ai:chat","pathParams":["threadId"]}, {"id":"crm.objects.list","group":"crm","summary":"List CRM objects.","cli":"dench crm objects list [--with-references]","method":"GET","path":"/crm/objects","permission":"crm:read","pathParams":[]}, {"id":"crm.objects.listCompact","group":"crm","summary":"List names, display labels, visibility and workspace counts without internal state.","cli":"dench crm objects list --compact","method":"GET","path":"/crm/catalog/objects","permission":"crm:read","pathParams":[]}, {"id":"crm.objects.get","group":"crm","summary":"Get a CRM object.","cli":"dench crm objects get","method":"GET","path":"/crm/objects/{name}","permission":"crm:read","pathParams":["name"]}, {"id":"crm.objects.create","group":"crm","summary":"Create a CRM object.","cli":"dench crm objects create","method":"POST","path":"/crm/objects","permission":"crm:write","pathParams":[]}, {"id":"crm.objects.update","group":"crm","summary":"Update a CRM object.","cli":"dench crm objects update","method":"PATCH","path":"/crm/objects/{name}","permission":"crm:write","pathParams":["name"]}, {"id":"crm.objects.rename","group":"crm","summary":"Rename a CRM object.","cli":"dench crm objects rename","method":"POST","path":"/crm/objects/{from}/rename","permission":"crm:write","pathParams":["from"]}, {"id":"crm.objects.delete","group":"crm","summary":"Delete a CRM object.","cli":"dench crm objects delete","method":"DELETE","path":"/crm/objects/{name}","permission":"crm:write","pathParams":["name"]}, {"id":"crm.objects.archive","group":"crm","summary":"Hide a CRM object's workspace sidebar row for the whole workspace. Not a delete — the table keeps working. Admin-only.","cli":"dench crm objects archive","method":"POST","path":"/crm/objects/{name}/archive","permission":"crm:write","pathParams":["name"]}, {"id":"crm.objects.unarchive","group":"crm","summary":"Restore a CRM object's workspace sidebar row. Admin-only.","cli":"dench crm objects unarchive","method":"POST","path":"/crm/objects/{name}/unarchive","permission":"crm:write","pathParams":["name"]}, {"id":"crm.views.list","group":"crm","summary":"List the saved views on a CRM object (plus the active view).","cli":"dench crm views list","method":"GET","path":"/crm/objects/{objectName}/views","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.views.get","group":"crm","summary":"Get one saved view's definition by name.","cli":"dench crm views get","method":"GET","path":"/crm/objects/{objectName}/views/{viewName}","permission":"crm:read","pathParams":["objectName","viewName"]}, {"id":"crm.views.entries","group":"crm","summary":"Materialize a saved view's rows (applies its filters/sort/pins), paginated.","cli":"dench crm views entries","method":"GET","path":"/crm/objects/{objectName}/views/{viewName}/entries","permission":"crm:read","pathParams":["objectName","viewName"]}, {"id":"crm.views.create","group":"crm","summary":"Create a saved view (named filters/sort/columns combo) on a CRM object.","cli":"dench crm views create","method":"POST","path":"/crm/objects/{objectName}/views","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.views.update","group":"crm","summary":"Replace a saved view's definition (upsert by name).","cli":"dench crm views update","method":"PATCH","path":"/crm/objects/{objectName}/views/{viewName}","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.views.rename","group":"crm","summary":"Rename a saved view in place — keeps its filters, pins, and sidebar slot.","cli":"dench crm views rename","method":"POST","path":"/crm/objects/{objectName}/views/{viewName}/rename","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.views.delete","group":"crm","summary":"Delete a saved view by name (idempotent).","cli":"dench crm views delete","method":"DELETE","path":"/crm/objects/{objectName}/views/{viewName}","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.views.archive","group":"crm","summary":"Move a pinned view's sidebar row into the Archived flyout. Admin-only.","cli":"dench crm views archive","method":"POST","path":"/crm/objects/{objectName}/views/{viewName}/archive","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.views.unarchive","group":"crm","summary":"Restore a view's sidebar row (re-asserts its pin). Admin-only.","cli":"dench crm views unarchive","method":"POST","path":"/crm/objects/{objectName}/views/{viewName}/unarchive","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.sidebar.list","group":"crm","summary":"Describe the workspace sidebar: Library rows in tree order (with their groups), the home-level Pinned strip, what is hidden and why, and whether the caller is an admin.","cli":"dench crm sidebar list","method":"GET","path":"/crm/sidebar","permission":"crm:read","pathParams":[]}, {"id":"crm.sidebar.move","group":"crm","summary":"Reposition one Library row (or group) among the Library's top-level slots. Does not add a home-level Pinned tab. Workspace-shared; admin-only.","cli":"dench crm sidebar move","method":"POST","path":"/crm/sidebar/move","permission":"crm:write","pathParams":[]}, {"id":"crm.sidebar.groups.create","group":"crm","summary":"Create a named sidebar group (e.g. \"Hiring\") in the workspace-shared Library. Open to any member.","cli":"dench crm sidebar group create","method":"POST","path":"/crm/sidebar/groups","permission":"crm:write","pathParams":[]}, {"id":"crm.sidebar.groups.rename","group":"crm","summary":"Rename a sidebar group. Open to any member.","cli":"dench crm sidebar group rename","method":"POST","path":"/crm/sidebar/groups/rename","permission":"crm:write","pathParams":[]}, {"id":"crm.sidebar.groups.delete","group":"crm","summary":"Dissolve a sidebar group; its rows return to the top level in its slot. Open to any member.","cli":"dench crm sidebar group delete","method":"POST","path":"/crm/sidebar/groups/delete","permission":"crm:write","pathParams":[]}, {"id":"crm.sidebar.groups.move-item","group":"crm","summary":"Move a sidebar row into a group (groupId set) or back to the top level (groupId null). Open to any member.","cli":"dench crm sidebar group add","method":"POST","path":"/crm/sidebar/groups/move","permission":"crm:write","pathParams":[]}, {"id":"crm.sidebar.pins.set","group":"crm","summary":"Pin (pinned true) or unpin a Library row — or a whole group — on the home-level Pinned shortcut strip (the \"tab on the left\"). Does not move the row inside Library. Workspace-shared; open to any member.","cli":"dench crm sidebar pin","method":"POST","path":"/crm/sidebar/pins","permission":"crm:write","pathParams":[]}, {"id":"crm.fields.list","group":"crm","summary":"List fields for a CRM object, including read-only calculation metadata.","cli":"dench crm fields list","method":"GET","path":"/crm/objects/{objectName}/fields","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.fields.listCompact","group":"crm","summary":"List field names, types and effective constraints without indexing or enrichment internals.","cli":"dench crm fields list --compact","method":"GET","path":"/crm/catalog/objects/{objectName}/fields","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.fields.create","group":"crm","summary":"Create a CRM field or read-only campaign activity boolean column.","cli":"dench crm fields create","method":"POST","path":"/crm/objects/{objectName}/fields","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.fields.update","group":"crm","summary":"Update a CRM field or change/explicitly clear an existing campaign calculation.","cli":"dench crm fields update","method":"PATCH","path":"/crm/objects/{objectName}/fields/{fieldName}","permission":"crm:write","pathParams":["objectName","fieldName"]}, {"id":"crm.fields.delete","group":"crm","summary":"Delete a CRM field.","cli":"dench crm fields delete","method":"DELETE","path":"/crm/objects/{objectName}/fields/{fieldName}","permission":"crm:write","pathParams":["objectName","fieldName"]}, {"id":"crm.fields.reorder","group":"crm","summary":"Reorder CRM fields.","cli":"dench crm fields reorder","method":"POST","path":"/crm/objects/{objectName}/fields/reorder","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.fields.enum.reorder","group":"crm","summary":"Reorder enum values.","cli":"dench crm fields enum-reorder","method":"POST","path":"/crm/objects/{objectName}/fields/{fieldName}/enum/reorder","permission":"crm:write","pathParams":["objectName","fieldName"]}, {"id":"crm.fields.enum.add","group":"crm","summary":"Add an enum value.","cli":"dench crm fields enum-add","method":"POST","path":"/crm/objects/{objectName}/fields/{fieldName}/enum","permission":"crm:write","pathParams":["objectName","fieldName"]}, {"id":"crm.fields.enum.remove","group":"crm","summary":"Remove an enum value.","cli":"dench crm fields enum-remove","method":"DELETE","path":"/crm/objects/{objectName}/fields/{fieldName}/enum/{value}","permission":"crm:write","pathParams":["objectName","fieldName","value"]}, {"id":"crm.fields.enum.rename","group":"crm","summary":"Rename an enum value.","cli":"dench crm fields enum-rename","method":"POST","path":"/crm/objects/{objectName}/fields/{fieldName}/enum/{oldValue}/rename","permission":"crm:write","pathParams":["objectName","fieldName","oldValue"]}, {"id":"crm.fields.enum.color","group":"crm","summary":"Set an enum color.","cli":"dench crm fields enum-set-color","method":"POST","path":"/crm/objects/{objectName}/fields/{fieldName}/enum/{value}/color","permission":"crm:write","pathParams":["objectName","fieldName","value"]}, {"id":"crm.entries.list","group":"crm","summary":"List CRM entries.","cli":"dench crm entries list [--with-references]","method":"GET","path":"/crm/objects/{objectName}/entries","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.entries.get","group":"crm","summary":"Get a CRM entry.","cli":"dench crm entries get","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.entries.syncHistory","group":"crm","summary":"Queue a full, paged pull of the record's email history from every connected mailbox; the ledger fills as pages land.","cli":"dench crm entries sync-history","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/sync-history","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.entries.syncHistoryStatus","group":"crm","summary":"Has Dench read this record's email history? One row per address per mailbox.","cli":"dench crm entries sync-history --status","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/sync-history","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.entries.dossier.get","group":"crm","summary":"Status of the account's research dossier — the delimited `dench:dossier` section Dench keeps in the record's Notes: status, when it was written, how many dated updates followed, the last error.","cli":"dench crm entries dossier","method":"GET","path":"/crm/entries/{entryId}/dossier","permission":"crm:read","pathParams":["entryId"]}, {"id":"crm.entries.dossier.regenerate","group":"crm","summary":"Research the account again and append a fresh dossier section to its Notes (needs a Website / Domain on the record).","cli":"dench crm entries dossier --regenerate","method":"POST","path":"/crm/entries/{entryId}/dossier/regenerate","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.privacy.get","group":"crm","summary":"Whether the caller hides their own emails / messages with this record from the workspace (directly, or through its account), and whether they own a connection the toggle applies to.","cli":"dench crm privacy status","method":"GET","path":"/crm/entries/{entryId}/privacy","permission":"crm:read","pathParams":["entryId"]}, {"id":"crm.privacy.set","group":"crm","summary":"Hide (`hidden: true`) or show the caller's own emails / messages with this record to the workspace. An account covers every contact and opportunity linked to it; existing ledger rows are restamped and the shared Brief regenerates.","cli":"dench crm privacy hide|show","method":"PUT","path":"/crm/entries/{entryId}/privacy","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.detections.list","group":"crm","summary":"List account-detection verdicts — why a domain (or personal address) did or did not become an account: verdict, counterparty type, probabilities, evidence threads, the rows created. `kind` picks the creator: `detections` (email + sweep), `linkedin` (the LinkedIn resolver's rows) or `all` (default). Newest first.","cli":"dench crm detections list","method":"GET","path":"/crm/detections","permission":"crm:read","pathParams":[]}, {"id":"crm.detections.undo","group":"crm","summary":"Undo what the ingestion jobs created since a timestamp (admin): `kind` = `detections` (accounts + contacts from the email detector and the sweep), `linkedin` (the LinkedIn resolver's contacts + accounts; their conversations are unlinked and parked), `email-tasks` (auto-created tasks and cases) or `all` (default). Deletes only rows no human has touched and marks the verdicts / decisions rolled_back so they are never re-created. `dryRun` lists what would go; per-kind counts in `kinds`.","cli":"dench crm detections undo","method":"POST","path":"/crm/detections/undo","permission":"crm:write","pathParams":[]}, {"id":"crm.entries.history","group":"crm","summary":"List a CRM entry's audit history.","cli":"dench crm history","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/history","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.activity.list","group":"crm","summary":"List a CRM entry's activity ledger (comments, notes, field changes, emails, meetings, Slack, LinkedIn) in one timeline, newest first by default.","cli":"dench crm activity","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/activity","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.brief.get","group":"crm","summary":"The record's generated Brief: health, who owes the next move, open threads, commitments, risks, next step. Read this before the ledger.","cli":"dench crm brief","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/brief","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.context.get","group":"crm","summary":"Read-only source diagnostics: accessible evidence, association reasons, last Brief source manifest, generation queue, and your mailbox delivery health. Bounded, cursor-paged snapshot; does not certify complete history.","cli":"dench crm context","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/context","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.brief.regenerate","group":"crm","summary":"Rebuild a record's Brief from the current timeline.","cli":"dench crm brief --regenerate","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/brief/regenerate","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.activity.count","group":"crm","summary":"Bounded per-source counts of a CRM entry's activity ledger.","cli":"dench crm activity","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/activity/count","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.notes.list","group":"crm","summary":"List a CRM entry's notes (titled, document-style comments), newest first.","cli":"dench crm notes list","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/notes","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.notes.create","group":"crm","summary":"Add a titled note to a CRM entry's activity timeline (markdown body). Research goes here, never into the Notes document.","cli":"dench crm notes create","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/notes","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.comments.list","group":"crm","summary":"List comments on a CRM entry (roots newest first, with preview replies).","cli":"dench crm comments list","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/comments","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.comments.replies","group":"crm","summary":"List every reply under a root comment, oldest first.","cli":"dench crm comments replies","method":"GET","path":"/crm/comments/{commentId}/replies","permission":"crm:read","pathParams":["commentId"]}, {"id":"crm.comments.get","group":"crm","summary":"Get one comment with its entry label.","cli":"dench crm comments get","method":"GET","path":"/crm/comments/{commentId}","permission":"crm:read","pathParams":["commentId"]}, {"id":"crm.comments.create","group":"crm","summary":"Comment on a CRM entry (markdown). Mention members with [@Name](/?member=); mention Dench with [@Dench](/?member=dench) or mentionDench.","cli":"dench crm comments create","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/comments","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.comments.update","group":"crm","summary":"Edit a comment you wrote.","cli":"dench crm comments update","method":"PATCH","path":"/crm/comments/{commentId}","permission":"crm:write","pathParams":["commentId"]}, {"id":"crm.comments.delete","group":"crm","summary":"Delete a comment (kept as a tombstone when it has replies).","cli":"dench crm comments delete","method":"DELETE","path":"/crm/comments/{commentId}","permission":"crm:write","pathParams":["commentId"]}, {"id":"crm.comments.react","group":"crm","summary":"Toggle an emoji reaction on a comment.","cli":"dench crm comments react","method":"PUT","path":"/crm/comments/{commentId}/reactions/{emoji}","permission":"crm:write","pathParams":["commentId","emoji"]}, {"id":"crm.watch.get","group":"crm","summary":"Whether you follow a CRM entry's activity.","cli":"dench crm watch status","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/watch","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.watch.set","group":"crm","summary":"Follow or unfollow a CRM entry's activity.","cli":"dench crm watch","method":"PUT","path":"/crm/objects/{objectName}/entries/{entryId}/watch","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.tasks.pageAssigned","group":"crm","summary":"Page assigned tasks in priority order (or completed tasks by recency).","cli":"dench crm tasks mine --page","method":"POST","path":"/crm/tasks/assigned/page","permission":"crm:read","pathParams":[]}, {"id":"crm.tasks.pageForEntry","group":"crm","summary":"Page all tasks linked to a record, including subtasks.","cli":"dench crm tasks list --page","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/tasks/page","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.tasks.prepare","group":"crm","summary":"Start or resume preparation of exact task ordering and progress.","cli":"dench crm tasks prepare","method":"POST","path":"/crm/tasks/prepare","permission":"crm:write","pathParams":[]}, {"id":"crm.tasks.mine","group":"crm","summary":"Your open tasks (plus ones completed today).","cli":"dench crm tasks mine","method":"GET","path":"/crm/tasks/mine","permission":"crm:read","pathParams":[]}, {"id":"crm.tasks.forEntry","group":"crm","summary":"Tasks linked to a CRM entry.","cli":"dench crm tasks list","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/tasks","permission":"crm:read","pathParams":["objectName","entryId"]}, {"id":"crm.tasks.createForEntry","group":"crm","summary":"Create a task linked to a CRM entry.","cli":"dench crm tasks create","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/tasks","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.tasks.complete","group":"crm","summary":"Mark a task done.","cli":"dench crm tasks complete","method":"POST","path":"/crm/tasks/{entryId}/complete","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.reopen","group":"crm","summary":"Reopen a completed task.","cli":"dench crm tasks reopen","method":"POST","path":"/crm/tasks/{entryId}/reopen","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.setPriority","group":"crm","summary":"Set or clear a task's priority.","cli":"dench crm tasks priority","method":"PUT","path":"/crm/tasks/{entryId}/priority","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.subtasks.list","group":"crm","summary":"A task's subtasks.","cli":"dench crm tasks subtasks","method":"GET","path":"/crm/tasks/{entryId}/subtasks","permission":"crm:read","pathParams":["entryId"]}, {"id":"crm.tasks.subtasks.create","group":"crm","summary":"Create a subtask under a task (inherits the parent's record relations).","cli":"dench crm tasks create-subtask","method":"POST","path":"/crm/tasks/{entryId}/subtasks","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.setParent","group":"crm","summary":"Nest a task under a parent, or promote it (parentEntryId: null).","cli":"dench crm tasks parent","method":"PUT","path":"/crm/tasks/{entryId}/parent","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.delete","group":"crm","summary":"Delete a task and its subtasks, or keep them as tasks.","cli":"dench crm tasks delete","method":"DELETE","path":"/crm/tasks/{entryId}","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.get","group":"crm","summary":"How a task repeats (rule, RRULE, trigger, ends, next due).","cli":"dench crm tasks repeat","method":"GET","path":"/crm/tasks/{entryId}/repeat","permission":"crm:read","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.set","group":"crm","summary":"Make a task repeat, or change how it repeats (JSON rule or RRULE). An undated task gets its due date anchored on the first matching day from today.","cli":"dench crm tasks repeat","method":"PUT","path":"/crm/tasks/{entryId}/repeat","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.clear","group":"crm","summary":"Stop a task repeating (past occurrences are kept).","cli":"dench crm tasks repeat --off","method":"DELETE","path":"/crm/tasks/{entryId}/repeat","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.skip","group":"crm","summary":"Skip the current occurrence: the next one is created now.","cli":"dench crm tasks repeat --skip","method":"POST","path":"/crm/tasks/{entryId}/repeat/skip","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.pause","group":"crm","summary":"Pause a repeating task.","cli":"dench crm tasks repeat --pause","method":"POST","path":"/crm/tasks/{entryId}/repeat/pause","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.repeat.resume","group":"crm","summary":"Resume a paused repeating task.","cli":"dench crm tasks repeat --resume","method":"POST","path":"/crm/tasks/{entryId}/repeat/resume","permission":"crm:write","pathParams":["entryId"]}, {"id":"crm.tasks.series.list","group":"crm","summary":"Every repeating-task series in the workspace.","cli":"dench crm tasks series","method":"GET","path":"/crm/tasks/series","permission":"crm:read","pathParams":[]}, {"id":"crm.tasks.series.occurrences","group":"crm","summary":"Every occurrence (task) of one series.","cli":"dench crm tasks series --occurrences","method":"GET","path":"/crm/tasks/series/{seriesId}/occurrences","permission":"crm:read","pathParams":["seriesId"]}, {"id":"crm.entries.create","group":"crm","summary":"Create a CRM entry.","cli":"dench crm entries create","method":"POST","path":"/crm/objects/{objectName}/entries","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.entries.createMany","group":"crm","summary":"Create many CRM entries.","cli":"dench crm entries create-many","method":"POST","path":"/crm/objects/{objectName}/entries/batch","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.entries.update","group":"crm","summary":"Update a CRM entry.","cli":"dench crm entries update","method":"PATCH","path":"/crm/objects/{objectName}/entries/{entryId}","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.entries.updateMany","group":"crm","summary":"Update many CRM entries.","cli":"dench crm entries update-many","method":"PATCH","path":"/crm/objects/{objectName}/entries/batch","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.entries.delete","group":"crm","summary":"Delete a CRM entry.","cli":"dench crm entries delete","method":"DELETE","path":"/crm/objects/{objectName}/entries/{entryId}","permission":"crm:write","pathParams":["objectName","entryId"]}, {"id":"crm.entries.bulkDelete","group":"crm","summary":"Bulk delete CRM entries.","cli":"dench crm entries bulk-delete","method":"POST","path":"/crm/objects/{objectName}/entries/delete","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.cells.get","group":"crm","summary":"Get a CRM cell value.","cli":"dench crm cells get","method":"GET","path":"/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName}","permission":"crm:read","pathParams":["objectName","entryId","fieldName"]}, {"id":"crm.cells.set","group":"crm","summary":"Set a CRM cell value.","cli":"dench crm cells set","method":"PUT","path":"/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName}","permission":"crm:write","pathParams":["objectName","entryId","fieldName"]}, {"id":"crm.cells.setMany","group":"crm","summary":"Set many CRM cell values.","cli":"dench crm cells set-many","method":"POST","path":"/crm/cells/batch","permission":"crm:write","pathParams":[]}, {"id":"crm.cells.append","group":"crm","summary":"Append to a CRM cell.","cli":"dench crm cells append","method":"POST","path":"/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName}/append","permission":"crm:write","pathParams":["objectName","entryId","fieldName"]}, {"id":"crm.query","group":"crm","summary":"Query CRM entries.","cli":"dench crm query [--with-references]","method":"POST","path":"/crm/query","permission":"crm:read","pathParams":[]}, {"id":"crm.queryPage","group":"crm","summary":"Scan CRM entries with a resumable cursor. Empty filtered pages can have more results.","cli":"dench crm query --page","method":"POST","path":"/crm/query/page","permission":"crm:read","pathParams":[]}, {"id":"crm.sql","group":"crm","summary":"Run CRM SQL-compatible query.","cli":"dench crm sql","method":"POST","path":"/crm/sql","permission":"crm:read","pathParams":[]}, {"id":"crm.aggregate","group":"crm","summary":"Aggregate CRM entries.","cli":"dench crm aggregate","method":"POST","path":"/crm/aggregate","permission":"crm:read","pathParams":[]}, {"id":"crm.search","group":"crm","summary":"Search CRM entries.","cli":"dench crm search [--with-references]","method":"GET","path":"/crm/search","permission":"crm:read","pathParams":[]}, {"id":"crm.search.page","group":"crm","summary":"Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone.","cli":"dench crm search --page","method":"GET","path":"/crm/search/page","permission":"crm:read","pathParams":[]}, {"id":"crm.statuses.list","group":"crm","summary":"List CRM statuses.","cli":"dench crm statuses list","method":"GET","path":"/crm/objects/{objectName}/statuses","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.statuses.set","group":"crm","summary":"Set CRM statuses.","cli":"dench crm statuses set","method":"PUT","path":"/crm/objects/{objectName}/statuses","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.batch","group":"crm","summary":"Apply a CRM batch.","cli":"dench crm batch","method":"POST","path":"/crm/batch","permission":"crm:write","pathParams":[]}, {"id":"crm.transaction.begin","group":"crm","summary":"Begin a CRM transaction.","cli":"dench crm transaction begin","method":"POST","path":"/crm/transactions","permission":"crm:write","pathParams":[]}, {"id":"crm.transaction.add","group":"crm","summary":"Add an operation to a CRM transaction.","cli":"dench crm transaction add","method":"POST","path":"/crm/transactions/{txnId}/operations","permission":"crm:write","pathParams":["txnId"]}, {"id":"crm.transaction.commit","group":"crm","summary":"Commit a CRM transaction.","cli":"dench crm transaction commit","method":"POST","path":"/crm/transactions/{txnId}/commit","permission":"crm:write","pathParams":["txnId"]}, {"id":"crm.transaction.abort","group":"crm","summary":"Abort a CRM transaction.","cli":"dench crm transaction abort","method":"POST","path":"/crm/transactions/{txnId}/abort","permission":"crm:write","pathParams":["txnId"]}, {"id":"crm.transaction.inspect","group":"crm","summary":"Inspect a CRM transaction.","cli":"dench crm transaction inspect","method":"GET","path":"/crm/transactions/{txnId}","permission":"crm:read","pathParams":["txnId"]}, {"id":"crm.docs.list","group":"crm","summary":"List CRM documents.","cli":"dench crm docs list","method":"GET","path":"/crm/docs","permission":"crm:read","pathParams":[]}, {"id":"crm.docs.create","group":"crm","summary":"Create a CRM document.","cli":"dench crm docs create","method":"POST","path":"/crm/docs","permission":"crm:write","pathParams":[]}, {"id":"crm.docs.link","group":"crm","summary":"Link a CRM document.","cli":"dench crm docs link","method":"POST","path":"/crm/docs/link","permission":"crm:write","pathParams":[]}, {"id":"crm.docs.delete","group":"crm","summary":"Delete a CRM document page; its workspace file stays and nested pages move up.","cli":"dench crm docs delete","method":"DELETE","path":"/crm/docs/{documentId}","permission":"crm:write","pathParams":["documentId"]}, {"id":"crm.actions.list","group":"crm","summary":"List CRM actions.","cli":"dench crm actions list","method":"GET","path":"/crm/actions","permission":"crm:read","pathParams":[]}, {"id":"crm.actions.create","group":"crm","summary":"Create or upsert an action button on a named action column (fieldName is the column header; a column can hold multiple buttons — reuse fieldName to add more).","cli":"dench crm actions create","method":"POST","path":"/crm/actions","permission":"crm:write","pathParams":[]}, {"id":"crm.actions.update","group":"crm","summary":"Update an action button on a CRM field.","cli":"dench crm actions edit","method":"PATCH","path":"/crm/actions/{actionId}","permission":"crm:write","pathParams":["actionId"]}, {"id":"crm.actions.delete","group":"crm","summary":"Delete an action button from a CRM field.","cli":"dench crm actions delete","method":"DELETE","path":"/crm/actions/{actionId}","permission":"crm:write","pathParams":["actionId"]}, {"id":"crm.actions.run","group":"crm","summary":"Run a CRM action on one or more entries.","cli":"dench crm actions run","method":"POST","path":"/crm/actions/{actionId}/runs","permission":"crm:write","pathParams":["actionId"]}, {"id":"crm.members.list","group":"crm","summary":"List workspace members for CRM user fields.","cli":"dench members list","method":"GET","path":"/members","permission":"crm:read","pathParams":[]}, {"id":"members.presence","group":"members","summary":"Live presence (online / away / offline) for workspace members.","cli":"dench members presence","method":"GET","path":"/members/presence","permission":"members:read","pathParams":[]}, {"id":"members.get","group":"members","summary":"A member's profile: name, email, tagline, role, timezone, presence, open task count.","cli":"dench members get","method":"GET","path":"/members/{userId}","permission":"members:read","pathParams":["userId"]}, {"id":"members.activity","group":"members","summary":"A member's recent comments and record changes across the CRM, newest first.","cli":"dench members activity","method":"GET","path":"/members/{userId}/activity","permission":"members:read","pathParams":["userId"]}, {"id":"members.tasks","group":"members","summary":"Open tasks assigned to a member (plus ones completed today).","cli":"dench members tasks","method":"GET","path":"/members/{userId}/tasks","permission":"members:read","pathParams":["userId"]}, {"id":"me.profile.get","group":"members","summary":"Your own member profile.","cli":"dench members me","method":"GET","path":"/me/profile","permission":"members:read","pathParams":[]}, {"id":"me.profile.update","group":"members","summary":"Update your name, tagline, avatar URL, or timezone.","cli":"dench members me --name … --tagline … --timezone …","method":"PATCH","path":"/me/profile","permission":"members:write","pathParams":[]}, {"id":"me.avatar.uploadUrl","group":"members","summary":"Get a one-time URL to POST an avatar image to; then PUT /me/avatar with the returned storageId.","cli":"dench members me --avatar ","method":"POST","path":"/me/avatar/upload-url","permission":"members:write","pathParams":[]}, {"id":"me.avatar.set","group":"members","summary":"Set your avatar from an uploaded storageId.","cli":"dench members me --avatar ","method":"PUT","path":"/me/avatar","permission":"members:write","pathParams":[]}, {"id":"me.avatar.clear","group":"members","summary":"Remove your avatar.","cli":"dench members me --clear-avatar","method":"DELETE","path":"/me/avatar","permission":"members:write","pathParams":[]}, {"id":"crm.reports.generate","group":"crm","summary":"Generate a CRM report.","cli":"dench crm reports generate","method":"POST","path":"/crm/reports","permission":"crm:write","pathParams":[]}, {"id":"crm.analytics.get","group":"crm","summary":"Read an object's analytics dashboard: panels, field roles, the strip's collapsed flag, the named view's own dashboard (if any), and the fields panels may bucket on (synthetic $createdAt / $location last).","cli":"dench crm analytics get","method":"GET","path":"/crm/objects/{objectName}/analytics","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.analytics.compute","group":"crm","summary":"Compute chart-ready results (buckets / series / values) for the stored dashboard, a subset of its panels, or ad-hoc panel definitions — optionally scoped to a saved view, a period preset (with the previous interval as previousValue) and extra filters. Same query the strip renders from.","cli":"dench crm analytics compute","method":"POST","path":"/crm/objects/{objectName}/analytics/compute","permission":"crm:read","pathParams":["objectName"]}, {"id":"crm.analytics.save","group":"crm","summary":"Create or update one panel (upsert by id). With viewName the write lands on that saved view's own dashboard, forking a copy if it was still inheriting the object's.","cli":"dench crm analytics save","method":"PUT","path":"/crm/objects/{objectName}/analytics/panels/{panelId}","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.update","group":"crm","summary":"Edit part of one stored panel: only the keys in `patch` change (title, type, metric, metricField, groupBy, dateField, dateBucket, filters, derived, span, hidden, sortOrder); null clears an optional key. What the card's ⋮ menu writes.","cli":"dench crm analytics update","method":"PATCH","path":"/crm/objects/{objectName}/analytics/panels/{panelId}","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.hide","group":"crm","summary":"Take a chart off the strip above the table (hidden: true). It stays in the full analytics view, counted by the strip's “+N more”.","cli":"dench crm analytics hide","method":"POST","path":"/crm/objects/{objectName}/analytics/panels/{panelId}/hide","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.show","group":"crm","summary":"Bring a hidden chart back onto the strip (hidden: false).","cli":"dench crm analytics show","method":"POST","path":"/crm/objects/{objectName}/analytics/panels/{panelId}/show","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.resize","group":"crm","summary":"Set a card's width on the 6-track dashboard grid: span 2 (third), 3 (half), 4 (two thirds), 6 (full), or null for the chart kind's default.","cli":"dench crm analytics resize","method":"POST","path":"/crm/objects/{objectName}/analytics/panels/{panelId}/resize","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.delete","group":"crm","summary":"Delete one panel (idempotent). Template panels are tombstoned so a re-install never resurrects them.","cli":"dench crm analytics delete","method":"DELETE","path":"/crm/objects/{objectName}/analytics/panels/{panelId}","permission":"crm:write","pathParams":["objectName","panelId"]}, {"id":"crm.analytics.reorder","group":"crm","summary":"Persist the full panel order. panelIds must name every stored panel of the targeted dashboard.","cli":"dench crm analytics reorder","method":"POST","path":"/crm/objects/{objectName}/analytics/reorder","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.analytics.roles","group":"crm","summary":"Set the object's analytics setup — the field roles shared by every chart and view (amount, stage, won/lost/converted values, stageProbabilities, closeDate, recurrence, owner, location). Replaces the mapping; with merge: true only the keys given change and null clears one.","cli":"dench crm analytics roles","method":"PUT","path":"/crm/objects/{objectName}/analytics/roles","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.analytics.collapse","group":"crm","summary":"Collapse the analytics strip above the object's table (team-shared, like saved views).","cli":"dench crm analytics collapse","method":"POST","path":"/crm/objects/{objectName}/analytics/collapse","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.analytics.expand","group":"crm","summary":"Expand the analytics strip above the object's table.","cli":"dench crm analytics expand","method":"POST","path":"/crm/objects/{objectName}/analytics/expand","permission":"crm:write","pathParams":["objectName"]}, {"id":"crm.analytics.scope","group":"crm","summary":"Give a saved view its own dashboard (mode \"own\": starts as a copy of the object's panels) or hand it back to the object's shared one (mode \"shared\").","cli":"dench crm analytics scope","method":"POST","path":"/crm/objects/{objectName}/views/{viewName}/analytics/scope","permission":"crm:write","pathParams":["objectName","viewName"]}, {"id":"crm.enrich.cell","group":"crm","summary":"Request enrichment for one CRM cell.","cli":"dench crm enrich cell","method":"POST","path":"/crm/enrich/cell","permission":"crm:write","pathParams":[]}, {"id":"crm.enrich.object","group":"crm","summary":"Request enrichment for a CRM object.","cli":"dench crm enrich object","method":"POST","path":"/crm/enrich/object","permission":"crm:write","pathParams":[]}, {"id":"crm.people.search","group":"crm","summary":"Search for people through the enrichment gateway. `companyDomains` takes up to 1000 domains (e.g. a resolved company list; `dench leads find --company-list ` resolves one for you) — the gateway fans large lists out as sequential vendor-safe chunks behind one `nextPageToken` stream.","cli":"dench crm people search","method":"POST","path":"/enrichment/people/search","permission":"crm:read","pathParams":[]}, {"id":"crm.companies.search","group":"crm","summary":"Search for companies through the enrichment gateway (also `dench companies find`).","cli":"dench crm companies search","method":"POST","path":"/enrichment/company/search","permission":"crm:read","pathParams":[]}, {"id":"enrichment.jobs.search","group":"crm","summary":"Search job postings through Dench find. `companyDomains` takes up to 1000 domains (chunked automatically); `dench jobs find --company-list ` resolves a saved company list into it.","cli":"dench jobs find","method":"POST","path":"/enrichment/jobs/search","permission":"crm:read","pathParams":[]}, {"id":"enrichment.person","group":"crm","summary":"Look up one person profile.","cli":"dench crm enrich cell","method":"POST","path":"/enrichment/person","permission":"crm:write","pathParams":[]}, {"id":"enrichment.company","group":"crm","summary":"Look up one company profile.","cli":"dench crm enrich cell","method":"POST","path":"/enrichment/company","permission":"crm:write","pathParams":[]}, {"id":"enrichment.person.contact","group":"crm","summary":"Look up verified emails and phones for people.","cli":"dench crm enrich cell","method":"POST","path":"/enrichment/person/contact","permission":"crm:write","pathParams":[]}, {"id":"enrichment.profiles.bulk","group":"crm","summary":"Look up up to 100 people or company profiles without buying emails or phones. Pass kind (people|companies) and lookups; results preserve inputIndex. People require linkedinUrl or email; companies require domain or linkedinUrl.","cli":"dench crm enrich profiles","method":"POST","path":"/enrichment/profiles/bulk","permission":"crm:write","pathParams":[]}, {"id":"enrichment.company.related","group":"crm","summary":"Read company employees, founders, funding, investors, acquisitions, or investments. Pass domain or linkedinUrl, kind, limit (1–100), and optional pageToken. Does not import CRM records or buy contacts.","cli":"dench companies related","method":"POST","path":"/enrichment/company/related","permission":"crm:read","pathParams":[]}, {"id":"enrichment.search.preview","group":"crm","summary":"Preview how many records a find would return.","cli":"dench leads find --limit 1","method":"POST","path":"/enrichment/search/preview","permission":"crm:read","pathParams":[]}, {"id":"crm.templates.list","group":"crm","summary":"List one-click CRM templates (objects + automations + sample rows) with per-workspace installed flags.","cli":"dench crm templates list","method":"GET","path":"/crm/templates","permission":"crm:read","pathParams":[]}, {"id":"crm.templates.install","group":"crm","summary":"Install a CRM template. Idempotent: re-installs top up missing pieces and never duplicate objects, automations, or sample rows.","cli":"dench crm templates install","method":"POST","path":"/crm/templates/{templateId}/install","permission":"crm:write","pathParams":["templateId"]}, {"id":"crm.templates.removeSampleData","group":"crm","summary":"Delete a CRM template's sample rows (tagged \"Sample\"); schema, views, and automations stay.","cli":"dench crm templates remove-sample-data","method":"POST","path":"/crm/templates/{templateId}/remove-sample-data","permission":"crm:write","pathParams":["templateId"]}, {"id":"crm.automations.list","group":"crm","summary":"List deterministic CRM automations (rules that fire inside entry writes, e.g. qualified prospect → opportunity).","cli":"dench crm automations list","method":"GET","path":"/crm/automations","permission":"crm:read","pathParams":[]}, {"id":"crm.automations.setEnabled","group":"crm","summary":"Enable or disable a CRM automation.","cli":"dench crm automations enable|disable","method":"PATCH","path":"/crm/automations/{automationId}","permission":"crm:write","pathParams":["automationId"]}, {"id":"meetings.list","group":"meetings","summary":"List meetings, newest first, with status and participants.","cli":"dench meetings list","method":"GET","path":"/meetings","permission":"meetings:read","pathParams":[]}, {"id":"meetings.transcript.list","group":"meetings","summary":"Read a meeting's transcript, in order, one page at a time.","cli":"dench meetings transcript get","method":"GET","path":"/meetings/{meetingEntryId}/transcript","permission":"meetings:read","pathParams":["meetingEntryId"]}, {"id":"meetings.transcript.append","group":"meetings","summary":"Append up to 500 transcript segments to a meeting (speakers with an email link to existing people).","cli":"dench meetings transcript set","method":"POST","path":"/meetings/{meetingEntryId}/transcript","permission":"meetings:write","pathParams":["meetingEntryId"]}, {"id":"meetings.transcript.clear","group":"meetings","summary":"Delete a batch of a meeting's transcript segments; repeat until `done` before re-appending.","cli":"dench meetings transcript clear","method":"DELETE","path":"/meetings/{meetingEntryId}/transcript","permission":"meetings:write","pathParams":["meetingEntryId"]}, {"id":"meetings.actionItems.list","group":"meetings","summary":"List a meeting's action items.","cli":"dench meetings action-items list","method":"GET","path":"/meetings/{meetingEntryId}/action-items","permission":"meetings:read","pathParams":["meetingEntryId"]}, {"id":"meetings.actionItems.add","group":"meetings","summary":"Add action items to a meeting; `replace: true` swaps the whole list.","cli":"dench meetings action-items set","method":"POST","path":"/meetings/{meetingEntryId}/action-items","permission":"meetings:write","pathParams":["meetingEntryId"]}, {"id":"meetings.actionItems.setDone","group":"meetings","summary":"Tick or untick one action item.","cli":"dench meetings action-items done","method":"PATCH","path":"/meetings/action-items/{itemId}","permission":"meetings:write","pathParams":["itemId"]}, {"id":"meetings.actionItems.delete","group":"meetings","summary":"Delete one action item.","cli":"dench meetings action-items delete","method":"DELETE","path":"/meetings/action-items/{itemId}","permission":"meetings:write","pathParams":["itemId"]}, {"id":"meetings.participants.list","group":"meetings","summary":"Who was in the meeting, merged with the linked calendar invite.","cli":"dench meetings participants list","method":"GET","path":"/meetings/{meetingEntryId}/participants","permission":"meetings:read","pathParams":["meetingEntryId"]}, {"id":"meetings.participants.set","group":"meetings","summary":"Record attendees by name/email; known members and existing people are linked, nobody is created.","cli":"dench meetings participants set","method":"PUT","path":"/meetings/{meetingEntryId}/participants","permission":"meetings:write","pathParams":["meetingEntryId"]}, {"id":"meetings.sharing.get","group":"meetings","summary":"Whether a meeting is shared with the whole workspace, and whether you may change that.","cli":"dench meetings share","method":"GET","path":"/meetings/{meetingEntryId}/sharing","permission":"meetings:read","pathParams":["meetingEntryId"]}, {"id":"meetings.sharing.set","group":"meetings","summary":"Share one meeting with the workspace, or take it back to owner + invitees.","cli":"dench meetings share --workspace","method":"PUT","path":"/meetings/{meetingEntryId}/sharing","permission":"meetings:write","pathParams":["meetingEntryId"]}, {"id":"email.identity.verify","group":"email","summary":"Start Dench Emailing Service sender verification.","cli":"dench email identity verify","method":"POST","path":"/email/identities/verify","permission":"email:write","pathParams":[]}, {"id":"email.identity.create","group":"email","summary":"Create a durable Dench email sending identity record.","cli":"dench email identity verify","method":"POST","path":"/email/sending-identities","permission":"email:write","pathParams":[]}, {"id":"email.identity.refresh","group":"email","summary":"Refresh a Dench Emailing Service sender verification status.","cli":"dench email identity status --identity-id","method":"POST","path":"/email/sending-identities/{identityId}/status","permission":"email:write","pathParams":["identityId"]}, {"id":"email.identity.beginVerification","group":"email","summary":"Begin the full Dench sender verification flow for a sending identity.","cli":"dench email identity verify","method":"POST","path":"/email/sending-identities/{identityId}/verify","permission":"email:write","pathParams":["identityId"]}, {"id":"email.identity.status","group":"email","summary":"Read Dench Emailing Service sender verification status.","cli":"dench email identity status","method":"GET","path":"/email/identities/{identity}/status","permission":"email:read","pathParams":["identity"]}, {"id":"email.identity.list","group":"email","summary":"List the workspace's email sending identities.","cli":"dench email identity list","method":"GET","path":"/email/sending-identities","permission":"email:read","pathParams":[]}, {"id":"email.identity.dns","group":"email","summary":"Fetch DNS records (DKIM/SPF/DMARC) for a pending domain sender verification.","cli":"dench email identity dns","method":"GET","path":"/email/sending-identities/{identityId}/dns","permission":"email:read","pathParams":["identityId"]}, {"id":"email.identity.disable","group":"email","summary":"Soft-disable a sender (or every sender on a domain) for the workspace; sends are blocked until restored.","cli":"dench email identity disable","method":"POST","path":"/email/sending-identities/{identity}/disable","permission":"email:write","pathParams":["identity"]}, {"id":"email.identity.restore","group":"email","summary":"Restore a previously disabled sender for the workspace.","cli":"dench email identity restore","method":"POST","path":"/email/sending-identities/{identity}/restore","permission":"email:write","pathParams":["identity"]}, {"id":"email.identity.delete","group":"email","summary":"Permanently delete a sender (or every sender on a domain) from the workspace; re-adding it requires verification from scratch.","cli":"dench email identity delete","method":"DELETE","path":"/email/sending-identities/{identity}","permission":"email:write","pathParams":["identity"]}, {"id":"email.inbox.search","group":"email","summary":"Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness.","cli":"dench email inbox search","method":"GET","path":"/email/inbox/search","permission":"email:read","pathParams":[]}, {"id":"email.inbox.thread","group":"email","summary":"Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand.","cli":"dench email inbox thread","method":"GET","path":"/email/inbox/threads/{threadHandle}","permission":"email:read","pathParams":["threadHandle"]}, {"id":"email.inbox.message","group":"email","summary":"Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy.","cli":"dench email inbox message","method":"GET","path":"/email/inbox/messages/{messageHandle}","permission":"email:read","pathParams":["messageHandle"]}, {"id":"email.drafts.create","group":"email","summary":"Create an editable Dench email draft and synchronize its selected native mailbox asynchronously. Use a stable requestId for retries.","cli":"dench email draft create","method":"POST","path":"/email/drafts","permission":"email:write","pathParams":[]}, {"id":"email.drafts.get","group":"email","summary":"Read an email draft, eligible senders and provider sync status.","cli":"dench email draft show","method":"GET","path":"/email/drafts/{draftId}","permission":"email:read","pathParams":["draftId"]}, {"id":"email.drafts.senders","group":"email","summary":"List native mailboxes this caller may use.","cli":"dench email draft senders","method":"GET","path":"/email/drafts/senders","permission":"email:read","pathParams":[]}, {"id":"email.drafts.update","group":"email","summary":"Save draft content using expectedRevision; sender changes require a new draft after provider binding.","cli":"dench email draft update","method":"PATCH","path":"/email/drafts/{draftId}","permission":"email:write","pathParams":["draftId"]}, {"id":"email.drafts.send","group":"email","summary":"Send the current Dench draft revision through its native mailbox. Repeated requests share a durable receipt.","cli":"dench email draft send","method":"POST","path":"/email/drafts/{draftId}/send","permission":"email:write","pathParams":["draftId"]}, {"id":"email.drafts.upload","group":"email","summary":"Upload attachment bytes authorized against this draft before adding its storage reference.","cli":"dench email draft attach","method":"POST","path":"/email/drafts/{draftId}/attachments","permission":"email:write","pathParams":["draftId"]}, {"id":"email.drafts.signature","group":"email","summary":"Load the selected mailbox signature for explicit visible insertion.","cli":"dench email draft signature","method":"GET","path":"/email/drafts/{draftId}/signature","permission":"email:read","pathParams":["draftId"]}, {"id":"email.native.send","group":"email","summary":"Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request.","cli":"dench email send [--mailbox ]","method":"POST","path":"/email/native/send","permission":"email:write","pathParams":[]}, {"id":"email.send","group":"email","summary":"Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId.","cli":"dench email send --from ","method":"POST","path":"/email/send","permission":"email:write","pathParams":[]}, {"id":"email.message.get","group":"email","summary":"Read a raw email message's status and open/click counters.","cli":"dench email message status","method":"GET","path":"/email/messages/{messageId}","permission":"email:read","pathParams":["messageId"]}, {"id":"email.message.list","group":"email","summary":"List recent raw email messages for the workspace.","cli":"dench email message list","method":"GET","path":"/email/messages","permission":"email:read","pathParams":[]}, {"id":"email.template.create","group":"email","summary":"Create a managed email campaign template.","cli":"dench email template create","method":"POST","path":"/email/templates","permission":"email:write","pathParams":[]}, {"id":"email.template.preview","group":"email","summary":"Preview a managed email campaign template.","cli":"dench email template preview","method":"POST","path":"/email/templates/{templateId}/preview","permission":"email:write","pathParams":["templateId"]}, {"id":"email.campaign.create","group":"email","summary":"Create a managed email campaign draft from a connected inbox or verified sender.","cli":"dench email campaign create","method":"POST","path":"/email/campaigns","permission":"email:write","pathParams":[]}, {"id":"email.campaign.get","group":"email","summary":"Read campaign status and counters.","cli":"dench email campaign status","method":"GET","path":"/email/campaigns/{campaignId}","permission":"email:read","pathParams":["campaignId"]}, {"id":"email.campaign.recipients.add","group":"email","summary":"Add recipients to a managed email campaign.","cli":"dench email campaign recipients add","method":"POST","path":"/email/campaigns/{campaignId}/recipients","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.preview","group":"email","summary":"Preview rendered messages for a campaign sample.","cli":"dench email campaign preview","method":"POST","path":"/email/campaigns/{campaignId}/preview","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.submit","group":"email","summary":"Submit a campaign for approval or sending.","cli":"dench email campaign submit","method":"POST","path":"/email/campaigns/{campaignId}/submit","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.pause","group":"email","summary":"Pause a sending email campaign.","cli":"dench email campaign pause","method":"POST","path":"/email/campaigns/{campaignId}/pause","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.resume","group":"email","summary":"Resume a paused email campaign.","cli":"dench email campaign resume","method":"POST","path":"/email/campaigns/{campaignId}/resume","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.cancel","group":"email","summary":"Cancel an email campaign.","cli":"dench email campaign cancel","method":"POST","path":"/email/campaigns/{campaignId}/cancel","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.campaign.list","group":"email","summary":"List managed email campaigns (paginated, optional status filter).","cli":"dench email campaign list","method":"GET","path":"/email/campaigns","permission":"email:read","pathParams":[]}, {"id":"email.campaign.recipients.list","group":"email","summary":"List a campaign's recipients (paginated, optional status filter).","cli":"dench email campaign recipients list","method":"GET","path":"/email/campaigns/{campaignId}/recipients","permission":"email:read","pathParams":["campaignId"]}, {"id":"email.campaign.recipients.addFromObject","group":"email","summary":"Add campaign recipients from a CRM object: pick the object, the email field, and the entry ids.","cli":"dench email campaign recipients add-from-object","method":"POST","path":"/email/campaigns/{campaignId}/recipients/from-object","permission":"email:write","pathParams":["campaignId"]}, {"id":"email.sequence.create","group":"email","summary":"Create a follow-up sequence from a connected inbox or verified sender.","cli":"dench email sequence create","method":"POST","path":"/email/sequences","permission":"email:write","pathParams":[]}, {"id":"email.sequence.update","group":"email","summary":"Update a sequence's name, sender, or reply/stop settings.","cli":"dench email sequence update","method":"POST","path":"/email/sequences/{sequenceId}","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.activate","group":"email","summary":"Activate a sequence so its enrollments begin sending.","cli":"dench email sequence activate","method":"POST","path":"/email/sequences/{sequenceId}/activate","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.deactivate","group":"email","summary":"Deactivate a sequence (pause sending, revert to draft).","cli":"dench email sequence deactivate","method":"POST","path":"/email/sequences/{sequenceId}/deactivate","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.archive","group":"email","summary":"Archive a sequence (stops all sending).","cli":"dench email sequence archive","method":"POST","path":"/email/sequences/{sequenceId}/archive","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.list","group":"email","summary":"List the workspace's follow-up sequences.","cli":"dench email sequence list","method":"GET","path":"/email/sequences","permission":"email:read","pathParams":[]}, {"id":"email.sequence.get","group":"email","summary":"Read a sequence with its ordered steps.","cli":"dench email sequence status","method":"GET","path":"/email/sequences/{sequenceId}","permission":"email:read","pathParams":["sequenceId"]}, {"id":"email.sequence.step.add","group":"email","summary":"Add a step (subject, body, and wait delay) to a sequence.","cli":"dench email sequence steps add","method":"POST","path":"/email/sequences/{sequenceId}/steps","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.step.update","group":"email","summary":"Update a sequence step's subject, body, or delay.","cli":"dench email sequence steps update","method":"POST","path":"/email/sequences/steps/{stepId}","permission":"email:write","pathParams":["stepId"]}, {"id":"email.sequence.step.remove","group":"email","summary":"Remove a step from a sequence.","cli":"dench email sequence steps remove","method":"POST","path":"/email/sequences/steps/{stepId}/remove","permission":"email:write","pathParams":["stepId"]}, {"id":"email.sequence.step.reorder","group":"email","summary":"Reorder a sequence's steps.","cli":"dench email sequence steps reorder","method":"POST","path":"/email/sequences/{sequenceId}/steps/reorder","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.enroll","group":"email","summary":"Enroll explicit recipients into a sequence.","cli":"dench email sequence enroll","method":"POST","path":"/email/sequences/{sequenceId}/enroll","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.enrollFromObject","group":"email","summary":"Enroll people from a CRM object: pick the object, the email field, and the entry ids.","cli":"dench email sequence enroll-from-object","method":"POST","path":"/email/sequences/{sequenceId}/enroll/from-object","permission":"email:write","pathParams":["sequenceId"]}, {"id":"email.sequence.enrollments.list","group":"email","summary":"List a sequence's enrollments (paginated, optional status filter).","cli":"dench email sequence enrollments list","method":"GET","path":"/email/sequences/{sequenceId}/enrollments","permission":"email:read","pathParams":["sequenceId"]}, {"id":"email.sequence.enrollment.pause","group":"email","summary":"Pause one enrollment.","cli":"dench email sequence enrollment pause","method":"POST","path":"/email/sequences/enrollments/{enrollmentId}/pause","permission":"email:write","pathParams":["enrollmentId"]}, {"id":"email.sequence.enrollment.resume","group":"email","summary":"Resume one paused enrollment.","cli":"dench email sequence enrollment resume","method":"POST","path":"/email/sequences/enrollments/{enrollmentId}/resume","permission":"email:write","pathParams":["enrollmentId"]}, {"id":"email.sequence.enrollment.stop","group":"email","summary":"Stop one enrollment (no further steps send).","cli":"dench email sequence enrollment stop","method":"POST","path":"/email/sequences/enrollments/{enrollmentId}/stop","permission":"email:write","pathParams":["enrollmentId"]}, {"id":"campaigns.accounts.linkedin","group":"campaigns","summary":"Discover LinkedIn sender ids, labels, availability and remaining capacity visible to the acting workspace member. Never returns provider credentials.","cli":"dench campaign accounts","method":"GET","path":"/campaigns/accounts/linkedin","permission":"campaigns:read","pathParams":[]}, {"id":"campaigns.accounts.email","group":"campaigns","summary":"Discover the mailboxes the acting workspace member can send campaign email from: ids for emailMailboxAccountIds, status, warm-up state and when it is done, the daily cold-email cap and what is left today. Never returns provider credentials.","cli":"dench campaign accounts","method":"GET","path":"/campaigns/accounts/email","permission":"campaigns:read","pathParams":[]}, {"id":"campaigns.list","group":"campaigns","summary":"List outreach campaigns (archived ones on request).","cli":"dench campaign list [--with-references]","method":"GET","path":"/campaigns","permission":"campaigns:read","pathParams":[]}, {"id":"campaigns.create","group":"campaigns","summary":"Create a draft outreach campaign with email and LinkedIn sender pools and a business-hours send window in the given timezone.","cli":"dench campaign create","method":"POST","path":"/campaigns","permission":"campaigns:write","pathParams":[]}, {"id":"campaigns.duplicate","group":"campaigns","summary":"Copy a campaign into a new draft named \" copy\": the same steps, schedule, sender pools and personalized lines, its lead source paused, and no people. To reach more than 300 people, duplicate and add the next page of the search to the copy.","cli":"dench campaign duplicate","method":"POST","path":"/campaigns/{sequenceId}/duplicate","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.get","group":"campaigns","summary":"Read a campaign: settings, steps, people, their current step and hold, last touches, linked leads.","cli":"dench campaign get","method":"GET","path":"/campaigns/{sequenceId}","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.analytics","group":"campaigns","summary":"Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks, and for a workflow how many people took each If / else and Wait for them to accept path (branchStats).","cli":"dench campaign get","method":"GET","path":"/campaigns/{sequenceId}/analytics","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.live","group":"campaigns","summary":"What the campaign is doing now, what comes next and when, and why it is holding.","cli":"dench campaign get","method":"GET","path":"/campaigns/{sequenceId}/live","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.pipeline","group":"campaigns","summary":"Where a campaign's people sit in the workspace's lead pipeline right now: each lead Status in order with how many enrolled leads are at it, and how many have no lead or a status outside the pipeline.","cli":"dench campaign pipeline","method":"GET","path":"/campaigns/{sequenceId}/pipeline","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.update","group":"campaigns","summary":"Change a campaign's name, sender pools, send windows, daily email cap, stop-on-reply, start or end. Works until archived; existing conversations keep their assigned sender.","cli":"dench campaign set","method":"PATCH","path":"/campaigns/{sequenceId}","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.steps.replace","group":"campaigns","summary":"Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only.","cli":"dench campaign steps set","method":"PUT","path":"/campaigns/{sequenceId}/steps","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.steps.update","group":"campaigns","summary":"Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace.","cli":"dench campaign steps edit","method":"PATCH","path":"/campaigns/{sequenceId}/steps","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.personalization.get","group":"campaigns","summary":"Read a campaign's personalized lines (written for each person): their {{keys}} for steps, instructions and fallbacks, how many people have them, and the cost per person.","cli":"dench campaign personalize get","method":"GET","path":"/campaigns/{sequenceId}/personalization","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.personalization.set","group":"campaigns","summary":"Define up to 5 personalized lines (each used as {{key}} in steps) and what you sell. Saving starts writing missing lines for up to 100 people, about 3 cents a person; for more it returns needsConfirm and writes nothing until campaigns.personalization.write is confirmed.","cli":"dench campaign personalize set","method":"PUT","path":"/campaigns/{sequenceId}/personalization","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.personalization.clear","group":"campaigns","summary":"Turn off a campaign's personalized lines and cancel the ones not yet written. Refused while a step still uses one of the {{keys}}.","cli":"dench campaign personalize clear","method":"DELETE","path":"/campaigns/{sequenceId}/personalization","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.personalization.write","group":"campaigns","summary":"Write personalized lines for the people missing them (mode missing) or rewrite everyone's (mode all). Rewriting everyone or more than 100 people returns needsConfirm and the estimate until called with confirmed: true.","cli":"dench campaign personalize write","method":"POST","path":"/campaigns/{sequenceId}/personalization/write","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.personalization.edit","group":"campaigns","summary":"Set one person's personalized line by hand; an empty value undoes the edit. Braces are removed and text past the line's length is cut.","cli":"dench campaign personalize edit","method":"PUT","path":"/campaigns/people/{enrollmentId}/personalization","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.personalization.rewrite","group":"campaigns","summary":"Write a fresh personalized line for one person: one key, or all of their lines when key is left out. About 3 cents.","cli":"dench campaign personalize rewrite","method":"POST","path":"/campaigns/people/{enrollmentId}/personalization/rewrite","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.addFromCrm","group":"campaigns","summary":"Add CRM records (up to 100 ids per call) to a campaign; returns how many were added and why others were skipped.","cli":"dench campaign add","method":"POST","path":"/campaigns/{sequenceId}/people","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.people.add","group":"campaigns","summary":"Add one person by email and/or LinkedIn profile URL.","cli":"dench campaign add --name","method":"POST","path":"/campaigns/{sequenceId}/person","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.preview","group":"campaigns","summary":"Show the message one person gets at one email or LinkedIn step, with their fields and personalized lines filled in: subject, body, sender, recipient, merge fields still missing, warnings, and why the step would be skipped. Nothing is sent, prepared or charged.","cli":"dench campaign preview","method":"GET","path":"/campaigns/{sequenceId}/preview","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.launch.preview","group":"campaigns","summary":"Launch readiness without launching: blockers grouped by problem, warnings, and the fingerprint `launch` requires.","cli":"dench campaign launch --check","method":"GET","path":"/campaigns/{sequenceId}/launch","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.launch","group":"campaigns","summary":"Launch a ready draft. Pass the fingerprint from the preview and acknowledge the LinkedIn notice when LinkedIn steps exist.","cli":"dench campaign launch","method":"POST","path":"/campaigns/{sequenceId}/launch","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.pause","group":"campaigns","summary":"Pause an active campaign.","cli":"dench campaign pause","method":"POST","path":"/campaigns/{sequenceId}/pause","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.resume","group":"campaigns","summary":"Resume a paused campaign.","cli":"dench campaign resume","method":"POST","path":"/campaigns/{sequenceId}/resume","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.archive","group":"campaigns","summary":"Archive a campaign and stop everyone still in flight. This is the app's Delete: campaigns are never erased, and their people, leads and activity stay.","cli":"dench campaign archive","method":"POST","path":"/campaigns/{sequenceId}/archive","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.events","group":"campaigns","summary":"The campaign's activity log, newest first (sent, accepted, replied, skipped, failed, paused, stopped).","cli":"dench campaign events","method":"GET","path":"/campaigns/{sequenceId}/events","permission":"campaigns:read","pathParams":["sequenceId"]}, {"id":"campaigns.people.stop","group":"campaigns","summary":"Stop one person: nothing more is sent to them from this campaign.","cli":"dench campaign stop","method":"POST","path":"/campaigns/people/{enrollmentId}/stop","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.resume","group":"campaigns","summary":"Resume one paused person in an active campaign.","cli":"dench campaign resume-person","method":"POST","path":"/campaigns/people/{enrollmentId}/resume","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.setEmail","group":"campaigns","summary":"Give a person in a draft campaign a new or corrected email address; their linked CRM record gets it too. Only before launch; another person in the campaign can't share it.","cli":"dench campaign person set --email","method":"PUT","path":"/campaigns/people/{enrollmentId}/email","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.setLinkedin","group":"campaigns","summary":"Give a person in a draft campaign a new or corrected LinkedIn profile URL; their linked CRM record gets it too. Only before launch.","cli":"dench campaign person set --linkedin-url","method":"PUT","path":"/campaigns/people/{enrollmentId}/linkedin","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.setField","group":"campaigns","summary":"Fill or fix one {{merge field}} for a person in a draft campaign, e.g. a missing Company that blocks launch; a matching column on their CRM record is updated too. Only before launch; written personalized lines are not merge fields and can't be set here.","cli":"dench campaign person set --field","method":"PUT","path":"/campaigns/people/{enrollmentId}/fields","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"campaigns.people.resumeAll","group":"campaigns","summary":"Resume every paused person in an active campaign at once, e.g. after a sending account is reconnected. Returns how many were resumed.","cli":"dench campaign resume-person --all","method":"POST","path":"/campaigns/{sequenceId}/people/resume","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.people.sync","group":"campaigns","summary":"Fill each unfinished person's empty email, LinkedIn URL, name and merge fields from their linked CRM record, e.g. after enriching the records. Never overwrites a value the campaign already has; returns how many people changed.","cli":"dench campaign sync","method":"POST","path":"/campaigns/{sequenceId}/people/sync","permission":"campaigns:write","pathParams":["sequenceId"]}, {"id":"campaigns.people.forRecord","group":"campaigns","summary":"The campaigns a CRM record (a person or a lead) is in, newest first, with the person's status in each and the accounts that send to them.","cli":"dench campaign where","method":"GET","path":"/campaigns/by-record/{entryId}","permission":"campaigns:read","pathParams":["entryId"]}, {"id":"campaigns.people.timeline","group":"campaigns","summary":"Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries.","cli":"dench campaign person show","method":"GET","path":"/campaigns/people/{enrollmentId}/timeline","permission":"campaigns:read","pathParams":["enrollmentId"]}, {"id":"campaigns.people.remove","group":"campaigns","summary":"Remove a person who was never contacted from a draft campaign. Frees their place in the 300-person cap and keeps the draft launchable; stop anyone already contacted instead.","cli":"dench campaign remove","method":"DELETE","path":"/campaigns/people/{enrollmentId}","permission":"campaigns:write","pathParams":["enrollmentId"]}, {"id":"cron.list","group":"routines","summary":"List routines.","cli":"dench cron list","method":"GET","path":"/routines","permission":"cron:schedule","pathParams":[]}, {"id":"cron.history","group":"routines","summary":"List routine run history.","cli":"dench cron history","method":"GET","path":"/routines/history","permission":"cron:schedule","pathParams":[]}, {"id":"cron.get","group":"routines","summary":"Get a routine.","cli":"dench cron get","method":"GET","path":"/routines/{jobId}","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.create","group":"routines","summary":"Create a routine.","cli":"dench cron create","method":"POST","path":"/routines","permission":"cron:schedule","pathParams":[]}, {"id":"cron.update","group":"routines","summary":"Update a routine.","cli":"dench cron update","method":"PATCH","path":"/routines/{jobId}","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.delete","group":"routines","summary":"Delete a routine.","cli":"dench cron delete","method":"DELETE","path":"/routines/{jobId}","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.enable","group":"routines","summary":"Enable a routine.","cli":"dench cron enable","method":"POST","path":"/routines/{jobId}/enable","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.disable","group":"routines","summary":"Disable a routine.","cli":"dench cron disable","method":"POST","path":"/routines/{jobId}/disable","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.run","group":"routines","summary":"Run a routine now.","cli":"dench cron run","method":"POST","path":"/routines/{jobId}/run","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"cron.runs","group":"routines","summary":"List runs for a routine.","cli":"dench cron runs","method":"GET","path":"/routines/{jobId}/runs","permission":"cron:schedule","pathParams":["jobId"]}, {"id":"files.list","group":"files","summary":"List workspace files.","cli":"dench files ls","method":"GET","path":"/files","permission":"files:read","pathParams":[]}, {"id":"files.content","group":"files","summary":"Read a workspace file's text.","cli":"dench files cat","method":"GET","path":"/files/content","permission":"files:read","pathParams":[]}, {"id":"files.write","group":"files","summary":"Write a workspace file's text.","cli":"dench files write","method":"PUT","path":"/files/content","permission":"files:write","pathParams":[]}, {"id":"files.downloadUrl","group":"files","summary":"Get a signed file download URL.","cli":"dench files download","method":"GET","path":"/files/download-url","permission":"files:read","pathParams":[]}, {"id":"files.delete","group":"files","summary":"Remove a workspace file or directory.","cli":"dench files rm","method":"DELETE","path":"/files","permission":"files:write","pathParams":[]}, {"id":"files.move","group":"files","summary":"Move a workspace file or directory.","cli":"dench files mv","method":"POST","path":"/files/move","permission":"files:write","pathParams":[]}, {"id":"files.mkdir","group":"files","summary":"Create a workspace directory (and any missing parents). Idempotent.","cli":"dench files mkdir","method":"POST","path":"/files/mkdir","permission":"files:write","pathParams":[]}, {"id":"files.stage","group":"files","summary":"Stage uploaded content into the workspace.","cli":"dench stage","method":"POST","path":"/files/stage","permission":"files:write","pathParams":[]}, {"id":"search.web","group":"gateway","summary":"Search the web through the Dench gateway.","cli":"dench search","method":"POST","path":"/search","permission":"search:read","pathParams":[]}, {"id":"search.contents","group":"gateway","summary":"Fetch page contents through the Dench gateway.","cli":"dench search contents","method":"POST","path":"/search/contents","permission":"search:read","pathParams":[]}, {"id":"search.answer","group":"gateway","summary":"Answer a question with web search.","cli":"dench search answer","method":"POST","path":"/search/answer","permission":"search:read","pathParams":[]}, {"id":"web.scrape","group":"gateway","summary":"Read a page as clean Markdown through Dench web.","cli":"dench web scrape","method":"POST","path":"/context/web-scrape-markdown","permission":"web:read","pathParams":[]}, {"id":"web.brand","group":"gateway","summary":"Look up a brand kit from a domain or email.","cli":"dench web brand","method":"POST","path":"/context/brand-retrieve","permission":"web:read","pathParams":[]}, {"id":"web.sitemap","group":"gateway","summary":"List sitemap URLs for a domain.","cli":"dench web sitemap","method":"POST","path":"/context/web-sitemap","permission":"web:read","pathParams":[]}, {"id":"web.crawl","group":"gateway","summary":"Crawl a site to Markdown (capped).","cli":"dench web crawl","method":"POST","path":"/context/web-crawl","permission":"web:read","pathParams":[]}, {"id":"web.screenshot","group":"gateway","summary":"Capture a rendered page screenshot.","cli":"dench web screenshot","method":"POST","path":"/context/web-screenshot","permission":"web:read","pathParams":[]}, {"id":"web.extract","group":"gateway","summary":"Extract typed fields from a page using a JSON Schema.","cli":"dench web extract","method":"POST","path":"/context/web-extract","permission":"web:read","pathParams":[]}, {"id":"web.product","group":"gateway","summary":"Extract a product listing from a URL.","cli":"dench web product","method":"POST","path":"/context/web-product","permission":"web:read","pathParams":[]}, {"id":"web.competitors","group":"gateway","summary":"Find competitors of a domain.","cli":"dench web competitors","method":"POST","path":"/context/web-competitors","permission":"web:read","pathParams":[]}, {"id":"web.styleguide","group":"gateway","summary":"Read a brand styleguide from a domain.","cli":"dench web styleguide","method":"POST","path":"/context/brand-styleguide","permission":"web:read","pathParams":[]}, {"id":"web.fonts","group":"gateway","summary":"Read site fonts from a domain.","cli":"dench web fonts","method":"POST","path":"/context/brand-fonts","permission":"web:read","pathParams":[]}, {"id":"web.classify","group":"gateway","summary":"Classify a domain with NAICS or SIC.","cli":"dench web classify","method":"POST","path":"/context/classify-naics","permission":"web:read","pathParams":[]}, {"id":"web.brandSearch","group":"gateway","summary":"Autocomplete brand names.","cli":"dench web brand-search","method":"POST","path":"/context/brand-search","permission":"web:read","pathParams":[]}, {"id":"image.generate","group":"gateway","summary":"Generate an image through the Dench gateway.","cli":"dench image generate","method":"POST","path":"/images/generations","permission":"image:write","pathParams":[]}, {"id":"image.edit","group":"gateway","summary":"Edit an image through the Dench gateway.","cli":"dench image edit","method":"POST","path":"/images/edits","permission":"image:write","pathParams":[]}, {"id":"integrations.list","group":"gateway","summary":"List every connected integration — connected apps plus the Gmail, Outlook, Calendar, LinkedIn and Slack connections Dench provides itself (Slack rows report source: dench).","cli":"dench integrations","method":"GET","path":"/integrations","permission":"integrations:read","pathParams":[]}, {"id":"apps.list","group":"apps","summary":"List installed App Store apps in the workspace.","cli":"dench apps list","method":"GET","path":"/apps","permission":"apps:read","pathParams":[]}, {"id":"apps.gallery","group":"apps","summary":"List Discover listings — Official (Dench) + Community shelves.","cli":"dench apps gallery","method":"GET","path":"/apps/gallery","permission":"apps:read","pathParams":[]}, {"id":"apps.create","group":"apps","summary":"Scaffold and register a new App Store app.","cli":"dench apps create","method":"POST","path":"/apps","permission":"apps:write","pathParams":[]}, {"id":"apps.install","group":"apps","summary":"Install an App Store listing into the workspace.","cli":"dench apps install","method":"POST","path":"/apps/install","permission":"apps:write","pathParams":[]}, {"id":"apps.publish","group":"apps","summary":"Publish an app's files as a versioned App Store listing.","cli":"dench apps publish","method":"POST","path":"/apps/publish","permission":"apps:write","pathParams":[]}, {"id":"apps.uninstall","group":"apps","summary":"Uninstall an app from the workspace.","cli":"dench apps uninstall","method":"DELETE","path":"/apps/{slug}","permission":"apps:write","pathParams":["slug"]}, {"id":"apps.setEnabled","group":"apps","summary":"Enable or disable an installed app.","cli":"dench apps enable","method":"PATCH","path":"/apps/{slug}","permission":"apps:write","pathParams":["slug"]}, {"id":"apps.setPinned","group":"apps","summary":"Pin or unpin an installed app in the rail.","cli":"dench apps pin","method":"POST","path":"/apps/{slug}/pin","permission":"apps:write","pathParams":["slug"]}, {"id":"apps.webhooks.register","group":"apps","summary":"Register an inbound webhook for an app. Returns the URL and signing secret ONCE.","cli":"dench apps webhooks register","method":"POST","path":"/apps/{slug}/webhooks","permission":"webhooks:receive","pathParams":["slug"]}, {"id":"apps.webhooks.list","group":"apps","summary":"List an app's registered webhooks (URLs, never secrets).","cli":"dench apps webhooks list","method":"GET","path":"/apps/{slug}/webhooks","permission":"webhooks:receive","pathParams":["slug"]}, {"id":"apps.webhooks.poll","group":"apps","summary":"Read events an app webhook received since a timestamp.","cli":"dench apps webhooks poll","method":"GET","path":"/apps/{slug}/webhooks/{hookName}/events","permission":"webhooks:receive","pathParams":["slug","hookName"]}, {"id":"apps.webhooks.delete","group":"apps","summary":"Remove an app webhook and every event it stored.","cli":"dench apps webhooks delete","method":"DELETE","path":"/apps/{slug}/webhooks/{hookName}","permission":"webhooks:receive","pathParams":["slug","hookName"]}, {"id":"tool.status","group":"gateway","summary":"List connected tool accounts.","cli":"dench tool status","method":"GET","path":"/tools/status","permission":"integrations:read","pathParams":[]}, {"id":"tool.connect","group":"gateway","summary":"Create a tool OAuth connection link. Slack is in-house, never a third-party connection: for toolkit slack the CLI prints the first-party install URL (/api/slack/install?slug=, org admin) instead of calling this endpoint.","cli":"dench tool connect","method":"POST","path":"/tools/connections","permission":"integrations:write","pathParams":[]}, {"id":"tool.search","group":"gateway","summary":"Search for external tool actions.","cli":"dench tool search","method":"POST","path":"/tools/search","permission":"integrations:read","pathParams":[]}, {"id":"tool.run","group":"gateway","summary":"Run an external tool action. SLACK_* slugs (SLACK_SEND_MESSAGE with Block Kit blocks/buttons, SLACK_FETCH_HISTORY, SLACK_LIST_CHANNELS, …) run through Dench's in-house Slack app install — any channel in the connected workspace — and are always preferred over any third-party Slack connection.","cli":"dench tool run","method":"POST","path":"/tools/run","permission":"integrations:write","pathParams":[]}, {"id":"tool.disconnect","group":"gateway","summary":"Disconnect an external tool account.","cli":"dench tool disconnect","method":"DELETE","path":"/tools/connections/{connectionId}","permission":"integrations:write","pathParams":["connectionId"]}, {"id":"tool.labels.list","group":"gateway","summary":"List human names given to connected accounts.","cli":"dench tool labels","method":"GET","path":"/tools/labels","permission":"integrations:read","pathParams":[]}, {"id":"tool.label.set","group":"gateway","summary":"Name a connected account, or clear its name with an empty string.","cli":"dench tool label","method":"PUT","path":"/tools/connections/{connectionId}/label","permission":"integrations:write","pathParams":["connectionId"]}, {"id":"browser.action","group":"browser","summary":"Drive Dench Browser with a single interactive action (open, inspect, click, fill, type, screenshot, stop). Pass the step in `action` plus its arguments.","cli":"dench browser","method":"POST","path":"/browser/cli","permission":"browser:write","pathParams":[]}, {"id":"browser.session.create","group":"browser","summary":"Create a Dench Browser session and return a CDP connect URL for Playwright (chromium.connectOverCDP) plus a live-view URL. Use for durable scripts run from the sandbox.","cli":"dench browser session create","method":"POST","path":"/browser/sessions","permission":"browser:write","pathParams":[]}, {"id":"browser.session.status","group":"browser","summary":"Get the status, connect URL, and live-view URL for a Dench Browser session.","cli":"dench browser session status","method":"GET","path":"/browser/sessions/{sessionId}","permission":"browser:read","pathParams":["sessionId"]}, {"id":"browser.session.stop","group":"browser","summary":"Stop a Dench Browser session and release the remote browser.","cli":"dench browser session stop","method":"DELETE","path":"/browser/sessions/{sessionId}","permission":"browser:write","pathParams":["sessionId"]}, {"id":"agentConfig.identity.show","group":"agent-config","summary":"Read IDENTITY.md.","cli":"dench context --sections identity","method":"GET","path":"/agent-config/identity","permission":"agent-config:read","pathParams":[]}, {"id":"agentConfig.identity.edit","group":"agent-config","summary":"Update IDENTITY.md.","cli":"dench context set identity","method":"PUT","path":"/agent-config/identity","permission":"agent-config:write","pathParams":[]}, {"id":"agentConfig.organisation.show","group":"agent-config","summary":"Read ORGANISATION.md.","cli":"dench context --sections organisation","method":"GET","path":"/agent-config/organisation","permission":"agent-config:read","pathParams":[]}, {"id":"agentConfig.organisation.edit","group":"agent-config","summary":"Update ORGANISATION.md.","cli":"dench context set organisation","method":"PUT","path":"/agent-config/organisation","permission":"agent-config:write","pathParams":[]}, {"id":"agentConfig.user.show","group":"agent-config","summary":"Read USER.md.","cli":"dench context --sections user","method":"GET","path":"/agent-config/user","permission":"agent-config:read","pathParams":[]}, {"id":"agentConfig.user.edit","group":"agent-config","summary":"Update USER.md.","cli":"dench context set user","method":"PUT","path":"/agent-config/user","permission":"agent-config:write","pathParams":[]}, {"id":"agentConfig.tools.show","group":"agent-config","summary":"Read tool notes.","cli":"dench context --sections tools","method":"GET","path":"/agent-config/tools","permission":"agent-config:read","pathParams":[]}, {"id":"agentConfig.tools.edit","group":"agent-config","summary":"Update tool notes.","cli":"dench context set tools","method":"PUT","path":"/agent-config/tools","permission":"agent-config:write","pathParams":[]}, {"id":"workspace.context.rules.set","group":"workspace","summary":"Update standing workspace rules; credentials belong in secrets and runnable setup in environments.","cli":"dench context set rules","method":"PUT","path":"/context/rules","permission":"workspace:write","pathParams":[]}, {"id":"agentConfig.mem.show","group":"agent-config","summary":"Read aggregate memory.","cli":"dench mem show","method":"GET","path":"/agent-config/mem","permission":"agent-config:read","deprecated":true,"pathParams":[]}, {"id":"agentConfig.mem.edit","group":"agent-config","summary":"Update aggregate memory.","cli":"dench mem set","method":"PUT","path":"/agent-config/mem","permission":"agent-config:write","deprecated":true,"pathParams":[]}, {"id":"agentConfig.bootstrap.show","group":"agent-config","summary":"Read bootstrap state.","cli":"dench bootstrap status","method":"GET","path":"/agent-config/bootstrap","permission":"agent-config:read","deprecated":true,"pathParams":[]}, {"id":"agentConfig.bootstrap.complete","group":"agent-config","summary":"Complete bootstrap.","cli":"dench bootstrap complete","method":"POST","path":"/agent-config/bootstrap/complete","permission":"agent-config:write","deprecated":true,"pathParams":[]}, {"id":"agentConfig.bootstrap.template","group":"agent-config","summary":"Update bootstrap template.","cli":"dench bootstrap template","method":"PUT","path":"/agent-config/bootstrap/template","permission":"agent-config:write","deprecated":true,"pathParams":[]}, {"id":"agentConfig.model.default","group":"agent-config","summary":"Set the default chat model.","cli":"dench model default","method":"PUT","path":"/agent-config/model/default","permission":"agent-config:write","pathParams":[]}, {"id":"agentConfig.model.thread","group":"agent-config","summary":"Set a thread model override.","cli":"dench model thread","method":"PUT","path":"/agent-config/model/threads/{threadId}","permission":"agent-config:write","pathParams":["threadId"]}, {"id":"agentConfig.daily.today","group":"agent-config","summary":"Read today's daily activity path.","cli":"dench daily today","method":"GET","path":"/agent-config/daily/today","permission":"agent-config:read","deprecated":true,"pathParams":[]}, {"id":"agentConfig.daily.show","group":"agent-config","summary":"Read a daily activity path.","cli":"dench daily show","method":"GET","path":"/agent-config/daily/{date}","permission":"agent-config:read","deprecated":true,"pathParams":["date"]}, {"id":"notifications.list","group":"notifications","summary":"List your notifications (inbox, unread, archived, or all).","cli":"dench notifications list","method":"GET","path":"/notifications","permission":"notifications:read","pathParams":[]}, {"id":"notifications.unreadCount","group":"notifications","summary":"How many unread notifications you have.","cli":"dench notifications count","method":"GET","path":"/notifications/unread-count","permission":"notifications:read","pathParams":[]}, {"id":"notifications.read","group":"notifications","summary":"Mark a notification read (or unread).","cli":"dench notifications read","method":"PATCH","path":"/notifications/{notificationId}","permission":"notifications:write","pathParams":["notificationId"]}, {"id":"notifications.readAll","group":"notifications","summary":"Mark every inbox notification read.","cli":"dench notifications read-all","method":"POST","path":"/notifications/read-all","permission":"notifications:write","pathParams":[]}, {"id":"notifications.archive","group":"notifications","summary":"Archive a notification.","cli":"dench notifications archive","method":"POST","path":"/notifications/{notificationId}/archive","permission":"notifications:write","pathParams":["notificationId"]}, {"id":"notifications.preferences.get","group":"notifications","summary":"Read your notification preferences.","cli":"dench notifications prefs","method":"GET","path":"/notifications/preferences","permission":"notifications:read","pathParams":[]}, {"id":"notifications.preferences.update","group":"notifications","summary":"Update your notification preferences.","cli":"dench notifications prefs --set","method":"PATCH","path":"/notifications/preferences","permission":"notifications:write","pathParams":[]}, {"id":"settings.sync.get","group":"settings","summary":"Read the workspace's Sync switches (accounts from email, contacts from LinkedIn, Slack Connect, calendar, dossier, tasks from email, lead auto-qualify, summaries and Brief). All on by default.","cli":"dench settings sync","method":"GET","path":"/settings/sync","permission":"settings:read","pathParams":[]}, {"id":"settings.sync.update","group":"settings","summary":"Flip Sync switches (admin). Partial patch: only the keys sent change. Off stops new work; nothing already created is removed.","cli":"dench settings sync set","method":"PATCH","path":"/settings/sync","permission":"settings:write","pathParams":[]}, ]; /** CLI-only operation ids (sessions, fs, imports): never callable from an app. */ export const APP_SDK_LOCAL_OPERATIONS: readonly string[] = ["environments.run","sessions.local.list","sessions.local.use","sessions.local.logout","backend.local.configure","enrichment.filters.options","crm.import","crm.export","meetings.import","fs.daemon","apps.validate"]; /** Curated window.dench methods → permission (host + aliases). */ export const APP_SDK_METHODS: Readonly> = { "app.getManifest": {"kind":"host","permission":null,"doc":"The parsed .dench.yaml of this app."}, "app.getTheme": {"kind":"host","permission":null,"doc":"Current workspace theme (\"light\" | \"dark\")."}, "context.getWorkspace": {"kind":"host","permission":null,"doc":"Workspace name/slug the app is running in."}, "context.getAppInfo": {"kind":"host","permission":null,"doc":"App path, folder slug, granted permissions and manifest."}, "api.call": {"kind":"host","permission":null,"doc":"Call ANY public /api/v1 operation by id (e.g. \"crm.query\"). Permission is the operation's own scope."}, "api.operations": {"kind":"host","permission":null,"doc":"Runtime catalog of every callable operation: id, cli, method, path, permission."}, "objects.list": {"kind":"host","permission":"crm:read","doc":"Paged rows of an object (flat `id` + field-on-row shape)."}, "objects.query": {"kind":"host","permission":"crm:read","doc":"Filter/sort/select rows with the query DSL (max 1000). Aggregate with analytics.compute instead."}, "objects.get": {"kind":"host","permission":"crm:read","doc":"One entry by id."}, "objects.create": {"kind":"host","permission":"crm:write","doc":"Create an entry."}, "objects.update": {"kind":"host","permission":"crm:write","doc":"Patch an entry's fields."}, "objects.delete": {"kind":"host","permission":"crm:write","doc":"Delete one entry."}, "objects.bulkDelete": {"kind":"host","permission":"crm:write","doc":"Delete many entries."}, "objects.getSchema": {"kind":"host","permission":"crm:read","doc":"Object definition: fields, types, enum options, relations."}, "objects.getOptions": {"kind":"host","permission":"crm:read","doc":"Relation picker options (id + label) for an object, optionally filtered."}, "analytics.get": {"kind":"op","permission":"crm:read","op":"crm.analytics.get","doc":"Stored dashboard: panels, field roles, collapsed flag (+ the view's own dashboard when viewName is set)."}, "analytics.compute": {"kind":"op","permission":"crm:read","op":"crm.analytics.compute","doc":"Pre-bucketed KPIs/charts/maps — the strip's own math. Stored dashboard, `panelIds`, or ad-hoc `panels`; `period` and `drillFilters` expand server-side."}, "analytics.save": {"kind":"op","permission":"crm:write","op":"crm.analytics.save","doc":"Create or update a stored panel (object dashboard, or the view's when viewName is set — first save forks an inheriting view)."}, "analytics.update": {"kind":"op","permission":"crm:write","op":"crm.analytics.update","doc":"Edit part of a stored panel (title, type, metric, groupBy, dateField, filters, derived, span, hidden, sortOrder …); null clears an optional key."}, "analytics.hide": {"kind":"op","permission":"crm:write","op":"crm.analytics.hide","doc":"Take a chart off the strip above the table; it stays in the full analytics view."}, "analytics.show": {"kind":"op","permission":"crm:write","op":"crm.analytics.show","doc":"Bring a hidden chart back onto the strip."}, "analytics.resize": {"kind":"op","permission":"crm:write","op":"crm.analytics.resize","doc":"Set a card's width: span 2 (third) | 3 (half) | 4 (two thirds) | 6 (full) | null (default for the chart kind)."}, "analytics.delete": {"kind":"op","permission":"crm:write","op":"crm.analytics.delete","doc":"Delete a stored panel."}, "analytics.reorder": {"kind":"op","permission":"crm:write","op":"crm.analytics.reorder","doc":"Persist the full panel order."}, "analytics.roles": {"kind":"op","permission":"crm:write","op":"crm.analytics.roles","doc":"Set the object's analytics setup shared by every chart and view: amount / stage / won-lost-converted / stageProbabilities / closeDate / recurrence / owner / location. Pass merge: true to change only the keys given (null clears one)."}, "analytics.collapse": {"kind":"op","permission":"crm:write","op":"crm.analytics.collapse","doc":"Collapse the team-shared strip for this object."}, "analytics.expand": {"kind":"op","permission":"crm:write","op":"crm.analytics.expand","doc":"Expand the team-shared strip for this object."}, "analytics.scope": {"kind":"op","permission":"crm:write","op":"crm.analytics.scope","doc":"Flip a saved view between its \"own\" dashboard and the object's \"shared\" one."}, "comments.list": {"kind":"op","permission":"crm:read","op":"crm.comments.list","doc":"Root comments on an entry (with reply previews), paged."}, "comments.replies": {"kind":"op","permission":"crm:read","op":"crm.comments.replies","doc":"Replies under a root comment."}, "comments.get": {"kind":"op","permission":"crm:read","op":"crm.comments.get","doc":"One comment."}, "comments.create": {"kind":"op","permission":"crm:write","op":"crm.comments.create","doc":"Post a markdown comment (mention members with [@Name](/?member=), Dench with [@Dench](/?member=dench))."}, "comments.update": {"kind":"op","permission":"crm:write","op":"crm.comments.update","doc":"Edit a comment body."}, "comments.delete": {"kind":"op","permission":"crm:write","op":"crm.comments.delete","doc":"Delete a comment."}, "comments.react": {"kind":"op","permission":"crm:write","op":"crm.comments.react","doc":"Toggle an emoji reaction."}, "watch.get": {"kind":"op","permission":"crm:read","op":"crm.watch.get","doc":"Am I following this entry?"}, "watch.set": {"kind":"op","permission":"crm:write","op":"crm.watch.set","doc":"Follow (default) or unfollow an entry."}, "views.list": {"kind":"op","permission":"crm:read","op":"crm.views.list","doc":"Saved views of an object."}, "views.get": {"kind":"op","permission":"crm:read","op":"crm.views.get","doc":"One saved view (filters, sort, columns, analytics)."}, "views.entries": {"kind":"op","permission":"crm:read","op":"crm.views.entries","doc":"Rows as the saved view shows them."}, "views.create": {"kind":"op","permission":"crm:write","op":"crm.views.create","doc":"Create a saved view."}, "views.update": {"kind":"op","permission":"crm:write","op":"crm.views.update","doc":"Update a saved view."}, "views.delete": {"kind":"op","permission":"crm:write","op":"crm.views.delete","doc":"Delete a saved view."}, "tasks.mine": {"kind":"op","permission":"crm:read","op":"crm.tasks.mine","doc":"Open tasks assigned to me."}, "tasks.forEntry": {"kind":"op","permission":"crm:read","op":"crm.tasks.forEntry","doc":"Tasks linked to an entry."}, "tasks.create": {"kind":"op","permission":"crm:write","op":"crm.tasks.createForEntry","doc":"Create a task on an entry."}, "tasks.complete": {"kind":"op","permission":"crm:write","op":"crm.tasks.complete","doc":"Mark a task done."}, "tasks.reopen": {"kind":"op","permission":"crm:write","op":"crm.tasks.reopen","doc":"Reopen a task."}, "tasks.setPriority": {"kind":"op","permission":"crm:write","op":"crm.tasks.setPriority","doc":"Set a task's priority (one of the workspace's options) or clear it with null."}, "tasks.subtasks": {"kind":"op","permission":"crm:read","op":"crm.tasks.subtasks.list","doc":"A task's subtasks."}, "tasks.createSubtask": {"kind":"op","permission":"crm:write","op":"crm.tasks.subtasks.create","doc":"Create a subtask under a task (one level deep; inherits the parent's record relations)."}, "tasks.setParent": {"kind":"op","permission":"crm:write","op":"crm.tasks.setParent","doc":"Nest a task under a parent, or promote it with null."}, "tasks.delete": {"kind":"op","permission":"crm:write","op":"crm.tasks.delete","doc":"Delete a task; its subtasks go with it unless subtasks is \"keep\"."}, "tasks.getRepeat": {"kind":"op","permission":"crm:read","op":"crm.tasks.repeat.get","doc":"How a task repeats (rule, RRULE, trigger, ends, next due), or null."}, "tasks.setRepeat": {"kind":"op","permission":"crm:write","op":"crm.tasks.repeat.set","doc":"Make a task repeat or change how it repeats (JSON rule or RRULE). An undated task gets its due date anchored on the first matching day from today."}, "tasks.clearRepeat": {"kind":"op","permission":"crm:write","op":"crm.tasks.repeat.clear","doc":"Stop a task repeating."}, "tasks.skipRepeat": {"kind":"op","permission":"crm:write","op":"crm.tasks.repeat.skip","doc":"Skip the current occurrence; the next one is created now."}, "tasks.pauseRepeat": {"kind":"op","permission":"crm:write","op":"crm.tasks.repeat.pause","doc":"Pause a repeating task."}, "tasks.resumeRepeat": {"kind":"op","permission":"crm:write","op":"crm.tasks.repeat.resume","doc":"Resume a paused repeating task."}, "tasks.series": {"kind":"op","permission":"crm:read","op":"crm.tasks.series.list","doc":"Every repeating-task series in the workspace."}, "tasks.seriesOccurrences": {"kind":"op","permission":"crm:read","op":"crm.tasks.series.occurrences","doc":"Every occurrence of one series."}, "notifications.list": {"kind":"op","permission":"notifications:read","op":"notifications.list","doc":"My notifications (inbox | unread | archived | all | mentions)."}, "notifications.unreadCount": {"kind":"op","permission":"notifications:read","op":"notifications.unreadCount","doc":"Unread badge count."}, "notifications.read": {"kind":"op","permission":"notifications:write","op":"notifications.read","doc":"Mark one read (or unread)."}, "notifications.readAll": {"kind":"op","permission":"notifications:write","op":"notifications.readAll","doc":"Mark everything read."}, "notifications.archive": {"kind":"op","permission":"notifications:write","op":"notifications.archive","doc":"Archive one notification."}, "notifications.getPreferences": {"kind":"op","permission":"notifications:read","op":"notifications.preferences.get","doc":"My notification preferences."}, "notifications.updatePreferences": {"kind":"op","permission":"notifications:write","op":"notifications.preferences.update","doc":"Update my notification preferences."}, "members.get": {"kind":"op","permission":"members:read","op":"members.get","doc":"A member's profile."}, "members.presence": {"kind":"op","permission":"members:read","op":"members.presence","doc":"Who is online / away / offline."}, "members.activity": {"kind":"op","permission":"members:read","op":"members.activity","doc":"A member's recent CRM activity."}, "members.tasks": {"kind":"op","permission":"members:read","op":"members.tasks","doc":"A member's open tasks."}, "members.me": {"kind":"op","permission":"members:read","op":"me.profile.get","doc":"My own profile."}, "members.updateMe": {"kind":"op","permission":"members:write","op":"me.profile.update","doc":"Update my name / tagline / timezone."}, "meetings.list": {"kind":"op","permission":"meetings:read","op":"meetings.list","doc":"Meetings (CRM `meeting` rows), newest first."}, "meetings.transcript": {"kind":"op","permission":"meetings:read","op":"meetings.transcript.list","doc":"Transcript segments of a meeting."}, "meetings.actionItems": {"kind":"op","permission":"meetings:read","op":"meetings.actionItems.list","doc":"Action items of a meeting."}, "meetings.addActionItems": {"kind":"op","permission":"meetings:write","op":"meetings.actionItems.add","doc":"Add action items to a meeting."}, "meetings.setActionItemDone": {"kind":"op","permission":"meetings:write","op":"meetings.actionItems.setDone","doc":"Check or uncheck an action item."}, "meetings.participants": {"kind":"op","permission":"meetings:read","op":"meetings.participants.list","doc":"Participants of a meeting."}, "meetings.sharing": {"kind":"op","permission":"meetings:read","op":"meetings.sharing.get","doc":"Whether a meeting is shared with the whole workspace."}, "meetings.setSharing": {"kind":"op","permission":"meetings:write","op":"meetings.sharing.set","doc":"Share a meeting with the workspace, or take it back to owner + invitees."}, "lists.list": {"kind":"op","permission":"lists:read","op":"lists.list","doc":"Saved lead lists."}, "lists.get": {"kind":"op","permission":"lists:read","op":"lists.get","doc":"One saved list with its rows."}, "lists.rename": {"kind":"op","permission":"lists:write","op":"lists.rename","doc":"Rename a list."}, "lists.delete": {"kind":"op","permission":"lists:write","op":"lists.delete","doc":"Delete a list."}, "campaigns.create": {"kind":"op","permission":"campaigns:write","op":"campaigns.create","doc":"Create a draft campaign."}, "campaigns.draft": {"kind":"op","permission":"campaigns:write","op":"campaigns.drafts.create","doc":"Create an idempotent draft with available sender pools."}, "campaigns.search": {"kind":"op","permission":"campaigns:write","op":"campaigns.audience.search","doc":"Search people without enrolling them. Search credits apply."}, "campaigns.addPeople": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.addBatch","doc":"Add up to 50 selected recipients without running another search."}, "campaigns.addFromSearch": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.addFromSearch","doc":"Search and add up to 50 people to an existing campaign."}, "campaigns.sources": {"kind":"op","permission":"campaigns:read","op":"campaigns.sources.get","doc":"Read the campaign's lead source."}, "campaigns.sourceSignals": {"kind":"op","permission":"campaigns:read","op":"campaigns.sources.signals","doc":"Read signal choices and suggestions."}, "campaigns.updateSources": {"kind":"op","permission":"campaigns:write","op":"campaigns.sources.update","doc":"Update targeting, signals, cadence or source status."}, "campaigns.previewSignal": {"kind":"op","permission":"campaigns:write","op":"campaigns.sources.preview","doc":"Preview a signal without enrolling people. Provider credits may apply."}, "campaigns.profile": {"kind":"op","permission":"campaigns:read","op":"campaigns.builder.profile","doc":"Read suggested campaign targeting."}, "campaigns.saveDraft": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.save","doc":"Save signal-draft targeting and choices."}, "campaigns.getDraft": {"kind":"op","permission":"campaigns:read","op":"campaigns.builder.get","doc":"Read preview people, messages and build progress."}, "campaigns.buildDraft": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.build","doc":"Start a billable signal draft build."}, "campaigns.createFromDraft": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.create","doc":"Create a campaign from a reviewed signal draft, without launching."}, "campaigns.setDraftOpener": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.opener","doc":"Edit a preview person's opening line."}, "campaigns.autofill": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.autofill","doc":"Translate a description into targeting. AI credits apply."}, "campaigns.savedDrafts": {"kind":"op","permission":"campaigns:read","op":"campaigns.builder.drafts","doc":"List saved, unfinished campaign drafts."}, "campaigns.resumeDraft": {"kind":"op","permission":"campaigns:read","op":"campaigns.builder.resume","doc":"Read a saved draft's setup to resume it."}, "campaigns.discardDraft": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.discard","doc":"Discard a saved draft."}, "campaigns.saveOutreach": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.outreach","doc":"Save a draft's steps, brief, senders, schedule and approval mode."}, "campaigns.generateSequence": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.sequence","doc":"Generate a draft's sequence from a brief. AI credits apply."}, "campaigns.lookalike": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.lookalike","doc":"Set up a lookalike from a best lead's LinkedIn URL. Provider credits apply."}, "campaigns.suggestVoices": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.voices","doc":"Suggest LinkedIn experts to watch for the topics. AI credits apply."}, "campaigns.runSources": {"kind":"op","permission":"campaigns:write","op":"campaigns.sources.run","doc":"Run a live campaign's signals now. Provider credits apply."}, "campaigns.pendingReview": {"kind":"op","permission":"campaigns:read","op":"campaigns.sources.pending","doc":"People a signal found who wait for approval."}, "campaigns.reviewPeople": {"kind":"op","permission":"campaigns:write","op":"campaigns.sources.review","doc":"Approve or reject people waiting for review."}, "campaigns.todayQueue": {"kind":"op","permission":"campaigns:read","op":"campaigns.queue","doc":"Who the campaign plans to contact today."}, "campaigns.estimate": {"kind":"op","permission":"campaigns:write","op":"campaigns.builder.estimate","doc":"Estimate audience or signal volume."}, "campaigns.mailboxes": {"kind":"op","permission":"campaigns:read","op":"campaigns.accounts.email","doc":"Mailboxes campaigns can send from, with warm-up and daily cap."}, "campaigns.linkedinAccounts": {"kind":"op","permission":"campaigns:read","op":"campaigns.accounts.linkedin","doc":"LinkedIn accounts campaigns can send from, with capacity."}, "campaigns.list": {"kind":"op","permission":"campaigns:read","op":"campaigns.list","doc":"LinkedIn / multi-channel outreach campaigns."}, "campaigns.get": {"kind":"op","permission":"campaigns:read","op":"campaigns.get","doc":"One campaign."}, "campaigns.setSteps": {"kind":"op","permission":"campaigns:write","op":"campaigns.steps.replace","doc":"Replace every step of a draft campaign."}, "campaigns.editSteps": {"kind":"op","permission":"campaigns:write","op":"campaigns.steps.update","doc":"Edit launched steps in place by stepId and updatedAt."}, "campaigns.duplicate": {"kind":"op","permission":"campaigns:write","op":"campaigns.duplicate","doc":"Copy a campaign into a new draft without its people."}, "campaigns.analytics": {"kind":"op","permission":"campaigns:read","op":"campaigns.analytics","doc":"Campaign funnel numbers."}, "campaigns.events": {"kind":"op","permission":"campaigns:read","op":"campaigns.events","doc":"Campaign event log."}, "campaigns.pause": {"kind":"op","permission":"campaigns:write","op":"campaigns.pause","doc":"Pause a campaign."}, "campaigns.resume": {"kind":"op","permission":"campaigns:write","op":"campaigns.resume","doc":"Resume a campaign."}, "campaigns.archive": {"kind":"op","permission":"campaigns:write","op":"campaigns.archive","doc":"Archive (the app's Delete) a campaign; nothing is erased."}, "campaigns.previewMessage": {"kind":"op","permission":"campaigns:read","op":"campaigns.preview","doc":"The message one person gets at one step, fields filled in. Sends nothing."}, "campaigns.personalization": {"kind":"op","permission":"campaigns:read","op":"campaigns.personalization.get","doc":"Personalized lines, their {{keys}} and how many are written."}, "campaigns.setPersonalization": {"kind":"op","permission":"campaigns:write","op":"campaigns.personalization.set","doc":"Define up to 5 personalized lines. Writing them costs credits."}, "campaigns.clearPersonalization": {"kind":"op","permission":"campaigns:write","op":"campaigns.personalization.clear","doc":"Turn personalized lines off."}, "campaigns.writeLines": {"kind":"op","permission":"campaigns:write","op":"campaigns.personalization.write","doc":"Write missing (or all) personalized lines. Costs credits."}, "campaigns.editLine": {"kind":"op","permission":"campaigns:write","op":"campaigns.personalization.edit","doc":"Set one person's personalized line by hand."}, "campaigns.rewriteLine": {"kind":"op","permission":"campaigns:write","op":"campaigns.personalization.rewrite","doc":"Write a fresh line for one person. Costs credits."}, "campaigns.syncPeople": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.sync","doc":"Fill people's empty contact details from their CRM records."}, "campaigns.resumeAllPeople": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.resumeAll","doc":"Resume every paused person in an active campaign."}, "campaigns.setPersonEmail": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.setEmail","doc":"Fix a draft person's email address."}, "campaigns.setPersonLinkedin": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.setLinkedin","doc":"Fix a draft person's LinkedIn profile URL."}, "campaigns.setPersonField": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.setField","doc":"Fill one {{merge field}} for a draft person."}, "campaigns.pipeline": {"kind":"op","permission":"campaigns:read","op":"campaigns.pipeline","doc":"Where the campaign's people sit in the lead pipeline."}, "campaigns.campaignsForRecord": {"kind":"op","permission":"campaigns:read","op":"campaigns.people.forRecord","doc":"The campaigns a CRM record is in, with its status in each."}, "campaigns.personTimeline": {"kind":"op","permission":"campaigns:read","op":"campaigns.people.timeline","doc":"Everything a campaign did for one person, step by step."}, "campaigns.removePerson": {"kind":"op","permission":"campaigns:write","op":"campaigns.people.remove","doc":"Remove a never-contacted person from a draft campaign."}, "email.createDraft": {"kind":"op","permission":"email:write","op":"email.drafts.create","doc":"Create a native mailbox draft with a stable request receipt."}, "email.draft": {"kind":"op","permission":"email:read","op":"email.drafts.get","doc":"Read a native email draft and sync status."}, "email.updateDraft": {"kind":"op","permission":"email:write","op":"email.drafts.update","doc":"Save the next email draft revision."}, "email.sendDraft": {"kind":"op","permission":"email:write","op":"email.drafts.send","doc":"Send the frozen native email draft revision."}, "email.senders": {"kind":"op","permission":"email:read","op":"email.drafts.senders","doc":"List eligible native mailboxes."}, "email.uploadAttachment": {"kind":"op","permission":"email:write","op":"email.drafts.upload","doc":"Upload attachment bytes for a native draft."}, "email.signature": {"kind":"op","permission":"email:read","op":"email.drafts.signature","doc":"Load the selected mailbox signature for visible insertion."}, "email.sendFromMailbox": {"kind":"op","permission":"email:write","op":"email.native.send","doc":"Explicitly send through a native Gmail or Outlook mailbox."}, "email.send": {"kind":"op","permission":"email:write","op":"email.send","doc":"Send one email from a verified identity."}, "email.messages": {"kind":"op","permission":"email:read","op":"email.message.list","doc":"Sent messages."}, "email.message": {"kind":"op","permission":"email:read","op":"email.message.get","doc":"One sent message with delivery events."}, "email.campaigns": {"kind":"op","permission":"email:read","op":"email.campaign.list","doc":"Email campaigns."}, "email.campaign": {"kind":"op","permission":"email:read","op":"email.campaign.get","doc":"One email campaign."}, "email.identities": {"kind":"op","permission":"email:read","op":"email.identity.list","doc":"Verified sending identities."}, "billing.status": {"kind":"op","permission":"billing:read","op":"billing.status","doc":"Plan, AI balance and usage for the workspace."}, "billing.topup": {"kind":"op","permission":"billing:write","op":"billing.topup","doc":"Start an AI credit top-up (returns a Stripe URL)."}, "billing.upgrade": {"kind":"op","permission":"billing:write","op":"billing.upgrade","doc":"Upgrade the plan (returns a Stripe Checkout URL or updates in place)."}, "approvals.list": {"kind":"op","permission":"approvals:read","op":"workspace.approvals.list","doc":"Pending approvals in the workspace."}, "approvals.request": {"kind":"op","permission":"approvals:write","op":"approval.request","doc":"Ask a human to approve an action."}, "approvals.decide": {"kind":"op","permission":"approvals:write","op":"approval.decide","doc":"Approve or reject a pending approval."}, "memory.get": {"kind":"host","permission":"memory:read","deprecated":"Use memory.search(query).","doc":"The workspace's saved memories (legacy shape)."}, "memory.search": {"kind":"op","permission":"memory:read","op":"memory.search","doc":"Full-text search over saved memories."}, "memory.save": {"kind":"op","permission":"memory:write","op":"memory.save","doc":"Save a memory under a stable key."}, "workspace.context": {"kind":"op","permission":"workspace:read","op":"workspace.context","doc":"What this workspace has: objects, agents, integrations, next commands."}, "workspace.status": {"kind":"op","permission":"workspace:read","op":"workspace.status","doc":"Workspace status snapshot."}, "workspace.agents": {"kind":"op","permission":"workspace:read","op":"workspace.agents","doc":"Agents in this workspace."}, "workspace.artifacts": {"kind":"op","permission":"workspace:read","op":"workspace.artifacts.list","doc":"Recent artifacts (reports, docs, lists)."}, "workspace.instructions": {"kind":"op","permission":"workspace:read","op":"workspace.instructions","doc":"Workspace instructions the agent follows."}, "search.web": {"kind":"op","permission":"search:read","op":"search.web","doc":"Web search (gateway)."}, "search.contents": {"kind":"op","permission":"search:read","op":"search.contents","doc":"Fetch page contents for search results."}, "search.answer": {"kind":"op","permission":"search:read","op":"search.answer","doc":"Answer a question from web sources."}, "web.scrape": {"kind":"op","permission":"web:read","op":"web.scrape","doc":"Scrape a URL to Markdown."}, "web.brand": {"kind":"op","permission":"web:read","op":"web.brand","doc":"Brand kit (logo, colors, fonts) for a domain."}, "web.screenshot": {"kind":"op","permission":"web:read","op":"web.screenshot","doc":"Screenshot a rendered page."}, "web.extract": {"kind":"op","permission":"web:read","op":"web.extract","doc":"Extract structured data from a page."}, "images.generate": {"kind":"op","permission":"image:write","op":"image.generate","doc":"Generate an image from a prompt."}, "images.edit": {"kind":"op","permission":"image:write","op":"image.edit","doc":"Edit an image with a prompt."}, "agentConfig.show": {"kind":"api","permission":"agent-config:read","doc":"Read one config section: \"identity\" | \"organisation\" | \"user\" | \"tools\" | \"mem\" | \"bootstrap\"."}, "agentConfig.edit": {"kind":"api","permission":"agent-config:write","doc":"Replace one config section's markdown."}, "files.read": {"kind":"op","permission":"files:read","op":"files.content","doc":"Read a workspace file (text inline; binary → `downloadable: true`)."}, "files.list": {"kind":"op","permission":"files:read","op":"files.list","doc":"List a directory (default /)."}, "files.write": {"kind":"op","permission":"files:write","op":"files.write","doc":"Write a UTF-8 text file (creates parents)."}, "files.delete": {"kind":"op","permission":"files:write","op":"files.delete","doc":"Delete a file or directory."}, "files.mkdir": {"kind":"op","permission":"files:write","op":"files.mkdir","doc":"Create a directory (and parents)."}, "files.move": {"kind":"op","permission":"files:write","op":"files.move","doc":"Move / rename a file or directory."}, "files.download": {"kind":"op","permission":"files:read","op":"files.downloadUrl","doc":"Short-lived signed URL for a file's bytes."}, "chat.createSession": {"kind":"host","permission":"ai:chat","doc":"Create an empty chat thread; returns its id."}, "chat.send": {"kind":"host","permission":"ai:chat","doc":"Send a message to a thread. With `onEvent`, text-delta chunks stream in; resolves with the full reply."}, "chat.getHistory": {"kind":"op","permission":"ai:chat","op":"chat.read","doc":"Messages in a thread (via chat.read)."}, "chat.getSessions": {"kind":"op","permission":"ai:chat","op":"chat.list","doc":"Recent threads."}, "chat.abort": {"kind":"host","permission":"ai:chat","doc":"Stop the active run on a thread."}, "chat.isActive": {"kind":"host","permission":"ai:chat","doc":"Whether the thread has a running turn."}, "chat.list": {"kind":"op","permission":"ai:chat","op":"chat.list","doc":"Recent threads (alias of getSessions)."}, "chat.search": {"kind":"op","permission":"ai:chat","op":"chat.search","doc":"Full-text search across past messages."}, "chat.rename": {"kind":"op","permission":"ai:chat","op":"chat.rename","doc":"Rename a thread."}, "chat.delete": {"kind":"op","permission":"ai:chat","op":"chat.delete","doc":"Delete one or more threads."}, "agent.send": {"kind":"host","permission":"agent:invoke","doc":"Start a new agent turn in a fresh thread. Resolves once the run is accepted."}, "tool.register": {"kind":"host","permission":"agent:invoke","doc":"Expose a function the workspace agent can call while this app is open."}, "ui.toast": {"kind":"host","permission":"ui","doc":"Show a toast."}, "ui.navigate": {"kind":"host","permission":"ui","doc":"Navigate the workspace to a path (e.g. /objects/company)."}, "ui.openEntry": {"kind":"host","permission":"ui","doc":"Open a CRM record in the workspace."}, "ui.setTitle": {"kind":"host","permission":"ui","doc":"Set the app tab title."}, "ui.confirm": {"kind":"host","permission":"ui","doc":"Native confirm dialog."}, "ui.prompt": {"kind":"host","permission":"ui","doc":"Native prompt dialog."}, "store.get": {"kind":"host","permission":"store:read","doc":"Read a per-app value."}, "store.set": {"kind":"host","permission":"store:write","doc":"Write a per-app value (JSON)."}, "store.delete": {"kind":"host","permission":"store:write","doc":"Delete a key."}, "store.list": {"kind":"host","permission":"store:read","doc":"All keys for this app."}, "store.clear": {"kind":"host","permission":"store:write","doc":"Delete every key."}, "http.fetch": {"kind":"host","permission":"http:external","doc":"Fetch an external URL through the SSRF-guarded proxy."}, "events.on": {"kind":"host","permission":null,"doc":"Subscribe to a channel (\"object.entry.created\" | \"object.entry.updated\" | \"object.entry.deleted\" | \"theme.changed\")."}, "events.off": {"kind":"host","permission":null,"doc":"Unsubscribe."}, "bus.send": {"kind":"host","permission":"apps:message","doc":"Send a message to another open app."}, "bus.on": {"kind":"host","permission":"apps:message","doc":"Receive messages from other apps."}, "bus.list": {"kind":"host","permission":"apps:message","doc":"Other apps currently open."}, "apps.list": {"kind":"op","permission":"apps:read","op":"apps.list","doc":"Installed apps in this workspace."}, "apps.gallery": {"kind":"op","permission":"apps:read","op":"apps.gallery","doc":"Discover listings (Official + Community)."}, "apps.create": {"kind":"op","permission":"apps:write","op":"apps.create","doc":"Scaffold and register a new app."}, "apps.install": {"kind":"op","permission":"apps:write","op":"apps.install","doc":"Install a listing."}, "apps.publish": {"kind":"op","permission":"apps:write","op":"apps.publish","doc":"Publish an app folder as a listing version."}, "apps.uninstall": {"kind":"op","permission":"apps:write","op":"apps.uninstall","doc":"Uninstall an app."}, "apps.enable": {"kind":"op","permission":"apps:write","op":"apps.setEnabled","doc":"Enable an installed app."}, "apps.disable": {"kind":"op","permission":"apps:write","op":"apps.setEnabled","doc":"Disable an installed app."}, "apps.pin": {"kind":"op","permission":"apps:write","op":"apps.setPinned","doc":"Pin an app in the rail."}, "apps.unpin": {"kind":"op","permission":"apps:write","op":"apps.setPinned","doc":"Unpin an app."}, "apps.send": {"kind":"host","permission":"apps:message","deprecated":"Use dench.bus.send.","doc":"Deprecated alias of bus.send."}, "apps.on": {"kind":"host","permission":"apps:message","deprecated":"Use dench.bus.on.","doc":"Deprecated alias of bus.on."}, "cron.schedule": {"kind":"host","permission":"cron:schedule","doc":"Create a scheduled agent (automation)."}, "cron.list": {"kind":"host","permission":"cron:schedule","doc":"Automations in the workspace."}, "cron.update": {"kind":"host","permission":"cron:schedule","doc":"Update an automation."}, "cron.run": {"kind":"host","permission":"cron:schedule","doc":"Run an automation now."}, "cron.cancel": {"kind":"host","permission":"cron:schedule","doc":"Delete an automation."}, "webhooks.register": {"kind":"host","permission":"webhooks:receive","doc":"Register an inbound webhook for this app. Returns the URL and signing secret ONCE — store the secret with the sender."}, "webhooks.on": {"kind":"host","permission":"webhooks:receive","doc":"Receive events for a hook while the app is open (polls every 5s)."}, "webhooks.poll": {"kind":"host","permission":"webhooks:receive","doc":"Events received since a timestamp."}, "webhooks.list": {"kind":"host","permission":"webhooks:receive","doc":"This app's registered hooks (URLs, never secrets)."}, "webhooks.delete": {"kind":"host","permission":"webhooks:receive","doc":"Remove a hook and its stored events."}, "clipboard.read": {"kind":"host","permission":"clipboard:read","doc":"Read clipboard text."}, "clipboard.write": {"kind":"host","permission":"clipboard:write","doc":"Write clipboard text."}, "integrations.list": {"kind":"host","permission":"integrations:read","doc":"Connected accounts (toolkit, status, connectedAccountId)."}, "integrations.search": {"kind":"host","permission":"integrations:read","doc":"Find tools by natural-language query and/or toolkit."}, "integrations.execute": {"kind":"host","permission":"integrations:read","doc":"Run a tool. Write-classified tools additionally need integrations:write."}, "geo.resolveLocation": {"kind":"host","permission":null,"doc":"Free text → country (ISO2 + ISO numeric). Same rules as the analytics map."}, "geo.resolveRegion": {"kind":"host","permission":null,"doc":"Free text → admin-1 region (state/province) within a country. Loads that country's file on first use."}, "geo.loadAdmin1": {"kind":"host","permission":null,"doc":"First-level divisions of a country as GeoJSON features (what the map draws)."}, "db.query": {"kind":"host","permission":"crm:read","deprecated":"Removed: use objects.query or analytics.compute.","doc":"Removed. DuckDB SQL is gone — use objects.query / analytics.compute."}, "db.execute": {"kind":"host","permission":"crm:write","deprecated":"Removed: use objects.create / update / delete.","doc":"Removed. Use objects.create / update / delete."}, }; const operationsById = new Map(APP_SDK_OPERATIONS.map((o) => [o.id, o] as const)); export function appSdkOperation(id: string): AppSdkOperationInfo | undefined { return operationsById.get(id); }