paperclip-github-plugin 0.4.1 → 0.4.3

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
@@ -29,7 +29,7 @@ With this plugin, you can:
29
29
  The plugin adds a full in-host workflow instead of a one-off import script:
30
30
 
31
31
  - a hosted settings page for GitHub auth, repository mappings, company defaults, and sync controls
32
- - setup controls for Paperclip board access and company-scoped agent token propagation on authenticated and `local_trusted` deployments
32
+ - authenticated-only setup controls for Paperclip board access and company-scoped agent token propagation
33
33
  - a dashboard widget that shows readiness, sync status, and last-run results
34
34
  - saved sync diagnostics that let operators inspect the latest per-issue failures, raw errors, and suggested next steps
35
35
  - a project sidebar item that opens a live project-scoped Pull Requests page for the mapped repository and can show the open PR count through a lightweight badge read
@@ -39,7 +39,7 @@ The plugin adds a full in-host workflow instead of a one-off import script:
39
39
 
40
40
  ## How it works
41
41
 
42
- 1. Save a GitHub token in the plugin settings for the current company.
42
+ 1. Save a GitHub token in the plugin settings.
43
43
  2. Connect one or more GitHub repositories to Paperclip projects.
44
44
  3. Run a sync manually or let the scheduled job keep things up to date.
45
45
 
@@ -53,11 +53,11 @@ Long-running syncs continue in the background, so quick actions do not have to w
53
53
 
54
54
  ### Company-aware configuration
55
55
 
56
- GitHub tokens, repository mappings, advanced import defaults, and Paperclip board access are all managed per company, while sync cadence remains shared at the plugin instance level. When you open settings inside a specific company, you only edit that company's setup and defaults.
56
+ GitHub tokens, repository mappings, advanced import defaults, Paperclip board access, and sync cadence are managed per company. When you open settings inside a specific company, you only edit that company's setup.
57
57
 
58
58
  ### Project binding that respects existing work
59
59
 
60
- If a company already has a Paperclip project bound to a GitHub repository workspace, the settings UI can reuse that project instead of creating a duplicate. New mappings can also create and bind a Paperclip project automatically, and those newly created projects opt into isolated issue checkouts.
60
+ If a company already has a Paperclip project bound to a GitHub repository workspace, the settings UI can reuse that project instead of creating a duplicate. New mappings can also create and bind a Paperclip project automatically, and those newly created projects opt into isolated issue checkouts with new issues defaulting to isolated checkout.
61
61
 
62
62
  ### Status sync with delivery context
63
63
 
@@ -107,15 +107,14 @@ npx paperclipai plugin install --local "$PWD"
107
107
 
108
108
  1. Open the plugin settings for **GitHub Sync** from inside the Paperclip company you want to configure.
109
109
  2. Paste a GitHub token, validate it, and save it.
110
- 3. If the deployment is authenticated or `local_trusted`, the settings page shows Paperclip board access and GitHub token propagation controls so you can configure and test them locally.
111
- 4. If the deployment is authenticated, connect Paperclip board access from the same settings page and complete the approval flow before running sync.
112
- 5. If the deployment is authenticated or `local_trusted`, choose which agents in the current company should receive the saved GitHub token as `GITHUB_TOKEN`.
113
- 6. Add one or more repository mappings for the current company.
114
- 7. For each mapping, either choose an existing GitHub-linked Paperclip project or enter the project name that should receive synced issues.
115
- 8. Optionally configure company-wide defaults for imported issues, including the default assignee, the default Paperclip status, and ignored GitHub usernames. Bot aliases such as `renovate[bot]` are matched when you save `renovate`.
116
- 9. Choose the automatic sync interval in minutes.
117
- 10. Save the settings and run the first manual sync.
118
- 11. Repeat inside other companies if they need their own mappings, defaults, board access, or agent token propagation.
110
+ 3. If the deployment is authenticated, connect Paperclip board access from the same settings page and complete the approval flow.
111
+ 4. If the deployment is authenticated, choose which agents in the current company should receive the saved GitHub token as `GITHUB_TOKEN`.
112
+ 5. Add one or more repository mappings for the current company.
113
+ 6. For each mapping, either choose an existing GitHub-linked Paperclip project or enter the project name that should receive synced issues.
114
+ 7. Optionally configure company-wide defaults for imported issues, including the default assignee, the default Paperclip status, and ignored GitHub usernames. Bot aliases such as `renovate[bot]` are matched when you save `renovate`.
115
+ 8. Choose the automatic sync interval in minutes.
116
+ 9. Save the settings and run the first manual sync.
117
+ 10. Repeat inside other companies if they need their own mappings, defaults, board access, or agent token propagation.
119
118
 
120
119
  Repository input accepts either `owner/repo` or `https://github.com/owner/repo`.
121
120
  When a token is saved, the settings page audits the mapped repositories for the permissions needed by pull request actions and warns when permissions are missing or GitHub cannot verify them yet.
@@ -145,6 +144,7 @@ When the local Paperclip API is available, the plugin also syncs labels by name,
145
144
  Additional behavior:
146
145
 
147
146
  - Open issues with no linked pull request that are created by a verified repository maintainer/admin bypass the default imported status and start in `todo`.
147
+ - Newly imported issues that finish sync in `todo` and are assigned to an agent enqueue an assignee wakeup so the agent can pick them up promptly.
148
148
  - Open imported issues that are already in `backlog` stay in `backlog` until someone changes them in Paperclip.
149
149
  - If an imported issue is `done` or `cancelled` and GitHub shows it open again with no linked pull request, sync moves it to `todo` so agents can pick it up again.
150
150
  - Trusted new GitHub comments from the original issue author or a verified maintainer/admin can move an open imported issue back to `todo`.
@@ -156,9 +156,8 @@ The plugin is designed to avoid persisting raw credentials in plugin state.
156
156
 
157
157
  - GitHub tokens saved through the UI are stored as per-company Paperclip secret references.
158
158
  - Paperclip board access tokens are also stored as per-company secret references.
159
- - The settings UI also keeps lightweight non-secret identity labels for those saved connections, so later visits can still show who that company’s GitHub token and board access are connected as.
160
- - On authenticated and `local_trusted` deployments, any selected propagation agents receive `GITHUB_TOKEN` as an agent env secret-ref binding that points at the same saved GitHub token secret instead of a copied raw token.
161
- - If an older save left the company token secret only in plugin state, the settings UI repairs the config mirror and retries selected-agent propagation from that same company secret.
159
+ - The settings UI also keeps lightweight non-secret identity labels for those saved connections, so later visits can still show who each company GitHub token and board access are connected as.
160
+ - On authenticated deployments, any selected propagation agents receive `GITHUB_TOKEN` as an agent env secret-ref binding that points at the same saved GitHub token secret instead of a copied raw token.
162
161
  - The worker resolves those secret references at runtime instead of storing raw tokens in plugin state.
163
162
  - On authenticated Paperclip deployments, sync is blocked until the relevant company has connected Paperclip board access.
164
163
 
package/dist/manifest.js CHANGED
@@ -503,7 +503,7 @@ var require2 = createRequire(import.meta.url);
503
503
  var packageJson = require2("../package.json");
504
504
  var DASHBOARD_WIDGET_CAPABILITY = "ui.dashboardWidget.register";
505
505
  var SCHEDULE_TICK_CRON = "* * * * *";
506
- var MANIFEST_VERSION = "0.4.1"?.trim() || typeof packageJson.version === "string" && packageJson.version.trim() || process.env.npm_package_version?.trim() || "0.0.0-dev";
506
+ var MANIFEST_VERSION = "0.4.3"?.trim() || typeof packageJson.version === "string" && packageJson.version.trim() || process.env.npm_package_version?.trim() || "0.0.0-dev";
507
507
  var manifest = {
508
508
  id: "paperclip-github-plugin",
509
509
  apiVersion: 1,
@@ -594,10 +594,10 @@ var manifest = {
594
594
  exportName: "GitHubSyncDashboardWidget"
595
595
  },
596
596
  {
597
- type: "detailTab",
597
+ type: "taskDetailView",
598
598
  id: "paperclip-github-plugin-issue-detail-tab",
599
599
  displayName: "GitHub",
600
- exportName: "GitHubSyncIssueDetailTab",
600
+ exportName: "GitHubSyncIssueTaskDetailView",
601
601
  entityTypes: ["issue"]
602
602
  },
603
603
  {
@@ -618,7 +618,7 @@ var manifest = {
618
618
  id: "paperclip-github-plugin-toolbar-button",
619
619
  displayName: "GitHub Sync",
620
620
  exportName: "GitHubSyncEntityToolbarButton",
621
- entityTypes: ["project", "issue"]
621
+ entityTypes: ["project"]
622
622
  },
623
623
  {
624
624
  type: "settingsPage",
package/dist/ui/index.js CHANGED
@@ -22400,11 +22400,6 @@ function requiresPaperclipBoardAccess(value) {
22400
22400
  const health = normalizePaperclipHealthResponse(value);
22401
22401
  return health?.deploymentMode?.toLowerCase() === "authenticated";
22402
22402
  }
22403
- function shouldShowPaperclipBoardAccessSettings(value) {
22404
- const health = normalizePaperclipHealthResponse(value);
22405
- const deploymentMode = health?.deploymentMode?.toLowerCase();
22406
- return deploymentMode === "authenticated" || deploymentMode === "local_trusted";
22407
- }
22408
22403
 
22409
22404
  // src/ui/assignees.ts
22410
22405
  function normalizeCompanyAssigneeOptionsResponse(response) {
@@ -23045,7 +23040,6 @@ function getSyncSetupMessage(issue, hasCompanyContext) {
23045
23040
  }
23046
23041
  function usePaperclipBoardAccessRequirement() {
23047
23042
  const [status, setStatus] = useState2("loading");
23048
- const [visible, setVisible] = useState2(false);
23049
23043
  useEffect2(() => {
23050
23044
  let cancelled = false;
23051
23045
  void (async () => {
@@ -23055,10 +23049,8 @@ function usePaperclipBoardAccessRequirement() {
23055
23049
  }
23056
23050
  if (!health) {
23057
23051
  setStatus("unknown");
23058
- setVisible(false);
23059
23052
  return;
23060
23053
  }
23061
- setVisible(shouldShowPaperclipBoardAccessSettings(health));
23062
23054
  setStatus(requiresPaperclipBoardAccess(health) ? "required" : "not_required");
23063
23055
  })();
23064
23056
  return () => {
@@ -23067,8 +23059,7 @@ function usePaperclipBoardAccessRequirement() {
23067
23059
  }, []);
23068
23060
  return {
23069
23061
  status,
23070
- required: status === "required",
23071
- visible
23062
+ required: status === "required"
23072
23063
  };
23073
23064
  }
23074
23065
  function getGitHubRateLimitResourceLabel(resource) {
@@ -27771,7 +27762,8 @@ async function resolveOrCreateProject(companyId, projectName) {
27771
27762
  name: projectName.trim(),
27772
27763
  status: "planned",
27773
27764
  executionWorkspacePolicy: {
27774
- enabled: true
27765
+ enabled: true,
27766
+ defaultMode: "isolated_workspace"
27775
27767
  }
27776
27768
  })
27777
27769
  });
@@ -31087,7 +31079,6 @@ function GitHubSyncSettingsPage() {
31087
31079
  const themeMode = useResolvedThemeMode();
31088
31080
  const boardAccessRequirement = usePaperclipBoardAccessRequirement();
31089
31081
  const armSyncCompletionToast = useSyncCompletionToast(form.syncState, toast);
31090
- const githubTokenConfigSyncAttemptRef = useRef(null);
31091
31082
  const boardAccessConfigSyncAttemptRef = useRef(null);
31092
31083
  const assigneeFallbackAttemptRef = useRef(null);
31093
31084
  const currentSettings = settings.data ?? cachedSettings;
@@ -31201,75 +31192,6 @@ function GitHubSyncSettingsPage() {
31201
31192
  cancelled = true;
31202
31193
  };
31203
31194
  }, [currentSettings?.availableAssignees?.length, currentSettings?.updatedAt, hostContext.companyId]);
31204
- useEffect2(() => {
31205
- const companyId = hostContext.companyId;
31206
- const secretRef = settings.data?.githubTokenNeedsConfigSync ? settings.data.githubTokenConfigSyncRef : void 0;
31207
- if (!companyId || !secretRef) {
31208
- return;
31209
- }
31210
- const attemptKey = `${companyId}:${secretRef}`;
31211
- if (githubTokenConfigSyncAttemptRef.current === attemptKey) {
31212
- return;
31213
- }
31214
- githubTokenConfigSyncAttemptRef.current = attemptKey;
31215
- let cancelled = false;
31216
- void (async () => {
31217
- try {
31218
- const pluginId = await resolveCurrentPluginId(pluginIdFromLocation);
31219
- if (!pluginId) {
31220
- throw new Error("Plugin id is required to finish syncing the GitHub token secret into plugin config.");
31221
- }
31222
- await patchPluginConfig(pluginId, {
31223
- githubTokenRefs: {
31224
- [companyId]: secretRef
31225
- }
31226
- });
31227
- if (cancelled) {
31228
- return;
31229
- }
31230
- const selectedAgentIds = normalizeAgentIds(settings.data?.advancedSettings?.githubTokenPropagationAgentIds);
31231
- if (selectedAgentIds.length > 0) {
31232
- try {
31233
- await propagateGitHubTokenToSelectedAgents({
31234
- selectedAgentIds,
31235
- previousAgentIds: selectedAgentIds,
31236
- githubTokenSecretRef: secretRef
31237
- });
31238
- } catch {
31239
- }
31240
- }
31241
- notifyGitHubSyncSettingsChanged();
31242
- try {
31243
- await settings.refresh();
31244
- } catch {
31245
- return;
31246
- }
31247
- } catch (error) {
31248
- if (cancelled) {
31249
- return;
31250
- }
31251
- toast({
31252
- title: "GitHub token needs reconnection",
31253
- body: getActionErrorMessage(
31254
- error,
31255
- "GitHub Sync could not finish migrating the saved GitHub token secret into plugin config."
31256
- ),
31257
- tone: "error"
31258
- });
31259
- }
31260
- })();
31261
- return () => {
31262
- cancelled = true;
31263
- };
31264
- }, [
31265
- hostContext.companyId,
31266
- pluginIdFromLocation,
31267
- settings.data?.advancedSettings?.githubTokenPropagationAgentIds,
31268
- settings.data?.githubTokenConfigSyncRef,
31269
- settings.data?.githubTokenNeedsConfigSync,
31270
- settings.refresh,
31271
- toast
31272
- ]);
31273
31195
  useEffect2(() => {
31274
31196
  const companyId = hostContext.companyId;
31275
31197
  const secretRef = settings.data?.paperclipBoardAccessNeedsConfigSync ? settings.data.paperclipBoardAccessConfigSyncRef : void 0;
@@ -31397,13 +31319,12 @@ function GitHubSyncSettingsPage() {
31397
31319
  const hasSavedToken = Boolean(form.githubTokenConfigured || showSavedTokenHint);
31398
31320
  const boardAccessConfigured = Boolean(form.paperclipBoardAccessConfigured);
31399
31321
  const boardAccessRequired = boardAccessRequirement.required;
31400
- const boardAccessVisible = boardAccessRequirement.visible;
31401
31322
  const boardAccessReady = !boardAccessRequired || hasCompanyContext && boardAccessConfigured;
31402
31323
  const tokenStatus = tokenStatusOverride ?? (hasSavedToken ? "valid" : "required");
31403
31324
  const tokenTone = tokenStatus === "valid" ? "success" : tokenStatus === "invalid" ? "danger" : "warning";
31404
31325
  const tokenBannerLabel = tokenStatus === "valid" ? "Token valid" : tokenStatus === "invalid" ? "Token invalid" : "Token required";
31405
31326
  const tokenBadgeLabel = tokenStatus === "valid" ? "Valid" : tokenStatus === "invalid" ? "Invalid" : "Required";
31406
- const tokenStatusDescription = tokenStatus === "invalid" ? "GitHub rejected the last token." : tokenStatus === "required" ? "Add a token." : "Shared token.";
31327
+ const tokenStatusDescription = tokenStatus === "invalid" ? "GitHub rejected the last token." : tokenStatus === "required" ? hasCompanyContext ? "Add a token for this company." : "Select a company." : hasCompanyContext ? "Token configured for the selected company context." : "Saved in one or more companies.";
31407
31328
  const tokenDescription = tokenStatusDescription;
31408
31329
  const tokenPermissionAuditData = tokenPermissionAudit.data;
31409
31330
  const tokenPermissionAuditMeta = getGitHubTokenPermissionAuditMeta(tokenPermissionAuditData);
@@ -31492,7 +31413,7 @@ function GitHubSyncSettingsPage() {
31492
31413
  const manualSyncScopePillLabel = hasCompanyContext ? "This company" : "All companies";
31493
31414
  const manualSyncButtonLabel = hasCompanyContext ? "Run sync for this company" : "Run sync across all companies";
31494
31415
  const advancedSettingsSummary = formatAdvancedSettingsSummary(form.advancedSettings, availableAssignees, {
31495
- includePropagation: boardAccessVisible
31416
+ includePropagation: boardAccessRequired
31496
31417
  });
31497
31418
  const assigneeSelectOptions = [
31498
31419
  { value: "", label: "Unassigned" },
@@ -31527,7 +31448,7 @@ function GitHubSyncSettingsPage() {
31527
31448
  ] }),
31528
31449
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-head-actions", children: [
31529
31450
  /* @__PURE__ */ jsx2("span", { className: `ghsync__scope-pill ${hasCompanyContext ? "ghsync__scope-pill--company" : "ghsync__scope-pill--mixed"}`, children: hasCompanyContext ? currentCompanyName : "No company" }),
31530
- /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Shared" }),
31451
+ hasCompanyContext ? /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--company", children: "Company" }) : null,
31531
31452
  /* @__PURE__ */ jsxs2("span", { className: "ghsync__badge ghsync__badge--neutral", children: [
31532
31453
  /* @__PURE__ */ jsx2(LoadingSpinner, { size: "sm", label: "Loading settings" }),
31533
31454
  "Loading"
@@ -31638,7 +31559,7 @@ function GitHubSyncSettingsPage() {
31638
31559
  });
31639
31560
  }
31640
31561
  async function propagateGitHubTokenToSelectedAgents(options) {
31641
- if (!boardAccessVisible) {
31562
+ if (!boardAccessRequired) {
31642
31563
  return;
31643
31564
  }
31644
31565
  const selectedAgentIds = normalizeAgentIds(options.selectedAgentIds);
@@ -31647,17 +31568,18 @@ function GitHubSyncSettingsPage() {
31647
31568
  return;
31648
31569
  }
31649
31570
  let githubTokenSecretRef = typeof options.githubTokenSecretRef === "string" && options.githubTokenSecretRef.trim() ? options.githubTokenSecretRef.trim() : void 0;
31571
+ const companyId = hostContext.companyId;
31650
31572
  if (!githubTokenSecretRef) {
31651
- const companyId = hostContext.companyId;
31652
31573
  if (!companyId) {
31653
- throw new Error("Company context is required to propagate the GitHub token to selected agents.");
31574
+ throw new Error("Company context is required to propagate the GitHub token.");
31654
31575
  }
31655
31576
  const pluginId = await resolveCurrentPluginId(pluginIdFromLocation);
31656
31577
  if (!pluginId) {
31657
31578
  throw new Error("Plugin id is required to propagate the GitHub token to selected agents.");
31658
31579
  }
31659
31580
  const currentConfigResponse = await fetchJson(`/api/plugins/${pluginId}/config`);
31660
- githubTokenSecretRef = normalizePluginConfig(currentConfigResponse?.configJson).githubTokenRefs?.[companyId];
31581
+ const normalizedConfig = normalizePluginConfig(currentConfigResponse?.configJson);
31582
+ githubTokenSecretRef = normalizedConfig.githubTokenRefs?.[companyId];
31661
31583
  }
31662
31584
  if (!githubTokenSecretRef) {
31663
31585
  throw new Error("GitHub token propagation requires a GitHub token saved through this settings page.");
@@ -31713,7 +31635,9 @@ function GitHubSyncSettingsPage() {
31713
31635
  });
31714
31636
  await saveRegistration({
31715
31637
  companyId,
31716
- githubTokenRef: secret.id,
31638
+ githubTokenRefs: {
31639
+ [companyId]: secret.id
31640
+ },
31717
31641
  githubTokenLogin: validation.login
31718
31642
  });
31719
31643
  const selectedAgentIds = normalizeAgentIds(currentSettings?.advancedSettings?.githubTokenPropagationAgentIds);
@@ -32035,7 +31959,7 @@ function GitHubSyncSettingsPage() {
32035
31959
  ] }),
32036
31960
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-head-actions", children: [
32037
31961
  /* @__PURE__ */ jsx2("span", { className: `ghsync__scope-pill ${hasCompanyContext ? "ghsync__scope-pill--company" : "ghsync__scope-pill--mixed"}`, children: hasCompanyContext ? currentCompanyName : "No company" }),
32038
- /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Shared" }),
31962
+ /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--company", children: "Company" }),
32039
31963
  /* @__PURE__ */ jsxs2("span", { className: `ghsync__badge ${getToneClass(tokenTone)}`, children: [
32040
31964
  /* @__PURE__ */ jsx2("span", { className: "ghsync__badge-dot", "aria-hidden": "true" }),
32041
31965
  tokenBannerLabel
@@ -32057,7 +31981,7 @@ function GitHubSyncSettingsPage() {
32057
31981
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-copy", children: [
32058
31982
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-title-row", children: [
32059
31983
  /* @__PURE__ */ jsx2("h4", { children: "GitHub access" }),
32060
- /* @__PURE__ */ jsx2("div", { className: "ghsync__section-tags", children: /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Shared" }) })
31984
+ /* @__PURE__ */ jsx2("div", { className: "ghsync__section-tags", children: /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--company", children: "Company" }) })
32061
31985
  ] }),
32062
31986
  /* @__PURE__ */ jsx2("p", { children: tokenDescription })
32063
31987
  ] }),
@@ -32065,8 +31989,8 @@ function GitHubSyncSettingsPage() {
32065
31989
  ] }),
32066
31990
  !hasCompanyContext ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__locked", children: [
32067
31991
  /* @__PURE__ */ jsxs2("div", { children: [
32068
- /* @__PURE__ */ jsx2("strong", { children: hasSavedToken ? "Shared token ready" : "Company required" }),
32069
- /* @__PURE__ */ jsx2("span", { children: hasSavedToken ? "Open a company to replace it." : "Open a company to save it." })
31992
+ /* @__PURE__ */ jsx2("strong", { children: "Company required" }),
31993
+ /* @__PURE__ */ jsx2("span", { children: "Open a company to view or save its token." })
32070
31994
  ] }),
32071
31995
  /* @__PURE__ */ jsx2("span", { className: "ghsync__badge ghsync__badge--neutral", children: "Read only" })
32072
31996
  ] }) : showTokenForm ? /* @__PURE__ */ jsxs2("form", { className: "ghsync__stack", onSubmit: handleSaveToken, children: [
@@ -32123,8 +32047,8 @@ function GitHubSyncSettingsPage() {
32123
32047
  ] }) })
32124
32048
  ] }) : /* @__PURE__ */ jsxs2("div", { className: "ghsync__connected", children: [
32125
32049
  /* @__PURE__ */ jsxs2("div", { children: [
32126
- /* @__PURE__ */ jsx2("strong", { children: validatedLogin ? `Authenticated as ${validatedLogin}` : "Shared token ready" }),
32127
- /* @__PURE__ */ jsx2("span", { children: "Shared across all companies." })
32050
+ /* @__PURE__ */ jsx2("strong", { children: validatedLogin ? `Authenticated as ${validatedLogin}` : "Company token ready" }),
32051
+ /* @__PURE__ */ jsx2("span", { children: `Used for sync in ${currentCompanyName}.` })
32128
32052
  ] }),
32129
32053
  /* @__PURE__ */ jsx2(
32130
32054
  "button",
@@ -32163,7 +32087,7 @@ function GitHubSyncSettingsPage() {
32163
32087
  /* @__PURE__ */ jsx2("div", { className: "ghsync__permission-audit-list", children: /* @__PURE__ */ jsx2("div", { className: "ghsync__permission-audit-item", children: /* @__PURE__ */ jsx2("span", { children: tokenPermissionAuditData?.warnings[0] ?? "Add a mapped repository in this company so GitHub Sync can verify the token permissions it needs." }) }) })
32164
32088
  ] }) : null
32165
32089
  ] }),
32166
- boardAccessVisible ? /* @__PURE__ */ jsxs2("section", { className: "ghsync__section", children: [
32090
+ boardAccessRequired ? /* @__PURE__ */ jsxs2("section", { className: "ghsync__section", children: [
32167
32091
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-head", children: [
32168
32092
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-copy", children: [
32169
32093
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-title-row", children: [
@@ -32177,7 +32101,7 @@ function GitHubSyncSettingsPage() {
32177
32101
  hostContext.companyId ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__connected", children: [
32178
32102
  /* @__PURE__ */ jsxs2("div", { children: [
32179
32103
  /* @__PURE__ */ jsx2("strong", { children: boardAccessConfigured ? boardAccessIdentity ? `Connected as ${boardAccessIdentity}` : "Connected" : boardAccessRequired ? "Required" : boardAccessRequirement.status === "loading" ? "Checking requirement" : "Optional" }),
32180
- /* @__PURE__ */ jsx2("span", { children: boardAccessConfigured ? "Used for Paperclip API calls." : boardAccessRequired ? "Required in authenticated deployments." : boardAccessRequirement.status === "loading" ? "Checking whether it is required." : "Available here for local testing and only required when Paperclip API calls need sign-in." })
32104
+ /* @__PURE__ */ jsx2("span", { children: boardAccessConfigured ? "Used for Paperclip API calls." : boardAccessRequired ? "Required in authenticated deployments." : boardAccessRequirement.status === "loading" ? "Checking whether it is required." : "Only needed when Paperclip API calls require sign-in." })
32181
32105
  ] }),
32182
32106
  /* @__PURE__ */ jsx2(
32183
32107
  "button",
@@ -32433,7 +32357,7 @@ function GitHubSyncSettingsPage() {
32433
32357
  ),
32434
32358
  /* @__PURE__ */ jsx2("p", { className: "ghsync__hint", children: "Comma or newline separated." })
32435
32359
  ] }),
32436
- boardAccessVisible ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__field", children: [
32360
+ boardAccessRequired ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__field", children: [
32437
32361
  /* @__PURE__ */ jsx2("label", { htmlFor: "advanced-token-propagation", children: "Propagate GitHub token to agents" }),
32438
32362
  /* @__PURE__ */ jsx2(
32439
32363
  SettingsAgentMultiPicker,
@@ -32464,7 +32388,7 @@ function GitHubSyncSettingsPage() {
32464
32388
  /* @__PURE__ */ jsx2("h4", { children: "Sync" }),
32465
32389
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__section-tags", children: [
32466
32390
  /* @__PURE__ */ jsx2("span", { className: manualSyncScopePillClass, children: manualSyncScopePillLabel }),
32467
- /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Shared cadence" })
32391
+ /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Company cadence" })
32468
32392
  ] })
32469
32393
  ] }),
32470
32394
  syncSectionDescription ? /* @__PURE__ */ jsx2("p", { children: syncSectionDescription }) : null
@@ -32501,12 +32425,16 @@ function GitHubSyncSettingsPage() {
32501
32425
  /* @__PURE__ */ jsx2("p", { className: `ghsync__hint${scheduleFrequencyError ? " ghsync__hint--error" : ""}`, children: scheduleFrequencyError ?? "Minutes." })
32502
32426
  ] }),
32503
32427
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__schedule-meta", children: [
32504
- /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Shared" }),
32428
+ /* @__PURE__ */ jsx2("span", { className: "ghsync__scope-pill ghsync__scope-pill--global", children: "Company" }),
32505
32429
  /* @__PURE__ */ jsxs2("strong", { children: [
32506
32430
  "Auto-sync ",
32507
32431
  scheduleDescription
32508
32432
  ] }),
32509
- /* @__PURE__ */ jsx2("span", { children: "All companies." })
32433
+ /* @__PURE__ */ jsxs2("span", { children: [
32434
+ "Used for sync in ",
32435
+ currentCompanyName,
32436
+ "."
32437
+ ] })
32510
32438
  ] })
32511
32439
  ] }),
32512
32440
  !syncUnlocked ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__locked", children: [
@@ -32607,7 +32535,7 @@ function GitHubSyncSettingsPage() {
32607
32535
  ] }),
32608
32536
  /* @__PURE__ */ jsx2("span", { children: !repositoriesUnlocked ? "Requires a token." : savedMappingCount > 0 ? hasCompanyContext ? `${savedMappingCount} saved.` : `${savedMappingCount} saved.` : hasCompanyContext ? "Add a repository." : "Select a company." })
32609
32537
  ] }),
32610
- boardAccessVisible ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__check", children: [
32538
+ boardAccessRequired ? /* @__PURE__ */ jsxs2("div", { className: "ghsync__check", children: [
32611
32539
  /* @__PURE__ */ jsxs2("div", { className: "ghsync__check-top", children: [
32612
32540
  /* @__PURE__ */ jsx2("strong", { children: "Paperclip board access" }),
32613
32541
  /* @__PURE__ */ jsx2("span", { className: `ghsync__badge ${getToneClass(boardAccessStatusTone)}`, children: boardAccessStatusLabel })
@@ -33551,7 +33479,7 @@ function GitHubSyncIssueDetailTabContent(props) {
33551
33479
  ] }) : null
33552
33480
  ] });
33553
33481
  }
33554
- function GitHubSyncIssueDetailTab() {
33482
+ function GitHubSyncIssueTaskDetailView() {
33555
33483
  const context = useHostContext();
33556
33484
  const themeMode = useResolvedThemeMode();
33557
33485
  const theme = themeMode === "light" ? LIGHT_PALETTE : DARK_PALETTE;
@@ -33574,6 +33502,7 @@ function GitHubSyncIssueDetailTab() {
33574
33502
  detailKey
33575
33503
  );
33576
33504
  }
33505
+ var GitHubSyncIssueDetailTab = GitHubSyncIssueTaskDetailView;
33577
33506
  function GitHubSyncCommentAnnotation() {
33578
33507
  const context = useHostContext();
33579
33508
  const themeMode = useResolvedThemeMode();
@@ -33619,6 +33548,7 @@ export {
33619
33548
  GitHubSyncEntityToolbarButton,
33620
33549
  GitHubSyncGlobalToolbarButton,
33621
33550
  GitHubSyncIssueDetailTab,
33551
+ GitHubSyncIssueTaskDetailView,
33622
33552
  GitHubSyncProjectPullRequestsPage,
33623
33553
  GitHubSyncProjectPullRequestsSidebarItem,
33624
33554
  GitHubSyncSettingsPage,