# ಆರ್ಕಿಟೆಕ್ಚರ್

## ಸಿಸ್ಟಮ್‌ನ ಸಮಗ್ರ ನೋಟ

```
iOS app / agent client          -> api.<domain>  -> API Gateway -> Lambda backend -> Postgres
Web app                         -> app.<domain>  -> CloudFront -> SPA
Browser and agent auth          -> auth.<domain> -> API Gateway -> Auth Lambda -> Cognito
Apex fallback                   -> <domain>      -> CloudFront redirect -> app.<domain>
```

## ತತ್ವಗಳು

1. `app`, `api` ಮತ್ತು `auth` ಗಾಗಿ ಪ್ರತ್ಯೇಕ ಸಾರ್ವಜನಿಕ ಡೊಮೇನ್‌ಗಳು
2. Postgres ಡೇಟಾದ ಅಧಿಕೃತ ಮೂಲ
3. iOS ಕ್ಲೈಂಟ್ ಲೋಕಲ್ SQLite ಮತ್ತು ಸಿಂಕ್ ಜೊತೆಗೆ ಆಫ್‌ಲೈನ್-ಫಸ್ಟ್ ಆಗಿದೆ
4. ವೆಬ್ ಆ್ಯಪ್, iOS ಆ್ಯಪ್ ಮತ್ತು ಬಾಹ್ಯ ಏಜೆಂಟ್ ಇಂಟರ್ಫೇಸ್ ಒಂದೇ ಕಾರ್ಯಸ್ಥಳ ಮಾದರಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತವೆ
5. ಬಾಹ್ಯ ಏಜೆಂಟ್‌ಗಳು `GET https://api.nibomo.com/v1/` ನಿಂದ ಆರಂಭಿಸುತ್ತವೆ

## ಬೆಂಬಲಿತ ಕ್ಲೈಂಟ್‌ಗಳು

- `app.nibomo.com` ನಲ್ಲಿ ವೆಬ್ ಆ್ಯಪ್
- ಮುಖ್ಯ ರೆಪೊಸಿಟರಿಯಲ್ಲಿ ಲೋಕಲ್ SQLite ಸ್ಟೋರೇಜ್ ಇರುವ iOS ಆ್ಯಪ್
- Google Play ನಲ್ಲಿ Android ಆ್ಯಪ್
- ಡಿಸ್ಕವರಿ, OTP ಬೂಟ್‌ಸ್ಟ್ರ್ಯಾಪ್ ಮತ್ತು `Authorization: ApiKey` ಮೂಲಕ ಬಾಹ್ಯ ಏಜೆಂಟ್ ಕ್ಲೈಂಟ್‌ಗಳು

## ಡೇಟಾ ಮಾದರಿ

- `workspaces`
- `workspace_members`
- `user_settings`
- `devices`
- `cards`
- `decks`
- `review_events`
- `applied_operations`
- `sync_state`

## ಡೇಟಾ ಹರಿವು

### ವೆಬ್

1. ಬ್ರೌಸರ್ `auth.<domain>` ಮೂಲಕ ಸೈನ್ ಇನ್ ಆಗುತ್ತದೆ.
2. ವೆಬ್ ಆ್ಯಪ್ ಕಾರ್ಯಸ್ಥಳದ ಡೇಟಾವನ್ನು `api.<domain>` ನಿಂದ ಲೋಡ್ ಮಾಡುತ್ತದೆ.
3. AI ಚಾಟ್ ವಿನಂತಿಗಳು `/chat/local-turn` ಮೂಲಕ ಹೋಗುತ್ತವೆ.
4. ಪುನರಾವರ್ತನೆಯ ಸಲ್ಲಿಕೆಗಳು ಬರೆಯುವ ಸಮಯದಲ್ಲೇ ಶೆಡ್ಯೂಲರ್ ಸ್ಥಿತಿಯನ್ನು ನವೀಕರಿಸುತ್ತವೆ.

### iOS

1. iOS ಆ್ಯಪ್ ಮೊದಲು ಲೋಕಲ್ ಆಗಿ SQLite ಗೆ ಬರೆಯುತ್ತದೆ.
2. ಲೋಕಲ್ ಬದಲಾವಣೆಗಳು ಔಟ್‌ಬಾಕ್ಸ್‌ನ ಸರದಿಯಲ್ಲಿ ಸೇರುತ್ತವೆ.
3. ಸಿಂಕ್ ಬದಲಾವಣೆಗಳನ್ನು `/v1/workspaces/{workspaceId}/sync/push` ಮೂಲಕ ಅಪ್‌ಲೋಡ್ ಮಾಡುತ್ತದೆ.
4. ಸಿಂಕ್ ರಿಮೋಟ್ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು `/v1/workspaces/{workspaceId}/sync/pull` ಮೂಲಕ ಡೌನ್‌ಲೋಡ್ ಮಾಡುತ್ತದೆ.
5. ಲೋಕಲ್ ಡೇಟಾಬೇಸ್ ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಿ ಸಿಂಕ್ ಕರ್ಸರ್ ಅನ್ನು ಮುಂದಕ್ಕೆ ಸರಿಸುತ್ತದೆ.

### ಬಾಹ್ಯ ಏಜೆಂಟ್‌ಗಳು

1. ಏಜೆಂಟ್‌ಗಳು `GET /v1/` ನಿಂದ ಆರಂಭಿಸುತ್ತವೆ.
2. OTP ಬೂಟ್‌ಸ್ಟ್ರ್ಯಾಪ್ `auth.<domain>` ನಲ್ಲಿ ನಡೆಯುತ್ತದೆ.
3. ಏಜೆಂಟ್ ದೀರ್ಘಾವಧಿಯ API ಕೀ ಪಡೆಯುತ್ತದೆ.
4. ಏಜೆಂಟ್ `/v1/agent/me` ಲೋಡ್ ಮಾಡುತ್ತದೆ, ಕಾರ್ಯಸ್ಥಳಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡುತ್ತದೆ, ಅಗತ್ಯವಿದ್ದರೆ ಒಂದನ್ನು ಆಯ್ಕೆ ಮಾಡುತ್ತದೆ, ನಂತರ `/v1/agent/sql/query` ಮತ್ತು `/v1/agent/sql/execute` ಬಳಸುತ್ತದೆ.

## ವೇಳಾಪಟ್ಟಿ

Nibomo ಪುನರಾವರ್ತನೆಯ ಶೆಡ್ಯೂಲರ್ ಆಗಿ FSRS ಬಳಸುತ್ತದೆ.

ಅನುಷ್ಠಾನದ ಟಿಪ್ಪಣಿಗಳು:

- ಬ್ಯಾಕೆಂಡ್ ಮತ್ತು iOS ಪರಸ್ಪರ ಹೊಂದಿಕೆಯಾಗುವ FSRS ಅನುಷ್ಠಾನಗಳನ್ನು ಇಟ್ಟುಕೊಳ್ಳುತ್ತವೆ
- ವೆಬ್ ಆ್ಯಪ್ ವೇಳಾಪಟ್ಟಿಯ ಡೇಟಾ ಕಾಂಟ್ರ್ಯಾಕ್ಟ್ ಅನ್ನು ಅನುಸರಿಸುತ್ತದೆ, ಆದರೆ ಶೆಡ್ಯೂಲರ್‌ನ ಮೂರನೇ ಪ್ರತಿಯನ್ನು ಒಳಗೊಂಡಿಲ್ಲ
- ಕಾರ್ಯಸ್ಥಳ ಮಟ್ಟದ ಶೆಡ್ಯೂಲರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಬಯಸಿದ ಸ್ಮರಣ ಪ್ರಮಾಣ, ಕಲಿಕೆಯ ಹಂತಗಳು, ಮರುಕಲಿಕೆಯ ಹಂತಗಳು, ಗರಿಷ್ಠ ಅಂತರ ಮತ್ತು ಯಾದೃಚ್ಛಿಕ ವ್ಯತ್ಯಾಸ ಸೇರಿವೆ
- ಪುನರಾವರ್ತನೆಯ ನಿಜವಾದ ಸಮಯಮುದ್ರೆ `reviewedAtClient` ನಿಂದ ಬರುತ್ತದೆ

ವಿವರವಾದ ಕಾಂಟ್ರ್ಯಾಕ್ಟ್‌ಗಾಗಿ [ಮುಖ್ಯ ರೆಪೊಸಿಟರಿಯಲ್ಲಿರುವ FSRS ವೇಳಾಪಟ್ಟಿ ತರ್ಕ](https://github.com/kirill-markin/flashcards-open-source-app/blob/main/docs/fsrs-scheduling-logic.md) ನೋಡಿ.

## ದೃಢೀಕರಣ

- Cognito ಮೂಲಕ ಇಮೇಲ್ OTP
- ಹೋಸ್ಟ್ ಮಾಡಿದ ವೆಬ್ ಆ್ಯಪ್‌ಗಾಗಿ ಹಂಚಿಕೆಯ ಡೊಮೇನ್‌ನ ಬ್ರೌಸರ್ ಸೆಷನ್ ಕುಕೀಗಳು
- `auth.<domain>` ನಲ್ಲಿ ಏಜೆಂಟ್ OTP ಬೂಟ್‌ಸ್ಟ್ರ್ಯಾಪ್, ಫಲಿತಾಂಶವಾಗಿ ದೀರ್ಘಾವಧಿಯ ApiKey
- ಲೋಕಲ್ ಡೆವಲಪ್‌ಮೆಂಟ್‌ಗಾಗಿ `AUTH_MODE=none`
- ಪ್ರೊಡಕ್ಷನ್‌ನಂತಹ ದೃಢೀಕರಣಕ್ಕಾಗಿ `AUTH_MODE=cognito`

## ಡಿಪ್ಲಾಯ್‌ಮೆಂಟ್ ರಚನೆ

- `app.<domain>` -> CloudFront + S3
- `api.<domain>` -> API Gateway + Lambda ಬ್ಯಾಕೆಂಡ್
- `auth.<domain>` -> API Gateway + Lambda ದೃಢೀಕರಣ ಸೇವೆ
- AWS RDS ನಲ್ಲಿ Postgres

ಮೂಲ ಡೊಮೇನ್ ಪ್ರತ್ಯೇಕ ಮಾರ್ಕೆಟಿಂಗ್ ಸೈಟ್‌ನಲ್ಲೇ ಉಳಿಯಬಹುದು. ಬೂಟ್‌ಸ್ಟ್ರ್ಯಾಪ್ ಸಮಯದಲ್ಲಿ ಅದು ಬಳಕೆಯಲ್ಲಿಲ್ಲದಿದ್ದರೆ, ಇನ್‌ಫ್ರಾಸ್ಟ್ರಕ್ಚರ್ ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ `app.<domain>` ಗೆ ರಿಡೈರೆಕ್ಟ್ ಮಾಡಬಹುದು.

---
*[ಈ ಪುಟದ ಶೈಲಿಯುಕ್ತ HTML ಆವೃತ್ತಿಯನ್ನು ನೋಡಿ](<https://nibomo.com/kn/docs/architecture/>)*

*AI ಏಜೆಂಟ್‌ಗಳು `GET https://api.nibomo.com/v1/` ನಿಂದ ಆರಂಭಿಸಿ ಈ ಸೇವೆಯಲ್ಲಿ ಬಳಕೆದಾರರಿಗೆ ಖಾತೆ ರಚಿಸಬಹುದು. ಸೆಟಪ್ ಆದ ಮೇಲೆ ಅವು `https://mcp.nibomo.com/mcp` ನಲ್ಲಿ MCP ಮೂಲಕವೂ ಸಂಪರ್ಕಿಸಬಹುದು.*

*ಸಲಹೆ: https://nibomo.com ನಲ್ಲಿನ ಯಾವುದೇ URL ಕೊನೆಗೆ `.md` ಸೇರಿಸಿದರೆ ಆ ಪುಟದ ಸ್ವಚ್ಛ Markdown ಆವೃತ್ತಿ ಸಿಗುತ್ತದೆ.*