botmux 2.88.1 → 2.90.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/README.en.md +3 -3
- package/README.md +3 -3
- 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/skills/discovery.d.ts +16 -0
- package/dist/core/skills/discovery.d.ts.map +1 -1
- package/dist/core/skills/discovery.js +48 -2
- package/dist/core/skills/discovery.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +9 -2
- package/dist/core/worker-pool.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/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +60 -2
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights.d.ts.map +1 -1
- package/dist/dashboard/web/insights.js +514 -68
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/skills.d.ts.map +1 -1
- package/dist/dashboard/web/skills.js +1 -1
- package/dist/dashboard/web/skills.js.map +1 -1
- package/dist/dashboard/web/whiteboards.js +3 -3
- 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-web/app.js +883 -795
- package/dist/dashboard-web/style.css +105 -3
- package/dist/dashboard.js +196 -269
- 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/dist/services/insight/classify.d.ts +2 -0
- package/dist/services/insight/classify.d.ts.map +1 -1
- package/dist/services/insight/classify.js +25 -0
- package/dist/services/insight/classify.js.map +1 -1
- package/dist/services/insight/claude-span-reader.d.ts.map +1 -1
- package/dist/services/insight/claude-span-reader.js +7 -4
- package/dist/services/insight/claude-span-reader.js.map +1 -1
- package/dist/services/insight/report.d.ts.map +1 -1
- package/dist/services/insight/report.js +102 -23
- package/dist/services/insight/report.js.map +1 -1
- package/dist/services/insight/subagent-reader.d.ts +19 -0
- package/dist/services/insight/subagent-reader.d.ts.map +1 -0
- package/dist/services/insight/subagent-reader.js +111 -0
- package/dist/services/insight/subagent-reader.js.map +1 -0
- package/dist/services/insight/types.d.ts +43 -0
- package/dist/services/insight/types.d.ts.map +1 -1
- package/dist/services/insight/types.js.map +1 -1
- package/dist/skills/definitions.d.ts +8 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +8 -2
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +15 -0
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +39 -1
- package/dist/skills/installer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings write applier — single source of truth for what
|
|
3
|
+
* `PUT /api/settings` (`dashboard.ts:460-498`) used to do inline.
|
|
4
|
+
*
|
|
5
|
+
* Lives in `src/dashboard/` so both:
|
|
6
|
+
* - the existing browser-facing `PUT /api/settings` route
|
|
7
|
+
* - the new HMAC-gated `PUT /__daemon/settings-write` route
|
|
8
|
+
* share the same validation + persistence path. Behaviour is byte-equivalent
|
|
9
|
+
* to the original inline implementation; the only change is that all IO is
|
|
10
|
+
* funnelled through `deps`, so tests don't touch `~/.botmux`.
|
|
11
|
+
*/
|
|
12
|
+
import type { DashboardGlobalConfig, GlobalConfig, MaintenanceConfig } from '../global-config.js';
|
|
13
|
+
/**
|
|
14
|
+
* Snapshot returned by `resolveDashboardSettings` — mirrors the existing
|
|
15
|
+
* `ResolvedDashboardSettings` interface in `dashboard.ts:69-80`. We redeclare
|
|
16
|
+
* it locally rather than reaching across that boundary because the applier
|
|
17
|
+
* doesn't know how the host computes the snapshot (it just calls a closure).
|
|
18
|
+
*/
|
|
19
|
+
export interface ResolvedDashboardSettingsView {
|
|
20
|
+
publicReadOnly: boolean;
|
|
21
|
+
openTerminalInFeishu: boolean;
|
|
22
|
+
maintenance: MaintenanceConfig;
|
|
23
|
+
localDevInstall: boolean;
|
|
24
|
+
}
|
|
25
|
+
export type ParseMaintenanceResult = {
|
|
26
|
+
ok: true;
|
|
27
|
+
patch: MaintenanceConfig;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: string;
|
|
31
|
+
};
|
|
32
|
+
/** All IO this helper needs — injected so tests use mocks, production wires real impls. */
|
|
33
|
+
export interface SettingsWriteApplierDeps {
|
|
34
|
+
/** Snapshot of `~/.botmux/config.json`. Used to look up the persisted autoUpdate state when the incoming patch doesn't change it. */
|
|
35
|
+
readGlobalConfig: () => GlobalConfig;
|
|
36
|
+
/** Atomic write of dashboard-level fields (publicReadOnly / openTerminalInFeishu). */
|
|
37
|
+
mergeDashboardConfig: (patch: DashboardGlobalConfig) => DashboardGlobalConfig;
|
|
38
|
+
/** Atomic write of global-level fields (repoPickerMode). */
|
|
39
|
+
mergeGlobalConfig: (patch: Partial<GlobalConfig>) => void;
|
|
40
|
+
/** Atomic write of maintenance-level fields (autoUpdate / autoRestart). */
|
|
41
|
+
mergeMaintenanceConfig: (patch: MaintenanceConfig) => MaintenanceConfig;
|
|
42
|
+
/** Set global UI locale (null = clear). Fans out to daemons via IPC. */
|
|
43
|
+
setGlobalLocale: (locale: 'zh' | 'en' | null) => void;
|
|
44
|
+
/** Type-strict body validator for the maintenance segment. */
|
|
45
|
+
parseMaintenancePatch: (body: unknown) => ParseMaintenanceResult;
|
|
46
|
+
/** True iff the current install is a source-checkout (auto-update unavailable). */
|
|
47
|
+
isLocalDevInstall: () => boolean;
|
|
48
|
+
/** Returns the post-merge view the response body echoes back to the caller. */
|
|
49
|
+
resolveDashboardSettings: () => ResolvedDashboardSettingsView;
|
|
50
|
+
/** Validate locale string. */
|
|
51
|
+
isLocale: (v: unknown) => v is 'zh' | 'en';
|
|
52
|
+
/** Fan out locale reload to all online daemons. */
|
|
53
|
+
reloadLocaleOnAllDaemons?: () => Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
/** Production deps wiring — call once per dashboard process. */
|
|
56
|
+
export declare function defaultSettingsWriteApplierDeps(resolveDashboardSettings: () => ResolvedDashboardSettingsView, reloadLocaleOnAllDaemons?: () => Promise<void>): SettingsWriteApplierDeps;
|
|
57
|
+
export type ApplySettingsWriteResult = {
|
|
58
|
+
ok: true;
|
|
59
|
+
settings: ResolvedDashboardSettingsView;
|
|
60
|
+
} | {
|
|
61
|
+
ok: false;
|
|
62
|
+
error: ApplySettingsWriteError;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Discrete error codes — every one of these MUST match the strings the old
|
|
66
|
+
* inline `PUT /api/settings` route returned, so callers (browser SPA, tests,
|
|
67
|
+
* PR2 Route B) see the same wire vocabulary they had before.
|
|
68
|
+
*/
|
|
69
|
+
export type ApplySettingsWriteError = 'invalid_publicReadOnly' | 'invalid_openTerminalInFeishu' | 'invalid_repoPickerMode' | 'invalid_whiteboard' | 'invalid_whiteboard_enabled' | 'invalid_lang' | 'invalid_maintenance' | 'local_dev_no_autoupdate' | 'autoupdate_required' | 'empty_patch' | string;
|
|
70
|
+
/**
|
|
71
|
+
* Apply a parsed (object) settings patch. Returns success with the post-merge
|
|
72
|
+
* snapshot, or an error code string on validation failure.
|
|
73
|
+
*
|
|
74
|
+
* Behaviour mirrors `dashboard.ts:460-498` exactly:
|
|
75
|
+
* - Validates `publicReadOnly` / `openTerminalInFeishu` are booleans.
|
|
76
|
+
* - Validates `repoPickerMode` is 'all' | 'repos'.
|
|
77
|
+
* - Validates `lang` is a valid locale or null.
|
|
78
|
+
* - Defers maintenance validation to `parseMaintenancePatch` (returns its error verbatim).
|
|
79
|
+
* - Forbids enabling `autoUpdate` on a local-dev install.
|
|
80
|
+
* - Forbids enabling `autoRestart` unless `autoUpdate` is (or is being) enabled.
|
|
81
|
+
* - Returns `empty_patch` when no fields changed.
|
|
82
|
+
*/
|
|
83
|
+
export declare function applySettingsWrite(body: unknown, deps: SettingsWriteApplierDeps): Promise<ApplySettingsWriteResult>;
|
|
84
|
+
//# sourceMappingURL=settings-write-applier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-write-applier.d.ts","sourceRoot":"","sources":["../../src/dashboard/settings-write-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAY7B;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC5C,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,2FAA2F;AAC3F,MAAM,WAAW,wBAAwB;IACvC,qIAAqI;IACrI,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,sFAAsF;IACtF,oBAAoB,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,qBAAqB,CAAC;IAC9E,4DAA4D;IAC5D,iBAAiB,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC1D,2EAA2E;IAC3E,sBAAsB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;IACxE,wEAAwE;IACxE,eAAe,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,8DAA8D;IAC9D,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IACjE,mFAAmF;IACnF,iBAAiB,EAAE,MAAM,OAAO,CAAC;IACjC,+EAA+E;IAC/E,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;IAC9D,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC;IAC3C,mDAAmD;IACnD,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,gEAAgE;AAChE,wBAAgB,+BAA+B,CAC7C,wBAAwB,EAAE,MAAM,6BAA6B,EAC7D,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC7C,wBAAwB,CAa1B;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,6BAA6B,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAC/B,wBAAwB,GACxB,8BAA8B,GAC9B,wBAAwB,GACxB,oBAAoB,GACpB,4BAA4B,GAC5B,cAAc,GACd,qBAAqB,GACrB,yBAAyB,GACzB,qBAAqB,GACrB,aAAa,GACb,MAAM,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAgFnC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings write applier — single source of truth for what
|
|
3
|
+
* `PUT /api/settings` (`dashboard.ts:460-498`) used to do inline.
|
|
4
|
+
*
|
|
5
|
+
* Lives in `src/dashboard/` so both:
|
|
6
|
+
* - the existing browser-facing `PUT /api/settings` route
|
|
7
|
+
* - the new HMAC-gated `PUT /__daemon/settings-write` route
|
|
8
|
+
* share the same validation + persistence path. Behaviour is byte-equivalent
|
|
9
|
+
* to the original inline implementation; the only change is that all IO is
|
|
10
|
+
* funnelled through `deps`, so tests don't touch `~/.botmux`.
|
|
11
|
+
*/
|
|
12
|
+
import { mergeDashboardConfig, mergeGlobalConfig, mergeMaintenanceConfig, parseMaintenancePatch, readGlobalConfig, setGlobalLocale, } from '../global-config.js';
|
|
13
|
+
import { isLocale } from '../i18n/types.js';
|
|
14
|
+
import { isLocalDevInstall } from '../utils/install-info.js';
|
|
15
|
+
/** Production deps wiring — call once per dashboard process. */
|
|
16
|
+
export function defaultSettingsWriteApplierDeps(resolveDashboardSettings, reloadLocaleOnAllDaemons) {
|
|
17
|
+
return {
|
|
18
|
+
readGlobalConfig,
|
|
19
|
+
mergeDashboardConfig,
|
|
20
|
+
mergeGlobalConfig,
|
|
21
|
+
mergeMaintenanceConfig,
|
|
22
|
+
setGlobalLocale,
|
|
23
|
+
parseMaintenancePatch,
|
|
24
|
+
isLocalDevInstall,
|
|
25
|
+
resolveDashboardSettings,
|
|
26
|
+
isLocale,
|
|
27
|
+
reloadLocaleOnAllDaemons,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Apply a parsed (object) settings patch. Returns success with the post-merge
|
|
32
|
+
* snapshot, or an error code string on validation failure.
|
|
33
|
+
*
|
|
34
|
+
* Behaviour mirrors `dashboard.ts:460-498` exactly:
|
|
35
|
+
* - Validates `publicReadOnly` / `openTerminalInFeishu` are booleans.
|
|
36
|
+
* - Validates `repoPickerMode` is 'all' | 'repos'.
|
|
37
|
+
* - Validates `lang` is a valid locale or null.
|
|
38
|
+
* - Defers maintenance validation to `parseMaintenancePatch` (returns its error verbatim).
|
|
39
|
+
* - Forbids enabling `autoUpdate` on a local-dev install.
|
|
40
|
+
* - Forbids enabling `autoRestart` unless `autoUpdate` is (or is being) enabled.
|
|
41
|
+
* - Returns `empty_patch` when no fields changed.
|
|
42
|
+
*/
|
|
43
|
+
export async function applySettingsWrite(body, deps) {
|
|
44
|
+
const obj = body && typeof body === 'object' && !Array.isArray(body)
|
|
45
|
+
? body
|
|
46
|
+
: {};
|
|
47
|
+
const patch = {};
|
|
48
|
+
if ('publicReadOnly' in obj) {
|
|
49
|
+
if (typeof obj.publicReadOnly !== 'boolean') {
|
|
50
|
+
return { ok: false, error: 'invalid_publicReadOnly' };
|
|
51
|
+
}
|
|
52
|
+
patch.publicReadOnly = obj.publicReadOnly;
|
|
53
|
+
}
|
|
54
|
+
if ('openTerminalInFeishu' in obj) {
|
|
55
|
+
if (typeof obj.openTerminalInFeishu !== 'boolean') {
|
|
56
|
+
return { ok: false, error: 'invalid_openTerminalInFeishu' };
|
|
57
|
+
}
|
|
58
|
+
patch.openTerminalInFeishu = obj.openTerminalInFeishu;
|
|
59
|
+
}
|
|
60
|
+
let touched = false;
|
|
61
|
+
if (Object.keys(patch).length > 0) {
|
|
62
|
+
deps.mergeDashboardConfig(patch);
|
|
63
|
+
touched = true;
|
|
64
|
+
}
|
|
65
|
+
if ('repoPickerMode' in obj) {
|
|
66
|
+
const v = obj.repoPickerMode;
|
|
67
|
+
if (v !== 'all' && v !== 'repos') {
|
|
68
|
+
return { ok: false, error: 'invalid_repoPickerMode' };
|
|
69
|
+
}
|
|
70
|
+
deps.mergeGlobalConfig({ repoPickerMode: v });
|
|
71
|
+
touched = true;
|
|
72
|
+
}
|
|
73
|
+
if ('whiteboard' in obj) {
|
|
74
|
+
const raw = obj.whiteboard;
|
|
75
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
76
|
+
return { ok: false, error: 'invalid_whiteboard' };
|
|
77
|
+
}
|
|
78
|
+
const wb = raw;
|
|
79
|
+
if (typeof wb.enabled !== 'boolean') {
|
|
80
|
+
return { ok: false, error: 'invalid_whiteboard_enabled' };
|
|
81
|
+
}
|
|
82
|
+
deps.mergeGlobalConfig({ whiteboard: { enabled: wb.enabled } });
|
|
83
|
+
touched = true;
|
|
84
|
+
}
|
|
85
|
+
if ('maintenance' in obj) {
|
|
86
|
+
const r = deps.parseMaintenancePatch(obj.maintenance);
|
|
87
|
+
if (!r.ok)
|
|
88
|
+
return { ok: false, error: r.error };
|
|
89
|
+
// Auto-update is npm-global only; refuse enabling it on a source checkout.
|
|
90
|
+
if (r.patch.autoUpdate?.enabled && deps.isLocalDevInstall()) {
|
|
91
|
+
return { ok: false, error: 'local_dev_no_autoupdate' };
|
|
92
|
+
}
|
|
93
|
+
// Auto-restart only applies an auto-update — it's meaningless without it.
|
|
94
|
+
if (r.patch.autoRestart?.enabled) {
|
|
95
|
+
const autoUpdateOn = r.patch.autoUpdate?.enabled
|
|
96
|
+
?? deps.readGlobalConfig().maintenance?.autoUpdate?.enabled
|
|
97
|
+
?? false;
|
|
98
|
+
if (!autoUpdateOn)
|
|
99
|
+
return { ok: false, error: 'autoupdate_required' };
|
|
100
|
+
}
|
|
101
|
+
deps.mergeMaintenanceConfig(r.patch);
|
|
102
|
+
touched = true;
|
|
103
|
+
}
|
|
104
|
+
if ('lang' in obj) {
|
|
105
|
+
const v = obj.lang;
|
|
106
|
+
if (v !== null && !deps.isLocale(v)) {
|
|
107
|
+
return { ok: false, error: 'invalid_lang' };
|
|
108
|
+
}
|
|
109
|
+
deps.setGlobalLocale(v === null ? null : v);
|
|
110
|
+
if (deps.reloadLocaleOnAllDaemons) {
|
|
111
|
+
await deps.reloadLocaleOnAllDaemons();
|
|
112
|
+
}
|
|
113
|
+
touched = true;
|
|
114
|
+
}
|
|
115
|
+
if (!touched)
|
|
116
|
+
return { ok: false, error: 'empty_patch' };
|
|
117
|
+
return { ok: true, settings: deps.resolveDashboardSettings() };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=settings-write-applier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-write-applier.js","sourceRoot":"","sources":["../../src/dashboard/settings-write-applier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAI1C,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAI1C,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AA4lFtE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAM/E;AAED,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,SAAS,MAAM,EAAO,GAAG,eAAe,CAMxF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CASpI;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAGrH"}
|
|
@@ -189,7 +189,7 @@ const zh = {
|
|
|
189
189
|
'insights.filterFailed': '有失败',
|
|
190
190
|
'insights.filterSlow': '有慢 span',
|
|
191
191
|
'insights.loading': '分析中…',
|
|
192
|
-
'insights.loaded': '
|
|
192
|
+
'insights.loaded': '已加载 {count} 个会话',
|
|
193
193
|
'insights.unavailable': '加载失败',
|
|
194
194
|
'insights.listCount': '显示 {shown}/{total}',
|
|
195
195
|
'insights.tabOverview': '总览',
|
|
@@ -210,12 +210,21 @@ const zh = {
|
|
|
210
210
|
'insights.distSlow': '每会话慢 span',
|
|
211
211
|
'insights.distAgentTime': 'agent 工作时长',
|
|
212
212
|
'insights.distRw': '读改比',
|
|
213
|
+
'insights.distChurn': '代码改动行数',
|
|
214
|
+
'insights.distTrend': '按天趋势(近 4 周)',
|
|
215
|
+
'insights.distTrendSub': '每日会话数',
|
|
213
216
|
'insights.distMedian': '中位 {v}',
|
|
214
217
|
'insights.distEmpty': '当前筛选下没有可分析的会话。',
|
|
218
|
+
'insights.disclosure': '口径:耗时只算工具执行时间,已剔除等用户回复(问答/计划确认)的挂机时长,故不反映墙钟时长;Codex 会话的「读」多走 shell(exec_command),不计入「读」相,故其读改比会偏低甚至为 0;代码改动按 patch 解析,仅取每会话最活跃的若干文件,与 Claude 的结构化统计口径不同。跨工具的分布与比值仅供参考,不宜直接对比。',
|
|
219
|
+
'insights.rwNote': 'Codex 读多走 shell,未计入读相',
|
|
220
|
+
'insights.viewSessions': '按会话查看',
|
|
215
221
|
'insights.hotHint': '跨会话复发信号——最该收敛的地方。',
|
|
216
222
|
'insights.hotToolFailures': '工具报错热点',
|
|
217
223
|
'insights.hotSlowSessions': '最慢的会话',
|
|
218
224
|
'insights.hotProjects': '项目分布',
|
|
225
|
+
'insights.hotFiles': '文件复发热点',
|
|
226
|
+
'insights.hotCommands': '命令复发热点',
|
|
227
|
+
'insights.hotErrors': '报错复发热点',
|
|
219
228
|
'insights.hotComingSoon': '文件 / 命令复发热点即将上线(需给引擎加跨会话聚合)。',
|
|
220
229
|
'insights.hotSessionsCol': '会话',
|
|
221
230
|
'insights.hotFailsCol': '失败',
|
|
@@ -228,6 +237,26 @@ const zh = {
|
|
|
228
237
|
'insights.sortFails': '失败',
|
|
229
238
|
'insights.sortSlow': '慢',
|
|
230
239
|
'insights.sortAgent': '时长',
|
|
240
|
+
'insights.layoutCard': '卡片',
|
|
241
|
+
'insights.layoutTable': '表格',
|
|
242
|
+
'insights.colTitle': '会话',
|
|
243
|
+
'insights.colProject': '项目',
|
|
244
|
+
'insights.colTime': '时间',
|
|
245
|
+
'insights.paletteOpen': '跳转 ⌘K',
|
|
246
|
+
'insights.palettePlaceholder': '跳转到 tab 或搜索会话…',
|
|
247
|
+
'insights.paletteTabs': '视图',
|
|
248
|
+
'insights.paletteSessions': '会话',
|
|
249
|
+
'insights.paletteEmpty': '没有匹配项',
|
|
250
|
+
'insights.tabFlow': '行为流',
|
|
251
|
+
'insights.flowHint': '智能体把动作与时间花在哪些活动阶段,以及各会话的节奏分布。',
|
|
252
|
+
'insights.flowPipeline': '活动阶段流水线',
|
|
253
|
+
'insights.flowPipeSub': '研究 → 修改 → 运行 → 委派 → 讨论;上=动作数,下=耗时',
|
|
254
|
+
'insights.flowShares': '动作占比 vs 时间占比',
|
|
255
|
+
'insights.flowActShare': '动作占比',
|
|
256
|
+
'insights.flowTimeShare': '时间占比',
|
|
257
|
+
'insights.flowRhythm': '各会话节奏(按时长)',
|
|
258
|
+
'insights.subagents': '子代理',
|
|
259
|
+
'insights.subagentsHint': '本会话委派出去的子代理(Task/Agent),各自做了什么、跑了多久。',
|
|
231
260
|
'insights.readsShort': '读',
|
|
232
261
|
'insights.editsShort': '改',
|
|
233
262
|
'insights.durShort': '时长',
|
|
@@ -1483,7 +1512,7 @@ const en = {
|
|
|
1483
1512
|
'insights.filterFailed': 'Has failures',
|
|
1484
1513
|
'insights.filterSlow': 'Has slow spans',
|
|
1485
1514
|
'insights.loading': 'Analyzing…',
|
|
1486
|
-
'insights.loaded': '
|
|
1515
|
+
'insights.loaded': 'Loaded {count} sessions',
|
|
1487
1516
|
'insights.unavailable': 'Load failed',
|
|
1488
1517
|
'insights.listCount': 'showing {shown}/{total}',
|
|
1489
1518
|
'insights.tabOverview': 'Overview',
|
|
@@ -1504,12 +1533,21 @@ const en = {
|
|
|
1504
1533
|
'insights.distSlow': 'Slow spans per session',
|
|
1505
1534
|
'insights.distAgentTime': 'Agent working time',
|
|
1506
1535
|
'insights.distRw': 'Read/write ratio',
|
|
1536
|
+
'insights.distChurn': 'Code churn (lines)',
|
|
1537
|
+
'insights.distTrend': 'Trend by day (last 4 weeks)',
|
|
1538
|
+
'insights.distTrendSub': 'sessions / day',
|
|
1507
1539
|
'insights.distMedian': 'median {v}',
|
|
1508
1540
|
'insights.distEmpty': 'No analyzable sessions under the current filter.',
|
|
1541
|
+
'insights.disclosure': 'Measurement note: durations count tool-execution time only and exclude time spent waiting for a user reply (question / plan approval), so they do not reflect wall-clock; Codex reads files mostly via shell (exec_command), not counted as "read", so its read/write ratio runs low or 0; code churn is parsed from patches and covers only each session\'s most active files. Cross-tool distributions and ratios are indicative only, not directly comparable.',
|
|
1542
|
+
'insights.rwNote': 'Codex reads mostly via shell, not counted as reads',
|
|
1543
|
+
'insights.viewSessions': 'View sessions',
|
|
1509
1544
|
'insights.hotHint': 'Cross-session recurrence — where it pays to converge.',
|
|
1510
1545
|
'insights.hotToolFailures': 'Tool failure hotspots',
|
|
1511
1546
|
'insights.hotSlowSessions': 'Slowest sessions',
|
|
1512
1547
|
'insights.hotProjects': 'Projects',
|
|
1548
|
+
'insights.hotFiles': 'File recurrence',
|
|
1549
|
+
'insights.hotCommands': 'Command recurrence',
|
|
1550
|
+
'insights.hotErrors': 'Error recurrence',
|
|
1513
1551
|
'insights.hotComingSoon': 'File / command recurrence hotspots coming soon (needs cross-session engine aggregation).',
|
|
1514
1552
|
'insights.hotSessionsCol': 'sessions',
|
|
1515
1553
|
'insights.hotFailsCol': 'fails',
|
|
@@ -1522,6 +1560,26 @@ const en = {
|
|
|
1522
1560
|
'insights.sortFails': 'Failures',
|
|
1523
1561
|
'insights.sortSlow': 'Slow',
|
|
1524
1562
|
'insights.sortAgent': 'Duration',
|
|
1563
|
+
'insights.layoutCard': 'Cards',
|
|
1564
|
+
'insights.layoutTable': 'Table',
|
|
1565
|
+
'insights.colTitle': 'Session',
|
|
1566
|
+
'insights.colProject': 'Project',
|
|
1567
|
+
'insights.colTime': 'Time',
|
|
1568
|
+
'insights.paletteOpen': 'Jump ⌘K',
|
|
1569
|
+
'insights.palettePlaceholder': 'Jump to a tab or search sessions…',
|
|
1570
|
+
'insights.paletteTabs': 'Views',
|
|
1571
|
+
'insights.paletteSessions': 'Sessions',
|
|
1572
|
+
'insights.paletteEmpty': 'No matches',
|
|
1573
|
+
'insights.tabFlow': 'Flow',
|
|
1574
|
+
'insights.flowHint': 'Where the agent spends its actions and time across activity phases, and each session’s rhythm.',
|
|
1575
|
+
'insights.flowPipeline': 'Activity-phase pipeline',
|
|
1576
|
+
'insights.flowPipeSub': 'research → edit → run → delegate → discuss; top = actions, bottom = time',
|
|
1577
|
+
'insights.flowShares': 'Action share vs time share',
|
|
1578
|
+
'insights.flowActShare': 'Action share',
|
|
1579
|
+
'insights.flowTimeShare': 'Time share',
|
|
1580
|
+
'insights.flowRhythm': 'Per-session rhythm (by duration)',
|
|
1581
|
+
'insights.subagents': 'Sub-agents',
|
|
1582
|
+
'insights.subagentsHint': 'Sub-agents this session delegated to (Task/Agent) — what each did and how long it ran.',
|
|
1525
1583
|
'insights.readsShort': 'read',
|
|
1526
1584
|
'insights.editsShort': 'edit',
|
|
1527
1585
|
'insights.durShort': 'dur',
|