@aiquants/daily-report 0.28.0 → 0.29.0
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/CHANGELOG.md +47 -1
- package/README.md +119 -50
- package/dist/client.d.mts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +5 -5
- package/dist/client.mjs +5 -5
- package/dist/{ids-stream-BR5RSj5u.d.ts → comment-adapter-5bAtR4qb.d.ts} +2 -22
- package/dist/{ids-stream-DvB2h1dj.d.mts → comment-adapter-lV2ZB_vH.d.mts} +2 -22
- package/dist/{types-DkERw8NE.d.mts → ids-stream-CWuIDrIO.d.mts} +22 -1
- package/dist/{types-DkERw8NE.d.ts → ids-stream-CWuIDrIO.d.ts} +22 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/server.d.mts +3 -2
- package/dist/server.d.ts +3 -2
- package/dist/server.js +4 -4
- package/dist/server.mjs +4 -4
- package/dist/styles/daily-report.standalone.css +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@aiquants/daily-report` are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.29.0 (2026-10-06)
|
|
6
|
+
|
|
7
|
+
0.28.0 の続き: 添付の経路のフレームワークのデータの要求 (`<token>.data`) の拒否、本体をストリームで返す 2 つの答え (SSE と ID 一覧) の HEAD、読み取りポートの失敗の理由 `busy` と `deadline`、窓の終わりに数を書く拒否と 429 の記録、行のサイズの裏付けの無い `too_large` をキャッシュしない縮小画像の生成、ポインターで押したフォーカスをキーボードのフォーカスと見なさない判定、枠を越えない折り返す文言と側面ペインのパネルの最小の幅、DetailList のカードの日付の `<time>`。どれも README の該当の節が今の契約を記す。
|
|
8
|
+
|
|
9
|
+
### Security
|
|
10
|
+
|
|
11
|
+
- **添付の経路はフレームワークのデータの要求を断る**: React Router のシングルフェッチのデータの要求 (経路が `.data` で終わる `<token>.data`) には、どのオリジンからでも、GET も HEAD も、インライン・ダウンロード・サムネイルのどれも、添付の経路の 404 (`Attachment not found`) で答える。断るのはハンドラー工場の要求の隔離の包みで (経路の方針の `frameworkDataRefusal`、判定は `isFrameworkDataRequest`)、認証・レートの課金・認可・ストレージの読み取りのどれより前に投げ、拒否の記録にも書かない (別オリジンの拒否ではない)。
|
|
12
|
+
以前は、別オリジンのページのリンクから開く最上位のナビゲーションとして `<token>.data?inline=1` が隔離を通り、原本をストレージから読んだ後、React Router が本体を最後まで読んで文字列へ符号化し、`Set-Cookie` のほかのヘッダー (`private, no-store`・CSP の sandbox・`nosniff`・`Cross-Origin-Resource-Policy`・`X-Frame-Options`・`Content-Disposition`) を捨てて答えた (8 MiB の原本で約 1,250 万文字、ヒープの見積り「同時実行 × 上限」の外で約 37 MiB)。API・action・SSE の経路はデータの要求を今までどおり受ける。本体をストリームで返す 2 つはホストの経路で断る (README の Server wiring の Streaming routes)。
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **SSE と ID 一覧のストリームの HEAD は本体の仕事を始めない**: React Router はリソースの経路の loader を HEAD にも走らせ、本体を読みも取り消しもせずに捨てる (アダプターは送り終えた応答の要求のシグナルも中断しない)。`sse.loader` は HEAD に GET と同じ状態とヘッダーで答え、Fan-Out の購読・heartbeat・可視集合の再解決のタイマーを始めない。ID 一覧もカーソルの検証 (400) までを GET と同じに行ってから、GET の 200 と同じヘッダーで本体なしに答え、全量と先頭ページのクエリを走らせない。既に中断された GET も同じ。
|
|
17
|
+
以前は認証済みの HEAD の要求 1 つが、購読・heartbeat・可視集合の再解決のタイマー (DB への問い合わせ) を、誰も読まないままプロセスが終わるまで残した。
|
|
18
|
+
- **API の経路のエンドポイントとメソッド**: 順は認証 (401)・エンドポイント (知らない名前は 404。`toString` のような継承した名前も)・メソッド (エンドポイントが答えないメソッドは 405 と `Allow`。JSON のエンドポイントは `GET`、ID 一覧は `GET, HEAD`)。以前は GET 以外を `Allow` の無い 405 で断り、エンドポイントの名前を素のオブジェクトから引いた。
|
|
19
|
+
- **行のサイズの裏付けの無い `too_large` をキャッシュしない**: サムネイルの生成は、読み取りポートの `too_large` を、行が上限を超えるサイズを記録しているときだけ内容で決まる結論として記録する。サイズを記録していない行の `too_large` (裏付けが無い。ホストが一時的な拒否を `too_large` と取り違えても同じに見える) には、その要求に 404 (`Cache-Control: no-store`、検証子なし) で答えて記録せず、行は `reason=too_large size=unrecorded` (info。食い違いではないので `size_mismatch` は書かない)。次の表示は読み取りポートへもう一度問う。
|
|
20
|
+
以前は全利用者に共有され期限の無い 404 をキャッシュしたので、ストレージの接続あたりのストリームの上限で 1 度断られただけの画像が、プロセスの寿命のあいだ誰にもプレビューを出さなかった (1 回の読み取りで 404・404・404)。
|
|
21
|
+
- **ポインターで押したフォーカスはキーボードのフォーカスではない**: キーボードのフォーカスの判定 (`isKeyboardFocused`) は、`:focus-visible` に一致し、要素の文書の最後の入力がポインターの押下でないこと。最後の入力は、その文書のビューがマウントされている間、文書ごとに記録する (`observeInputModality`: 捕獲段の `pointerdown` でポインター、修飾キーだけでない `keydown` でキーボード)。行を見せるスクロールとビューの根要素の `data-daily-report-keyboard-focus` は、どちらもこの判定だけを読む。
|
|
22
|
+
以前は `:focus-visible` だけで決めたので、ポインターの押下でもブラウザーが `:focus-visible` とする文字入力の要素 (行のコメント欄・編集フォーム) をクリックすると、ビューが行を見せるスクロールをし、根要素に属性を付けて、タップスクロールのサークルを次の押下まで隠した。
|
|
23
|
+
- **折り返す文言は枠を越えない**: `WRAPPING_LABEL_CLASS_NAME` は `text-balance wrap-anywhere [word-break:auto-phrase]`。足した `overflow-wrap: anywhere` は 1 行に収まらない文節や語だけをその中で折り、その折り目を最小の内容の幅にも数えるので、flex の項目の自動の最小の幅が文言を最長の文節の幅に留めない (継承する性質なので、タイルの文言の箱の匿名の flex の項目にも届く)。文節が収まるところの行は変わらない。
|
|
24
|
+
以前は側面ペインの選択を促す文言 (ja) が flex の項目の自動の最小の幅で最長の文節 「選択してください。」 (126 px) に留まり、ペインの幅 160〜197 px で破線の仮の面を左右 7 px ずつ越えた。
|
|
25
|
+
- **側面ペインのパネルの最小の幅は 200 px**: 選択を促す文言を囲む枠 (パネルの余白 2G 16・カードの面の寄せ 2 × 16・仮の面の寄せ 2 × 12 = 72) と、既定の根での文言の最長の文節 (9 字 × 0.875 rem = 126 px) の和 198 を、4 px の格子へ切り上げた値 (`SIDE_PANE_PANEL_MIN_WIDTH_PX`)。既定の根では ja の文言が文節の境だけで折り返し、はぐれた字の行を残さない。一覧のパネルの最小は 160 px のまま (以前は両方とも 160 px)。
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **読み取りポートの失敗の理由に `busy` と `deadline`**: `DailyReportAttachmentFailure` は閉じた 1 つのユニオンで、どの理由にも答えるステータスが決まる (`not_found`・`denied`・`invalid_path` は 404、`too_large` は原本 413・縮小画像 404、`unavailable` は 502)。新しい `busy` (ストレージが今は受けない一時的な拒否。接続あたりのストリームの上限ですぐ断られたなど) は 503 と `Retry-After: 5`、`deadline` (ストレージの呼び出しがポート自身の締め切りを過ぎた) は 504 で、原本と縮小画像で同じ。縮小画像の生成はどちらも結論にせず、キャッシュにも実体消失にも書かない (生成の合流を待った要求は同じ失敗を受け、次の要求は読み直す)。ログは warn。
|
|
30
|
+
ユニオンの外の理由は、推測で 502 へ寄せずにポートの契約違反の 500 (`reason=port_contract code=failure_reason`、error) にする (以前は 502)。縮小画像の 503 の文面は原因によらず `Thumbnail temporarily unavailable` (以前は `Too many concurrent thumbnail requests`)、504 は `Thumbnail storage timed out`。原本の 503 は `Attachment storage busy`、504 は `Attachment storage timed out`。README の読み取りポートの例は、自前の締め切りだけが止めた呼び出しを `deadline` で返す。
|
|
31
|
+
- **拒否と 429 の数は窓の終わりに書く**: 要求の隔離の拒否の記録と、添付の 3 つのレートのバケットの 429 の記録は、1 つの窓の仕組み (`createSuppressionWindows`。状態はインスタンスが持つ) を使う。キーの最初の事象がその場で自分の行を書いて窓を開き、窓の中の後の事象は数えるだけで、窓自身のタイマー (unref) が窓の終わりに、数えたものがあれば数の行を書いて窓を閉じる。
|
|
32
|
+
数の行は `cross_site_rejected_suppressed count=<N> since=<窓の始まりの ISO 8601> routes=api:<n>,action:<n>,sse:<n>,attachment:<n>` と `rate_limit_suppressed count=<N> since=<…> viewer=<id>` (縮小画像は `variant=thumbnail` を足し、再検証のバケットは `revalidation_rate_limit_suppressed`)。429 の窓は閲覧者とバケットごとで、長さは `RATE_LIMIT_LOG_WINDOW_MS` (60 秒、429 の `Retry-After`)。キーごとに窓 1 つにつき 2 行まで。窓を決めるのはタイマーだけで、壁時計は `since=` を刻むだけ (時計が戻ったときの規則は無くなった)。
|
|
33
|
+
以前は数を次の事象まで持ち越したので、続きが止まった窓の数は書かれず、ずっと後の無関係な拒否がその時刻で窓の始まりも経路も無く書いた。429 は利用者の次の許可を待ったので、拒否が止まったかバケットが追い出された数は失われ、要求を送り続けるクライアントには補充のたびに 2 行 (上限 60/分で 1 分に約 120 行) を書かせた。
|
|
34
|
+
- **DetailList のカードの日付はどれも `<time datetime>`**: メタデータの列の作成日時・更新日時・営業日も、見出しの札 (営業日・更新日時) と同じ部品 (`DateText`) で描く。無い日付の `-` は文字のまま。以前は同じ行の同じ日付を、見出しでは `<time>`、メタデータの列では平らな文字で公開した。
|
|
35
|
+
- **配置の格子の単位の契約の文言**: `DAILY_REPORT_LAYOUT_LATTICE_PX` の docstring と README の View height は、ホストができることだけを書く。ホストはビューの周りのバー (ヘッダーとフッター) をこの単位の倍数にそろえ、ビューの上の縁を格子に乗せる。ウィンドウの高さは決められないので、単位で割った余りはビューの中に残る。
|
|
36
|
+
端へ揃えた行は、ビューの端と行の箱が整数の装置の画素にあればちょうど G (整数の画素密度ではビューの端が整数の CSS px にあるとき、1.25・1.5・1.75 ではビューの端が格子にあるとき)、それ以外 (0.9・1.1・1.33 などのブラウザーの拡大率を含む) では端を守る寄せで G 以上 G + 1 装置画素未満。クラスを字面で書くホスト (Tailwind) は、字面をこの値へ単体テストで結び付ける。
|
|
37
|
+
- **開発者向け**: ID 一覧の行の分割 (`createNdjsonLineSplitter`) は、テストのためだけの数え (`scannedCharacters`) をクライアントのバンドルに持たない。線形時間の spec は `String.prototype.indexOf` と `split` が調べた文字を数え、1 MiB を 1 KiB ずつ送って長さの 2 倍以下を求める (持ち越して全体を分け直す旧い形では約 5 億 3,800 万文字)。
|
|
38
|
+
`src/docs-examples.spec.ts` は、README と `docs/specs` の文のうちピアの下限を名乗る文が、`peer-floors.json` の下限のほかの版を書くと落ちる (公開の検査は manifest しか読まない)。ID 一覧のエンドポイントの名前はクライアントとサーバーが `DAILY_REPORT_IDS_STREAM_ENDPOINT` を共有する。
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- server の値 `DAILY_REPORT_IDS_STREAM_ENDPOINT` (`"ids-stream"`): ID 一覧の NDJSON を流す API のエンドポイントの名前。クライアントの URL とサーバーのエンドポイントの表がこれを使い、ホストは字面を書き写さずにこのエンドポイントだけを見分ける (React Router のデータの要求をこのエンドポイントについて断るなど。README の Server wiring の Streaming routes)。
|
|
43
|
+
- server の型 `DailyReportAttachmentFailure` の `busy` と `deadline` (上の Changed)。
|
|
44
|
+
|
|
45
|
+
### Breaking
|
|
46
|
+
|
|
47
|
+
- 読み取りポートが `DailyReportAttachmentFailure` の外の理由を返すと、どちらの配信もポートの契約違反の 500 で答える (以前は 502)。`DailyReportAttachmentFailure` を
|
|
48
|
+
網羅して分岐するホストのコード (理由ごとの表など) は、型検査が `busy` と `deadline` の欠けを示す。
|
|
49
|
+
Migration: ポートは 7 つの理由だけを返す (ストレージの一時的な拒否は `busy`、自前の締め切りを過ぎた呼び出しは `deadline`)。理由で分岐するホストのコードに 2 つを足す。
|
|
50
|
+
|
|
5
51
|
## 0.28.0 (2026-10-05)
|
|
6
52
|
|
|
7
53
|
0.27.0 の続き: 要求の隔離の許可の一覧化 (別オリジンから受けるのは添付の原本を開く最上位の文書のナビゲーションだけ)、Fetch Metadata の無い要求の `Origin` による判定、拒否の上限付きの記録、添付のどの応答にも枠の方針、配置の格子の単位と E2E のテスト用ハンドルの型の公開、ID 一覧のストリームの行の線形な分割、折り返す文言の改行の規則。どれも README の該当の節が今の契約を記す。
|
|
@@ -16,7 +62,7 @@ All notable changes to `@aiquants/daily-report` are documented here.
|
|
|
16
62
|
|
|
17
63
|
### Added
|
|
18
64
|
|
|
19
|
-
- client の値 `DAILY_REPORT_LAYOUT_LATTICE_PX`: 配置の格子の単位 (4 CSS px)。パッケージ自身の格子の単位そのもので、ホストがビューの周りのバー (
|
|
65
|
+
- client の値 `DAILY_REPORT_LAYOUT_LATTICE_PX`: 配置の格子の単位 (4 CSS px)。パッケージ自身の格子の単位そのもので、ホストがビューの周りのバー (ヘッダーとフッター) の大きさをこの倍数にそろえ、ビューの上の縁を格子に乗せる契約 (ウィンドウの高さはホストが決められないので、単位で割った余りはビューの中に残る。README の View height の G-symmetric frame)。公開する配置の値はこれだけで、行の大きさは公開しない。
|
|
20
66
|
- client の型 `DailyReportViewTestHandle`・`DailyReportViewTestReadHandle`・`DailyReportRevealOptions`: E2E のテスト用ハンドル (`__virtualScroll`) の契約とその読み取りの部分、`revealIndex` の揃えの型 (VirtualScroll の `scrollToIndex` の第 2 引数。virtualscroll 3.11.0 の見せる操作 `{ align: "nearest" }` も含む)。型だけの公開なので、バンドルは増えない。ホストのテストは形を書き写さずに読み込む。
|
|
21
67
|
|
|
22
68
|
### Changed
|