@logicseek/hello-cc 1.0.0 → 1.0.2-dsh.3
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/CHANGELOG.md +149 -0
- package/README.md +36 -0
- package/README.zh-CN.md +35 -0
- package/docs/README.md +9 -0
- package/docs/README.zh-CN.md +9 -0
- package/docs/commands.md +53 -0
- package/docs/commands.zh-CN.md +48 -0
- package/docs/dsh.md +137 -0
- package/docs/dsh.zh-CN.md +139 -0
- package/docs/guide.md +58 -0
- package/docs/guide.zh-CN.md +55 -0
- package/docs/mcp.md +9 -0
- package/docs/mcp.zh-CN.md +23 -0
- package/docs/native.md +295 -0
- package/docs/native.zh-CN.md +253 -0
- package/docs/web-handoff.zh-CN.md +53 -0
- package/lib/cli/app.mjs +27 -6
- package/lib/cli/commands/coordination.mjs +3 -1
- package/lib/cli/commands/doctor.mjs +17 -2
- package/lib/cli/commands/dsh.mjs +79 -0
- package/lib/cli/commands/gc.mjs +182 -32
- package/lib/cli/commands/hook.mjs +241 -90
- package/lib/cli/commands/lock.mjs +34 -19
- package/lib/cli/commands/mcp.mjs +28 -0
- package/lib/cli/commands/misc.mjs +15 -0
- package/lib/cli/commands/native.mjs +130 -0
- package/lib/cli/commands/peer.mjs +21 -5
- package/lib/cli/commands/run.mjs +66 -21
- package/lib/cli/commands/task.mjs +6 -3
- package/lib/cli-args.mjs +4 -0
- package/lib/coordination-state.mjs +15 -1
- package/lib/core/coordination/event-retention.mjs +14 -2
- package/lib/core/coordination/gc-plan.mjs +3 -13
- package/lib/core/coordination/locks.mjs +45 -0
- package/lib/core/coordination/results.mjs +79 -0
- package/lib/core/peers/bindings.mjs +9 -3
- package/lib/diagnostics/codex.mjs +121 -0
- package/lib/integrations/codex-interactions.mjs +114 -0
- package/lib/integrations/dsh-collaboration.mjs +170 -0
- package/lib/integrations/dsh-cordis.d.ts +19 -0
- package/lib/integrations/dsh-cordis.mjs +177 -0
- package/lib/integrations/dsh.bundle.yml +7 -0
- package/lib/integrations/dsh.mjs +287 -0
- package/lib/integrations/native/claude.mjs +451 -0
- package/lib/integrations/native/codex.mjs +242 -0
- package/lib/integrations/native/dsh-acp.mjs +343 -0
- package/lib/integrations/native/index.mjs +19 -0
- package/lib/integrations/native/interactions.mjs +53 -0
- package/lib/integrations/native/jsonrpc.mjs +185 -0
- package/lib/integrations/peers/identity.mjs +36 -10
- package/lib/integrations/peers/processes.mjs +22 -8
- package/lib/integrations/providers.mjs +6 -2
- package/lib/mcp/scope.mjs +104 -0
- package/lib/mcp/stdio.mjs +80 -0
- package/lib/mcp/tools.mjs +197 -0
- package/lib/process/identity.mjs +33 -1
- package/lib/release/release-notes.mjs +9 -0
- package/lib/runtime/buffer-directory-lease.mjs +2 -1
- package/lib/runtime/client.mjs +3 -0
- package/lib/runtime/native/client.mjs +38 -0
- package/lib/runtime/native/service.mjs +511 -0
- package/lib/runtime/native/store.mjs +121 -0
- package/lib/shared/file-lock.mjs +11 -4
- package/lib/shared/socket-lock-worker.mjs +73 -24
- package/lib/terminal/tmux.mjs +53 -23
- package/lib/ui/help.mjs +5 -2
- package/lib/web/adoption-state.mjs +55 -0
- package/lib/web/auto-attach.mjs +18 -2
- package/lib/web/buffer-gc-runtime.mjs +2 -2
- package/lib/web/codex-app-server.mjs +557 -0
- package/lib/web/codex-sessions.mjs +287 -0
- package/lib/web/control-lease.mjs +204 -0
- package/lib/web/http-routes.mjs +197 -15
- package/lib/web/http.mjs +5 -4
- package/lib/web/native-sessions.mjs +286 -0
- package/lib/web/project-contexts.mjs +8 -2
- package/lib/web/pty-sessions.mjs +60 -33
- package/lib/web/runtime-main.mjs +101 -6
- package/lib/web/session-serialize.mjs +0 -0
- package/lib/web/startup.mjs +4 -2
- package/lib/web/task-results.mjs +76 -0
- package/lib/web/tmux-sessions.mjs +92 -11
- package/lib/web/tmux-stream.mjs +2 -2
- package/lib/web/ui-codex.mjs +550 -0
- package/lib/web/ui-command-palette.mjs +119 -0
- package/lib/web/ui-handoff.mjs +102 -0
- package/lib/web/ui-history.mjs +118 -0
- package/lib/web/ui-i18n.mjs +841 -0
- package/lib/web/ui-interactions.mjs +78 -0
- package/lib/web/ui-login.mjs +101 -0
- package/lib/web/ui-native.mjs +165 -0
- package/lib/web/ui-preferences.mjs +278 -0
- package/lib/web/ui-review.mjs +132 -0
- package/lib/web/ui-template.mjs +1106 -576
- package/lib/web/ui-terminal-find.mjs +98 -0
- package/lib/web/ui-workbench.mjs +94 -0
- package/lib/web/ui-workspace.mjs +222 -0
- package/package.json +12 -4
- package/scripts/check-free-identifiers.mjs +67 -8
- package/scripts/codex-diagnostics-installed-acceptance.mjs +72 -0
- package/scripts/dsh-cordis-acceptance.mjs +200 -0
- package/scripts/dsh-installed-acceptance.mjs +247 -0
- package/scripts/dsh-official-acceptance.mjs +180 -0
- package/scripts/dsh-web-startup-acceptance.mjs +87 -0
- package/scripts/github-release.mjs +3 -1
- package/scripts/native-live-acceptance.mjs +369 -0
- package/scripts/regression.mjs +338 -187
- package/scripts/web-handoff-installed-acceptance.mjs +98 -0
- package/scripts/web-native-interaction-acceptance.mjs +204 -0
- package/scripts/web-native-model-acceptance.mjs +138 -0
- package/docs/architecture-split-review.md +0 -217
- package/docs/current-state-review-2026-08.md +0 -341
- package/docs/defect-review-2026-07.md +0 -382
- package/docs/layout-split-stack-audit.md +0 -298
- package/docs/superpowers/plans/2026-08-03-runtime-safety-plan.md +0 -294
- package/docs/superpowers/plans/2026-08-03-v1-data-identity-plan.md +0 -400
- package/docs/superpowers/plans/2026-08-03-v1-release-verification-plan.md +0 -284
- package/docs/superpowers/plans/2026-08-03-web-api-hardening-plan.md +0 -303
- package/docs/superpowers/plans/2026-08-04-runtime-buffer-gc-two-phase.md +0 -71
- package/docs/superpowers/specs/2026-08-03-runtime-safety-design.md +0 -117
- package/docs/superpowers/specs/2026-08-03-v1-data-identity-design.md +0 -120
- package/docs/superpowers/specs/2026-08-03-v1-release-verification-design.md +0 -117
- package/docs/superpowers/specs/2026-08-03-web-api-hardening-design.md +0 -104
|
@@ -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
|
+
}
|