hyperpocket 0.2.1__py3-none-any.whl → 0.3.0__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.
@@ -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,,