@openclaw/voice-call 2026.3.13 → 2026.5.1-beta.1

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.
Files changed (103) hide show
  1. package/README.md +25 -5
  2. package/api.ts +16 -0
  3. package/cli-metadata.ts +10 -0
  4. package/config-api.ts +12 -0
  5. package/index.test.ts +866 -0
  6. package/index.ts +353 -148
  7. package/openclaw.plugin.json +336 -157
  8. package/package.json +33 -5
  9. package/runtime-api.ts +20 -0
  10. package/runtime-entry.ts +1 -0
  11. package/setup-api.ts +47 -0
  12. package/src/allowlist.test.ts +18 -0
  13. package/src/cli.ts +533 -68
  14. package/src/config-compat.test.ts +120 -0
  15. package/src/config-compat.ts +227 -0
  16. package/src/config.test.ts +160 -12
  17. package/src/config.ts +243 -74
  18. package/src/core-bridge.ts +2 -147
  19. package/src/deep-merge.test.ts +40 -0
  20. package/src/gateway-continue-operation.ts +200 -0
  21. package/src/http-headers.ts +6 -3
  22. package/src/manager/context.ts +6 -5
  23. package/src/manager/events.test.ts +179 -19
  24. package/src/manager/events.ts +48 -30
  25. package/src/manager/lifecycle.ts +53 -0
  26. package/src/manager/lookup.test.ts +52 -0
  27. package/src/manager/outbound.test.ts +464 -0
  28. package/src/manager/outbound.ts +148 -55
  29. package/src/manager/store.ts +18 -6
  30. package/src/manager/timers.test.ts +129 -0
  31. package/src/manager/timers.ts +4 -3
  32. package/src/manager/twiml.test.ts +13 -0
  33. package/src/manager/twiml.ts +8 -0
  34. package/src/manager.closed-loop.test.ts +30 -12
  35. package/src/manager.inbound-allowlist.test.ts +77 -10
  36. package/src/manager.notify.test.ts +344 -20
  37. package/src/manager.restore.test.ts +95 -8
  38. package/src/manager.test-harness.ts +8 -6
  39. package/src/manager.ts +79 -5
  40. package/src/media-stream.test.ts +578 -81
  41. package/src/media-stream.ts +235 -54
  42. package/src/providers/base.ts +19 -0
  43. package/src/providers/mock.ts +7 -1
  44. package/src/providers/plivo.test.ts +50 -6
  45. package/src/providers/plivo.ts +14 -6
  46. package/src/providers/shared/call-status.ts +2 -1
  47. package/src/providers/shared/guarded-json-api.test.ts +106 -0
  48. package/src/providers/shared/guarded-json-api.ts +1 -1
  49. package/src/providers/telnyx.test.ts +178 -6
  50. package/src/providers/telnyx.ts +40 -3
  51. package/src/providers/twilio/api.test.ts +145 -0
  52. package/src/providers/twilio/api.ts +67 -16
  53. package/src/providers/twilio/twiml-policy.ts +6 -10
  54. package/src/providers/twilio/webhook.ts +1 -1
  55. package/src/providers/twilio.test.ts +425 -25
  56. package/src/providers/twilio.ts +230 -77
  57. package/src/providers/twilio.types.ts +17 -0
  58. package/src/realtime-defaults.ts +3 -0
  59. package/src/realtime-fast-context.test.ts +88 -0
  60. package/src/realtime-fast-context.ts +165 -0
  61. package/src/realtime-transcription.runtime.ts +4 -0
  62. package/src/realtime-voice.runtime.ts +5 -0
  63. package/src/response-generator.test.ts +277 -0
  64. package/src/response-generator.ts +186 -40
  65. package/src/response-model.test.ts +71 -0
  66. package/src/response-model.ts +23 -0
  67. package/src/runtime.test.ts +351 -0
  68. package/src/runtime.ts +254 -24
  69. package/src/telephony-audio.test.ts +61 -0
  70. package/src/telephony-audio.ts +1 -79
  71. package/src/telephony-tts.test.ts +133 -12
  72. package/src/telephony-tts.ts +155 -2
  73. package/src/test-fixtures.ts +26 -7
  74. package/src/tts-provider-voice.test.ts +34 -0
  75. package/src/tts-provider-voice.ts +21 -0
  76. package/src/tunnel.test.ts +166 -0
  77. package/src/tunnel.ts +1 -1
  78. package/src/types.ts +24 -37
  79. package/src/utils.test.ts +17 -0
  80. package/src/voice-mapping.test.ts +34 -0
  81. package/src/voice-mapping.ts +3 -2
  82. package/src/webhook/realtime-handler.test.ts +598 -0
  83. package/src/webhook/realtime-handler.ts +485 -0
  84. package/src/webhook/stale-call-reaper.test.ts +88 -0
  85. package/src/webhook/stale-call-reaper.ts +5 -0
  86. package/src/webhook/tailscale.test.ts +214 -0
  87. package/src/webhook/tailscale.ts +19 -5
  88. package/src/webhook-exposure.test.ts +33 -0
  89. package/src/webhook-exposure.ts +84 -0
  90. package/src/webhook-security.test.ts +172 -21
  91. package/src/webhook-security.ts +43 -29
  92. package/src/webhook.hangup-once.lifecycle.test.ts +135 -0
  93. package/src/webhook.test.ts +1145 -27
  94. package/src/webhook.ts +513 -100
  95. package/src/webhook.types.ts +5 -0
  96. package/src/websocket-test-support.ts +72 -0
  97. package/tsconfig.json +16 -0
  98. package/CHANGELOG.md +0 -121
  99. package/src/providers/index.ts +0 -10
  100. package/src/providers/stt-openai-realtime.test.ts +0 -42
  101. package/src/providers/stt-openai-realtime.ts +0 -311
  102. package/src/providers/tts-openai.test.ts +0 -43
  103. package/src/providers/tts-openai.ts +0 -221
@@ -1,5 +1,24 @@
1
1
  {
2
2
  "id": "voice-call",
3
+ "commandAliases": [{ "name": "voicecall" }],
4
+ "activation": {
5
+ "onStartup": true,
6
+ "onCommands": ["voicecall"]
7
+ },
8
+ "channelEnvVars": {
9
+ "voice-call": [
10
+ "TELNYX_API_KEY",
11
+ "TELNYX_CONNECTION_ID",
12
+ "TELNYX_PUBLIC_KEY",
13
+ "TWILIO_ACCOUNT_SID",
14
+ "TWILIO_AUTH_TOKEN",
15
+ "TWILIO_FROM_NUMBER",
16
+ "PLIVO_AUTH_ID",
17
+ "PLIVO_AUTH_TOKEN",
18
+ "NGROK_AUTHTOKEN",
19
+ "NGROK_DOMAIN"
20
+ ]
21
+ },
3
22
  "uiHints": {
4
23
  "provider": {
5
24
  "label": "Provider",
@@ -86,52 +105,73 @@
86
105
  "label": "Enable Streaming",
87
106
  "advanced": true
88
107
  },
89
- "streaming.openaiApiKey": {
90
- "label": "OpenAI Realtime API Key",
91
- "sensitive": true,
108
+ "streaming.provider": {
109
+ "label": "Streaming Provider",
110
+ "help": "Uses the first registered realtime transcription provider when unset.",
92
111
  "advanced": true
93
112
  },
94
- "streaming.sttModel": {
95
- "label": "Realtime STT Model",
113
+ "streaming.providers": {
114
+ "label": "Streaming Provider Config",
96
115
  "advanced": true
97
116
  },
98
117
  "streaming.streamPath": {
99
118
  "label": "Media Stream Path",
100
119
  "advanced": true
101
120
  },
102
- "tts.provider": {
103
- "label": "TTS Provider Override",
104
- "help": "Deep-merges with messages.tts (Edge is ignored for calls).",
121
+ "realtime.enabled": {
122
+ "label": "Enable Realtime Voice",
105
123
  "advanced": true
106
124
  },
107
- "tts.openai.model": {
108
- "label": "OpenAI TTS Model",
125
+ "realtime.provider": {
126
+ "label": "Realtime Voice Provider",
127
+ "help": "Uses the first registered realtime voice provider when unset.",
109
128
  "advanced": true
110
129
  },
111
- "tts.openai.voice": {
112
- "label": "OpenAI TTS Voice",
130
+ "realtime.streamPath": {
131
+ "label": "Realtime Stream Path",
113
132
  "advanced": true
114
133
  },
115
- "tts.openai.apiKey": {
116
- "label": "OpenAI API Key",
117
- "sensitive": true,
134
+ "realtime.instructions": {
135
+ "label": "Realtime Instructions",
118
136
  "advanced": true
119
137
  },
120
- "tts.elevenlabs.modelId": {
121
- "label": "ElevenLabs Model ID",
138
+ "realtime.toolPolicy": {
139
+ "label": "Realtime Tool Policy",
140
+ "help": "Controls the shared openclaw_agent_consult tool.",
122
141
  "advanced": true
123
142
  },
124
- "tts.elevenlabs.voiceId": {
125
- "label": "ElevenLabs Voice ID",
143
+ "realtime.fastContext.enabled": {
144
+ "label": "Enable Fast Realtime Context",
145
+ "help": "Searches memory/session context before the full consult agent.",
126
146
  "advanced": true
127
147
  },
128
- "tts.elevenlabs.apiKey": {
129
- "label": "ElevenLabs API Key",
130
- "sensitive": true,
148
+ "realtime.fastContext.timeoutMs": {
149
+ "label": "Fast Context Timeout",
150
+ "advanced": true
151
+ },
152
+ "realtime.fastContext.maxResults": {
153
+ "label": "Fast Context Result Limit",
154
+ "advanced": true
155
+ },
156
+ "realtime.fastContext.sources": {
157
+ "label": "Fast Context Sources",
131
158
  "advanced": true
132
159
  },
133
- "tts.elevenlabs.baseUrl": {
134
- "label": "ElevenLabs Base URL",
160
+ "realtime.fastContext.fallbackToConsult": {
161
+ "label": "Fallback To Full Consult",
162
+ "advanced": true
163
+ },
164
+ "realtime.providers": {
165
+ "label": "Realtime Provider Config",
166
+ "advanced": true
167
+ },
168
+ "tts.provider": {
169
+ "label": "TTS Provider Override",
170
+ "help": "Deep-merges with messages.tts (Microsoft is ignored for calls).",
171
+ "advanced": true
172
+ },
173
+ "tts.providers": {
174
+ "label": "TTS Provider Config",
135
175
  "advanced": true
136
176
  },
137
177
  "publicUrl": {
@@ -148,6 +188,7 @@
148
188
  },
149
189
  "responseModel": {
150
190
  "label": "Response Model",
191
+ "help": "Optional override. Falls back to the runtime default model when unset.",
151
192
  "advanced": true
152
193
  },
153
194
  "responseSystemPrompt": {
@@ -193,7 +234,7 @@
193
234
  "type": "string"
194
235
  },
195
236
  "authToken": {
196
- "type": "string"
237
+ "type": ["string", "object"]
197
238
  }
198
239
  }
199
240
  },
@@ -345,28 +386,19 @@
345
386
  "enabled": {
346
387
  "type": "boolean"
347
388
  },
348
- "sttProvider": {
349
- "type": "string",
350
- "enum": ["openai-realtime"]
351
- },
352
- "openaiApiKey": {
353
- "type": "string"
354
- },
355
- "sttModel": {
389
+ "provider": {
356
390
  "type": "string"
357
391
  },
358
- "silenceDurationMs": {
359
- "type": "integer",
360
- "minimum": 1
361
- },
362
- "vadThreshold": {
363
- "type": "number",
364
- "minimum": 0,
365
- "maximum": 1
366
- },
367
392
  "streamPath": {
368
393
  "type": "string"
369
394
  },
395
+ "providers": {
396
+ "type": "object",
397
+ "additionalProperties": {
398
+ "type": "object",
399
+ "additionalProperties": true
400
+ }
401
+ },
370
402
  "preStartTimeoutMs": {
371
403
  "type": "integer",
372
404
  "minimum": 1
@@ -385,25 +417,110 @@
385
417
  }
386
418
  }
387
419
  },
388
- "publicUrl": {
389
- "type": "string"
390
- },
391
- "skipSignatureVerification": {
392
- "type": "boolean"
393
- },
394
- "stt": {
420
+ "realtime": {
395
421
  "type": "object",
396
422
  "additionalProperties": false,
397
423
  "properties": {
424
+ "enabled": {
425
+ "type": "boolean"
426
+ },
398
427
  "provider": {
399
- "type": "string",
400
- "enum": ["openai"]
428
+ "type": "string"
401
429
  },
402
- "model": {
430
+ "streamPath": {
403
431
  "type": "string"
432
+ },
433
+ "instructions": {
434
+ "type": "string"
435
+ },
436
+ "toolPolicy": {
437
+ "type": "string",
438
+ "enum": ["safe-read-only", "owner", "none"]
439
+ },
440
+ "tools": {
441
+ "type": "array",
442
+ "items": {
443
+ "type": "object",
444
+ "additionalProperties": false,
445
+ "properties": {
446
+ "type": {
447
+ "type": "string",
448
+ "enum": ["function"]
449
+ },
450
+ "name": {
451
+ "type": "string"
452
+ },
453
+ "description": {
454
+ "type": "string"
455
+ },
456
+ "parameters": {
457
+ "type": "object",
458
+ "additionalProperties": false,
459
+ "properties": {
460
+ "type": {
461
+ "type": "string",
462
+ "enum": ["object"]
463
+ },
464
+ "properties": {
465
+ "type": "object",
466
+ "additionalProperties": true
467
+ },
468
+ "required": {
469
+ "type": "array",
470
+ "items": {
471
+ "type": "string"
472
+ }
473
+ }
474
+ },
475
+ "required": ["type", "properties"]
476
+ }
477
+ },
478
+ "required": ["type", "name", "description", "parameters"]
479
+ }
480
+ },
481
+ "fastContext": {
482
+ "type": "object",
483
+ "additionalProperties": false,
484
+ "properties": {
485
+ "enabled": {
486
+ "type": "boolean"
487
+ },
488
+ "timeoutMs": {
489
+ "type": "number",
490
+ "minimum": 1
491
+ },
492
+ "maxResults": {
493
+ "type": "number",
494
+ "minimum": 1
495
+ },
496
+ "sources": {
497
+ "type": "array",
498
+ "minItems": 1,
499
+ "items": {
500
+ "type": "string",
501
+ "enum": ["memory", "sessions"]
502
+ }
503
+ },
504
+ "fallbackToConsult": {
505
+ "type": "boolean"
506
+ }
507
+ }
508
+ },
509
+ "providers": {
510
+ "type": "object",
511
+ "additionalProperties": {
512
+ "type": "object",
513
+ "additionalProperties": true
514
+ }
404
515
  }
405
516
  }
406
517
  },
518
+ "publicUrl": {
519
+ "type": "string"
520
+ },
521
+ "skipSignatureVerification": {
522
+ "type": "boolean"
523
+ },
407
524
  "tts": {
408
525
  "type": "object",
409
526
  "additionalProperties": false,
@@ -420,8 +537,7 @@
420
537
  "enum": ["final", "all"]
421
538
  },
422
539
  "provider": {
423
- "type": "string",
424
- "enum": ["openai", "elevenlabs", "edge"]
540
+ "type": "string"
425
541
  },
426
542
  "summaryModel": {
427
543
  "type": "string"
@@ -456,127 +572,179 @@
456
572
  }
457
573
  }
458
574
  },
459
- "elevenlabs": {
575
+ "providers": {
460
576
  "type": "object",
461
- "additionalProperties": false,
462
577
  "properties": {
463
- "apiKey": {
464
- "type": "string"
465
- },
466
- "baseUrl": {
467
- "type": "string"
468
- },
469
- "voiceId": {
470
- "type": "string"
471
- },
472
- "modelId": {
473
- "type": "string"
474
- },
475
- "seed": {
476
- "type": "integer",
477
- "minimum": 0,
478
- "maximum": 4294967295
479
- },
480
- "applyTextNormalization": {
481
- "type": "string",
482
- "enum": ["auto", "on", "off"]
483
- },
484
- "languageCode": {
485
- "type": "string"
486
- },
487
- "voiceSettings": {
578
+ "openai": {
488
579
  "type": "object",
489
580
  "additionalProperties": false,
490
581
  "properties": {
491
- "stability": {
492
- "type": "number",
493
- "minimum": 0,
494
- "maximum": 1
582
+ "apiKey": {
583
+ "type": ["string", "object"]
495
584
  },
496
- "similarityBoost": {
497
- "type": "number",
498
- "minimum": 0,
499
- "maximum": 1
585
+ "baseUrl": {
586
+ "type": "string"
500
587
  },
501
- "style": {
502
- "type": "number",
503
- "minimum": 0,
504
- "maximum": 1
588
+ "model": {
589
+ "type": "string"
505
590
  },
506
- "useSpeakerBoost": {
507
- "type": "boolean"
591
+ "voice": {
592
+ "type": "string"
508
593
  },
509
594
  "speed": {
510
595
  "type": "number",
511
- "minimum": 0.5,
512
- "maximum": 2
596
+ "minimum": 0.25,
597
+ "maximum": 4.0
598
+ },
599
+ "instructions": {
600
+ "type": "string"
513
601
  }
514
602
  }
515
- }
516
- }
517
- },
518
- "openai": {
519
- "type": "object",
520
- "additionalProperties": false,
521
- "properties": {
522
- "apiKey": {
523
- "type": "string"
524
- },
525
- "baseUrl": {
526
- "type": "string"
527
- },
528
- "model": {
529
- "type": "string"
530
603
  },
531
- "voice": {
532
- "type": "string"
604
+ "elevenlabs": {
605
+ "type": "object",
606
+ "additionalProperties": false,
607
+ "properties": {
608
+ "apiKey": {
609
+ "type": ["string", "object"]
610
+ },
611
+ "baseUrl": {
612
+ "type": "string"
613
+ },
614
+ "voiceId": {
615
+ "type": "string"
616
+ },
617
+ "modelId": {
618
+ "type": "string"
619
+ },
620
+ "seed": {
621
+ "type": "integer",
622
+ "minimum": 0,
623
+ "maximum": 4294967295
624
+ },
625
+ "applyTextNormalization": {
626
+ "type": "string",
627
+ "enum": ["auto", "on", "off"]
628
+ },
629
+ "languageCode": {
630
+ "type": "string"
631
+ },
632
+ "voiceSettings": {
633
+ "type": "object",
634
+ "additionalProperties": false,
635
+ "properties": {
636
+ "stability": {
637
+ "type": "number",
638
+ "minimum": 0,
639
+ "maximum": 1
640
+ },
641
+ "similarityBoost": {
642
+ "type": "number",
643
+ "minimum": 0,
644
+ "maximum": 1
645
+ },
646
+ "style": {
647
+ "type": "number",
648
+ "minimum": 0,
649
+ "maximum": 1
650
+ },
651
+ "useSpeakerBoost": {
652
+ "type": "boolean"
653
+ },
654
+ "speed": {
655
+ "type": "number",
656
+ "minimum": 0.5,
657
+ "maximum": 2
658
+ }
659
+ }
660
+ }
661
+ }
533
662
  },
534
- "speed": {
535
- "type": "number",
536
- "minimum": 0.25,
537
- "maximum": 4.0
663
+ "microsoft": {
664
+ "type": "object",
665
+ "additionalProperties": false,
666
+ "properties": {
667
+ "enabled": {
668
+ "type": "boolean"
669
+ },
670
+ "voice": {
671
+ "type": "string"
672
+ },
673
+ "lang": {
674
+ "type": "string"
675
+ },
676
+ "outputFormat": {
677
+ "type": "string"
678
+ },
679
+ "pitch": {
680
+ "type": "string"
681
+ },
682
+ "rate": {
683
+ "type": "string"
684
+ },
685
+ "volume": {
686
+ "type": "string"
687
+ },
688
+ "saveSubtitles": {
689
+ "type": "boolean"
690
+ },
691
+ "proxy": {
692
+ "type": "string"
693
+ },
694
+ "timeoutMs": {
695
+ "type": "integer",
696
+ "minimum": 1000,
697
+ "maximum": 120000
698
+ }
699
+ }
538
700
  },
539
- "instructions": {
540
- "type": "string"
701
+ "edge": {
702
+ "type": "object",
703
+ "additionalProperties": false,
704
+ "properties": {
705
+ "enabled": {
706
+ "type": "boolean"
707
+ },
708
+ "voice": {
709
+ "type": "string"
710
+ },
711
+ "lang": {
712
+ "type": "string"
713
+ },
714
+ "outputFormat": {
715
+ "type": "string"
716
+ },
717
+ "pitch": {
718
+ "type": "string"
719
+ },
720
+ "rate": {
721
+ "type": "string"
722
+ },
723
+ "volume": {
724
+ "type": "string"
725
+ },
726
+ "saveSubtitles": {
727
+ "type": "boolean"
728
+ },
729
+ "proxy": {
730
+ "type": "string"
731
+ },
732
+ "timeoutMs": {
733
+ "type": "integer",
734
+ "minimum": 1000,
735
+ "maximum": 120000
736
+ }
737
+ }
541
738
  }
542
- }
543
- },
544
- "edge": {
545
- "type": "object",
546
- "additionalProperties": false,
547
- "properties": {
548
- "enabled": {
549
- "type": "boolean"
550
- },
551
- "voice": {
552
- "type": "string"
553
- },
554
- "lang": {
555
- "type": "string"
556
- },
557
- "outputFormat": {
558
- "type": "string"
559
- },
560
- "pitch": {
561
- "type": "string"
562
- },
563
- "rate": {
564
- "type": "string"
565
- },
566
- "volume": {
567
- "type": "string"
568
- },
569
- "saveSubtitles": {
570
- "type": "boolean"
571
- },
572
- "proxy": {
573
- "type": "string"
739
+ },
740
+ "additionalProperties": {
741
+ "type": "object",
742
+ "properties": {
743
+ "apiKey": {
744
+ "type": ["string", "object"]
745
+ }
574
746
  },
575
- "timeoutMs": {
576
- "type": "integer",
577
- "minimum": 1000,
578
- "maximum": 120000
579
- }
747
+ "additionalProperties": true
580
748
  }
581
749
  },
582
750
  "prefsPath": {
@@ -607,5 +775,16 @@
607
775
  "minimum": 1
608
776
  }
609
777
  }
778
+ },
779
+ "configContracts": {
780
+ "compatibilityMigrationPaths": ["plugins.entries.voice-call.config"],
781
+ "secretInputs": {
782
+ "paths": [
783
+ { "path": "twilio.authToken", "expected": "string" },
784
+ { "path": "realtime.providers.*.apiKey", "expected": "string" },
785
+ { "path": "streaming.providers.*.apiKey", "expected": "string" },
786
+ { "path": "tts.providers.*.apiKey", "expected": "string" }
787
+ ]
788
+ }
610
789
  }
611
790
  }
package/package.json CHANGED
@@ -1,17 +1,45 @@
1
1
  {
2
2
  "name": "@openclaw/voice-call",
3
- "version": "2026.3.13",
3
+ "version": "2026.5.1-beta.1",
4
4
  "description": "OpenClaw voice-call plugin",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/openclaw/openclaw"
8
+ },
5
9
  "type": "module",
6
10
  "dependencies": {
7
- "@sinclair/typebox": "0.34.48",
8
11
  "commander": "^14.0.3",
9
- "ws": "^8.19.0",
10
- "zod": "^4.3.6"
12
+ "typebox": "1.1.37",
13
+ "ws": "^8.20.0"
14
+ },
15
+ "devDependencies": {
16
+ "@openclaw/plugin-sdk": "workspace:*",
17
+ "openclaw": "workspace:*"
18
+ },
19
+ "peerDependencies": {
20
+ "openclaw": ">=2026.4.25"
21
+ },
22
+ "peerDependenciesMeta": {
23
+ "openclaw": {
24
+ "optional": true
25
+ }
11
26
  },
12
27
  "openclaw": {
13
28
  "extensions": [
14
29
  "./index.ts"
15
- ]
30
+ ],
31
+ "install": {
32
+ "minHostVersion": ">=2026.4.10"
33
+ },
34
+ "compat": {
35
+ "pluginApi": ">=2026.4.25"
36
+ },
37
+ "build": {
38
+ "openclawVersion": "2026.5.1-beta.1"
39
+ },
40
+ "release": {
41
+ "publishToClawHub": true,
42
+ "publishToNpm": true
43
+ }
16
44
  }
17
45
  }
package/runtime-api.ts ADDED
@@ -0,0 +1,20 @@
1
+ // Private runtime barrel for the bundled Voice Call extension.
2
+ // Keep this barrel thin and aligned with the local extension surface.
3
+
4
+ export { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
5
+ export type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry";
6
+ export type { GatewayRequestHandlerOptions } from "openclaw/plugin-sdk/gateway-runtime";
7
+ export {
8
+ isRequestBodyLimitError,
9
+ readRequestBodyWithLimit,
10
+ requestBodyErrorToText,
11
+ } from "openclaw/plugin-sdk/webhook-request-guards";
12
+ export { fetchWithSsrFGuard, isBlockedHostnameOrIp } from "openclaw/plugin-sdk/ssrf-runtime";
13
+ export type { SessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
14
+ export {
15
+ TtsAutoSchema,
16
+ TtsConfigSchema,
17
+ TtsModeSchema,
18
+ TtsProviderSchema,
19
+ } from "openclaw/plugin-sdk/tts-runtime";
20
+ export { sleep } from "openclaw/plugin-sdk/runtime-env";
@@ -0,0 +1 @@
1
+ export { createVoiceCallRuntime, type VoiceCallRuntime } from "./src/runtime.js";