dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH plugin: convert a request into MiL with Sarashina, review it, then hand it to the model dsh is running (TUI and Web UI)
曖昧な依頼文を MiL へ変換し、承認してから dsh で選択中のモデルへ渡す dsh プラグイン。
/onetempo 3Dモデルを作って
↓ sarashina が MiL へ変換(mil-spec を system に渡す)
↓ 原文と MiL を表示し、承認(必要なら修正)
↓ 承認済みの MiL を、dsh で選択中のモデルへ渡す
proposal.md / qa-record.md / preflight-report-*.md)はローカル記録のため、この公開リポジトリには含めていない。本文中の preflight-report-run*.md はその記録のファイル名を示す。/onetempo が起動したときだけ動く。通常の依頼文には反応しない。source.kind: 'user')。dsh は source.kind === 'user' のメッセージだけを利用者の行として扱い、/rewind の戻り先にもする(それ以外はコンテキスト行になり、会話に出ない)。変換の来歴はプラグインの storage ログと通知に残す。@deepseek-harness-tui/dsh-tui が入ったプロファイル)SARASHINA_API_KEY(Sarashina で発行。無償ベータ、Google ログイン、事前申し込み不要)キーの指定方法は以下のいずれか(優先順位順):
~/.dsh/.credentials.yaml(dsh 標準の認証情報ファイル、推奨)SARASHINA_API_KEY(.env を使う場合は node --env-file=.env)# 測定ツールの例(~/.dsh/.credentials.yaml にキーがあれば --env-file 不要)
node tools/preflight-decode.mjs --dry
/onetempo [mini|nano] [back] <依頼文>
| 引数 | 意味 |
|---|---|
mini / nano | 変換モデルの上書き。sarashina3-mini(6 RPM) / sarashina3-nano(60 RPM、既定) |
back | 逆翻訳(MiL を自然語へ戻したもの)も表示する。省略時は設定の既定 |
<依頼文> | 変換対象。フラグの後に来た文字列をそのまま使う |
引数なしの /onetempo は使い方を表示する。
名前について: プロジェクト名は 1tempo だが、コマンドと識別子は
onetempo。dsh のコマンド名とプラグイン所有の設定名前空間は/^[a-z][a-z0-9_-]*$/(英小文字で始まる)に一致する必要があり、当初案の1tempoは数字始まりのため拒否される(実測:command name "1tempo" must match .../invalid TUI settings-section namespace: 1tempo)。表示名(1tempo、設定セクションの見出し、source.plugin)は1tempoのまま。
1tempo: 送信しました… / MiL: <送信する MiL> / 逆翻訳・ログ行)。
channel.notify(cleanRenderText(text, COMMAND_RESULT_CELLS = 200)) で通知欄に描く。200 セルを超えた分は … で切られるため、先頭を MiL にし、続く注記は予算内の分だけ載せる(プラグイン側では切り詰めない)content)。本文は MiL のみ。
content は「会話に表示されるテキスト」と「モデルが読むテキスト」を兼ねる。dsh に両者を分ける欄は無い(実測: tools/inspect-session-log.mjs --grep で agent/inbox/spliced に本文が入ることを確認)。そのため原文を会話に出すと、そのままモデルにも渡るincludeOriginalInMessage: true にすると本文が「依頼: <原文>」→「MiL: …」になる。会話の行が自分の言葉で始まり /rewind で識別しやすいが、MiL の圧縮効果は失われる。既定は falsesource は { kind: 'user' } のみ(form を付けない)。dsh は isHuman = sourceKind === 'user' の一点で利用者とプラグインを区別し(dsh-adapter/trajectory/projection.js)、/rewind も同じ条件で戻り先を選ぶ(sessionTree.js)。plugin:1tempo のままだと context 行になり会話に出ず、form を付けると行ごと消える(どちらも実機で確認)。代償: セッションログ上は「利用者が送った」記録になる。変換の来歴は storage ログと通知に残す(qa-record.md §6.22)session.append でログ専用イベントを足すこともできない(ignorable を付けられない)。「会話にだけ原文を出す」要望は dsh-feature-request.md の提案 6(入力欄へ本文を入れる API)にまとめたdialogTimeoutMs(既定 3 分)を過ぎた場合も取り消すfailureMode に従う(既定は「原文をそのまま送るか確認」。自動送信はしない)。Enter to confirm · Esc to cancel など)は dsh のダイアログ部品が描くもので、プラグインからは消せない。消すにはダイアログを使わない方式(会話で完結する 2 段階)へ変える必要がある。このリポジトリは dsh の bundle パッケージとして作ってある(package.json の dsh.bundle.patch → cordis.patch.yml)。したがって、展開も手作業の設定も不要で、dsh のプラグイン管理から spec を指定するだけで入る。
サイドバーの Plugins ページで追加先に次を入れて Install する。
github:puyokura/dsh-1tempo
@deepseek-ai/dsh-plugin-manager)が pnpm add でこのリポジトリをプロファイルへ入れ、bundle を既定で有効化し、同梱の cordis.patch.yml の行を適用する。手で cordis.patch.yml を編集する必要はない。patchReload: live)ならその場で反映される。無効なら dsh を再起動する。pnpm remove 相当)。エージェント経由なら plugin_manager ツールの install_bundle に同じ spec を渡す(Creator 系プリセットで有効。実行には danger-full-access か承認が要る)。
Web UI を使わない場合(サーバー上で動かす、ヘッドレスなど)は同じ操作を CLI で行う。
cd ~/.dsh/profiles/<プロファイル名>
pnpm add github:puyokura/dsh-1tempo
次に package.json の dsh.profile.bundles の末尾へ "dsh-plugin-1tempo" を足す。pnpm add だけでは bundle は有効にならず、この 1 行が Install ボタンの仕事にあたる。
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-plugin-1tempo"
],
patchReload: live なら即時、そうでなければ dsh を再起動する。pnpm remove dsh-plugin-1tempo と bundles からの削除。SARASHINA_API_KEY はそのサーバーの ~/.dsh/.credentials.yaml に置く。プラグインはコマンド実行時にキーを読むため、置いた時点で有効になる(再起動は不要)。プロファイルのパッチ(例: ~/.dsh/profiles/dsh-tui/cordis.patch.yml)の insert: に 1 行追加する。
- id: onetempo
name: <このリポジトリの絶対パス>/index.mjs
config:
model: sarashina3-nano
specPreamble: off
name は index.mjs の絶対パス。Windows ではスラッシュ区切りで書く(例: C:/Users/you/1tempo-pulgin/index.mjs)。id は設定画面が設定セクションを引く名前空間になる。/^[a-z][a-z0-9_-]*$/ に一致する必要がある(1tempo は不可)。config は省略可能。省略時は下記の既定値が使われる。id: onetempo が二重になる)。すでに手動の行があるプロファイルへ bundle を入れるときは、先に手動の行を消す。web)同じ手順(上記 1 か 2)を web プロファイルへ行う。手動で入れる場合だけ、insert: 行を ~/.dsh/profiles/web/cordis.patch.yml に置く。プラグインはどちらのホストでも動く(接点は実行時に選ばれる)。
| 用途 | TUI(dsh-tui) | Web UI |
|---|---|---|
| コマンド登録 | ctx.tuiPluginHost(帰属つき)。無ければ ctx.commands | ctx.commands(コアが提供。結果テキストは会話のコマンドカードに出て、複数行は展開表示になる) |
| 確認・編集 | ctx.tuiDialogs.input(初期値つき) | ctx.userQuestions.ask の自由記述。初期値の欄が無いので、現在の MiL は detail に出る。空のまま送ると、その MiL をそのまま使う |
| 中止 | Esc / Ctrl+C / タイムアウト | 質問の取り消し、または dialogTimeoutMs での打ち切り |
| ログ | ctx.tuiPluginStorage(~/.dsh-tui/plugin-storage/、grant が必要) | ctx.storageDomain(~/.dsh/storages/tempo_bridge.json、grant 不要) |
tuiPluginHost / tuiDialogs / tuiPluginStorage)は Web ホストに存在しない。ctx.storageDomain は逆に TUI ホストに mount されていない(実測 2026-10-15)。input.hint の宣言が要る。Web の入力判定(dsh-client-ui-commands の matchEnter)は input を持つコマンドだけを引数つき行として実行し、無い場合はその行をそのままメッセージとして送る(実測 2026-10-17)。ctx.userQuestions.ask() には解決済みの agent を渡す。Web の回答器は live な Agent スコープの要求だけを受け、agent 無しでは NO_PROVIDER になってカードが出ない(実測 2026-10-17)。config または設定セクション(/settings)で変更する。未知の値は警告つきで既定に落ちる。
| キー | 既定 | 意味 |
|---|---|---|
model | sarashina3-nano | 変換モデル(sarashina3-mini / sarashina3-nano) |
backtranslate | off | always で逆翻訳も表示(追加で 1 回呼び出す) |
atSymbol | ext: | 送信前に @ を置換する ASCII 記号。@ と空白と先頭 # は使えない |
failureMode | confirm | confirm(原文送信を確認) / abort(常に中止) |
specPreamble | off | off(MiL のみ送る) / prepend(定義行を前置。原典の運用と同じ) |
includeFrozenExample | true | 形式の見本と依頼の見本を変換指示に同梱する |
stripSpecClauses | true | 変換結果から、定義と逐語一致する節を除去する |
replyLanguageSectionEnabled | false | system prompt に返答言語の指示を足す |
replyLanguageSection | (日本語で返す旨の 1 文) | 上を有効にしたときの文面 |
convertInstruction | (同梱の既定文) | 変換の指示文(見本はこの後ろに付く) |
backtranslateInstruction | (同梱の既定文) | 逆翻訳の指示文 |
temperature | 0 | 再現性のため 0 に固定 |
seed | 20261014 | ベストエフォートの決定性 |
maxCompletionTokens | 2000 | 1〜8000 |
retryWaitsMs | [10000, 20000, 40000] | 429・一時サーバーエラー(5xx)・転送失敗の再試行間隔(最大 3 回) |
requestTimeoutMs | 60000 | 1 呼び出しの上限 |
dialogTimeoutMs | 180000 | 承認・編集ダイアログの上限。明示しないとホスト既定の 30 秒で勝手に取り消される |
minIntervalMs | null | 連続呼び出しの最小間隔。null ならモデルの RPM から算出(nano 1000ms / mini 10000ms) |
includeOriginalInMessage | false | true にすると送信本文の先頭に「依頼: <原文>」を入れる。会話の行が自分の言葉で始まり /rewind で識別しやすいが、その原文はモデルにも渡る(content は会話とモデル入力の両方を兼ねるため、MiL の圧縮効果が失われる) |
specPreamble の使い分け(実測に基づく指針)prepend は定義行を MiL の前に置く。原典の使用例(例A)と同じ運用で、対象モデルが MiL を知らない場合に復号が安定する。代わりにペイロードが定義行の分だけ長くなる。off は軽く、MiL のみを送る。
どちらも復号テストに合格している(preflight-report-run6-off.md / preflight-report-run7-prepend.md。ローカル記録)。対象モデルが MiL を初めて見る場合は prepend、すでに文脈がある場合やトークンを抑えたい場合は off を目安にする。
MiL は @AM09_21 が CC0 1.0 で公開した記法。本プラグインは仕様を改良も公式化もしない。
@ 衝突の報告: https://x.com/AM09_21/status/2103290587374096573仕様の写しと、本プラグイン独自の追加規則は mil-spec/ にある。
| ファイル | 用途 |
|---|---|
mil-spec/prompt-v0-snapshot-2026-09-25.txt | 変換呼び出しの system に渡す定義行のみ |
mil-spec/v0-snapshot-2026-09-25.md | 出典・引用・読み取れる規則・未取得の記録(人向け。モデルには渡さない) |
mil-spec/reference-style.txt | 原典で実際に使われていた本文の形(転記)と合成例 |
mil-spec/examples-v0.txt | 依頼 → MiL の見本(本プラグインが作成。原典には依頼の変換例が無い) |
mil-spec/author-examples.md | 原典の使用例の転記と、そこから読み取れること |
本プラグイン独自の規則(原典には無い。mil-spec/v0-snapshot-2026-09-25.md §4):
@ を ext: へ置換し、復元しない(dsh が @ をファイルメンションとして展開するため)。node --test "tests/*.test.mjs" # 173 件
| パス | 内容 |
|---|---|
index.mjs | プラグイン本体(name / inject / apply、コマンド引数の解釈、変換フロー、ダイアログ、接点の登録) |
cordis.patch.yml | bundle として配布するためのパッチ(- id: onetempo の 1 行)。package.json の dsh.bundle.patch が指す |
locale/{en,ja}.json | dsh のプラグイン一覧に出す表示名と説明(meta.title / meta.description) |
src/delivery.mjs | 承認後の送信(通知の組み立て、送信本文、エージェント選択、ログ結果の報告) |
src/seams.mjs | 任意接点の soft probe(無い構成でも落とさない) |
src/interaction.mjs | 対話接点の抽象化。TUI は ctx.tuiDialogs(初期値つき)、Web は ctx.userQuestions(自由記述のみ・初期値なし・タイムアウト無し=自前の signal で bound)。どちらも無ければ unavailable を返し、未確認の MiL を送らない |
src/storage-domain.mjs | Web ホストの永続化 ctx.storageDomain(defineDomain 相当の spec をローカルに構築。TUI の tuiPluginStorage は Web に存在しない) |
src/config.mjs | 設定の既定値・検証・変換指示の組み立て |
src/mil.mjs | @ 置換、MiL の検証、二ブロック抽出、定義逐語節の除去、引数解析 |
src/sarashina.mjs | Chat Completions クライアント(429 再試行、レート間隔、鍵の redaction) |
src/message.mjs | 送信メッセージの生成(source.kind: 'user'、本文は「依頼+MiL」) |
src/log.mjs | dsh storage 経由のログ(256 KiB 上限に合わせた 50 件のリング)。ハンドルは1アクティベーションにつき1回だけ解決し、使えない場合は失敗として報告する |
src/prompt.mjs | 返答言語の system prompt 段 |
src/settings.mjs | 設定セクションの記述子 |
src/spec.mjs | mil-spec ファイルの読み込み |
src/examples.mjs | 実例の解析 |
src/report.mjs | 実測レポートの解析(ペイロード再利用) |
tools/preflight-decode.mjs | 事前実測(変換 → 復号テスト、--dry、--decode-only) |
tools/draft-examples.mjs | 実例の下書き生成(レビュー前提) |
tools/freeze-example.mjs | 下書きの凍結(現在は不使用。examples-v0.txt は手作業で整備) |
tools/check-cell-width.mjs | 表示セル幅の差分検証(自前の cellWidth を導入済み dsh-tui の stringWidth と比較。過小評価=ホストが切り詰める危険のみを失敗とする) |
# 送信 payload の確認(API を呼ばない)
node tools/preflight-decode.mjs --dry
# 変換と復号テスト(対象モデルを差し替え可能。変換器は Sarashina 固定)
node --env-file=.env tools/preflight-decode.mjs --count 5 --instruction example `
--target-base https://api.commandcode.ai/provider/v1 `
--target-model inclusionai/ling-3.1-flash:free `
--target-key-env COMMANDCODE_API_KEY `
--out preflight-report.md
# 既存レポートのペイロードで復号だけを試す
node --env-file=.env tools/preflight-decode.mjs --decode-only preflight-report-run6-off.md `
--target-base https://api.commandcode.ai/provider/v1 `
--target-model inclusionai/ling-3.1-flash:free `
--target-key-env COMMANDCODE_API_KEY
| 項目 | 状態 |
|---|---|
| 単体・統合テスト | 176 件通過(実プロセスで実行) |
| 変換(Sarashina → MiL) | 実測で確認。実例の形を原典の本文に合わせた時点で成立した(preflight-report-run6-off.md / run7-prepend.md) |
| 復号(spec なしで対象モデルが読めるか) | 実測で確認(commandcode の無料モデル)。ユーザーの本番モデルでは未検証 |
| dsh の接点 | コマンド登録・変換・承認ダイアログ・編集ダイアログ・編集の取り消し(Esc で中止)・送信(agents.followup。会話に MiL が自分の発言として出ることをユーザーが確認)は実機で動作。storage への記録は web 経路で実測(~/.dsh/storages/tempo_bridge.json、ログ: 保存しました(2 件))。引数つき実行(/onetempo こんにちは)と承認カードの表示・編集送信も実機 web で確認(2026-10-17) |
| 変換レポートの表示 | 通知欄のみ(200 セル以内に整形)。会話へ出すプラグイン API が dsh に無い。要望は dsh-feature-request.md |
| 対象モデルの選定 | 未確定(無料モデルで確認したのみ) |
LICENSE)。mil-spec/ に残している。mil-spec/examples-v0.txt は原典ではなく本プラグインが作成した教材である。