const messages = { navigation: { overview: "Overview", accounts: "Accounts", people: "People", opportunities: "Opportunities", lists: "Lists", tasks: "Tasks", proposals: "Proposals", dashboard: "Dashboard", askCrm: "Ask CRM", settings: "Settings", connections: "Connections", collapseSidebar: "Collapse sidebar", expandSidebar: "Expand sidebar", openNavigation: "Open navigation", navigation: "Navigation", navigationDescription: "Navigate CRM records, lists, and shared agent work.", favorites: "Favorites", listsAndViews: "Lists and views", listsEmpty: "No lists or saved views yet", listsLoadFailed: "Lists could not be loaded.", retry: "Retry", search: "Search", }, commandMenu: { placeholder: "Search records, lists, and commands…", groupRecords: "Records", groupLists: "Lists", groupViews: "Saved views", groupGoTo: "Go to", groupCommands: "Commands", groupAppearance: "Appearance", createRecord: "Create record", createList: "Create list", newTask: "New task", openSettings: "Open settings", toggleTheme: "Toggle theme", keyboardShortcuts: "Keyboard shortcuts", recordSearchFailed: "Record search failed.", }, shortcuts: { title: "Keyboard shortcuts", description: "Shortcuts stay quiet while you are typing in a field.", groupNavigation: "Navigation", groupActions: "Actions", groupGeneral: "General", commandMenu: "Open the command menu", focusSearch: "Search", goAccounts: "Go to accounts", goPeople: "Go to people", goOpportunities: "Go to opportunities", goLists: "Go to lists", goTasks: "Go to tasks", newRecord: "New record", newTask: "New task", edit: "Edit the selected record", showHelp: "Show this help", }, settings: { title: "CRM settings", description: "Native SQL keeps CRM-owned records local and portable. HubSpot and Salesforce use workspace Connections; their mirrors store only allow-listed fields, scoped metadata, and bounded evidence references.", }, connection: { tab: "Connection", title: "CRM connection", description: "Where this CRM's records come from, and how much of each record it owns.", modesTitle: "Available modes", modeNative: "Native SQL", modeNativeHelp: "CRM is the system of record. Records live in your database and need no provider connection.", modeConnected: "Connected", modeConnectedHelp: "CRM mirrors an authorized HubSpot or Salesforce connection. Mirrored fields stay owned upstream; anything you author here is local.", modeHybrid: "Hybrid", modeHybridHelp: "A legacy connection-wide setting. Each attribute now declares its own authority, so this mode behaves exactly like Connected.", hybridDeprecated: "Hybrid is no longer offered for new connections. Per-field authority says the same thing more precisely: every field declares whether it is provider-owned, derived locally, or local-authoritative. Existing hybrid connections keep working and read as Connected.", deprecated: "Deprecated", modeUnrecognized: "Unrecognized mode: {{mode}}", modeUnrecognizedHelp: "This build cannot read this connection's mode. Do not assume it behaves like any of the modes above.", mirroredObjects: "Objects: {{objects}}", none: "none", loading: "Loading connections…", loadFailed: "CRM connections could not be loaded.", retry: "Retry", emptyTitle: "No CRM connection yet", emptyDescription: "Start with Native SQL, or connect HubSpot or Salesforce.", openSetup: "Open setup", openWorkspaceConnections: "Workspace connections", }, fields: { tab: "Fields", title: "Fields", description: "The typed attributes behind every record and list. A field's api slug and type are fixed once it is created; everything else can change.", target: "Object or list", targetPlaceholder: "Select an object type or list", listsGroup: "Lists", showArchived: "Show archived", newAttribute: "New field", columnName: "Name", columnSlug: "API slug", columnType: "Type", columnAuthority: "Authority", columnRules: "Rules", columnActions: "Actions", ruleRequired: "Required", ruleUnique: "Unique", ruleHistory: "History", ruleMulti: "Multiple", ruleNone: "—", archived: "Archived", authorityProvider: "Provider-owned", authorityProviderHelp: "HubSpot or Salesforce owns this value. CRM mirrors it; an edit here becomes a proposal you complete upstream.", authorityDerived: "Derived locally", authorityDerivedHelp: "CRM computes this value from data it already holds. It is not edited directly.", authorityLocal: "Local", authorityLocalHelp: "CRM owns this value. Edits are written here immediately and are never sent to a provider.", providerEditNote: "This field is owned upstream. Saving records a proposal with an exact diff; complete the change in HubSpot or Salesforce.", loading: "Loading fields…", emptyTitle: "No fields yet", emptyDescription: "Add a field to start describing this object.", targetsLoadFailed: "Objects and lists could not be loaded.", attributesLoadFailed: "Fields could not be loaded.", retry: "Retry", name: "Name", attributeDescription: "Description", required: "Required", requiredHelp: "A record cannot be saved without a value.", historyTracked: "Track history", historyTrackedHelp: "Keep every previous value with the time and actor that changed it.", uniqueValue: "Unique", multi: "Allow multiple values", options: "Options", optionValuePlaceholder: "Stored value", addOption: "Add option", remove: "Remove", targetDays: "SLA days", celebrate: "Celebrate", colorNone: "No color", slugDerivedHelp: "The api slug is derived from the name and cannot be changed afterwards.", slugImmutable: "Every stored value row is keyed by this slug, so renaming it would orphan the field's history rather than rename anything. Create a new field instead.", typeImmutable: "Stored values live in the column this type chose. Reinterpreting them is a migration, not an edit, so the type cannot change. Create a new field and move the values.", create: "Create field", createTitle: "New field", createDescription: "Add a local field to {{target}}. Authored fields are always local-authoritative.", created: "Field created.", createFailed: "The field could not be created.", editTitle: "Edit field", editDescription: "Rename the field or change how it behaves. The api slug and type are fixed.", editAria: "Edit {{name}}", editOptionsAria: "Edit options for {{name}}", save: "Save", updateFailed: "The field could not be updated.", cancel: "Cancel", archive: "Archive", archiveAria: "Archive {{name}}", archiveTitle: "Archive {{name}}?", archiveDescription: "The field disappears from the grid and pickers. Every stored value and history row it owns is kept, and you can restore it later.", archiveFailed: "The field could not be archived.", restoreAria: "Restore {{name}}", optionsTitle: "{{name}} options", optionsDescription: "Values this field accepts. A value that is not listed here is rejected, never created silently.", optionsStageDescription: "Stages this field accepts, in pipeline order. Give a stage an SLA in days, and mark the stage that should celebrate.", optionsEmpty: "No options yet.", optionValueImmutable: "The stored value is fixed once added because records reference it. To change it, archive the option and add a new one.", optionFailed: "The option could not be saved.", optionTitleAria: "Title for option {{value}}", optionColorAria: "Color for {{name}}", targetDaysAria: "SLA days for {{name}}", celebrateAria: "Celebrate {{name}}", moveOptionUp: "Move {{name}} up", moveOptionDown: "Move {{name}} down", archiveOptionAria: "Archive option {{name}}", archiveOptionTitle: "Archive {{name}}?", archiveOptionDescription: "The option stops appearing in pickers. Records already holding this value keep it untouched.", restoreOptionAria: "Restore option {{name}}", }, lists: { tab: "Lists", eyebrow: "Workspace", title: "Lists", description: "A list is a workflow overlay on one object type. Entries and their values are always local, even on a connected CRM.", newList: "New list", name: "Name", nameLabel: "Name", objectTypeLabel: "Object type", objectType: { accounts: "Accounts", people: "People", opportunities: "Opportunities", }, descriptionLabel: "Description", parentObject: "Object type", parentObjectPlaceholder: "Select an object type", listDescription: "Description", stageSeedNote: "A new list is seeded with a Stage field so entries have somewhere to move.", create: "Create list", createList: "Create list", createTitle: "New list", createDescription: "Lists never change the records they point at.", created: "List created.", createFailed: "The list could not be created.", entryCount: "Entries: {{entries}}", entryCount_one: "{{count}} entry", entryCount_other: "{{count}} entries", loading: "Loading lists…", loadFailed: "Lists could not be loaded.", retry: "Retry", emptyTitle: "No lists yet", emptyDescription: "Create a list to run a pipeline, a campaign, or a review queue over existing records.", cancel: "Cancel", archive: "Archive", archiveAria: "Archive {{name}}", archiveTitle: "Archive {{name}}?", archiveDescription: "The list is hidden. Its entries and the records they point at are kept.", archiveFailed: "The list could not be archived.", }, advanced: { tab: "Advanced", title: "Advanced", description: "Reconfiguration and data-retention behavior.", reconfigure: "Reconfigure CRM", reconfigureHelp: "Switch between Native SQL and a HubSpot or Salesforce companion, or re-run the initial sync.", openSetup: "Open setup", retention: "Nothing is deleted", retentionHelp: "Archiving a field, an option, or a list only hides it. Stored values, history rows, and list entries are always kept.", }, records: { eyebrow: "Workspace", title: "Records", description: "Every account, person, and opportunity you can access, in one typed grid.", kind: { account: "Accounts", person: "People", opportunity: "Opportunities", }, empty: { account: "No accounts yet", person: "No people yet", opportunity: "No opportunities yet", }, }, grid: { errorTitle: "Records could not be loaded", errorDescription: "This page of records could not be read.", emptyDescription: "Nothing matches this view yet.", retry: "Retry", cancel: "Cancel", loadingMore: "Loading more…", searchPlaceholder: "Search records…", selectAllRows: "Select all rows", selectRow: "Select {{name}}", clearSelection: "Clear selection", selectedCount: "Selected: {{count}}", columns: "Columns", configureColumns: "Configure columns", columnOptions: "Options for {{attribute}}", hideColumn: "Hide column", addAttribute: "New field", columnSaveFailed: "The column layout could not be saved.", cellReadOnly: "{{attribute}} cannot be edited here.", saveFailed: "The cell could not be saved.", providerProposalRecorded: "Recorded as a proposal. Complete the change in the connected CRM.", pasteApplied: "Cells updated: {{count}}", pasteSkipped: "Cells skipped because they are read-only: {{count}}", copied: "Copied.", copyFailed: "Nothing could be copied.", bulkEdit: "Edit", bulkAttribute: "Field to edit", bulkChooseAttribute: "Choose a field", bulkValue: "New value", bulkApply: "Apply to selection ({{count}})", bulkApplied: "Records updated: {{count}}", delete: "Delete", deleteTitle: "Delete the selected records?", deleteDescription: "This removes the records you selected ({{count}}) together with their list entries and stored history.", deleteConfirm: "Delete", deleteFailed: "The records could not be deleted.", addToList: "Add to list", addToListTitle: "Add to a list", addToListDescription: "The records you selected ({{count}}) are added as new list entries. The records themselves do not change.", addToListConfirm: "Add", addedToList: "Records added to the list: {{count}}", addToListFailed: "Some records were not added ({{count}}). First reason: {{reason}}", chooseList: "Choose a list", listsFailed: "Lists could not be loaded.", loadingLists: "Loading lists…", noLists: "No lists yet", searchRecords: "Search records…", searchToLink: "Type at least two characters to find a record.", searchFailed: "The record search failed.", searching: "Searching…", noMatches: "No matching records", referenceHint: "{{attribute}} stores a link to another record.", noOptions: "This field has no options yet.", slaOverrun: "Past its stage target by {{days}} days", provenanceOf: "How {{attribute}} was set", provSetBy: "Set by", provSource: "Source", provWhen: "Observed", provConfidence: "Confidence", provReasoning: "Reasoning", provOpenSource: "Open the source", provUnreadable: "CRM stored provenance for this value but cannot read it. Treat the value as unverified.", name: { account: "Account", person: "Person", opportunity: "Opportunity", }, actor: { user: "A person", agent: "The agent", automation: "An automation", provider: "The connected CRM", system: "CRM itself", }, parse: { "not-a-number": "{{attribute}} stores numbers, and {{value}} is not one.", "not-a-date": "{{attribute}} stores dates, and {{value}} is not one.", "unknown-option": "{{attribute}} has no option called {{value}}. Add the option in field settings first.", "read-only": "{{attribute}} cannot be edited here.", }, }, record: { resizePanel: "Resize panel", loadFailedTitle: "This record could not be loaded", loadFailedDescription: "CRM could not read this record. It may be outside the records you can access.", unavailableTitle: "This CRM record is unavailable", unavailableDescription: "It may have been deleted, or it is outside the records you can access.", panelLoadFailed: "The record panel could not be loaded.", saveFailed: "The change could not be saved.", signals: "Signals", mirroredFrom: "Mirrored from {{provider}}", ownedBy: "Owned by {{owner}}", openUpstream: "Open in {{provider}}", upstreamLinkUnavailable: "CRM has no {{provider}} link for this record ({{reason}}).", highlights: "Highlights", allAttributes: "All fields", noAttributes: "No fields yet.", lastSetBy: "Last set by {{actor}}", fieldEmpty: "Empty", yes: "Yes", no: "No", clearValue: "Clear value", multiValueHint: "Separate values with commas", invalidNumber: "That value is not a number we can read.", invalidDate: "That value is not a date we can read.", unknownOption: "This field has no option with that value.", notEditable: "This field cannot be edited here.", viewHistory: "History of {{field}}", historyTitle: "{{field}} history", historyDescription: "Every stored value, the window it was current, and who set it.", historyLoadFailed: "The history could not be loaded.", historyNotTracked: "History is turned off for this field, so only its current value is kept.", historyEmpty: "This value has not changed yet.", historySet: "First set to", historyBy: "{{actor}} · {{when}}", lists: "Lists", listsEmpty: "This record is not on any list.", listsTruncated: "Only the first list memberships are shown. Open the list to see the rest.", listsLoadFailed: "Lists could not be loaded.", entryCount: "Entries: {{count}}", entryOrdinal: "Entry {{index}}", listNoAttributes: "This list has no entry fields yet.", addToList: "Add to list", addedToList: "Added to the list.", addToListFailed: "The record could not be added to that list.", tabActivity: "Activity", tabNotes: "Notes", tabTasks: "Tasks", tabRelated: "Related", activityNotIngestedTitle: "No activity has been ingested", activityNotIngestedDescription: "Activity appears once calls, emails, or meetings are attached to this record.", notesComingSoonTitle: "Notes are coming soon", notesComingSoonDescription: "Notes will sit beside the record and follow the same access scope as its fields.", taskDue: "Due {{when}}", taskDone: "Done", completeTask: "Complete", tasksEmpty: "No follow-up tasks on this record.", relatedEmpty: "No related records yet.", }, board: { loadFailed: "The board could not be loaded.", moveFailed: "The card could not be moved.", retry: "Retry", noStatusAttribute: "This board has no status field to group by. Add one in field settings.", groupedBy: "Grouped by {{attribute}}", overrunSummary: "Past the stage target: {{count}}", partialPage: "Showing the first {{limit}} records.", columnEmpty: "Nothing here yet.", mixedCurrency: "The total is hidden because these records use more than one currency.", withoutAmount: "without an amount: {{count}}", cardAria: "{{name}}, in {{column}}", daysInStage: "{{days}} days in this stage", overBy: "{{overBy}} days over", overrunDetail: "{{days}} days in this stage, {{overBy}} days past the {{targetDays}} day target.", table: { record: "Record", stage: "Stage", owner: "Owner", amount: "Amount", timeInStage: "Time in stage", }, column: { unset: "No stage", unknown: "Unrecognized: {{value}}", archived: "{{title}} (archived)", }, value: { yes: "Yes", no: "No", }, addedBy: { agent: "Added by the agent", automation: "Added by an automation", }, sla: { "no-start-recorded": "No stage start was recorded for this card.", "unreadable-start": "The stored stage start could not be read.", }, }, views: { eyebrow: "Workspace", title: "Saved views", description: "A view stores bounded filters, sorting, and presentation settings — never provider rows.", groupList: "List: {{target}}", groupObject: "Object: {{target}}", dataProgram: "Data program", emptyTitle: "No saved views yet", emptyDescription: "Save a filtered grid or board to return to it later, or to share it with the workspace.", backToViews: "All saved views", newView: "New view", createTitle: "Create saved view", createDescription: "Views store bounded filters and presentation settings, not provider rows.", nameLabel: "Name", descriptionLabel: "Description", recordTypeLabel: "Record type", createView: "Create view", table: "Table", board: "Board", groupBy: "Group by", unsavedChanges: "Unsaved changes", save: "Save", saveForEveryone: "Save for everyone", saveAsNew: "Save as new", saveAsNewTitle: "Save as a new view", saveAsNewDescription: "The current view is left untouched; these filters, columns, and sorting are stored as a new one.", discard: "Discard", savedToast: "View saved.", saveFailedToast: "The view could not be saved.", draftUnreadable: "The unsaved changes on this view could not be read, so the saved version is shown.", resetToSaved: "Reset to the saved view", listNoDefaultView: "This list has no default view yet. Filters and columns you set here are kept only until you save a view.", allLists: "All lists", audience: { personal: "Only you", shared: "Shared", }, missing: { viewTitle: "This saved view is unavailable", viewDescription: "It may have been deleted, or it is outside the views you can access.", listTitle: "This list is unavailable", listDescription: "It may have been archived, or it is outside the lists you can access.", }, }, proposals: { eyebrow: "Review", title: "Proposals", description: "Changes to provider-owned fields. CRM prepares the exact diff and you complete it in HubSpot or Salesforce.", untitledRecord: "Untitled record", openRecord: "Open record", completeUpstream: "Complete in {{provider}}", handedOffNote: "Prepared for {{provider}}. CRM never completes an upstream write — finish the change there.", recordLinkUnavailable: "CRM has no {{provider}} link for this record ({{reason}}).", emptyTitle: "No CRM proposals", emptyDescription: "Edits to provider-owned fields land here with an exact before and after.", prepareChange: "Prepare {{provider}} change", prepareTitle: "Prepare this {{provider}} change?", prepareDescription: "CRM records the exact diff for {{record}} and opens {{provider}} so you can complete it. Nothing is written upstream.", prepareAndOpen: "Prepare and open {{provider}}", prepareWithoutLink: "Prepare the change", cancel: "Cancel", preparedToast: "Prepared for {{provider}}. Complete the change there.", prepareFailedToast: "The change could not be prepared.", fieldPreviewUnavailable: "The field preview is unavailable. Approval remains scoped to this single record.", notMirrored: "Not mirrored", emptyValue: "Empty", booleanTrue: "Yes", booleanFalse: "No", structuredValue: "Structured value", status: { pending: "Pending", prepared: "Prepared", approved: "Approved", rejected: "Rejected", applied: "Applied", }, }, intelligence: { tab: "Intelligence", title: "Intelligence", description: "Choose the moments CRM should notice in bounded call evidence. Smart trackers are evaluated through Ask CRM, never directly in the settings screen.", loading: "Loading trackers…", kindKeyword: "Keyword", kindSmart: "Smart", enable: "Enable", disable: "Disable", toggleTracker: "{{action}} {{name}}", emptyTitle: "No signal trackers yet", emptyDescription: "Add a keyword for deterministic matching or a smart criterion for Ask CRM to review.", trackerDeleted: "Tracker deleted.", trackerEnabled: "Tracker enabled.", trackerDisabled: "Tracker disabled.", trackerUpdateFailed: "Tracker update failed.", trackerCreated: "Tracker created.", trackerCreationFailed: "Tracker creation failed.", newTracker: "New tracker", createTitle: "Create signal tracker", createDescription: "Track deterministic keywords or define a bounded smart criterion for Ask CRM to evaluate against call evidence.", name: "Name", trackerDescription: "Description", detector: "Detector", keywords: "Keywords", keywordsPlaceholder: "pricing, renewal, security review", keywordsHelp: "Separate up to 40 keywords with commas.", classificationCriterion: "Classification criterion", criterionPlaceholder: "Match a clear concern about implementation timing.", creating: "Creating…", create: "Create tracker", deleteTrackerAria: "Delete {{name}}", deleteTrackerTitle: "Delete {{name}}?", deleteTrackerDescription: "This stops future signal runs from using this tracker. Existing reviewed signals stay unchanged.", cancel: "Cancel", deleteTracker: "Delete tracker", keywordsSummary: "Keywords: {{keywords}}", noKeywordsConfigured: "No keywords configured.", evaluatedThroughAsk: "Evaluated through Ask CRM.", }, recordActions: { evidenceAttached: "Call evidence attached.", evidenceAttachFailed: "Evidence could not be attached.", addEvidence: "Add evidence", attachEvidenceTitle: "Attach Clips evidence", attachEvidenceDescription: "Use a durable Clips page link. CRM stores only the artifact reference, page URL, and a bounded excerpt—never media or a transcript.", artifactId: "Artifact ID", clipsUrl: "Clips URL", summary: "Summary", shortExcerpt: "Short excerpt", attachEvidence: "Attach evidence", automate: "Automate", reviewNewClipsCalls: "Review new Clips calls", reviewDescription: "Prepare a review recipe for this CRM record without copying Clips media or transcripts.", disabledAutomationDescription: "This starts disabled and stays tied to {{name}}. Once explicitly activated, each new clip may attach only its access-checked recording-page reference to this record.", handoffDescription: "The handoff keeps only an opaque clip ID, a durable {{path}} page URL, and capture time. It rejects event URLs, media, access tokens, transcripts, inferred records, and provider writes.", manageAutomations: "Manage automations", configureWithAgent: "Configure with agent", editField: "Edit field", editFieldTitle: "Edit CRM field", nativeAuthorityDescription: "This record lives in the local-authoritative Native SQL CRM, so the value is written here immediately.", providerAuthorityDescription: "Decide whether this value belongs to {{provider}} or to CRM. A {{provider}} field is prepared as a proposal you complete upstream.", authority: "Authority", targetProvider: "{{provider}} field", targetLocal: "Local CRM field", fieldName: "Field name", valueType: "Value type", valueTypeText: "Text", valueTypeNumber: "Number", valueTypeBoolean: "Yes or no", newValue: "New value", chooseValue: "Choose a value", booleanTrue: "Yes", booleanFalse: "No", invalidNumber: "Enter a valid number.", localFieldUpdated: "Local field updated.", updateFailed: "The CRM update failed.", saveField: "Save field", prepareChange: "Prepare {{provider}} change", updateLocally: "Update locally", providerHandoffTitle: "Complete this change in {{provider}}", providerHandoffDescription: "CRM recorded the exact change as a proposal. {{provider}} still owns this field, so the edit has to be finished there.", recordLinkUnavailable: "CRM has no {{provider}} link for this record ({{reason}}). Open the record in {{provider}} directly.", reviewLater: "Review later", openInProvider: "Open in {{provider}}", diffField: "Field", diffCurrent: "Current", diffProposed: "Proposed", diffNotMirrored: "Not mirrored", diffEmpty: "Empty", diffStructuredValue: "Structured value", }, dashboard: { metaTitle: "Pipeline · CRM", pipeline: "Pipeline", ready: "Pipeline dashboard is ready.", installFailed: "Pipeline dashboard could not be installed.", loadingDescription: "Loading your access-scoped pipeline dashboard…", emptyDescription: "A live, permission-aware view of opportunity value by stage.", installTitle: "Install the Pipeline dashboard", installDescription: "It creates a CRM-owned data program and a private dashboard for your current workspace.", installAction: "Install Pipeline dashboard", liveDescription: "Live opportunity totals use the current viewer’s CRM access and refresh from a cached data program.", updating: "Updating…", updatePack: "Update pack", }, }; export const crmDashboardMetaTitle = messages.dashboard.metaTitle; export default messages;