@semics-tech/emdash-esign-pro 0.0.0-stage → 1.0.0-rc.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/LICENSE ADDED
@@ -0,0 +1,98 @@
1
+ semics Pro plugins for EmDash: commercial licence
2
+ Version 1.0 (draft)
3
+
4
+ Copyright (c) 2026 SEMICS LTD. All rights reserved.
5
+
6
+ [Draft written in plain English by the build agents, not by a lawyer. It needs the lawyer's review before
7
+ launch (docs/legal/brief.md §13, question 17). BUILD-PLAN D6 and R90.]
8
+
9
+ 1. Who this licence is between
10
+
11
+ This licence is between SEMICS LTD (company number 12871299), registered in England and Wales, registered
12
+ office Slowley Hall, Tamworth Road, Coventry, CV7 8EB ("we", "us"), and the person or organisation that
13
+ bought the licence ("you"). Contact: support@semics.co.uk.
14
+
15
+ It covers the semics Pro plugin packages for EmDash (@semics-tech/emdash-events-pro and
16
+ @semics-tech/emdash-esign-pro), with their documentation and updates ("the Software"). You buy a licence
17
+ through our online reseller Paddle.com, which is the Merchant of Record; our terms of sale at
18
+ https://plugins.semics.co.uk/terms also apply.
19
+
20
+ 2. The licence key and the Update Term
21
+
22
+ When you buy or renew, you receive a licence key for your plan. The key names the production hostnames it
23
+ covers and the products it unlocks: one production hostname for Events Pro, E-sign Pro and Suite Pro, or
24
+ up to 10 production hostnames for Agency. Each production hostname needs its own place in a key.
25
+
26
+ The "Update Term" is one year from the date you pay. Each renewal adds another year.
27
+
28
+ 3. What you may do
29
+
30
+ We grant you a non-exclusive, non-transferable licence to:
31
+
32
+ (a) install and run the Software on the production hostnames your key covers;
33
+ (b) install and run it without a key, in any number, on local and preview hosts used for development and
34
+ testing: localhost, 127.0.0.1, [::1], *.localhost, *.workers.dev and *.pages.dev;
35
+ (c) make the copies you need for those installs, for backups and for your build and deployment pipeline;
36
+ (d) modify the Software for your own use on the hostnames this licence covers, for example to fix a bug or
37
+ fit it to your site; and
38
+ (e) let your staff and contractors do these things for you, as long as they follow this licence.
39
+
40
+ An agency may install the Software for its clients on the hostnames its key covers. The licence stays with
41
+ the buyer unless we agree in writing to move it.
42
+
43
+ 4. Updates, and the versions you keep
44
+
45
+ During the Update Term you may install every version of the Software we release, and you get email
46
+ support.
47
+
48
+ Your right to use each version released during the Update Term is perpetual: it does not end when the
49
+ Update Term ends, when you cancel, or when you stop renewing. A version released after your Update Term
50
+ ends needs a renewed key; the key you already have does not unlock it.
51
+
52
+ The key is checked offline on your site. We cannot switch it off remotely, and your site never needs to
53
+ contact us for the Software to keep working.
54
+
55
+ 5. What you must not do
56
+
57
+ You must not:
58
+
59
+ (a) sell, rent, lend, sublicense, redistribute or publish the Software or a modified version of it, or
60
+ offer it to others as a product, plugin or hosted service of its own;
61
+ (b) share your licence key, or use it on hostnames it does not cover;
62
+ (c) remove, disable or get around the licence check, or help anyone else do so; or
63
+ (d) remove copyright or licence notices.
64
+
65
+ Nothing here stops you doing what the law allows you to do whatever a contract says, such as making a
66
+ back-up copy or decompiling for interoperability where the law permits it.
67
+
68
+ 6. Your data and the free plugins
69
+
70
+ The Software stores its data in your own site. Your data stays yours: when your licence ends, or you go
71
+ back to the free plugins, nothing is deleted or locked, and you can export it.
72
+
73
+ The free plugins (Events and E-sign) are open source under the MIT licence. The parts of this package that
74
+ come from them remain available to you under MIT; this licence covers the Pro additions.
75
+
76
+ 7. Refunds and ending this licence
77
+
78
+ You may have a full refund within 14 days of a purchase or renewal, for any reason (see
79
+ https://plugins.semics.co.uk/refunds). After a refund we issue no new keys, updates or support for that
80
+ licence, and you should remove the key from your site.
81
+
82
+ If you seriously break section 5 and do not put it right within 30 days of our written notice, we may end
83
+ this licence. You must then stop using the Software and delete your copies.
84
+
85
+ Sections 4 (except after we end this licence under this section), 5, 6, 8 and 9 continue after this
86
+ licence ends.
87
+
88
+ 8. Our responsibility
89
+
90
+ Our responsibility for the Software, and the limits on it, are set out in our terms of sale at
91
+ https://plugins.semics.co.uk/terms. If you are a consumer, nothing in this licence affects your legal
92
+ rights.
93
+
94
+ 9. Law
95
+
96
+ This licence is governed by the law of England and Wales, and the courts of England and Wales have
97
+ jurisdiction. If you are a consumer living elsewhere in the UK or the EU, you also keep the protection of
98
+ the law where you live and may bring a claim in your local courts.
@@ -0,0 +1,5 @@
1
+ // Auto-generated by emdash-plugin build. Do not edit.
2
+ import type { PluginDescriptor } from "emdash";
3
+
4
+ declare const descriptor: PluginDescriptor;
5
+ export default descriptor;
package/dist/index.mjs ADDED
@@ -0,0 +1,561 @@
1
+ // Auto-generated by emdash-plugin build. Do not edit.
2
+ // Source: emdash-plugin.jsonc + package.json
3
+ //
4
+ // Default-exports a sandboxed plugin descriptor. Pass it directly into
5
+ // emdash's `plugins:` or `sandboxed:` array — no factory call needed.
6
+
7
+ /** @type {import("emdash").PluginDescriptor} */
8
+ const descriptor = Object.freeze({
9
+ "id": "semics-esign",
10
+ "version": "1.0.0-rc.0",
11
+ "format": "standard",
12
+ "entrypoint": "@semics-tech/emdash-esign-pro/sandbox",
13
+ "capabilities": [
14
+ "media:read",
15
+ "media:bytes:read",
16
+ "network:request",
17
+ "email:send"
18
+ ],
19
+ "allowedHosts": [
20
+ "challenges.cloudflare.com"
21
+ ],
22
+ "storage": {
23
+ "templates": {
24
+ "indexes": [
25
+ "status",
26
+ "kind",
27
+ "public"
28
+ ]
29
+ },
30
+ "envelopes": {
31
+ "indexes": [
32
+ "status",
33
+ "expiresAt",
34
+ "createdAt",
35
+ "clientId",
36
+ "externalRef",
37
+ "pdfSha256",
38
+ "signerEmail",
39
+ [
40
+ "status",
41
+ "expiresAt"
42
+ ]
43
+ ]
44
+ },
45
+ "signers": {
46
+ "indexes": [
47
+ "envelopeId",
48
+ "email",
49
+ "copyTokenHash"
50
+ ],
51
+ "uniqueIndexes": [
52
+ "tokenHash"
53
+ ]
54
+ },
55
+ "snapshots": {
56
+ "indexes": [
57
+ "envelopeId"
58
+ ]
59
+ },
60
+ "artifacts": {
61
+ "indexes": [
62
+ "envelopeId",
63
+ [
64
+ "envelopeId",
65
+ "kind"
66
+ ]
67
+ ]
68
+ },
69
+ "audit_events": {
70
+ "indexes": [
71
+ "envelopeId",
72
+ [
73
+ "envelopeId",
74
+ "seq"
75
+ ]
76
+ ]
77
+ },
78
+ "clients": {
79
+ "indexes": [
80
+ "createdAt"
81
+ ],
82
+ "uniqueIndexes": [
83
+ "clientId"
84
+ ]
85
+ },
86
+ "nonces": {
87
+ "indexes": [
88
+ "expiresAt"
89
+ ],
90
+ "uniqueIndexes": [
91
+ "nonce"
92
+ ]
93
+ },
94
+ "outbox": {
95
+ "indexes": [
96
+ [
97
+ "status",
98
+ "nextAttemptAt"
99
+ ]
100
+ ]
101
+ },
102
+ "bulk": {
103
+ "indexes": [
104
+ [
105
+ "kind",
106
+ "createdAt"
107
+ ]
108
+ ]
109
+ },
110
+ "pdf_templates": {
111
+ "indexes": [
112
+ "status"
113
+ ]
114
+ },
115
+ "pdf_files": {
116
+ "indexes": [
117
+ "sha256"
118
+ ]
119
+ }
120
+ },
121
+ "hooks": [
122
+ "plugin:activate",
123
+ "cron"
124
+ ],
125
+ "routes": [
126
+ {
127
+ "name": "public/envelopes/from-intent",
128
+ "methods": [
129
+ "POST"
130
+ ],
131
+ "request": {
132
+ "body": "json",
133
+ "maxBytes": 16384
134
+ },
135
+ "public": true
136
+ },
137
+ {
138
+ "name": "public/session",
139
+ "methods": [
140
+ "POST"
141
+ ],
142
+ "request": {
143
+ "body": "json",
144
+ "maxBytes": 8192
145
+ },
146
+ "public": true
147
+ },
148
+ {
149
+ "name": "public/otp/send",
150
+ "methods": [
151
+ "POST"
152
+ ],
153
+ "request": {
154
+ "body": "json",
155
+ "maxBytes": 8192
156
+ },
157
+ "public": true
158
+ },
159
+ {
160
+ "name": "public/otp/verify",
161
+ "methods": [
162
+ "POST"
163
+ ],
164
+ "request": {
165
+ "body": "json",
166
+ "maxBytes": 8192
167
+ },
168
+ "public": true
169
+ },
170
+ {
171
+ "name": "public/submit",
172
+ "methods": [
173
+ "POST"
174
+ ],
175
+ "request": {
176
+ "body": "json",
177
+ "maxBytes": 262144
178
+ },
179
+ "public": true
180
+ },
181
+ {
182
+ "name": "public/decline",
183
+ "methods": [
184
+ "POST"
185
+ ],
186
+ "request": {
187
+ "body": "json",
188
+ "maxBytes": 8192
189
+ },
190
+ "public": true
191
+ },
192
+ {
193
+ "name": "public/download",
194
+ "methods": [
195
+ "GET"
196
+ ],
197
+ "request": {
198
+ "body": "none"
199
+ },
200
+ "response": "raw",
201
+ "public": true
202
+ },
203
+ {
204
+ "name": "public/verify",
205
+ "methods": [
206
+ "POST"
207
+ ],
208
+ "request": {
209
+ "body": "json",
210
+ "maxBytes": 8192
211
+ },
212
+ "public": true
213
+ },
214
+ {
215
+ "name": "public/receipts/lookup",
216
+ "methods": [
217
+ "POST"
218
+ ],
219
+ "request": {
220
+ "body": "json",
221
+ "maxBytes": 8192
222
+ },
223
+ "public": true
224
+ },
225
+ {
226
+ "name": "public/templates/catalog",
227
+ "methods": [
228
+ "POST"
229
+ ],
230
+ "request": {
231
+ "body": "json",
232
+ "maxBytes": 65536
233
+ },
234
+ "public": true
235
+ },
236
+ {
237
+ "name": "public/self-serve/start",
238
+ "methods": [
239
+ "POST"
240
+ ],
241
+ "request": {
242
+ "body": "json",
243
+ "maxBytes": 65536
244
+ },
245
+ "public": true
246
+ },
247
+ "admin",
248
+ "templates/create",
249
+ "templates/update",
250
+ "templates/get",
251
+ "templates/list",
252
+ "templates/archive",
253
+ "envelopes/create",
254
+ "envelopes/send",
255
+ "envelopes/get",
256
+ "envelopes/list",
257
+ "envelopes/resend",
258
+ "envelopes/void",
259
+ "outbox/status",
260
+ "pro/licence",
261
+ "pro/envelopes/send",
262
+ "pro/templates/self-serve",
263
+ "pro/bulk/start",
264
+ "pro/pdf-templates/upload",
265
+ "pro/pdf-templates/update",
266
+ "pro/pdf-templates/send",
267
+ {
268
+ "name": "pro/mcp/templates",
269
+ "permission": "plugins:manage"
270
+ },
271
+ {
272
+ "name": "pro/mcp/send",
273
+ "permission": "plugins:manage"
274
+ },
275
+ {
276
+ "name": "pro/mcp/status",
277
+ "permission": "plugins:manage"
278
+ },
279
+ {
280
+ "name": "pro/mcp/remind",
281
+ "permission": "plugins:manage"
282
+ },
283
+ {
284
+ "name": "pro/mcp/void",
285
+ "permission": "plugins:manage"
286
+ }
287
+ ],
288
+ "mcp": {
289
+ "tools": [
290
+ {
291
+ "name": "listTemplates",
292
+ "description": "List the e-sign templates by name: id, name, current version and status. Pass status \"archived\" for archived ones.",
293
+ "route": "pro/mcp/templates",
294
+ "permission": "plugins:manage",
295
+ "destructive": false,
296
+ "inputSchema": {
297
+ "type": "object",
298
+ "properties": {
299
+ "status": {
300
+ "type": "string",
301
+ "enum": [
302
+ "active",
303
+ "archived"
304
+ ]
305
+ }
306
+ },
307
+ "additionalProperties": false
308
+ }
309
+ },
310
+ {
311
+ "name": "sendForSignature",
312
+ "description": "Send a template for signature. Each signer is emailed a signing link. One signer: the envelope is created as a draft and sent within a minute. 2-10 signers sign in parallel (default) or in order (routing \"sequential\").",
313
+ "route": "pro/mcp/send",
314
+ "permission": "plugins:manage",
315
+ "destructive": false,
316
+ "inputSchema": {
317
+ "type": "object",
318
+ "properties": {
319
+ "templateId": {
320
+ "type": "string",
321
+ "description": "From listTemplates."
322
+ },
323
+ "templateVersion": {
324
+ "type": "integer",
325
+ "minimum": 1,
326
+ "description": "A pinned version; default the current one."
327
+ },
328
+ "title": {
329
+ "type": "string",
330
+ "description": "Envelope title (optional)."
331
+ },
332
+ "fields": {
333
+ "type": "object",
334
+ "additionalProperties": {
335
+ "type": "string"
336
+ },
337
+ "description": "Values for the template's {{placeholders}}."
338
+ },
339
+ "signers": {
340
+ "type": "array",
341
+ "minItems": 1,
342
+ "maxItems": 10,
343
+ "items": {
344
+ "type": "object",
345
+ "properties": {
346
+ "name": {
347
+ "type": "string"
348
+ },
349
+ "email": {
350
+ "type": "string"
351
+ }
352
+ },
353
+ "required": [
354
+ "name",
355
+ "email"
356
+ ],
357
+ "additionalProperties": false
358
+ }
359
+ },
360
+ "routing": {
361
+ "type": "string",
362
+ "enum": [
363
+ "parallel",
364
+ "sequential"
365
+ ]
366
+ }
367
+ },
368
+ "required": [
369
+ "templateId",
370
+ "signers"
371
+ ],
372
+ "additionalProperties": false
373
+ }
374
+ },
375
+ {
376
+ "name": "getEnvelopeStatus",
377
+ "description": "An envelope's status (draft, sent, in_progress, completed, declined, voided, expired), dates and each signer's status, with a short-lived signed PDF link once completed.",
378
+ "route": "pro/mcp/status",
379
+ "permission": "plugins:manage",
380
+ "destructive": false,
381
+ "inputSchema": {
382
+ "type": "object",
383
+ "properties": {
384
+ "id": {
385
+ "type": "string",
386
+ "minLength": 1,
387
+ "maxLength": 100,
388
+ "description": "The envelope id."
389
+ }
390
+ },
391
+ "required": [
392
+ "id"
393
+ ],
394
+ "additionalProperties": false
395
+ }
396
+ },
397
+ {
398
+ "name": "remindSigners",
399
+ "description": "Email the next pending signer a reminder with a fresh signing link (the old link stops working). One signer per call; `remaining` says how many more are due. A signer is reminded at most once an hour.",
400
+ "route": "pro/mcp/remind",
401
+ "permission": "plugins:manage",
402
+ "destructive": false,
403
+ "inputSchema": {
404
+ "type": "object",
405
+ "properties": {
406
+ "id": {
407
+ "type": "string",
408
+ "minLength": 1,
409
+ "maxLength": 100,
410
+ "description": "The envelope id."
411
+ }
412
+ },
413
+ "required": [
414
+ "id"
415
+ ],
416
+ "additionalProperties": false
417
+ }
418
+ },
419
+ {
420
+ "name": "voidEnvelope",
421
+ "description": "Void an open envelope: its signing links stop working at once. This cannot be undone.",
422
+ "route": "pro/mcp/void",
423
+ "permission": "plugins:manage",
424
+ "destructive": true,
425
+ "inputSchema": {
426
+ "type": "object",
427
+ "properties": {
428
+ "id": {
429
+ "type": "string",
430
+ "minLength": 1,
431
+ "maxLength": 100,
432
+ "description": "The envelope id."
433
+ }
434
+ },
435
+ "required": [
436
+ "id"
437
+ ],
438
+ "additionalProperties": false
439
+ }
440
+ }
441
+ ]
442
+ },
443
+ "adminPages": [
444
+ {
445
+ "path": "/envelopes",
446
+ "label": "Envelopes",
447
+ "icon": "file"
448
+ },
449
+ {
450
+ "path": "/templates",
451
+ "label": "Templates",
452
+ "icon": "file-text"
453
+ },
454
+ {
455
+ "path": "/integrations",
456
+ "label": "Integrations",
457
+ "icon": "link"
458
+ },
459
+ {
460
+ "path": "/settings",
461
+ "label": "Settings",
462
+ "icon": "gear"
463
+ },
464
+ {
465
+ "path": "/bulk",
466
+ "label": "Bulk send",
467
+ "icon": "users"
468
+ },
469
+ {
470
+ "path": "/self-serve",
471
+ "label": "Self-serve forms",
472
+ "icon": "globe"
473
+ },
474
+ {
475
+ "path": "/pdf-templates",
476
+ "label": "PDF templates",
477
+ "icon": "file"
478
+ }
479
+ ],
480
+ "settingsSchema": {
481
+ "senderName": {
482
+ "label": "Sender name",
483
+ "description": "Shown as the sender of signing emails.",
484
+ "type": "string"
485
+ },
486
+ "consentVersion": {
487
+ "label": "Consent version",
488
+ "description": "Recorded with every signature; bump when the wording changes.",
489
+ "type": "string",
490
+ "default": "1"
491
+ },
492
+ "consentWording": {
493
+ "label": "Consent wording",
494
+ "description": "Shown to signers before they sign.",
495
+ "type": "string",
496
+ "default": "I agree to use electronic records and an electronic signature for this document.",
497
+ "multiline": true
498
+ },
499
+ "expiryDays": {
500
+ "label": "Envelope expiry (days)",
501
+ "type": "number",
502
+ "default": 30,
503
+ "min": 1,
504
+ "max": 365
505
+ },
506
+ "reminderCadenceDays": {
507
+ "label": "Reminder cadence (days)",
508
+ "description": "Pro: automatic reminders.",
509
+ "type": "number",
510
+ "default": 3,
511
+ "min": 1,
512
+ "max": 30
513
+ },
514
+ "otpDefault": {
515
+ "label": "Require email code by default",
516
+ "description": "Pro: one-time code before signing.",
517
+ "type": "boolean",
518
+ "default": false
519
+ },
520
+ "otpContractTemplates": {
521
+ "label": "Require email code for contract templates",
522
+ "description": "Pro.",
523
+ "type": "boolean",
524
+ "default": true
525
+ },
526
+ "retentionPersonalDataMonths": {
527
+ "label": "Keep personal data (months)",
528
+ "type": "number",
529
+ "default": 12,
530
+ "min": 1,
531
+ "max": 120
532
+ },
533
+ "retentionSignedRecordsYears": {
534
+ "label": "Keep signed records (years)",
535
+ "type": "number",
536
+ "default": 7,
537
+ "min": 1,
538
+ "max": 50
539
+ },
540
+ "turnstileSiteKey": {
541
+ "label": "Turnstile site key",
542
+ "type": "string"
543
+ },
544
+ "turnstileSecretKey": {
545
+ "label": "Turnstile secret key",
546
+ "type": "secret"
547
+ },
548
+ "integrationMasterKey": {
549
+ "label": "Integration master key",
550
+ "description": "Client secrets are derived from this key; it is never shown again.",
551
+ "type": "secret"
552
+ },
553
+ "licenceKey": {
554
+ "label": "Pro licence key",
555
+ "description": "The semics1. key from your purchase email. Not needed on local or preview hosts. Stored encrypted.",
556
+ "type": "secret"
557
+ }
558
+ }
559
+ });
560
+
561
+ export default descriptor;