Compare commits
No files matched your search
@@ -0,0 +1,88 @@
|
|||||||
|
# 更新日志 / Changelog
|
||||||
|
|
||||||
|
本项目按 `v主版本.次版本.修订版本` 标记发布。下列内容以对应 Git tag 和已提交功能为准。
|
||||||
|
|
||||||
|
## v1.14.1 — 2026-09-28
|
||||||
|
|
||||||
|
- 数据库管理器改为每个 ChatGPT 账号首次进入时设置自己的密码,停用旧的共用口令。
|
||||||
|
- 密码以独立盐值和 PBKDF2 摘要保存;可在管理页验证旧密码后修改,修改时注销旧会话。
|
||||||
|
- 增加首次设置、不同账号密码隔离、旧会话失效和修改密码的验证。
|
||||||
|
|
||||||
|
## v1.14.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 新增数据库管理器 App:固定服务器与用户名的登录页、直接操作数据库的确认提示、按表分页浏览及 JSON 增删改查。
|
||||||
|
- 管理操作只作用于当前 ChatGPT 登录用户的记录;口令保存在服务端密钥中,短时会话、失败次数限制、版本冲突检测与写入二次确认保护数据。
|
||||||
|
- 记忆、目标、待办、收藏、档案与设置可在管理器查看;标签由记忆内容维护,旧版备份表不开放直接编辑。
|
||||||
|
|
||||||
|
## v1.13.0 — 2026-09-28
|
||||||
|
|
||||||
|
- D1 新增按记录存储的记忆、标签、目标、待办和收藏表;资料与设置保留 JSON。
|
||||||
|
- 用户首次访问时从旧状态表回填数据,旧表保留为只读迁移来源;浏览器备份格式仍为 Schema v2。
|
||||||
|
- 云同步改为逐条提交与版本校验;跨设备修改同一记录时保存本地冲突副本并让用户选择。旧版整份状态写入接口停止接收写入。
|
||||||
|
- 增加 SQLite 集成验证,覆盖回填、标签更新、删除标记、版本冲突和用户隔离。
|
||||||
|
|
||||||
|
## v1.12.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 目标与待办可在终端逐项创建;记忆、目标、待办可先选择记录,再输入 `yes` 确认删除。
|
||||||
|
- 终端打开时显示欢迎信息,增加日期、时间、会话运行时间、版本、统计和命令历史等常用命令。
|
||||||
|
- 开放 `LifeOS.run()`、`LifeOS.note()` 等浏览器开发者控制台入口,复用终端命令与删除确认;图形界面和终端共用删除操作。
|
||||||
|
|
||||||
|
## v1.11.0 — 2026-09-28
|
||||||
|
|
||||||
|
- `memory add` 增加交互式逐项输入,可依次填写标题、日期、标签、能量、天气、地点、关联待办和正文。
|
||||||
|
- 回车接受默认值,`back` 返回上一步,`cancel` 或 Escape 取消;原有带参数命令仍可用。
|
||||||
|
|
||||||
|
## v1.10.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 增加交互式终端 App:创建和查询记忆、目标与待办,完成或重新开启待办,并打开其他 App。
|
||||||
|
- 支持带引号的标题、选项、命令历史、Tab 补全与多行记忆输入;终端提示提供中文和英文。
|
||||||
|
- 记忆、目标与待办的图形表单与终端共用数据写入入口,沿用现有云同步和备份结构。
|
||||||
|
|
||||||
|
## v1.9.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 增加轻量浏览器 App,默认在 iframe 中打开 Google,支持地址栏搜索、后退、前进与刷新。
|
||||||
|
- 对不允许嵌入的网页提供始终可见的新标签页入口;浏览器入口同步接入桌面、任务栏、快捷键和双语界面。
|
||||||
|
|
||||||
|
## v1.8.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 目标倒计时成为可拖动、可缩放的小部件,位置和尺寸保存在本设备。
|
||||||
|
- 拖动图标及小部件时显示吸附网格;小部件操作柄支持方向键调整。
|
||||||
|
- 增加时钟、今日概览与快捷操作小部件,可在系统设置中分别开关和重置布局。
|
||||||
|
- 小部件布局纳入 JSON 备份与数据重置。
|
||||||
|
|
||||||
|
## v1.7.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 桌面图标可拖动排列并保存格位;可选择显示哪些 App 快捷方式。
|
||||||
|
- 记住本设备的窗口位置、尺寸与打开状态,并可设置开机默认打开的 App。
|
||||||
|
- 新增必应每日图、内置背景及自定义 HTTPS 图片链接的壁纸来源选择。
|
||||||
|
- 窗口布局纳入 JSON 导出;重置数据时同时清除本地布局。
|
||||||
|
|
||||||
|
## v1.6.0 — 2026-09-28
|
||||||
|
|
||||||
|
- 洞察增加周报、月报和周期切换:记录天数及频率、任务与目标完成情况、常见天气、能量记录。
|
||||||
|
- 高光片段来自明确收藏或标记高光的记忆;缺失数据不作推断。
|
||||||
|
|
||||||
|
## v1.5.0–v1.5.8 — 2026-09-27 至 2026-09-28
|
||||||
|
|
||||||
|
- 调整桌面端图标排列和移动端横排布局,支持目标倒计时显示在桌面。
|
||||||
|
- 重构中英文界面文案与自动浏览器语言选择,修复手动切换、启动及缓存导致的多次回归问题。
|
||||||
|
- v1.5.8 将全部必要脚本打包到页面,并增加语言切换和启动校验。
|
||||||
|
|
||||||
|
## v1.4.0–v1.4.3 — 2026-09-27
|
||||||
|
|
||||||
|
- 记忆增加标签、可选地点/场景、收藏与关联任务;时间线支持关键词和标签筛选。
|
||||||
|
- 备份补齐目标与待办,修复云端恢复时本地任务板未合并的问题。
|
||||||
|
- 修复从日历选定日期新增记忆、标题与每日提示混用的问题。
|
||||||
|
|
||||||
|
## v1.3.0 — 2026-09-27
|
||||||
|
|
||||||
|
- 新增日历 App,在月视图和日视图中汇集记忆、任务与目标节点。
|
||||||
|
|
||||||
|
## v1.2.0 — 2026-09-27
|
||||||
|
|
||||||
|
- 新增目标与待办 App,支持截止日期、优先级、完成状态和目标关联。
|
||||||
|
|
||||||
|
## v1.0.0–v1.1.0 — 2026-09-25 至 2026-09-27
|
||||||
|
|
||||||
|
- 建立 Life OS 桌面、记忆、博物馆、档案和系统设置基础功能。
|
||||||
|
- 加入中英文界面、必应每日壁纸代理、记忆搜索与草稿恢复、ChatGPT 登录及 D1 云同步。
|
||||||
@@ -1,72 +1,78 @@
|
|||||||
# Life OS / 人生操作系统
|
# Life OS / 人生操作系统
|
||||||
|
|
||||||
> Your life, running as an operating system.
|
以桌面操作系统为交互方式的个人记录网站。用 App 记录日常、管理目标与待办,并沿时间线回看已经留下的内容。
|
||||||
|
|
||||||
一个以桌面操作系统为交互隐喻、支持 ChatGPT 登录和云端同步的个人记录网站。它不是传统日记本:今天被归档、记忆沿时间线回看、重要片段进入人生博物馆。
|
在线站点:[Life OS](https://life-os-personal-desktop.biss0.chatgpt.site) · 当前应用版本:**v1.14.1** · [更新日志](CHANGELOG.md)
|
||||||
|
|
||||||
## 功能
|
## 功能
|
||||||
|
|
||||||
- **桌面式交互**:桌面图标、任务栏、启动器、多窗口、最小化/最大化/关闭。
|
| App | 用途 |
|
||||||
- **Today**:每日文字记录、情绪天气、1–5 能量等级,以及随机生成的“今日电影”。
|
| --- | --- |
|
||||||
- **Timeline**:按时间轴浏览、编辑和删除记忆。
|
| 今日 | 为选定日期写记忆,记录天气、1–5 能量、标题、标签、地点和关联任务;每日电影是写作提示,不会替代记忆标题。 |
|
||||||
- **Museum**:将重要记忆长期珍藏为馆藏。
|
| 时间线 | 按日期浏览记忆,使用关键词或标签筛选,编辑、删除和收藏。 |
|
||||||
- **Tasks / Goals**:创建目标和待办,关联任务、设置截止日期与优先级,查看今天/即将开始/已完成事项并追踪目标进度。
|
| 博物馆 | 回看收藏的记忆。 |
|
||||||
- **Calendar**:月历查看每天的记忆、待办截止与完成记录,以及目标创建、目标日期和完成节点;可切换到日视图查看当天详情。
|
| 目标与待办 | 创建目标和任务,设置截止日期、优先级和完成状态;目标倒计时可选择显示在桌面。 |
|
||||||
- **Insights / Profile**:查看情绪、能量、连续记录与个人系统状态。
|
| 日历 | 在月视图与日视图中查看记忆、任务和目标节点,并为选定日期新增记忆。 |
|
||||||
- **System**:深浅主题、自动识别浏览器语言(也可固定中文/English)、JSON 导入导出与本地存储说明。
|
| 数据库管理器 | 在再次登录并确认风险后,按表查看、创建、编辑和删除当前账号的云端记录。 |
|
||||||
- **Bing 每日一图**:桌面壁纸每日自动更新;由 Life OS 同源代理读取,避免浏览器跨域限制。
|
| 洞察 | 周报和月报展示记录频率、完成任务数、常见天气、能量记录及收藏或标记高光的记忆;仅依据已保存的数据统计。 |
|
||||||
- **Windows 式操作**:桌面端单击选择、双击打开;右键桌面或 App 图标可使用快捷菜单。
|
| 档案 | 查看记录概况并维护个人资料。 |
|
||||||
- **快捷键与草稿恢复**:`Ctrl / ⌘ + K` 打开启动器,`Ctrl / ⌘ + F` 搜索记忆,`Ctrl / ⌘ + S` 归档 Today;当天未归档文字会自动恢复。
|
| 浏览器 | 在桌面窗口里打开网页或使用 Google 搜索,支持后退、前进、刷新和外部打开。默认打开 Google;第三方网站可能禁止 iframe 嵌入。 |
|
||||||
- **App 快捷键**:`Alt + 6` 打开目标与待办,`Alt + 7` 打开日历,`Alt + 8` 打开 System。
|
| 终端 | 逐项创建记忆、目标与待办;选择并确认删除记录,管理完成状态,查询数据和打开其他 App。 |
|
||||||
- **移动端**:App 以全屏方式打开,保留任务栏恢复入口。
|
| 系统设置 | 选择语言、主题、壁纸、桌面快捷方式和开机 App,管理备份。 |
|
||||||
- **个人云端**:使用 ChatGPT 登录后,数据按账号隔离并同步到 SQLite 兼容的 D1 数据库。
|
|
||||||
|
桌面端支持单击选择、双击打开 App、多窗口、任务栏恢复、图标拖动排列和窗口布局记忆。拖动图标或小部件时会显示吸附网格;目标倒计时、时钟、今日概览与快捷操作小部件可移动、调整大小和分别开关。移动端以横排图标和全屏 App 为主,小部件在桌面下方排列。可选必应每日图片、内置背景或自定义 HTTPS 图片链接。中文与英文可自动跟随浏览器语言,也可手动选择。
|
||||||
|
|
||||||
|
快捷键:`Ctrl / ⌘ + K` 打开启动器,`Ctrl / ⌘ + F` 搜索记忆,`Ctrl / ⌘ + S` 保存今日记忆;`Alt + 1–9` 打开原有 App,`Alt + 0` 打开终端。终端内 ↑↓ 浏览命令历史,Tab 补全命令,记忆正文输入时 `Ctrl / ⌘ + Enter` 保存。站点包含 PWA 清单和 Service Worker,离线时可打开已缓存的应用外壳;云同步、外部网页与必应图片仍需要联网。
|
||||||
|
|
||||||
|
终端首次打开显示欢迎信息,输入 `help` 查看命令。`memory add`、`goal add`、`task add` 可逐项创建;回车保留默认值,`back` 返回,`cancel` 取消。`memory delete`、`goal delete`、`task delete` 会列出记录供选择,并要求输入 `yes` 确认。原有带参数的快速输入仍可用,例如 `memory add "实验记录" --date 2026-09-28 --tag 学习 --text "完成实验"`、`task add "背单词" --due tomorrow --priority high`。`date`、`time`、`datetime` 读取当前设备时间;另有 `uptime`、`status`、`apps`、`history`、`echo`、`version` 等命令。终端只执行明确支持的 Life OS 操作,不是系统 shell。
|
||||||
|
|
||||||
|
浏览器开发者工具的 Console 也可使用同一套命令:`LifeOS.help()`、`LifeOS.run('date')`、`LifeOS.run('memory add')`;逐项填写后用 `LifeOS.note('正文')` 保存记忆,或用 `LifeOS.cancel()` 取消。该入口不会替换或拦截浏览器原生的 `console`,删除操作同样需要在后续调用 `LifeOS.run('yes')` 确认。
|
||||||
|
|
||||||
## 数据与备份
|
## 数据与备份
|
||||||
|
|
||||||
登录后,Life OS 会将资料同步到云端数据库;浏览器 `localStorage` 保留为本地缓存、临时草稿与迁移来源。首次登录时,现有本地记录可以迁移到云端;云端已有记录时,会优先恢复云端资料,并在本机保留迁移前副本。
|
站点使用 ChatGPT 登录标识隔离不同用户的数据。登录后,资料通过同源 API 保存到 Sites 的 D1 数据库;浏览器 `localStorage` 充当缓存、草稿及首次迁移来源。首次云端恢复前,本地资料会保留一份迁移前副本。浏览器缓存与 JSON 备份仍使用 `lifeos_system.tasksBoard`;云端将其中的目标和待办拆分为独立记录。
|
||||||
|
|
||||||
请在 **System → Export Data** 定期导出 JSON 备份;导入时支持合并现有数据或完整覆盖恢复,导入后的资料也会同步。
|
**系统设置 → 导出数据** 会生成 JSON 备份;导入支持合并或覆盖。备份格式使用 `schemaVersion: 2`,仍可导入 v1 备份。壁纸来源、快捷方式、开机 App 和小部件开关包含在同步与备份中;窗口布局与小部件格位分别保存在本设备的 `lifeos_window_layout_v1`、`lifeos_widget_layout_v1`,也包含在 JSON 导出中,覆盖导入时可恢复。未保存的今日草稿仅留在本机。
|
||||||
|
|
||||||
主要存储键:
|
主要本地数据键:`lifeos_memories`、`lifeos_museum`、`lifeos_profile`、`lifeos_settings`、`lifeos_system`。云端表结构见 `drizzle/0001_lifeos_records.sql`:记忆、标签、目标、待办、收藏各自按记录保存,资料与设置保留按用户存储的 JSON。旧版 `lifeos_states` 作为只读迁移来源保留;用户首次访问新版本时自动回填新表,旧表不会被清空。单条记录的修改使用版本号校验;冲突时会保存本地副本并要求选择。旧版浏览器标签页需刷新,整份状态写入接口已停用,避免覆盖新数据。应用的备份 `schemaVersion: 2` 与数据库迁移编号是两回事。建议定期导出备份。
|
||||||
|
|
||||||
- `lifeos_memories`
|
数据库管理器的服务器固定为本站 D1,用户名固定为 `lifeos-admin`。每个 ChatGPT 账号首次打开管理器时设置自己的密码(至少 12 个字符),旧版共用口令不再有效。密码以独立盐值与 PBKDF2 摘要存入 `lifeos_admin_credentials`,不保存明文,也不写进仓库或浏览器;管理页可验证当前密码后更换。它在原有账号登录之上再次验证密码;会话仅在当前页面内存中保留 20 分钟,退出或修改密码后旧会话立即失效,连续五次输错锁定 15 分钟。管理 API 只允许当前账号在预设表内按记录操作,没有任意 SQL 执行入口。更改云端记录后应刷新桌面,使其他 App 重新加载数据。派生的标签索引和旧版状态备份不能在管理器中单独修改。
|
||||||
- `lifeos_museum`
|
|
||||||
- `lifeos_profile`
|
|
||||||
- `lifeos_settings`
|
|
||||||
- `lifeos_system`
|
|
||||||
|
|
||||||
备份格式包含 `schemaVersion: 1`,为后续数据迁移预留兼容空间。目标和待办保存在 `lifeos_system.tasksBoard`,随现有云端 system 字段同步,并包含在新版 JSON 备份中。
|
## 构建与验证
|
||||||
|
|
||||||
## 运行
|
项目无需安装第三方 npm 依赖,使用 Node.js 运行:
|
||||||
|
|
||||||
这是一个轻量的同源 Worker 网站。Worker 会代理 Bing 每日图片,避免浏览器跨域限制导致壁纸回退为纯色。
|
|
||||||
|
|
||||||
安装依赖后构建并运行验证:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run build
|
npm run build
|
||||||
npm run validate
|
npm run validate
|
||||||
|
npm run test:cloud
|
||||||
```
|
```
|
||||||
|
|
||||||
构建产物位于 `dist/`,其中包含 Cloudflare Worker 入口与界面资源。
|
`build` 将页面及 App 脚本打包成 `dist/server/` 中的 Cloudflare Worker 产物;`validate` 检查产物、双语键与主要交互;`test:cloud` 使用内存 SQLite 检查旧数据回填、版本冲突与租户隔离。生产托管配置在 `.openai/hosting.json`,含 Sites 项目 ID 和 D1 逻辑绑定。直接在其他环境部署时,需要提供兼容的 Worker 环境与 `DB` 绑定;云端 API 还依赖托管层提供的 `oai-authenticated-user-id` 请求头。
|
||||||
|
|
||||||
## 项目结构
|
## 项目结构
|
||||||
|
|
||||||
```text
|
```text
|
||||||
public/index.html # 桌面框架与窗口交互
|
public/index.html 桌面框架与窗口基础交互
|
||||||
public/tasks.js # 目标与待办 App
|
public/tasks.js 目标与待办
|
||||||
public/calendar.js # 记忆、待办与目标节点的日历时间轴
|
public/calendar.js 日历
|
||||||
public/addons.js # 窗口与辅助交互
|
public/browser-app.js iframe 浏览器
|
||||||
worker/index.js # ChatGPT 登录门槛、云端数据 API 与 Bing 壁纸代理
|
public/terminal-app.js 命令解析与终端界面
|
||||||
drizzle/ # SQLite / D1 数据库迁移
|
public/db-admin.js 数据库管理器界面
|
||||||
scripts/build.mjs # 生成 Worker 部署产物
|
public/data-actions.js 图形界面与终端共用的数据写入
|
||||||
.openai/hosting.json # Sites 托管配置
|
public/i18n-renderers.js 记忆、洞察、设置等双语界面
|
||||||
|
public/desktop-personalization.js 图标、窗口与壁纸偏好
|
||||||
|
public/desktop-widgets.js 吸附网格与桌面小部件
|
||||||
|
public/addons.js 导入导出、云同步与辅助操作
|
||||||
|
public/locales/ 中文、英文文案
|
||||||
|
public/service-worker.js PWA 缓存
|
||||||
|
worker/index.js Worker 路由与必应图片代理
|
||||||
|
worker/cloud-state.js 云端记录迁移与同步 API
|
||||||
|
worker/db-admin.js 当前用户的数据库管理 API
|
||||||
|
drizzle/ D1 数据表迁移
|
||||||
|
scripts/ 构建与产物验证
|
||||||
```
|
```
|
||||||
|
|
||||||
## 隐私说明
|
## 隐私与版权
|
||||||
|
|
||||||
Life OS 使用 ChatGPT 的稳定用户标识隔离云端数据,不保存 ChatGPT 密码。浏览器本地缓存不作为唯一副本;仍建议定期导出 JSON 备份。
|
Life OS 不保存 ChatGPT 密码。自定义壁纸链接由浏览器直接加载;使用第三方图片时,请考虑图片服务的访问与隐私规则。必应每日图片版权归原始权利人所有。
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
个人使用项目。壁纸图片版权归 Bing 每日一图的原始权利人所有。
|
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
CREATE TABLE lifeos_migrations (
|
||||||
|
user_id TEXT PRIMARY KEY,
|
||||||
|
migrated_at TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_meta (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
kind TEXT NOT NULL CHECK (kind IN ('profile', 'settings', 'system')),
|
||||||
|
value_json TEXT NOT NULL,
|
||||||
|
revision INTEGER NOT NULL DEFAULT 1,
|
||||||
|
updated_at TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (user_id, kind)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_memories (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
id TEXT NOT NULL,
|
||||||
|
memory_date TEXT,
|
||||||
|
value_json TEXT NOT NULL,
|
||||||
|
revision INTEGER NOT NULL DEFAULT 1,
|
||||||
|
updated_at TEXT NOT NULL,
|
||||||
|
deleted_at TEXT,
|
||||||
|
PRIMARY KEY (user_id, id)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_lifeos_memories_user_date ON lifeos_memories(user_id, memory_date DESC) WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_memory_tags (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
memory_id TEXT NOT NULL,
|
||||||
|
tag TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (user_id, memory_id, tag),
|
||||||
|
FOREIGN KEY (user_id, memory_id) REFERENCES lifeos_memories(user_id, id)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_lifeos_memory_tags_user_tag ON lifeos_memory_tags(user_id, tag);
|
||||||
|
CREATE TRIGGER lifeos_memory_tags_insert AFTER INSERT ON lifeos_memories
|
||||||
|
WHEN NEW.deleted_at IS NULL
|
||||||
|
BEGIN
|
||||||
|
INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag)
|
||||||
|
SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags')
|
||||||
|
WHERE type = 'text' AND value <> '';
|
||||||
|
END;
|
||||||
|
CREATE TRIGGER lifeos_memory_tags_update AFTER UPDATE OF value_json, deleted_at ON lifeos_memories
|
||||||
|
BEGIN
|
||||||
|
DELETE FROM lifeos_memory_tags WHERE user_id = NEW.user_id AND memory_id = NEW.id;
|
||||||
|
INSERT OR IGNORE INTO lifeos_memory_tags(user_id, memory_id, tag)
|
||||||
|
SELECT NEW.user_id, NEW.id, value FROM json_each(NEW.value_json, '$.tags')
|
||||||
|
WHERE NEW.deleted_at IS NULL AND type = 'text' AND value <> '';
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_goals (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
id TEXT NOT NULL,
|
||||||
|
target_date TEXT,
|
||||||
|
done INTEGER NOT NULL DEFAULT 0,
|
||||||
|
value_json TEXT NOT NULL,
|
||||||
|
revision INTEGER NOT NULL DEFAULT 1,
|
||||||
|
updated_at TEXT NOT NULL,
|
||||||
|
deleted_at TEXT,
|
||||||
|
PRIMARY KEY (user_id, id)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_lifeos_goals_user_status_date ON lifeos_goals(user_id, done, target_date) WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_tasks (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
id TEXT NOT NULL,
|
||||||
|
goal_id TEXT,
|
||||||
|
due_date TEXT,
|
||||||
|
done INTEGER NOT NULL DEFAULT 0,
|
||||||
|
value_json TEXT NOT NULL,
|
||||||
|
revision INTEGER NOT NULL DEFAULT 1,
|
||||||
|
updated_at TEXT NOT NULL,
|
||||||
|
deleted_at TEXT,
|
||||||
|
PRIMARY KEY (user_id, id)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_lifeos_tasks_user_status_date ON lifeos_tasks(user_id, done, due_date) WHERE deleted_at IS NULL;
|
||||||
|
CREATE INDEX idx_lifeos_tasks_user_goal ON lifeos_tasks(user_id, goal_id) WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE TABLE lifeos_favorites (
|
||||||
|
user_id TEXT NOT NULL,
|
||||||
|
id TEXT NOT NULL,
|
||||||
|
memory_id TEXT,
|
||||||
|
value_json TEXT NOT NULL,
|
||||||
|
revision INTEGER NOT NULL DEFAULT 1,
|
||||||
|
updated_at TEXT NOT NULL,
|
||||||
|
deleted_at TEXT,
|
||||||
|
PRIMARY KEY (user_id, id)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_lifeos_favorites_user_memory ON lifeos_favorites(user_id, memory_id) WHERE deleted_at IS NULL;
|
||||||
Loaded 3 of 29 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user