// AUTO-GENERATED by scripts/generate-app-sdk.ts — do NOT edit by hand. // Types for the `window.dench` App SDK injected into every Dench App iframe. // // /// // /** @type {import("@dench.com/cli/app-sdk").Dench} */ // const dench = window.dench; // // There is NO runtime package: the SDK is already on window.dench. /* eslint-disable */ // ── Operation request/response types (from cli/lib/api-schemas.ts) ────── export interface ApiRequests { /** List workspace-shared reusable setups and ready revisions (metadata only). — `dench env list` — GET /api/v1/environments */ "environments.list": { limit?: number; cursor?: string; }; /** Inspect a saved setup, its manifest, and an optional immutable revision. — `dench env show` — GET /api/v1/environments/{name} */ "environments.get": { name: string; revision?: string; }; /** Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving. — `dench env save` — POST /api/v1/environments/uploads */ "environments.upload": { kind: "source"; size: number; sha256: string; }; /** Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task. — `dench env save` — POST /api/v1/environments/{name} */ "environments.save": { name: string; manifest: { version: 1; name: string; purpose: string; files: string[]; prepare: string[]; verify: string[]; env?: Record; secretEnv?: Record; secretFiles?: { path: string; secret: string; mutable?: boolean; }[]; statePaths?: string[]; portable?: boolean; }; uploadId: string; storageId: string; sha256: string; }; /** Retire a saved setup from new selection; retain immutable revisions and active job evidence. — `dench env delete` — DELETE /api/v1/environments/{name} */ "environments.delete": { name: string; }; /** List workspace-shared credential names, kinds and versions; never values. — `dench secrets list` — GET /api/v1/secrets */ "secrets.list": { limit?: number; cursor?: string; }; /** Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts. — `dench secrets set` — PUT /api/v1/secrets/{name} */ "secrets.set": { name: string; kind: "env" | "file"; value: string; expectedVersion?: number; }; /** Revoke a workspace credential for future resolution, optionally checking its version. — `dench secrets delete` — DELETE /api/v1/secrets/{name} */ "secrets.delete": { name: string; expectedVersion?: number; }; /** Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send. — `dench campaign draft` — POST /api/v1/campaigns/drafts */ "campaigns.drafts.create": { /** Your stable id for this request, 8-64 characters. Retrying with the same id returns the same draft instead of creating another. */ clientRequestId: string; name?: string; /** IANA timezone, e.g. America/Los_Angeles. Sets a Mon-Fri 9-18 send window in it; without one the draft has no send window. */ timezone?: string; /** Mailboxes to send from instead of your own running ones. Checked as the draft is created: one you can't use creates nothing. */ emailMailboxAccountIds?: string[]; /** LinkedIn accounts to send from instead of your own running ones. Checked as the draft is created. */ linkedinAccountIds?: string[]; }; /** Search people by filters without adding CRM records or campaign recipients. Search credits apply; this is not a free provider preview. — `dench campaign search` — POST /api/v1/campaigns/audience/search */ "campaigns.audience.search": { sequenceId?: string; filters: { linkedinUrl?: string; fullName?: string; firstName?: string; lastName?: string; /** Current-title text only. For profile or work descriptions, use profileKeywords. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ keywords?: string; companyDomain?: string; companyName?: string; /** Current job titles (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ titles?: Array; /** Past job titles (free text). */ pastTitles?: Array; personNames?: Array; /** Seniority in any past role, independent of pastCompanyNames/pastTitles. Current seniority vocabulary plus Founding Team. Founder includes Co-Founder; C-level and Founding Team do not imply founder. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ pastSeniorities?: Array; /** Text in headline/about or any current/past work description. OR includes, global exclusions. Always loose text matching; missing evidence does not match. */ profileKeywords?: Array; /** Current employer business focus/model (e.g. SaaS, B2B, Cloud), from description/tagline/business tags; distinct from legal companyTypes. Same employer as other current-job filters. Always loose text matching. May need another filter to retrieve candidates. */ companyKeywords?: Array; /** Exact enum: Owner, Founder, C-level, Partner, VP, Head, Director, Manager, Senior. */ seniorities?: Array; /** Exact enum, e.g. Sales, Marketing, Software. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ jobFunctions?: Array; /** Exact enum, e.g. SDR/BDR, Demand Generation. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ subFunctions?: Array; /** Exact enum, e.g. Software Development. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ industries?: Array; /** Person locations — cities, states, countries, or metros (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ locations?: Array; /** Exact buckets: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. */ headcountRanges?: Array; companyNames?: Array; pastCompanyNames?: Array; companyDomains?: Array; /** Company HQ locations — cities, states, countries, or metros (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ companyHeadquarters?: Array; /** Exact enum: Partnership, Nonprofit, Educational, Privately Held, Public Company, Self-Owned, Self-Employed, Government Agency. */ companyTypes?: Array; /** Universities attended (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ universities?: Array; /** Profile skills (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ skills?: Array; /** Spoken languages, e.g. English, German. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ languages?: Array; yearsInRole?: { min?: number; max?: number; }; yearsAtCompany?: { min?: number; max?: number; }; daysSinceJobChange?: { min?: number; max?: number; }; /** Company founded-year range, e.g. {min: 2015, max: 2024}. */ foundedYears?: { min?: number; max?: number; }; /** Match free-text filters as whole strings. Default false: titles ['Founder'] also returns 'Co-Founder' and 'Founder & CEO'. Set true to narrow. Domains, LinkedIn URLs, enum filters and numeric ranges are always exact; keywords is always a loose text probe. */ exactMatch?: boolean; preferCache?: boolean; }; limit?: number; pageToken?: string; }; /** Search and add up to 50 people to an existing campaign. New identities become Leads. Search credits apply; use nextPageToken for another page. — `dench campaign add --search` — POST /api/v1/campaigns/{sequenceId}/people/search */ "campaigns.people.addFromSearch": { sequenceId: string; filters: { linkedinUrl?: string; fullName?: string; firstName?: string; lastName?: string; /** Current-title text only. For profile or work descriptions, use profileKeywords. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ keywords?: string; companyDomain?: string; companyName?: string; /** Current job titles (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ titles?: Array; /** Past job titles (free text). */ pastTitles?: Array; personNames?: Array; /** Seniority in any past role, independent of pastCompanyNames/pastTitles. Current seniority vocabulary plus Founding Team. Founder includes Co-Founder; C-level and Founding Team do not imply founder. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ pastSeniorities?: Array; /** Text in headline/about or any current/past work description. OR includes, global exclusions. Always loose text matching; missing evidence does not match. */ profileKeywords?: Array; /** Current employer business focus/model (e.g. SaaS, B2B, Cloud), from description/tagline/business tags; distinct from legal companyTypes. Same employer as other current-job filters. Always loose text matching. May need another filter to retrieve candidates. */ companyKeywords?: Array; /** Exact enum: Owner, Founder, C-level, Partner, VP, Head, Director, Manager, Senior. */ seniorities?: Array; /** Exact enum, e.g. Sales, Marketing, Software. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ jobFunctions?: Array; /** Exact enum, e.g. SDR/BDR, Demand Generation. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ subFunctions?: Array; /** Exact enum, e.g. Software Development. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ industries?: Array; /** Person locations — cities, states, countries, or metros (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ locations?: Array; /** Exact buckets: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. */ headcountRanges?: Array; companyNames?: Array; pastCompanyNames?: Array; companyDomains?: Array; /** Company HQ locations — cities, states, countries, or metros (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ companyHeadquarters?: Array; /** Exact enum: Partnership, Nonprofit, Educational, Privately Held, Public Company, Self-Owned, Self-Employed, Government Agency. */ companyTypes?: Array; /** Universities attended (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ universities?: Array; /** Profile skills (free text). Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ skills?: Array; /** Spoken languages, e.g. English, German. Accepted values: see `dench leads filters` or https://dench.com/references/find-filter-options.json. */ languages?: Array; yearsInRole?: { min?: number; max?: number; }; yearsAtCompany?: { min?: number; max?: number; }; daysSinceJobChange?: { min?: number; max?: number; }; /** Company founded-year range, e.g. {min: 2015, max: 2024}. */ foundedYears?: { min?: number; max?: number; }; /** Match free-text filters as whole strings. Default false: titles ['Founder'] also returns 'Co-Founder' and 'Founder & CEO'. Set true to narrow. Domains, LinkedIn URLs, enum filters and numeric ranges are always exact; keywords is always a loose text probe. */ exactMatch?: boolean; preferCache?: boolean; }; limit?: number; pageToken?: string; checkDuplicatesAcrossWorkspace?: boolean; }; /** Add up to 50 selected recipients without another search. Deduplicates, applies suppression, and preserves the campaign's launch state. — `dench campaign add --people-file` — POST /api/v1/campaigns/{sequenceId}/people/batch */ "campaigns.people.addBatch": { sequenceId: string; recipients: { email?: string; linkedinProfileUrl?: string; displayName?: string; /** Merge values keyed by name, e.g. {"Company":"Acme"} for {{Company}}. */ personalization?: Record; }[]; newRecordsObject?: "lead" | "people"; checkDuplicatesAcrossWorkspace?: boolean; }; /** Read a campaign's saved signal source, targeting and schedule. — `dench campaign sources get` — GET /api/v1/campaigns/{sequenceId}/sources */ "campaigns.sources.get": { sequenceId: string; }; /** Read signal choices, suggested terms and current source configuration. — `dench campaign sources signals` — GET /api/v1/campaigns/{sequenceId}/sources/signals */ "campaigns.sources.signals": { sequenceId: string; }; /** Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work. — `dench campaign sources set` — PATCH /api/v1/campaigns/{sequenceId}/sources */ "campaigns.sources.update": { sequenceId: string; status?: "active" | "paused"; cadence?: "daily" | "weekly" | "monthly"; findMoreMatching?: boolean; /** auto: new people a signal finds start the sequence on their own. manual: they wait for approval. */ approvalMode?: "auto" | "manual"; targeting?: { titles: string[]; locations: string[]; companySizes: string[]; industries: string[]; excludes: string[]; companies?: string[]; companyTypes?: string[]; }; signal?: { signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike"; enabled: boolean; }; terms?: { signal: "post_engagement" | "keyword" | "hiring" | "voice_engagement" | "company_engagement" | "brand_engagement"; values: string[]; }; }; /** Preview a signal source using its current audience. Provider credits may apply; does not enroll people. — `dench campaign sources preview` — POST /api/v1/campaigns/{sequenceId}/sources/preview */ "campaigns.sources.preview": { sequenceId: string; signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike"; terms?: string[]; }; /** Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour. — `dench campaign sources run` — POST /api/v1/campaigns/{sequenceId}/sources/run */ "campaigns.sources.run": { sequenceId: string; }; /** Read the Sources tab: each signal's status, last and next run, people found and anything needing attention. — `dench campaign sources overview` — GET /api/v1/campaigns/{sequenceId}/sources/overview */ "campaigns.sources.overview": { sequenceId: string; }; /** List people a signal found who are waiting for approval (manual approval mode). — `dench campaign sources pending` — GET /api/v1/campaigns/{sequenceId}/sources/pending */ "campaigns.sources.pending": { sequenceId: string; }; /** Approve people waiting for review (they start the sequence) or reject them. — `dench campaign sources approve|reject` — POST /api/v1/campaigns/{sequenceId}/sources/review */ "campaigns.sources.review": { sequenceId: string; enrollmentIds: string[]; decision: "approve" | "reject"; }; /** Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits. — `dench campaign queue` — GET /api/v1/campaigns/{sequenceId}/queue */ "campaigns.queue": { sequenceId: string; }; /** Read the company profile and suggested campaign audience. — `dench campaign builder profile` — GET /api/v1/campaigns/builder/profile */ "campaigns.builder.profile": Record; /** Save a signal campaign's audience, signals and terms idempotently. Does not start a build. — `dench campaign builder save` — POST /api/v1/campaigns/builder/drafts */ "campaigns.builder.save": { /** Your stable id for this request, 8-64 characters. Retrying with the same id returns the same draft instead of creating another. */ clientRequestId: string; targeting: { titles: string[]; locations: string[]; companySizes: string[]; industries: string[]; excludes: string[]; companies?: string[]; companyTypes?: string[]; }; signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">; signalTerms?: { /** Post topics, phrased as what the buyer does ("using AI for outbound"), not bare product names. */ post_engagement?: string[]; keyword?: string[]; /** Roles being hired for. */ hiring?: string[]; /** LinkedIn profile URLs of market voices whose posts to watch. */ voice_engagement?: string[]; /** LinkedIn company page URLs of companies and competitors. */ company_engagement?: string[]; /** The sender's own LinkedIn company page URL. */ brand_engagement?: string[]; /** Topic signals searched by their exact keywords only (no drafted phrases). */ exact?: Array<"post_engagement" | "keyword">; }; /** Also add people who match the audience without a signal. */ findMoreMatching?: boolean; name?: string; /** How people come in: buying signals, people like one best lead, a pasted list or CSV, CRM records, or a people search. */ source?: "signals" | "lookalike" | "existing" | "crm" | "search"; screen?: "source" | "signals" | "lookalike" | "target" | "messages" | "outreach" | "review"; /** For source lookalike: the edited result of builder lookalike, with signals ["lookalike"]. */ lookalike?: { seed: { name: string; linkedinUrl: string; title?: string; companyName?: string; companyDomain?: string; avatarUrl?: string; }; title: string; similarRoles: boolean; roles: string[]; location?: string; industry?: string; relatedIndustries: boolean; industries: string[]; companySizes: string[]; companies: { name: string; domain: string; }[]; }; }; /** Read signal build progress, preview people, messages and errors. — `dench campaign builder get` — GET /api/v1/campaigns/builder/drafts/{draftId} */ "campaigns.builder.get": { draftId: string; }; /** Start the same billable signal/audience/message build used by the UI; poll the draft for progress. — `dench campaign builder build` — POST /api/v1/campaigns/builder/drafts/{draftId}/build */ "campaigns.builder.build": { draftId: string; }; /** Create a campaign from a reviewed signal draft. Does not launch the campaign. — `dench campaign builder create` — POST /api/v1/campaigns/builder/drafts/{draftId}/create */ "campaigns.builder.create": { draftId: string; name?: string; timezone?: string; /** Save paused: signals wait to run until launch. */ paused?: boolean; }; /** Edit or reset one preview person's opening line before creating the campaign. — `dench campaign builder opener` — PUT /api/v1/campaigns/builder/drafts/{draftId}/people/{leadId}/opener */ "campaigns.builder.opener": { draftId: string; leadId: string; opener: string; }; /** List saved, unfinished campaign drafts that can be resumed. — `dench campaign builder drafts` — GET /api/v1/campaigns/builder/drafts */ "campaigns.builder.drafts": Record; /** Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it. — `dench campaign builder resume` — GET /api/v1/campaigns/builder/drafts/{draftId}/setup */ "campaigns.builder.resume": { draftId: string; }; /** Discard a saved draft that has not become a campaign. — `dench campaign builder discard` — DELETE /api/v1/campaigns/builder/drafts/{draftId} */ "campaigns.builder.discard": { draftId: string; }; /** 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. — `dench campaign builder outreach` — PATCH /api/v1/campaigns/builder/drafts/{draftId}/outreach */ "campaigns.builder.outreach": { draftId: string; /** ai: generate the sequence from the brief. manual: write steps. */ outreachMode?: "ai" | "manual"; brief?: { /** What a reply should lead to, e.g. a demo. */ goal: string; /** The problem the product solves for them. */ helpWith: string; tone: "conversational" | "warm" | "direct" | "formal"; channels: "both" | "email" | "linkedin"; }; steps?: Array<{ type: "email" | "wait" | "linkedin_connection" | "linkedin_message"; /** Hours to wait, 1 to 1440. Required on a wait step. */ waitHours?: number; emailSubject?: string; /** Plain text only; draft steps keep no HTML body. */ emailTextBody?: string; emailReplyToPrevious?: boolean; onlyIf?: "always" | "connected" | "not_connected"; linkedinMessageBody?: string; linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected"; connectionTimeoutHours?: number; }>; sending?: { emailMailboxAccountIds: string[]; linkedinAccountIds: string[]; timezone: string; startHour: number; endHour: number; /** 0 is Sunday, 6 is Saturday. */ weekdays: number[]; dailySendCap?: number; }; /** auto: new people a signal finds start the sequence on their own. manual: they wait for approval. */ approvalMode?: "auto" | "manual"; }; /** Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply. — `dench campaign builder sequence` — POST /api/v1/campaigns/builder/drafts/{draftId}/sequence */ "campaigns.builder.sequence": { draftId: string; brief: { /** What a reply should lead to, e.g. a demo. */ goal: string; /** The problem the product solves for them. */ helpWith: string; tone: "conversational" | "warm" | "direct" | "formal"; channels: "both" | "email" | "linkedin"; }; }; /** 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. — `dench campaign builder lookalike` — POST /api/v1/campaigns/builder/lookalike */ "campaigns.builder.lookalike": { /** The best lead's LinkedIn profile URL. */ linkedinUrl?: string; /** Suggest similar roles and related industries again. */ suggest?: { title: string; industry?: string; }; /** Re-scope the lookalike to a different company. */ rescope?: { seed: { name: string; linkedinUrl: string; title?: string; companyName?: string; companyDomain?: string; avatarUrl?: string; }; company: string; title?: string; location?: string; }; }; /** Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply. — `dench campaign builder voices` — POST /api/v1/campaigns/builder/voices */ "campaigns.builder.voices": { topics?: string[]; market?: string; }; /** Turn an audience description into targeting filters. AI credits apply. — `dench campaign builder autofill` — POST /api/v1/campaigns/builder/autofill */ "campaigns.builder.autofill": { description: string; }; /** Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply. — `dench campaign builder estimate` — POST /api/v1/campaigns/builder/estimate */ "campaigns.builder.estimate": { kind: "people" | "week"; targeting: { titles: string[]; locations: string[]; companySizes: string[]; industries: string[]; excludes: string[]; companies?: string[]; companyTypes?: string[]; }; signals?: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">; signalTerms?: { /** Post topics, phrased as what the buyer does ("using AI for outbound"), not bare product names. */ post_engagement?: string[]; keyword?: string[]; /** Roles being hired for. */ hiring?: string[]; /** LinkedIn profile URLs of market voices whose posts to watch. */ voice_engagement?: string[]; /** LinkedIn company page URLs of companies and competitors. */ company_engagement?: string[]; /** The sender's own LinkedIn company page URL. */ brand_engagement?: string[]; /** Topic signals searched by their exact keywords only (no drafted phrases). */ exact?: Array<"post_engagement" | "keyword">; }; }; /** List all CLI/API operations and parity classifications. — `dench help` — GET /api/v1/commands */ "commands.list": Record; /** Create an agent sign-in request. — `dench signin` — POST /api/v1/auth/signin-requests */ "auth.signin.create": { codeHash: string; sessionTokenHash: string; agentName: string; /** Agent kind, normalized to snake_case. */ agentKind: string; /** Whether to join an existing workspace or create a new one. */ intent: "join_existing" | "create_workspace"; /** Required when intent is create_workspace. */ proposedOrganizationName?: string; requestedOrganizationSelector?: string; userAgent?: string; }; /** Poll an agent sign-in request until approval. — `dench signin` — POST /api/v1/auth/signin-requests/{requestId}/poll */ "auth.signin.poll": { codeHash: string; sessionTokenHash: string; }; /** Start the email OTP sign-in flow. — `dench signin --email` — POST /api/v1/auth/otp/start */ "auth.otp.start": { /** Email to send the code to. */ email: string; }; /** Verify an email OTP sign-in code. — `dench signin --email` — POST /api/v1/auth/otp/verify */ "auth.otp.verify": { email: string; /** 6+ digit code from the email. */ code: string; agentName: string; agentKind: string; /** sha256 hex of the local session token. */ sessionTokenHash: string; /** Whether to join an existing workspace or create a new one. */ intent: "join_existing" | "create_workspace"; proposedOrganizationName?: string; organizationSelector?: string; userAgent?: string; }; /** Finalize an email OTP sign-in session. — `dench signin --email` — POST /api/v1/auth/otp/finalize */ "auth.otp.finalize": { authToken: string; /** Provide this OR newOrganizationName. */ organizationId?: string; newOrganizationName?: string; }; /** Read selected scoped workspace documents and a compact context index without writes. — `dench context --sections` — GET /api/v1/context/sections */ "workspace.context.sections": { organizationId?: string; sections?: Array<"identity" | "organisation" | "user" | "memory" | "rules" | "tools">; }; /** Return the current Dench workspace context for the bearer. — `dench context` — GET /api/v1/context */ "workspace.context": Record; /** Return the current workspace's standing instructions for external agents. — `dench context --instructions` — GET /api/v1/context/instructions */ "workspace.instructions": { organizationId?: string; }; /** Return workspace and agent status. — `dench status` — GET /api/v1/status */ "workspace.status": Record; /** List agents visible in the workspace status payload. — `dench agents` — GET /api/v1/agents */ "workspace.agents": Record; /** List approval requests visible in the workspace status payload. — `dench approvals` — GET /api/v1/approvals */ "workspace.approvals.list": Record; /** List artifacts for the authenticated workspace. — `dench artifacts` — GET /api/v1/artifacts */ "workspace.artifacts.list": { limit?: number; }; /** List draft suggested-work artifacts. — `dench suggested-work` — GET /api/v1/suggested-work */ "workspace.suggestedWork.list": { limit?: number; }; /** List saved searches (find-result lists) in the workspace, newest first. — `dench lists` — GET /api/v1/lists */ "lists.list": { search?: string; cursor?: string; limit?: number; }; /** Read saved rows with current enrichment results and original indices; cursor-paged, without repeating a search. — `dench lists rows` — GET /api/v1/lists/{artifactId}/rows */ "lists.rows": { artifactId: string; cursor?: string; limit?: number; enrichment?: "all" | "enriched" | "in_progress" | "no_contacts" | "failed" | "not_enriched"; }; /** 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. — `dench lists enrich` — POST /api/v1/lists/{artifactId}/enrich */ "lists.enrich": { artifactId: string; rows: Record[]; /** email is work email. */ fields: Array<"email" | "phone" | "personal_email">; }; /** Explicitly import selected saved profiles, optionally filtered by enrichment, with a configured Lead status. Reuses CRM records; never sends outreach or triggers conversion. — `dench artifacts import` — POST /api/v1/lists/{artifactId}/import */ "lists.import": { artifactId: string; to: "lead" | "company" | "job_posting"; rowIndexes?: number[]; status?: string; enrichment?: "all" | "enriched" | "in_progress" | "no_contacts" | "failed" | "not_enriched"; viewName?: string; pin?: boolean; }; /** Get one saved search / list by artifact id. — `dench lists show` — GET /api/v1/lists/{artifactId} */ "lists.get": Record; /** Save find results as a named list (rows + filters become a workspace artifact). — `dench lists save` — POST /api/v1/lists */ "lists.save": { /** Use find_people, find_companies or find_jobs for a prospect list. */ createdFrom: "find_people" | "find_companies" | "find_jobs" | "mixed" | "watch_fire" | "generate_image"; /** Name of the new list. */ title: string; /** True makes the list visible in Find. Omitted saves an unlisted draft that can still be read or added to a campaign by id. */ saved?: boolean; /** Original search filters to retain with the list. Saving does not run a search. */ filters?: unknown; /** Complete person records from a search, including existing contact details and custom fields. */ people?: Record[]; /** Complete company records from a search. */ companies?: Record[]; /** Complete job records from a search. */ jobs?: Record[]; }; /** Update a saved list in place (title, filters, and/or replacement rows). — `dench lists update` — PATCH /api/v1/lists/{artifactId} */ "lists.update": { /** The existing list id. */ artifactId: string; title?: string; /** Replacement filter metadata; does not run a new search. */ filters?: unknown; /** Replacement people. Omit to preserve existing rows; an empty array clears them. */ people?: Record[]; /** Replacement companies. Omit to preserve existing rows. */ companies?: Record[]; /** Replacement jobs. Omit to preserve existing rows. */ jobs?: Record[]; }; /** Rename a saved search / list. — `dench lists rename` — POST /api/v1/lists/{artifactId}/rename */ "lists.rename": Record; /** Delete a saved search / list, its exported CSV/JSONL files, and any linked watch. — `dench lists delete` — DELETE /api/v1/lists/{artifactId} */ "lists.delete": Record; /** Read durable enrichment activity (legacy review metadata remains readable). Use lists rows for current saved profiles and contacts. — `dench lists reviews` — GET /api/v1/lists/{artifactId}/reviews */ "lists.prospects.reviews": { artifactId: string; limit?: number; cursor?: string; }; /** Suggest ICP fit for one profile. Never changes a human review decision. — `dench lists assess` — POST /api/v1/lists/{artifactId}/assess */ "lists.prospects.assess": { artifactId: string; row: Record; suggestion: { fit: "likely_fit" | "unlikely_fit" | "unknown"; /** AI relevance to the saved ICP, not conversion probability. */ score?: number; reason: string; }; }; /** Search durable workspace memory. — `dench memory search` — GET /api/v1/memory/search */ "memory.search": { /** Full-text query. */ query: string; limit?: number; }; /** Save a durable workspace memory fact. — `dench memory save` — POST /api/v1/memory */ "memory.save": { /** Stable memory key. */ key: string; /** Memory classification. */ kind: "fact" | "decision" | "preference" | "goal" | "tool_note" | "other" | "convention" | "project_context" | "agent_lesson" | "docs_knowledge" | "open_goal"; /** Memory body. No secrets or scratch notes. */ text: string; tags?: string[]; /** Sensitivity tier; `sensitive` memories land in needs-review. */ sensitivity?: "normal" | "broad" | "sensitive"; /** Who can see the memory. Defaults to `user`. */ visibility?: "user" | "org"; projectId?: string; sourceQuote?: string; confidence?: number; importance?: number; }; /** Request human approval. — `dench approval request` — POST /api/v1/approvals */ "approval.request": { /** What needs human approval. */ title: string; reason?: string; /** Risk level. */ risk: "low" | "medium" | "high"; }; /** Record an approval decision. — `dench approval approve|reject` — POST /api/v1/approvals/{approvalId}/decision */ "approval.decide": { approvalId: string; /** Human decision for an approval request. */ decision: "approved" | "rejected"; /** Required when the requesting agent records its own decision. */ evidence?: string; }; /** Get billing and AI credit status. — `dench billing status` — GET /api/v1/billing/status */ "billing.status": Record; /** Create an AI credit top-up checkout link. — `dench billing topup` — POST /api/v1/billing/topup */ "billing.topup": { /** Idempotency key (1-200 of [A-Za-z0-9:_-]). */ requestId: string; /** USD amount, $5 to $1000. */ amountUsd: number; }; /** Create a workspace upgrade checkout link. — `dench upgrade` — POST /api/v1/billing/upgrade */ "billing.upgrade": { tier?: "pro" | "max" | "cloud" | "desktop" | "api"; billingCycle?: "monthly" | "yearly"; requestId?: string; /** Internal return path beginning with /. */ returnPath?: string; }; /** List past chat threads. — `dench chat list` — GET /api/v1/chat/threads */ "chat.list": { titleQuery?: string; limit?: number; includeArchived?: boolean; includeAutomated?: boolean; }; /** Search past chat messages. — `dench chat search` — GET /api/v1/chat/search */ "chat.search": { /** Full-text query across past messages. */ query: string; limit?: number; excludeThreadId?: string; includeAutomated?: boolean; }; /** Read a past chat thread. — `dench chat read` — GET /api/v1/chat/threads/{threadId} */ "chat.read": { threadId: string; limit?: number; /** Message text as a person sees it: text parts only, without reasoning or tool calls. */ visibleTextOnly?: boolean; }; /** Read the parent-child chat thread hierarchy. — `dench chat tree` — GET /api/v1/chat/tree */ "chat.tree": { /** Filter threads by title. */ titleQuery?: string; limit?: number; includeArchived?: boolean; /** Include routine-spawned threads. Defaults false. */ includeAutomated?: boolean; }; /** Rename one or more chat threads. — `dench chat rename` — PATCH /api/v1/chat/threads */ "chat.rename": { items: { threadId: string; title: string; }[]; }; /** Delete one or more chat threads. — `dench chat delete` — DELETE /api/v1/chat/threads */ "chat.delete": { threadIds: string[]; includeAutomated?: boolean; }; /** Start a new chat-turn workflow. — `dench chat new` — POST /api/v1/chat/threads */ "chat.new": { environment?: string; /** The user message that starts the turn. */ prompt: string; model?: string; fileContextPath?: string; visibility?: "private" | "shared"; /** Bypass approval gates for this turn. */ yolo?: boolean; title?: string; }; /** Send a message to an existing chat thread. — `dench chat send` — POST /api/v1/chat/threads/{threadId}/messages */ "chat.send": { threadId: string; /** The message to append. */ prompt: string; model?: string; yolo?: boolean; }; /** Follow a live chat response stream. — `dench chat follow` — GET /api/v1/chat/threads/{threadId}/stream */ "chat.follow": { threadId: string; }; /** List CRM objects. — `dench crm objects list [--with-references]` — GET /api/v1/crm/objects */ "crm.objects.list": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; }; /** List names, display labels, visibility and workspace counts without internal state. — `dench crm objects list --compact` — GET /api/v1/crm/catalog/objects */ "crm.objects.listCompact": Record; /** Get a CRM object. — `dench crm objects get` — GET /api/v1/crm/objects/{name} */ "crm.objects.get": { name: string; }; /** Create a CRM object. — `dench crm objects create` — POST /api/v1/crm/objects */ "crm.objects.create": { /** Object name (lowercased, singular). */ name: string; description?: string; /** Default view rendered for the object. */ defaultView?: "table" | "kanban" | "calendar" | "timeline" | "gallery" | "list"; /** Hugeicons (or legacy Lucide) icon name, e.g. user-multiple, target-01. */ icon?: string; /** Fields to add after the built-in Notes, in column order. The object and its fields are created in one transaction: if any field is rejected, nothing is created. */ fields?: Array<{ name: string; /** Defaults to text. */ type?: "text" | "email" | "phone" | "url" | "number" | "boolean" | "date" | "richtext" | "file" | "user" | "enum" | "relation" | "tags" | "action"; required?: boolean; defaultValue?: string; /** Target object for `relation` fields. */ relatedObjectName?: string; /** Relation cardinality for a `relation` field. */ relationshipType?: "many_to_one" | "many_to_many"; /** Options for `enum` fields. */ enumValues?: string[]; /** Hex colors aligned to enumValues. */ enumColors?: string[]; /** Allow multi-select enum. */ enumMultiple?: boolean; description?: string; /** Index for filter/search/sort. */ indexed?: boolean; }>; }; /** Update a CRM object. — `dench crm objects update` — PATCH /api/v1/crm/objects/{name} */ "crm.objects.update": { name: string; description?: string; /** Default view rendered for the object. */ defaultView?: "table" | "kanban" | "calendar" | "timeline" | "gallery" | "list"; icon?: string; viewSettings?: Record; savedViews?: Record[]; /** Who can see the object's records: every workspace member, only the record's owner, or the owner plus the members listed on the record. Admins only (a signed-in admin; an org-scoped key cannot change it). Records created before the switch have no owner and are hidden from everyone until one is set; switch back to workspace to see them again. */ visibility?: "workspace" | "owner_only" | "owner_plus_members"; }; /** Rename a CRM object. — `dench crm objects rename` — POST /api/v1/crm/objects/{from}/rename */ "crm.objects.rename": { /** Current object name (path). */ from: string; /** New object name. */ to: string; }; /** Delete a CRM object. — `dench crm objects delete` — DELETE /api/v1/crm/objects/{name} */ "crm.objects.delete": { name: string; }; /** Hide a CRM object's workspace sidebar row for the whole workspace. Not a delete — the table keeps working. Admin-only. — `dench crm objects archive` — POST /api/v1/crm/objects/{name}/archive */ "crm.objects.archive": { name: string; }; /** Restore a CRM object's workspace sidebar row. Admin-only. — `dench crm objects unarchive` — POST /api/v1/crm/objects/{name}/unarchive */ "crm.objects.unarchive": { name: string; }; /** List the saved views on a CRM object (plus the active view). — `dench crm views list` — GET /api/v1/crm/objects/{objectName}/views */ "crm.views.list": { objectName: string; }; /** Get one saved view's definition by name. — `dench crm views get` — GET /api/v1/crm/objects/{objectName}/views/{viewName} */ "crm.views.get": { objectName: string; viewName: string; }; /** Materialize a saved view's rows (applies its filters/sort/pins), paginated. — `dench crm views entries` — GET /api/v1/crm/objects/{objectName}/views/{viewName}/entries */ "crm.views.entries": { objectName: string; viewName: string; page?: number; pageSize?: number; /** Personal scope: "me" (the signed-in member / the human behind an agent session), "unassigned", or a member userId or email. Adds one has_any / is_empty rule on the object's assignee user field; rows, totalCount, sums and analytics all follow it. Never saved onto the view. */ assignedTo?: string; /** Which `user` field "assigned" means. Default: the analytics owner role, else the task `Assignee`, else a user field named like owner/assignee, else the first user field. */ assigneeField?: string; }; /** Create a saved view (named filters/sort/columns combo) on a CRM object. — `dench crm views create` — POST /api/v1/crm/objects/{objectName}/views */ "crm.views.create": { objectName: string; view: { /** View name (upsert key; shows in the view dropdown). */ name: string; /** Default view rendered for the object. */ view_type?: "table" | "kanban" | "calendar" | "timeline" | "gallery" | "list"; /** FilterGroup, e.g. {"id":"g1","conjunction":"and","rules":[{"id":"r1","field":"Status","operator":"is","value":"Hot"}]}. Date rules support operator "date_preset" with value "today", "yesterday", "this_week", "last_week", "this_month", "last_month", "this_quarter", "last_quarter", "this_year", or "last_year", plus "relative_past"/"relative_next" with relativeAmount + relativeUnit (days|weeks|months|quarters|years). Rules may target the system timestamps "created_at" / "updated_at", e.g. {"field":"created_at","operator":"relative_past","relativeAmount":7,"relativeUnit":"days"}. */ filters?: Record; sort?: Array<{ /** Field name to sort by. */ field: string; direction: "asc" | "desc"; }>; /** Visible-column ordering. Omit to keep the default set. */ columns?: string[]; /** View-type settings (kanbanField, calendarDateField, timelineStartField, …). */ settings?: Record; /** Pinned-list mode: show EXACTLY these entry ids (mutually exclusive with filters). */ pinnedEntryIds?: string[]; [key: string]: unknown; }; /** Overwrite an existing view with the same name. */ replaceExisting?: boolean; /** Also switch the object's active view to this one. */ setActive?: boolean; }; /** Replace a saved view's definition (upsert by name). — `dench crm views update` — PATCH /api/v1/crm/objects/{objectName}/views/{viewName} */ "crm.views.update": { objectName: string; /** Name of the view to replace (path). */ viewName: string; /** Full replacement definition; the path viewName is used as the name. */ view?: { /** View name (upsert key; shows in the view dropdown). */ name?: string; /** Default view rendered for the object. */ view_type?: "table" | "kanban" | "calendar" | "timeline" | "gallery" | "list"; /** FilterGroup, e.g. {"id":"g1","conjunction":"and","rules":[{"id":"r1","field":"Status","operator":"is","value":"Hot"}]}. Date rules support operator "date_preset" with value "today", "yesterday", "this_week", "last_week", "this_month", "last_month", "this_quarter", "last_quarter", "this_year", or "last_year", plus "relative_past"/"relative_next" with relativeAmount + relativeUnit (days|weeks|months|quarters|years). Rules may target the system timestamps "created_at" / "updated_at", e.g. {"field":"created_at","operator":"relative_past","relativeAmount":7,"relativeUnit":"days"}. */ filters?: Record; sort?: Array<{ /** Field name to sort by. */ field: string; direction: "asc" | "desc"; }>; /** Visible-column ordering. Omit to keep the default set. */ columns?: string[]; /** View-type settings (kanbanField, calendarDateField, timelineStartField, …). */ settings?: Record; /** Pinned-list mode: show EXACTLY these entry ids (mutually exclusive with filters). */ pinnedEntryIds?: string[]; [key: string]: unknown; }; setActive?: boolean; }; /** Rename a saved view in place — keeps its filters, pins, and sidebar slot. — `dench crm views rename` — POST /api/v1/crm/objects/{objectName}/views/{viewName}/rename */ "crm.views.rename": Record; /** Delete a saved view by name (idempotent). — `dench crm views delete` — DELETE /api/v1/crm/objects/{objectName}/views/{viewName} */ "crm.views.delete": { objectName: string; viewName: string; }; /** Move a pinned view's sidebar row into the Archived flyout. Admin-only. — `dench crm views archive` — POST /api/v1/crm/objects/{objectName}/views/{viewName}/archive */ "crm.views.archive": { objectName: string; viewName: string; }; /** Restore a view's sidebar row (re-asserts its pin). Admin-only. — `dench crm views unarchive` — POST /api/v1/crm/objects/{objectName}/views/{viewName}/unarchive */ "crm.views.unarchive": { objectName: string; viewName: string; }; /** 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. — `dench crm sidebar list` — GET /api/v1/crm/sidebar */ "crm.sidebar.list": Record; /** 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. — `dench crm sidebar move` — POST /api/v1/crm/sidebar/move */ "crm.sidebar.move": { /** Nav id from `sidebar list`, e.g. crm-object:task. */ navId: string; /** Where to land among the visible rows; N is 1-based. */ position: "top" | "bottom" | number; }; /** Create a named sidebar group (e.g. "Hiring") in the workspace-shared Library. Open to any member. — `dench crm sidebar group create` — POST /api/v1/crm/sidebar/groups */ "crm.sidebar.groups.create": Record; /** Rename a sidebar group. Open to any member. — `dench crm sidebar group rename` — POST /api/v1/crm/sidebar/groups/rename */ "crm.sidebar.groups.rename": Record; /** Dissolve a sidebar group; its rows return to the top level in its slot. Open to any member. — `dench crm sidebar group delete` — POST /api/v1/crm/sidebar/groups/delete */ "crm.sidebar.groups.delete": Record; /** Move a sidebar row into a group (groupId set) or back to the top level (groupId null). Open to any member. — `dench crm sidebar group add` — POST /api/v1/crm/sidebar/groups/move */ "crm.sidebar.groups.move-item": Record; /** 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. — `dench crm sidebar pin` — POST /api/v1/crm/sidebar/pins */ "crm.sidebar.pins.set": Record; /** List fields for a CRM object, including read-only calculation metadata. — `dench crm fields list` — GET /api/v1/crm/objects/{objectName}/fields */ "crm.fields.list": { objectName: string; }; /** List field names, types and effective constraints without indexing or enrichment internals. — `dench crm fields list --compact` — GET /api/v1/crm/catalog/objects/{objectName}/fields */ "crm.fields.listCompact": { objectName: string; }; /** Create a CRM field or read-only campaign activity boolean column. — `dench crm fields create` — POST /api/v1/crm/objects/{objectName}/fields */ "crm.fields.create": { objectName: string; name: string; /** Defaults to boolean with calculation, otherwise text. Calculations require boolean. */ type?: "text" | "email" | "phone" | "url" | "number" | "boolean" | "date" | "richtext" | "file" | "user" | "enum" | "relation" | "tags" | "action"; required?: boolean; defaultValue?: string; /** Target object for `relation` fields. */ relatedObjectName?: string; /** Relation cardinality for a `relation` field. */ relationshipType?: "many_to_one" | "many_to_many"; /** Options for `enum` fields. */ enumValues?: string[]; /** Hex colors aligned to enumValues. */ enumColors?: string[]; /** Allow multi-select enum. */ enumMultiple?: boolean; description?: string; /** Index for filter/search/sort. */ indexed?: boolean; /** Enrichment binding that lets the field auto-fill from a provider. */ enrichment?: { category: "people" | "company"; key: string; apolloPath: string; inputFieldName?: string; }; /** Read-only campaign activity boolean on people or lead (through Contact), not an expression. Cannot be required, indexed, enriched or have a default value. */ calculation?: { kind: "campaign_activity"; metric: "email_opened" | "email_clicked" | "replied" | "linkedin_connected"; /** Same-workspace multichannel campaign ID readable by the viewer. Omit for any accessible multichannel campaign. */ campaignId?: string; }; }; /** Update a CRM field or change/explicitly clear an existing campaign calculation. — `dench crm fields update` — PATCH /api/v1/crm/objects/{objectName}/fields/{fieldName} */ "crm.fields.update": { objectName: string; fieldName: string; /** Rename the field. */ name?: string; description?: string; required?: boolean; /** Full replacement of options. */ enumValues?: string[]; enumColors?: string[]; enumMultiple?: boolean; indexed?: boolean; /** Enrichment binding that lets the field auto-fill from a provider. */ enrichment?: { category: "people" | "company"; key: string; apolloPath: string; inputFieldName?: string; }; clearEnrichment?: boolean; /** Replace an existing calculation's metric/source. Stored fields cannot be converted; create a new column instead. */ calculation?: { kind: "campaign_activity"; metric: "email_opened" | "email_clicked" | "replied" | "linkedin_connected"; /** Same-workspace multichannel campaign ID readable by the viewer. Omit for any accessible multichannel campaign. */ campaignId?: string; }; /** Explicitly remove an existing calculation, leaving an editable boolean. Does not snapshot calculated values. Mutually exclusive with calculation. */ clearCalculation?: boolean; }; /** Delete a CRM field. — `dench crm fields delete` — DELETE /api/v1/crm/objects/{objectName}/fields/{fieldName} */ "crm.fields.delete": { objectName: string; fieldName: string; }; /** Reorder CRM fields. — `dench crm fields reorder` — POST /api/v1/crm/objects/{objectName}/fields/reorder */ "crm.fields.reorder": { objectName: string; /** Field names in desired order. */ orderedFieldNames: string[]; }; /** Reorder enum values. — `dench crm fields enum-reorder` — POST /api/v1/crm/objects/{objectName}/fields/{fieldName}/enum/reorder */ "crm.fields.enum.reorder": { objectName: string; fieldName: string; /** Exact permutation of existing options. */ orderedValues: string[]; }; /** Add an enum value. — `dench crm fields enum-add` — POST /api/v1/crm/objects/{objectName}/fields/{fieldName}/enum */ "crm.fields.enum.add": { objectName: string; fieldName: string; /** Option value to add. */ value: string; /** Hex color for the option. */ color?: string; /** 0-based insert index; defaults to append. */ position?: number; }; /** Remove an enum value. — `dench crm fields enum-remove` — DELETE /api/v1/crm/objects/{objectName}/fields/{fieldName}/enum/{value} */ "crm.fields.enum.remove": { objectName: string; fieldName: string; value: string; }; /** Rename an enum value. — `dench crm fields enum-rename` — POST /api/v1/crm/objects/{objectName}/fields/{fieldName}/enum/{oldValue}/rename */ "crm.fields.enum.rename": { objectName: string; fieldName: string; /** Existing option value (path). */ oldValue: string; /** New option value; migrates entries + statuses. */ newValue: string; }; /** Set an enum color. — `dench crm fields enum-set-color` — POST /api/v1/crm/objects/{objectName}/fields/{fieldName}/enum/{value}/color */ "crm.fields.enum.color": { objectName: string; fieldName: string; value: string; /** Hex color, e.g. #22c55e. */ color: string; }; /** List CRM entries. — `dench crm entries list [--with-references]` — GET /api/v1/crm/objects/{objectName}/entries */ "crm.entries.list": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; objectName: string; limit?: number; /** Personal scope: "me" (the signed-in member / the human behind an agent session), "unassigned", or a member userId or email. Adds one has_any / is_empty rule on the object's assignee user field; rows, totalCount, sums and analytics all follow it. Never saved onto the view. */ assignedTo?: string; /** Which `user` field "assigned" means. Default: the analytics owner role, else the task `Assignee`, else a user field named like owner/assignee, else the first user field. */ assigneeField?: string; }; /** Get a CRM entry. — `dench crm entries get` — GET /api/v1/crm/objects/{objectName}/entries/{entryId} */ "crm.entries.get": { objectName: string; entryId: string; }; /** Queue a full, paged pull of the record's email history from every connected mailbox; the ledger fills as pages land. — `dench crm entries sync-history` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/sync-history */ "crm.entries.syncHistory": Record; /** Has Dench read this record's email history? One row per address per mailbox. — `dench crm entries sync-history --status` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/sync-history */ "crm.entries.syncHistoryStatus": Record; /** 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. — `dench crm entries dossier` — GET /api/v1/crm/entries/{entryId}/dossier */ "crm.entries.dossier.get": Record; /** Research the account again and append a fresh dossier section to its Notes (needs a Website / Domain on the record). — `dench crm entries dossier --regenerate` — POST /api/v1/crm/entries/{entryId}/dossier/regenerate */ "crm.entries.dossier.regenerate": Record; /** 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. — `dench crm privacy status` — GET /api/v1/crm/entries/{entryId}/privacy */ "crm.privacy.get": Record; /** 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. — `dench crm privacy hide|show` — PUT /api/v1/crm/entries/{entryId}/privacy */ "crm.privacy.set": { entryId: string; hidden: boolean; }; /** 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. — `dench crm detections list` — GET /api/v1/crm/detections */ "crm.detections.list": Record; /** 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`. — `dench crm detections undo` — POST /api/v1/crm/detections/undo */ "crm.detections.undo": { /** Only verdicts / decisions at or after this ms timestamp. */ since: number; /** Which creator's rows to undo. Default `all`. */ kind?: "detections" | "linkedin" | "email-tasks" | "all"; dryRun?: boolean; limit?: number; }; /** List a CRM entry's audit history. — `dench crm history` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/history */ "crm.entries.history": Record; /** List a CRM entry's activity ledger (comments, notes, field changes, emails, meetings, Slack, LinkedIn) in one timeline, newest first by default. — `dench crm activity` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/activity */ "crm.activity.list": Record; /** The record's generated Brief: health, who owes the next move, open threads, commitments, risks, next step. Read this before the ledger. — `dench crm brief` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/brief */ "crm.brief.get": Record; /** 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. — `dench crm context` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/context */ "crm.context.get": Record; /** Rebuild a record's Brief from the current timeline. — `dench crm brief --regenerate` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/brief/regenerate */ "crm.brief.regenerate": Record; /** Bounded per-source counts of a CRM entry's activity ledger. — `dench crm activity` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/activity/count */ "crm.activity.count": Record; /** List a CRM entry's notes (titled, document-style comments), newest first. — `dench crm notes list` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/notes */ "crm.notes.list": Record; /** Add a titled note to a CRM entry's activity timeline (markdown body). Research goes here, never into the Notes document. — `dench crm notes create` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/notes */ "crm.notes.create": Record; /** List comments on a CRM entry (roots newest first, with preview replies). — `dench crm comments list` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/comments */ "crm.comments.list": { objectName: string; entryId: string; limit?: number; /** continueCursor from the prior page. */ cursor?: string; /** Preview replies per root (default 2). */ replies?: number; }; /** List every reply under a root comment, oldest first. — `dench crm comments replies` — GET /api/v1/crm/comments/{commentId}/replies */ "crm.comments.replies": { /** Root comment id. */ commentId: string; limit?: number; cursor?: string; }; /** Get one comment with its entry label. — `dench crm comments get` — GET /api/v1/crm/comments/{commentId} */ "crm.comments.get": { commentId: string; }; /** Comment on a CRM entry (markdown). Mention members with [@Name](/?member=); mention Dench with [@Dench](/?member=dench) or mentionDench. — `dench crm comments create` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/comments */ "crm.comments.create": { objectName: string; entryId: string; /** Markdown. Mention a member with [@Name](/?member=); mention Dench with [@Dench](/?member=dench). */ body: string; /** Reply under this comment (any depth). */ parentCommentId?: string; /** Extra members to notify without writing mention links. */ mentionUserIds?: string[]; /** Summon Dench to reply in the thread. */ mentionDench?: boolean; }; /** Edit a comment you wrote. — `dench crm comments update` — PATCH /api/v1/crm/comments/{commentId} */ "crm.comments.update": { commentId: string; body: string; }; /** Delete a comment (kept as a tombstone when it has replies). — `dench crm comments delete` — DELETE /api/v1/crm/comments/{commentId} */ "crm.comments.delete": { commentId: string; }; /** Toggle an emoji reaction on a comment. — `dench crm comments react` — PUT /api/v1/crm/comments/{commentId}/reactions/{emoji} */ "crm.comments.react": { commentId: string; /** A single emoji, e.g. 👍. */ emoji: string; }; /** Whether you follow a CRM entry's activity. — `dench crm watch status` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/watch */ "crm.watch.get": { objectName: string; entryId: string; }; /** Follow or unfollow a CRM entry's activity. — `dench crm watch` — PUT /api/v1/crm/objects/{objectName}/entries/{entryId}/watch */ "crm.watch.set": { objectName: string; entryId: string; /** Defaults to true; false unfollows. */ watching?: boolean; }; /** Page assigned tasks in priority order (or completed tasks by recency). — `dench crm tasks mine --page` — POST /api/v1/crm/tasks/assigned/page */ "crm.tasks.pageAssigned": Record; /** Page all tasks linked to a record, including subtasks. — `dench crm tasks list --page` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/tasks/page */ "crm.tasks.pageForEntry": Record; /** Start or resume preparation of exact task ordering and progress. — `dench crm tasks prepare` — POST /api/v1/crm/tasks/prepare */ "crm.tasks.prepare": Record; /** Your open tasks (plus ones completed today). — `dench crm tasks mine` — GET /api/v1/crm/tasks/mine */ "crm.tasks.mine": { limit?: number; /** Only tasks at this priority — one of the workspace's Priority options ("high"; case-insensitive). */ priority?: string; }; /** Tasks linked to a CRM entry. — `dench crm tasks list` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/tasks */ "crm.tasks.forEntry": { objectName: string; entryId: string; }; /** Create a task linked to a CRM entry. — `dench crm tasks create` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/tasks */ "crm.tasks.createForEntry": { objectName: string; entryId: string; name: string; assigneeUserId?: string; /** YYYY-MM-DD */ dueDateKey?: string; /** One of the workspace's Priority options (default Low | Medium | High; case-insensitive). */ priority?: string; }; /** Mark a task done. — `dench crm tasks complete` — POST /api/v1/crm/tasks/{entryId}/complete */ "crm.tasks.complete": { entryId: string; }; /** Reopen a completed task. — `dench crm tasks reopen` — POST /api/v1/crm/tasks/{entryId}/reopen */ "crm.tasks.reopen": { entryId: string; }; /** Set or clear a task's priority. — `dench crm tasks priority` — PUT /api/v1/crm/tasks/{entryId}/priority */ "crm.tasks.setPriority": { entryId: string; /** One of the workspace's Priority options ("high"; case-insensitive), or null to clear. */ priority: string | null; }; /** A task's subtasks. — `dench crm tasks subtasks` — GET /api/v1/crm/tasks/{entryId}/subtasks */ "crm.tasks.subtasks.list": { entryId: string; }; /** Create a subtask under a task (inherits the parent's record relations). — `dench crm tasks create-subtask` — POST /api/v1/crm/tasks/{entryId}/subtasks */ "crm.tasks.subtasks.create": { /** The parent task. */ entryId: string; name: string; assigneeUserId?: string; /** YYYY-MM-DD */ dueDateKey?: string; priority?: string; }; /** Nest a task under a parent, or promote it (parentEntryId: null). — `dench crm tasks parent` — PUT /api/v1/crm/tasks/{entryId}/parent */ "crm.tasks.setParent": { entryId: string; /** The parent task, or null to promote to a top-level task. */ parentEntryId: string | null; }; /** Delete a task and its subtasks, or keep them as tasks. — `dench crm tasks delete` — DELETE /api/v1/crm/tasks/{entryId} */ "crm.tasks.delete": { entryId: string; /** What happens to its subtasks: delete them too (default) or keep them as tasks. */ subtasks?: "delete" | "keep"; }; /** How a task repeats (rule, RRULE, trigger, ends, next due). — `dench crm tasks repeat` — GET /api/v1/crm/tasks/{entryId}/repeat */ "crm.tasks.repeat.get": { entryId: string; }; /** 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. — `dench crm tasks repeat` — PUT /api/v1/crm/tasks/{entryId}/repeat */ "crm.tasks.repeat.set": { entryId: string; /** Structured rule; alternative to `rrule`. */ rule?: { freq: "daily"; interval: number; } | { freq: "weekly"; interval: number; byWeekday: Array<"mo" | "tu" | "we" | "th" | "fr" | "sa" | "su">; } | { freq: "monthly"; interval: number; /** 1–31, or -1 for the last day of the month. */ byMonthDay?: number; bySetPos?: { /** 1–4, or -1 for the last week. */ ordinal: number; weekday: "mo" | "tu" | "we" | "th" | "fr" | "sa" | "su"; }; } | { freq: "yearly"; interval: number; month: number; day: number; }; /** RFC 5545 subset: FREQ, INTERVAL, BYDAY (ordinal allowed for MONTHLY, e.g. 2TU / -1FR), BYMONTHDAY, BYMONTH, COUNT, UNTIL. Bare FREQ=MONTHLY / YEARLY / WEEKLY take the day from the task's due date. */ rrule?: string; /** When the next occurrence is created: after this one is done (default) or on schedule regardless. */ trigger?: "after_completion" | "on_schedule"; ends?: { kind: "never"; } | { kind: "count"; count: number; } | { kind: "until"; dateKey: string; }; options?: { skipWeekends?: boolean; keepAssignee?: boolean; copyNotes?: boolean; copySubtasks?: boolean; }; }; /** Stop a task repeating (past occurrences are kept). — `dench crm tasks repeat --off` — DELETE /api/v1/crm/tasks/{entryId}/repeat */ "crm.tasks.repeat.clear": { entryId: string; }; /** Skip the current occurrence: the next one is created now. — `dench crm tasks repeat --skip` — POST /api/v1/crm/tasks/{entryId}/repeat/skip */ "crm.tasks.repeat.skip": { entryId: string; }; /** Pause a repeating task. — `dench crm tasks repeat --pause` — POST /api/v1/crm/tasks/{entryId}/repeat/pause */ "crm.tasks.repeat.pause": { entryId: string; }; /** Resume a paused repeating task. — `dench crm tasks repeat --resume` — POST /api/v1/crm/tasks/{entryId}/repeat/resume */ "crm.tasks.repeat.resume": { entryId: string; }; /** Every repeating-task series in the workspace. — `dench crm tasks series` — GET /api/v1/crm/tasks/series */ "crm.tasks.series.list": { status?: "active" | "paused" | "ended"; }; /** Every occurrence (task) of one series. — `dench crm tasks series --occurrences` — GET /api/v1/crm/tasks/series/{seriesId}/occurrences */ "crm.tasks.series.occurrences": { seriesId: string; }; /** Create a CRM entry. — `dench crm entries create` — POST /api/v1/crm/objects/{objectName}/entries */ "crm.entries.create": { objectName: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; }; /** Create many CRM entries. — `dench crm entries create-many` — POST /api/v1/crm/objects/{objectName}/entries/batch */ "crm.entries.createMany": { objectName: string; /** Up to 200 field maps. */ entries: Record[]; }; /** Update a CRM entry. — `dench crm entries update` — PATCH /api/v1/crm/objects/{objectName}/entries/{entryId} */ "crm.entries.update": { objectName: string; entryId: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; }; /** Update many CRM entries. — `dench crm entries update-many` — PATCH /api/v1/crm/objects/{objectName}/entries/batch */ "crm.entries.updateMany": { /** Object the entries belong to. */ objectName: string; /** Per-entry partial updates (entryId or id + data). */ updates: { entryId?: string; id?: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; }[]; }; /** Delete a CRM entry. — `dench crm entries delete` — DELETE /api/v1/crm/objects/{objectName}/entries/{entryId} */ "crm.entries.delete": { objectName?: string; entryId: string; }; /** Bulk delete CRM entries. — `dench crm entries bulk-delete` — POST /api/v1/crm/objects/{objectName}/entries/delete */ "crm.entries.bulkDelete": { objectName?: string; entryIds: string[]; }; /** Get a CRM cell value. — `dench crm cells get` — GET /api/v1/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName} */ "crm.cells.get": { objectName: string; entryId: string; fieldName: string; }; /** Set a CRM cell value. — `dench crm cells set` — PUT /api/v1/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName} */ "crm.cells.set": { objectName: string; entryId: string; fieldName: string; /** Cell value. Enum=option string, tags=string array, user=one member userId or a userId array, relation=related entry id, boolean=true/false. */ value: unknown; }; /** Set many CRM cell values. — `dench crm cells set-many` — POST /api/v1/crm/cells/batch */ "crm.cells.setMany": { cells: { objectName: string; entryId: string; fieldName: string; /** Cell value. Enum=option string, tags=string array, user=one member userId or a userId array, relation=related entry id, boolean=true/false. */ value: unknown; }[]; }; /** Append to a CRM cell. — `dench crm cells append` — POST /api/v1/crm/objects/{objectName}/entries/{entryId}/fields/{fieldName}/append */ "crm.cells.append": { objectName: string; entryId: string; fieldName: string; /** Cell value. Enum=option string, tags=string array, user=one member userId or a userId array, relation=related entry id, boolean=true/false. */ value: unknown; }; /** Query CRM entries. — `dench crm query [--with-references]` — POST /api/v1/crm/query */ "crm.query": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; objectName: string; /** Query DSL. Bare equality only; use dslJson for $-operators. */ dsl?: { filter?: Record; select?: string[]; /** e.g. -Score,Name (- = desc). */ sort?: string; limit?: number; }; /** JSON string of the DSL when filters use operators like $gt/$in/$contains/$and/$or. Date fields and the system timestamps created_at/updated_at also accept $datePreset ("today", "yesterday", "this_week", "last_week", "this_month", "last_month", "this_quarter", "last_quarter", "this_year", "last_year"), and $inLast/$inNext rolling windows (a day count like 7, or {"amount":2,"unit":"weeks"} with unit days|weeks|months|quarters|years). Example: {"filter":{"updated_at":{"$datePreset":"this_month"}}}. */ dslJson?: string; /** Personal scope: "me" (the signed-in member / the human behind an agent session), "unassigned", or a member userId or email. Adds one has_any / is_empty rule on the object's assignee user field; rows, totalCount, sums and analytics all follow it. Never saved onto the view. */ assignedTo?: string; /** Which `user` field "assigned" means. Default: the analytics owner role, else the task `Assignee`, else a user field named like owner/assignee, else the first user field. */ assigneeField?: string; }; /** Scan CRM entries with a resumable cursor. Empty filtered pages can have more results. — `dench crm query --page` — POST /api/v1/crm/query/page */ "crm.queryPage": { objectName: string; dsl?: Record; dslJson?: string; /** Personal scope: "me" (the signed-in member / the human behind an agent session), "unassigned", or a member userId or email. Adds one has_any / is_empty rule on the object's assignee user field; rows, totalCount, sums and analytics all follow it. Never saved onto the view. */ assignedTo?: string; /** Which `user` field "assigned" means. Default: the analytics owner role, else the task `Assignee`, else a user field named like owner/assignee, else the first user field. */ assigneeField?: string; /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; paginationOpts: { numItems: number; cursor: string | null; }; }; /** Run CRM SQL-compatible query. — `dench crm sql` — POST /api/v1/crm/sql */ "crm.sql": { objectName: string; dsl?: Record; dslJson?: string; }; /** Aggregate CRM entries. — `dench crm aggregate` — POST /api/v1/crm/aggregate */ "crm.aggregate": { objectName: string; /** Field to bucket by. */ fieldName: string; /** Number field to total per bucket (e.g. Amount grouped by Stage). Exact at any table size. */ sumField?: string; }; /** Search CRM entries. — `dench crm search [--with-references]` — GET /api/v1/crm/search */ "crm.search": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; /** Full-text query. */ text: string; /** Omit to search org-wide. */ objectName?: string; limit?: number; }; /** Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone. — `dench crm search --page` — GET /api/v1/crm/search/page */ "crm.search.page": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; /** Full-text query over readable entries. */ text: string; objectName?: string; select?: string[]; /** Defaults to strict. Explicit modes require objectName and select. Compact recovers unknown selected names with bounded canonical columns and explicit selectionFallback metadata in the same response. Does not guess aliases. */ selectionMode?: "strict" | "compact"; limit?: number; /** Use the preceding continueCursor, with the same query and projection. */ cursor?: string; }; /** List CRM statuses. — `dench crm statuses list` — GET /api/v1/crm/objects/{objectName}/statuses */ "crm.statuses.list": { objectName: string; }; /** Set CRM statuses. — `dench crm statuses set` — PUT /api/v1/crm/objects/{objectName}/statuses */ "crm.statuses.set": { objectName: string; statuses: { name: string; /** Hex color. */ color: string; sortOrder?: number; isDefault?: boolean; }[]; }; /** Apply a CRM batch. — `dench crm batch` — POST /api/v1/crm/batch */ "crm.batch": { /** Include bounded navigation references. Array reads return {data, references, referenceCoverage}; existing result envelopes keep their fields. */ withReferences?: boolean; ops: Array<{ type: "entries.create"; objectName: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; } | { type: "entries.update"; entryId: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; } | { type: "entries.delete"; entryId: string; }>; idempotencyKey?: string; }; /** Begin a CRM transaction. — `dench crm transaction begin` — POST /api/v1/crm/transactions */ "crm.transaction.begin": Record; /** Add an operation to a CRM transaction. — `dench crm transaction add` — POST /api/v1/crm/transactions/{txnId}/operations */ "crm.transaction.add": { txnId: string; /** A single CRM batch/transaction operation. */ op: { type: "entries.create"; objectName: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; } | { type: "entries.update"; entryId: string; /** Field-name -> value map. For `user` fields use one member userId or a userId array; preserve every assignee. */ data: Record; } | { type: "entries.delete"; entryId: string; }; }; /** Commit a CRM transaction. — `dench crm transaction commit` — POST /api/v1/crm/transactions/{txnId}/commit */ "crm.transaction.commit": { txnId: string; }; /** Abort a CRM transaction. — `dench crm transaction abort` — POST /api/v1/crm/transactions/{txnId}/abort */ "crm.transaction.abort": { txnId: string; }; /** Inspect a CRM transaction. — `dench crm transaction inspect` — GET /api/v1/crm/transactions/{txnId} */ "crm.transaction.inspect": { txnId: string; }; /** List CRM documents. — `dench crm docs list` — GET /api/v1/crm/docs */ "crm.docs.list": Record; /** Create a CRM document. — `dench crm docs create` — POST /api/v1/crm/docs */ "crm.docs.create": { title: string; filePath: string; icon?: string; coverImage?: string; parentId?: string; parentObjectName?: string; entryId?: string; }; /** Link a CRM document. — `dench crm docs link` — POST /api/v1/crm/docs/link */ "crm.docs.link": { filePath: string; objectName?: string; entryId?: string; }; /** Delete a CRM document page; its workspace file stays and nested pages move up. — `dench crm docs delete` — DELETE /api/v1/crm/docs/{documentId} */ "crm.docs.delete": { /** The id crm docs create returned. */ documentId: string; }; /** List CRM actions. — `dench crm actions list` — GET /api/v1/crm/actions */ "crm.actions.list": { entryId: string; }; /** 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). — `dench crm actions create` — POST /api/v1/crm/actions */ "crm.actions.create": { objectName: string; fieldName: string; actionId?: string; label?: string; variant?: string; icon?: string; confirmMessage?: string; recipe?: unknown[]; script?: string; scriptPath?: string; [key: string]: unknown; }; /** Update an action button on a CRM field. — `dench crm actions edit` — PATCH /api/v1/crm/actions/{actionId} */ "crm.actions.update": { actionId: string; objectName: string; fieldName: string; label?: string; variant?: string; icon?: string; confirmMessage?: string; recipe?: unknown[]; script?: string; scriptPath?: string; [key: string]: unknown; }; /** Delete an action button from a CRM field. — `dench crm actions delete` — DELETE /api/v1/crm/actions/{actionId} */ "crm.actions.delete": { actionId: string; objectName: string; fieldName?: string; fieldId?: string; deleteFieldIfEmpty?: boolean; [key: string]: unknown; }; /** Run a CRM action on one or more entries. — `dench crm actions run` — POST /api/v1/crm/actions/{actionId}/runs */ "crm.actions.run": { actionId: string; objectName: string; fieldId: string; entryIds: string[]; prompts?: Record; }; /** List workspace members for CRM user fields. — `dench members list` — GET /api/v1/members */ "crm.members.list": Record; /** Live presence (online / away / offline) for workspace members. — `dench members presence` — GET /api/v1/members/presence */ "members.presence": { /** Comma-separated user ids; omit for every member. */ userIds?: string; }; /** A member's profile: name, email, tagline, role, timezone, presence, open task count. — `dench members get` — GET /api/v1/members/{userId} */ "members.get": { userId: string; }; /** A member's recent comments and record changes across the CRM, newest first. — `dench members activity` — GET /api/v1/members/{userId}/activity */ "members.activity": { userId: string; limit?: number; /** Comma-separated subset of comments,changes. */ kinds?: string; }; /** Open tasks assigned to a member (plus ones completed today). — `dench members tasks` — GET /api/v1/members/{userId}/tasks */ "members.tasks": { userId: string; limit?: number; todayStartMs?: number; }; /** Your own member profile. — `dench members me` — GET /api/v1/me/profile */ "me.profile.get": Record; /** Update your name, tagline, avatar URL, or timezone. — `dench members me --name … --tagline … --timezone …` — PATCH /api/v1/me/profile */ "me.profile.update": { name?: string; /** Empty string clears. */ tagline?: string; /** http(s) image URL; empty string clears the avatar. */ imageUrl?: string; /** IANA zone; null returns to browser detection. */ timezone?: string | null; }; /** Get a one-time URL to POST an avatar image to; then PUT /me/avatar with the returned storageId. — `dench members me --avatar ` — POST /api/v1/me/avatar/upload-url */ "me.avatar.uploadUrl": Record; /** Set your avatar from an uploaded storageId. — `dench members me --avatar ` — PUT /api/v1/me/avatar */ "me.avatar.set": { /** storageId returned by the upload POST. */ storageId: string; }; /** Remove your avatar. — `dench members me --clear-avatar` — DELETE /api/v1/me/avatar */ "me.avatar.clear": Record; /** Generate a CRM report. — `dench crm reports generate` — POST /api/v1/crm/reports */ "crm.reports.generate": { objectName: string; /** Chart type for the generated report. */ type: "pie" | "bar" | "line" | "table"; groupByField: string; /** Aggregation metric. Defaults to `count`. */ metric?: "count" | "sum" | "avg" | "min" | "max"; /** Number field to sum/avg per bucket (e.g. Amount grouped by Stage). Defaults to the group field itself. */ metricField?: string; }; /** 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). — `dench crm analytics get` — GET /api/v1/crm/objects/{objectName}/analytics */ "crm.analytics.get": { objectName: string; /** Also return this saved view's own dashboard (viewAnalytics) when it has one. */ viewName?: string; }; /** 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. — `dench crm analytics compute` — POST /api/v1/crm/objects/{objectName}/analytics/compute */ "crm.analytics.compute": { objectName: string; /** Compute the saved view's own dashboard instead of the object's (ignored when the view inherits). */ viewName?: string; /** Only these stored panels. */ panelIds?: string[]; /** Ad-hoc panel definitions to compute instead of the stored dashboard (nothing is persisted). id/title/metric/sortOrder are filled in when omitted. */ panels?: Array<{ /** Stable id (template panels use `tpl: