paperclip-github-plugin 0.4.1 → 0.4.2
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 +14 -16
- package/dist/manifest.js +4 -4
- package/dist/ui/index.js +34 -104
- package/dist/ui/index.js.map +2 -2
- package/dist/worker.js +405 -179
- package/package.json +1 -1
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
|
|
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
|
|
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,
|
|
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
|
|
111
|
-
4. If the deployment is authenticated,
|
|
112
|
-
5.
|
|
113
|
-
6.
|
|
114
|
-
7.
|
|
115
|
-
8.
|
|
116
|
-
9.
|
|
117
|
-
10.
|
|
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.
|
|
@@ -156,9 +155,8 @@ The plugin is designed to avoid persisting raw credentials in plugin state.
|
|
|
156
155
|
|
|
157
156
|
- GitHub tokens saved through the UI are stored as per-company Paperclip secret references.
|
|
158
157
|
- 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
|
|
160
|
-
- On authenticated
|
|
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.
|
|
158
|
+
- 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.
|
|
159
|
+
- 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
160
|
- The worker resolves those secret references at runtime instead of storing raw tokens in plugin state.
|
|
163
161
|
- On authenticated Paperclip deployments, sync is blocked until the relevant company has connected Paperclip board access.
|
|
164
162
|
|
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.
|
|
506
|
+
var MANIFEST_VERSION = "0.4.2"?.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: "
|
|
597
|
+
type: "taskDetailView",
|
|
598
598
|
id: "paperclip-github-plugin-issue-detail-tab",
|
|
599
599
|
displayName: "GitHub",
|
|
600
|
-
exportName: "
|
|
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"
|
|
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." : "
|
|
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:
|
|
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--
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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--
|
|
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--
|
|
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:
|
|
32069
|
-
/* @__PURE__ */ jsx2("span", { children:
|
|
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}` : "
|
|
32127
|
-
/* @__PURE__ */ jsx2("span", { children:
|
|
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
|
-
|
|
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." : "
|
|
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
|
-
|
|
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: "
|
|
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: "
|
|
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__ */
|
|
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
|
-
|
|
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
|
|
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,
|