signalwire-agents 1.0.7__py3-none-any.whl → 1.0.9__py3-none-any.whl
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.
- signalwire_agents/__init__.py +1 -1
- signalwire_agents/core/agent_base.py +21 -2
- signalwire_agents/core/mixins/auth_mixin.py +6 -13
- signalwire_agents/core/mixins/serverless_mixin.py +137 -73
- signalwire_agents/core/mixins/web_mixin.py +1 -1
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/METADATA +1 -1
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/RECORD +14 -14
- {signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/sw-agent-init.1 +0 -0
- {signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/sw-search.1 +0 -0
- {signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/swaig-test.1 +0 -0
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/WHEEL +0 -0
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/entry_points.txt +0 -0
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/licenses/LICENSE +0 -0
- {signalwire_agents-1.0.7.dist-info → signalwire_agents-1.0.9.dist-info}/top_level.txt +0 -0
signalwire_agents/__init__.py
CHANGED
|
@@ -18,7 +18,7 @@ A package for building AI agents using SignalWire's AI and SWML capabilities.
|
|
|
18
18
|
from .core.logging_config import configure_logging
|
|
19
19
|
configure_logging()
|
|
20
20
|
|
|
21
|
-
__version__ = "1.0.
|
|
21
|
+
__version__ = "1.0.9"
|
|
22
22
|
|
|
23
23
|
# Import core classes for easier access
|
|
24
24
|
from .core.agent_base import AgentBase
|
|
@@ -317,13 +317,32 @@ class AgentBase(
|
|
|
317
317
|
def get_full_url(self, include_auth: bool = False) -> str:
|
|
318
318
|
"""
|
|
319
319
|
Get the full URL for this agent's endpoint
|
|
320
|
-
|
|
320
|
+
|
|
321
321
|
Args:
|
|
322
322
|
include_auth: Whether to include authentication credentials in the URL
|
|
323
|
-
|
|
323
|
+
|
|
324
324
|
Returns:
|
|
325
325
|
Full URL including host, port, and route (with auth if requested)
|
|
326
326
|
"""
|
|
327
|
+
# If _proxy_url_base is set (e.g., from request URL detection), use it
|
|
328
|
+
if hasattr(self, '_proxy_url_base') and self._proxy_url_base:
|
|
329
|
+
base_url = self._proxy_url_base.rstrip('/')
|
|
330
|
+
# Add authentication if requested
|
|
331
|
+
if include_auth:
|
|
332
|
+
username, password = self.get_basic_auth_credentials()
|
|
333
|
+
if username and password:
|
|
334
|
+
from urllib.parse import urlparse, urlunparse
|
|
335
|
+
parsed = urlparse(base_url)
|
|
336
|
+
base_url = urlunparse((
|
|
337
|
+
parsed.scheme,
|
|
338
|
+
f"{username}:{password}@{parsed.netloc}",
|
|
339
|
+
parsed.path,
|
|
340
|
+
parsed.params,
|
|
341
|
+
parsed.query,
|
|
342
|
+
parsed.fragment
|
|
343
|
+
))
|
|
344
|
+
return base_url
|
|
345
|
+
|
|
327
346
|
mode = get_execution_mode()
|
|
328
347
|
|
|
329
348
|
if mode == 'cgi':
|
|
@@ -196,11 +196,8 @@ class AuthMixin:
|
|
|
196
196
|
return False
|
|
197
197
|
|
|
198
198
|
# Check for authorization header (case-insensitive)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if key.lower() == 'authorization':
|
|
202
|
-
auth_header = request.headers[key]
|
|
203
|
-
break
|
|
199
|
+
# Flask headers can be accessed directly with .get() which is case-insensitive
|
|
200
|
+
auth_header = request.headers.get('Authorization')
|
|
204
201
|
|
|
205
202
|
if not auth_header or not auth_header.startswith('Basic '):
|
|
206
203
|
return False
|
|
@@ -246,14 +243,10 @@ class AuthMixin:
|
|
|
246
243
|
"""
|
|
247
244
|
if not hasattr(req, 'headers'):
|
|
248
245
|
return False
|
|
249
|
-
|
|
250
|
-
# Check for authorization header (
|
|
251
|
-
auth_header =
|
|
252
|
-
|
|
253
|
-
if key.lower() == 'authorization':
|
|
254
|
-
auth_header = value
|
|
255
|
-
break
|
|
256
|
-
|
|
246
|
+
|
|
247
|
+
# Check for authorization header - use .get() which works with both dict and Flask headers
|
|
248
|
+
auth_header = req.headers.get('Authorization')
|
|
249
|
+
|
|
257
250
|
if not auth_header or not auth_header.startswith('Basic '):
|
|
258
251
|
return False
|
|
259
252
|
|
|
@@ -80,52 +80,76 @@ class ServerlessMixin:
|
|
|
80
80
|
# Check authentication in Lambda mode
|
|
81
81
|
if not self._check_lambda_auth(event):
|
|
82
82
|
return self._send_lambda_auth_challenge()
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
if event:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
# Support both HTTP API (v2) and REST API (v1) payload formats
|
|
86
|
+
# HTTP API v2 uses rawPath, REST API v1 uses pathParameters.proxy
|
|
87
|
+
path = event.get('rawPath', '').strip('/')
|
|
88
|
+
if not path and event.get('pathParameters'):
|
|
89
|
+
path = event.get('pathParameters', {}).get('proxy', '')
|
|
90
|
+
|
|
91
|
+
# Parse request body if present
|
|
92
|
+
args = {}
|
|
93
|
+
call_id = None
|
|
94
|
+
raw_data = None
|
|
95
|
+
function_name = None
|
|
96
|
+
|
|
97
|
+
body_content = event.get('body')
|
|
98
|
+
if body_content:
|
|
99
|
+
try:
|
|
100
|
+
if event.get('isBase64Encoded'):
|
|
101
|
+
import base64
|
|
102
|
+
body_content = base64.b64decode(body_content).decode('utf-8')
|
|
103
|
+
if isinstance(body_content, str):
|
|
104
|
+
raw_data = json.loads(body_content)
|
|
105
|
+
else:
|
|
106
|
+
raw_data = body_content
|
|
107
|
+
|
|
108
|
+
call_id = raw_data.get("call_id")
|
|
109
|
+
function_name = raw_data.get("function")
|
|
110
|
+
|
|
111
|
+
# Extract arguments like the FastAPI handler does
|
|
112
|
+
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
113
|
+
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
114
|
+
args = raw_data["argument"]["parsed"][0]
|
|
115
|
+
elif "raw" in raw_data["argument"]:
|
|
116
|
+
try:
|
|
117
|
+
args = json.loads(raw_data["argument"]["raw"])
|
|
118
|
+
except Exception:
|
|
119
|
+
pass
|
|
120
|
+
except Exception:
|
|
121
|
+
# If parsing fails, continue with empty args
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
# Determine if this is a SWAIG function call
|
|
125
|
+
# Case 1: /swaig endpoint with function name in body
|
|
126
|
+
# Case 2: /{function_name} path-based routing
|
|
127
|
+
# Case 3: Root path - return SWML
|
|
128
|
+
|
|
129
|
+
if path in ('swaig', 'swaig/') and function_name:
|
|
130
|
+
# /swaig endpoint with function name in body
|
|
131
|
+
result = self._execute_swaig_function(function_name, args, call_id, raw_data)
|
|
88
132
|
return {
|
|
89
133
|
"statusCode": 200,
|
|
90
134
|
"headers": {"Content-Type": "application/json"},
|
|
91
|
-
"body":
|
|
135
|
+
"body": json.dumps(result) if isinstance(result, dict) else str(result)
|
|
92
136
|
}
|
|
93
|
-
|
|
94
|
-
#
|
|
95
|
-
args = {}
|
|
96
|
-
call_id = None
|
|
97
|
-
raw_data = None
|
|
98
|
-
|
|
99
|
-
# Parse request body if present
|
|
100
|
-
body_content = event.get('body')
|
|
101
|
-
if body_content:
|
|
102
|
-
try:
|
|
103
|
-
if isinstance(body_content, str):
|
|
104
|
-
raw_data = json.loads(body_content)
|
|
105
|
-
else:
|
|
106
|
-
raw_data = body_content
|
|
107
|
-
|
|
108
|
-
call_id = raw_data.get("call_id")
|
|
109
|
-
|
|
110
|
-
# Extract arguments like the FastAPI handler does
|
|
111
|
-
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
112
|
-
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
113
|
-
args = raw_data["argument"]["parsed"][0]
|
|
114
|
-
elif "raw" in raw_data["argument"]:
|
|
115
|
-
try:
|
|
116
|
-
args = json.loads(raw_data["argument"]["raw"])
|
|
117
|
-
except Exception:
|
|
118
|
-
pass
|
|
119
|
-
except Exception:
|
|
120
|
-
# If parsing fails, continue with empty args
|
|
121
|
-
pass
|
|
122
|
-
|
|
137
|
+
elif path and path not in ('', 'swaig', 'swaig/'):
|
|
138
|
+
# Path-based function routing (e.g., /say_hello)
|
|
123
139
|
result = self._execute_swaig_function(path, args, call_id, raw_data)
|
|
124
140
|
return {
|
|
125
141
|
"statusCode": 200,
|
|
126
142
|
"headers": {"Content-Type": "application/json"},
|
|
127
143
|
"body": json.dumps(result) if isinstance(result, dict) else str(result)
|
|
128
144
|
}
|
|
145
|
+
else:
|
|
146
|
+
# Root path or /swaig without function - return SWML
|
|
147
|
+
swml_response = self._render_swml()
|
|
148
|
+
return {
|
|
149
|
+
"statusCode": 200,
|
|
150
|
+
"headers": {"Content-Type": "application/json"},
|
|
151
|
+
"body": swml_response
|
|
152
|
+
}
|
|
129
153
|
else:
|
|
130
154
|
# Handle case when event is None (direct Lambda call with no event)
|
|
131
155
|
swml_response = self._render_swml()
|
|
@@ -152,7 +176,9 @@ class ServerlessMixin:
|
|
|
152
176
|
|
|
153
177
|
except Exception as e:
|
|
154
178
|
import logging
|
|
179
|
+
import traceback
|
|
155
180
|
logging.error(f"Error in serverless request handler: {e}")
|
|
181
|
+
logging.error(f"Traceback: {traceback.format_exc()}")
|
|
156
182
|
if mode == 'lambda':
|
|
157
183
|
return {
|
|
158
184
|
"statusCode": 500,
|
|
@@ -302,61 +328,99 @@ class ServerlessMixin:
|
|
|
302
328
|
def _handle_azure_function_request(self, req):
|
|
303
329
|
"""
|
|
304
330
|
Handle Azure Functions specific requests
|
|
305
|
-
|
|
331
|
+
|
|
306
332
|
Args:
|
|
307
333
|
req: Azure Functions HttpRequest object
|
|
308
|
-
|
|
334
|
+
|
|
309
335
|
Returns:
|
|
310
336
|
Azure Functions HttpResponse object
|
|
311
337
|
"""
|
|
312
338
|
try:
|
|
313
339
|
import azure.functions as func
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
340
|
+
from urllib.parse import urlparse
|
|
341
|
+
|
|
342
|
+
# Get the path from the request URL
|
|
343
|
+
# Azure Functions URLs look like: https://app.azurewebsites.net/api/function_name/path
|
|
344
|
+
path = ''
|
|
345
|
+
base_url = None
|
|
346
|
+
if req.url:
|
|
347
|
+
parsed = urlparse(req.url)
|
|
348
|
+
# Full path after /api/ e.g. "function_app" or "function_app/swaig"
|
|
349
|
+
url_parts = req.url.split('/api/')
|
|
350
|
+
if len(url_parts) > 1:
|
|
351
|
+
full_path = url_parts[1].strip('/')
|
|
352
|
+
# Split into function name and sub-path
|
|
353
|
+
path_parts = full_path.split('/', 1)
|
|
354
|
+
function_app_name = path_parts[0] if path_parts else ''
|
|
355
|
+
path = path_parts[1] if len(path_parts) > 1 else ''
|
|
356
|
+
|
|
357
|
+
# Base URL includes the function app name for webhook URLs
|
|
358
|
+
# e.g., https://app.azurewebsites.net/api/function_app
|
|
359
|
+
base_url = f"{parsed.scheme}://{parsed.netloc}/api/{function_app_name}"
|
|
360
|
+
else:
|
|
361
|
+
base_url = f"{parsed.scheme}://{parsed.netloc}/api"
|
|
362
|
+
|
|
363
|
+
# Set the proxy URL base so SWML renders correct webhook URLs
|
|
364
|
+
if base_url and not getattr(self, '_proxy_url_base_from_env', False):
|
|
365
|
+
self._proxy_url_base = base_url
|
|
366
|
+
|
|
367
|
+
# Parse request body if present
|
|
368
|
+
args = {}
|
|
369
|
+
call_id = None
|
|
370
|
+
raw_data = None
|
|
371
|
+
function_name = None
|
|
372
|
+
|
|
373
|
+
if req.method == 'POST':
|
|
374
|
+
try:
|
|
375
|
+
body = req.get_body()
|
|
376
|
+
if body:
|
|
377
|
+
raw_data = json.loads(body.decode('utf-8'))
|
|
378
|
+
call_id = raw_data.get("call_id")
|
|
379
|
+
function_name = raw_data.get("function")
|
|
380
|
+
|
|
381
|
+
# Extract arguments like the FastAPI handler does
|
|
382
|
+
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
383
|
+
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
384
|
+
args = raw_data["argument"]["parsed"][0]
|
|
385
|
+
elif "raw" in raw_data["argument"]:
|
|
386
|
+
try:
|
|
387
|
+
args = json.loads(raw_data["argument"]["raw"])
|
|
388
|
+
except Exception:
|
|
389
|
+
pass
|
|
390
|
+
except Exception:
|
|
391
|
+
# If parsing fails, continue with empty args
|
|
392
|
+
pass
|
|
393
|
+
|
|
394
|
+
# Determine if this is a SWAIG function call
|
|
395
|
+
# Case 1: /swaig endpoint with function name in body
|
|
396
|
+
# Case 2: /{function_name} path-based routing
|
|
397
|
+
# Case 3: Root path - return SWML
|
|
398
|
+
|
|
399
|
+
if path in ('swaig', 'swaig/') and function_name:
|
|
400
|
+
# /swaig endpoint with function name in body
|
|
401
|
+
result = self._execute_swaig_function(function_name, args, call_id, raw_data)
|
|
321
402
|
return func.HttpResponse(
|
|
322
|
-
body=
|
|
403
|
+
body=json.dumps(result) if isinstance(result, dict) else str(result),
|
|
323
404
|
status_code=200,
|
|
324
405
|
headers={"Content-Type": "application/json"}
|
|
325
406
|
)
|
|
326
|
-
|
|
327
|
-
#
|
|
328
|
-
args = {}
|
|
329
|
-
call_id = None
|
|
330
|
-
raw_data = None
|
|
331
|
-
|
|
332
|
-
# Parse request data
|
|
333
|
-
if req.method == 'POST':
|
|
334
|
-
try:
|
|
335
|
-
body = req.get_body()
|
|
336
|
-
if body:
|
|
337
|
-
raw_data = json.loads(body.decode('utf-8'))
|
|
338
|
-
call_id = raw_data.get("call_id")
|
|
339
|
-
|
|
340
|
-
# Extract arguments like the FastAPI handler does
|
|
341
|
-
if "argument" in raw_data and isinstance(raw_data["argument"], dict):
|
|
342
|
-
if "parsed" in raw_data["argument"] and isinstance(raw_data["argument"]["parsed"], list) and raw_data["argument"]["parsed"]:
|
|
343
|
-
args = raw_data["argument"]["parsed"][0]
|
|
344
|
-
elif "raw" in raw_data["argument"]:
|
|
345
|
-
try:
|
|
346
|
-
args = json.loads(raw_data["argument"]["raw"])
|
|
347
|
-
except Exception:
|
|
348
|
-
pass
|
|
349
|
-
except Exception:
|
|
350
|
-
# If parsing fails, continue with empty args
|
|
351
|
-
pass
|
|
352
|
-
|
|
407
|
+
elif path and path not in ('', 'api', 'swaig', 'swaig/'):
|
|
408
|
+
# Path-based function routing (e.g., /say_hello)
|
|
353
409
|
result = self._execute_swaig_function(path, args, call_id, raw_data)
|
|
354
410
|
return func.HttpResponse(
|
|
355
411
|
body=json.dumps(result) if isinstance(result, dict) else str(result),
|
|
356
412
|
status_code=200,
|
|
357
413
|
headers={"Content-Type": "application/json"}
|
|
358
414
|
)
|
|
359
|
-
|
|
415
|
+
else:
|
|
416
|
+
# Root path or /swaig without function - return SWML
|
|
417
|
+
swml_response = self._render_swml()
|
|
418
|
+
return func.HttpResponse(
|
|
419
|
+
body=swml_response,
|
|
420
|
+
status_code=200,
|
|
421
|
+
headers={"Content-Type": "application/json"}
|
|
422
|
+
)
|
|
423
|
+
|
|
360
424
|
except Exception as e:
|
|
361
425
|
import logging
|
|
362
426
|
logging.error(f"Error in Azure Function request handler: {e}")
|
|
@@ -302,7 +302,7 @@ class WebMixin:
|
|
|
302
302
|
response = self.handle_serverless_request(event, context, mode)
|
|
303
303
|
print(response)
|
|
304
304
|
return response
|
|
305
|
-
elif mode
|
|
305
|
+
elif mode in ['lambda', 'google_cloud_function']:
|
|
306
306
|
return self.handle_serverless_request(event, context, mode)
|
|
307
307
|
else:
|
|
308
308
|
# Server mode - use existing serve method
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
signalwire_agents/__init__.py,sha256=
|
|
1
|
+
signalwire_agents/__init__.py,sha256=_JScBMuBMSwv1yf2gqSJ2u4zN3AVyXW8oQTs-YiSe5I,5030
|
|
2
2
|
signalwire_agents/agent_server.py,sha256=5GPt6XekVxep9esZY9s4MG6sOR-VF_m53U25r3WoML4,30964
|
|
3
3
|
signalwire_agents/schema.json,sha256=YQv4-KiegE00XvxoLMKAml6aCGitnt3kBq31ECxTHK8,385886
|
|
4
4
|
signalwire_agents/agents/bedrock.py,sha256=J582gooNtxtep4xdVOfyDzRtHp_XrurPMS93xf2Xod0,10836
|
|
@@ -25,7 +25,7 @@ signalwire_agents/cli/simulation/data_generation.py,sha256=pxa9aJ6XkI0O8yAIGvBTU
|
|
|
25
25
|
signalwire_agents/cli/simulation/data_overrides.py,sha256=3_3pT6j-q2gRufPX2bZ1BrmY7u1IdloLooKAJil33vI,6319
|
|
26
26
|
signalwire_agents/cli/simulation/mock_env.py,sha256=fvaR_xdLMm8AbpNUbTJOFG9THcti3Zds-0QNDbKMaYk,10249
|
|
27
27
|
signalwire_agents/core/__init__.py,sha256=xjPq8DmUnWYUG28sd17n430VWPmMH9oZ9W14gYwG96g,806
|
|
28
|
-
signalwire_agents/core/agent_base.py,sha256=
|
|
28
|
+
signalwire_agents/core/agent_base.py,sha256=PYlLu312TRnZVTePUSZTrd6Ed6uvy7K6BIxT3Sd6uNM,58739
|
|
29
29
|
signalwire_agents/core/auth_handler.py,sha256=jXrof9WZ1W9qqlQT9WElcmSRafL2kG7207x5SqWN9MU,8481
|
|
30
30
|
signalwire_agents/core/config_loader.py,sha256=rStVRRUaeMGrMc44ocr0diMQQARZhbKqwMqQ6kqUNos,8722
|
|
31
31
|
signalwire_agents/core/contexts.py,sha256=g9FgOGMfGCUWlm57YZcv7CvOf-Ub9FdKZIOMu14ADfE,24428
|
|
@@ -55,13 +55,13 @@ signalwire_agents/core/agent/tools/decorator.py,sha256=pC6j1114GwVBd2U3h23I9gKLt
|
|
|
55
55
|
signalwire_agents/core/agent/tools/registry.py,sha256=HScbKKwpJqFZ_odmeFklSQ0p0EMasEyKSxNwX568OPo,8054
|
|
56
56
|
signalwire_agents/core/mixins/__init__.py,sha256=NsFpfF7TDP_lNR0Riw4Nbvt4fDbv_A3OoVbBqRrtXQM,652
|
|
57
57
|
signalwire_agents/core/mixins/ai_config_mixin.py,sha256=In7SrVlKoRaGsDIXEDNGsrEqCjotmcQr_XA563VWABQ,16265
|
|
58
|
-
signalwire_agents/core/mixins/auth_mixin.py,sha256=
|
|
58
|
+
signalwire_agents/core/mixins/auth_mixin.py,sha256=FIzQjLOkEgQhy6uIKjnevsM3ubdMnY5gDDksslEUtF8,9729
|
|
59
59
|
signalwire_agents/core/mixins/prompt_mixin.py,sha256=bEsuw9J2F_upFYI02KyC7o2eGZjwOKQ352rmJBZirAM,13729
|
|
60
|
-
signalwire_agents/core/mixins/serverless_mixin.py,sha256=
|
|
60
|
+
signalwire_agents/core/mixins/serverless_mixin.py,sha256=CnKoc4z5ZcVX2UjLAjhxx_rPwaTRqoLGHXWmxKnggqE,19402
|
|
61
61
|
signalwire_agents/core/mixins/skill_mixin.py,sha256=Qz3RKPmq_iMY4NecyxOHk3dW3W-O4iEm2ahhMjAcqRs,1861
|
|
62
62
|
signalwire_agents/core/mixins/state_mixin.py,sha256=q3achpyUYZKuJaqKf12O22FXpSsNNsMEonSvlpSHCkA,6594
|
|
63
63
|
signalwire_agents/core/mixins/tool_mixin.py,sha256=6CaNdaspHcfte0qSB_bSN8PTsqxRZzL_AXYk8QoWyXE,8660
|
|
64
|
-
signalwire_agents/core/mixins/web_mixin.py,sha256=
|
|
64
|
+
signalwire_agents/core/mixins/web_mixin.py,sha256=FvllyWjdms5M8i37hCx9WLbeqJdd84Uymqb0aI0c6BU,50639
|
|
65
65
|
signalwire_agents/core/security/__init__.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
|
66
66
|
signalwire_agents/core/security/session_manager.py,sha256=s5hXYcFnrsYFoyo-zcN7EJy-wInZQI_cWTBHX9MxHR4,9164
|
|
67
67
|
signalwire_agents/prefabs/__init__.py,sha256=MW11J63XH7KxF2MWguRsMFM9iqMWexaEO9ynDPL_PDM,715
|
|
@@ -131,12 +131,12 @@ signalwire_agents/utils/token_generators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663
|
|
|
131
131
|
signalwire_agents/utils/validators.py,sha256=4Mr7baQ_xR_hfJ72YxQRAT_GFa663YjFX_PumJ35Xds,191
|
|
132
132
|
signalwire_agents/web/__init__.py,sha256=XE_pSTY9Aalzr7J7wqFth1Zr3cccQHPPcF5HWNrOpz8,383
|
|
133
133
|
signalwire_agents/web/web_service.py,sha256=a2PSHJgX1tlZr0Iz1A1UouZjXEePJAZL632evvLVM38,21071
|
|
134
|
-
signalwire_agents-1.0.
|
|
135
|
-
signalwire_agents-1.0.
|
|
136
|
-
signalwire_agents-1.0.
|
|
137
|
-
signalwire_agents-1.0.
|
|
138
|
-
signalwire_agents-1.0.
|
|
139
|
-
signalwire_agents-1.0.
|
|
140
|
-
signalwire_agents-1.0.
|
|
141
|
-
signalwire_agents-1.0.
|
|
142
|
-
signalwire_agents-1.0.
|
|
134
|
+
signalwire_agents-1.0.9.data/data/share/man/man1/sw-agent-init.1,sha256=EFE8iOj2aGrZRwSXRoZdrZTZXOROuQmuIrZuzp9yI2s,6880
|
|
135
|
+
signalwire_agents-1.0.9.data/data/share/man/man1/sw-search.1,sha256=9jJ6V6t6DgmXByz8Lw9exjf683Cw3sJGro8-eB0M9EY,10413
|
|
136
|
+
signalwire_agents-1.0.9.data/data/share/man/man1/swaig-test.1,sha256=Ri0EITo8YMFowkcYltwPSwU4VJdRzo7XTWloi5WddCg,7815
|
|
137
|
+
signalwire_agents-1.0.9.dist-info/licenses/LICENSE,sha256=NYvAsB-rTcSvG9cqHt9EUHAWLiA9YzM4Qfz-mPdvDR0,1067
|
|
138
|
+
signalwire_agents-1.0.9.dist-info/METADATA,sha256=m5ZzBM9novTpM-LJZ5l6MM-Bo3sbhKlzP-XeWi2_MjY,41599
|
|
139
|
+
signalwire_agents-1.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
140
|
+
signalwire_agents-1.0.9.dist-info/entry_points.txt,sha256=GDaOxm8I9Bf3Sd2jDSGRXDG2ezDMgmX6ockjpDfK_IY,200
|
|
141
|
+
signalwire_agents-1.0.9.dist-info/top_level.txt,sha256=kDGS6ZYv84K9P5Kyg9_S8P_pbUXoHkso0On_DB5bbWc,18
|
|
142
|
+
signalwire_agents-1.0.9.dist-info/RECORD,,
|
{signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/sw-agent-init.1
RENAMED
|
File without changes
|
{signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/sw-search.1
RENAMED
|
File without changes
|
{signalwire_agents-1.0.7.data → signalwire_agents-1.0.9.data}/data/share/man/man1/swaig-test.1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|