@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.
Files changed (86) hide show
  1. package/package.json +1 -1
  2. package/web/dist/assets/{abnfDiagram-VRR7QNED-D1hyJ-hn.js → abnfDiagram-VRR7QNED-D3cc6ixD.js} +1 -1
  3. package/web/dist/assets/{arc-BuJJgjYt.js → arc-C-BlGAqM.js} +1 -1
  4. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-A9THC2Cc.js → architectureDiagram-ZJ3FMSHR-DFN1M5P0.js} +1 -1
  5. package/web/dist/assets/{blockDiagram-677ZJIJ3-De9_CtWv.js → blockDiagram-677ZJIJ3-CDGMAaEw.js} +1 -1
  6. package/web/dist/assets/{c4Diagram-LMCZKHZV-DeZVA52a.js → c4Diagram-LMCZKHZV-DtOVXwWZ.js} +1 -1
  7. package/web/dist/assets/channel-CuV7Fkfy.js +1 -0
  8. package/web/dist/assets/{chunk-2Q5K7J3B-DlDecKcs.js → chunk-2Q5K7J3B-DsKmVVjx.js} +1 -1
  9. package/web/dist/assets/{chunk-32BRIVSS-BhpTBz4U.js → chunk-32BRIVSS-DVylOf0u.js} +1 -1
  10. package/web/dist/assets/{chunk-5VM5RSS4-DE8R6mLs.js → chunk-5VM5RSS4-ZFKorQZc.js} +1 -1
  11. package/web/dist/assets/{chunk-EX3LRPZG-t_9lUdF-.js → chunk-EX3LRPZG-i5xQFv1I.js} +1 -1
  12. package/web/dist/assets/{chunk-JWPE2WC7-D8olqveE.js → chunk-JWPE2WC7-zvEi3Xdy.js} +1 -1
  13. package/web/dist/assets/{chunk-MOJQB5TN-qQmIJLhN.js → chunk-MOJQB5TN-BVW_jPqa.js} +1 -1
  14. package/web/dist/assets/{chunk-RYQCIY6F-o8VHYTB2.js → chunk-RYQCIY6F-BoZGJACR.js} +1 -1
  15. package/web/dist/assets/{chunk-V7JOEXUC-DGpoi6XB.js → chunk-V7JOEXUC-Qa299BUI.js} +1 -1
  16. package/web/dist/assets/{chunk-VR4S4FIN-BjtiAe03.js → chunk-VR4S4FIN-BIDjyO2q.js} +1 -1
  17. package/web/dist/assets/{chunk-XXDRQBXY-Bf9B2FsN.js → chunk-XXDRQBXY-B9Inv9MZ.js} +1 -1
  18. package/web/dist/assets/classDiagram-OUVF2IWQ-CHm9qeAX.js +1 -0
  19. package/web/dist/assets/classDiagram-v2-EOCWNBFH-CHm9qeAX.js +1 -0
  20. package/web/dist/assets/{cose-bilkent-JH36ORCC-CUu8D0Zk.js → cose-bilkent-JH36ORCC-DULZYWPx.js} +1 -1
  21. package/web/dist/assets/{cssMode-BBGTtP8x.js → cssMode-CLeQotjJ.js} +1 -1
  22. package/web/dist/assets/{cynefin-VYW2F7L2-DVyQShfu.js → cynefin-VYW2F7L2-E9svUmbu.js} +1 -1
  23. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-5-G2jXgr.js → cynefinDiagram-TSTJHNR4-BQbCXTXu.js} +1 -1
  24. package/web/dist/assets/{dagre-VKFMJZFB-BVIWNamr.js → dagre-VKFMJZFB-YjOfj-Sz.js} +1 -1
  25. package/web/dist/assets/{diagram-FQU43EPY-DB_8HU4p.js → diagram-FQU43EPY-DKlBYUat.js} +1 -1
  26. package/web/dist/assets/{diagram-G47NLZAW-BuC9KdPo.js → diagram-G47NLZAW-HgY0xVom.js} +1 -1
  27. package/web/dist/assets/{diagram-NH7WQ7WH-DEjdAGik.js → diagram-NH7WQ7WH-Lhdi0JDL.js} +1 -1
  28. package/web/dist/assets/{diagram-OA4YK3LP-CpUMGDrP.js → diagram-OA4YK3LP-CCdsuo8R.js} +1 -1
  29. package/web/dist/assets/{diagram-WEI45ONY-CD-UVma6.js → diagram-WEI45ONY-CrzIcpD0.js} +1 -1
  30. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-Crk2X-Xr.js → ebnfDiagram-CCIWWBDH-BHGungqQ.js} +1 -1
  31. package/web/dist/assets/{editor.main-DX1kz8I2.js → editor.main-BgAd3I-c.js} +3 -3
  32. package/web/dist/assets/{erDiagram-Q63AITRT-POwYozga.js → erDiagram-Q63AITRT-DALVLFvS.js} +1 -1
  33. package/web/dist/assets/{flowDiagram-23GEKE2U-5jmZ5k5e.js → flowDiagram-23GEKE2U-vMO_-Vas.js} +1 -1
  34. package/web/dist/assets/{freemarker2-mDrCFxI5.js → freemarker2-Cm5E9K9d.js} +1 -1
  35. package/web/dist/assets/{ganttDiagram-NO4QXBWP-B9Mdj-u5.js → ganttDiagram-NO4QXBWP-B_y7vhkq.js} +1 -1
  36. package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-CNPSE7ls.js → gitGraphDiagram-IHSO6WYX-oyKu_s1_.js} +1 -1
  37. package/web/dist/assets/{handlebars--G4a_6Oo.js → handlebars-CdvxB8_F.js} +1 -1
  38. package/web/dist/assets/{html-tA32frga.js → html-DfU3H_eD.js} +1 -1
  39. package/web/dist/assets/{htmlMode-CggNnIWF.js → htmlMode-aW42TeyA.js} +1 -1
  40. package/web/dist/assets/index-9oRptzQJ.css +32 -0
  41. package/web/dist/assets/{index-AdB8XHXv.js → index-ZEqZC6sq.js} +6 -6
  42. package/web/dist/assets/{infoDiagram-FWYZ7A6U-CyB7Vvcb.js → infoDiagram-FWYZ7A6U-A8ue0Rc8.js} +1 -1
  43. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-DLMZ7H1X.js → ishikawaDiagram-FXEZZL3T-skFheQel.js} +1 -1
  44. package/web/dist/assets/{javascript-DMkX6-SC.js → javascript-BSVgnqft.js} +1 -1
  45. package/web/dist/assets/{journeyDiagram-5HDEW3XC-_nk1wTqH.js → journeyDiagram-5HDEW3XC-CxcqTnYP.js} +1 -1
  46. package/web/dist/assets/{jsonMode-BatVhCGs.js → jsonMode-Chyio2CN.js} +1 -1
  47. package/web/dist/assets/{kanban-definition-HUTT4EX6-Cz1JY0qx.js → kanban-definition-HUTT4EX6-3IdDzCA6.js} +1 -1
  48. package/web/dist/assets/{linear-DkQS0EVl.js → linear-DR3e8pJs.js} +1 -1
  49. package/web/dist/assets/{liquid-JdcJe3Mn.js → liquid-DdVm64RF.js} +1 -1
  50. package/web/dist/assets/{lspLanguageFeatures-BDC0ynk1.js → lspLanguageFeatures-BptCEdzQ.js} +1 -1
  51. package/web/dist/assets/{mdx-C0s6E9Ya.js → mdx-Crb1xK3v.js} +1 -1
  52. package/web/dist/assets/{mermaid.core-DQSlETG7.js → mermaid.core-qey-rTTh.js} +2 -2
  53. package/web/dist/assets/{mindmap-definition-LN4V7U3C-oNTOwQOU.js → mindmap-definition-LN4V7U3C-p2NXDklK.js} +1 -1
  54. package/web/dist/assets/{pegDiagram-2B236MQR-8BmSEVOy.js → pegDiagram-2B236MQR-CysYM1sW.js} +1 -1
  55. package/web/dist/assets/{pieDiagram-ENE6RG2P-DRIltoVc.js → pieDiagram-ENE6RG2P-9eq9UV8x.js} +1 -1
  56. package/web/dist/assets/{python-DQKjtSgN.js → python-BIBHzYUy.js} +1 -1
  57. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-BJfMAp1Q.js → quadrantDiagram-ABIIQ3AL-BG5a6aH2.js} +1 -1
  58. package/web/dist/assets/{railroadDiagram-RFXS5EU6-Dj9-wyZY.js → railroadDiagram-RFXS5EU6-CUTkhltO.js} +1 -1
  59. package/web/dist/assets/{razor-CL-fmDzS.js → razor-qx4-Kybw.js} +1 -1
  60. package/web/dist/assets/{requirementDiagram-TGXJPOKE-fPYOczdV.js → requirementDiagram-TGXJPOKE-CmcUF5bV.js} +1 -1
  61. package/web/dist/assets/{sankeyDiagram-HTMAVEWB-DyjpctG7.js → sankeyDiagram-HTMAVEWB-CATht_iL.js} +1 -1
  62. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-RaZs5E3b.js → sequenceDiagram-DBY2YBRQ-WPreubhe.js} +1 -1
  63. package/web/dist/assets/{sizeCapture-X5ZJPWSS-BfOA5cbO.js → sizeCapture-X5ZJPWSS-DNsVqke5.js} +1 -1
  64. package/web/dist/assets/{stateDiagram-2N3HPSRC-CdxgHSfH.js → stateDiagram-2N3HPSRC-CFJi3Iaj.js} +1 -1
  65. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-WRZIxCxw.js +1 -0
  66. package/web/dist/assets/{swimlanes-5IMT3BWC-B19jLFc4.js → swimlanes-5IMT3BWC-CVDKdvCT.js} +2 -2
  67. package/web/dist/assets/swimlanesDiagram-G3AALYLV-BJ2KVs2S.js +1 -0
  68. package/web/dist/assets/{timeline-definition-FHXFAJF6-CYSSTJjP.js → timeline-definition-FHXFAJF6-BwM8AQ3r.js} +1 -1
  69. package/web/dist/assets/{tsMode-I7W52vRp.js → tsMode-CnKXsDIA.js} +1 -1
  70. package/web/dist/assets/{typescript-BkUlxSfm.js → typescript-D4hIt06c.js} +1 -1
  71. package/web/dist/assets/{vennDiagram-L72KCM5P-CJ5m4qeA.js → vennDiagram-L72KCM5P-BOHDZBL9.js} +1 -1
  72. package/web/dist/assets/{wardleyDiagram-EHGQE667-CpaSYOZD.js → wardleyDiagram-EHGQE667-v06MUzIv.js} +1 -1
  73. package/web/dist/assets/{xml-B6uP1aJC.js → xml-Ci6lnduZ.js} +1 -1
  74. package/web/dist/assets/{xychartDiagram-FW5EYKEG-EqZ9r0f-.js → xychartDiagram-FW5EYKEG-CTur2M7J.js} +1 -1
  75. package/web/dist/assets/{yaml-BzfObSCH.js → yaml-DkojWTj3.js} +1 -1
  76. package/web/dist/index.html +2 -2
  77. package/web/dist/landing/landing.css +1161 -10
  78. package/web/dist/landing/landing.js +168 -0
  79. package/web/dist/landing.html +90 -62
  80. package/web/dist/landing.zh.html +90 -62
  81. package/web/dist/assets/channel-D0HU8H5o.js +0 -1
  82. package/web/dist/assets/classDiagram-OUVF2IWQ-DQaRrb-b.js +0 -1
  83. package/web/dist/assets/classDiagram-v2-EOCWNBFH-DQaRrb-b.js +0 -1
  84. package/web/dist/assets/index-D5K63qug.css +0 -32
  85. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-vTVKrqt9.js +0 -1
  86. 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
  };
@@ -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="Control Pi, GitHub Copilot, Claude Code, and OpenAI Codex on your development machine from a browser. Manage parallel sessions with end-to-end encryption.">
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="Use multiple coding agents and working directories from one browser workspace. Code and execution stay on your development machine.">
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="Manage Pi, Copilot, Claude Code, and Codex sessions on your development machine from a browser.">
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="/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">
35
- <script src="/landing/landing.js" defer></script>
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 remotely controlling coding agents running on your development machine.",
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
- "Files, Git, terminal, and local port access",
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="/landing/icons/msclaude-animated.svg" alt="">
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="/landing/icons/agent-pi.svg" alt=""></i> Pi</span>
97
- <span><i class="provider-icon"><img src="/landing/icons/agent-copilot.svg" alt=""></i> GitHub Copilot</span>
98
- <span><i class="provider-icon"><img src="/landing/icons/agent-claude.svg" alt=""></i> Claude Code</span>
99
- <span><i class="provider-icon"><img src="/landing/icons/agent-codex.svg" alt=""></i> OpenAI Codex</span>
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 · 4 sessions</span>
116
- <span class="encrypted-label">● E2E encrypted</span>
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">Agents on this page</span>
120
- <span class="active"><i class="provider-icon"><img src="/landing/icons/agent-pi.svg" alt=""></i>Pi <b>1</b></span>
121
- <span><i class="provider-icon"><img src="/landing/icons/agent-copilot.svg" alt=""></i>Copilot <b>1</b></span>
122
- <span><i class="provider-icon"><img src="/landing/icons/agent-claude.svg" alt=""></i>Claude Code <b>1</b></span>
123
- <span><i class="provider-icon"><img src="/landing/icons/agent-codex.svg" alt=""></i>Codex <b>1</b></span>
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
- <div class="session-row active"><i class="provider-icon"><img src="/landing/icons/agent-pi.svg" alt=""></i><span><strong>Landing page copy</strong><small>Pi · working</small></span><b></b></div>
130
- <div class="session-row"><i class="provider-icon"><img src="/landing/icons/agent-copilot.svg" alt=""></i><span><strong>Fix auth callback</strong><small>Copilot · done</small></span></div>
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
- <div class="session-row"><i class="provider-icon"><img src="/landing/icons/agent-claude.svg" alt=""></i><span><strong>Review API changes</strong><small>Claude Code · working</small></span><b></b></div>
133
- <div class="session-row"><i class="provider-icon"><img src="/landing/icons/agent-codex.svg" alt=""></i><span><strong>Update unit tests</strong><small>Codex · done</small></span></div>
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>Landing page copy</strong><small>Q:\src\frontend · Pi</small></div>
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">Update the landing page copy and keep the layout compact.</div>
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="/landing/icons/agent-pi.svg" alt=""></i> Pi</span>
144
- <p>I’ll revise the product description, keep the supported agents visible, and fit the main content within two screens.</p>
145
- <div class="tool-call"><span>✓</span><div><strong>apply_patch</strong><small>Updated landing.html and landing.css</small></div></div>
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">Multiple agents and projects, on one page.</h2>
159
- <p>Keep sessions from different agents and working directories open at the same time. Check progress and send follow-up instructions without switching terminals or browser tabs.</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="/landing/icons/agent-pi.svg" alt=""></i><b>Pi</b><small>Q:\src\frontend</small><em>Working</em></span>
172
- <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>
173
- <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>
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">&gt;_</div>
179
- <h3>Chat and developer tools</h3>
180
- <p>Chat is the main workflow. Project tools stay available alongside the conversation when more context or control is needed.</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, preview, edit</small></li>
183
- <li>Git <small>Status and diffs</small></li>
184
- <li>Terminal <small>Run local commands</small></li>
185
- <li>Port Proxy <small>Open local servers</small></li>
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">How it works</p>
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>1</span><div><strong>Start locally</strong><small>Run msclaude in a working directory.</small></div></li>
193
- <li><span>2</span><div><strong>Open the URL</strong><small>Use the generated session link on another device.</small></div></li>
194
- <li><span>3</span><div><strong>Continue working</strong><small>Use chat, files, Git, and terminal remotely.</small></div></li>
220
+ <li><span>+</span><div><strong>Attachments</strong><small>Add files and images.</small></div></li>
221
+ <li><span>◇</span><div><strong>Models &amp; thinking</strong><small>Switch models and reasoning levels.</small></div></li>
222
+ <li><span>›</span><div><strong>Modes &amp; 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="Security and self-hosting">
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">End-to-end encryption</p>
204
- <h2>The relay cannot read your work.</h2>
205
- <p>Messages are encrypted between the browser and local agent. The relay cannot read prompts, responses, tool output, or file contents. Code and execution remain on your development machine.</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">Access from any device</p>
211
- <h2>Continue agent sessions from your browser.</h2>
212
- <p>Open the same session URL on a computer, tablet, or phone to check progress, send follow-up instructions, and use the related development tools.</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">Self-hosting</p>
218
- <h2>Run your own relay server.</h2>
219
- <p>The hosted relay is the simplest setup, but it is not required. The lightweight msclaude relay can be deployed on your own infrastructure with the same browser experience and encryption model.</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="/landing/icons/msclaude-animated.svg" alt=""><span>msclaude</span></a>
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>