vibe-coding-master 0.3.21 → 0.3.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/backend/api/artifact-routes.js +8 -1
- package/dist/backend/api/codex-translation-routes.js +24 -0
- package/dist/backend/api/project-routes.js +3 -1
- package/dist/backend/api/task-routes.js +3 -1
- package/dist/backend/server.js +10 -1
- package/dist/backend/services/artifact-service.js +10 -3
- package/dist/backend/services/codex-hook-service.js +30 -9
- package/dist/backend/services/codex-translation-service.js +183 -79
- package/dist/backend/services/session-service.js +190 -38
- package/dist/backend/services/status-service.js +3 -1
- package/dist/backend/services/translation-service.js +15 -4
- package/dist/backend/templates/handoff.js +3 -3
- package/dist/backend/templates/harness/architect-agent.js +3 -2
- package/dist/backend/templates/harness/coder-agent.js +6 -1
- package/dist/shared/types/app-settings.js +3 -2
- package/dist-frontend/assets/index-C2xTNLmb.js +95 -0
- package/dist-frontend/assets/index-Cfum1Prr.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/docs/codex-translation-plan.md +108 -86
- package/docs/product-design.md +5 -5
- package/docs/v0.4-custom-workflow-plan.md +785 -0
- package/docs/vcm-cc-best-practices.md +15 -12
- package/package.json +1 -1
- package/dist-frontend/assets/index-DOKW0Y5n.js +0 -95
- package/dist-frontend/assets/index-Dmefx9m7.css +0 -32
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
+
* https://github.com/chjj/term.js
|
|
5
|
+
* @license MIT
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
* THE SOFTWARE.
|
|
24
|
+
*
|
|
25
|
+
* Originally forked from (with the author's permission):
|
|
26
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
+
* http://bellard.org/jslinux/
|
|
28
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
+
* The original design remains. The terminal itself
|
|
30
|
+
* has been extended to include xterm CSI codes, among
|
|
31
|
+
* other features.
|
|
32
|
+
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f2ea;color:#1c2024;line-height:1.5}html,body,#root{height:100%}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f2ea}button,input,select,textarea{font:inherit}button{border:1px solid #9ba6ad;background:#f8f7f2;color:#1d252b;border-radius:6px;min-height:34px;padding:6px 10px;cursor:pointer}button:hover:not(:disabled){background:#eef4f2;border-color:#607d74}button:disabled{cursor:not-allowed;opacity:.55}.danger-button{border-color:#b84a45;background:#fff1ee;color:#8d211d;font-weight:750}.danger-button:hover:not(:disabled){border-color:#8d211d;background:#ffe2dc}input,select,textarea:not(.xterm-helper-textarea){width:100%;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:8px 10px}textarea:not(.xterm-helper-textarea){min-height:240px;resize:vertical;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}h1,h2,p{margin-top:0}h1{margin-bottom:4px;font-size:26px;line-height:1.15}h2{margin-bottom:10px;font-size:14px;letter-spacing:0}.app-shell{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);height:100vh;min-height:0;overflow:hidden}.app-shell.is-sidebar-collapsed{grid-template-columns:46px minmax(0,1fr)}.app-sidebar{position:relative;display:flex;flex-direction:column;min-width:0;border-right:1px solid #d3c9b8;background:#fbfaf6;padding:14px;overflow:auto}.app-shell.is-sidebar-collapsed .app-sidebar{overflow:hidden;padding:8px}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:2;display:grid;place-items:center;width:28px;min-height:28px;padding:0;background:#fffdf8}.sidebar-toggle:before{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;content:"";transform:translate(2px) rotate(135deg)}.app-shell.is-sidebar-collapsed .sidebar-toggle{left:9px;right:auto}.app-shell.is-sidebar-collapsed .sidebar-toggle:before{transform:translate(-2px) rotate(-45deg)}.sidebar-content{display:flex;flex:1;min-width:0;min-height:0}.project-dashboard{display:flex;flex:1;flex-direction:column;width:100%;min-height:100%}.app-shell.is-sidebar-collapsed .sidebar-content{width:0;opacity:0;pointer-events:none}.app-main{min-width:0;height:100%;padding:14px 16px;overflow:auto}.brand-header{display:flex;gap:12px;align-items:baseline;margin-bottom:10px;padding-right:34px}.brand-header strong{font-size:18px}.brand-header span,.muted{color:#667071;font-size:13px}.sidebar-section{margin-bottom:8px;border:1px solid #e0d6c7;border-radius:8px;background:#fffdfa;overflow:hidden}.sidebar-section-toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-height:34px;border:0;border-radius:0;background:transparent;color:#1c2024;font-size:13px;font-weight:750;text-align:left}.sidebar-section-toggle:hover{background:#f5f1e8}.sidebar-section-toggle[aria-expanded=true]{border-bottom:1px solid #ece5d9}.sidebar-section-chevron{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;transform:rotate(45deg)}.sidebar-section-toggle[aria-expanded=true] .sidebar-section-chevron{transform:rotate(-135deg)}.sidebar-section-content{padding:8px}.repo-connect,.project-summary,.gateway-panel,.harness-panel,.task-create{margin:0}.inline-form{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.inline-form.has-recent-paths{grid-template-columns:minmax(0,1fr) auto}.inline-form>input{grid-column:1 / -1}.inline-form>button{justify-self:end}.inline-form.has-recent-paths>button{justify-self:auto}.repo-recent-select{min-width:0;max-width:none}.project-summary dl{display:grid;gap:8px;margin:0}.project-summary div{min-width:0}.project-summary dt{color:#6c6255;font-size:12px}.project-summary dd{margin:0;overflow-wrap:anywhere;font-size:13px}.connected-repo-actions{display:flex;align-items:center;gap:8px;margin-top:10px}.connected-repo-actions button{min-height:30px}.gateway-actions{display:grid;gap:8px;margin-top:10px}.gateway-actions button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.gateway-actions .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.gateway-qr{display:grid;gap:6px;margin-top:10px}.gateway-qr img{width:100%;max-width:180px;border:1px solid #d3c9b8;border-radius:6px;background:#fff;padding:6px}.gateway-qr code{overflow-wrap:anywhere;font-size:11px}.warnings,.error-banner{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.flow-pause-alert-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:#1f242b85;padding:20px}.flow-pause-alert{display:grid;gap:12px;width:min(460px,100%);border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 28px 72px #1f242b47;padding:22px}.flow-pause-alert-kicker{margin:0;color:#2f6f73;font-size:12px;font-weight:700;text-transform:uppercase}.flow-pause-alert h2{margin:0;font-size:24px;line-height:1.15}.flow-pause-alert p{margin:0;font-size:14px;line-height:1.5}.flow-pause-alert-hint{color:#49666a}.flow-pause-alert button{justify-self:end;min-width:110px;border:1px solid #2f6f73;background:#2f6f73;color:#fffdf8}.flow-pause-alert button:hover{background:#245c60}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:10px}.harness-stage{display:grid;gap:8px}.harness-panel-header{display:flex;justify-content:space-between;gap:8px;align-items:center}.harness-panel-header h2,.harness-panel-header p,.harness-result p{margin-bottom:0}.harness-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-file-list-title{margin:0;font-size:12px}.harness-file-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-file-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;border:1px solid #ece5d9;border-radius:6px;padding:6px 8px;background:#fffdfa}.harness-file-list span{overflow:hidden;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.harness-changes,.harness-result{border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-changes h3{margin:0 0 4px;font-size:12px}.harness-changes ul,.harness-result ul{margin:0;padding-left:18px}.harness-bootstrap-session{display:grid;gap:8px;border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-bootstrap-session>div:first-child{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.harness-bootstrap-session span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);background:#1f242b94;padding:14px}.harness-bootstrap-modal-surface{min-width:0;min-height:0;display:grid;grid-template-rows:auto minmax(0,1fr);gap:10px;border:1px solid #b9b0a1;border-radius:8px;background:#fffdf8;box-shadow:0 22px 64px #1f242b47;padding:10px}.harness-bootstrap-modal-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-bootstrap-modal-header p{max-width:min(720px,70vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.harness-bootstrap-terminal{min-width:0;min-height:0;display:grid}.task-create form{display:grid;gap:8px}.task-create-preview{display:grid;gap:2px;border:1px solid #e0d6c7;border-radius:6px;background:#f8f7f2;padding:6px 8px}.task-create-option{display:flex;align-items:center;gap:8px;color:#1f242b;font-size:13px;font-weight:700}.task-create-option input{width:16px;height:16px;margin:0}.task-create-preview span{color:#255f3d;font-size:12px;font-weight:700}.task-create-preview small{overflow:hidden;color:#687273;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.task-nav{display:grid;gap:8px}.task-nav-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left}.task-nav-item.is-active,.role-tab.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings{display:grid;gap:8px}.sidebar-settings button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.sidebar-settings .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings .theme-mode-toggle span:last-child{font-weight:750}.settings-select-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;font-size:13px;color:#5f6a6c}.settings-select-row select{min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326}.settings-status-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;border:1px solid #d4cec3;border-radius:6px;background:#fffdf8;padding:6px 10px;color:#5f6a6c;font-size:13px}.settings-status-row strong{color:#202326;font-size:12px}.task-status-dock{display:grid;gap:10px;margin-top:auto;border-top:1px solid #d3c9b8;padding-top:10px}.task-status-dock-title,.current-round-title{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.task-status-dock-title strong{overflow:hidden;font-size:13px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.task-status-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0}.task-status-stats div,.current-round-status{min-width:0;border:1px solid #e0d6c7;border-radius:6px;background:#fffdfa}.task-status-stats div{padding:6px 7px}.task-status-stats dt{color:#6c6255;font-size:10px;font-weight:700;text-transform:uppercase}.task-status-stats dd{margin:0;overflow:hidden;color:#1f242b;font-size:12px;font-weight:750;text-overflow:ellipsis;white-space:nowrap}.current-round-status{display:grid;gap:8px;padding:8px}.current-round-title span:first-child{color:#3a4647;font-size:12px;font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(120px,max-content) minmax(420px,1fr) auto;gap:10px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.workspace-header-actions{display:flex;gap:8px;align-items:center;justify-content:flex-end;min-width:max-content}.role-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:6px;margin-bottom:8px;min-width:0}.workspace-header .role-tabs{margin-bottom:0}.role-tab{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:30px;padding:4px 8px;text-align:left}.workspace-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1;gap:10px;align-items:stretch;min-height:0}.workspace-main{min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px}.role-console-stack{min-width:0;min-height:0;flex:1;display:flex;flex-direction:column}.role-console-panel{min-width:0;min-height:0;flex:1;display:none}.role-console-panel.is-active{display:flex;flex-direction:column}.session-console,.message-panel,.event-log,.empty-workspace{border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:10px}.task-workspace{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0}.session-console{display:flex;flex-direction:column;flex:1;height:100%;min-height:0}.session-controls{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;justify-content:flex-start;min-width:0;margin:0;overflow:hidden}.session-option-field{display:grid;grid-template-columns:auto minmax(120px,1fr);flex:0 1 210px;gap:5px;align-items:center;min-width:0}.permission-mode-field{flex-basis:250px}.model-field{flex-basis:220px}.effort-field{grid-template-columns:auto minmax(92px,1fr);flex-basis:150px}.session-option-field span{color:#5f6a6c;font-size:11px;font-weight:650;line-height:1;white-space:nowrap}.session-option-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.session-option-field select{width:100%;min-width:0;min-height:26px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:2px 7px;font-size:12px}.session-toolbar{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:5px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:26px;padding:2px 8px;font-size:12px}.orchestration-toggle{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:30px;border:1px solid #b5bec4;border-radius:6px;background:#fffefa;color:#4f5558;font-size:12px;font-weight:650;padding:3px 10px;white-space:nowrap}.orchestration-toggle strong{font-size:11px;text-transform:uppercase}.orchestration-toggle.is-active{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);flex:1;min-width:0;min-height:0;height:100%}.session-console-body.has-translation{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:stretch}.terminal-pane,.translation-pane{display:grid;min-width:0;min-height:0;height:100%}.terminal-pane{grid-template-rows:auto minmax(0,1fr);gap:8px}.translation-pane{grid-template-rows:minmax(0,1fr)}.terminal-frame,.terminal-empty{width:100%;height:100%;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.terminal-empty{display:grid;place-items:center;align-content:center;gap:8px;color:#d6d0c6;border:1px solid #292d31}.translation-panel{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0;border:1px solid #292d31;border-radius:6px;background:#0d1117;color:#d6deeb;padding:8px;min-width:0;width:100%;overflow:hidden;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-backdrop{background:#010409b8}.translation-file-browser-backdrop{z-index:24}.file-translation-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:95vw;height:95vh;min-height:0;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 28px 80px #0000008f;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-header{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;min-width:0}.file-translation-header h2,.file-translation-header p{margin-bottom:0}.file-translation-header h2{font-size:18px}.file-translation-header p{color:#8b949e;font-size:12px}.file-translation-toolbar{display:flex;flex-wrap:wrap;gap:6px}.file-translation-toolbar button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.file-translation-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.file-translation-list,.file-translation-preview{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:8px}.file-translation-list{display:grid;align-content:start;gap:6px}.file-translation-item{display:grid;gap:3px;width:100%;min-width:0;border:1px solid #292d31;border-radius:6px;background:#111820;color:#d6deeb;padding:6px;text-align:left}.file-translation-item strong,.file-translation-item span{overflow-wrap:anywhere}.file-translation-item span{color:#8b949e;font-size:11px}.file-translation-item.is-active{border-color:#58a6ff;background:#142033}.file-translation-preview header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-bottom:8px;color:#8b949e;font-size:12px}.file-translation-preview{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;padding:10px}.file-translation-preview .translation-markdown{min-height:0;overflow:auto;padding-right:4px;font-size:13px;line-height:1.62}.file-translation-preview>.muted{align-self:center;justify-self:center;text-align:center}.translation-file-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:min(880px,calc(100vw - 32px));max-height:min(760px,calc(100vh - 48px));min-height:520px;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 24px 70px #0000007a;font-family:Menlo,Monaco,Consolas,monospace}.translation-file-browser-modal header,.translation-file-browser-controls,.translation-file-browser-nav,.translation-file-browser-search{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.translation-file-browser-modal header{justify-content:space-between}.translation-file-browser-modal h2,.translation-file-browser-modal h3,.translation-file-browser-modal p{margin-bottom:0}.translation-file-browser-modal h2{font-size:17px}.translation-file-browser-modal h3{color:#8b949e;font-size:12px;font-weight:600}.translation-file-browser-modal p{color:#8b949e;font-size:12px;overflow-wrap:anywhere}.translation-file-browser-controls{justify-content:space-between}.translation-file-browser-search{flex:1 1 320px;justify-content:flex-end}.translation-file-browser-search input{flex:1 1 180px;min-width:0}.translation-file-browser-modal button,.translation-file-browser-modal input{border:1px solid #3a4149;border-radius:6px;background:#111820;color:#d6deeb;min-height:30px;padding:4px 8px;font:inherit;font-size:12px}.translation-file-browser-modal button:hover:not(:disabled){border-color:#58a6ff;background:#162235}.translation-file-browser-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.42fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.translation-file-browser-list,.translation-file-browser-selection{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:10px}.translation-file-browser-group{display:grid;align-content:start;gap:6px;margin-bottom:12px}.translation-file-browser-entry{display:grid;grid-template-columns:38px minmax(0,1fr);gap:3px 8px;width:100%;min-width:0;text-align:left}.translation-file-browser-entry span{grid-row:span 2;align-self:center;color:#8b949e;font-size:11px}.translation-file-browser-entry strong,.translation-file-browser-entry small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.translation-file-browser-entry small{color:#8b949e}.translation-file-browser-entry.is-selected{border-color:#58a6ff;background:#142033}.translation-file-browser-selection{display:grid;align-content:start;gap:12px}.translation-file-browser-selection label{display:grid;gap:5px}.translation-file-browser-selection span{color:#8b949e;font-size:12px}.translation-file-browser-selection input{width:100%;min-width:0}.translation-panel-header{display:grid;flex:0 0 auto;gap:3px}.translation-panel-titlebar,.translation-panel-actions,.translation-status-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:space-between}.translation-panel-header h2,.translation-panel-header p{margin-bottom:0}.translation-panel-titlebar h2{font-size:16px}.translation-panel-header p,.translation-composer span{color:#8b949e;font-size:12px}.translation-panel-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.translation-panel-actions button:hover:not(:disabled),.translation-composer-actions button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}.translation-panel-actions{justify-content:flex-end}.translation-status-row{flex-wrap:nowrap}.translation-status-row p:last-child{flex:0 0 auto;text-align:right}.translation-entry-list{display:grid;flex:1 1 auto;align-content:start;gap:8px;min-height:0;min-width:0;overflow-x:hidden;overflow-y:auto;scrollbar-color:#4b5563 #0d1117}.translation-entry{border:0;border-radius:0;background:transparent;min-width:0;max-width:100%;padding:0}.translation-conversation-boundary{display:grid;grid-template-columns:minmax(18px,1fr) auto auto auto minmax(18px,1fr);gap:8px;align-items:center;color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.4;white-space:nowrap}.translation-boundary-dash{min-width:0;border-top:1px dashed #3a4149}.translation-entry.is-user-input{border-top:4px solid #3a4149;margin-top:14px;padding-top:14px}.translation-entry.is-user-input:first-child{margin-top:0}.translation-entry pre{box-sizing:border-box;margin:0;max-height:none;max-width:100%;min-width:0;overflow:visible;white-space:pre-wrap;overflow-wrap:anywhere;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.45;color:#d6deeb}.translation-markdown{max-width:100%;min-width:0;color:#d6deeb;font-size:12px;line-height:1.55;overflow-wrap:anywhere}.translation-markdown>:first-child{margin-top:0}.translation-markdown>:last-child{margin-bottom:0}.translation-markdown p,.translation-markdown ul,.translation-markdown ol,.translation-markdown blockquote,.translation-markdown pre,.translation-markdown table{margin:0 0 8px}.translation-markdown h1,.translation-markdown h2,.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{margin:10px 0 6px;color:#f0f6fc;font-weight:700;line-height:1.25}.translation-markdown h1{font-size:17px}.translation-markdown h2{font-size:15px}.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{font-size:13px}.translation-markdown ul,.translation-markdown ol{padding-left:22px}.translation-markdown li{margin:2px 0}.translation-markdown .task-list-item{list-style:none}.translation-markdown input[type=checkbox]{width:13px;height:13px;margin:0 6px 0 0;accent-color:#56d364}.translation-markdown blockquote{border-left:3px solid #3a4149;color:#b7c0ca;padding-left:10px}.translation-markdown a{color:#79c0ff}.translation-markdown code{border-radius:4px;background:#161b22;color:#f0f6fc;padding:1px 4px;font-family:Menlo,Monaco,Consolas,monospace;font-size:.95em}.translation-markdown pre{overflow-x:auto;border:1px solid #292d31;border-radius:6px;background:#111316;padding:8px;white-space:pre}.translation-markdown pre code{background:transparent;padding:0}.translation-markdown table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse}.translation-markdown img{max-width:100%;border-radius:4px}.translation-markdown th,.translation-markdown td{border:1px solid #30363d;padding:4px 6px;text-align:left;vertical-align:top}.translation-markdown hr{border:0;border-top:1px solid #292d31;margin:10px 0}.translation-entry.is-tool-output pre{display:block;overflow:hidden;color:#7d8590;text-overflow:ellipsis;white-space:nowrap;width:100%}.translation-entry-note{margin:2px 0 0;color:#6e7681;font-size:10px;line-height:1.35}.translation-entry-note.is-error{color:#a3715f}.translation-composer{display:grid;flex:0 0 auto;gap:6px;border-top:1px solid #292d31;padding-top:8px}.translation-composer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.translation-composer textarea{width:100%;min-height:38px;max-height:88px;border-color:#3a4149;background:#0d1117;color:#d6deeb;font-family:inherit;font-size:12px;line-height:1.35;resize:vertical}.translation-composer textarea::placeholder{color:#7d8590}.translation-composer textarea::selection{background:#8b949e59;color:#fff}.translation-composer textarea:focus,.translation-composer textarea:focus-visible{border-color:#4b5563;outline:none;box-shadow:none}.translation-composer-actions{display:grid;align-content:start;gap:6px;min-width:104px}.translation-composer-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;width:100%;min-height:38px;padding:4px 9px;font-size:12px}.translation-panel .muted{color:#8b949e}.translation-panel .error-banner{flex:0 0 auto;border-color:#da7b72;background:#2d1518;color:#ffdcd7}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#181c1f61;padding:18px}.translator-session-backdrop{background:#010409b8}.translator-session-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;width:95vw;height:92vh;min-width:0;min-height:0;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:10px}.translator-session-header{display:flex;gap:10px;align-items:center;justify-content:space-between;min-width:0}.translator-session-header h2,.translator-session-header p{margin-bottom:0}.translator-session-header p{color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translator-session-terminal{min-width:0;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.gateway-qr-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:14px;width:min(520px,100%);max-height:min(720px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:16px}.message-modal,.event-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:hidden;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.gateway-qr-modal header,.message-modal header,.event-modal header,.gateway-qr-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.gateway-qr-modal h2,.gateway-qr-modal p{margin-bottom:0}.gateway-qr-modal-body{display:grid;gap:14px;justify-items:center}.gateway-qr-code-frame{display:grid;place-items:center;width:min(360px,100%);aspect-ratio:1;border:1px solid #d6d0c6;border-radius:8px;background:#fff;padding:18px}.gateway-qr-code-frame img{display:block;width:100%;height:auto}.gateway-qr-placeholder{color:#667071;text-align:center}.gateway-qr-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;width:100%;margin:0}.gateway-qr-meta div{min-width:0;border:1px solid #ece5d9;border-radius:6px;padding:8px}.gateway-qr-meta dt{color:#6c6255;font-size:11px;font-weight:700;text-transform:uppercase}.gateway-qr-meta dd{margin:0;overflow-wrap:anywhere;font-size:13px}.message-modal h2,.message-modal p,.event-modal h2,.event-modal p{margin-bottom:0}.translation-test-result{border-radius:6px;padding:8px;font-size:13px}.translation-test-result.is-ok{border:1px solid #6ea77e;background:#e6f3e9;color:#245334}.translation-test-result.is-error{border:1px solid #c46e5f;background:#fae9e6;color:#6f2b21}.message-panel{display:grid;gap:8px}.message-modal .message-panel,.event-modal .event-log{min-height:0;overflow:auto;border:0;background:transparent;padding:0}.message-panel-header{display:flex;justify-content:space-between;gap:12px;align-items:center}.message-panel-header h2,.message-panel-header p{margin-bottom:0}.message-controls,.message-mode-toggle,.modal-actions,.message-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.message-mode-toggle{color:#4f5558;font-size:13px;font-weight:650}.message-mode-toggle input{width:auto}.message-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.message-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid #ece5d9;border-radius:6px;padding:8px;background:#fffdfa}.message-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:4px}.message-meta time,.message-meta span:not(.status-badge),.message-reason,.message-path{color:#667071;font-size:12px}.message-sequence{min-width:32px;color:#1f242b;font-weight:800}.message-actions button{min-height:30px;padding:4px 10px}.message-item p{display:-webkit-box;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.message-reason,.message-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log ol{margin:0;padding-left:22px;font-size:13px}.event-log{max-height:92px;overflow:auto}.event-log h2{margin-bottom:4px;font-size:13px}.event-log p{margin-bottom:0}.event-log li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:66px;min-height:20px;border-radius:999px;padding:2px 8px;border:1px solid #c7c1b8;background:#f2eee7;color:#4f5558;font-size:11px;white-space:nowrap}.status-active,.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-created,.status-idle,.status-disabled{border-color:#9aa3a8;background:#edf0f1;color:#465056}.status-blocked,.status-crashed,.status-missing,.status-empty{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-waiting,.status-starting,.status-incomplete{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-exited,.status-done,.status-stopped,.status-resumable,.status-skipped,.status-overridden,.status-not_required{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.status-queued,.status-translating,.status-ready,.status-create,.status-insert,.status-update{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-rejected,.status-failed,.status-delivery_failed,.status-response_ready_missing_result,.status-cancelled,.status-blocked{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-pending{border-color:#c7c1b8;background:#f2eee7;color:#4f5558}.status-translated,.status-preserved{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.empty-workspace{max-width:680px}@media(max-width:980px){.app-shell,.workspace-grid{grid-template-columns:1fr}.app-sidebar{border-right:0;border-bottom:1px solid #d3c9b8}.role-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}.session-console-body.has-translation,.translation-file-browser-layout{grid-template-columns:1fr}.session-controls,.session-toolbar{flex-wrap:wrap;overflow:visible}.file-translation-modal{width:95vw;height:95vh;padding:10px}.file-translation-layout{grid-template-columns:minmax(180px,240px) minmax(0,1fr)}.translation-file-browser-modal{min-height:0}}@media(max-width:700px){.file-translation-layout{grid-template-columns:1fr;grid-template-rows:minmax(140px,28vh) minmax(0,1fr)}.file-translation-header{align-items:stretch}.file-translation-toolbar{width:100%}.file-translation-toolbar button{flex:1 1 auto}}@media(max-width:560px){.app-main,.app-sidebar{padding:12px}.workspace-header,.inline-form,.inline-form.has-recent-paths{grid-template-columns:1fr;display:grid}.role-tabs{grid-template-columns:1fr}.terminal-frame,.terminal-empty{min-height:300px;height:54vh}.session-option-field{grid-template-columns:1fr;width:100%}.translation-file-browser-modal{width:calc(100vw - 20px);max-height:calc(100vh - 20px);padding:10px}.file-translation-modal{width:calc(100vw - 12px);height:calc(100vh - 12px)}.translation-file-browser-controls,.translation-file-browser-search{display:grid;grid-template-columns:1fr}}.harness-bootstrap-terminal .terminal-frame{height:100%;min-height:0}:root[data-theme=dark]{color-scheme:dark;background:#0d1117;color:#e6edf3}:root[data-theme=dark] body,:root[data-theme=dark] .app-main{background:#0d1117;color:#e6edf3}:root[data-theme=dark] button{border-color:#3d4652;background:#161b22;color:#e6edf3}:root[data-theme=dark] button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}:root[data-theme=dark] input,:root[data-theme=dark] select,:root[data-theme=dark] textarea:not(.xterm-helper-textarea){border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] input::placeholder,:root[data-theme=dark] textarea::placeholder{color:#7d8590}:root[data-theme=dark] .danger-button{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .danger-button:hover:not(:disabled){border-color:#ffa198;background:#3d1f23}:root[data-theme=dark] .app-sidebar{border-color:#30363d;background:#0f141b}:root[data-theme=dark] .sidebar-toggle{background:#161b22}:root[data-theme=dark] .brand-header span,:root[data-theme=dark] .muted,:root[data-theme=dark] .message-meta time,:root[data-theme=dark] .message-meta span:not(.status-badge),:root[data-theme=dark] .message-reason,:root[data-theme=dark] .message-path{color:#8b949e}:root[data-theme=dark] .sidebar-section,:root[data-theme=dark] .session-console,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .gateway-qr-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .gateway-qr-code-frame,:root[data-theme=dark] .gateway-qr-meta div{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .gateway-qr-code-frame{background:#f6f8fa}:root[data-theme=dark] .gateway-qr-meta dt,:root[data-theme=dark] .gateway-qr-placeholder{color:#8b949e}:root[data-theme=dark] .sidebar-section-toggle{color:#e6edf3}:root[data-theme=dark] .sidebar-section-toggle:hover{background:#161b22}:root[data-theme=dark] .sidebar-section-toggle[aria-expanded=true]{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .session-option-field small,:root[data-theme=dark] .task-create-preview small{color:#8b949e}:root[data-theme=dark] .warnings,:root[data-theme=dark] .error-banner{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .flow-pause-alert-backdrop{background:#010409b8}:root[data-theme=dark] .flow-pause-alert{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 28px 72px #0104099e}:root[data-theme=dark] .flow-pause-alert-kicker,:root[data-theme=dark] .flow-pause-alert-hint{color:#9debf2}:root[data-theme=dark] .flow-pause-alert button{border-color:#56d4dd;background:#56d4dd;color:#061114}:root[data-theme=dark] .flow-pause-alert button:hover{background:#84f3fa}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .harness-bootstrap-session,:root[data-theme=dark] .gateway-qr img,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .task-status-stats div,:root[data-theme=dark] .current-round-status,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .harness-bootstrap-modal{background:#010409b8}:root[data-theme=dark] .harness-bootstrap-modal-surface{border-color:#30363d;background:#0d1117;box-shadow:0 22px 64px #0104099e}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-status-dock{border-color:#30363d}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .task-status-stats dt{color:#8b949e}:root[data-theme=dark] .task-status-stats dd,:root[data-theme=dark] .current-round-title span:first-child{color:#e6edf3}:root[data-theme=dark] .message-sequence{color:#f0f6fc}:root[data-theme=dark] .task-nav-item.is-active,:root[data-theme=dark] .role-tab.is-active,:root[data-theme=dark] .sidebar-settings .settings-toggle.is-active,:root[data-theme=dark] .gateway-actions .settings-toggle.is-active,:root[data-theme=dark] .orchestration-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .orchestration-toggle{border-color:#3d4652;background:#161b22;color:#b7c0ca}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .settings-select-row{color:#b7c0ca}:root[data-theme=dark] .terminal-empty{border-color:#30363d}:root[data-theme=dark] .modal-backdrop{background:#010409b8}:root[data-theme=dark] .message-modal .message-panel,:root[data-theme=dark] .event-modal .event-log{background:transparent}:root[data-theme=dark] .status-badge{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-ok,:root[data-theme=dark] .status-active,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-created,:root[data-theme=dark] .status-idle,:root[data-theme=dark] .status-disabled{border-color:#69717d;background:#20262f;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-error,:root[data-theme=dark] .status-blocked,:root[data-theme=dark] .status-crashed,:root[data-theme=dark] .status-missing,:root[data-theme=dark] .status-empty,:root[data-theme=dark] .status-rejected,:root[data-theme=dark] .status-failed,:root[data-theme=dark] .status-delivery_failed,:root[data-theme=dark] .status-response_ready_missing_result,:root[data-theme=dark] .status-cancelled{border-color:#f85149;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .status-waiting,:root[data-theme=dark] .status-starting,:root[data-theme=dark] .status-incomplete,:root[data-theme=dark] .status-queued,:root[data-theme=dark] .status-translating,:root[data-theme=dark] .status-ready,:root[data-theme=dark] .status-create,:root[data-theme=dark] .status-insert,:root[data-theme=dark] .status-update{border-color:#d29922;background:#2d2208;color:#f8e3a1}:root[data-theme=dark] .status-exited,:root[data-theme=dark] .status-done,:root[data-theme=dark] .status-stopped,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-skipped,:root[data-theme=dark] .status-overridden,:root[data-theme=dark] .status-not_required,:root[data-theme=dark] .status-translated,:root[data-theme=dark] .status-preserved{border-color:#388bfd;background:#10223a;color:#c9e2ff}:root[data-theme=dark] .status-pending{border-color:#3d4652;background:#161b22;color:#d6deeb}
|
package/dist-frontend/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>VibeCodingMaster</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-C2xTNLmb.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Cfum1Prr.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -16,7 +16,7 @@ and interactive conversation conventions.
|
|
|
16
16
|
|
|
17
17
|
The existing translation panel should remain the main UI. Conversation
|
|
18
18
|
translation keeps the current panel behavior, and file translation is added as
|
|
19
|
-
an
|
|
19
|
+
an opened file-translation modal from the Translation sidebar. The backend source of translated text
|
|
20
20
|
changes from an API provider to Codex Translator.
|
|
21
21
|
|
|
22
22
|
## 2. Core Direction
|
|
@@ -27,8 +27,8 @@ Add a new Codex role:
|
|
|
27
27
|
codex-translator
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
The role is responsible for both project-level file translation and
|
|
31
|
-
conversation translation. It should:
|
|
30
|
+
The role is responsible for both project-level file translation and temporary
|
|
31
|
+
conversation translation jobs. It should:
|
|
32
32
|
|
|
33
33
|
- read the target source file and relevant project context
|
|
34
34
|
- maintain durable translation memory files
|
|
@@ -36,7 +36,7 @@ conversation translation. It should:
|
|
|
36
36
|
`<baseRepoRoot>/.ai/vcm/translations/`
|
|
37
37
|
- write only the exact output paths assigned by VCM
|
|
38
38
|
- record file metadata so unchanged files are not translated repeatedly
|
|
39
|
-
- support
|
|
39
|
+
- support retry or retranslation after interruption
|
|
40
40
|
- produce a translation report with required light QA checks
|
|
41
41
|
- translate short conversation items sent by VCM and write the translated text to
|
|
42
42
|
VCM-assigned temporary result files
|
|
@@ -52,8 +52,8 @@ legacy test/diagnostic fallback when Codex Translator is not wired into the
|
|
|
52
52
|
server.
|
|
53
53
|
|
|
54
54
|
Codex Translator is not part of the Claude Code PM/architect/coder/reviewer
|
|
55
|
-
workflow. It is a project utility role
|
|
56
|
-
|
|
55
|
+
workflow. It is a project utility role with its own long-lived terminal
|
|
56
|
+
session, permissions, output paths, and task semantics.
|
|
57
57
|
|
|
58
58
|
## 3. Why Codex Session Translation
|
|
59
59
|
|
|
@@ -69,7 +69,7 @@ Codex session translation improves this because:
|
|
|
69
69
|
- the session can inspect the whole repository and the whole source document
|
|
70
70
|
- Codex can keep a long conversation state and use its normal context
|
|
71
71
|
compaction behavior
|
|
72
|
-
- durable memory files can preserve decisions across session compaction,
|
|
72
|
+
- durable memory files can preserve decisions across session compaction, VCM
|
|
73
73
|
restarts, and future translation jobs
|
|
74
74
|
- translation output can be written to files instead of returned through one
|
|
75
75
|
very large API response
|
|
@@ -92,15 +92,17 @@ model. Their lifecycles are still different:
|
|
|
92
92
|
|
|
93
93
|
| Translation type | Purpose | Root | Lifecycle | Cleanup |
|
|
94
94
|
| --- | --- | --- | --- | --- |
|
|
95
|
-
| Translation bootstrap | First-run project understanding and memory initialization | `<baseRepoRoot>/.ai/vcm/translations/bootstrap/` plus temporary runtime files | Long-term index and memory, temporary run files | Runtime files are deleted after completion |
|
|
96
|
-
| File translation | Project documents, whitepapers, specs, long-form artifacts | `<baseRepoRoot>/.ai/vcm/translations/files/completed/` | Long-term project-local state | Completed outputs survive; request/progress/report files are deleted after completion |
|
|
97
|
-
| Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations
|
|
95
|
+
| Translation bootstrap | First-run project understanding and memory initialization | `<baseRepoRoot>/.ai/vcm/translations/bootstrap/` plus temporary runtime files | Long-term index and memory, temporary run files | Runtime files are deleted on VCM startup and after completion |
|
|
96
|
+
| File translation | Project documents, whitepapers, specs, long-form artifacts | `<baseRepoRoot>/.ai/vcm/translations/files/completed/` | Long-term project-local state | Completed outputs survive; request/progress/report/chunk files are deleted on VCM startup and after completion |
|
|
97
|
+
| Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...` | Project-level runtime cache | Deleted on VCM startup or after the translated result is consumed |
|
|
98
98
|
| Translation memory | Shared terminology and style rules | `<baseRepoRoot>/.ai/vcm/translations/memory/` | Long-term project-local state | Survives task cleanup and worktree deletion |
|
|
99
|
+
| Translator session | Long-lived Codex Translator terminal/session metadata | `<baseRepoRoot>/.ai/vcm/translations/session.json` | Project-level durable state | Survives VCM startup cleanup so VCM can resume the prior Codex session |
|
|
99
100
|
|
|
100
101
|
Recommended layout:
|
|
101
102
|
|
|
102
103
|
```text
|
|
103
104
|
<baseRepoRoot>/.ai/vcm/translations/
|
|
105
|
+
session.json
|
|
104
106
|
memory/
|
|
105
107
|
glossary.md
|
|
106
108
|
style-guide.md
|
|
@@ -114,7 +116,6 @@ Recommended layout:
|
|
|
114
116
|
<translated-file-id>.md
|
|
115
117
|
runtime/
|
|
116
118
|
queue.json
|
|
117
|
-
session.json
|
|
118
119
|
bootstrap/
|
|
119
120
|
runs/
|
|
120
121
|
<bootstrap-id>/
|
|
@@ -129,18 +130,17 @@ Recommended layout:
|
|
|
129
130
|
output.md
|
|
130
131
|
report.md
|
|
131
132
|
conversations/
|
|
132
|
-
|
|
133
|
-
<
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
result.txt
|
|
138
|
-
report.md
|
|
133
|
+
jobs/
|
|
134
|
+
<translation-id>/
|
|
135
|
+
request.json
|
|
136
|
+
result.txt
|
|
137
|
+
report.md
|
|
139
138
|
```
|
|
140
139
|
|
|
141
|
-
Files under `runtime/` are working state.
|
|
142
|
-
|
|
143
|
-
|
|
140
|
+
Files under `runtime/` are temporary working state. VCM deletes the entire
|
|
141
|
+
`translations/runtime/` tree on startup for recent or connected projects.
|
|
142
|
+
Completed file translations are moved into `files/completed/`; the matching
|
|
143
|
+
runtime job directory is also deleted after validation.
|
|
144
144
|
|
|
145
145
|
The root is intentionally under `<baseRepoRoot>`, not `<taskRepoRoot>`. In
|
|
146
146
|
worktree-backed tasks, `<taskRepoRoot>` points at
|
|
@@ -148,9 +148,10 @@ worktree-backed tasks, `<taskRepoRoot>` points at
|
|
|
148
148
|
closed. Translation state must not be split between the base repo and task
|
|
149
149
|
worktrees.
|
|
150
150
|
|
|
151
|
-
Conversation translation entries are temporary. VCM
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
Conversation translation entries are temporary. VCM removes matching runtime
|
|
152
|
+
conversation files after their result JSON has been consumed and removes all
|
|
153
|
+
runtime conversation files on startup. Startup cleanup must not remove
|
|
154
|
+
`translations/files/completed/` or `translations/memory/`.
|
|
154
155
|
|
|
155
156
|
All translation state is local VCM state and is normally ignored by git through
|
|
156
157
|
`.ai/vcm/`. If the user wants a translated file committed to the project, VCM
|
|
@@ -158,8 +159,8 @@ should provide an explicit export or copy step.
|
|
|
158
159
|
|
|
159
160
|
Implementation rule: every translation service must resolve
|
|
160
161
|
`<baseRepoRoot>/.ai/vcm/translations/` from the connected project base root.
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
Conversation translation runtime paths must not be namespaced by task, source
|
|
163
|
+
role, or task worktree root.
|
|
163
164
|
|
|
164
165
|
## 5. Translation Memory
|
|
165
166
|
|
|
@@ -312,13 +313,16 @@ User enables translation
|
|
|
312
313
|
```
|
|
313
314
|
|
|
314
315
|
Bootstrap should be rerunnable. A rerun creates a new bootstrap id and preserves
|
|
315
|
-
|
|
316
|
-
memory
|
|
316
|
+
durable memory files and completed-run index history; runtime reports are
|
|
317
|
+
temporary. Codex may append new memory entries, but user corrections in memory
|
|
318
|
+
files override automatic bootstrap entries.
|
|
317
319
|
|
|
318
320
|
## 7. File Index And Replacement
|
|
319
321
|
|
|
320
|
-
`index.json`
|
|
321
|
-
|
|
322
|
+
`index.json` is the durable completed-translation index. It records only file
|
|
323
|
+
translations that passed validation and were moved into `files/completed/`.
|
|
324
|
+
Queued, running, failed, interrupted, and `needs_review` jobs stay under
|
|
325
|
+
`runtime/` and must not be written to this index.
|
|
322
326
|
|
|
323
327
|
Suggested schema shape:
|
|
324
328
|
|
|
@@ -331,7 +335,6 @@ Suggested schema shape:
|
|
|
331
335
|
"id": "whitepaper-v0-8-zh-20260614-001",
|
|
332
336
|
"sourcePath": "docs/whitepaper-v0.8.md",
|
|
333
337
|
"baseRepoRoot": "/absolute/base/repo/root",
|
|
334
|
-
"taskSlug": null,
|
|
335
338
|
"sourceHash": "sha256:...",
|
|
336
339
|
"sourceBytes": 449958,
|
|
337
340
|
"sourceMtimeMs": 1790000000000,
|
|
@@ -362,18 +365,19 @@ Replacement rules:
|
|
|
362
365
|
- Selecting `Translate` always creates a new file translation job for the
|
|
363
366
|
chosen source file and target language.
|
|
364
367
|
- If a completed translation already exists for the same `sourcePath`,
|
|
365
|
-
`targetLanguage`, and `translationProfile`, VCM keeps
|
|
366
|
-
job completes successfully.
|
|
367
|
-
|
|
368
|
-
|
|
368
|
+
`targetLanguage`, and `translationProfile`, VCM keeps the old completed file
|
|
369
|
+
and index entry on disk until the new job completes successfully. During the
|
|
370
|
+
run, the UI may show the latest runtime job by merging `runtime/queue.json`
|
|
371
|
+
with `files/index.json`, but the durable index itself is unchanged.
|
|
372
|
+
- After the new job passes validation, VCM writes the completed output for that
|
|
373
|
+
same file/language/profile, then replaces the superseded entry in
|
|
369
374
|
`files/index.json`.
|
|
370
375
|
- If the new job fails, is interrupted, or needs review, the previous completed
|
|
371
376
|
output remains intact.
|
|
372
377
|
- If the same file is selected from a task worktree, VCM should normalize the
|
|
373
378
|
source path back to the base repo path when possible; the long-term job still
|
|
374
379
|
belongs to `<baseRepoRoot>/.ai/vcm/translations/files/completed/`.
|
|
375
|
-
- Failed or interrupted jobs can be
|
|
376
|
-
section state.
|
|
380
|
+
- Failed or interrupted jobs can be retried by creating a new translation job.
|
|
377
381
|
|
|
378
382
|
## 8. Codex Translator Role
|
|
379
383
|
|
|
@@ -396,26 +400,25 @@ management pattern:
|
|
|
396
400
|
- start/resume/restart/stop terminal controls
|
|
397
401
|
- model and effort selectors
|
|
398
402
|
- hook-based running/idle state
|
|
399
|
-
-
|
|
400
|
-
- long-lived terminal session for follow-up discussion
|
|
403
|
+
- runtime Codex session id for the current VCM process
|
|
404
|
+
- long-lived terminal session for follow-up discussion until VCM is restarted
|
|
401
405
|
|
|
402
|
-
VCM
|
|
406
|
+
VCM stores the active translator session record at:
|
|
403
407
|
|
|
404
408
|
```text
|
|
405
|
-
<baseRepoRoot>/.ai/vcm/translations/
|
|
409
|
+
<baseRepoRoot>/.ai/vcm/translations/session.json
|
|
406
410
|
```
|
|
407
411
|
|
|
408
|
-
This record is project-level
|
|
409
|
-
session id, selected model, selected effort, terminal cwd,
|
|
410
|
-
activity state
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
old translation outputs intact.
|
|
412
|
+
This record is project-level durable session metadata, not task-level state. It
|
|
413
|
+
stores the Codex session id, selected model, selected effort, terminal cwd, and
|
|
414
|
+
hook activity state. VCM deletes `translations/runtime/` on startup, but must
|
|
415
|
+
keep this session record so reconnecting to a project can resume the previous
|
|
416
|
+
Codex Translator session when translation is enabled.
|
|
414
417
|
|
|
415
|
-
When a Codex hook has captured the real Codex `session_id`, `Resume`
|
|
416
|
-
`codex resume <session_id
|
|
417
|
-
|
|
418
|
-
|
|
418
|
+
When a Codex hook has captured the real Codex `session_id`, `Resume` may run
|
|
419
|
+
`codex resume <session_id>`. `Restart` stops the current runtime process,
|
|
420
|
+
creates a fresh Codex session id, overwrites this record, and keeps old
|
|
421
|
+
translation outputs intact.
|
|
419
422
|
|
|
420
423
|
Session identity is fixed by base repository. If VCM later supports multiple
|
|
421
424
|
parallel target-language translator sessions, split this file into a
|
|
@@ -562,7 +565,7 @@ Output contract:
|
|
|
562
565
|
prompt because conversation snippets are normally short.
|
|
563
566
|
- VCM still creates a temporary result file path before sending the prompt, for
|
|
564
567
|
example
|
|
565
|
-
`translations/runtime/conversations
|
|
568
|
+
`translations/runtime/conversations/jobs/<translation-id>/result.txt`.
|
|
566
569
|
- Codex Translator writes the translated text to that assigned result file.
|
|
567
570
|
- `Stop` marks the turn as finished; after `Stop`, VCM reads and validates the
|
|
568
571
|
assigned result file.
|
|
@@ -600,7 +603,7 @@ All translation work enters the same VCM-managed queue:
|
|
|
600
603
|
- conversation translation requests
|
|
601
604
|
- bootstrap runs
|
|
602
605
|
- retry requests
|
|
603
|
-
-
|
|
606
|
+
- retranslation requests
|
|
604
607
|
|
|
605
608
|
Queue rules:
|
|
606
609
|
|
|
@@ -645,7 +648,7 @@ Suggested queue item shape:
|
|
|
645
648
|
"items": [
|
|
646
649
|
{
|
|
647
650
|
"id": "queue-item-001",
|
|
648
|
-
"type": "bootstrap | file | conversation | retry |
|
|
651
|
+
"type": "bootstrap | file | conversation | retry | force-retranslate",
|
|
649
652
|
"status": "running",
|
|
650
653
|
"targetLanguage": "zh-CN",
|
|
651
654
|
"jobId": "whitepaper-v0-8-zh-20260614-001",
|
|
@@ -733,8 +736,8 @@ Completion rule:
|
|
|
733
736
|
structure, corrupted code blocks, invalid result metadata, or unresolved risky
|
|
734
737
|
choices, mark the job `needs_review`.
|
|
735
738
|
- If required output files are missing or unreadable, mark the job `failed`.
|
|
736
|
-
- `needs_review` jobs remain visible in the file list
|
|
737
|
-
retried
|
|
739
|
+
- `needs_review` jobs remain visible in the file list during the current VCM
|
|
740
|
+
runtime and can be retried or manually resolved.
|
|
738
741
|
|
|
739
742
|
## 14. Conversation Translation Workflow
|
|
740
743
|
|
|
@@ -801,7 +804,7 @@ Result handling:
|
|
|
801
804
|
result channel for that batch.
|
|
802
805
|
- VCM creates temporary runtime metadata and the result file contract under the
|
|
803
806
|
unified project translation root:
|
|
804
|
-
`<baseRepoRoot>/.ai/vcm/translations/runtime/conversations
|
|
807
|
+
`<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...`.
|
|
805
808
|
- The terminal response should only report completion, status, or diagnostics;
|
|
806
809
|
it must not print the full translated text.
|
|
807
810
|
- Conversation batch result files are plain text with exact numbered
|
|
@@ -936,10 +939,13 @@ on one giant prompt or one giant assistant response to translate the entire file
|
|
|
936
939
|
|
|
937
940
|
Resume behavior:
|
|
938
941
|
|
|
939
|
-
- If Codex session is still available
|
|
940
|
-
|
|
941
|
-
- If the
|
|
942
|
-
|
|
942
|
+
- If Codex session is still available in the current VCM process, continue in
|
|
943
|
+
the same session.
|
|
944
|
+
- If the terminal was stopped during the same VCM process, resume the Codex
|
|
945
|
+
session id when possible.
|
|
946
|
+
- After VCM restarts, do not resume runtime jobs or partial runtime outputs.
|
|
947
|
+
Start a fresh Codex Translator session and requeue the translation from the
|
|
948
|
+
durable source file or conversation source.
|
|
943
949
|
- Never replace a completed output until the new job has passed validation.
|
|
944
950
|
|
|
945
951
|
Cancellation and interruption behavior:
|
|
@@ -948,10 +954,11 @@ Cancellation and interruption behavior:
|
|
|
948
954
|
leave its request files for debugging.
|
|
949
955
|
- If the user stops Codex Translator, closes VCM, or the hook flow does not
|
|
950
956
|
return, mark the active item `interrupted` on the next state reconciliation.
|
|
951
|
-
- On VCM
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
957
|
+
- On VCM startup, delete `translations/runtime/` entirely. Do not resume
|
|
958
|
+
queued, dispatching, running, validating, failed, or interrupted runtime
|
|
959
|
+
jobs from a previous process.
|
|
960
|
+
- Startup cleanup also removes file-index entries that do not point at a
|
|
961
|
+
validated completed output under `translations/files/completed/`.
|
|
955
962
|
- Interrupted conversation translation requests should normally be retried from
|
|
956
963
|
the original request file because they are short and temporary.
|
|
957
964
|
- Manual resolve can mark an item completed only after the expected result file
|
|
@@ -974,13 +981,16 @@ Recommended UI:
|
|
|
974
981
|
- right pane: selected translated file content preview
|
|
975
982
|
- The view has a `Translate` action. Clicking it opens a file picker or path
|
|
976
983
|
selector and creates a file translation job for the chosen file.
|
|
977
|
-
- Selecting
|
|
978
|
-
output in the right pane. Runtime reports are only retained while a
|
|
979
|
-
queued, running, failed, or interrupted.
|
|
984
|
+
- Selecting a completed item in the left pane loads the completed translated
|
|
985
|
+
Markdown output in the right pane. Runtime reports are only retained while a
|
|
986
|
+
job is queued, running, failed, or interrupted.
|
|
980
987
|
- Existing translated files come from
|
|
981
|
-
`<baseRepoRoot>/.ai/vcm/translations/files/index.json
|
|
982
|
-
|
|
983
|
-
|
|
988
|
+
`<baseRepoRoot>/.ai/vcm/translations/files/index.json`; active and queued
|
|
989
|
+
jobs are derived from `runtime/queue.json` and their runtime `request.json`
|
|
990
|
+
files.
|
|
991
|
+
- The merged list should show at most one row for each
|
|
992
|
+
`sourcePath + targetLanguage + translationProfile`; runtime rows win over
|
|
993
|
+
completed rows while a retranslation is in progress.
|
|
984
994
|
|
|
985
995
|
Controls in the file translation view:
|
|
986
996
|
|
|
@@ -1059,11 +1069,12 @@ New backend pieces:
|
|
|
1059
1069
|
- validate file and conversation result files
|
|
1060
1070
|
- record promote metadata when users export translations into the repo tree
|
|
1061
1071
|
- translation queue service
|
|
1062
|
-
- enqueue bootstrap, file, conversation, retry, and
|
|
1072
|
+
- enqueue bootstrap, file, conversation, retry, and retranslation tasks
|
|
1063
1073
|
- persist `runtime/queue.json`
|
|
1064
1074
|
- persist queue item status
|
|
1065
1075
|
- ensure only one active Codex Translator task at a time
|
|
1066
|
-
-
|
|
1076
|
+
- delete startup runtime state instead of restoring interrupted state after
|
|
1077
|
+
VCM restart
|
|
1067
1078
|
- advance the queue only after hook completion and result-file validation
|
|
1068
1079
|
- start/resume Codex Translator
|
|
1069
1080
|
- send job prompt
|
|
@@ -1081,7 +1092,7 @@ New backend pieces:
|
|
|
1081
1092
|
- create job
|
|
1082
1093
|
- get job status
|
|
1083
1094
|
- read result/report
|
|
1084
|
-
-
|
|
1095
|
+
- retry/force retranslate
|
|
1085
1096
|
- cancel/skip/manual resolve queue items
|
|
1086
1097
|
- promote completed translations into explicit user-selected repo paths
|
|
1087
1098
|
- get conversation translation request status when needed for debugging
|
|
@@ -1131,7 +1142,7 @@ Conversation translation and file translation may share translation settings UI
|
|
|
1131
1142
|
concepts such as target language and style. They share
|
|
1132
1143
|
`<baseRepoRoot>/.ai/vcm/translations/` and `translations/memory/`, but runtime
|
|
1133
1144
|
state stays under `translations/runtime/`: conversation results are temporary
|
|
1134
|
-
under `runtime/conversations
|
|
1145
|
+
under `runtime/conversations/`, while completed file results are
|
|
1135
1146
|
durable under `translations/files/completed/`.
|
|
1136
1147
|
|
|
1137
1148
|
## 20. Implementation Phases
|
|
@@ -1143,6 +1154,8 @@ durable under `translations/files/completed/`.
|
|
|
1143
1154
|
- Add the unified `.ai/vcm/translations/` directory contract, including
|
|
1144
1155
|
`runtime/queue.json`, `memory/`, `bootstrap/`, `files/completed/`, and
|
|
1145
1156
|
`runtime/conversations/`.
|
|
1157
|
+
- Define `runtime/` as startup-cleaned temporary state; only memory, completed
|
|
1158
|
+
files, and durable indexes survive VCM restart.
|
|
1146
1159
|
- Define index, request, progress, report, queue, and conversation result
|
|
1147
1160
|
schemas.
|
|
1148
1161
|
- Define memory file format, bootstrap candidate discovery, scan budgets, and
|
|
@@ -1158,10 +1171,10 @@ durable under `translations/files/completed/`.
|
|
|
1158
1171
|
|
|
1159
1172
|
- Implement bootstrap state, candidate discovery, and bootstrap run creation.
|
|
1160
1173
|
- Implement source hash and de-duplication.
|
|
1161
|
-
- Implement job create/list/read/
|
|
1174
|
+
- Implement job create/list/read/retranslate.
|
|
1162
1175
|
- Implement the shared translation queue and persist `runtime/queue.json`.
|
|
1163
1176
|
- Implement result-file validation for file and conversation translation.
|
|
1164
|
-
- Implement
|
|
1177
|
+
- Implement startup runtime cleanup and durable-index pruning on VCM restart.
|
|
1165
1178
|
- Persist completed file outputs under
|
|
1166
1179
|
`<baseRepoRoot>/.ai/vcm/translations/files/completed/`.
|
|
1167
1180
|
- Persist active queue, file/bootstrap request files, and conversation
|
|
@@ -1173,10 +1186,13 @@ durable under `translations/files/completed/`.
|
|
|
1173
1186
|
|
|
1174
1187
|
### Phase 3: Codex Session Integration
|
|
1175
1188
|
|
|
1176
|
-
- Add `codex-translator`
|
|
1177
|
-
-
|
|
1178
|
-
sessions by translation profile.
|
|
1179
|
-
-
|
|
1189
|
+
- Add project-scoped `codex-translator` session support.
|
|
1190
|
+
- Keep session identity by `<baseRepoRoot> + targetLanguage`; do not split
|
|
1191
|
+
sessions by task, worktree, source role, or translation profile.
|
|
1192
|
+
- Persist the translator session record at `.ai/vcm/translations/session.json`
|
|
1193
|
+
so VCM can resume it after reconnecting to the project.
|
|
1194
|
+
- Reuse Codex embedded terminal startup with model/effort selectors in the
|
|
1195
|
+
translator session modal.
|
|
1180
1196
|
- Add hook endpoints and running/idle tracking.
|
|
1181
1197
|
- Send translation job prompts into the long-lived Codex session.
|
|
1182
1198
|
- Ensure hook completion advances only the active queue item.
|
|
@@ -1191,12 +1207,16 @@ durable under `translations/files/completed/`.
|
|
|
1191
1207
|
- Add a file-translation button to the existing translation panel.
|
|
1192
1208
|
- Add the file translation modal.
|
|
1193
1209
|
- Add first-use bootstrap recommendation and bootstrap controls.
|
|
1194
|
-
- Add the translated-file left pane backed by
|
|
1210
|
+
- Add the translated-file left pane backed by completed entries from
|
|
1211
|
+
`files/index.json` plus active runtime file jobs from the queue.
|
|
1195
1212
|
- Add the translated-content right pane backed by completed output files.
|
|
1196
1213
|
- Show selected job status; show runtime report details only while a job is not
|
|
1197
1214
|
completed.
|
|
1198
1215
|
- Add shared queue status for file and conversation translation tasks.
|
|
1199
|
-
-
|
|
1216
|
+
- Do not show Codex Translator in the task role tab bar.
|
|
1217
|
+
- Add Translation sidebar controls for `Session status` and `Open Session`.
|
|
1218
|
+
- Show Codex Translator terminal controls, including model/effort/restart, only
|
|
1219
|
+
in the opened translator session modal.
|
|
1200
1220
|
- Replace older completed file translations after a new translation for the
|
|
1201
1221
|
same file/language/profile completes successfully.
|
|
1202
1222
|
- Add cancel, skip, manual resolve, and promote actions.
|
|
@@ -1219,11 +1239,11 @@ durable under `translations/files/completed/`.
|
|
|
1219
1239
|
conversation or file translation.
|
|
1220
1240
|
- Add bootstrap tests for candidate discovery, memory writes, queue ordering,
|
|
1221
1241
|
and rerun behavior.
|
|
1222
|
-
- Add queue status-machine tests, including
|
|
1242
|
+
- Add queue status-machine tests, including startup runtime cleanup.
|
|
1223
1243
|
- Add conversation result text validation tests.
|
|
1224
1244
|
- Add memory priority tests proving user entries override automatic entries.
|
|
1225
1245
|
- Add promote tests proving source files are not overwritten by default.
|
|
1226
|
-
- Add
|
|
1246
|
+
- Add retry/retranslation tests after failed or interrupted work.
|
|
1227
1247
|
- Test with `docs/whitepaper-v0.8.md` scale files.
|
|
1228
1248
|
|
|
1229
1249
|
## 21. Resolved Decisions
|
|
@@ -1257,7 +1277,9 @@ durable under `translations/files/completed/`.
|
|
|
1257
1277
|
- Store completed file outputs under `.ai/vcm/translations/files/completed/`;
|
|
1258
1278
|
store temporary file jobs under `.ai/vcm/translations/runtime/files/jobs/`.
|
|
1259
1279
|
- Store conversation translation runtime metadata/result temporary files under
|
|
1260
|
-
`.ai/vcm/translations/runtime/conversations
|
|
1280
|
+
`.ai/vcm/translations/runtime/conversations/`.
|
|
1281
|
+
- Store the durable translator session record at
|
|
1282
|
+
`.ai/vcm/translations/session.json`.
|
|
1261
1283
|
- Store shared glossary and style memory under `.ai/vcm/translations/memory/`.
|
|
1262
1284
|
- Resolve the translation root from `<baseRepoRoot>`, never from a task
|
|
1263
1285
|
worktree.
|
package/docs/product-design.md
CHANGED
|
@@ -219,11 +219,11 @@ The project manager must not become the architect, coder, reviewer, or debugger
|
|
|
219
219
|
The architect owns:
|
|
220
220
|
|
|
221
221
|
- architecture plan
|
|
222
|
-
- Scaffold Manifest for task-specific file context and coder guidance
|
|
222
|
+
- Scaffold Manifest with stable row IDs for task-specific file context and coder guidance
|
|
223
223
|
- module boundaries
|
|
224
224
|
- file responsibilities
|
|
225
225
|
- cross-file callable surfaces and contract comments
|
|
226
|
-
- code scaffolding with `VCM:CODE
|
|
226
|
+
- code scaffolding with `VCM:CODE <ID>` placeholders
|
|
227
227
|
- public contracts
|
|
228
228
|
- verifiable behavior and behavior/contract proof points
|
|
229
229
|
- Replan triggers
|
|
@@ -240,7 +240,7 @@ Outputs:
|
|
|
240
240
|
The coder owns:
|
|
241
241
|
|
|
242
242
|
- implementation within the approved plan
|
|
243
|
-
- completion of architect-defined `VCM:CODE` placeholders
|
|
243
|
+
- completion of architect-defined `VCM:CODE` placeholders and Scaffold Completion handoff by ID
|
|
244
244
|
- baseline unit/contract/regression tests
|
|
245
245
|
- general coding standards and code documentation consistency
|
|
246
246
|
|
|
@@ -289,7 +289,7 @@ Sections:
|
|
|
289
289
|
- `New Task`
|
|
290
290
|
- `Tasks`
|
|
291
291
|
|
|
292
|
-
The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime.
|
|
292
|
+
The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime. It also shows the Current Round while a Round is running, or the Last Round after a flow pause, including start time, total elapsed time, role active runtime, Turn count, and Round status.
|
|
293
293
|
|
|
294
294
|
`Repository Path` layout:
|
|
295
295
|
|
|
@@ -420,7 +420,7 @@ Task-level Round state:
|
|
|
420
420
|
- The stop transition is timer-driven from the `Stop` event. Round-state reads do not end a Round.
|
|
421
421
|
- Before stopping, VCM checks `.ai/vcm/handoffs/messages`; if a pending route message exists and can be delivered, VCM retries delivery and extends the stop window instead of alerting.
|
|
422
422
|
- The same Round state stores total Round count, Turn count, completed Turn count, and role active runtime. Active runtime is measured only between `UserPromptSubmit` and `Stop`, not during the stop window.
|
|
423
|
-
- The
|
|
423
|
+
- The Round dock shows both wall-clock Round duration and role active runtime. For a running Round, `Total` is `now - Round.startedAt`; for a stopped Round, it is `stoppedAt - Round.startedAt`. `Role runtime` is the accumulated active runtime across Turns in that Round; `Turn count` is the number of accepted prompts in the Round.
|
|
424
424
|
|
|
425
425
|
The frontend polls this task-level Round state and deduplicates each stopped Round so the same stopped state does not alert on every poll. Flow duration is measured from the first `UserPromptSubmit` to `stoppedAt`, falling back to the last `Stop` when needed. Runs under 2 minutes trigger the weak 3-chime reminder at 1.4 second intervals. Runs at or above 2 minutes trigger the strong alert dialog and repeating sound until confirmation.
|
|
426
426
|
|