indent 0.0.8__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.

Potentially problematic release.


This version of indent might be problematic. Click here for more details.

Files changed (56) hide show
  1. exponent/__init__.py +1 -0
  2. exponent/cli.py +112 -0
  3. exponent/commands/cloud_commands.py +85 -0
  4. exponent/commands/common.py +434 -0
  5. exponent/commands/config_commands.py +581 -0
  6. exponent/commands/github_app_commands.py +211 -0
  7. exponent/commands/listen_commands.py +96 -0
  8. exponent/commands/run_commands.py +208 -0
  9. exponent/commands/settings.py +56 -0
  10. exponent/commands/shell_commands.py +2840 -0
  11. exponent/commands/theme.py +246 -0
  12. exponent/commands/types.py +111 -0
  13. exponent/commands/upgrade.py +29 -0
  14. exponent/commands/utils.py +236 -0
  15. exponent/core/config.py +180 -0
  16. exponent/core/graphql/__init__.py +0 -0
  17. exponent/core/graphql/client.py +59 -0
  18. exponent/core/graphql/cloud_config_queries.py +77 -0
  19. exponent/core/graphql/get_chats_query.py +47 -0
  20. exponent/core/graphql/github_config_queries.py +56 -0
  21. exponent/core/graphql/mutations.py +75 -0
  22. exponent/core/graphql/queries.py +110 -0
  23. exponent/core/graphql/subscriptions.py +452 -0
  24. exponent/core/remote_execution/checkpoints.py +212 -0
  25. exponent/core/remote_execution/cli_rpc_types.py +214 -0
  26. exponent/core/remote_execution/client.py +545 -0
  27. exponent/core/remote_execution/code_execution.py +58 -0
  28. exponent/core/remote_execution/command_execution.py +105 -0
  29. exponent/core/remote_execution/error_info.py +45 -0
  30. exponent/core/remote_execution/exceptions.py +10 -0
  31. exponent/core/remote_execution/file_write.py +410 -0
  32. exponent/core/remote_execution/files.py +415 -0
  33. exponent/core/remote_execution/git.py +268 -0
  34. exponent/core/remote_execution/languages/python_execution.py +239 -0
  35. exponent/core/remote_execution/languages/shell_streaming.py +221 -0
  36. exponent/core/remote_execution/languages/types.py +20 -0
  37. exponent/core/remote_execution/session.py +128 -0
  38. exponent/core/remote_execution/system_context.py +54 -0
  39. exponent/core/remote_execution/tool_execution.py +289 -0
  40. exponent/core/remote_execution/truncation.py +284 -0
  41. exponent/core/remote_execution/types.py +670 -0
  42. exponent/core/remote_execution/utils.py +600 -0
  43. exponent/core/types/__init__.py +0 -0
  44. exponent/core/types/command_data.py +206 -0
  45. exponent/core/types/event_types.py +89 -0
  46. exponent/core/types/generated/__init__.py +0 -0
  47. exponent/core/types/generated/strategy_info.py +225 -0
  48. exponent/migration-docs/login.md +112 -0
  49. exponent/py.typed +4 -0
  50. exponent/utils/__init__.py +0 -0
  51. exponent/utils/colors.py +92 -0
  52. exponent/utils/version.py +289 -0
  53. indent-0.0.8.dist-info/METADATA +36 -0
  54. indent-0.0.8.dist-info/RECORD +56 -0
  55. indent-0.0.8.dist-info/WHEEL +4 -0
  56. indent-0.0.8.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,92 @@
1
+ import math
2
+
3
+ from colour import Color
4
+
5
+
6
+ def relative_luminance(c: Color) -> float:
7
+ """Compute sRGB-based luminance, per the standard (WCAG-like) formula."""
8
+
9
+ r, g, b = c.rgb
10
+
11
+ def to_linear(channel: float) -> float:
12
+ return (
13
+ channel / 12.92
14
+ if channel <= 0.03928
15
+ else ((channel + 0.055) / 1.055) ** 2.4
16
+ )
17
+
18
+ R, G, B = map(to_linear, (r, g, b))
19
+
20
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B
21
+
22
+
23
+ def contrast_ratio(c1: Color, c2: Color) -> float:
24
+ """Compute ratio = (Llighter + 0.05) / (Ldarker + 0.05)."""
25
+
26
+ L1 = relative_luminance(c1)
27
+ L2 = relative_luminance(c2)
28
+ L_high, L_low = max(L1, L2), min(L1, L2)
29
+
30
+ return (L_high + 0.05) / (L_low + 0.05)
31
+
32
+
33
+ def adjust_color_for_contrast(
34
+ base: Color, target: Color, min_contrast: float = 4.5, step: float = 0.005
35
+ ) -> Color:
36
+ """
37
+ Increments either upward or downward in HSL 'l'
38
+ (depending on whether target is lighter or darker than base)
39
+ until the desired contrast ratio is reached or we hit the boundary (0 or 1).
40
+ """
41
+
42
+ # Work on a copy so we don't mutate the original
43
+ new_color = Color(target.hex)
44
+
45
+ L_base = relative_luminance(base)
46
+ L_target = relative_luminance(new_color)
47
+
48
+ # Check which color is darker:
49
+ # if the target is darker, we'll push it darker; if it's lighter, we push it lighter.
50
+ h, s, l = new_color.hsl # noqa: E741
51
+
52
+ if L_target < L_base:
53
+ # target color is darker => keep making it darker
54
+ while l >= 0.0:
55
+ if contrast_ratio(base, new_color) >= min_contrast:
56
+ return new_color
57
+ l -= step # noqa: E741
58
+ new_color.hsl = (h, s, max(l, 0.0))
59
+ else:
60
+ # target color is lighter => keep making it lighter
61
+ while l <= 1.0:
62
+ if contrast_ratio(base, new_color) >= min_contrast:
63
+ return new_color
64
+ l += step # noqa: E741
65
+ new_color.hsl = (h, s, min(l, 1.0))
66
+
67
+ # If we exhaust the channel range, just return whatever we ended with
68
+ return new_color
69
+
70
+
71
+ def blend_colors_srgb(c1: Color, c2: Color, alpha: float) -> Color:
72
+ """
73
+ Blend c1 and c2 in sRGB space using alpha in [0..1],
74
+ returning a new Color object.
75
+ E.g. alpha=0.0 => c1, alpha=1.0 => c2.
76
+ """
77
+
78
+ # Interpolate each channel separately
79
+ r = (1 - alpha) * c1.red + alpha * c2.red
80
+ g = (1 - alpha) * c1.green + alpha * c2.green
81
+ b = (1 - alpha) * c1.blue + alpha * c2.blue
82
+
83
+ # Return a new Color with the blended channels
84
+ return Color(rgb=(r, g, b))
85
+
86
+
87
+ def color_distance(c1: Color, c2: Color) -> float:
88
+ return math.sqrt(
89
+ math.pow(c1.red - c2.red, 2)
90
+ + math.pow(c1.green - c2.green, 2)
91
+ + math.pow(c1.blue - c2.blue, 2)
92
+ )
@@ -0,0 +1,289 @@
1
+ import asyncio
2
+ import os
3
+ import platform
4
+ import subprocess
5
+ import sys
6
+ import threading
7
+ from importlib.metadata import Distribution, PackageNotFoundError
8
+ from json import JSONDecodeError
9
+ from typing import Any, Literal, cast
10
+
11
+ import click
12
+ from httpx import Client, HTTPError
13
+ from packaging.version import Version
14
+
15
+ from exponent import __version__ # Import the new version constant
16
+ from exponent.core.config import Settings, is_editable_install
17
+
18
+
19
+ def get_python_path() -> str:
20
+ """Get the path to the Python interpreter."""
21
+ try:
22
+ return (
23
+ subprocess.check_output(["which", "python"])
24
+ .decode(errors="replace")
25
+ .strip()
26
+ )
27
+ except Exception:
28
+ return "unknown"
29
+
30
+
31
+ def get_sys_executable() -> str:
32
+ """Get the path to the Python interpreter."""
33
+ return str(sys.executable)
34
+
35
+
36
+ def get_installed_version() -> str | Literal["unknown"]:
37
+ """Get the running version of exponent-run. Note this may be different from
38
+ importlib version, if a new version is installed but we're running the old version."""
39
+ return __version__
40
+
41
+
42
+ def get_installed_metadata() -> Any | Literal["unknown"]:
43
+ """Get the installed metadata of exponent-run.
44
+
45
+ Returns:
46
+ The installed metadata of exponent-run if it can be determined, otherwise "unknown"
47
+ """
48
+ try:
49
+ return Distribution.from_name("indent").metadata
50
+ except PackageNotFoundError as e:
51
+ click.echo(f"Error reading metadata: {e}", err=True)
52
+ return "unknown"
53
+
54
+
55
+ def get_installer() -> str | Literal["unknown"]:
56
+ """Get the installer of exponent-run.
57
+
58
+ Returns:
59
+ The installer of exponent-run if it can be determined, otherwise "unknown"
60
+ """
61
+ try:
62
+ dist = Distribution.from_name("indent")
63
+ # Try to read the INSTALLER file from the distribution
64
+ installer_files = dist.read_text("INSTALLER")
65
+ if installer_files:
66
+ return installer_files.strip()
67
+ return "unknown"
68
+ except Exception: # noqa: BLE001
69
+ return "unknown"
70
+
71
+
72
+ def get_latest_pypi_exponent_version() -> str | None:
73
+ """Get the latest version of Exponent available on PyPI.
74
+
75
+ Returns:
76
+ The newest version of Exponent available on PyPI, or None if an error occurred.
77
+ """
78
+ try:
79
+ return cast(
80
+ str,
81
+ (
82
+ Client()
83
+ .get("https://pypi.org/pypi/indent/json")
84
+ .json()["info"]["version"]
85
+ ),
86
+ )
87
+ except (HTTPError, JSONDecodeError, KeyError):
88
+ click.secho(
89
+ "An unexpected error occurred communicating with PyPi, please check your network and try again.",
90
+ fg="red",
91
+ )
92
+ return None
93
+
94
+
95
+ def check_exponent_version() -> tuple[str, str] | None:
96
+ """Check if there is a newer version of Exponent available on PyPI .
97
+
98
+ Returns:
99
+ None
100
+ """
101
+
102
+ if os.getenv("EXPONENT_TEST_AUTO_UPGRADE"):
103
+ return "1.0.0", "1.0.1"
104
+ installed_version = get_installed_version()
105
+ if installed_version == "unknown":
106
+ click.secho("Unable to determine current Exponent version.", fg="yellow")
107
+ return None
108
+
109
+ if (latest_version := get_latest_pypi_exponent_version()) and Version(
110
+ latest_version
111
+ ) > Version(installed_version):
112
+ return installed_version, latest_version
113
+
114
+ return None
115
+
116
+
117
+ def _get_upgrade_command(version: str) -> list[str]:
118
+ """Get the install command for exponent."""
119
+
120
+ return [
121
+ sys.executable,
122
+ "-m",
123
+ "pip",
124
+ "install",
125
+ "--upgrade",
126
+ f"indent=={version}",
127
+ ]
128
+
129
+
130
+ def _get_upgrade_command_str(version: str) -> str:
131
+ """Get the install command for exponent."""
132
+
133
+ return f'{sys.executable} -m pip install --upgrade "indent=={version}"'
134
+
135
+
136
+ def _new_version_str(current_version: str, new_version: str) -> str:
137
+ return (
138
+ f"\n{click.style('A new Exponent version is available:', fg='cyan')} {new_version} (current: {current_version})\n"
139
+ f"See {click.style('https://docs.exponent.run/installation', underline=True)} for details.\n"
140
+ )
141
+
142
+
143
+ def _windows_new_version_str(current_version: str, new_version: str) -> str:
144
+ return f"{_new_version_str(current_version, new_version)}\n{click.style('Run this command to upgrade:', fg='cyan')}\n{click.style(_get_upgrade_command_str(new_version), fg='yellow')}\n"
145
+
146
+
147
+ def _ask_continue_without_upgrading() -> None:
148
+ if click.confirm("Continue without upgrading?", default=False):
149
+ click.secho("Using outdated version.", fg="red")
150
+ else:
151
+ sys.exit(1)
152
+
153
+
154
+ def upgrade_exponent(
155
+ *,
156
+ current_version: str,
157
+ new_version: str,
158
+ force: bool,
159
+ ) -> None:
160
+ """Upgrade Exponent to the passed in version.
161
+
162
+ Args:
163
+ current_version: The current version of Exponent.
164
+ new_version: The new version of Exponent.
165
+ force: Whether to force the upgrade without prompting for confirmation.
166
+
167
+ Returns:
168
+ None
169
+ """
170
+ new_version_str = _new_version_str(current_version, new_version)
171
+ upgrade_command = _get_upgrade_command(new_version)
172
+ upgrade_command_str = _get_upgrade_command_str(new_version)
173
+
174
+ if platform.system() == "Windows":
175
+ click.echo(_windows_new_version_str(current_version, new_version))
176
+ return
177
+
178
+ if not force:
179
+ click.echo(
180
+ f"{new_version_str}\n{click.style('Upgrade command:', fg='cyan')}\n{upgrade_command_str}\n",
181
+ )
182
+
183
+ if not click.confirm("Upgrade now?", default=True):
184
+ return
185
+ else:
186
+ click.echo(f"Current version: {current_version}")
187
+ click.echo(f"New version available: {new_version}")
188
+
189
+ click.secho("Upgrading...", bold=True, fg="yellow")
190
+ result = subprocess.run(
191
+ upgrade_command, capture_output=True, text=True, check=False
192
+ )
193
+
194
+ click.echo(result.stdout)
195
+ click.echo(result.stderr)
196
+
197
+ if result.returncode != 0:
198
+ click.secho(
199
+ "\nFailed to upgrade Exponent. See https://docs.exponent.run/installation for help, or reach out to team@exponent.run.",
200
+ fg="red",
201
+ )
202
+ sys.exit(2)
203
+
204
+ click.secho(f"Successfully upgraded Exponent to version {new_version}!", fg="green")
205
+
206
+ click.echo("Re-run exponent to use the latest version.")
207
+ sys.exit(1)
208
+
209
+
210
+ def _upgrade_thread_worker(
211
+ upgrade_command: list[str],
212
+ current_version: str,
213
+ new_version: str,
214
+ settings: Settings,
215
+ ) -> None:
216
+ """Execute the upgrade command in a background thread and log completion status.
217
+
218
+ Args:
219
+ upgrade_command: The upgrade command to execute
220
+ current_version: The current version of Exponent
221
+ new_version: The target version to upgrade to
222
+ """
223
+ from exponent.core.remote_execution.session import send_exception_log
224
+
225
+ try:
226
+ result = subprocess.run(
227
+ upgrade_command,
228
+ capture_output=True,
229
+ text=True,
230
+ check=True,
231
+ )
232
+
233
+ if result.returncode != 0:
234
+ raise Exception(
235
+ f"Background upgrade from {current_version} to {new_version} failed with code {result.returncode}\nstdout: {result.stdout}\nstderr: {result.stderr}"
236
+ )
237
+ except Exception as e:
238
+ asyncio.run(send_exception_log(e, session=None, settings=settings))
239
+
240
+
241
+ def upgrade_exponent_in_background(
242
+ current_version: str,
243
+ new_version: str,
244
+ settings: Settings,
245
+ ) -> None:
246
+ """Upgrade Exponent to the passed in version in a background thread."""
247
+
248
+ if not settings.options.auto_upgrade:
249
+ click.secho(
250
+ "A new version of Exponent is available, but automatic upgrades are disabled. Please upgrade manually using `exponent upgrade`.\n",
251
+ fg="yellow",
252
+ )
253
+ return
254
+
255
+ if platform.system() == "Windows":
256
+ click.echo(
257
+ _windows_new_version_str(current_version, new_version),
258
+ )
259
+ _ask_continue_without_upgrading()
260
+ return
261
+
262
+ click.secho(
263
+ f"\nUpgrading Exponent from {current_version} to {new_version} (this will take effect next time)\n",
264
+ fg="cyan",
265
+ bold=True,
266
+ )
267
+
268
+ # Start a background thread for the upgrade
269
+ upgrade_thread = threading.Thread(
270
+ target=_upgrade_thread_worker,
271
+ args=(
272
+ _get_upgrade_command(new_version),
273
+ current_version,
274
+ new_version,
275
+ settings,
276
+ ),
277
+ daemon=True, # Make thread a daemon so it doesn't prevent program exit
278
+ )
279
+ upgrade_thread.start()
280
+
281
+
282
+ def check_exponent_version_and_upgrade(settings: Settings) -> None:
283
+ if not is_editable_install() and (result := check_exponent_version()):
284
+ installed_version, latest_version = result
285
+ upgrade_exponent_in_background(
286
+ current_version=installed_version,
287
+ new_version=latest_version,
288
+ settings=settings,
289
+ )
@@ -0,0 +1,36 @@
1
+ Metadata-Version: 2.4
2
+ Name: indent
3
+ Version: 0.0.8
4
+ Summary: Indent is an AI Pair Programmer
5
+ Author-email: Sashank Thupukari <sashank@exponent.run>
6
+ Requires-Python: <3.13,>=3.10
7
+ Requires-Dist: anyio<5,>=4.6.0
8
+ Requires-Dist: async-timeout<5,>=4.0.3; python_version < '3.11'
9
+ Requires-Dist: beautifulsoup4[chardet]<5,>=4.13.4
10
+ Requires-Dist: certifi<2025,>=2024.8.30
11
+ Requires-Dist: click<9,>=8.1.7
12
+ Requires-Dist: colour<0.2,>=0.1.5
13
+ Requires-Dist: diff-match-patch<20230431,>=20230430
14
+ Requires-Dist: eval-type-backport<0.3,>=0.2.0
15
+ Requires-Dist: gevent==24.2.1
16
+ Requires-Dist: git-python>=1.0.3
17
+ Requires-Dist: gitignore-parser<0.2,>=0.1.11
18
+ Requires-Dist: gql[httpx,websockets]<4,>=3.5.0
19
+ Requires-Dist: httpx<0.28,>=0.27.0
20
+ Requires-Dist: ipykernel<7,>=6.29.4
21
+ Requires-Dist: jupyter-client<9,>=8.6.1
22
+ Requires-Dist: msgspec>=0.19.0
23
+ Requires-Dist: packaging~=24.1
24
+ Requires-Dist: pip<26,>=25.0.1
25
+ Requires-Dist: prompt-toolkit<4,>=3.0.36
26
+ Requires-Dist: pydantic-settings<3,>=2.2.1
27
+ Requires-Dist: pydantic[email]<3,>=2.6.4
28
+ Requires-Dist: pygit2<2,>=1.15.0
29
+ Requires-Dist: python-ripgrep==0.0.8
30
+ Requires-Dist: pyyaml>=6.0.2
31
+ Requires-Dist: questionary<3,>=2.0.1
32
+ Requires-Dist: rapidfuzz<4,>=3.9.0
33
+ Requires-Dist: rich<14,>=13.7.1
34
+ Requires-Dist: sentry-sdk<3,>=2.1.1
35
+ Requires-Dist: toml<0.11,>=0.10.2
36
+ Requires-Dist: websockets~=11.0
@@ -0,0 +1,56 @@
1
+ exponent/__init__.py,sha256=JPfGr3EVn4l866iqvmWsgCj8Ri_AYo-pmJSR6IzXoBU,58
2
+ exponent/cli.py,sha256=9FPB5bqqGn7qVA_q2XZL6B2kRngVQoPdyvUvC5BH1_0,3496
3
+ exponent/py.typed,sha256=9XZl5avs8yHp89XP_1Fjtbeg_2rjYorCC9I0k_j-h2c,334
4
+ exponent/commands/cloud_commands.py,sha256=4DgS7PjCtCFB5uNN-szzAzOj16UU1D9b9_qS7DskoLE,2026
5
+ exponent/commands/common.py,sha256=HUzc9yl5L6GZEF5DDsF3IeArwPKrghxmK43vxtkxgGs,13679
6
+ exponent/commands/config_commands.py,sha256=lPwi2iueRfrBgCHIFRxAtYZCXjJ65zlwe8wSoAUoJQ8,15979
7
+ exponent/commands/github_app_commands.py,sha256=ijMGZisa9ElTLIpRYL-XqSCPOsKJ5W903Xx7T2msYHo,6353
8
+ exponent/commands/listen_commands.py,sha256=Zh_3HWZ7u0m9T6BIqocMUZzSvg-tJcMuvFYDM1yoAE4,3201
9
+ exponent/commands/run_commands.py,sha256=jxZp4F-RNTZbhD6-tIcyxAUDbpUSfaTX-X1Q7hyC_Q0,5857
10
+ exponent/commands/settings.py,sha256=UwwwoCgCY5hzAFD9slOBbA9Gr1hNfoyJ2blsFDC6V8w,1559
11
+ exponent/commands/shell_commands.py,sha256=bh6Ni4Lu5KsrWBqpV_GFrPJKta6F7RrgHNqRUqvsEVk,93892
12
+ exponent/commands/theme.py,sha256=XoX9lYDf8YyoU1HoRdctDHjK5MrMRUcBALBLcHDVPc8,8111
13
+ exponent/commands/types.py,sha256=iDJL3hdwhO1PrhsJTJBioNYSKo0CWV8Nv-ONcDaWIRs,3670
14
+ exponent/commands/upgrade.py,sha256=SpCdgEsBesPmXB5XgRJsIqonj73dfuuGVblo_0C2pWE,809
15
+ exponent/commands/utils.py,sha256=gmWUPHZtAfuSb3zdrAEkmHVhQYmHghqhvJUFBunn2-4,7572
16
+ exponent/core/config.py,sha256=TNFLUgLnfSocRMVSav_7E4VcaNHXZ_3Mg5Lp1smP46U,5731
17
+ exponent/core/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ exponent/core/graphql/client.py,sha256=KRveVt4lsrSdF9PnhhlQeqx74FQ9-iN28WQp0WKnQ30,1921
19
+ exponent/core/graphql/cloud_config_queries.py,sha256=Xy8SRP-sfWFcaq33hF-Ni1KwZDU4AdkkGbntsOxYytA,1968
20
+ exponent/core/graphql/get_chats_query.py,sha256=9-2N1VfapXUZB3IFIKw5U_gKdmfyviJp5JSUntB_Yyk,1177
21
+ exponent/core/graphql/github_config_queries.py,sha256=zKRDxF38q73apQcVaEAA_A20FVr3U0ADc5-8Y6Ns5Dw,1260
22
+ exponent/core/graphql/mutations.py,sha256=WRwgJzMTETvry1yc9-EBlIRWkePjHIskBAm_6tEiRaU,1352
23
+ exponent/core/graphql/queries.py,sha256=TXXHLGb7QpeICaofowVYsjyHDfqjCoQ3omLbesuw06s,2612
24
+ exponent/core/graphql/subscriptions.py,sha256=gg42wG5HqEuNMJU7OUHruNCAGtM6FKPLRD7KfjcKjC4,9995
25
+ exponent/core/remote_execution/checkpoints.py,sha256=3QGYMLa8vT7XmxMYTRcGrW8kNGHwRC0AkUfULribJWg,6354
26
+ exponent/core/remote_execution/cli_rpc_types.py,sha256=zzV_PD9Oy3p4J4Ip1v0Mpy2BnJTFKI-Q2WT062tVdlY,4557
27
+ exponent/core/remote_execution/client.py,sha256=3QbSAsukuVHCwmGfkoZBaBwgy4DuRZQs7LGAJtmT068,21010
28
+ exponent/core/remote_execution/code_execution.py,sha256=jYPB_7dJzS9BTPLX9fKQpsFPatwjbXuaFFSxT9tDTfI,2388
29
+ exponent/core/remote_execution/command_execution.py,sha256=HC9NXJg1R2sq1-Co1_paCrYnGn06rb_kTh5APG_B39Y,3672
30
+ exponent/core/remote_execution/error_info.py,sha256=Rd7OA3ps06qYejPVcOaMBB9AtftP3wqQoOfiILFASnc,1378
31
+ exponent/core/remote_execution/exceptions.py,sha256=eT57lBnBhvh-KJ5lsKWcfgGA5-WisAxhjZx-Z6OupZY,135
32
+ exponent/core/remote_execution/file_write.py,sha256=j9X4QfCBuZK6VIMfeu53WTN90G4w0AtN4U9GcoCJvJk,12531
33
+ exponent/core/remote_execution/files.py,sha256=9zr2epIatoM0I2uvfXa9y1bxqUu4z5ulHoibFFNSbP0,11364
34
+ exponent/core/remote_execution/git.py,sha256=Yo4mhkl6LYzGhVco91j_E8WOUey5KL9437rk43VCCA8,7826
35
+ exponent/core/remote_execution/session.py,sha256=cSJcCG1o74mBE6lZS_9VFmhyZdW6BeIOsbq4IVWH0t4,3863
36
+ exponent/core/remote_execution/system_context.py,sha256=0FkbsSxEVjdjTF0tQpOkYK_VaVM126C3_K8QP0YXxOs,1510
37
+ exponent/core/remote_execution/tool_execution.py,sha256=6rKRi_SqXB2vZUBMOKXLrxei3Ht2nNhomlSYUtOQdG0,9336
38
+ exponent/core/remote_execution/truncation.py,sha256=rFQDfT7qf_u6lvhEADWSpoRe_GTPegXXqknk7OZp0uI,10093
39
+ exponent/core/remote_execution/types.py,sha256=G-5EU-NtIj_zZbV305YMDZEcSacGK7QfzEdCYSHAGmA,17206
40
+ exponent/core/remote_execution/utils.py,sha256=Hw2zGMq0NKVwkVzNOVekAvpM33rfIz2P36mEcJr43Ag,20688
41
+ exponent/core/remote_execution/languages/python_execution.py,sha256=GcQU5PiAOUD9tUZDrSObgM3L7FjXMdzr4FQg6ts2XjY,7780
42
+ exponent/core/remote_execution/languages/shell_streaming.py,sha256=eSeHcK_unGpVRRdfgfwhml_tSlCo0VCeUEQY4zuMbDw,7372
43
+ exponent/core/remote_execution/languages/types.py,sha256=f7FjSRNRSga-ZaE3LddDhxCirUVjlSYMEdoskG6Pta4,314
44
+ exponent/core/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ exponent/core/types/command_data.py,sha256=_HqQsnamRZeVoVaTpeO3ecVUzNBdG62WXlFy6Q7rtUM,5294
46
+ exponent/core/types/event_types.py,sha256=sxI9ac03G-6y1_p7_RhiaEzxFHwGxvBBNRWHG8uLiLI,2480
47
+ exponent/core/types/generated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ exponent/core/types/generated/strategy_info.py,sha256=T9fGuH9gS4GaChgRfIjDYAs68bk4zm9OEg2mMcT-Wyw,7155
49
+ exponent/migration-docs/login.md,sha256=KIeXy3m2nzSUgw-4PW1XzXfHael1D4Zu93CplLMb3hI,4252
50
+ exponent/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ exponent/utils/colors.py,sha256=HBkqe_ZmhJ9YiL2Fpulqek4KvLS5mwBTY4LQSM5N8SM,2762
52
+ exponent/utils/version.py,sha256=Q4txP7Rg_KO0u0tUpx8O0DoOt32wrX7ctNeDXVKaOfA,8835
53
+ indent-0.0.8.dist-info/METADATA,sha256=90lhuY3XueNdgMxM0F14wMAjG8equx9b3OaOMVUAgCs,1313
54
+ indent-0.0.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
55
+ indent-0.0.8.dist-info/entry_points.txt,sha256=q8q1t1sbl4NULGOR0OV5RmSG4KEjkpEQRU_RUXEGzcs,44
56
+ indent-0.0.8.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.27.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ indent = exponent.cli:cli