Skip to content

Commit 384d288

Browse files
committed
Update abstra-lib
1 parent 8195af8 commit 384d288

File tree

296 files changed

+1346
-1360
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

296 files changed

+1346
-1360
lines changed

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,7 @@ venv.bak/
129129
.vscode/
130130

131131
# version
132-
VERSION
132+
VERSION
133+
134+
# docker
135+
.docker

abstra_internals/cloud/hooks.py abstra_internals/cloud/ghooks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from gunicorn.arbiter import Arbiter
66
from gunicorn.workers.base import Worker
77

8+
from abstra_internals.controllers.main import MainController
89
from abstra_internals.environment import (
910
DEFAULT_PORT,
1011
THREADS,
@@ -16,7 +17,6 @@
1617
)
1718
from abstra_internals.logger import AbstraLogger
1819
from abstra_internals.repositories.execution_logs import StdioLogEntry
19-
from abstra_internals.server.controller.main import MainController
2020
from abstra_internals.utils import get_internal_id
2121

2222

abstra_internals/cloud/server.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from abstra_internals.cloud.application import CustomApplication
2-
from abstra_internals.cloud.hooks import GunicornOptionsBuilder
2+
from abstra_internals.cloud.ghooks import GunicornOptionsBuilder
3+
from abstra_internals.controllers.main import MainController
34
from abstra_internals.environment import DEFAULT_PORT
45
from abstra_internals.logger import AbstraLogger
56
from abstra_internals.server.apps import get_cloud_app
6-
from abstra_internals.server.controller.main import MainController
77
from abstra_internals.settings import SettingsController
88
from abstra_internals.stdio_patcher import StdioPatcher
99

abstra_internals/server/controller/ai.py abstra_internals/controllers/ai.py

+2-79
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22
from dataclasses import dataclass
33
from typing import Any, Dict, List
44

5-
import flask
6-
75
from abstra_internals.cloud_api import (
86
cancel_all,
97
create_thread,
108
generate_project,
119
get_ai_messages,
1210
)
11+
from abstra_internals.controllers.linters import fix_all_linters
12+
from abstra_internals.controllers.main import MainController
1313
from abstra_internals.credentials import resolve_headers
1414
from abstra_internals.repositories.project.json_migrations import get_latest_version
1515
from abstra_internals.repositories.project.project import Project, ProjectRepository
16-
from abstra_internals.server.controller.linters import fix_all_linters
17-
from abstra_internals.server.controller.main import MainController
1816
from abstra_internals.settings import Settings
19-
from abstra_internals.usage import editor_manual_usage, editor_usage
2017

2118

2219
@dataclass
@@ -87,77 +84,3 @@ def init_stages(self, python_files: List[PythonFile]):
8784
else:
8885
raise Exception(f"Invalid stage {file.stage}")
8986
script.file_path.write_text(file.content, encoding="utf-8")
90-
91-
92-
def get_editor_bp(main_controller: MainController):
93-
bp = flask.Blueprint("editor_ai", __name__)
94-
controller = AiController(main_controller)
95-
96-
@bp.post("/message")
97-
@editor_usage
98-
def _get_next_message():
99-
body = flask.request.json
100-
if not body:
101-
flask.abort(400)
102-
103-
streamer = controller.send_ai_message(
104-
body["messages"], body["runtime"], body["threadId"]
105-
)
106-
107-
if streamer is None:
108-
flask.abort(403)
109-
110-
return flask.Response(streamer, mimetype="text/event-stream")
111-
112-
@bp.post("/thread")
113-
@editor_usage
114-
def _create_thread():
115-
thread = controller.create_thread()
116-
if not thread:
117-
flask.abort(403)
118-
return thread
119-
120-
@bp.post("/cancel-all")
121-
@editor_usage
122-
def _cancel_all():
123-
body = flask.request.json
124-
if not body:
125-
flask.abort(400)
126-
thread_id = body.get("threadId")
127-
if not thread_id:
128-
flask.abort(400)
129-
controller.cancel_all(thread_id)
130-
return {"success": True}
131-
132-
@bp.post("/generate")
133-
@editor_usage
134-
def _generate():
135-
body = flask.request.json
136-
if not body:
137-
flask.abort(400)
138-
139-
prompt = body.get("prompt")
140-
if not prompt:
141-
flask.abort(400)
142-
143-
controller.generate_project(prompt)
144-
return {"success": True}
145-
146-
@bp.post("/vote")
147-
def _vote():
148-
body = flask.request.json
149-
if not body:
150-
flask.abort(400)
151-
vote = body.get("vote")
152-
question = body.get("question")
153-
answer = body.get("answer")
154-
context = body.get("context")
155-
156-
editor_manual_usage(
157-
event="ai_vote",
158-
payload=dict(vote=vote, question=question, answer=answer, context=context),
159-
)
160-
161-
return {"success": True}
162-
163-
return bp

abstra_internals/server/controller/auth.py abstra_internals/controllers/auth.py

+1-70
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
import typing
22
from typing import Optional, Tuple
33

4-
import flask
54
import requests
65

76
from abstra_internals.email_templates import authn_template
8-
from abstra_internals.environment import (
9-
OIDC_AUTHORITY,
10-
)
7+
from abstra_internals.environment import OIDC_AUTHORITY
118
from abstra_internals.logger import AbstraLogger
129
from abstra_internals.repositories.email import EmailRepository
1310
from abstra_internals.repositories.jwt_signer import JWTRepository
1411
from abstra_internals.repositories.keyvalue import KVRepository
15-
from abstra_internals.server.controller.main import MainController
16-
from abstra_internals.usage import send_player_usage
17-
from abstra_internals.utils.email import is_valid_email
1812

1913

2014
def authn_kv_key(email: str) -> str:
@@ -114,66 +108,3 @@ def oidc_verify(self, access_token: str) -> Tuple[Optional[str], Optional[str]]:
114108
except Exception as e:
115109
AbstraLogger.capture_exception(e)
116110
return None, None
117-
118-
119-
def get_player_bp(main_controller: MainController):
120-
bp = flask.Blueprint("auth", __name__)
121-
controller = AuthController(
122-
kv_repository=main_controller.kv_repository,
123-
jwt_repository=main_controller.jwt_repository,
124-
email_repository=main_controller.email_repository,
125-
)
126-
127-
@bp.post("/authenticate")
128-
def _authenticate():
129-
data = flask.request.get_json(force=True)
130-
if not data:
131-
return flask.abort(400)
132-
133-
email = data.get("email")
134-
if not email or not is_valid_email(email):
135-
return flask.abort(400)
136-
137-
ok = controller.authenticate(email)
138-
if not ok:
139-
return flask.abort(400)
140-
141-
send_player_usage(event="_authenticate", payload={"email": email})
142-
return {"ok": True}
143-
144-
@bp.post("/verify")
145-
def _verify():
146-
data = flask.request.get_json(force=True)
147-
if not data:
148-
return flask.abort(400)
149-
150-
email = data.get("email")
151-
code = data.get("token")
152-
if not email or not code:
153-
return flask.abort(400)
154-
155-
status, jwt = controller.verify(email, code)
156-
if not jwt:
157-
return flask.abort(status)
158-
159-
send_player_usage(event="_verify", payload={"email": email})
160-
return {"jwt": jwt}
161-
162-
@bp.post("/oidc-verify")
163-
def _oidc_verify():
164-
data = flask.request.get_json(force=True)
165-
if not data:
166-
return flask.abort(400)
167-
168-
access_token = data.get("access_token")
169-
if not access_token:
170-
return flask.abort(400)
171-
172-
jwt, email = controller.oidc_verify(access_token)
173-
if not jwt:
174-
return flask.abort(404)
175-
176-
send_player_usage(event="_oidc_verify", payload={"email": email})
177-
return {"jwt": jwt}
178-
179-
return bp

abstra_internals/server/controller/env_vars.py abstra_internals/controllers/env_vars.py

-35
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
from dataclasses import dataclass
22
from typing import Any, Dict, List, Literal, Union
33

4-
import flask
5-
6-
from abstra_internals.server.controller.main import MainController
7-
from abstra_internals.usage import editor_usage
8-
94

105
@dataclass
116
class CreateEnvVarBody:
@@ -58,33 +53,3 @@ def from_dict(data: List[Dict[str, Any]]) -> "PatchClientEnvVarBody":
5853
elif change_type == "delete":
5954
changes.append(DeleteEnvVarBody.from_dict(item))
6055
return PatchClientEnvVarBody(changes=changes)
61-
62-
63-
def get_editor_bp(main_controller: MainController):
64-
bp = flask.Blueprint("editor_env_vars", __name__)
65-
66-
# 1s pooling in this route
67-
@bp.get("/")
68-
def _get_env_vars():
69-
return [
70-
env_var.to_dict() for env_var in main_controller.env_vars_repository.list()
71-
]
72-
73-
@bp.patch("/")
74-
@editor_usage
75-
def _change_env_vars():
76-
if flask.request.json is None:
77-
flask.abort(400)
78-
79-
body = PatchClientEnvVarBody.from_dict(flask.request.json)
80-
for change in body.changes:
81-
if change.change == "create" or change.change == "update":
82-
main_controller.env_vars_repository.set(
83-
name=change.name, value=change.value
84-
)
85-
elif change.change == "delete":
86-
main_controller.env_vars_repository.unset(name=change.name)
87-
88-
return {"status": "ok"}
89-
90-
return bp

0 commit comments

Comments
 (0)