hyperpocket 0.2.1__py3-none-any.whl → 0.3.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,6 +17,7 @@ from hyperpocket.tool_like import ToolLike
17
17
  class PocketCore:
18
18
  auth: PocketAuth
19
19
  tools: dict[str, Tool]
20
+ lockfile: Lockfile
20
21
 
21
22
  def __init__(
22
23
  self,
@@ -29,48 +30,30 @@ class PocketCore:
29
30
  auth = PocketAuth()
30
31
  self.auth = auth
31
32
 
33
+ # init lockfile
32
34
  if lockfile_path is None:
33
35
  lockfile_path = "./pocket.lock"
34
36
  lockfile_pathlib_path = pathlib.Path(lockfile_path)
35
- lockfile = Lockfile(lockfile_pathlib_path)
37
+ self.lockfile = Lockfile(lockfile_pathlib_path)
38
+
39
+ # parse tool_likes and add lock of the tool like to the lockfile
36
40
  tool_likes = []
37
41
  for tool_like in tools:
38
- if isinstance(tool_like, str):
39
- if pathlib.Path(tool_like).exists():
40
- lock = LocalLock(tool_like)
41
- req = WasmToolRequest(lock, "")
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
- )
46
- lock = GitLock(repository_url=base_repo_url, git_ref=git_ref)
47
- req = WasmToolRequest(lock=lock, rel_path=rel_path, tool_vars={})
48
-
49
- lockfile.add_lock(lock)
50
- tool_likes.append(req)
51
- elif isinstance(tool_like, WasmToolRequest):
52
- lockfile.add_lock(tool_like.lock)
53
- tool_likes.append(tool_like)
54
- elif isinstance(tool_like, ToolRequest):
55
- raise ValueError(f"unreachable. tool_like:{tool_like}")
56
- elif isinstance(tool_like, WasmTool):
57
- raise ValueError("WasmTool should pass ToolRequest instance instead.")
58
- else:
59
- tool_likes.append(tool_like)
60
- lockfile.sync(force_update=force_update, referenced_only=True)
42
+ parsed_tool_like = self._parse_tool_like(tool_like)
43
+ tool_likes.append(parsed_tool_like)
44
+ self._add_tool_like_lock_to_lockfile(parsed_tool_like)
45
+ self.lockfile.sync(force_update=force_update, referenced_only=True)
61
46
 
47
+ # load tool from tool_like
62
48
  self.tools = dict()
63
49
  for tool_like in tool_likes:
64
- tool = self._load_tool(tool_like, lockfile)
65
- if tool.name in self.tools:
66
- pocket_logger.error(f"Duplicate tool name: {tool.name}.")
67
- raise ValueError(f"Duplicate tool name: {tool.name}")
68
- self.tools[tool.name] = tool
50
+ self._load_tool(tool_like)
69
51
 
70
52
  pocket_logger.info(
71
53
  f"All Registered Tools Loaded successfully. total registered tools : {len(self.tools)}"
72
54
  )
73
55
 
56
+ # load builtin tool
74
57
  builtin_tools = get_builtin_tools(self.auth)
75
58
  for tool in builtin_tools:
76
59
  self.tools[tool.name] = tool
@@ -266,17 +249,60 @@ class PocketCore:
266
249
  def _tool_instance(self, tool_name: str) -> Tool:
267
250
  return self.tools[tool_name]
268
251
 
269
- @staticmethod
270
- def _load_tool(tool_like: ToolLike, lockfile: Lockfile) -> Tool:
252
+ def _load_tool(self, tool_like: ToolLike) -> Tool:
271
253
  pocket_logger.info(f"Loading Tool {tool_like}")
272
254
  if isinstance(tool_like, Tool):
273
255
  tool = tool_like
274
256
  elif isinstance(tool_like, ToolRequest):
275
- tool = Tool.from_tool_request(tool_like, lockfile=lockfile)
257
+ tool = Tool.from_tool_request(tool_like, lockfile=self.lockfile)
276
258
  elif isinstance(tool_like, Callable):
277
259
  tool = from_func(tool_like)
278
260
  else:
279
261
  raise ValueError(f"Invalid tool type: {type(tool_like)}")
280
262
 
263
+ if tool.name in self.tools:
264
+ pocket_logger.error(f"Duplicate tool name: {tool.name}.")
265
+ raise ValueError(f"Duplicate tool name: {tool.name}")
266
+ self.tools[tool.name] = tool
267
+
281
268
  pocket_logger.info(f"Complete Loading Tool {tool.name}")
282
269
  return tool
270
+
271
+ def _add_tool_like_lock_to_lockfile(self, tool_like: ToolLike):
272
+ if isinstance(tool_like, WasmToolRequest): # lock is only in WasmToolRequest
273
+ self.lockfile.add_lock(tool_like.lock)
274
+ return
275
+
276
+ @classmethod
277
+ def _parse_tool_like(cls, tool_like: ToolLike) -> ToolLike:
278
+ if isinstance(tool_like, str):
279
+ return cls._parse_str_tool_like(tool_like)
280
+
281
+ elif isinstance(tool_like, WasmToolRequest):
282
+ return tool_like
283
+
284
+ elif isinstance(tool_like, ToolRequest):
285
+ raise ValueError(f"unreachable. tool_like:{tool_like}")
286
+ elif isinstance(tool_like, WasmTool):
287
+ raise ValueError("WasmTool should pass ToolRequest instance instead.")
288
+ else: # Callable, Tool
289
+ return tool_like
290
+
291
+ @classmethod
292
+ def _parse_str_tool_like(cls, tool_like: str) -> ToolLike:
293
+ if pathlib.Path(tool_like).exists():
294
+ lock = LocalLock(tool_like)
295
+ parsed_tool_like = WasmToolRequest(lock=lock, rel_path="", tool_vars={})
296
+ elif tool_like.startswith("https://github.com"):
297
+ base_repo_url, git_ref, rel_path = GitLock.parse_repo_url(
298
+ repo_url=tool_like
299
+ )
300
+ lock = GitLock(repository_url=base_repo_url, git_ref=git_ref)
301
+ parsed_tool_like = WasmToolRequest(lock=lock, rel_path=rel_path, tool_vars={})
302
+ else:
303
+ parsed_tool_like = None
304
+ RuntimeError(
305
+ f"Can't convert to ToolRequest. it might be wrong github url or local path. path: {tool_like}")
306
+
307
+ return parsed_tool_like
308
+
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- from concurrent.futures import ThreadPoolExecutor
3
2
  from typing import Any, List, Optional, Union
4
3
 
5
4
  from hyperpocket.config import pocket_logger
@@ -90,6 +89,7 @@ class Pocket(object):
90
89
  *args,
91
90
  **kwargs,
92
91
  )
92
+ pocket_logger.debug(f"{tool_name} result: {result}")
93
93
  return result
94
94
 
95
95
  def invoke_with_state(
@@ -0,0 +1,377 @@
1
+ Metadata-Version: 2.4
2
+ Name: hyperpocket
3
+ Version: 0.3.0
4
+ Summary: Building AI agent with hyperpocket tool in a flash
5
+ Project-URL: Homepage, https://vessl-ai.github.io/hyperpocket
6
+ Project-URL: Repository, https://github.com/vessl-ai/hyperpocket
7
+ Author-email: Hyperpocket Team <hyperpocket@vessl.ai>
8
+ Requires-Python: >=3.10
9
+ Requires-Dist: click>=8.1.7
10
+ Requires-Dist: dynaconf>=3.2.6
11
+ Requires-Dist: fastapi>=0.115.5
12
+ Requires-Dist: gitpython>=3.1.43
13
+ Requires-Dist: httpx==0.27
14
+ Requires-Dist: jinja2>=3.1.4
15
+ Requires-Dist: multiprocess>=0.70.17
16
+ Requires-Dist: playwright>=1.49.0
17
+ Requires-Dist: pydantic>=2.10.2
18
+ Requires-Dist: pygithub>=2.5.0
19
+ Requires-Dist: python-multipart>=0.0.19
20
+ Requires-Dist: redis>=5.2.1
21
+ Requires-Dist: requests>=2.32.3
22
+ Requires-Dist: toml>=0.10.2
23
+ Requires-Dist: uvicorn>=0.32.1
24
+ Description-Content-Type: text/markdown
25
+
26
+ <p align="center">
27
+ <img src="logo.png" alt="hyperpocket" width="570"/>
28
+ </p>
29
+
30
+ # Hyperpocket 👛
31
+
32
+ Hyperpocket is where tools belong. Power your agent up with a pocket of tools. 👛
33
+
34
+ ## Introduction
35
+
36
+ Hyperpocket is a tool that allows you to easily use tool and auth for agents on your machine.
37
+
38
+ **_Start fast._** Just install Hyperpocket and use it. We know you don't have time to authenticate to our server.
39
+
40
+ **_Go securely._** Not like others, you are the only one who knows your secret tokens. We do NOT. All of your secret
41
+ tokens belong to your infrastructure, not ours.
42
+
43
+ **_Power up with public tools._** Without worries for tool integration, use others' tools just with copy-and-paste the
44
+ link to the tool. Your tool will run on isolated environment based on WebAssembly technology, and you don't have to deal
45
+ with the dependency spaghetti.
46
+
47
+ **_Battery Included_** You can use popular tools and authentication providers out-of-the-box.
48
+
49
+ ## Getting Started
50
+
51
+ getting started langchain tool-calling-agent example with hyperpocket
52
+
53
+ ### 1. Prerequisite
54
+
55
+ install hyperpocket package
56
+
57
+ ```shell
58
+ pip install hyperpocket_langchain
59
+ pip install langchain_openai
60
+ ```
61
+
62
+ install playwright
63
+
64
+ ```shell
65
+ playwright install
66
+ ```
67
+
68
+ ### 2. Configuration
69
+
70
+ setting hyperpocket config in your current working directory
71
+
72
+ `${WORKDIR}/.secret.toml`
73
+
74
+ ```toml
75
+ [auth.slack]
76
+ client_id = "<SLACK_CLIENT_ID>"
77
+ client_secret = "<SLACK_CLIENT_SECRET>"
78
+ ```
79
+
80
+ setting openai api key env for this example.
81
+
82
+ ```shell
83
+ export OPENAI_API_KEY=<OPENAI_API_KEY>
84
+ ```
85
+
86
+ ### 3. Writing code
87
+
88
+ `langchain_example.py`
89
+
90
+ ```python
91
+ import os
92
+
93
+ from langchain.agents import AgentExecutor, create_tool_calling_agent
94
+ from langchain.memory import ConversationBufferMemory
95
+ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
96
+ from langchain_openai import ChatOpenAI
97
+
98
+ from hyperpocket_langchain import PocketLangchain
99
+
100
+ if __name__ == '__main__':
101
+ pocket = PocketLangchain(
102
+ tools=[
103
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/get-message",
104
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/post-message",
105
+ ],
106
+ )
107
+ tools = pocket.get_tools()
108
+ llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))
109
+ prompt = ChatPromptTemplate.from_messages(
110
+ [
111
+ (
112
+ "system",
113
+ "You are a tool calling assistant. You can help the user by calling proper tools",
114
+ ),
115
+ ("placeholder", "{chat_history}"),
116
+ ("user", "{input}"),
117
+ MessagesPlaceholder(variable_name="agent_scratchpad"),
118
+ ]
119
+ )
120
+
121
+ memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
122
+ agent = create_tool_calling_agent(llm, tools, prompt)
123
+ agent_executor = AgentExecutor(
124
+ agent=agent,
125
+ tools=tools,
126
+ memory=memory,
127
+ verbose=True,
128
+ handle_parsing_errors=True,
129
+ )
130
+
131
+ print("Hello, This is simple slack agent using hyperpocket.")
132
+ while True:
133
+ print("user(q to quit) : ", end="")
134
+ user_input = input()
135
+
136
+ if user_input is None or user_input == "":
137
+ continue
138
+ elif user_input == "q":
139
+ print("Good bye!")
140
+ break
141
+
142
+ response = agent_executor.invoke({"input": user_input})
143
+ print("agent : ", response["output"])
144
+ print()
145
+ ```
146
+
147
+ ### 4. Done !
148
+
149
+ ```shell
150
+ python langchain_example.py
151
+ ```
152
+
153
+ ## Usage
154
+
155
+ Supported agent frameworks
156
+
157
+ - [x] Langgraph [link](https://www.langchain.com/langgraph)
158
+ - [x] Langchain [link](https://www.langchain.com/)
159
+ - [x] Llamaindex [link](https://www.llamaindex.ai/)
160
+
161
+ Or just use LLM API Clients out of the box.
162
+
163
+ - [x] OpenAI [link](https://openai.com/)
164
+ - [x] Anthropic [link](https://www.anthropic.com/)
165
+
166
+ ### Using out-of-the-box tools
167
+
168
+ ```python
169
+
170
+ from langchain_openai import ChatOpenAI
171
+
172
+ from hyperpocket_langchain import PocketLangchain
173
+
174
+ pklc = PocketLangchain(
175
+ tools=[
176
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/get-message",
177
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/post-message",
178
+ ]
179
+ )
180
+ tools = pklc.get_tools()
181
+
182
+ llm = ChatOpenAI()
183
+ llm_tool_binding = llm.bind_tools(tools)
184
+ llm_tool_binding.invoke(...)
185
+ ```
186
+
187
+ ### Using out-of-the-box auth for various tools
188
+
189
+ There are two kinds of auth process, one is using system auth(developer api key) and the other is using end user auth.
190
+
191
+ Pocket provides way to use end user auth easily.
192
+ (Of course, you can also just set your STRIPE_API_KEY when using Stripe API related tools)
193
+
194
+ - Supported methods
195
+
196
+ - [x] OAuth
197
+ - [x] Token
198
+ - [ ] Basic Auth (Username, Password)
199
+
200
+ - Supported OAuth Providers
201
+
202
+ - [x] Google
203
+ - [x] GitHub
204
+ - [x] Slack
205
+ - [x] Reddit
206
+ - [x] Calendly
207
+ - [ ] Facebook
208
+ - [ ] X (Previously Twitter)
209
+ - [ ] LinkedIn
210
+ - [ ] Discord
211
+ - [ ] Zoom
212
+ - [ ] Microsoft
213
+ - [ ] Spotify
214
+ - [ ] Twitch
215
+
216
+ - Supported Token Providers
217
+ - [x] Notion
218
+ - [x] Slack
219
+ - [x] Linear
220
+ - [x] Gumloop
221
+ - [x] Github
222
+
223
+ You can manage your auths in request-wise level. (e.g. you can use different auths for different requests)
224
+
225
+ ```python
226
+
227
+ from langchain_openai import ChatOpenAI
228
+ from langgraph.graph import StateGraph, START, MessagesState
229
+ from langgraph.prebuilt import tools_condition
230
+
231
+ from hyperpocket_langgraph import PocketLanggraph
232
+
233
+ pklg = PocketLanggraph(
234
+ tools=[
235
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/get-message",
236
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/post-message",
237
+ ],
238
+ )
239
+ llm = ChatOpenAI()
240
+
241
+ # Langgraph
242
+ pk_tool_node = pklg.get_tool_node()
243
+ llm_tool_binding = llm.bind_tools(pklg.get_tools())
244
+
245
+ # ...
246
+
247
+ graph_builder = StateGraph(MessagesState)
248
+
249
+ graph_builder.add_node('llm', llm)
250
+ graph_builder.add_node('tools', pk_tool_node)
251
+ graph_builder.add_edge(START, llm)
252
+ graph_builder.add_conditional_edges("llm", tools_condition)
253
+ graph_builder.add_edge(pk_tool_node, llm)
254
+
255
+ # ...
256
+
257
+ graph_builder.compile()
258
+
259
+ ```
260
+
261
+ ```python
262
+ import os
263
+
264
+ from llama_index.core.agent import FunctionCallingAgent
265
+ from llama_index.llms.openai import OpenAI
266
+
267
+ from hyperpocket_llamaindex import PocketLlamaindex
268
+
269
+ llm = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
270
+ pocket = PocketLlamaindex(
271
+ tools=[
272
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/get-message",
273
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/slack/post-message",
274
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/linear/get-issues",
275
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/google/get-calendar-events",
276
+ "https://github.com/vessl-ai/hyperpocket/tree/main/tools/google/get-calendar-list",
277
+ ]
278
+ )
279
+ tools = pocket.get_tools()
280
+
281
+ agent = FunctionCallingAgent.from_tools(tools=tools, llm=llm)
282
+ ```
283
+
284
+ ### Auth flow included
285
+
286
+ ```text
287
+ Human: List my slack messages in 'general' channel
288
+
289
+ Assistance: It looks like you need to authenticate to access the Slack messages. Please use [this link](https://slack.com/oauth/v2/authorize?user_scope=SCOPES&client_id=CLIENT_ID&redirect_uri=REDIRECT_URL) to authenticate your Slack account, and then let me know when you're done!
290
+
291
+ Human: done.
292
+
293
+ Assistance: Here are the recent 10 messages.
294
+ (...)
295
+ ```
296
+
297
+ ### Config
298
+
299
+ Running `hyperpocket config init` will create your config file in `${WORKDIR}/settings.toml` and
300
+ `${WORKDIR}/.secrets.toml`
301
+
302
+ The `settings.toml` looks as follows.
303
+
304
+ ```toml
305
+ log_level = "debug"
306
+ internal_server_port = "8000" # optional, default is 8000
307
+ public_hostname = "localhost" # optional, default is localhost
308
+ public_server_protocol = "https" # optional, default is https
309
+ public_server_port = "8001" # optional, default is 8001
310
+ enable_local_callback_proxy = "true" # optional, default is true, can be turned off when running in production behind TLS termination
311
+ callback_url_rewrite_prefix = "proxy" # optional, default is proxy, auth callback url prefix
312
+
313
+ [session]
314
+ session_type = "redis" # optional, default is in-memory
315
+ [session.redis]
316
+ host = "localhost"
317
+ port = 6379
318
+ db = 0
319
+
320
+ [auth.slack] # add your slack app's client id and secret for slack auth
321
+ client_id = "" # your slack client id
322
+ client_secret = "" # your slack client secret
323
+ ```
324
+
325
+ Or you put some sensitive data on `{WORKDIR}/.secrets.toml`
326
+
327
+ ```toml
328
+ [auth.slack] # add your slack app's client id and secret for slack auth
329
+ client_id = "" # your slack client id
330
+ client_secret = "" # your slack client secret
331
+ ```
332
+
333
+ - in this case, by putting your slack app client_id and client_secret on `.secrets.toml`, you can manage your sensitive
334
+ data more safely.
335
+
336
+ #### How to integrate github OAuth app
337
+
338
+ 1. Follow the github documentation to create a new OAuth
339
+ app. https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app
340
+
341
+ - While creating your github OAuth app, configuring your app's `Authorization callback URL` is different for your
342
+ development environment and production environment.
343
+ - For local testing environment, you can use `https://localhost:8001/proxy/auth/<provider>/callback` for TLS enabled
344
+ redirect url. (ex. `https://localhost:8001/proxy/auth/github/callback`)
345
+ - **Note**: Default port for hyperpocket dev server is `8000`. If you are using a different port, make sure to
346
+ replace `8000` with your actual port number.
347
+ - **Note**: But for easy dev experience, you can use TLS proxy on port `8001` provided out-of-the-box.
348
+ - You can change the `proxy` prefix in settings.toml to your desired prefix with
349
+ `callback_url_rewrite_prefix` key.
350
+ - For production environment, you can use `https://yourdomain.com/auth/github/callback`
351
+ - **Note**: Make sure to replace `yourdomain.com` with your actual domain name that this app will be hosted on.
352
+
353
+ #### How to integrate SLACK OAuth app
354
+
355
+ 1. Follow the slack documentation to create a new Oauth APP. https://api.slack.com/quickstart
356
+
357
+ 2. Setting Redirect URLs, Scopes at OAuth & Permissions tap in slack APP page
358
+
359
+ - Redirect URLs :
360
+ `{public_server_protocol}://{public_hostname}:[{public_server_port}]/{callback_url_rewrite_prefix}/auth/slack/oauth2/callback`
361
+ - Scopes : What you want to request to user.
362
+ - Recommended scopes :
363
+ - channels:history,
364
+ - channels:read,
365
+ - chat:write,
366
+ - groups:history,
367
+ - groups:read,
368
+ - im:history,
369
+ - mpim:history,
370
+ - reactions:read,
371
+ - reactions:write,
372
+
373
+ 3. Set your Slack APP Client ID / Client Secret in `{WORKDIR}/settings.toml`
374
+
375
+ ## Special thanks
376
+
377
+ - [tott](https://x.com/tott____) for drawing the cute possum in a pocket.
@@ -2,8 +2,8 @@ hyperpocket/__init__.py,sha256=VVLbApRTiULqEVQp6lCNOcuXKx9V62O_7C9VNKBQ0G0,137
2
2
  hyperpocket/builtin.py,sha256=SOrVrNjoKadDMksfB1rt6pKreJFzHG2YGBsLGVsg72c,2385
3
3
  hyperpocket/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  hyperpocket/pocket_auth.py,sha256=VzpGpHOOQIiEgrk1sYg5DYa5WYV6gRQmFlm8Kb2C9V0,17611
5
- hyperpocket/pocket_core.py,sha256=lfACm6xCQAg5pJnPkt6TpSmAkGmX1RN9oc_DAputLME,10252
6
- hyperpocket/pocket_main.py,sha256=uR3RJmsNBt4XDu5EgCRsKWTR5dkHjXIOjJ2Y3KO7zUA,9617
5
+ hyperpocket/pocket_core.py,sha256=URghKdbgAhPWyN-n9hAWmst_bB4J08YVlDQPDBz0R0g,11039
6
+ hyperpocket/pocket_main.py,sha256=ZSj0107pBBXx_pFKzggjEpm68Y1tQpDyYc2O_QDb4qQ,9628
7
7
  hyperpocket/prompts.py,sha256=N1bCzCLZvGUVhH1Vn_cgeBPsdY3MdIU7ZGqVgexoj5E,472
8
8
  hyperpocket/tool_like.py,sha256=5JgHZFEFu-GcZZl5pwkUqHeABUpN3nyJdtKJHtEjpHU,135
9
9
  hyperpocket/auth/README.md,sha256=zn4QqnFZCA_4X3x8Wb6lE3OP5otYxpByZaCiUkBvaNs,11562
@@ -49,29 +49,33 @@ hyperpocket/auth/notion/token_schema.py,sha256=ksBNQa2KCyjXZ3z9NB1Sgp0VBRR6nrddM
49
49
  hyperpocket/auth/reddit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  hyperpocket/auth/reddit/context.py,sha256=WlOvIb4u1PvfrbkYbEq5cSRnXxmIEFuHa4LlKjLEtMc,431
51
51
  hyperpocket/auth/reddit/oauth2_context.py,sha256=v1u_uy6O52REp2anteTPNgvb_nX-hI6bM7jNngBZXq4,1015
52
- hyperpocket/auth/reddit/oauth2_handler.py,sha256=BJcHqsb4P3Nky_QMOGq5qkcZ943FvUSMDkkiMltXUyY,5212
52
+ hyperpocket/auth/reddit/oauth2_handler.py,sha256=X_lzoyhYnjEFriBuorGdn977uD5GjphPiXi8W9SYdy0,5166
53
53
  hyperpocket/auth/reddit/oauth2_schema.py,sha256=MOcA8VTvjjwewxhyIn_-DRNf6H_5GjsN6C7gV8sDyiI,436
54
54
  hyperpocket/auth/slack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  hyperpocket/auth/slack/context.py,sha256=f8dMs7QtSSyissOlPGw8rCZXsVUckFnZWjZ_LAmNXpA,429
56
56
  hyperpocket/auth/slack/oauth2_context.py,sha256=kwahsgxtDo5Wg_nrF8mFv16ijIu6biiGe_qz2JlEKjM,1398
57
- hyperpocket/auth/slack/oauth2_handler.py,sha256=TtrJtEZgrA9kwhYtanxsdJjW0axVbIfpAqqSRRm9QrA,6145
57
+ hyperpocket/auth/slack/oauth2_handler.py,sha256=Mm9aSZoXFz8_Ua37JI9uJQrKgBXRo_1tJ1AGwtSQ0ZQ,6099
58
58
  hyperpocket/auth/slack/oauth2_schema.py,sha256=eu2jF2thmaz66AKcnivTvIBLTbeF-a-xQFMkR4RQYX8,1056
59
59
  hyperpocket/auth/slack/token_context.py,sha256=GUqMcPUleo8O9YRNMjOrMiSlHb-OOKwlrO_syCow55w,437
60
60
  hyperpocket/auth/slack/token_handler.py,sha256=6L_HiDQ2wpz9x65QUB9t-d5KOpADeG-zZVgEMHu3MUE,2765
61
61
  hyperpocket/auth/slack/token_schema.py,sha256=mAwOtRO2tW5OtDzbllDJtR_uhLD8ShQAjezkAZnAgd0,207
62
62
  hyperpocket/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- hyperpocket/cli/__main__.py,sha256=SpymRzsYBcW2C9Llzq-bjnuIszweq1r6-ili0mOZM-M,418
64
- hyperpocket/cli/auth.py,sha256=wLzv0g-MdMtzSPKVuqUeZn_O4hKcyOpcp78RvxKkWbI,4364
63
+ hyperpocket/cli/__main__.py,sha256=68fOHIx2zw_k_ncR6PR8S9iZG_yQkPG7yAOj428Op_M,580
64
+ hyperpocket/cli/auth_oauth2.py,sha256=gGQCS8AvaVHvs4Oe6fS7tw2ks_N67-8newinaDlywbw,4680
65
+ hyperpocket/cli/auth_token.py,sha256=gmT-jVMvZ1Ck-1F_yFUChcd9HMtFHNTaUvj_332usjE,4809
65
66
  hyperpocket/cli/eject.py,sha256=Te1YhDONk_VCgZ6l2HjLqONJrn04EfPk19sD6D5SOyY,636
66
67
  hyperpocket/cli/pull.py,sha256=3xCyTmdbP77l7awNyCY63_ZmUhIlX1PE3apwReXNYco,549
67
68
  hyperpocket/cli/sync.py,sha256=OO5zFrLOMXk7TSAFEew04ZzW4HLoQ1uVb80UKvIJha0,517
68
69
  hyperpocket/cli/codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- hyperpocket/cli/codegen/auth/__init__.py,sha256=1R2FwRuReAWyeRe1t3-CpR0Mhvb3xWzF8fEkL2mwuB0,545
70
+ hyperpocket/cli/codegen/auth/__init__.py,sha256=wtm3vX2Kk79tyFkguV5oV82_YoJ3w-Clqu2izwE65Vg,959
70
71
  hyperpocket/cli/codegen/auth/auth_context_template.py,sha256=89HHp5byHhLazkwtR8bsymg7IBKfp2ltdGikcD5aplY,570
72
+ hyperpocket/cli/codegen/auth/auth_oauth2_context_template.py,sha256=IW7zevhpR9W4ghUhjfRrzhxMBKLdVuzUHn6E6kB2gVU,1391
73
+ hyperpocket/cli/codegen/auth/auth_oauth2_handler_template.py,sha256=Aed6_zt5aa0aAjhrfvuspGK_4GtcsT3McoWeIGIBmKo,6761
74
+ hyperpocket/cli/codegen/auth/auth_oauth2_schema_template.py,sha256=GEp0jHNJnQZ6okyofxKBdaOIyeR8-qu_1OY1wAav9Mo,535
71
75
  hyperpocket/cli/codegen/auth/auth_token_context_template.py,sha256=GzpsCY6DlGXu-YxMaJ1vtesHfJxRvQ6hEb4Xodl8EB0,764
72
76
  hyperpocket/cli/codegen/auth/auth_token_handler_template.py,sha256=t30JZFTCYCcXWFop4CVEABEtttjJn-F6tcS-ZOQCh-Y,3158
73
77
  hyperpocket/cli/codegen/auth/auth_token_schema_template.py,sha256=ZJRcT-0QIIxltkDCgVz7zKl3aObX__bMi33s7_ZxI5k,429
74
- hyperpocket/cli/codegen/auth/server_auth_template.py,sha256=ed_8hTPSLzKdhdA52UoWigzYW4jQKlNGxO7B6LKNY_A,621
78
+ hyperpocket/cli/codegen/auth/server_auth_template.py,sha256=-S3bqlqsXMytOdrIG68_np3LfU5_Ydy7z-Z0fqfCE8I,1478
75
79
  hyperpocket/config/__init__.py,sha256=gYMHdExdPYScBB8mihSp1yJ9H-RJ8FdNz5mEFubFNAo,138
76
80
  hyperpocket/config/auth.py,sha256=IsHQHiwPmO5afbmwkA1lA1P7zF7W6LmXpM4ZmUZ4c-E,795
77
81
  hyperpocket/config/git.py,sha256=CGbY7J1LyN4ccZr9CFGAQwwhjC9kvdU0On_nsAsZ1FQ,362
@@ -131,7 +135,7 @@ hyperpocket/util/flatten_json_schema.py,sha256=iuNBEmMSKFtPi-uqo6fb3RWN0koHOAihW
131
135
  hyperpocket/util/function_to_model.py,sha256=TXUs-qPbzL8C9-qqpz4Ad4D9MOPP61n_p0iPU6SoBeM,2318
132
136
  hyperpocket/util/get_objects_from_subpackage.py,sha256=4mR_S8eaJSdU68YfCkiXeIcXxb6q7LjFGsY_IHeNIZw,929
133
137
  hyperpocket/util/json_schema_to_model.py,sha256=PqI87pU5dWwcrQWB8eQxRdfgAEvvC1x_DKZnhcsRV-o,3586
134
- hyperpocket-0.2.1.dist-info/METADATA,sha256=h_QFqmweEXplG8WQ0QS8A3tT8DVC2--lafQ6FwUG2Ms,9689
135
- hyperpocket-0.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
136
- hyperpocket-0.2.1.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
137
- hyperpocket-0.2.1.dist-info/RECORD,,
138
+ hyperpocket-0.3.0.dist-info/METADATA,sha256=FB5tDdrBufl-EG4umrSa77lbySI3VKEZ51U2YkJ1aM0,11430
139
+ hyperpocket-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
140
+ hyperpocket-0.3.0.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
141
+ hyperpocket-0.3.0.dist-info/RECORD,,