dsh-calorie 0.2.4 → 0.2.6
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/bridge.d.ts +59 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +123 -1
- package/dist/bridge.js.map +1 -1
- package/dist/client.js +520 -46
- package/dist/client.js.map +1 -1
- package/dist/config-defaults.d.ts +16 -0
- package/dist/config-defaults.d.ts.map +1 -0
- package/dist/config-defaults.js +94 -0
- package/dist/config-defaults.js.map +1 -0
- package/dist/contract.d.ts +33 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +20 -0
- package/dist/contract.js.map +1 -1
- package/dist/dsh-ctx.d.ts +2 -0
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +38 -8
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +143 -7
- package/dist/settings.js.map +1 -1
- package/dist/slot.d.ts +10 -4
- package/dist/slot.d.ts.map +1 -1
- package/dist/slot.js +0 -4
- package/dist/slot.js.map +1 -1
- package/package.json +3 -3
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["React"],"sources":["../src/contract.ts","../src/slot.ts","../src/settings.ts","../src/client.ts"],"sourcesContent":["/** dsh-calorie 端口(port):DSH 世界与卡路里 hexagon 之间的契约。\n *\n * browser 安全:零 node 导入。host 适配器(注册 RPC 通道)与 client\n * 适配器(调用 RPC)共用同一份定义;单测与 loader 回路以此为准。\n * 通道命名遵守宿主约束:单段且不等于 /api(见 cookbook「RPC 通道」)。\n */\nexport const RPC_CHANNEL = '/ilife-calorie' as const;\nexport const RPC_ENDPOINT_READ = 'read' as const;\n\n/** 读请求载荷:与技能 CLI 的 key/params 同形(见 skill-calorie SKILL.md)。 */\nexport interface ReadPayload {\n readonly key: string;\n readonly params: Record<string, unknown>;\n}\n\nexport interface RpcError {\n readonly code: string;\n readonly message: string;\n readonly details: Record<string, unknown>;\n}\n\nexport type RpcResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly error: RpcError };\n\nexport function ok(value: unknown): RpcResult {\n return { ok: true, value };\n}\n\nexport function fail(code: string, message: string): RpcResult {\n return { ok: false, error: { code, message, details: {} } };\n}\n\n/** 载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */\nexport function parseReadPayload(raw: unknown): ReadPayload | null {\n if (typeof raw !== 'object' || raw === null) return null;\n const { key, params } = raw as { key?: unknown; params?: unknown };\n if (typeof key !== 'string' || key.length === 0) return null;\n if (typeof params !== 'object' || params === null || Array.isArray(params)) return null;\n return { key, params: params as Record<string, unknown> };\n}\n\n/** 面板默认读键(与 HITL 一致性对比同键)。 */\nexport const DEFAULT_READ_KEY = 'calorie.view.home' as const;\n\n/** 信封守卫:供 client 拆包前校验(port 拥有信封定义,守卫住 port)。 */\nexport function isRpcResult(raw: unknown): raw is RpcResult {\n if (typeof raw !== 'object' || raw === null) return false;\n const ok = (raw as { ok?: unknown }).ok;\n return ok === true || ok === false;\n}\n","/** dsh-calorie 槽位描述(P10 脚手架,P3 #4 定案)。\n *\n * 写死槽位原生组件:id 命名空间 ilife:calorie,order 75。\n * 注册与打开只走 registerTab/openTab 的路径导航;子页后缀(如 ilife:calorie:*)\n * 只在主面板内导航,不占栏。缺席纯条件渲染,不轮询(本文件无定时器;\n * 有界重试归一由 base-render 拥有,单品不自建)。\n */\n\nexport const SKILL = 'calorie' as const;\nexport const SLOT_ID = 'ilife:calorie' as const;\nexport const SLOT_ORDER = 75 as const;\nexport const SLOT_TITLE = '卡路里' as const;\nexport const PLUGIN = 'dsh-calorie' as const;\nexport const MANAGER_PLUGIN = 'dsh-life-pack' as const;\nexport const SKILL_PACKAGE = 'skill-calorie' as const;\n\n/** 版本行唯一来源(面板展示用;smoke 断言与两处 package.json 一致,防漂移)。\n * 发版 bump 时同步改这里(与 package.json 同值)。 */\nexport const PLUGIN_VERSION = '0.2.4' as const;\nexport const SKILL_VERSION = '0.2.3' as const;\n\nexport interface SlotDescriptor {\n readonly skill: string;\n readonly slotId: string;\n readonly order: number;\n readonly title: string;\n readonly kind: 'page';\n}\n\nexport function slotDescriptor(): SlotDescriptor {\n return { skill: SKILL, slotId: SLOT_ID, order: SLOT_ORDER, title: SLOT_TITLE, kind: 'page' };\n}\n\n/** 写死原生组件描述(纯数据,无按需加载,无外嵌页)。 */\nexport const TAB_COMPONENT = { kind: 'native', name: 'CaloriePanel' } as const;\n\nexport interface TabsPort {\n hasTabs(): boolean;\n registerTab(entry: { readonly id: string; readonly title: string; readonly order: number; readonly single: boolean; readonly component: unknown }): () => void;\n openTab(seed: { readonly type: string; readonly path: string }, scope?: { readonly sessionId?: string }): void;\n}\n\n/** 自注册:幂等(调用方持 disposer),失败返回 false 由调用方决定重试。 */\nexport function registerSingle(port: TabsPort): (() => void) | null {\n if (!port.hasTabs()) return null;\n return port.registerTab({ id: SLOT_ID, title: SLOT_TITLE, order: SLOT_ORDER, single: true, component: TAB_COMPONENT });\n}\n\n/** 内容型打开:path seed,折叠面板自动展开。 */\nexport function openSingle(port: TabsPort, sessionId?: string): void {\n if (!port.hasTabs()) return;\n port.openTab({ type: SLOT_ID, path: SLOT_ID }, sessionId ? { sessionId } : undefined);\n}\n","/** dsh-calorie 设置页(P10 脚手架:设置页住单品包)。\n *\n * 一次 registerTab,两处呈现:边栏 + 号菜单多一项,DSH 设置页侧边卡片\n * 分区自动多一张小卡片(注册表驱动、无硬编码,开关缺省启用)。\n * 本文件只声明本单品自己的设置行;总管不声明设置(见 boundaries 断言)。\n */\n\nexport const SETTINGS_OWNER = 'dsh-calorie' as const;\nexport const SETTINGS_SLOT = 'ilife:calorie' as const;\n\nexport interface SettingRow {\n readonly key: string;\n readonly title: string;\n readonly control: 'switch' | 'text' | 'number';\n}\n\n/** 脚手架期唯一设置行:总开关(缺省启用,与官方关闭语义对齐)。 */\nexport const SETTING_ROWS: readonly SettingRow[] = [\n { key: 'enabled', title: '卡路里面板启用', control: 'switch' },\n];\n","/** dsh-calorie client 适配器(六边形:port=contract+dsh-ctx 镜像,adapter=本文件)。\n *\n * 产物经 tsdown 打成 loader 工厂包(browser/CJS,见 tsdown.config.ts)。\n * 本文件传递闭包:禁 node、禁 DOM 直写(document/window/process)。\n * 注册两处(grill 定案,新术语见 CONTEXT.md):\n * (a) 技能设置页 → 爱生活页签槽(总管声明的 children,各技能自研自家配置页);\n * (b) 技能功能页 → sidebar槽(better-sidebar 服务,非 DSH slot;软依赖,\n * 缺席即跳过,不断链。DSH右侧槽 + sidebar.footer.action 彻底出局,已删)。\n * 有界重试例外依据(唯一允许的定时器):注册重试非数据轮询,照抄\n * dsh-mattpocock-skills-deck/src/client/panelAssembly.js:100-108\n * (betterSidebar 服务可能晚于本模块到达,最多 10 次、间隔 1000ms;卸载清理)。\n * 样式:React 内联 style + DSH 主题别名(var(--dsw-alias-*),带回退),无外部样式表、\n * 无 <style> 注入、无类名冲突;只用 dsh-ctx 镜像内成员(slots.inject/register、\n * connection.rpc.call 经闭包现取、betterSidebar 经 ctx.get 运行时取);\n * 取数只经 connection.rpc.call 进 host 通道;缺席/错误纯条件渲染,不返空冒充。\n * 组件 React.createElement 手写,不引入 JSX。\n */\nimport * as React from 'react';\nimport { RPC_CHANNEL, RPC_ENDPOINT_READ, DEFAULT_READ_KEY, isRpcResult } from './contract.js';\nimport { SLOT_TITLE, PLUGIN, SKILL_PACKAGE, PLUGIN_VERSION, SKILL_VERSION } from './slot.js';\nimport { SETTING_ROWS } from './settings.js';\nimport type { ClientCtx, RpcCallResult } from './dsh-ctx.js';\n\nexport const inject = ['slots', 'connection'];\n\n/** 调用口取用器:每次取数时现取(connection 后到也不永久缺席)。 */\nexport type GetCall = () => unknown;\n\n/** 面板视觉(内联 style;颜色走 DSH 主题别名,深浅主题自适应,写死值只做回退)。 */\nconst S = {\n card: {\n padding: '12px 14px',\n borderRadius: 10,\n border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.35))',\n background: 'var(--dsw-alias-bg-base, transparent)',\n color: 'var(--dsw-alias-label-primary, inherit)',\n fontSize: 13,\n lineHeight: 1.6,\n } as React.CSSProperties,\n title: { fontSize: 14, fontWeight: 700, marginBottom: 8 } as React.CSSProperties,\n total: { fontSize: 22, fontWeight: 700, margin: '2px 0 4px' } as React.CSSProperties,\n muted: { color: 'var(--dsw-alias-label-secondary, #9a9a9a)', fontSize: 12 } as React.CSSProperties,\n error: { color: 'var(--dsw-alias-state-error-primary, #ff6b6b)', fontSize: 13 } as React.CSSProperties,\n rows: { marginTop: 8, borderTop: '1px solid var(--dsw-alias-border, rgba(128,128,128,.25))', paddingTop: 8 } as React.CSSProperties,\n version: {\n marginTop: 8,\n paddingTop: 8,\n borderTop: '1px dashed var(--dsw-alias-border, rgba(128,128,128,.25))',\n color: 'var(--dsw-alias-label-tertiary, #8a8a8a)',\n fontSize: 12,\n } as React.CSSProperties,\n};\n\n/** 版本行:插件与技能双版本号(用户要求:每技能设置页自报家门)。 */\nfunction VersionLine(): React.ReactElement {\n return React.createElement('div', { style: S.version }, `${PLUGIN} ${PLUGIN_VERSION} · ${SKILL_PACKAGE} ${SKILL_VERSION}`);\n}\n\ntype PanelState =\n | { readonly kind: 'loading' }\n | { readonly kind: 'data'; readonly date: string; readonly total: string }\n | { readonly kind: 'absent'; readonly message: string }\n | { readonly kind: 'error'; readonly message: string };\n\n/** 本地今日 YYYY-MM-DD(与面板默认读键的 date 参数同形)。 */\nfunction todayString(): string {\n const d = new Date();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${d.getFullYear()}-${m}-${day}`;\n}\n\n/** 数据态取值:有 total 显示 total,有值无 total 显示原值 JSON,空值返回 null(由调用方进错误态)。 */\nfunction extractTotal(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value.length > 0 ? value : null;\n if (typeof value === 'object') {\n const total = (value as { total?: unknown }).total;\n if (total !== null && total !== undefined) return String(total);\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n }\n return String(value);\n}\n\ntype ReadOutcome =\n | { readonly ok: true; readonly text: string }\n | { readonly ok: false; readonly absent: boolean; readonly message: string };\n\n/** 请求超时毫秒:与 host 侧 SPAWN_TIMEOUT_MS 同级,UI 永不无限转圈。 */\nconst READ_TIMEOUT_MS = 20_000 as const;\n\n/** 自家赛跑超时(有界:settle 即清 timer;不依赖传输是否搭理 AbortSignal——Desktop 自研传输会忽略 signal)。\n * 注释即 p10 有界重试门要的例外依据(文件内另有 clearTimeout/tries 上限/本注释三件套)。 */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const limit = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n timer = undefined;\n const e = new Error(`取数超时(${Math.round(ms / 1000)}s):宿主未回,先查宿主日志与 DB 环境`);\n e.name = 'TimeoutError';\n reject(e);\n }, ms);\n });\n return Promise.race([\n promise.finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n }),\n limit,\n ]);\n}\n\n/** 单次读数(纯异步函数,无 hook;挂载期调用一次,无轮询)。 */\nasync function fetchRead(call: unknown, key: string, params: Record<string, unknown>): Promise<ReadOutcome> {\n // extractRpc 同式守卫:非函数即缺席态。\n if (typeof call !== 'function') return { ok: false, absent: true, message: '宿主连接缺席:connection.rpc.call 不可用' };\n let result: RpcCallResult;\n try {\n // 防御纵深 + 自家超时双保险(AbortSignal 帮正规传输提前收工;race 保传输忽略 signal 时仍落字)。\n const raw: unknown = await withTimeout(\n // #80:走 DSH 公开的 /api 载体(host 侧为 connection.fetch.register 注册的 /api/ilife-calorie)。\n call('/api', RPC_CHANNEL.slice(1), { method: RPC_ENDPOINT_READ, payload: { key, params } }, AbortSignal.timeout(READ_TIMEOUT_MS)),\n READ_TIMEOUT_MS,\n );\n if (!isRpcResult(raw)) return { ok: false, absent: false, message: '回执信封异常(非 ok 信封)' };\n result = raw;\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError') return { ok: false, absent: false, message: '取数超时(20s):宿主未回,先查宿主日志与 DB 环境' };\n return { ok: false, absent: false, message: `取数失败:${e instanceof Error ? e.message : String(e)}` };\n }\n if (!result.ok) {\n const code = result.error?.code ?? 'unknown';\n const message = result.error?.message ?? '';\n if (code === 'missing-cli') return { ok: false, absent: true, message: `技能出口缺席(missing-cli):${message}` };\n return { ok: false, absent: false, message: `取数失败(${code}):${message}` };\n }\n const text = extractTotal(result.value);\n if (text === null) return { ok: false, absent: false, message: '取数为空(不冒充正常)' };\n return { ok: true, text };\n}\n\n/** 技能功能页:sidebar槽里展开的干活区(查数调数,不管配置)。挂载期一次 RPC。 */\nfunction CalorieWork(props: { getCall: GetCall }): React.ReactElement {\n const [state, setState] = React.useState<PanelState>({ kind: 'loading' });\n React.useEffect(() => {\n let alive = true;\n const date = todayString();\n void (async () => {\n let r: ReadOutcome;\n try {\n r = await fetchRead(props.getCall(), DEFAULT_READ_KEY, { date });\n } catch (e) {\n // 调用口同步抛错兜底:fetchRead 之外的错不成不可见 rejection,直接落字。\n if (!alive) return;\n setState({ kind: 'error', message: `取数失败:${e instanceof Error ? e.message : String(e)}` });\n return;\n }\n if (!alive) return;\n if (r.ok) setState({ kind: 'data', date, total: r.text });\n else if (r.absent) setState({ kind: 'absent', message: r.message });\n else setState({ kind: 'error', message: r.message });\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n if (state.kind === 'loading') {\n return React.createElement('div', { style: S.card }, React.createElement('div', { style: S.muted }, '卡路里加载中…'));\n }\n if (state.kind === 'data') {\n return React.createElement(\n 'div',\n { style: S.card },\n React.createElement('div', { style: S.title }, `卡路里 · ${state.date}`),\n React.createElement('div', { style: S.total }, `total ${state.total}`),\n React.createElement(VersionLine, null),\n );\n }\n return React.createElement(\n 'div',\n { style: S.card },\n React.createElement('div', { style: state.kind === 'absent' ? S.muted : S.error }, state.message),\n React.createElement(VersionLine, null),\n );\n}\n\nfunction controlLabel(control: string): string {\n if (control === 'switch') return '开关(缺省启用,只读)';\n if (control === 'text') return '文本(只读)';\n if (control === 'number') return '数字(只读)';\n return `${control}(只读)`;\n}\n\n/** 技能设置页:爱生活页签条下的一页(只读设置行 + 状态读数 + 版本行,禁做假开关)。 */\nfunction CalorieConfig(props: { getCall: GetCall }): React.ReactElement {\n const [state, setState] = React.useState<PanelState>({ kind: 'loading' });\n React.useEffect(() => {\n let alive = true;\n const date = todayString();\n void (async () => {\n let r: ReadOutcome;\n try {\n r = await fetchRead(props.getCall(), DEFAULT_READ_KEY, { date });\n } catch (e) {\n // 调用口同步抛错兜底:fetchRead 之外的错不成不可见 rejection,直接落字。\n if (!alive) return;\n setState({ kind: 'error', message: `取数失败:${e instanceof Error ? e.message : String(e)}` });\n return;\n }\n if (!alive) return;\n if (r.ok) setState({ kind: 'data', date, total: r.text });\n else if (r.absent) setState({ kind: 'absent', message: r.message });\n else setState({ kind: 'error', message: r.message });\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n const status =\n state.kind === 'loading'\n ? React.createElement('div', { style: S.muted }, '状态读取中…')\n : state.kind === 'data'\n ? React.createElement(\n 'div',\n null,\n React.createElement('div', { style: S.title }, SLOT_TITLE),\n React.createElement('div', { style: S.total }, `total ${state.total}`),\n React.createElement('div', { style: S.muted }, `今日 ${state.date}`),\n )\n : React.createElement('div', { style: state.kind === 'absent' ? S.muted : S.error }, state.message);\n return React.createElement(\n 'div',\n { style: S.card },\n status,\n React.createElement(\n 'div',\n { style: S.rows },\n SETTING_ROWS.map((row) =>\n React.createElement('div', { key: row.key }, `${row.title} · ${controlLabel(row.control)}`),\n ),\n ),\n React.createElement(VersionLine, null),\n );\n}\n\ninterface BetterSidebarService {\n registerTab(descriptor: {\n readonly id: string;\n readonly title: string | (() => string);\n readonly order?: number;\n readonly single?: boolean;\n readonly component: (props: unknown) => React.ReactElement | null;\n }): () => void;\n}\n\nexport function apply(ctx: ClientCtx): void {\n // 调用口取用器透传给组件(每次取数现取;非函数由组件判缺席)。\n const getCall: GetCall = () => ctx.connection?.rpc?.call ?? null;\n\n // (a) 技能设置页 → 爱生活页签槽(总管声明;总管缺席时 inject 等待,不断链)。\n ctx.slots.inject('ilife.config-tab', () =>\n ctx.slots.register(\n {\n name: 'ilife.config-tab',\n id: 'dsh-calorie',\n order: 75,\n label: () => SLOT_TITLE,\n },\n () => React.createElement(CalorieConfig, { getCall }),\n ),\n );\n\n // (b) 技能功能页 → sidebar槽(软依赖:betterSidebar 缺席即跳过)。\n const ensureWorkTab = (): boolean => {\n try {\n const get = ctx.get;\n const bs = (typeof get === 'function' ? get('betterSidebar') : undefined) as BetterSidebarService | undefined;\n if (!bs || typeof bs.registerTab !== 'function') return false;\n const dispose = bs.registerTab({\n id: 'ilife-calorie:work',\n title: '卡路里',\n order: 61,\n single: true,\n component: () => React.createElement(CalorieWork, { getCall }),\n });\n ctx.effect(() => () => {\n try {\n dispose();\n } catch {\n /* 卸载清理失败忽略 */\n }\n }, 'dsh-calorie: sidebar work tab');\n return true;\n } catch {\n return false;\n }\n };\n if (!ensureWorkTab()) {\n let tries = 0;\n const timer = setInterval(() => {\n tries++;\n if (ensureWorkTab() || tries >= 10) clearInterval(timer);\n }, 1000);\n ctx.effect(() => () => {\n clearInterval(timer);\n }, 'dsh-calorie: sidebar work tab retry');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["React"],"sources":["../src/contract.ts","../src/slot.ts","../src/settings.ts","../src/client.ts"],"sourcesContent":["/** dsh-calorie 端口(port):DSH 世界与卡路里 hexagon 之间的契约。\n *\n * browser 安全:零 node 导入。host 适配器(注册 RPC 通道)与 client\n * 适配器(调用 RPC)共用同一份定义;单测与 loader 回路以此为准。\n * 通道命名遵守宿主约束:单段且不等于 /api(见 cookbook「RPC 通道」)。\n */\nexport const RPC_CHANNEL = '/ilife-calorie' as const;\nexport const RPC_ENDPOINT_READ = 'read' as const;\n\n/** #676 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */\nexport const RPC_ENDPOINT_CONFIG_GET = 'config.get' as const;\nexport const RPC_ENDPOINT_CONFIG_SAVE = 'config.save' as const;\nexport const RPC_ENDPOINT_CONFIG_RESET = 'config.reset' as const;\n\n/** #706 配置体检端点:只读一次,回一份报告(判据由技能侧出,本包只透传)。\n *\n * 端点名与技能侧那条只读命令同名(`calorie.config.check`),两端各写一份、值相同:\n * 插件侧这份是面板的第二段参数,技能侧那份是 CLI 要认的命令名。**报告形状**的唯一真相在\n * 技能侧 `packages/skill-calorie/src/health.ts`;面板侧镜像在\n * `packages/plugin-manager/src/health-contract.ts`。本包不校验、不重写那份报告。 */\nexport const RPC_ENDPOINT_CONFIG_CHECK = 'config.check' as const;\n\n/** 保存载荷:一份键值(键路径 → 值)。缺项由宿主按默认值补齐,故只收用户真改的那些。 */\nexport interface SavePayload {\n readonly values: Record<string, unknown>;\n}\n\n/** 保存载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */\nexport function parseSavePayload(raw: unknown): SavePayload | null {\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return null;\n const { values } = raw as { values?: unknown };\n if (typeof values !== 'object' || values === null || Array.isArray(values)) return null;\n return { values: values as Record<string, unknown> };\n}\n\n/** 配置面回执:设置页一次拿齐「文件在哪、数据在哪、当前值、是不是这次新建的」。\n *\n * 形状与技能侧 `calorie.config.read` 的 data 逐字段同形(唯一定义地在那边的 cli/config.ts)。\n * 这里不带默认值表——页面不猜默认值,「留空=按默认落点」由行文案说清,\n * 「重置为默认」由技能侧 `calorie.config.reset` 执行。\n */\nexport interface ConfigSurfaceReply {\n /** 配置文件绝对路径。 */\n readonly path: string;\n /** 数据目录绝对路径。 */\n readonly dataDir: string;\n /** 本次是不是「文件不存在、按默认值落了一份」。 */\n readonly created: boolean;\n /** 当前取值(文件里的 ⊕ 缺项按默认值补)。 */\n readonly values: Record<string, unknown>;\n}\n\n/** 读请求载荷:与技能 CLI 的 key/params 同形(见 skill-calorie SKILL.md)。 */\nexport interface ReadPayload {\n readonly key: string;\n readonly params: Record<string, unknown>;\n}\n\nexport interface RpcError {\n readonly code: string;\n readonly message: string;\n readonly details: Record<string, unknown>;\n}\n\nexport type RpcResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly error: RpcError };\n\nexport function ok(value: unknown): RpcResult {\n return { ok: true, value };\n}\n\nexport function fail(code: string, message: string): RpcResult {\n return { ok: false, error: { code, message, details: {} } };\n}\n\n/** 载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */\nexport function parseReadPayload(raw: unknown): ReadPayload | null {\n if (typeof raw !== 'object' || raw === null) return null;\n const { key, params } = raw as { key?: unknown; params?: unknown };\n if (typeof key !== 'string' || key.length === 0) return null;\n if (typeof params !== 'object' || params === null || Array.isArray(params)) return null;\n return { key, params: params as Record<string, unknown> };\n}\n\n/** 面板默认读键(与 HITL 一致性对比同键)。 */\nexport const DEFAULT_READ_KEY = 'calorie.view.home' as const;\n\n/** 信封守卫:供 client 拆包前校验(port 拥有信封定义,守卫住 port)。 */\nexport function isRpcResult(raw: unknown): raw is RpcResult {\n if (typeof raw !== 'object' || raw === null) return false;\n const ok = (raw as { ok?: unknown }).ok;\n return ok === true || ok === false;\n}\n","/** dsh-calorie 槽位描述(P10 脚手架,P3 #4 定案)。\n *\n * 写死槽位原生组件:id 命名空间 ilife:calorie,order 75。\n * 注册与打开只走 registerTab/openTab 的路径导航;子页后缀(如 ilife:calorie:*)\n * 只在主面板内导航,不占栏。缺席纯条件渲染,不轮询(本文件无定时器;\n * 有界重试归一由 base-render 拥有,单品不自建)。\n */\n\nexport const SKILL = 'calorie' as const;\nexport const SLOT_ID = 'ilife:calorie' as const;\nexport const SLOT_ORDER = 75 as const;\nexport const SLOT_TITLE = '卡路里' as const;\nexport const PLUGIN = 'dsh-calorie' as const;\nexport const MANAGER_PLUGIN = 'dsh-life-pack' as const;\nexport const SKILL_PACKAGE = 'skill-calorie' as const;\n\n/** #130:手写版本常量(旧 PLUGIN_VERSION/SKILL_VERSION)已删除,旧「发版 bump 时同步改这里」纪律一并废止。\n *\n * 版本号唯一真相源=已安装的磁盘 package.json,本文件不再持有任何版本值(也不再有版本兼容层)。\n * 两个原因必须如此:\n * ① 手写常量是第二真相源,发版只 bump package.json 时面板就会撒谎(#130 的缺陷本身);\n * ② 本文件被 src/client.ts 引入(client 束),而版本读取在 host 侧——若在此 import\n * './bridge.js',bridge 的 5 个 node: 导入会被带进浏览器束,破 DSH client 纯度契约。\n * 面板版本只走一条路:host(bridge.readInstalledVersions,读双 package.json)→ RPC\n * (键见 bridge.VERSION_READ_KEY)→ client 纯渲染(读不到侧显示 unknown)。\n */\n\nexport interface SlotDescriptor {\n readonly skill: string;\n readonly slotId: string;\n readonly order: number;\n readonly title: string;\n readonly kind: 'page';\n}\n\nexport function slotDescriptor(): SlotDescriptor {\n return { skill: SKILL, slotId: SLOT_ID, order: SLOT_ORDER, title: SLOT_TITLE, kind: 'page' };\n}\n\n/** 写死原生组件描述(纯数据,无按需加载,无外嵌页)。 */\nexport const TAB_COMPONENT = { kind: 'native', name: 'CaloriePanel' } as const;\n\nexport interface TabsPort {\n hasTabs(): boolean;\n registerTab(entry: { readonly id: string; readonly title: string; readonly order: number; readonly single: boolean; readonly component: unknown }): () => void;\n openTab(seed: { readonly type: string; readonly path: string }, scope?: { readonly sessionId?: string }): void;\n}\n\n/** 自注册:幂等(调用方持 disposer),失败返回 false 由调用方决定重试。 */\nexport function registerSingle(port: TabsPort): (() => void) | null {\n if (!port.hasTabs()) return null;\n return port.registerTab({ id: SLOT_ID, title: SLOT_TITLE, order: SLOT_ORDER, single: true, component: TAB_COMPONENT });\n}\n\n/** 内容型打开:path seed,折叠面板自动展开。 */\nexport function openSingle(port: TabsPort, sessionId?: string): void {\n if (!port.hasTabs()) return;\n port.openTab({ type: SLOT_ID, path: SLOT_ID }, sessionId ? { sessionId } : undefined);\n}\n","/** dsh-calorie 设置页元数据(#676:从只读脚手架换成真配置页)。\n *\n * 本文件是**设置页的行表**:一个可配置项一行,写清它在配置文件里的键、中文标题、\n * 分级(常用 / 高级)、控件种类与人话指引。它是页面渲染的唯一依据。\n *\n * **本文件必须零 node 依赖**:`tsconfig.client.json` 把它收进 client 侧编译,\n * 浏览器产物不许带 node 内建。默认值不住这里,也不从技能包 import——\n * 取值一律由宿主经技能 CLI 的 `calorie.config.read` 端点现取(见 bridge.ts)。\n *\n * 口径:\n * · 配置表形状(键与默认值)的**唯一定义地**是技能侧 `packages/skill-calorie/src/config.ts`\n * 的 `CALORIE_CONFIG_DEFAULTS`(本文件是它在页面上的投影,逐键对齐由\n * `test/config-surface-676.test.mjs` 用源码文本锁死);\n * · **空串=按默认落点**(老落点由技能各取用处算)。所以「空」不是「没配」,\n * 而是「还走改造前那个位置」,老数据不会看起来丢了——行文案按这个语义写。\n */\nexport const SETTINGS_OWNER = 'dsh-calorie' as const;\nexport const SETTINGS_SLOT = 'ilife:calorie' as const;\n\n/** 配置文件主体名:落点 `~/.ilife/calorie.yaml`(`ILIFE_CONFIG_DIR` 可整体接管)。 */\nexport const CONFIG_STEM = 'calorie' as const;\n\n/** 分级:常用项直接画在页面上,其余进默认收起的「高级」组(#675 冻结口径)。 */\nexport type ConfigTier = 'common' | 'advanced';\n\n/** 控件种类:只有这三种(与受限 YAML 子集的字符串/数字/布尔一一对应,没有数组)。 */\nexport type ConfigControl = 'text' | 'number' | 'switch';\n\nexport interface ConfigItem {\n /** 配置文件里的键路径,一层嵌套用 `.` 连接,例 `xunji.stateDir`。 */\n readonly key: string;\n /** 页面上那一行的中文标题。 */\n readonly title: string;\n readonly tier: ConfigTier;\n readonly control: ConfigControl;\n /** 一行人话:这一项管什么、留空会怎样。 */\n readonly hint: string;\n}\n\n/** 常用项:用户裁决三点的五项——改了就影响「库与产物落在哪、训记认不认你」,放页面上。 */\nconst COMMON: readonly ConfigItem[] = [\n {\n key: 'db.dir',\n title: '数据目录',\n tier: 'common',\n control: 'text',\n hint: '库文件与各类产物的根目录。留空=按默认落点(配置目录下的 data/),也就是改造前那个位置。',\n },\n {\n key: 'db.name',\n title: '库文件名',\n tier: 'common',\n control: 'text',\n hint: '数据目录下的数据库文件名。改它等于换一个库,老数据留在旧文件里不会跟过来。',\n },\n {\n key: 'html.dir',\n title: 'HTML 产物目录名',\n tier: 'common',\n control: 'text',\n hint: '数据目录下放交付页面的子目录名。改它之后新页面落新地方,旧页面留在原处。',\n },\n {\n key: 'photos.dir',\n title: '照片目录',\n tier: 'common',\n control: 'text',\n hint: '身材照的存放目录,绝对路径。留空=未配:读照片不报错,出 GIF 与写照片会被拦下。',\n },\n {\n key: 'xunji.key',\n title: '训记 KEY',\n tier: 'common',\n control: 'text',\n hint: '训记用的凭据。留空=没配,推送与回写会被拦下;它同时是敏感值,别贴给别人。',\n },\n];\n\n/** 高级项:默认收起(13 项减常用 5 项=8 项)。改错了多半只是自己撞上麻烦,不确定就别动。 */\nconst ADVANCED: readonly ConfigItem[] = [\n {\n key: 'photos.gifs',\n title: '照片 GIF 子目录',\n tier: 'advanced',\n control: 'text',\n hint: '照片目录下放 GIF 的子目录名。',\n },\n {\n key: 'xunji.stateDir',\n title: '训记状态文件目录',\n tier: 'advanced',\n control: 'text',\n hint: '限频记账点与同步游标放哪。留空=家目录下的 .mavis,也就是改造前那个位置。',\n },\n {\n key: 'xunji.catalog',\n title: '训记动作库路径',\n tier: 'advanced',\n control: 'text',\n hint: '动作名判定用哪份库。留空=用包内预置的那份,也就是改造前那个位置。',\n },\n {\n key: 'xunji.backfillDays',\n title: '回写默认天数',\n tier: 'advanced',\n control: 'number',\n hint: '从训记拉实绩时不带天数参数时的窗口,整数天。',\n },\n {\n key: 'land.scheduleCli',\n title: '跨技能出口 · 作息',\n tier: 'advanced',\n control: 'text',\n hint: '「落地训练」调作息那一步的入口文件。留空=按包布局算(改造前那个位置)。',\n },\n {\n key: 'land.memoCli',\n title: '跨技能出口 · 备忘',\n tier: 'advanced',\n control: 'text',\n hint: '「落地训练」调备忘那一步的入口文件,同上。',\n },\n {\n key: 'land.xunjiSeconds',\n title: '训记调用限时(秒)',\n tier: 'advanced',\n control: 'number',\n hint: '外部调训记超过这个秒数即 exit 4。机器慢就调大。',\n },\n {\n key: 'land.landSeconds',\n title: '落地调用限时(秒)',\n tier: 'advanced',\n control: 'number',\n hint: '落地训练那几步超过这个秒数即 exit 4,同上。',\n },\n];\n\n/** 设置页的行表,顺序即页面顺序。 */\nexport const CONFIG_ITEMS: readonly ConfigItem[] = [...COMMON, ...ADVANCED];\n\n/** 常用项行数(页面上直接画出来的那些)。 */\nexport const COMMON_ITEM_COUNT = COMMON.length;\n\n/** 高级组标题与副文案。 */\nexport const ADVANCED_GROUP_TITLE = '高级' as const;\nexport const ADVANCED_GROUP_NOTE = '不常改。留空=按默认落点(改造前那个位置),不确定就别动。' as const;\n\n/** 按 `a.b` 路径从配置取值里读(缺层或类型不符一律回 undefined)。 */\nexport function readPath(values: Record<string, unknown>, key: string): unknown {\n const parts = key.split('.');\n let cur: unknown = values;\n for (const part of parts) {\n if (typeof cur !== 'object' || cur === null || Array.isArray(cur)) return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n/** 按 `a.b` 路径把值写进配置取值(中间层缺就建一层空组;已存在非组即覆盖成组)。 */\nexport function writePath(values: Record<string, unknown>, key: string, value: unknown): void {\n const parts = key.split('.');\n let cur: Record<string, unknown> = values;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n const next = cur[part];\n if (typeof next !== 'object' || next === null || Array.isArray(next)) cur[part] = {};\n cur = cur[part] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]!] = value;\n}\n","/** dsh-calorie client 适配器(六边形:port=contract+dsh-ctx 镜像,adapter=本文件)。\n *\n * 产物经 tsdown 打成 loader 工厂包(browser/CJS,见 tsdown.config.ts)。\n * 本文件传递闭包:禁 node、禁 DOM 直写(document/window/process)。\n * 注册两处(grill 定案,新术语见 CONTEXT.md):\n * (a) 技能设置页 → 爱生活页签槽(总管声明的 children,各技能自研自家配置页);\n * (b) 技能功能页 → sidebar槽(better-sidebar 服务,非 DSH slot;软依赖,\n * 缺席即跳过,不断链。DSH右侧槽 + sidebar.footer.action 彻底出局,已删)。\n * 有界重试例外依据(唯一允许的定时器):注册重试非数据轮询,照抄\n * dsh-mattpocock-skills-deck/src/client/panelAssembly.js:100-108\n * (betterSidebar 服务可能晚于本模块到达,最多 10 次、间隔 1000ms;卸载清理)。\n * 样式:React 内联 style + DSH 主题别名(var(--dsw-alias-*),带回退),无外部样式表、\n * 无 <style> 注入、无类名冲突;只用 dsh-ctx 镜像内成员(slots.inject/register、\n * connection.rpc.call 经闭包现取、betterSidebar 经 ctx.get 运行时取);\n * 取数只经 connection.rpc.call 进 host 通道;缺席/错误纯条件渲染,不返空冒充。\n * 组件 React.createElement 手写,不引入 JSX。\n *\n * #676:技能设置页从「只读设置行 + 状态读数」换成**真配置页**——行表来自 settings.ts,\n * 取值来自宿主侧配置件(`config.get`/`config.save`/`config.reset` 三个端点)。\n * 本文件仍禁 node:不读盘、不算默认值,默认值由宿主一并送来。\n * 照 CONTEXT.md,「技能设置页」只配置、不干活:本页没有任何取数/记一餐入口,\n * 状态读数也已移出(读数属技能功能页)。\n */\nimport * as React from 'react';\nimport { RPC_CHANNEL, RPC_ENDPOINT_READ, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, DEFAULT_READ_KEY, isRpcResult } from './contract.js';\nimport type { ConfigSurfaceReply } from './contract.js';\nimport { SLOT_TITLE, PLUGIN, SKILL_PACKAGE } from './slot.js';\nimport { CONFIG_ITEMS, COMMON_ITEM_COUNT, ADVANCED_GROUP_TITLE, ADVANCED_GROUP_NOTE, readPath, writePath } from './settings.js';\nimport type { ConfigItem } from './settings.js';\nimport type { ClientCtx, RpcCallFace, RpcCallResult } from './dsh-ctx.js';\n\nexport const inject = ['slots', 'connection'];\n\n/** 调用口取用器:每次取数时现取(connection 后到也不永久缺席)。 */\nexport type GetCall = () => unknown;\n\n/** 面板视觉(内联 style;颜色走 DSH 主题别名,深浅主题自适应,写死值只做回退)。 */\nconst S = {\n card: {\n padding: '12px 14px',\n borderRadius: 10,\n border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.35))',\n background: 'var(--dsw-alias-bg-base, transparent)',\n color: 'var(--dsw-alias-label-primary, inherit)',\n fontSize: 13,\n lineHeight: 1.6,\n } as React.CSSProperties,\n title: { fontSize: 14, fontWeight: 700, marginBottom: 8 } as React.CSSProperties,\n total: { fontSize: 22, fontWeight: 700, margin: '2px 0 4px' } as React.CSSProperties,\n muted: { color: 'var(--dsw-alias-label-secondary, #9a9a9a)', fontSize: 12 } as React.CSSProperties,\n error: { color: 'var(--dsw-alias-state-error-primary, #ff6b6b)', fontSize: 13 } as React.CSSProperties,\n okText: { color: 'var(--dsw-alias-state-success-primary, #12805c)', fontSize: 12.5 } as React.CSSProperties,\n rows: { marginTop: 8, borderTop: '1px solid var(--dsw-alias-border, rgba(128,128,128,.25))', paddingTop: 8 } as React.CSSProperties,\n version: {\n marginTop: 8,\n paddingTop: 8,\n borderTop: '1px dashed var(--dsw-alias-border, rgba(128,128,128,.25))',\n color: 'var(--dsw-alias-label-tertiary, #8a8a8a)',\n fontSize: 12,\n } as React.CSSProperties,\n info: {\n margin: '6px 0 0',\n font: '12px/1.5 ui-monospace,Consolas,monospace',\n color: 'var(--dsw-alias-label-secondary, #9a9a9a)',\n wordBreak: 'break-all',\n } as React.CSSProperties,\n row: { marginTop: 10 } as React.CSSProperties,\n label: { fontSize: 12.5, fontWeight: 600 } as React.CSSProperties,\n hint: { color: 'var(--dsw-alias-label-tertiary, #8a8a8a)', fontSize: 11.5, margin: '1px 0 4px' } as React.CSSProperties,\n input: {\n width: '100%',\n boxSizing: 'border-box',\n padding: '4px 8px',\n borderRadius: 6,\n border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.45))',\n background: 'var(--dsw-alias-bg-base, transparent)',\n color: 'var(--dsw-alias-label-primary, inherit)',\n font: '12.5px/1.5 ui-monospace,Consolas,monospace',\n } as React.CSSProperties,\n bar: { marginTop: 14, display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' } as React.CSSProperties,\n btn: {\n padding: '5px 14px',\n borderRadius: 7,\n border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.45))',\n background: 'var(--dsw-alias-bg-base, transparent)',\n color: 'var(--dsw-alias-label-primary, inherit)',\n fontSize: 12.5,\n cursor: 'pointer',\n } as React.CSSProperties,\n btnPrimary: {\n padding: '5px 14px',\n borderRadius: 7,\n border: '1px solid var(--dsw-alias-brand-primary, #2f6fed)',\n background: 'var(--dsw-alias-brand-primary, #2f6fed)',\n color: '#fff',\n fontSize: 12.5,\n cursor: 'pointer',\n } as React.CSSProperties,\n adv: {\n marginTop: 12,\n paddingTop: 8,\n borderTop: '1px solid var(--dsw-alias-border, rgba(128,128,128,.25))',\n } as React.CSSProperties,\n advSummary: { cursor: 'pointer', fontSize: 12.5, fontWeight: 600 } as React.CSSProperties,\n};\n\n/** #130 版本通道(host 侧动态读取已安装版本,client 纯渲染+unknown 降级)。\n *\n * 唯一真相源=磁盘 package.json(host 侧 bridge.readInstalledVersions 读取双 package.json,\n * 经现有 connection.rpc.call 模式〈同 READ 端点、VERSION_READ_KEY 魔键〉传值,读失败 host 写 warn)。\n * 本文件禁 node/禁 DOM 直写(document/window/process),故不得直读文件;\n * 只经 connection.rpc.call 取版本,取不到侧显示 unknown,骨架不变,余部照常,永不抛、永不重试风暴。\n * VERSION_READ_KEY 与 bridge.VERSION_READ_KEY 同值(client 禁直引 bridge〈会带入 node〉,故镜像定义,权威出处见 bridge.ts)。\n * 不引入新运行时依赖;不改唤醒词/triggers/HELP/设置行。\n */\nconst VERSION_READ_KEY = 'dsh-calorie.version' as const;\nconst VERSION_UNKNOWN = 'unknown' as const;\n\n// 导出供单测复用(面板逻辑不变;权威出处仍见 bridge.ts)。\nexport { VERSION_READ_KEY, VERSION_UNKNOWN };\n\n/** 版本归一:非空字符串原样(去首尾空格),余者一律 unknown(降级骨架不断、永不抛)。 */\nexport function normalizeVersion(v: unknown): string {\n return typeof v === 'string' && v.trim().length > 0 ? v.trim() : VERSION_UNKNOWN;\n}\n\n/** 版本行文本(纯函数,供 VersionLine 与单测复用;骨架恒为 `dsh-calorie X · skill-calorie Y`)。 */\nexport function formatVersionLine(pluginVersion: unknown, skillVersion: unknown): string {\n return `${PLUGIN} ${normalizeVersion(pluginVersion)} · ${SKILL_PACKAGE} ${normalizeVersion(skillVersion)}`;\n}\n\n/** 版本行:纯渲染 host 传来的值+unknown 降级(用户要求:每技能设置页自报家门)。 */\nexport function VersionLine(props: { readonly pluginVersion?: unknown; readonly skillVersion?: unknown }): React.ReactElement {\n return React.createElement('div', { style: S.version }, formatVersionLine(props.pluginVersion, props.skillVersion));\n}\n\n/** 版本取值(与 fetchRead 同 connection.rpc.call 模式;单次、无轮询;任何失败→双 unknown,永不抛)。 */\nexport async function fetchVersions(call: unknown): Promise<{ readonly plugin: string; readonly skill: string }> {\n const fallback = { plugin: VERSION_UNKNOWN, skill: VERSION_UNKNOWN };\n if (typeof call !== 'function') return { ...fallback };\n try {\n const raw: unknown = await withTimeout(\n (call as RpcCallFace)('/api', RPC_CHANNEL.slice(1), { method: RPC_ENDPOINT_READ, payload: { key: VERSION_READ_KEY, params: {} } }, AbortSignal.timeout(READ_TIMEOUT_MS)),\n READ_TIMEOUT_MS,\n );\n if (!isRpcResult(raw) || !raw.ok) return { ...fallback };\n const v = (raw as { value?: unknown }).value;\n if (typeof v !== 'object' || v === null) return { ...fallback };\n const rec = v as { plugin?: unknown; skill?: unknown };\n return { plugin: normalizeVersion(rec.plugin), skill: normalizeVersion(rec.skill) };\n } catch {\n return { ...fallback };\n }\n}\n\ntype PanelState =\n | { readonly kind: 'loading' }\n | { readonly kind: 'data'; readonly date: string; readonly total: string }\n | { readonly kind: 'absent'; readonly message: string }\n | { readonly kind: 'error'; readonly message: string };\n\n/** 本地今日 YYYY-MM-DD(与面板默认读键的 date 参数同形)。 */\nfunction todayString(): string {\n const d = new Date();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${d.getFullYear()}-${m}-${day}`;\n}\n\n/** 数据态取值:有 total 显示 total,有值无 total 显示原值 JSON,空值返回 null(由调用方进错误态)。 */\nfunction extractTotal(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value.length > 0 ? value : null;\n if (typeof value === 'object') {\n const total = (value as { total?: unknown }).total;\n if (total !== null && total !== undefined) return String(total);\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n }\n return String(value);\n}\n\ntype ReadOutcome =\n | { readonly ok: true; readonly text: string }\n | { readonly ok: false; readonly absent: boolean; readonly message: string };\n\n/** 请求超时毫秒:与 host 侧 SPAWN_TIMEOUT_MS 同级,UI 永不无限转圈。 */\nconst READ_TIMEOUT_MS = 20_000 as const;\n\n/** 自家赛跑超时(有界:settle 即清 timer;不依赖传输是否搭理 AbortSignal——Desktop 自研传输会忽略 signal)。\n * 注释即 p10 有界重试门要的例外依据(文件内另有 clearTimeout/tries 上限/本注释三件套)。 */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const limit = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n timer = undefined;\n const e = new Error(`取数超时(${Math.round(ms / 1000)}s):宿主未回,先查宿主日志与 DB 环境`);\n e.name = 'TimeoutError';\n reject(e);\n }, ms);\n });\n return Promise.race([\n promise.finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n }),\n limit,\n ]);\n}\n\n/** 单次读数(纯异步函数,无 hook;挂载期调用一次,无轮询)。 */\nasync function fetchRead(call: unknown, key: string, params: Record<string, unknown>): Promise<ReadOutcome> {\n // extractRpc 同式守卫:非函数即缺席态。\n if (typeof call !== 'function') return { ok: false, absent: true, message: '宿主连接缺席:connection.rpc.call 不可用' };\n let result: RpcCallResult;\n try {\n // 防御纵深 + 自家超时双保险(AbortSignal 帮正规传输提前收工;race 保传输忽略 signal 时仍落字)。\n const raw: unknown = await withTimeout(\n // #80:走 DSH 公开的 /api 载体(host 侧为 connection.fetch.register 注册的 /api/ilife-calorie)。\n call('/api', RPC_CHANNEL.slice(1), { method: RPC_ENDPOINT_READ, payload: { key, params } }, AbortSignal.timeout(READ_TIMEOUT_MS)),\n READ_TIMEOUT_MS,\n );\n if (!isRpcResult(raw)) return { ok: false, absent: false, message: '回执信封异常(非 ok 信封)' };\n result = raw;\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError') return { ok: false, absent: false, message: '取数超时(20s):宿主未回,先查宿主日志与 DB 环境' };\n return { ok: false, absent: false, message: `取数失败:${e instanceof Error ? e.message : String(e)}` };\n }\n if (!result.ok) {\n const code = result.error?.code ?? 'unknown';\n const message = result.error?.message ?? '';\n if (code === 'missing-cli') return { ok: false, absent: true, message: `技能出口缺席(missing-cli):${message}` };\n return { ok: false, absent: false, message: `取数失败(${code}):${message}` };\n }\n const text = extractTotal(result.value);\n if (text === null) return { ok: false, absent: false, message: '取数为空(不冒充正常)' };\n return { ok: true, text };\n}\n\n/** 技能功能页:sidebar槽里展开的干活区(查数调数,不管配置)。挂载期一次 RPC。 */\nfunction CalorieWork(props: { getCall: GetCall }): React.ReactElement {\n const [state, setState] = React.useState<PanelState>({ kind: 'loading' });\n // #130 版本态(初值 unknown 骨架;独立单次 RPC,不阻塞数据、不轮询、不抛)。\n const [versions, setVersions] = React.useState<{ readonly plugin: string; readonly skill: string }>({\n plugin: VERSION_UNKNOWN,\n skill: VERSION_UNKNOWN,\n });\n React.useEffect(() => {\n let alive = true;\n const date = todayString();\n void (async () => {\n let r: ReadOutcome;\n try {\n r = await fetchRead(props.getCall(), DEFAULT_READ_KEY, { date });\n } catch (e) {\n // 调用口同步抛错兜底:fetchRead 之外的错不成不可见 rejection,直接落字。\n if (!alive) return;\n setState({ kind: 'error', message: `取数失败:${e instanceof Error ? e.message : String(e)}` });\n return;\n }\n if (!alive) return;\n if (r.ok) setState({ kind: 'data', date, total: r.text });\n else if (r.absent) setState({ kind: 'absent', message: r.message });\n else setState({ kind: 'error', message: r.message });\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n React.useEffect(() => {\n let alive = true;\n void (async () => {\n try {\n const v = await fetchVersions(props.getCall());\n if (!alive) return;\n setVersions(v);\n } catch {\n /* fetchVersions 永不抛,此处兜底不炸面板 */\n }\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n if (state.kind === 'loading') {\n return React.createElement('div', { style: S.card }, React.createElement('div', { style: S.muted }, '卡路里加载中…'));\n }\n if (state.kind === 'data') {\n return React.createElement(\n 'div',\n { style: S.card },\n React.createElement('div', { style: S.title }, `卡路里 · ${state.date}`),\n React.createElement('div', { style: S.total }, `total ${state.total}`),\n React.createElement(VersionLine, { pluginVersion: versions.plugin, skillVersion: versions.skill }),\n );\n }\n return React.createElement(\n 'div',\n { style: S.card },\n React.createElement('div', { style: state.kind === 'absent' ? S.muted : S.error }, state.message),\n React.createElement(VersionLine, { pluginVersion: versions.plugin, skillVersion: versions.skill }),\n );\n}\n\n// ===== #676:技能设置页(只配置,不干活)=====\n\ntype ConfigState =\n | { readonly kind: 'loading' }\n | { readonly kind: 'ready'; readonly surface: ConfigSurfaceReply }\n | { readonly kind: 'failed'; readonly message: string };\n\n/** 配置面报错 → 人话指引。\n *\n * 报文由技能侧给出:base-link-core 的 `ConfigError` 已经带行号与文件名,技能\n * `cli/config.ts` 原样交出来,插件 bridge 原样带上(`fetch-failed:出口非 0(1):<那一句>`)。\n * 所以这里**不重写报文**,只按报错类补一句「接下来怎么办」——免得两处各写一套人话。\n */\nexport function humanizeConfigFailure(code: string, message: string): string {\n const text = message.trim().length > 0 ? message.trim() : `(${code},宿主未给报文)`;\n if (/解析|YAML|parse/i.test(text)) return `${text}\\n改回「键: 值」的写法,或点「重置为默认」重来一份(重置会先留一份 .bak)。`;\n if (/不认识|未知键|UNKNOWN_KEY/i.test(text)) return `${text}\\n本页只认表里这些项;多余的行删掉,或点「重置为默认」。`;\n if (/类型|TYPE_MISMATCH/i.test(text)) return `${text}\\n按本页给的形状填(文本填文本、数字填数字),或点「重置为默认」。`;\n if (/缺席|missing-cli/.test(text)) return `${text}\\n技能出口没找着:先确认技能包已构建(packages/skill-calorie/dist/cli/cmd_read.js)。`;\n return `${text}\\n改不动就点「重置为默认」(会先留一份 .bak),或照报文里的路径手工改配置文件。`;\n}\n\ntype ConfigOutcome =\n | { readonly ok: true; readonly surface: ConfigSurfaceReply }\n | { readonly ok: false; readonly message: string };\n\n/** 一次配置 RPC(与 fetchRead 同通道、同超时纪律;永不抛,失败落字)。 */\nasync function configRpc(call: unknown, method: string, payload: Record<string, unknown>): Promise<ConfigOutcome> {\n if (typeof call !== 'function') return { ok: false, message: '宿主连接缺席:connection.rpc.call 不可用' };\n try {\n const raw: unknown = await withTimeout(\n (call as RpcCallFace)('/api', RPC_CHANNEL.slice(1), { method, payload }, AbortSignal.timeout(READ_TIMEOUT_MS)),\n READ_TIMEOUT_MS,\n );\n if (!isRpcResult(raw)) return { ok: false, message: '回执信封异常(非 ok 信封)' };\n if (!raw.ok) return { ok: false, message: humanizeConfigFailure(raw.error?.code ?? 'unknown', raw.error?.message ?? '') };\n return { ok: true, surface: raw.value as ConfigSurfaceReply };\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError') return { ok: false, message: `配置读取超时(${Math.round(READ_TIMEOUT_MS / 1000)}s):宿主未回` };\n if (e instanceof Error && e.name === 'TimeoutError') return { ok: false, message: e.message };\n return { ok: false, message: `配置失败:${e instanceof Error ? e.message : String(e)}` };\n }\n}\n\n/** 读设置页整面。 */\nexport function fetchConfigSurface(call: unknown): Promise<ConfigOutcome> {\n return configRpc(call, RPC_ENDPOINT_CONFIG_GET, {});\n}\n\n/** 保存(回全表)。 */\nexport function saveConfigSurface(call: unknown, values: Record<string, unknown>): Promise<ConfigOutcome> {\n return configRpc(call, RPC_ENDPOINT_CONFIG_SAVE, { values });\n}\n\n/** 重置为默认(配置件先落 .bak)。 */\nexport function resetConfigSurface(call: unknown): Promise<ConfigOutcome> {\n return configRpc(call, RPC_ENDPOINT_CONFIG_RESET, {});\n}\n\n/** 把配置取值铺成「行键 → 输入框文本」(页面表单态;值缺项即空串,不返空留白)。 */\nexport function toDraft(values: Record<string, unknown>): Record<string, string> {\n const draft: Record<string, string> = {};\n for (const item of CONFIG_ITEMS) {\n const v = readPath(values, item.key);\n draft[item.key] = v === undefined || v === null ? '' : String(v);\n }\n return draft;\n}\n\n/** 表单态 → 配置取值(按控件种类还原类型;空串对文本项照收,语义由「未配」承担)。 */\nexport function fromDraft(draft: Record<string, string>): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const item of CONFIG_ITEMS) {\n const raw = draft[item.key] ?? '';\n const value: unknown = item.control === 'number' ? Number(raw) : item.control === 'switch' ? raw === 'true' : raw;\n writePath(values, item.key, item.control === 'number' && !Number.isFinite(value as number) ? 0 : value);\n }\n return values;\n}\n\n/** 一行输入(三种控件对齐受限 YAML 子集:文本/数字/布尔)。 */\nfunction Row(props: {\n readonly item: ConfigItem;\n readonly value: string;\n readonly disabled: boolean;\n readonly onChange: (key: string, next: string) => void;\n}): React.ReactElement {\n const { item } = props;\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) => props.onChange(item.key, e.target.value);\n const control =\n item.control === 'switch'\n ? React.createElement('input', {\n type: 'checkbox',\n checked: props.value === 'true',\n disabled: props.disabled,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => props.onChange(item.key, e.target.checked ? 'true' : 'false'),\n })\n : React.createElement('input', {\n style: S.input,\n type: item.control === 'number' ? 'number' : 'text',\n value: props.value,\n disabled: props.disabled,\n spellCheck: false,\n onChange,\n });\n return React.createElement(\n 'div',\n { style: S.row },\n React.createElement('div', { style: S.label }, item.title),\n React.createElement('div', { style: S.hint }, item.hint),\n control,\n );\n}\n\n/** 技能设置页:承载卡路里自己的全部可配置项(只配置,不干活)。\n *\n * 三态:loading(一次 RPC 内)/ready(真表单)/failed(人话报错 + 指引,不返空、不转圈)。\n * 没有任何干活入口——查数、记一餐在技能功能页(sidebar槽)。 */\nfunction CalorieConfig(props: { getCall: GetCall }): React.ReactElement {\n const [state, setState] = React.useState<ConfigState>({ kind: 'loading' });\n const [draft, setDraft] = React.useState<Record<string, string>>({});\n const [busy, setBusy] = React.useState(false);\n const [notice, setNotice] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [versions, setVersions] = React.useState<{ readonly plugin: string; readonly skill: string }>({\n plugin: VERSION_UNKNOWN,\n skill: VERSION_UNKNOWN,\n });\n\n const load = React.useCallback(async () => {\n setNotice(null);\n setError(null);\n const r = await fetchConfigSurface(props.getCall());\n if (r.ok) {\n setState({ kind: 'ready', surface: r.surface });\n setDraft(toDraft(r.surface.values));\n } else {\n setState({ kind: 'failed', message: r.message });\n }\n }, [props.getCall]);\n\n React.useEffect(() => {\n let alive = true;\n void (async () => {\n const r = await fetchConfigSurface(props.getCall());\n if (!alive) return;\n if (r.ok) {\n setState({ kind: 'ready', surface: r.surface });\n setDraft(toDraft(r.surface.values));\n } else {\n setState({ kind: 'failed', message: r.message });\n }\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n\n React.useEffect(() => {\n let alive = true;\n void (async () => {\n try {\n const v = await fetchVersions(props.getCall());\n if (!alive) return;\n setVersions(v);\n } catch {\n /* fetchVersions 永不抛,此处兜底不炸面板 */\n }\n })();\n return () => {\n alive = false;\n };\n }, [props.getCall]);\n\n const onChange = React.useCallback((key: string, next: string) => {\n setDraft((prev) => ({ ...prev, [key]: next }));\n setNotice(null);\n setError(null);\n }, []);\n\n const surface = state.kind === 'ready' ? state.surface : null;\n const dirty = surface !== null && CONFIG_ITEMS.some((i) => (draft[i.key] ?? '') !== (toDraft(surface.values)[i.key] ?? ''));\n\n const onSave = React.useCallback(async () => {\n setBusy(true);\n setNotice(null);\n setError(null);\n const r = await saveConfigSurface(props.getCall(), fromDraft(draft));\n setBusy(false);\n if (r.ok) {\n setState({ kind: 'ready', surface: r.surface });\n setDraft(toDraft(r.surface.values));\n setNotice('已保存,立即生效(不用重启宿主)');\n } else {\n setError(r.message);\n }\n }, [draft, props.getCall]);\n\n const onReset = React.useCallback(async () => {\n setBusy(true);\n setNotice(null);\n setError(null);\n const r = await resetConfigSurface(props.getCall());\n setBusy(false);\n if (r.ok) {\n setState({ kind: 'ready', surface: r.surface });\n setDraft(toDraft(r.surface.values));\n setNotice('已重置为默认(原配置已另存一份 .bak)');\n } else {\n setError(r.message);\n }\n }, [props.getCall]);\n\n const head = React.createElement(\n 'div',\n null,\n React.createElement('div', { style: S.title }, `${SLOT_TITLE} · 配置`),\n surface !== null\n ? React.createElement(\n 'div',\n null,\n React.createElement('div', { style: S.info }, `配置文件 ${surface.path}`),\n React.createElement('div', { style: S.info }, `数据目录 ${surface.dataDir}`),\n surface.created ? React.createElement('div', { style: S.muted }, '(这份配置是刚按默认值建出来的)') : null,\n )\n : null,\n );\n\n if (state.kind === 'loading') {\n return React.createElement('div', { style: S.card }, head, React.createElement('div', { style: S.muted }, '配置读取中…'));\n }\n\n if (state.kind === 'failed') {\n return React.createElement(\n 'div',\n { style: S.card },\n React.createElement('div', { style: S.title }, `${SLOT_TITLE} · 配置`),\n React.createElement('div', { style: S.error }, state.message),\n React.createElement(\n 'div',\n { style: S.bar },\n React.createElement('button', { style: S.btn, type: 'button', onClick: () => void load() }, '重试'),\n React.createElement('button', { style: S.btn, type: 'button', onClick: () => void onReset() }, '重置为默认'),\n ),\n React.createElement(VersionLine, { pluginVersion: versions.plugin, skillVersion: versions.skill }),\n );\n }\n\n const common = CONFIG_ITEMS.slice(0, COMMON_ITEM_COUNT);\n const advanced = CONFIG_ITEMS.slice(COMMON_ITEM_COUNT);\n const renderRow = (item: ConfigItem) =>\n React.createElement(Row, { key: item.key, item, value: draft[item.key] ?? '', disabled: busy, onChange });\n\n return React.createElement(\n 'div',\n { style: S.card },\n head,\n React.createElement('div', { style: S.rows }, common.map(renderRow)),\n React.createElement(\n 'details',\n { style: S.adv },\n React.createElement('summary', { style: S.advSummary }, ADVANCED_GROUP_TITLE),\n React.createElement('div', { style: S.muted }, ADVANCED_GROUP_NOTE),\n advanced.map(renderRow),\n ),\n React.createElement(\n 'div',\n { style: S.bar },\n React.createElement(\n 'button',\n { style: dirty ? S.btnPrimary : S.btn, type: 'button', disabled: busy || !dirty, onClick: () => void onSave() },\n busy ? '处理中…' : '保存',\n ),\n React.createElement('button', { style: S.btn, type: 'button', disabled: busy, onClick: () => void onReset() }, '重置为默认'),\n React.createElement('button', { style: S.btn, type: 'button', disabled: busy, onClick: () => void load() }, '重新读取'),\n ),\n notice !== null ? React.createElement('div', { style: S.okText }, notice) : null,\n error !== null ? React.createElement('div', { style: S.error }, error) : null,\n React.createElement(VersionLine, { pluginVersion: versions.plugin, skillVersion: versions.skill }),\n );\n}\n\ninterface BetterSidebarService {\n registerTab(descriptor: {\n readonly id: string;\n readonly title: string | (() => string);\n readonly order?: number;\n readonly single?: boolean;\n readonly component: (props: unknown) => React.ReactElement | null;\n }): () => void;\n}\n\nexport function apply(ctx: ClientCtx): void {\n // 调用口取用器透传给组件(每次取数现取;非函数由组件判缺席)。\n const getCall: GetCall = () => ctx.connection?.rpc?.call ?? null;\n\n // (a) 技能设置页 → 爱生活页签槽(总管声明;总管缺席时 inject 等待,不断链)。\n ctx.slots.inject('ilife.config-tab', () =>\n ctx.slots.register(\n {\n name: 'ilife.config-tab',\n id: 'dsh-calorie',\n order: 75,\n label: () => SLOT_TITLE,\n // #706:本包自己那条 RPC 通道交给总管(各家都写这一格),总管据此调配置体检——\n // 它因此不必在源码里写死任何一家的通道名(零单品依赖照旧成立)。\n channel: RPC_CHANNEL,\n },\n () => React.createElement(CalorieConfig, { getCall }),\n ),\n );\n\n // (b) 技能功能页 → sidebar槽(软依赖:betterSidebar 缺席即跳过)。\n const ensureWorkTab = (): boolean => {\n try {\n const get = ctx.get;\n const bs = (typeof get === 'function' ? get('betterSidebar') : undefined) as BetterSidebarService | undefined;\n if (!bs || typeof bs.registerTab !== 'function') return false;\n const dispose = bs.registerTab({\n id: 'ilife-calorie:work',\n title: '卡路里',\n order: 61,\n single: true,\n component: () => React.createElement(CalorieWork, { getCall }),\n });\n ctx.effect(() => () => {\n try {\n dispose();\n } catch {\n /* 卸载清理失败忽略 */\n }\n }, 'dsh-calorie: sidebar work tab');\n return true;\n } catch {\n return false;\n }\n };\n if (!ensureWorkTab()) {\n let tries = 0;\n const timer = setInterval(() => {\n tries++;\n if (ensureWorkTab() || tries >= 10) clearInterval(timer);\n }, 1000);\n ctx.effect(() => () => {\n clearInterval(timer);\n }, 'dsh-calorie: sidebar work tab retry');\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ConfigRecord } from 'base-link-core';
|
|
2
|
+
/**
|
|
3
|
+
* 这份技能的默认配置,逐项等于现有代码常量。
|
|
4
|
+
*
|
|
5
|
+
* 唯一一处「不是照抄老常量」的是 `dataDir`:#675 把「库目录必设、缺了就 exit 1」
|
|
6
|
+
* 换成了「默认 `~/.ilife/data/`,首次自动建」,所以它取配置件的 dataDir 而不是老的环境变量。
|
|
7
|
+
*/
|
|
8
|
+
export declare function calorieDefaults(): ConfigRecord;
|
|
9
|
+
/**
|
|
10
|
+
* 能把配置值送进技能子进程的那两项(#675 点名的「怎么送到技能子进程」)。
|
|
11
|
+
*
|
|
12
|
+
* 技能今天只从环境变量读这两个值,所以设置页存下的配置,只有这两项能立刻生效;
|
|
13
|
+
* 其余项在技能里是代码常量,要等技能侧那票改读配置文件(见 #676 解决评论)。
|
|
14
|
+
*/
|
|
15
|
+
export declare function spawnEnvFromConfig(values: ConfigRecord): Record<string, string>;
|
|
16
|
+
//# sourceMappingURL=config-defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-defaults.d.ts","sourceRoot":"","sources":["../src/config-defaults.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0BnD;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAsC9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO/E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** dsh-calorie 配置默认值表(宿主侧;要 node 才能在算,故不进 client 编译)。
|
|
2
|
+
*
|
|
3
|
+
* 口径来自 #675 的冻结决议与它的收窄(`docs/research/t692-six-skill-paths-survey.md`):
|
|
4
|
+
* **默认值必须逐项等于现有代码常量**,否则老数据会「看起来丢了」。
|
|
5
|
+
* 逐项出处见每条注释;`test/config-surface-676.test.mjs` 用源码文本锁死这份对齐。
|
|
6
|
+
*
|
|
7
|
+
* 这里只出「值」,不出「页面上长什么样」——后者住 settings.ts(那个文件必须零 node)。
|
|
8
|
+
*/
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { dirname, join } from 'node:path';
|
|
12
|
+
import { configPaths } from 'base-link-core';
|
|
13
|
+
import { CONFIG_STEM } from './settings.js';
|
|
14
|
+
/** 训记三份状态文件的家目录(`src/xunji/rateLimit.ts:27`、`src/xunji/fetch.ts:33`、`src/xunji/run-sync.ts:116`)。 */
|
|
15
|
+
const XUNJI_STATE_DIR = '.mavis';
|
|
16
|
+
/** 训记动作库的老机器路径(`src/xunji/catalog.ts:30`)。 */
|
|
17
|
+
const XUNJI_LEGACY_DIR = '.minimax';
|
|
18
|
+
/** 跨技能出口的固定尾段(相对那个技能包根,`src/workout/landRunner.ts:47,55`)。 */
|
|
19
|
+
const SKILL_CLI_REL = 'dist/cli/cmd_read.js';
|
|
20
|
+
/** 按包名解析某技能包根;解析不到就退回单仓相对路径(与 bridge.resolveSkillCli 同思路)。 */
|
|
21
|
+
function skillPackageRoot(packageName) {
|
|
22
|
+
try {
|
|
23
|
+
return dirname(createRequire(import.meta.url).resolve(packageName + '/package.json'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return join(homedir(), '.ilife', 'packages', packageName);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** 跨技能出口(作息 / 备忘)的默认入口文件。 */
|
|
30
|
+
function crossSkillCli(packageName) {
|
|
31
|
+
return join(skillPackageRoot(packageName), SKILL_CLI_REL);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 这份技能的默认配置,逐项等于现有代码常量。
|
|
35
|
+
*
|
|
36
|
+
* 唯一一处「不是照抄老常量」的是 `dataDir`:#675 把「库目录必设、缺了就 exit 1」
|
|
37
|
+
* 换成了「默认 `~/.ilife/data/`,首次自动建」,所以它取配置件的 dataDir 而不是老的环境变量。
|
|
38
|
+
*/
|
|
39
|
+
export function calorieDefaults() {
|
|
40
|
+
const { dataDir } = configPaths(CONFIG_STEM);
|
|
41
|
+
return {
|
|
42
|
+
// #675:数据目录默认 `~/.ilife/data/`(配置目录下的 data/),首次读自动建。
|
|
43
|
+
dataDir,
|
|
44
|
+
// skill-calorie/src/paths.ts:10
|
|
45
|
+
dbFile: 'calorie_data.db',
|
|
46
|
+
// skill-calorie/src/output.ts:37(photo/helpPaths.ts:18 同值)
|
|
47
|
+
htmlDir: 'calorie_html',
|
|
48
|
+
// 照片目录老口径是 CALORIE_PHOTOS_DIR,无默认、读降级写阻断;空串即「未配」。
|
|
49
|
+
photosDir: '',
|
|
50
|
+
// skill-calorie/src/photo/gifDoc.ts:68
|
|
51
|
+
gifsDir: 'gifs',
|
|
52
|
+
stems: {
|
|
53
|
+
// skill-calorie/src/photo/helpFile.ts:27
|
|
54
|
+
help: '卡路里_HELP',
|
|
55
|
+
// skill-calorie/src/output.ts:42
|
|
56
|
+
photoHelp: '卡路里_照片HELP',
|
|
57
|
+
// skill-calorie/src/photo/helpPaths.ts:23
|
|
58
|
+
quickRef: '卡路里_速查台',
|
|
59
|
+
},
|
|
60
|
+
xunji: {
|
|
61
|
+
// src/xunji/rateLimit.ts:26-28
|
|
62
|
+
pushRateFile: join(homedir(), XUNJI_STATE_DIR, 'xunji_push_rate.json'),
|
|
63
|
+
// src/xunji/fetch.ts:32-34
|
|
64
|
+
readRateFile: join(homedir(), XUNJI_STATE_DIR, 'xunji_bridge_rate.json'),
|
|
65
|
+
// src/xunji/run-sync.ts:114-117
|
|
66
|
+
syncStateFile: join(homedir(), XUNJI_STATE_DIR, 'xunji_bridge_sync_state.json'),
|
|
67
|
+
// src/xunji/catalog.ts:30
|
|
68
|
+
catalogLegacyPath: join(homedir(), XUNJI_LEGACY_DIR, '训记官方动作.json'),
|
|
69
|
+
},
|
|
70
|
+
exports: {
|
|
71
|
+
// src/workout/landRunner.ts:47
|
|
72
|
+
scheduleCli: crossSkillCli('skill-schedule'),
|
|
73
|
+
// src/workout/landRunner.ts:55
|
|
74
|
+
memoCli: crossSkillCli('skill-memo-ilife'),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 能把配置值送进技能子进程的那两项(#675 点名的「怎么送到技能子进程」)。
|
|
80
|
+
*
|
|
81
|
+
* 技能今天只从环境变量读这两个值,所以设置页存下的配置,只有这两项能立刻生效;
|
|
82
|
+
* 其余项在技能里是代码常量,要等技能侧那票改读配置文件(见 #676 解决评论)。
|
|
83
|
+
*/
|
|
84
|
+
export function spawnEnvFromConfig(values) {
|
|
85
|
+
const env = {};
|
|
86
|
+
const dataDir = values['dataDir'];
|
|
87
|
+
if (typeof dataDir === 'string' && dataDir.trim() !== '')
|
|
88
|
+
env['SKILLS_DB_PATH'] = dataDir;
|
|
89
|
+
const photosDir = values['photosDir'];
|
|
90
|
+
if (typeof photosDir === 'string' && photosDir.trim() !== '')
|
|
91
|
+
env['CALORIE_PHOTOS_DIR'] = photosDir;
|
|
92
|
+
return env;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=config-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-defaults.js","sourceRoot":"","sources":["../src/config-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qGAAqG;AACrG,MAAM,eAAe,GAAG,QAAiB,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,UAAmB,CAAC;AAE7C,8DAA8D;AAC9D,MAAM,aAAa,GAAG,sBAA+B,CAAC;AAEtD,8DAA8D;AAC9D,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,SAAS,aAAa,CAAC,WAAmB;IACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO;QACL,qDAAqD;QACrD,OAAO;QACP,gCAAgC;QAChC,MAAM,EAAE,iBAAiB;QACzB,2DAA2D;QAC3D,OAAO,EAAE,cAAc;QACvB,kDAAkD;QAClD,SAAS,EAAE,EAAE;QACb,uCAAuC;QACvC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE;YACL,yCAAyC;YACzC,IAAI,EAAE,UAAU;YAChB,iCAAiC;YACjC,SAAS,EAAE,YAAY;YACvB,0CAA0C;YAC1C,QAAQ,EAAE,SAAS;SACpB;QACD,KAAK,EAAE;YACL,+BAA+B;YAC/B,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,sBAAsB,CAAC;YACtE,2BAA2B;YAC3B,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,wBAAwB,CAAC;YACxE,gCAAgC;YAChC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,8BAA8B,CAAC;YAC/E,0BAA0B;YAC1B,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC;SACpE;QACD,OAAO,EAAE;YACP,+BAA+B;YAC/B,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAC5C,+BAA+B;YAC/B,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC;SAC3C;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IAC1F,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,GAAG,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC;IACpG,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -6,6 +6,39 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export declare const RPC_CHANNEL: "/ilife-calorie";
|
|
8
8
|
export declare const RPC_ENDPOINT_READ: "read";
|
|
9
|
+
/** #676 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */
|
|
10
|
+
export declare const RPC_ENDPOINT_CONFIG_GET: "config.get";
|
|
11
|
+
export declare const RPC_ENDPOINT_CONFIG_SAVE: "config.save";
|
|
12
|
+
export declare const RPC_ENDPOINT_CONFIG_RESET: "config.reset";
|
|
13
|
+
/** #706 配置体检端点:只读一次,回一份报告(判据由技能侧出,本包只透传)。
|
|
14
|
+
*
|
|
15
|
+
* 端点名与技能侧那条只读命令同名(`calorie.config.check`),两端各写一份、值相同:
|
|
16
|
+
* 插件侧这份是面板的第二段参数,技能侧那份是 CLI 要认的命令名。**报告形状**的唯一真相在
|
|
17
|
+
* 技能侧 `packages/skill-calorie/src/health.ts`;面板侧镜像在
|
|
18
|
+
* `packages/plugin-manager/src/health-contract.ts`。本包不校验、不重写那份报告。 */
|
|
19
|
+
export declare const RPC_ENDPOINT_CONFIG_CHECK: "config.check";
|
|
20
|
+
/** 保存载荷:一份键值(键路径 → 值)。缺项由宿主按默认值补齐,故只收用户真改的那些。 */
|
|
21
|
+
export interface SavePayload {
|
|
22
|
+
readonly values: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/** 保存载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */
|
|
25
|
+
export declare function parseSavePayload(raw: unknown): SavePayload | null;
|
|
26
|
+
/** 配置面回执:设置页一次拿齐「文件在哪、数据在哪、当前值、是不是这次新建的」。
|
|
27
|
+
*
|
|
28
|
+
* 形状与技能侧 `calorie.config.read` 的 data 逐字段同形(唯一定义地在那边的 cli/config.ts)。
|
|
29
|
+
* 这里不带默认值表——页面不猜默认值,「留空=按默认落点」由行文案说清,
|
|
30
|
+
* 「重置为默认」由技能侧 `calorie.config.reset` 执行。
|
|
31
|
+
*/
|
|
32
|
+
export interface ConfigSurfaceReply {
|
|
33
|
+
/** 配置文件绝对路径。 */
|
|
34
|
+
readonly path: string;
|
|
35
|
+
/** 数据目录绝对路径。 */
|
|
36
|
+
readonly dataDir: string;
|
|
37
|
+
/** 本次是不是「文件不存在、按默认值落了一份」。 */
|
|
38
|
+
readonly created: boolean;
|
|
39
|
+
/** 当前取值(文件里的 ⊕ 缺项按默认值补)。 */
|
|
40
|
+
readonly values: Record<string, unknown>;
|
|
41
|
+
}
|
|
9
42
|
/** 读请求载荷:与技能 CLI 的 key/params 同形(见 skill-calorie SKILL.md)。 */
|
|
10
43
|
export interface ReadPayload {
|
|
11
44
|
readonly key: string;
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAG,gBAAyB,CAAC;AACrD,eAAO,MAAM,iBAAiB,EAAG,MAAe,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAErD,wBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAE5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAE7D;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAMjE;AAED,8BAA8B;AAC9B,eAAO,MAAM,gBAAgB,EAAG,mBAA4B,CAAC;AAE7D,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAI1D"}
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAG,gBAAyB,CAAC;AACrD,eAAO,MAAM,iBAAiB,EAAG,MAAe,CAAC;AAEjD,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAG,YAAqB,CAAC;AAC7D,eAAO,MAAM,wBAAwB,EAAG,aAAsB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AAEjE;;;;;qEAKqE;AACrE,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AAEjE,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAKjE;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAErD,wBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAE5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAE7D;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAMjE;AAED,8BAA8B;AAC9B,eAAO,MAAM,gBAAgB,EAAG,mBAA4B,CAAC;AAE7D,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAI1D"}
|
package/dist/contract.js
CHANGED
|
@@ -6,6 +6,26 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export const RPC_CHANNEL = '/ilife-calorie';
|
|
8
8
|
export const RPC_ENDPOINT_READ = 'read';
|
|
9
|
+
/** #676 配置端点:读设置页整面、保存一份取值、重置为默认。同走一条通道,靠端点名分发。 */
|
|
10
|
+
export const RPC_ENDPOINT_CONFIG_GET = 'config.get';
|
|
11
|
+
export const RPC_ENDPOINT_CONFIG_SAVE = 'config.save';
|
|
12
|
+
export const RPC_ENDPOINT_CONFIG_RESET = 'config.reset';
|
|
13
|
+
/** #706 配置体检端点:只读一次,回一份报告(判据由技能侧出,本包只透传)。
|
|
14
|
+
*
|
|
15
|
+
* 端点名与技能侧那条只读命令同名(`calorie.config.check`),两端各写一份、值相同:
|
|
16
|
+
* 插件侧这份是面板的第二段参数,技能侧那份是 CLI 要认的命令名。**报告形状**的唯一真相在
|
|
17
|
+
* 技能侧 `packages/skill-calorie/src/health.ts`;面板侧镜像在
|
|
18
|
+
* `packages/plugin-manager/src/health-contract.ts`。本包不校验、不重写那份报告。 */
|
|
19
|
+
export const RPC_ENDPOINT_CONFIG_CHECK = 'config.check';
|
|
20
|
+
/** 保存载荷校验:形状不对返回 null,由调用方按 bad-request 回绝(不抛)。 */
|
|
21
|
+
export function parseSavePayload(raw) {
|
|
22
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
23
|
+
return null;
|
|
24
|
+
const { values } = raw;
|
|
25
|
+
if (typeof values !== 'object' || values === null || Array.isArray(values))
|
|
26
|
+
return null;
|
|
27
|
+
return { values: values };
|
|
28
|
+
}
|
|
9
29
|
export function ok(value) {
|
|
10
30
|
return { ok: true, value };
|
|
11
31
|
}
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAyB,CAAC;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAyB,CAAC;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAe,CAAC;AAEjD,mDAAmD;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAqB,CAAC;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAsB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AAEjE;;;;;qEAKqE;AACrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AAOjE,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,EAAE,MAAM,EAAE,GAAG,GAA2B,CAAC;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,EAAE,MAAM,EAAE,MAAiC,EAAE,CAAC;AACvD,CAAC;AAmCD,MAAM,UAAU,EAAE,CAAC,KAAc;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,OAAe;IAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAA0C,CAAC;IACnE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAiC,EAAE,CAAC;AAC5D,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAA4B,CAAC;AAE7D,iDAAiD;AACjD,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,EAAE,GAAI,GAAwB,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC;AACrC,CAAC"}
|
package/dist/dsh-ctx.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface SlotsRegisterOptions {
|
|
|
10
10
|
readonly order?: number;
|
|
11
11
|
readonly label?: string | (() => string);
|
|
12
12
|
readonly locale?: string;
|
|
13
|
+
/** 本包自己那条 RPC 通道(单段):注册时交出去,总管据此**通用地**调配置体检(票 #706)。 */
|
|
14
|
+
readonly channel?: string;
|
|
13
15
|
readonly inject?: () => Record<string, unknown>;
|
|
14
16
|
}
|
|
15
17
|
export interface SlotsFace {
|
package/dist/dsh-ctx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ export declare const inject: string[];
|
|
|
4
4
|
export declare function apply(ctx: HostCtx): void;
|
|
5
5
|
export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
|
|
6
6
|
export type { SlotDescriptor, TabsPort } from './slot.js';
|
|
7
|
-
export { SETTINGS_OWNER, SETTINGS_SLOT,
|
|
8
|
-
export type {
|
|
9
|
-
export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
|
|
7
|
+
export { SETTINGS_OWNER, SETTINGS_SLOT, CONFIG_STEM, CONFIG_ITEMS, COMMON_ITEM_COUNT, ADVANCED_GROUP_TITLE, ADVANCED_GROUP_NOTE, readPath, writePath } from './settings.js';
|
|
8
|
+
export type { ConfigItem, ConfigTier, ConfigControl } from './settings.js';
|
|
9
|
+
export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth, CONFIG_READ_KEY, CONFIG_WRITE_KEY, CONFIG_RESET_KEY, CONFIG_CHECK_KEY } from './bridge.js';
|
|
10
10
|
export { PROVIDER_NAME, SKILL_NAME, BUNDLED_SKILL_RANK, SKILL_FILE, skillDir, skillFile, parseSkillText, provider as skillProvider } from './skill-provider.js';
|
|
11
|
-
export { RPC_CHANNEL, RPC_ENDPOINT_READ, DEFAULT_READ_KEY, ok, fail, parseReadPayload } from './contract.js';
|
|
12
|
-
export type { ReadPayload, RpcError, RpcResult } from './contract.js';
|
|
11
|
+
export { RPC_CHANNEL, RPC_ENDPOINT_READ, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, DEFAULT_READ_KEY, ok, fail, parseReadPayload, parseSavePayload } from './contract.js';
|
|
12
|
+
export type { ReadPayload, SavePayload, ConfigSurfaceReply, RpcError, RpcResult } from './contract.js';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,cAAc,CAAC;AAGxD,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAClC,eAAO,MAAM,MAAM,UAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,cAAc,CAAC;AAGxD,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAClC,eAAO,MAAM,MAAM,UAAwC,CAAC;AAsC5D,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAmDxC;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACtJ,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5K,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7V,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChK,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxO,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,22 +7,42 @@
|
|
|
7
7
|
* 打包技能提供方见 skill-provider.ts(badge 同形,#56):单份 SKILL.md 按包名解析,
|
|
8
8
|
* rank 内联 600,名用 skill-calorie;面板/桥行为不受其影响。
|
|
9
9
|
*/
|
|
10
|
-
import { RPC_CHANNEL, RPC_ENDPOINT_READ, ok, fail, parseReadPayload } from './contract.js';
|
|
11
|
-
import { SkillBridgeError, readViaCli } from './bridge.js';
|
|
10
|
+
import { RPC_CHANNEL, RPC_ENDPOINT_READ, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, ok, fail, parseReadPayload, parseSavePayload } from './contract.js';
|
|
11
|
+
import { SkillBridgeError, readViaCli, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth } from './bridge.js';
|
|
12
12
|
import { PROVIDER_NAME, provider as skillProvider } from './skill-provider.js';
|
|
13
13
|
export const name = 'dsh-calorie';
|
|
14
14
|
export const inject = ['connection', 'skills', 'webServer'];
|
|
15
|
-
/** RPC 处理函数:endpoint 分发 → 载荷校验 → readViaCli → 信封包装(companion rpc.ts 同形)。
|
|
15
|
+
/** RPC 处理函数:endpoint 分发 → 载荷校验 → readViaCli/配置件 → 信封包装(companion rpc.ts 同形)。
|
|
16
|
+
*
|
|
17
|
+
* #676 起多三个配置端点(`config.get`/`config.save`/`config.reset`):设置页只经它们
|
|
18
|
+
* 读改自家配置,不 spawn 技能进程,也不直读磁盘(client 侧禁 node)。 */
|
|
16
19
|
const handleCalorieRpc = async (endpoint, payload) => {
|
|
17
|
-
if (endpoint !== RPC_ENDPOINT_READ)
|
|
18
|
-
return fail('bad-request', `未知端点:${String(endpoint)}`);
|
|
19
|
-
const parsed = parseReadPayload(payload ?? {});
|
|
20
|
-
if (!parsed)
|
|
21
|
-
return fail('bad-request', '载荷须为 {key: string, params: object}');
|
|
22
20
|
try {
|
|
23
|
-
|
|
21
|
+
if (endpoint === RPC_ENDPOINT_READ) {
|
|
22
|
+
const parsed = parseReadPayload(payload ?? {});
|
|
23
|
+
if (!parsed)
|
|
24
|
+
return fail('bad-request', '载荷须为 {key: string, params: object}');
|
|
25
|
+
return ok(readViaCli(parsed.key, parsed.params));
|
|
26
|
+
}
|
|
27
|
+
if (endpoint === RPC_ENDPOINT_CONFIG_GET)
|
|
28
|
+
return ok(readConfigSurface());
|
|
29
|
+
if (endpoint === RPC_ENDPOINT_CONFIG_SAVE) {
|
|
30
|
+
const parsed = parseSavePayload(payload ?? {});
|
|
31
|
+
if (!parsed)
|
|
32
|
+
return fail('bad-request', '载荷须为 {values: object}');
|
|
33
|
+
return ok(writeConfigValues(parsed.values));
|
|
34
|
+
}
|
|
35
|
+
if (endpoint === RPC_ENDPOINT_CONFIG_RESET)
|
|
36
|
+
return ok(resetConfigToDefaults());
|
|
37
|
+
// #706 配置体检:只读一次,把技能侧那份报告原样交回面板(本包不校验、不重写)。
|
|
38
|
+
if (endpoint === RPC_ENDPOINT_CONFIG_CHECK)
|
|
39
|
+
return ok(readConfigHealth());
|
|
40
|
+
return fail('bad-request', `未知端点:${String(endpoint)}`);
|
|
24
41
|
}
|
|
25
42
|
catch (e) {
|
|
43
|
+
// 配置面的报错也走这条:技能侧 cli/config.ts 把 base-link-core 的
|
|
44
|
+
// ConfigError 报文原样交出来(已带行号与文件名),readViaCli 把它带在
|
|
45
|
+
// fetch-failed 的报文里,页面照原样给用户看。
|
|
26
46
|
if (e instanceof SkillBridgeError)
|
|
27
47
|
return fail(e.code, e.message);
|
|
28
48
|
return fail('internal', e instanceof Error ? e.message : String(e));
|
|
@@ -91,8 +111,8 @@ export function apply(ctx) {
|
|
|
91
111
|
}
|
|
92
112
|
}
|
|
93
113
|
export { SKILL, SLOT_ID, SLOT_ORDER, SLOT_TITLE, PLUGIN, MANAGER_PLUGIN, slotDescriptor, TAB_COMPONENT, registerSingle, openSingle } from './slot.js';
|
|
94
|
-
export { SETTINGS_OWNER, SETTINGS_SLOT,
|
|
95
|
-
export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli } from './bridge.js';
|
|
114
|
+
export { SETTINGS_OWNER, SETTINGS_SLOT, CONFIG_STEM, CONFIG_ITEMS, COMMON_ITEM_COUNT, ADVANCED_GROUP_TITLE, ADVANCED_GROUP_NOTE, readPath, writePath } from './settings.js';
|
|
115
|
+
export { SKILL_PACKAGE, SKILL_CLI, SKILL_CLI_REL, HOST_CALL_METHOD, MANAGER_MISSING_HINT, SkillBridgeError, cliPath, assertCliPresent, handleHostCall, requestViaHost, readViaCli, readConfigSurface, writeConfigValues, resetConfigToDefaults, readConfigHealth, CONFIG_READ_KEY, CONFIG_WRITE_KEY, CONFIG_RESET_KEY, CONFIG_CHECK_KEY } from './bridge.js';
|
|
96
116
|
export { PROVIDER_NAME, SKILL_NAME, BUNDLED_SKILL_RANK, SKILL_FILE, skillDir, skillFile, parseSkillText, provider as skillProvider } from './skill-provider.js';
|
|
97
|
-
export { RPC_CHANNEL, RPC_ENDPOINT_READ, DEFAULT_READ_KEY, ok, fail, parseReadPayload } from './contract.js';
|
|
117
|
+
export { RPC_CHANNEL, RPC_ENDPOINT_READ, RPC_ENDPOINT_CONFIG_GET, RPC_ENDPOINT_CONFIG_SAVE, RPC_ENDPOINT_CONFIG_RESET, RPC_ENDPOINT_CONFIG_CHECK, DEFAULT_READ_KEY, ok, fail, parseReadPayload, parseSavePayload } from './contract.js';
|
|
98
118
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|