connectbase-client 3.30.0 → 3.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,60 @@
3
3
  본 SDK 의 모든 주요 변경사항을 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/) 형식으로 기록합니다.
4
4
  버전은 [Semantic Versioning](https://semver.org/lang/ko/) 을 따릅니다.
5
5
 
6
+ ## [3.32.0] - 2026-06-09
7
+
8
+ ### Fixed — `/v1/public/*` 요청에 무관한 콘솔 쿠키 첨부로 인한 401 / CORS 붕괴
9
+
10
+ `*.web.connectbase.world` 같은 ConnectBase 서브도메인에 배포된 앱에서, **ConnectBase 콘솔에
11
+ 로그인된 브라우저**로 그 사이트를 보면 public API 호출(AI 챗 스트림, 함수 invoke, 테이블 조회,
12
+ 에러 트래커 배치)이 전부 401 로 실패하던 회귀를 차단한다 (platform-issue 019ea60d).
13
+
14
+ - **근본 원인**: SDK 의 모든 fetch 가 `credentials:'include'` 로 나갔다. 앱이 ConnectBase
15
+ 서브도메인에 있으면 브라우저가 부모 도메인 `.connectbase.world` 의 **무관한 콘솔 세션 쿠키**까지
16
+ 자동 첨부한다. publicKey(`X-Public-Key`)로 인증하는 `/v1/public/*` 엔드포인트에 그 콘솔 User
17
+ JWT 쿠키가 붙으면 401 이 나고, credentialed 요청에 `Access-Control-Allow-Origin: *` 가 충돌해
18
+ 브라우저가 응답 읽기까지 CORS 로 차단됐다. `autoRestoreSession:false` 로도 회피 불가(쿠키 첨부는
19
+ 브라우저 동작이라 앱 코드로 못 막음).
20
+ - **변경**: `/v1/public/*` 요청은 `credentials:'omit'` 으로 보내 쿠키 자체를 첨부하지 않는다.
21
+ 이 엔드포인트들은 헤더로만 인증하므로 쿠키가 불필요하다. 멤버 세션을 발급/회전하는
22
+ `/v1/auth/*`(re-issue 등)는 HttpOnly refresh cookie 가 필요하므로 `'include'` 를 유지한다.
23
+
24
+ > 이미 배포된 앱도 npm `latest` / CDN UMD 번들 갱신 시 코드 수정 없이 복구됩니다.
25
+
26
+ ### Added — `AIChatRequest.toolResultMaxChars` / `mcpPublicKey` 노출
27
+
28
+ 게이트웨이는 지원하지만 SDK 타입에 빠져 있던 두 `chat`/`chatStream` 파라미터를 노출한다.
29
+
30
+ - **`toolResultMaxChars?: number`**: 서버측 도구 그룹 실행(`toolGroupId`)에서 각 도구 결과를 모델에
31
+ **재투입하기 전** N 자(rune)로 잘라낸다(표시값 `tool_end.result` 는 원문 유지). 거대한 도구
32
+ 결과(예: `browser_snapshot`)가 컨텍스트를 부풀려 prefill 지연을 유발할 때 압축용
33
+ (platform-issue 019ea60f, 게이트웨이는 019e8b80 에서 이미 출시됨).
34
+ - **`mcpPublicKey?: string`**: 요청에 포함한 MCP 도구를 호출할 외부 MCP 서버의 Public Key.
35
+
36
+ ## [3.31.0] - 2026-06-05
37
+
38
+ ### Added — OAuth 리다이렉트 콜백 **부팅 자동 소비** 안전망
39
+
40
+ 소셜 로그인(구글 등) 리다이렉트 후 "로그인했는데 자꾸 로그인 페이지로 되돌아오는" 무한 루프를
41
+ SDK 레벨에서 차단한다. 여러 사용자가 동시에 보고한 회귀의 근본 안전망.
42
+
43
+ - **근본 원인**: 리다이렉트 방식은 콜백 URL(`?access_token=&refresh_token=&member_id=`)에서
44
+ 앱이 `cb.oauth.getCallbackResult()` 를 호출해야 토큰이 적재되고 cookie 가 부트스트랩된다.
45
+ 그런데 정적 호스팅(웹 스토리지)은 SPA fallback 으로 `/auth/callback` 같은 경로에 홈
46
+ `index.html` 을 서빙하므로, 앱이 콜백 처리 코드를 빠뜨리면 URL 토큰이 **영영 소비되지 않아**
47
+ 세션이 확립되지 않고 인증 가드가 다시 로그인으로 되돌린다.
48
+ - **변경**: `new ConnectBase()` 생성자가 토큰-in-URL 리다이렉트 콜백(팝업 제외)을 감지하면
49
+ `oauth.consumeRedirectCallbackOnBoot()` 를 boot-restore promise 로 등록해 **자동으로 토큰을
50
+ 적재 + cookie 부트스트랩**한다. 앱이 `getCallbackResult()` 를 호출하지 않아도 세션이 확립된다.
51
+ `prepareHeaders` 가 이 promise 를 await 하므로 첫 `getMe()`(인증 가드 등)가 세션 확립 후 발화.
52
+ - **하위호환·안전성**: 앱이 이후 `getCallbackResult()` 를 호출해도 같은 promise 를 공유해 **이중
53
+ bootstrap/rotation 을 방지**(boot 소비 실패 시에만 직접 적재로 폴백). 팝업(`window.opener`)·
54
+ code-only(`?code=`)·에러(`?error=`) 콜백은 제외 — 기존 동작 유지. `autoRestoreSession: false`
55
+ 면 자동 소비도 끈다. token rotation race(2026-05-16) 없음: 사전 re-issue 없이 URL 토큰을 직접
56
+ 소비(=getCallbackResult 리다이렉트 경로와 동일)하기 때문.
57
+
58
+ > 이미 배포된 앱도 CDN 번들(`connect-base.min.js`) / npm `latest` 갱신 시 코드 수정 없이 복구됩니다.
59
+
6
60
  ## [3.29.0] - 2026-06-02
7
61
 
8
62
  ### Added — `connectbase tunnel --token <고정값>` proxy_token 핀 (platform-issue 019e8623)
package/README.md CHANGED
@@ -1048,9 +1048,12 @@ HTTP response (for example, Discord Interactions requires a `200` with a
1048
1048
  JSON body within 3 seconds):
1049
1049
 
1050
1050
  ```javascript
1051
- export async function handler(event, ctx) {
1052
- // event.method / event.path / event.query / event.headers / event.body
1053
- // are populated for webhook invocations.
1051
+ export async function handler(rawBody, ctx) {
1052
+ // The first arg is the raw request body as a UTF-8 string (parse it yourself:
1053
+ // JSON.parse(rawBody) for JSON, new URLSearchParams(rawBody) for form-encoded).
1054
+ // ctx.method / ctx.path / ctx.query / ctx.headers / ctx.rawBody (Buffer) are
1055
+ // populated for webhook invocations. The first arg is the body itself (a
1056
+ // string), not a request object with a `.body` field.
1054
1057
  return {
1055
1058
  statusCode: 200,
1056
1059
  headers: { 'Content-Type': 'application/json' },