@jesonliu/lark-claudecode-bridge 0.18.1 → 0.20.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.md +14 -12
- package/assets/web/css/main.css +509 -111
- package/assets/web/index.html +12 -2
- package/assets/web/js/main.js +19 -11
- package/assets/web/js/pages/apps.js +10 -5
- package/assets/web/js/pages/claude.js +15 -5
- package/assets/web/js/pages/mcp.js +265 -0
- package/assets/web/js/pages/overview.js +5 -4
- package/assets/web/js/pages/permissions.js +56 -30
- package/assets/web/js/pages/plugins.js +29 -6
- package/assets/web/js/pages/skills.js +342 -0
- package/assets/web/js/pages/slash.js +11 -5
- package/assets/web/js/pages/workspaces.js +36 -14
- package/assets/web/js/theme.js +23 -0
- package/assets/web/js/ui.js +75 -4
- package/config.example.yaml +2 -3
- package/dist/access/access-control.d.ts +17 -1
- package/dist/access/access-control.js +31 -2
- package/dist/access/access-control.js.map +1 -1
- package/dist/bin/lcb.js +5 -0
- package/dist/bin/lcb.js.map +1 -1
- package/dist/claude-config.d.ts +14 -2
- package/dist/claude-config.js +75 -4
- package/dist/claude-config.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +0 -1
- package/dist/cli/setup-wizard.js +2 -4
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/config.js +39 -14
- package/dist/config.js.map +1 -1
- package/dist/executor/claude-executor.d.ts +1 -1
- package/dist/executor/claude-executor.js +4 -2
- package/dist/executor/claude-executor.js.map +1 -1
- package/dist/executor/notify-server.d.ts +20 -0
- package/dist/executor/notify-server.js +85 -4
- package/dist/executor/notify-server.js.map +1 -1
- package/dist/executor/plugin-discovery.d.ts +6 -0
- package/dist/executor/plugin-discovery.js +14 -0
- package/dist/executor/plugin-discovery.js.map +1 -1
- package/dist/gateway/card-builder.d.ts +60 -24
- package/dist/gateway/card-builder.js +200 -109
- package/dist/gateway/card-builder.js.map +1 -1
- package/dist/gateway/diff-card.js +1 -1
- package/dist/gateway/diff-card.js.map +1 -1
- package/dist/gateway/feishu-gateway.d.ts +27 -0
- package/dist/gateway/feishu-gateway.js +106 -4
- package/dist/gateway/feishu-gateway.js.map +1 -1
- package/dist/gateway/progress-card.d.ts +77 -0
- package/dist/gateway/progress-card.js +231 -8
- package/dist/gateway/progress-card.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +354 -98
- package/dist/index.js.map +1 -1
- package/dist/notify-sop.d.ts +1 -0
- package/dist/notify-sop.js +33 -0
- package/dist/notify-sop.js.map +1 -0
- package/dist/session/commands.d.ts +1 -1
- package/dist/session/commands.js +25 -2
- package/dist/session/commands.js.map +1 -1
- package/dist/session/session-store.d.ts +3 -0
- package/dist/session/session-store.js.map +1 -1
- package/dist/types.d.ts +23 -5
- package/dist/util/log-tee.d.ts +4 -0
- package/dist/util/log-tee.js +99 -0
- package/dist/util/log-tee.js.map +1 -0
- package/dist/util/runtime-dirs.d.ts +4 -0
- package/dist/util/runtime-dirs.js +27 -0
- package/dist/util/runtime-dirs.js.map +1 -0
- package/dist/util/workspace-diff.js +2 -2
- package/dist/util/workspace-diff.js.map +1 -1
- package/dist/web/lifecycle.d.ts +4 -1
- package/dist/web/lifecycle.js +11 -25
- package/dist/web/lifecycle.js.map +1 -1
- package/dist/web/server.js +404 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/skills-mcp-api.d.ts +120 -0
- package/dist/web/skills-mcp-api.js +348 -0
- package/dist/web/skills-mcp-api.js.map +1 -0
- package/package.json +3 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ============ 工作区(行内编辑 + 卡级保存;改动落盘后热生效) ============
|
|
2
2
|
import { S, $, esc, toast, cardDirty, applyDirty } from '../core.js';
|
|
3
|
-
import { saveBarHtml, dirtyDotHtml, bindSaveBar, pickDirectory } from '../ui.js';
|
|
3
|
+
import { saveBarHtml, dirtyDotHtml, bindSaveBar, pickDirectory, confirmDialog } from '../ui.js';
|
|
4
4
|
|
|
5
5
|
function renderWorkspaces(el) {
|
|
6
6
|
const doc = S.doc;
|
|
@@ -8,20 +8,27 @@ function renderWorkspaces(el) {
|
|
|
8
8
|
el.innerHTML = `
|
|
9
9
|
<div class="card">
|
|
10
10
|
<h3>工作区${dirtyDotHtml('ws')}</h3>
|
|
11
|
-
<div class="desc">Claude
|
|
12
|
-
<div
|
|
13
|
-
<button class="btn
|
|
11
|
+
<div class="desc">Claude 的工作目录白名单。需要「先出方案再执行」时,在飞书会话里发 /plan 按通道切换计划模式;git 仓库工作区任务收尾会自动发汇总 diff 卡片。</div>
|
|
12
|
+
<div class="list-toolbar">
|
|
13
|
+
<button class="btn primary" id="wsAdd">+ 添加工作区</button>
|
|
14
14
|
</div>
|
|
15
|
-
<table><thead><tr><th style="width:180px">名字</th><th>路径</th><th style="width:
|
|
15
|
+
<table><thead><tr><th style="width:180px">名字</th><th>路径</th><th style="width:50px"></th></tr></thead>
|
|
16
16
|
<tbody id="wsBody"></tbody></table>
|
|
17
17
|
${saveBarHtml('ws')}
|
|
18
18
|
<div class="footer-note">运行中的桥接器下一条消息自动生效,无需重启。</div>
|
|
19
19
|
</div>
|
|
20
20
|
<div class="card">
|
|
21
21
|
<h3>全局默认${dirtyDotHtml('def')}</h3>
|
|
22
|
-
<div class="row">
|
|
22
|
+
<div class="row-2col">
|
|
23
23
|
<div><label>默认工作区(defaults.workspace)</label><select id="defWs"></select></div>
|
|
24
24
|
<div><label>全局并发(concurrency)</label><input type="number" id="globalCc" min="1" max="100"></div>
|
|
25
|
+
<div><label>上下文提醒阈值(session.context_remind_tokens;0=关闭)</label><input type="number" id="defCtxRemind" min="0" max="10000000"></div>
|
|
26
|
+
<div><label>飞书卡片宽度(card.width)</label>
|
|
27
|
+
<select id="cardWidth">
|
|
28
|
+
<option value="default">默认(飞书默认)</option>
|
|
29
|
+
<option value="fill">撑满聊天窗口</option>
|
|
30
|
+
</select>
|
|
31
|
+
</div>
|
|
25
32
|
</div>
|
|
26
33
|
${saveBarHtml('def')}
|
|
27
34
|
</div>`;
|
|
@@ -46,16 +53,11 @@ function renderWorkspaces(el) {
|
|
|
46
53
|
<input type="text" data-f="path" value="${esc(ws.path || '')}">
|
|
47
54
|
<button class="btn sm" data-browse="path" title="浏览选择目录">浏览</button>
|
|
48
55
|
</div></td>
|
|
49
|
-
<td><
|
|
50
|
-
<option value="generic" ${ws.type !== 'code-dev' ? 'selected' : ''}>通用(generic)</option>
|
|
51
|
-
<option value="code-dev" ${ws.type === 'code-dev' ? 'selected' : ''}>开发工作流(code-dev)</option>
|
|
52
|
-
</select></td>
|
|
53
|
-
<td><button class="btn sm danger">删</button></td>`;
|
|
56
|
+
<td><button class="btn sm danger">删除</button></td>`;
|
|
54
57
|
tr.querySelectorAll('[data-f]').forEach((input) => {
|
|
55
58
|
input.oninput = input.onchange = () => {
|
|
56
59
|
const f = input.dataset.f;
|
|
57
|
-
if (f === '
|
|
58
|
-
else if (f === 'name') {
|
|
60
|
+
if (f === 'name') {
|
|
59
61
|
// 改名联动:全局默认指向旧名时同步,否则保存会因 defaults.workspace 不在工作区列表报错
|
|
60
62
|
if (doc.defaults?.workspace && doc.defaults.workspace === ws.name) {
|
|
61
63
|
doc.defaults = { ...(doc.defaults || {}), workspace: input.value };
|
|
@@ -67,8 +69,15 @@ function renderWorkspaces(el) {
|
|
|
67
69
|
cardDirty('ws', true);
|
|
68
70
|
};
|
|
69
71
|
});
|
|
70
|
-
tr.querySelector('.btn')
|
|
72
|
+
// 「删除」按钮精确选择(class="btn sm danger");原 tr.querySelector('.btn') 命中「浏览」并被浏览逻辑覆盖,故点「删除」无反应
|
|
73
|
+
tr.querySelector('.danger').onclick = async () => {
|
|
71
74
|
if (doc.workspaces.length <= 1) return toast('至少保留一个工作区', true);
|
|
75
|
+
if (!(await confirmDialog({
|
|
76
|
+
title: '删除工作区',
|
|
77
|
+
message: `确定删除工作区「${esc(ws.name || '未命名')}」?随本卡「保存」生效,保存前可点「还原」撤销。`,
|
|
78
|
+
danger: true,
|
|
79
|
+
confirmText: '删除',
|
|
80
|
+
}))) return;
|
|
72
81
|
doc.workspaces.splice(idx, 1);
|
|
73
82
|
cardDirty('ws', true);
|
|
74
83
|
renderWorkspaces(el);
|
|
@@ -89,6 +98,19 @@ function renderWorkspaces(el) {
|
|
|
89
98
|
$('#defWs').onchange = () => { doc.defaults = { ...(doc.defaults || {}), workspace: $('#defWs').value }; cardDirty('def', true); };
|
|
90
99
|
$('#globalCc').value = doc.concurrency ?? 3;
|
|
91
100
|
$('#globalCc').oninput = () => { doc.concurrency = Number($('#globalCc').value) || 3; cardDirty('def', true); };
|
|
101
|
+
// 上下文提醒阈值:空值 = 移除 session 段(PUT 跳过 = 磁盘原值未变,等价回滚);合法数字 = 写 session 段
|
|
102
|
+
const ctxInput = $('#defCtxRemind');
|
|
103
|
+
ctxInput.value = doc.session?.context_remind_tokens ?? 150000;
|
|
104
|
+
ctxInput.oninput = () => {
|
|
105
|
+
const v = ctxInput.value.trim();
|
|
106
|
+
if (v === '') delete doc.session;
|
|
107
|
+
else doc.session = { context_remind_tokens: Number(v) };
|
|
108
|
+
cardDirty('def', true);
|
|
109
|
+
};
|
|
110
|
+
// 卡片宽度:写 card.width;空/未设回 'default'
|
|
111
|
+
const cw = $('#cardWidth');
|
|
112
|
+
cw.value = doc.card?.width ?? 'default';
|
|
113
|
+
cw.onchange = () => { doc.card = { width: cw.value }; cardDirty('def', true); };
|
|
92
114
|
applyDirty(); // 增删行等操作先 cardDirty 再整卡重渲染:回放防止保存条/圆点随重建丢失
|
|
93
115
|
}
|
|
94
116
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// ============ 主题切换:跟随系统 / 亮色 / 暗色(顶栏分段控件,localStorage 持久化) ============
|
|
2
|
+
// data-theme 写在 <html> 上:auto = 不设属性(CSS 媒体查询接管);light/dark = 手动覆盖
|
|
3
|
+
const KEY = 'lcb-theme';
|
|
4
|
+
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
5
|
+
let current = 'auto';
|
|
6
|
+
|
|
7
|
+
const apply = (mode) => {
|
|
8
|
+
current = mode;
|
|
9
|
+
try { localStorage.setItem(KEY, mode); } catch { /* 隐私模式等写入失败可容忍 */ }
|
|
10
|
+
const root = document.documentElement;
|
|
11
|
+
if (mode === 'auto') delete root.dataset.theme;
|
|
12
|
+
else root.dataset.theme = mode;
|
|
13
|
+
document.querySelectorAll('#themeSwitch button').forEach((b) =>
|
|
14
|
+
b.classList.toggle('active', b.dataset.opt === mode));
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** main.js 启动时调用一次:恢复上次选择 + 绑定切换 + auto 模式跟随系统变化 */
|
|
18
|
+
export function initTheme() {
|
|
19
|
+
apply(localStorage.getItem(KEY) || 'auto');
|
|
20
|
+
mq.addEventListener('change', () => { if (current === 'auto') apply('auto'); }); // 仅为刷新 active 态展示
|
|
21
|
+
document.querySelectorAll('#themeSwitch button').forEach((b) =>
|
|
22
|
+
b.onclick = () => apply(b.dataset.opt));
|
|
23
|
+
}
|
package/assets/web/js/ui.js
CHANGED
|
@@ -1,6 +1,76 @@
|
|
|
1
|
-
// ============ 公共 UI 组件:保存条 / 目录选择弹层 / 右侧抽屉 ============
|
|
1
|
+
// ============ 公共 UI 组件:保存条 / 目录选择弹层 / 右侧抽屉 / 风格化确认弹窗 ============
|
|
2
2
|
import { S, $, esc, toast, api, saveDoc, refresh, hooks } from './core.js';
|
|
3
3
|
|
|
4
|
+
// ============ 风格化弹窗(替代浏览器原生 confirm / prompt) ============
|
|
5
|
+
let openDialogs = 0; // 打开中的弹窗计数:ESC 只关最上层弹窗,不误触抽屉
|
|
6
|
+
/** 挂载弹窗遮罩(.modal-mask + .dlg);返回卸载函数 */
|
|
7
|
+
function mountDialog(innerHTML) {
|
|
8
|
+
const mask = document.createElement('div');
|
|
9
|
+
mask.className = 'modal-mask';
|
|
10
|
+
mask.innerHTML = innerHTML;
|
|
11
|
+
document.body.appendChild(mask);
|
|
12
|
+
openDialogs++;
|
|
13
|
+
return { mask, unmount() { openDialogs--; mask.remove(); } };
|
|
14
|
+
}
|
|
15
|
+
/** 捕获阶段拦截 ESC / Enter(先于抽屉的冒泡监听),弹窗关闭后自动解绑 */
|
|
16
|
+
function bindDialogKeys(onKey) {
|
|
17
|
+
const handler = (e) => {
|
|
18
|
+
if (e.key !== 'Escape' && e.key !== 'Enter') return;
|
|
19
|
+
e.stopPropagation();
|
|
20
|
+
onKey(e.key);
|
|
21
|
+
};
|
|
22
|
+
document.addEventListener('keydown', handler, true);
|
|
23
|
+
return () => document.removeEventListener('keydown', handler, true);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 二次确认弹窗(替代 window.confirm)→ Promise<boolean>。
|
|
27
|
+
* message 支持 HTML(调用方负责 esc 用户数据);danger=true 时确认键为红色实心。
|
|
28
|
+
*/
|
|
29
|
+
export function confirmDialog({ title = '确认操作', message = '', confirmText = '确定', cancelText = '取消', danger = false }) {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
const { mask, unmount } = mountDialog(`
|
|
32
|
+
<div class="modal dlg" role="alertdialog" aria-modal="true">
|
|
33
|
+
<h3 class="dlg-title${danger ? ' danger' : ''}">${danger ? '<span class="dlg-ico" aria-hidden="true">!</span>' : ''}${title}</h3>
|
|
34
|
+
<div class="dlg-msg">${message}</div>
|
|
35
|
+
<div class="dlg-foot">
|
|
36
|
+
<button class="btn" data-dlg="cancel">${esc(cancelText)}</button>
|
|
37
|
+
<button class="btn ${danger ? 'danger-solid' : 'primary'}" data-dlg="ok">${esc(confirmText)}</button>
|
|
38
|
+
</div>
|
|
39
|
+
</div>`);
|
|
40
|
+
const done = (v) => { unbind(); unmount(); resolve(v); };
|
|
41
|
+
const unbind = bindDialogKeys((key) => done(key === 'Enter'));
|
|
42
|
+
mask.querySelector('[data-dlg="ok"]').onclick = () => done(true);
|
|
43
|
+
mask.querySelector('[data-dlg="cancel"]').onclick = () => done(false);
|
|
44
|
+
mask.onclick = (e) => { if (e.target === mask) done(false); };
|
|
45
|
+
mask.querySelector('[data-dlg="ok"]').focus();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 输入弹窗(替代 window.prompt)→ Promise<string|null>(null = 取消)。
|
|
50
|
+
*/
|
|
51
|
+
export function promptDialog({ title = '请输入', message = '', placeholder = '', value = '', confirmText = '确定', cancelText = '取消' }) {
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
const { mask, unmount } = mountDialog(`
|
|
54
|
+
<div class="modal dlg" role="dialog" aria-modal="true">
|
|
55
|
+
<h3 class="dlg-title">${title}</h3>
|
|
56
|
+
<div class="dlg-msg">${message}</div>
|
|
57
|
+
<input type="text" class="dlg-input" placeholder="${esc(placeholder)}" value="${esc(value)}">
|
|
58
|
+
<div class="dlg-foot">
|
|
59
|
+
<button class="btn" data-dlg="cancel">${esc(cancelText)}</button>
|
|
60
|
+
<button class="btn primary" data-dlg="ok">${esc(confirmText)}</button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>`);
|
|
63
|
+
const input = mask.querySelector('.dlg-input');
|
|
64
|
+
const done = (v) => { unbind(); unmount(); resolve(v); };
|
|
65
|
+
const unbind = bindDialogKeys((key) => done(key === 'Enter' ? input.value : null));
|
|
66
|
+
mask.querySelector('[data-dlg="ok"]').onclick = () => done(input.value);
|
|
67
|
+
mask.querySelector('[data-dlg="cancel"]').onclick = () => done(null);
|
|
68
|
+
mask.onclick = (e) => { if (e.target === mask) done(null); };
|
|
69
|
+
input.focus();
|
|
70
|
+
input.select();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
4
74
|
/** 卡级保存行(页内表单卡通用):保存 = saveDoc 落盘;还原 = 重拉磁盘配置 */
|
|
5
75
|
export const saveBarHtml = (id) => `<div class="savebar" id="bar-${id}" style="display:none"><span class="state">有未保存的修改</span><span style="flex:1"></span><button class="btn" data-discard="${id}">还原</button><button class="btn primary" data-save="${id}">保存</button></div>`;
|
|
6
76
|
export const dirtyDotHtml = (id) => `<span class="dirty-dot" id="dirty-${id}">· 未保存</span>`;
|
|
@@ -34,7 +104,7 @@ export function pickDirectory(initialPath) {
|
|
|
34
104
|
<div class="row">
|
|
35
105
|
<input type="text" class="pd-jump" placeholder="输入或粘贴路径,回车前往">
|
|
36
106
|
<button class="btn pd-go" title="跳转到输入的路径">前往</button>
|
|
37
|
-
<button class="btn pd-up" title="返回上一级"
|
|
107
|
+
<button class="btn pd-up" title="返回上一级">上级目录</button>
|
|
38
108
|
</div>
|
|
39
109
|
<div class="hint pd-cur" style="margin:8px 0 0;word-break:break-all"></div>
|
|
40
110
|
<div class="dir-list"><div class="empty">加载中…</div></div>
|
|
@@ -65,7 +135,7 @@ export function pickDirectory(initialPath) {
|
|
|
65
135
|
? r.drives.map((d) => ({ label: d, next: d }))
|
|
66
136
|
: (r.dirs || []).map((d) => ({ label: d, next: joinPath(current, d) }));
|
|
67
137
|
list.innerHTML = items.length
|
|
68
|
-
? items.map((it) => `<button data-next="${esc(it.next)}"
|
|
138
|
+
? items.map((it) => `<button data-next="${esc(it.next)}">${esc(it.label)}</button>`).join('')
|
|
69
139
|
: `<div class="empty">${r.error ? '(上述路径无法列出子目录)' : '(没有子目录)'}</div>`;
|
|
70
140
|
list.querySelectorAll('button[data-next]').forEach((b) => b.onclick = () => go(b.dataset.next));
|
|
71
141
|
};
|
|
@@ -119,5 +189,6 @@ const dismissDrawer = () => (drawerSnap ? cancelDrawer() : closeDrawer());
|
|
|
119
189
|
export function initDrawer() {
|
|
120
190
|
$('#drawerClose').onclick = dismissDrawer;
|
|
121
191
|
$('#drawerMask').addEventListener('mousedown', (e) => { if (e.target === e.currentTarget) dismissDrawer(); });
|
|
122
|
-
|
|
192
|
+
// ESC 有风格化弹窗打开时归弹窗(其自身在捕获阶段拦截并 stopPropagation,此处计数兜底)
|
|
193
|
+
document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !openDialogs) dismissDrawer(); });
|
|
123
194
|
}
|
package/config.example.yaml
CHANGED
|
@@ -37,11 +37,10 @@ apps:
|
|
|
37
37
|
workspaces: # 工作区白名单:名字 + 路径(所有机器人共享列表,当前使用哪个 per-app 隔离)
|
|
38
38
|
- name: demo
|
|
39
39
|
path: F:\workspace\demo
|
|
40
|
-
#
|
|
41
|
-
|
|
40
|
+
# 需要「先出方案再执行」时,在飞书会话里发 /plan 按通道切换计划模式;
|
|
41
|
+
# git 仓库工作区任务收尾自动发汇总 diff 卡片(不再整文件上传)
|
|
42
42
|
# - name: my-project
|
|
43
43
|
# path: F:\workspace\my-project
|
|
44
|
-
# type: code-dev
|
|
45
44
|
defaults:
|
|
46
45
|
workspace: demo
|
|
47
46
|
concurrency: 3 # 全局并发上限(未单独配置的 app 沿用此值)
|
|
@@ -3,12 +3,14 @@ export interface AccessStoreData {
|
|
|
3
3
|
name: string;
|
|
4
4
|
role: 'admin' | 'member';
|
|
5
5
|
pairedAt: string;
|
|
6
|
+
appId?: string;
|
|
6
7
|
}>;
|
|
7
8
|
pending: Record<string, {
|
|
8
9
|
userId: string;
|
|
9
10
|
name: string;
|
|
10
11
|
code: string;
|
|
11
12
|
expiresAt: number;
|
|
13
|
+
appId?: string;
|
|
12
14
|
}>;
|
|
13
15
|
}
|
|
14
16
|
export declare class AccessControl {
|
|
@@ -26,12 +28,26 @@ export declare class AccessControl {
|
|
|
26
28
|
private save;
|
|
27
29
|
isAllowed(userId: string): boolean;
|
|
28
30
|
isAdmin(userId: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* 是否已有用户。传 appId 时按应用统计——多应用部署下 open_id 按应用隔离,
|
|
33
|
+
* 「首个使用者免配对自动 admin」也应按应用判定:新应用的第一个使用者同样直接成为
|
|
34
|
+
* admin,而不是因为别的应用已有用户就被迫走配对码。无 appId 的历史记录不计入
|
|
35
|
+
* 任何应用(它们会在下次发消息时被 ensureAppId 补登)。
|
|
36
|
+
*/
|
|
37
|
+
hasUsers(appId?: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* 直接添加用户(首个使用者免配对自动成为 admin 用)。
|
|
40
|
+
* 已存在时按传入 role/name 覆盖——与 approvePairing 的写语义一致(后写胜出)。
|
|
41
|
+
*/
|
|
42
|
+
addUser(userId: string, name: string, role: 'admin' | 'member', appId?: string): void;
|
|
43
|
+
/** 历史用户记录缺 appId 时按当前来路补登(老版本 access.json 的平滑迁移) */
|
|
44
|
+
ensureAppId(userId: string, appId: string): void;
|
|
29
45
|
listPending(): Array<{
|
|
30
46
|
userId: string;
|
|
31
47
|
name: string;
|
|
32
48
|
code: string;
|
|
33
49
|
}>;
|
|
34
|
-
beginPairing(userId: string, name: string): string;
|
|
50
|
+
beginPairing(userId: string, name: string, appId?: string): string;
|
|
35
51
|
approvePairing(code: string): {
|
|
36
52
|
ok: boolean;
|
|
37
53
|
userId?: string;
|
|
@@ -43,14 +43,42 @@ export class AccessControl {
|
|
|
43
43
|
isAdmin(userId) {
|
|
44
44
|
return this.data.users[userId]?.role === 'admin';
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* 是否已有用户。传 appId 时按应用统计——多应用部署下 open_id 按应用隔离,
|
|
48
|
+
* 「首个使用者免配对自动 admin」也应按应用判定:新应用的第一个使用者同样直接成为
|
|
49
|
+
* admin,而不是因为别的应用已有用户就被迫走配对码。无 appId 的历史记录不计入
|
|
50
|
+
* 任何应用(它们会在下次发消息时被 ensureAppId 补登)。
|
|
51
|
+
*/
|
|
52
|
+
hasUsers(appId) {
|
|
53
|
+
if (appId === undefined)
|
|
54
|
+
return Object.keys(this.data.users).length > 0;
|
|
55
|
+
return Object.values(this.data.users).some((u) => u.appId === appId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 直接添加用户(首个使用者免配对自动成为 admin 用)。
|
|
59
|
+
* 已存在时按传入 role/name 覆盖——与 approvePairing 的写语义一致(后写胜出)。
|
|
60
|
+
*/
|
|
61
|
+
addUser(userId, name, role, appId) {
|
|
62
|
+
this.data.users[userId] = { name, role, pairedAt: new Date().toISOString(), ...(appId ? { appId } : {}) };
|
|
63
|
+
delete this.data.pending[userId]; // 残留的配对申请一并清掉
|
|
64
|
+
this.save();
|
|
65
|
+
}
|
|
66
|
+
/** 历史用户记录缺 appId 时按当前来路补登(老版本 access.json 的平滑迁移) */
|
|
67
|
+
ensureAppId(userId, appId) {
|
|
68
|
+
const u = this.data.users[userId];
|
|
69
|
+
if (u && !u.appId) {
|
|
70
|
+
u.appId = appId;
|
|
71
|
+
this.save();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
46
74
|
listPending() {
|
|
47
75
|
this.evict();
|
|
48
76
|
return Object.values(this.data.pending).map(({ userId, name, code }) => ({ userId, name, code }));
|
|
49
77
|
}
|
|
50
|
-
beginPairing(userId, name) {
|
|
78
|
+
beginPairing(userId, name, appId) {
|
|
51
79
|
this.evict();
|
|
52
80
|
const code = String(randomInt(0, 1_000_000)).padStart(6, '0');
|
|
53
|
-
this.data.pending[userId] = { userId, name, code, expiresAt: Date.now() + TTL_MS };
|
|
81
|
+
this.data.pending[userId] = { userId, name, code, expiresAt: Date.now() + TTL_MS, ...(appId ? { appId } : {}) };
|
|
54
82
|
this.save();
|
|
55
83
|
return code;
|
|
56
84
|
}
|
|
@@ -64,6 +92,7 @@ export class AccessControl {
|
|
|
64
92
|
name: entry.name,
|
|
65
93
|
role: isFirstAdmin ? 'admin' : 'member',
|
|
66
94
|
pairedAt: new Date().toISOString(),
|
|
95
|
+
...(entry.appId ? { appId: entry.appId } : {}),
|
|
67
96
|
};
|
|
68
97
|
delete this.data.pending[entry.userId];
|
|
69
98
|
this.save();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-control.js","sourceRoot":"","sources":["../../src/access/access-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAO9B,MAAM,OAAO,aAAa;IAEJ,SAAS;IADrB,IAAI,CAAkB;IAC9B,YAAoB,SAAiB,EAAE,IAAsB;yBAAzC,SAAS;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,SAAiB;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAoB,CAAC;YAC3E,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD;;;;;OAKG;IACH,MAAM;QACJ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAoB,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IACO,IAAI;QACV,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IACD,SAAS,CAAC,MAAc;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC;IACnD,CAAC;IACD,WAAW;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,YAAY,CAAC,MAAc,EAAE,IAAY;
|
|
1
|
+
{"version":3,"file":"access-control.js","sourceRoot":"","sources":["../../src/access/access-control.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/lcb.js
CHANGED
|
@@ -14,12 +14,17 @@ import { startWebServer } from '../web/server.js';
|
|
|
14
14
|
import { AccessControl } from '../access/access-control.js';
|
|
15
15
|
import { VERSION } from '../version.js';
|
|
16
16
|
import { join } from 'node:path';
|
|
17
|
+
import { ensureRuntimeDirs } from '../util/runtime-dirs.js';
|
|
18
|
+
import { installLogTee, cleanupOldLogs } from '../util/log-tee.js';
|
|
17
19
|
function showPending(access) {
|
|
18
20
|
const pending = access.listPending();
|
|
19
21
|
if (pending.length)
|
|
20
22
|
console.log('待配对:', pending.map((p) => `${p.code}(${p.userId})`).join('、'));
|
|
21
23
|
}
|
|
22
24
|
async function main() {
|
|
25
|
+
ensureRuntimeDirs(); // 首装即建目录:后续所有命令的写盘(含配置页 tmp 文件)不再因目录缺失 ENOENT
|
|
26
|
+
installLogTee(); // console 双写到 logs/bridge-YYYY-MM-DD.log(#7:按天拆分,替代旧 bridge.log)
|
|
27
|
+
cleanupOldLogs(); // 启动时清 14 天前的日志
|
|
23
28
|
const [cmd, ...args] = process.argv.slice(2);
|
|
24
29
|
switch (cmd) {
|
|
25
30
|
case 'setup':
|
package/dist/bin/lcb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcb.js","sourceRoot":"","sources":["../../src/bin/lcb.ts"],"names":[],"mappings":";AACA,sDAAsD;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"lcb.js","sourceRoot":"","sources":["../../src/bin/lcb.ts"],"names":[],"mappings":"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"}
|
package/dist/claude-config.d.ts
CHANGED
|
@@ -15,10 +15,22 @@ export declare function resolveClaudeDir(config: BridgeConfig): string;
|
|
|
15
15
|
* 不能被本机值或 env 配置绕过。
|
|
16
16
|
*/
|
|
17
17
|
export declare function buildManagedSettings(existing: unknown, claude: ClaudeConfig, userEnv?: Record<string, string>, configEnv?: Record<string, string>): Record<string, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* managed 模式下把本机 ~/.claude/skills 桥接到托管目录的 skills/,让托管会话看到
|
|
20
|
+
* user 范围的 skills(否则 ~/.claude/skills/* 永远不可见——因为 Claude Code 只从
|
|
21
|
+
* $CLAUDE_CONFIG_DIR/skills 发现 user skills,managed 模式 CLAUDE_CONFIG_DIR 不再
|
|
22
|
+
* 指向 ~/.claude)。每个 skill 在托管目录下用目录链接(Windows junction / POSIX
|
|
23
|
+
* symlink)挂到真实位置——skill 更新在原处落地,链接侧无感。
|
|
24
|
+
* 返回 bridged 名单供日志;同名已存在(非 symlink)时报错并跳过(用户已托管自定义
|
|
25
|
+
* 副本,勿覆盖)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function bridgeUserSkills(managedDir: string, userClaudeDir: string): string[];
|
|
18
28
|
/**
|
|
19
29
|
* managed 模式初始化:建目录 + 把 claude 段最新值合并进 settings.json,
|
|
20
|
-
* 并从本机 ~/.claude 继承 MCP servers(.claude.json mcpServers
|
|
21
|
-
* (settings.json env
|
|
30
|
+
* 并从本机 ~/.claude 继承 MCP servers(.claude.json mcpServers)、自定义环境变量
|
|
31
|
+
* (settings.json env 块,领土键除外)与 user skills(junction 桥接)——否则托管
|
|
32
|
+
* 会话读不到用户全局 MCP 及其依赖变量、看不到 ~/.claude/skills 下的 skill
|
|
33
|
+
* (典型表现:飞书斜杠命令 /<skill-name> 透传给 CLI 后报 Unknown command)。
|
|
22
34
|
* lcb start 启动 bridge 前调用,保证首条消息前认证/环境就位;非 managed 模式为 no-op。
|
|
23
35
|
*/
|
|
24
36
|
export declare function initManagedClaudeDir(config: BridgeConfig, userClaudeDir?: string): void;
|
package/dist/claude-config.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// inherit(缺省)= 共享本机 ~/.claude(0.4 起行为:登录态/settings/user MCP/skills 全继承);
|
|
3
3
|
// managed = bridge 自管 ~/.lark-claudecode-bridge/claude/,认证与模型由 config.yaml claude 段
|
|
4
4
|
// 全权写入该目录 settings.json——彻底摆脱对本机 claude login 的依赖(一键安装开箱即用)。
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import { homedir } from 'node:os';
|
|
7
|
-
import { join } from 'node:path';
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
8
|
import { CONFIG_DIR } from './config.js';
|
|
9
9
|
export const MANAGED_CLAUDE_DIR = join(CONFIG_DIR, 'claude');
|
|
10
10
|
/** 本机默认 ~/.claude(inherit 模式生效目录;managed 模式下作为插件第二来源目录) */
|
|
@@ -117,10 +117,77 @@ function writeAtomicJson(path, value) {
|
|
|
117
117
|
writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
118
118
|
renameSync(tmp, path);
|
|
119
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* managed 模式下把本机 ~/.claude/skills 桥接到托管目录的 skills/,让托管会话看到
|
|
122
|
+
* user 范围的 skills(否则 ~/.claude/skills/* 永远不可见——因为 Claude Code 只从
|
|
123
|
+
* $CLAUDE_CONFIG_DIR/skills 发现 user skills,managed 模式 CLAUDE_CONFIG_DIR 不再
|
|
124
|
+
* 指向 ~/.claude)。每个 skill 在托管目录下用目录链接(Windows junction / POSIX
|
|
125
|
+
* symlink)挂到真实位置——skill 更新在原处落地,链接侧无感。
|
|
126
|
+
* 返回 bridged 名单供日志;同名已存在(非 symlink)时报错并跳过(用户已托管自定义
|
|
127
|
+
* 副本,勿覆盖)。
|
|
128
|
+
*/
|
|
129
|
+
export function bridgeUserSkills(managedDir, userClaudeDir) {
|
|
130
|
+
const userSkills = join(userClaudeDir, 'skills');
|
|
131
|
+
if (resolve(managedDir) === resolve(userClaudeDir))
|
|
132
|
+
return [];
|
|
133
|
+
if (!existsSync(userSkills))
|
|
134
|
+
return [];
|
|
135
|
+
const targetDir = join(managedDir, 'skills');
|
|
136
|
+
mkdirSync(targetDir, { recursive: true });
|
|
137
|
+
const bridged = [];
|
|
138
|
+
for (const name of readdirSyncSafe(userSkills)) {
|
|
139
|
+
const src = join(userSkills, name);
|
|
140
|
+
if (!existsSync(join(src, 'SKILL.md')))
|
|
141
|
+
continue; // 非 skill 目录(散文件)跳过
|
|
142
|
+
const dst = join(targetDir, name);
|
|
143
|
+
// lstat 不跟随链接:能识别「源已被删除的失效链接」(existsSync 会误判为不存在)
|
|
144
|
+
let dstLstat;
|
|
145
|
+
try {
|
|
146
|
+
dstLstat = lstatSync(dst);
|
|
147
|
+
}
|
|
148
|
+
catch { /* 不存在 */ }
|
|
149
|
+
if (dstLstat) {
|
|
150
|
+
if (dstLstat.isSymbolicLink()) {
|
|
151
|
+
if (existsSync(dst))
|
|
152
|
+
continue; // 链接有效,幂等
|
|
153
|
+
// 源已删除的失效链接:移除后重建(junction 删除不影响源目录)
|
|
154
|
+
try {
|
|
155
|
+
rmSync(dst, { force: true });
|
|
156
|
+
}
|
|
157
|
+
catch { /* 移除失败则按占用跳过 */
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.warn(`[managed] skills/${name} 在托管目录已存在且非链接,跳过桥接(若想刷新请手动删除)`);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
symlinkSync(resolve(src), dst, 'junction'); // Windows 上无需管理员权限
|
|
168
|
+
bridged.push(name);
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
// 单个 skill 桥接失败(权限/跨盘符等)不阻断启动:其余 skill 照常桥接
|
|
172
|
+
console.warn(`[managed] skills/${name} 桥接失败:`, e instanceof Error ? e.message : e);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return bridged;
|
|
176
|
+
}
|
|
177
|
+
function readdirSyncSafe(dir) {
|
|
178
|
+
try {
|
|
179
|
+
return readdirSync(dir);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
120
185
|
/**
|
|
121
186
|
* managed 模式初始化:建目录 + 把 claude 段最新值合并进 settings.json,
|
|
122
|
-
* 并从本机 ~/.claude 继承 MCP servers(.claude.json mcpServers
|
|
123
|
-
* (settings.json env
|
|
187
|
+
* 并从本机 ~/.claude 继承 MCP servers(.claude.json mcpServers)、自定义环境变量
|
|
188
|
+
* (settings.json env 块,领土键除外)与 user skills(junction 桥接)——否则托管
|
|
189
|
+
* 会话读不到用户全局 MCP 及其依赖变量、看不到 ~/.claude/skills 下的 skill
|
|
190
|
+
* (典型表现:飞书斜杠命令 /<skill-name> 透传给 CLI 后报 Unknown command)。
|
|
124
191
|
* lcb start 启动 bridge 前调用,保证首条消息前认证/环境就位;非 managed 模式为 no-op。
|
|
125
192
|
*/
|
|
126
193
|
export function initManagedClaudeDir(config, userClaudeDir = DEFAULT_CLAUDE_DIR) {
|
|
@@ -139,5 +206,9 @@ export function initManagedClaudeDir(config, userClaudeDir = DEFAULT_CLAUDE_DIR)
|
|
|
139
206
|
}
|
|
140
207
|
writeAtomicJson(settingsPath, buildManagedSettings(existing, config.claude, readUserSettingsEnv(userClaudeDir), config.claude.env));
|
|
141
208
|
syncMcpServers(MANAGED_CLAUDE_DIR, userClaudeDir);
|
|
209
|
+
const bridged = bridgeUserSkills(MANAGED_CLAUDE_DIR, userClaudeDir);
|
|
210
|
+
if (bridged.length > 0) {
|
|
211
|
+
console.log(`[managed] 已桥接 user skills 到托管目录:${bridged.join('、')}(${bridged.length} 个)`);
|
|
212
|
+
}
|
|
142
213
|
}
|
|
143
214
|
//# sourceMappingURL=claude-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../src/claude-config.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,yEAAyE;AACzE,oFAAoF;AACpF,6DAA6D;AAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../src/claude-config.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup-wizard.js
CHANGED
|
@@ -98,10 +98,8 @@ export async function runSetup(configPath) {
|
|
|
98
98
|
if (!name)
|
|
99
99
|
break;
|
|
100
100
|
const path = await ask(`工作区 ${name} 的本机路径`);
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
const normalized = type.trim() === 'code-dev' ? 'code-dev' : 'generic';
|
|
104
|
-
workspaces.push({ name, path, ...(normalized === 'code-dev' ? { type: normalized } : {}) });
|
|
101
|
+
// #6 起无工作区类型:统一通用模式;计划模式在飞书发 /plan 按通道切换
|
|
102
|
+
workspaces.push({ name, path });
|
|
105
103
|
if (!defaultWorkspace)
|
|
106
104
|
defaultWorkspace = name;
|
|
107
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../src/cli/setup-wizard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../src/cli/setup-wizard.ts"],"names":[],"mappings":"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"}
|