Skip to content

feat(agent): 購入 (何を買ったか) を /agent に — ログインして見る・初回だけ Agent のリンクで紐づけ (案 B-3・flag 既定 OFF) - #556

Merged
cipherwebllc merged 2 commits into
mainfrom
feat/agent-purchases-ui
Sep 22, 2026
Merged

cipherwebllc merged 2 commits into
mainfrom
feat/agent-purchases-ui

Conversation

@cipherwebllc

@cipherwebllc cipherwebllc commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

何を足すか (案 B の B-3 = Web・flag 既定 OFF)

/agent の Agent Wallet カード (アクティビティの下) に 「購入 (何を買ったか)」。設計 = plans/agent-purchase-web.md v3 (user 承認)。server (#554) と MCP 0.17 wallet_prove (#555・npm 未 publish) の上に載せる。

状態 表示
未ログイン lead + 「ログインして購入履歴を見る」(SIWE の自前ボタン・掟 7 の siweEnabled は #554 で追加済み)
ログイン済・未紐づけ 「まだ紐づいていません。紐づけは 1 回だけ」+ 手順 2 行 (Agent に頼む → 返ってきたリンクをこのブラウザで開く)
#proof= で着地 mount 直後に replaceState で fragment を消す → 未ログインなら「リンクを受け取りました。ログインすると続けます」→ ログイン後に verify → 「紐づけました」→ 一覧
紐づけ済 日時 / 内容 (path または pathTag・由来バッジ OpenPay / 出品 / 申告) / 金額 + 利用料 / tx リンク・直近 200 件・「2026-09-23 以降の記録」・注記 (欠損しうる・金額と着金はオンチェーンが基準・申告は提供の証明ではない)・「紐づけを解除」(2 段階・ブラウザ dialog なし)
  • 失敗は理由コード別の固定文 (期限切れ / 署名不一致 / 使用済み (やり直せば取り戻せる) / 形式 / 上限 20 / 一時的 / 機能停止)。他人の Agent と未紐づけは同じ文言 (存在を漏らさない)
  • NEXT_PUBLIC_ENABLE_AGENT_PURCHASES が OFF なら dynamic import すらしない → 初期 bundle 354 kB / 予算 356 kB は据え置き・遅延 chunk 3.5 kB gzip (Codex の build 実測)
  • 「Agent に頼めること」6 本目 (無料): 「購入履歴を Web で開いてください。」(flag OFF では出ない)
  • 版切替 0.17 (AGENT_MCP_VERSION・setup.md 5 箇所・agent-templates・AI ストア)・setup.md に wallet_prove の 1 段落・llms.txt 13 ツール + 閲覧できる旨・KPI 3 イベント (agent_purchases_signin / agent_proof_bound / agent_purchases_view・locale のみ)

公開文言 (要承認・lib/agentPage.ts の purchases と tryPrompts 6 本目・setup.md・llms.txt)

ja の主なもの: 見出し「購入 (何を買ったか)」/ lead「この Agent が x402 で買ったものを、OpenPay の決済記録から表示します。持ち主だけが見られます。」/ 未紐づけ「この Agent はまだあなたのアカウントに紐づいていません。紐づけは 1 回だけです。」→ 1.「Agent に『購入履歴を Web で開いて』と頼みます。」2.「返ってきたリンク (5 分有効・1 回だけ) を、このログイン中のブラウザで開きます。」/ 注記「記録は欠損することがあります。金額と着金はオンチェーン (上のアクティビティ) が基準です。『申告』は売り手と買い手が申告した内容で、商品が提供されたことの証明ではありません。」/ 使用済み「このリンクはすでに使われています。別のアカウントに紐づいた場合は、Agent にもう一度頼むと取り戻せます。」。全文は diff の lib/agentPage.ts。en は同内容。

llms.txt の追加句: 「wallet_prove は持ち主が /agent で SIWE ログインしたうえで一度だけ開く紐づけリンクを返し、以後はログインするだけで自分の Agent の購入履歴 (何を・いくら・tx) を閲覧できる」。setup.md (英語) は Step 5 末尾に 1 段落。

検証

  • 対象 19 files / 474 tests pass (新規 AgentPurchases.test.tsx: 4 状態・失敗コード別・fragment 消去・unbind 2 段階・flag OFF で描画なし・hydration・track は locale のみ)・typecheck / eslint OK・build OK (Codex)
  • 実機 (mock wallet + SIWE 署名の横取り・flag ON の dev・使い捨ての Agent 鍵で証明を生成): 着地 (hash は mount 後に空) → 接続 → ログイン → verify → 紐づけ → 一覧 (空) → 解除 (2 段階) → 使用済みリンクで再着地、の通しで pageerror 0・横はみ出し 0。撮影 = plans/agent-purchases-shot.mjs
  • Opus 5 抜け漏れチェック: P0 1 = npm に 0.17.0 が無いまま @0.17 が本番に出る (下の順序で対処) / P1 2 = client Sentry の beforeSend 欠如で #proof= が error event に乗り得る → scrubSentryServerEvent を追加・ウォレット未接続でログインが行き止まり → 接続への案内文に / P2 = 紐づけリンクで入金パネルが開く・検証失敗後に一覧が消える・文言とインデックス定数のフェンス、を反映。反映後に実機の通しを再実行 (pageerror 0)

⚠️ 順序 (Opus P0)

この PR は setup.md / AI ストア / agent-templates の版固定を @0.17 にする。npm に 0.17.0 が無いまま merge すると新規セットアップが失敗する (flag と無関係に公開される)。

  1. user: packages/x402-mcp で npm publish (0.17.0・main の feat(x402-mcp): wallet_prove — Agent の署名で /agent の購入履歴に紐づける一回限りのリンク (0.17.0・案 B-2) #555 の内容 = npm pack --dry-run 12 files) → registry に 0.17.0 が出るのを確認
  2. この PR を merge (dark のまま)
  3. user: Vercel 本番 env に ENABLE_AGENT_PURCHASES=1 と NEXT_PUBLIC_ENABLE_AGENT_PURCHASES=1 (点灯)
  4. 実機一巡: 本番の /agent でログイン → Agent に「購入履歴を Web で開いて」→ リンクを開く → 紐づけ → 新しく 1 件買うと一覧に出る (索引は導入日以降)

追加した公開文言: connectFirst ja「ログインするには、まずヘッダの「接続」でウォレットを接続してください。」/ en "To sign in, first connect a wallet from “Connect” in the header."

🤖 Generated with Claude Code

https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc

… B-3・flag 既定 OFF)

案 B (plans/agent-purchase-web.md v3) の B-3。server (#554) と MCP 0.17 (#555) の上に UI を載せる。

- Agent Wallet カードのアクティビティの下に「購入 (何を買ったか)」。4 状態 = 未ログイン (SIWE の
  自前ボタン) / 未紐づけ (手順 2 行) / #proof= で着地 → ログイン後に verify → 紐づけ / 一覧
  (日時・内容・由来バッジ・金額+利用料・tx リンク・直近 200 件・2026-09-23 以降・欠損しうる・
  申告は提供の証明ではない)・紐づけの解除は 2 段階 (ブラウザ dialog を出さない)
- #proof= は mount 直後に replaceState で消す。他人の Agent や未紐づけは同じ文言 (存在を漏らさない)
- NEXT_PUBLIC_ENABLE_AGENT_PURCHASES が OFF なら dynamic import すらしない (初期 bundle 354 kB /
  予算 356 kB は据え置き・遅延 chunk 3.5 kB gzip)。掟 7 は #554 で siweEnabled 追加済み
- 「Agent に頼めること」6 本目「購入履歴を Web で開いてください。」(flag OFF では出ない)
- 版切替 0.17 (agentSetup・setup.md・agent-templates・AI ストア)・setup.md に wallet_prove の
  1 段落・llms.txt 13 ツール+閲覧できる旨・KPI 3 イベント (locale のみ)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc
@vercel

vercel Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
openpay Ignored Ignored Preview Sep 22, 2026 4:55pm UTC

Request Review

…パネル・検証失敗後の一覧

- P1: client の Sentry に beforeSend が無く、error event の request.url に location.href
  (#proof= の一回限りの署名) がそのまま乗り得た → scrubSentryServerEvent で origin だけに
- P1: ウォレット未接続だと「ログイン」ボタンが行き止まり (署名できない) → 未接続はボタンを
  出さず、ヘッダの「接続」への案内文 (connectFirst・公開文言)
- P2: 紐づけリンク (?address= + #proof=) で入金パネルが開いていた → #proof= のときは開かない
- P2: 検証に失敗すると一覧が消えていた → 紐づけ済みの持ち主が期限切れリンクを開いても一覧は残す
- P2: 「2026-09-23 以降」「200 件」の文言を索引の定数とフェンス

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc
@cipherwebllc
cipherwebllc merged commit 7212a7b into main Sep 22, 2026
7 checks passed
@cipherwebllc
cipherwebllc deleted the feat/agent-purchases-ui branch September 22, 2026 17:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant