hyperpocket 0.5.4__py3-none-any.whl → 0.5.6__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.
- hyperpocket/auth/basicauth/README.md +28 -0
- hyperpocket/auth/basicauth/__init__.py +0 -0
- hyperpocket/auth/basicauth/basicauth_context.py +14 -0
- hyperpocket/auth/basicauth/basicauth_handler.py +94 -0
- hyperpocket/auth/basicauth/basicauth_schema.py +9 -0
- hyperpocket/auth/basicauth/context.py +15 -0
- hyperpocket/auth/hubspot/oauth2_context.py +2 -4
- hyperpocket/auth/linkedin/basicauth_context.py +14 -0
- hyperpocket/auth/linkedin/basicauth_handler.py +97 -0
- hyperpocket/auth/linkedin/basicauth_schema.py +9 -0
- hyperpocket/auth/linkedin/oauth2_handler.py +1 -1
- hyperpocket/auth/provider.py +1 -0
- hyperpocket/config/auth.py +1 -0
- hyperpocket/server/auth/basicauth.py +88 -0
- hyperpocket/server/auth/linkedin.py +8 -3
- hyperpocket/util/convert_pydantic_to_dict.py +14 -0
- {hyperpocket-0.5.4.dist-info → hyperpocket-0.5.6.dist-info}/METADATA +21 -2
- {hyperpocket-0.5.4.dist-info → hyperpocket-0.5.6.dist-info}/RECORD +20 -9
- {hyperpocket-0.5.4.dist-info → hyperpocket-0.5.6.dist-info}/WHEEL +0 -0
- {hyperpocket-0.5.4.dist-info → hyperpocket-0.5.6.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
### API Token Auth
|
2
|
+
|
3
|
+
This module provides authentication using simple API tokens.
|
4
|
+
|
5
|
+
1. To use this authentication in your tool, include the following in your `config.toml`:
|
6
|
+
|
7
|
+
```toml
|
8
|
+
[auth]
|
9
|
+
auth_provider = "apitoken"
|
10
|
+
auth_handler = "apitoken"
|
11
|
+
scopes = []
|
12
|
+
```
|
13
|
+
|
14
|
+
2. To use it with `function_tool`, you can define your function as follows:
|
15
|
+
|
16
|
+
```python
|
17
|
+
from hyperpocket.tool import function_tool
|
18
|
+
from hyperpocket.auth import AuthProvider
|
19
|
+
|
20
|
+
|
21
|
+
@function_tool(
|
22
|
+
auth_provider=AuthProvider.API_TOKEN
|
23
|
+
)
|
24
|
+
def my_function(**kwargs):
|
25
|
+
token = kwargs["API_TOKEN"]
|
26
|
+
|
27
|
+
# ...
|
28
|
+
```
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from hyperpocket.auth.basicauth.context import BasicAuthContext
|
2
|
+
from hyperpocket.auth.basicauth.basicauth_schema import (
|
3
|
+
BasicAuthResponse,
|
4
|
+
)
|
5
|
+
|
6
|
+
|
7
|
+
class BasicAuthContext(BasicAuthContext):
|
8
|
+
@classmethod
|
9
|
+
def from_api_token_response(cls, response: BasicAuthResponse):
|
10
|
+
description = "Api Token Context logged in"
|
11
|
+
|
12
|
+
return cls(
|
13
|
+
access_token=response.access_token, description=description, expires_at=None
|
14
|
+
)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
from urllib.parse import urlencode, urljoin
|
3
|
+
|
4
|
+
from hyperpocket.auth import AuthProvider
|
5
|
+
from hyperpocket.auth.context import AuthContext
|
6
|
+
from hyperpocket.auth.handler import AuthHandlerInterface
|
7
|
+
from hyperpocket.auth.basicauth.basicauth_context import BasicAuthContext
|
8
|
+
from hyperpocket.auth.basicauth.basicauth_schema import (
|
9
|
+
BasicAuthRequest,
|
10
|
+
BasicAuthResponse,
|
11
|
+
)
|
12
|
+
from hyperpocket.config import config
|
13
|
+
from hyperpocket.futures import FutureStore
|
14
|
+
|
15
|
+
|
16
|
+
class BasicAuthHandler(AuthHandlerInterface):
|
17
|
+
name: str = "basicauth"
|
18
|
+
description: str = (
|
19
|
+
"This handler is used to authenticate users using the Basic Auth."
|
20
|
+
)
|
21
|
+
scoped: bool = False
|
22
|
+
|
23
|
+
_TOKEN_URL: str = urljoin(
|
24
|
+
config().public_base_url + "/",
|
25
|
+
f"{config().callback_url_rewrite_prefix}/auth/basicauth",
|
26
|
+
)
|
27
|
+
|
28
|
+
@staticmethod
|
29
|
+
def provider() -> AuthProvider:
|
30
|
+
return AuthProvider.BASICAUTH
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def recommended_scopes() -> set[str]:
|
34
|
+
return set()
|
35
|
+
|
36
|
+
@staticmethod
|
37
|
+
def provider_default() -> bool:
|
38
|
+
return True
|
39
|
+
|
40
|
+
def prepare(
|
41
|
+
self,
|
42
|
+
auth_req: BasicAuthRequest,
|
43
|
+
thread_id: str,
|
44
|
+
profile: str,
|
45
|
+
future_uid: str,
|
46
|
+
*args,
|
47
|
+
**kwargs,
|
48
|
+
) -> str:
|
49
|
+
redirect_uri = urljoin(
|
50
|
+
config().public_base_url + "/",
|
51
|
+
f"{config().callback_url_rewrite_prefix}/auth/basicauth/token/callback",
|
52
|
+
)
|
53
|
+
url = self._make_auth_url(
|
54
|
+
auth_req=auth_req, redirect_uri=redirect_uri, state=future_uid
|
55
|
+
)
|
56
|
+
FutureStore.create_future(
|
57
|
+
future_uid,
|
58
|
+
data={
|
59
|
+
"redirect_uri": redirect_uri,
|
60
|
+
"thread_id": thread_id,
|
61
|
+
"profile": profile,
|
62
|
+
},
|
63
|
+
)
|
64
|
+
|
65
|
+
return f"User needs to authenticate using the following URL: {url}"
|
66
|
+
|
67
|
+
async def authenticate(
|
68
|
+
self, auth_req: BasicAuthRequest, future_uid: str, *args, **kwargs
|
69
|
+
) -> AuthContext:
|
70
|
+
future_data = FutureStore.get_future(future_uid)
|
71
|
+
access_token = await future_data.future
|
72
|
+
|
73
|
+
response = BasicAuthResponse(access_token=access_token)
|
74
|
+
context = BasicAuthContext.from_api_token_response(response)
|
75
|
+
|
76
|
+
return context
|
77
|
+
|
78
|
+
async def refresh(
|
79
|
+
self, auth_req: BasicAuthRequest, context: AuthContext, *args, **kwargs
|
80
|
+
) -> AuthContext:
|
81
|
+
raise Exception("Basic auth doesn't support refresh")
|
82
|
+
|
83
|
+
def _make_auth_url(self, auth_req: BasicAuthRequest, redirect_uri: str, state: str):
|
84
|
+
params = {
|
85
|
+
"redirect_uri": redirect_uri,
|
86
|
+
"state": state,
|
87
|
+
}
|
88
|
+
auth_url = f"{self._TOKEN_URL}?{urlencode(params)}"
|
89
|
+
return auth_url
|
90
|
+
|
91
|
+
def make_request(
|
92
|
+
self, auth_scopes: Optional[list[str]] = None, **kwargs
|
93
|
+
) -> BasicAuthRequest:
|
94
|
+
return BasicAuthRequest()
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from hyperpocket.auth.context import AuthContext
|
2
|
+
|
3
|
+
|
4
|
+
class BasicAuthContext(AuthContext):
|
5
|
+
_ACCESS_TOKEN_KEY: str = "BASIC_AUTH"
|
6
|
+
|
7
|
+
def to_dict(self) -> dict[str, str]:
|
8
|
+
return {
|
9
|
+
self._ACCESS_TOKEN_KEY: self.access_token,
|
10
|
+
}
|
11
|
+
|
12
|
+
def to_profiled_dict(self, profile: str) -> dict[str, str]:
|
13
|
+
return {
|
14
|
+
f"{profile.upper()}_{self._ACCESS_TOKEN_KEY}": self.access_token,
|
15
|
+
}
|
@@ -12,9 +12,7 @@ class HubspotOAuth2AuthContext(HubspotAuthContext):
|
|
12
12
|
|
13
13
|
@classmethod
|
14
14
|
def from_hubspot_oauth2_response(cls, response: HubspotOAuth2Response):
|
15
|
-
description =
|
16
|
-
f"Hubspot OAuth2 Context logged in as a user {response.authed_user.id}"
|
17
|
-
)
|
15
|
+
description = "Hubspot OAuth2 Context logged in"
|
18
16
|
now = datetime.now(tz=timezone.utc)
|
19
17
|
|
20
18
|
access_token = response.access_token
|
@@ -22,7 +20,7 @@ class HubspotOAuth2AuthContext(HubspotAuthContext):
|
|
22
20
|
expires_in = response.expires_in
|
23
21
|
|
24
22
|
if expires_in:
|
25
|
-
expires_at = now + timedelta(seconds=response.
|
23
|
+
expires_at = now + timedelta(seconds=response.expires_in)
|
26
24
|
else:
|
27
25
|
expires_at = None
|
28
26
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from hyperpocket.auth.linkedin.context import LinkedinAuthContext
|
2
|
+
from hyperpocket.auth.linkedin.basicauth_schema import LinkedinBasicAuthResponse
|
3
|
+
|
4
|
+
|
5
|
+
class LinkedinBasicAuthContext(LinkedinAuthContext):
|
6
|
+
_ACCESS_TOKEN_KEY: str = "LINKEDIN_BASIC_AUTH"
|
7
|
+
|
8
|
+
@classmethod
|
9
|
+
def from_api_token_response(cls, response: LinkedinBasicAuthResponse):
|
10
|
+
description = "Api Token Context logged in"
|
11
|
+
|
12
|
+
return cls(
|
13
|
+
access_token=response.access_token, description=description, expires_at=None
|
14
|
+
)
|
@@ -0,0 +1,97 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
from urllib.parse import urlencode, urljoin
|
3
|
+
|
4
|
+
from hyperpocket.auth import AuthProvider
|
5
|
+
from hyperpocket.auth.context import AuthContext
|
6
|
+
from hyperpocket.auth.handler import AuthHandlerInterface
|
7
|
+
from hyperpocket.config import config
|
8
|
+
from hyperpocket.futures import FutureStore
|
9
|
+
|
10
|
+
from hyperpocket.auth.linkedin.basicauth_context import LinkedinBasicAuthContext
|
11
|
+
from hyperpocket.auth.linkedin.basicauth_schema import (
|
12
|
+
LinkedinBasicAuthRequest,
|
13
|
+
LinkedinBasicAuthResponse,
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
class LinkedinBasicAuthHandler(AuthHandlerInterface):
|
18
|
+
name: str = "linkedin-basicauth"
|
19
|
+
description: str = (
|
20
|
+
"This handler is used to authenticate users using the Basic Auth."
|
21
|
+
)
|
22
|
+
scoped: bool = False
|
23
|
+
|
24
|
+
_TOKEN_URL: str = urljoin(
|
25
|
+
config().public_base_url + "/",
|
26
|
+
f"{config().callback_url_rewrite_prefix}/auth/basicauth",
|
27
|
+
)
|
28
|
+
|
29
|
+
@staticmethod
|
30
|
+
def provider() -> AuthProvider:
|
31
|
+
return AuthProvider.LINKEDIN
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def recommended_scopes() -> set[str]:
|
35
|
+
return set()
|
36
|
+
|
37
|
+
@staticmethod
|
38
|
+
def provider_default() -> bool:
|
39
|
+
return True
|
40
|
+
|
41
|
+
def prepare(
|
42
|
+
self,
|
43
|
+
auth_req: LinkedinBasicAuthRequest,
|
44
|
+
thread_id: str,
|
45
|
+
profile: str,
|
46
|
+
future_uid: str,
|
47
|
+
*args,
|
48
|
+
**kwargs,
|
49
|
+
) -> str:
|
50
|
+
redirect_uri = urljoin(
|
51
|
+
config().public_base_url + "/",
|
52
|
+
f"{config().callback_url_rewrite_prefix}/auth/linkedin/basicauth/callback",
|
53
|
+
)
|
54
|
+
url = self._make_auth_url(
|
55
|
+
auth_req=auth_req, redirect_uri=redirect_uri, state=future_uid
|
56
|
+
)
|
57
|
+
FutureStore.create_future(
|
58
|
+
future_uid,
|
59
|
+
data={
|
60
|
+
"redirect_uri": redirect_uri,
|
61
|
+
"thread_id": thread_id,
|
62
|
+
"profile": profile,
|
63
|
+
},
|
64
|
+
)
|
65
|
+
|
66
|
+
return f"User needs to authenticate using the following URL: {url}"
|
67
|
+
|
68
|
+
async def authenticate(
|
69
|
+
self, auth_req: LinkedinBasicAuthRequest, future_uid: str, *args, **kwargs
|
70
|
+
) -> AuthContext:
|
71
|
+
future_data = FutureStore.get_future(future_uid)
|
72
|
+
access_token = await future_data.future
|
73
|
+
|
74
|
+
response = LinkedinBasicAuthResponse(access_token=access_token)
|
75
|
+
context = LinkedinBasicAuthContext.from_api_token_response(response)
|
76
|
+
|
77
|
+
return context
|
78
|
+
|
79
|
+
async def refresh(
|
80
|
+
self, auth_req: LinkedinBasicAuthRequest, context: AuthContext, *args, **kwargs
|
81
|
+
) -> AuthContext:
|
82
|
+
raise Exception("Basic auth doesn't support refresh")
|
83
|
+
|
84
|
+
def _make_auth_url(
|
85
|
+
self, auth_req: LinkedinBasicAuthRequest, redirect_uri: str, state: str
|
86
|
+
):
|
87
|
+
params = {
|
88
|
+
"redirect_uri": redirect_uri,
|
89
|
+
"state": state,
|
90
|
+
}
|
91
|
+
auth_url = f"{self._TOKEN_URL}?{urlencode(params)}"
|
92
|
+
return auth_url
|
93
|
+
|
94
|
+
def make_request(
|
95
|
+
self, auth_scopes: Optional[list[str]] = None, **kwargs
|
96
|
+
) -> LinkedinBasicAuthRequest:
|
97
|
+
return LinkedinBasicAuthRequest()
|
hyperpocket/auth/provider.py
CHANGED
hyperpocket/config/auth.py
CHANGED
@@ -104,6 +104,7 @@ class AuthConfig(BaseModel):
|
|
104
104
|
linear: Optional[LinearAuthConfig] = None
|
105
105
|
facebook: Optional[FacebookAuthConfig] = None
|
106
106
|
use_prebuilt_auth: bool = Field(default=True)
|
107
|
+
auth_encryption_secret_key: Optional[str] = Field(default=None)
|
107
108
|
|
108
109
|
|
109
110
|
DefaultAuthConfig = AuthConfig()
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import base64
|
2
|
+
from http import HTTPStatus
|
3
|
+
from urllib.parse import parse_qs, urlencode, urlparse, urlunparse
|
4
|
+
|
5
|
+
from cryptography.fernet import Fernet
|
6
|
+
from fastapi import APIRouter, Form
|
7
|
+
from starlette.responses import HTMLResponse, RedirectResponse
|
8
|
+
|
9
|
+
from hyperpocket.config import config
|
10
|
+
from hyperpocket.config.auth import DefaultAuthConfig
|
11
|
+
from hyperpocket.futures import FutureStore
|
12
|
+
|
13
|
+
default_router = APIRouter()
|
14
|
+
|
15
|
+
|
16
|
+
@default_router.get("/basicauth", response_class=HTMLResponse)
|
17
|
+
async def basicauth_form(redirect_uri: str, state: str = ""):
|
18
|
+
html = f"""
|
19
|
+
<html>
|
20
|
+
<body>
|
21
|
+
<h2>Enter ID and Password</h2>
|
22
|
+
<form action="submit" method="post">
|
23
|
+
<input type="hidden" name="redirect_uri" value="{redirect_uri}">
|
24
|
+
<input type="hidden" name="state" value="{state}">
|
25
|
+
|
26
|
+
<label for="username">Username:</label>
|
27
|
+
<input type="text" id="username" name="username" required>
|
28
|
+
|
29
|
+
<label for="password">Password:</label>
|
30
|
+
<input type="password" id="password" name="password" required>
|
31
|
+
|
32
|
+
<button type="submit">submit</button>
|
33
|
+
</form>
|
34
|
+
</body>
|
35
|
+
</html>
|
36
|
+
"""
|
37
|
+
return HTMLResponse(content=html)
|
38
|
+
|
39
|
+
|
40
|
+
@default_router.post("/submit", response_class=RedirectResponse)
|
41
|
+
async def submit_basicauth(
|
42
|
+
username: str = Form(...),
|
43
|
+
password: str = Form(...),
|
44
|
+
redirect_uri: str = Form(...),
|
45
|
+
state: str = Form(...),
|
46
|
+
):
|
47
|
+
token = f"{username}:{password}"
|
48
|
+
base64_token = base64.b64encode(token.encode()).decode("utf-8")
|
49
|
+
key = config().auth.auth_encryption_secret_key.encode()
|
50
|
+
encrypted = Fernet(key).encrypt(base64_token.encode()).decode()
|
51
|
+
new_callback_url = add_query_params(
|
52
|
+
redirect_uri, {"token": encrypted, "state": state}
|
53
|
+
)
|
54
|
+
return RedirectResponse(url=new_callback_url, status_code=HTTPStatus.SEE_OTHER)
|
55
|
+
|
56
|
+
|
57
|
+
def add_query_params(url: str, params: dict):
|
58
|
+
url_parts = urlparse(url)
|
59
|
+
query_params = parse_qs(url_parts.query)
|
60
|
+
query_params.update(params)
|
61
|
+
new_query = urlencode(query_params, doseq=True)
|
62
|
+
|
63
|
+
new_url = urlunparse(
|
64
|
+
(
|
65
|
+
url_parts.scheme,
|
66
|
+
url_parts.netloc,
|
67
|
+
url_parts.path,
|
68
|
+
url_parts.params,
|
69
|
+
new_query,
|
70
|
+
url_parts.fragment,
|
71
|
+
)
|
72
|
+
)
|
73
|
+
return new_url
|
74
|
+
|
75
|
+
|
76
|
+
basicauth_router = APIRouter(prefix="/basicauth")
|
77
|
+
|
78
|
+
|
79
|
+
@basicauth_router.get("/basicauth/callback")
|
80
|
+
async def basicauth_basicauth_callback(state: str, token: str):
|
81
|
+
try:
|
82
|
+
key = DefaultAuthConfig.auth_encryption_secret_key.encode()
|
83
|
+
decrypted = Fernet(key).decrypt(token.encode()).decode()
|
84
|
+
FutureStore.resolve_future(state, decrypted)
|
85
|
+
except ValueError:
|
86
|
+
return HTMLResponse(content="failed")
|
87
|
+
|
88
|
+
return HTMLResponse(content="success")
|
@@ -1,5 +1,8 @@
|
|
1
|
+
from cryptography.fernet import Fernet
|
1
2
|
from fastapi import APIRouter
|
2
3
|
from starlette.responses import HTMLResponse
|
4
|
+
|
5
|
+
from hyperpocket.config import config
|
3
6
|
from hyperpocket.futures import FutureStore
|
4
7
|
|
5
8
|
linkedin_auth_router = APIRouter(prefix="/linkedin")
|
@@ -15,10 +18,12 @@ async def linkedin_oauth2_callback(state: str, code: str):
|
|
15
18
|
return HTMLResponse(content="success")
|
16
19
|
|
17
20
|
|
18
|
-
@linkedin_auth_router.get("/
|
19
|
-
async def
|
21
|
+
@linkedin_auth_router.get("/basicauth/callback")
|
22
|
+
async def linkedin_basicauth_callback(state: str, token: str):
|
20
23
|
try:
|
21
|
-
|
24
|
+
key = config().auth.auth_encryption_secret_key.encode()
|
25
|
+
decrypted = Fernet(key).decrypt(token.encode()).decode()
|
26
|
+
FutureStore.resolve_future(state, decrypted)
|
22
27
|
except ValueError:
|
23
28
|
return HTMLResponse(content="failed")
|
24
29
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from pydantic import BaseModel
|
4
|
+
|
5
|
+
|
6
|
+
def convert_pydantic_to_dict(data: Any):
|
7
|
+
if isinstance(data, BaseModel):
|
8
|
+
return data.model_dump()
|
9
|
+
elif isinstance(data, dict):
|
10
|
+
return {key: convert_pydantic_to_dict(value) for key, value in data.items()}
|
11
|
+
elif isinstance(data, list):
|
12
|
+
return [convert_pydantic_to_dict(item) for item in data]
|
13
|
+
|
14
|
+
return data
|
@@ -1,18 +1,19 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: hyperpocket
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.6
|
4
4
|
Summary: Building AI agent with hyperpocket tool in a flash
|
5
5
|
Project-URL: Homepage, https://vessl-ai.github.io/hyperpocket
|
6
6
|
Project-URL: Repository, https://github.com/vessl-ai/hyperpocket
|
7
7
|
Author-email: Hyperpocket Team <hyperpocket@vessl.ai>
|
8
8
|
Requires-Python: >=3.10
|
9
9
|
Requires-Dist: click>=8.1.7
|
10
|
+
Requires-Dist: cryptography>=44.0.0
|
10
11
|
Requires-Dist: dynaconf>=3.2.6
|
11
12
|
Requires-Dist: fastapi>=0.115.5
|
12
13
|
Requires-Dist: gitpython>=3.1.43
|
13
14
|
Requires-Dist: httpx==0.27
|
14
15
|
Requires-Dist: jinja2>=3.1.4
|
15
|
-
Requires-Dist: multiprocess>=0.70.
|
16
|
+
Requires-Dist: multiprocess>=0.70.16
|
16
17
|
Requires-Dist: nest-asyncio>=1.6.0
|
17
18
|
Requires-Dist: pydantic>=2.10.2
|
18
19
|
Requires-Dist: pygithub>=2.5.0
|
@@ -335,6 +336,24 @@ client_secret = "" # your slack client secret
|
|
335
336
|
- in this case, by putting your slack app client_id and client_secret on `.secrets.toml`, you can manage your sensitive
|
336
337
|
data more safely.
|
337
338
|
|
339
|
+
#### When using Basic Auth
|
340
|
+
|
341
|
+
IMPORTANT: You should update `auth_encryption_secret_key` in `{WORKDIR}/.secret.toml` with your own secret key.
|
342
|
+
|
343
|
+
```toml
|
344
|
+
[auth]
|
345
|
+
auth_encryption_secret_key = "<YOUR_SECRET_KEY>"
|
346
|
+
```
|
347
|
+
|
348
|
+
The secret key should be a 32 Base64 encoded string.
|
349
|
+
|
350
|
+
You can generate the secret key with the following command.
|
351
|
+
|
352
|
+
```shell
|
353
|
+
pip install cryptography
|
354
|
+
python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())'
|
355
|
+
```
|
356
|
+
|
338
357
|
#### How to integrate github OAuth app
|
339
358
|
|
340
359
|
1. Follow the github documentation to create a new OAuth
|
@@ -9,7 +9,7 @@ hyperpocket/auth/README.md,sha256=zn4QqnFZCA_4X3x8Wb6lE3OP5otYxpByZaCiUkBvaNs,11
|
|
9
9
|
hyperpocket/auth/__init__.py,sha256=pO8M6SAuq0EPqi848_Iy650wqaLekx98e3RRnEAM_r0,607
|
10
10
|
hyperpocket/auth/context.py,sha256=m-j2gDYUKBMsiakLHsu9thhM4dYyFiXP0Wp0S_iC0bU,1303
|
11
11
|
hyperpocket/auth/handler.py,sha256=5cusl9ANEyG3gORVFjqh709txC0alw6eKtxgV6wjf6k,6683
|
12
|
-
hyperpocket/auth/provider.py,sha256=
|
12
|
+
hyperpocket/auth/provider.py,sha256=7ATCVsM1w6F4yad4ebtabyiBIO3U2wu_FnFtE8d-0vI,2131
|
13
13
|
hyperpocket/auth/schema.py,sha256=pl4oRTNj8PdqQg6UVPWf8ei2uYQ4DtOmmD58cVFMYQw,537
|
14
14
|
hyperpocket/auth/activeloop/README.md,sha256=xp8n0itbY9VNt8XEvCAE4Ealvj4uf_f1uSZyWG4Q5FE,172
|
15
15
|
hyperpocket/auth/activeloop/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -77,6 +77,12 @@ hyperpocket/auth/bamboohr/context.py,sha256=s8SNjELbLTzJZizoPAPER0Ys7axfmmqwP4pq
|
|
77
77
|
hyperpocket/auth/bamboohr/token_context.py,sha256=B-DL_FO3fqWpL4Lau7-t33cIRq0EBNkH-ezyMaHkmW8,464
|
78
78
|
hyperpocket/auth/bamboohr/token_handler.py,sha256=QwzkSxrr-tWPqd4vIRRTWwrnawbhV4ITsMO15673ev4,2958
|
79
79
|
hyperpocket/auth/bamboohr/token_schema.py,sha256=NE6Tz-7BSi04fgoclDadjcvg4ioigy-Xu6eQQO1CGUQ,278
|
80
|
+
hyperpocket/auth/basicauth/README.md,sha256=Sq5w_v3_JVp2k3Jaywmx_y_-ytw2Cs_oEeYveoXZVA0,564
|
81
|
+
hyperpocket/auth/basicauth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
|
+
hyperpocket/auth/basicauth/basicauth_context.py,sha256=uzGIWfusl2PKJaCzZlO64KlRYk0dHqh0tVaKDQkaqFE,447
|
83
|
+
hyperpocket/auth/basicauth/basicauth_handler.py,sha256=7j8n3fUgTM4gloKOK_x1MmbhDN_4w3UNhBf6AWQFws0,2861
|
84
|
+
hyperpocket/auth/basicauth/basicauth_schema.py,sha256=EXJjGcVLZ4IU21XYKwkQSmbz1Dhgq6CVWDzeA7OGAeU,205
|
85
|
+
hyperpocket/auth/basicauth/context.py,sha256=6ptACRf0ojzx0R1QvZ_Whz3SQQEJvlUkLDXElGELhxc,424
|
80
86
|
hyperpocket/auth/bitbucket/README.md,sha256=IgKbZYRV0XREtEFuD7avgcVgtdGcl5QRUGEa8vd_Tjg,301
|
81
87
|
hyperpocket/auth/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
88
|
hyperpocket/auth/bitbucket/context.py,sha256=cQhRaldutMoreNUGdVcNHQi4O5_U7V1dmJw4nm16hAM,433
|
@@ -218,7 +224,7 @@ hyperpocket/auth/heygen/token_schema.py,sha256=nGUQ7NBZlKHz6diuayNAtCZLXk6JQ--iR
|
|
218
224
|
hyperpocket/auth/hubspot/README.md,sha256=r1f5PXUZXxFcQYqqaVCsQBauvXYP3rtxZkWFk13SSAc,315
|
219
225
|
hyperpocket/auth/hubspot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
220
226
|
hyperpocket/auth/hubspot/context.py,sha256=s4h3aaYDXpg2HJFg6H5LaV9-AKE_PoZSM7kq1XLDBC4,429
|
221
|
-
hyperpocket/auth/hubspot/oauth2_context.py,sha256=
|
227
|
+
hyperpocket/auth/hubspot/oauth2_context.py,sha256=7tUGV_5FIjkrWIf_uWyEDBYpJOB2QNr6mIL57Q3tbXE,1062
|
222
228
|
hyperpocket/auth/hubspot/oauth2_handler.py,sha256=oXej2p7Tj0GjOJdtf09Qo4LM67XtxtF6pUdBq8_hA1o,4866
|
223
229
|
hyperpocket/auth/hubspot/oauth2_schema.py,sha256=7pq2nS9AS1Huxp94zQmL7_2rsJz21VuUtGLv3CIN1_I,432
|
224
230
|
hyperpocket/auth/hubspot/token_context.py,sha256=zpbH8QFhEr-0TN9ggZIGY8UktRZWmitCzcm0K-Hl_bk,455
|
@@ -268,9 +274,12 @@ hyperpocket/auth/linear/token_handler.py,sha256=qfC_w_siPz_dYm3T7KJWKO1LuRazyq50
|
|
268
274
|
hyperpocket/auth/linear/token_schema.py,sha256=oTy-gOZvXEmGVStgFfnNmlbkknNepOTI5KIeTQLRxus,209
|
269
275
|
hyperpocket/auth/linkedin/README.md,sha256=_4YF9SFSYBAAe80qFYuTK0jQRtspptQMK-keu523uhM,497
|
270
276
|
hyperpocket/auth/linkedin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
277
|
+
hyperpocket/auth/linkedin/basicauth_context.py,sha256=49aSphgH-aKz0MzpGSb8MEKvqGFBWbpkTD9vLQP7TdE,518
|
278
|
+
hyperpocket/auth/linkedin/basicauth_handler.py,sha256=szFd8_bx197YXbkn5MmEWNHbGy4Re6Pq6L7xh0Hjr4I,2981
|
279
|
+
hyperpocket/auth/linkedin/basicauth_schema.py,sha256=P_UQpFWd81kP0v_5d9IST9nxVlr2wGEKgzHZ-LXDwuI,221
|
271
280
|
hyperpocket/auth/linkedin/context.py,sha256=BenS73NLL_m7AKTUb3xZD2-hS2hVckr8WB3XoEIKEo4,431
|
272
281
|
hyperpocket/auth/linkedin/oauth2_context.py,sha256=Db75l0oEMHyTGX9rW8yrspd9JKnysT1pcCvLH15PsxU,1072
|
273
|
-
hyperpocket/auth/linkedin/oauth2_handler.py,sha256=
|
282
|
+
hyperpocket/auth/linkedin/oauth2_handler.py,sha256=yBA3mEE7CQ7POD5CIduLSAKE7UeaVmiv5U5nnQE_iCQ,5340
|
274
283
|
hyperpocket/auth/linkedin/oauth2_schema.py,sha256=c85rkrvwaJ9cNj5CD8CGkDly15g_R7DHWH_MWsohrJs,504
|
275
284
|
hyperpocket/auth/listennotes/README.md,sha256=dzgM-crWkaUh_TmKQEsu8BFkRxueIFqZLNpoCvKQ81E,330
|
276
285
|
hyperpocket/auth/listennotes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -486,7 +495,7 @@ hyperpocket/cli/codegen/auth/server_auth_template.py,sha256=IBmUrKTF72eEEV3igfBI
|
|
486
495
|
hyperpocket/cli/codegen/tool/__init__.py,sha256=LHQ85ACCEpEV44LoOMGjYX_iUlZqoSfk0VZvorG6Eng,93
|
487
496
|
hyperpocket/cli/codegen/tool/tool_main_template.py,sha256=VKxt-DbQ97DYtUClRZJwt3rfoidsg_CR5iIg4sH2tTg,1127
|
488
497
|
hyperpocket/config/__init__.py,sha256=gYMHdExdPYScBB8mihSp1yJ9H-RJ8FdNz5mEFubFNAo,138
|
489
|
-
hyperpocket/config/auth.py,sha256=
|
498
|
+
hyperpocket/config/auth.py,sha256=nRxCuia-Jjnlz-jpYA3-B1AovSRzBQ_GSqEtj3kwMMw,2241
|
490
499
|
hyperpocket/config/git.py,sha256=CGbY7J1LyN4ccZr9CFGAQwwhjC9kvdU0On_nsAsZ1FQ,362
|
491
500
|
hyperpocket/config/logger.py,sha256=RWPmuN6Rk4x3a4rendGkKLCowhs6LFlIV8rYNu2GoxM,2749
|
492
501
|
hyperpocket/config/session.py,sha256=1ng1mARv4R_07SF5CkZWLgX9pNeXTcM0knCRw07Fpms,816
|
@@ -508,6 +517,7 @@ hyperpocket/server/auth/altoviz.py,sha256=36NIC0SrdTPJsSVABE5jVKf9sDyl8fbkUzlT4S
|
|
508
517
|
hyperpocket/server/auth/apitoken.py,sha256=I-ZDEehzwh7WsoHBnNTW1MZDRcmzNucNVBvGNHFjaao,451
|
509
518
|
hyperpocket/server/auth/asana.py,sha256=F1e0bOjCPdxd6ymjIxas3KqxY526qFh5dtjEERpC3XQ,709
|
510
519
|
hyperpocket/server/auth/bamboohr.py,sha256=43NDUVZyUuF-B30WNJaLcIbIGMNnOcv4dSp0sxyAXi0,449
|
520
|
+
hyperpocket/server/auth/basicauth.py,sha256=yUrZcAUi_VxNn0HzlsbKeFIdNefwf1w3Vuj7e7FgucY,2871
|
511
521
|
hyperpocket/server/auth/bitbucket.py,sha256=AKWWHGbmqLg5NxsqNRLR5hxSdgvN1R6uNPw_8PPlZwY,733
|
512
522
|
hyperpocket/server/auth/bitwarden.py,sha256=Xu_q-crU967pwr3dzNToRyeMKgs5Flgdgh0wf1B0UF8,453
|
513
523
|
hyperpocket/server/auth/brevo.py,sha256=leFkvlxYXvtP4Z3sIHnSl96kUsvO2yL1jgB6hdNuj04,437
|
@@ -537,7 +547,7 @@ hyperpocket/server/auth/kraken.py,sha256=vhKhEI8NQiaMOBWbw1dROBBOCia91AYXYRozX8T
|
|
537
547
|
hyperpocket/server/auth/lever.py,sha256=AJjd852iUgfbudd-ILknC7HykgaKBKlMWfEUIWZ81ok,437
|
538
548
|
hyperpocket/server/auth/lever_sandbox.py,sha256=RrhBvEZUAfj26Nj7Ic5MQAauyMmhT9rE__tkMhmAT6Y,469
|
539
549
|
hyperpocket/server/auth/linear.py,sha256=vUW4TEqdOYqAyx9YLJC4-dVldPTDuIPXRvoo-a89ai8,988
|
540
|
-
hyperpocket/server/auth/linkedin.py,sha256=
|
550
|
+
hyperpocket/server/auth/linkedin.py,sha256=iSF2Dod-ZIj7g_0j-5mIz4jhJryKAyX5xdvEPfZvH54,946
|
541
551
|
hyperpocket/server/auth/listennotes.py,sha256=IxS90E3Z_ZDe-UyFmvEtXbpFnYAkRBnX_U35qM07rVM,461
|
542
552
|
hyperpocket/server/auth/mailchimp.py,sha256=Bb8roxJG1zlThDDaJ6hH8pHMsY8Qb_4NAF7DjKtqK0M,733
|
543
553
|
hyperpocket/server/auth/mem0.py,sha256=ksFs4zGhUeMsHDTQ64B1ofRLQ5aWjXelCabmkDZoMhU,433
|
@@ -586,6 +596,7 @@ hyperpocket/tool/function/__init__.py,sha256=n0IYvfoyoFWv76iwK2kBC-X6468dl5XyYFl
|
|
586
596
|
hyperpocket/tool/function/annotation.py,sha256=qVBhjFUXY_MXysPN61FJuX4mgVZHuMJTtn0L5QCY4eg,1159
|
587
597
|
hyperpocket/tool/function/tool.py,sha256=p7Bm9_9GAcsvzWve6n1VnIVW4EtesQdOyKmtaZCfGps,7564
|
588
598
|
hyperpocket/util/__init__.py,sha256=7vN8c7dy7nhGhjXtSUGAsc6GIlUnuBMvXSl1yW1M4js,35
|
599
|
+
hyperpocket/util/convert_pydantic_to_dict.py,sha256=Nevdc3adl9bbHcIqXatWnmj_HTGbTPWNGH22Cy7CCxI,399
|
589
600
|
hyperpocket/util/extract_func_param_desc_from_docstring.py,sha256=eGDrbigmVg1zaud1q5l2WDZkYqzy56TRznNPouc8i_Y,4170
|
590
601
|
hyperpocket/util/find_all_leaf_class_in_package.py,sha256=06n8R47BDPovxhCOnzu9GuEfeQzEbv-HdG-zfMu1gBw,533
|
591
602
|
hyperpocket/util/find_all_subclass_in_package.py,sha256=TtEb41-nzCNhC9pgelTS6MMxLT_JNZkFPJe5z2H9yik,978
|
@@ -595,7 +606,7 @@ hyperpocket/util/get_objects_from_subpackage.py,sha256=4mR_S8eaJSdU68YfCkiXeIcXx
|
|
595
606
|
hyperpocket/util/git_parser.py,sha256=y96nhgZXtRgA_u_0GTPo95PGkpG-n_oMIrkbckdxiR8,2496
|
596
607
|
hyperpocket/util/json_schema_to_model.py,sha256=nc5AmnqkrdeFLELu-7_O9sEAaUaD8_KGlvIMDRobt-4,3751
|
597
608
|
hyperpocket/util/short_hashing_str.py,sha256=ahLUT8iQr-MJVbDJXrSt0cXnnSEeJ8EU3A0PDn6e0gs,119
|
598
|
-
hyperpocket-0.5.
|
599
|
-
hyperpocket-0.5.
|
600
|
-
hyperpocket-0.5.
|
601
|
-
hyperpocket-0.5.
|
609
|
+
hyperpocket-0.5.6.dist-info/METADATA,sha256=f5BQrI9LYabcT_FeNeRuWX-ZL5IY1YQa0tTJIdoXtTU,13534
|
610
|
+
hyperpocket-0.5.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
611
|
+
hyperpocket-0.5.6.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
|
612
|
+
hyperpocket-0.5.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|