@goodandready/dsh-goal 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,63 +1,63 @@
1
- {
2
- "name": "@goodandready/dsh-goal",
3
- "version": "0.2.0",
4
- "description": "Autonomous Goal Execution & Multi-Turn Task Tracking Engine with Sticky Header for DeepSeek Harness",
5
- "type": "module",
6
- "main": "./lib/index.js",
7
- "exports": {
8
- ".": "./lib/index.js",
9
- "./client": "./lib/client.js",
10
- "./package.json": "./package.json",
11
- "./cordis.patch.yml": "./cordis.patch.yml"
12
- },
13
- "files": [
14
- "lib/",
15
- "cordis.patch.yml",
16
- "README.md",
17
- "README.ru.md",
18
- "README.zh.md",
19
- "LICENSE",
20
- "docs/design/DESIGN.md"
21
- ],
22
- "scripts": {
23
- "test": "node --test test/*.test.mjs"
24
- },
25
- "keywords": [
26
- "dsh",
27
- "dsh-plugin",
28
- "deepseek-harness",
29
- "goal-mode",
30
- "autonomous-agent",
31
- "cordis"
32
- ],
33
- "repository": {
34
- "type": "git",
35
- "url": "https://github.com/GooDAnDReaDY/dsh-goal.git"
36
- },
37
- "homepage": "https://github.com/GooDAnDReaDY/dsh-goal",
38
- "bugs": {
39
- "url": "https://github.com/GooDAnDReaDY/dsh-goal/issues"
40
- },
41
- "author": "goodandready",
42
- "license": "MIT",
43
- "dsh": {
44
- "bundle": {
45
- "patch": "./cordis.patch.yml"
46
- },
47
- "client": {
48
- "platform": "web",
49
- "inject": []
50
- }
51
- },
52
- "peerDependencies": {
53
- "@deepseek-ai/cordis": "^4.0.1",
54
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
55
- "@deepseek-ai/schemastery": "^3.18.1"
56
- },
57
- "devDependencies": {
58
- "@deepseek-ai/schemastery": "^3.18.1"
59
- },
60
- "dependencies": {
61
- "@deepseek-ai/schemastery": "^3.18.1"
62
- }
63
- }
1
+ {
2
+ "name": "@goodandready/dsh-goal",
3
+ "version": "0.2.2",
4
+ "description": "Autonomous Goal Execution & Multi-Turn Task Tracking Engine with Sticky Header for DeepSeek Harness",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "exports": {
8
+ ".": "./lib/index.js",
9
+ "./client": "./lib/client.js",
10
+ "./package.json": "./package.json",
11
+ "./cordis.patch.yml": "./cordis.patch.yml"
12
+ },
13
+ "files": [
14
+ "lib",
15
+ "package.json",
16
+ "README.md",
17
+ "README.ru.md",
18
+ "README.zh.md",
19
+ "cordis.patch.yml",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "test": "node --test test/*.test.mjs"
24
+ },
25
+ "keywords": [
26
+ "dsh",
27
+ "dsh-plugin",
28
+ "deepseek-harness",
29
+ "goal-mode",
30
+ "autonomous-agent",
31
+ "cordis"
32
+ ],
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/GooDAnDReaDY/dsh-goal.git"
36
+ },
37
+ "homepage": "https://github.com/GooDAnDReaDY/dsh-goal",
38
+ "bugs": {
39
+ "url": "https://github.com/GooDAnDReaDY/dsh-goal/issues"
40
+ },
41
+ "author": "goodandready",
42
+ "license": "MIT",
43
+ "dsh": {
44
+ "bundle": {
45
+ "patch": "./cordis.patch.yml"
46
+ },
47
+ "client": {
48
+ "platform": "web",
49
+ "inject": []
50
+ }
51
+ },
52
+ "peerDependencies": {
53
+ "@deepseek-ai/cordis": "^4.0.1",
54
+ "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
55
+ "@deepseek-ai/schemastery": "^3.18.1"
56
+ },
57
+ "devDependencies": {
58
+ "@deepseek-ai/schemastery": "^3.18.1"
59
+ },
60
+ "dependencies": {
61
+ "@deepseek-ai/schemastery": "^3.18.1"
62
+ }
63
+ }
@@ -1,184 +0,0 @@
1
- # DESIGN.md — Дизайн-контракт `dsh-goal`
2
-
3
- ## 1. Назначение и концепция
4
-
5
- Плагин `dsh-goal` реализует автономный режим достижения целей (Goal Mode) для **DeepSeek Harness** (DSH).
6
- Визуальная доминанта — компактная закреплённая верхняя панель (Sticky Top Banner), отображающая текущую активную цель, секундомер выполнения и кнопки мгновенного управления (🗑 сброс, ⏸ пауза/возобновление, ⛶ детали/модалка).
7
-
8
- ---
9
-
10
- ## 2. Пользовательские поверхности (User Surfaces)
11
-
12
- ### 2.1 Sticky Top Banner (Верхняя закреплённая панель цели)
13
- - **Расположение**: Верхняя часть окна чата/сессии над лентой сообщений.
14
- - **Элементы слева направо**:
15
- 1. `IconTarget` (🎯 SVG 16x16, обводка `currentColor`);
16
- 2. Заголовок **«Текущая цель»** (вес 600, `var(--dsw-alias-label-primary)`);
17
- 3. Текст цели (например: «привет» или «Исправить баг в аутентификации», цвет `var(--dsw-alias-label-secondary)`, `text-overflow: ellipsis`);
18
- 4. Разделитель и таймер: `• 2s` (динамический счётчик `• 14s`, `• 2m 15s`, шрифт `monospace`);
19
- 5. Панель кнопок справа:
20
- - Кнопка **🗑 (Очистить / Отменить)**: диалог подтверждения отмены/сброса цели;
21
- - Кнопка **⏸ / ▶ (Пауза / Продолжить)**: переключение между автономным циклом (`RUNNING`) и паузой (`PAUSED`);
22
- - Кнопка **⛶ (Развернуть детали)**: открытие модального окна со списком вех и логом.
23
-
24
- ### 2.2 Modal Details Dialog (Окно декомпозиции и прогресса ⛶)
25
- - **Шапка**: Название цели, статус-бейдж (`В процессе`, `На паузе`, `Завершено`), общий процент выполнения.
26
- - **Тело**:
27
- - Чеклист вех (Milestones): статус каждой вехи (`pending` ⏳, `in_progress` 🔄, `completed` ✅, `failed` ❌);
28
- - Лог итераций и ключевых выводов модели;
29
- - Метрики: общее время, количество итераций (turns), максимальный лимит.
30
- - **Футер**: Кнопки ручного добавления шага, паузы и закрытия.
31
-
32
- ### 2.3 Settings Card (`settings.plugin.item`)
33
- - Размещение во вкладке «Настройки → Плагины → Настройки плагинов», свёрнута по умолчанию, раскрытие по клику по заголовку (`aria-expanded`).
34
- - Ключ слота (`key`) — пространство настроек `dsh-goal`; пока снимок пространства не в статусе `ready`, карточка не рисуется; при `writable: false` поля и кнопки заблокированы.
35
- - Параметры (фактический набор, регистрируется schemastery-схемой):
36
- - `maxIterations`: максимальное число автономных шагов до принудительной остановки (дефолт: 25);
37
- - `autoDrive`: автоматически продолжать цикл после каждого хода (дефолт: true);
38
- - `enableSound`: звуковой сигнал по завершении цели (дефолт: true).
39
- - Поля читаются из живого снимка пространства (`ctx.settingsScope.bind({ namespace })`), кнопки «Сбросить» / «Сохранить» в футере; сохраняются только изменённые поля, все записи выполняются подряд (не до первой ошибки), результат сверяется обратным чтением; неудачная запись не стирает введённые значения.
40
- - `Changed in ядро 0.1.2-rc.1`: поле `promptTemplate` никогда не было реализовано в коде и из схемы удалено из описания; контракт карточки переехал на встроенные службы ядра (`slots` / `locale` / `settingsScope`), `dsh.client.inject` пуст.
41
-
42
- ---
43
-
44
- ## 3. Цветовая палитра и токены DSH
45
-
46
- Плагин использует исключительно системные переменные DSH:
47
- - Фоновый слой: `var(--dsw-alias-bg-layer-3)` и `var(--dsw-alias-bg-layer-2)`
48
- - Границы: `var(--dsw-alias-border-l2)`
49
- - Текст основной: `var(--dsw-alias-label-primary)`
50
- - Текст вторичный: `var(--dsw-alias-label-secondary)`
51
- - Текст третичный / метки времени: `var(--dsw-alias-label-tertiary)`
52
- - Акцент/успех: `var(--dsw-alias-status-success)`
53
- - Предупреждение/пауза: `var(--dsw-alias-status-warning)`
54
- - Ошибка/удаление: `var(--dsw-alias-status-danger)`
55
-
56
- ---
57
-
58
- ## 4. Состояния (State Machine)
59
-
60
- | Состояние | Баннер | Действия |
61
- |---|---|---|
62
- | `IDLE` | Скрыт или нейтральный placeholder | Кнопка «Поставить цель» |
63
- | `RUNNING` | Активен, таймер тикает, индикатор мишени | 🗑 Отмена, ⏸ Пауза, ⛶ Детали |
64
- | `PAUSED` | Активен, таймер застыл, иконка ▶ вместо ⏸ | 🗑 Отмена, ▶ Возобновить, ⛶ Детали |
65
- | `COMPLETED` | Активен, зелёная иконка успеха, итоговое время | 🗑 Очистить, ⛶ Посмотреть отчёт |
66
- | `FAILED` | Активен, красная иконка ошибки/лимита | 🗑 Очистить, ⛶ Логи ошибки |
67
-
68
- ---
69
-
70
- ## 5. Locked Design Decisions
71
-
72
- 1. **Единый префикс классов**: `.dsh-goal-*` во всех CSS-правилах во избежание конфликтов стилей.
73
- 2. **Точный макет баннера**: скругление углов 8–10px, шапка с отступами `8px 16px`, выравнивание по центру, кнопки действий справа с `gap: 10px`.
74
- 3. **Безопасность импортов**: все `require('@deepseek-ai/dsh-client-ui-primitives')` обёрнуты в `try/catch` с SVG-фоллбеками.
75
- 4. **2026-09-04 — rc.1-совместимость клиента**: `dsh.client.inject: []` — в boot-графе клиента ядра 0.1.2-rc.1 нет package-строк `dsh-client-runtime` (модуля в ядре нет вовсе) и `dsh-client-ui-slots`; `slots`/`locale`/`settingsScope` — встроенные службы ядра. `react`, `@deepseek-ai/dsh-client-ui-slots`, `@deepseek-ai/dsh-client-ui-primitives` отвечаются статической seed-таблицей шелла, но динамических package-строк под них в boot-графе нет — объявлять их в inject нельзя. Условие пересмотра: появление этих package-строк в boot-таблице ядра.
76
- 5. **2026-09-04 — контракт карточки настроек**: key слота = пространство настроек (`dsh-goal`), чтение через `ctx.settingsScope.bind`, решение по статусу снимка (loading/unavailable/ready + writable), сохранение всех изменённых полей с обратной сверкой. Причина: контракт вкладки «Настройки → Плагины» ядра rc.1 (BashCard/AgentLoopCard как эталон). Пересмотр — при изменении контракта слота в ядре.
77
-
78
- 6. **2026-09-10 — унификация дизайн-системы с dsh-clinebot (v0.1.5)**:
79
- - Приведение кнопок, плашек и статусов к единому стилю: овальные пилюли (`.dsh-goal-badge`), кнопки с радиусом 8px, hover-состояниями и цветами (`.dsh-goal-btn-primary`, `.dsh-goal-btn-danger`).
80
- - Модальное окно декомпозиции цели обогащено компактным 3-колоночным гридом метрик (`.dsh-goal-stat-grid`, `.dsh-goal-stat-box`).
81
- - Инъекция стилей в DOM изолирована атрибутом `data-dsh-plugin="dsh-goal"`.
82
- - Серверная защита REST API: ограничение размера тела запроса до 256 КБ (413 Payload Too Large) и строгая валидация входящих параметров вех.
83
- - Ограничение сессионной памяти: автоматическая ротация завершённых неактивных сессий в `GoalEngine.pruneInactiveSessions()`.
84
-
85
- 7. **2026-09-12 — Realtime SSE, Low-Latency AutoDrive, Smart Progress Guard, Crash Hydration и Web Audio (v0.1.6)**:
86
- - **Realtime Server-Sent Events (`GET /dsh-goal/events`)**: Стриминг снимков состояния цели клиенту в реальном времени с периодическим keepalive-пингом (20s). Устраняет сетевую задержку поллинга при выполнении итераций.
87
- - **Адаптивный fallback-поллинг**: При сбое SSE соединения клиент бесшовно переключается на адаптивный поллинг (1.5s при RUNNING, 8s при простое).
88
- - **Low-Latency AutoDrive**: Замена статического `setTimeout(..., 300)` на микрозадачу/`setImmediate` в координаторе `onTurnEnd` для устранения искусственных задержек между шагами автономного цикла.
89
- - **Smart Progress Guard**: Детекция застрявшего цикла агента (2 последовательных холостых хода без изменения/добавления вех) с автоматической паузой и фиксацией причины в логах во избежание перерасхода токенов.
90
- - **Crash Hydration**: При перезапуске DSH цели, оставшиеся в статусе `RUNNING`, автоматически гидрируются в `PAUSED` с отметкой времени и пояснением оператору для ручного возобновления в 1 клик.
91
- - **Web Audio Синтез**: Синтезированные пентатонические колокольчики через `window.AudioContext` при завершении цели (`COMPLETED` — мажорный аккорд, `FAILED` — минорный аккорд) с соблюдением настройки `enableSound`.
92
- - **Milestone Integrity**: Статус выполнения вех строго контролируется агентом; чекбоксы ручной отметки в UI исключены в соответствии с архитектурным контрактом.
93
-
94
- 8. **2026-09-12 — Сессионная изоляция /goal, устойчивость SSE и строгая REST валидация (v0.1.7)**:
95
- - **Сквозная сессионная изоляция в слеш-команде**: В `command-handler.js` метод `executeGoalSlashCommand` пробрасывает `sessionId` во все вызовы `engine` (`getSnapshot`, `startGoal`, `pause`, `resume`, `clear`), исключая мутацию глобальной сессии при работе в конкретном чате.
96
- - **Устойчивость SSE с Exponential Backoff**: На клиенте внедрена автоматическая схема повторного подключения `EventSource` с возрастающей задержкой (от 2s до 30s) и рандомизированным джиттером для защиты от шторма переподключений.
97
- - **Строгая REST валидация и Enum Guard**: Обработчик `POST /dsh-goal/action` валидирует непустой `title` при старте цели и проверяет допустимость статуса вехи по `MilestoneStatus` enum, возвращая внятный HTTP 400 Bad Request / 404 Not Found.
98
- - **Безопасность файловой системы**: `GoalEngine.writeStateToDiskSync()` гарантированно создаёт отсутствующие родительские директории через `fs.mkdirSync(dir, { recursive: true })` перед созданием временного файла и атомарным переименованием.
99
-
100
- ### Решение 9: Интеллектуальная оценка времени (ETA), аналитика токенов, кнопка быстрого запуска цели и экспорт отчетов в Markdown
101
-
102
- **Контекст:**
103
- После стабилизации сессионной изоляции и SSE-потока пользователям требовалась наглядная оценка оставшегося времени работы над целью, понимание расхода токенов за цикл, удобный запуск цели без ручного ввода команды `/goal` и возможность мгновенно экспортировать структурированный итоговый отчёт в markdown-формате.
104
-
105
- **Принятые решения:**
106
- 1. **Расчет оставшегося времени (ETA projection):**
107
- - Метод `getEstimatedRemainingSeconds(sid)` рассчитывает среднее время на выполнение завершенных вех `elapsed / completedCount` и умножает на количество оставшихся шагов.
108
- - В верхнем баннере и модальном окне отображается живое время работы с прогнозом: `⏱ 45s (ETA ~2m)`.
109
- 2. **Аналитика расхода токенов (Token Usage Analytics):**
110
- - Накопление счетчиков `promptTokens`, `completionTokens`, `totalTokens` на каждом завершении хода `turn/end` через `engine.addTokenUsage(usage, sid)`.
111
- - В модальном окне деталей в сетку характеристик добавлен блок «Токены» с подсказкой при наведении с детальным расщеплением.
112
- 3. **Кнопка быстрого запуска цели (Quick Launch button):**
113
- - Когда цель не активна, в `conversation.input.dock` отображается компактная кнопка с иконкой 🎯.
114
- - По клику открывается модальное окно с полем ввода для немедленной постановки задачи агенту без ручного ввода слэш-команд.
115
- - В карточке настроек добавлен переключатель `showQuickLaunchButton` с возможностью сброса к дефолту.
116
- 4. **Экспорт отчета в Markdown (One-click Markdown Export):**
117
- - Для выполненной цели модальное окно предоставляет кнопку «📋 Скопировать отчёт в Markdown».
118
- - Генерирует отчет с заголовком, статусом, длительностью, итерациями, расходом токенов, резюме результатов и таблицей вех.
119
-
120
- ### Решение 10: Бесшовная совместимость и перехват базовых инструментов целей DSH (update_goal, get_goal, create_goal) (v0.1.10)
121
-
122
- **Контекст:**
123
- В GitHub Issue #2 пользователи столкнулись с ошибкой:
124
- `complete and blocked require a direct human turn or the current goal round`
125
- при попытке модели завершить или обновить цель вызовом встроенного инструмента `update_goal`.
126
- Причина: встроенный плагин ядра DSH (`@deepseek-ai/dsh-tool-goal`) накладывает жёсткие проверки происхождения хода (authority checks), которые дают сбой в автономных циклах и при вызовах вне строго размеченного раунда цели.
127
-
128
- **Принятые решения:**
129
- 1. **Динамическое замещение инструментов ядра в `ToolRuntime`:**
130
- - При инициализации `ctx.inject(['tools'], (tctx) => { ... })` плагин проверяет наличие `update_goal`, `get_goal`, `create_goal` в глобальном слое (`tctx.tools.layers.global.tools.data`), удаляет конфликтующие строгие определения ядра и регистрирует собственные полнофункциональные версии.
131
- 2. **Маршрутизация действий в `GoalEngine`:**
132
- - `update_goal` перехватывает все действия модели:
133
- - `action: 'complete'` — завершает цель в `engine.completeGoal()`, внедряет заключительный контекст `<goal_complete>` и возвращает статус `complete`;
134
- - `action: 'pause'` — переводит цель в паузу через `engine.pause()`;
135
- - `action: 'resume'` — возобновляет цель (`engine.resume()`) и перезапускает автодрайв агента;
136
- - `action: 'edit'` — обновляет цель (`title`) и лимит раундов (`maxIterations`);
137
- - `action: 'blocked'` — фиксирует блокер в `engine.pause()` с возвратом фазы `blocked` и кода причины.
138
- 3. **Строгое соответствие схеме `GOAL_OUTPUT`:**
139
- - Все перехваченные инструменты возвращают структуры, валидные по спецификации `GOAL_VALUE_SCHEMA` ядра (`goal: null` при отсутствии активной цели, либо объект цели с `id`, `revision`, `objective`, `phase`, `roundsStarted`, `maxGoalRounds`, `activation`).
140
- 4. **Нейтрализация устаревшего системного промпта ядра:**
141
- - Удаляется секция `tool:goal` ядра с ошибочными директивами и заменяется актуальной динамической инструкцией `tool:dsh-goal`.
142
-
143
-
144
- ### Решение 11: Живая корректировка цели (Live Steering / Nudge), браузерные уведомления, 10 инженерных пресетов, защита от сбоев инструментов и Git Checkpoints (v0.2.0)
145
-
146
- **Контекст:**
147
- В процессе активной эксплуатации автономного режима Goal Mode пользователям требовались:
148
- 1. Возможность вносить точечные корректировки и уточнения в активную или приостановленную цель без прерывания сессии или перезапуска;
149
- 2. Получение нативных уведомлений операционной системы при завершении длительных фоновых задач;
150
- 3. Быстрый выбор типовых инженерных задач (багфикс, рефакторинг, тесты, код-ревью и др.) без ручного набора стандартных промптов;
151
- 4. Защита от бесконечных повторных вызовов падающих инструментов (Tool-Failure Breaker) с настраиваемым порогом;
152
- 5. Фиксация точки старта в репозитории (Git Checkpoint) для моментального просмотра изменений и отката;
153
- 6. Экспорт структурированного отчета с интерактивными спойлерами для комментариев в GitHub / Gitea PR.
154
-
155
- **Принятые решения:**
156
- 1. **Live Steering / Nudge**:
157
- - Реализован метод `engine.nudge(text, sid)` и эндпоинт `POST /dsh-goal/action` с `action: 'nudge'`.
158
- - Поле ввода в модальном окне деталей позволяет оператору направить агента.
159
- - Указание сохраняется в `goal.nudges` и инжектируется в следующий промпт автодрайва как высокоприоритетная директива `🚨 URGENT USER CLARIFICATION / STEERING`.
160
- 2. **Нативные браузерные уведомления (Notification API)**:
161
- - При завершении цели (`COMPLETED` или `FAILED`) клиент вызывает системный push через `new Notification(...)` при наличии разрешения.
162
- - В карточке настроек добавлен чекбокс `enableBrowserNotifications` с интерактивным запросом прав.
163
- 3. **10 инженерных шаблонов запуска (Quick Launch Presets)**:
164
- - В окно быстрого запуска добавлена лента чипов с 10 сценариями на трёх языках (`en`, `ru`, `zh`):
165
- 1. 🐛 Fix Bug & Verify
166
- 2. ⚡ Refactor (YAGNI)
167
- 3. 📝 Tests & Coverage
168
- 4. 🔍 Code Review
169
- 5. 🚀 New Feature
170
- 6. 🛡️ Security Audit
171
- 7. 📚 Docs & Contract
172
- 8. 📦 Upgrade Deps
173
- 9. 🧹 Dead Code Cleanup
174
- 10. ⚙️ Performance
175
- 4. **Защита от циклических сбоев инструментов (Tool-Failure Breaker)**:
176
- - В `GoalEngine` внедрен счетчик последовательных ошибок инструментов (`consecutiveToolFailureLimit`, по умолчанию 3, 0 — отключено).
177
- - При превышении порога цель автоматически переводится в `PAUSED` с фиксацией точной причины в журнале.
178
- - Порог настраивается через Schemastery карточку в интерфейсе настроек.
179
- 5. **Git Checkpoint Snapshot**:
180
- - При старте цели через `node:child_process` фиксируется короткий хеш `git rev-parse --short HEAD` (с таймаутом 1 сек).
181
- - В окне деталей отображается бейдж `📌 Git: <commit>` с копированием команды `git diff <commit>` в один клик.
182
- 6. **Экспорт отчета для GitHub / Gitea PR**:
183
- - Метод `exportReportGitHubPR(state)` форматирует статус, время, расход токенов, резюме и таблицу вех внутри сворачиваемого блока `<details><summary>`.
184
- - В окне деталей добавлена кнопка «🐙 Копировать для GitHub PR».