@awesomate/sdk 0.45.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -26,7 +26,7 @@
26
26
  * Docs: https://hub.awesomate.ai/docs/sdk/
27
27
  */
28
28
  /** This package's version, sent to the hub with every server call. */
29
- export declare const VERSION = "0.45.0";
29
+ export declare const VERSION = "0.51.0";
30
30
  /** Augmented by the generated awesomate.d.ts, so each kind's rows are typed. */
31
31
  export interface Kinds {
32
32
  }
@@ -496,11 +496,21 @@ export interface TaskRecord {
496
496
  handoffs: number;
497
497
  };
498
498
  }
499
- /** A task to give: to someone on the account by email, or to the owner when `forEmail` is left out. */
499
+ /**
500
+ * A task to give: to someone on the account by email, to a role on the business map by its key, or
501
+ * to the owner when both are left out. Send `forEmail` or `role`, never both.
502
+ */
500
503
  export interface GiveTask {
501
504
  title: string;
502
505
  detail?: string;
503
506
  forEmail?: string;
507
+ /**
508
+ * A role on the business map, by its key (`slug` in `businessMap()`'s roles), instead of a person.
509
+ * Everyone in the role sees it until one of them takes it; a role with nobody in it who can act
510
+ * sends it to the owner. A role not on the map is refused (`serverCode: 'unknown_role'`, with the
511
+ * map's roles in the error's `roles`). Needs the business map (`business_map`).
512
+ */
513
+ role?: string;
504
514
  /** ISO time it is due. */
505
515
  dueAt?: string;
506
516
  /** A hub path the task points at, e.g. /contacts/people/... */
@@ -513,6 +523,23 @@ export interface GiveTask {
513
523
  */
514
524
  urgent?: boolean;
515
525
  }
526
+ /** What `db.tasks.give()` answers. */
527
+ export interface GivenTask {
528
+ key: string;
529
+ id: number;
530
+ /** Who has it now: null only for a role's task still waiting for someone in the role to take it. */
531
+ holder: TaskPerson | null;
532
+ /** Whether the person it went to was emailed (the role's responsible person, for a role's task). */
533
+ emailed: boolean;
534
+ urgent: boolean;
535
+ /** Set when it was given to a role: `queued` while it waits in the role, false when the role had nobody and it went to the owner. */
536
+ role?: {
537
+ slug: string;
538
+ title: string;
539
+ queued: boolean;
540
+ };
541
+ note?: string;
542
+ }
516
543
  /** A file or folder in the account's Files (the folders on its automation account: public/, private/, temp/). */
517
544
  export interface FileEntry {
518
545
  /** Relative to the files folder, starting with its top folder: public/images/logo.png. */
@@ -599,6 +626,11 @@ export interface AwesomateErrorDetails {
599
626
  * unavailable when the hub said (serverCode crm_maintenance: the account's Contacts is being moved).
600
627
  */
601
628
  retryAfter?: number;
629
+ /** With unknown_role (giving a task to a role not on the business map): the map's roles, by key and name. */
630
+ roles?: Array<{
631
+ slug: string;
632
+ title: string;
633
+ }>;
602
634
  }
603
635
  /**
604
636
  * Every failure from the hub. `message` is for you, the developer; `personMessage`, when the hub
@@ -636,6 +668,11 @@ export declare class AwesomateError extends Error {
636
668
  * being moved). Wait at least that long, then try once more; retrying at once only meets the same answer.
637
669
  */
638
670
  readonly retryAfter?: number;
671
+ /** With serverCode unknown_role (`tasks.give({ role })` naming a role not on the business map): the map's roles, by key and name. */
672
+ readonly roles?: Array<{
673
+ slug: string;
674
+ title: string;
675
+ }>;
639
676
  constructor(
640
677
  /** Why it failed. */
641
678
  code: ErrorCode, message: string,
@@ -796,14 +833,7 @@ export declare class AwesomateClient {
796
833
  * straight away). `urgent` in the result says whether it went as urgent: a person's sixth urgent
797
834
  * task in a day goes as an ordinary one, and `note` says so. hosting:manage.
798
835
  */
799
- give: (task: GiveTask) => Promise<{
800
- key: string;
801
- id: number;
802
- holder: TaskPerson;
803
- emailed: boolean;
804
- urgent: boolean;
805
- note?: string;
806
- }>;
836
+ give: (task: GiveTask) => Promise<GivenTask>;
807
837
  /**
808
838
  * Change a given task: whoever wrote it, or the owner. `urgent: false` takes urgent off; a task can
809
839
  * only be marked urgent when it is given. hosting:manage.
@@ -1099,6 +1129,14 @@ export declare class AwesomateClient {
1099
1129
  list?: string;
1100
1130
  askedAt?: Date | string;
1101
1131
  }) => Promise<ContactUnsubscribeResult>;
1132
+ /**
1133
+ * Prepare an erasure, for when someone asks for their details to be deleted. Answers what
1134
+ * erasing the person would take (`counts`) and `finishInHub`, the hub link where an Owner of the
1135
+ * business finishes it, signed in as themselves, by typing the person's email address. Nothing
1136
+ * is erased here: no token can erase anyone, because an erasure can't be undone. Only an Owner's
1137
+ * token may prepare one (403 `owner_only`). Null when there is no such person.
1138
+ */
1139
+ erasurePreview: (id: string) => Promise<ContactErasurePreview | null>;
1102
1140
  /**
1103
1141
  * Add a contact field. The hub makes its key from the label with a random part and answers it:
1104
1142
  * use that key. Nothing here changes a field that exists. `ai_may_read` decides, once and now,
@@ -1367,6 +1405,26 @@ export declare class AwesomateClient {
1367
1405
  * the business map on the account.
1368
1406
  */
1369
1407
  businessMapRole(slug: string): Promise<BusinessMapRoleDetail>;
1408
+ /**
1409
+ * The business's KPIs: each a number with a target and someone responsible for it, with where it
1410
+ * sits, who answers for it, its light against the target for the last complete period, the period
1411
+ * so far, a trend of up to 12 periods and where its figure comes from. A person's own key reads only the KPIs
1412
+ * they would see in the hub. `period` reads every KPI by the week, month or quarter (never finer than
1413
+ * its own period); left out, each by its own. hosting:read, every plan; `available` is false, with a
1414
+ * `reason`, where the account has no KPIs to read.
1415
+ */
1416
+ businessKpis(opts?: {
1417
+ period?: 'week' | 'month' | 'quarter';
1418
+ }): Promise<BusinessKpis>;
1419
+ /**
1420
+ * Add figures for the business's KPIs from your own tool or script: totals per day, week or month,
1421
+ * into the business's own Your numbers, where a KPI reads them by name. Up to 100 a call; a figure
1422
+ * sent again for the same period replaces the one before. Each figure name belongs to the first
1423
+ * source that sends it (`serverCode: 'figure_owned'` for another). Totals only: a label that looks
1424
+ * like an email address, phone number or web address is refused. knowledge:write, Support Plus and
1425
+ * above (`feature_unavailable` below that), and Your numbers switched on for the business.
1426
+ */
1427
+ addFigures(input: AddFigures): Promise<FiguresAdded>;
1370
1428
  /**
1371
1429
  * The business map in its first shape, where a department is a `division`, a sub-department a
1372
1430
  * `department` and a role a `job`. hosting:read, the business map on the account.
@@ -1726,6 +1784,154 @@ export interface BusinessMapDepartment {
1726
1784
  name: string;
1727
1785
  }>;
1728
1786
  }
1787
+ /**
1788
+ * A KPI's light. Say its word beside any colour: Act now, Watch, On track, Late, Not a KPI yet.
1789
+ * `not_due` is no light at all: the KPI is new and its first figure is not due yet, so it is never Late
1790
+ * before then; `lightWord` says when ("First figure due Mon 19 Oct") and `firstDue` what brings it.
1791
+ */
1792
+ export type KpiLight = 'act_now' | 'watch' | 'on_track' | 'late' | 'no_target' | 'not_due';
1793
+ /** One period of a KPI's figures: first and last day (YYYY-MM-DD), a short label, its figure and target. */
1794
+ export interface KpiPeriodFigure {
1795
+ from: string;
1796
+ to: string;
1797
+ label: string;
1798
+ /** null: no figure for that period. */
1799
+ figure: number | null;
1800
+ target: number | null;
1801
+ }
1802
+ /** One KPI, as businessKpis() returns it. */
1803
+ export interface BusinessKpi {
1804
+ id: string;
1805
+ /** The hub's own KPIs only: fixed when it is added. */
1806
+ slug?: string;
1807
+ name: string;
1808
+ /** false: it points at a place the map no longer has. */
1809
+ onMap: boolean;
1810
+ place: {
1811
+ level: 'department' | 'sub_department' | 'role' | null;
1812
+ department: number | null;
1813
+ subDepartment: number | null;
1814
+ role: string | null;
1815
+ roleTitle: string | null;
1816
+ };
1817
+ /** Who answers for it now; forNow: nobody holds it, so it falls to whoever runs the department. */
1818
+ responsible: {
1819
+ name: string;
1820
+ forNow: boolean;
1821
+ } | null;
1822
+ light: KpiLight;
1823
+ lightWord: string;
1824
+ /** The judged period's figure and target (the last complete period). */
1825
+ figure: number | null;
1826
+ target: number | null;
1827
+ period: {
1828
+ from: string;
1829
+ to: string;
1830
+ } | null;
1831
+ kind: 'lead' | 'result' | null;
1832
+ critical: boolean;
1833
+ format: string | null;
1834
+ /** The rest is on the hub's own KPIs, not on those kept in Reports. */
1835
+ frequency?: 'daily' | 'weekly' | 'monthly';
1836
+ direction?: 'up' | 'down';
1837
+ aggregation?: 'sum' | 'mean' | 'last';
1838
+ /** The target per its own period, as typed: 40 for "40 a week". null: not a KPI yet. */
1839
+ targetPerPeriod?: number | null;
1840
+ targetWords?: string | null;
1841
+ watchPct?: number;
1842
+ source?: 'contacts' | 'collected' | 'entered' | 'other';
1843
+ /** "Entered weekly by Dave, from a task". */
1844
+ sourceLine?: string;
1845
+ sharedEveryone?: boolean;
1846
+ /** Why the reader sees it, in words. */
1847
+ because?: string[];
1848
+ /** The period so far: its figure and the target to date. Never lit. */
1849
+ soFar?: {
1850
+ period: {
1851
+ start: string;
1852
+ end: string;
1853
+ };
1854
+ value: number | null;
1855
+ targetToDate: number | null;
1856
+ };
1857
+ /** Up to 12 complete periods before this one, oldest first, starting where tracking began: shorter, or empty, for a new KPI. */
1858
+ trend?: KpiPeriodFigure[];
1859
+ /** "No figure since 6 Oct", "No figure yet", or null. */
1860
+ figureNote?: string | null;
1861
+ /** Set when the light is Late: since when, and what it needs in a sentence. */
1862
+ late?: {
1863
+ since: string | null;
1864
+ needs: string;
1865
+ task: null;
1866
+ } | null;
1867
+ /** Before last period's figure is due: when it is due. */
1868
+ dueNote?: string | null;
1869
+ /**
1870
+ * Set while the light is `not_due`: the day its first figure is due (YYYY-MM-DD), the words to show
1871
+ * ("First figure due Mon 19 Oct"), and what brings the figure ("No figure yet. Dave enters it each week,
1872
+ * from a task."). `arrived`: a figure for its first period is in already (entered before that period
1873
+ * ended), so `day` is the day it lights up, `words` read "Lights up Mon 19 Oct" and `note` says so.
1874
+ */
1875
+ firstDue?: {
1876
+ day: string;
1877
+ words: string;
1878
+ note: string;
1879
+ arrived: boolean;
1880
+ } | null;
1881
+ }
1882
+ /** One figure for addFigures(): a total for a period, under a named figure a KPI can read. */
1883
+ export interface Figure {
1884
+ /** The named figure, two to four dotted parts in lower case: `xero.cash_received`. */
1885
+ key: string;
1886
+ /** Its name for people, when the key's last part does not say it well. */
1887
+ label?: string;
1888
+ unit: 'count' | 'money' | 'quantity';
1889
+ /** With money: a three-letter code, `AUD`. */
1890
+ currency?: string;
1891
+ /** How periods combine into a longer one: `sum` (the default), `mean`, or `last` for a balance or a rating. */
1892
+ aggregation?: 'sum' | 'mean' | 'last';
1893
+ grain: 'day' | 'week' | 'month';
1894
+ /** Any date in the period (`2026-10-08`), or an ISO time, read in the business's own time zone. Weeks start Monday. */
1895
+ period: string;
1896
+ value: number;
1897
+ }
1898
+ /** What addFigures() sends: where the figures come from, and the figures. */
1899
+ export interface AddFigures {
1900
+ /** The tool or script the figures come from, in a few plain words: `Xero`. */
1901
+ source: {
1902
+ name: string;
1903
+ };
1904
+ figures: Figure[];
1905
+ }
1906
+ /** What addFigures() answers: how many were added, and the Your numbers tables they went to. */
1907
+ export interface FiguresAdded {
1908
+ added: number;
1909
+ source: {
1910
+ name: string;
1911
+ slug: string;
1912
+ };
1913
+ /** One table per source and grain, `collected-<source>-<grain>`. */
1914
+ tables: Array<{
1915
+ slug: string;
1916
+ grain: 'day' | 'week' | 'month';
1917
+ figures: number;
1918
+ periods: number;
1919
+ }>;
1920
+ }
1921
+ /** The business's KPIs, as businessKpis() returns them. */
1922
+ export type BusinessKpis = {
1923
+ available: false;
1924
+ reason: 'not_connected' | 'no_reports' | 'unreadable';
1925
+ } | {
1926
+ available: true;
1927
+ /** Where they are kept: the hub's own until the account links Reports, then Reports'. */
1928
+ store: 'hub' | 'buddzee';
1929
+ truncated: boolean;
1930
+ period?: 'week' | 'month' | 'quarter' | null;
1931
+ /** The hub's own: whether figures could be read from Your numbers. */
1932
+ figures?: 'ok' | 'off' | 'no_workspace' | 'not_configured' | 'unreadable';
1933
+ kpis: BusinessKpi[];
1934
+ };
1729
1935
  /** The business map, as businessMap() returns it. No email addresses. */
1730
1936
  export interface BusinessMap {
1731
1937
  version: 2;
@@ -2622,6 +2828,81 @@ export interface ContactUnsubscribeResult {
2622
2828
  /** When they asked, ISO 8601. */
2623
2829
  asked_at: string;
2624
2830
  }
2831
+ /** What erasing a person would take, from contacts.erasurePreview(): counts only, never values. */
2832
+ export interface ContactErasureCounts {
2833
+ /** Their email addresses and phone numbers. */
2834
+ email_addresses: number;
2835
+ phone_numbers: number;
2836
+ /** Of their numbers, those someone else also holds: texts to them stop for that person too. */
2837
+ phone_numbers_shared: number;
2838
+ /** Details on their page with a value: name, company, phone, time zone and the owner's fields. */
2839
+ fields: number;
2840
+ tags: number;
2841
+ /** Email lists they are on. */
2842
+ lists: number;
2843
+ /** Their consent records with an IP address or browser: the records stay as proof, those details go. */
2844
+ consent_ip_details: number;
2845
+ /** Emails sent to them, and their opens and clicks. */
2846
+ emails_sent: number;
2847
+ opens_and_clicks: number;
2848
+ series_runs: number;
2849
+ /** Calls with them, and calls from their numbers that named nobody (a shared line's among them). */
2850
+ calls: number;
2851
+ calls_shared_number: number;
2852
+ /** What the agent remembered about them (0 or 1). */
2853
+ call_memory: number;
2854
+ /** Bookings: the answers they gave go, the times stay. */
2855
+ bookings: number;
2856
+ /** Support tickets that are theirs, and how each was found (a ticket can be found more than one way). */
2857
+ tickets: number;
2858
+ tickets_by_link: number;
2859
+ tickets_by_email: number;
2860
+ tickets_by_number: number;
2861
+ /** Someone else's tickets that carry their address or number: only that comes off. */
2862
+ tickets_of_someone_else: number;
2863
+ /** Tickets from a number someone else also holds: left alone. */
2864
+ tickets_shared_number: number;
2865
+ /** Their tickets that someone else raised: that person's own address, number and name stay. */
2866
+ tickets_customer_kept: number;
2867
+ /** Messages they wrote, their attachments, emails from them held as suspect, and stored raw copies. */
2868
+ messages: number;
2869
+ /** Customers' messages on their tickets that are someone else's, or that can't be told to be theirs: they stay. */
2870
+ messages_not_theirs: number;
2871
+ attachments: number;
2872
+ quarantined_emails: number;
2873
+ raw_emails: number;
2874
+ /** Stored emails also filed on someone else's record: kept for it. */
2875
+ raw_emails_shared: number;
2876
+ /** Other records linked to them, by kind; the links end and the records keep their own fields. */
2877
+ linked_records: Array<{
2878
+ kind: string;
2879
+ label: string;
2880
+ records: number;
2881
+ required: number;
2882
+ }>;
2883
+ /** Of those, records that must have a person and will need a new one before their next change. */
2884
+ linked_required: number;
2885
+ /** Their sign-in to the account's apps, and sign-in links sent to them. */
2886
+ app_sign_ins: number;
2887
+ /** Other sign-in addresses linked to them, blocked with theirs. */
2888
+ app_addresses_blocked: number;
2889
+ sign_in_links: number;
2890
+ /** Their rows in past imports. */
2891
+ import_rows: number;
2892
+ }
2893
+ /** What contacts.erasurePreview() answers. Nothing has been erased. */
2894
+ export interface ContactErasurePreview {
2895
+ /** The person's id, and whether they were removed from Contacts. Never their name or address: the Owner sees who it is in the hub. */
2896
+ contact: {
2897
+ id: string;
2898
+ removed: boolean;
2899
+ };
2900
+ counts: ContactErasureCounts;
2901
+ /** Where an Owner finishes it in the hub, signed in as themselves. Null when it can't be finished there on this account yet: pass on `note`. */
2902
+ finishInHub: string | null;
2903
+ /** What happens next, in a sentence to pass on. */
2904
+ note: string;
2905
+ }
2625
2906
  /** The kinds of contact field contacts.createField() makes. */
2626
2907
  export type ContactFieldType = 'text' | 'long_text' | 'number' | 'money' | 'date' | 'yes_no' | 'choice' | 'choices';
2627
2908
  /** What contacts.createField() takes. */
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@
26
26
  * Docs: https://hub.awesomate.ai/docs/sdk/
27
27
  */
28
28
  /** This package's version, sent to the hub with every server call. */
29
- export const VERSION = '0.45.0';
29
+ export const VERSION = '0.51.0';
30
30
  const DEFAULT_BASE = 'https://hub.awesomate.ai';
31
31
  /** Every record and contact id is a UUID; anything else can name no row. */
32
32
  const RECORD_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -62,6 +62,8 @@ export class AwesomateError extends Error {
62
62
  * being moved). Wait at least that long, then try once more; retrying at once only meets the same answer.
63
63
  */
64
64
  retryAfter;
65
+ /** With serverCode unknown_role (`tasks.give({ role })` naming a role not on the business map): the map's roles, by key and name. */
66
+ roles;
65
67
  constructor(
66
68
  /** Why it failed. */
67
69
  code, message,
@@ -94,6 +96,8 @@ export class AwesomateError extends Error {
94
96
  this.requiredPlan = details.requiredPlan;
95
97
  if (details.retryAfter !== undefined)
96
98
  this.retryAfter = details.retryAfter;
99
+ if (details.roles !== undefined)
100
+ this.roles = details.roles;
97
101
  }
98
102
  }
99
103
  /** Every code the hub uses for "the account has switched this off in its privacy settings". */
@@ -153,6 +157,12 @@ function refusal(status, json) {
153
157
  ?? (Array.isArray(json.requiredPlans) ? nonEmpty(json.requiredPlans[0]) : undefined);
154
158
  if (required)
155
159
  details.requiredPlan = required;
160
+ if (Array.isArray(json.roles)) {
161
+ details.roles = json.roles
162
+ .filter((r) => Boolean(r) && typeof r === 'object')
163
+ .map((r) => ({ slug: String(r.slug ?? ''), title: String(r.title ?? '') }))
164
+ .filter((r) => r.slug !== '');
165
+ }
156
166
  return {
157
167
  code: errorCode(status, serverCode, json),
158
168
  message: (codeInError ? sentence : error ?? sentence) ?? `The hub answered ${status}.`,
@@ -440,7 +450,7 @@ export class AwesomateClient {
440
450
  */
441
451
  give: async (task) => {
442
452
  const r = await this.tasksCall('POST', '/api/my-tasks/tasks', task);
443
- return { key: r.key, id: r.id, holder: r.holder, emailed: r.emailed, urgent: r.urgent === true, ...(r.note ? { note: r.note } : {}) };
453
+ return { key: r.key, id: r.id, holder: r.holder, emailed: r.emailed, urgent: r.urgent === true, ...(r.role ? { role: r.role } : {}), ...(r.note ? { note: r.note } : {}) };
444
454
  },
445
455
  /**
446
456
  * Change a given task: whoever wrote it, or the owner. `urgent: false` takes urgent off; a task can
@@ -818,6 +828,23 @@ export class AwesomateClient {
818
828
  how: options.how, ...(options.list !== undefined ? { list: options.list } : {}), ...(askedAt !== undefined ? { asked_at: askedAt } : {}),
819
829
  });
820
830
  },
831
+ /**
832
+ * Prepare an erasure, for when someone asks for their details to be deleted. Answers what
833
+ * erasing the person would take (`counts`) and `finishInHub`, the hub link where an Owner of the
834
+ * business finishes it, signed in as themselves, by typing the person's email address. Nothing
835
+ * is erased here: no token can erase anyone, because an erasure can't be undone. Only an Owner's
836
+ * token may prepare one (403 `owner_only`). Null when there is no such person.
837
+ */
838
+ erasurePreview: async (id) => {
839
+ if (this.appKey)
840
+ throw contactsNeedAccount();
841
+ if (!RECORD_ID.test(String(id)))
842
+ return null;
843
+ const r = await nullIfMissing(this.request('GET', `/api/my-crm/v1/contacts/${encodeURIComponent(String(id))}/erasure`));
844
+ if (!r)
845
+ return null;
846
+ return { contact: r.contact, counts: r.counts, finishInHub: r.finish_in_hub, note: r.note };
847
+ },
821
848
  /**
822
849
  * Add a contact field. The hub makes its key from the label with a random part and answers it:
823
850
  * use that key. Nothing here changes a field that exists. `ai_may_read` decides, once and now,
@@ -1231,6 +1258,29 @@ export class AwesomateClient {
1231
1258
  async businessMapRole(slug) {
1232
1259
  return (await this.request('GET', `/api/my-business/v2/map/roles/${encodeURIComponent(slug)}`)).role;
1233
1260
  }
1261
+ /**
1262
+ * The business's KPIs: each a number with a target and someone responsible for it, with where it
1263
+ * sits, who answers for it, its light against the target for the last complete period, the period
1264
+ * so far, a trend of up to 12 periods and where its figure comes from. A person's own key reads only the KPIs
1265
+ * they would see in the hub. `period` reads every KPI by the week, month or quarter (never finer than
1266
+ * its own period); left out, each by its own. hosting:read, every plan; `available` is false, with a
1267
+ * `reason`, where the account has no KPIs to read.
1268
+ */
1269
+ async businessKpis(opts = {}) {
1270
+ return this.request('GET', `/api/my-business/v2/map/kpis${opts.period ? `?period=${opts.period}` : ''}`);
1271
+ }
1272
+ /**
1273
+ * Add figures for the business's KPIs from your own tool or script: totals per day, week or month,
1274
+ * into the business's own Your numbers, where a KPI reads them by name. Up to 100 a call; a figure
1275
+ * sent again for the same period replaces the one before. Each figure name belongs to the first
1276
+ * source that sends it (`serverCode: 'figure_owned'` for another). Totals only: a label that looks
1277
+ * like an email address, phone number or web address is refused. knowledge:write, Support Plus and
1278
+ * above (`feature_unavailable` below that), and Your numbers switched on for the business.
1279
+ */
1280
+ async addFigures(input) {
1281
+ const r = await this.request('POST', '/api/my-business/v2/figures', input);
1282
+ return { added: r.added, source: r.source, tables: r.tables };
1283
+ }
1234
1284
  /**
1235
1285
  * The business map in its first shape, where a department is a `division`, a sub-department a
1236
1286
  * `department` and a role a `job`. hosting:read, the business map on the account.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awesomate/sdk",
3
- "version": "0.45.0",
3
+ "version": "0.51.0",
4
4
  "description": "Your own Awesomate data from Node and the browser: query contacts and app data with generated types, and sign your app's own users in",
5
5
  "license": "MIT",
6
6
  "type": "module",