@open-mercato/tillio 0.7.1-develop.7176.1.d229567a50
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/.turbo/turbo-build.log +2 -0
- package/build.mjs +7 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +7 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-001-pull-readiness.spec.js +17 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-001-pull-readiness.spec.js.map +7 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-002-pull-blocked.spec.js +27 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-002-pull-blocked.spec.js.map +7 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-003-operators.spec.js +47 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-003-operators.spec.js.map +7 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-004-pull-widget.spec.js +11 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-004-pull-widget.spec.js.map +7 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-005-operators-widget.spec.js +13 -0
- package/dist/modules/tillio/__integration__/TC-PHONE-005-operators-widget.spec.js.map +7 -0
- package/dist/modules/tillio/acl.js +9 -0
- package/dist/modules/tillio/acl.js.map +7 -0
- package/dist/modules/tillio/api/operators/[id]/route.js +78 -0
- package/dist/modules/tillio/api/operators/[id]/route.js.map +7 -0
- package/dist/modules/tillio/api/operators/route.js +171 -0
- package/dist/modules/tillio/api/operators/route.js.map +7 -0
- package/dist/modules/tillio/api/pull/route.js +180 -0
- package/dist/modules/tillio/api/pull/route.js.map +7 -0
- package/dist/modules/tillio/cli.js +108 -0
- package/dist/modules/tillio/cli.js.map +7 -0
- package/dist/modules/tillio/di.js +16 -0
- package/dist/modules/tillio/di.js.map +7 -0
- package/dist/modules/tillio/index.js +12 -0
- package/dist/modules/tillio/index.js.map +7 -0
- package/dist/modules/tillio/integration.js +62 -0
- package/dist/modules/tillio/integration.js.map +7 -0
- package/dist/modules/tillio/lib/adapter.js +107 -0
- package/dist/modules/tillio/lib/adapter.js.map +7 -0
- package/dist/modules/tillio/lib/client.js +249 -0
- package/dist/modules/tillio/lib/client.js.map +7 -0
- package/dist/modules/tillio/lib/environment.js +34 -0
- package/dist/modules/tillio/lib/environment.js.map +7 -0
- package/dist/modules/tillio/lib/error-codes.js +59 -0
- package/dist/modules/tillio/lib/error-codes.js.map +7 -0
- package/dist/modules/tillio/lib/errors.js +12 -0
- package/dist/modules/tillio/lib/errors.js.map +7 -0
- package/dist/modules/tillio/lib/health.js +41 -0
- package/dist/modules/tillio/lib/health.js.map +7 -0
- package/dist/modules/tillio/lib/locking.js +18 -0
- package/dist/modules/tillio/lib/locking.js.map +7 -0
- package/dist/modules/tillio/lib/normalizer.js +134 -0
- package/dist/modules/tillio/lib/normalizer.js.map +7 -0
- package/dist/modules/tillio/lib/operators-store.js +62 -0
- package/dist/modules/tillio/lib/operators-store.js.map +7 -0
- package/dist/modules/tillio/lib/operators.js +168 -0
- package/dist/modules/tillio/lib/operators.js.map +7 -0
- package/dist/modules/tillio/lib/preset.js +122 -0
- package/dist/modules/tillio/lib/preset.js.map +7 -0
- package/dist/modules/tillio/lib/pull-job.js +265 -0
- package/dist/modules/tillio/lib/pull-job.js.map +7 -0
- package/dist/modules/tillio/lib/pull-readiness.js +36 -0
- package/dist/modules/tillio/lib/pull-readiness.js.map +7 -0
- package/dist/modules/tillio/lib/queue.js +22 -0
- package/dist/modules/tillio/lib/queue.js.map +7 -0
- package/dist/modules/tillio/lib/tz.js +85 -0
- package/dist/modules/tillio/lib/tz.js.map +7 -0
- package/dist/modules/tillio/lib/url-guard.js +24 -0
- package/dist/modules/tillio/lib/url-guard.js.map +7 -0
- package/dist/modules/tillio/setup.js +45 -0
- package/dist/modules/tillio/setup.js.map +7 -0
- package/dist/modules/tillio/widgets/injection/operators-config/widget.client.js +208 -0
- package/dist/modules/tillio/widgets/injection/operators-config/widget.client.js.map +7 -0
- package/dist/modules/tillio/widgets/injection/operators-config/widget.js +17 -0
- package/dist/modules/tillio/widgets/injection/operators-config/widget.js.map +7 -0
- package/dist/modules/tillio/widgets/injection/pull-calls/widget.client.js +148 -0
- package/dist/modules/tillio/widgets/injection/pull-calls/widget.client.js.map +7 -0
- package/dist/modules/tillio/widgets/injection/pull-calls/widget.js +17 -0
- package/dist/modules/tillio/widgets/injection/pull-calls/widget.js.map +7 -0
- package/dist/modules/tillio/widgets/injection-table.js +21 -0
- package/dist/modules/tillio/widgets/injection-table.js.map +7 -0
- package/dist/modules/tillio/workers/tillio-pull.js +17 -0
- package/dist/modules/tillio/workers/tillio-pull.js.map +7 -0
- package/jest.config.cjs +35 -0
- package/package.json +92 -0
- package/src/index.ts +1 -0
- package/src/modules/tillio/__integration__/TC-PHONE-001-pull-readiness.spec.ts +38 -0
- package/src/modules/tillio/__integration__/TC-PHONE-002-pull-blocked.spec.ts +44 -0
- package/src/modules/tillio/__integration__/TC-PHONE-003-operators.spec.ts +76 -0
- package/src/modules/tillio/__integration__/TC-PHONE-004-pull-widget.spec.ts +22 -0
- package/src/modules/tillio/__integration__/TC-PHONE-005-operators-widget.spec.ts +27 -0
- package/src/modules/tillio/__tests__/adapter-fetch-calls.test.ts +148 -0
- package/src/modules/tillio/__tests__/client.test.ts +203 -0
- package/src/modules/tillio/__tests__/health.test.ts +122 -0
- package/src/modules/tillio/__tests__/normalizer.test.ts +143 -0
- package/src/modules/tillio/__tests__/operators-routes.test.ts +100 -0
- package/src/modules/tillio/__tests__/operators-store.test.ts +104 -0
- package/src/modules/tillio/__tests__/operators.test.ts +250 -0
- package/src/modules/tillio/__tests__/preset.test.ts +337 -0
- package/src/modules/tillio/__tests__/pull-body.test.ts +43 -0
- package/src/modules/tillio/__tests__/pull-job.test.ts +250 -0
- package/src/modules/tillio/__tests__/pull-readiness.test.ts +143 -0
- package/src/modules/tillio/__tests__/pull-route.test.ts +148 -0
- package/src/modules/tillio/__tests__/tz.test.ts +53 -0
- package/src/modules/tillio/__tests__/url-guard.test.ts +46 -0
- package/src/modules/tillio/acl.ts +5 -0
- package/src/modules/tillio/api/operators/[id]/route.ts +90 -0
- package/src/modules/tillio/api/operators/route.ts +191 -0
- package/src/modules/tillio/api/pull/route.ts +213 -0
- package/src/modules/tillio/cli.ts +125 -0
- package/src/modules/tillio/di.ts +16 -0
- package/src/modules/tillio/i18n/de.json +73 -0
- package/src/modules/tillio/i18n/en.json +73 -0
- package/src/modules/tillio/i18n/es.json +73 -0
- package/src/modules/tillio/i18n/ko.json +73 -0
- package/src/modules/tillio/i18n/pl.json +73 -0
- package/src/modules/tillio/index.ts +8 -0
- package/src/modules/tillio/integration.ts +58 -0
- package/src/modules/tillio/lib/adapter.ts +135 -0
- package/src/modules/tillio/lib/client.ts +329 -0
- package/src/modules/tillio/lib/environment.ts +53 -0
- package/src/modules/tillio/lib/error-codes.ts +67 -0
- package/src/modules/tillio/lib/errors.ts +11 -0
- package/src/modules/tillio/lib/health.ts +57 -0
- package/src/modules/tillio/lib/locking.ts +30 -0
- package/src/modules/tillio/lib/normalizer.ts +184 -0
- package/src/modules/tillio/lib/operators-store.ts +77 -0
- package/src/modules/tillio/lib/operators.ts +269 -0
- package/src/modules/tillio/lib/preset.ts +226 -0
- package/src/modules/tillio/lib/pull-job.ts +390 -0
- package/src/modules/tillio/lib/pull-readiness.ts +77 -0
- package/src/modules/tillio/lib/queue.ts +33 -0
- package/src/modules/tillio/lib/tz.ts +121 -0
- package/src/modules/tillio/lib/url-guard.ts +34 -0
- package/src/modules/tillio/setup.ts +49 -0
- package/src/modules/tillio/widgets/injection/operators-config/widget.client.tsx +304 -0
- package/src/modules/tillio/widgets/injection/operators-config/widget.ts +16 -0
- package/src/modules/tillio/widgets/injection/pull-calls/widget.client.tsx +214 -0
- package/src/modules/tillio/widgets/injection/pull-calls/widget.ts +16 -0
- package/src/modules/tillio/widgets/injection-table.ts +19 -0
- package/src/modules/tillio/workers/tillio-pull.ts +18 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tillio.description": "Tillio VoIP-Anbieter für den phone_calls-Hub (Ringostat-Operator).",
|
|
3
|
+
"tillio.errors.appUrlMissing": "APP_URL ist nicht konfiguriert, daher lässt sich die Webhook-Domain des Operators nicht ableiten.",
|
|
4
|
+
"tillio.errors.attachFailed": "Der Operator konnte nicht verbunden werden.",
|
|
5
|
+
"tillio.errors.detachFailed": "Der Operator konnte nicht getrennt werden.",
|
|
6
|
+
"tillio.errors.environmentDrift": "Die Umgebung hat sich nach dem Verbinden des Operators geändert. Trenne ihn und verbinde ihn erneut.",
|
|
7
|
+
"tillio.errors.environmentNotReady": "Konfiguriere zuerst die Tillio-Zugangsdaten und führe die Zustandsprüfung aus.",
|
|
8
|
+
"tillio.errors.integrationDisabled": "Die Tillio-Integration ist deaktiviert. Aktiviere sie zuerst.",
|
|
9
|
+
"tillio.errors.invalidOperatorId": "Diese Operator-ID ist ungültig.",
|
|
10
|
+
"tillio.errors.invalidPayload": "Die Anfrage wurde als ungültig abgelehnt.",
|
|
11
|
+
"tillio.errors.operatorLimit": "Es ist bereits ein Operator verbunden. Trenne ihn zuerst.",
|
|
12
|
+
"tillio.errors.operatorMissing": "Verbinde zuerst einen Tillio-Operator.",
|
|
13
|
+
"tillio.errors.providerError": "Tillio hat die Anfrage abgelehnt.",
|
|
14
|
+
"tillio.errors.pullAlreadyRunning": "Ein Abruf läuft bereits. Warte, bis er abgeschlossen ist.",
|
|
15
|
+
"tillio.errors.pullFailed": "Anrufe konnten nicht von Tillio abgerufen werden.",
|
|
16
|
+
"tillio.errors.revocationFailed": "Das Tillio-Token konnte nicht widerrufen werden.",
|
|
17
|
+
"tillio.errors.unauthorized": "Deine Sitzung ist abgelaufen. Melde dich erneut an.",
|
|
18
|
+
"tillio.operators.active": "Aktiv",
|
|
19
|
+
"tillio.operators.attach": "Operator verbinden",
|
|
20
|
+
"tillio.operators.attachFailed": "Operator konnte nicht verbunden werden.",
|
|
21
|
+
"tillio.operators.attached": "Operator verbunden.",
|
|
22
|
+
"tillio.operators.attaching": "Wird verbunden...",
|
|
23
|
+
"tillio.operators.blocked": "Operatoränderung durch Validierung blockiert.",
|
|
24
|
+
"tillio.operators.cancel": "Abbrechen",
|
|
25
|
+
"tillio.operators.copied": "Webhook-Domain kopiert.",
|
|
26
|
+
"tillio.operators.copy": "Kopieren",
|
|
27
|
+
"tillio.operators.copyFailed": "Kopieren in die Zwischenablage fehlgeschlagen.",
|
|
28
|
+
"tillio.operators.detach": "Trennen",
|
|
29
|
+
"tillio.operators.detachConfirmAction": "Trennen",
|
|
30
|
+
"tillio.operators.detachConfirmText": "Der Operator wird entfernt und sein Tillio-Token widerrufen. Sie können ihn danach erneut verbinden.",
|
|
31
|
+
"tillio.operators.detachConfirmTitle": "Diesen Operator trennen?",
|
|
32
|
+
"tillio.operators.detachFailed": "Operator konnte nicht getrennt werden.",
|
|
33
|
+
"tillio.operators.detached": "Operator getrennt.",
|
|
34
|
+
"tillio.operators.detachedNotRevoked": "Operator entfernt. Widerrufen Sie sein Token in Tillio manuell.",
|
|
35
|
+
"tillio.operators.driftText": "Die Umgebung wurde nach dem Verbinden dieses Operators geändert, daher ist sein Token möglicherweise ungültig. Trennen und erneut verbinden.",
|
|
36
|
+
"tillio.operators.driftTitle": "Umgebung geändert",
|
|
37
|
+
"tillio.operators.envNotReadyText": "Speichern Sie die Tillio-API-URL und den Schlüssel im Tab Zugangsdaten und führen Sie dann die Zustandsprüfung aus, bevor Sie einen Operator verbinden.",
|
|
38
|
+
"tillio.operators.envNotReadyTitle": "Umgebung nicht bereit",
|
|
39
|
+
"tillio.operators.forceDetachAction": "Trotzdem trennen",
|
|
40
|
+
"tillio.operators.forceDetachText": "Das Tillio-Token konnte nicht widerrufen werden und bleibt aktiv, bis Sie es in Tillio entfernen. Den Operator hier trotzdem entfernen?",
|
|
41
|
+
"tillio.operators.forceDetachTitle": "Ohne Widerruf trennen?",
|
|
42
|
+
"tillio.operators.integrationDisabledTitle": "Integration deaktiviert",
|
|
43
|
+
"tillio.operators.keyRequired": "Geben Sie zuerst den Ringostat-Schlüssel ein.",
|
|
44
|
+
"tillio.operators.loadFailed": "Tillio-Operatoren konnten nicht geladen werden.",
|
|
45
|
+
"tillio.operators.loading": "Operatoren werden geladen...",
|
|
46
|
+
"tillio.operators.retry": "Erneut versuchen",
|
|
47
|
+
"tillio.operators.ringostatKey": "Ringostat-Schlüssel",
|
|
48
|
+
"tillio.operators.ringostatKeyHint": "Nur ein Operator gleichzeitig. Trennen Sie den aktuellen, bevor Sie einen anderen verbinden.",
|
|
49
|
+
"tillio.operators.ringostatKeyPlaceholder": "Ringostat-Integrationsschlüssel einfügen",
|
|
50
|
+
"tillio.operators.stale": "Veraltet",
|
|
51
|
+
"tillio.operators.tab": "Operatorkonfiguration",
|
|
52
|
+
"tillio.operators.webhookDomain": "Webhook-Domain (X-Tenant-Domain)",
|
|
53
|
+
"tillio.operators.webhookHint": "Registrieren Sie diese URL in Ihrem Operator-Panel, damit Tillio seine Webhooks hierher weiterleitet.",
|
|
54
|
+
"tillio.pull.action": "Anrufe abrufen",
|
|
55
|
+
"tillio.pull.blocked": "Abruf durch Validierung blockiert.",
|
|
56
|
+
"tillio.pull.cancel": "Abbrechen",
|
|
57
|
+
"tillio.pull.checkFailed": "Tillio-Verbindung konnte nicht geprüft werden.",
|
|
58
|
+
"tillio.pull.checking": "Tillio-Verbindung wird geprüft...",
|
|
59
|
+
"tillio.pull.confirm": "Anrufe abrufen",
|
|
60
|
+
"tillio.pull.description": "Anrufe im ausgewählten Zeitraum werden vom verbundenen Operator importiert. Ein erneuter Abruf desselben Zeitraums aktualisiert vorhandene Anrufe, statt sie zu duplizieren.",
|
|
61
|
+
"tillio.pull.envDrift": "Die Tillio-Umgebung wurde nach dem Verbinden des Operators geändert. Trennen und verbinden Sie ihn erneut, bevor Sie Anrufe abrufen.",
|
|
62
|
+
"tillio.pull.envNotReady": "Konfigurieren Sie zuerst die Tillio-Zugangsdaten und führen Sie die Zustandsprüfung auf der Integrationsseite aus.",
|
|
63
|
+
"tillio.pull.failed": "Anrufe konnten nicht von Tillio abgerufen werden.",
|
|
64
|
+
"tillio.pull.notReadyTitle": "Tillio ist nicht bereit",
|
|
65
|
+
"tillio.pull.operatorMissing": "Verbinden Sie einen Tillio-Operator auf der Integrationsseite, bevor Sie Anrufe abrufen.",
|
|
66
|
+
"tillio.pull.pulling": "Wird abgerufen...",
|
|
67
|
+
"tillio.pull.queued": "Anrufe werden von Tillio abgerufen. Den Fortschritt siehst du in der Fortschrittsleiste.",
|
|
68
|
+
"tillio.pull.rangeRequired": "Wählen Sie zuerst einen Zeitraum.",
|
|
69
|
+
"tillio.pull.retry": "Erneut versuchen",
|
|
70
|
+
"tillio.pull.timezoneHint": "Tage werden in der von Tillio verwendeten Zeitzone {{timeZone}} interpretiert.",
|
|
71
|
+
"tillio.pull.title": "Anrufe von Tillio abrufen",
|
|
72
|
+
"tillio.title": "Tillio-Telefonie"
|
|
73
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tillio.description": "Tillio VoIP provider for the phone_calls hub (Ringostat operator).",
|
|
3
|
+
"tillio.errors.appUrlMissing": "APP_URL is not configured, so the operator webhook domain cannot be derived.",
|
|
4
|
+
"tillio.errors.attachFailed": "Could not attach the operator.",
|
|
5
|
+
"tillio.errors.detachFailed": "Could not detach the operator.",
|
|
6
|
+
"tillio.errors.environmentDrift": "The environment changed after the operator was attached. Detach and attach it again.",
|
|
7
|
+
"tillio.errors.environmentNotReady": "Configure the Tillio credentials and run the health check first.",
|
|
8
|
+
"tillio.errors.integrationDisabled": "The Tillio integration is disabled. Enable it first.",
|
|
9
|
+
"tillio.errors.invalidOperatorId": "That operator id is not valid.",
|
|
10
|
+
"tillio.errors.invalidPayload": "The request was rejected as invalid.",
|
|
11
|
+
"tillio.errors.operatorLimit": "An operator is already attached. Detach it first.",
|
|
12
|
+
"tillio.errors.operatorMissing": "Attach a Tillio operator first.",
|
|
13
|
+
"tillio.errors.providerError": "Tillio rejected the request.",
|
|
14
|
+
"tillio.errors.pullAlreadyRunning": "A pull is already running. Wait for it to finish.",
|
|
15
|
+
"tillio.errors.pullFailed": "Could not pull calls from Tillio.",
|
|
16
|
+
"tillio.errors.revocationFailed": "The Tillio token could not be revoked.",
|
|
17
|
+
"tillio.errors.unauthorized": "Your session expired. Sign in again.",
|
|
18
|
+
"tillio.operators.active": "Active",
|
|
19
|
+
"tillio.operators.attach": "Attach operator",
|
|
20
|
+
"tillio.operators.attachFailed": "Could not attach the operator.",
|
|
21
|
+
"tillio.operators.attached": "Operator attached.",
|
|
22
|
+
"tillio.operators.attaching": "Attaching...",
|
|
23
|
+
"tillio.operators.blocked": "Operator change blocked by validation.",
|
|
24
|
+
"tillio.operators.cancel": "Cancel",
|
|
25
|
+
"tillio.operators.copied": "Webhook domain copied.",
|
|
26
|
+
"tillio.operators.copy": "Copy",
|
|
27
|
+
"tillio.operators.copyFailed": "Could not copy to clipboard.",
|
|
28
|
+
"tillio.operators.detach": "Detach",
|
|
29
|
+
"tillio.operators.detachConfirmAction": "Detach",
|
|
30
|
+
"tillio.operators.detachConfirmText": "The operator will be removed and its Tillio token revoked. You can attach it again afterwards.",
|
|
31
|
+
"tillio.operators.detachConfirmTitle": "Detach this operator?",
|
|
32
|
+
"tillio.operators.detachFailed": "Could not detach the operator.",
|
|
33
|
+
"tillio.operators.detached": "Operator detached.",
|
|
34
|
+
"tillio.operators.detachedNotRevoked": "Operator removed. Revoke its token in Tillio manually.",
|
|
35
|
+
"tillio.operators.driftText": "The environment changed after this operator was attached, so its token may be invalid. Detach and attach it again.",
|
|
36
|
+
"tillio.operators.driftTitle": "Environment changed",
|
|
37
|
+
"tillio.operators.envNotReadyText": "Save the Tillio API URL and key in the Credentials tab, then run the health Check before attaching an operator.",
|
|
38
|
+
"tillio.operators.envNotReadyTitle": "Environment not ready",
|
|
39
|
+
"tillio.operators.forceDetachAction": "Detach anyway",
|
|
40
|
+
"tillio.operators.forceDetachText": "The Tillio token could not be revoked, so it stays active until you remove it in Tillio. Remove the operator here anyway?",
|
|
41
|
+
"tillio.operators.forceDetachTitle": "Detach without revoking?",
|
|
42
|
+
"tillio.operators.integrationDisabledTitle": "Integration disabled",
|
|
43
|
+
"tillio.operators.keyRequired": "Enter the Ringostat key first.",
|
|
44
|
+
"tillio.operators.loadFailed": "Failed to load Tillio operators.",
|
|
45
|
+
"tillio.operators.loading": "Loading operators...",
|
|
46
|
+
"tillio.operators.retry": "Retry",
|
|
47
|
+
"tillio.operators.ringostatKey": "Ringostat key",
|
|
48
|
+
"tillio.operators.ringostatKeyHint": "One operator at a time. Detach the current one before attaching another.",
|
|
49
|
+
"tillio.operators.ringostatKeyPlaceholder": "Paste the Ringostat integration key",
|
|
50
|
+
"tillio.operators.stale": "Stale",
|
|
51
|
+
"tillio.operators.tab": "Operator configuration",
|
|
52
|
+
"tillio.operators.webhookDomain": "Webhook domain (X-Tenant-Domain)",
|
|
53
|
+
"tillio.operators.webhookHint": "Register this URL in your operator panel so Tillio forwards its webhooks here.",
|
|
54
|
+
"tillio.pull.action": "Pull calls",
|
|
55
|
+
"tillio.pull.blocked": "Pull blocked by validation.",
|
|
56
|
+
"tillio.pull.cancel": "Cancel",
|
|
57
|
+
"tillio.pull.checkFailed": "Could not check the Tillio connection.",
|
|
58
|
+
"tillio.pull.checking": "Checking the Tillio connection...",
|
|
59
|
+
"tillio.pull.confirm": "Pull calls",
|
|
60
|
+
"tillio.pull.description": "Calls in the selected range are ingested from the attached operator. Pulling the same range again updates existing calls instead of duplicating them.",
|
|
61
|
+
"tillio.pull.envDrift": "The Tillio environment changed after the operator was attached. Detach and attach it again before pulling calls.",
|
|
62
|
+
"tillio.pull.envNotReady": "Configure the Tillio credentials and run the health check on the integration page first.",
|
|
63
|
+
"tillio.pull.failed": "Could not pull calls from Tillio.",
|
|
64
|
+
"tillio.pull.notReadyTitle": "Tillio is not ready",
|
|
65
|
+
"tillio.pull.operatorMissing": "Attach a Tillio operator on the integration page before pulling calls.",
|
|
66
|
+
"tillio.pull.pulling": "Pulling...",
|
|
67
|
+
"tillio.pull.queued": "Pulling calls from Tillio. Track it in the progress bar.",
|
|
68
|
+
"tillio.pull.rangeRequired": "Pick a date range first.",
|
|
69
|
+
"tillio.pull.retry": "Retry",
|
|
70
|
+
"tillio.pull.timezoneHint": "Days are interpreted in the {{timeZone}} timezone that Tillio uses.",
|
|
71
|
+
"tillio.pull.title": "Pull calls from Tillio",
|
|
72
|
+
"tillio.title": "Tillio Telephony"
|
|
73
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tillio.description": "Proveedor VoIP Tillio para el hub phone_calls (operador Ringostat).",
|
|
3
|
+
"tillio.errors.appUrlMissing": "APP_URL no está configurado, por lo que no se puede derivar el dominio del webhook del operador.",
|
|
4
|
+
"tillio.errors.attachFailed": "No se pudo adjuntar el operador.",
|
|
5
|
+
"tillio.errors.detachFailed": "No se pudo desvincular el operador.",
|
|
6
|
+
"tillio.errors.environmentDrift": "El entorno cambió después de adjuntar el operador. Desvincúlalo y vuelve a adjuntarlo.",
|
|
7
|
+
"tillio.errors.environmentNotReady": "Configura primero las credenciales de Tillio y ejecuta la comprobación de estado.",
|
|
8
|
+
"tillio.errors.integrationDisabled": "La integración de Tillio está desactivada. Actívala primero.",
|
|
9
|
+
"tillio.errors.invalidOperatorId": "Ese identificador de operador no es válido.",
|
|
10
|
+
"tillio.errors.invalidPayload": "La solicitud se rechazó por no ser válida.",
|
|
11
|
+
"tillio.errors.operatorLimit": "Ya hay un operador adjunto. Desvincúlalo primero.",
|
|
12
|
+
"tillio.errors.operatorMissing": "Adjunta primero un operador de Tillio.",
|
|
13
|
+
"tillio.errors.providerError": "Tillio rechazó la solicitud.",
|
|
14
|
+
"tillio.errors.pullAlreadyRunning": "Ya hay una obtención en curso. Espera a que termine.",
|
|
15
|
+
"tillio.errors.pullFailed": "No se pudieron obtener las llamadas de Tillio.",
|
|
16
|
+
"tillio.errors.revocationFailed": "No se pudo revocar el token de Tillio.",
|
|
17
|
+
"tillio.errors.unauthorized": "Tu sesión expiró. Inicia sesión de nuevo.",
|
|
18
|
+
"tillio.operators.active": "Activo",
|
|
19
|
+
"tillio.operators.attach": "Conectar operador",
|
|
20
|
+
"tillio.operators.attachFailed": "No se pudo conectar el operador.",
|
|
21
|
+
"tillio.operators.attached": "Operador conectado.",
|
|
22
|
+
"tillio.operators.attaching": "Conectando...",
|
|
23
|
+
"tillio.operators.blocked": "Cambio de operador bloqueado por la validación.",
|
|
24
|
+
"tillio.operators.cancel": "Cancelar",
|
|
25
|
+
"tillio.operators.copied": "Dominio de webhook copiado.",
|
|
26
|
+
"tillio.operators.copy": "Copiar",
|
|
27
|
+
"tillio.operators.copyFailed": "No se pudo copiar al portapapeles.",
|
|
28
|
+
"tillio.operators.detach": "Desconectar",
|
|
29
|
+
"tillio.operators.detachConfirmAction": "Desconectar",
|
|
30
|
+
"tillio.operators.detachConfirmText": "El operador se eliminará y su token de Tillio se revocará. Puede volver a conectarlo después.",
|
|
31
|
+
"tillio.operators.detachConfirmTitle": "¿Desconectar este operador?",
|
|
32
|
+
"tillio.operators.detachFailed": "No se pudo desconectar el operador.",
|
|
33
|
+
"tillio.operators.detached": "Operador desconectado.",
|
|
34
|
+
"tillio.operators.detachedNotRevoked": "Operador eliminado. Revoque su token en Tillio manualmente.",
|
|
35
|
+
"tillio.operators.driftText": "El entorno cambió después de conectar este operador, por lo que su token puede no ser válido. Desconéctelo y vuelva a conectarlo.",
|
|
36
|
+
"tillio.operators.driftTitle": "El entorno cambió",
|
|
37
|
+
"tillio.operators.envNotReadyText": "Guarde la URL de la API de Tillio y la clave en la pestaña Credenciales y luego ejecute la comprobación de estado antes de conectar un operador.",
|
|
38
|
+
"tillio.operators.envNotReadyTitle": "Entorno no listo",
|
|
39
|
+
"tillio.operators.forceDetachAction": "Desconectar de todos modos",
|
|
40
|
+
"tillio.operators.forceDetachText": "No se pudo revocar el token de Tillio, por lo que sigue activo hasta que lo elimine en Tillio. ¿Eliminar el operador aquí de todos modos?",
|
|
41
|
+
"tillio.operators.forceDetachTitle": "¿Desconectar sin revocar?",
|
|
42
|
+
"tillio.operators.integrationDisabledTitle": "Integración desactivada",
|
|
43
|
+
"tillio.operators.keyRequired": "Introduzca primero la clave de Ringostat.",
|
|
44
|
+
"tillio.operators.loadFailed": "No se pudieron cargar los operadores de Tillio.",
|
|
45
|
+
"tillio.operators.loading": "Cargando operadores...",
|
|
46
|
+
"tillio.operators.retry": "Reintentar",
|
|
47
|
+
"tillio.operators.ringostatKey": "Clave de Ringostat",
|
|
48
|
+
"tillio.operators.ringostatKeyHint": "Un operador a la vez. Desconecte el actual antes de conectar otro.",
|
|
49
|
+
"tillio.operators.ringostatKeyPlaceholder": "Pegue la clave de integración de Ringostat",
|
|
50
|
+
"tillio.operators.stale": "Obsoleto",
|
|
51
|
+
"tillio.operators.tab": "Configuración del operador",
|
|
52
|
+
"tillio.operators.webhookDomain": "Dominio de webhook (X-Tenant-Domain)",
|
|
53
|
+
"tillio.operators.webhookHint": "Registre esta URL en el panel de su operador para que Tillio reenvíe sus webhooks aquí.",
|
|
54
|
+
"tillio.pull.action": "Obtener llamadas",
|
|
55
|
+
"tillio.pull.blocked": "Obtención bloqueada por la validación.",
|
|
56
|
+
"tillio.pull.cancel": "Cancelar",
|
|
57
|
+
"tillio.pull.checkFailed": "No se pudo comprobar la conexión con Tillio.",
|
|
58
|
+
"tillio.pull.checking": "Comprobando la conexión con Tillio...",
|
|
59
|
+
"tillio.pull.confirm": "Obtener llamadas",
|
|
60
|
+
"tillio.pull.description": "Las llamadas del rango seleccionado se importan desde el operador conectado. Obtener el mismo rango de nuevo actualiza las llamadas existentes en lugar de duplicarlas.",
|
|
61
|
+
"tillio.pull.envDrift": "El entorno de Tillio cambió después de conectar el operador. Desconéctelo y vuelva a conectarlo antes de obtener llamadas.",
|
|
62
|
+
"tillio.pull.envNotReady": "Configure primero las credenciales de Tillio y ejecute la comprobación de estado en la página de integración.",
|
|
63
|
+
"tillio.pull.failed": "No se pudieron obtener las llamadas de Tillio.",
|
|
64
|
+
"tillio.pull.notReadyTitle": "Tillio no está listo",
|
|
65
|
+
"tillio.pull.operatorMissing": "Conecte un operador de Tillio en la página de integración antes de obtener llamadas.",
|
|
66
|
+
"tillio.pull.pulling": "Obteniendo...",
|
|
67
|
+
"tillio.pull.queued": "Obteniendo llamadas de Tillio. Sigue el avance en la barra de progreso.",
|
|
68
|
+
"tillio.pull.rangeRequired": "Elija primero un rango de fechas.",
|
|
69
|
+
"tillio.pull.retry": "Reintentar",
|
|
70
|
+
"tillio.pull.timezoneHint": "Los días se interpretan en la zona horaria {{timeZone}} que utiliza Tillio.",
|
|
71
|
+
"tillio.pull.title": "Obtener llamadas de Tillio",
|
|
72
|
+
"tillio.title": "Telefonía Tillio"
|
|
73
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tillio.description": "phone_calls 허브를 위한 Tillio VoIP 공급자(Ringostat 오퍼레이터).",
|
|
3
|
+
"tillio.errors.appUrlMissing": "APP_URL이 설정되지 않아 오퍼레이터 웹훅 도메인을 만들 수 없습니다.",
|
|
4
|
+
"tillio.errors.attachFailed": "오퍼레이터를 연결하지 못했습니다.",
|
|
5
|
+
"tillio.errors.detachFailed": "오퍼레이터를 해제하지 못했습니다.",
|
|
6
|
+
"tillio.errors.environmentDrift": "오퍼레이터를 연결한 뒤 환경이 변경되었습니다. 해제한 다음 다시 연결하세요.",
|
|
7
|
+
"tillio.errors.environmentNotReady": "먼저 Tillio 자격 증명을 설정하고 상태 점검을 실행하세요.",
|
|
8
|
+
"tillio.errors.integrationDisabled": "Tillio 연동이 비활성화되어 있습니다. 먼저 활성화하세요.",
|
|
9
|
+
"tillio.errors.invalidOperatorId": "오퍼레이터 ID가 올바르지 않습니다.",
|
|
10
|
+
"tillio.errors.invalidPayload": "요청이 유효하지 않아 거부되었습니다.",
|
|
11
|
+
"tillio.errors.operatorLimit": "이미 연결된 오퍼레이터가 있습니다. 먼저 해제하세요.",
|
|
12
|
+
"tillio.errors.operatorMissing": "먼저 Tillio 오퍼레이터를 연결하세요.",
|
|
13
|
+
"tillio.errors.providerError": "Tillio가 요청을 거부했습니다.",
|
|
14
|
+
"tillio.errors.pullAlreadyRunning": "이미 가져오기가 실행 중입니다. 완료될 때까지 기다리세요.",
|
|
15
|
+
"tillio.errors.pullFailed": "Tillio에서 통화를 가져오지 못했습니다.",
|
|
16
|
+
"tillio.errors.revocationFailed": "Tillio 토큰을 폐기하지 못했습니다.",
|
|
17
|
+
"tillio.errors.unauthorized": "세션이 만료되었습니다. 다시 로그인하세요.",
|
|
18
|
+
"tillio.operators.active": "활성",
|
|
19
|
+
"tillio.operators.attach": "오퍼레이터 연결",
|
|
20
|
+
"tillio.operators.attachFailed": "오퍼레이터를 연결하지 못했습니다.",
|
|
21
|
+
"tillio.operators.attached": "오퍼레이터가 연결되었습니다.",
|
|
22
|
+
"tillio.operators.attaching": "연결하는 중...",
|
|
23
|
+
"tillio.operators.blocked": "검증에 의해 오퍼레이터 변경이 차단되었습니다.",
|
|
24
|
+
"tillio.operators.cancel": "취소",
|
|
25
|
+
"tillio.operators.copied": "웹훅 도메인이 복사되었습니다.",
|
|
26
|
+
"tillio.operators.copy": "복사",
|
|
27
|
+
"tillio.operators.copyFailed": "클립보드에 복사하지 못했습니다.",
|
|
28
|
+
"tillio.operators.detach": "연결 해제",
|
|
29
|
+
"tillio.operators.detachConfirmAction": "연결 해제",
|
|
30
|
+
"tillio.operators.detachConfirmText": "오퍼레이터가 제거되고 해당 Tillio 토큰이 취소됩니다. 이후에 다시 연결할 수 있습니다.",
|
|
31
|
+
"tillio.operators.detachConfirmTitle": "이 오퍼레이터의 연결을 해제할까요?",
|
|
32
|
+
"tillio.operators.detachFailed": "오퍼레이터의 연결을 해제하지 못했습니다.",
|
|
33
|
+
"tillio.operators.detached": "오퍼레이터의 연결이 해제되었습니다.",
|
|
34
|
+
"tillio.operators.detachedNotRevoked": "오퍼레이터를 제거했습니다. Tillio에서 토큰을 직접 취소하세요.",
|
|
35
|
+
"tillio.operators.driftText": "이 오퍼레이터를 연결한 뒤 환경이 변경되어 토큰이 유효하지 않을 수 있습니다. 연결을 해제한 다음 다시 연결하세요.",
|
|
36
|
+
"tillio.operators.driftTitle": "환경이 변경됨",
|
|
37
|
+
"tillio.operators.envNotReadyText": "오퍼레이터를 연결하기 전에 자격 증명 탭에서 Tillio API URL과 키를 저장한 다음 상태 확인을 실행하세요.",
|
|
38
|
+
"tillio.operators.envNotReadyTitle": "환경이 준비되지 않음",
|
|
39
|
+
"tillio.operators.forceDetachAction": "그래도 연결 해제",
|
|
40
|
+
"tillio.operators.forceDetachText": "Tillio 토큰을 취소하지 못했습니다. Tillio에서 직접 제거할 때까지 토큰은 계속 활성 상태입니다. 그래도 여기에서 오퍼레이터를 제거할까요?",
|
|
41
|
+
"tillio.operators.forceDetachTitle": "토큰 취소 없이 연결을 해제할까요?",
|
|
42
|
+
"tillio.operators.integrationDisabledTitle": "연동 비활성화됨",
|
|
43
|
+
"tillio.operators.keyRequired": "먼저 Ringostat 키를 입력하세요.",
|
|
44
|
+
"tillio.operators.loadFailed": "Tillio 오퍼레이터를 불러오지 못했습니다.",
|
|
45
|
+
"tillio.operators.loading": "오퍼레이터를 불러오는 중...",
|
|
46
|
+
"tillio.operators.retry": "다시 시도",
|
|
47
|
+
"tillio.operators.ringostatKey": "Ringostat 키",
|
|
48
|
+
"tillio.operators.ringostatKeyHint": "한 번에 하나의 오퍼레이터만 사용할 수 있습니다. 다른 오퍼레이터를 연결하려면 먼저 현재 오퍼레이터의 연결을 해제하세요.",
|
|
49
|
+
"tillio.operators.ringostatKeyPlaceholder": "Ringostat 연동 키를 붙여넣으세요",
|
|
50
|
+
"tillio.operators.stale": "만료됨",
|
|
51
|
+
"tillio.operators.tab": "오퍼레이터 구성",
|
|
52
|
+
"tillio.operators.webhookDomain": "웹훅 도메인 (X-Tenant-Domain)",
|
|
53
|
+
"tillio.operators.webhookHint": "Tillio가 웹훅을 이곳으로 전달하도록 오퍼레이터 패널에 이 URL을 등록하세요.",
|
|
54
|
+
"tillio.pull.action": "통화 가져오기",
|
|
55
|
+
"tillio.pull.blocked": "검증에 의해 가져오기가 차단되었습니다.",
|
|
56
|
+
"tillio.pull.cancel": "취소",
|
|
57
|
+
"tillio.pull.checkFailed": "Tillio 연결을 확인하지 못했습니다.",
|
|
58
|
+
"tillio.pull.checking": "Tillio 연결을 확인하는 중...",
|
|
59
|
+
"tillio.pull.confirm": "통화 가져오기",
|
|
60
|
+
"tillio.pull.description": "선택한 기간의 통화를 연결된 오퍼레이터에서 수집합니다. 같은 기간을 다시 가져오면 통화가 중복되지 않고 기존 통화가 업데이트됩니다.",
|
|
61
|
+
"tillio.pull.envDrift": "오퍼레이터를 연결한 뒤 Tillio 환경이 변경되었습니다. 통화를 가져오기 전에 연결을 해제한 다음 다시 연결하세요.",
|
|
62
|
+
"tillio.pull.envNotReady": "먼저 연동 페이지에서 Tillio 자격 증명을 구성하고 상태 확인을 실행하세요.",
|
|
63
|
+
"tillio.pull.failed": "Tillio에서 통화를 가져오지 못했습니다.",
|
|
64
|
+
"tillio.pull.notReadyTitle": "Tillio가 준비되지 않음",
|
|
65
|
+
"tillio.pull.operatorMissing": "통화를 가져오기 전에 연동 페이지에서 Tillio 오퍼레이터를 연결하세요.",
|
|
66
|
+
"tillio.pull.pulling": "가져오는 중...",
|
|
67
|
+
"tillio.pull.queued": "Tillio에서 통화를 가져오는 중입니다. 진행 상황은 진행률 표시줄에서 확인하세요.",
|
|
68
|
+
"tillio.pull.rangeRequired": "먼저 기간을 선택하세요.",
|
|
69
|
+
"tillio.pull.retry": "다시 시도",
|
|
70
|
+
"tillio.pull.timezoneHint": "날짜는 Tillio가 사용하는 {{timeZone}} 시간대를 기준으로 해석됩니다.",
|
|
71
|
+
"tillio.pull.title": "Tillio에서 통화 가져오기",
|
|
72
|
+
"tillio.title": "Tillio 전화 연동"
|
|
73
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tillio.description": "Dostawca VoIP Tillio dla huba phone_calls (operator Ringostat).",
|
|
3
|
+
"tillio.errors.appUrlMissing": "APP_URL nie jest skonfigurowany, więc nie da się wyznaczyć domeny webhooka operatora.",
|
|
4
|
+
"tillio.errors.attachFailed": "Nie udało się podłączyć operatora.",
|
|
5
|
+
"tillio.errors.detachFailed": "Nie udało się odłączyć operatora.",
|
|
6
|
+
"tillio.errors.environmentDrift": "Środowisko zmieniło się po podłączeniu operatora. Odłącz go i podłącz ponownie.",
|
|
7
|
+
"tillio.errors.environmentNotReady": "Najpierw skonfiguruj poświadczenia Tillio i uruchom sprawdzenie połączenia.",
|
|
8
|
+
"tillio.errors.integrationDisabled": "Integracja Tillio jest wyłączona. Najpierw ją włącz.",
|
|
9
|
+
"tillio.errors.invalidOperatorId": "Ten identyfikator operatora jest nieprawidłowy.",
|
|
10
|
+
"tillio.errors.invalidPayload": "Żądanie zostało odrzucone jako nieprawidłowe.",
|
|
11
|
+
"tillio.errors.operatorLimit": "Operator jest już podłączony. Najpierw go odłącz.",
|
|
12
|
+
"tillio.errors.operatorMissing": "Najpierw podłącz operatora Tillio.",
|
|
13
|
+
"tillio.errors.providerError": "Tillio odrzuciło żądanie.",
|
|
14
|
+
"tillio.errors.pullAlreadyRunning": "Pobieranie już trwa. Poczekaj, aż się zakończy.",
|
|
15
|
+
"tillio.errors.pullFailed": "Nie udało się pobrać połączeń z Tillio.",
|
|
16
|
+
"tillio.errors.revocationFailed": "Nie udało się unieważnić tokenu Tillio.",
|
|
17
|
+
"tillio.errors.unauthorized": "Sesja wygasła. Zaloguj się ponownie.",
|
|
18
|
+
"tillio.operators.active": "Aktywny",
|
|
19
|
+
"tillio.operators.attach": "Podepnij operatora",
|
|
20
|
+
"tillio.operators.attachFailed": "Nie udało się podpiąć operatora.",
|
|
21
|
+
"tillio.operators.attached": "Operator podpięty.",
|
|
22
|
+
"tillio.operators.attaching": "Podpinanie...",
|
|
23
|
+
"tillio.operators.blocked": "Zmiana operatora zablokowana przez walidację.",
|
|
24
|
+
"tillio.operators.cancel": "Anuluj",
|
|
25
|
+
"tillio.operators.copied": "Domena webhooka skopiowana.",
|
|
26
|
+
"tillio.operators.copy": "Kopiuj",
|
|
27
|
+
"tillio.operators.copyFailed": "Nie udało się skopiować do schowka.",
|
|
28
|
+
"tillio.operators.detach": "Odepnij",
|
|
29
|
+
"tillio.operators.detachConfirmAction": "Odepnij",
|
|
30
|
+
"tillio.operators.detachConfirmText": "Operator zostanie usunięty, a jego token Tillio unieważniony. Możesz podpiąć go ponownie później.",
|
|
31
|
+
"tillio.operators.detachConfirmTitle": "Odpiąć tego operatora?",
|
|
32
|
+
"tillio.operators.detachFailed": "Nie udało się odpiąć operatora.",
|
|
33
|
+
"tillio.operators.detached": "Operator odpięty.",
|
|
34
|
+
"tillio.operators.detachedNotRevoked": "Operator usunięty. Unieważnij jego token ręcznie w Tillio.",
|
|
35
|
+
"tillio.operators.driftText": "Środowisko zmieniło się po podpięciu tego operatora, więc jego token może być nieważny. Odepnij i podepnij go ponownie.",
|
|
36
|
+
"tillio.operators.driftTitle": "Środowisko zmienione",
|
|
37
|
+
"tillio.operators.envNotReadyText": "Zapisz adres URL i klucz API Tillio w zakładce Poświadczenia, a następnie uruchom Check, zanim podepniesz operatora.",
|
|
38
|
+
"tillio.operators.envNotReadyTitle": "Środowisko niegotowe",
|
|
39
|
+
"tillio.operators.forceDetachAction": "Odepnij mimo to",
|
|
40
|
+
"tillio.operators.forceDetachText": "Nie udało się unieważnić tokena Tillio, więc pozostaje aktywny, dopóki nie usuniesz go w Tillio. Usunąć operatora tutaj mimo to?",
|
|
41
|
+
"tillio.operators.forceDetachTitle": "Odpiąć bez unieważnienia tokena?",
|
|
42
|
+
"tillio.operators.integrationDisabledTitle": "Integracja wyłączona",
|
|
43
|
+
"tillio.operators.keyRequired": "Najpierw wpisz klucz Ringostat.",
|
|
44
|
+
"tillio.operators.loadFailed": "Nie udało się wczytać operatorów Tillio.",
|
|
45
|
+
"tillio.operators.loading": "Wczytywanie operatorów...",
|
|
46
|
+
"tillio.operators.retry": "Spróbuj ponownie",
|
|
47
|
+
"tillio.operators.ringostatKey": "Klucz Ringostat",
|
|
48
|
+
"tillio.operators.ringostatKeyHint": "Jeden operator naraz. Odepnij obecnego przed podpięciem kolejnego.",
|
|
49
|
+
"tillio.operators.ringostatKeyPlaceholder": "Wklej klucz integracji Ringostat",
|
|
50
|
+
"tillio.operators.stale": "Nieaktualny",
|
|
51
|
+
"tillio.operators.tab": "Konfiguracja operatora",
|
|
52
|
+
"tillio.operators.webhookDomain": "Domena webhooka (X-Tenant-Domain)",
|
|
53
|
+
"tillio.operators.webhookHint": "Zarejestruj ten URL w panelu operatora, aby Tillio przekazywało tu swoje webhooki.",
|
|
54
|
+
"tillio.pull.action": "Pobierz połączenia",
|
|
55
|
+
"tillio.pull.blocked": "Pobieranie zablokowane przez walidację.",
|
|
56
|
+
"tillio.pull.cancel": "Anuluj",
|
|
57
|
+
"tillio.pull.checkFailed": "Nie udało się sprawdzić połączenia z Tillio.",
|
|
58
|
+
"tillio.pull.checking": "Sprawdzanie połączenia z Tillio...",
|
|
59
|
+
"tillio.pull.confirm": "Pobierz połączenia",
|
|
60
|
+
"tillio.pull.description": "Połączenia z wybranego zakresu zostaną zaciągnięte od podpiętego operatora. Ponowne pobranie tego samego zakresu aktualizuje istniejące połączenia, zamiast je duplikować.",
|
|
61
|
+
"tillio.pull.envDrift": "Środowisko Tillio zmieniło się po podpięciu operatora. Odepnij i podepnij go ponownie przed pobraniem połączeń.",
|
|
62
|
+
"tillio.pull.envNotReady": "Najpierw skonfiguruj poświadczenia Tillio i uruchom Check na stronie integracji.",
|
|
63
|
+
"tillio.pull.failed": "Nie udało się pobrać połączeń z Tillio.",
|
|
64
|
+
"tillio.pull.notReadyTitle": "Tillio niegotowe",
|
|
65
|
+
"tillio.pull.operatorMissing": "Podepnij operatora Tillio na stronie integracji, zanim pobierzesz połączenia.",
|
|
66
|
+
"tillio.pull.pulling": "Pobieranie...",
|
|
67
|
+
"tillio.pull.queued": "Pobieranie połączeń z Tillio. Postęp śledzisz na pasku postępu.",
|
|
68
|
+
"tillio.pull.rangeRequired": "Najpierw wybierz zakres dat.",
|
|
69
|
+
"tillio.pull.retry": "Spróbuj ponownie",
|
|
70
|
+
"tillio.pull.timezoneHint": "Dni są interpretowane w strefie {{timeZone}}, której używa Tillio.",
|
|
71
|
+
"tillio.pull.title": "Pobierz połączenia z Tillio",
|
|
72
|
+
"tillio.title": "Telefonia Tillio"
|
|
73
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { buildIntegrationDetailWidgetSpotId, type IntegrationBundle, type IntegrationDefinition } from '@open-mercato/shared/modules/integrations/types'
|
|
2
|
+
|
|
3
|
+
// Two names for one value on purpose: the integration registry keys credentials by the integration id
|
|
4
|
+
// while the phone_calls hub keys calls by the provider key, and the two axes need not agree.
|
|
5
|
+
export const TILLIO_INTEGRATION_ID = 'tillio'
|
|
6
|
+
export const TILLIO_PROVIDER_KEY = 'tillio'
|
|
7
|
+
|
|
8
|
+
export const tillioDetailWidgetSpotId = buildIntegrationDetailWidgetSpotId(TILLIO_INTEGRATION_ID)
|
|
9
|
+
|
|
10
|
+
export const integration: IntegrationDefinition = {
|
|
11
|
+
id: TILLIO_INTEGRATION_ID,
|
|
12
|
+
title: 'Tillio',
|
|
13
|
+
description: 'VoIP bridge for the phone_calls hub. Configure the Tillio environment, then attach one Ringostat operator.',
|
|
14
|
+
category: 'communication',
|
|
15
|
+
hub: 'phone_calls',
|
|
16
|
+
providerKey: TILLIO_PROVIDER_KEY,
|
|
17
|
+
icon: 'phone-call',
|
|
18
|
+
package: '@open-mercato/tillio',
|
|
19
|
+
version: '1.0.0',
|
|
20
|
+
author: 'Open Mercato Team',
|
|
21
|
+
license: 'MIT',
|
|
22
|
+
tags: ['tillio', 'voip', 'phone-calls', 'telephony', 'ringostat'],
|
|
23
|
+
detailPage: {
|
|
24
|
+
widgetSpotId: tillioDetailWidgetSpotId,
|
|
25
|
+
},
|
|
26
|
+
credentials: {
|
|
27
|
+
fields: [
|
|
28
|
+
{
|
|
29
|
+
key: 'apiUrl',
|
|
30
|
+
label: 'Tillio API URL',
|
|
31
|
+
type: 'url',
|
|
32
|
+
required: true,
|
|
33
|
+
placeholder: 'https://your-tillio-instance.example.com',
|
|
34
|
+
helpText: 'Base URL of your Tillio environment.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: 'apiKey',
|
|
38
|
+
label: 'Tillio API Key',
|
|
39
|
+
type: 'secret',
|
|
40
|
+
required: true,
|
|
41
|
+
helpText: 'Global application key (X-Api-Key) for your Tillio environment.',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'timeZone',
|
|
45
|
+
label: 'Tillio time zone',
|
|
46
|
+
type: 'text',
|
|
47
|
+
required: false,
|
|
48
|
+
placeholder: 'Europe/Warsaw',
|
|
49
|
+
helpText: 'IANA zone the instance reports call timestamps in. Leave empty for Europe/Warsaw.',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
healthCheck: { service: 'tillioEnvironmentHealthCheck' },
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const integrations: IntegrationDefinition[] = [integration]
|
|
57
|
+
export const bundles: IntegrationBundle[] = []
|
|
58
|
+
export const bundle: IntegrationBundle | undefined = undefined
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { PhoneCallProviderAdapter } from '@open-mercato/shared/modules/phone_calls/provider'
|
|
3
|
+
import type {
|
|
4
|
+
FetchPhoneCallsInput,
|
|
5
|
+
NormalizedPhoneCall,
|
|
6
|
+
NormalizedPhoneCallBatch,
|
|
7
|
+
PhoneCallBatchAnomaly,
|
|
8
|
+
ProviderValidationResult,
|
|
9
|
+
ValidatePhoneCallProviderInput,
|
|
10
|
+
} from '@open-mercato/shared/modules/phone_calls/types'
|
|
11
|
+
import { TILLIO_PROVIDER_KEY } from '../integration'
|
|
12
|
+
import { TillioApiError } from './errors'
|
|
13
|
+
import { createTillioClient, type TillioClientDeps } from './client'
|
|
14
|
+
import { ENV_PROBE_TENANT_DOMAIN, environmentSchema } from './environment'
|
|
15
|
+
import { normalizeTillioCall } from './normalizer'
|
|
16
|
+
import { operatorPluginSchema } from './operators-store'
|
|
17
|
+
import { formatTillioTimestamp, TILLIO_TIMEZONE } from './tz'
|
|
18
|
+
|
|
19
|
+
export const TILLIO_DEFAULT_BATCH_LIMIT = 500
|
|
20
|
+
|
|
21
|
+
const pullCredentialsSchema = z.object({
|
|
22
|
+
apiUrl: z.string().trim().min(1),
|
|
23
|
+
apiKey: z.string().trim().min(1),
|
|
24
|
+
tenantSystemId: z.string().trim().min(1),
|
|
25
|
+
timeZone: z.string().trim().optional(),
|
|
26
|
+
operator: z.object({
|
|
27
|
+
id: z.string().trim().min(1),
|
|
28
|
+
plugin: operatorPluginSchema,
|
|
29
|
+
token: z.string().trim().min(1),
|
|
30
|
+
tenantDomain: z.string().trim().min(1),
|
|
31
|
+
}),
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
export type TillioPullCredentials = z.infer<typeof pullCredentialsSchema>
|
|
35
|
+
|
|
36
|
+
function parseCursor(cursor: string | null | undefined): number {
|
|
37
|
+
if (!cursor) return 1
|
|
38
|
+
const parsed = Number(cursor)
|
|
39
|
+
if (!Number.isFinite(parsed) || parsed < 1) return 1
|
|
40
|
+
return Math.trunc(parsed)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// `deps` only carries the outbound-fetch test seams down to the client; production builds
|
|
44
|
+
// the adapter without them and gets URL validation plus DNS pinning from `safeOutboundFetch`.
|
|
45
|
+
export function createTillioAdapter(deps: TillioClientDeps = {}): PhoneCallProviderAdapter {
|
|
46
|
+
return {
|
|
47
|
+
providerKey: TILLIO_PROVIDER_KEY,
|
|
48
|
+
displayName: 'Tillio',
|
|
49
|
+
|
|
50
|
+
async validateConnection(input: ValidatePhoneCallProviderInput): Promise<ProviderValidationResult> {
|
|
51
|
+
const parsed = environmentSchema.safeParse(input.credentials)
|
|
52
|
+
if (!parsed.success || !parsed.data.tenantSystemId) {
|
|
53
|
+
return { ok: false, message: 'Tillio environment is not configured.' }
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const client = createTillioClient({
|
|
57
|
+
apiUrl: parsed.data.apiUrl,
|
|
58
|
+
apiKey: parsed.data.apiKey,
|
|
59
|
+
tenantSystemId: parsed.data.tenantSystemId,
|
|
60
|
+
}, deps)
|
|
61
|
+
await client.getPlugins(ENV_PROBE_TENANT_DOMAIN)
|
|
62
|
+
return { ok: true }
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const message = err instanceof TillioApiError || err instanceof Error ? err.message : 'Validation failed'
|
|
65
|
+
return { ok: false, message }
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
async fetchCalls(input: FetchPhoneCallsInput): Promise<NormalizedPhoneCallBatch> {
|
|
70
|
+
const credentials = pullCredentialsSchema.parse(input.credentials)
|
|
71
|
+
const { operator } = credentials
|
|
72
|
+
const client = createTillioClient({
|
|
73
|
+
apiUrl: credentials.apiUrl,
|
|
74
|
+
apiKey: credentials.apiKey,
|
|
75
|
+
tenantSystemId: credentials.tenantSystemId,
|
|
76
|
+
}, deps)
|
|
77
|
+
|
|
78
|
+
const timeZone = credentials.timeZone ?? TILLIO_TIMEZONE
|
|
79
|
+
const from = input.from ? formatTillioTimestamp(input.from, timeZone) : undefined
|
|
80
|
+
const to = input.to ? formatTillioTimestamp(input.to, timeZone) : undefined
|
|
81
|
+
const limit = input.limit && input.limit > 0 ? Math.trunc(input.limit) : TILLIO_DEFAULT_BATCH_LIMIT
|
|
82
|
+
|
|
83
|
+
const calls: NormalizedPhoneCall[] = []
|
|
84
|
+
let page = parseCursor(input.cursor)
|
|
85
|
+
let nextCursor: string | null = null
|
|
86
|
+
let anomaly: PhoneCallBatchAnomaly | null = null
|
|
87
|
+
let anomalyCursor: string | null = null
|
|
88
|
+
|
|
89
|
+
while (true) {
|
|
90
|
+
const response = await client.getCalls({
|
|
91
|
+
tenantDomain: operator.tenantDomain,
|
|
92
|
+
token: operator.token,
|
|
93
|
+
from,
|
|
94
|
+
to,
|
|
95
|
+
page,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
for (const rawCall of response.calls) {
|
|
99
|
+
calls.push(normalizeTillioCall(rawCall, { operatorId: operator.id, plugin: operator.plugin, timeZone }))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// These stop a broken response from spinning the loop forever, and they are reported
|
|
103
|
+
// rather than swallowed: a provider that ignores `page` answers one page and looks
|
|
104
|
+
// finished, which would turn a partial sweep into a clean one.
|
|
105
|
+
const { pages, page: echoedPage } = response.pagination
|
|
106
|
+
if (echoedPage !== page) {
|
|
107
|
+
anomaly = 'page_not_echoed'
|
|
108
|
+
} else if (pages < 1) {
|
|
109
|
+
anomaly = 'invalid_page_count'
|
|
110
|
+
} else if (page < pages && response.calls.length === 0) {
|
|
111
|
+
anomaly = 'empty_page'
|
|
112
|
+
}
|
|
113
|
+
if (anomaly) {
|
|
114
|
+
anomalyCursor = String(page)
|
|
115
|
+
break
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Reaching the last page is ordinary exhaustion, not an anomaly.
|
|
119
|
+
if (page >= pages) break
|
|
120
|
+
|
|
121
|
+
page += 1
|
|
122
|
+
// The current page is always drained before stopping, so the cursor never
|
|
123
|
+
// advances past calls we did not collect.
|
|
124
|
+
if (calls.length >= limit) {
|
|
125
|
+
nextCursor = String(page)
|
|
126
|
+
break
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return { calls, nextCursor, anomaly, anomalyCursor }
|
|
131
|
+
},
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export const tillioAdapter: PhoneCallProviderAdapter = createTillioAdapter()
|