hyperpocket 0.0.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. hyperpocket/__init__.py +7 -0
  2. hyperpocket/auth/README.KR.md +309 -0
  3. hyperpocket/auth/README.md +323 -0
  4. hyperpocket/auth/__init__.py +24 -0
  5. hyperpocket/auth/calendly/__init__.py +0 -0
  6. hyperpocket/auth/calendly/context.py +13 -0
  7. hyperpocket/auth/calendly/oauth2_context.py +25 -0
  8. hyperpocket/auth/calendly/oauth2_handler.py +146 -0
  9. hyperpocket/auth/calendly/oauth2_schema.py +16 -0
  10. hyperpocket/auth/context.py +38 -0
  11. hyperpocket/auth/github/__init__.py +0 -0
  12. hyperpocket/auth/github/context.py +13 -0
  13. hyperpocket/auth/github/oauth2_context.py +25 -0
  14. hyperpocket/auth/github/oauth2_handler.py +143 -0
  15. hyperpocket/auth/github/oauth2_schema.py +16 -0
  16. hyperpocket/auth/github/token_context.py +12 -0
  17. hyperpocket/auth/github/token_handler.py +79 -0
  18. hyperpocket/auth/github/token_schema.py +9 -0
  19. hyperpocket/auth/google/__init__.py +0 -0
  20. hyperpocket/auth/google/context.py +15 -0
  21. hyperpocket/auth/google/oauth2_context.py +31 -0
  22. hyperpocket/auth/google/oauth2_handler.py +137 -0
  23. hyperpocket/auth/google/oauth2_schema.py +18 -0
  24. hyperpocket/auth/handler.py +171 -0
  25. hyperpocket/auth/linear/__init__.py +0 -0
  26. hyperpocket/auth/linear/context.py +15 -0
  27. hyperpocket/auth/linear/token_context.py +15 -0
  28. hyperpocket/auth/linear/token_handler.py +68 -0
  29. hyperpocket/auth/linear/token_schema.py +9 -0
  30. hyperpocket/auth/provider.py +16 -0
  31. hyperpocket/auth/schema.py +19 -0
  32. hyperpocket/auth/slack/__init__.py +0 -0
  33. hyperpocket/auth/slack/context.py +15 -0
  34. hyperpocket/auth/slack/oauth2_context.py +40 -0
  35. hyperpocket/auth/slack/oauth2_handler.py +151 -0
  36. hyperpocket/auth/slack/oauth2_schema.py +40 -0
  37. hyperpocket/auth/slack/tests/__init__.py +0 -0
  38. hyperpocket/auth/slack/tests/test_oauth2_handler.py +32 -0
  39. hyperpocket/auth/slack/tests/test_token_handler.py +23 -0
  40. hyperpocket/auth/slack/token_context.py +14 -0
  41. hyperpocket/auth/slack/token_handler.py +64 -0
  42. hyperpocket/auth/slack/token_schema.py +9 -0
  43. hyperpocket/auth/tests/__init__.py +0 -0
  44. hyperpocket/auth/tests/test_google_oauth2_handler.py +147 -0
  45. hyperpocket/auth/tests/test_slack_oauth2_handler.py +147 -0
  46. hyperpocket/auth/tests/test_slack_token_handler.py +66 -0
  47. hyperpocket/cli/__init__.py +0 -0
  48. hyperpocket/cli/__main__.py +12 -0
  49. hyperpocket/cli/pull.py +18 -0
  50. hyperpocket/cli/sync.py +17 -0
  51. hyperpocket/config/__init__.py +9 -0
  52. hyperpocket/config/auth.py +36 -0
  53. hyperpocket/config/git.py +17 -0
  54. hyperpocket/config/logger.py +81 -0
  55. hyperpocket/config/session.py +35 -0
  56. hyperpocket/config/settings.py +62 -0
  57. hyperpocket/constants.py +0 -0
  58. hyperpocket/curated_tools.py +10 -0
  59. hyperpocket/external/__init__.py +7 -0
  60. hyperpocket/external/github_client.py +19 -0
  61. hyperpocket/futures/__init__.py +7 -0
  62. hyperpocket/futures/futurestore.py +48 -0
  63. hyperpocket/pocket_auth.py +344 -0
  64. hyperpocket/pocket_main.py +351 -0
  65. hyperpocket/prompts.py +15 -0
  66. hyperpocket/repository/__init__.py +5 -0
  67. hyperpocket/repository/lock.py +156 -0
  68. hyperpocket/repository/lockfile.py +56 -0
  69. hyperpocket/repository/repository.py +18 -0
  70. hyperpocket/server/__init__.py +3 -0
  71. hyperpocket/server/auth/__init__.py +15 -0
  72. hyperpocket/server/auth/calendly.py +16 -0
  73. hyperpocket/server/auth/github.py +25 -0
  74. hyperpocket/server/auth/google.py +16 -0
  75. hyperpocket/server/auth/linear.py +18 -0
  76. hyperpocket/server/auth/slack.py +28 -0
  77. hyperpocket/server/auth/token.py +51 -0
  78. hyperpocket/server/proxy.py +63 -0
  79. hyperpocket/server/server.py +178 -0
  80. hyperpocket/server/tool/__init__.py +10 -0
  81. hyperpocket/server/tool/dto/__init__.py +0 -0
  82. hyperpocket/server/tool/dto/script.py +15 -0
  83. hyperpocket/server/tool/wasm.py +31 -0
  84. hyperpocket/session/README.KR.md +62 -0
  85. hyperpocket/session/README.md +61 -0
  86. hyperpocket/session/__init__.py +4 -0
  87. hyperpocket/session/in_memory.py +76 -0
  88. hyperpocket/session/interface.py +118 -0
  89. hyperpocket/session/redis.py +126 -0
  90. hyperpocket/session/tests/__init__.py +0 -0
  91. hyperpocket/session/tests/test_in_memory.py +145 -0
  92. hyperpocket/session/tests/test_redis.py +151 -0
  93. hyperpocket/tests/__init__.py +0 -0
  94. hyperpocket/tests/test_pocket.py +118 -0
  95. hyperpocket/tests/test_pocket_auth.py +982 -0
  96. hyperpocket/tool/README.KR.md +68 -0
  97. hyperpocket/tool/README.md +75 -0
  98. hyperpocket/tool/__init__.py +13 -0
  99. hyperpocket/tool/builtins/__init__.py +0 -0
  100. hyperpocket/tool/builtins/example/__init__.py +0 -0
  101. hyperpocket/tool/builtins/example/add_tool.py +18 -0
  102. hyperpocket/tool/function/README.KR.md +159 -0
  103. hyperpocket/tool/function/README.md +169 -0
  104. hyperpocket/tool/function/__init__.py +9 -0
  105. hyperpocket/tool/function/annotation.py +30 -0
  106. hyperpocket/tool/function/tool.py +87 -0
  107. hyperpocket/tool/tests/__init__.py +0 -0
  108. hyperpocket/tool/tests/test_function_tool.py +266 -0
  109. hyperpocket/tool/tool.py +106 -0
  110. hyperpocket/tool/wasm/README.KR.md +144 -0
  111. hyperpocket/tool/wasm/README.md +144 -0
  112. hyperpocket/tool/wasm/__init__.py +3 -0
  113. hyperpocket/tool/wasm/browser.py +63 -0
  114. hyperpocket/tool/wasm/invoker.py +41 -0
  115. hyperpocket/tool/wasm/script.py +82 -0
  116. hyperpocket/tool/wasm/templates/__init__.py +28 -0
  117. hyperpocket/tool/wasm/templates/node.py +87 -0
  118. hyperpocket/tool/wasm/templates/python.py +75 -0
  119. hyperpocket/tool/wasm/tool.py +147 -0
  120. hyperpocket/util/__init__.py +1 -0
  121. hyperpocket/util/extract_func_param_desc_from_docstring.py +97 -0
  122. hyperpocket/util/find_all_leaf_class_in_package.py +17 -0
  123. hyperpocket/util/find_all_subclass_in_package.py +29 -0
  124. hyperpocket/util/flatten_json_schema.py +45 -0
  125. hyperpocket/util/function_to_model.py +46 -0
  126. hyperpocket/util/get_objects_from_subpackage.py +28 -0
  127. hyperpocket/util/json_schema_to_model.py +69 -0
  128. hyperpocket-0.0.1.dist-info/METADATA +304 -0
  129. hyperpocket-0.0.1.dist-info/RECORD +131 -0
  130. hyperpocket-0.0.1.dist-info/WHEEL +4 -0
  131. hyperpocket-0.0.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,45 @@
1
+ import copy
2
+
3
+
4
+ def flatten_json_schema(schema: dict):
5
+ """
6
+ Flatten JSON Schema by resolving all $refs using definitions in $defs
7
+ and convert to a fully nested schema.
8
+ """
9
+ definitions = schema.get('$defs', {})
10
+ schema_copy = copy.deepcopy(schema)
11
+
12
+ # Resolve references within $defs first
13
+ resolved_definitions = {}
14
+ for key, value in definitions.items():
15
+ resolved_definitions[key] = resolve_refs(value, definitions)
16
+
17
+ # Resolve references in the main schema
18
+ schema_copy.pop('$defs', None) # Remove $defs
19
+ return resolve_refs(schema_copy, resolved_definitions)
20
+
21
+
22
+ def resolve_refs(schema, definitions):
23
+ """
24
+ Recursively resolve $ref references within the schema using $defs.
25
+ """
26
+ if isinstance(schema, dict):
27
+ # Recursively check nested dictionaries
28
+ resolved_schema = {}
29
+ for key, value in schema.items():
30
+ # If $ref exists, resolve the reference
31
+ if key == '$ref':
32
+ ref_path = schema['$ref']
33
+ ref_name = ref_path.split('/')[-1] # Extract the reference name from $defs/Req -> Req
34
+ resolved = definitions.get(ref_name)
35
+ if resolved:
36
+ resolved_schema |= resolve_refs(copy.deepcopy(resolved), definitions)
37
+ else:
38
+ resolved_schema[key] = resolve_refs(value, definitions)
39
+ return resolved_schema
40
+
41
+ elif isinstance(schema, list):
42
+ # Recursively resolve references in list items
43
+ return [resolve_refs(item, definitions) for item in schema]
44
+
45
+ return schema
@@ -0,0 +1,46 @@
1
+ import inspect
2
+ from inspect import signature, Parameter
3
+ from typing import Any, Dict, Type, Tuple, List
4
+
5
+ from pydantic import BaseModel, create_model
6
+ from pydantic.fields import FieldInfo
7
+
8
+ from hyperpocket.config import pocket_logger
9
+ from hyperpocket.util.extract_func_param_desc_from_docstring import extract_param_docstring_mapping
10
+
11
+
12
+ def function_to_model(func: callable) -> Type[BaseModel]:
13
+ docstring = inspect.getdoc(func)
14
+ if docstring is None:
15
+ pocket_logger.info("not found docstring. use function name as description instead.")
16
+ docstring = func.__name__
17
+ fields: Dict[str, Tuple[Type, Any]] = {}
18
+ sig = signature(func)
19
+ param_desc_map = extract_param_docstring_mapping(func)
20
+
21
+ for param_name, param in sig.parameters.items():
22
+ if param_name in ('self', 'cls'):
23
+ continue
24
+
25
+ if param.kind == Parameter.VAR_POSITIONAL:
26
+ # don't support var positional args
27
+ continue
28
+
29
+ elif param.kind == Parameter.VAR_KEYWORD:
30
+ fields[param_name] = (Dict[str, Any], {})
31
+ continue
32
+
33
+ if param.annotation is Parameter.empty:
34
+ raise Exception(f"Should all arguments be annotated but {param_name} is not annotated")
35
+
36
+ if param.annotation.__module__ != "builtins" and not issubclass(param.annotation, BaseModel):
37
+ raise Exception(
38
+ f"currently only support builtin types and pydantic BaseModel but {param_name} is not builtin type")
39
+
40
+ default = param.default if param.default is not Parameter.empty else ...
41
+
42
+ fields[param_name] = (
43
+ param.annotation, FieldInfo(default=default, description=param_desc_map.get(param_name, "")))
44
+
45
+ model = create_model(f"{func.__name__.capitalize()}Model", **fields, __doc__=docstring)
46
+ return model
@@ -0,0 +1,28 @@
1
+ import importlib
2
+ import pkgutil
3
+ from typing import Type, Optional
4
+
5
+
6
+ def get_objects_from_subpackage(package_name, interface_type: Optional[Type] = None):
7
+ """
8
+ Retrieves objects from a specific subpackage.
9
+
10
+ Args:
11
+ package_name (str): The name of the package to search (e.g., "mypackage.subpackage").
12
+ interface_type (Optional[Type]): A type to filter objects. Defaults to None (returns all objects).
13
+ Returns:
14
+ list: A list of objects matching the interface_type
15
+ """
16
+ objects = []
17
+
18
+ package = importlib.import_module(package_name)
19
+ package_path = package.__path__
20
+
21
+ for module_info in pkgutil.walk_packages(package_path, package_name + "."):
22
+ module = importlib.import_module(module_info.name)
23
+
24
+ for name, obj in vars(module).items():
25
+ if interface_type is None or isinstance(obj, interface_type):
26
+ objects.append(obj)
27
+
28
+ return objects
@@ -0,0 +1,69 @@
1
+ from typing import Type
2
+
3
+ from pydantic import BaseModel, create_model, Field
4
+
5
+
6
+ # Convert JSON Schema to a Pydantic model
7
+ def json_schema_to_model(schema: dict, model_name: str = "DynamicModel") -> Type[BaseModel]:
8
+ """Recursively create a Pydantic model from a JSON Schema."""
9
+ fields = {}
10
+ config_extra = "forbid"
11
+
12
+ required_fields = schema.get("required", [])
13
+ for property_name, property_schema in schema.get("properties", {}).items():
14
+ field_type, field_default, field_description, required = None, None, None, False
15
+ if "type" in property_schema:
16
+ json_type = property_schema["type"]
17
+ if json_type == "integer":
18
+ field_type = int
19
+ elif json_type == "string":
20
+ field_type = str
21
+ elif json_type == "object":
22
+ if "properties" in property_schema:
23
+ # Recursively create nested models
24
+ field_type = json_schema_to_model(property_schema, model_name)
25
+ else:
26
+ field_type = dict
27
+
28
+ elif json_type == "array":
29
+ # Handle arrays; currently assuming array of objects or primitives
30
+ item_schema = property_schema.get("items", {})
31
+ if item_schema.get("type") == "object":
32
+ field_type = list[json_schema_to_model(item_schema, model_name)]
33
+ else:
34
+ field_type = list
35
+ if "default" in property_schema:
36
+ field_default = property_schema["default"]
37
+ if "description" in property_schema:
38
+ field_description = property_schema["description"]
39
+ if property_name in required_fields:
40
+ required = True
41
+
42
+ if required:
43
+ fields[property_name] = (field_type, Field(description=field_description))
44
+ else:
45
+ fields[property_name] = (field_type, Field(default=field_default, description=field_description))
46
+
47
+ # Handle additionalProperties
48
+ if "additionalProperties" in schema:
49
+ if schema["additionalProperties"] is True:
50
+ config_extra = "allow" # Allow additional properties
51
+ elif schema["additionalProperties"] is False:
52
+ config_extra = "forbid" # Disallow additional properties
53
+ elif isinstance(schema["additionalProperties"], dict):
54
+ # If additionalProperties is a schema, allow and validate its type
55
+ additional_model = json_schema_to_model(
56
+ schema["additionalProperties"], f"{model_name}_AdditionalProperties"
57
+ )
58
+ fields["additional_properties"] = (dict[str, additional_model], {})
59
+
60
+ # Create the model
61
+ model = create_model(model_name, **fields)
62
+
63
+ # Add custom Config class to handle extra properties
64
+ class Config:
65
+ extra = config_extra
66
+
67
+ model.Config = Config
68
+
69
+ return model
@@ -0,0 +1,304 @@
1
+ Metadata-Version: 2.1
2
+ Name: hyperpocket
3
+ Version: 0.0.1
4
+ Summary: Building AI agent with hyperpocket tool in a flash
5
+ Home-page: https://vessl-ai.github.io/hyperpocket
6
+ Author: VESSL AI Devs
7
+ Author-email: dev@vessl.ai
8
+ Requires-Python: >=3.11,<4.0
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Requires-Dist: click (>=8.1.7,<9.0.0)
14
+ Requires-Dist: dynaconf (>=3.2.6,<4.0.0)
15
+ Requires-Dist: fastapi (>=0.115.5,<0.116.0)
16
+ Requires-Dist: gitpython (>=3.1.43,<4.0.0)
17
+ Requires-Dist: httpx (>=0.28.0,<0.29.0)
18
+ Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
19
+ Requires-Dist: multiprocess (>=0.70.17,<0.71.0)
20
+ Requires-Dist: playwright (>=1.49.0,<2.0.0)
21
+ Requires-Dist: pydantic (>=2.10.2,<3.0.0)
22
+ Requires-Dist: pygithub (>=2.5.0,<3.0.0)
23
+ Requires-Dist: python-multipart (>=0.0.19,<0.0.20)
24
+ Requires-Dist: redis (>=5.2.1,<6.0.0)
25
+ Requires-Dist: requests (>=2.32.3,<3.0.0)
26
+ Requires-Dist: toml (>=0.10.2,<0.11.0)
27
+ Requires-Dist: uvicorn (>=0.32.1,<0.33.0)
28
+ Project-URL: Repository, https://github.com/vessl-ai/hyperpocket
29
+ Description-Content-Type: text/markdown
30
+
31
+ # Pocket 👛
32
+
33
+ Pocket is where tools belong. Power your agent up with a pocket of tools. 👛
34
+
35
+ <figure>
36
+ <img src="image.png" alt="4d-pocket" width="200"/>
37
+ <figcaption>© Doraemon</figcaption>
38
+ </figure>
39
+
40
+ ## Introduction
41
+
42
+ Pocket is a tool that allows you to easily use tool and auth for agents on your machine.
43
+
44
+ **_Start fast._** Just install Pocket and use it. We know you don't have time to authenticate to our server.
45
+
46
+ **_Go securely._** Not like others, you are the only one who knows your secret tokens. We do NOT. All of your secret
47
+ tokens belong to your infrastructure, not ours.
48
+
49
+ **_Power up with public tools._** Without worries for tool integration, use others' tools just with copy-and-paste the
50
+ link to the tool. Your tool will run on isolated environment based on WebAssembly technology, and you don't have to deal
51
+ with the dependency spaghetti.
52
+
53
+ **_Battery Included_** You can use popular tools and authentication providers out-of-the-box.
54
+
55
+ <figure>
56
+ <img src="pocket1.png" alt="pocket-flow" width="400"/>
57
+ <figcaption></figcaption>
58
+ </figure>
59
+
60
+ ## Installation
61
+
62
+ 1. install pocket
63
+
64
+ ```bash
65
+ pip install pocket
66
+ ```
67
+
68
+ 2. install playwright
69
+
70
+ ```bash
71
+ playwright install
72
+ ```
73
+
74
+ ## Usage
75
+
76
+ Supported agent frameworks
77
+
78
+ - [x] Langgraph [link](https://www.langchain.com/langgraph)
79
+ - [x] Langchain [link](https://www.langchain.com/)
80
+ - [x] Llamaindex [link](https://www.llamaindex.ai/)
81
+
82
+ Or just use LLM API Clients out of the box.
83
+
84
+ - [x] OpenAI [link](https://openai.com/)
85
+ - [x] Anthropic [link](https://www.anthropic.com/)
86
+
87
+ ### Using out-of-the-box tools
88
+
89
+ ```python
90
+ from langchain_openai import ChatOpenAI
91
+
92
+ import hyperpocket as pk
93
+ import hyperpocket.curated_tools
94
+ from pocket_langchain import PocketLangchain
95
+
96
+ pklc = PocketLangchain(
97
+ tools=[
98
+ *pk.curated_tools.SLACK, # SLACK = [slack_get_message, slack_post_message, ..]
99
+ *pk.curated_tools.LINEAR,
100
+ "https://github.com/my-org/some-awesome-tool",
101
+ ]
102
+ )
103
+ tools = pklc.get_tools()
104
+
105
+ llm = ChatOpenAI()
106
+ llm_tool_binding = llm.bind_tools(tools)
107
+ llm_tool_binding.invoke(...)
108
+ ```
109
+
110
+ ### Using out-of-the-box auth for various tools
111
+
112
+ There are two kinds of auth process, one is using system auth(developer api key) and the other is using end user auth.
113
+
114
+ Pocket provides way to use end user auth easily.
115
+ (Of course, you can also just set your STRIPE_API_KEY when using Stripe API related tools)
116
+
117
+ - Supported methods
118
+
119
+ - [x] OAuth
120
+ - [x] Token
121
+ - [ ] Basic Auth (Username, Password)
122
+
123
+ - Supported OAuth Providers
124
+ - [x] Google
125
+ - [x] GitHub
126
+ - [x] Slack
127
+ - [x] Linear
128
+ - [ ] Facebook
129
+ - [ ] X (Previously Twitter)
130
+ - [ ] LinkedIn
131
+ - [ ] Discord
132
+ - [ ] Zoom
133
+ - [ ] Microsoft
134
+ - [ ] Spotify
135
+ - [ ] Twitch
136
+
137
+ You can manage your auths in request-wise level. (e.g. you can use different auths for different requests)
138
+
139
+ ```python
140
+ from langchain_openai import ChatOpenAI
141
+ from langgraph.graph import StateGraph, START, MessagesState
142
+ from langgraph.prebuilt import tools_condition
143
+
144
+ import hyperpocket as pk
145
+ import hyperpocket.curated_tools
146
+ from pocket_langgraph import PocketLanggraph
147
+
148
+ pklg = PocketLanggraph(
149
+ tools=[
150
+ *pk.curated_tools.SLACK, # SLACK = [slack_get_message, slack_post_message, ..]
151
+ *pk.curated_tools.LINEAR,
152
+ "https://github.com/my-org/some-awesome-tool",
153
+ ],
154
+ )
155
+ llm = ChatOpenAI()
156
+
157
+ # Langgraph
158
+ pk_tool_node = pklg.get_tool_node()
159
+ llm_tool_binding = llm.bind_tools(pklg.get_tools())
160
+
161
+ # ...
162
+
163
+ graph_builder = StateGraph(MessagesState)
164
+
165
+ graph_builder.add_node('llm', llm)
166
+ graph_builder.add_node('tools', pk_tool_node)
167
+ graph_builder.add_edge(START, llm)
168
+ graph_builder.add_conditional_edges("llm", tools_condition)
169
+ graph_builder.add_edge(pk_tool_node, llm)
170
+
171
+ # ...
172
+
173
+ graph_builder.compile()
174
+
175
+ ```
176
+
177
+ ```python
178
+ from llama_index.core.agent import FunctionCallingAgent
179
+ from llama_index.llms.openai import OpenAI
180
+ from pocket_llamaindex import PocketLlamaindex
181
+
182
+ from hyperpocket.config import secret
183
+ from hyperpocket.tool import from_git
184
+
185
+ llm = OpenAI(api_key=secret["OPENAI_API_KEY"])
186
+ pocket = PocketLlamaindex(
187
+ tools=[
188
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/slack-get-message"),
189
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/slack-post-message"),
190
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/linear-get-issues"),
191
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-get-calendar-events"),
192
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-get-calendar-list"),
193
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-insert-calendar-events"),
194
+ from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/github-pr-list"),
195
+ ]
196
+ )
197
+ tools = pocket.get_tools()
198
+
199
+ agent = FunctionCallingAgent.from_tools(tools=tools, llm=llm)
200
+ ```
201
+
202
+ ### Specifying auth methods for tool type
203
+
204
+ Some resources support multiple auth methods. Your end user should be able to select between those methods.
205
+
206
+ ```text
207
+ Human: List my slack messages in 'general' channel
208
+
209
+ Assistance: To access your slack messages, you need authentication. Slack api provides 1) bot token auth 2) OAuth auth. Which do you want to proceed?
210
+
211
+ Human: I'll go with OAuth
212
+
213
+ Assistance: You need chat:read, channel:history scopes to list messages. Do you confirm?
214
+
215
+ Human: OK.
216
+
217
+ Assistance: Please proceed to the following url and finish authentication. After that, let me know.
218
+ > https://slack.com/authorize?clientId=xxx&scope=chat:read,channel:history&redirect_url=xxx
219
+
220
+ Human: I'm done. (if necessary)
221
+
222
+ Assistance: I've checked you finished your auth. Let me search messages in slack channel 'general'.
223
+
224
+ Assistance: Here are the recent 10 messages.
225
+ (...)
226
+
227
+
228
+ ```
229
+
230
+ ### Config
231
+
232
+ Running `pocket config init` will create your config file in `$HOME/.pocket/settings.toml`
233
+
234
+ The `settings.toml` looks as follows.
235
+
236
+ TODO: Add `secrets.toml`.
237
+
238
+ ```toml
239
+ log_level = "debug"
240
+ internal_server_port = "8000" # optional, default is 8000
241
+ public_hostname = "localhost" # optional, default is localhost
242
+ public_server_protocol = "https" # optional, default is https
243
+ public_server_port = "8001" # optional, default is 8001
244
+ enable_local_callback_proxy = "true" # optional, default is true, can be turned off when running in production behind TLS termination
245
+ callback_url_rewrite_prefix = "proxy" # optional, default is proxy, auth callback url prefix
246
+
247
+ [session]
248
+ session_type = "redis" # optional, default is in-memory
249
+ [session.redis]
250
+ host = "localhost"
251
+ port = 6379
252
+ db = 0
253
+
254
+ [git]
255
+ [git.github]
256
+ github_token = "<Your github PAT>" # optional, your github personal access token
257
+ app_id = "<Your github app id>" # optional, your github app id
258
+ app_installation_id = "<Your github app installation id>" # optional, your github app installation id
259
+ app_private_key = "<Your github app private key>" # optional, your github app private key
260
+
261
+ [auth]
262
+ [auth.slack] # add your slack app's client id and secret for slack auth
263
+ client_id = "" # your slack client id
264
+ client_secret = "" # your slack client secret
265
+
266
+ [auth.github] # add your github app's client id and secret for github auth
267
+ client_id = "" # your github client id
268
+ client_secret = "" # your github client secret
269
+ ```
270
+
271
+ #### How to integrate github OAuth app
272
+
273
+ 1. Follow the github documentation to create a new OAuth
274
+ app. https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app
275
+
276
+ - While creating your github OAuth app, configuring your app's `Authorization callback URL` is different for your
277
+ development environment and production environment.
278
+ - For development environment, you can use `http://localhost:8000/auth/github/callback`
279
+ - **Note**: Default port for pocket dev server is `8000`. If you are using a different port, make sure to
280
+ replace `8000` with your actual port number.
281
+ - For production environment, you can use `https://yourdomain.com/auth/github/callback`
282
+ - **Note**: Make sure to replace `yourdomain.com` with your actual domain name that this app will be hosted on.
283
+
284
+ #### How to integrate SLACK OAuth app
285
+
286
+ 1. Follow the slack documentation to create a new Oauth APP. https://api.slack.com/quickstart
287
+
288
+ 2. Setting Redirect URLs, Scopes at OAuth & Permissions tap in slack APP page
289
+
290
+ - Redirect URLs :
291
+ `{public_server_protocol}://{public_hostname}:[{public_server_port}]/{callback_url_rewrite_prefix}/auth/slack/oauth2/callback`
292
+ - Scopes : What you want to request to user.
293
+ - Recommended scopes :
294
+ - channels:history,
295
+ - channels:read,
296
+ - chat:write,
297
+ - groups:history,
298
+ - groups:read,
299
+ - im:history,
300
+ - mpim:history,
301
+ - reactions:read,
302
+ - reactions:write,
303
+
304
+ 3. Set your Slack APP Client ID / Client Secret in `$HOME/.pocket/settings.toml`
@@ -0,0 +1,131 @@
1
+ hyperpocket/__init__.py,sha256=iaJvrZ0rgHwAndGFVv8m1Iz_DWtWEcphFPL-1D8f9SY,136
2
+ hyperpocket/auth/README.KR.md,sha256=IdVj2XHpeI-zuJMEAcRJo3DgzvWFIG4lK4olEcTyId4,13337
3
+ hyperpocket/auth/README.md,sha256=Z7hkeJCLqPXGjA3teXcswNMbE3QnXoBwkwxW174DzKg,11547
4
+ hyperpocket/auth/__init__.py,sha256=bPmdxg9OjjzCLGkEywoDitEuhYziepqxgBT_19O_VF0,1152
5
+ hyperpocket/auth/calendly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ hyperpocket/auth/calendly/context.py,sha256=oUQzLy_w5NPvbXjFPOhLD-ggONVSy9VVpFabvX4ZpsY,408
7
+ hyperpocket/auth/calendly/oauth2_context.py,sha256=SiMeZaoWh3aneZVH_MXsT_cZ8qCSVeL-pWHVbfYUS6g,848
8
+ hyperpocket/auth/calendly/oauth2_handler.py,sha256=ulfhIcj_GCGIIZHVV9v42p2miHVsE3fpKODnrwz4qU0,5296
9
+ hyperpocket/auth/calendly/oauth2_schema.py,sha256=9JFogAWFAB7nzCww7NXDYuunY6S28wQZzPX41TWfMig,373
10
+ hyperpocket/auth/context.py,sha256=r19VtTK5FGcmvCgCOr16oNJ0GMFYmgaMEe2EHKJhtQY,1302
11
+ hyperpocket/auth/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ hyperpocket/auth/github/context.py,sha256=Y0QOCNbtQfNDsmgq47s0YGUxTl1QQC-qq4Hm2aZonJ8,404
13
+ hyperpocket/auth/github/oauth2_context.py,sha256=Ge8rkScRpcAWMMzSWTt2gWrDyi0UehTeZepf39Q6BK0,828
14
+ hyperpocket/auth/github/oauth2_handler.py,sha256=4HP0WE9cd3I6v4s9ZXvwNPhFPNk9b6L_MByTOvFvAIc,5059
15
+ hyperpocket/auth/github/oauth2_schema.py,sha256=XfeSF820natq9kwoDKbY2I9TgdjxP-hPkdoGGrKjSuA,371
16
+ hyperpocket/auth/github/token_context.py,sha256=evstL4mZsWHe9Io1RwBc90VfFOnVAbRk8BI1HseYwg8,446
17
+ hyperpocket/auth/github/token_handler.py,sha256=Vz5CqkGk8a6mb4xpw_Lhidwy4cZD7wTrK6iPKIRb15E,2777
18
+ hyperpocket/auth/github/token_schema.py,sha256=8vbJIYWqX_p4GPAtM5xMx5iwo9oZOtZTuSYcnpFGeio,209
19
+ hyperpocket/auth/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ hyperpocket/auth/google/context.py,sha256=1ziH27dXPsxp4WkdlyKos37lF623IIs4kX8cmat8QrY,426
21
+ hyperpocket/auth/google/oauth2_context.py,sha256=u7TayAfxPUFWuggtlceub22vHIURF0ZV5Do4jUqLWQ0,1023
22
+ hyperpocket/auth/google/oauth2_handler.py,sha256=547NPhFhi7lpmeVgZ99g_O3IizBMKZ9iAd27RrRNhS4,4880
23
+ hyperpocket/auth/google/oauth2_schema.py,sha256=E_hyNrb-Ro2UWs2AjhmFDBHwaTEsHZa0rQBhUcCWWKk,411
24
+ hyperpocket/auth/handler.py,sha256=9R6uQ7bPwmkZUUyg0Q1iOSwmWEQKnGEe92XiLeaxM0w,6580
25
+ hyperpocket/auth/linear/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ hyperpocket/auth/linear/context.py,sha256=hkxVDYO2jB3FCqIz_bMyB3n6OO74PpLI4LiW-42NFNQ,429
27
+ hyperpocket/auth/linear/token_context.py,sha256=Sr3toWp_TwN0K73WDvdvtwUMmnOIXXjMwph5DF4ytf4,472
28
+ hyperpocket/auth/linear/token_handler.py,sha256=wLOodmgXHH4AQWz1tJEHtjrglP3tP1uEDeMQOgQHrRA,2683
29
+ hyperpocket/auth/linear/token_schema.py,sha256=oTy-gOZvXEmGVStgFfnNmlbkknNepOTI5KIeTQLRxus,209
30
+ hyperpocket/auth/provider.py,sha256=e7i7RMN1Vv8ymMRj2IbsKjOzuw3jA1wkoMU5u0OGwPw,435
31
+ hyperpocket/auth/schema.py,sha256=8J6PIXpFIJyuVhkZzz6X_TiKOz7sFGdUW0qmZD8x3MA,529
32
+ hyperpocket/auth/slack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ hyperpocket/auth/slack/context.py,sha256=f8dMs7QtSSyissOlPGw8rCZXsVUckFnZWjZ_LAmNXpA,429
34
+ hyperpocket/auth/slack/oauth2_context.py,sha256=0FJjJIIcVp1-G4EZu85gJeSXor-zOFI4ua2z0R_sFqI,1374
35
+ hyperpocket/auth/slack/oauth2_handler.py,sha256=8v9gSGkKMPoqEFGFyjCI1qdvklpyeml-5qeoUFo54Xg,5902
36
+ hyperpocket/auth/slack/oauth2_schema.py,sha256=eu2jF2thmaz66AKcnivTvIBLTbeF-a-xQFMkR4RQYX8,1056
37
+ hyperpocket/auth/slack/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ hyperpocket/auth/slack/tests/test_oauth2_handler.py,sha256=_tY4gGRgo6plVrtg7XnsinTCyI0DoaLLl7-SKRoCva8,1189
39
+ hyperpocket/auth/slack/tests/test_token_handler.py,sha256=fN6MifNKofyUhCBbDXHglVWG-A-gUxkBRK2nLmd_QF8,784
40
+ hyperpocket/auth/slack/token_context.py,sha256=FN19UKrTU-gozrc-i5q9ZhIJZz6joF8yIND5r_9m7jc,462
41
+ hyperpocket/auth/slack/token_handler.py,sha256=yaJtlOqJP436ubY2VluGxLuFpPo0jh8Y8V3PHUai4X8,2557
42
+ hyperpocket/auth/slack/token_schema.py,sha256=mAwOtRO2tW5OtDzbllDJtR_uhLD8ShQAjezkAZnAgd0,207
43
+ hyperpocket/auth/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ hyperpocket/auth/tests/test_google_oauth2_handler.py,sha256=bGWUvKF3X_UQEdp7hmwTBLdma3qcmWxB716d3r5s09o,5658
45
+ hyperpocket/auth/tests/test_slack_oauth2_handler.py,sha256=7WU26bVqDI3RdzDYsHEz2ooAGTwNVl2CxliYttbb17k,5412
46
+ hyperpocket/auth/tests/test_slack_token_handler.py,sha256=1hpOQ85i_yJFsOdSN8Tzk8tZbw9SPhPRcZWDty76hA4,2641
47
+ hyperpocket/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ hyperpocket/cli/__main__.py,sha256=9x5rL3NnEH8j9cyMBEvCtPncf9HM9dvRZvoDrr1lpjY,119
49
+ hyperpocket/cli/pull.py,sha256=1Ku0WKLtlZFnEDvU0m10XsVJcysMxDwdEMzTYgNz0xE,548
50
+ hyperpocket/cli/sync.py,sha256=joL5aMVZSkKJxDiaSPRiLDhgmdak6CtOUiWx5H1K6lM,526
51
+ hyperpocket/config/__init__.py,sha256=deIffu5NBOlSS1X774QuMlf_yb6P2qBQm6tkcf4s8DU,307
52
+ hyperpocket/config/auth.py,sha256=5Zk7OZmElIqIn7LxsT7H4g3bimBxaKpnbL2v9Fs9MlA,797
53
+ hyperpocket/config/git.py,sha256=CGbY7J1LyN4ccZr9CFGAQwwhjC9kvdU0On_nsAsZ1FQ,362
54
+ hyperpocket/config/logger.py,sha256=Wwl-8lllaCNLZruxXU-bcC74Ciy5SmPOX4AJE5BUzWM,2769
55
+ hyperpocket/config/session.py,sha256=CSXENtWx6Gh4DiPh4u9E-4MFYkM8JRjl2hSPV9PVfrE,801
56
+ hyperpocket/config/settings.py,sha256=YJ5cPXdy8r5lJVVyn4HXcpQHVhozk2B9zUhS8QYwao8,2103
57
+ hyperpocket/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ hyperpocket/curated_tools.py,sha256=YxTQGXsbWgB1KyC7JEzS9CS86SlyCZCODMJEanW6PHE,353
59
+ hyperpocket/external/__init__.py,sha256=d6G2TAJSKvu3Bq1kE8j2_M0eTAqYZRWcAm3ePh0qaMI,119
60
+ hyperpocket/external/github_client.py,sha256=89DkXoyBrpE_YoBasTJ5d87w3Ih47UTD_Aw8w9RaN1k,639
61
+ hyperpocket/futures/__init__.py,sha256=_pRnYZLbogkYFInA3jokkxrcEVRt6YNaBmkf_dSk3SM,136
62
+ hyperpocket/futures/futurestore.py,sha256=4DeLlnLz-vdwjYKSVvgx-DNeEPLtzuIDo0xCuY1Aq9Y,1328
63
+ hyperpocket/pocket_auth.py,sha256=5zN8l2DJOy9ogBFGPmO3-F0NoiGVTw4raRrwk0vbXpw,16001
64
+ hyperpocket/pocket_main.py,sha256=ReQctlEOyrZftnnZshmT3R9Conk1s1Pyru7jDBH-CtI,12368
65
+ hyperpocket/prompts.py,sha256=Kl19Vlzc3hX_g04s17WSW5dLp-mvi0JELxJxCy2z7tU,754
66
+ hyperpocket/repository/__init__.py,sha256=dVwj6KN-cazbIbFC2t0cqz7BOtoZWRgGfnC5-lrsXAg,202
67
+ hyperpocket/repository/lock.py,sha256=wg1zkDYh58U6D1EU-gXhCwrwnZI-qe0esO1dJsjkldA,5359
68
+ hyperpocket/repository/lockfile.py,sha256=qiJiLPRT7zhR3WY6OiCrsxDF45CZBQtM5pi5bjGmPVQ,2003
69
+ hyperpocket/repository/repository.py,sha256=Kw5FiFWdjCl07477bb9vCmUmFnP889mBIvb6JfMmKh4,567
70
+ hyperpocket/server/__init__.py,sha256=TLqok_mBeV3VRnbZ_spwrwwbsjJ1q9o375AdBk7tKNA,89
71
+ hyperpocket/server/auth/__init__.py,sha256=UsXwHbu6BVgCD9REcIyD3sY0aj3svRnArPi375joE2U,653
72
+ hyperpocket/server/auth/calendly.py,sha256=mi9_ysn0SffhnEgaoNa2jcHWCcD_yzqkS0rvzpJG2Qg,478
73
+ hyperpocket/server/auth/github.py,sha256=cgUtdCYPhf_e51fEQgiYjyG6yuPfMV5RmltjujuWcBw,759
74
+ hyperpocket/server/auth/google.py,sha256=_C33Bzow7yzjnvf0WUObu8p-dSU5rXqBgSPrENORAmY,470
75
+ hyperpocket/server/auth/linear.py,sha256=3Ii8jewBCwS2pH3_mSJzBWot1t8IcVghC9K_ohid-H8,448
76
+ hyperpocket/server/auth/slack.py,sha256=HSfru4_S3B_sEF_keCBLEsNyYeyc92eL5I2a-2TKf64,716
77
+ hyperpocket/server/auth/token.py,sha256=Q38Tt5ly2vLsR0dxjmnJNX2IqS-FkTsm94bO6e2wtYk,1700
78
+ hyperpocket/server/proxy.py,sha256=OhpAWpilM5ioKAsqInKudtvpYk56nMFeZ-dwoGAYIDA,1905
79
+ hyperpocket/server/server.py,sha256=y_VaN97UUhCHbIPiadcjh_e1-A0LgZYZvDUbVYgizoo,6604
80
+ hyperpocket/server/tool/__init__.py,sha256=khNLe3H2W7WXKQlHjXuuvd9R87eHOAZhDsQmjDcbYsg,210
81
+ hyperpocket/server/tool/dto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ hyperpocket/server/tool/dto/script.py,sha256=SPbEIUY9vi_OMsYPMFOkJdpbQCT4-Z3Wy4taiQ3Efy4,361
83
+ hyperpocket/server/tool/wasm.py,sha256=TiOcymQq0o_nvRwF9HfshnfP6K1LvFMv2fC5DqQOz8k,1170
84
+ hyperpocket/session/README.KR.md,sha256=SakXbqbrXYr9hUWBW-muvd5wo2fXSq72q4FbDX8x80k,1968
85
+ hyperpocket/session/README.md,sha256=MVE14e0A1XL-XJlE2toxaXrk1u2t1ytguejWOrkJRdQ,1958
86
+ hyperpocket/session/__init__.py,sha256=-zdfZfXwR336liAYjwcZULIHg_72NxMMcDFz_RQGLGk,260
87
+ hyperpocket/session/in_memory.py,sha256=ynPuFcoXiLdeyPRGO_l7aZqHckNMI7fuTxsM9TAo5s8,2928
88
+ hyperpocket/session/interface.py,sha256=M5GAVjLDJYtABAoX8ne-Na7cY69Xv1FyQ_vLS4atxdw,4467
89
+ hyperpocket/session/redis.py,sha256=3zHdSEytB0e9jksvTPK_YJmqeQlQG0JlOWHLwZazBXU,4653
90
+ hyperpocket/session/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
+ hyperpocket/session/tests/test_in_memory.py,sha256=hc8-u9hxGds7KJA6yUQjcgI1XN0a3zfTVGvr8dJwsG0,4887
92
+ hyperpocket/session/tests/test_redis.py,sha256=_wUMnQFTMty4BckSNQMRreH7nlkvNUYgL0HRkstf0Jg,5025
93
+ hyperpocket/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ hyperpocket/tests/test_pocket.py,sha256=JN1WDaOa03pfpdlBwc1dFXQldQTgauDaRIDITDZ2IHg,2821
95
+ hyperpocket/tests/test_pocket_auth.py,sha256=mKKiIZzriOHgbavP5eiW5P5LrZ2JKJHwh_TZDHsLK6Q,39115
96
+ hyperpocket/tool/README.KR.md,sha256=BNllN_z-_40cRg8VRmWoAr4pufNUsw3tgta60iBtZuU,2744
97
+ hyperpocket/tool/README.md,sha256=cOH1EGubzlKkugkvrO-r7rSIhwbwaAyl1p69_eoV8fs,2689
98
+ hyperpocket/tool/__init__.py,sha256=GgqQp6Zm_ti4eXuBsYQWDWOQyrlXrOu7bzdJxVbkEJE,318
99
+ hyperpocket/tool/builtins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ hyperpocket/tool/builtins/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ hyperpocket/tool/builtins/example/add_tool.py,sha256=zab3KyenJ3iw9qXrPUR5MDbH3TfcraZCpuVSjHLPpDY,525
102
+ hyperpocket/tool/function/README.KR.md,sha256=tnMVdiwIVGBhDCxB8pI2zRSCrM9f6rSp2TO9QAApNpM,2833
103
+ hyperpocket/tool/function/README.md,sha256=Fkq7SNijhmLo8T7dbMDPXZLyxI0-qqJ7LrTPUcTcgC4,2999
104
+ hyperpocket/tool/function/__init__.py,sha256=1IPjND3wgBeBj2tecBNZ3VxtpRZ3VWtlIphzm3too5U,207
105
+ hyperpocket/tool/function/annotation.py,sha256=EKoBZpgYWxC3BCo0NjhtCVNeVHmmp_lpNH5fLVLUS7g,952
106
+ hyperpocket/tool/function/tool.py,sha256=sHhrngUNpoRXyrJ3Xd6Rn0RoxnBuU9Sbbfde5q7RKBk,2646
107
+ hyperpocket/tool/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
+ hyperpocket/tool/tests/test_function_tool.py,sha256=e8RgXJg_ShbIxxFS7rjAO4lCsXvbsyJF9YCf3CuT79o,8125
109
+ hyperpocket/tool/tool.py,sha256=TwilwztUXwSa5w6rJ_DpiDtTOjwfKlMmVGtgNMaotNA,4428
110
+ hyperpocket/tool/wasm/README.KR.md,sha256=qOUcwuJOuKVFKgKqe7EE_xwVh8Zn5IJmwEtSpuLW0Vg,3438
111
+ hyperpocket/tool/wasm/README.md,sha256=l4rNlU2WVZ8fx3M1EkOnt3w1hRfqnTeRBttFdYk8eeY,3259
112
+ hyperpocket/tool/wasm/__init__.py,sha256=KGOPPyA1CnbW-T9bgSpfIXf9952l_p5HJDhHGBb3b9o,71
113
+ hyperpocket/tool/wasm/browser.py,sha256=X2aw9sZy306dKDR0knqn4fGC6O1fw08M9t_zIkjUeWs,2083
114
+ hyperpocket/tool/wasm/invoker.py,sha256=u8ZfGW871IVBaG4_XbOQHfp7QYLS093QdwVa3HOL-_k,1520
115
+ hyperpocket/tool/wasm/script.py,sha256=nhCQ_Ve_Kz5zaKJcV9O6Ixw1a-Rd1zq1yZk5HOwZqt0,2612
116
+ hyperpocket/tool/wasm/templates/__init__.py,sha256=cQ-uNsO418xvv54i8bD0IrqcAKUxMuyZoG3ShP72olw,949
117
+ hyperpocket/tool/wasm/templates/node.py,sha256=8ghVQGS9L3IJGdBB8waLK_ej4FS34dCA_bwPKjm8QSU,2782
118
+ hyperpocket/tool/wasm/templates/python.py,sha256=uTjdaccwSi-QeDxsA5qfAAckxI7jsxtrPKi9in4X7EM,2347
119
+ hyperpocket/tool/wasm/tool.py,sha256=UcolQQh5qeiAYUUJlyyGE6y-zet-PGlBQTimXGqYoTc,4782
120
+ hyperpocket/util/__init__.py,sha256=oXUL2g9SDCOQNhd5OW_VZoUcKy3vghoHWHqsmdm_BGA,59
121
+ hyperpocket/util/extract_func_param_desc_from_docstring.py,sha256=2l8LmpreJZekIDXEA7FXY32nT9xlOa26P2h3AmekNQ4,4031
122
+ hyperpocket/util/find_all_leaf_class_in_package.py,sha256=afGLqe5s7irOOPh7DI70v-utDL2a0vhNzHjtgSmDeZU,528
123
+ hyperpocket/util/find_all_subclass_in_package.py,sha256=CfsM5sWHHbFZD6M-jbJRN8Zo3m57R1E7FGg_V__HdFU,964
124
+ hyperpocket/util/flatten_json_schema.py,sha256=PXK6I1S2QDxwSGmUVEl5bbSPrjTa38GBllBQ8uKXJNQ,1587
125
+ hyperpocket/util/function_to_model.py,sha256=f6806fVJfZp2PyXwN5ZoD8-4Bw81KMYlUEgFAXJuUas,1806
126
+ hyperpocket/util/get_objects_from_subpackage.py,sha256=Aq87PD_H57c2IjLS28Hf0Wu5vLVyoOtDoBvKzvQ1UPw,929
127
+ hyperpocket/util/json_schema_to_model.py,sha256=YFQSv_a-7OYf_6XPMyi097CKVm4sjDxy9k8DjlU9FP8,2897
128
+ hyperpocket-0.0.1.dist-info/METADATA,sha256=IutmsgAiMQGHLNMt1xsO-Dy2HkhzugzoQFx2LUxkybY,9977
129
+ hyperpocket-0.0.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
130
+ hyperpocket-0.0.1.dist-info/entry_points.txt,sha256=HP1S7F8Sozcu87qCmOSbUpl-bvodrJvjeodWKi4TlF0,50
131
+ hyperpocket-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.9.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ pocket=pocket.cli.__main__:cli
3
+