@vibiz/sdk 0.1.0 → 0.2.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/client.d.ts +457 -17
- package/dist/index.js +445 -20
- package/dist/types.d.ts +1347 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -106,6 +106,13 @@ var Vibiz = class {
|
|
|
106
106
|
env: (id) => this.request(`/projects/${id}/env`).then((r) => r.env),
|
|
107
107
|
/** The production env's variable names, without values. Any key. */
|
|
108
108
|
envNames: (id) => this.request(`/projects/${id}/env?names=1`).then((r) => r.names),
|
|
109
|
+
/**
|
|
110
|
+
* The names plus the console links where an owner copies the values
|
|
111
|
+
* (`console_url`) or just the production app key (`app_key_console_url`).
|
|
112
|
+
*/
|
|
113
|
+
envLinks: (id) => this.request(
|
|
114
|
+
`/projects/${id}/env?names=1`
|
|
115
|
+
),
|
|
109
116
|
/**
|
|
110
117
|
* The development environment: its own database branch (schema, no
|
|
111
118
|
* production rows), its own sign-in and AI key. What agents and laptops use.
|
|
@@ -276,11 +283,17 @@ var Vibiz = class {
|
|
|
276
283
|
accounts: (id, opts = {}) => this.request(
|
|
277
284
|
`/projects/${id}/social/accounts${qs({ env: opts.env, kind: opts.kind, platform: opts.platform })}`
|
|
278
285
|
),
|
|
279
|
-
/**
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
})
|
|
286
|
+
/**
|
|
287
|
+
* Production (the default): a link (1 h) for the owner to open, approve and
|
|
288
|
+
* sign in to the platform. Development: the test account, made at once.
|
|
289
|
+
*/
|
|
290
|
+
connect: (id, platform, opts = {}) => this.request(
|
|
291
|
+
`/projects/${id}/social/connect${envQuery(opts.env)}`,
|
|
292
|
+
{
|
|
293
|
+
method: "POST",
|
|
294
|
+
body: { platform, ...opts.ads ? { ads: true } : {} }
|
|
295
|
+
}
|
|
296
|
+
),
|
|
284
297
|
refreshAccounts: (id, env) => this.request(
|
|
285
298
|
`/projects/${id}/social/accounts/refresh${envQuery(env)}`,
|
|
286
299
|
{ method: "POST", body: {} }
|
|
@@ -432,7 +445,22 @@ var Vibiz = class {
|
|
|
432
445
|
simulate: (id, input) => this.request(
|
|
433
446
|
`/projects/${id}/payments/simulate?env=development`,
|
|
434
447
|
{ method: "POST", body: input }
|
|
435
|
-
)
|
|
448
|
+
),
|
|
449
|
+
/**
|
|
450
|
+
* The owner's own Stripe account instead of payments through Vibiz
|
|
451
|
+
* (docs/PAYMENTS.md "Your own account"). `link` makes a link for the
|
|
452
|
+
* owner (any key; production unless `env` says): give them `url`, only
|
|
453
|
+
* they can complete it. `disconnect` (owner only) goes back to Vibiz.
|
|
454
|
+
*/
|
|
455
|
+
ownAccount: {
|
|
456
|
+
link: (id, env = "production") => this.request(`/projects/${id}/payments/own-account/link?env=${env}`, {
|
|
457
|
+
method: "POST",
|
|
458
|
+
body: {}
|
|
459
|
+
}),
|
|
460
|
+
disconnect: (id, env) => this.request(`/projects/${id}/payments/own-account${envQuery(env)}`, {
|
|
461
|
+
method: "DELETE"
|
|
462
|
+
})
|
|
463
|
+
}
|
|
436
464
|
},
|
|
437
465
|
/**
|
|
438
466
|
* Custom connectors (docs/CONNECTORS.md): any HTTP API from one manifest,
|
|
@@ -495,17 +523,32 @@ var Vibiz = class {
|
|
|
495
523
|
{ method: "POST", body: {} }
|
|
496
524
|
)
|
|
497
525
|
},
|
|
498
|
-
/**
|
|
526
|
+
/**
|
|
527
|
+
* The owner's own domains: served by Vibiz hosting (with HTTPS once DNS
|
|
528
|
+
* points at it) or trusted for a host elsewhere. Adding and removing need
|
|
529
|
+
* an owner key; any key reads status and asks for a re-check.
|
|
530
|
+
*/
|
|
499
531
|
domains: {
|
|
500
|
-
list: (id) => this.request(`/projects/${id}/domains`)
|
|
501
|
-
|
|
532
|
+
list: (id) => this.request(`/projects/${id}/domains`),
|
|
533
|
+
/** `hosting` defaults to `vibiz` when the project has Vibiz hosting, else `elsewhere`. */
|
|
534
|
+
add: (id, domain, opts = {}) => this.request(`/projects/${id}/domains`, {
|
|
502
535
|
method: "POST",
|
|
503
|
-
body: { domain }
|
|
504
|
-
})
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
536
|
+
body: { domain, ...opts }
|
|
537
|
+
}),
|
|
538
|
+
/** Check DNS and ownership again now. */
|
|
539
|
+
verify: (id, domain) => this.request(`/projects/${id}/domains/${encodeURIComponent(domain)}/verify`, {
|
|
540
|
+
method: "POST",
|
|
541
|
+
body: {}
|
|
542
|
+
}),
|
|
543
|
+
remove: (id, domain) => this.request(`/projects/${id}/domains/${encodeURIComponent(domain)}`, {
|
|
544
|
+
method: "DELETE"
|
|
545
|
+
}),
|
|
546
|
+
/**
|
|
547
|
+
* Owner keys: buy a domain from the account's credits; it serves on this
|
|
548
|
+
* project once registered. An agent key answers `owner_only` with the
|
|
549
|
+
* console link to hand the owner.
|
|
550
|
+
*/
|
|
551
|
+
buy: (id, input) => this.request(`/projects/${id}/domains/buy`, { method: "POST", body: input })
|
|
509
552
|
},
|
|
510
553
|
/** Poll until every resource is ready, or throw on the first failure. */
|
|
511
554
|
waitUntilReady: async (id, opts = {}) => {
|
|
@@ -534,6 +577,92 @@ var Vibiz = class {
|
|
|
534
577
|
}).then((r) => r.missing),
|
|
535
578
|
upload: (sha, bytes) => this.request(`/files/${sha}`, { method: "PUT", raw: bytes })
|
|
536
579
|
};
|
|
580
|
+
/**
|
|
581
|
+
* A project's Files (docs: files): uploads and every AI-generated image,
|
|
582
|
+
* video and speech, kept permanently with a stable link. `env` defaults to
|
|
583
|
+
* production. (`files` above is the deploy upload cache.)
|
|
584
|
+
*/
|
|
585
|
+
projectFiles = {
|
|
586
|
+
list: (projectId, opts = {}) => this.request(`/projects/${projectId}/files${qs({ ...opts })}`),
|
|
587
|
+
/** The newest file matching the filters (404 `not_found` when none). */
|
|
588
|
+
latest: (projectId, opts = {}) => this.request(`/projects/${projectId}/files/latest${qs({ ...opts })}`),
|
|
589
|
+
get: (projectId, fileId, opts = {}) => this.request(
|
|
590
|
+
`/projects/${projectId}/files/${encodeURIComponent(fileId)}${envQuery(opts.env)}`
|
|
591
|
+
),
|
|
592
|
+
/** Upload bytes (or a Blob) as one file; at most 50 MB. */
|
|
593
|
+
upload: async (projectId, file, opts) => {
|
|
594
|
+
const bytes = file instanceof Uint8Array ? file : new Uint8Array(await file.arrayBuffer());
|
|
595
|
+
const contentType = opts.contentType ?? (file instanceof Blob && file.type ? file.type : "application/octet-stream");
|
|
596
|
+
return this.request(
|
|
597
|
+
`/projects/${projectId}/files${qs({
|
|
598
|
+
env: opts.env,
|
|
599
|
+
name: opts.name,
|
|
600
|
+
folder: opts.folder,
|
|
601
|
+
private: opts.private ? 1 : void 0
|
|
602
|
+
})}`,
|
|
603
|
+
{ method: "POST", raw: bytes, contentType }
|
|
604
|
+
);
|
|
605
|
+
},
|
|
606
|
+
/** Save a file from a public URL (at most 50 MB). */
|
|
607
|
+
import: (projectId, input, opts = {}) => this.request(`/projects/${projectId}/files/import${envQuery(opts.env)}`, {
|
|
608
|
+
method: "POST",
|
|
609
|
+
body: input
|
|
610
|
+
}),
|
|
611
|
+
/** Rename, move to a folder (`null`: none), make private, tag or note. */
|
|
612
|
+
update: (projectId, fileId, patch, opts = {}) => this.request(
|
|
613
|
+
`/projects/${projectId}/files/${encodeURIComponent(fileId)}${envQuery(opts.env)}`,
|
|
614
|
+
{ method: "PATCH", body: patch }
|
|
615
|
+
),
|
|
616
|
+
/** Delete a file: its link stops working. */
|
|
617
|
+
delete: (projectId, fileId, opts = {}) => this.request(
|
|
618
|
+
`/projects/${projectId}/files/${encodeURIComponent(fileId)}${envQuery(opts.env)}`,
|
|
619
|
+
{ method: "DELETE" }
|
|
620
|
+
),
|
|
621
|
+
/** The file's bytes (private files too). */
|
|
622
|
+
download: async (projectId, fileId, opts = {}) => {
|
|
623
|
+
const res = await this.stream(
|
|
624
|
+
`/projects/${projectId}/files/${encodeURIComponent(fileId)}/content${envQuery(opts.env)}`
|
|
625
|
+
);
|
|
626
|
+
return new Uint8Array(await res.arrayBuffer());
|
|
627
|
+
}
|
|
628
|
+
};
|
|
629
|
+
/** Take a project elsewhere, or keep a backup (docs: export). */
|
|
630
|
+
exports = {
|
|
631
|
+
/** Start packing: `202` with the export `queued`. */
|
|
632
|
+
create: (projectId, input = {}) => this.request(`/projects/${projectId}/exports`, {
|
|
633
|
+
method: "POST",
|
|
634
|
+
body: input
|
|
635
|
+
}),
|
|
636
|
+
list: (projectId) => this.request(`/projects/${projectId}/exports`).then((r) => r.data),
|
|
637
|
+
get: (projectId, exportId) => this.request(`/projects/${projectId}/exports/${encodeURIComponent(exportId)}`),
|
|
638
|
+
waitUntilDone: async (projectId, exportId, opts = {}) => {
|
|
639
|
+
const deadline = Date.now() + (opts.timeoutMs ?? 30 * 6e4);
|
|
640
|
+
for (; ; ) {
|
|
641
|
+
const e = await this.exports.get(projectId, exportId);
|
|
642
|
+
opts.onProgress?.(e);
|
|
643
|
+
if (e.status !== "queued" && e.status !== "running") return e;
|
|
644
|
+
if (Date.now() > deadline)
|
|
645
|
+
throw new VibizApiError(408, "timeout", "Timed out waiting for the export.");
|
|
646
|
+
await sleep(opts.intervalMs ?? 2e3);
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
/** One of its files, from its signed link (no key sent). */
|
|
650
|
+
download: async (url) => {
|
|
651
|
+
const res = await this.fetchImpl(url);
|
|
652
|
+
if (!res.ok) return this.fail(res);
|
|
653
|
+
return res;
|
|
654
|
+
},
|
|
655
|
+
/**
|
|
656
|
+
* The environment's secret values as `.env` text. Owner keys only; the
|
|
657
|
+
* call itself is the confirmation, so only make it when the person asked.
|
|
658
|
+
*/
|
|
659
|
+
envFile: async (projectId, exportId) => {
|
|
660
|
+
const res = await this.stream(
|
|
661
|
+
`/projects/${projectId}/exports/${encodeURIComponent(exportId)}/env?confirm=1`
|
|
662
|
+
);
|
|
663
|
+
return res.text();
|
|
664
|
+
}
|
|
665
|
+
};
|
|
537
666
|
deployments = {
|
|
538
667
|
create: (projectId, input, opts = {}) => this.request(
|
|
539
668
|
`/projects/${projectId}/deployments`,
|
|
@@ -609,11 +738,188 @@ var Vibiz = class {
|
|
|
609
738
|
run: (name, input) => this.request(`/actions/${name}`, {
|
|
610
739
|
method: "POST",
|
|
611
740
|
body: { input }
|
|
612
|
-
})
|
|
741
|
+
}),
|
|
742
|
+
/** The web data actions (scrape, crawl, search, ads library…) with their inputs. */
|
|
743
|
+
list: () => this.request("/actions").then((r) => r.data),
|
|
744
|
+
/** Past runs, newest first, and one run with its output. */
|
|
745
|
+
runs: {
|
|
746
|
+
list: (q = {}) => this.request(
|
|
747
|
+
`/actions/runs${qs({ project: q.project, action: q.action, since: q.since, cursor: q.cursor, limit: q.limit })}`
|
|
748
|
+
),
|
|
749
|
+
get: (id) => this.request(`/actions/runs/${encodeURIComponent(id)}`)
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
/**
|
|
753
|
+
* A site's design (docs: design): tokens, component styles, layout,
|
|
754
|
+
* screenshots and exports (Tailwind v4, shadcn/ui, CSS variables, a brief).
|
|
755
|
+
* With `projectId` the spec, brief and screenshots are saved to its Files.
|
|
756
|
+
*/
|
|
757
|
+
design = {
|
|
758
|
+
extract: (input, opts = {}) => opts.projectId ? this.projects.runAction(opts.projectId, "web.design", input) : this.actions.run("web.design", input)
|
|
613
759
|
};
|
|
614
760
|
email = {
|
|
615
761
|
/** Send from the project's address (`info@<slug>.vibiz.app` by default). */
|
|
616
|
-
send: (projectId, input, opts = {}) => this.projects.runAction(projectId, "email.send", input, opts)
|
|
762
|
+
send: (projectId, input, opts = {}) => this.projects.runAction(projectId, "email.send", input, opts),
|
|
763
|
+
/**
|
|
764
|
+
* Business email's settings (docs: email ▸ Broadcasts): the sending address
|
|
765
|
+
* (`news.<slug>`), footer, double opt-in, tracking, signup form, and the
|
|
766
|
+
* owner's monthly allowance for agent-sent mail. `setup` starts the sender.
|
|
767
|
+
*/
|
|
768
|
+
marketing: {
|
|
769
|
+
get: (projectId) => this.request(`${mkt(projectId)}/marketing`),
|
|
770
|
+
update: (projectId, input) => this.request(`${mkt(projectId)}/marketing`, {
|
|
771
|
+
method: "PATCH",
|
|
772
|
+
body: input
|
|
773
|
+
}),
|
|
774
|
+
setup: (projectId) => this.request(`${mkt(projectId)}/marketing/setup`, {
|
|
775
|
+
method: "POST",
|
|
776
|
+
body: {}
|
|
777
|
+
})
|
|
778
|
+
},
|
|
779
|
+
lists: {
|
|
780
|
+
list: (projectId) => this.request(`${mkt(projectId)}/lists`),
|
|
781
|
+
create: (projectId, input) => this.request(`${mkt(projectId)}/lists`, { method: "POST", body: input }),
|
|
782
|
+
update: (projectId, list, input) => this.request(`${mkt(projectId)}/lists/${encodeURIComponent(list)}`, {
|
|
783
|
+
method: "PATCH",
|
|
784
|
+
body: input
|
|
785
|
+
}),
|
|
786
|
+
delete: (projectId, list) => this.request(
|
|
787
|
+
`${mkt(projectId)}/lists/${encodeURIComponent(list)}`,
|
|
788
|
+
{ method: "DELETE" }
|
|
789
|
+
)
|
|
790
|
+
},
|
|
791
|
+
/** Contacts: by id or email. Upserting never re-subscribes someone who left. */
|
|
792
|
+
contacts: {
|
|
793
|
+
list: (projectId, q = {}) => this.request(`${mkt(projectId)}/contacts${qs(q)}`),
|
|
794
|
+
get: (projectId, contact) => this.request(`${mkt(projectId)}/contacts/${encodeURIComponent(contact)}`),
|
|
795
|
+
upsert: (projectId, input) => this.request(`${mkt(projectId)}/contacts`, { method: "POST", body: input }),
|
|
796
|
+
update: (projectId, contact, input) => this.request(`${mkt(projectId)}/contacts/${encodeURIComponent(contact)}`, {
|
|
797
|
+
method: "PATCH",
|
|
798
|
+
body: input
|
|
799
|
+
}),
|
|
800
|
+
delete: (projectId, contact) => this.request(
|
|
801
|
+
`${mkt(projectId)}/contacts/${encodeURIComponent(contact)}`,
|
|
802
|
+
{ method: "DELETE" }
|
|
803
|
+
),
|
|
804
|
+
/** A CSV from any newsletter tool. `dry_run` first: it reports, writes nothing. */
|
|
805
|
+
import: (projectId, input) => this.request(`${mkt(projectId)}/contacts/import`, {
|
|
806
|
+
method: "POST",
|
|
807
|
+
body: input
|
|
808
|
+
}),
|
|
809
|
+
imports: (projectId) => this.request(
|
|
810
|
+
`${mkt(projectId)}/contacts/imports`
|
|
811
|
+
),
|
|
812
|
+
/** Contacts as CSV text. */
|
|
813
|
+
export: async (projectId, q = {}) => {
|
|
814
|
+
const res = await this.stream(`${mkt(projectId)}/contacts/export${qs(q)}`);
|
|
815
|
+
return res.text();
|
|
816
|
+
},
|
|
817
|
+
/** Something the contact did: segments and automations read it. */
|
|
818
|
+
track: (projectId, input) => this.request(`${mkt(projectId)}/events`, { method: "POST", body: input })
|
|
819
|
+
},
|
|
820
|
+
segments: {
|
|
821
|
+
list: (projectId) => this.request(`${mkt(projectId)}/segments`),
|
|
822
|
+
create: (projectId, input) => this.request(`${mkt(projectId)}/segments`, { method: "POST", body: input }),
|
|
823
|
+
update: (projectId, segment, input) => this.request(`${mkt(projectId)}/segments/${encodeURIComponent(segment)}`, {
|
|
824
|
+
method: "PATCH",
|
|
825
|
+
body: input
|
|
826
|
+
}),
|
|
827
|
+
delete: (projectId, segment) => this.request(
|
|
828
|
+
`${mkt(projectId)}/segments/${encodeURIComponent(segment)}`,
|
|
829
|
+
{ method: "DELETE" }
|
|
830
|
+
),
|
|
831
|
+
/** How many subscribed contacts a filter matches, and ten of them. */
|
|
832
|
+
preview: (projectId, filter) => this.request(
|
|
833
|
+
`${mkt(projectId)}/segments/preview`,
|
|
834
|
+
{ method: "POST", body: { filter } }
|
|
835
|
+
)
|
|
836
|
+
},
|
|
837
|
+
/** An email as a contact would get it (a sample contact, or `contact_id`), untracked. */
|
|
838
|
+
render: (projectId, input) => this.request(`${mkt(projectId)}/render`, { method: "POST", body: input }),
|
|
839
|
+
/**
|
|
840
|
+
* Newsletters and announcements. Anyone drafts, reviews and sends tests (an
|
|
841
|
+
* agent's go to the owners); sending is the owner's, or an agent's within the
|
|
842
|
+
* owner's monthly allowance (otherwise `owner_only` with the review link).
|
|
843
|
+
*/
|
|
844
|
+
broadcasts: {
|
|
845
|
+
list: (projectId, q = {}) => this.request(`${mkt(projectId)}/broadcasts${qs(q)}`),
|
|
846
|
+
get: (projectId, id) => this.request(`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}`),
|
|
847
|
+
create: (projectId, input) => this.request(`${mkt(projectId)}/broadcasts`, { method: "POST", body: input }),
|
|
848
|
+
update: (projectId, id, input) => this.request(`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}`, {
|
|
849
|
+
method: "PATCH",
|
|
850
|
+
body: input
|
|
851
|
+
}),
|
|
852
|
+
delete: (projectId, id) => this.request(
|
|
853
|
+
`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}`,
|
|
854
|
+
{ method: "DELETE" }
|
|
855
|
+
),
|
|
856
|
+
/** Everything to fix before sending, the audience, and the cost against the balance. */
|
|
857
|
+
review: (projectId, id) => this.request(
|
|
858
|
+
`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/review`
|
|
859
|
+
),
|
|
860
|
+
/** A free, untracked `[Test]` (default: to the account's owners). */
|
|
861
|
+
test: (projectId, id, input = {}) => this.request(
|
|
862
|
+
`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/test`,
|
|
863
|
+
{
|
|
864
|
+
method: "POST",
|
|
865
|
+
body: input
|
|
866
|
+
}
|
|
867
|
+
),
|
|
868
|
+
/** Now, or at `scheduled_at` (ISO). */
|
|
869
|
+
send: (projectId, id, input = {}) => this.request(`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/send`, {
|
|
870
|
+
method: "POST",
|
|
871
|
+
body: input
|
|
872
|
+
}),
|
|
873
|
+
cancel: (projectId, id) => this.request(`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/cancel`, {
|
|
874
|
+
method: "POST",
|
|
875
|
+
body: {}
|
|
876
|
+
}),
|
|
877
|
+
/** Owner only, after a pause. */
|
|
878
|
+
resume: (projectId, id) => this.request(`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/resume`, {
|
|
879
|
+
method: "POST",
|
|
880
|
+
body: {}
|
|
881
|
+
}),
|
|
882
|
+
/** `status`: a send status, or `opened`, `clicked`, `unsubscribed`; `mailbox`: gmail, outlook… */
|
|
883
|
+
recipients: (projectId, id, q = {}) => this.request(
|
|
884
|
+
`${mkt(projectId)}/broadcasts/${encodeURIComponent(id)}/recipients${qs(q)}`
|
|
885
|
+
)
|
|
886
|
+
},
|
|
887
|
+
/** Onboarding sequences and the like: a trigger, then waits, emails and branches. */
|
|
888
|
+
automations: {
|
|
889
|
+
list: (projectId) => this.request(`${mkt(projectId)}/automations`),
|
|
890
|
+
get: (projectId, id) => this.request(`${mkt(projectId)}/automations/${encodeURIComponent(id)}`),
|
|
891
|
+
create: (projectId, input) => this.request(`${mkt(projectId)}/automations`, { method: "POST", body: input }),
|
|
892
|
+
update: (projectId, id, input) => this.request(`${mkt(projectId)}/automations/${encodeURIComponent(id)}`, {
|
|
893
|
+
method: "PATCH",
|
|
894
|
+
body: input
|
|
895
|
+
}),
|
|
896
|
+
delete: (projectId, id) => this.request(
|
|
897
|
+
`${mkt(projectId)}/automations/${encodeURIComponent(id)}`,
|
|
898
|
+
{ method: "DELETE" }
|
|
899
|
+
),
|
|
900
|
+
activate: (projectId, id) => this.request(
|
|
901
|
+
`${mkt(projectId)}/automations/${encodeURIComponent(id)}/activate`,
|
|
902
|
+
{
|
|
903
|
+
method: "POST",
|
|
904
|
+
body: {}
|
|
905
|
+
}
|
|
906
|
+
),
|
|
907
|
+
pause: (projectId, id) => this.request(`${mkt(projectId)}/automations/${encodeURIComponent(id)}/pause`, {
|
|
908
|
+
method: "POST",
|
|
909
|
+
body: {}
|
|
910
|
+
}),
|
|
911
|
+
enrollments: (projectId, id, q = {}) => this.request(
|
|
912
|
+
`${mkt(projectId)}/automations/${encodeURIComponent(id)}/enrollments${qs(q)}`
|
|
913
|
+
),
|
|
914
|
+
/** One email step as a free `[Test]` (default: to the owners). */
|
|
915
|
+
test: (projectId, id, input) => this.request(
|
|
916
|
+
`${mkt(projectId)}/automations/${encodeURIComponent(id)}/test`,
|
|
917
|
+
{
|
|
918
|
+
method: "POST",
|
|
919
|
+
body: input
|
|
920
|
+
}
|
|
921
|
+
)
|
|
922
|
+
}
|
|
617
923
|
};
|
|
618
924
|
/**
|
|
619
925
|
* The AI gateway: chat, images, speech and transcription, metered against
|
|
@@ -756,6 +1062,126 @@ var Vibiz = class {
|
|
|
756
1062
|
get: (opts = {}) => this.request(`/usage${usageQuery(opts)}`),
|
|
757
1063
|
project: (projectId, opts = {}) => this.request(`/projects/${projectId}/usage${usageQuery(opts)}`)
|
|
758
1064
|
};
|
|
1065
|
+
/**
|
|
1066
|
+
* Buying domains (docs: buying a domain): search and quote with any key;
|
|
1067
|
+
* the domains the account owns, auto-renew, renewals, the transfer code and
|
|
1068
|
+
* the owner details (the registrant, saved once) need an owner key.
|
|
1069
|
+
*/
|
|
1070
|
+
domains = {
|
|
1071
|
+
search: (q, opts = {}) => this.request(`/domains/search${qs({ q, project_id: opts.projectId })}`),
|
|
1072
|
+
quote: (domain, opts = {}) => this.request(
|
|
1073
|
+
`/domains/quote${qs({ domain, years: opts.years, project_id: opts.projectId })}`
|
|
1074
|
+
),
|
|
1075
|
+
list: () => this.request("/domains"),
|
|
1076
|
+
get: (domain) => this.request(`/domains/${encodeURIComponent(domain)}`),
|
|
1077
|
+
update: (domain, input) => this.request(`/domains/${encodeURIComponent(domain)}`, {
|
|
1078
|
+
method: "PATCH",
|
|
1079
|
+
body: input
|
|
1080
|
+
}),
|
|
1081
|
+
renew: (domain, input) => this.request(`/domains/${encodeURIComponent(domain)}/renew`, {
|
|
1082
|
+
method: "POST",
|
|
1083
|
+
body: input
|
|
1084
|
+
}),
|
|
1085
|
+
authCode: (domain) => this.request(`/domains/${encodeURIComponent(domain)}/auth-code`, { method: "POST", body: {} }),
|
|
1086
|
+
owner: () => this.request("/domains/owner"),
|
|
1087
|
+
setOwner: (contact) => this.request("/domains/owner", { method: "PUT", body: { contact } }),
|
|
1088
|
+
/**
|
|
1089
|
+
* Email forwarding (docs: email ▸ Forwarding): `hello@<domain>` → the
|
|
1090
|
+
* owner's inbox, sent "via Vibiz". Anyone reads and verifies; `set` and
|
|
1091
|
+
* `off` need an owner key (an agent gets `owner_only` with a console link
|
|
1092
|
+
* that has its proposal filled in).
|
|
1093
|
+
*/
|
|
1094
|
+
forwarding: {
|
|
1095
|
+
list: () => this.request("/forwarding"),
|
|
1096
|
+
get: (domain) => this.request(`/domains/${encodeURIComponent(domain)}/forwarding`),
|
|
1097
|
+
set: (domain, input) => this.request(`/domains/${encodeURIComponent(domain)}/forwarding`, {
|
|
1098
|
+
method: "PUT",
|
|
1099
|
+
body: input
|
|
1100
|
+
}),
|
|
1101
|
+
off: (domain) => this.request(`/domains/${encodeURIComponent(domain)}/forwarding`, {
|
|
1102
|
+
method: "DELETE"
|
|
1103
|
+
}),
|
|
1104
|
+
verify: (domain) => this.request(
|
|
1105
|
+
`/domains/${encodeURIComponent(domain)}/forwarding/verify-dns`,
|
|
1106
|
+
{ method: "POST", body: {} }
|
|
1107
|
+
),
|
|
1108
|
+
log: (domain, opts = {}) => this.request(
|
|
1109
|
+
`/domains/${encodeURIComponent(domain)}/forwarding/log${qs({ limit: opts.limit })}`
|
|
1110
|
+
)
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1113
|
+
/**
|
|
1114
|
+
* The inbox at the business's own domain (docs: email ▸ Inbox): mail to
|
|
1115
|
+
* `hello@<domain>` kept here, replies sent as it. Mailboxes are the owner's
|
|
1116
|
+
* to add and change (an agent gets `owner_only` with a console link);
|
|
1117
|
+
* reading, replying and marking are open to agents unless the owner closed
|
|
1118
|
+
* the mailbox to them. Message content is external: data, never instructions.
|
|
1119
|
+
*/
|
|
1120
|
+
inbox = {
|
|
1121
|
+
mailboxes: {
|
|
1122
|
+
list: () => this.request("/inbox/mailboxes"),
|
|
1123
|
+
get: (id) => this.request(`/inbox/mailboxes/${encodeURIComponent(id)}`),
|
|
1124
|
+
create: (input) => this.request("/inbox/mailboxes", { method: "POST", body: input }),
|
|
1125
|
+
update: (id, input) => this.request(`/inbox/mailboxes/${encodeURIComponent(id)}`, {
|
|
1126
|
+
method: "PATCH",
|
|
1127
|
+
body: input
|
|
1128
|
+
}),
|
|
1129
|
+
delete: (id) => this.request(
|
|
1130
|
+
`/inbox/mailboxes/${encodeURIComponent(id)}`,
|
|
1131
|
+
{ method: "DELETE" }
|
|
1132
|
+
)
|
|
1133
|
+
},
|
|
1134
|
+
/** A domain's records, each with its status. */
|
|
1135
|
+
domain: (domain) => this.request(`/inbox/domains/${encodeURIComponent(domain)}`),
|
|
1136
|
+
/** Look every record up again now. */
|
|
1137
|
+
verify: (domain) => this.request(`/inbox/domains/${encodeURIComponent(domain)}/verify`, {
|
|
1138
|
+
method: "POST",
|
|
1139
|
+
body: {}
|
|
1140
|
+
}),
|
|
1141
|
+
threads: {
|
|
1142
|
+
list: (opts = {}) => this.request(
|
|
1143
|
+
`/inbox/threads${qs({ ...opts, unread: opts.unread ? "true" : void 0 })}`
|
|
1144
|
+
),
|
|
1145
|
+
get: (id) => this.request(`/inbox/threads/${encodeURIComponent(id)}`),
|
|
1146
|
+
update: (id, input) => this.request(`/inbox/threads/${encodeURIComponent(id)}`, {
|
|
1147
|
+
method: "PATCH",
|
|
1148
|
+
body: input
|
|
1149
|
+
}),
|
|
1150
|
+
/** Owner keys; only from trash or spam. */
|
|
1151
|
+
delete: (id) => this.request(
|
|
1152
|
+
`/inbox/threads/${encodeURIComponent(id)}`,
|
|
1153
|
+
{ method: "DELETE" }
|
|
1154
|
+
),
|
|
1155
|
+
reply: (id, input, opts = {}) => this.request(`/inbox/threads/${encodeURIComponent(id)}/reply`, {
|
|
1156
|
+
method: "POST",
|
|
1157
|
+
body: input,
|
|
1158
|
+
...opts.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}
|
|
1159
|
+
})
|
|
1160
|
+
},
|
|
1161
|
+
messages: {
|
|
1162
|
+
update: (id, input) => this.request(`/inbox/messages/${encodeURIComponent(id)}`, {
|
|
1163
|
+
method: "PATCH",
|
|
1164
|
+
body: input
|
|
1165
|
+
})
|
|
1166
|
+
},
|
|
1167
|
+
/** A new message (or a forward, with `forward_message_id`) from a mailbox. */
|
|
1168
|
+
send: (input, opts = {}) => this.request("/inbox/send", {
|
|
1169
|
+
method: "POST",
|
|
1170
|
+
body: input,
|
|
1171
|
+
...opts.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}
|
|
1172
|
+
}),
|
|
1173
|
+
/** A file to attach (kept a day until sent); returns its id. */
|
|
1174
|
+
upload: (file) => this.request(`/inbox/files${qs({ name: file.filename })}`, {
|
|
1175
|
+
method: "POST",
|
|
1176
|
+
raw: file.bytes,
|
|
1177
|
+
contentType: file.contentType
|
|
1178
|
+
}),
|
|
1179
|
+
settings: {
|
|
1180
|
+
get: () => this.request("/inbox/settings"),
|
|
1181
|
+
/** Owner keys: the new-mail digest. */
|
|
1182
|
+
update: (input) => this.request("/inbox/settings", { method: "PATCH", body: input })
|
|
1183
|
+
}
|
|
1184
|
+
};
|
|
759
1185
|
/**
|
|
760
1186
|
* The account's own credits (docs/BILLING.md): the balance, the card,
|
|
761
1187
|
* auto-recharge and history. A top-up is a hosted page a person pays on.
|
|
@@ -809,9 +1235,7 @@ var Vibiz = class {
|
|
|
809
1235
|
return this.request("/hosts").then((r) => r.data);
|
|
810
1236
|
}
|
|
811
1237
|
capabilities() {
|
|
812
|
-
return this.request(
|
|
813
|
-
"/capabilities"
|
|
814
|
-
);
|
|
1238
|
+
return this.request("/capabilities");
|
|
815
1239
|
}
|
|
816
1240
|
/** The account and key this client acts as. */
|
|
817
1241
|
whoami() {
|
|
@@ -824,6 +1248,7 @@ var Vibiz = class {
|
|
|
824
1248
|
});
|
|
825
1249
|
}
|
|
826
1250
|
};
|
|
1251
|
+
var mkt = (projectId) => `/projects/${encodeURIComponent(projectId)}/email`;
|
|
827
1252
|
var envQuery = (env) => env ? `?env=${env}` : "";
|
|
828
1253
|
var qs = (q) => {
|
|
829
1254
|
const p = new URLSearchParams();
|