@agent-link/server 0.1.540 → 0.1.541
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/package.json +1 -1
- package/web/dist/assets/{abnfDiagram-VRR7QNED-D1hyJ-hn.js → abnfDiagram-VRR7QNED-D3cc6ixD.js} +1 -1
- package/web/dist/assets/{arc-BuJJgjYt.js → arc-C-BlGAqM.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-A9THC2Cc.js → architectureDiagram-ZJ3FMSHR-DFN1M5P0.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-De9_CtWv.js → blockDiagram-677ZJIJ3-CDGMAaEw.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-DeZVA52a.js → c4Diagram-LMCZKHZV-DtOVXwWZ.js} +1 -1
- package/web/dist/assets/channel-CuV7Fkfy.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-DlDecKcs.js → chunk-2Q5K7J3B-DsKmVVjx.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-BhpTBz4U.js → chunk-32BRIVSS-DVylOf0u.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-DE8R6mLs.js → chunk-5VM5RSS4-ZFKorQZc.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-t_9lUdF-.js → chunk-EX3LRPZG-i5xQFv1I.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-D8olqveE.js → chunk-JWPE2WC7-zvEi3Xdy.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-qQmIJLhN.js → chunk-MOJQB5TN-BVW_jPqa.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-o8VHYTB2.js → chunk-RYQCIY6F-BoZGJACR.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-DGpoi6XB.js → chunk-V7JOEXUC-Qa299BUI.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-BjtiAe03.js → chunk-VR4S4FIN-BIDjyO2q.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-Bf9B2FsN.js → chunk-XXDRQBXY-B9Inv9MZ.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-CHm9qeAX.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-CHm9qeAX.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-CUu8D0Zk.js → cose-bilkent-JH36ORCC-DULZYWPx.js} +1 -1
- package/web/dist/assets/{cssMode-BBGTtP8x.js → cssMode-CLeQotjJ.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-DVyQShfu.js → cynefin-VYW2F7L2-E9svUmbu.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-5-G2jXgr.js → cynefinDiagram-TSTJHNR4-BQbCXTXu.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-BVIWNamr.js → dagre-VKFMJZFB-YjOfj-Sz.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-DB_8HU4p.js → diagram-FQU43EPY-DKlBYUat.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-BuC9KdPo.js → diagram-G47NLZAW-HgY0xVom.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-DEjdAGik.js → diagram-NH7WQ7WH-Lhdi0JDL.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-CpUMGDrP.js → diagram-OA4YK3LP-CCdsuo8R.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-CD-UVma6.js → diagram-WEI45ONY-CrzIcpD0.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-Crk2X-Xr.js → ebnfDiagram-CCIWWBDH-BHGungqQ.js} +1 -1
- package/web/dist/assets/{editor.main-DX1kz8I2.js → editor.main-BgAd3I-c.js} +3 -3
- package/web/dist/assets/{erDiagram-Q63AITRT-POwYozga.js → erDiagram-Q63AITRT-DALVLFvS.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-5jmZ5k5e.js → flowDiagram-23GEKE2U-vMO_-Vas.js} +1 -1
- package/web/dist/assets/{freemarker2-mDrCFxI5.js → freemarker2-Cm5E9K9d.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-B9Mdj-u5.js → ganttDiagram-NO4QXBWP-B_y7vhkq.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-CNPSE7ls.js → gitGraphDiagram-IHSO6WYX-oyKu_s1_.js} +1 -1
- package/web/dist/assets/{handlebars--G4a_6Oo.js → handlebars-CdvxB8_F.js} +1 -1
- package/web/dist/assets/{html-tA32frga.js → html-DfU3H_eD.js} +1 -1
- package/web/dist/assets/{htmlMode-CggNnIWF.js → htmlMode-aW42TeyA.js} +1 -1
- package/web/dist/assets/index-9oRptzQJ.css +32 -0
- package/web/dist/assets/{index-AdB8XHXv.js → index-ZEqZC6sq.js} +6 -6
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-CyB7Vvcb.js → infoDiagram-FWYZ7A6U-A8ue0Rc8.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-DLMZ7H1X.js → ishikawaDiagram-FXEZZL3T-skFheQel.js} +1 -1
- package/web/dist/assets/{javascript-DMkX6-SC.js → javascript-BSVgnqft.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-_nk1wTqH.js → journeyDiagram-5HDEW3XC-CxcqTnYP.js} +1 -1
- package/web/dist/assets/{jsonMode-BatVhCGs.js → jsonMode-Chyio2CN.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-Cz1JY0qx.js → kanban-definition-HUTT4EX6-3IdDzCA6.js} +1 -1
- package/web/dist/assets/{linear-DkQS0EVl.js → linear-DR3e8pJs.js} +1 -1
- package/web/dist/assets/{liquid-JdcJe3Mn.js → liquid-DdVm64RF.js} +1 -1
- package/web/dist/assets/{lspLanguageFeatures-BDC0ynk1.js → lspLanguageFeatures-BptCEdzQ.js} +1 -1
- package/web/dist/assets/{mdx-C0s6E9Ya.js → mdx-Crb1xK3v.js} +1 -1
- package/web/dist/assets/{mermaid.core-DQSlETG7.js → mermaid.core-qey-rTTh.js} +2 -2
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-oNTOwQOU.js → mindmap-definition-LN4V7U3C-p2NXDklK.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-8BmSEVOy.js → pegDiagram-2B236MQR-CysYM1sW.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-DRIltoVc.js → pieDiagram-ENE6RG2P-9eq9UV8x.js} +1 -1
- package/web/dist/assets/{python-DQKjtSgN.js → python-BIBHzYUy.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-BJfMAp1Q.js → quadrantDiagram-ABIIQ3AL-BG5a6aH2.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-Dj9-wyZY.js → railroadDiagram-RFXS5EU6-CUTkhltO.js} +1 -1
- package/web/dist/assets/{razor-CL-fmDzS.js → razor-qx4-Kybw.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-fPYOczdV.js → requirementDiagram-TGXJPOKE-CmcUF5bV.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-DyjpctG7.js → sankeyDiagram-HTMAVEWB-CATht_iL.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-RaZs5E3b.js → sequenceDiagram-DBY2YBRQ-WPreubhe.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-BfOA5cbO.js → sizeCapture-X5ZJPWSS-DNsVqke5.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-CdxgHSfH.js → stateDiagram-2N3HPSRC-CFJi3Iaj.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-WRZIxCxw.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-B19jLFc4.js → swimlanes-5IMT3BWC-CVDKdvCT.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-BJ2KVs2S.js +1 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-CYSSTJjP.js → timeline-definition-FHXFAJF6-BwM8AQ3r.js} +1 -1
- package/web/dist/assets/{tsMode-I7W52vRp.js → tsMode-CnKXsDIA.js} +1 -1
- package/web/dist/assets/{typescript-BkUlxSfm.js → typescript-D4hIt06c.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-CJ5m4qeA.js → vennDiagram-L72KCM5P-BOHDZBL9.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-CpaSYOZD.js → wardleyDiagram-EHGQE667-v06MUzIv.js} +1 -1
- package/web/dist/assets/{xml-B6uP1aJC.js → xml-Ci6lnduZ.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-EqZ9r0f-.js → xychartDiagram-FW5EYKEG-CTur2M7J.js} +1 -1
- package/web/dist/assets/{yaml-BzfObSCH.js → yaml-DkojWTj3.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/landing/landing.css +1161 -10
- package/web/dist/landing/landing.js +168 -0
- package/web/dist/landing.html +90 -62
- package/web/dist/landing.zh.html +90 -62
- package/web/dist/assets/channel-D0HU8H5o.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-DQaRrb-b.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-DQaRrb-b.js +0 -1
- package/web/dist/assets/index-D5K63qug.css +0 -32
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-vTVKrqt9.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-CbIyNKp1.js +0 -1
|
@@ -5,6 +5,21 @@ const installCommand = document.body.dataset.installCommand;
|
|
|
5
5
|
|
|
6
6
|
root.classList.add('motion-ready');
|
|
7
7
|
|
|
8
|
+
let arcadePointerStart;
|
|
9
|
+
|
|
10
|
+
document.addEventListener('pointerdown', (event) => {
|
|
11
|
+
if (event.button !== 0) return;
|
|
12
|
+
arcadePointerStart = { x: event.clientX, y: event.clientY };
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
document.addEventListener('click', (event) => {
|
|
16
|
+
if (event.button !== 0 || !arcadePointerStart) return;
|
|
17
|
+
const distance = Math.hypot(event.clientX - arcadePointerStart.x, event.clientY - arcadePointerStart.y);
|
|
18
|
+
arcadePointerStart = undefined;
|
|
19
|
+
if (event.target.closest('.session-sidebar') || distance > 6 || window.getSelection()?.toString()) return;
|
|
20
|
+
root.classList.toggle('arcade-theme');
|
|
21
|
+
});
|
|
22
|
+
|
|
8
23
|
function fallbackCopy(text) {
|
|
9
24
|
const textarea = document.createElement('textarea');
|
|
10
25
|
textarea.value = text;
|
|
@@ -45,6 +60,159 @@ document.querySelectorAll('[data-copy-install]').forEach((button) => {
|
|
|
45
60
|
});
|
|
46
61
|
});
|
|
47
62
|
|
|
63
|
+
const demoCopy = {
|
|
64
|
+
en: {
|
|
65
|
+
pi: {
|
|
66
|
+
title: 'Add keyboard navigation', meta: 'Q:\\src\\frontend · Pi', agent: 'Pi', icon: 'agent-pi.svg',
|
|
67
|
+
user: 'Add keyboard navigation to the session list and command palette.',
|
|
68
|
+
response: 'Done. Arrow keys move through results, Enter opens the selection, and Escape returns focus to the editor.',
|
|
69
|
+
tool: 'edit', detail: 'Updated SessionList.vue', placeholder: 'Ask Pi to refine keyboard behavior...',
|
|
70
|
+
controls: [['attach', 'Attach file'], ['terminal', 'Open terminal'], ['model', 'Gemini 2.5 Pro']],
|
|
71
|
+
extra: { type: 'diff', file: 'SessionList.vue', removed: '@click="openSession(item)"', added: '@keydown.enter="openSession(item)"' }
|
|
72
|
+
},
|
|
73
|
+
copilot: {
|
|
74
|
+
title: 'Prevent duplicate payments', meta: 'Q:\\src\\frontend · GitHub Copilot', agent: 'GitHub Copilot', icon: 'agent-copilot.svg',
|
|
75
|
+
user: 'The Pay button can fire twice on a slow connection. Fix it and add a test.',
|
|
76
|
+
response: 'Fixed. The action now locks while pending, and the request carries an idempotency key for safe retries.',
|
|
77
|
+
tool: 'run_tests', detail: 'checkout-retry.test.ts · 6 passed', placeholder: 'Ask Copilot about the fix...',
|
|
78
|
+
controls: [['context', 'Workspace'], ['mention', 'Add context'], ['model', 'GPT-4.1']]
|
|
79
|
+
},
|
|
80
|
+
claude: {
|
|
81
|
+
title: 'Design zero-downtime migration', meta: 'D:\\work\\api · Claude Code', agent: 'Claude Code', icon: 'agent-claude.svg',
|
|
82
|
+
user: 'Plan a safe migration of 40 million events to the new schema.',
|
|
83
|
+
response: 'I drafted a three-phase rollout: dual-write, backfill with checkpoints, then verified cutover with an instant rollback path.',
|
|
84
|
+
tool: 'write_file', detail: 'Created docs/event-migration.md', placeholder: 'Ask Claude to refine the plan...',
|
|
85
|
+
controls: [['plan', 'Plan mode'], ['thinking', 'Extended thinking'], ['model', 'Sonnet 4']],
|
|
86
|
+
extra: { type: 'question', label: 'Ask user question', question: 'Can we dual-write to both schemas for 48 hours?', choices: ['Yes, dual-write', 'No, use shadow reads'] }
|
|
87
|
+
},
|
|
88
|
+
codex: {
|
|
89
|
+
title: 'Speed up the CI pipeline', meta: 'D:\\work\\api · OpenAI Codex', agent: 'OpenAI Codex', icon: 'agent-codex.svg',
|
|
90
|
+
user: 'Our pull-request pipeline takes 14 minutes. Make it meaningfully faster.',
|
|
91
|
+
response: 'I split independent jobs, cached unchanged packages, and removed duplicate setup. The same checks now finish in 6 minutes.',
|
|
92
|
+
tool: 'terminal', detail: 'CI benchmark · 14m 08s → 6m 12s', placeholder: 'Ask Codex to optimize another job...',
|
|
93
|
+
controls: [['terminal', 'Open terminal'], ['image', 'Attach screenshot'], ['model', 'o3']],
|
|
94
|
+
terminal: true
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
zh: {
|
|
98
|
+
pi: {
|
|
99
|
+
title: '加入键盘导航', meta: 'Q:\\src\\frontend · Pi', agent: 'Pi', icon: 'agent-pi.svg',
|
|
100
|
+
user: '为会话列表和命令面板加入完整的键盘导航。',
|
|
101
|
+
response: '完成。方向键可以移动选项,Enter 打开会话,Escape 会将焦点返回编辑器。',
|
|
102
|
+
tool: 'edit', detail: '已更新 SessionList.vue', placeholder: '让 Pi 继续完善键盘操作...',
|
|
103
|
+
controls: [['attach', '添加附件'], ['terminal', '打开终端'], ['model', 'Gemini 2.5 Pro']],
|
|
104
|
+
extra: { type: 'diff', file: 'SessionList.vue', removed: '@click="openSession(item)"', added: '@keydown.enter="openSession(item)"' }
|
|
105
|
+
},
|
|
106
|
+
copilot: {
|
|
107
|
+
title: '修复付款重复提交', meta: 'Q:\\src\\frontend · GitHub Copilot', agent: 'GitHub Copilot', icon: 'agent-copilot.svg',
|
|
108
|
+
user: '网络较慢时付款按钮可能提交两次,请修复并补充测试。',
|
|
109
|
+
response: '已修复。请求期间按钮会锁定,同时加入幂等 Key,重试也不会重复提交。',
|
|
110
|
+
tool: 'run_tests', detail: 'checkout-retry.test.ts · 6 个测试通过', placeholder: '继续询问 Copilot...',
|
|
111
|
+
controls: [['context', '工作区'], ['mention', '添加上下文'], ['model', 'GPT-4.1']]
|
|
112
|
+
},
|
|
113
|
+
claude: {
|
|
114
|
+
title: '设计零停机迁移方案', meta: 'D:\\work\\api · Claude Code', agent: 'Claude Code', icon: 'agent-claude.svg',
|
|
115
|
+
user: '为 4000 万条事件数据设计一套安全的新 Schema 迁移方案。',
|
|
116
|
+
response: '我设计了三阶段方案:双写、带检查点的回填,以及可立即回滚的验证切换。',
|
|
117
|
+
tool: 'write_file', detail: '已创建 docs/event-migration.md', placeholder: '让 Claude 继续完善方案...',
|
|
118
|
+
controls: [['plan', '计划模式'], ['thinking', '深度思考'], ['model', 'Sonnet 4']],
|
|
119
|
+
extra: { type: 'question', label: '询问用户', question: '新旧 Schema 可以同时双写 48 小时吗?', choices: ['可以,使用双写', '不行,改用影子读取'] }
|
|
120
|
+
},
|
|
121
|
+
codex: {
|
|
122
|
+
title: '优化 CI 流水线', meta: 'D:\\work\\api · OpenAI Codex', agent: 'OpenAI Codex', icon: 'agent-codex.svg',
|
|
123
|
+
user: 'Pull Request 流水线需要 14 分钟,请明显缩短它。',
|
|
124
|
+
response: '我并行了独立任务、缓存未改动的 Package,并移除重复设置;相同检查现在 6 分钟完成。',
|
|
125
|
+
tool: 'terminal', detail: 'CI Benchmark · 14m 08s → 6m 12s', placeholder: '让 Codex 继续优化...',
|
|
126
|
+
controls: [['terminal', '打开终端'], ['image', '添加截图'], ['model', 'o3']],
|
|
127
|
+
terminal: true
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const controlIcons = {
|
|
133
|
+
attach: '<path d="M7.5 6.5l3.8-3.8a2.1 2.1 0 013 3L8.8 11.2a3.5 3.5 0 01-5-5l5.1-5.1"/>',
|
|
134
|
+
terminal: '<path d="M2.5 4l3 3-3 3M7 10h5"/>',
|
|
135
|
+
model: '<path d="M8 1.8l1.1 3.1L12.2 6 9.1 7.1 8 10.2 6.9 7.1 3.8 6l3.1-1.1L8 1.8z"/>',
|
|
136
|
+
context: '<rect x="2" y="2" width="12" height="12" rx="2"/><path d="M5 5h6M5 8h6M5 11h4"/>',
|
|
137
|
+
mention: '<circle cx="8" cy="8" r="5.5"/><path d="M10.5 10.5V6.3a2.5 2.5 0 10.2 3.3"/>',
|
|
138
|
+
plan: '<path d="M3 3h10v10H3zM5.5 6h5M5.5 8.5h5M5.5 11h3"/>',
|
|
139
|
+
thinking: '<path d="M5 12.5h6M6 10.5h4M4.5 7a3.5 3.5 0 117 0c0 1.5-1 2.1-1.5 3h-4c-.5-.9-1.5-1.5-1.5-3z"/>',
|
|
140
|
+
image: '<rect x="2" y="3" width="12" height="10" rx="2"/><circle cx="5.5" cy="6.5" r="1"/><path d="M3.5 11l3-3 2.2 2 1.5-1.5 2.3 2.5"/>'
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
function renderDemoControls(controls) {
|
|
144
|
+
return controls.map(([type, label]) => {
|
|
145
|
+
const iconOnly = type === 'attach' || type === 'terminal' || type === 'image';
|
|
146
|
+
return `<button class="input-control control-${type} ${iconOnly ? 'icon-only' : ''} ${type === 'model' ? 'model-control' : ''}" type="button" aria-label="${label}" title="${label}"><svg viewBox="0 0 16 16" aria-hidden="true">${controlIcons[type]}</svg>${iconOnly ? '' : `<span>${label}</span>`}</button>`;
|
|
147
|
+
}).join('');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function renderDemoExtra(extra) {
|
|
151
|
+
if (!extra) return '';
|
|
152
|
+
if (extra.type === 'diff') {
|
|
153
|
+
return `<div class="diff-card"><div class="diff-head"><strong>Edit</strong><span>${extra.file}</span></div><code><span class="diff-remove">− ${extra.removed}</span><span class="diff-add">+ ${extra.added}</span></code></div>`;
|
|
154
|
+
}
|
|
155
|
+
return `<div class="question-card"><div class="question-label"><span>?</span><strong>${extra.label}</strong></div><p>${extra.question}</p><div class="question-choices">${extra.choices.map((choice) => `<span>${choice}</span>`).join('')}</div></div>`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const demoChat = document.querySelector('[data-demo-chat]');
|
|
159
|
+
const demoLocale = document.documentElement.lang.startsWith('zh') ? 'zh' : 'en';
|
|
160
|
+
|
|
161
|
+
function selectDemoSession(sessionId) {
|
|
162
|
+
const session = demoCopy[demoLocale][sessionId];
|
|
163
|
+
if (!session || !demoChat) return;
|
|
164
|
+
|
|
165
|
+
document.querySelectorAll('.session-sidebar [data-demo-session]').forEach((button) => {
|
|
166
|
+
const active = button.dataset.demoSession === sessionId;
|
|
167
|
+
button.classList.toggle('active', active);
|
|
168
|
+
button.setAttribute('aria-pressed', String(active));
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
demoChat.querySelector('[data-demo-title]').textContent = session.title;
|
|
172
|
+
demoChat.querySelector('[data-demo-meta]').textContent = session.meta;
|
|
173
|
+
demoChat.querySelector('[data-demo-user]').textContent = session.user;
|
|
174
|
+
demoChat.querySelector('[data-demo-agent]').textContent = session.agent;
|
|
175
|
+
demoChat.querySelector('[data-demo-icon]').src = `landing/icons/${session.icon}`;
|
|
176
|
+
demoChat.querySelector('[data-demo-response]').textContent = session.response;
|
|
177
|
+
demoChat.querySelector('[data-demo-tool]').textContent = session.tool;
|
|
178
|
+
demoChat.querySelector('[data-demo-tool-detail]').textContent = session.detail;
|
|
179
|
+
demoChat.querySelector('[data-demo-placeholder]').textContent = session.placeholder;
|
|
180
|
+
demoChat.querySelector('[data-demo-controls]').innerHTML = renderDemoControls(session.controls);
|
|
181
|
+
demoChat.querySelector('[data-demo-extra]').innerHTML = renderDemoExtra(session.extra);
|
|
182
|
+
demoChat.querySelector('[data-demo-terminal]').hidden = !session.terminal;
|
|
183
|
+
demoChat.classList.toggle('terminal-open', Boolean(session.terminal));
|
|
184
|
+
|
|
185
|
+
demoChat.classList.remove('session-changed');
|
|
186
|
+
requestAnimationFrame(() => demoChat.classList.add('session-changed'));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const demoSessionIds = ['pi', 'copilot', 'claude', 'codex'];
|
|
190
|
+
let activeDemoIndex = 0;
|
|
191
|
+
let demoRotationTimer;
|
|
192
|
+
let demoRotationCancelled = false;
|
|
193
|
+
|
|
194
|
+
function startDemoRotation() {
|
|
195
|
+
window.clearInterval(demoRotationTimer);
|
|
196
|
+
if (document.hidden || demoRotationCancelled) return;
|
|
197
|
+
demoRotationTimer = window.setInterval(() => {
|
|
198
|
+
activeDemoIndex = (activeDemoIndex + 1) % demoSessionIds.length;
|
|
199
|
+
selectDemoSession(demoSessionIds[activeDemoIndex]);
|
|
200
|
+
}, 1500);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
document.querySelectorAll('.session-sidebar [data-demo-session]').forEach((button) => {
|
|
204
|
+
button.addEventListener('click', () => {
|
|
205
|
+
demoRotationCancelled = true;
|
|
206
|
+
window.clearInterval(demoRotationTimer);
|
|
207
|
+
activeDemoIndex = demoSessionIds.indexOf(button.dataset.demoSession);
|
|
208
|
+
selectDemoSession(button.dataset.demoSession);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
document.addEventListener('visibilitychange', startDemoRotation);
|
|
213
|
+
selectDemoSession(demoSessionIds[activeDemoIndex]);
|
|
214
|
+
startDemoRotation();
|
|
215
|
+
|
|
48
216
|
const updateHeader = () => {
|
|
49
217
|
header?.classList.toggle('is-scrolled', window.scrollY > 12);
|
|
50
218
|
};
|
package/web/dist/landing.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>msclaude — Remote Control for Local Coding Agents</title>
|
|
7
|
-
<meta name="description" content="
|
|
7
|
+
<meta name="description" content="Use Pi, GitHub Copilot, Claude Code, and OpenAI Codex across local projects from one browser workspace—with files, Git, an interactive terminal, port proxy, and end-to-end encryption.">
|
|
8
8
|
<meta name="robots" content="index, follow, max-image-preview:large">
|
|
9
9
|
<meta name="application-name" content="msclaude">
|
|
10
10
|
<meta name="theme-color" content="#f2efe8">
|
|
@@ -17,29 +17,29 @@
|
|
|
17
17
|
<meta property="og:locale" content="en_US">
|
|
18
18
|
<meta property="og:locale:alternate" content="zh_CN">
|
|
19
19
|
<meta property="og:title" content="msclaude — Remote Control for Local Coding Agents">
|
|
20
|
-
<meta property="og:description" content="
|
|
20
|
+
<meta property="og:description" content="Manage local coding agents, repositories, files, Git, terminal, and running web apps from one end-to-end encrypted browser workspace.">
|
|
21
21
|
<meta property="og:url" content="https://msclaude.ai/">
|
|
22
22
|
<meta property="og:image" content="https://msclaude.ai/iPad.png">
|
|
23
23
|
<meta property="og:image:alt" content="msclaude browser workspace showing parallel coding agent sessions">
|
|
24
24
|
<meta name="twitter:card" content="summary_large_image">
|
|
25
25
|
<meta name="twitter:title" content="msclaude — Remote Control for Local Coding Agents">
|
|
26
|
-
<meta name="twitter:description" content="
|
|
26
|
+
<meta name="twitter:description" content="Use Pi, Copilot, Claude Code, and Codex with your local files, Git, terminal, and running apps from any browser.">
|
|
27
27
|
<meta name="twitter:image" content="https://msclaude.ai/iPad.png">
|
|
28
28
|
<meta name="twitter:image:alt" content="msclaude browser workspace showing parallel coding agent sessions">
|
|
29
|
-
<link rel="icon" type="image/svg+xml" href="
|
|
30
|
-
<link rel="icon" type="image/png" sizes="32x32" href="
|
|
31
|
-
<link rel="apple-touch-icon" sizes="180x180" href="
|
|
32
|
-
<link rel="manifest" href="
|
|
33
|
-
<link rel="preload" href="
|
|
34
|
-
<link rel="stylesheet" href="
|
|
35
|
-
<script src="
|
|
29
|
+
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
|
30
|
+
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
|
|
31
|
+
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
|
|
32
|
+
<link rel="manifest" href="site.webmanifest">
|
|
33
|
+
<link rel="preload" href="vendor/SpaceGrotesk-latin.woff2" as="font" type="font/woff2" crossorigin>
|
|
34
|
+
<link rel="stylesheet" href="landing/landing.css?v=20260808-arcade-click-1">
|
|
35
|
+
<script src="landing/landing.js?v=20260808-copy-1" defer></script>
|
|
36
36
|
<script type="application/ld+json">
|
|
37
37
|
{
|
|
38
38
|
"@context": "https://schema.org",
|
|
39
39
|
"@type": "SoftwareApplication",
|
|
40
40
|
"name": "msclaude",
|
|
41
41
|
"url": "https://msclaude.ai/",
|
|
42
|
-
"description": "A browser workspace for
|
|
42
|
+
"description": "A local-first browser workspace for using multiple coding agents, repositories, and developer tools on your development machine.",
|
|
43
43
|
"applicationCategory": "DeveloperApplication",
|
|
44
44
|
"operatingSystem": "Windows, macOS, Linux",
|
|
45
45
|
"isAccessibleForFree": true,
|
|
@@ -49,7 +49,11 @@
|
|
|
49
49
|
"Parallel coding agent sessions",
|
|
50
50
|
"Multiple working directories",
|
|
51
51
|
"Pi, GitHub Copilot, Claude Code, and OpenAI Codex support",
|
|
52
|
-
"
|
|
52
|
+
"File browsing, editing, upload, and download",
|
|
53
|
+
"Git status, diffs, branches, and history",
|
|
54
|
+
"Full interactive local terminal",
|
|
55
|
+
"Remote access to local web apps through Port Proxy",
|
|
56
|
+
"Agent-specific model, thinking, mode, and attachment controls",
|
|
53
57
|
"End-to-end encrypted messages",
|
|
54
58
|
"Self-hosted relay server"
|
|
55
59
|
],
|
|
@@ -75,7 +79,7 @@
|
|
|
75
79
|
<header class="site-header">
|
|
76
80
|
<nav class="nav-shell" aria-label="Primary navigation">
|
|
77
81
|
<a class="brand" href="/" aria-label="msclaude home">
|
|
78
|
-
<img class="brand-mark" src="
|
|
82
|
+
<img class="brand-mark" src="landing/icons/msclaude-animated.svg" alt="">
|
|
79
83
|
<span>msclaude</span>
|
|
80
84
|
</a>
|
|
81
85
|
<div class="nav-actions">
|
|
@@ -93,10 +97,10 @@
|
|
|
93
97
|
<p class="hero-lead">msclaude connects your browser to coding agents running locally. Continue development work remotely while your code, tools, and execution environment remain on your machine.</p>
|
|
94
98
|
|
|
95
99
|
<div class="agent-list" aria-label="Supported coding agents">
|
|
96
|
-
<span><i class="provider-icon"><img src="
|
|
97
|
-
<span><i class="provider-icon"><img src="
|
|
98
|
-
<span><i class="provider-icon"><img src="
|
|
99
|
-
<span><i class="provider-icon"><img src="
|
|
100
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-pi.svg" alt=""></i> Pi</span>
|
|
101
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-copilot.svg" alt=""></i> GitHub Copilot</span>
|
|
102
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-claude.svg" alt=""></i> Claude Code</span>
|
|
103
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-codex.svg" alt=""></i> OpenAI Codex</span>
|
|
100
104
|
</div>
|
|
101
105
|
|
|
102
106
|
<div class="hero-actions">
|
|
@@ -112,40 +116,62 @@
|
|
|
112
116
|
<div class="product-window" aria-label="Illustration of parallel coding agent sessions">
|
|
113
117
|
<div class="window-bar">
|
|
114
118
|
<span class="window-dots" aria-hidden="true"><i></i><i></i><i></i></span>
|
|
115
|
-
<span>msclaude ·
|
|
116
|
-
<span class="encrypted-label"
|
|
119
|
+
<span>msclaude · 8 sessions</span>
|
|
120
|
+
<span class="encrypted-label"><i aria-hidden="true"></i>E2E encrypted</span>
|
|
117
121
|
</div>
|
|
118
122
|
<div class="provider-switcher" aria-label="Four supported agents">
|
|
119
|
-
<span class="provider-switcher-label">
|
|
120
|
-
<span class="active"><i class="provider-icon"><img src="
|
|
121
|
-
<span><i class="provider-icon"><img src="
|
|
122
|
-
<span><i class="provider-icon"><img src="
|
|
123
|
-
<span><i class="provider-icon"><img src="
|
|
123
|
+
<span class="provider-switcher-label">Sessions by agent</span>
|
|
124
|
+
<span class="active"><i class="provider-icon"><img src="landing/icons/agent-pi.svg" alt=""></i>Pi <b>2</b></span>
|
|
125
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-copilot.svg" alt=""></i>Copilot <b>1</b></span>
|
|
126
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-claude.svg" alt=""></i>Claude Code <b>3</b></span>
|
|
127
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-codex.svg" alt=""></i>Codex <b>2</b></span>
|
|
124
128
|
</div>
|
|
125
129
|
<div class="workspace-ui">
|
|
126
130
|
<aside class="session-sidebar">
|
|
127
131
|
<div class="sidebar-title"><strong>Sessions</strong><span>+</span></div>
|
|
128
132
|
<div class="directory-label">Q:\src\frontend</div>
|
|
129
|
-
<
|
|
130
|
-
<
|
|
133
|
+
<button class="session-row active" type="button" data-demo-session="pi"><i class="provider-icon"><img src="landing/icons/agent-pi.svg" alt=""></i><span><strong>Add keyboard navigation</strong><small>Pi · working</small></span><b></b></button>
|
|
134
|
+
<button class="session-row" type="button" data-demo-session="copilot"><i class="provider-icon"><img src="landing/icons/agent-copilot.svg" alt=""></i><span><strong>Prevent duplicate payments</strong><small>Copilot · done</small></span></button>
|
|
131
135
|
<div class="directory-label">D:\work\api</div>
|
|
132
|
-
<
|
|
133
|
-
<
|
|
136
|
+
<button class="session-row" type="button" data-demo-session="claude"><i class="provider-icon"><img src="landing/icons/agent-claude.svg" alt=""></i><span><strong>Design zero-downtime migration</strong><small>Claude Code · ready</small></span></button>
|
|
137
|
+
<button class="session-row" type="button" data-demo-session="codex"><i class="provider-icon"><img src="landing/icons/agent-codex.svg" alt=""></i><span><strong>Speed up the CI pipeline</strong><small>Codex · done</small></span></button>
|
|
134
138
|
</aside>
|
|
135
|
-
<div class="chat-ui">
|
|
139
|
+
<div class="chat-ui" data-demo-chat>
|
|
136
140
|
<div class="chat-head">
|
|
137
|
-
<div><strong>
|
|
141
|
+
<div><strong data-demo-title>Add keyboard navigation</strong><small data-demo-meta>Q:\src\frontend · Pi</small></div>
|
|
138
142
|
<div class="chat-actions"><span>Files</span><span>Git</span><span>Terminal</span></div>
|
|
139
143
|
</div>
|
|
140
|
-
<div class="chat-body">
|
|
141
|
-
<div class="message user-message">
|
|
144
|
+
<div class="chat-body" aria-live="polite">
|
|
145
|
+
<div class="message user-message" data-demo-user>Add keyboard navigation to the session list and command palette.</div>
|
|
142
146
|
<div class="message agent-message">
|
|
143
|
-
<span class="message-author"><i class="provider-icon"><img src="
|
|
144
|
-
<p>
|
|
145
|
-
<div class="tool-call"><span>✓</span><div><strong>
|
|
147
|
+
<span class="message-author"><i class="provider-icon"><img data-demo-icon src="landing/icons/agent-pi.svg" alt=""></i><span data-demo-agent>Pi</span></span>
|
|
148
|
+
<p data-demo-response>Done. Arrow keys move through results, Enter opens the selection, and Escape returns focus to the editor.</p>
|
|
149
|
+
<div class="tool-call"><span>✓</span><div><strong data-demo-tool>edit</strong><small data-demo-tool-detail>Updated SessionList.vue</small></div></div>
|
|
150
|
+
<div class="demo-extra" data-demo-extra>
|
|
151
|
+
<div class="diff-card">
|
|
152
|
+
<div class="diff-head"><strong>Edit</strong><span>SessionList.vue</span></div>
|
|
153
|
+
<code><span class="diff-remove">− @click="openSession(item)"</span><span class="diff-add">+ @keydown.enter="openSession(item)"</span></code>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="chat-input">
|
|
159
|
+
<div class="input-line">
|
|
160
|
+
<span class="input-placeholder" data-demo-placeholder>Ask Pi to refine keyboard behavior...</span>
|
|
161
|
+
<button class="send-button" type="button" aria-label="Send message">↑</button>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="input-toolbar" data-demo-controls></div>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="remote-terminal" data-demo-terminal hidden>
|
|
166
|
+
<div class="terminal-head">
|
|
167
|
+
<span><i></i><i></i><i></i></span>
|
|
168
|
+
<strong>Remote terminal</strong>
|
|
169
|
+
<small>connected</small>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="terminal-body" aria-label="Simulated remote terminal output">
|
|
172
|
+
<code><span class="terminal-command"><b>$</b> ls</span><span class="terminal-output">README.md package.json src/ test/ vite.config.ts</span><span class="terminal-command"><b>$</b> <i class="terminal-cursor"></i></span></code>
|
|
146
173
|
</div>
|
|
147
174
|
</div>
|
|
148
|
-
<div class="chat-input"><span>Ask Pi to continue...</span><button aria-label="Send message">↑</button></div>
|
|
149
175
|
</div>
|
|
150
176
|
</div>
|
|
151
177
|
</div>
|
|
@@ -155,8 +181,8 @@
|
|
|
155
181
|
<div class="section-intro">
|
|
156
182
|
<p class="section-label">Workspace</p>
|
|
157
183
|
<div>
|
|
158
|
-
<h2 id="capabilities-title">
|
|
159
|
-
<p>
|
|
184
|
+
<h2 id="capabilities-title">Every agent, repository, and tool in one workspace.</h2>
|
|
185
|
+
<p>Move between active sessions, working directories, and local developer tools without switching terminals, remote desktops, or browser tabs.</p>
|
|
160
186
|
</div>
|
|
161
187
|
</div>
|
|
162
188
|
|
|
@@ -168,62 +194,64 @@
|
|
|
168
194
|
<p>Run several agent sessions, organize them by working directory, and search previous conversations.</p>
|
|
169
195
|
</div>
|
|
170
196
|
<div class="session-stack" aria-hidden="true">
|
|
171
|
-
<span><i class="provider-icon"><img src="
|
|
172
|
-
<span><i class="provider-icon"><img src="
|
|
173
|
-
<span><i class="provider-icon"><img src="
|
|
197
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-pi.svg" alt=""></i><b>Pi</b><small>Q:\src\frontend</small><em>Working</em></span>
|
|
198
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-claude.svg" alt=""></i><b>Claude Code</b><small>D:\work\api</small><em>Working</em></span>
|
|
199
|
+
<span><i class="provider-icon"><img src="landing/icons/agent-codex.svg" alt=""></i><b>Codex</b><small>C:\repo\mobile</small><em>Done</em></span>
|
|
174
200
|
</div>
|
|
175
201
|
</article>
|
|
176
202
|
|
|
177
203
|
<article class="capability-card tools-card" id="tools">
|
|
178
204
|
<div class="card-icon">>_</div>
|
|
179
|
-
<h3>
|
|
180
|
-
<p>
|
|
205
|
+
<h3>Your local workspace, in the browser</h3>
|
|
206
|
+
<p>Inspect and change the same files, repository, terminal, and running applications your agent uses—without moving your development environment to the cloud.</p>
|
|
181
207
|
<ul class="tool-list">
|
|
182
|
-
<li>Files <small>Browse,
|
|
183
|
-
<li>Git <small>Status
|
|
184
|
-
<li>Terminal <small>
|
|
185
|
-
<li>Port Proxy <small>Open local
|
|
208
|
+
<li>Files <small>Browse, edit, upload, download</small></li>
|
|
209
|
+
<li>Git <small>Status, diffs, branches, history</small></li>
|
|
210
|
+
<li>Terminal <small>Full interactive local PTY</small></li>
|
|
211
|
+
<li>Port Proxy <small>Open local web apps remotely</small></li>
|
|
186
212
|
</ul>
|
|
187
213
|
</article>
|
|
188
214
|
|
|
189
215
|
<article class="capability-card steps-card">
|
|
190
|
-
<p class="section-label">
|
|
216
|
+
<p class="section-label">Agent controls</p>
|
|
217
|
+
<h3>Native controls for every agent</h3>
|
|
218
|
+
<p>Composer controls adapt to the selected backend—no command-line flags to remember.</p>
|
|
191
219
|
<ol>
|
|
192
|
-
<li><span
|
|
193
|
-
<li><span
|
|
194
|
-
<li><span
|
|
220
|
+
<li><span>+</span><div><strong>Attachments</strong><small>Add files and images.</small></div></li>
|
|
221
|
+
<li><span>◇</span><div><strong>Models & thinking</strong><small>Switch models and reasoning levels.</small></div></li>
|
|
222
|
+
<li><span>›</span><div><strong>Modes & permissions</strong><small>Use Plan and agent-specific options.</small></div></li>
|
|
195
223
|
</ol>
|
|
196
224
|
</article>
|
|
197
225
|
</div>
|
|
198
226
|
</section>
|
|
199
227
|
|
|
200
|
-
<section class="trust-section" aria-label="
|
|
228
|
+
<section class="trust-section" aria-label="Local-first security model">
|
|
201
229
|
<article class="trust-card" id="security">
|
|
202
230
|
<div>
|
|
203
|
-
<p class="section-label">
|
|
204
|
-
<h2>
|
|
205
|
-
<p>
|
|
231
|
+
<p class="section-label">01 · Work stays local</p>
|
|
232
|
+
<h2>Your machine remains the workspace.</h2>
|
|
233
|
+
<p>Agents, source code, credentials, tools, and command execution stay on your development machine—not in a new cloud environment.</p>
|
|
206
234
|
</div>
|
|
207
235
|
</article>
|
|
208
236
|
<article class="trust-card">
|
|
209
237
|
<div>
|
|
210
|
-
<p class="section-label">
|
|
211
|
-
<h2>
|
|
212
|
-
<p>
|
|
238
|
+
<p class="section-label">02 · The connection is private</p>
|
|
239
|
+
<h2>The relay only moves encrypted bytes.</h2>
|
|
240
|
+
<p>Prompts, responses, tool output, and file contents are end-to-end encrypted between your browser and local agent.</p>
|
|
213
241
|
</div>
|
|
214
242
|
</article>
|
|
215
243
|
<article class="trust-card" id="self-hosting">
|
|
216
244
|
<div>
|
|
217
|
-
<p class="section-label">
|
|
218
|
-
<h2>
|
|
219
|
-
<p>
|
|
245
|
+
<p class="section-label">03 · Deployment is yours</p>
|
|
246
|
+
<h2>Use our relay—or run your own.</h2>
|
|
247
|
+
<p>Start with the hosted relay, then self-host the lightweight server on your own infrastructure without changing the browser experience.</p>
|
|
220
248
|
</div>
|
|
221
249
|
</article>
|
|
222
250
|
</section>
|
|
223
251
|
</main>
|
|
224
252
|
|
|
225
253
|
<footer class="site-footer">
|
|
226
|
-
<a class="brand footer-brand" href="/"><img class="brand-mark" src="
|
|
254
|
+
<a class="brand footer-brand" href="/"><img class="brand-mark" src="landing/icons/msclaude-animated.svg" alt=""><span>msclaude</span></a>
|
|
227
255
|
<p>Remote access for coding agents running on your development machine.</p>
|
|
228
256
|
<div><a href="https://github.com/kailunshi_microsoft/AgenticWorker" target="_blank" rel="noopener">GitHub</a><a href="/zh" lang="zh-CN" hreflang="zh-CN">中文</a></div>
|
|
229
257
|
</footer>
|