Sonar AI — User Manual
Table of contents
Getting Started
1. What Is Sonar AI
Sonar AI is an AI agent embedded directly in NetSuite as a Suitelet. It is not a separate integration or an external chatbot bolted onto NetSuite — it runs inside your account, as a page you navigate to like any other NetSuite screen, and every action it takes executes under your own NetSuite login, subject to your role's actual permissions. There is no service account, no elevated privilege, and no bypass of NetSuite's own security model.
How it's built
The architecture has three parts:
- A browser-side chat application (SPA) — everything you see and
click. It holds your conversation, your settings, and (critically) your AI provider
API key, all in your browser's
localStorage. Nothing here is stored on NetSuite's servers. - A Suitelet relay — the server-side NetSuite code that executes tool calls (SuiteQL queries, record loads, file operations, etc.) using NetSuite's native SuiteScript modules, under your session and your role.
- An AI model provider — Anthropic, OpenAI, xAI, Mistral, or the
NetSuite-bundled Cohere integration. Your browser talks to the provider directly
wherever possible; the Suitelet is not in the middle of that conversation except for
Cohere, which is relayed through NetSuite's own
N/llmmodule.
What makes it different from asking a generic AI chatbot about NetSuite
A generic chatbot can only guess at your account's schema, your customizations, and your data. Sonar actually queries your live account — it runs real SuiteQL against your real tables, loads your real records, and reads your real custom fields. When it doesn't know something (a field id, a script's behavior, a saved search's filters) the house rule is to look it up rather than guess, because a wrong-but-plausible field id is the single most common way an AI agent silently gets something wrong in NetSuite.
2. First Launch
Terms of Use
The first time you open Sonar AI (or after a Terms of Use version bump), you'll see an
acceptance screen. It explains, in plain terms, that Sonar uses third-party LLM APIs
(Anthropic, OpenAI, Google, Mistral, xAI, Cohere, or any OpenAI-compatible provider you
configure) to plan and execute actions, that those actions can create/modify/delete
records based on the model's reasoning, and that you are responsible for reviewing
destructive operations before approving them and for choosing which provider receives
your data. Acceptance is recorded in your browser's localStorage.
License / subscription check
Sonar checks a subscription/license status on load, cached for about 12 hours so it doesn't re-check on every page view. If your subscription needs attention, a modal offers a Refresh action.
Choosing a provider and model
Sonar needs an AI model to run. On first use, open Settings (gear icon) and either:
- Enter an API key for Anthropic, OpenAI, xAI, or Mistral (each provider needs its own key, entered once), or
- Switch to Cohere (
/cohere), which needs no key at all — it rides your NetSuite account's own bundled LLM allowance viaN/llm. Cohere is text-only (no native tool-calling) and is best thought of as a no-setup fallback, not the primary way to drive Sonar.
| Provider | Key required? | Current default model (new installs) |
|---|---|---|
| Anthropic | Yes | claude-sonnet-4-6 |
| OpenAI | Yes | gpt-5.6-terra |
| xAI | Yes | grok-4.6 |
| Mistral | Yes | mistral-medium-latest |
| OpenAI-compatible (custom base URL) | Usually | none — you supply base URL + model |
| Cohere (NS-bundled) | No | n/a — governed by NetSuite's own LLM allowance |
| Google Gemini | — | not implemented — slot exists in Settings but returns an error if selected; see §20. |
/model claude-opus-5 (or any model id) in
the chat box. See §18 for the full slash command list.
Theme
Sonar defaults to your OS-level light/dark preference; a toggle in the header switches it manually.
3. The Chat Interface
Composing messages
- Enter sends your message; Shift+Enter inserts a newline.
- You can attach files directly to a message (CSV, JSON, code, images). Large files upload in chunks automatically — you don't need to do anything differently for a big file versus a small one.
- A Stop button appears while Sonar is working, letting you abort a turn mid-stream (useful if you realize you asked the wrong question, or a tool call is taking too long).
What you see per turn
- Tool call cards — each tool Sonar calls renders as an expandable card with a short, human-readable purpose line at the top, so you can skim a long conversation without opening every card.
- Usage chip — on each assistant response (Anthropic-provider only; Cohere shows a "NS-bundled, no per-token charge" note instead) a small chip reports tokens in/out and estimated cost for that turn. Click it for a detailed breakdown, including savings from prompt caching.
- Rate-limit countdown — if your provider returns a 429, Sonar shows a visible countdown rather than failing silently or retrying invisibly.
- Toasts — brief confirmations/errors in the corner (e.g. "Model: claude-opus-5", "Set your API key in Settings").
Managing conversations
- Conversations persist in your browser's
localStorageacross page reloads. /clearstarts a fresh conversation./exportdownloads the current conversation as Markdown, including tool results and per-message cost lines — useful for sharing a session or comparing model performance across runs.- Very long conversations are auto-compacted: once you approach ~75% of the active model's context window, older messages are summarized into a single block (goals, decisions, tool findings, account context preserved) via a paid LLM call charged to your session. See §20 for what this means for accuracy.
Core Capabilities
4. Asking Questions About Your Data
Sonar has several distinct ways to answer a data question, and it's worth knowing which one it reaches for:
SuiteQL (runSql)
Direct, Oracle-flavored SQL against NetSuite's query engine. This is the workhorse for custom slicing, joins across tables, and anything a saved search or standard report can't express. Results over ~10KB are paginated/truncated automatically with a clear marker; Sonar refines the query rather than guessing when that happens.
Standard NetSuite reports
When you ask for something that has an actual NetSuite report — an Income
Statement, Balance Sheet, A/R Aging, Comparative Income Statement, and so on —
Sonar uses the real, NS-rendered report rather than reconstructing the numbers itself
in SQL. The flow is: reportsList (find the report) →
reportInfo (discover its exact filter fields and valid values) →
reportRun (execute it, with named period presets like Q1TFY or
custom date ranges).
Saved searches
savedSearchList finds a search by name, savedSearchInspect (advanced tool group) shows its filters/columns without running it, and savedSearchRun executes it — optionally with filter/column overrides.
Record inspection
recordJson / recordXml load a record's full state (all fields,
all sublists). recordTypeDescribe answers "what fields does this record
type even have" by loading a live sample. fieldDescribe drills into one
field — its type, whether it's really mandatory, and (for select fields) its valid
options, resolved live from the account rather than guessed.
5. Getting Files Out
Two distinct mechanisms, and Sonar defaults to the one that leaves less clutter:
Artifacts (the default)
artifactCreate produces an ephemeral, downloadable file held as a browser
Blob — it appears as a clickable chip on the tool call and in a footer
Artifacts panel, but is never written to the NetSuite File
Cabinet. It lives only for the current browser session. This is the default for
"give me this as a download" requests (CSV exports, generated reports, JSON dumps).
Bulk SQL exports: sqlToArtifact
When you want raw query results (potentially thousands of rows) dumped straight to a
file, sqlToArtifact runs the query and formats the file entirely
server-side — the rows never pass through the AI model as tokens. This is
dramatically faster than the alternative (query, then re-emit every row as model
output) for anything beyond a trivial row count, and it's what Sonar reaches for
whenever a bulk data dump is requested.
File Cabinet writes (when it should persist)
fileCreate writes a real, persistent file into NetSuite's File Cabinet.
Sonar reaches for this only when the file genuinely needs to live in NetSuite —
Suitelet source being deployed, integration assets, reference documents meant to
outlive the browser session (like this manual).
6. Making Changes Safely
The dry-run → diff → approval workflow
recordCreate, recordUpdate, recordSubmitFields,
recordDelete, and their bulk equivalents all accept
dryRun: true. A dry run computes and returns exactly what would change (a
before→after field diff, or a delete summary) without saving anything.
For any update you haven't spelled out field-by-field yourself, Sonar dry-runs first,
shows you the diff as a table, and only proceeds after you approve — the diff
shown to you always comes from the dry-run result itself, never from Sonar's own
description of what it intends to do.
The approval-gate modal
Destructive or modifying tool calls surface an approval modal before executing, with an "always allow" option for that specific tool if you want to stop being asked for routine, low-risk operations within a session.
What Sonar will never do
- Create
scriptorscriptdeploymentrecords. This is a hard, deliberate security boundary — not a permissions gap you can unlock by adjusting a role. Deploying a new script is always a human-executed step: Sonar uploads the source file and walks you through Customization > Scripting > Scripts > New, with exact field values. - Delete production records without your explicit confirmation — see §9.
- Silently fall back to a different approach when the requested one fails (e.g., SQL instead of a standard report) without asking first.
7. Tool Groups
To keep Sonar's default toolset small and easy to reason about, most core capabilities
(SuiteQL, reports, record CRUD, files, artifacts, search, web fetch, skills) are always
available. More specialized capabilities are organized into deferred tool
groups that Sonar loads on demand with toolGroupLoad as soon as a
task points to them — you'll typically never notice this happening except as a
brief "N tools now callable" note.
| Group | What it unlocks |
|---|---|
customize | Create/modify custom fields, custom lists, custom record types. |
roles | Inspect and modify roles and permissions. |
scripting | Evaluate SuiteScript ad hoc, list/toggle script deployments, read execution logs, resolve/invoke RESTlets, trigger workflows. |
bulk | Bulk record create/update/delete (capped at 100 records per call). |
transactions | Record transforms (e.g. Sales Order → Invoice/Fulfillment), voiding, GL impact inspection. |
comms | Send email; create task / event / phone-call records. |
advanced | Record XML export, saved-search inspection without running it, page/UI scraping, browser-side fetch, installed-bundle listing, file delete/copy/move, folder creation. |
Safety & Governance
8. The Permission Mask
Sonar runs in one of three modes, controlled by a shield icon in the header:
| Mode | Effect |
|---|---|
| Standard | All tools available (still subject to your NetSuite role's actual permissions and the safeguards elsewhere in this Part). |
| No-deletes | Blocks recordDelete, recordDeleteBulk, and fileDelete. Dry-run previews of deletes are still allowed — you can see what would be deleted without the mode letting it happen. |
| Read-only | Blocks every mutating tool. Sonar can look at anything, change nothing. |
AGENT_MASK_BLOCKED
before it ever executes. Critically, the mode can only be changed by you,
clicking the shield toggle in the header — there is no way to ask Sonar in
chat to widen its own permissions, by design.
Widening the mode (e.g., Read-only → Standard) shows a confirmation before taking effect.
9. Production Delete Confirmation
On top of the permission mask, real deletes (recordDelete,
recordDeleteBulk, fileDelete) in a production
account require an additional flag, confirmedByUser: true, or they are
rejected with CONFIRMATION_REQUIRED. The intended workflow is always:
dry-run → show you exactly what would be deleted → get your explicit approval of
that specific delete → only then re-issue with the flag set.
Practical implication: always read the dry-run diff Sonar shows you before saying yes to a delete. Your "yes" is the actual control here.
10. The Audit Trail
Every mutating tool call — success, error, dry-run, or blocked — is logged
automatically to NetSuite's script execution log with the title prefix
SONAR_AUDIT. This logging happens in the dispatch layer, not by the AI
model choosing to log something, so it can't be skipped or talked around.
What's recorded
Each entry's detail field is JSON:
{ ts, user: { id, name, role }, tool, outcome, errorCode, mask, purpose, target, args }
outcome is one of success / error / dryrun / blocked. args is clipped (~3.5KB) rather than storing arbitrarily large payloads.
How to look it up
The built-in Sonar Activity viewer shows the last 100 entries. For anything deeper, query directly:
SELECT date, title, detail FROM scriptnote
WHERE title LIKE 'SONAR_AUDIT%'
ORDER BY date DESC
scriptnote audit entry — it is immutable from
inside the product.
11. Privacy Mode
Privacy Mode lets you run analyses on customers, vendors, employees, and contacts without their identities ever entering the AI model's context — useful for clustering, segmentation, or any workflow where the underlying pattern matters more than the names attached to it.
The strictness dial
A header toggle (👤) cycles through three states:
| State | Behavior |
|---|---|
| Off | No redaction. Normal operation. |
| ON | Entity names are tokenized before reaching the model. |
| STRICT | Everything in ON, plus several free-text tools are blocked outright (e.g. fileGet, fileGetLines, fileGrep, scriptExecutionLogs, recordXml) because their result shape can't be safely redacted. |
How it works
- Column-manifest projection — the primary mechanism. Query results are projected against a default-deny manifest: an undeclared string column is withheld rather than assumed safe.
- Dictionary redaction (backstop) — a browser-only lookup swaps
real names for stable tokens derived from internal id:
CUST-<id>,VEND-<id>,EMP-<id>,CONT-<id>. Tokens are stable across a session (and across dictionary rebuilds) — the same customer always gets the same token, so patterns across multiple questions stay analyzable. - Entity-specific tool blocklist — tools whose whole purpose is
looking up an identity by name (
customerSearch,pageFetch,webFetchBrowser, direct entityrecordLoad/recordJson) are blocked while Privacy Mode is on.
A tightening-only privacySpecApply tool lets you describe additional
protections in plain language (extra never-grant columns, extra sensitive terms, extra
blocked tools) which get applied with your confirmation. A synthetic canary customer
exists in this account specifically to self-test the redaction pipeline end-to-end.
Privacy Mode and a private/self-hosted AI provider are complementary, not competing, protections: Privacy Mode keeps entity identities out of whatever model you're using; choosing where that model runs (see §17) determines whether your data leaves your organization's network at all.
Advanced Features
12. Skills & Field Notes
Skills
Skills are curated reference documents Sonar loads before doing something that needs deep, NS-specific knowledge — SuiteQL quirks, SuiteScript hard limits, roles and permissions, and account-specific conventions. There are two kinds:
- Bundled skills — ship with Sonar itself (e.g. SuiteQL essentials, SuiteScript essentials).
- Custom skills — markdown files you (or Sonar, on your
instruction) author in the
/SuiteScripts/sonar-skillsFile Cabinet folder. These carry house rules and account-specific conventions that override generic approaches within their subject area. Changes take effect immediately — no redeploy.
skillList shows what's available; skillRead loads one before relevant work begins.
Field notes
Field notes are Sonar's persistent memory of this specific account: verified facts,
configuration, schema quirks, and known-good query patterns discovered in past
sessions. They live in a single markdown file
(sonar-field-notes.md, injected at load) and are treated as
hints, never authority — if live introspection ever contradicts a
field note, the live account wins, and Sonar flags the stale note for correction. You
can ask Sonar to "update your field notes" after a session to distill what was
genuinely learned (verified ids, corrected mistakes, stated preferences) into
surgical edits, keeping the file under a size ceiling and never recording anything
sensitive.
13. Processes
Processes are supervised, multi-step workflows defined as markdown files in
/SuiteScripts/sonar-processes — things like a customer onboarding
check, month-end close, or a permissions audit. Each defines an ordered sequence of
steps tagged research / action / gate.
Running one
Say "run <process name>" and Sonar loads the definition, renders a live checklist card, and executes step by step — marking each step running/done/error as it actually happens (never marking a step done that wasn't executed). A gate step always stops and asks you directly in the conversation; gates are never relaxed by a process run, and every mutation inside a process still goes through the normal dry-run + approval flow from §6.
The starter library
processStarterSeed installs a bundled library of account-agnostic process
definitions into sonar-processes, without ever overwriting an existing file
of the same name — your edits and deletions always win. It always previews a
dry-run plan (CREATE vs. SKIP per file) for your approval before writing anything.
Authoring or importing your own
If you want to write a new process, or someone hands you a process definition file, Sonar loads a dedicated authoring guide skill first — it covers the file anatomy, the quality bar, and (for imported files specifically) an intake protocol: validate, check for collisions with existing processes, run a quality review, then trial-run it ad hoc before installing it for real.
14. Subagents
For a self-contained, read-only investigation that would otherwise burn many tool calls whose intermediate results you don't need to see — surveying an unfamiliar schema, searching through a large source file, archaeology on old customizations — Sonar can dispatch a subagent: a nested agent loop with its own private context and a restricted, read-only tool whitelist.
subagentRun— one investigation. You watch its live activity in a tool card; only its final summary re-enters the main conversation.subagentRunParallel— 2–3 independent investigations dispatched concurrently under one approval, taking the wall-clock time of the slowest rather than the sum of all three. Used, for example, when researching several unrelated AI providers' documentation at once.
15. Second Opinion
Second Opinion requests an independent, adversarial review of Sonar's own analysis from a different Anthropic model — a structural check against a single AI's blind spots, using an API key you supply and control separately from your main provider key.
Setup
Settings > Second Opinion — enter a dedicated Anthropic API key (a workspace key with its own monthly spend cap is recommended), and optionally set a per-session spend ceiling and an auto-approve threshold below which review dispatches don't need individual confirmation.
How a review packet is built
Sonar assembles source data first (raw extracts, not its own prose), then computed metrics with the formulas that produced them so arithmetic is independently checkable, then claims stated neutrally with stable ids — withholding its own recommendations on the first pass so the reviewer isn't anchored by them.
Guardrails
- Key custody: resolved in your browser only, never a tool parameter, never entering the model's context.
- Spend ceiling enforced per session; a confirmation with estimated cost shows before a dispatch that exceeds your auto-approve threshold.
- Rate limit: 3 dispatches per minute.
- Provenance: every result includes a provenance line disclosing the reviewing model, which must always be surfaced when you see or share the review.
- If no key is configured, Sonar relays the setup steps and stops — there's no in-chat workaround by design.
16. Projects & Prompt Library
Projects
A Project is a named, importable markdown document (similar in spirit to a
CLAUDE.md file) that provides standing context for a conversation —
house rules, background on an initiative, terminology specific to how your organization
talks about its own data. One Project is active at a time, managed via a header button
and modal.
Prompt Library
A modal offering a hosted library of ready-made prompts, relayed from an external service (suitestep.com) via a signed request.
Reference
17. Settings Reference
| Setting | What it controls |
|---|---|
| Provider & API keys | Per-provider key storage (Anthropic / OpenAI / xAI / Mistral / OpenAI-compatible base URL). Keys live only in your browser's localStorage. |
| Model (per provider) | Which model to use for that provider. Anthropic enforces a maintained allowlist (currently: claude-fable-5, claude-opus-5, claude-opus-4-8, claude-sonnet-5, claude-sonnet-4-6, claude-opus-4-7, claude-haiku-4-5-20251001); other providers accept free-text model ids since their naming moves faster than Sonar's release cadence. |
| Max output tokens | Defaults to the model's ceiling (currently 64,000) — a high cap costs nothing unless the model actually generates that much. |
| Temperature | Ignored automatically on models that reject it (Opus 4.7 and later, per Anthropic's own deprecation of the parameter). |
| Theme | Light / dark; defaults to OS preference. |
| Display name | Override the name Sonar uses for you; empty defaults to your NetSuite user name. |
| Notify on turn complete | Tab-title flash + OS notification when a long-running turn finishes while you're looking elsewhere. |
| Show usage chip | Toggle the per-turn tokens/cost chip on assistant messages. |
| Second Opinion | Separate API key, spend ceiling, auto-approve threshold, reviewer model allowlist override. See §15. |
| Agent permission mask | Standard / No-deletes / Read-only. Also available as the header shield toggle. See §8. |
| Privacy Mode | Off / ON / STRICT. Also available as the header 👤 toggle. See §11. |
| Auto-approve map | Per-tool "always allow" choices made via the approval modal, remembered for the session. |
18. Slash Command Reference
| Command | Effect |
|---|---|
/clear | Start a new conversation. |
/settings | Open the Settings panel. |
/model <id> | Switch the model for the current provider (e.g. /model claude-opus-5). With no argument, shows the current model. |
/cohere | Switch provider to Cohere (no API key needed). |
/anthropic | Switch provider to Anthropic. |
/export | Export the current conversation as Markdown. |
/help | List all slash commands. |
/about | Show version and account/build information. |
19. Complete Tool Catalog
Sonar has roughly 70–80 distinct tools. The core set below is always callable; the
grouped sets require toolGroupLoad first (see §7). This catalog is
organized by function, not alphabetically, so related tools sit together.
Always available — data & reporting
| Tool | Purpose | |
|---|---|---|
runSql | Run a SuiteQL query. | |
sqlToArtifact | Run SuiteQL straight to a downloadable file, bypassing the model entirely. | |
reportsList / reportInfo / reportRun | Find, inspect, and execute standard NetSuite reports. | |
savedSearchRun / savedSearchList | Run a saved search by id/name; list searches by name. | |
recordsCatalog / recordsCatalogSchema | Introspect the account's record type catalog. | |
accountingPeriodGet / accountingPeriodList | Resolve or list accounting periods. | |
subsidiaryList | List subsidiaries (OneWorld). | |
accountFeaturesGet | Check which NetSuite features are enabled. |
Always available — records
| Tool | Purpose | |
|---|---|---|
recordJson | Load a record's full state as JSON (all fields + sublists). | |
recordLoad | Load a record's field values (optionally with sublists). | |
recordCreate | Create a record. Supports dryRun. | mutating |
recordUpdate | Update a record (load + apply + save). Supports dryRun (before→after diff). | mutating |
recordSubmitFields | Fast field update without a full load. Supports dryRun. | mutating |
recordDelete | Permanently delete a record. Supports dryRun; production real deletes need confirmedByUser. See §9. | mutating |
recordTypeDescribe | Full field list + sublist shape for a record type. | |
fieldDescribe | One field's label, type, mandatory/select-options detail. |
Always available — search & lookup
| Tool | Purpose |
|---|---|
customerSearch | Find customers by name/email/phone. |
itemSearch | Find items by name/SKU/UPC. |
fileSearch | Search the File Cabinet by name/folder/type. |
Always available — files & artifacts
| Tool | Purpose | |
|---|---|---|
artifactCreate | Ephemeral browser-download file. See §5. | |
fileCreate | Create/overwrite a persistent File Cabinet file. | mutating |
fileGet / fileGetLines | Read a file's content (whole, byte range, or line range). | |
fileGrep | Find lines matching a pattern in a file. | |
fileEdit | Modify a file via find-and-replace (cheaper than a full rewrite; validated on .js files). | mutating |
Always available — web & compute
| Tool | Purpose |
|---|---|
webFetch | Fetch any HTTPS URL from the NetSuite server. |
evalJs | Run sandboxed pure JavaScript (no NetSuite/DOM access) for computation. |
secondOpinion | Cross-model adversarial review. See §15. |
Always available — orchestration & meta
| Tool | Purpose |
|---|---|
skillList / skillRead | Discover and load reference skill documents. See §12. |
processList / processRead / processStart / processStepUpdate | Discover, load, and run supervised process definitions. See §13. |
processStarterSeed | Install the starter process library (never overwrites). See §13. |
subagentRun / subagentRunParallel | Dispatch read-only research subagents. See §14. |
toolGroupLoad | Load a deferred tool group. See §7. |
agentHealth / agentSession / userPermissionsCheck | Self-introspection — version, current mask, governance remaining, role and permissions. |
privacyManifest / privacySpecApply | Inspect/tighten Privacy Mode's column manifest. See §11. |
Deferred group: customize
| Tool | Purpose | |
|---|---|---|
customFieldCreate / customFieldUpdate / customFieldGet | Create, update, and inspect custom fields. | create/update mutating |
customListCreate / customListGet | Create and inspect custom lists. | create mutating |
customRecordTypeCreate | Create a custom record type. | mutating |
Deferred group: roles
| Tool | Purpose | |
|---|---|---|
roleGet | Inspect a role's permissions. | |
rolePermissionSet | Modify a role's permissions. | mutating |
Deferred group: scripting
| Tool | Purpose | |
|---|---|---|
scriptEval | Run SuiteScript ad hoc for inspection/testing (not for deploying — see §6). | |
scriptList / scriptDeploymentList | List scripts / script deployments. | |
scriptDeploymentToggle | Enable/disable a deployment. | mutating |
scriptExecutionLogs | Read a script's execution log output. | |
restletInvoke / restletDiscover | Call or discover RESTlets. | |
workflowTrigger | Trigger a SuiteFlow workflow. | mutating |
suiteletUrl | Resolve a Suitelet's URL. |
Deferred group: bulk
| Tool | Purpose | |
|---|---|---|
recordCreateBulk / recordUpdateBulk | Bulk create/update, capped at 100 records per call. | mutating |
recordDeleteBulk | Bulk delete, capped at 100 per call. Production real deletes need confirmedByUser. | mutating |
Deferred group: transactions
| Tool | Purpose | |
|---|---|---|
recordTransform | Transform a transaction (e.g. Sales Order → Invoice). | mutating |
transactionVoid | Void a transaction. | mutating |
glImpact | Inspect a transaction's GL impact. |
Deferred group: comms
| Tool | Purpose | |
|---|---|---|
emailSend | Send email. Recipients/subject/body always shown for approval first; external-domain recipients treated as especially sensitive. | mutating |
taskCreate / eventCreate / phoneCallCreate | Create CRM activity records. | mutating |
Deferred group: advanced
Verified live in this account on 2026-08-29 — this is the exact set toolGroupLoad("advanced") returns.
| Tool | Purpose | |
|---|---|---|
recordXml | Load a record's state as XML. | |
pageFetch | Fetch and extract a NetSuite UI page (Suitelets, dashboards, etc.). | |
webFetchBrowser | Fetch a URL from your browser rather than the NetSuite server — for intranet/CORS-restricted resources. | |
fileDelete | Delete a File Cabinet file. | mutating |
folderCreate | Create a File Cabinet folder. | mutating |
fileCopy / fileMove | Duplicate / rename / relocate a file. | mutating |
savedSearchInspect | Describe a saved search's filters/columns without running it. | |
bundleList | List installed SuiteCloud bundles. |
20. Troubleshooting & Limits
Common error codes
| Code | What it means |
|---|---|
AGENT_MASK_BLOCKED | The permission mask (§8) blocked this call. Change the mode via the header shield toggle if you intended it. |
CONFIRMATION_REQUIRED | A production delete needs confirmedByUser: true. See §9. |
PRIVACY_DICT_NOT_READY | Privacy Mode's redaction dictionary isn't built yet (fail-closed by design). Try again shortly, or after the triggering mutation settles. |
SCRIPT_RECORD_RESTRICTED | An attempt to create a script/scriptdeployment record was blocked. This is permanent, by design — see §6. |
NO_KEY_CONFIGURED | No API key stored for the selected provider (or Second Opinion). Add one in Settings. |
MODEL_NOT_ALLOWED | The requested model isn't on the relevant allowlist (Anthropic models, or a Second Opinion reviewer allowlist). |
PROVIDER_NOT_IMPLEMENTED | Currently returned for Google Gemini — the Settings slot exists but the adapter isn't built yet. Pick a different provider. |
MISSING_BASE_URL | The OpenAI-compatible custom provider slot has no base URL configured. |
CONTEXT_TOO_LARGE | A Second Opinion packet exceeded the ~150K token ceiling. Chunk or summarize before retrying. |
RATE_LIMITED | Too many calls in a short window (e.g. Second Opinion's 3/minute cap, or the AI provider's own 429). |
SPEND_CEILING | A Second Opinion dispatch would exceed your configured per-session spend ceiling. |
BATCH_TOO_SMALL / BATCH_TOO_LARGE | subagentRunParallel requires 2–3 dispatches — use subagentRun for one, or split into sequential batches for more than 3. |
STARTER_LIBRARY_MISSING | The starter process library folder wasn't included in this install of Sonar. |
Governance & performance
- Governance units — each tool call draws from a per-request NetSuite governance budget. Bulk operations are capped at 100 records per call by design; large jobs are batched across multiple turns rather than attempted in one unbounded loop.
- TOON encoding — tabular tool results (SuiteQL rows, saved
search results, etc.) are returned in a compact CSV-like format prefixed
TOON[rows=N,cols=...]rather than verbose JSON, to keep large result sets affordable in the model's context. - Truncation — any single result over roughly 10KB is clipped
(head + tail) with a
[... TRUNCATED N bytes ...]marker. When you see this, the right move is a tighter query or filter, not a blind retry. - Conversation compaction — see §3. Once older messages are
summarized, fine-grained detail from early in a long conversation may be lost even
though the gist is preserved; for anything you'll need to reference precisely later,
/exportbefore it happens.
If something looks wrong
- Check
agentHealth(version, active mask, governance remaining) as a first diagnostic. - Check the audit trail (§10) for what actually executed, rather than relying on the conversation's own narrative of what happened.
- If a standard report run fails, Sonar will show you the actual NetSuite error rather than substituting a workaround — that's deliberate; ask for the specific fallback you want rather than expecting an automatic one.