@takagaki/cortex-decisions-viewer 0.4.81 → 0.4.82
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 +117 -28
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -1253,7 +1253,7 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
1253
1253
|
.ds-check-label, .ds-check-action, .ds-check-detail,
|
|
1254
1254
|
.ds-pipe-label, .ds-pipe-todo, .ds-owner-state,
|
|
1255
1255
|
.ds-empty, .sec-how, .modal-desc, .ds-toggle-msg,
|
|
1256
|
-
.ds-drive-note, .ds-inactive-note, .ds-legacy-chip, .ds-keys-code {
|
|
1256
|
+
.ds-drive-note, .ds-inactive-note, .ds-legacy-chip, .ds-keys-code, .ds-gate-help {
|
|
1257
1257
|
min-width: 0; white-space: normal; overflow-wrap: anywhere;
|
|
1258
1258
|
}
|
|
1259
1259
|
.ds-toggle { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 6px; }
|
|
@@ -1290,6 +1290,10 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
1290
1290
|
.ds-gate-ok { color: #1f7a45; }
|
|
1291
1291
|
.ds-gate-warn { color: #b45309; }
|
|
1292
1292
|
.ds-gate-muted { color: #6b7280; }
|
|
1293
|
+
/* 行の状態に添える「次に誰が何をするか」(2026-08-18)。**必ず自分の行を占める**
|
|
1294
|
+
(flex: 1 1 100%)——状態バッジの横に押し込むと、いちばん読ませたい一文が
|
|
1295
|
+
カード幅に負けて省略される。状態の語より弱く、しかし読める大きさで出す */
|
|
1296
|
+
.ds-gate-help { flex: 1 1 100%; margin: 4px 0 0; font-size: 12px; line-height: 1.7; color: #6b7280; }
|
|
1293
1297
|
/* 意図的にOFFにした能力(#125②)。**グレーにして誘わない**——未接続(入口を出してよい)
|
|
1294
1298
|
とは別物で、同じ色にすると「押して繋ぎましょう」と読まれる */
|
|
1295
1299
|
.ds-gate-off { color: #9ca3af; }
|
|
@@ -1322,6 +1326,9 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
1322
1326
|
.ds-addform .sec-input { margin-bottom: 6px; }
|
|
1323
1327
|
.sec-input-inline { width: auto; max-width: 220px; margin-bottom: 0; }
|
|
1324
1328
|
.sec-how { color: var(--muted); font-size: 12px; line-height: 1.7; margin: 0 0 10px; }
|
|
1329
|
+
/* 「この接続は何のためのものでないか」(2026-08-18)。**説明文より強く出す**——
|
|
1330
|
+
ここを読み飛ばした人が、社内チャンネルのためにボタンを押し、必ず失敗する */
|
|
1331
|
+
.ds-scope-note { color: var(--text); }
|
|
1325
1332
|
/* いまの接続先(設定を変える口の直前に置く。値は本文色で、ラベルだけ弱める) */
|
|
1326
1333
|
.ds-current { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin: 0 0 8px; font-size: 12.5px; }
|
|
1327
1334
|
.ds-current-label { color: var(--muted); flex: 0 0 auto; }
|
|
@@ -2019,6 +2026,70 @@ ${capabilityState.toString()}
|
|
|
2019
2026
|
"no_token": { text: "トークン未設定", cls: "ds-gate-muted" },
|
|
2020
2027
|
"unknown": { text: "不明", cls: "ds-gate-muted" },
|
|
2021
2028
|
};
|
|
2029
|
+
/* ---------------------------------------------------------------------------
|
|
2030
|
+
* no_token には**経路が2つある**(2026-08-18 の不具合報告)
|
|
2031
|
+
*
|
|
2032
|
+
* Slack のチャンネルは、どのワークスペースにあるかで読み取りの鍵が別物になる:
|
|
2033
|
+
* - workspace 省略 … クラスメソッドの社内ワークスペース。中央 Bot の鍵(案件リポジトリの
|
|
2034
|
+
* 設定)で読む。**画面から設定できるものが1つも無い。**
|
|
2035
|
+
* - workspace: "T…" … お客様のワークスペース。下の「お客様の Slack ワークスペースを接続」で
|
|
2036
|
+
* 承認を貰って読む。**画面から自己解決できる。**
|
|
2037
|
+
*
|
|
2038
|
+
* どちらも no_token に潰して「トークン未設定」と出していたため、社内チャンネルを
|
|
2039
|
+
* 登録した人が「そのトークンをどこで設定するのか」を探し、直下にある唯一それらしい
|
|
2040
|
+
* ボタン(顧客ワークスペースの接続)へ吸い込まれた。押すと社内ワークスペースの承認画面が
|
|
2041
|
+
* 出て失敗し、「もう一度お試しください」と言われてまた押す——**何度試しても直らない**まま
|
|
2042
|
+
* 不具合報告になった。状態だけでなく、**この行で次に誰が何をするのか**を出し分ける。
|
|
2043
|
+
*
|
|
2044
|
+
* **社内側で「担当者にご連絡ください」と書くのは後退ではない。** 画面から設定できる
|
|
2045
|
+
* ものが本当に無いので、自己解決できると誤認させて空振りを繰り返させる方が損害が大きい。
|
|
2046
|
+
* ------------------------------------------------------------------------- */
|
|
2047
|
+
var DS_GATE_NO_TOKEN = {
|
|
2048
|
+
// 社内ワークスペース。**顧客ワークスペースの接続へ誘導しない**(押しても必ず失敗する)
|
|
2049
|
+
internal: {
|
|
2050
|
+
text: "管理者の設定が必要です",
|
|
2051
|
+
cls: "ds-gate-muted",
|
|
2052
|
+
help: "このチャンネルはクラスメソッドの社内ワークスペースにあります。読み取りを始めるには cortex 側(管理者)の設定が必要で、下の「お客様の Slack ワークスペースを接続」では設定できません。cortex の担当者にご連絡ください。",
|
|
2053
|
+
},
|
|
2054
|
+
// お客様のワークスペース。従来どおり接続へ誘導する(自己解決できる唯一の経路)
|
|
2055
|
+
customer: {
|
|
2056
|
+
text: "トークン未設定",
|
|
2057
|
+
cls: "ds-gate-muted",
|
|
2058
|
+
help: "このチャンネルがあるお客様の Slack ワークスペースが、まだ接続されていない(または接続が切れている)状態です。下の「お客様の Slack ワークスペースを接続」から接続してください。",
|
|
2059
|
+
},
|
|
2060
|
+
};
|
|
2061
|
+
/**
|
|
2062
|
+
* Slack のチャンネルが社内ワークスペースのものか。**workspace の有無だけで決まる**
|
|
2063
|
+
* (省略=社内。#104 でこの値が画面まで届いていることは slack-workspace.test.mjs が見張る)。
|
|
2064
|
+
*/
|
|
2065
|
+
function isInternalSlack(s) {
|
|
2066
|
+
return s.type === "slack" && !s.workspace;
|
|
2067
|
+
}
|
|
2068
|
+
/** 行に出す接続状態。no_token だけは経路(社内/顧客)で文面が分かれる */
|
|
2069
|
+
function dsGateOf(s) {
|
|
2070
|
+
if (s.gate === "no_token" && s.type === "slack") {
|
|
2071
|
+
return isInternalSlack(s) ? DS_GATE_NO_TOKEN.internal : DS_GATE_NO_TOKEN.customer;
|
|
2072
|
+
}
|
|
2073
|
+
return DS_GATE[s.gate] || DS_GATE["unknown"];
|
|
2074
|
+
}
|
|
2075
|
+
/**
|
|
2076
|
+
* 一覧・タイルに出す「⚠️ …」の要約。**呼び出しは2箇所(グループの summary と能力タイル)。**
|
|
2077
|
+
* 写経すると片方だけ古くなり、同じ画面で語が割れる(この節では実際に起きた)。
|
|
2078
|
+
*
|
|
2079
|
+
* **社内チャンネルだけが読めていないときは「トークン」と言わない。** 探しても設定する
|
|
2080
|
+
* 場所が画面に無いので、探した人が顧客ワークスペースの接続へ吸い込まれる(DS_GATE_NO_TOKEN
|
|
2081
|
+
* の項の事故がここから始まっている)。1件でも顧客側が混ざるときは従来の文面のまま——
|
|
2082
|
+
* そちらは接続で直せるので、経路を名指しできない要約に倒す方が正しい。
|
|
2083
|
+
*/
|
|
2084
|
+
function attentionSummary(items) {
|
|
2085
|
+
var bad = items.filter(function (s) { return sourceNeedsAttention(s); });
|
|
2086
|
+
if (!bad.length) return "";
|
|
2087
|
+
var head = "⚠️ " + bad.length + "件";
|
|
2088
|
+
var noToken = bad.filter(function (s) { return s.gate === "no_token"; });
|
|
2089
|
+
if (noToken.length !== bad.length) return head + "に問題";
|
|
2090
|
+
var allInternal = noToken.every(function (s) { return isInternalSlack(s); });
|
|
2091
|
+
return head + "が読めていません(" + (allInternal ? "管理者の設定が必要です" : "トークン未設定") + ")";
|
|
2092
|
+
}
|
|
2022
2093
|
var DS_KIND_ICON = {
|
|
2023
2094
|
"課題管理": "📋",
|
|
2024
2095
|
"会議": "🗒️",
|
|
@@ -2413,24 +2484,16 @@ ${capabilityState.toString()}
|
|
|
2413
2484
|
g.items.forEach(function (s) { cards.appendChild(extSourceCard(s, meta)); });
|
|
2414
2485
|
if (g.items.length >= 4) {
|
|
2415
2486
|
// 折りたたみ(既定は閉)。summaryに件数と状態の要約を出す。
|
|
2416
|
-
//
|
|
2417
|
-
//
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
g.items
|
|
2421
|
-
if (!sourceNeedsAttention(s)) return;
|
|
2422
|
-
bad++;
|
|
2423
|
-
if (s.gate === "no_token") noToken++;
|
|
2424
|
-
});
|
|
2487
|
+
// **判定と文面は共有の attentionSummary を呼ぶ。** 以前はここに中身を写経して
|
|
2488
|
+
// いたが、片方だけ直すと同じ画面でマップが⚠️・直下が「接続OK」になる(実際に起きた)。
|
|
2489
|
+
// 原因が1つに集約できるときは原因を書く(「19件に問題」より、読んだ人が次に何を
|
|
2490
|
+
// すればよいか分かる)——その出し分けごと attentionSummary が持っている
|
|
2491
|
+
var warn = attentionSummary(g.items);
|
|
2425
2492
|
var sum = el("summary", {}, [
|
|
2426
2493
|
el("span", { text: meta.icon + " " + meta.label + "(" + g.items.length + (UNIT[g.type] || "件") + ")" }),
|
|
2427
|
-
|
|
2494
|
+
warn === ""
|
|
2428
2495
|
? el("span", { class: "badge ds-sum-ok", text: "接続OK" })
|
|
2429
|
-
|
|
2430
|
-
// 読んだ人が次に何をすればよいか分かる(実際、19件の原因がトークン1本ということがあった)。
|
|
2431
|
-
: el("span", { class: "badge ds-sum-warn", text: noToken === bad
|
|
2432
|
-
? "⚠️ " + bad + "件が読めていません(トークン未設定)"
|
|
2433
|
-
: "⚠️ " + bad + "件に問題" }),
|
|
2496
|
+
: el("span", { class: "badge ds-sum-warn", text: warn }),
|
|
2434
2497
|
]);
|
|
2435
2498
|
var det = el("details", { class: "ds-group" }, [sum, cards]);
|
|
2436
2499
|
pushCap(capOf(g.type), det);
|
|
@@ -2676,15 +2739,14 @@ ${capabilityState.toString()}
|
|
|
2676
2739
|
parts.push((CAP_STATE_MARK[st] || "") + (CAP_STATE_TEXT[derived] || "状態が判定できません"));
|
|
2677
2740
|
} else if (st === "warn") {
|
|
2678
2741
|
if (live.length) {
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
: "⚠️ " + bad + "件に問題");
|
|
2742
|
+
// **文面は共有の attentionSummary が持つ。** グループの summary と同じ文で、
|
|
2743
|
+
// 写経すると片方だけ古くなる(社内/顧客の出し分けもここに要る)。
|
|
2744
|
+
//
|
|
2745
|
+
// **数えて0件でも文を出す。** warn はパイプラインの失敗からも立つので
|
|
2746
|
+
// (ライブでない経路)、行の gate が全部 ok のまま warn になることがある。
|
|
2747
|
+
// 空にすると⚠️のタイルの2行目が消えるので、従来どおりの件数表現に倒す
|
|
2748
|
+
var warn = attentionSummary(live);
|
|
2749
|
+
parts.push(warn || "⚠️ 0件に問題");
|
|
2688
2750
|
} else {
|
|
2689
2751
|
// 内部能力の warn はパイプラインの失敗由来。数えるものが無いので件数を出さない
|
|
2690
2752
|
parts.push("⚠️ 同期が失敗しています");
|
|
@@ -3517,7 +3579,7 @@ ${capabilityState.toString()}
|
|
|
3517
3579
|
if (!list) return null;
|
|
3518
3580
|
|
|
3519
3581
|
var box = el("div", { class: "ds-addform", "data-adder": "slack-workspace" }, [
|
|
3520
|
-
el("div", { class: "ds-addform-title", text: "Slack ワークスペースを接続" }),
|
|
3582
|
+
el("div", { class: "ds-addform-title", text: "お客様の Slack ワークスペースを接続" }),
|
|
3521
3583
|
el("p", {
|
|
3522
3584
|
class: "sec-how",
|
|
3523
3585
|
text:
|
|
@@ -3526,6 +3588,22 @@ ${capabilityState.toString()}
|
|
|
3526
3588
|
"お願いする権限は読み取りだけで、Cortex から投稿することはありません。" +
|
|
3527
3589
|
"接続したあと、読み取りたいチャンネルにボットを招待し、この画面から追加してください。",
|
|
3528
3590
|
}),
|
|
3591
|
+
// **「これは何のためのものでないか」を書く(2026-08-18 の不具合報告)。**
|
|
3592
|
+
// 社内ワークスペースのチャンネルが読めていない人が、設定する場所を探して
|
|
3593
|
+
// ここへ来る。押すと社内ワークスペースの承認画面が出て必ず失敗し、
|
|
3594
|
+
// 「もう一度お試しください」に従ってまた押す——何度試しても直らない。
|
|
3595
|
+
//
|
|
3596
|
+
// **箱そのものは消さない。** 直上の renderExternalAdders のコメントが警告している
|
|
3597
|
+
// のと同じ失敗で、「顧客チャンネルがある案件だけ出す」にすると
|
|
3598
|
+
// **新規案件(0件)=一番繋ぎたい場面**でこの入口が消える。出したまま、
|
|
3599
|
+
// 使う場面と使わない場面をここで言い切る
|
|
3600
|
+
el("p", {
|
|
3601
|
+
class: "sec-how ds-scope-note",
|
|
3602
|
+
text:
|
|
3603
|
+
"クラスメソッドの社内ワークスペース(Classmethod Group)のチャンネルには、この接続は使いません。" +
|
|
3604
|
+
"社内のチャンネルは Cortex の中央ボットで読んでいるので、ここで接続しても読めるようにはなりません。" +
|
|
3605
|
+
"社内のチャンネルが読めていない場合は、cortex の担当者にご連絡ください。",
|
|
3606
|
+
}),
|
|
3529
3607
|
]);
|
|
3530
3608
|
|
|
3531
3609
|
// 接続済みの一覧。**0件でも「まだありません」と書く**——空白だと、
|
|
@@ -3567,7 +3645,10 @@ ${capabilityState.toString()}
|
|
|
3567
3645
|
}
|
|
3568
3646
|
box.appendChild(listBox);
|
|
3569
3647
|
|
|
3570
|
-
|
|
3648
|
+
// **ボタン自身に「お客様の」と書く(2026-08-18 の不具合報告)。** 社内チャンネルが
|
|
3649
|
+
// 読めていない人が押したのはこのボタンで、当時の文言は「Slack ワークスペースを接続」
|
|
3650
|
+
// ——誰のワークスペースの話かが書かれておらず、唯一それらしいボタンに見えた
|
|
3651
|
+
var btn = el("button", { class: "ds-toggle-btn", type: "button", text: "お客様の Slack ワークスペースを接続" });
|
|
3571
3652
|
var msg = el("div", { class: "ds-toggle-msg" });
|
|
3572
3653
|
btn.addEventListener("click", async function () {
|
|
3573
3654
|
var intake = SITE.intake;
|
|
@@ -4016,7 +4097,7 @@ ${capabilityState.toString()}
|
|
|
4016
4097
|
title: ORIGIN_HELP[s.origin],
|
|
4017
4098
|
}));
|
|
4018
4099
|
}
|
|
4019
|
-
var gate =
|
|
4100
|
+
var gate = dsGateOf(s);
|
|
4020
4101
|
var card = el("div", { class: "ds-card" }, [
|
|
4021
4102
|
el("div", { class: "ds-card-main" }, [
|
|
4022
4103
|
el("span", { class: "ds-icon", text: meta.icon }),
|
|
@@ -4082,6 +4163,14 @@ ${capabilityState.toString()}
|
|
|
4082
4163
|
}));
|
|
4083
4164
|
}
|
|
4084
4165
|
}
|
|
4166
|
+
// **「次に誰が何をするか」を、その行に書く(2026-08-18 の不具合報告)。**
|
|
4167
|
+
// 状態(トークン未設定)だけを出していたので、設定する場所を探した人が直下の
|
|
4168
|
+
// 顧客ワークスペースの接続へ吸い込まれた——社内チャンネルではそれが必ず失敗する。
|
|
4169
|
+
// 文面は DS_GATE_NO_TOKEN が経路ごとに持つ(社内は連絡先・顧客は接続の導線)。
|
|
4170
|
+
//
|
|
4171
|
+
// **ボタンより後ろに置く。** カードは横並びの flex なので、間に挟むと
|
|
4172
|
+
// 「登録を解除」が案内文の下の行へ落ちて、既存案件の行の形が変わる
|
|
4173
|
+
if (gate.help) card.appendChild(el("p", { class: "ds-gate-help", text: gate.help }));
|
|
4085
4174
|
return card;
|
|
4086
4175
|
}
|
|
4087
4176
|
|
package/package.json
CHANGED