Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5024f80
feat: add organization session policy SDK methods and generate local …
srinivaskarre-sk May 6, 2026
21bcaf1
chore: bump proto ref to v0.1.120.2
srinivaskarre-sk May 10, 2026
24a80a1
feat: regenerate protos for v0.1.120.2 and add session policy tests
srinivaskarre-sk May 10, 2026
2d8760c
fix: add --include-imports to generate-local and restore buf/validate…
srinivaskarre-sk May 10, 2026
81a89fc
chore: revert unrelated proto changes, remove generate-local, bump PR…
srinivaskarre-sk May 10, 2026
dbf259b
chore: ignore proto/ directory (local generate-local output)
srinivaskarre-sk May 10, 2026
57c8e16
chore: regenerate all proto stubs for v0.1.120.2
srinivaskarre-sk May 11, 2026
62a10b9
chore: regenerate proto stubs from local scalekit proto and add gener…
srinivaskarre-sk May 12, 2026
bdcae9c
chore: merge main and regenerate proto stubs from local scalekit proto
srinivaskarre-sk May 12, 2026
b4290a9
build
srinivaskarre-sk May 12, 2026
8c84f5b
fix: remove blocking input() call from test_actions setUp
srinivaskarre-sk May 12, 2026
cd194f0
Revert "fix: remove blocking input() call from test_actions setUp"
srinivaskarre-sk May 12, 2026
9b77c05
build
srinivaskarre-sk May 12, 2026
6452edf
chore: merge main into b_org_session_policy_v1
srinivaskarre-sk May 12, 2026
2db5d33
chore: regenerate proto stubs from local scalekit proto
srinivaskarre-sk May 12, 2026
ae03820
chore: regenerate proto stubs from published v0.1.121.2
srinivaskarre-sk May 12, 2026
0d33670
fix: address coderabbitai review comments
srinivaskarre-sk May 12, 2026
0ef8307
build
srinivaskarre-sk May 12, 2026
eda1a26
Merge branch 'main' into b_org_session_policy_v1
srinivaskarre-sk May 12, 2026
400ccc8
fix: return raw grpc response from session policy methods and bump ve…
srinivaskarre-sk May 13, 2026
e080b3f
fix: update session policy tests to unpack raw grpc response tuple
srinivaskarre-sk May 13, 2026
0cd7ce3
fix: correct return types for session policy methods to use response …
srinivaskarre-sk May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,4 @@ proto

# Claude Code documentation
CLAUDE.md
proto/
23 changes: 21 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ VENV_PYTHON := $(VENV_DIR)/bin/python
VENV_PIP := $(VENV_PYTHON) -m pip

PROTO_REPO_URL := https://github.com/scalekit-inc/scalekit.git
PROTO_REF ?= v0.1.116.0
PROTO_REF ?= v0.1.120.2
PROTO_SUBDIR := proto
LOCAL_PROTO_REPO ?= ../scalekit

TEMP_DIR := temp_scalekit
SCALEKIT_DIR := scalekit
Expand All @@ -22,7 +23,7 @@ GOOGLE_DIR := google
PROTO_DIR := proto
PROTOC_DIR := protoc_gen_openapiv2

.PHONY: setup generate lint test tools-check create-venv prepare buf_generate restore generate_init_files cleanup copy_proto_dir
.PHONY: setup generate generate-local lint test tools-check create-venv prepare buf_generate restore generate_init_files cleanup copy_proto_dir

setup: create-venv
@echo "Installing SDK dependencies in $(VENV_DIR)..."
Expand Down Expand Up @@ -109,6 +110,24 @@ cleanup:
rm -f .dirpath buf.yaml buf.lock
@if [ -f buf.work.yaml.bak ]; then mv buf.work.yaml.bak buf.work.yaml; fi

generate-local: tools-check
@echo "Using local proto sources from $(LOCAL_PROTO_REPO)..."
@set -euo pipefail; \
prepared=0; \
rollback_if_needed() { \
if [ "$$prepared" -eq 1 ] && [ -d "$(TEMP_DIR)" ]; then \
echo "Generation failed; restoring $(SCALEKIT_DIR) from $(TEMP_DIR)..."; \
rsync -a "$(TEMP_DIR)/" "$(SCALEKIT_DIR)/"; \
fi; \
}; \
trap 'rollback_if_needed' EXIT; \
$(MAKE) prepare; prepared=1; \
buf generate $(LOCAL_PROTO_REPO) --include-imports; \
$(MAKE) restore; prepared=0; \
$(MAKE) generate_init_files; \
$(MAKE) cleanup
@echo "Code generation complete."
Comment thread
coderabbitai[bot] marked this conversation as resolved.

lint: create-venv
@echo "Running static checks..."
$(VENV_PYTHON) -m compileall -q scalekit tests
Expand Down
76 changes: 76 additions & 0 deletions scalekit/organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@
UpdateOrganizationSettingsRequest,
OrganizationUserManagementSettings,
UpsertUserManagementSettingsRequest,
OrganizationSessionPolicySettings,
GetOrganizationSessionPolicyRequest,
UpdateOrganizationSessionPolicyRequest,
SessionPolicyType,
)
from scalekit.v1.commons.commons_pb2 import TimeUnit
from scalekit.v1.organizations.organizations_pb2_grpc import OrganizationServiceStub


Expand Down Expand Up @@ -219,3 +224,74 @@ def upsert_user_management_settings(self, organization_id: str, max_allowed_user
)
)
return response[0].settings

def get_organization_session_policy(self, organization_id: str) -> OrganizationSessionPolicySettings:
"""
Get the session policy for an organization.

:param organization_id: Organization id
:type organization_id : ``` str ```
:returns:
OrganizationSessionPolicySettings
"""
response = self.core_client.grpc_exec(
self.organization_service.GetOrganizationSessionPolicy.with_call,
GetOrganizationSessionPolicyRequest(organization_id=organization_id),
)
return response[0].policy

def update_organization_session_policy(
self,
organization_id: str,
policy_source: SessionPolicyType,
absolute_session_timeout: Optional[int] = None,
absolute_session_timeout_unit: Optional[TimeUnit] = None,
idle_session_timeout_enabled: Optional[bool] = None,
idle_session_timeout: Optional[int] = None,
idle_session_timeout_unit: Optional[TimeUnit] = None,
) -> OrganizationSessionPolicySettings:
"""
Set a custom session policy for an organization or revert to application defaults.

:param organization_id: Organization id
:type organization_id: ``` str ```
:param policy_source: SessionPolicyType.APPLICATION or SessionPolicyType.CUSTOM
:type policy_source: ``` SessionPolicyType ```
:param absolute_session_timeout: Absolute session timeout value (optional)
:type absolute_session_timeout: ``` int | None ```
:param absolute_session_timeout_unit: Unit for absolute timeout (optional)
:type absolute_session_timeout_unit: ``` TimeUnit | None ```
:param idle_session_timeout_enabled: Whether idle session timeout is enabled (optional)
:type idle_session_timeout_enabled: ``` bool | None ```
:param idle_session_timeout: Idle session timeout value (optional)
:type idle_session_timeout: ``` int | None ```
:param idle_session_timeout_unit: Unit for idle timeout (optional)
:type idle_session_timeout_unit: ``` TimeUnit | None ```
:returns:
OrganizationSessionPolicySettings
"""
req = UpdateOrganizationSessionPolicyRequest(
organization_id=organization_id,
policy_source=policy_source,
)
if absolute_session_timeout is not None:
req.absolute_session_timeout.CopyFrom(
wrappers_pb2.Int32Value(value=absolute_session_timeout)
)
if absolute_session_timeout_unit is not None:
req.absolute_session_timeout_unit = absolute_session_timeout_unit
if idle_session_timeout_enabled is not None:
req.idle_session_timeout_enabled.CopyFrom(
wrappers_pb2.BoolValue(value=idle_session_timeout_enabled)
)
if idle_session_timeout is not None:
req.idle_session_timeout.CopyFrom(
wrappers_pb2.Int32Value(value=idle_session_timeout)
)
if idle_session_timeout_unit is not None:
req.idle_session_timeout_unit = idle_session_timeout_unit
response = self.core_client.grpc_exec(
self.organization_service.UpdateOrganizationSessionPolicy.with_call,
req,
)
return response[0].policy
Empty file.
62 changes: 62 additions & 0 deletions scalekit/v1/agentkit_logs/agentkit_analytics_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

91 changes: 91 additions & 0 deletions scalekit/v1/agentkit_logs/agentkit_analytics_pb2.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
from buf.validate import validate_pb2 as _validate_pb2
from google.api import annotations_pb2 as _annotations_pb2
from google.api import field_behavior_pb2 as _field_behavior_pb2
from google.api import visibility_pb2 as _visibility_pb2
from google.protobuf import timestamp_pb2 as _timestamp_pb2
from protoc_gen_openapiv2.options import annotations_pb2 as _annotations_pb2_1
from scalekit.v1.options import options_pb2 as _options_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

class GetOverviewStatsRequest(_message.Message):
__slots__ = ("start_time", "end_time", "provider", "status", "error_code", "connection_name")
START_TIME_FIELD_NUMBER: _ClassVar[int]
END_TIME_FIELD_NUMBER: _ClassVar[int]
PROVIDER_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
ERROR_CODE_FIELD_NUMBER: _ClassVar[int]
CONNECTION_NAME_FIELD_NUMBER: _ClassVar[int]
start_time: _timestamp_pb2.Timestamp
end_time: _timestamp_pb2.Timestamp
provider: _containers.RepeatedScalarFieldContainer[str]
status: _containers.RepeatedScalarFieldContainer[str]
error_code: _containers.RepeatedScalarFieldContainer[str]
connection_name: str
def __init__(self, start_time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., end_time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., provider: _Optional[_Iterable[str]] = ..., status: _Optional[_Iterable[str]] = ..., error_code: _Optional[_Iterable[str]] = ..., connection_name: _Optional[str] = ...) -> None: ...

class OverviewStats(_message.Message):
__slots__ = ("total", "success", "errors", "provider_errors", "platform_errors", "top_error_codes", "connector_breakdown", "time_series")
TOTAL_FIELD_NUMBER: _ClassVar[int]
SUCCESS_FIELD_NUMBER: _ClassVar[int]
ERRORS_FIELD_NUMBER: _ClassVar[int]
PROVIDER_ERRORS_FIELD_NUMBER: _ClassVar[int]
PLATFORM_ERRORS_FIELD_NUMBER: _ClassVar[int]
TOP_ERROR_CODES_FIELD_NUMBER: _ClassVar[int]
CONNECTOR_BREAKDOWN_FIELD_NUMBER: _ClassVar[int]
TIME_SERIES_FIELD_NUMBER: _ClassVar[int]
total: int
success: int
errors: int
provider_errors: int
platform_errors: int
top_error_codes: _containers.RepeatedCompositeFieldContainer[ErrorCodeCount]
connector_breakdown: _containers.RepeatedCompositeFieldContainer[ConnectorStat]
time_series: _containers.RepeatedCompositeFieldContainer[TimeSeriesBucket]
def __init__(self, total: _Optional[int] = ..., success: _Optional[int] = ..., errors: _Optional[int] = ..., provider_errors: _Optional[int] = ..., platform_errors: _Optional[int] = ..., top_error_codes: _Optional[_Iterable[_Union[ErrorCodeCount, _Mapping]]] = ..., connector_breakdown: _Optional[_Iterable[_Union[ConnectorStat, _Mapping]]] = ..., time_series: _Optional[_Iterable[_Union[TimeSeriesBucket, _Mapping]]] = ...) -> None: ...

class ErrorCodeCount(_message.Message):
__slots__ = ("error_code", "count")
ERROR_CODE_FIELD_NUMBER: _ClassVar[int]
COUNT_FIELD_NUMBER: _ClassVar[int]
error_code: str
count: int
def __init__(self, error_code: _Optional[str] = ..., count: _Optional[int] = ...) -> None: ...

class ConnectorStat(_message.Message):
__slots__ = ("provider", "total", "success", "errors", "provider_errors", "platform_errors")
PROVIDER_FIELD_NUMBER: _ClassVar[int]
TOTAL_FIELD_NUMBER: _ClassVar[int]
SUCCESS_FIELD_NUMBER: _ClassVar[int]
ERRORS_FIELD_NUMBER: _ClassVar[int]
PROVIDER_ERRORS_FIELD_NUMBER: _ClassVar[int]
PLATFORM_ERRORS_FIELD_NUMBER: _ClassVar[int]
provider: str
total: int
success: int
errors: int
provider_errors: int
platform_errors: int
def __init__(self, provider: _Optional[str] = ..., total: _Optional[int] = ..., success: _Optional[int] = ..., errors: _Optional[int] = ..., provider_errors: _Optional[int] = ..., platform_errors: _Optional[int] = ...) -> None: ...

class TimeSeriesBucket(_message.Message):
__slots__ = ("bucket", "total", "success", "errors", "bucket_duration_seconds", "provider_errors", "platform_errors")
BUCKET_FIELD_NUMBER: _ClassVar[int]
TOTAL_FIELD_NUMBER: _ClassVar[int]
SUCCESS_FIELD_NUMBER: _ClassVar[int]
ERRORS_FIELD_NUMBER: _ClassVar[int]
BUCKET_DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int]
PROVIDER_ERRORS_FIELD_NUMBER: _ClassVar[int]
PLATFORM_ERRORS_FIELD_NUMBER: _ClassVar[int]
bucket: _timestamp_pb2.Timestamp
total: int
success: int
errors: int
bucket_duration_seconds: int
provider_errors: int
platform_errors: int
def __init__(self, bucket: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., total: _Optional[int] = ..., success: _Optional[int] = ..., errors: _Optional[int] = ..., bucket_duration_seconds: _Optional[int] = ..., provider_errors: _Optional[int] = ..., platform_errors: _Optional[int] = ...) -> None: ...
Loading
Loading