@trysaperly/voice-openclaw 0.1.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.
@@ -0,0 +1,67 @@
1
+ {
2
+ "id": "saperly-voice",
3
+ "activation": {
4
+ "onStartup": true
5
+ },
6
+ "enabledByDefault": false,
7
+ "contracts": {
8
+ "tools": ["saperly_voice_reply"]
9
+ },
10
+ "uiHints": {
11
+ "baseUrl": {
12
+ "label": "Saperly base URL",
13
+ "placeholder": "https://api.saperly.com",
14
+ "help": "Base URL of your Saperly deployment (no trailing /v2). Also settable via SAPERLY_BASE_URL."
15
+ },
16
+ "apiKey": {
17
+ "label": "Saperly API key (recommended)",
18
+ "placeholder": "sk_…",
19
+ "help": "An sk_ key. The channel auto-discovers + connects every MANUAL line the key is scoped to — one line for a single-line key, all of them for a workspace key. Prefer SAPERLY_API_KEY to keep it out of config files. (Use this OR connectionId+manualSecret.)"
20
+ },
21
+ "connectionId": {
22
+ "label": "Connection id (manual mode)",
23
+ "placeholder": "conn_123",
24
+ "help": "Bind one specific MANUAL connection (instead of API-key discovery). Also settable via SAPERLY_CONNECTION_ID."
25
+ },
26
+ "manualSecret": {
27
+ "label": "Manual secret (manual mode)",
28
+ "placeholder": "mc_…",
29
+ "help": "The connection's manualSecret (paired with connectionId). Prefer SAPERLY_MANUAL_SECRET to keep it out of config files."
30
+ },
31
+ "client": {
32
+ "label": "Client label",
33
+ "placeholder": "saperly-voice",
34
+ "help": "Free-form label stamped into the hello frame + wide-event trail. Also settable via SAPERLY_CLIENT."
35
+ },
36
+ "sessionKey": {
37
+ "label": "Session key template",
38
+ "placeholder": "saperly-voice:{conversationId}",
39
+ "help": "Optional template controlling how inbound calls/texts map to openclaw sessions. Placeholders: {conversationId}, {peer} (the caller/texter), {line} (your number), {connectionId}. Omit to isolate each conversation in its own session (the default). E.g. 'saperly-voice:main' = one shared chat; 'saperly-voice:peer:{peer}' = one per person. Also settable via SAPERLY_SESSION_KEY."
40
+ }
41
+ },
42
+ "configSchema": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "properties": {
46
+ "baseUrl": { "type": "string" },
47
+ "apiKey": { "type": "string" },
48
+ "connectionId": { "type": "string" },
49
+ "manualSecret": { "type": "string" },
50
+ "client": { "type": "string" },
51
+ "sessionKey": { "type": "string" },
52
+ "connections": {
53
+ "type": "array",
54
+ "items": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "connectionId": { "type": "string" },
59
+ "manualSecret": { "type": "string" },
60
+ "sessionKey": { "type": "string" }
61
+ },
62
+ "required": ["connectionId", "manualSecret"]
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@trysaperly/voice-openclaw",
3
+ "version": "0.1.0",
4
+ "description": "openclaw voice channel: bridges a Saperly manual-mode websocket to an openclaw agent so the agent is phone-reachable in its own context (its tools + memory), with Telnyx doing STT/TTS — media never touches this process.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "openclaw.plugin.json",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsdown",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "bun test",
25
+ "prepublishOnly": "bun run build"
26
+ },
27
+ "devDependencies": {
28
+ "@saperly/voice-protocol": "file:../../packages/voice-protocol",
29
+ "@types/bun": "1.3.14",
30
+ "effect": "4.0.0-beta.85",
31
+ "tsdown": "0.22.3",
32
+ "typescript": "6.0.3",
33
+ "unrun": "^0.3.1"
34
+ },
35
+ "peerDependencies": {
36
+ "openclaw": ">=2026.6.8"
37
+ },
38
+ "peerDependenciesMeta": {
39
+ "openclaw": {
40
+ "optional": true
41
+ }
42
+ },
43
+ "engines": {
44
+ "node": ">=22",
45
+ "bun": ">=1.1.0"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "openclaw": {
51
+ "extensions": [
52
+ "./src/index.ts"
53
+ ],
54
+ "runtimeExtensions": [
55
+ "./dist/index.js"
56
+ ],
57
+ "compat": {
58
+ "pluginApi": ">=2026.6.8",
59
+ "minGatewayVersion": "2026.6.8"
60
+ },
61
+ "build": {
62
+ "openclawVersion": "2026.6.10",
63
+ "pluginSdkVersion": "2026.6.10"
64
+ }
65
+ }
66
+ }