dsh-plugin-github-issues 0.7.0 → 0.8.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/README.md CHANGED
@@ -16,6 +16,8 @@ worked in several Sessions.
16
16
 
17
17
  ![The GitHub panel with the fixed cascade toolbar and the detail pane](assets/panel.png)
18
18
 
19
+ ![The pending issue card inside the composer](assets/pending.png)
20
+
19
21
  It is **read-only**: the plugin never writes to GitHub.
20
22
 
21
23
  ## Install
@@ -63,8 +65,8 @@ tarball (`dsh-plugin-github-issues.tgz`), installable by path.
63
65
  |---|---|---|
64
66
  | GitHub panel | left rail icon → main panel | organization → repository → **milestone** → assignee → state cascade (remembered across restarts) in one fixed toolbar; a default organization/repository is selected for you, the milestone dropdown lists only that repository's milestones, and only the list scrolls (search stays above it, the detail pane scrolls independently with the **full issue body rendered as sanitized GitHub-flavored Markdown**, milestone progress, labels, priority, assignees, linked/mentioned PRs and checks) |
65
67
  | Issues right column | right sidebar tab | the same filtered issue list beside the Conversation, for drag-and-drop handoff |
66
- | Composer card | inside the input box | the staged issue: `[GitHub] owner/repo#number ×`. Type extra instructions or nothing; send converts the card into the issue prompt |
67
- | Linked chip | composer dock under the input | the Session's linked issue: state dot (green open / red closed) + `owner/repo#number`; click for a detail popover, remove to unlink |
68
+ | Composer card | inside the input box, above the editor | the staged issue as a draft-attachment-style card (240×64, GitHub glyph, `owner/repo#number`, state + title, hover-only remove). The card is not editable; it keeps its own space above the editor, survives a Workspace switch together with the draft, and is converted into the issue prompt on send |
69
+ | Linked chip | composer dock under the input | the Session's linked issue: state dot (green open / red closed) + `owner/repo#number`; the dot refreshes from GitHub on panel refresh, every poll, window focus and whenever the issue appears in the list; click for a detail popover, remove to unlink |
68
70
  | Handoff actions | issue detail | one-click **enter Session** (latest link), **new Session for this issue**, plus a linked-Session list with per-Session enter/unlink |
69
71
  | GitHub settings | Settings → GitHub | `gh` auth status and scopes, handoff behavior, prompt template |
70
72
 
@@ -118,6 +120,9 @@ Settings → GitHub → Prompt template. Variables: `{{repo}}`, `{{number}}`, `{
118
120
  - The detail body is the complete issue body, rendered with Markdown (headings, lists, code blocks,
119
121
  tables, links, images) and sanitized before display; it is not an excerpt and it is not capped to a
120
122
  small fixed-height box.
123
+ - The default handoff prompt renders its issue metadata as a Markdown table, so it survives as a real
124
+ table in the transcript after sending. Legacy pre-table prompts are upgraded once on load; **Reset
125
+ to default** in Settings restores this template.
121
126
  - Milestone choices come from the selected repository's full milestone list (open and closed).
122
127
  - Priority falls back organization Issue Field → `P0`–`P4` labels when no project field is present.
123
128
  - The list polls every 60–120 s while visible; use **Refresh** for an immediate update.
Binary file
package/docs/README.zh.md CHANGED
@@ -13,6 +13,8 @@ Issue 可以关联多个 Session。
13
13
 
14
14
  ![GitHub 面板:固定筛选栏 + 独立滚动的详情栏](../assets/panel.png)
15
15
 
16
+ ![输入框里的待发送 Issue 卡片](../assets/pending.png)
17
+
16
18
  插件对 GitHub **只读**,不会写入任何内容。
17
19
 
18
20
  ## 安装
@@ -103,6 +105,8 @@ dsh plugin --profile <name> add /path/to/dsh-plugin-github-issues
103
105
  - 列表使用仓库的 `issues` 连接,状态、assignee、里程碑都由 GitHub 服务端过滤(总数也是权威的);
104
106
  里程碑通过 `filterBy.milestoneNumber` 按编号过滤。
105
107
  - 详情展示完整正文(不是摘要、也不再限制在固定高度的小框里),按 Markdown 渲染并过滤危险 HTML。
108
+ - 默认交接提示词把 Issue 元信息排成 Markdown 表格,发送后在对话里会渲染成真正的表格;旧版没有表格的
109
+ 提示词会在加载时自动升级一次,也可以在设置里点「恢复默认」重新套用。
106
110
  - 里程碑的可选项来自当前仓库的完整里程碑列表(含已关闭)。
107
111
  - 优先级回退顺序:组织 Issue Field → `P0`–`P4` 标签(不再读取 Projects v2 项目字段)。
108
112
  - 列表可见时每 60–120 秒轮询一次;需要立刻更新点「刷新」。
package/lib/client.js CHANGED
@@ -37,10 +37,18 @@ var import_react5 = require("react");
37
37
  // src/vm.ts
38
38
  var DEFAULT_PROMPT_TEMPLATE = [
39
39
  "\u5904\u7406 GitHub Issue\uFF1A{{repo}}#{{number}} {{title}}",
40
+ "",
40
41
  "\u94FE\u63A5\uFF1A{{url}}",
41
- "\u72B6\u6001\uFF1A{{state}} \uFF5C \u91CC\u7A0B\u7891\uFF1A{{milestone}} \uFF5C \u4F18\u5148\u7EA7\uFF1A{{priority}} \uFF5C \u6307\u6D3E\uFF1A{{assignees}}",
42
- "\u6807\u7B7E\uFF1A{{labels}}",
43
- "\u5173\u8054 PR\uFF1A{{prs}}",
42
+ "",
43
+ "| \u5B57\u6BB5 | \u503C |",
44
+ "| --- | --- |",
45
+ "| \u72B6\u6001 | {{state}} |",
46
+ "| \u91CC\u7A0B\u7891 | {{milestone}} |",
47
+ "| \u4F18\u5148\u7EA7 | {{priority}} |",
48
+ "| \u6307\u6D3E | {{assignees}} |",
49
+ "| \u6807\u7B7E | {{labels}} |",
50
+ "| \u5173\u8054 PR | {{prs}} |",
51
+ "",
44
52
  "\u8981\u6C42\uFF1A\u5148\u8BFB Issue \u6B63\u6587\u4E0E\u5173\u8054 PR\uFF0C\u786E\u8BA4\u9A8C\u6536\u6807\u51C6\u540E\u518D\u52A8\u624B\uFF1B\u7528 subagent_codex \u6267\u884C\u5177\u4F53\u6539\u52A8\uFF0C\u5B8C\u6210\u540E\u8DD1\u76F8\u5173\u6D4B\u8BD5\u5E76\u56DE\u62A5\u3002"
45
53
  ].join("\n");
46
54
  var DEFAULT_PREFS = {
@@ -98,9 +106,9 @@ function renderPrompt(issue, template) {
98
106
  \u2026\uFF08\u5DF2\u622A\u65AD\uFF09`;
99
107
  return text2;
100
108
  }
101
- var EMPTY_DRAFT_HOLD = "\u200B\n";
109
+ var PENDING_DRAFT_SENTINEL = "\u2063\u200B";
102
110
  function composeHandoffPrompt(prompt, memo) {
103
- const extra = memo.replace(/\u200b/g, "").replace(/^\n+/, "").trim();
111
+ const extra = memo.split(PENDING_DRAFT_SENTINEL).join("").replace(/[\u200b\u200c\u200d\u2060\ufeff]/g, "").replace(/^\n+/, "").trim();
104
112
  return extra === "" ? prompt : `${prompt}
105
113
 
106
114
  ${extra}`;
@@ -788,25 +796,68 @@ function GitHubDropZone({ dragging, t, onDrop, onCancel }) {
788
796
  // src/client/views/Pending.tsx
789
797
  var import_jsx_runtime5 = require("react/jsx-runtime");
790
798
  var PENDING_CSS = `
791
- .ghp3-row{position:absolute;top:8px;left:12px;right:12px;z-index:2;display:flex;align-items:center;gap:6px;min-width:0;height:22px;font-size:12px;line-height:18px;pointer-events:none}
792
- .ghp3-chip{pointer-events:auto;display:inline-flex;align-items:center;gap:5px;box-sizing:border-box;height:22px;max-width:100%;padding:0 8px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:18px;cursor:pointer;border:0.5px solid var(--dsw-alias-border-l2)}
793
- .ghp3-chip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
794
- .ghp3-chip:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}
795
- .ghp3-ref{font-family:var(--dsh-font-family-code,ui-monospace,SFMono-Regular,Menlo,monospace);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
796
- .ghp3-remove{pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:50%;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer;flex:none}
797
- .ghp3-remove:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
799
+ .ghp3-rail{position:absolute;top:8px;left:10px;right:10px;z-index:2;display:flex;align-items:flex-start;pointer-events:none}
800
+ .ghp3-card{pointer-events:auto;position:relative;display:inline-flex;align-items:center;gap:10px;box-sizing:border-box;width:240px;max-width:100%;height:64px;padding:0 12px;border:0.5px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:var(--dsw-radius-lg,12px);background:var(--dsw-specific-input-major,var(--dsw-alias-bg-base));color:var(--dsw-alias-label-primary);text-align:left;font-family:inherit;cursor:pointer}
801
+ .ghp3-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18))}
802
+ .ghp3-card:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}
803
+ .ghp3-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--dsw-radius-md,8px);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4d6bfe) 12%,transparent);color:var(--dsw-alias-state-business-primary,#4d6bfe)}
804
+ .ghp3-body{display:flex;flex-direction:column;flex:1;min-width:0;padding:8px 0}
805
+ .ghp3-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:500;line-height:22px;color:var(--dsw-alias-label-primary)}
806
+ .ghp3-meta{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:12px;line-height:15px;color:var(--dsw-alias-label-tertiary,#8a9099)}
807
+ .ghp3-remove{position:absolute;top:6px;right:6px;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:var(--dsw-alias-button-contrast-fill,#000000b8);color:var(--dsw-alias-label-primary-inverted,#fff);opacity:0;cursor:pointer;transition:opacity .2s ease-in-out}
808
+ .ghp3-card:hover .ghp3-remove,.ghp3-card:focus-within .ghp3-remove,.ghp3-remove:focus-visible{opacity:1}
809
+ .ghp3-card:hover .ghp3-name,.ghp3-card:focus-within .ghp3-name{padding-right:18px}
810
+ @media (hover:none),(pointer:coarse){.ghp3-remove{opacity:1}}
811
+ @media (prefers-reduced-motion:reduce){.ghp3-remove{transition:none}}
798
812
  `.trim();
799
- function GitHubPendingChip(props) {
813
+ function GitHubPendingCard(props) {
800
814
  const { card, t, onOpenPanel, onRemove } = props;
801
815
  const ref = `${card.repo}#${String(card.number)}`;
802
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ghp3-row", "data-github-pending": true, children: [
816
+ const state = t(stateLabelKey(card.state));
817
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ghp3-rail", "data-github-pending": true, children: [
803
818
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StyleSheet, { chunks: [CONTROLS_CSS, PENDING_CSS] }),
804
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("button", { type: "button", className: "ghp3-chip", title: `${ref} \xB7 ${card.title}
805
- ${t("pending.tip")}`, onClick: onOpenPanel, children: [
806
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(GitHubIcon, { size: 12 }),
807
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ghp3-ref", children: ref })
808
- ] }),
809
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ghp3-remove", "aria-label": t("dock.removeDraft"), onClick: onRemove, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseGlyph, { size: 12 }) })
819
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
820
+ "div",
821
+ {
822
+ className: "ghp3-card",
823
+ role: "button",
824
+ tabIndex: 0,
825
+ "aria-label": `${ref} \xB7 ${card.title}`,
826
+ title: `${ref} \xB7 ${card.title}
827
+ ${t("pending.tip")}`,
828
+ onClick: onOpenPanel,
829
+ onKeyDown: (event) => {
830
+ if (event.target !== event.currentTarget) return;
831
+ if (event.key !== "Enter" && event.key !== " ") return;
832
+ event.preventDefault();
833
+ onOpenPanel();
834
+ },
835
+ children: [
836
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ghp3-icon", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(GitHubIcon, { size: 16 }) }),
837
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ghp3-body", children: [
838
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ghp3-name", children: ref }),
839
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ghp3-meta", children: [
840
+ state,
841
+ " \xB7 ",
842
+ card.title === "" ? t("pending.noTitle") : card.title
843
+ ] })
844
+ ] }),
845
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
846
+ "button",
847
+ {
848
+ type: "button",
849
+ className: "ghp3-remove",
850
+ "aria-label": t("dock.removeDraft"),
851
+ onClick: (event) => {
852
+ event.stopPropagation();
853
+ onRemove();
854
+ },
855
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseGlyph, { size: 12 })
856
+ }
857
+ )
858
+ ]
859
+ }
860
+ )
810
861
  ] });
811
862
  }
812
863
 
@@ -5306,101 +5357,98 @@ function DockHost({ store, t, runtime, sessionId }) {
5306
5357
  function PendingOverlayHost({ store, t, sessionId, useInput, inputActions }) {
5307
5358
  const snapshot = usePanel(store);
5308
5359
  const [pending, setPending] = (0, import_react5.useState)(void 0);
5309
- const markerSeen = (0, import_react5.useRef)(false);
5310
- const submitSeen = (0, import_react5.useRef)(false);
5311
5360
  const sending = (0, import_react5.useRef)(false);
5312
- const marker = pending === void 0 ? "" : `${pending.repo}#${String(pending.number)}`;
5361
+ const stagedFor = (0, import_react5.useRef)(void 0);
5313
5362
  const input = useInput === void 0 ? void 0 : useInput((state) => state);
5314
5363
  const latestInput = (0, import_react5.useRef)(input);
5315
5364
  latestInput.current = input;
5365
+ const draft = input?.draft ?? "";
5366
+ const card = snapshot.pendingHandoff;
5316
5367
  (0, import_react5.useEffect)(() => {
5317
- const card = store.consumeHandoff(sessionId);
5318
- if (card === void 0) return;
5319
- markerSeen.current = false;
5320
- submitSeen.current = false;
5321
- sending.current = false;
5322
- setPending(card);
5323
- if (inputActions !== void 0) inputActions.setDraft(EMPTY_DRAFT_HOLD);
5324
- }, [snapshot.pendingHandoff, snapshot.pendingHandoffSession, inputActions, sessionId, store]);
5325
- (0, import_react5.useEffect)(() => {
5326
- if (pending === void 0 || input === void 0 || sessionId === void 0) return;
5327
- const text2 = input.draft;
5328
- if (text2.includes(marker)) {
5329
- markerSeen.current = true;
5330
- if (input.phase !== "plain") submitSeen.current = true;
5331
- }
5332
- if (markerSeen.current && submitSeen.current) {
5333
- void store.linkIssue(pending, sessionId);
5368
+ if (card === void 0) {
5334
5369
  setPending(void 0);
5335
- markerSeen.current = false;
5336
- submitSeen.current = false;
5337
- sending.current = false;
5338
5370
  return;
5339
5371
  }
5340
- if (text2 === "") {
5341
- setPending(void 0);
5342
- markerSeen.current = false;
5343
- submitSeen.current = false;
5344
- sending.current = false;
5372
+ if (draft.includes(PENDING_DRAFT_SENTINEL)) {
5373
+ if (pending?.id !== card.id) setPending(card);
5345
5374
  return;
5346
5375
  }
5347
- if (markerSeen.current && !text2.includes(marker)) {
5348
- setPending(void 0);
5349
- markerSeen.current = false;
5350
- submitSeen.current = false;
5351
- sending.current = false;
5376
+ const target = snapshot.pendingHandoffSession;
5377
+ if (target !== void 0 && sessionId !== void 0 && target !== sessionId) return;
5378
+ const key = `${sessionId ?? "no-session"}:${card.id}`;
5379
+ if (stagedFor.current === key) return;
5380
+ stagedFor.current = key;
5381
+ setPending(card);
5382
+ if (inputActions !== void 0) {
5383
+ inputActions.setDraft(draft === "" ? PENDING_DRAFT_SENTINEL : `${PENDING_DRAFT_SENTINEL}${draft}`);
5352
5384
  }
5353
- }, [input, pending, marker, sessionId, store]);
5385
+ }, [card, draft, inputActions, pending?.id, sessionId, snapshot.pendingHandoffSession]);
5386
+ (0, import_react5.useEffect)(() => {
5387
+ if (pending === void 0) return;
5388
+ if (!draft.includes(PENDING_DRAFT_SENTINEL)) setPending(void 0);
5389
+ }, [draft, pending]);
5390
+ (0, import_react5.useEffect)(() => {
5391
+ if (pending === void 0) return;
5392
+ const anchor = document.querySelector("[data-github-pending]");
5393
+ const composerCard = anchor?.closest("[data-composer-card]");
5394
+ if (!(composerCard instanceof HTMLElement)) return;
5395
+ const previous = composerCard.style.paddingTop;
5396
+ composerCard.style.paddingTop = "84px";
5397
+ return () => {
5398
+ composerCard.style.paddingTop = previous;
5399
+ };
5400
+ }, [pending]);
5354
5401
  (0, import_react5.useEffect)(() => {
5355
5402
  if (pending === void 0 || inputActions === void 0) return;
5356
5403
  const composerCard = () => {
5357
- const chip = document.querySelector("[data-github-pending]");
5358
- const anchor = chip?.closest("[data-composer-overlay]");
5359
- return anchor?.parentElement ?? null;
5404
+ const anchor = document.querySelector("[data-github-pending]");
5405
+ return anchor?.closest("[data-composer-card]") ?? null;
5360
5406
  };
5361
- const submitButton = (card) => {
5362
- const buttons = [...card.querySelectorAll("button")];
5407
+ const submitButton = (cardEl) => {
5408
+ const buttons = [...cardEl.querySelectorAll("button")];
5363
5409
  return buttons.find((button) => /_primary(\s|$)/.test(String(button.className))) ?? buttons[buttons.length - 1];
5364
5410
  };
5365
5411
  const send = () => {
5366
5412
  if (sending.current) return;
5367
5413
  sending.current = true;
5368
- const card = pending;
5369
- const composed = composeHandoffPrompt(store.promptFor(card), latestInput.current?.draft ?? "");
5414
+ const currentCard = pending;
5415
+ const memo = latestInput.current?.draft ?? "";
5416
+ const composed = composeHandoffPrompt(store.promptFor(currentCard), memo);
5370
5417
  inputActions.setDraft(composed);
5371
5418
  window.setTimeout(() => {
5372
5419
  inputActions.submit();
5373
5420
  window.setTimeout(() => {
5374
5421
  const after = latestInput.current?.draft ?? "";
5375
- const cleared = !after.includes(`${card.repo}#${String(card.number)}`);
5376
- if (!cleared) {
5422
+ if (after.trim() !== "") {
5423
+ const restore = memo === "" ? PENDING_DRAFT_SENTINEL : memo;
5424
+ if (!restore.includes(PENDING_DRAFT_SENTINEL)) inputActions.setDraft(PENDING_DRAFT_SENTINEL);
5425
+ else inputActions.setDraft(restore);
5377
5426
  sending.current = false;
5378
5427
  return;
5379
5428
  }
5380
- if (sessionId !== void 0) void store.linkIssue(card, sessionId);
5429
+ if (sessionId !== void 0) void store.linkIssue(currentCard, sessionId);
5430
+ store.clearPendingHandoff();
5381
5431
  setPending(void 0);
5382
- markerSeen.current = false;
5383
- submitSeen.current = false;
5384
5432
  sending.current = false;
5385
5433
  }, 700);
5386
5434
  }, 16);
5387
5435
  };
5388
5436
  const onClick = (event) => {
5389
- const card = composerCard();
5390
- if (card === null) return;
5437
+ const cardEl = composerCard();
5438
+ if (cardEl === null) return;
5391
5439
  const button = event.target?.closest("button");
5392
5440
  if (button === null || button === void 0 || button.closest("[data-github-pending]") !== null) return;
5393
- if (button !== submitButton(card)) return;
5441
+ if (button !== submitButton(cardEl)) return;
5394
5442
  event.preventDefault();
5395
5443
  event.stopImmediatePropagation();
5396
5444
  send();
5397
5445
  };
5398
5446
  const onKeyDown = (event) => {
5399
5447
  if (event.key !== "Enter" || event.shiftKey || event.isComposing) return;
5400
- const card = composerCard();
5401
- if (card === null) return;
5448
+ const cardEl = composerCard();
5449
+ if (cardEl === null) return;
5402
5450
  const target = event.target;
5403
- if (target === null || !card.contains(target) || target.closest("[data-github-pending]") !== null) return;
5451
+ if (target === null || !cardEl.contains(target) || target.closest("[data-github-pending]") !== null) return;
5404
5452
  event.preventDefault();
5405
5453
  event.stopImmediatePropagation();
5406
5454
  send();
@@ -5411,20 +5459,18 @@ function PendingOverlayHost({ store, t, sessionId, useInput, inputActions }) {
5411
5459
  document.removeEventListener("click", onClick, true);
5412
5460
  document.removeEventListener("keydown", onKeyDown, true);
5413
5461
  };
5414
- }, [pending, inputActions, store]);
5462
+ }, [pending, inputActions, store, sessionId]);
5415
5463
  if (pending === void 0) return null;
5416
5464
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
5417
- GitHubPendingChip,
5465
+ GitHubPendingCard,
5418
5466
  {
5419
5467
  card: pending,
5420
5468
  t,
5421
5469
  onOpenPanel: () => store.openInPanel(pending),
5422
5470
  onRemove: () => {
5423
- setPending(void 0);
5424
- markerSeen.current = false;
5425
- submitSeen.current = false;
5426
- sending.current = false;
5427
5471
  inputActions?.setDraft("");
5472
+ setPending(void 0);
5473
+ store.clearPendingHandoff();
5428
5474
  }
5429
5475
  }
5430
5476
  );
@@ -5584,6 +5630,7 @@ var en = {
5584
5630
  "drop.cancel": "Cancel",
5585
5631
  "pending.hint": "Sent with the prompt; it becomes the linked issue chip below.",
5586
5632
  "pending.tip": "On send this card becomes the issue prompt; anything you type is appended.",
5633
+ "pending.noTitle": "GitHub issue",
5587
5634
  "dock.loading": "Loading issue details\u2026",
5588
5635
  "dock.removeDraft": "Clear draft",
5589
5636
  "dock.unlink": "Unlink this session",
@@ -5750,6 +5797,7 @@ var zh = {
5750
5797
  "drop.cancel": "\u53D6\u6D88",
5751
5798
  "pending.hint": "\u968F\u63D0\u793A\u8BCD\u4E00\u8D77\u53D1\u9001\uFF0C\u53D1\u9001\u540E\u53D8\u6210\u4E0B\u65B9\u5DF2\u5173\u8054 chip\u3002",
5752
5799
  "pending.tip": "\u53D1\u9001\u65F6\u8FD9\u5F20\u5361\u7247\u4F1A\u81EA\u52A8\u8F6C\u6210 Issue \u63D0\u793A\u8BCD\uFF0C\u4F60\u8F93\u5165\u7684\u5185\u5BB9\u4F1A\u9644\u5728\u540E\u9762\u3002",
5800
+ "pending.noTitle": "GitHub Issue",
5753
5801
  "dock.loading": "\u6B63\u5728\u52A0\u8F7D Issue\u2026",
5754
5802
  "dock.removeDraft": "\u6E05\u7A7A\u8349\u7A3F",
5755
5803
  "dock.unlink": "\u89E3\u9664\u672C Session \u5173\u8054",
@@ -5830,6 +5878,7 @@ var REMOTE_METHODS = [
5830
5878
  { method: "orgRepos", parameters: [{ wire: "org" }] },
5831
5879
  { method: "listIssues", parameters: [{ wire: "request" }] },
5832
5880
  { method: "repoMilestones", parameters: [{ wire: "repo" }] },
5881
+ { method: "linkedCards", parameters: [{ wire: "groups" }] },
5833
5882
  { method: "issueDetail", parameters: [{ wire: "repo" }, { wire: "number" }] },
5834
5883
  { method: "issueMentionedPRs", parameters: [{ wire: "repo" }, { wire: "number" }] },
5835
5884
  { method: "loadPrefs", parameters: [] },
@@ -5993,6 +6042,9 @@ var GitHubStore = class {
5993
6042
  orgScopes = /* @__PURE__ */ new Map();
5994
6043
  remote;
5995
6044
  started = false;
6045
+ onWindowFocus = () => {
6046
+ void this.refreshLinkedCards();
6047
+ };
5996
6048
  pollTimer;
5997
6049
  toastTimer;
5998
6050
  listSeq = 0;
@@ -6009,11 +6061,17 @@ var GitHubStore = class {
6009
6061
  start() {
6010
6062
  if (this.started) return;
6011
6063
  this.started = true;
6064
+ if (typeof window !== "undefined" && typeof window.addEventListener === "function") {
6065
+ window.addEventListener("focus", this.onWindowFocus);
6066
+ }
6012
6067
  void this.bootstrap();
6013
6068
  }
6014
6069
  /** Stop every timer this store owns. */
6015
6070
  stop() {
6016
6071
  this.started = false;
6072
+ if (typeof window !== "undefined" && typeof window.removeEventListener === "function") {
6073
+ window.removeEventListener("focus", this.onWindowFocus);
6074
+ }
6017
6075
  if (this.pollTimer !== void 0) clearInterval(this.pollTimer);
6018
6076
  if (this.toastTimer !== void 0) clearTimeout(this.toastTimer);
6019
6077
  this.pollTimer = void 0;
@@ -6054,6 +6112,7 @@ var GitHubStore = class {
6054
6112
  if (typeof document !== "undefined" && document.visibilityState !== "visible") return;
6055
6113
  if (this.snapshot.loading || this.snapshot.loadingMore) return;
6056
6114
  void this.reloadList(true);
6115
+ void this.refreshLinkedCards();
6057
6116
  }, seconds * 1e3);
6058
6117
  }
6059
6118
  /** Resolve the Remote namespace, or throw the mount's own refusal. */
@@ -6113,6 +6172,7 @@ var GitHubStore = class {
6113
6172
  loadingMore: false,
6114
6173
  error: void 0
6115
6174
  });
6175
+ this.syncLinkedCardsFromList();
6116
6176
  this.refreshPinnedCard();
6117
6177
  } catch (error) {
6118
6178
  if (seq !== this.listSeq) return;
@@ -6253,6 +6313,7 @@ var GitHubStore = class {
6253
6313
  await this.loadCatalog();
6254
6314
  await this.ensureScopeSelection();
6255
6315
  await this.reloadList();
6316
+ void this.refreshLinkedCards();
6256
6317
  })();
6257
6318
  }
6258
6319
  loadMore() {
@@ -6272,6 +6333,7 @@ var GitHubStore = class {
6272
6333
  ...next.totalCount === void 0 ? {} : { totalCount: next.totalCount }
6273
6334
  }
6274
6335
  });
6336
+ this.syncLinkedCardsFromList();
6275
6337
  } catch (error) {
6276
6338
  this.update({ loadingMore: false, error: asPanelError(error) });
6277
6339
  }
@@ -6477,12 +6539,11 @@ var GitHubStore = class {
6477
6539
  return;
6478
6540
  }
6479
6541
  const workspaceId = this.workspaceForHandoff(card.repo);
6480
- const prompt = this.promptFor(card);
6481
6542
  void (async () => {
6482
6543
  try {
6483
6544
  const sessionId = await uiWorkspace.connectWorkspace(workspaceId);
6484
6545
  this.update({ pendingHandoff: card, pendingHandoffSession: sessionId });
6485
- uiWorkspace.startSession(workspaceId, { prompt, whenDraftExists: "replace" });
6546
+ uiWorkspace.startSession(workspaceId, { whenDraftExists: "replace" });
6486
6547
  } catch (error) {
6487
6548
  this.update({ error: asPanelError(error) });
6488
6549
  }
@@ -6519,7 +6580,8 @@ var GitHubStore = class {
6519
6580
  const links = await remote.links().then((result) => unwrap(result));
6520
6581
  this.update({ links });
6521
6582
  this.decorateLoadedCards(links);
6522
- void this.ensureCards(links);
6583
+ this.ensureCards(links);
6584
+ void this.refreshLinkedCards();
6523
6585
  } catch {
6524
6586
  }
6525
6587
  }
@@ -6537,6 +6599,68 @@ var GitHubStore = class {
6537
6599
  if (Object.keys(cards).length === 0) return;
6538
6600
  this.update({ linkCards: { ...this.snapshot.linkCards, ...cards } });
6539
6601
  }
6602
+ /** Update linked chips whose issues are present in the freshly loaded list. */
6603
+ syncLinkedCardsFromList() {
6604
+ const items = this.snapshot.list?.items;
6605
+ if (items === void 0 || items.length === 0) return;
6606
+ const byKey = new Map(items.map((item) => [this.keyOf(item.repo, item.number), item]));
6607
+ let changed = false;
6608
+ const next = { ...this.snapshot.linkCards };
6609
+ for (const link of this.snapshot.links) {
6610
+ const key = this.keyOf(link.repo, link.number);
6611
+ const card = byKey.get(key);
6612
+ if (card === void 0 || next[key] === card) continue;
6613
+ next[key] = this.withSessionLinks(card);
6614
+ changed = true;
6615
+ }
6616
+ if (changed) this.update({ linkCards: next });
6617
+ }
6618
+ /** Add the recorded session links to one card. */
6619
+ withSessionLinks(card) {
6620
+ const records = this.snapshot.links.filter((link) => link.repo === card.repo && link.number === card.number);
6621
+ if (records.length === 0) return card;
6622
+ return {
6623
+ ...card,
6624
+ sessionLinks: records.map((record) => ({ sessionId: record.sessionId, at: record.at }))
6625
+ };
6626
+ }
6627
+ /**
6628
+ * Refresh the dock chips from GitHub.
6629
+ *
6630
+ * A linked issue can be closed long after the handoff and no longer match the
6631
+ * panel's filters, so its card is not in the list; without this the chip's state
6632
+ * dot would stay green forever.
6633
+ */
6634
+ async refreshLinkedCards() {
6635
+ const links = this.snapshot.links;
6636
+ if (links.length === 0) return;
6637
+ const grouped = /* @__PURE__ */ new Map();
6638
+ for (const link of links) {
6639
+ const numbers = grouped.get(link.repo) ?? [];
6640
+ if (!numbers.includes(link.number)) numbers.push(link.number);
6641
+ grouped.set(link.repo, numbers);
6642
+ }
6643
+ const groups = [...grouped.entries()].map(([repo, numbers]) => ({ repo, numbers }));
6644
+ try {
6645
+ const remote = await this.api();
6646
+ const cards = await remote.linkedCards(groups).then((result) => unwrap(result));
6647
+ if (cards.length === 0) return;
6648
+ const next = { ...this.snapshot.linkCards };
6649
+ let changed = false;
6650
+ for (const card of cards) {
6651
+ const key = this.keyOf(card.repo, card.number);
6652
+ const current = next[key];
6653
+ next[key] = this.withSessionLinks(card);
6654
+ if (current === void 0 || current.state !== card.state || current.stateReason !== card.stateReason || current.title !== card.title) {
6655
+ changed = true;
6656
+ }
6657
+ }
6658
+ if (changed || Object.keys(this.snapshot.linkCards).length !== Object.keys(next).length) {
6659
+ this.update({ linkCards: next });
6660
+ }
6661
+ } catch {
6662
+ }
6663
+ }
6540
6664
  /** Attach resolved session links to every card the snapshot currently holds. */
6541
6665
  decorateLoadedCards(links) {
6542
6666
  const byKey = /* @__PURE__ */ new Map();
@@ -6632,6 +6756,10 @@ var GitHubStore = class {
6632
6756
  }
6633
6757
  /**
6634
6758
  * Take the pending handoff when it belongs to this Session.
6759
+ *
6760
+ * This is non-destructive: the card stays in the store until it is sent or
6761
+ * explicitly removed, so a composer remount (Workspace switch, Session
6762
+ * transfer) can recover it from the draft sentinel.
6635
6763
  * @param sessionId - the Session whose dock asks; a handoff stamped for a
6636
6764
  * different Session is left for that one.
6637
6765
  * @returns the issue to stage, or `undefined`.
@@ -6641,9 +6769,13 @@ var GitHubStore = class {
6641
6769
  if (card === void 0) return void 0;
6642
6770
  const target = this.snapshot.pendingHandoffSession;
6643
6771
  if (target !== void 0 && sessionId !== void 0 && target !== sessionId) return void 0;
6644
- this.update({ pendingHandoff: void 0, pendingHandoffSession: void 0 });
6645
6772
  return card;
6646
6773
  }
6774
+ /** Drop the staged card once it was sent or explicitly removed. */
6775
+ clearPendingHandoff() {
6776
+ if (this.snapshot.pendingHandoff === void 0 && this.snapshot.pendingHandoffSession === void 0) return;
6777
+ this.update({ pendingHandoff: void 0, pendingHandoffSession: void 0 });
6778
+ }
6647
6779
  /** Render the profile's handoff prompt for one issue. */
6648
6780
  promptFor(card) {
6649
6781
  return renderPrompt(card, this.snapshot.prefs.promptTemplate);
package/lib/controller.js CHANGED
@@ -50,6 +50,29 @@ import { GitHubApiError } from "./github/types.js";
50
50
  import { normalizeRequest } from "./github/list-request.js";
51
51
  /** How long one resolved token is reused before asking `gh` again. */
52
52
  const TOKEN_TTL_MS = 5 * 60 * 1_000;
53
+ /**
54
+ * Validate the dock's linked-card refresh input from the wire.
55
+ * @param input - untrusted Remote argument.
56
+ * @returns at most 20 repositories with up to 50 positive numbers each.
57
+ */
58
+ function normalizeLinkedCards(input) {
59
+ if (!Array.isArray(input))
60
+ return [];
61
+ const groups = [];
62
+ for (const entry of input.slice(0, 20)) {
63
+ if (typeof entry !== 'object' || entry === null)
64
+ continue;
65
+ const raw = entry;
66
+ const repo = typeof raw.repo === 'string' && raw.repo.includes('/') ? raw.repo : undefined;
67
+ const numbers = Array.isArray(raw.numbers)
68
+ ? raw.numbers.filter((number) => typeof number === 'number' && Number.isInteger(number) && number > 0).slice(0, 50)
69
+ : [];
70
+ if (repo === undefined || numbers.length === 0)
71
+ continue;
72
+ groups.push({ repo, numbers });
73
+ }
74
+ return groups;
75
+ }
53
76
  /** Remote owner of the GitHub Issues surface, namespace `githubIssues`. */
54
77
  let GitHubIssuesController = (() => {
55
78
  let _classSuper = TypertRemoteService;
@@ -60,6 +83,7 @@ let GitHubIssuesController = (() => {
60
83
  let _orgProjects_decorators;
61
84
  let _orgRepos_decorators;
62
85
  let _issueDetail_decorators;
86
+ let _linkedCards_decorators;
63
87
  let _repoMilestones_decorators;
64
88
  let _issueMentionedPRs_decorators;
65
89
  let _links_decorators;
@@ -77,6 +101,7 @@ let GitHubIssuesController = (() => {
77
101
  _orgProjects_decorators = [Remote];
78
102
  _orgRepos_decorators = [Remote];
79
103
  _issueDetail_decorators = [Remote];
104
+ _linkedCards_decorators = [Remote];
80
105
  _repoMilestones_decorators = [Remote];
81
106
  _issueMentionedPRs_decorators = [Remote];
82
107
  _links_decorators = [Remote];
@@ -91,6 +116,7 @@ let GitHubIssuesController = (() => {
91
116
  __esDecorate(this, null, _orgProjects_decorators, { kind: "method", name: "orgProjects", static: false, private: false, access: { has: obj => "orgProjects" in obj, get: obj => obj.orgProjects }, metadata: _metadata }, null, _instanceExtraInitializers);
92
117
  __esDecorate(this, null, _orgRepos_decorators, { kind: "method", name: "orgRepos", static: false, private: false, access: { has: obj => "orgRepos" in obj, get: obj => obj.orgRepos }, metadata: _metadata }, null, _instanceExtraInitializers);
93
118
  __esDecorate(this, null, _issueDetail_decorators, { kind: "method", name: "issueDetail", static: false, private: false, access: { has: obj => "issueDetail" in obj, get: obj => obj.issueDetail }, metadata: _metadata }, null, _instanceExtraInitializers);
119
+ __esDecorate(this, null, _linkedCards_decorators, { kind: "method", name: "linkedCards", static: false, private: false, access: { has: obj => "linkedCards" in obj, get: obj => obj.linkedCards }, metadata: _metadata }, null, _instanceExtraInitializers);
94
120
  __esDecorate(this, null, _repoMilestones_decorators, { kind: "method", name: "repoMilestones", static: false, private: false, access: { has: obj => "repoMilestones" in obj, get: obj => obj.repoMilestones }, metadata: _metadata }, null, _instanceExtraInitializers);
95
121
  __esDecorate(this, null, _issueMentionedPRs_decorators, { kind: "method", name: "issueMentionedPRs", static: false, private: false, access: { has: obj => "issueMentionedPRs" in obj, get: obj => obj.issueMentionedPRs }, metadata: _metadata }, null, _instanceExtraInitializers);
96
122
  __esDecorate(this, null, _links_decorators, { kind: "method", name: "links", static: false, private: false, access: { has: obj => "links" in obj, get: obj => obj.links }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -214,6 +240,14 @@ let GitHubIssuesController = (() => {
214
240
  async issueDetail(repo, number) {
215
241
  return this.withApi(api => api.issueDetail(repo, number));
216
242
  }
243
+ /**
244
+ * Refresh the dock's linked-issue chips.
245
+ * @param groups - repositories and issue numbers from recorded links.
246
+ * @returns current cards for issues that still exist.
247
+ */
248
+ async linkedCards(groups) {
249
+ return this.withApi(api => api.linkedCards(normalizeLinkedCards(groups)));
250
+ }
217
251
  /** One repository's milestones, for the picker and its list filter. */
218
252
  async repoMilestones(repo) {
219
253
  return this.withApi(api => api.repoMilestones(repo));
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}