@musnows/scriverse 0.6.8 → 0.6.10
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/dist/ai-tool-results.js +13 -1
- package/dist/ai-tool-results.js.map +1 -1
- package/dist/ai.js +76 -27
- package/dist/ai.js.map +1 -1
- package/dist/app.js +94 -6
- package/dist/app.js.map +1 -1
- package/dist/database.js +295 -5
- package/dist/database.js.map +1 -1
- package/dist/hybrid-search.js +2 -1
- package/dist/hybrid-search.js.map +1 -1
- package/dist/logger.js +2 -2
- package/dist/logger.js.map +1 -1
- package/dist/public/app.js +368 -15
- package/dist/public/display-labels.js +2 -1
- package/dist/public/global-search.d.ts +3 -1
- package/dist/public/global-search.js +31 -0
- package/dist/public/index.html +48 -3
- package/dist/public/s3-backup-ui.d.ts +17 -0
- package/dist/public/s3-backup-ui.js +28 -0
- package/dist/public/styles.css +86 -2
- package/dist/s3-backup.js +654 -0
- package/dist/s3-backup.js.map +1 -0
- package/dist/security.js +25 -0
- package/dist/security.js.map +1 -1
- package/dist/store.js +74 -15
- package/dist/store.js.map +1 -1
- package/dist/user-auth.js +6 -2
- package/dist/user-auth.js.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +2 -1
|
@@ -11,6 +11,24 @@ const entityTargets = Object.freeze({
|
|
|
11
11
|
review: Object.freeze({ module: "reviews", entity: "review", resource: "reviews" })
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
+
export function prioritizeGlobalSearchResults(results = []) {
|
|
15
|
+
const nonProseResults = [];
|
|
16
|
+
const proseResults = [];
|
|
17
|
+
for (const result of Array.isArray(results) ? results : []) {
|
|
18
|
+
(String(result?.type ?? "") === "chapter" ? proseResults : nonProseResults).push(result);
|
|
19
|
+
}
|
|
20
|
+
const sortByRelevance = (group) => group
|
|
21
|
+
.map((result, index) => ({ result, index, score: Number(result?.score) }))
|
|
22
|
+
.sort((left, right) => {
|
|
23
|
+
if (Number.isFinite(left.score) && Number.isFinite(right.score) && left.score !== right.score) {
|
|
24
|
+
return right.score - left.score;
|
|
25
|
+
}
|
|
26
|
+
return left.index - right.index;
|
|
27
|
+
})
|
|
28
|
+
.map(({ result }) => result);
|
|
29
|
+
return [...sortByRelevance(nonProseResults), ...sortByRelevance(proseResults)];
|
|
30
|
+
}
|
|
31
|
+
|
|
14
32
|
function positiveLine(value) {
|
|
15
33
|
const line = Number(value);
|
|
16
34
|
return Number.isInteger(line) && line > 0 ? line : null;
|
|
@@ -39,6 +57,19 @@ export function resolveGlobalSearchTarget(result = {}) {
|
|
|
39
57
|
const type = String(result.type ?? "").trim();
|
|
40
58
|
const id = String(result.id ?? "").trim();
|
|
41
59
|
if (!id) return null;
|
|
60
|
+
if (type === "agent-history") {
|
|
61
|
+
const conversationId = String(result.conversationId ?? "").trim();
|
|
62
|
+
if (!conversationId) return null;
|
|
63
|
+
const messageId = String(result.messageId ?? "").trim();
|
|
64
|
+
return {
|
|
65
|
+
kind: "agent-history",
|
|
66
|
+
type,
|
|
67
|
+
id,
|
|
68
|
+
module: "editor",
|
|
69
|
+
conversationId,
|
|
70
|
+
...(messageId ? { messageId } : {})
|
|
71
|
+
};
|
|
72
|
+
}
|
|
42
73
|
if (type === "chapter") {
|
|
43
74
|
const startLine = positiveLine(result.startLine);
|
|
44
75
|
const endLine = positiveLine(result.endLine);
|
package/dist/public/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<link rel="icon" href="/icon.svg?v=20260712" type="image/svg+xml">
|
|
11
11
|
<link rel="manifest" href="/site.webmanifest">
|
|
12
12
|
<link rel="stylesheet" href="/vendor/vditor/dist/index.css?v=3.11.2">
|
|
13
|
-
<link rel="stylesheet" href="/styles.css?v=
|
|
13
|
+
<link rel="stylesheet" href="/styles.css?v=20260805-ai-tool-call-settings-v7">
|
|
14
14
|
</head>
|
|
15
15
|
<body class="auth-pending">
|
|
16
16
|
<section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
|
|
@@ -210,6 +210,7 @@
|
|
|
210
210
|
<button id="platform-usage-button" class="settings-hub-card hidden" type="button"><span class="settings-card-mark">T</span><strong>Token 用量</strong><small>总消耗、缓存命中率、每日网格与作品明细</small></button>
|
|
211
211
|
<button id="user-management-button" class="settings-hub-card hidden" type="button"><span class="settings-card-mark">人</span><strong>用户管理</strong><small>管理员、普通用户与账户状态</small></button>
|
|
212
212
|
<button id="platform-ui-settings-button" class="settings-hub-card hidden" type="button"><span class="settings-card-mark">界</span><strong>界面与分页</strong><small>设置通知位置及各模块的单页数量</small></button>
|
|
213
|
+
<button id="s3-backup-button" class="settings-hub-card hidden" type="button"><span class="settings-card-mark">S3</span><strong>S3 备份</strong><small>将整个系统的数据库和图片同步到多个目标</small></button>
|
|
213
214
|
<button id="collaboration-button" class="settings-hub-card" type="button"><span class="settings-card-mark">协</span><strong>作品协作</strong><small>邀请注册用户共同编辑当前作品</small></button>
|
|
214
215
|
<button id="writing-progress-button" class="settings-hub-card" type="button"><span class="settings-card-mark">字</span><strong>写作目标</strong><small>每日目标、总字数目标与近 30 天趋势</small></button>
|
|
215
216
|
<button id="work-audit-button" class="settings-hub-card" type="button"><span class="settings-card-mark">录</span><strong>操作记录</strong><small>查看作品修改、操作者、对象与时间</small></button>
|
|
@@ -613,7 +614,7 @@
|
|
|
613
614
|
</div>
|
|
614
615
|
<div class="access-dialog-body">
|
|
615
616
|
<form id="search-form" class="search-form">
|
|
616
|
-
<label>关键词<input id="search-query" name="query" type="search" maxlength="500" placeholder="
|
|
617
|
+
<label>关键词<input id="search-query" name="query" type="search" maxlength="500" placeholder="搜索正文、设定、人物、时间线、关系、大纲、伏笔或 Agent 历史" required></label>
|
|
617
618
|
<label>资料类型<select id="search-type" name="type">
|
|
618
619
|
<option value="">全部资料</option>
|
|
619
620
|
<option value="chapter">章节</option>
|
|
@@ -627,6 +628,7 @@
|
|
|
627
628
|
<option value="chapter-outline">章节大纲</option>
|
|
628
629
|
<option value="foreshadow">伏笔</option>
|
|
629
630
|
<option value="review">审核项</option>
|
|
631
|
+
<option value="agent-history">Agent 历史</option>
|
|
630
632
|
</select></label>
|
|
631
633
|
<button class="primary-button" type="submit">搜索</button>
|
|
632
634
|
</form>
|
|
@@ -800,6 +802,49 @@
|
|
|
800
802
|
</form>
|
|
801
803
|
</dialog>
|
|
802
804
|
|
|
805
|
+
<dialog id="s3-backup-dialog" class="dialog wide-dialog s3-backup-dialog" aria-labelledby="s3-backup-title" aria-describedby="s3-backup-description">
|
|
806
|
+
<div class="dialog-header">
|
|
807
|
+
<div><span class="eyebrow">系统管理员</span><h2 id="s3-backup-title">S3 系统备份</h2><p id="s3-backup-description" class="dialog-header-meta">备份范围始终是整个 Scriverse 系统,不按作品拆分。所有启用目标会按配置顺序依次执行。</p></div>
|
|
808
|
+
<div class="settings-dialog-header-actions"><button id="s3-backup-settings-return" class="ghost-button settings-parent-button" type="button">返回设置</button><button id="s3-backup-close" class="dialog-close" aria-label="关闭 S3 系统备份" type="button">×</button></div>
|
|
809
|
+
</div>
|
|
810
|
+
<div class="s3-backup-body">
|
|
811
|
+
<section class="s3-backup-overview" aria-labelledby="s3-backup-overview-title">
|
|
812
|
+
<div><h3 id="s3-backup-overview-title">备份目标</h3><p id="s3-backup-summary">正在读取备份配置……</p></div>
|
|
813
|
+
<div class="s3-backup-overview-actions"><button id="s3-backup-run-all" class="ghost-button" type="button">立即备份已启用目标</button><button id="s3-backup-add" class="primary-button" type="button">新增目标</button></div>
|
|
814
|
+
</section>
|
|
815
|
+
<div id="s3-backup-targets" class="s3-backup-target-list" aria-live="polite"></div>
|
|
816
|
+
<section class="s3-backup-history" aria-labelledby="s3-backup-history-title">
|
|
817
|
+
<header><div><h3 id="s3-backup-history-title">最近运行</h3><p>数据库快照保留在各目标的 <code>/scriverse/db</code>,图片只增量写入 <code>/scriverse/img</code>。</p></div><button id="s3-backup-refresh" class="ghost-button" type="button">刷新</button></header>
|
|
818
|
+
<div id="s3-backup-runs" class="s3-backup-run-list" aria-live="polite"></div>
|
|
819
|
+
</section>
|
|
820
|
+
</div>
|
|
821
|
+
</dialog>
|
|
822
|
+
|
|
823
|
+
<dialog id="s3-backup-target-dialog" class="dialog editor-dialog s3-backup-target-dialog" aria-labelledby="s3-backup-target-title">
|
|
824
|
+
<form id="s3-backup-target-form">
|
|
825
|
+
<div class="dialog-header"><div><span class="eyebrow">系统备份目标</span><h2 id="s3-backup-target-title">新增 S3 目标</h2><p class="dialog-header-meta">AK 与 SK 会使用系统主密钥加密保存,读取配置时不会回显。</p></div><button id="s3-backup-target-close" class="dialog-close" aria-label="关闭 S3 目标编辑" type="button">×</button></div>
|
|
826
|
+
<div class="dialog-fields s3-backup-target-fields">
|
|
827
|
+
<label>配置名称<input id="s3-backup-name" name="name" maxlength="100" required autocomplete="off" placeholder="例如:异地 MinIO"></label>
|
|
828
|
+
<label>S3 服务地址<input id="s3-backup-endpoint" name="endpoint" type="url" maxlength="2000" required spellcheck="false" autocomplete="url" placeholder="https://s3.example.com"></label>
|
|
829
|
+
<label>区域<input id="s3-backup-region" name="region" maxlength="64" required spellcheck="false" autocomplete="off" value="us-east-1"></label>
|
|
830
|
+
<label>桶名称<input id="s3-backup-bucket" name="bucket" maxlength="255" required spellcheck="false" autocomplete="off" placeholder="scriverse-backups"></label>
|
|
831
|
+
<label class="s3-backup-wide-field">可选子目录<input id="s3-backup-base-path" name="basePath" maxlength="512" spellcheck="false" autocomplete="off" placeholder="例如:authors/mothra"><small>实际根路径:<code id="s3-backup-root-preview">scriverse</code></small></label>
|
|
832
|
+
<label>Access Key<input id="s3-backup-access-key" name="accessKeyId" type="password" maxlength="512" autocomplete="new-password" spellcheck="false"></label>
|
|
833
|
+
<label>Secret Key<input id="s3-backup-secret-key" name="secretAccessKey" type="password" maxlength="2048" autocomplete="new-password" spellcheck="false"></label>
|
|
834
|
+
<p id="s3-backup-credentials-note" class="form-field-note s3-backup-wide-field">新增目标时必须填写 AK 和 SK。</p>
|
|
835
|
+
<label>每日触发时间<input id="s3-backup-schedule-time" name="scheduleTime" type="time" value="03:00" required></label>
|
|
836
|
+
<label>数据库留存个数<input id="s3-backup-retention-count" name="retentionCount" type="number" min="1" max="365" step="1" value="7" required></label>
|
|
837
|
+
<fieldset class="s3-backup-options s3-backup-wide-field">
|
|
838
|
+
<legend>同步选项</legend>
|
|
839
|
+
<label><input id="s3-backup-enabled" name="enabled" type="checkbox"><span><strong>启用定时备份</strong><small>到达每日触发时间后加入串行同步队列。</small></span></label>
|
|
840
|
+
<label><input id="s3-backup-images" name="backupImages" type="checkbox" checked><span><strong>备份图片</strong><small>上传附件、作品封面和用户头像;已存在的对象会跳过。</small></span></label>
|
|
841
|
+
<label><input id="s3-backup-force-path-style" name="forcePathStyle" type="checkbox" checked><span><strong>使用 Path-style</strong><small>大多数 MinIO 与 S3 兼容服务需要开启;AWS 虚拟主机模式可关闭。</small></span></label>
|
|
842
|
+
</fieldset>
|
|
843
|
+
</div>
|
|
844
|
+
<div class="dialog-actions"><button id="s3-backup-target-cancel" class="ghost-button" type="button">取消</button><button id="s3-backup-target-save" class="primary-button" type="submit">保存目标</button></div>
|
|
845
|
+
</form>
|
|
846
|
+
</dialog>
|
|
847
|
+
|
|
803
848
|
<dialog id="account-dialog" class="dialog account-dialog" aria-labelledby="account-dialog-title">
|
|
804
849
|
<div class="dialog-header"><div><span class="eyebrow">个人账户</span><h2 id="account-dialog-title">账户设置</h2></div><button id="account-dialog-close" class="dialog-close" aria-label="关闭" type="button">×</button></div>
|
|
805
850
|
<div class="account-settings-body">
|
|
@@ -953,6 +998,6 @@
|
|
|
953
998
|
<div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
|
|
954
999
|
<script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
|
|
955
1000
|
<script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
|
|
956
|
-
<script type="module" src="/app.js?v=
|
|
1001
|
+
<script type="module" src="/app.js?v=20260805-ai-tool-call-settings-v5"></script>
|
|
957
1002
|
</body>
|
|
958
1003
|
</html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type S3BackupRunSnapshot = {
|
|
2
|
+
id: string;
|
|
3
|
+
status: string;
|
|
4
|
+
targetName?: string;
|
|
5
|
+
errorMessage?: string | null;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function s3BackupRootPrefix(basePath?: string): string;
|
|
10
|
+
export function s3BackupStatusLabel(status: string): string;
|
|
11
|
+
export function collectS3BackupRunTransitions<T extends S3BackupRunSnapshot>(
|
|
12
|
+
previousSnapshots: ReadonlyMap<string, string>,
|
|
13
|
+
runs: T[],
|
|
14
|
+
initialized: boolean,
|
|
15
|
+
maximumSnapshots?: number
|
|
16
|
+
): { snapshots: Map<string, string>; failures: T[] };
|
|
17
|
+
export function s3BackupFailureToast(run: Pick<S3BackupRunSnapshot, "targetName" | "errorMessage">): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function s3BackupRootPrefix(basePath = "") {
|
|
2
|
+
const normalized = String(basePath).trim().replace(/^\/+|\/+$/gu, "").replace(/\/{2,}/gu, "/");
|
|
3
|
+
return normalized ? `${normalized}/scriverse` : "scriverse";
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export function s3BackupStatusLabel(status) {
|
|
7
|
+
if (status === "succeeded") return "成功";
|
|
8
|
+
if (status === "failed") return "失败";
|
|
9
|
+
return "执行中";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function collectS3BackupRunTransitions(previousSnapshots, runs, initialized, maximumSnapshots = 500) {
|
|
13
|
+
const snapshots = new Map(previousSnapshots);
|
|
14
|
+
const failures = [];
|
|
15
|
+
for (const run of runs) {
|
|
16
|
+
const previousStatus = snapshots.get(run.id);
|
|
17
|
+
if (initialized && run.status === "failed" && previousStatus !== "failed") failures.push(run);
|
|
18
|
+
snapshots.delete(run.id);
|
|
19
|
+
snapshots.set(run.id, run.status);
|
|
20
|
+
}
|
|
21
|
+
while (snapshots.size > maximumSnapshots) snapshots.delete(snapshots.keys().next().value);
|
|
22
|
+
return { snapshots, failures };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function s3BackupFailureToast(run) {
|
|
26
|
+
const reason = String(run?.errorMessage || "S3 服务请求失败").trim();
|
|
27
|
+
return `S3 备份目标“${run?.targetName || "未命名目标"}”失败:${reason}`;
|
|
28
|
+
}
|
package/dist/public/styles.css
CHANGED
|
@@ -794,6 +794,53 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
|
|
|
794
794
|
cursor: not-allowed;
|
|
795
795
|
opacity: .46;
|
|
796
796
|
}
|
|
797
|
+
.dialog.s3-backup-dialog { width: min(900px, 94vw); }
|
|
798
|
+
.s3-backup-body { display: grid; gap: 18px; max-height: calc(88vh - 86px); overflow-y: auto; padding: 18px 24px 24px; }
|
|
799
|
+
.s3-backup-overview { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 15px 16px; border: 1px solid var(--line); border-radius: 7px; background: var(--surface-soft); }
|
|
800
|
+
.s3-backup-overview h3, .s3-backup-history h3 { margin: 0; font-size: 15px; font-weight: 600; }
|
|
801
|
+
.s3-backup-overview p, .s3-backup-history header p { margin: 4px 0 0; color: var(--muted); font-size: 10px; line-height: 1.55; }
|
|
802
|
+
.s3-backup-overview-actions, .s3-backup-target-actions { display: flex; flex: 0 0 auto; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
|
|
803
|
+
.s3-backup-overview-actions button, .s3-backup-target-actions button, .s3-backup-history header button { min-height: 34px; padding: 7px 11px; font-size: 11px; }
|
|
804
|
+
.s3-backup-target-list, .s3-backup-run-list { display: grid; gap: 9px; }
|
|
805
|
+
.s3-backup-target-card { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 13px 18px; padding: 15px 16px; border: 1px solid var(--line); border-radius: 7px; background: var(--surface-soft); }
|
|
806
|
+
.s3-backup-target-card.is-failed { border-color: color-mix(in srgb, var(--toast-error-fg) 36%, var(--line)); }
|
|
807
|
+
.s3-backup-target-heading { display: flex; align-items: flex-start; gap: 9px; min-width: 0; }
|
|
808
|
+
.s3-backup-target-heading > div { display: grid; gap: 4px; min-width: 0; }
|
|
809
|
+
.s3-backup-target-heading strong { overflow: hidden; color: var(--ink); font-size: 14px; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
|
|
810
|
+
.s3-backup-target-heading code, .s3-backup-history code { overflow-wrap: anywhere; color: var(--muted); font: 10px/1.45 var(--font-latin), monospace; }
|
|
811
|
+
.s3-backup-status { flex: 0 0 auto; padding: 3px 7px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); color: var(--muted); font-size: 9px; font-weight: 650; line-height: 1.25; }
|
|
812
|
+
.s3-backup-status.is-enabled, .s3-backup-status.is-succeeded { border-color: color-mix(in srgb, var(--green) 38%, var(--line)); color: var(--green); }
|
|
813
|
+
.s3-backup-status.is-failed { border-color: color-mix(in srgb, var(--toast-error-fg) 42%, var(--line)); color: var(--toast-error-fg); }
|
|
814
|
+
.s3-backup-status.is-running { border-color: color-mix(in srgb, var(--accent) 42%, var(--line)); color: var(--accent-dark); }
|
|
815
|
+
.s3-backup-target-meta { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin: 0; }
|
|
816
|
+
.s3-backup-target-meta > div { display: grid; gap: 3px; min-width: 0; padding: 9px 10px; border-radius: 5px; background: var(--surface); }
|
|
817
|
+
.s3-backup-target-meta dt { color: var(--muted); font-size: 9px; }
|
|
818
|
+
.s3-backup-target-meta dd { overflow: hidden; margin: 0; color: var(--ink); font: 10px/1.4 var(--font-latin), var(--font-cjk), sans-serif; text-overflow: ellipsis; white-space: nowrap; }
|
|
819
|
+
.s3-backup-target-error { grid-column: 1 / -1; margin: 0; padding: 9px 11px; border-radius: 5px; background: var(--toast-error-bg); color: var(--toast-error-fg); font-size: 10px; line-height: 1.55; overflow-wrap: anywhere; }
|
|
820
|
+
.s3-backup-history { display: grid; gap: 10px; padding-top: 2px; }
|
|
821
|
+
.s3-backup-history > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
|
|
822
|
+
.s3-backup-run-card { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; gap: 10px 12px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
|
|
823
|
+
.s3-backup-run-copy { display: grid; gap: 3px; min-width: 0; }
|
|
824
|
+
.s3-backup-run-copy strong { overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
|
|
825
|
+
.s3-backup-run-copy small, .s3-backup-run-metrics { color: var(--muted); font-size: 9px; line-height: 1.5; }
|
|
826
|
+
.s3-backup-run-metrics { text-align: right; white-space: nowrap; }
|
|
827
|
+
.s3-backup-run-card details { grid-column: 2 / -1; min-width: 0; }
|
|
828
|
+
.s3-backup-run-card summary { color: var(--muted); font-size: 9px; cursor: pointer; }
|
|
829
|
+
.s3-backup-run-card pre { max-height: 180px; overflow: auto; margin: 7px 0 0; padding: 9px; border-radius: 4px; background: var(--ink); color: var(--panel); font: 9px/1.5 var(--font-latin), monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
830
|
+
.s3-backup-empty { margin: 0; padding: 24px 16px; border: 1px dashed var(--line); border-radius: 7px; color: var(--muted); font-size: 11px; line-height: 1.6; text-align: center; }
|
|
831
|
+
.dialog.s3-backup-target-dialog { width: min(780px, 94vw); height: min(720px, calc(100dvh - 24px)); max-height: calc(100dvh - 24px); overflow: hidden; }
|
|
832
|
+
.s3-backup-target-dialog > form { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; height: 100%; }
|
|
833
|
+
.s3-backup-target-dialog .dialog-fields { min-height: 0; max-height: none; }
|
|
834
|
+
.s3-backup-target-fields > .s3-backup-wide-field { grid-column: 1 / -1; }
|
|
835
|
+
.s3-backup-target-fields input[spellcheck="false"], .s3-backup-target-fields code { font-family: var(--font-latin), monospace; }
|
|
836
|
+
.s3-backup-target-fields label > small { color: var(--muted); font-size: 9px; line-height: 1.5; }
|
|
837
|
+
.s3-backup-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 9px; min-width: 0; margin: 0; padding: 13px; border: 1px solid var(--line); border-radius: 6px; }
|
|
838
|
+
.s3-backup-options legend { padding: 0 6px; color: var(--ink); font-size: 11px; font-weight: 600; }
|
|
839
|
+
.dialog-fields .s3-backup-options label { display: flex; align-items: flex-start; gap: 8px; padding: 10px; border-radius: 5px; background: var(--surface-soft); color: var(--ink); cursor: pointer; }
|
|
840
|
+
.dialog-fields .s3-backup-options input { flex: 0 0 auto; width: 15px; height: 15px; margin: 2px 0 0; padding: 0; }
|
|
841
|
+
.s3-backup-options span { display: grid; gap: 3px; }
|
|
842
|
+
.s3-backup-options strong { font-size: 10px; font-weight: 600; }
|
|
843
|
+
.s3-backup-options small { color: var(--muted); font-size: 9px; line-height: 1.45; }
|
|
797
844
|
.member-permission-form { display: grid; gap: 12px; margin: 0; padding: 14px; border: 1px solid var(--line); border-radius: 7px; background: var(--surface-soft); }
|
|
798
845
|
.member-person-field { display: grid; gap: 6px; color: var(--muted); font-size: 11px; }
|
|
799
846
|
.member-person-field small, .member-permission-help { color: var(--muted); font-size: 10px; line-height: 1.5; }
|
|
@@ -1765,6 +1812,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
1765
1812
|
.ai-agent-tools input { width: 16px; margin-top: 2px; }
|
|
1766
1813
|
.ai-agent-tools strong { color: var(--ink); font-size: 12px; font-weight: 600; }
|
|
1767
1814
|
.ai-agent-tools small { display: block; margin-top: 2px; font-size: 10px; }
|
|
1815
|
+
.ai-agent-tools-section + .empty-state { margin-top: 24px; border-top: 1px solid var(--line); }
|
|
1768
1816
|
.default-model-select { min-width: 260px; padding: 7px 9px; font-size: 11px; }
|
|
1769
1817
|
.empty-state { padding: 70px 30px; text-align: center; color: var(--muted); border: 1px dashed var(--line); }
|
|
1770
1818
|
.empty-state b { display: block; color: var(--ink); margin-bottom: 8px; }
|
|
@@ -2139,9 +2187,15 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2139
2187
|
.config-inline-save .context-compact-threshold-field,
|
|
2140
2188
|
.config-inline-save .agent-tool-call-limit-field,
|
|
2141
2189
|
.config-inline-save .daily-token-quota-field { display: grid; gap: 6px; width: 64px; margin: 0; color: var(--muted); font-size: 10px; }
|
|
2190
|
+
.config-inline-save .book-summary-context-percent-field,
|
|
2191
|
+
.config-inline-save .context-compact-threshold-field { grid-template-columns: minmax(110px, 130px) 88px; align-items: center; column-gap: 12px; width: min(100%, 230px); }
|
|
2192
|
+
.config-inline-save .book-summary-context-percent-field input,
|
|
2193
|
+
.config-inline-save .context-compact-threshold-field input { width: 88px; }
|
|
2142
2194
|
.config-inline-save .daily-token-quota-field { width: 144px; }
|
|
2143
2195
|
.config-inline-save .agent-tool-call-global-multiplier-field { display: grid; gap: 6px; width: auto; margin: 0; color: var(--muted); font-size: 10px; }
|
|
2144
|
-
.
|
|
2196
|
+
.config-inline-save > .config-checkbox-field { display: inline-flex !important; align-items: center; gap: 8px; min-height: 32px; margin: 0; color: var(--muted); font-size: calc(11px * var(--ui-font-scale)); line-height: 1.4; white-space: nowrap; }
|
|
2197
|
+
.config-inline-save > .config-checkbox-field input[type="checkbox"] { width: 18px; min-width: 18px; height: 18px; }
|
|
2198
|
+
.agent-tool-call-global-multiplier-toggle button { width: 32px; min-width: 32px; height: 30px; min-height: 30px; padding: 0; font-family: var(--font-latin), monospace; font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
2145
2199
|
.relationship-index-summary { display: grid; gap: 14px; padding: 15px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
|
|
2146
2200
|
.relationship-index-state-row { display: flex; align-items: center; gap: 12px 18px; flex-wrap: wrap; color: var(--muted); font-size: 10px; }
|
|
2147
2201
|
.relationship-index-state-row strong { color: var(--ink); font-family: var(--font-latin), monospace; font-weight: 600; }
|
|
@@ -2173,6 +2227,10 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2173
2227
|
.platform-image-tool-field select, .platform-image-tool-panel .config-save-button { height: 40px; min-height: 40px; }
|
|
2174
2228
|
.platform-image-tool-panel .config-save-button { width: 100%; }
|
|
2175
2229
|
}
|
|
2230
|
+
@media (max-width: 640px) {
|
|
2231
|
+
.config-inline-save .book-summary-context-percent-field,
|
|
2232
|
+
.config-inline-save .context-compact-threshold-field { grid-template-columns: minmax(0, 1fr); row-gap: 6px; width: 100%; }
|
|
2233
|
+
}
|
|
2176
2234
|
.field-label textarea {
|
|
2177
2235
|
width: 100%;
|
|
2178
2236
|
min-height: 140px;
|
|
@@ -2193,6 +2251,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2193
2251
|
.ai-context-compaction-divider span { letter-spacing: .08em; white-space: nowrap; }
|
|
2194
2252
|
.assistant-message, .user-message { position: relative; margin-bottom: 12px; padding: 12px 13px; border-radius: 5px; font-size: 12px; line-height: 1.55; }
|
|
2195
2253
|
.assistant-message { background: var(--paper-deep); }
|
|
2254
|
+
.assistant-message.is-search-target, .user-message.is-search-target { outline: 2px solid var(--accent); outline-offset: 3px; }
|
|
2196
2255
|
.assistant-message.is-error { border: 1px solid color-mix(in srgb, var(--accent) 42%, var(--line)); border-left: 3px solid var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--paper-deep)); }
|
|
2197
2256
|
.assistant-message.has-message-actions, .user-message.has-message-actions { margin-bottom: 42px; }
|
|
2198
2257
|
.user-message { margin-left: 24px; background: var(--accent); color: #fff; }
|
|
@@ -2205,6 +2264,10 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
2205
2264
|
.message-body { min-width: 0; overflow-wrap: anywhere; }
|
|
2206
2265
|
.assistant-message.is-error .message-body { font-family: inherit; font-size: inherit; line-height: inherit; }
|
|
2207
2266
|
.assistant-message.is-error .ai-error-text { margin: 0; white-space: pre-wrap; font: inherit; }
|
|
2267
|
+
.ai-error-settings-link-wrap { margin: 12px 0 0; }
|
|
2268
|
+
.ai-error-settings-link { color: var(--accent); font-size: 12px; font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
|
|
2269
|
+
.ai-error-settings-link:hover, .ai-error-settings-link:focus-visible { color: var(--accent-dark); }
|
|
2270
|
+
.config-section.is-targeted { border-radius: 5px; box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 34%, transparent); }
|
|
2208
2271
|
.message-card-actions { position: absolute; right: 0; bottom: -31px; display: flex; align-items: center; gap: 12px; height: 24px; }
|
|
2209
2272
|
.message-card-actions button { display: inline-flex; align-items: center; gap: 4px; min-width: 0; padding: 3px 2px; border: 0; background: transparent; color: var(--muted); font-size: 9px; }
|
|
2210
2273
|
.message-card-actions button:hover, .message-card-actions button:focus-visible { color: var(--accent-dark); }
|
|
@@ -3209,7 +3272,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
|
|
|
3209
3272
|
.app-shell.ai-panel-collapsed .ai-panel > :not(.ai-heading) { display: none; }
|
|
3210
3273
|
.app-shell.ai-panel-collapsed .ai-heading { display: flex; justify-content: space-between; padding: 0; }
|
|
3211
3274
|
|
|
3212
|
-
.shelf-view { height:
|
|
3275
|
+
.shelf-view { height: 100%; min-height: 0; padding: 28px var(--mobile-gutter) 42px; }
|
|
3213
3276
|
#shelf-view, #settings-hub-view { padding-bottom: 0; }
|
|
3214
3277
|
#shelf-view .product-footer, #settings-hub-view .product-footer { margin-bottom: 0; padding-bottom: env(safe-area-inset-bottom); }
|
|
3215
3278
|
.shelf-header, .module-header { align-items: stretch; flex-direction: column; gap: 14px; margin-bottom: 20px; }
|
|
@@ -3387,3 +3450,24 @@ body { font-size: var(--ui-font-size); }
|
|
|
3387
3450
|
.ai-tool-call-info dt, .ai-tool-call-detail h3 { font-size: calc(9px * var(--ai-font-scale)); }
|
|
3388
3451
|
.ai-tool-call-info dd { font-size: calc(11px * var(--ai-font-scale)); }
|
|
3389
3452
|
.ai-tool-call-detail pre { font-size: calc(10px * var(--ai-font-scale)); }
|
|
3453
|
+
|
|
3454
|
+
@media (max-width: 850px) {
|
|
3455
|
+
.s3-backup-target-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
3456
|
+
.s3-backup-options { grid-template-columns: minmax(0, 1fr); }
|
|
3457
|
+
}
|
|
3458
|
+
|
|
3459
|
+
@media (max-width: 640px) {
|
|
3460
|
+
.s3-backup-body { gap: 14px; padding: 14px 16px 18px; }
|
|
3461
|
+
.s3-backup-overview, .s3-backup-history > header { align-items: stretch; flex-direction: column; }
|
|
3462
|
+
.s3-backup-overview-actions { display: grid; grid-template-columns: minmax(0, 1fr); }
|
|
3463
|
+
.s3-backup-overview-actions button { width: 100%; }
|
|
3464
|
+
.s3-backup-target-card { grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 13px; }
|
|
3465
|
+
.s3-backup-target-actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); justify-content: stretch; }
|
|
3466
|
+
.s3-backup-target-actions button { min-width: 0; padding-inline: 6px; }
|
|
3467
|
+
.s3-backup-target-meta { grid-template-columns: minmax(0, 1fr); }
|
|
3468
|
+
.s3-backup-run-card { grid-template-columns: auto minmax(0, 1fr); }
|
|
3469
|
+
.s3-backup-run-metrics { grid-column: 2; text-align: left; white-space: normal; }
|
|
3470
|
+
.s3-backup-run-card details { grid-column: 1 / -1; }
|
|
3471
|
+
.s3-backup-target-fields { grid-template-columns: minmax(0, 1fr) !important; padding-inline: 16px !important; }
|
|
3472
|
+
.s3-backup-target-fields > * { grid-column: 1 !important; }
|
|
3473
|
+
}
|