@logicseek/hello-cc 1.0.1 → 1.0.2

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 (97) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +4 -0
  3. package/README.zh-CN.md +4 -0
  4. package/docs/README.md +9 -0
  5. package/docs/README.zh-CN.md +9 -0
  6. package/docs/commands.md +53 -0
  7. package/docs/commands.zh-CN.md +48 -0
  8. package/docs/dsh.md +137 -0
  9. package/docs/dsh.zh-CN.md +139 -0
  10. package/docs/mcp.md +9 -0
  11. package/docs/mcp.zh-CN.md +23 -0
  12. package/docs/native.md +295 -0
  13. package/docs/native.zh-CN.md +253 -0
  14. package/docs/web-handoff.zh-CN.md +53 -0
  15. package/lib/cli/app.mjs +25 -6
  16. package/lib/cli/commands/doctor.mjs +17 -2
  17. package/lib/cli/commands/dsh.mjs +79 -0
  18. package/lib/cli/commands/hook.mjs +241 -90
  19. package/lib/cli/commands/lock.mjs +34 -19
  20. package/lib/cli/commands/mcp.mjs +28 -0
  21. package/lib/cli/commands/native.mjs +130 -0
  22. package/lib/cli/commands/run.mjs +66 -21
  23. package/lib/cli/commands/task.mjs +6 -3
  24. package/lib/cli-args.mjs +4 -0
  25. package/lib/coordination-state.mjs +15 -1
  26. package/lib/core/coordination/event-retention.mjs +14 -2
  27. package/lib/core/coordination/gc-plan.mjs +3 -13
  28. package/lib/core/coordination/locks.mjs +45 -0
  29. package/lib/core/coordination/results.mjs +79 -0
  30. package/lib/core/peers/bindings.mjs +9 -3
  31. package/lib/diagnostics/codex.mjs +121 -0
  32. package/lib/integrations/codex-interactions.mjs +114 -0
  33. package/lib/integrations/dsh-collaboration.mjs +170 -0
  34. package/lib/integrations/dsh-cordis.d.ts +19 -0
  35. package/lib/integrations/dsh-cordis.mjs +177 -0
  36. package/lib/integrations/dsh.bundle.yml +7 -0
  37. package/lib/integrations/dsh.mjs +287 -0
  38. package/lib/integrations/native/claude.mjs +451 -0
  39. package/lib/integrations/native/codex.mjs +242 -0
  40. package/lib/integrations/native/dsh-acp.mjs +343 -0
  41. package/lib/integrations/native/index.mjs +19 -0
  42. package/lib/integrations/native/interactions.mjs +53 -0
  43. package/lib/integrations/native/jsonrpc.mjs +185 -0
  44. package/lib/integrations/peers/identity.mjs +36 -10
  45. package/lib/integrations/peers/processes.mjs +22 -8
  46. package/lib/integrations/providers.mjs +6 -2
  47. package/lib/mcp/scope.mjs +104 -0
  48. package/lib/mcp/stdio.mjs +80 -0
  49. package/lib/mcp/tools.mjs +197 -0
  50. package/lib/process/identity.mjs +3 -1
  51. package/lib/release/release-notes.mjs +9 -0
  52. package/lib/runtime/native/client.mjs +38 -0
  53. package/lib/runtime/native/service.mjs +511 -0
  54. package/lib/runtime/native/store.mjs +121 -0
  55. package/lib/ui/help.mjs +5 -2
  56. package/lib/web/adoption-state.mjs +55 -0
  57. package/lib/web/auto-attach.mjs +18 -2
  58. package/lib/web/codex-app-server.mjs +557 -0
  59. package/lib/web/codex-sessions.mjs +287 -0
  60. package/lib/web/control-lease.mjs +204 -0
  61. package/lib/web/http-routes.mjs +197 -15
  62. package/lib/web/http.mjs +5 -4
  63. package/lib/web/native-sessions.mjs +286 -0
  64. package/lib/web/project-contexts.mjs +2 -1
  65. package/lib/web/pty-sessions.mjs +60 -33
  66. package/lib/web/runtime-main.mjs +98 -6
  67. package/lib/web/session-serialize.mjs +0 -0
  68. package/lib/web/task-results.mjs +76 -0
  69. package/lib/web/tmux-sessions.mjs +92 -11
  70. package/lib/web/tmux-stream.mjs +2 -2
  71. package/lib/web/ui-codex.mjs +550 -0
  72. package/lib/web/ui-command-palette.mjs +119 -0
  73. package/lib/web/ui-handoff.mjs +102 -0
  74. package/lib/web/ui-history.mjs +118 -0
  75. package/lib/web/ui-i18n.mjs +841 -0
  76. package/lib/web/ui-interactions.mjs +78 -0
  77. package/lib/web/ui-login.mjs +101 -0
  78. package/lib/web/ui-native.mjs +165 -0
  79. package/lib/web/ui-preferences.mjs +278 -0
  80. package/lib/web/ui-review.mjs +132 -0
  81. package/lib/web/ui-template.mjs +1106 -576
  82. package/lib/web/ui-terminal-find.mjs +98 -0
  83. package/lib/web/ui-workbench.mjs +94 -0
  84. package/lib/web/ui-workspace.mjs +222 -0
  85. package/package.json +11 -3
  86. package/scripts/check-free-identifiers.mjs +67 -8
  87. package/scripts/codex-diagnostics-installed-acceptance.mjs +72 -0
  88. package/scripts/dsh-cordis-acceptance.mjs +200 -0
  89. package/scripts/dsh-installed-acceptance.mjs +247 -0
  90. package/scripts/dsh-official-acceptance.mjs +180 -0
  91. package/scripts/dsh-web-startup-acceptance.mjs +87 -0
  92. package/scripts/github-release.mjs +3 -1
  93. package/scripts/native-live-acceptance.mjs +369 -0
  94. package/scripts/regression.mjs +243 -89
  95. package/scripts/web-handoff-installed-acceptance.mjs +98 -0
  96. package/scripts/web-native-interaction-acceptance.mjs +204 -0
  97. package/scripts/web-native-model-acceptance.mjs +138 -0
@@ -0,0 +1,132 @@
1
+ export const auxiliaryPanelsCss = `
2
+ .dialog.auxiliary-dialog { width:min(1040px,calc(100vw - 28px)); max-width:none; height:min(84dvh,900px); display:flex; flex-direction:column; overflow:hidden; gap:10px; }
3
+ .auxiliary-dialog > .dialog-heading { flex:none; }
4
+ .auxiliary-dialog pre { white-space:pre-wrap; overflow-wrap:anywhere; font:var(--small-font)/1.6 var(--mono); }
5
+ .auxiliary-dialog .btns { flex-wrap:wrap; }
6
+ .auxiliary-dialog .confirmation-row { display:flex; align-items:flex-start; gap:8px; margin:12px 0; line-height:1.5; }
7
+ .confirmation-row input { flex:none; }
8
+ .history-layout { display:grid; grid-template-columns:minmax(180px,260px) minmax(0,1fr); gap:16px; min-height:0; flex:1; }
9
+ .history-list,.history-preview,.review-scroll { min-width:0; min-height:0; overflow:auto; }
10
+ .history-thread { height:auto; display:grid; gap:5px; width:100%; text-align:left; padding:10px; margin:8px 0; }
11
+ .history-thread span { color:var(--muted); font-size:var(--small-font); overflow-wrap:anywhere; }
12
+ .history-thread[aria-pressed=true] { border-color:var(--accent); background:var(--selection-bg); }
13
+ .history-turn,.review-record { border:1px solid var(--border); border-radius:8px; padding:12px; margin:10px 0; background:var(--card-bg); }
14
+ .history-turn article { border-top:1px solid var(--border); padding-top:10px; margin-top:10px; }
15
+ .review-scroll { flex:1; }
16
+ .review-record-head { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
17
+ .review-record-head strong { flex:1; min-width:150px; }
18
+ .review-record small { color:var(--muted); }
19
+ .review-stage-list { display:flex; flex-wrap:wrap; gap:8px; }
20
+ .review-evidence { display:grid; gap:6px; font-size:var(--small-font); overflow-wrap:anywhere; }
21
+ .review-form { display:grid; gap:10px; padding:12px 0; border-top:1px solid var(--border); }
22
+ .review-form-row { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
23
+ .review-form textarea { width:100%; min-height:70px; padding:8px; resize:vertical; font:inherit; color:var(--text); background:var(--input-bg); border:1px solid var(--border); border-radius:6px; }
24
+ @media(max-width:700px) { .history-layout { grid-template-columns:1fr; grid-template-rows:minmax(100px,30%) minmax(0,1fr); } .review-form-row { grid-template-columns:1fr; } .dialog.auxiliary-dialog { height:90dvh; } }
25
+ `;
26
+
27
+ export function reviewPanelHtml() {
28
+ return `<div class="dialog-overlay" id="reviewDialog" role="dialog" aria-modal="true" aria-labelledby="reviewTitle" hidden><div class="dialog auxiliary-dialog">
29
+ <header class="dialog-heading"><h3 id="reviewTitle" data-i18n="review.title">Review results</h3><button id="reviewClose" type="button" data-i18n-aria="close" aria-label="Close">×</button></header>
30
+ <p class="dialog-help" id="reviewScope"></p><p class="dialog-help" id="reviewNotice" role="status" aria-live="polite"></p>
31
+ <div class="review-scroll"><div class="review-stage-list" id="reviewSummary"></div><div id="reviewRecords"></div>
32
+ <form class="review-form" id="verificationForm">
33
+ <h4 data-i18n="review.record">Record verification evidence</h4><p class="dialog-help" data-i18n="review.manualHelp">Record what you verified and its evidence. Task completion remains a separate action.</p>
34
+ <div class="review-form-row"><label><span data-i18n="review.stage">Stage</span><select id="verificationStage"><option value="local" data-i18n="review.local">Local validation</option><option value="publication" data-i18n="review.publication">Publication</option><option value="business" data-i18n="review.business">Business acceptance</option></select></label>
35
+ <label><span data-i18n="review.status">Result</span><select id="verificationStatus"><option value="pending" data-i18n="review.pending">Pending</option><option value="passed" data-i18n="review.passed">Passed</option><option value="failed" data-i18n="review.failed">Failed</option></select></label></div>
36
+ <label><span data-i18n="review.recordTitle">Verification title or command already run</span><input id="verificationTitle" required maxlength="300" autocomplete="off"></label>
37
+ <label><span data-i18n="review.details">Conclusion and remaining gaps</span><textarea id="verificationDetails" rows="3" required></textarea></label>
38
+ <label><span data-i18n="review.evidence">Evidence references, one per line</span><textarea id="verificationEvidence" rows="2"></textarea></label>
39
+ <div class="btns"><button id="reviewRefresh" type="button" data-i18n="refresh">Refresh</button><button id="verificationSave" class="primary" type="submit" data-i18n="review.save" disabled>Save record</button></div>
40
+ </form>
41
+ </div>
42
+ </div></div>`;
43
+ }
44
+
45
+ export function reviewPanelScript() {
46
+ return String.raw`(() => {
47
+ const dialog = document.getElementById('reviewDialog'), form = document.getElementById('verificationForm');
48
+ const bridge = () => window.hccHandoff, tr = (key, fallback = '') => bridge().tr(key, fallback), esc = value => bridge().esc(String(value ?? ''));
49
+ let target = null, data = null, generation = 0, busy = false;
50
+ const same = subject => subject && subject.root === bridge().projectRoot && subject.id === bridge().active;
51
+ const route = subject => '/api/sessions/' + encodeURIComponent(subject.id) + '/results?root=' + encodeURIComponent(subject.root);
52
+ const draftKey = subject => 'hcc.reviewDraft:' + JSON.stringify([subject.root,subject.id,subject.taskId]);
53
+ const fields = ['verificationStage','verificationStatus','verificationTitle','verificationDetails','verificationEvidence'];
54
+ function notice(message) { document.getElementById('reviewNotice').textContent = message || ''; }
55
+ function values() { return Object.fromEntries(fields.map(id => [id,document.getElementById(id).value])); }
56
+ function saveDraft() { if (target) window.hccUi.safeSet(draftKey(target), JSON.stringify(values())); }
57
+ function restoreDraft() {
58
+ let saved = {}; try { saved = JSON.parse(window.hccUi.safeGet(draftKey(target)) || '{}'); } catch (_) {}
59
+ for (const id of fields) document.getElementById(id).value = saved[id] || (id === 'verificationStage' ? 'local' : id === 'verificationStatus' ? 'pending' : '');
60
+ }
61
+ function sync() {
62
+ const task = data?.current_task;
63
+ const owner = task?.owner;
64
+ const writable = same(target) && bridge().canControl && task && task.id === target.taskId && bridge().session?.task?.id === target.taskId && owner === target.peer;
65
+ document.getElementById('verificationSave').disabled = busy || !writable;
66
+ document.getElementById('reviewRefresh').disabled = busy || !target;
67
+ if (!busy && data && !writable) notice(task ? tr('review.controlRequired') : tr('review.noTask'));
68
+ }
69
+ function recordHtml(record) {
70
+ const source = record.source === 'executor' ? tr('review.executorSource') : record.source === 'user' ? tr('review.userSource') : tr('review.recordedSource');
71
+ const evidence = Array.isArray(record.evidence) ? record.evidence : record.evidence ? [record.evidence] : [];
72
+ const command = record.command || record.commands;
73
+ return '<article class="review-record"><div class="review-record-head"><strong>' + esc(record.title || record.command || tr('review.record')) + '</strong><span class="badge">' + esc(tr('review.' + (record.stage || 'local'))) + '</span><span class="badge">' + esc(tr('review.' + (record.status || 'pending'))) + '</span></div><small>' + esc(source) + (record.created_at || record.createdAt ? ' · ' + esc(new Date(Number(record.created_at || record.createdAt) * (Number(record.created_at || record.createdAt) < 1e12 ? 1000 : 1)).toLocaleString()) : '') + '</small>'
74
+ + (record.details || record.conclusion ? '<pre>' + esc(record.details || record.conclusion) + '</pre>' : '')
75
+ + (command ? '<details><summary>' + esc(tr('review.commands')) + '</summary><pre>' + esc(typeof command === 'string' ? command : JSON.stringify(command,null,2)) + '</pre></details>' : '')
76
+ + (record.diff ? '<details><summary>' + esc(tr('review.diff')) + '</summary><pre>' + esc(record.diff) + '</pre></details>' : '')
77
+ + (record.changedFiles?.length ? '<pre>' + esc(record.changedFiles.map(file => typeof file === 'string' ? file : file.path || JSON.stringify(file)).join('\n')) + '</pre>' : '')
78
+ + (evidence.length ? '<div class="review-evidence">' + evidence.map(reference => '<span>' + esc(typeof reference === 'string' ? reference : JSON.stringify(reference)) + '</span>').join('') + '</div>' : '') + '</article>';
79
+ }
80
+ function render() {
81
+ document.getElementById('reviewScope').textContent = [target?.root, target?.peer, data?.current_task ? '#' + data.current_task.id + ' ' + data.current_task.title : ''].filter(Boolean).join(' · ');
82
+ document.getElementById('reviewSummary').innerHTML = ['local','publication','business'].map(stage => {
83
+ const latest = data?.summary?.[stage];
84
+ const status = typeof latest === 'string' ? latest : latest?.status || 'pending';
85
+ const source = latest?.source === 'executor' ? tr('review.executorSource') : latest?.source === 'user' ? tr('review.userSource') : '';
86
+ return '<span class="badge">' + esc(tr('review.' + stage)) + ': ' + esc(tr('review.' + status, status)) + (source ? ' · ' + esc(source) : '') + '</span>';
87
+ }).join('');
88
+ document.getElementById('reviewRecords').innerHTML = (data?.results || []).map(recordHtml).join('') || '<p class="dialog-help">' + esc(tr('review.empty')) + '</p>';
89
+ sync();
90
+ }
91
+ async function refresh() {
92
+ if (!target || busy) return;
93
+ const subject = { ...target }, version = ++generation;
94
+ busy = true; sync(); notice(tr('review.loading'));
95
+ try {
96
+ const result = await bridge().api(route(subject));
97
+ if (!same(subject) || version !== generation || dialog.hidden) return;
98
+ const previousTask = target.taskId;
99
+ data = result; target.taskId = result.current_task?.id || null;
100
+ if (previousTask !== target.taskId) restoreDraft();
101
+ notice(''); render();
102
+ } catch (error) { if (same(subject) && version === generation && !dialog.hidden) notice(error.detail || error.message); }
103
+ finally { if (version === generation) { busy = false; sync(); } }
104
+ }
105
+ function open() {
106
+ const b = bridge(), session = b.session;
107
+ if (!session?.id) return;
108
+ target = { root:b.projectRoot,id:session.id,peer:session.peer_id || session.id,taskId:session.task?.id || null };
109
+ data = null; generation++; busy = false; restoreDraft(); render();
110
+ b.openDialog(dialog, document.getElementById('reviewRefresh')); void refresh();
111
+ }
112
+ form.addEventListener('input', saveDraft); form.addEventListener('change', saveDraft);
113
+ form.addEventListener('submit', async event => {
114
+ event.preventDefault(); sync();
115
+ if (busy || document.getElementById('verificationSave').disabled) return;
116
+ const subject = { ...target }, version = generation, submitted = values(), storageKey = draftKey(subject);
117
+ busy = true; sync(); notice(tr('review.saving'));
118
+ try {
119
+ await bridge().api(route(subject), { method:'POST',body:JSON.stringify({ actionToken:bridge().actionToken,epoch:bridge().epoch,taskId:subject.taskId,stage:submitted.verificationStage,status:submitted.verificationStatus,title:submitted.verificationTitle,details:submitted.verificationDetails,evidence:submitted.verificationEvidence.split('\n').map(line=>line.trim()).filter(Boolean) }) });
120
+ let current = {}; try { current = JSON.parse(window.hccUi.safeGet(storageKey) || '{}'); } catch (_) {}
121
+ if (JSON.stringify(current) === JSON.stringify(submitted)) window.hccUi.safeSet(storageKey,'{}');
122
+ if (!same(subject) || version !== generation || dialog.hidden) return;
123
+ restoreDraft(); notice(tr('review.saved')); busy = false; await refresh();
124
+ } catch (error) { if (same(subject) && version === generation && !dialog.hidden) notice((error.detail || error.message) + (error.code ? ' [' + error.code + ']' : '')); }
125
+ finally { if (version === generation) { busy = false; sync(); } }
126
+ });
127
+ document.getElementById('reviewRefresh').addEventListener('click', refresh);
128
+ document.getElementById('reviewClose').addEventListener('click', () => bridge().closeDialog(dialog));
129
+ window.addEventListener('hcc:preferences', () => { if (!dialog.hidden) render(); });
130
+ window.hccReview = { open,sync,reset() { generation++; busy = false; target = null; if (!dialog.hidden) bridge().closeDialog(dialog); } };
131
+ })();`;
132
+ }