botmux 2.88.0 → 2.89.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/dist/bot-registry.d.ts +2 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +4 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
- package/dist/cli/dashboard-endpoint.js +9 -3
- package/dist/cli/dashboard-endpoint.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +9 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-command/groups.d.ts +20 -0
- package/dist/core/dashboard-command/groups.d.ts.map +1 -0
- package/dist/core/dashboard-command/groups.js +52 -0
- package/dist/core/dashboard-command/groups.js.map +1 -0
- package/dist/core/dashboard-command/index.d.ts +30 -0
- package/dist/core/dashboard-command/index.d.ts.map +1 -0
- package/dist/core/dashboard-command/index.js +81 -0
- package/dist/core/dashboard-command/index.js.map +1 -0
- package/dist/core/dashboard-command/overview.d.ts +29 -0
- package/dist/core/dashboard-command/overview.d.ts.map +1 -0
- package/dist/core/dashboard-command/overview.js +61 -0
- package/dist/core/dashboard-command/overview.js.map +1 -0
- package/dist/core/dashboard-command/owner-gate.d.ts +41 -0
- package/dist/core/dashboard-command/owner-gate.d.ts.map +1 -0
- package/dist/core/dashboard-command/owner-gate.js +40 -0
- package/dist/core/dashboard-command/owner-gate.js.map +1 -0
- package/dist/core/dashboard-command/schedules.d.ts +20 -0
- package/dist/core/dashboard-command/schedules.d.ts.map +1 -0
- package/dist/core/dashboard-command/schedules.js +47 -0
- package/dist/core/dashboard-command/schedules.js.map +1 -0
- package/dist/core/dashboard-command/sessions.d.ts +22 -0
- package/dist/core/dashboard-command/sessions.d.ts.map +1 -0
- package/dist/core/dashboard-command/sessions.js +43 -0
- package/dist/core/dashboard-command/sessions.js.map +1 -0
- package/dist/core/dashboard-command/settings.d.ts +21 -0
- package/dist/core/dashboard-command/settings.d.ts.map +1 -0
- package/dist/core/dashboard-command/settings.js +55 -0
- package/dist/core/dashboard-command/settings.js.map +1 -0
- package/dist/core/dashboard-command/stub.d.ts +16 -0
- package/dist/core/dashboard-command/stub.d.ts.map +1 -0
- package/dist/core/dashboard-command/stub.js +28 -0
- package/dist/core/dashboard-command/stub.js.map +1 -0
- package/dist/core/dashboard-command/workflows.d.ts +20 -0
- package/dist/core/dashboard-command/workflows.d.ts.map +1 -0
- package/dist/core/dashboard-command/workflows.js +45 -0
- package/dist/core/dashboard-command/workflows.js.map +1 -0
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/session-create.d.ts +0 -1
- package/dist/core/session-create.d.ts.map +1 -1
- package/dist/core/session-create.js +0 -3
- package/dist/core/session-create.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +3 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/daemon-internal-client-wrapper.d.ts +41 -0
- package/dist/daemon-internal-client-wrapper.d.ts.map +1 -0
- package/dist/daemon-internal-client-wrapper.js +65 -0
- package/dist/daemon-internal-client-wrapper.js.map +1 -0
- package/dist/dashboard/aggregator.d.ts +12 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +16 -0
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts +7 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +21 -0
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/card-model-types.d.ts +50 -0
- package/dist/dashboard/card-model-types.d.ts.map +1 -0
- package/dist/dashboard/card-model-types.js +9 -0
- package/dist/dashboard/card-model-types.js.map +1 -0
- package/dist/dashboard/daemon-internal-api.d.ts +90 -0
- package/dist/dashboard/daemon-internal-api.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-api.js +534 -0
- package/dist/dashboard/daemon-internal-api.js.map +1 -0
- package/dist/dashboard/daemon-internal-auth.d.ts +124 -0
- package/dist/dashboard/daemon-internal-auth.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-auth.js +188 -0
- package/dist/dashboard/daemon-internal-auth.js.map +1 -0
- package/dist/dashboard/daemon-internal-client.d.ts +67 -0
- package/dist/dashboard/daemon-internal-client.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-client.js +157 -0
- package/dist/dashboard/daemon-internal-client.js.map +1 -0
- package/dist/dashboard/dashboard-admins.d.ts +8 -0
- package/dist/dashboard/dashboard-admins.d.ts.map +1 -0
- package/dist/dashboard/dashboard-admins.js +15 -0
- package/dist/dashboard/dashboard-admins.js.map +1 -0
- package/dist/dashboard/federation-spoke-api.d.ts +3 -0
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +11 -8
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/groups-action-helpers.d.ts +69 -0
- package/dist/dashboard/groups-action-helpers.d.ts.map +1 -0
- package/dist/dashboard/groups-action-helpers.js +141 -0
- package/dist/dashboard/groups-action-helpers.js.map +1 -0
- package/dist/dashboard/groups-card-model.d.ts +120 -0
- package/dist/dashboard/groups-card-model.d.ts.map +1 -0
- package/dist/dashboard/groups-card-model.js +175 -0
- package/dist/dashboard/groups-card-model.js.map +1 -0
- package/dist/dashboard/schedule-card-model.d.ts +172 -0
- package/dist/dashboard/schedule-card-model.d.ts.map +1 -0
- package/dist/dashboard/schedule-card-model.js +290 -0
- package/dist/dashboard/schedule-card-model.js.map +1 -0
- package/dist/dashboard/session-card-model.d.ts +83 -0
- package/dist/dashboard/session-card-model.d.ts.map +1 -0
- package/dist/dashboard/session-card-model.js +196 -0
- package/dist/dashboard/session-card-model.js.map +1 -0
- package/dist/dashboard/settings-card-model.d.ts +73 -0
- package/dist/dashboard/settings-card-model.d.ts.map +1 -0
- package/dist/dashboard/settings-card-model.js +94 -0
- package/dist/dashboard/settings-card-model.js.map +1 -0
- package/dist/dashboard/settings-owner-resolver.d.ts +32 -0
- package/dist/dashboard/settings-owner-resolver.d.ts.map +1 -0
- package/dist/dashboard/settings-owner-resolver.js +43 -0
- package/dist/dashboard/settings-owner-resolver.js.map +1 -0
- package/dist/dashboard/settings-write-applier.d.ts +84 -0
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -0
- package/dist/dashboard/settings-write-applier.js +119 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -0
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +38 -119
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard/workflow-card-model.d.ts +127 -0
- package/dist/dashboard/workflow-card-model.d.ts.map +1 -0
- package/dist/dashboard/workflow-card-model.js +186 -0
- package/dist/dashboard/workflow-card-model.js.map +1 -0
- package/dist/dashboard/workflows-action-helpers.d.ts +105 -0
- package/dist/dashboard/workflows-action-helpers.d.ts.map +1 -0
- package/dist/dashboard/workflows-action-helpers.js +196 -0
- package/dist/dashboard/workflows-action-helpers.js.map +1 -0
- package/dist/dashboard.js +196 -271
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +266 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +266 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +2 -1
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +54 -2
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +127 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +22 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/groups-card.d.ts +90 -0
- package/dist/im/lark/groups-card.d.ts.map +1 -0
- package/dist/im/lark/groups-card.js +832 -0
- package/dist/im/lark/groups-card.js.map +1 -0
- package/dist/im/lark/overview-card.d.ts +101 -0
- package/dist/im/lark/overview-card.d.ts.map +1 -0
- package/dist/im/lark/overview-card.js +475 -0
- package/dist/im/lark/overview-card.js.map +1 -0
- package/dist/im/lark/schedules-card.d.ts +96 -0
- package/dist/im/lark/schedules-card.d.ts.map +1 -0
- package/dist/im/lark/schedules-card.js +892 -0
- package/dist/im/lark/schedules-card.js.map +1 -0
- package/dist/im/lark/sessions-card.d.ts +117 -0
- package/dist/im/lark/sessions-card.d.ts.map +1 -0
- package/dist/im/lark/sessions-card.js +870 -0
- package/dist/im/lark/sessions-card.js.map +1 -0
- package/dist/im/lark/settings-card.d.ts +125 -0
- package/dist/im/lark/settings-card.d.ts.map +1 -0
- package/dist/im/lark/settings-card.js +433 -0
- package/dist/im/lark/settings-card.js.map +1 -0
- package/dist/im/lark/workflows-card.d.ts +102 -0
- package/dist/im/lark/workflows-card.d.ts.map +1 -0
- package/dist/im/lark/workflows-card.js +737 -0
- package/dist/im/lark/workflows-card.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-card-model.js","sourceRoot":"","sources":["../../src/dashboard/schedule-card-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session card model (PR1) — pure projection of `SessionRow` (the shape served
|
|
3
|
+
* by `/api/sessions` and emitted by worker-pool publishers) into list-card and
|
|
4
|
+
* detail-card DTOs.
|
|
5
|
+
*
|
|
6
|
+
* Zero runtime IO. The only outside type touched is `SessionRow`, brought in
|
|
7
|
+
* as a TYPE-ONLY import so the runtime imports in `dashboard-rows.ts:11-13`
|
|
8
|
+
* (`terminal-url` / `bot-registry` / `lark-hosts`) never bleed into this
|
|
9
|
+
* module.
|
|
10
|
+
*/
|
|
11
|
+
import type { SessionRow } from '../core/dashboard-rows.js';
|
|
12
|
+
import type { ButtonState, PaginationMeta, StatusDot } from './card-model-types.js';
|
|
13
|
+
/** Concrete status values a SessionRow can carry (mirrors `StreamStatus | 'closed'`). */
|
|
14
|
+
export type SessionStatus = 'working' | 'idle' | 'analyzing' | 'limited' | 'starting' | 'closed';
|
|
15
|
+
/** Status-chip filter value — all StreamStatus + 'closed' + 'all'. */
|
|
16
|
+
export type StatusChip = SessionStatus | 'all';
|
|
17
|
+
/** A single row projected for the sessions list card. Keeps `raw` for downstream renderers. */
|
|
18
|
+
export interface SessionRowDto {
|
|
19
|
+
sessionId: string;
|
|
20
|
+
/** Display dot — color tone + pulse + i18n-free label key. */
|
|
21
|
+
dot: StatusDot;
|
|
22
|
+
/** Primary text: `title || sessionId`. */
|
|
23
|
+
primary: string;
|
|
24
|
+
/** Secondary text: `cliId · workingDir · relativeTime` joined by ' · '. */
|
|
25
|
+
secondary: string;
|
|
26
|
+
cliId: string;
|
|
27
|
+
status: string;
|
|
28
|
+
lastMessageAt: number;
|
|
29
|
+
webPort: number | null;
|
|
30
|
+
scope?: 'thread' | 'chat';
|
|
31
|
+
/**
|
|
32
|
+
* Raw row preserved for downstream card-builder use.
|
|
33
|
+
*/
|
|
34
|
+
raw: SessionRow;
|
|
35
|
+
}
|
|
36
|
+
/** Locate-button mode — chat-scope sessions open the chat directly; thread-scope opens the topic. */
|
|
37
|
+
export type LocateMode = 'openTopic' | 'openChat';
|
|
38
|
+
/** Action availability for the 4 primary detail buttons + locate sub-mode. */
|
|
39
|
+
export interface SessionActionMatrix {
|
|
40
|
+
resume: ButtonState;
|
|
41
|
+
close: ButtonState;
|
|
42
|
+
openTerminal: ButtonState;
|
|
43
|
+
locate: ButtonState;
|
|
44
|
+
locateMode: LocateMode;
|
|
45
|
+
}
|
|
46
|
+
/** Detail-card DTO. Action matrix encodes every visibility rule. */
|
|
47
|
+
export interface SessionDetailDto {
|
|
48
|
+
sessionId: string;
|
|
49
|
+
status: string;
|
|
50
|
+
dot: StatusDot;
|
|
51
|
+
title: string;
|
|
52
|
+
chatId: string;
|
|
53
|
+
cliId: string;
|
|
54
|
+
workingDir?: string;
|
|
55
|
+
webPort: number | null;
|
|
56
|
+
scope?: 'thread' | 'chat';
|
|
57
|
+
actions: SessionActionMatrix;
|
|
58
|
+
raw: SessionRow;
|
|
59
|
+
}
|
|
60
|
+
/** Map a SessionRow's status into a UI status dot (tone + pulse + i18n label key). Pure. */
|
|
61
|
+
export declare function statusToDot(status: string): StatusDot;
|
|
62
|
+
/** Build a SessionRowDto from a raw SessionRow, including dot + primary/secondary text. */
|
|
63
|
+
export declare function composeEntries(rows: ReadonlyArray<SessionRow>, nowMs?: number): SessionRowDto[];
|
|
64
|
+
/**
|
|
65
|
+
* Filter entries by status chip. `all` short-circuits with a shallow copy
|
|
66
|
+
* (same content + order, but a fresh array so downstream pipelines can rely
|
|
67
|
+
* on a non-aliased reference).
|
|
68
|
+
*/
|
|
69
|
+
export declare function filterByStatus(entries: ReadonlyArray<SessionRowDto>, chip: StatusChip): SessionRowDto[];
|
|
70
|
+
/** Filter entries by case-insensitive substring against sessionId / title / chatId / workingDir. */
|
|
71
|
+
export declare function filterBySearch(entries: ReadonlyArray<SessionRowDto>, query: string | undefined): SessionRowDto[];
|
|
72
|
+
/** Filter entries by CLI id. `undefined` / empty string returns input unchanged. */
|
|
73
|
+
export declare function filterByCli(entries: ReadonlyArray<SessionRowDto>, cliId: string | undefined): SessionRowDto[];
|
|
74
|
+
/** Sort entries by (status rank ascending, lastMessageAt descending). Returns a new array. */
|
|
75
|
+
export declare function sortByStatus(entries: ReadonlyArray<SessionRowDto>): SessionRowDto[];
|
|
76
|
+
/** Slice a list into the requested page. Clamps invalid page/pageSize to safe values. */
|
|
77
|
+
export declare function paginate<T>(items: ReadonlyArray<T>, page: number | undefined, pageSize: number | undefined): {
|
|
78
|
+
items: T[];
|
|
79
|
+
meta: PaginationMeta;
|
|
80
|
+
};
|
|
81
|
+
/** Build the detail-card DTO with the full action matrix. */
|
|
82
|
+
export declare function composeDetail(row: SessionRow, _nowMs?: number): SessionDetailDto;
|
|
83
|
+
//# sourceMappingURL=session-card-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-card-model.d.ts","sourceRoot":"","sources":["../../src/dashboard/session-card-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session card model (PR1) — pure projection of `SessionRow` (the shape served
|
|
3
|
+
* by `/api/sessions` and emitted by worker-pool publishers) into list-card and
|
|
4
|
+
* detail-card DTOs.
|
|
5
|
+
*
|
|
6
|
+
* Zero runtime IO. The only outside type touched is `SessionRow`, brought in
|
|
7
|
+
* as a TYPE-ONLY import so the runtime imports in `dashboard-rows.ts:11-13`
|
|
8
|
+
* (`terminal-url` / `bot-registry` / `lark-hosts`) never bleed into this
|
|
9
|
+
* module.
|
|
10
|
+
*/
|
|
11
|
+
/** Map a SessionRow's status into a UI status dot (tone + pulse + i18n label key). Pure. */
|
|
12
|
+
export function statusToDot(status) {
|
|
13
|
+
switch (status) {
|
|
14
|
+
case 'working':
|
|
15
|
+
return { tone: 'success', pulse: true, label: 'sessions.status.working' };
|
|
16
|
+
case 'analyzing':
|
|
17
|
+
return { tone: 'info', pulse: true, label: 'sessions.status.analyzing' };
|
|
18
|
+
case 'starting':
|
|
19
|
+
return { tone: 'info', pulse: true, label: 'sessions.status.starting' };
|
|
20
|
+
case 'idle':
|
|
21
|
+
return { tone: 'success', pulse: false, label: 'sessions.status.idle' };
|
|
22
|
+
case 'limited':
|
|
23
|
+
return { tone: 'warning', pulse: false, label: 'sessions.status.limited' };
|
|
24
|
+
case 'closed':
|
|
25
|
+
return { tone: 'neutral', pulse: false, label: 'sessions.status.closed' };
|
|
26
|
+
default:
|
|
27
|
+
return { tone: 'neutral', pulse: false, label: 'sessions.status.unknown' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const PRIMARY_MAX_LEN = 64;
|
|
31
|
+
function truncate(text, max) {
|
|
32
|
+
if (text.length <= max)
|
|
33
|
+
return text;
|
|
34
|
+
return `${text.slice(0, max - 1)}…`;
|
|
35
|
+
}
|
|
36
|
+
function formatRelative(fromMs, nowMs) {
|
|
37
|
+
const diff = nowMs - fromMs;
|
|
38
|
+
if (!Number.isFinite(diff) || diff < 0)
|
|
39
|
+
return 'just now';
|
|
40
|
+
const sec = Math.floor(diff / 1000);
|
|
41
|
+
if (sec < 60)
|
|
42
|
+
return `${sec}s ago`;
|
|
43
|
+
const min = Math.floor(sec / 60);
|
|
44
|
+
if (min < 60)
|
|
45
|
+
return `${min}m ago`;
|
|
46
|
+
const hour = Math.floor(min / 60);
|
|
47
|
+
if (hour < 24)
|
|
48
|
+
return `${hour}h ago`;
|
|
49
|
+
const day = Math.floor(hour / 24);
|
|
50
|
+
return `${day}d ago`;
|
|
51
|
+
}
|
|
52
|
+
function buildSecondary(row, nowMs) {
|
|
53
|
+
const parts = [];
|
|
54
|
+
if (row.cliId)
|
|
55
|
+
parts.push(String(row.cliId));
|
|
56
|
+
if (row.workingDir)
|
|
57
|
+
parts.push(row.workingDir);
|
|
58
|
+
if (typeof nowMs === 'number' && Number.isFinite(row.lastMessageAt)) {
|
|
59
|
+
parts.push(formatRelative(row.lastMessageAt, nowMs));
|
|
60
|
+
}
|
|
61
|
+
return parts.join(' · ');
|
|
62
|
+
}
|
|
63
|
+
function buildPrimary(row) {
|
|
64
|
+
const raw = row.title && row.title.trim().length > 0 ? row.title : row.sessionId;
|
|
65
|
+
return truncate(raw, PRIMARY_MAX_LEN);
|
|
66
|
+
}
|
|
67
|
+
/** Build a SessionRowDto from a raw SessionRow, including dot + primary/secondary text. */
|
|
68
|
+
export function composeEntries(rows, nowMs) {
|
|
69
|
+
const out = [];
|
|
70
|
+
for (const row of rows) {
|
|
71
|
+
out.push({
|
|
72
|
+
sessionId: row.sessionId,
|
|
73
|
+
dot: statusToDot(row.status),
|
|
74
|
+
primary: buildPrimary(row),
|
|
75
|
+
secondary: buildSecondary(row, nowMs),
|
|
76
|
+
cliId: String(row.cliId),
|
|
77
|
+
status: row.status,
|
|
78
|
+
lastMessageAt: row.lastMessageAt,
|
|
79
|
+
webPort: row.webPort,
|
|
80
|
+
scope: row.scope,
|
|
81
|
+
raw: row,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Filter entries by status chip. `all` short-circuits with a shallow copy
|
|
88
|
+
* (same content + order, but a fresh array so downstream pipelines can rely
|
|
89
|
+
* on a non-aliased reference).
|
|
90
|
+
*/
|
|
91
|
+
export function filterByStatus(entries, chip) {
|
|
92
|
+
if (chip === 'all')
|
|
93
|
+
return entries.slice();
|
|
94
|
+
return entries.filter(e => e.status === chip);
|
|
95
|
+
}
|
|
96
|
+
/** Filter entries by case-insensitive substring against sessionId / title / chatId / workingDir. */
|
|
97
|
+
export function filterBySearch(entries, query) {
|
|
98
|
+
if (!query)
|
|
99
|
+
return entries.slice();
|
|
100
|
+
const needle = query.trim().toLowerCase();
|
|
101
|
+
if (needle.length === 0)
|
|
102
|
+
return entries.slice();
|
|
103
|
+
return entries.filter(e => {
|
|
104
|
+
const hay = `${e.sessionId} ${e.raw.title ?? ''} ${e.raw.chatId} ${e.raw.workingDir ?? ''}`.toLowerCase();
|
|
105
|
+
return hay.includes(needle);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** Filter entries by CLI id. `undefined` / empty string returns input unchanged. */
|
|
109
|
+
export function filterByCli(entries, cliId) {
|
|
110
|
+
if (cliId === undefined || cliId === '')
|
|
111
|
+
return entries.slice();
|
|
112
|
+
return entries.filter(e => e.cliId === cliId);
|
|
113
|
+
}
|
|
114
|
+
const STATUS_ORDER = {
|
|
115
|
+
working: 0,
|
|
116
|
+
analyzing: 1,
|
|
117
|
+
starting: 2,
|
|
118
|
+
idle: 3,
|
|
119
|
+
limited: 4,
|
|
120
|
+
closed: 5,
|
|
121
|
+
};
|
|
122
|
+
function statusRank(status) {
|
|
123
|
+
return STATUS_ORDER[status] ?? 9;
|
|
124
|
+
}
|
|
125
|
+
/** Sort entries by (status rank ascending, lastMessageAt descending). Returns a new array. */
|
|
126
|
+
export function sortByStatus(entries) {
|
|
127
|
+
return entries.slice().sort((a, b) => {
|
|
128
|
+
const ra = statusRank(a.status);
|
|
129
|
+
const rb = statusRank(b.status);
|
|
130
|
+
if (ra !== rb)
|
|
131
|
+
return ra - rb;
|
|
132
|
+
return b.lastMessageAt - a.lastMessageAt;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
136
|
+
const MAX_PAGE_SIZE = 100;
|
|
137
|
+
function clampPageSize(pageSize) {
|
|
138
|
+
if (typeof pageSize !== 'number' || !Number.isFinite(pageSize) || pageSize < 1)
|
|
139
|
+
return DEFAULT_PAGE_SIZE;
|
|
140
|
+
if (pageSize > MAX_PAGE_SIZE)
|
|
141
|
+
return MAX_PAGE_SIZE;
|
|
142
|
+
return Math.floor(pageSize);
|
|
143
|
+
}
|
|
144
|
+
/** Slice a list into the requested page. Clamps invalid page/pageSize to safe values. */
|
|
145
|
+
export function paginate(items, page, pageSize) {
|
|
146
|
+
const total = items.length;
|
|
147
|
+
const size = clampPageSize(pageSize);
|
|
148
|
+
const totalPages = Math.max(1, Math.ceil(total / size));
|
|
149
|
+
let active = typeof page === 'number' && Number.isFinite(page) ? Math.floor(page) : 1;
|
|
150
|
+
if (active < 1)
|
|
151
|
+
active = 1;
|
|
152
|
+
if (active > totalPages)
|
|
153
|
+
active = totalPages;
|
|
154
|
+
const start = (active - 1) * size;
|
|
155
|
+
return {
|
|
156
|
+
items: items.slice(start, start + size),
|
|
157
|
+
meta: { page: active, pageSize: size, total, totalPages },
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** Build the detail-card DTO with the full action matrix. */
|
|
161
|
+
export function composeDetail(row, _nowMs) {
|
|
162
|
+
const isClosed = row.status === 'closed';
|
|
163
|
+
const isStarting = row.status === 'starting';
|
|
164
|
+
const canCloseNow = !isClosed && !isStarting;
|
|
165
|
+
// Closed sessions can still carry a stale
|
|
166
|
+
// webPort (closeSession / dashboard close don't null the field), so a
|
|
167
|
+
// simple `webPort != null` check would surface a dead terminal link on
|
|
168
|
+
// the closed detail card. Gate openTerminal on status too — terminals
|
|
169
|
+
// are only meaningful on a live worker.
|
|
170
|
+
const canOpenTerminal = !isClosed && row.webPort !== null && row.webPort !== undefined;
|
|
171
|
+
const locateMode = row.scope === 'chat' ? 'openChat' : 'openTopic';
|
|
172
|
+
const actions = {
|
|
173
|
+
resume: isClosed ? { enabled: true } : { enabled: false, reasonKey: 'sessions.action.resume.onlyClosed' },
|
|
174
|
+
close: canCloseNow ? { enabled: true } : {
|
|
175
|
+
enabled: false,
|
|
176
|
+
reasonKey: isStarting ? 'sessions.action.close.starting' : 'sessions.action.close.alreadyClosed',
|
|
177
|
+
},
|
|
178
|
+
openTerminal: canOpenTerminal ? { enabled: true } : { enabled: false, reasonKey: 'sessions.action.terminal.noPort' },
|
|
179
|
+
locate: { enabled: true },
|
|
180
|
+
locateMode,
|
|
181
|
+
};
|
|
182
|
+
return {
|
|
183
|
+
sessionId: row.sessionId,
|
|
184
|
+
status: row.status,
|
|
185
|
+
dot: statusToDot(row.status),
|
|
186
|
+
title: row.title && row.title.trim().length > 0 ? row.title : row.sessionId,
|
|
187
|
+
chatId: row.chatId,
|
|
188
|
+
cliId: String(row.cliId),
|
|
189
|
+
workingDir: row.workingDir,
|
|
190
|
+
webPort: row.webPort,
|
|
191
|
+
scope: row.scope,
|
|
192
|
+
actions,
|
|
193
|
+
raw: row,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=session-card-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-card-model.js","sourceRoot":"","sources":["../../src/dashboard/session-card-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoEH,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QAC5E,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;QAC3E,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QAC1E,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAC1E,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAC5E;YACE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,KAAa;IACnD,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,GAAG,GAAG,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IACjC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,GAAG,GAAG,OAAO,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,GAAG,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,GAAe,EAAE,KAAc;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,GAAe;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IACjF,OAAO,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AACxC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,IAA+B,EAAE,KAAc;IAC5E,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC;YACP,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;YAC1B,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;YACrC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAqC,EAAE,IAAgB;IACpF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,cAAc,CAAC,OAAqC,EAAE,KAAyB;IAC7F,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1G,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,WAAW,CAAC,OAAqC,EAAE,KAAyB;IAC1F,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAChE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,YAAY,GAA2B;IAC3C,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,OAAqC;IAChE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,SAAS,aAAa,CAAC,QAA4B;IACjD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACzG,IAAI,QAAQ,GAAG,aAAa;QAAE,OAAO,aAAa,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,QAAQ,CACtB,KAAuB,EACvB,IAAwB,EACxB,QAA4B;IAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,GAAG,UAAU;QAAE,MAAM,GAAG,UAAU,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACvC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;KAC1D,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,GAAe,EAAE,MAAe;IAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC;IAC7C,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC;IAC7C,0CAA0C;IAC1C,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IACtE,wCAAwC;IACxC,MAAM,eAAe,GACnB,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC;IACjE,MAAM,UAAU,GAAe,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAE/E,MAAM,OAAO,GAAwB;QACnC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,mCAAmC,EAAE;QACzG,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvC,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,qCAAqC;SACjG;QACD,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iCAAiC,EAAE;QACpH,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACzB,UAAU;KACX,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS;QAC3E,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO;QACP,GAAG,EAAE,GAAG;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings card model (PR1) — pure projection of DashboardSettings + viewer
|
|
3
|
+
* capability into a 3-section card DTO (access / cards / maintenance).
|
|
4
|
+
*
|
|
5
|
+
* Zero IO. Type-only imports. The input shape mirrors
|
|
6
|
+
* `src/dashboard/web/settings.ts:6-11` but is redeclared locally so the model
|
|
7
|
+
* does not pull in browser-side jsdom assets.
|
|
8
|
+
*/
|
|
9
|
+
import type { ButtonState } from './card-model-types.js';
|
|
10
|
+
/** Single maintenance task: enabled flag + optional HH:MM time. */
|
|
11
|
+
export interface MaintenanceTaskCfgInput {
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
time?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Maintenance section input — auto-update drives the schedule, auto-restart is dependent. */
|
|
16
|
+
export interface MaintenanceCfgInput {
|
|
17
|
+
autoUpdate?: MaintenanceTaskCfgInput;
|
|
18
|
+
autoRestart?: MaintenanceTaskCfgInput;
|
|
19
|
+
}
|
|
20
|
+
/** Raw dashboard settings as persisted in ~/.botmux/config.json's `dashboard` + `maintenance` segments. */
|
|
21
|
+
export interface DashboardSettingsInput {
|
|
22
|
+
publicReadOnly: boolean;
|
|
23
|
+
openTerminalInFeishu: boolean;
|
|
24
|
+
maintenance: MaintenanceCfgInput;
|
|
25
|
+
localDevInstall: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Optional viewer context — `canWrite=false` greys every toggle and surfaces a top-level hint. */
|
|
28
|
+
export interface ComposeOptions {
|
|
29
|
+
/** True when the viewer has write capability (`/api/settings` PUT allowed). Defaults to true. */
|
|
30
|
+
canWrite?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type SettingsSectionKey = 'access' | 'cards' | 'maintenance';
|
|
33
|
+
export type SettingsToggleKey = 'publicReadOnly' | 'openTerminalInFeishu' | 'autoUpdate' | 'autoRestart';
|
|
34
|
+
/** A single toggle row inside a settings section. */
|
|
35
|
+
export interface SettingsToggleDTO {
|
|
36
|
+
key: SettingsToggleKey;
|
|
37
|
+
/** i18n label key — renderer translates via t(). */
|
|
38
|
+
labelKey: string;
|
|
39
|
+
/** i18n hint/help key — renderer translates via t(). */
|
|
40
|
+
hintKey: string;
|
|
41
|
+
/** Current on/off state. */
|
|
42
|
+
enabled: boolean;
|
|
43
|
+
/** UI disabled / enabled state (greyed when disabled). */
|
|
44
|
+
state: ButtonState;
|
|
45
|
+
/** Sub-control: HH:MM time field. Only `autoUpdate` emits this. */
|
|
46
|
+
time?: {
|
|
47
|
+
value: string;
|
|
48
|
+
state: ButtonState;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** A vertical section in the settings card — fixed order: access → cards → maintenance. */
|
|
52
|
+
export interface SettingsSectionDTO {
|
|
53
|
+
key: SettingsSectionKey;
|
|
54
|
+
titleKey: string;
|
|
55
|
+
toggles: SettingsToggleDTO[];
|
|
56
|
+
/** Optional banner shown below toggles (e.g. localDev warning under maintenance). */
|
|
57
|
+
hintKey?: string;
|
|
58
|
+
}
|
|
59
|
+
/** The full settings card DTO. */
|
|
60
|
+
export interface SettingsCardDTO {
|
|
61
|
+
sections: SettingsSectionDTO[];
|
|
62
|
+
/** Top-level read-only banner, set when `canWrite=false`. */
|
|
63
|
+
readOnlyHintKey?: string;
|
|
64
|
+
}
|
|
65
|
+
/** Auto-update is unavailable when running from a local-dev install (cannot self-update). */
|
|
66
|
+
export declare function shouldDisableAutoUpdate(settings: DashboardSettingsInput): boolean;
|
|
67
|
+
/** Auto-restart depends on auto-update being explicitly enabled. */
|
|
68
|
+
export declare function shouldDisableAutoRestart(settings: DashboardSettingsInput): boolean;
|
|
69
|
+
/** Coerce a maintenance time value into a valid HH:MM string; falls back to '04:00'. */
|
|
70
|
+
export declare function formatTimeForDisplay(time: string | undefined | null): string;
|
|
71
|
+
/** Build the full 3-section settings card DTO from raw settings + viewer caps. */
|
|
72
|
+
export declare function composeSections(settings: DashboardSettingsInput, opts?: ComposeOptions): SettingsCardDTO;
|
|
73
|
+
//# sourceMappingURL=settings-card-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-card-model.d.ts","sourceRoot":"","sources":["../../src/dashboard/settings-card-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,mEAAmE;AACnE,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC;AAED,2GAA2G;AAC3G,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,mBAAmB,CAAC;IACjC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,sBAAsB,GACtB,YAAY,GACZ,aAAa,CAAC;AAElB,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,iBAAiB,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,KAAK,EAAE,WAAW,CAAC;IACnB,mEAAmE;IACnE,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,CAAC;CAC9C;AAED,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,kBAAkB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAEjF;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAElF;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAK5E;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,cAAc,GACpB,eAAe,CAwEjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings card model (PR1) — pure projection of DashboardSettings + viewer
|
|
3
|
+
* capability into a 3-section card DTO (access / cards / maintenance).
|
|
4
|
+
*
|
|
5
|
+
* Zero IO. Type-only imports. The input shape mirrors
|
|
6
|
+
* `src/dashboard/web/settings.ts:6-11` but is redeclared locally so the model
|
|
7
|
+
* does not pull in browser-side jsdom assets.
|
|
8
|
+
*/
|
|
9
|
+
/** Auto-update is unavailable when running from a local-dev install (cannot self-update). */
|
|
10
|
+
export function shouldDisableAutoUpdate(settings) {
|
|
11
|
+
return settings.localDevInstall === true;
|
|
12
|
+
}
|
|
13
|
+
/** Auto-restart depends on auto-update being explicitly enabled. */
|
|
14
|
+
export function shouldDisableAutoRestart(settings) {
|
|
15
|
+
return settings.maintenance?.autoUpdate?.enabled !== true;
|
|
16
|
+
}
|
|
17
|
+
/** Coerce a maintenance time value into a valid HH:MM string; falls back to '04:00'. */
|
|
18
|
+
export function formatTimeForDisplay(time) {
|
|
19
|
+
if (typeof time !== 'string')
|
|
20
|
+
return '04:00';
|
|
21
|
+
const trimmed = time.trim();
|
|
22
|
+
if (!/^([01]\d|2[0-3]):[0-5]\d$/.test(trimmed))
|
|
23
|
+
return '04:00';
|
|
24
|
+
return trimmed;
|
|
25
|
+
}
|
|
26
|
+
/** Build the full 3-section settings card DTO from raw settings + viewer caps. */
|
|
27
|
+
export function composeSections(settings, opts) {
|
|
28
|
+
const canWrite = opts?.canWrite !== false;
|
|
29
|
+
const autoUpdateBlocked = shouldDisableAutoUpdate(settings);
|
|
30
|
+
const autoRestartBlocked = shouldDisableAutoRestart(settings);
|
|
31
|
+
const accessSection = {
|
|
32
|
+
key: 'access',
|
|
33
|
+
titleKey: 'settings.sectionAccess',
|
|
34
|
+
toggles: [
|
|
35
|
+
{
|
|
36
|
+
key: 'publicReadOnly',
|
|
37
|
+
labelKey: 'settings.publicReadOnly',
|
|
38
|
+
hintKey: 'settings.publicReadOnlyHelp',
|
|
39
|
+
enabled: settings.publicReadOnly === true,
|
|
40
|
+
state: { enabled: canWrite },
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
const cardsSection = {
|
|
45
|
+
key: 'cards',
|
|
46
|
+
titleKey: 'settings.sectionCards',
|
|
47
|
+
toggles: [
|
|
48
|
+
{
|
|
49
|
+
key: 'openTerminalInFeishu',
|
|
50
|
+
labelKey: 'settings.openTerminalInFeishu',
|
|
51
|
+
hintKey: 'settings.openTerminalInFeishuHelp',
|
|
52
|
+
enabled: settings.openTerminalInFeishu === true,
|
|
53
|
+
state: { enabled: canWrite },
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
const autoUpdateEnabledUi = canWrite && !autoUpdateBlocked;
|
|
58
|
+
const autoRestartEnabledUi = canWrite && !autoRestartBlocked;
|
|
59
|
+
const timeValue = formatTimeForDisplay(settings.maintenance?.autoUpdate?.time);
|
|
60
|
+
// Per-toggle disabled reasons stay specific so the card can tell users what
|
|
61
|
+
// dependency must change before a control becomes writable.
|
|
62
|
+
const autoUpdateReasonKey = autoUpdateBlocked ? 'settings.autoUpdate.disabled.localDev' : undefined;
|
|
63
|
+
const autoRestartReasonKey = autoRestartBlocked ? 'settings.autoRestart.disabled.needsAutoUpdate' : undefined;
|
|
64
|
+
const maintenanceSection = {
|
|
65
|
+
key: 'maintenance',
|
|
66
|
+
titleKey: 'settings.sectionMaintenance',
|
|
67
|
+
toggles: [
|
|
68
|
+
{
|
|
69
|
+
key: 'autoUpdate',
|
|
70
|
+
labelKey: 'settings.autoUpdate',
|
|
71
|
+
hintKey: 'settings.autoUpdateHelp',
|
|
72
|
+
enabled: settings.maintenance?.autoUpdate?.enabled === true,
|
|
73
|
+
state: { enabled: autoUpdateEnabledUi, reasonKey: autoUpdateReasonKey },
|
|
74
|
+
time: {
|
|
75
|
+
value: timeValue,
|
|
76
|
+
state: { enabled: autoUpdateEnabledUi, reasonKey: autoUpdateReasonKey },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: 'autoRestart',
|
|
81
|
+
labelKey: 'settings.autoRestart',
|
|
82
|
+
hintKey: 'settings.autoRestartHelp',
|
|
83
|
+
enabled: settings.maintenance?.autoRestart?.enabled === true,
|
|
84
|
+
state: { enabled: autoRestartEnabledUi, reasonKey: autoRestartReasonKey },
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
hintKey: autoUpdateBlocked ? 'settings.autoUpdateLocalDev' : undefined,
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
sections: [accessSection, cardsSection, maintenanceSection],
|
|
91
|
+
readOnlyHintKey: canWrite ? undefined : 'settings.readOnlyVisitor',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=settings-card-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-card-model.js","sourceRoot":"","sources":["../../src/dashboard/settings-card-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings owner resolver — global owner check for `PUT /__daemon/settings-write`.
|
|
3
|
+
*
|
|
4
|
+
* v1.3 §6.1 pins the owner model: dashboard `settings` is the dashboard
|
|
5
|
+
* process's global config, NOT per-bot, so per-bot `getOwnerOpenId` cannot
|
|
6
|
+
* be used. Instead we accept a sender's `union_id` (Lark verified) and
|
|
7
|
+
* check it against the union of all bots' `allowedUsers`, normalised to
|
|
8
|
+
* `union_id` via `resolveOwnerCandidatesFromAllowedUsers`.
|
|
9
|
+
*
|
|
10
|
+
* Safety contract:
|
|
11
|
+
* - Only `union_id` (`on_`-prefixed) is honoured. We never fall back to
|
|
12
|
+
* `open_id` because `open_id` is app-scoped and not comparable across
|
|
13
|
+
* bots.
|
|
14
|
+
* - When the candidate resolver throws (Lark API blip, file IO error,
|
|
15
|
+
* etc.), we fail CLOSED — return `false` and let the route emit 403.
|
|
16
|
+
* Treating an exception as success would silently grant ownership.
|
|
17
|
+
* - Empty candidate set returns `false` (nothing to match against).
|
|
18
|
+
*/
|
|
19
|
+
import { type OwnerCandidate } from './federation-spoke-api.js';
|
|
20
|
+
export interface SettingsOwnerCheck {
|
|
21
|
+
/** Sender's verified `union_id` (e.g. from `LarkMessage.senderUnionId` on the command path,
|
|
22
|
+
* or `operator.union_id` / `resolveUserUnionId` on the card-callback path). */
|
|
23
|
+
senderUnionId: string | undefined | null;
|
|
24
|
+
}
|
|
25
|
+
/** Deps the resolver needs — injectable so tests don't read bots.json or hit Lark. */
|
|
26
|
+
export interface SettingsOwnerResolverDeps {
|
|
27
|
+
/** Override the candidate fetcher; production omits this and uses the real federation helper. */
|
|
28
|
+
resolveOwnerCandidates?: () => Promise<OwnerCandidate[]>;
|
|
29
|
+
}
|
|
30
|
+
/** Check whether the given `senderUnionId` is allowed to mutate dashboard global settings. */
|
|
31
|
+
export declare function isAuthorizedForGlobalSettings(check: SettingsOwnerCheck, deps?: SettingsOwnerResolverDeps): Promise<boolean>;
|
|
32
|
+
//# sourceMappingURL=settings-owner-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-owner-resolver.d.ts","sourceRoot":"","sources":["../../src/dashboard/settings-owner-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC;oFACgF;IAChF,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAC1C;AAED,sFAAsF;AACtF,MAAM,WAAW,yBAAyB;IACxC,iGAAiG;IACjG,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC1D;AAED,8FAA8F;AAC9F,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kBAAkB,EACzB,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings owner resolver — global owner check for `PUT /__daemon/settings-write`.
|
|
3
|
+
*
|
|
4
|
+
* v1.3 §6.1 pins the owner model: dashboard `settings` is the dashboard
|
|
5
|
+
* process's global config, NOT per-bot, so per-bot `getOwnerOpenId` cannot
|
|
6
|
+
* be used. Instead we accept a sender's `union_id` (Lark verified) and
|
|
7
|
+
* check it against the union of all bots' `allowedUsers`, normalised to
|
|
8
|
+
* `union_id` via `resolveOwnerCandidatesFromAllowedUsers`.
|
|
9
|
+
*
|
|
10
|
+
* Safety contract:
|
|
11
|
+
* - Only `union_id` (`on_`-prefixed) is honoured. We never fall back to
|
|
12
|
+
* `open_id` because `open_id` is app-scoped and not comparable across
|
|
13
|
+
* bots.
|
|
14
|
+
* - When the candidate resolver throws (Lark API blip, file IO error,
|
|
15
|
+
* etc.), we fail CLOSED — return `false` and let the route emit 403.
|
|
16
|
+
* Treating an exception as success would silently grant ownership.
|
|
17
|
+
* - Empty candidate set returns `false` (nothing to match against).
|
|
18
|
+
*/
|
|
19
|
+
import { resolveOwnerCandidatesFromAllowedUsers as defaultResolveOwnerCandidates, } from './federation-spoke-api.js';
|
|
20
|
+
/** Check whether the given `senderUnionId` is allowed to mutate dashboard global settings. */
|
|
21
|
+
export async function isAuthorizedForGlobalSettings(check, deps = {}) {
|
|
22
|
+
// Strict union_id gate — no open_id fallback under any condition.
|
|
23
|
+
if (typeof check.senderUnionId !== 'string')
|
|
24
|
+
return false;
|
|
25
|
+
const trimmed = check.senderUnionId.trim();
|
|
26
|
+
if (trimmed.length === 0)
|
|
27
|
+
return false;
|
|
28
|
+
if (!trimmed.startsWith('on_'))
|
|
29
|
+
return false;
|
|
30
|
+
const resolve = deps.resolveOwnerCandidates ?? (() => defaultResolveOwnerCandidates({ skipNames: true }));
|
|
31
|
+
let candidates;
|
|
32
|
+
try {
|
|
33
|
+
candidates = await resolve();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Fail closed — cannot prove ownership when resolver errors.
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (candidates.length === 0)
|
|
40
|
+
return false;
|
|
41
|
+
return candidates.some(c => c.unionId === trimmed);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=settings-owner-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-owner-resolver.js","sourceRoot":"","sources":["../../src/dashboard/settings-owner-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,sCAAsC,IAAI,6BAA6B,GAExE,MAAM,2BAA2B,CAAC;AAcnC,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAAyB,EACzB,OAAkC,EAAE;IAEpC,kEAAkE;IAClE,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,IAAI,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE1G,IAAI,UAA4B,CAAC;IACjC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACrD,CAAC"}
|