@takagaki/cortex-decisions-viewer 0.12.153 → 0.12.157
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/dist/render.js +64 -11
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -9419,6 +9419,10 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
9419
9419
|
"github-issues": { icon: "🐙", label: "GitHub Issues" },
|
|
9420
9420
|
"github-discussions": { icon: "💠", label: "GitHub Discussions" },
|
|
9421
9421
|
};
|
|
9422
|
+
/** Teams 管理センターの会議ポリシー(文字起こしの設定がある画面)。固定の公開 URL */
|
|
9423
|
+
var TEAMS_ADMIN_MEETING_POLICY_URL = "https://admin.teams.microsoft.com/policies/meetings";
|
|
9424
|
+
/** Figma の設定(Security の個人アクセストークン)。固定の公開 URL */
|
|
9425
|
+
var FIGMA_SETTINGS_URL = "https://www.figma.com/settings";
|
|
9422
9426
|
var DS_GATE = {
|
|
9423
9427
|
"ok": { text: "接続OK", cls: "ds-gate-ok" },
|
|
9424
9428
|
// **状態だけでなく、次にすることを書く。** 「bot未招待」では何をすればよいか分からない
|
|
@@ -9533,6 +9537,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
9533
9537
|
text: "文字起こしの外部取得がオフです",
|
|
9534
9538
|
cls: "ds-gate-warn",
|
|
9535
9539
|
help: "Teams 管理センターの会議設定で「文字起こしへの API アクセス」をオンにしてください。",
|
|
9540
|
+
helpLink: { href: TEAMS_ADMIN_MEETING_POLICY_URL, label: "Teams 管理センターを開く →" },
|
|
9536
9541
|
},
|
|
9537
9542
|
// RSC のチャネル会議には掛からない見込み(PoC C で確認)。文言は、この状態が
|
|
9538
9543
|
// 返ったときのために残す(#841)
|
|
@@ -9547,6 +9552,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
9547
9552
|
text: "話者名付きの文字起こしがオフです",
|
|
9548
9553
|
cls: "ds-gate-warn",
|
|
9549
9554
|
help: "Teams 管理センターの会議設定で話者名付き文字起こしをオンにしてください。オフのままだと取り込みません。",
|
|
9555
|
+
helpLink: { href: TEAMS_ADMIN_MEETING_POLICY_URL, label: "Teams 管理センターを開く →" },
|
|
9550
9556
|
},
|
|
9551
9557
|
"folder_not_granted": {
|
|
9552
9558
|
text: "フォルダへのアクセス許可がありません",
|
|
@@ -9751,6 +9757,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
9751
9757
|
* 出さないもの: テナント外の断り(#841・導入の有無を明かさない)と、確かめられなかった
|
|
9752
9758
|
* 組織(source: "unknown"・帯が導線を出さない設計)
|
|
9753
9759
|
*/
|
|
9760
|
+
var GITHUB_APP_RECHECK_TEXT = "入れたら「接続を確認」を押してください。";
|
|
9754
9761
|
function githubRowHelpParts(row) {
|
|
9755
9762
|
if (!row) return null;
|
|
9756
9763
|
if (githubOrgRefused(row)) return null;
|
|
@@ -9765,10 +9772,13 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
9765
9772
|
var linkable = !!slug || !LIVE_GH_OWNERS;
|
|
9766
9773
|
var pick = row.gate === "unreachable" && meta && meta.appInstalled === true;
|
|
9767
9774
|
var say = pick ? "GitHub App の設定で、このリポジトリを選んでください。" : "この組織に Cortex の GitHub App を入れてください。";
|
|
9768
|
-
if (!linkable) return [say];
|
|
9775
|
+
if (!linkable) return pick ? [say] : [say, { br: true }, GITHUB_APP_RECHECK_TEXT];
|
|
9769
9776
|
// 部品には行の生の値を渡す(宛先の検めは githubAppLinkUrl が持つ。ここの slug はリンクを出すかの判断だけ)
|
|
9770
9777
|
var raw = meta && meta.appSlug;
|
|
9771
|
-
|
|
9778
|
+
// 入れた後の一手は同じ段落の 1 行に添える(行の補足は最大 1 段)。選び直す方(pick)は入れ直しではないので添えない
|
|
9779
|
+
return pick
|
|
9780
|
+
? [say, { link: "インストール設定を開く →", kind: "settings", slug: raw }]
|
|
9781
|
+
: [say, { link: "GitHub App を入れる →", kind: "install", slug: raw }, { br: true }, GITHUB_APP_RECHECK_TEXT];
|
|
9772
9782
|
}
|
|
9773
9783
|
/**
|
|
9774
9784
|
* Slack の「見えない」行(unreachable・no_token・組織不明の仮置き)に出す一手(c-07・g-66)。
|
|
@@ -10033,6 +10043,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
10033
10043
|
text: "トークンが未登録です",
|
|
10034
10044
|
cls: "ds-gate-muted",
|
|
10035
10045
|
help: "Figma のトークンを入れてください。",
|
|
10046
|
+
helpLink: { href: FIGMA_SETTINGS_URL, label: "Figma の設定でトークンを発行する →" },
|
|
10036
10047
|
act: "figma-key",
|
|
10037
10048
|
},
|
|
10038
10049
|
// 「アクセス不可」では、トークンの失効なのか(403)ファイルを共有していないのか(404)が
|
|
@@ -10101,6 +10112,11 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
10101
10112
|
}
|
|
10102
10113
|
if (gate.help) {
|
|
10103
10114
|
var p = el("p", { class: cls, text: gate.help });
|
|
10115
|
+
// 行き先が決まっている一手は押せるリンクにする(人に操作を頼む文を、押せない文のまま出さない)
|
|
10116
|
+
if (gate.helpLink) {
|
|
10117
|
+
p.appendChild(document.createTextNode(" "));
|
|
10118
|
+
p.appendChild(el("a", { href: gate.helpLink.href, target: "_blank", rel: "noopener", text: gate.helpLink.label }));
|
|
10119
|
+
}
|
|
10104
10120
|
appendGateActs(p, gate);
|
|
10105
10121
|
return [p];
|
|
10106
10122
|
}
|
|
@@ -16600,7 +16616,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
16600
16616
|
* オーバーレイ要素だけにリスナを張るのでは足りない(フォーカスが body にあると経路を通らない)。
|
|
16601
16617
|
*
|
|
16602
16618
|
* @param lines 表示する行(1行1段落)。先頭行が主文=読み上げの名前になる
|
|
16603
|
-
* @param opts { okLabel, returnTo, okDanger, body }
|
|
16619
|
+
* @param opts { okLabel, cancelLabel, returnTo, okDanger, body }
|
|
16604
16620
|
* okDanger … OK ボタンを赤で出すか(既定 true)。false は「広げる向き」の確認用
|
|
16605
16621
|
* body … lines の後・ボタンの前に挿す DOM 節(任意)。**押す前に決めることがある確認**
|
|
16606
16622
|
* のための口(いまこの口を使っている呼び出しは無い)。
|
|
@@ -16626,7 +16642,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
16626
16642
|
box.appendChild(pnode);
|
|
16627
16643
|
});
|
|
16628
16644
|
if (o.body) box.appendChild(o.body);
|
|
16629
|
-
var cancel = el("button", { class: "modal-cancel", type: "button", text: "キャンセル" });
|
|
16645
|
+
var cancel = el("button", { class: "modal-cancel", type: "button", text: o.cancelLabel || "キャンセル" });
|
|
16630
16646
|
// **既定は赤(ds-danger)。** ここに来る操作はほぼ全部が取り消せない向きなので、
|
|
16631
16647
|
// 既定を変えない。**okDanger: false のときだけ通常の見た目**——「広げる向き」の
|
|
16632
16648
|
// 操作を削除と同じ赤で出すと、止めるべき操作に見える
|
|
@@ -19982,14 +19998,35 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
19982
19998
|
var meta = app.querySelector(".detail-meta");
|
|
19983
19999
|
if (meta && meta.parentNode) meta.parentNode.insertBefore(stale, meta.nextSibling);
|
|
19984
20000
|
}
|
|
20001
|
+
/**
|
|
20002
|
+
* 削除の確認の窓に出す行。先頭行が主文(何を消すか=区画と題)、次が「消すと何が起きるか」。
|
|
20003
|
+
* 起きることは区画ごとに実際のとおり書く(サーバの DELETABLE_SECTIONS と同じ4区画。削除と同じ
|
|
20004
|
+
* コミットで区画の除外リストへ足す)。窓に出す語は短く、不安を煽らない。
|
|
20005
|
+
*/
|
|
20006
|
+
var DELETE_EFFECTS = {
|
|
20007
|
+
Decisions: "この決定を消し、以後同じ題で作り直さないよう「除外決定」の一覧に足します。",
|
|
20008
|
+
Glossary: "この用語を消し、以後同じ語で作り直さないよう「除外用語」の一覧に足します。",
|
|
20009
|
+
Members: "この関係者の記録を消し、以後同じ人で作り直さないよう「除外メンバー」の一覧に足します。",
|
|
20010
|
+
Rules: "このルールを消し、以後同じ題で作り直さないよう「除外ルール」の一覧に足します。",
|
|
20011
|
+
};
|
|
20012
|
+
function deleteConfirmLines(rec, path) {
|
|
20013
|
+
var m = /^Cortex\\/([^/]+)\\//.exec(path || "");
|
|
20014
|
+
var dir = m ? m[1] : "";
|
|
20015
|
+
var title = (rec && rec.title) || (rec && rec.fileName) || "(題なし)";
|
|
20016
|
+
return [
|
|
20017
|
+
dirLabel(dir) + "「" + title + "」を削除します。",
|
|
20018
|
+
DELETE_EFFECTS[dir] || "この記録を消します。",
|
|
20019
|
+
"消した中身は履歴に残り、あとから戻せます。",
|
|
20020
|
+
];
|
|
20021
|
+
}
|
|
19985
20022
|
/**
|
|
19986
20023
|
* 削除の口(ボタンと、その結果を出す行)。**置き場は呼び出し側が決める。**
|
|
19987
20024
|
*
|
|
19988
20025
|
* **どの記録にも出す**(cortex-engine #1094 段 4 問い 2・2026-10-04 のオーナー決定)。8/28 の裁定
|
|
19989
20026
|
* 「人間の承認が挟まったものは削除の選択肢を出さない」は置き換えた——画面を見る人には裏の
|
|
19990
20027
|
* 履歴が見えず、見た目の違いが無いのにボタンの有無が分かれるのは分からないため。人の手のある記録にも
|
|
19991
|
-
*
|
|
19992
|
-
* op=delete-record が 1
|
|
20028
|
+
* 同じ口を出す。押すと確認の窓を出し(2026-10-16・cortex-engine #1781)、[削除する]を選んだときだけ
|
|
20029
|
+
* op=delete-record が 1 回送られる。intake も status では断らない。
|
|
19993
20030
|
*
|
|
19994
20031
|
* 呼び出し側は2つ:
|
|
19995
20032
|
* - draftNote …… 未確認の記録。「確認済みにする」と並べて警告帯の中に置く
|
|
@@ -19999,12 +20036,15 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
19999
20036
|
var path = deletableRecordPath(rec);
|
|
20000
20037
|
if (!path) return null;
|
|
20001
20038
|
// **語尾の「…」は 2026-08-29 のオーナーFBで外した。** 二択の相方(「確認済みにする」)と
|
|
20002
|
-
//
|
|
20003
|
-
//
|
|
20039
|
+
// 語の形が揃わず、片方だけが下書きのように見えていた。確認は語尾ではなく、押したあとの
|
|
20040
|
+
// 確認の窓で出す(2026-10-16 のオーナーの誤削除を受けて・cortex-engine #1781)
|
|
20004
20041
|
var btn = el("button", { class: "record-delete-btn", type: "button", text: "削除する" });
|
|
20005
20042
|
var msg = el("div", { class: "record-delete-msg" });
|
|
20006
20043
|
btn.addEventListener("click", async function () {
|
|
20007
|
-
//
|
|
20044
|
+
// 押しただけでは送らない。画面内の確認の窓で[削除する]を選んだときだけ 1 回送る
|
|
20045
|
+
//(やめる・窓の外・Esc は何もしない。ブラウザの confirm は使わない)
|
|
20046
|
+
var ok = await openConfirm(deleteConfirmLines(rec, path), { okLabel: "削除する", cancelLabel: "やめる", returnTo: btn });
|
|
20047
|
+
if (!ok) return;
|
|
20008
20048
|
await sendDeleteRecord(rec, path, msg, btn, function () { markRecordDeleted(rec); markPageStale(); });
|
|
20009
20049
|
});
|
|
20010
20050
|
return { btn: btn, msg: msg };
|
|
@@ -20051,6 +20091,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20051
20091
|
* 「作ったはずのものが出てこない」状態が永久に続く(破棄の条件は applyDeleteTombstones)。
|
|
20052
20092
|
*/
|
|
20053
20093
|
function deletedStoreKey() { return "cortex-deleted:" + REPO_SLUG; }
|
|
20094
|
+
var TOMBSTONE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
20054
20095
|
// 「削除より後に始まったビルドか」を判断するときの余裕は PENDING_OPS_MARGIN_MS(30分)。
|
|
20055
20096
|
// **同じ性質の待ちなので定数も1つ**(#391)——別に持つと片方だけ直したときに割れる
|
|
20056
20097
|
|
|
@@ -20093,8 +20134,19 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20093
20134
|
* クライアントの時計が大きく狂っていても機能が丸ごとは死なない(進んだ時計なら
|
|
20094
20135
|
* 再表示が遅れるだけ)。
|
|
20095
20136
|
*/
|
|
20096
|
-
function tombstoneStale(t, nowMs) {
|
|
20137
|
+
function tombstoneStale(t, nowMs, clockMs) {
|
|
20097
20138
|
if (!t) return false;
|
|
20139
|
+
// 読めない時刻の印は捨てる(壊れた値が隠し続ける側に倒れない)
|
|
20140
|
+
if (typeof t.at !== "number" || !isFinite(t.at)) return true;
|
|
20141
|
+
// 期限切れ(24 時間)。クライアントの時計は注入できる(テスト用 window.__cortexNowMs)
|
|
20142
|
+
if (clockMs - t.at > TOMBSTONE_TTL_MS) return true;
|
|
20143
|
+
// 画面の世代が、削除した画面の世代(gen0)より新しくなった=新しい世代に記録が居るなら、
|
|
20144
|
+
// 戻された(または作り直された)もの。余裕は取らない(取ると、戻した直後の世代で
|
|
20145
|
+
// 消した本人にだけ記録が出ない)。代わりに、削除前の状態から始まったビルドが削除後に
|
|
20146
|
+
// 完成した場合は、次のビルドまで本人にだけ一時的に戻って見える(発注書で了解済みの取捨選択)
|
|
20147
|
+
var g = pendingSiteTimeMs(t.gen0);
|
|
20148
|
+
if (!isNaN(nowMs) && !isNaN(g) && nowMs > g) return true;
|
|
20149
|
+
// gen0 が読めない古い形式は、削除時刻だけで見る(後方互換)
|
|
20098
20150
|
return pendingStale(t.at, t.gen0, nowMs);
|
|
20099
20151
|
}
|
|
20100
20152
|
/** トゥームストーンの相手を SITE から探す(id で引き、無ければパスで照合) */
|
|
@@ -20121,13 +20173,14 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20121
20173
|
var list = readTombstones();
|
|
20122
20174
|
if (!list.length) return;
|
|
20123
20175
|
var nowMs = pendingSiteTimeMs(SITE.generatedAt);
|
|
20176
|
+
var clockMs = typeof window.__cortexNowMs === "number" ? window.__cortexNowMs : Date.now();
|
|
20124
20177
|
var kept = [];
|
|
20125
20178
|
for (var i = 0; i < list.length; i++) {
|
|
20126
20179
|
var t = list[i];
|
|
20127
20180
|
if (!t || typeof t.path !== "string" || !t.path) continue;
|
|
20128
20181
|
var rec = findTombstoned(t);
|
|
20129
20182
|
if (!rec) continue;
|
|
20130
|
-
if (tombstoneStale(t, nowMs)) continue;
|
|
20183
|
+
if (tombstoneStale(t, nowMs, clockMs)) continue;
|
|
20131
20184
|
rec.deleted = true;
|
|
20132
20185
|
kept.push(t);
|
|
20133
20186
|
}
|
package/package.json
CHANGED