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.
@@ -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,9 @@
1
+ from hyperpocket.auth.schema import AuthenticateRequest, AuthenticateResponse
2
+
3
+
4
+ class BasicAuthRequest(AuthenticateRequest):
5
+ pass
6
+
7
+
8
+ class BasicAuthResponse(AuthenticateResponse):
9
+ access_token: str
@@ -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.authed_user.expires_in)
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()
@@ -0,0 +1,9 @@
1
+ from hyperpocket.auth.schema import AuthenticateRequest, AuthenticateResponse
2
+
3
+
4
+ class LinkedinBasicAuthRequest(AuthenticateRequest):
5
+ pass
6
+
7
+
8
+ class LinkedinBasicAuthResponse(AuthenticateResponse):
9
+ access_token: str
@@ -29,7 +29,7 @@ class LinkedinOAuth2AuthHandler(AuthHandlerInterface):
29
29
 
30
30
  @staticmethod
31
31
  def provider_default() -> bool:
32
- return True
32
+ return False
33
33
 
34
34
  @staticmethod
35
35
  def recommended_scopes() -> set[str]:
@@ -75,6 +75,7 @@ class AuthProvider(Enum):
75
75
  WEAVIATE = "weaviate"
76
76
  VALYU = "valyu"
77
77
  KRAKEN = "kraken"
78
+ BASICAUTH = "basicauth"
78
79
 
79
80
  @classmethod
80
81
  def get_auth_provider(cls, auth_provider_name: str) -> "AuthProvider":
@@ -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("/token/callback")
19
- async def linkedin_token_callback(state: str, token: str):
21
+ @linkedin_auth_router.get("/basicauth/callback")
22
+ async def linkedin_basicauth_callback(state: str, token: str):
20
23
  try:
21
- FutureStore.resolve_future(state, token)
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.4
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.17
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=qZGenhTsL8vqd9zmUMM52TVlmdNNOTsmLmCPmZshUNg,2103
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=4VpkvpU-glUHHS2h9sXbWsDKflQTyhqVdeSTeVa08ck,1135
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=mGTxfArPqeG1MZKflGpItllZzFtyLL26FmeXYDt6mTc,5339
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=OOVdaAfMva6b-Kz4iy5YpnIKjT5WgcQ17toFzHqoRPY,2173
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=ia4KAJ_bxvSDmhldUZ-1PHPGiay8A_WV9KuO9Uwr9ZQ,727
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.4.dist-info/METADATA,sha256=NUGSUVNJ8L-n0xYcCWbC7MRpoScLcNgB0uh28VHCGR0,13044
599
- hyperpocket-0.5.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
600
- hyperpocket-0.5.4.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
601
- hyperpocket-0.5.4.dist-info/RECORD,,
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,,