Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions static/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: 'Title',
kanban_description: 'Description',
kanban_description_placeholder: 'Optional — what needs to happen, acceptance criteria, links',
kanban_status: 'Status',
kanban_assignee: 'Assignee',
kanban_assignee_placeholder: 'Optional — leave blank for any worker',
kanban_tenant: 'Tenant',
kanban_tenant_placeholder: 'Optional — project or team slug',
kanban_priority: 'Priority',
kanban_priority_hint: 'Higher numbers run first. Default 0.',
kanban_title_required: 'Title is required.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -624,6 +635,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 's'}`,
session_lineage_segment_untitled: 'Untitled segment',
session_lineage_segment_open: 'Open lineage segment',
new_profile: 'New profile',
transcript: 'Transcript',
download_transcript: 'Download as Markdown',
Expand Down Expand Up @@ -1568,6 +1581,17 @@ const LOCALES = {
kanban_no_comments: 'コメントなし',
kanban_no_events: 'イベントなし',
kanban_no_runs: '実行なし',
kanban_title: 'タイトル',
kanban_description: '説明',
kanban_description_placeholder: '任意 — 何をすべきか、受け入れ基準、リンク',
kanban_status: 'ステータス',
kanban_assignee: '担当者',
kanban_assignee_placeholder: '任意 — 空欄で任意のワーカーに',
kanban_tenant: 'テナント',
kanban_tenant_placeholder: '任意 — プロジェクトまたはチームのスラッグ',
kanban_priority: '優先度',
kanban_priority_hint: '値が大きいほど優先されます。既定値は 0。',
kanban_title_required: 'タイトルは必須です。',
kanban_new_task: '新規タスク',
kanban_add_comment: 'コメント追加',
kanban_only_mine: '自分のみ',
Expand Down Expand Up @@ -1662,6 +1686,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} 件`,
session_meta_children: (n) => `${n} 子`,
session_meta_segments: (n) => `${n} セグメント`,
session_lineage_segment_untitled: '無題のセグメント',
session_lineage_segment_open: '系譜セグメントを開く',
new_profile: '新規プロファイル',
transcript: 'トランスクリプト',
download_transcript: 'Markdown としてダウンロード',
Expand Down Expand Up @@ -2439,6 +2465,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: 'Заголовок',
kanban_description: 'Описание',
kanban_description_placeholder: 'Необязательно — что нужно сделать, критерии приёмки, ссылки',
kanban_status: 'Статус',
kanban_assignee: 'Исполнитель',
kanban_assignee_placeholder: 'Необязательно — оставьте пустым для любого исполнителя',
kanban_tenant: 'Арендатор',
kanban_tenant_placeholder: 'Необязательно — слаг проекта или команды',
kanban_priority: 'Приоритет',
kanban_priority_hint: 'Большие числа выполняются первыми. По умолчанию 0.',
kanban_title_required: 'Заголовок обязателен.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -2509,6 +2546,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} сообщ.`,
session_meta_children: (n) => `${n} ${n === 1 ? 'дочерн.' : 'дочерн.'}`,
session_meta_segments: (n) => `${n} сегм.`,
session_lineage_segment_untitled: 'Сегмент без названия',
session_lineage_segment_open: 'Открыть сегмент цепочки',
new_profile: 'Новый профиль',
transcript: 'Транскрипт',
download_transcript: 'Скачать как Markdown',
Expand Down Expand Up @@ -3411,6 +3450,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: 'Título',
kanban_description: 'Descripción',
kanban_description_placeholder: 'Opcional — qué hay que hacer, criterios de aceptación, enlaces',
kanban_status: 'Estado',
kanban_assignee: 'Responsable',
kanban_assignee_placeholder: 'Opcional — déjalo en blanco para cualquier trabajador',
kanban_tenant: 'Tenant',
kanban_tenant_placeholder: 'Opcional — slug del proyecto o equipo',
kanban_priority: 'Prioridad',
kanban_priority_hint: 'Los números más altos se ejecutan primero. Predeterminado: 0.',
kanban_title_required: 'El título es obligatorio.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -3481,6 +3531,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} mens.`,
session_meta_children: (n) => `${n} ${n === 1 ? 'hijo' : 'hijos'}`,
session_meta_segments: (n) => `${n} ${n === 1 ? 'segmento' : 'segmentos'}`,
session_lineage_segment_untitled: 'Segmento sin título',
session_lineage_segment_open: 'Abrir segmento de linaje',
new_profile: 'Nuevo perfil',
transcript: 'Transcripción',
download_transcript: 'Descargar como Markdown',
Expand Down Expand Up @@ -4371,6 +4423,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: 'Titel',
kanban_description: 'Beschreibung',
kanban_description_placeholder: 'Optional — was zu tun ist, Akzeptanzkriterien, Links',
kanban_status: 'Status',
kanban_assignee: 'Zugewiesen an',
kanban_assignee_placeholder: 'Optional — leer lassen für beliebigen Worker',
kanban_tenant: 'Mandant',
kanban_tenant_placeholder: 'Optional — Projekt- oder Team-Slug',
kanban_priority: 'Priorität',
kanban_priority_hint: 'Höhere Zahlen laufen zuerst. Standard: 0.',
kanban_title_required: 'Titel ist erforderlich.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -4431,6 +4494,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} Nachr.`,
session_meta_children: (n) => `${n} ${n === 1 ? 'Subagent' : 'Subagents'}`,
session_meta_segments: (n) => `${n} Segment${n === 1 ? '' : 'e'}`,
session_lineage_segment_untitled: 'Unbenanntes Segment',
session_lineage_segment_open: 'Liniensegment öffnen',
new_profile: 'Neues Profil',
transcript: 'Protokoll',
download_transcript: 'Als Markdown herunterladen',
Expand Down Expand Up @@ -5352,6 +5417,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: '标题',
kanban_description: '描述',
kanban_description_placeholder: '可选 — 需要做什么、验收标准、链接',
kanban_status: '状态',
kanban_assignee: '负责人',
kanban_assignee_placeholder: '可选 — 留空表示任意工作器',
kanban_tenant: '租户',
kanban_tenant_placeholder: '可选 — 项目或团队标识',
kanban_priority: '优先级',
kanban_priority_hint: '数值越高越先执行,默认为 0。',
kanban_title_required: '标题为必填项。',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -5424,6 +5500,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} 条消息`,
session_meta_children: (n) => `${n} 子会话`,
session_meta_segments: (n) => `${n} 段`,
session_lineage_segment_untitled: '未命名段',
session_lineage_segment_open: '打开脉络段',
new_profile: '新配置',
transcript: '记录',
download_transcript: '下载为 Markdown',
Expand Down Expand Up @@ -6326,6 +6404,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} 則訊息`,
session_meta_children: (n) => `${n} 則子`,
session_meta_segments: (n) => `${n} 段`,
session_lineage_segment_untitled: '未命名段',
session_lineage_segment_open: '開啟脈絡段',
new_profile: '\u65b0\u914d\u7f6e\u6a94',
transcript: '\u8a18\u9304',
download_transcript: '\u4e0b\u8f09\u8a18\u9304',
Expand Down Expand Up @@ -6512,6 +6592,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} 則訊息`,
session_meta_children: (n) => `${n} 則子`,
session_meta_segments: (n) => `${n} 段`,
session_lineage_segment_untitled: '未命名段',
session_lineage_segment_open: '開啟脈絡段',
settings_label_model: '\u9810\u8a2d\u6a21\u578b',
skill_created: '\u6280\u80fd\u5df2\u5efa\u7acb',
skill_file_load_failed: '\u8f09\u5165\u6a94\u6848\u5931\u6557\uff1a',
Expand Down Expand Up @@ -7387,6 +7469,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: 'Título',
kanban_description: 'Descrição',
kanban_description_placeholder: 'Opcional — o que precisa ser feito, critérios de aceitação, links',
kanban_status: 'Status',
kanban_assignee: 'Responsável',
kanban_assignee_placeholder: 'Opcional — deixe em branco para qualquer worker',
kanban_tenant: 'Tenant',
kanban_tenant_placeholder: 'Opcional — slug do projeto ou equipe',
kanban_priority: 'Prioridade',
kanban_priority_hint: 'Números maiores executam primeiro. Padrão: 0.',
kanban_title_required: 'O título é obrigatório.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -7457,6 +7550,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 's'}`,
session_lineage_segment_untitled: 'Segmento sem título',
session_lineage_segment_open: 'Abrir segmento de linhagem',
new_profile: 'Novo perfil',
transcript: 'Transcrição',
download_transcript: 'Baixar como Markdown',
Expand Down Expand Up @@ -8323,6 +8418,17 @@ const LOCALES = {
kanban_no_comments: 'No comments',
kanban_no_events: 'No events',
kanban_no_runs: 'No runs',
kanban_title: '제목',
kanban_description: '설명',
kanban_description_placeholder: '선택 — 해야 할 일, 수락 기준, 링크',
kanban_status: '상태',
kanban_assignee: '담당자',
kanban_assignee_placeholder: '선택 — 비워두면 누구나 가능',
kanban_tenant: '테넌트',
kanban_tenant_placeholder: '선택 — 프로젝트 또는 팀 슬러그',
kanban_priority: '우선순위',
kanban_priority_hint: '높은 숫자가 먼저 실행됩니다. 기본값: 0.',
kanban_title_required: '제목은 필수입니다.',
kanban_new_task: 'New task',
kanban_add_comment: 'Add comment',
kanban_only_mine: 'Only mine',
Expand Down Expand Up @@ -8393,6 +8499,8 @@ const LOCALES = {
session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 's'}`,
session_lineage_segment_untitled: '제목 없는 세그먼트',
session_lineage_segment_open: '계보 세그먼트 열기',
new_profile: 'New profile',
transcript: '대화 기록',
download_transcript: 'Download as Markdown',
Expand Down
45 changes: 44 additions & 1 deletion static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
<div class="panel-head">
<span data-i18n="tab_kanban">Kanban</span>
<div class="panel-head-actions">
<button class="panel-head-btn has-tooltip has-tooltip--bottom" id="kanbanNewTaskBtn" onclick="createKanbanTask()" data-tooltip="New task" data-i18n-title="kanban_new_task" aria-label="New task"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg></button>
<button class="panel-head-btn has-tooltip has-tooltip--bottom" id="kanbanNewTaskBtn" onclick="openKanbanCreate()" data-tooltip="New task" data-i18n-title="kanban_new_task" aria-label="New task"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg></button>
<button class="panel-head-btn has-tooltip has-tooltip--bottom" id="kanbanRefreshBtn" onclick="loadKanban(true)" data-tooltip="Refresh" data-i18n-title="kanban_refresh" aria-label="Refresh"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg></button>
</div>
</div>
Expand Down Expand Up @@ -1262,5 +1262,48 @@ <h3 id="kanbanBoardModalTitle" data-i18n="kanban_new_board">New board</h3>
</div>
</div>
</div>
<!-- Kanban: create-task modal — same overlay pattern as the create-board modal above. -->
<div class="kanban-modal-overlay" id="kanbanTaskModal" hidden onclick="if(event.target===this)closeKanbanTaskModal()">
<div class="kanban-modal" role="dialog" aria-modal="true" aria-labelledby="kanbanTaskModalTitle">
<h3 id="kanbanTaskModalTitle" data-i18n="kanban_new_task">New task</h3>
<div class="kanban-modal-row">
<label for="kanbanTaskModalTitleInput" data-i18n="kanban_title">Title</label>
<input type="text" id="kanbanTaskModalTitleInput" maxlength="500" autocomplete="off" required>
</div>
<div class="kanban-modal-row">
<label for="kanbanTaskModalBody" data-i18n="kanban_description">Description</label>
<textarea id="kanbanTaskModalBody" rows="4" data-i18n-placeholder="kanban_description_placeholder" placeholder="Optional — what needs to happen, acceptance criteria, links"></textarea>
</div>
<div class="kanban-modal-row-inline">
<div class="kanban-modal-row">
<label for="kanbanTaskModalStatus" data-i18n="kanban_status">Status</label>
<select id="kanbanTaskModalStatus">
<option value="triage" data-i18n="kanban_status_triage">Triage</option>
<option value="todo" data-i18n="kanban_status_todo">Todo</option>
<option value="ready" data-i18n="kanban_status_ready">Ready</option>
</select>
</div>
<div class="kanban-modal-row">
<label for="kanbanTaskModalPriority" data-i18n="kanban_priority">Priority</label>
<input type="number" id="kanbanTaskModalPriority" value="0" min="-100" max="100" step="1">
</div>
</div>
<div class="kanban-modal-row">
<label for="kanbanTaskModalAssignee" data-i18n="kanban_assignee">Assignee</label>
<input type="text" id="kanbanTaskModalAssignee" list="kanbanTaskModalAssigneeList" maxlength="64" autocomplete="off" data-i18n-placeholder="kanban_assignee_placeholder" placeholder="Optional — leave blank for any worker">
<datalist id="kanbanTaskModalAssigneeList"></datalist>
</div>
<div class="kanban-modal-row">
<label for="kanbanTaskModalTenant" data-i18n="kanban_tenant">Tenant</label>
<input type="text" id="kanbanTaskModalTenant" list="kanbanTaskModalTenantList" maxlength="64" autocomplete="off" data-i18n-placeholder="kanban_tenant_placeholder" placeholder="Optional — project or team slug">
<datalist id="kanbanTaskModalTenantList"></datalist>
</div>
<div class="kanban-modal-error" id="kanbanTaskModalError" aria-live="polite"></div>
<div class="kanban-modal-actions">
<button type="button" class="btn secondary" onclick="closeKanbanTaskModal()" data-i18n="cancel">Cancel</button>
<button type="button" class="btn primary" id="kanbanTaskModalSubmit" onclick="submitKanbanTaskModal()" data-i18n="create">Create</button>
</div>
</div>
</div>
</body>
</html>
Loading
Loading