From 91994fa8b9e406c674d5245f2da123608e87046b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 03:07:49 +0000 Subject: [PATCH 01/27] chore(internal): codegen related update --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 3e068d8..99ade34 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "0.0.1" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From 2db5518d6ac525ccd1d753e271f6adcde42398bf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 03:38:40 +0000 Subject: [PATCH 02/27] chore(internal): tweak CI branches --- .github/workflows/ci.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 525c94f..621fd4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,14 @@ name: CI on: push: - branches-ignore: - - 'generated' - - 'codegen/**' - - 'integrated/**' - - 'stl-preview-head/**' - - 'stl-preview-base/**' + branches: + - '**' + - '!integrated/**' + - '!stl-preview-head/**' + - '!stl-preview-base/**' + - '!generated' + - '!codegen/**' + - 'codegen/stl/**' pull_request: branches-ignore: - 'stl-preview-head/**' From d84f8a50545721a86b7ea48a8af34bd588961c54 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:31:17 +0000 Subject: [PATCH 03/27] docs: explain caching --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index 0544b3f..e2d467b 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,27 @@ LIMIT 200; > removed, then PostgreSQL may not [push down the condition](https://wiki.postgresql.org/wiki/Inlining_of_SQL_functions), > causing all pages to be requested and buffered. +## Caching + +Sending requests to the Beeper Desktop API for every SQL query can be slow. Combine [materialized views](https://www.postgresql.org/docs/current/rules-materializedviews.html) with [`pg_cron`](https://github.com/citusdata/pg_cron) for scheduled data pulls: + +```sql +CREATE MATERIALIZED VIEW beeper_desktop_api_messages AS +SELECT * +FROM beeper_desktop_api_messages.search( + account_ids := ARRAY['local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI'], + "limit" := 10, + query := 'deployment' +); + +-- Refresh the view every 4 hours. +SELECT cron.schedule( + 'refresh-beeper-desktop-api-messages', + '0 */4 * * *', + 'REFRESH MATERIALIZED VIEW CONCURRENTLY beeper_desktop_api_messages' +); +``` + ## Troubleshooting ### Installation From 9183ad1d77206204a8650471616d1f97b817f024 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:44:59 +0000 Subject: [PATCH 04/27] chore(internal): support env vars in `./scripts/repl` --- scripts/repl | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/repl b/scripts/repl index 21d1eab..679bf51 100755 --- a/scripts/repl +++ b/scripts/repl @@ -1,5 +1,10 @@ #!/usr/bin/env bash +if [ -z "$BEEPER_ACCESS_TOKEN" ]; then + echo 'ERROR: BEEPER_ACCESS_TOKEN environment variable is required but not set' + exit 1 +fi + echo "==> Detecting PostgreSQL Python executable" PYTHON_EXECUTABLE_PATH=$(pg_config --configure | grep -o "PYTHON=[^ ]*" | cut -d= -f2 | tr -d "'") echo "PostgreSQL uses Python $PYTHON_EXECUTABLE_PATH" @@ -29,8 +34,8 @@ if [ "$PG_MAJOR_VERSION" -ge 18 ]; then done POSTGRES_CONFIG=(-c extension_control_path="$(realpath temp/install/share/postgresql)") else - # In PostgreSQL <18 we cannot point `postgres` to our local extensions directory. So we install directly to - # the system. + # In PostgreSQL <18 we cannot point `postgres` to our local extensions directory. So we install + # directly to the system. sudo make install PG_CONFIG="$(command -v pg_config)" fi @@ -61,10 +66,15 @@ done echo "==> Running setup.sql" psql -d postgres -f test/sql/create_extension.sql +psql -d postgres --variable "value='$BEEPER_ACCESS_TOKEN'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.beeper_access_token = :value;' +if [ -n "$BEEPER_DESKTOP_BASE_URL" ]; then + psql -d postgres --variable "value='$BEEPER_DESKTOP_BASE_URL'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.base_url = :value;' +fi + if command -v pgcli &>/dev/null; then echo "==> Starting pgcli REPL" pgcli postgres else echo "==> Starting psql REPL (TIP: Install pgcli for better autocomplete!)" psql -d postgres -fi +fi \ No newline at end of file From ca3c264cee5d12947269f7fc6f919eb8db071c9b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 02:09:59 +0000 Subject: [PATCH 05/27] refactor(tests): switch from prism to steady --- scripts/mock | 26 +++++++++++++------------- scripts/test | 16 ++++++++-------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/scripts/mock b/scripts/mock index bcf3b39..00b490b 100755 --- a/scripts/mock +++ b/scripts/mock @@ -19,34 +19,34 @@ fi echo "==> Starting mock server with URL ${URL}" -# Run prism mock on the given spec +# Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism --version + npm exec --package=@stdy/cli@0.19.3 -- steady --version - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log & + npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" &> .stdy.log & - # Wait for server to come online (max 30s) + # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" attempts=0 - while ! grep -q "✖ fatal\|Prism is listening" ".prism.log" ; do + while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do + if ! kill -0 $! 2>/dev/null; then + echo + cat .stdy.log + exit 1 + fi attempts=$((attempts + 1)) if [ "$attempts" -ge 300 ]; then echo - echo "Timed out waiting for Prism server to start" - cat .prism.log + echo "Timed out waiting for Steady server to start" + cat .stdy.log exit 1 fi echo -n "." sleep 0.1 done - if grep -q "✖ fatal" ".prism.log"; then - cat .prism.log - exit 1 - fi - echo else - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" + npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 8b23b9c..3e62240 100755 --- a/scripts/test +++ b/scripts/test @@ -9,8 +9,8 @@ GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color -function prism_is_running() { - curl --silent "http://localhost:4010" >/dev/null 2>&1 +function steady_is_running() { + curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 } kill_server_on_port() { @@ -25,7 +25,7 @@ function is_overriding_api_base_url() { [ -n "$TEST_API_BASE_URL" ] } -if ! is_overriding_api_base_url && ! prism_is_running ; then +if ! is_overriding_api_base_url && ! steady_is_running ; then # When we exit this script, make sure to kill the background mock server process trap 'kill_server_on_port 4010' EXIT @@ -36,19 +36,19 @@ fi if is_overriding_api_base_url ; then echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}" echo -elif ! prism_is_running ; then - echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Prism server" +elif ! steady_is_running ; then + echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Steady server" echo -e "running against your OpenAPI spec." echo echo -e "To run the server, pass in the path or url of your OpenAPI" - echo -e "spec to the prism command:" + echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock path/to/your.openapi.yml${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets${NC}" echo exit 1 else - echo -e "${GREEN}✔ Mock prism server is running with your OpenAPI spec${NC}" + echo -e "${GREEN}✔ Mock steady server is running with your OpenAPI spec${NC}" echo fi From fe76f5e4d60950521215581557cd0453720d7a71 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 02:11:15 +0000 Subject: [PATCH 06/27] chore(tests): bump steady to v0.19.4 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 00b490b..f310477 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.3 -- steady --version + npm exec --package=@stdy/cli@0.19.4 -- steady --version - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 3e62240..18b5b0f 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 71cbd2c8566c6c466557c8ee7209f6710687cf1a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 02:18:35 +0000 Subject: [PATCH 07/27] chore(tests): bump steady to v0.19.5 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index f310477..54fc791 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.4 -- steady --version + npm exec --package=@stdy/cli@0.19.5 -- steady --version - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 18b5b0f..d958b6d 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 998e1de2a033f9cb44326e681eadc5cbd25d862b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 02:09:45 +0000 Subject: [PATCH 08/27] chore(internal): update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index eb81fc6..f395f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .prism.log +.stdy.log .venv temp/ regress/ From 827b6a2c9d2f7db42f469a86f207318e1441a46a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 02:16:44 +0000 Subject: [PATCH 09/27] chore(tests): bump steady to v0.19.6 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 54fc791..0f82c95 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.5 -- steady --version + npm exec --package=@stdy/cli@0.19.6 -- steady --version - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index d958b6d..455f0ac 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.6 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From be70621335ade7130eedb59982ff75f36c3ce75a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:06:09 +0000 Subject: [PATCH 10/27] chore(tests): bump steady to v0.19.7 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 0f82c95..3732f8e 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.6 -- steady --version + npm exec --package=@stdy/cli@0.19.7 -- steady --version - npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 455f0ac..b14f997 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.6 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 71dc9866112525943eb11a430cf2505236cc3f46 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:25:12 +0000 Subject: [PATCH 11/27] chore: update SDK settings --- .stats.yml | 2 +- README.md | 4 ++-- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2b39be6..60bb453 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-5a8ac7b545c48dc892e5c680303e305254921554dabee848e40a808659dbcf1e.yml openapi_spec_hash: 0103975601aac1445d3a4ef418c5d17a -config_hash: ca148af6be59ec54295b2c5f852a38d1 +config_hash: e342a96262eaf44c54e8bbb93cc8d7a7 diff --git a/README.md b/README.md index e2d467b..edcfb1d 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ CREATE EXTENSION beeper_desktop_api; And install the Python SDK dependency: ```sh -# install from the production repo -pip install git+ssh://git@github.com/beeper/desktop-api-python.git +# install from PyPI +pip install beeper_desktop_api ``` See [`./scripts/test`](./scripts/test) how to use a [Python virtual environment](https://docs.python.org/3/library/sys_path_init.html#sys-path-init-virtual-environments) if you prefer that instead. diff --git a/pyproject.toml b/pyproject.toml index 274d004..026d2f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,5 +3,5 @@ name = "beeper_desktop_api-sql" version = "0.0.0" requires-python = ">=3.9.18" dependencies = [ - "beeper_desktop_api @ https://github.com/beeper/desktop-api-python.git", + "beeper_desktop_api", ] \ No newline at end of file From 0a9073f46d93db4a40065df2d4dbe7251e904619 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:26:04 +0000 Subject: [PATCH 12/27] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 60bb453..16d5bba 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-5a8ac7b545c48dc892e5c680303e305254921554dabee848e40a808659dbcf1e.yml openapi_spec_hash: 0103975601aac1445d3a4ef418c5d17a -config_hash: e342a96262eaf44c54e8bbb93cc8d7a7 +config_hash: f99f904573839260bdb6d428bad17613 From 2d3e14836a55109b02bc1ee46ce0a62cfd37c865 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:26:32 +0000 Subject: [PATCH 13/27] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 16d5bba..2c47924 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-5a8ac7b545c48dc892e5c680303e305254921554dabee848e40a808659dbcf1e.yml openapi_spec_hash: 0103975601aac1445d3a4ef418c5d17a -config_hash: f99f904573839260bdb6d428bad17613 +config_hash: 7d85c0b454fc78a59db6474c5c4d73c6 From 0af81d8b40c42ae06bac4d2ee9d9bcf5fb887641 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:09:47 +0000 Subject: [PATCH 14/27] chore(internal): update multipart form array serialization --- scripts/mock | 4 ++-- scripts/test | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/mock b/scripts/mock index 3732f8e..58e4628 100755 --- a/scripts/mock +++ b/scripts/mock @@ -24,7 +24,7 @@ if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout npm exec --package=@stdy/cli@0.19.7 -- steady --version - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index b14f997..be740ad 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 From 1c1334345f7df0ab235018431f6f64026db45332 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 02:18:10 +0000 Subject: [PATCH 15/27] chore(tests): bump steady to v0.20.1 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 58e4628..5ea72a2 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.7 -- steady --version + npm exec --package=@stdy/cli@0.20.1 -- steady --version - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.20.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.20.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index be740ad..d6a8909 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 From 60ca0242076c462be6e9da54a39b1138a56b9732 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 02:22:43 +0000 Subject: [PATCH 16/27] chore(tests): bump steady to v0.20.2 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 5ea72a2..7c58865 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.20.1 -- steady --version + npm exec --package=@stdy/cli@0.20.2 -- steady --version - npm exec --package=@stdy/cli@0.20.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.20.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index d6a8909..6524d14 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.2 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 From 41e28294a7fcad3839ea2d3c5c3b48061774776f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:32:00 +0000 Subject: [PATCH 17/27] feat(api): add network, bridge fields to accounts --- .stats.yml | 6 +- META.json | 1 - README.md | 16 ++--- pyproject.toml | 2 +- sql/_beeper_desktop_api.sql | 4 +- sql/beeper_desktop_api_accounts.sql | 27 ++++++- sql/beeper_desktop_api_chats.sql | 82 ++++++++++++---------- test/sql/beeper_desktop_api_chats_test.sql | 2 +- 8 files changed, 81 insertions(+), 59 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2c47924..229f6b5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-5a8ac7b545c48dc892e5c680303e305254921554dabee848e40a808659dbcf1e.yml -openapi_spec_hash: 0103975601aac1445d3a4ef418c5d17a -config_hash: 7d85c0b454fc78a59db6474c5c4d73c6 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml +openapi_spec_hash: d6c0a1776048dab04f6c5625c9893c9c +config_hash: 39ed0717b5f415499aaace2468346e1a diff --git a/META.json b/META.json index ba92e1b..9311557 100644 --- a/META.json +++ b/META.json @@ -10,7 +10,6 @@ "version": "0.0.1", "release_status": "testing", "maintainer": "Beeper Desktop ", - "generated_by": "Stainless (https://stainless.com)", "license": "mit", "resources": { "homepage": "https://developers.beeper.com/desktop-api/", diff --git a/README.md b/README.md index edcfb1d..24848ab 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ The Beeper Desktop API PostgreSQL Extension provides convenient access to the [Beeper Desktop REST API](https://developers.beeper.com/desktop-api/) from PostgreSQL. -It is generated with [Stainless](https://www.stainless.com/). - The REST API documentation can be found on [developers.beeper.com](https://developers.beeper.com/desktop-api/). ## Installation @@ -39,8 +37,8 @@ CREATE EXTENSION beeper_desktop_api; And install the Python SDK dependency: ```sh -# install from PyPI -pip install beeper_desktop_api +# install from the production repo +pip install git+ssh://git@github.com/beeper/desktop-api-python.git ``` See [`./scripts/test`](./scripts/test) how to use a [Python virtual environment](https://docs.python.org/3/library/sys_path_init.html#sys-path-init-virtual-environments) if you prefer that instead. @@ -89,15 +87,11 @@ See this table for the available configuration parameters: To send a request to the Beeper Desktop API, call the relevant SQL function with values corresponding to the parameter types and `SELECT` the columns you need from the returned rows. -To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.create_params_user` may be constructed like so: +To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats_reminders.create_params_reminder` may be constructed like so: ```sql -beeper_desktop_api_chats.make_create_params_user( - id := 'id', - email := 'email', - fullName := 'fullName', - phoneNumber := 'phoneNumber', - username := 'username' +beeper_desktop_api_chats_reminders.make_create_params_reminder( + remindAtMs := 0, dismissOnIncomingMessage := TRUE ) ``` diff --git a/pyproject.toml b/pyproject.toml index 026d2f1..274d004 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,5 +3,5 @@ name = "beeper_desktop_api-sql" version = "0.0.0" requires-python = ">=3.9.18" dependencies = [ - "beeper_desktop_api", + "beeper_desktop_api @ https://github.com/beeper/desktop-api-python.git", ] \ No newline at end of file diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 1e703eb..57b523f 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -122,6 +122,7 @@ CREATE TYPE beeper_desktop_api.client_search_response_result_message AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_accounts; CREATE TYPE beeper_desktop_api_accounts.account AS (); +CREATE TYPE beeper_desktop_api_accounts.account_bridge AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_accounts_contacts; @@ -134,7 +135,8 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response_participant AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_user AS (); +CREATE TYPE beeper_desktop_api_chats.create_params_param AS (); +CREATE TYPE beeper_desktop_api_chats.create_params_param_create_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_accounts.sql b/sql/beeper_desktop_api_accounts.sql index 34100ee..de30423 100644 --- a/sql/beeper_desktop_api_accounts.sql +++ b/sql/beeper_desktop_api_accounts.sql @@ -1,14 +1,35 @@ ALTER TYPE beeper_desktop_api_accounts.account - ADD ATTRIBUTE accountID TEXT, ADD ATTRIBUTE "user" beeper_desktop_api.user; + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE bridge beeper_desktop_api_accounts.account_bridge, + ADD ATTRIBUTE network TEXT, + ADD ATTRIBUTE "user" beeper_desktop_api.user; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account( - accountID TEXT, "user" beeper_desktop_api.user + accountID TEXT, + bridge beeper_desktop_api_accounts.account_bridge, + network TEXT, + "user" beeper_desktop_api.user ) RETURNS beeper_desktop_api_accounts.account LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(accountID, "user")::beeper_desktop_api_accounts.account; + SELECT ROW( + accountID, bridge, network, "user" + )::beeper_desktop_api_accounts.account; +$$; + +ALTER TYPE beeper_desktop_api_accounts.account_bridge + ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE provider TEXT, ADD ATTRIBUTE type TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account_bridge( + id TEXT, provider TEXT, type TEXT +) +RETURNS beeper_desktop_api_accounts.account_bridge +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(id, provider, type)::beeper_desktop_api_accounts.account_bridge; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts._list() diff --git a/sql/beeper_desktop_api_chats.sql b/sql/beeper_desktop_api_chats.sql index f7e06b8..adafbbc 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,38 +142,67 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_user +ALTER TYPE beeper_desktop_api_chats.create_params_param + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE mode TEXT, + ADD ATTRIBUTE "user" beeper_desktop_api_chats.create_params_param_create_params_user, + ADD ATTRIBUTE allowInvite BOOLEAN, + ADD ATTRIBUTE messageText TEXT, + ADD ATTRIBUTE participantIDs TEXT[], + ADD ATTRIBUTE type TEXT, + ADD ATTRIBUTE title TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param( + accountID TEXT, + mode TEXT DEFAULT NULL, + "user" beeper_desktop_api_chats.create_params_param_create_params_user DEFAULT NULL, + allowInvite BOOLEAN DEFAULT NULL, + messageText TEXT DEFAULT NULL, + participantIDs TEXT[] DEFAULT NULL, + type TEXT DEFAULT NULL, + title TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.create_params_param +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + accountID, + mode, + "user", + allowInvite, + messageText, + participantIDs, + type, + title + )::beeper_desktop_api_chats.create_params_param; +$$; + +ALTER TYPE beeper_desktop_api_chats.create_params_param_create_params_user ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE email TEXT, ADD ATTRIBUTE fullName TEXT, ADD ATTRIBUTE phoneNumber TEXT, ADD ATTRIBUTE username TEXT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_user( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param_create_params_user( id TEXT DEFAULT NULL, email TEXT DEFAULT NULL, fullName TEXT DEFAULT NULL, phoneNumber TEXT DEFAULT NULL, username TEXT DEFAULT NULL ) -RETURNS beeper_desktop_api_chats.create_params_user +RETURNS beeper_desktop_api_chats.create_params_param_create_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_user; + )::beeper_desktop_api_chats.create_params_param_create_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( - account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, - message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + params beeper_desktop_api_chats.create_params_param DEFAULT NULL ) RETURNS JSONB LANGUAGE plpython3u @@ -181,14 +210,7 @@ AS $$ from beeper_desktop_api._types import not_given response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.create( - account_id=account_id, - allow_invite=not_given if allow_invite is None else allow_invite, - message_text=not_given if message_text is None else message_text, - mode=not_given if mode is None else mode, - participant_ids=not_given if participant_ids is None else participant_ids, - title=not_given if title is None else title, - type=not_given if type is None else type, - user=not_given if user is None else GD["__beeper_desktop_api_context__"].strip_none(user), + params=not_given if params is None else GD["__beeper_desktop_api_context__"].strip_none(params), ) # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted @@ -198,14 +220,7 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( - account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, - message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + params beeper_desktop_api_chats.create_params_param DEFAULT NULL ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -214,16 +229,7 @@ AS $$ PERFORM beeper_desktop_api_internal.ensure_context(); RETURN jsonb_populate_record( NULL::beeper_desktop_api_chats.chat_create_response, - beeper_desktop_api_chats._create( - account_id, - allow_invite, - message_text, - mode, - participant_ids, - title, - type, - "user" - ) + beeper_desktop_api_chats._create(params) ); END; $$; diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index c46c02e..6f1a5cd 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -2,7 +2,7 @@ SET datestyle = 'ISO'; SET beeper_desktop_api.beeper_access_token = 'My Access Token'; SELECT * -FROM beeper_desktop_api_chats.create(account_id := 'accountID'); +FROM beeper_desktop_api_chats.create(); SELECT * FROM beeper_desktop_api_chats.retrieve( From ad561c97cdcae8a56ac67bd285e4a4c74f34ac09 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 02:34:50 +0000 Subject: [PATCH 18/27] chore(tests): bump steady to v0.22.1 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 7c58865..9c7c439 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.20.2 -- steady --version + npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 6524d14..dc681e7 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.2 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 From d1ebc75c6cdaf3421824fc57f4ec85cba613c944 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 02:07:58 +0000 Subject: [PATCH 19/27] feat: support setting headers via env --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 99ade34..3e068d8 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "4.3.0" +version = "0.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From 836fc2121e4d8bdc5116b39acac969c20a4af775 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 03:57:52 +0000 Subject: [PATCH 20/27] chore(internal): codegen related update --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 3e068d8..99ade34 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "0.0.1" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From b6260e27f503eb7256fd805a5bc6dc5ee66a2fac Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:51:00 +0000 Subject: [PATCH 21/27] Update Desktop API Stainless config and OpenAPI spec --- .stats.yml | 4 +- README.md | 22 +++-- scripts/repl | 6 +- sql/_beeper_desktop_api.sql | 9 +- sql/beeper_desktop_api_accounts.sql | 10 +-- sql/beeper_desktop_api_assets.sql | 15 +++- sql/beeper_desktop_api_chats.sql | 82 +++++++++---------- sql/beeper_desktop_api_messages.sql | 4 +- ...per_desktop_api_accounts_contacts_test.sql | 2 +- test/sql/beeper_desktop_api_accounts_test.sql | 2 +- test/sql/beeper_desktop_api_assets_test.sql | 2 +- ...ktop_api_chats_messages_reactions_test.sql | 2 +- ...eeper_desktop_api_chats_reminders_test.sql | 2 +- test/sql/beeper_desktop_api_chats_test.sql | 4 +- test/sql/beeper_desktop_api_info_test.sql | 2 +- test/sql/beeper_desktop_api_messages_test.sql | 2 +- test/sql/beeper_desktop_api_test.sql | 2 +- 17 files changed, 88 insertions(+), 84 deletions(-) diff --git a/.stats.yml b/.stats.yml index 229f6b5..e925f68 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: d6c0a1776048dab04f6c5625c9893c9c -config_hash: 39ed0717b5f415499aaace2468346e1a +openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef +config_hash: 05ebdec072113f63395372504da98192 diff --git a/README.md b/README.md index 24848ab..faa6bc0 100644 --- a/README.md +++ b/README.md @@ -68,30 +68,34 @@ FROM beeper_desktop_api_chats.search( Configure the client by setting configuration parameters at the database level: ```sql -ALTER DATABASE my_database SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +ALTER DATABASE my_database SET beeper_desktop_api.access_token = 'My Access Token'; ``` > [!NOTE] > > `ALTER DATABASE` persistently alters the database, but doesn't take effect until the next session. To -> ephemerally modify the current session, use `SET beeper_desktop_api.beeper_access_token TO 'My Access Token';`. +> ephemerally modify the current session, use `SET beeper_desktop_api.access_token TO 'My Access Token';`. See this table for the available configuration parameters: -| Parameter | Required | Default value | -| ---------------------------------------- | -------- | -------------------------- | -| `beeper_desktop_api.beeper_access_token` | true | - | -| `beeper_desktop_api.base_url` | false | `'http://localhost:23373'` | +| Parameter | Required | Default value | +| --------------------------------- | -------- | -------------------------- | +| `beeper_desktop_api.access_token` | true | - | +| `beeper_desktop_api.base_url` | false | `'http://localhost:23373'` | ## Requests and responses To send a request to the Beeper Desktop API, call the relevant SQL function with values corresponding to the parameter types and `SELECT` the columns you need from the returned rows. -To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats_reminders.create_params_reminder` may be constructed like so: +To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.create_params_user` may be constructed like so: ```sql -beeper_desktop_api_chats_reminders.make_create_params_reminder( - remindAtMs := 0, dismissOnIncomingMessage := TRUE +beeper_desktop_api_chats.make_create_params_user( + id := 'id', + email := 'email', + fullName := 'fullName', + phoneNumber := 'phoneNumber', + username := 'username' ) ``` diff --git a/scripts/repl b/scripts/repl index 679bf51..30588b5 100755 --- a/scripts/repl +++ b/scripts/repl @@ -66,9 +66,9 @@ done echo "==> Running setup.sql" psql -d postgres -f test/sql/create_extension.sql -psql -d postgres --variable "value='$BEEPER_ACCESS_TOKEN'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.beeper_access_token = :value;' -if [ -n "$BEEPER_DESKTOP_BASE_URL" ]; then - psql -d postgres --variable "value='$BEEPER_DESKTOP_BASE_URL'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.base_url = :value;' +psql -d postgres --variable "value='$BEEPER_ACCESS_TOKEN'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.access_token = :value;' +if [ -n "$BEEPER_BASE_URL" ]; then + psql -d postgres --variable "value='$BEEPER_BASE_URL'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.base_url = :value;' fi if command -v pgcli &>/dev/null; then diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 57b523f..545b6c6 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -72,12 +72,12 @@ AS $$ # This configuration parameter was not set, but it's optional so ignore the exception. pass try: - value = plpy.execute("SELECT current_setting('beeper_desktop_api.beeper_access_token') AS value")[0]['value'] + value = plpy.execute("SELECT current_setting('beeper_desktop_api.access_token') AS value")[0]['value'] client_options["access_token"] = value except Exception: plpy.warning( - "Required DB config parameter 'beeper_desktop_api.beeper_access_token' is not set", - hint="ALTER DATABASE my_database SET beeper_desktop_api.beeper_access_token = ...;" + "Required DB config parameter 'beeper_desktop_api.access_token' is not set", + hint="ALTER DATABASE my_database SET beeper_desktop_api.access_token = ...;" ) def strip_none(value): @@ -135,8 +135,7 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response_participant AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_param AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_param_create_params_user AS (); +CREATE TYPE beeper_desktop_api_chats.create_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_accounts.sql b/sql/beeper_desktop_api_accounts.sql index de30423..5dc05ec 100644 --- a/sql/beeper_desktop_api_accounts.sql +++ b/sql/beeper_desktop_api_accounts.sql @@ -1,21 +1,21 @@ ALTER TYPE beeper_desktop_api_accounts.account ADD ATTRIBUTE accountID TEXT, ADD ATTRIBUTE bridge beeper_desktop_api_accounts.account_bridge, - ADD ATTRIBUTE network TEXT, - ADD ATTRIBUTE "user" beeper_desktop_api.user; + ADD ATTRIBUTE "user" beeper_desktop_api.user, + ADD ATTRIBUTE network TEXT; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account( accountID TEXT, bridge beeper_desktop_api_accounts.account_bridge, - network TEXT, - "user" beeper_desktop_api.user + "user" beeper_desktop_api.user, + network TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_accounts.account LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - accountID, bridge, network, "user" + accountID, bridge, "user", network )::beeper_desktop_api_accounts.account; $$; diff --git a/sql/beeper_desktop_api_assets.sql b/sql/beeper_desktop_api_assets.sql index 3e5ed45..8ed4508 100644 --- a/sql/beeper_desktop_api_assets.sql +++ b/sql/beeper_desktop_api_assets.sql @@ -117,23 +117,30 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets._serve(url TEXT) -RETURNS VOID +RETURNS JSONB LANGUAGE plpython3u STABLE AS $$ - GD["__beeper_desktop_api_context__"].client.assets.serve( + response = GD["__beeper_desktop_api_context__"].client.assets.with_raw_response.serve( url=url, ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets.serve(url TEXT) -RETURNS VOID +RETURNS BYTEA LANGUAGE plpgsql STABLE AS $$ BEGIN PERFORM beeper_desktop_api_internal.ensure_context(); - PERFORM beeper_desktop_api_assets._serve(url); + RETURN jsonb_populate_record( + NULL::BYTEA, beeper_desktop_api_assets._serve(url) + ); END; $$; diff --git a/sql/beeper_desktop_api_chats.sql b/sql/beeper_desktop_api_chats.sql index adafbbc..f7e06b8 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,67 +142,38 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_param - ADD ATTRIBUTE accountID TEXT, - ADD ATTRIBUTE mode TEXT, - ADD ATTRIBUTE "user" beeper_desktop_api_chats.create_params_param_create_params_user, - ADD ATTRIBUTE allowInvite BOOLEAN, - ADD ATTRIBUTE messageText TEXT, - ADD ATTRIBUTE participantIDs TEXT[], - ADD ATTRIBUTE type TEXT, - ADD ATTRIBUTE title TEXT; - -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param( - accountID TEXT, - mode TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_param_create_params_user DEFAULT NULL, - allowInvite BOOLEAN DEFAULT NULL, - messageText TEXT DEFAULT NULL, - participantIDs TEXT[] DEFAULT NULL, - type TEXT DEFAULT NULL, - title TEXT DEFAULT NULL -) -RETURNS beeper_desktop_api_chats.create_params_param -LANGUAGE SQL -IMMUTABLE -AS $$ - SELECT ROW( - accountID, - mode, - "user", - allowInvite, - messageText, - participantIDs, - type, - title - )::beeper_desktop_api_chats.create_params_param; -$$; - -ALTER TYPE beeper_desktop_api_chats.create_params_param_create_params_user +ALTER TYPE beeper_desktop_api_chats.create_params_user ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE email TEXT, ADD ATTRIBUTE fullName TEXT, ADD ATTRIBUTE phoneNumber TEXT, ADD ATTRIBUTE username TEXT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param_create_params_user( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_user( id TEXT DEFAULT NULL, email TEXT DEFAULT NULL, fullName TEXT DEFAULT NULL, phoneNumber TEXT DEFAULT NULL, username TEXT DEFAULT NULL ) -RETURNS beeper_desktop_api_chats.create_params_param_create_params_user +RETURNS beeper_desktop_api_chats.create_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_param_create_params_user; + )::beeper_desktop_api_chats.create_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( - params beeper_desktop_api_chats.create_params_param DEFAULT NULL + account_id TEXT, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL, + mode TEXT DEFAULT NULL, + participant_ids TEXT[] DEFAULT NULL, + title TEXT DEFAULT NULL, + type TEXT DEFAULT NULL, + "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL ) RETURNS JSONB LANGUAGE plpython3u @@ -210,7 +181,14 @@ AS $$ from beeper_desktop_api._types import not_given response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.create( - params=not_given if params is None else GD["__beeper_desktop_api_context__"].strip_none(params), + account_id=account_id, + allow_invite=not_given if allow_invite is None else allow_invite, + message_text=not_given if message_text is None else message_text, + mode=not_given if mode is None else mode, + participant_ids=not_given if participant_ids is None else participant_ids, + title=not_given if title is None else title, + type=not_given if type is None else type, + user=not_given if user is None else GD["__beeper_desktop_api_context__"].strip_none(user), ) # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted @@ -220,7 +198,14 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( - params beeper_desktop_api_chats.create_params_param DEFAULT NULL + account_id TEXT, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL, + mode TEXT DEFAULT NULL, + participant_ids TEXT[] DEFAULT NULL, + title TEXT DEFAULT NULL, + type TEXT DEFAULT NULL, + "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -229,7 +214,16 @@ AS $$ PERFORM beeper_desktop_api_internal.ensure_context(); RETURN jsonb_populate_record( NULL::beeper_desktop_api_chats.chat_create_response, - beeper_desktop_api_chats._create(params) + beeper_desktop_api_chats._create( + account_id, + allow_invite, + message_text, + mode, + participant_ids, + title, + type, + "user" + ) ); END; $$; diff --git a/sql/beeper_desktop_api_messages.sql b/sql/beeper_desktop_api_messages.sql index 2eae195..36741e6 100644 --- a/sql/beeper_desktop_api_messages.sql +++ b/sql/beeper_desktop_api_messages.sql @@ -161,14 +161,14 @@ STABLE AS $$ import json from beeper_desktop_api.types.shared import Message - from beeper_desktop_api.pagination import SyncCursorSortKey + from beeper_desktop_api.pagination import SyncCursorNoLimit from beeper_desktop_api._models import FinalRequestOptions from pydantic import TypeAdapter from typing import Any page = GD["__beeper_desktop_api_context__"].client._request_api_list( model=Message, - page=SyncCursorSortKey[Message], + page=SyncCursorNoLimit[Message], options=FinalRequestOptions.construct(**json.loads(request_options)) ) next_page_info = page.next_page_info() diff --git a/test/sql/beeper_desktop_api_accounts_contacts_test.sql b/test/sql/beeper_desktop_api_accounts_contacts_test.sql index 3a34024..dc90446 100644 --- a/test/sql/beeper_desktop_api_accounts_contacts_test.sql +++ b/test/sql/beeper_desktop_api_accounts_contacts_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_accounts_contacts.list(account_id := 'accountID') diff --git a/test/sql/beeper_desktop_api_accounts_test.sql b/test/sql/beeper_desktop_api_accounts_test.sql index bee634f..8d462e6 100644 --- a/test/sql/beeper_desktop_api_accounts_test.sql +++ b/test/sql/beeper_desktop_api_accounts_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_accounts.list(); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_assets_test.sql b/test/sql/beeper_desktop_api_assets_test.sql index b246c23..8d16905 100644 --- a/test/sql/beeper_desktop_api_assets_test.sql +++ b/test/sql/beeper_desktop_api_assets_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_assets.download( diff --git a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql index d3f8bee..ce1b811 100644 --- a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql +++ b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_chats_messages_reactions.delete( diff --git a/test/sql/beeper_desktop_api_chats_reminders_test.sql b/test/sql/beeper_desktop_api_chats_reminders_test.sql index db5873b..8a93e16 100644 --- a/test/sql/beeper_desktop_api_chats_reminders_test.sql +++ b/test/sql/beeper_desktop_api_chats_reminders_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_chats_reminders.create( diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index 6f1a5cd..93240c0 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -1,8 +1,8 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * -FROM beeper_desktop_api_chats.create(); +FROM beeper_desktop_api_chats.create(account_id := 'accountID'); SELECT * FROM beeper_desktop_api_chats.retrieve( diff --git a/test/sql/beeper_desktop_api_info_test.sql b/test/sql/beeper_desktop_api_info_test.sql index 5598e10..e37887f 100644 --- a/test/sql/beeper_desktop_api_info_test.sql +++ b/test/sql/beeper_desktop_api_info_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_info.retrieve(); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_messages_test.sql b/test/sql/beeper_desktop_api_messages_test.sql index 0872843..a574bd7 100644 --- a/test/sql/beeper_desktop_api_messages_test.sql +++ b/test/sql/beeper_desktop_api_messages_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_messages.update( diff --git a/test/sql/beeper_desktop_api_test.sql b/test/sql/beeper_desktop_api_test.sql index ddb5b54..05b90fb 100644 --- a/test/sql/beeper_desktop_api_test.sql +++ b/test/sql/beeper_desktop_api_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api.focus(); From 3311a3305591ddad1399cecc7bd133ba8a4fff4b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:53:39 +0000 Subject: [PATCH 22/27] Preserve asset serve SDK compatibility --- .stats.yml | 2 +- sql/beeper_desktop_api_assets.sql | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.stats.yml b/.stats.yml index e925f68..1d3cc36 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef +openapi_spec_hash: 8dff13848934c5b20f3804236e8286d3 config_hash: 05ebdec072113f63395372504da98192 diff --git a/sql/beeper_desktop_api_assets.sql b/sql/beeper_desktop_api_assets.sql index 8ed4508..3e5ed45 100644 --- a/sql/beeper_desktop_api_assets.sql +++ b/sql/beeper_desktop_api_assets.sql @@ -117,30 +117,23 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets._serve(url TEXT) -RETURNS JSONB +RETURNS VOID LANGUAGE plpython3u STABLE AS $$ - response = GD["__beeper_desktop_api_context__"].client.assets.with_raw_response.serve( + GD["__beeper_desktop_api_context__"].client.assets.serve( url=url, ) - - # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted - # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the - # caller later. - return response.text() $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets.serve(url TEXT) -RETURNS BYTEA +RETURNS VOID LANGUAGE plpgsql STABLE AS $$ BEGIN PERFORM beeper_desktop_api_internal.ensure_context(); - RETURN jsonb_populate_record( - NULL::BYTEA, beeper_desktop_api_assets._serve(url) - ); + PERFORM beeper_desktop_api_assets._serve(url); END; $$; From 1f3f4e58f085c06bb6fc9bcf56399f2abf4a3fcd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:54:43 +0000 Subject: [PATCH 23/27] Document asset serve stream response --- .stats.yml | 2 +- sql/beeper_desktop_api_assets.sql | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1d3cc36..e925f68 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: 8dff13848934c5b20f3804236e8286d3 +openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 diff --git a/sql/beeper_desktop_api_assets.sql b/sql/beeper_desktop_api_assets.sql index 3e5ed45..8ed4508 100644 --- a/sql/beeper_desktop_api_assets.sql +++ b/sql/beeper_desktop_api_assets.sql @@ -117,23 +117,30 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets._serve(url TEXT) -RETURNS VOID +RETURNS JSONB LANGUAGE plpython3u STABLE AS $$ - GD["__beeper_desktop_api_context__"].client.assets.serve( + response = GD["__beeper_desktop_api_context__"].client.assets.with_raw_response.serve( url=url, ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets.serve(url TEXT) -RETURNS VOID +RETURNS BYTEA LANGUAGE plpgsql STABLE AS $$ BEGIN PERFORM beeper_desktop_api_internal.ensure_context(); - PERFORM beeper_desktop_api_assets._serve(url); + RETURN jsonb_populate_record( + NULL::BYTEA, beeper_desktop_api_assets._serve(url) + ); END; $$; From c6ba28fad09ca00c1237fa811443eefe664fa342 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 07:53:10 +0000 Subject: [PATCH 24/27] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index e925f68..a2edbe5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-fdefa92da44ff91a34438591d022c182a83d9daf9a28b452556e325c6ef7b3f0.yml openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 From d60a4234aee7bea142a7dac097b93ebf3315b1cc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 03:39:01 +0000 Subject: [PATCH 25/27] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index a2edbe5..ec75571 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 23 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-fdefa92da44ff91a34438591d022c182a83d9daf9a28b452556e325c6ef7b3f0.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-356444646dafe352d3ef7c2e01aedf030197a5519b41cf2c3fd8be2571456b43.yml openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 From 673f0a1de2c331b41c8093c7bf7edcd908b3bcb0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 18:07:15 +0000 Subject: [PATCH 26/27] feat(api): api update --- .stats.yml | 8 +- README.md | 4 +- sql/_beeper_desktop_api.sql | 3 +- sql/beeper_desktop_api_chats.sql | 99 +++++++++++++++------- test/sql/beeper_desktop_api_chats_test.sql | 20 ++++- 5 files changed, 96 insertions(+), 38 deletions(-) diff --git a/.stats.yml b/.stats.yml index ec75571..75ad795 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 23 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-356444646dafe352d3ef7c2e01aedf030197a5519b41cf2c3fd8be2571456b43.yml -openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef -config_hash: 05ebdec072113f63395372504da98192 +configured_endpoints: 24 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-8b89ffbfeb39b4186328fefd81f7dab1d28c786012201feb8035c7f920c4fbae.yml +openapi_spec_hash: de40e013fcc83fa44d5c51ddecb543c0 +config_hash: 08b781db5f1857ed601d1b2f4b6b45d9 diff --git a/README.md b/README.md index faa6bc0..d072a4a 100644 --- a/README.md +++ b/README.md @@ -87,10 +87,10 @@ See this table for the available configuration parameters: To send a request to the Beeper Desktop API, call the relevant SQL function with values corresponding to the parameter types and `SELECT` the columns you need from the returned rows. -To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.create_params_user` may be constructed like so: +To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.start_params_user` may be constructed like so: ```sql -beeper_desktop_api_chats.make_create_params_user( +beeper_desktop_api_chats.make_start_params_user( id := 'id', email := 'email', fullName := 'fullName', diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 545b6c6..adcbe27 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -135,7 +135,8 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response_participant AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_user AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response AS (); +CREATE TYPE beeper_desktop_api_chats.start_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_chats.sql b/sql/beeper_desktop_api_chats.sql index f7e06b8..71cd535 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,38 +142,48 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_user +ALTER TYPE beeper_desktop_api_chats.chat_start_response + ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE status TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response( + chatID TEXT, status TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(chatID, status)::beeper_desktop_api_chats.chat_start_response; +$$; + +ALTER TYPE beeper_desktop_api_chats.start_params_user ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE email TEXT, ADD ATTRIBUTE fullName TEXT, ADD ATTRIBUTE phoneNumber TEXT, ADD ATTRIBUTE username TEXT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_user( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_start_params_user( id TEXT DEFAULT NULL, email TEXT DEFAULT NULL, fullName TEXT DEFAULT NULL, phoneNumber TEXT DEFAULT NULL, username TEXT DEFAULT NULL ) -RETURNS beeper_desktop_api_chats.create_params_user +RETURNS beeper_desktop_api_chats.start_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_user; + )::beeper_desktop_api_chats.start_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, + participant_ids TEXT[], + type TEXT, message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + title TEXT DEFAULT NULL ) RETURNS JSONB LANGUAGE plpython3u @@ -182,13 +192,10 @@ AS $$ response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.create( account_id=account_id, - allow_invite=not_given if allow_invite is None else allow_invite, + participant_ids=participant_ids, + type=type, message_text=not_given if message_text is None else message_text, - mode=not_given if mode is None else mode, - participant_ids=not_given if participant_ids is None else participant_ids, title=not_given if title is None else title, - type=not_given if type is None else type, - user=not_given if user is None else GD["__beeper_desktop_api_context__"].strip_none(user), ) # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted @@ -199,13 +206,10 @@ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, + participant_ids TEXT[], + type TEXT, message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + title TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -215,14 +219,7 @@ AS $$ RETURN jsonb_populate_record( NULL::beeper_desktop_api_chats.chat_create_response, beeper_desktop_api_chats._create( - account_id, - allow_invite, - message_text, - mode, - participant_ids, - title, - type, - "user" + account_id, participant_ids, type, message_text, title ) ); END; @@ -578,4 +575,48 @@ AS $$ WHERE paginated.next_request_options IS NOT NULL ) SELECT (jsonb_populate_recordset(NULL::beeper_desktop_api_chats.chat, data)).* FROM paginated; +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._start( + account_id TEXT, + "user" beeper_desktop_api_chats.start_params_user, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL +) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.start( + account_id=account_id, + user=GD["__beeper_desktop_api_context__"].strip_none(user), + allow_invite=not_given if allow_invite is None else allow_invite, + message_text=not_given if message_text is None else message_text, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.start( + account_id TEXT, + "user" beeper_desktop_api_chats.start_params_user, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat_start_response, + beeper_desktop_api_chats._start( + account_id, "user", allow_invite, message_text + ) + ); + END; $$; \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index 93240c0..cfcfe53 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -2,7 +2,11 @@ SET datestyle = 'ISO'; SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * -FROM beeper_desktop_api_chats.create(account_id := 'accountID'); +FROM beeper_desktop_api_chats.create( + account_id := 'accountID', + participant_ids := ARRAY['string'], + type := 'single' +); SELECT * FROM beeper_desktop_api_chats.retrieve( @@ -20,4 +24,16 @@ FROM beeper_desktop_api_chats.archive( SELECT * FROM beeper_desktop_api_chats.search() -LIMIT 42; \ No newline at end of file +LIMIT 42; + +SELECT * +FROM beeper_desktop_api_chats.start( + account_id := 'accountID', + "user" := beeper_desktop_api_chats.make_start_params_user( + id := 'id', + email := 'email', + fullName := 'fullName', + phoneNumber := 'phoneNumber', + username := 'username' + ) +); \ No newline at end of file From c5de222e3743933103fd110fbcb0da21dac7a7f6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 18:07:43 +0000 Subject: [PATCH 27/27] release: 0.2.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3d2ac0b..10f3091 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0" + ".": "0.2.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f7634d8..08e828d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,43 @@ # Changelog +## 0.2.0 (2026-05-04) + +Full Changelog: [v0.1.0...v0.2.0](https://github.com/beeper/desktop-api-sql/compare/v0.1.0...v0.2.0) + +### Features + +* **api:** add network, bridge fields to accounts ([41e2829](https://github.com/beeper/desktop-api-sql/commit/41e28294a7fcad3839ea2d3c5c3b48061774776f)) +* **api:** api update ([673f0a1](https://github.com/beeper/desktop-api-sql/commit/673f0a1de2c331b41c8093c7bf7edcd908b3bcb0)) +* support setting headers via env ([d1ebc75](https://github.com/beeper/desktop-api-sql/commit/d1ebc75c6cdaf3421824fc57f4ec85cba613c944)) + + +### Chores + +* **internal:** codegen related update ([836fc21](https://github.com/beeper/desktop-api-sql/commit/836fc2121e4d8bdc5116b39acac969c20a4af775)) +* **internal:** codegen related update ([91994fa](https://github.com/beeper/desktop-api-sql/commit/91994fa8b9e406c674d5245f2da123608e87046b)) +* **internal:** support env vars in `./scripts/repl` ([9183ad1](https://github.com/beeper/desktop-api-sql/commit/9183ad1d77206204a8650471616d1f97b817f024)) +* **internal:** tweak CI branches ([2db5518](https://github.com/beeper/desktop-api-sql/commit/2db5518d6ac525ccd1d753e271f6adcde42398bf)) +* **internal:** update gitignore ([998e1de](https://github.com/beeper/desktop-api-sql/commit/998e1de2a033f9cb44326e681eadc5cbd25d862b)) +* **internal:** update multipart form array serialization ([0af81d8](https://github.com/beeper/desktop-api-sql/commit/0af81d8b40c42ae06bac4d2ee9d9bcf5fb887641)) +* **tests:** bump steady to v0.19.4 ([fe76f5e](https://github.com/beeper/desktop-api-sql/commit/fe76f5e4d60950521215581557cd0453720d7a71)) +* **tests:** bump steady to v0.19.5 ([71cbd2c](https://github.com/beeper/desktop-api-sql/commit/71cbd2c8566c6c466557c8ee7209f6710687cf1a)) +* **tests:** bump steady to v0.19.6 ([827b6a2](https://github.com/beeper/desktop-api-sql/commit/827b6a2c9d2f7db42f469a86f207318e1441a46a)) +* **tests:** bump steady to v0.19.7 ([be70621](https://github.com/beeper/desktop-api-sql/commit/be70621335ade7130eedb59982ff75f36c3ce75a)) +* **tests:** bump steady to v0.20.1 ([1c13343](https://github.com/beeper/desktop-api-sql/commit/1c1334345f7df0ab235018431f6f64026db45332)) +* **tests:** bump steady to v0.20.2 ([60ca024](https://github.com/beeper/desktop-api-sql/commit/60ca0242076c462be6e9da54a39b1138a56b9732)) +* **tests:** bump steady to v0.22.1 ([ad561c9](https://github.com/beeper/desktop-api-sql/commit/ad561c97cdcae8a56ac67bd285e4a4c74f34ac09)) +* update SDK settings ([71dc986](https://github.com/beeper/desktop-api-sql/commit/71dc9866112525943eb11a430cf2505236cc3f46)) + + +### Documentation + +* explain caching ([d84f8a5](https://github.com/beeper/desktop-api-sql/commit/d84f8a50545721a86b7ea48a8af34bd588961c54)) + + +### Refactors + +* **tests:** switch from prism to steady ([ca3c264](https://github.com/beeper/desktop-api-sql/commit/ca3c264cee5d12947269f7fc6f919eb8db071c9b)) + ## 0.1.0 (2026-03-13) Full Changelog: [v0.0.1...v0.1.0](https://github.com/beeper/desktop-api-sql/compare/v0.0.1...v0.1.0)