Skip to content

kotodama-project/kotodama-dots-discord-luma

v0.1.1

作成済みのDotとKotodama Discord Botを接続し、Lumaイベントを準備するローカルプラグイン

DotsからDiscordとLumaイベントを使う

作成済みDotとKotodama Discord templateをつなぐlocal pluginです。Dotの既存plugin・computer・browserを使います。OpenAIへの適合方針も参照してください。

操作

/kotodama dots text:...、または許可channelのBotへのmentionで受付します。agent channelでは依頼者の新しいmessageを受付できます。訂正・削除は古い返答を止めます。/kotodama dots_stop request:...で受付を取消せます。Dotの別の背景作業はChatGPTのActivityで確認・停止します。

Lumaの新規作成・既存イベント更新を準備できます。設定と説明の全文、確認buttonを本人へ送ります。本人の許可は5分間、一つの内容・対象に一回だけ有効です。Dotが接続済みLuma pluginを優先し、必要な接続や機能がなければ公式websiteで操作します。読戻しを記録し、有料ticketや招待送信は含みません。

事前条件

  • Node 24以上、templateの固定依存、Discord Botのconfigとcredential。
  • 作成済みDotがpluginを使えるcomputer/environmentへ接続されている。local skillには接続computerが必要で、そのcomputerとChatGPT appを開いておく。
  • Dot ownerのDiscord operatorを一人、利用channelを明示する。
  • 既存の認証済みLuma plugin接続を優先する。websiteでは利用者がすでにloginしたbrowser sessionを再利用する。別browser/profileは本人が明示的に選んだ場合の選択肢で、defaultにしない。新しいloginは本人が行い、cookieのコピーや既存browserの再起動で移さない。

configの追加例:

{
  "dots": {
    "enabled": true,
    "actorId": "100000000000000002",
    "channelIds": ["100000000000000003"],
    "requestTtlSeconds": 3600
  }
}

IDsは合成例です。actorはdiscord.operators、channelはdiscord.textChannelIdsから選びます。既定はdisabled。Bot起動・slash command登録はtemplateの手順を使います。

通常messageへの返答は同じchannelが既定です。dots.replyModeをdmにすると本人のDMへ返します。privateなslash相談と、正確な住所などを含むLumaの内容確認は本人のDMへ届けます。CodexCatchupの専用確認channelは既存adapter側の接続確認で扱います。

Luma候補の説明・場所・URLなど、このtransportが複製した詳細は既定7日で消去します。dots.draftRetentionDaysで1〜30日に設定できます。起動時・読取時・稼働中の定期回収で適用し、内容を含まないdigestと操作状態は残します。元のSourceやTask ownerの記録を消す操作ではありません。

開始済みの操作は、受付期限の後でも同じclaimと不変のSource・現在の閲覧権限で読戻しを記録できます。これは新しい操作や期限後のDiscord送信の許可ではありません。期限後の結果はDotと保存済みreportで確認し、Botからの新しい返答には新しい受付を使います。

内容確認のDMが届かなかった場合は、本人が/kotodama luma_review draft:...で同じ候補を自分だけの表示として開けます。未知のDMを自動再送せず、candidateを変えずに全文と確認buttonを表示します。許可後の操作は引き続き一回だけです。

Pluginの設定

portable manifestはplugin.json、MCP設定はmcp.json、運用skillはskills/discord-luma/SKILL.mdです。公式SDKのstdio serverを使います。MCP hostへ次の環境変数を渡します。

  • KOTODAMA_DISCORD_ROOT: 導入済みruntime/discord-templateの絶対path。
  • KOTODAMA_DOTS_CONFIG: 対象Bot configの絶対path。

serverはrunning templateのloopback controlを使い、hostのowner/pid/start timeを照合します。credential・control token・config pathをツール結果へ返しません。cacheへコピーしても指定したtemplateからSDKとcontrolを読みます。public packageに個人のpathやcredentialを埋め込みません。

登録はOpenAIのlocal plugin手順に従います。repoの編集だけでDotへのinstallやcomputer accessを完了したとは扱いません。実行中appを自動で再起動しません。

Dotへoperator/channel、返答先、監視期間を伝えます。discord_requestsは呼ばれた時点の読取です。MCP Eventsや即時起動にはprotocol 2026-07-28のwebhook、callback検証、remote HTTPSと接続受入が別途必要です。固定間隔の監視も、設定と実際の新着受付を確認してください。

discord_requestsは既定で10件までの全文を返します。nextCursorがあれば最後まで辿ると、先に来た未返答の相談で後続が隠れません。一回のscanは開始時点の到着範囲で終わり、次のscanをcursorなしで始めると新着も読めます。一時的に閲覧できなかった相談はunavailableとcomplete: falseで分かり、次のscanで再確認します。読取は相談の処理済み化や常時監視の設定を行いません。

閲覧確認は一回2秒、一覧の一ページは8秒を上限に待ちます。timeout後も実際のSDK読取が終わるまで最大8件の枠を保持し、同じ相談の再読で未終了の確認を重ねません。遅い確認で一覧全体を待ち続けず、残りはcursorから続けます。timeoutやDOTS_ACCESS_BUSYは許可の失効と区別し、本文を返さず次の読取で確認します。

長い相談が多い場合はincludeText: falseでID・revision・短いpreviewを読み、必要な相談だけdiscord_read_requestで全文を取得できます。offset 0からnextOffsetがnullになるまで同じrevisionとtextDigestで読みます。一回は最大4096 UTF-16単位で、surrogate pairを切らずに返します。previewは全文ではありません。ページごとに元のSource・閲覧範囲・受付状態を確認し、訂正・取消・期限切れ・失効があれば古い文脈の続きは拒否します。通常の相談・返答の操作は変わりません。

受入の流れ

  1. 合成の相談をDiscordで受付し、Dotから同じID/revisionを読む。
  2. discord_replyで返し、送信先とmessage IDを確認する。
  3. 別の相談を訂正・削除し、古い返答が拒否されることを確認する。
  4. Lumaの合成候補と全文JSONを確認する。未許可・別人・訂正後・期限切れで操作を取得できないことを確認する。
  5. 本人の許可後、luma_claim_operationで一回だけ取得する。既存イベントは対象URLと設定を読み直し、変更があれば候補と許可を更新する。
  6. 接続済みLuma pluginまたは公式websiteからURLと全項目を読戻し、luma_report_eventへ記録する。DOT_REPORTED_NOT_INDEPENDENTLY_VERIFIEDは別の確認までprovider PASSにしない。

tests/dots.test.mjsは受付・権限・訂正・重複送信・中断・Luma binding、cursorの公平な読取、長文の復元と公式SDKのstdio接続を確認します。live Discord、Dot自身の呼出し、Luma plugin/websiteの実操作は別の受入です。

長文のtransport benchmarkはtemplate directoryから次で実行できます。通常のpnpm testにも同じ検証を含めます。

node tools/benchmark-dots-context.mjs

合成の38件、50万UTF-16単位以上の日本語・Arabic・English・emojiを、packageの公式SDK stdioとrunning runtimeのloopbackを通して読み戻します。全文一致、末尾の訂正条件、compact discovery、選択した相談の全文page、Source訂正・取消・config失効の拒否を確かめ、内容を含まないJSONで転送量・呼出し数・時間を返します。時間はその実行環境の観測値です。modelの推論品質や実Dotの常時読取、live Discord/Lumaの受入は測定しません。