glaip-sdk 0.7.28__py3-none-any.whl → 0.7.30__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.
@@ -24,7 +24,7 @@ from textual import events
24
24
  from textual._context import NoActiveAppError
25
25
  from textual.app import App, ComposeResult, ScreenStackError
26
26
  from textual.binding import Binding
27
- from textual.containers import Horizontal
27
+ from textual.containers import Horizontal, ScrollableContainer
28
28
  from textual.coordinate import Coordinate
29
29
  from textual.screen import Screen
30
30
  from textual.widgets import DataTable, Footer, Input, RichLog, Static, TextArea
@@ -161,6 +161,13 @@ class RunsHarlequinScreen(ToastHandlerMixin, ClipboardToastMixin, BackgroundTask
161
161
  padding: 1;
162
162
  }
163
163
 
164
+ #right-pane-body {
165
+ height: 100%;
166
+ overflow-y: auto;
167
+ scrollbar-size: 1 1;
168
+ scrollbar-color: $accent;
169
+ }
170
+
164
171
  .pane-title {
165
172
  color: $warning;
166
173
  text-style: bold;
@@ -182,16 +189,15 @@ class RunsHarlequinScreen(ToastHandlerMixin, ClipboardToastMixin, BackgroundTask
182
189
  border: solid $secondary;
183
190
  padding: 1;
184
191
  margin-bottom: 1;
185
- height: 8;
192
+ height: auto;
186
193
  min-height: 3;
187
- overflow-y: auto;
188
194
  }
189
195
 
190
196
  .step-list {
191
197
  border: solid $secondary;
192
198
  padding: 1;
193
- height: 1fr;
194
- overflow-y: auto;
199
+ height: auto;
200
+ min-height: 5;
195
201
  }
196
202
 
197
203
  .status-bar {
@@ -300,12 +306,14 @@ class RunsHarlequinScreen(ToastHandlerMixin, ClipboardToastMixin, BackgroundTask
300
306
  self._transcript_log = RichLog(id=RUNS_DETAIL_TRANSCRIPT_ID, wrap=False, classes="step-list")
301
307
  self._transcript_log.can_focus = True
302
308
 
303
- right_pane.mount(self._detail_title)
304
- right_pane.mount(self._detail_meta)
305
- right_pane.mount(self._input_title)
306
- right_pane.mount(self._input_body)
307
- right_pane.mount(self._transcript_title)
308
- right_pane.mount(self._transcript_log)
309
+ self._right_pane_body = ScrollableContainer(id="right-pane-body")
310
+ right_pane.mount(self._right_pane_body)
311
+ self._right_pane_body.mount(self._detail_title)
312
+ self._right_pane_body.mount(self._detail_meta)
313
+ self._right_pane_body.mount(self._input_title)
314
+ self._right_pane_body.mount(self._input_body)
315
+ self._right_pane_body.mount(self._transcript_title)
316
+ self._right_pane_body.mount(self._transcript_log)
309
317
 
310
318
  self._ensure_toast_bus()
311
319
  try:
@@ -423,10 +431,12 @@ class RunsHarlequinScreen(ToastHandlerMixin, ClipboardToastMixin, BackgroundTask
423
431
 
424
432
  def action_transcript_page_up(self) -> None:
425
433
  """Scroll the transcript up one page."""
434
+ self._transcript_log.scroll_visible(animate=False)
426
435
  self._transcript_log.action_page_up()
427
436
 
428
437
  def action_transcript_page_down(self) -> None:
429
438
  """Scroll the transcript down one page."""
439
+ self._transcript_log.scroll_visible(animate=False)
430
440
  self._transcript_log.action_page_down()
431
441
 
432
442
  def action_focus_filter(self) -> None:
@@ -145,9 +145,31 @@ class ImportResolver:
145
145
  return self._is_local_package_import(node.module)
146
146
 
147
147
  # Handle simple module imports
148
+ # First, check if it's the package root (matched via project markers)
149
+ if self._is_package_root_import(node.module):
150
+ return True
151
+
152
+ # Then check for local file in tool_dir
148
153
  potential_file = self.tool_dir / f"{node.module}.py"
149
154
  return potential_file.exists()
150
155
 
156
+ def _is_package_root_import(self, module_name: str) -> bool:
157
+ """Check if a simple module name is a package root in the ancestor chain.
158
+
159
+ Args:
160
+ module_name: Simple module name (no dots).
161
+
162
+ Returns:
163
+ True if the module name matches any parent directory that could be a package.
164
+ """
165
+ # Check all ancestors for a matching directory name
166
+ current = self.tool_dir
167
+ while current != current.parent:
168
+ if module_name == current.name:
169
+ return True
170
+ current = current.parent
171
+ return False
172
+
151
173
  def _is_local_relative_import(self, node: ast.ImportFrom) -> bool:
152
174
  """Check if a relative import is local.
153
175
 
@@ -366,7 +388,22 @@ class ImportResolver:
366
388
  """
367
389
  if "." in module_name:
368
390
  return self._resolve_dotted_module_path(module_name)
369
- return self.tool_dir / f"{module_name}.py"
391
+
392
+ # For simple module names, check if it's a file in tool_dir or an ancestor package
393
+ potential_file = self.tool_dir / f"{module_name}.py"
394
+ if potential_file.exists():
395
+ return potential_file
396
+
397
+ # Check if it's an ancestor package (directory with __init__.py)
398
+ current = self.tool_dir
399
+ while current != current.parent:
400
+ potential_package_init = current / module_name / INIT_FILE
401
+ if potential_package_init.exists():
402
+ return potential_package_init
403
+ current = current.parent
404
+
405
+ # Fallback to the file path (will fail later if not found)
406
+ return potential_file
370
407
 
371
408
  def resolve_relative_import_path(self, node: ast.ImportFrom) -> Path:
372
409
  """Resolve relative import to file path.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: glaip-sdk
3
- Version: 0.7.28
3
+ Version: 0.7.30
4
4
  Summary: Python SDK and CLI for GL AIP (GDP Labs AI Agent Package) - Build, run, and manage AI agents
5
5
  Author-email: Raymond Christopher <raymond.christopher@gdplabs.id>
6
6
  License: MIT
@@ -90,7 +90,7 @@ glaip_sdk/cli/slash/tui/context.py,sha256=mzI4TDXnfZd42osACp5uo10d10y1_A0z6IxRK1
90
90
  glaip_sdk/cli/slash/tui/indicators.py,sha256=jV3fFvEVWQ0inWJJ-B1fMsdkF0Uq2zwX3xcl0YWPHSE,11768
91
91
  glaip_sdk/cli/slash/tui/keybind_registry.py,sha256=_rK05BxTxNudYc4iJ9gDxpgeUkjDAq8rarIT-9A-jyM,6739
92
92
  glaip_sdk/cli/slash/tui/loading.py,sha256=Ku7HyQ_h-r2dJQ5aIEaCOi5PUu5gSsYle8oiKHIxfKI,2336
93
- glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=Rm_Fo8WNyTHWNj2aGwTnYsV-QVUCCSbT380D8Cio3uM,40618
93
+ glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=FWNbkoSSspunD5WY2N0xlxuwtJOMEftnMQpuU67WLH0,41061
94
94
  glaip_sdk/cli/slash/tui/terminal.py,sha256=ZAC3sB17TGpl-GFeRVm_nI8DQTN3pyti3ynlZ41wT_A,12323
95
95
  glaip_sdk/cli/slash/tui/toast.py,sha256=UmP0_UAQcp0mOdX1iIS8W3gGDb14Z3kYGmbN_NvYDls,13494
96
96
  glaip_sdk/cli/slash/tui/layouts/__init__.py,sha256=KT77pZHa7Wz84QlHYT2mfhQ_AXUA-T0eHv_HtAvc1ac,473
@@ -179,7 +179,7 @@ glaip_sdk/utils/display.py,sha256=zu3SYqxj9hPyEN8G1vIXv_yXBkV8jLLCXEg2rs8NlzM,44
179
179
  glaip_sdk/utils/export.py,sha256=1NxxE3wGsA1auzecG5oJw5ELB4VmPljoeIkGhrGOh1I,5006
180
180
  glaip_sdk/utils/general.py,sha256=3HSVIopUsIymPaim-kP2lqLX75TkkdIVLe6g3UKabZ0,1507
181
181
  glaip_sdk/utils/import_export.py,sha256=RCvoydm_6_L7_J1igcE6IYDunqgS5mQUbWT4VGrytMw,5510
182
- glaip_sdk/utils/import_resolver.py,sha256=82kSV9eAlzBiwPI8rkeXVrNjlpXa5q9fvRoJxE6b-6U,27706
182
+ glaip_sdk/utils/import_resolver.py,sha256=Vwvg1FoODM15MiQ3A7d3fImSP13bYHOnD8WoxVL49L0,29131
183
183
  glaip_sdk/utils/instructions.py,sha256=MTk93lsq3I8aRnvnRMSXXNMzcpnaIM_Pm3Aiiiq3GBc,2997
184
184
  glaip_sdk/utils/resource_refs.py,sha256=vF34kyAtFBLnaKnQVrsr2st1JiSxVbIZ4yq0DelJvCI,5966
185
185
  glaip_sdk/utils/run_renderer.py,sha256=d_VMI6LbvHPUUeRmGqh5wK_lHqDEIAcym2iqpbtDad0,1365
@@ -220,8 +220,8 @@ glaip_sdk/utils/rendering/steps/format.py,sha256=Chnq7OBaj8XMeBntSBxrX5zSmrYeGcO
220
220
  glaip_sdk/utils/rendering/steps/manager.py,sha256=BiBmTeQMQhjRMykgICXsXNYh1hGsss-fH9BIGVMWFi0,13194
221
221
  glaip_sdk/utils/rendering/viewer/__init__.py,sha256=XrxmE2cMAozqrzo1jtDFm8HqNtvDcYi2mAhXLXn5CjI,457
222
222
  glaip_sdk/utils/rendering/viewer/presenter.py,sha256=mlLMTjnyeyPVtsyrAbz1BJu9lFGQSlS-voZ-_Cuugv0,5725
223
- glaip_sdk-0.7.28.dist-info/METADATA,sha256=NLsPQhywv5Gba0deG2zIQX3FRZc0p_LZoDAp82Dawzg,8686
224
- glaip_sdk-0.7.28.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
225
- glaip_sdk-0.7.28.dist-info/entry_points.txt,sha256=NkhO6FfgX9Zrjn63GuKphf-dLw7KNJvucAcXc7P3aMk,54
226
- glaip_sdk-0.7.28.dist-info/top_level.txt,sha256=td7yXttiYX2s94-4wFhv-5KdT0rSZ-pnJRSire341hw,10
227
- glaip_sdk-0.7.28.dist-info/RECORD,,
223
+ glaip_sdk-0.7.30.dist-info/METADATA,sha256=ge4c5VT6WwDsNDAoXUhM2efYmYwZ7ygCJ2F_jdLujbc,8686
224
+ glaip_sdk-0.7.30.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
225
+ glaip_sdk-0.7.30.dist-info/entry_points.txt,sha256=NkhO6FfgX9Zrjn63GuKphf-dLw7KNJvucAcXc7P3aMk,54
226
+ glaip_sdk-0.7.30.dist-info/top_level.txt,sha256=td7yXttiYX2s94-4wFhv-5KdT0rSZ-pnJRSire341hw,10
227
+ glaip_sdk-0.7.30.dist-info/RECORD,,