hyperpocket 0.1.10__py3-none-any.whl → 0.2.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. hyperpocket/__init__.py +4 -4
  2. hyperpocket/auth/__init__.py +12 -7
  3. hyperpocket/auth/calendly/oauth2_handler.py +24 -17
  4. hyperpocket/auth/calendly/oauth2_schema.py +3 -1
  5. hyperpocket/auth/context.py +2 -1
  6. hyperpocket/auth/github/oauth2_handler.py +13 -8
  7. hyperpocket/auth/github/token_handler.py +27 -21
  8. hyperpocket/auth/google/context.py +1 -3
  9. hyperpocket/auth/google/oauth2_context.py +1 -1
  10. hyperpocket/auth/google/oauth2_handler.py +22 -17
  11. hyperpocket/auth/gumloop/token_context.py +1 -4
  12. hyperpocket/auth/gumloop/token_handler.py +48 -20
  13. hyperpocket/auth/gumloop/token_schema.py +2 -1
  14. hyperpocket/auth/handler.py +21 -6
  15. hyperpocket/auth/linear/token_context.py +2 -5
  16. hyperpocket/auth/linear/token_handler.py +45 -21
  17. hyperpocket/auth/notion/context.py +2 -2
  18. hyperpocket/auth/notion/token_context.py +2 -4
  19. hyperpocket/auth/notion/token_handler.py +45 -21
  20. hyperpocket/auth/notion/token_schema.py +0 -1
  21. hyperpocket/auth/reddit/oauth2_handler.py +9 -10
  22. hyperpocket/auth/reddit/oauth2_schema.py +0 -2
  23. hyperpocket/auth/schema.py +4 -1
  24. hyperpocket/auth/slack/oauth2_context.py +3 -1
  25. hyperpocket/auth/slack/oauth2_handler.py +55 -35
  26. hyperpocket/auth/slack/token_context.py +2 -4
  27. hyperpocket/auth/slack/token_handler.py +42 -19
  28. hyperpocket/builtin.py +4 -2
  29. hyperpocket/cli/__main__.py +4 -2
  30. hyperpocket/cli/auth.py +59 -28
  31. hyperpocket/cli/codegen/auth/auth_context_template.py +3 -2
  32. hyperpocket/cli/codegen/auth/auth_token_context_template.py +3 -2
  33. hyperpocket/cli/codegen/auth/auth_token_handler_template.py +6 -5
  34. hyperpocket/cli/codegen/auth/auth_token_schema_template.py +3 -2
  35. hyperpocket/cli/codegen/auth/server_auth_template.py +3 -2
  36. hyperpocket/cli/pull.py +5 -5
  37. hyperpocket/config/__init__.py +3 -8
  38. hyperpocket/config/auth.py +3 -1
  39. hyperpocket/config/logger.py +20 -15
  40. hyperpocket/config/session.py +4 -2
  41. hyperpocket/config/settings.py +19 -2
  42. hyperpocket/futures/__init__.py +1 -1
  43. hyperpocket/futures/futurestore.py +3 -2
  44. hyperpocket/pocket_auth.py +171 -84
  45. hyperpocket/pocket_core.py +51 -33
  46. hyperpocket/pocket_main.py +122 -93
  47. hyperpocket/prompts.py +2 -2
  48. hyperpocket/repository/__init__.py +1 -1
  49. hyperpocket/repository/lock.py +47 -33
  50. hyperpocket/repository/lockfile.py +2 -2
  51. hyperpocket/repository/repository.py +1 -1
  52. hyperpocket/server/__init__.py +1 -1
  53. hyperpocket/server/auth/github.py +2 -1
  54. hyperpocket/server/auth/linear.py +1 -3
  55. hyperpocket/server/auth/notion.py +2 -5
  56. hyperpocket/server/auth/slack.py +1 -3
  57. hyperpocket/server/auth/token.py +17 -11
  58. hyperpocket/server/proxy.py +29 -13
  59. hyperpocket/server/server.py +75 -31
  60. hyperpocket/server/tool/dto/script.py +15 -10
  61. hyperpocket/server/tool/wasm.py +14 -11
  62. hyperpocket/session/__init__.py +6 -2
  63. hyperpocket/session/in_memory.py +44 -24
  64. hyperpocket/session/interface.py +42 -24
  65. hyperpocket/session/redis.py +48 -31
  66. hyperpocket/tool/__init__.py +10 -10
  67. hyperpocket/tool/function/__init__.py +1 -5
  68. hyperpocket/tool/function/annotation.py +11 -9
  69. hyperpocket/tool/function/tool.py +37 -27
  70. hyperpocket/tool/tool.py +59 -36
  71. hyperpocket/tool/wasm/__init__.py +1 -1
  72. hyperpocket/tool/wasm/browser.py +15 -10
  73. hyperpocket/tool/wasm/invoker.py +16 -16
  74. hyperpocket/tool/wasm/script.py +27 -14
  75. hyperpocket/tool/wasm/templates/__init__.py +22 -15
  76. hyperpocket/tool/wasm/templates/node.py +2 -2
  77. hyperpocket/tool/wasm/templates/python.py +2 -2
  78. hyperpocket/tool/wasm/tool.py +27 -14
  79. hyperpocket/tool_like.py +3 -3
  80. hyperpocket/util/__init__.py +1 -1
  81. hyperpocket/util/extract_func_param_desc_from_docstring.py +23 -7
  82. hyperpocket/util/find_all_leaf_class_in_package.py +4 -3
  83. hyperpocket/util/find_all_subclass_in_package.py +4 -2
  84. hyperpocket/util/flatten_json_schema.py +10 -6
  85. hyperpocket/util/function_to_model.py +33 -12
  86. hyperpocket/util/get_objects_from_subpackage.py +1 -1
  87. hyperpocket/util/json_schema_to_model.py +14 -5
  88. {hyperpocket-0.1.10.dist-info → hyperpocket-0.2.0.dist-info}/METADATA +11 -5
  89. hyperpocket-0.2.0.dist-info/RECORD +137 -0
  90. hyperpocket-0.1.10.dist-info/RECORD +0 -137
  91. {hyperpocket-0.1.10.dist-info → hyperpocket-0.2.0.dist-info}/WHEEL +0 -0
  92. {hyperpocket-0.1.10.dist-info → hyperpocket-0.2.0.dist-info}/entry_points.txt +0 -0
@@ -3,13 +3,13 @@ import enum
3
3
  import uuid
4
4
  from typing import Optional, Type
5
5
 
6
- from hyperpocket.auth import AuthProvider, PREBUILT_AUTH_HANDLERS
6
+ from hyperpocket.auth import PREBUILT_AUTH_HANDLERS, AuthProvider
7
7
  from hyperpocket.auth.context import AuthContext
8
- from hyperpocket.auth.handler import AuthHandlerInterface, AuthenticateRequest
8
+ from hyperpocket.auth.handler import AuthenticateRequest, AuthHandlerInterface
9
9
  from hyperpocket.config import config, pocket_logger
10
10
  from hyperpocket.futures import FutureStore
11
11
  from hyperpocket.session import SESSION_STORAGE_LIST
12
- from hyperpocket.session.interface import SessionStorageInterface, BaseSessionValue
12
+ from hyperpocket.session.interface import BaseSessionValue, SessionStorageInterface
13
13
 
14
14
 
15
15
  class AuthState(enum.Enum):
@@ -26,11 +26,12 @@ class PocketAuth(object):
26
26
  session_storage: SessionStorageInterface
27
27
 
28
28
  def __init__(
29
- self,
30
- handlers: Optional[list[Type[AuthHandlerInterface]]] = None,
31
- session_storage: Optional[SessionStorageInterface] = None,
32
- use_prebuilt_handlers: bool = None):
33
- if config.auth.use_prebuilt_auth or use_prebuilt_handlers:
29
+ self,
30
+ handlers: Optional[list[Type[AuthHandlerInterface]]] = None,
31
+ session_storage: Optional[SessionStorageInterface] = None,
32
+ use_prebuilt_handlers: bool = None,
33
+ ):
34
+ if config().auth.use_prebuilt_auth or use_prebuilt_handlers:
34
35
  handlers = PREBUILT_AUTH_HANDLERS + (handlers or [])
35
36
  handler_impls = [C() for C in handlers] if handlers else []
36
37
  self.handlers = {handler.name: handler for handler in handler_impls}
@@ -38,21 +39,31 @@ class PocketAuth(object):
38
39
  self.session_storage = session_storage
39
40
  else:
40
41
  for session_type in SESSION_STORAGE_LIST:
41
- if session_type.session_storage_type() == config.session.session_type:
42
- session_config = getattr(config.session, config.session.session_type.value)
43
-
44
- pocket_logger.info(f"init {session_type.session_storage_type()} session storage..")
42
+ if session_type.session_storage_type() == config().session.session_type:
43
+ session_config = getattr(
44
+ config().session, config().session.session_type.value
45
+ )
46
+
47
+ pocket_logger.info(
48
+ f"init {session_type.session_storage_type()} session storage.."
49
+ )
45
50
  self.session_storage = session_type(session_config)
46
51
 
47
52
  if self.session_storage is None:
48
- pocket_logger.error(f"not supported session type({config.session.session_type})")
49
- raise RuntimeError(f"Not Supported Session Type({config.session.session_type})")
50
-
51
- def make_request(self,
52
- auth_scopes: list[str] = None,
53
- auth_handler_name: Optional[str] = None,
54
- auth_provider: Optional[AuthProvider] = None,
55
- **kwargs) -> AuthenticateRequest:
53
+ pocket_logger.error(
54
+ f"not supported session type({config().session.session_type})"
55
+ )
56
+ raise RuntimeError(
57
+ f"Not Supported Session Type({config().session.session_type})"
58
+ )
59
+
60
+ def make_request(
61
+ self,
62
+ auth_scopes: list[str] = None,
63
+ auth_handler_name: Optional[str] = None,
64
+ auth_provider: Optional[AuthProvider] = None,
65
+ **kwargs,
66
+ ) -> AuthenticateRequest:
56
67
  """
57
68
  Make AuthenticationRequest based on authentication handler.
58
69
 
@@ -67,14 +78,16 @@ class PocketAuth(object):
67
78
  handler = self.find_handler_instance(auth_handler_name, auth_provider)
68
79
  return handler.make_request(auth_scopes, **kwargs)
69
80
 
70
- def check(self,
71
- auth_req: AuthenticateRequest,
72
- auth_handler_name: Optional[str] = None,
73
- auth_provider: Optional[AuthProvider] = None,
74
- thread_id: str = "default",
75
- profile: str = 'default',
76
- *args, **kwargs
77
- ) -> AuthState:
81
+ def check(
82
+ self,
83
+ auth_req: AuthenticateRequest,
84
+ auth_handler_name: Optional[str] = None,
85
+ auth_provider: Optional[AuthProvider] = None,
86
+ thread_id: str = "default",
87
+ profile: str = "default",
88
+ *args,
89
+ **kwargs,
90
+ ) -> AuthState:
78
91
  """
79
92
  Check current authentication state.
80
93
 
@@ -104,7 +117,9 @@ class PocketAuth(object):
104
117
  return auth_state
105
118
 
106
119
  @staticmethod
107
- def get_session_state(session: Optional[BaseSessionValue], auth_req: Optional[AuthenticateRequest]) -> AuthState:
120
+ def get_session_state(
121
+ session: Optional[BaseSessionValue], auth_req: Optional[AuthenticateRequest]
122
+ ) -> AuthState:
108
123
  if not session:
109
124
  return AuthState.NO_SESSION
110
125
 
@@ -115,8 +130,9 @@ class PocketAuth(object):
115
130
 
116
131
  return AuthState.PENDING_RESOLVE
117
132
 
118
- if auth_req is not None and not session.is_auth_applicable(auth_provider_name=session.auth_provider_name,
119
- auth_req=auth_req):
133
+ if auth_req is not None and not session.is_auth_applicable(
134
+ auth_provider_name=session.auth_provider_name, auth_req=auth_req
135
+ ):
120
136
  return AuthState.DO_AUTH
121
137
 
122
138
  if session.is_near_expires():
@@ -124,13 +140,15 @@ class PocketAuth(object):
124
140
 
125
141
  return AuthState.SKIP_AUTH
126
142
 
127
- def prepare(self,
128
- auth_req: AuthenticateRequest,
129
- auth_handler_name: Optional[str] = None,
130
- auth_provider: Optional[AuthProvider] = None,
131
- thread_id: str = "default",
132
- profile: str = 'default',
133
- **kwargs) -> Optional[str]:
143
+ def prepare(
144
+ self,
145
+ auth_req: AuthenticateRequest,
146
+ auth_handler_name: Optional[str] = None,
147
+ auth_provider: Optional[AuthProvider] = None,
148
+ thread_id: str = "default",
149
+ profile: str = "default",
150
+ **kwargs,
151
+ ) -> Optional[str]:
134
152
  """
135
153
  Prepare authentication.
136
154
 
@@ -158,8 +176,13 @@ class PocketAuth(object):
158
176
  )
159
177
 
160
178
  pocket_logger.debug(
161
- f"[thread_id({thread_id}):profile({profile})] {auth_provider.name} provider current auth state in prepare : {auth_state}")
162
- if auth_state in [AuthState.SKIP_AUTH, AuthState.DO_REFRESH, AuthState.RESOLVED]:
179
+ f"[thread_id({thread_id}):profile({profile})] {auth_provider.name} provider current auth state in prepare : {auth_state}"
180
+ )
181
+ if auth_state in [
182
+ AuthState.SKIP_AUTH,
183
+ AuthState.DO_REFRESH,
184
+ AuthState.RESOLVED,
185
+ ]:
163
186
  return None
164
187
 
165
188
  handler = self.find_handler_instance(auth_handler_name, auth_provider)
@@ -168,12 +191,13 @@ class PocketAuth(object):
168
191
  if session:
169
192
  scope = scope.union(session.auth_scopes)
170
193
 
171
- modified_req = auth_req.model_copy(update={'auth_scopes': scope})
194
+ modified_req = auth_req.model_copy(update={"auth_scopes": scope})
172
195
 
173
196
  # session in pending
174
197
  if session and session.auth_resolve_uid:
175
198
  pocket_logger.debug(
176
- f"[thread_id({thread_id}):profile({profile})] already exists pending session(auth_resolve_uid:{session.auth_resolve_uid}).")
199
+ f"[thread_id({thread_id}):profile({profile})] already exists pending session(auth_resolve_uid:{session.auth_resolve_uid})."
200
+ )
177
201
  future_uid = session.auth_resolve_uid
178
202
 
179
203
  # update session, in case of requesting new scopes before session pending resolved.
@@ -182,7 +206,7 @@ class PocketAuth(object):
182
206
  future_uid=session.auth_resolve_uid,
183
207
  profile=profile,
184
208
  thread_id=thread_id,
185
- scope=scope
209
+ scope=scope,
186
210
  )
187
211
  else: # create new pending session
188
212
  future_uid = str(uuid.uuid4())
@@ -191,25 +215,34 @@ class PocketAuth(object):
191
215
  future_uid=future_uid,
192
216
  profile=profile,
193
217
  thread_id=thread_id,
194
- scope=scope)
218
+ scope=scope,
219
+ )
195
220
 
196
221
  pocket_logger.debug(
197
- f"[thread_id({thread_id}):profile({profile})] create new pending session(auth_resolve_uid:{future_uid}).")
198
- asyncio.create_task(self._check_session_pending_resolved(handler, thread_id, profile))
222
+ f"[thread_id({thread_id}):profile({profile})] create new pending session(auth_resolve_uid:{future_uid})."
223
+ )
224
+ asyncio.create_task(
225
+ self._check_session_pending_resolved(handler, thread_id, profile)
226
+ )
199
227
 
200
- prepare_url = handler.prepare(modified_req, thread_id, profile, future_uid, **kwargs)
228
+ prepare_url = handler.prepare(
229
+ modified_req, thread_id, profile, future_uid, **kwargs
230
+ )
201
231
  pocket_logger.debug(
202
- f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name})'s prepare_url : {prepare_url}.")
232
+ f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name})'s prepare_url : {prepare_url}."
233
+ )
203
234
 
204
235
  return prepare_url
205
236
 
206
- async def authenticate_async(self,
207
- auth_req: AuthenticateRequest,
208
- auth_handler_name: Optional[str] = None,
209
- auth_provider: Optional[AuthProvider] = None,
210
- thread_id: str = "default",
211
- profile: str = 'default',
212
- **kwargs) -> AuthContext:
237
+ async def authenticate_async(
238
+ self,
239
+ auth_req: AuthenticateRequest,
240
+ auth_handler_name: Optional[str] = None,
241
+ auth_provider: Optional[AuthProvider] = None,
242
+ thread_id: str = "default",
243
+ profile: str = "default",
244
+ **kwargs,
245
+ ) -> AuthContext:
213
246
  """
214
247
  Performing authentication.
215
248
  It is performing authentication. and save the session in session storage.
@@ -243,42 +276,61 @@ class PocketAuth(object):
243
276
  session = self.session_storage.get(handler.provider(), thread_id, profile)
244
277
  if session is None:
245
278
  pocket_logger.warning(
246
- f"[thread_id({thread_id}):profile({profile})] Session can't find. session should exist in 'authenticate'.")
279
+ f"[thread_id({thread_id}):profile({profile})] Session can't find. session should exist in 'authenticate'."
280
+ )
247
281
  raise RuntimeError(
248
- f"[thread_id({thread_id}):profile({profile})] Session can't find. session should exist in 'authenticate'.")
282
+ f"[thread_id({thread_id}):profile({profile})] Session can't find. session should exist in 'authenticate'."
283
+ )
249
284
 
250
285
  pocket_logger.debug(
251
- f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name})'s auth state : {auth_state}")
286
+ f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name})'s auth state : {auth_state}"
287
+ )
252
288
  try:
253
289
  if auth_state == AuthState.SKIP_AUTH:
254
290
  context = session.auth_context
255
291
  elif auth_state == AuthState.DO_REFRESH:
256
292
  try:
257
293
  context = await asyncio.wait_for(
258
- handler.refresh(auth_req=auth_req, context=session.auth_context, **kwargs), timeout=300)
294
+ handler.refresh(
295
+ auth_req=auth_req, context=session.auth_context, **kwargs
296
+ ),
297
+ timeout=300,
298
+ )
259
299
  except Exception as e:
260
300
  self.session_storage.delete(handler.provider(), thread_id, profile)
261
301
  FutureStore.delete_future(session.auth_resolve_uid)
262
302
 
263
303
  pocket_logger.warning(
264
- f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name}) failed to refresh the token.")
265
- raise RuntimeError("Failed to refresh the token. Please re-authenticate.") from e
266
- elif auth_state == AuthState.PENDING_RESOLVE or auth_state == AuthState.RESOLVED:
304
+ f"[thread_id({thread_id}):profile({profile})] auth_handler({auth_handler_name}) failed to refresh the token."
305
+ )
306
+ raise RuntimeError(
307
+ "Failed to refresh the token. Please re-authenticate."
308
+ ) from e
309
+ elif (
310
+ auth_state == AuthState.PENDING_RESOLVE
311
+ or auth_state == AuthState.RESOLVED
312
+ ):
267
313
  future_uid = session.auth_resolve_uid
268
314
  context = await asyncio.wait_for(
269
- handler.authenticate(auth_req=auth_req, future_uid=future_uid, **kwargs), timeout=300)
315
+ handler.authenticate(
316
+ auth_req=auth_req, future_uid=future_uid, **kwargs
317
+ ),
318
+ timeout=300,
319
+ )
270
320
  else:
271
321
  # maybe auth_state is either AuthState.NO_SESSION or AuthState.DO_AUTH
272
322
  pocket_logger.warning(
273
- f"[thread_id({thread_id}):profile({profile})] Invalid State. 'authenticate' cannot be reached while in state {auth_state}")
323
+ f"[thread_id({thread_id}):profile({profile})] Invalid State. 'authenticate' cannot be reached while in state {auth_state}"
324
+ )
274
325
  raise RuntimeError(
275
- f"[thread_id({thread_id}):profile({profile})] Invalid State. 'authenticate' cannot be reached while in state {auth_state}")
326
+ f"[thread_id({thread_id}):profile({profile})] Invalid State. 'authenticate' cannot be reached while in state {auth_state}"
327
+ )
276
328
 
277
329
  session = await self._set_session_active(
278
330
  context=context,
279
331
  provider=handler.provider(),
280
332
  profile=profile,
281
- thread_id=thread_id
333
+ thread_id=thread_id,
282
334
  )
283
335
 
284
336
  return session.auth_context
@@ -288,33 +340,50 @@ class PocketAuth(object):
288
340
  FutureStore.delete_future(session.auth_resolve_uid)
289
341
  raise e
290
342
 
291
- def get_auth_context(self, auth_provider: AuthProvider, thread_id: str = "default", profile: str = "default",
292
- **kwargs) -> Optional[AuthContext]:
343
+ def get_auth_context(
344
+ self,
345
+ auth_provider: AuthProvider,
346
+ thread_id: str = "default",
347
+ profile: str = "default",
348
+ **kwargs,
349
+ ) -> Optional[AuthContext]:
293
350
  session = self.session_storage.get(auth_provider, thread_id, profile, **kwargs)
294
351
  if session is None:
295
352
  return None
296
353
 
297
354
  return session.auth_context
298
355
 
299
- def list_session_state(self, thread_id: str, auth_provider: Optional[AuthProvider] = None):
300
- session_list = self.session_storage.get_by_thread_id(thread_id=thread_id, auth_provider=auth_provider)
356
+ def list_session_state(
357
+ self, thread_id: str, auth_provider: Optional[AuthProvider] = None
358
+ ):
359
+ session_list = self.session_storage.get_by_thread_id(
360
+ thread_id=thread_id, auth_provider=auth_provider
361
+ )
301
362
  session_state_list = []
302
363
  for session in session_list:
303
364
  state = self.get_session_state(session=session, auth_req=None)
304
365
 
305
- session_state_list.append({
306
- "provider": session.auth_provider_name,
307
- "scope": session.auth_scopes,
308
- "state": state,
309
- })
366
+ session_state_list.append(
367
+ {
368
+ "provider": session.auth_provider_name,
369
+ "scope": session.auth_scopes,
370
+ "state": state,
371
+ }
372
+ )
310
373
 
311
374
  return session_state_list
312
375
 
313
- def delete_session(self, auth_provider: AuthProvider, thread_id: str = "default", profile: str = "default") -> bool:
376
+ def delete_session(
377
+ self,
378
+ auth_provider: AuthProvider,
379
+ thread_id: str = "default",
380
+ profile: str = "default",
381
+ ) -> bool:
314
382
  return self.session_storage.delete(auth_provider, thread_id, profile)
315
383
 
316
- def find_handler_instance(self, name: Optional[str] = None,
317
- auth_provider: Optional[AuthProvider] = None) -> AuthHandlerInterface:
384
+ def find_handler_instance(
385
+ self, name: Optional[str] = None, auth_provider: Optional[AuthProvider] = None
386
+ ) -> AuthHandlerInterface:
318
387
  if name:
319
388
  return self.handlers[name]
320
389
  if auth_provider:
@@ -323,19 +392,35 @@ class PocketAuth(object):
323
392
  return handler
324
393
  raise ValueError("No handler found")
325
394
 
326
- async def _check_session_pending_resolved(self, auth_handler: AuthHandlerInterface, thread_id: str = "default",
327
- profile: str = "default", timeout_seconds=300, **kwargs):
395
+ async def _check_session_pending_resolved(
396
+ self,
397
+ auth_handler: AuthHandlerInterface,
398
+ thread_id: str = "default",
399
+ profile: str = "default",
400
+ timeout_seconds=300,
401
+ **kwargs,
402
+ ):
328
403
  await asyncio.sleep(timeout_seconds)
329
- session = self.session_storage.get(auth_handler.provider(), thread_id, profile, **kwargs)
404
+ session = self.session_storage.get(
405
+ auth_handler.provider(), thread_id, profile, **kwargs
406
+ )
330
407
  if session.auth_resolve_uid is not None:
331
- pocket_logger.info(f"session({session.auth_resolve_uid}) is not resolved yet and timeout. remove session")
408
+ pocket_logger.info(
409
+ f"session({session.auth_resolve_uid}) is not resolved yet and timeout. remove session"
410
+ )
332
411
  self.delete_session(auth_handler.provider(), thread_id, profile)
333
412
  FutureStore.delete_future(session.auth_resolve_uid)
334
413
 
335
414
  return
336
415
 
337
416
  def _upsert_pending_session(
338
- self, auth_handler: AuthHandlerInterface, future_uid: str, profile: str, thread_id: str, scope: set[str]):
417
+ self,
418
+ auth_handler: AuthHandlerInterface,
419
+ future_uid: str,
420
+ profile: str,
421
+ thread_id: str,
422
+ scope: set[str],
423
+ ):
339
424
  return self.session_storage.set(
340
425
  auth_provider=auth_handler.provider(),
341
426
  thread_id=thread_id,
@@ -346,7 +431,9 @@ class PocketAuth(object):
346
431
  auth_resolve_uid=future_uid,
347
432
  )
348
433
 
349
- async def _set_session_active(self, context: AuthContext, provider: AuthProvider, profile: str, thread_id: str):
434
+ async def _set_session_active(
435
+ self, context: AuthContext, provider: AuthProvider, profile: str, thread_id: str
436
+ ):
350
437
  session = self.session_storage.get(provider, thread_id, profile)
351
438
  if session is None:
352
439
  pocket_logger.error("the session to be active doesn't exist.")
@@ -1,12 +1,12 @@
1
1
  import asyncio
2
2
  import pathlib
3
- from typing import Any, Optional, Callable, List, Union
3
+ from typing import Any, Callable, List, Optional, Union
4
4
 
5
5
  from hyperpocket.builtin import get_builtin_tools
6
6
  from hyperpocket.config import pocket_logger
7
7
  from hyperpocket.pocket_auth import PocketAuth
8
8
  from hyperpocket.repository import Lockfile
9
- from hyperpocket.repository.lock import LocalLock, GitLock
9
+ from hyperpocket.repository.lock import GitLock, LocalLock
10
10
  from hyperpocket.tool import Tool, ToolRequest
11
11
  from hyperpocket.tool.function import from_func
12
12
  from hyperpocket.tool.wasm import WasmTool
@@ -18,11 +18,13 @@ class PocketCore:
18
18
  auth: PocketAuth
19
19
  tools: dict[str, Tool]
20
20
 
21
- def __init__(self,
22
- tools: list[ToolLike],
23
- auth: PocketAuth = None,
24
- lockfile_path: Optional[str] = None,
25
- force_update: bool = False):
21
+ def __init__(
22
+ self,
23
+ tools: list[ToolLike],
24
+ auth: PocketAuth = None,
25
+ lockfile_path: Optional[str] = None,
26
+ force_update: bool = False,
27
+ ):
26
28
  if auth is None:
27
29
  auth = PocketAuth()
28
30
  self.auth = auth
@@ -37,8 +39,10 @@ class PocketCore:
37
39
  if pathlib.Path(tool_like).exists():
38
40
  lock = LocalLock(tool_like)
39
41
  req = WasmToolRequest(lock, "")
40
- else:
41
- base_repo_url, git_ref, rel_path = GitLock.parse_repo_url(repo_url=tool_like)
42
+ elif tool_like.startswith("https://github.com"):
43
+ base_repo_url, git_ref, rel_path = GitLock.parse_repo_url(
44
+ repo_url=tool_like
45
+ )
42
46
  lock = GitLock(repository_url=base_repo_url, git_ref=git_ref)
43
47
  req = WasmToolRequest(lock=lock, rel_path=rel_path, tool_vars={})
44
48
 
@@ -63,19 +67,26 @@ class PocketCore:
63
67
  raise ValueError(f"Duplicate tool name: {tool.name}")
64
68
  self.tools[tool.name] = tool
65
69
 
66
- pocket_logger.info(f"All Registered Tools Loaded successfully. total registered tools : {len(self.tools)}")
70
+ pocket_logger.info(
71
+ f"All Registered Tools Loaded successfully. total registered tools : {len(self.tools)}"
72
+ )
67
73
 
68
74
  builtin_tools = get_builtin_tools(self.auth)
69
75
  for tool in builtin_tools:
70
76
  self.tools[tool.name] = tool
71
- pocket_logger.info(f"All BuiltIn Tools Loaded successfully. total tools : {len(self.tools)}")
72
-
73
- async def acall(self,
74
- tool_name: str,
75
- body: Any,
76
- thread_id: str = 'default',
77
- profile: str = 'default',
78
- *args, **kwargs) -> tuple[str, bool]:
77
+ pocket_logger.info(
78
+ f"All BuiltIn Tools Loaded successfully. total tools : {len(self.tools)}"
79
+ )
80
+
81
+ async def acall(
82
+ self,
83
+ tool_name: str,
84
+ body: Any,
85
+ thread_id: str = "default",
86
+ profile: str = "default",
87
+ *args,
88
+ **kwargs,
89
+ ) -> tuple[str, bool]:
79
90
  """
80
91
  Invoke tool asynchronously, not that different from `Pocket.invoke`
81
92
  But this method is called only in subprocess.
@@ -105,11 +116,13 @@ class PocketCore:
105
116
  result = await self.tool_call(tool_name, body=body, envs=credentials, **kwargs)
106
117
  return result, False
107
118
 
108
- def prepare_auth(self,
109
- tool_name: Union[str, List[str]],
110
- thread_id: str = 'default',
111
- profile: str = 'default',
112
- **kwargs) -> Optional[str]:
119
+ def prepare_auth(
120
+ self,
121
+ tool_name: Union[str, List[str]],
122
+ thread_id: str = "default",
123
+ profile: str = "default",
124
+ **kwargs,
125
+ ) -> Optional[str]:
113
126
  """
114
127
  Prepares the authentication process for the tool if necessary.
115
128
  Returns callback URL and whether the tool requires authentication.
@@ -142,12 +155,14 @@ class PocketCore:
142
155
  for tool in tools:
143
156
  if tool.auth.auth_handler != auth_handler_name:
144
157
  pocket_logger.error(
145
- f"All Tools should have same auth handler. but it's different {tool.auth.auth_handler}, {auth_handler_name}")
158
+ f"All Tools should have same auth handler. but it's different {tool.auth.auth_handler}, {auth_handler_name}"
159
+ )
146
160
 
147
161
  return f"All Tools should have same auth handler. but it's different {tool.auth.auth_handler}, {auth_handler_name}"
148
162
  if tool.auth.auth_provider != auth_provider:
149
163
  pocket_logger.error(
150
- f"All Tools should have same auth provider. but it's different {tool.auth.auth_provider}, {auth_provider}")
164
+ f"All Tools should have same auth provider. but it's different {tool.auth.auth_provider}, {auth_provider}"
165
+ )
151
166
  return f"All Tools should have same auth provider. but it's different {tool.auth.auth_provider}, {auth_provider}"
152
167
 
153
168
  if tool.auth.scopes is not None:
@@ -156,7 +171,8 @@ class PocketCore:
156
171
  auth_req = self.auth.make_request(
157
172
  auth_handler_name=auth_handler_name,
158
173
  auth_provider=auth_provider,
159
- auth_scopes=list(auth_scopes))
174
+ auth_scopes=list(auth_scopes),
175
+ )
160
176
 
161
177
  return self.auth.prepare(
162
178
  auth_req=auth_req,
@@ -164,15 +180,16 @@ class PocketCore:
164
180
  auth_provider=auth_provider,
165
181
  thread_id=thread_id,
166
182
  profile=profile,
167
- **kwargs
183
+ **kwargs,
168
184
  )
169
185
 
170
186
  async def authenticate(
171
- self,
172
- tool_name: str,
173
- thread_id: str = 'default',
174
- profile: str = 'default',
175
- **kwargs) -> dict[str, str]:
187
+ self,
188
+ tool_name: str,
189
+ thread_id: str = "default",
190
+ profile: str = "default",
191
+ **kwargs,
192
+ ) -> dict[str, str]:
176
193
  """
177
194
  Authenticates the handler included in the tool and returns credentials.
178
195
 
@@ -190,7 +207,8 @@ class PocketCore:
190
207
  auth_req = self.auth.make_request(
191
208
  auth_handler_name=tool.auth.auth_handler,
192
209
  auth_provider=tool.auth.auth_provider,
193
- auth_scopes=tool.auth.scopes)
210
+ auth_scopes=tool.auth.scopes,
211
+ )
194
212
  auth_ctx = await self.auth.authenticate_async(
195
213
  auth_req=auth_req,
196
214
  auth_handler_name=tool.auth.auth_handler,