@gaud_erp/paperclip-github-manager 1.6.2 → 1.7.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/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/ui/index.js +106 -21
- package/dist/ui/index.js.map +2 -2
- package/package.json +1 -1
package/dist/manifest.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/manifest.ts
|
|
2
2
|
var manifest = {
|
|
3
3
|
id: "cus.github-manager",
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.7.0",
|
|
5
5
|
apiVersion: 1,
|
|
6
6
|
displayName: "GitHub Manager",
|
|
7
7
|
description: "Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip",
|
package/dist/manifest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.7.0\",\n apiVersion: 1,\n displayName: \"GitHub Manager\",\n description: \"Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip\",\n author: \"Gaud ERP\",\n categories: [\"connector\", \"automation\"],\n\n capabilities: [\n \"events.subscribe\",\n \"events.emit\",\n \"http.outbound\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"database.namespace.read\",\n \"database.namespace.write\",\n \"database.namespace.migrate\",\n \"jobs.schedule\",\n \"webhooks.receive\",\n \"agent.tools.register\",\n \"agents.managed\",\n \"agents.invoke\",\n \"agents.read\",\n \"issues.read\",\n \"companies.read\",\n \"ui.page.register\",\n \"ui.dashboardWidget.register\",\n \"ui.sidebar.register\",\n \"ui.detailTab.register\",\n \"ui.action.register\",\n \"instance.settings.register\",\n \"skills.managed\",\n ],\n\n instanceConfigSchema: {\n type: \"object\",\n required: [\"githubToken\"],\n properties: {\n githubToken: {\n type: \"string\",\n title: \"GitHub Personal Access Token\",\n description: \"Cole aqui o PAT do GitHub com permiss\u00F5es 'repo' e 'read:org'\",\n },\n defaultOrg: {\n type: \"string\",\n title: \"Default Organization\",\n description: \"GitHub organization to sync repositories from (optional)\",\n },\n syncIntervalMinutes: {\n type: \"number\",\n title: \"Sync Interval (minutes)\",\n description: \"How often to sync PRs and issues (default: 5)\",\n default: 5,\n minimum: 1,\n maximum: 1440,\n },\n },\n },\n\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n\n database: {\n migrationsDir: \"src/db/migrations\",\n },\n\n jobs: [\n {\n jobKey: \"sync-github\",\n displayName: \"Sync GitHub PRs and Issues\",\n schedule: \"*/5 * * * *\",\n description: \"Incremental sync of open PRs and issues for tracked repositories\",\n },\n ],\n\n webhooks: [\n {\n endpointKey: \"github-events\",\n displayName: \"GitHub Events\",\n description: \"Receives GitHub webhook events (pull_request, issues)\",\n },\n ],\n\n tools: [\n {\n name: \"github_get_pull_request_diff\",\n displayName: \"Get PR Diff\",\n description: \"Retrieve the unified diff of a GitHub pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\"],\n },\n },\n {\n name: \"github_read_file_content\",\n displayName: \"Read File\",\n description: \"Read a file from a GitHub repository\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n path: { type: \"string\" },\n ref: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"path\"],\n },\n },\n {\n name: \"github_create_review_comment\",\n displayName: \"Add Review Comment\",\n description: \"Post an inline review comment on a pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n commit_id: { type: \"string\" },\n path: { type: \"string\" },\n line: { type: \"number\" },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"commit_id\", \"path\", \"line\", \"body\"],\n },\n },\n {\n name: \"github_submit_pr_review\",\n displayName: \"Submit PR Review\",\n description: \"Submit a review verdict (approve, request changes, comment)\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n event: { type: \"string\", enum: [\"APPROVE\", \"REQUEST_CHANGES\", \"COMMENT\"] },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"event\", \"body\"],\n },\n },\n {\n name: \"github_list_repositories\",\n displayName: \"List Repositories\",\n description: \"List all tracked GitHub repositories\",\n parametersSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"github_search_issues\",\n displayName: \"Search Issues\",\n description: \"Search GitHub issues and PRs using search syntax\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"github_get_repo_structure\",\n displayName: \"Get Repo Structure\",\n description: \"Get the cached directory/file structure of a repository. Use this FIRST before reading files to understand the codebase layout and save tokens. Set refresh=true to regenerate from GitHub.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n repo_full_name: { type: \"string\", description: \"owner/repo format\" },\n refresh: { type: \"boolean\", description: \"Set true to regenerate the structure from GitHub (use when cache is stale)\" },\n },\n required: [\"repo_full_name\"],\n },\n },\n ],\n\n agents: [\n {\n agentKey: \"github-reviewer\",\n displayName: \"GitHub Code Reviewer\",\n role: \"code-review\",\n title: \"Senior Code Reviewer\",\n },\n ],\n\n skills: [\n {\n skillKey: \"github-codebase-access\",\n displayName: \"GitHub Codebase Access\",\n description: \"Provides agents with tools to read repository structure and files from GitHub without needing local filesystem access\",\n markdown: `# GitHub Codebase Access\n\nYou have access to GitHub repositories through the GitHub Manager plugin tools. NEVER say you don't have access to the codebase.\n\n## Available Tools\n\n### 1. github_get_repo_structure\nGet the directory and file structure of a repository. **Always call this FIRST** before reading any files.\n\nParameters:\n- \\`repo_full_name\\` (required): Repository in \"owner/repo\" format\n- \\`refresh\\` (optional): Set to true to regenerate from GitHub if cache is stale\n\n### 2. github_read_file_content\nRead the content of a specific file from a GitHub repository.\n\nParameters:\n- \\`owner\\` (required): Repository owner (e.g. \"gauderp\")\n- \\`repo\\` (required): Repository name (e.g. \"gaud-erp-api\")\n- \\`path\\` (required): File path (e.g. \"src/main/java/com/gaud/App.java\")\n- \\`ref\\` (optional): Branch or commit SHA (defaults to main branch)\n\n### 3. github_get_pull_request_diff\nGet the unified diff of a pull request for code review.\n\nParameters:\n- \\`owner\\`, \\`repo\\`, \\`pull_number\\`\n\n### 4. github_search_issues\nSearch GitHub issues and PRs using GitHub search syntax.\n\nParameters:\n- \\`query\\`: GitHub search query (e.g. \"is:open label:bug\")\n\n### 5. github_list_repositories\nList all tracked GitHub repositories (no parameters needed).\n\n## Mandatory Workflow\n\n1. **ALWAYS** start with \\`github_get_repo_structure\\` to understand the codebase layout\n2. Read only the files you actually need with \\`github_read_file_content\\`\n3. If the structure seems outdated, call \\`github_get_repo_structure\\` with \\`refresh=true\\`\n4. Never try to access the local filesystem for source code \u2014 always use these tools\n\n## Token Efficiency\nThe structure cache returns directories and key files in a single call (~5-50KB).\nThis replaces hundreds of file-listing API calls, saving 60-90% of tokens.\n`,\n },\n ],\n\n ui: {\n slots: [\n {\n type: \"sidebar\",\n id: \"github-sidebar\",\n exportName: \"GitHubSidebarLink\",\n displayName: \"GitHub\",\n },\n {\n type: \"page\",\n id: \"github-settings\",\n exportName: \"GitHubSettingsPage\",\n displayName: \"Configura\u00E7\u00F5es GitHub\",\n routePath: \"github-settings\",\n },\n {\n type: \"page\",\n id: \"github-repos\",\n exportName: \"GitHubReposPage\",\n displayName: \"Reposit\u00F3rios\",\n routePath: \"github-repos\",\n },\n {\n type: \"page\",\n id: \"github-prs\",\n exportName: \"GitHubPullRequestsPage\",\n displayName: \"Pull Requests\",\n routePath: \"github-prs\",\n },\n {\n type: \"page\",\n id: \"github-graphs\",\n exportName: \"GitHubGraphsPage\",\n displayName: \"Knowledge Graphs\",\n routePath: \"github-graphs\",\n },\n {\n type: \"dashboardWidget\",\n id: \"github-dashboard\",\n exportName: \"GitHubDashboardWidget\",\n displayName: \"GitHub Status\",\n },\n {\n type: \"detailTab\",\n id: \"github-detail\",\n exportName: \"GitHubDetailTab\",\n displayName: \"GitHub\",\n entityTypes: [\"issue\"],\n },\n {\n type: \"contextMenuItem\",\n id: \"github-context-menu\",\n exportName: \"GitHubContextMenu\",\n displayName: \"GitHub Actions\",\n entityTypes: [\"issue\"],\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/ui/index.js
CHANGED
|
@@ -377,15 +377,61 @@ function GitHubPullRequestsPage() {
|
|
|
377
377
|
const companyId = context.companyId;
|
|
378
378
|
const [stateFilter, setStateFilter] = useState3("open");
|
|
379
379
|
const [search, setSearch] = useState3("");
|
|
380
|
+
const [reviewingPR, setReviewingPR] = useState3(null);
|
|
381
|
+
const [reviewStatus, setReviewStatus] = useState3({});
|
|
380
382
|
const prsData = usePluginData3("pull-requests", {
|
|
381
383
|
companyId,
|
|
382
384
|
filters: stateFilter ? { state: stateFilter } : void 0
|
|
383
385
|
});
|
|
384
|
-
const
|
|
386
|
+
const agentsData = usePluginData3("available-agents", { companyId });
|
|
387
|
+
const syncAction = usePluginAction3("sync-all");
|
|
388
|
+
const requestReview = usePluginAction3("request-review");
|
|
389
|
+
const runQuickCheck = usePluginAction3("run-quick-check");
|
|
385
390
|
if (!companyId) return /* @__PURE__ */ jsx4("div", { style: layoutStack, children: "Selecione uma empresa." });
|
|
386
391
|
const prs = (prsData.data?.pullRequests ?? []).filter(
|
|
387
392
|
(pr) => !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase())
|
|
388
393
|
);
|
|
394
|
+
const agents = agentsData.data?.agents ?? [];
|
|
395
|
+
const handleRequestReview = async (pr, agentId) => {
|
|
396
|
+
setReviewingPR(pr.id);
|
|
397
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: "Solicitando review..." }));
|
|
398
|
+
try {
|
|
399
|
+
await requestReview({
|
|
400
|
+
companyId,
|
|
401
|
+
prId: pr.id,
|
|
402
|
+
repoFullName: pr.repoFullName,
|
|
403
|
+
prNumber: pr.number,
|
|
404
|
+
agentId
|
|
405
|
+
});
|
|
406
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: "Review solicitada!" }));
|
|
407
|
+
} catch (err) {
|
|
408
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: `Erro: ${err}` }));
|
|
409
|
+
} finally {
|
|
410
|
+
setReviewingPR(null);
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
const handleQuickCheck = async (pr) => {
|
|
414
|
+
setReviewingPR(pr.id);
|
|
415
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: "Executando quick check..." }));
|
|
416
|
+
try {
|
|
417
|
+
const result = await runQuickCheck({
|
|
418
|
+
companyId,
|
|
419
|
+
repoFullName: pr.repoFullName,
|
|
420
|
+
prNumber: pr.number
|
|
421
|
+
});
|
|
422
|
+
const checks = result.checks;
|
|
423
|
+
if (checks) {
|
|
424
|
+
const summary = checks.map((c) => `${c.passed ? "OK" : "WARN"}: ${c.name}`).join(" | ");
|
|
425
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: summary }));
|
|
426
|
+
} else {
|
|
427
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: "Quick check conclu\xEDdo" }));
|
|
428
|
+
}
|
|
429
|
+
} catch (err) {
|
|
430
|
+
setReviewStatus((s) => ({ ...s, [pr.id]: `Erro: ${err}` }));
|
|
431
|
+
} finally {
|
|
432
|
+
setReviewingPR(null);
|
|
433
|
+
}
|
|
434
|
+
};
|
|
389
435
|
return /* @__PURE__ */ jsxs4("div", { style: layoutStack, children: [
|
|
390
436
|
/* @__PURE__ */ jsxs4("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
|
|
391
437
|
/* @__PURE__ */ jsxs4("h2", { style: { margin: 0, fontSize: "18px" }, children: [
|
|
@@ -423,28 +469,67 @@ function GitHubPullRequestsPage() {
|
|
|
423
469
|
prs.length === 0 && /* @__PURE__ */ jsx4("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.6 }, children: "Nenhum PR encontrado com os filtros atuais." }),
|
|
424
470
|
prs.map((pr) => {
|
|
425
471
|
const badge = prStateBadge(pr.draft ? "draft" : pr.state);
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
472
|
+
const status = reviewStatus[pr.id];
|
|
473
|
+
const isReviewing = reviewingPR === pr.id;
|
|
474
|
+
return /* @__PURE__ */ jsxs4("div", { style: cardStyle, children: [
|
|
475
|
+
/* @__PURE__ */ jsxs4("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
|
|
476
|
+
/* @__PURE__ */ jsxs4("div", { style: { flex: 1 }, children: [
|
|
477
|
+
/* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
|
|
478
|
+
/* @__PURE__ */ jsx4("span", { style: badgeStyle(badge.color), children: badge.label }),
|
|
479
|
+
/* @__PURE__ */ jsxs4("a", { href: pr.htmlUrl, target: "_blank", rel: "noopener", style: { fontWeight: 600, fontSize: "14px", color: "#3b82f6", textDecoration: "none" }, children: [
|
|
480
|
+
"#",
|
|
481
|
+
pr.number,
|
|
482
|
+
" ",
|
|
483
|
+
pr.title
|
|
484
|
+
] })
|
|
485
|
+
] }),
|
|
486
|
+
/* @__PURE__ */ jsxs4("div", { style: { marginTop: "4px", fontSize: "12px", opacity: 0.6 }, children: [
|
|
487
|
+
pr.repoFullName,
|
|
488
|
+
" \xB7 ",
|
|
489
|
+
pr.author,
|
|
490
|
+
" \xB7 ",
|
|
491
|
+
pr.headBranch,
|
|
492
|
+
" \u2192 ",
|
|
493
|
+
pr.baseBranch,
|
|
494
|
+
" \xB7 ",
|
|
495
|
+
timeAgo(pr.updatedAt)
|
|
496
|
+
] })
|
|
497
|
+
] }),
|
|
498
|
+
/* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "4px", flexShrink: 0 }, children: [
|
|
499
|
+
/* @__PURE__ */ jsx4(
|
|
500
|
+
"button",
|
|
501
|
+
{
|
|
502
|
+
type: "button",
|
|
503
|
+
style: buttonStyle,
|
|
504
|
+
disabled: isReviewing,
|
|
505
|
+
onClick: () => handleQuickCheck(pr),
|
|
506
|
+
title: "Checklist r\xE1pido autom\xE1tico",
|
|
507
|
+
children: "Quick Check"
|
|
508
|
+
}
|
|
509
|
+
),
|
|
510
|
+
agents.length > 0 ? /* @__PURE__ */ jsxs4(
|
|
511
|
+
"select",
|
|
512
|
+
{
|
|
513
|
+
style: {
|
|
514
|
+
...primaryButtonStyle,
|
|
515
|
+
cursor: isReviewing ? "wait" : "pointer",
|
|
516
|
+
opacity: isReviewing ? 0.6 : 1
|
|
517
|
+
},
|
|
518
|
+
disabled: isReviewing,
|
|
519
|
+
value: "",
|
|
520
|
+
onChange: (e) => {
|
|
521
|
+
if (e.target.value) handleRequestReview(pr, e.target.value);
|
|
522
|
+
},
|
|
523
|
+
children: [
|
|
524
|
+
/* @__PURE__ */ jsx4("option", { value: "", disabled: true, children: "Agent Review" }),
|
|
525
|
+
agents.map((agent) => /* @__PURE__ */ jsx4("option", { value: agent.id, children: agent.displayName }, agent.id))
|
|
526
|
+
]
|
|
527
|
+
}
|
|
528
|
+
) : /* @__PURE__ */ jsx4("button", { type: "button", style: primaryButtonStyle, disabled: true, title: "Nenhum agente dispon\xEDvel", children: "Agent Review" })
|
|
434
529
|
] })
|
|
435
530
|
] }),
|
|
436
|
-
/* @__PURE__ */
|
|
437
|
-
|
|
438
|
-
" \xB7 ",
|
|
439
|
-
pr.author,
|
|
440
|
-
" \xB7 ",
|
|
441
|
-
pr.headBranch,
|
|
442
|
-
" \u2192 ",
|
|
443
|
-
pr.baseBranch,
|
|
444
|
-
" \xB7 ",
|
|
445
|
-
timeAgo(pr.updatedAt)
|
|
446
|
-
] })
|
|
447
|
-
] }) }) }, pr.id);
|
|
531
|
+
status && /* @__PURE__ */ jsx4("div", { style: { marginTop: "6px", padding: "4px 8px", borderRadius: "4px", background: "rgba(128,128,128,0.08)", fontSize: "11px" }, children: status })
|
|
532
|
+
] }, pr.id);
|
|
448
533
|
})
|
|
449
534
|
] });
|
|
450
535
|
}
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ui/components/Sidebar.tsx", "../../src/ui/components/shared.ts", "../../src/ui/components/SettingsPage.tsx", "../../src/ui/components/ReposPage.tsx", "../../src/ui/components/PullRequestsPage.tsx", "../../src/ui/components/GraphsPage.tsx", "../../src/ui/components/DetailTab.tsx", "../../src/ui/components/ReviewDropdown.tsx", "../../src/ui/components/DashboardWidget.tsx", "../../src/ui/components/ContextMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS } from \"./shared.js\";\n\ntype NavItem = { label: string; path: string };\n\nconst NAV_ITEMS: NavItem[] = [\n { label: \"Configura\u00E7\u00F5es\", path: PATHS.settings },\n { label: \"Reposit\u00F3rios\", path: PATHS.repos },\n { label: \"Pull Requests\", path: PATHS.prs },\n { label: \"Knowledge Graphs\", path: PATHS.graphs },\n];\n\nexport function GitHubSidebarLink() {\n const nav = useHostNavigation();\n const href = nav.resolveHref(PATHS.repos);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n\n return (\n <a\n {...nav.linkProps(PATHS.repos)}\n aria-current={isActive ? \"page\" : undefined}\n className={[\n \"flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium\",\n isActive ? \"bg-accent text-foreground\" : \"text-foreground/80 hover:bg-accent/50\",\n ].join(\" \")}\n >\n <span className=\"relative shrink-0\">\n <svg viewBox=\"0 0 16 16\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z\" />\n </svg>\n </span>\n <span className=\"flex-1 truncate\">GitHub</span>\n </a>\n );\n}\n\nexport function GitHubSidebarPanel() {\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\");\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\", fontSize: \"12px\", padding: \"8px\" }}>\n <strong>GitHub</strong>\n <div>Repos: {syncStatus.data?.repoCount ?? 0}</div>\n <div>PRs abertos: {syncStatus.data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {syncStatus.data?.lastSync ? new Date(syncStatus.data.lastSync).toLocaleString() : \"nunca\"}</div>\n </div>\n );\n}\n\nexport function GitHubRouteSidebar() {\n const nav = useHostNavigation();\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", padding: \"4px\" }}>\n {NAV_ITEMS.map((item) => {\n const href = nav.resolveHref(item.path);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a\n key={item.path}\n {...nav.linkProps(item.path)}\n aria-current={isActive ? \"page\" : undefined}\n style={{\n display: \"block\",\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: isActive ? 600 : 400,\n background: isActive ? \"rgba(128,128,128,0.1)\" : \"transparent\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n {item.label}\n </a>\n );\n })}\n </div>\n );\n}\n", "import type React from \"react\";\n\nexport const ROUTES = {\n settings: \"github-settings\",\n repos: \"github-repos\",\n prs: \"github-prs\",\n graphs: \"github-graphs\",\n} as const;\n\nexport const PATHS = {\n settings: \"/github-settings\",\n repos: \"/github-repos\",\n prs: \"/github-prs\",\n graphs: \"/github-graphs\",\n} as const;\n\nexport const layoutStack: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n padding: \"16px\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(128,128,128,0.2)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n background: \"rgba(128,128,128,0.04)\",\n};\n\nexport const buttonStyle: React.CSSProperties = {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(128,128,128,0.3)\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n};\n\nexport const primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n background: \"rgba(59,130,246,0.1)\",\n borderColor: \"rgba(59,130,246,0.3)\",\n color: \"#3b82f6\",\n};\n\nexport const badgeStyle = (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: `${color}20`,\n color,\n});\n\nexport function prStateBadge(state: string): { label: string; color: string } {\n switch (state) {\n case \"open\": return { label: \"Open\", color: \"#22c55e\" };\n case \"closed\": return { label: \"Closed\", color: \"#ef4444\" };\n case \"merged\": return { label: \"Merged\", color: \"#a855f7\" };\n case \"draft\": return { label: \"Draft\", color: \"#6b7280\" };\n default: return { label: state, color: \"#6b7280\" };\n }\n}\n\nexport function timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\nexport function GitHubSettingsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n\n const [token, setToken] = useState(\"\");\n const [secretRef, setSecretRef] = useState(\"\");\n const [repoInput, setRepoInput] = useState(\"\");\n const [status, setStatus] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const saveToken = usePluginAction(\"save-token\");\n const saveSecretRefAction = usePluginAction(\"save-secret-ref\");\n const testConnection = usePluginAction(\"test-connection\");\n const addRepo = usePluginAction(\"add-repo\");\n const syncAll = usePluginAction(\"sync-all\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleSaveToken = async () => {\n if (!token.trim()) return;\n setLoading(true);\n try {\n await saveToken({ companyId, token: token.trim() });\n setStatus(\"Token salvo com sucesso\");\n setToken(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleSaveSecretRef = async () => {\n if (!secretRef.trim()) return;\n setLoading(true);\n try {\n await saveSecretRefAction({ companyId, secretRef: secretRef.trim() });\n setStatus(\"Secret ref salvo com sucesso\");\n setSecretRef(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleTestConnection = async () => {\n setLoading(true);\n try {\n const result = await testConnection({ companyId }) as { ok: boolean; login?: string; error?: string };\n if (result.ok) {\n setStatus(`Conectado como ${result.login}`);\n } else {\n setStatus(`Falha: ${result.error}`);\n }\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleAddRepo = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n await addRepo({ companyId, fullName: repoInput.trim() });\n setStatus(`Reposit\u00F3rio ${repoInput.trim()} adicionado`);\n setRepoInput(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleFullSync = async () => {\n setLoading(true);\n setStatus(\"Sincronizando...\");\n try {\n await syncAll({ companyId });\n setStatus(\"Sync completo finalizado\");\n } catch (err) {\n setStatus(`Erro no sync: ${err}`);\n }\n setLoading(false);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Configura\u00E7\u00F5es GitHub</h2>\n\n {status && (\n <div style={{ ...cardStyle, fontSize: \"13px\", color: status.startsWith(\"Erro\") ? \"#ef4444\" : \"#22c55e\" }}>\n {status}\n </div>\n )}\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Autentica\u00E7\u00E3o</h3>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n type=\"password\"\n placeholder=\"GitHub Personal Access Token\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveToken} disabled={loading}>\n Salvar PAT\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n placeholder=\"UUID do secret (alternativa)\"\n value={secretRef}\n onChange={(e) => setSecretRef(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveSecretRef} disabled={loading}>\n Salvar Ref\n </button>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleTestConnection} disabled={loading}>\n Testar Conex\u00E3o\n </button>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Adicionar Reposit\u00F3rio</h3>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <input\n placeholder=\"owner/repo (ex: gauderp/gaud-erp-api)\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={primaryButtonStyle} onClick={handleAddRepo} disabled={loading}>\n Adicionar\n </button>\n </div>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Sincroniza\u00E7\u00E3o</h3>\n <p style={{ margin: \"0 0 8px\", fontSize: \"12px\", opacity: 0.7 }}>\n Sync autom\u00E1tico a cada 5 minutos. Use o bot\u00E3o abaixo para for\u00E7ar um sync completo.\n </p>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleFullSync} disabled={loading}>\n {loading ? \"Sincronizando...\" : \"Sync Completo\"}\n </button>\n </div>\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, useHostNavigation, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle, timeAgo, PATHS } from \"./shared.js\";\nimport type { GitHubRepo } from \"../../types.js\";\n\nexport function GitHubReposPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [filter, setFilter] = useState(\"\");\n\n const nav = useHostNavigation();\n const reposData = usePluginData<{ repos: GitHubRepo[]; lastSync: string | null }>(\"repos\", { companyId });\n const syncAction = usePluginAction(\"sync-all\");\n const generateGraph = usePluginAction(\"generate-graph\");\n const [graphLoading, setGraphLoading] = useState<string | null>(null);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const repos = (reposData.data?.repos ?? []).filter((r) =>\n !filter || r.fullName.toLowerCase().includes(filter.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Reposit\u00F3rios ({repos.length})</h2>\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <span style={{ fontSize: \"11px\", opacity: 0.6 }}>\n \u00DAltimo sync: {reposData.data?.lastSync ? timeAgo(reposData.data.lastSync) : \"nunca\"}\n </span>\n <button\n type=\"button\"\n style={buttonStyle}\n onClick={() => syncAction({ companyId }).catch(console.error)}\n >\n Sync\n </button>\n </div>\n </div>\n\n <input\n placeholder=\"Filtrar reposit\u00F3rios...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{ padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n\n {repos.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum reposit\u00F3rio rastreado. Adicione em Configura\u00E7\u00F5es.\n </div>\n )}\n\n {repos.map((repo) => (\n <div key={repo.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div>\n <a href={repo.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n {repo.fullName}\n </a>\n {repo.private && <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>privado</span>}\n {repo.description && <p style={{ margin: \"4px 0 0\", fontSize: \"12px\", opacity: 0.7 }}>{repo.description}</p>}\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={buttonStyle}\n disabled={graphLoading === repo.fullName}\n onClick={async () => {\n setGraphLoading(repo.fullName);\n try {\n await generateGraph({ companyId, repoFullName: repo.fullName, level: \"code\" });\n nav.navigate(`${PATHS.graphs}?repo=${encodeURIComponent(repo.fullName)}`);\n } catch (err) {\n console.error(err);\n } finally {\n setGraphLoading(null);\n }\n }}\n title=\"Gerar Knowledge Graph\"\n >\n {graphLoading === repo.fullName ? \"Gerando...\" : \"Graphify\"}\n </button>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: \"16px\", marginTop: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {repo.language && <span>{repo.language}</span>}\n <span>branch: {repo.defaultBranch}</span>\n <span>sync: {timeAgo(repo.syncedAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubPullRequestsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [stateFilter, setStateFilter] = useState<string>(\"open\");\n const [search, setSearch] = useState(\"\");\n\n const prsData = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: stateFilter ? { state: stateFilter } : undefined,\n });\n\n const syncAction = usePluginAction(\"sync-incremental\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const prs = (prsData.data?.pullRequests ?? []).filter((pr) =>\n !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Pull Requests ({prs.length})</h2>\n <button type=\"button\" style={buttonStyle} onClick={() => syncAction({ companyId }).catch(console.error)}>\n Sync\n </button>\n </div>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n {[\"open\", \"closed\", \"merged\", \"\"].map((state) => (\n <button\n key={state}\n type=\"button\"\n style={{\n ...buttonStyle,\n background: stateFilter === state ? \"rgba(128,128,128,0.15)\" : \"transparent\",\n fontWeight: stateFilter === state ? 600 : 400,\n }}\n onClick={() => setStateFilter(state)}\n >\n {state || \"Todos\"}\n </button>\n ))}\n <input\n placeholder=\"Buscar por t\u00EDtulo ou repo...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ flex: 1, minWidth: \"200px\", padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n </div>\n\n {prs.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum PR encontrado com os filtros atuais.\n </div>\n )}\n\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"12px\", opacity: 0.6 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n", "import React, { useState, useEffect } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\nimport type { GraphData } from \"../../graphify/graph-generator.js\";\n\nfunction toObsidianCanvas(graph: GraphData): string {\n const CARD_W = 250;\n const CARD_H = 60;\n const COL_GAP = 300;\n const ROW_GAP = 100;\n\n const typeOrder: Record<string, number> = { repo: 0, module: 1, file: 2, pr: 3, agent: 4 };\n const grouped: Record<string, typeof graph.nodes> = {};\n for (const n of graph.nodes) {\n const t = n.type;\n if (!grouped[t]) grouped[t] = [];\n grouped[t].push(n);\n }\n\n const canvasNodes: Array<Record<string, unknown>> = [];\n const posMap: Record<string, { x: number; y: number }> = {};\n let col = 0;\n\n for (const type of Object.keys(grouped).sort((a, b) => (typeOrder[a] ?? 9) - (typeOrder[b] ?? 9))) {\n const items = grouped[type];\n let row = 0;\n for (const node of items) {\n const x = col * COL_GAP;\n const y = row * ROW_GAP;\n posMap[node.id] = { x, y };\n const color = type === \"repo\" ? \"1\" : type === \"pr\" ? \"4\" : type === \"module\" ? \"3\" : \"0\";\n canvasNodes.push({\n id: node.id,\n type: \"text\",\n x,\n y,\n width: CARD_W,\n height: CARD_H,\n color,\n text: `**[${node.type}]** ${node.label}`,\n });\n row++;\n }\n col++;\n }\n\n const canvasEdges = graph.edges.map((e, i) => ({\n id: `edge-${i}`,\n fromNode: e.source,\n toNode: e.target,\n fromSide: \"right\",\n toSide: \"left\",\n label: e.label,\n }));\n\n return JSON.stringify({ nodes: canvasNodes, edges: canvasEdges }, null, 2);\n}\n\nfunction downloadFile(filename: string, content: string, mime = \"application/json\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport function GitHubGraphsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [graphData, setGraphData] = useState<GraphData | null>(null);\n const [loading, setLoading] = useState(false);\n const [repoInput, setRepoInput] = useState(\"\");\n const [autoLoaded, setAutoLoaded] = useState(false);\n\n const generateGraph = usePluginAction(\"generate-graph\");\n\n // Auto-load graph from query param (when coming from Repos page Graphify button)\n useEffect(() => {\n if (autoLoaded || !companyId) return;\n const params = new URLSearchParams(window.location.search);\n const repo = params.get(\"repo\");\n if (repo) {\n setRepoInput(repo);\n setAutoLoaded(true);\n setLoading(true);\n generateGraph({ companyId, repoFullName: repo, level: \"code\" })\n .then((result) => setGraphData(result as GraphData))\n .catch(console.error)\n .finally(() => setLoading(false));\n }\n }, [companyId, autoLoaded]);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleGenerateHighLevel = async () => {\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, level: \"high\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleGenerateCode = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, repoFullName: repoInput.trim(), level: \"code\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleExportObsidian = () => {\n if (!graphData) return;\n const canvas = toObsidianCanvas(graphData);\n const name = graphData.repoFullName === \"*\"\n ? \"github-overview\"\n : graphData.repoFullName.replace(\"/\", \"-\");\n downloadFile(`${name}.canvas`, canvas);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Knowledge Graphs</h2>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleGenerateHighLevel} disabled={loading}>\n {loading ? \"Gerando...\" : \"Grafo de Alto N\u00EDvel\"}\n </button>\n <div style={{ display: \"flex\", gap: \"4px\", flex: 1 }}>\n <input\n placeholder=\"owner/repo para drill-down...\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleGenerateCode} disabled={loading || !repoInput.trim()}>\n Grafo de C\u00F3digo\n </button>\n </div>\n </div>\n\n {graphData && (\n <div style={cardStyle}>\n <div style={{ marginBottom: \"8px\", fontSize: \"13px\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div>\n <strong>{graphData.level === \"high\" ? \"Vis\u00E3o Geral\" : graphData.repoFullName}</strong>\n <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {graphData.nodes.length} n\u00F3s \u00B7 {graphData.edges.length} arestas \u00B7 {new Date(graphData.generatedAt).toLocaleString()}\n </span>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleExportObsidian}>\n Abrir no Obsidian\n </button>\n </div>\n <div style={{ maxHeight: \"400px\", overflow: \"auto\", fontSize: \"12px\" }}>\n <div style={{ marginBottom: \"8px\" }}>\n <strong>N\u00F3s:</strong>\n {graphData.nodes.map((node) => (\n <div key={node.id} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n <span style={{ opacity: 0.5 }}>[{node.type}]</span> {node.label}\n </div>\n ))}\n </div>\n <div>\n <strong>Arestas:</strong>\n {graphData.edges.map((edge, i) => (\n <div key={i} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n {edge.source} \u2192 {edge.target} <span style={{ opacity: 0.5 }}>({edge.label})</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {!graphData && !loading && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.5 }}>\n Clique em um dos bot\u00F5es acima para gerar um knowledge graph.\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport type { PluginDetailTabProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport { ReviewDropdown } from \"./ReviewDropdown.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubDetailTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [selectedPrId, setSelectedPrId] = useState<number | null>(null);\n\n const cardPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"card-prs\", {\n companyId,\n issueId,\n });\n\n const allPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: { state: \"open\" },\n });\n\n const linkAction = usePluginAction(\"link-pr-to-card\");\n const quickCheck = usePluginAction(\"run-quick-check\");\n\n if (!companyId || !issueId) {\n return <div style={{ padding: \"12px\", fontSize: \"13px\", opacity: 0.5 }}>Sem contexto dispon\u00EDvel.</div>;\n }\n\n const prs = cardPRs.data?.pullRequests ?? [];\n\n const handleLink = async () => {\n if (!selectedPrId) return;\n await linkAction({ prId: selectedPrId, issueId });\n setShowLinkInput(false);\n setSelectedPrId(null);\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\", padding: \"12px\" }}>\n {prs.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"20px 0\" }}>\n <p style={{ fontSize: \"13px\", opacity: 0.5, margin: \"0 0 12px\" }}>\n Nenhum PR vinculado a este card.\n </p>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(true)}>\n Vincular PR\n </button>\n </div>\n ) : (\n <>\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"13px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"11px\", opacity: 0.5 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n <ReviewDropdown\n companyId={companyId}\n prId={pr.id}\n repoFullName={pr.repoFullName}\n prNumber={pr.number}\n />\n </div>\n </div>\n );\n })}\n <button type=\"button\" style={{ ...buttonStyle, alignSelf: \"flex-start\", fontSize: \"12px\" }} onClick={() => setShowLinkInput(true)}>\n + Vincular outro PR\n </button>\n </>\n )}\n\n {showLinkInput && (\n <div style={cardStyle}>\n <div style={{ fontSize: \"13px\", fontWeight: 500, marginBottom: \"8px\" }}>Selecionar PR</div>\n <select\n style={{ width: \"100%\", padding: \"6px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\", marginBottom: \"8px\" }}\n onChange={(e) => setSelectedPrId(Number(e.target.value))}\n value={selectedPrId ?? \"\"}\n >\n <option value=\"\">Selecione um PR...</option>\n {(allPRs.data?.pullRequests ?? []).map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.repoFullName} #{pr.number} \u2014 {pr.title}\n </option>\n ))}\n </select>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" style={buttonStyle} onClick={handleLink} disabled={!selectedPrId}>\n Vincular\n </button>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(false)}>\n Cancelar\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\ntype Agent = { id: string; displayName: string; role: string };\n\ntype Props = {\n companyId: string;\n prId: number;\n repoFullName: string;\n prNumber: number;\n};\n\nexport function ReviewDropdown({ companyId, prId, repoFullName, prNumber }: Props) {\n const [open, setOpen] = useState(false);\n const [reviewing, setReviewing] = useState(false);\n\n const agentsData = usePluginData<{ agents: Agent[] }>(\"available-agents\", { companyId });\n const requestReview = usePluginAction(\"request-review\");\n\n const agents = agentsData.data?.agents ?? [];\n\n const handleReview = async (agentId: string) => {\n setReviewing(true);\n setOpen(false);\n try {\n await requestReview({ companyId, prId, repoFullName, prNumber, agentId });\n } catch (err) {\n console.error(\"Review request failed:\", err);\n }\n setReviewing(false);\n };\n\n if (reviewing) {\n return <span style={{ fontSize: \"12px\", opacity: 0.6 }}>Revisando...</span>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setOpen(!open)}>\n Revisar \u25BE\n </button>\n {open && (\n <div style={{\n position: \"absolute\", top: \"100%\", right: 0, marginTop: \"4px\",\n background: \"var(--background, #1a1a1a)\", border: \"1px solid rgba(128,128,128,0.3)\",\n borderRadius: \"8px\", padding: \"4px\", minWidth: \"200px\", zIndex: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}>\n {agents.length === 0 && (\n <div style={{ padding: \"8px\", fontSize: \"12px\", opacity: 0.5 }}>Nenhum agente dispon\u00EDvel</div>\n )}\n {agents.map((agent) => (\n <button\n key={agent.id}\n type=\"button\"\n style={{ ...buttonStyle, width: \"100%\", textAlign: \"left\", border: \"none\", borderRadius: \"4px\" }}\n onClick={() => handleReview(agent.id)}\n >\n <div style={{ fontWeight: 500 }}>{agent.displayName}</div>\n <div style={{ fontSize: \"11px\", opacity: 0.5 }}>{agent.role}</div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n", "import React from \"react\";\nimport type { PluginWidgetProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS, timeAgo } from \"./shared.js\";\n\nexport function GitHubDashboardWidget({ context }: PluginWidgetProps) {\n const nav = useHostNavigation();\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\", {\n companyId: context.companyId,\n });\n\n const data = syncStatus.data;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"12px\" }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <strong style={{ fontSize: \"13px\" }}>GitHub</strong>\n <span style={{\n display: \"inline-block\", width: \"8px\", height: \"8px\", borderRadius: \"50%\",\n background: data ? \"#22c55e\" : \"#6b7280\",\n }} />\n </div>\n <div style={{ display: \"grid\", gap: \"2px\" }}>\n <div>Reposit\u00F3rios: {data?.repoCount ?? 0}</div>\n <div>PRs abertos: {data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {data?.lastSync ? timeAgo(data.lastSync) : \"nunca\"}</div>\n </div>\n <a {...nav.linkProps(PATHS.prs)} style={{ fontSize: \"12px\", color: \"#3b82f6\" }}>\n Ver Pull Requests \u2192\n </a>\n </div>\n );\n}\n", "import React from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle } from \"./shared.js\";\n\nexport function GitHubContextMenu() {\n const context = useHostContext();\n const generateGraph = usePluginAction(\"generate-graph\");\n\n const handleGraphify = () => {\n if (!context.companyId) return;\n void generateGraph({\n companyId: context.companyId,\n level: \"high\",\n }).catch(console.error);\n };\n\n return (\n <button type=\"button\" style={buttonStyle} onClick={handleGraphify}>\n Gerar Knowledge Graph\n </button>\n );\n}\n"],
|
|
5
|
-
"mappings": ";AACA,SAAS,mBAAmB,qBAAqB;;;ACQ1C,IAAM,QAAQ;AAAA,EACnB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AACV;AAEO,IAAM,cAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,SAAS;AACX;AAEO,IAAM,YAAiC;AAAA,EAC5C,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,cAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AACZ;AAEO,IAAM,qBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,OAAO;AACT;AAEO,IAAM,aAAa,CAAC,WAAwC;AAAA,EACjE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY,GAAG,KAAK;AAAA,EACpB;AACF;AAEO,SAAS,aAAa,OAAiD;AAC5E,UAAQ,OAAO;AAAA,IACb,KAAK;AAAQ,aAAO,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,IACtD,KAAK;AAAU,aAAO,EAAE,OAAO,UAAU,OAAO,UAAU;AAAA,IAC1D,KAAK;AAAU,aAAO,EAAE,OAAO,UAAU,OAAO,UAAU;AAAA,IAC1D,KAAK;AAAS,aAAO,EAAE,OAAO,SAAS,OAAO,UAAU;AAAA,IACxD;AAAS,aAAO,EAAE,OAAO,OAAO,OAAO,UAAU;AAAA,EACnD;AACF;AAEO,SAAS,QAAQ,SAAyB;AAC/C,QAAM,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,EAAE,QAAQ;AACpD,QAAM,OAAO,KAAK,MAAM,OAAO,GAAK;AACpC,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;AAClC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,GAAG,IAAI;AAChB;;;ADvDI,SAUM,KAVN;AAbJ,IAAM,YAAuB;AAAA,EAC3B,EAAE,OAAO,uBAAiB,MAAM,MAAM,SAAS;AAAA,EAC/C,EAAE,OAAO,mBAAgB,MAAM,MAAM,MAAM;AAAA,EAC3C,EAAE,OAAO,iBAAiB,MAAM,MAAM,IAAI;AAAA,EAC1C,EAAE,OAAO,oBAAoB,MAAM,MAAM,OAAO;AAClD;AAEO,SAAS,oBAAoB;AAClC,QAAM,MAAM,kBAAkB;AAC9B,QAAM,OAAO,IAAI,YAAY,MAAM,KAAK;AACxC,QAAM,WAAW,OAAO,WAAW,eAAe,OAAO,SAAS,aAAa;AAE/E,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG,IAAI,UAAU,MAAM,KAAK;AAAA,MAC7B,gBAAc,WAAW,SAAS;AAAA,MAClC,WAAW;AAAA,QACT;AAAA,QACA,WAAW,8BAA8B;AAAA,MAC3C,EAAE,KAAK,GAAG;AAAA,MAEV;AAAA,4BAAC,UAAK,WAAU,qBACd,8BAAC,SAAI,SAAQ,aAAY,WAAU,WAAU,MAAK,gBAChD,8BAAC,UAAK,GAAE,+jBAA8jB,GACxkB,GACF;AAAA,QACA,oBAAC,UAAK,WAAU,mBAAkB,oBAAM;AAAA;AAAA;AAAA,EAC1C;AAEJ;AAEO,SAAS,qBAAqB;AACnC,QAAM,aAAa,cAAmF,aAAa;AAEnH,SACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,UAAU,QAAQ,SAAS,MAAM,GACnG;AAAA,wBAAC,YAAO,oBAAM;AAAA,IACd,qBAAC,SAAI;AAAA;AAAA,MAAQ,WAAW,MAAM,aAAa;AAAA,OAAE;AAAA,IAC7C,qBAAC,SAAI;AAAA;AAAA,MAAc,WAAW,MAAM,eAAe;AAAA,OAAE;AAAA,IACrD,qBAAC,SAAI;AAAA;AAAA,MAAc,WAAW,MAAM,WAAW,IAAI,KAAK,WAAW,KAAK,QAAQ,EAAE,eAAe,IAAI;AAAA,OAAQ;AAAA,KAC/G;AAEJ;AAEO,SAAS,qBAAqB;AACnC,QAAM,MAAM,kBAAkB;AAE9B,SACE,oBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,SAAS,MAAM,GAChF,oBAAU,IAAI,CAAC,SAAS;AACvB,UAAM,OAAO,IAAI,YAAY,KAAK,IAAI;AACtC,UAAM,WAAW,OAAO,WAAW,eAAe,OAAO,SAAS,aAAa;AAC/E,WACE;AAAA,MAAC;AAAA;AAAA,QAEE,GAAG,IAAI,UAAU,KAAK,IAAI;AAAA,QAC3B,gBAAc,WAAW,SAAS;AAAA,QAClC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY,WAAW,MAAM;AAAA,UAC7B,YAAY,WAAW,0BAA0B;AAAA,UACjD,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,QAEC,eAAK;AAAA;AAAA,MAdD,KAAK;AAAA,IAeZ;AAAA,EAEJ,CAAC,GACH;AAEJ;;;AEhFA,SAAgB,gBAAgB;AAChC,SAAS,gBAAgB,uBAAuB;AAmBvB,gBAAAA,MAgFjB,QAAAC,aAhFiB;AAhBlB,SAAS,qBAAqB;AACnC,QAAM,UAAU,eAAe;AAC/B,QAAM,YAAY,QAAQ;AAE1B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAC7C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAC7C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAwB,IAAI;AACxD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,YAAY,gBAAgB,YAAY;AAC9C,QAAM,sBAAsB,gBAAgB,iBAAiB;AAC7D,QAAM,iBAAiB,gBAAgB,iBAAiB;AACxD,QAAM,UAAU,gBAAgB,UAAU;AAC1C,QAAM,UAAU,gBAAgB,UAAU;AAE1C,MAAI,CAAC,UAAW,QAAO,gBAAAD,KAAC,SAAI,OAAO,aAAa,oCAAsB;AAEtE,QAAM,kBAAkB,YAAY;AAClC,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,eAAW,IAAI;AACf,QAAI;AACF,YAAM,UAAU,EAAE,WAAW,OAAO,MAAM,KAAK,EAAE,CAAC;AAClD,gBAAU,yBAAyB;AACnC,eAAS,EAAE;AAAA,IACb,SAAS,KAAK;AACZ,gBAAU,SAAS,GAAG,EAAE;AAAA,IAC1B;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,sBAAsB,YAAY;AACtC,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,eAAW,IAAI;AACf,QAAI;AACF,YAAM,oBAAoB,EAAE,WAAW,WAAW,UAAU,KAAK,EAAE,CAAC;AACpE,gBAAU,8BAA8B;AACxC,mBAAa,EAAE;AAAA,IACjB,SAAS,KAAK;AACZ,gBAAU,SAAS,GAAG,EAAE;AAAA,IAC1B;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,uBAAuB,YAAY;AACvC,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,EAAE,UAAU,CAAC;AACjD,UAAI,OAAO,IAAI;AACb,kBAAU,kBAAkB,OAAO,KAAK,EAAE;AAAA,MAC5C,OAAO;AACL,kBAAU,UAAU,OAAO,KAAK,EAAE;AAAA,MACpC;AAAA,IACF,SAAS,KAAK;AACZ,gBAAU,SAAS,GAAG,EAAE;AAAA,IAC1B;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,gBAAgB,YAAY;AAChC,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,eAAW,IAAI;AACf,QAAI;AACF,YAAM,QAAQ,EAAE,WAAW,UAAU,UAAU,KAAK,EAAE,CAAC;AACvD,gBAAU,kBAAe,UAAU,KAAK,CAAC,aAAa;AACtD,mBAAa,EAAE;AAAA,IACjB,SAAS,KAAK;AACZ,gBAAU,SAAS,GAAG,EAAE;AAAA,IAC1B;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,iBAAiB,YAAY;AACjC,eAAW,IAAI;AACf,cAAU,kBAAkB;AAC5B,QAAI;AACF,YAAM,QAAQ,EAAE,UAAU,CAAC;AAC3B,gBAAU,0BAA0B;AAAA,IACtC,SAAS,KAAK;AACZ,gBAAU,iBAAiB,GAAG,EAAE;AAAA,IAClC;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,aACV;AAAA,oBAAAD,KAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,OAAO,GAAG,wCAAoB;AAAA,IAE/D,UACC,gBAAAA,KAAC,SAAI,OAAO,EAAE,GAAG,WAAW,UAAU,QAAQ,OAAO,OAAO,WAAW,MAAM,IAAI,YAAY,UAAU,GACpG,kBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO,WACV;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,QAAQ,WAAW,UAAU,OAAO,GAAG,gCAAY;AAAA,MAChE,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,cAAc,MAAM,GAC7D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,QACrJ;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,iBAAiB,UAAU,SAAS,wBAEvF;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,cAAc,MAAM,GAC7D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,QACrJ;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,qBAAqB,UAAU,SAAS,wBAE3F;AAAA,SACF;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,sBAAsB,UAAU,SAAS,+BAEnG;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,WACV;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,QAAQ,WAAW,UAAU,OAAO,GAAG,sCAAqB;AAAA,MACzE,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,QACrJ;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,eAAe,UAAU,SAAS,uBAE5F;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,WACV;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,QAAQ,WAAW,UAAU,OAAO,GAAG,iCAAa;AAAA,MACjE,gBAAAA,KAAC,OAAE,OAAO,EAAE,QAAQ,WAAW,UAAU,QAAQ,SAAS,IAAI,GAAG,yGAEjE;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,gBAAgB,UAAU,SACjF,oBAAU,qBAAqB,iBAClC;AAAA,OACF;AAAA,KACF;AAEJ;;;AC1JA,SAAgB,YAAAE,iBAAgB;AAChC,SAAS,kBAAAC,iBAAgB,qBAAAC,oBAAmB,iBAAAC,gBAAe,mBAAAC,wBAAuB;AAezD,gBAAAC,MASjB,QAAAC,aATiB;AAXlB,SAAS,kBAAkB;AAChC,QAAM,UAAUC,gBAAe;AAC/B,QAAM,YAAY,QAAQ;AAC1B,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,EAAE;AAEvC,QAAM,MAAMC,mBAAkB;AAC9B,QAAM,YAAYC,eAAgE,SAAS,EAAE,UAAU,CAAC;AACxG,QAAM,aAAaC,iBAAgB,UAAU;AAC7C,QAAM,gBAAgBA,iBAAgB,gBAAgB;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIH,UAAwB,IAAI;AAEpE,MAAI,CAAC,UAAW,QAAO,gBAAAH,KAAC,SAAI,OAAO,aAAa,oCAAsB;AAEtE,QAAM,SAAS,UAAU,MAAM,SAAS,CAAC,GAAG;AAAA,IAAO,CAAC,MAClD,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC;AAAA,EACnE;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,aACV;AAAA,oBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACnF;AAAA,sBAAAA,MAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,OAAO,GAAG;AAAA;AAAA,QAAe,MAAM;AAAA,QAAO;AAAA,SAAC;AAAA,MACzE,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,YAAY,SAAS,GAC9D;AAAA,wBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,SAAS,IAAI,GAAG;AAAA;AAAA,UACjC,UAAU,MAAM,WAAW,QAAQ,UAAU,KAAK,QAAQ,IAAI;AAAA,WAC9E;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,SAAS,MAAM,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,QAAQ,KAAK;AAAA,YAC7D;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,OAAO,EAAE,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,IAC5I;AAAA,IAEC,MAAM,WAAW,KAChB,gBAAAA,KAAC,SAAI,OAAO,EAAE,GAAG,WAAW,WAAW,UAAU,SAAS,IAAI,GAAG,+EAEjE;AAAA,IAGD,MAAM,IAAI,CAAC,SACV,gBAAAC,MAAC,SAAkB,OAAO,WACxB;AAAA,sBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,aAAa,GACvF;AAAA,wBAAAA,MAAC,SACC;AAAA,0BAAAD,KAAC,OAAE,MAAM,KAAK,SAAS,QAAO,UAAS,KAAI,YAAW,OAAO,EAAE,YAAY,KAAK,UAAU,QAAQ,OAAO,WAAW,gBAAgB,OAAO,GACxI,eAAK,UACR;AAAA,UACC,KAAK,WAAW,gBAAAA,KAAC,UAAK,OAAO,EAAE,YAAY,OAAO,UAAU,QAAQ,SAAS,IAAI,GAAG,qBAAO;AAAA,UAC3F,KAAK,eAAe,gBAAAA,KAAC,OAAE,OAAO,EAAE,QAAQ,WAAW,UAAU,QAAQ,SAAS,IAAI,GAAI,eAAK,aAAY;AAAA,WAC1G;AAAA,QACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,iBAAiB,KAAK;AAAA,YAChC,SAAS,YAAY;AACnB,8BAAgB,KAAK,QAAQ;AAC7B,kBAAI;AACF,sBAAM,cAAc,EAAE,WAAW,cAAc,KAAK,UAAU,OAAO,OAAO,CAAC;AAC7E,oBAAI,SAAS,GAAG,MAAM,MAAM,SAAS,mBAAmB,KAAK,QAAQ,CAAC,EAAE;AAAA,cAC1E,SAAS,KAAK;AACZ,wBAAQ,MAAM,GAAG;AAAA,cACnB,UAAE;AACA,gCAAgB,IAAI;AAAA,cACtB;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YAEL,2BAAiB,KAAK,WAAW,eAAe;AAAA;AAAA,QACnD,GACF;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,QAAQ,WAAW,OAAO,UAAU,QAAQ,SAAS,IAAI,GAC1F;AAAA,aAAK,YAAY,gBAAAD,KAAC,UAAM,eAAK,UAAS;AAAA,QACvC,gBAAAC,MAAC,UAAK;AAAA;AAAA,UAAS,KAAK;AAAA,WAAc;AAAA,QAClC,gBAAAA,MAAC,UAAK;AAAA;AAAA,UAAO,QAAQ,KAAK,QAAQ;AAAA,WAAE;AAAA,SACtC;AAAA,SAnCQ,KAAK,EAoCf,CACD;AAAA,KACH;AAEJ;;;AC9FA,SAAgB,YAAAM,iBAAgB;AAChC,SAAS,kBAAAC,iBAAgB,iBAAAC,gBAAe,mBAAAC,wBAAuB;AAiBtC,gBAAAC,MASjB,QAAAC,aATiB;AAblB,SAAS,yBAAyB;AACvC,QAAM,UAAUC,gBAAe;AAC/B,QAAM,YAAY,QAAQ;AAC1B,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAiB,MAAM;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,EAAE;AAEvC,QAAM,UAAUC,eAA8C,iBAAiB;AAAA,IAC7E;AAAA,IACA,SAAS,cAAc,EAAE,OAAO,YAAY,IAAI;AAAA,EAClD,CAAC;AAED,QAAM,aAAaC,iBAAgB,kBAAkB;AAErD,MAAI,CAAC,UAAW,QAAO,gBAAAL,KAAC,SAAI,OAAO,aAAa,oCAAsB;AAEtE,QAAM,OAAO,QAAQ,MAAM,gBAAgB,CAAC,GAAG;AAAA,IAAO,CAAC,OACrD,CAAC,UAAU,GAAG,MAAM,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC,KAAK,GAAG,aAAa,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC;AAAA,EACjI;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,aACV;AAAA,oBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACnF;AAAA,sBAAAA,MAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,OAAO,GAAG;AAAA;AAAA,QAAgB,IAAI;AAAA,QAAO;AAAA,SAAC;AAAA,MACxE,gBAAAD,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,MAAM,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,QAAQ,KAAK,GAAG,kBAEzG;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,OAAO,GACzD;AAAA,OAAC,QAAQ,UAAU,UAAU,EAAE,EAAE,IAAI,CAAC,UACrC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAO;AAAA,YACL,GAAG;AAAA,YACH,YAAY,gBAAgB,QAAQ,2BAA2B;AAAA,YAC/D,YAAY,gBAAgB,QAAQ,MAAM;AAAA,UAC5C;AAAA,UACA,SAAS,MAAM,eAAe,KAAK;AAAA,UAElC,mBAAS;AAAA;AAAA,QATL;AAAA,MAUP,CACD;AAAA,MACD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,UACzC,OAAO,EAAE,MAAM,GAAG,UAAU,SAAS,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,MACxK;AAAA,OACF;AAAA,IAEC,IAAI,WAAW,KACd,gBAAAA,KAAC,SAAI,OAAO,EAAE,GAAG,WAAW,WAAW,UAAU,SAAS,IAAI,GAAG,yDAEjE;AAAA,IAGD,IAAI,IAAI,CAAC,OAAO;AACf,YAAM,QAAQ,aAAa,GAAG,QAAQ,UAAU,GAAG,KAAK;AACxD,aACE,gBAAAA,KAAC,SAAgB,OAAO,WACtB,0BAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,aAAa,GACvF,0BAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC9D;AAAA,0BAAAD,KAAC,UAAK,OAAO,WAAW,MAAM,KAAK,GAAI,gBAAM,OAAM;AAAA,UACnD,gBAAAC,MAAC,OAAE,MAAM,GAAG,SAAS,QAAO,UAAS,KAAI,YAAW,OAAO,EAAE,YAAY,KAAK,UAAU,QAAQ,OAAO,WAAW,gBAAgB,OAAO,GAAG;AAAA;AAAA,YACxI,GAAG;AAAA,YAAO;AAAA,YAAE,GAAG;AAAA,aACnB;AAAA,WACF;AAAA,QACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,OAAO,UAAU,QAAQ,SAAS,IAAI,GAC5D;AAAA,aAAG;AAAA,UAAa;AAAA,UAAI,GAAG;AAAA,UAAO;AAAA,UAAI,GAAG;AAAA,UAAW;AAAA,UAAI,GAAG;AAAA,UAAW;AAAA,UAAI,QAAQ,GAAG,SAAS;AAAA,WAC7F;AAAA,SACF,GACF,KAbQ,GAAG,EAcb;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;;;ACpFA,SAAgB,YAAAK,WAAU,iBAAiB;AAC3C,SAAS,kBAAAC,iBAAgB,mBAAAC,wBAAuB;AA6FvB,gBAAAC,MA0CjB,QAAAC,aA1CiB;AAzFzB,SAAS,iBAAiB,OAA0B;AAClD,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,UAAU;AAEhB,QAAM,YAAoC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,EAAE;AACzF,QAAM,UAA8C,CAAC;AACrD,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,IAAI,EAAE;AACZ,QAAI,CAAC,QAAQ,CAAC,EAAG,SAAQ,CAAC,IAAI,CAAC;AAC/B,YAAQ,CAAC,EAAE,KAAK,CAAC;AAAA,EACnB;AAEA,QAAM,cAA8C,CAAC;AACrD,QAAM,SAAmD,CAAC;AAC1D,MAAI,MAAM;AAEV,aAAW,QAAQ,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,UAAU,CAAC,KAAK,MAAM,UAAU,CAAC,KAAK,EAAE,GAAG;AACjG,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,MAAM;AACV,eAAW,QAAQ,OAAO;AACxB,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAChB,aAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE;AACzB,YAAM,QAAQ,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS,WAAW,MAAM;AACtF,kBAAY,KAAK;AAAA,QACf,IAAI,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK;AAAA,MACxC,CAAC;AACD;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,IAC7C,IAAI,QAAQ,CAAC;AAAA,IACb,UAAU,EAAE;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO,EAAE;AAAA,EACX,EAAE;AAEF,SAAO,KAAK,UAAU,EAAE,OAAO,aAAa,OAAO,YAAY,GAAG,MAAM,CAAC;AAC3E;AAEA,SAAS,aAAa,UAAkB,SAAiB,OAAO,oBAAoB;AAClF,QAAM,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/C,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,IAAE,MAAM;AACR,MAAI,gBAAgB,GAAG;AACzB;AAEO,SAAS,mBAAmB;AACjC,QAAM,UAAUC,gBAAe;AAC/B,QAAM,YAAY,QAAQ;AAC1B,QAAM,CAAC,WAAW,YAAY,IAAIC,UAA2B,IAAI;AACjE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,EAAE;AAC7C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,gBAAgBC,iBAAgB,gBAAgB;AAGtD,YAAU,MAAM;AACd,QAAI,cAAc,CAAC,UAAW;AAC9B,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,OAAO,OAAO,IAAI,MAAM;AAC9B,QAAI,MAAM;AACR,mBAAa,IAAI;AACjB,oBAAc,IAAI;AAClB,iBAAW,IAAI;AACf,oBAAc,EAAE,WAAW,cAAc,MAAM,OAAO,OAAO,CAAC,EAC3D,KAAK,CAAC,WAAW,aAAa,MAAmB,CAAC,EAClD,MAAM,QAAQ,KAAK,EACnB,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,CAAC;AAE1B,MAAI,CAAC,UAAW,QAAO,gBAAAJ,KAAC,SAAI,OAAO,aAAa,oCAAsB;AAEtE,QAAM,0BAA0B,YAAY;AAC1C,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,EAAE,WAAW,OAAO,OAAO,CAAC;AAC/D,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,GAAG;AAAA,IACnB;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,qBAAqB,YAAY;AACrC,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,EAAE,WAAW,cAAc,UAAU,KAAK,GAAG,OAAO,OAAO,CAAC;AAC/F,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,GAAG;AAAA,IACnB;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,uBAAuB,MAAM;AACjC,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,iBAAiB,SAAS;AACzC,UAAM,OAAO,UAAU,iBAAiB,MACpC,oBACA,UAAU,aAAa,QAAQ,KAAK,GAAG;AAC3C,iBAAa,GAAG,IAAI,WAAW,MAAM;AAAA,EACvC;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,aACV;AAAA,oBAAAD,KAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,OAAO,GAAG,8BAAgB;AAAA,IAE5D,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,OAAO,GAC1D;AAAA,sBAAAD,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,yBAAyB,UAAU,SAC1F,oBAAU,eAAe,0BAC5B;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,MAAM,EAAE,GACjD;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,OAAO;AAAA;AAAA,QACrJ;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,oBAAoB,UAAU,WAAW,CAAC,UAAU,KAAK,GAAG,gCAE/G;AAAA,SACF;AAAA,OACF;AAAA,IAEC,aACC,gBAAAC,MAAC,SAAI,OAAO,WACV;AAAA,sBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,UAAU,QAAQ,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GAC1H;AAAA,wBAAAA,MAAC,SACC;AAAA,0BAAAD,KAAC,YAAQ,oBAAU,UAAU,SAAS,mBAAgB,UAAU,cAAa;AAAA,UAC7E,gBAAAC,MAAC,UAAK,OAAO,EAAE,YAAY,OAAO,UAAU,QAAQ,SAAS,IAAI,GAC9D;AAAA,sBAAU,MAAM;AAAA,YAAO;AAAA,YAAQ,UAAU,MAAM;AAAA,YAAO;AAAA,YAAY,IAAI,KAAK,UAAU,WAAW,EAAE,eAAe;AAAA,aACpH;AAAA,WACF;AAAA,QACA,gBAAAD,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,sBAAsB,+BAEhF;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,SAAS,UAAU,QAAQ,UAAU,OAAO,GACnE;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAChC;AAAA,0BAAAD,KAAC,YAAO,qBAAI;AAAA,UACX,UAAU,MAAM,IAAI,CAAC,SACpB,gBAAAC,MAAC,SAAkB,OAAO,EAAE,SAAS,SAAS,aAAa,OAAO,GAChE;AAAA,4BAAAA,MAAC,UAAK,OAAO,EAAE,SAAS,IAAI,GAAG;AAAA;AAAA,cAAE,KAAK;AAAA,cAAK;AAAA,eAAC;AAAA,YAAO;AAAA,YAAE,KAAK;AAAA,eADlD,KAAK,EAEf,CACD;AAAA,WACH;AAAA,QACA,gBAAAA,MAAC,SACC;AAAA,0BAAAD,KAAC,YAAO,sBAAQ;AAAA,UACf,UAAU,MAAM,IAAI,CAAC,MAAM,MAC1B,gBAAAC,MAAC,SAAY,OAAO,EAAE,SAAS,SAAS,aAAa,OAAO,GACzD;AAAA,iBAAK;AAAA,YAAO;AAAA,YAAI,KAAK;AAAA,YAAO;AAAA,YAAC,gBAAAA,MAAC,UAAK,OAAO,EAAE,SAAS,IAAI,GAAG;AAAA;AAAA,cAAE,KAAK;AAAA,cAAM;AAAA,eAAC;AAAA,eADnE,CAEV,CACD;AAAA,WACH;AAAA,SACF;AAAA,OACF;AAAA,IAGD,CAAC,aAAa,CAAC,WACd,gBAAAD,KAAC,SAAI,OAAO,EAAE,GAAG,WAAW,WAAW,UAAU,SAAS,IAAI,GAAG,6EAEjE;AAAA,KAEJ;AAEJ;;;AC9LA,SAAgB,YAAAK,iBAAgB;AAEhC,SAAS,iBAAAC,gBAAe,mBAAAC,wBAAuB;;;ACF/C,SAAgB,YAAAC,iBAAgB;AAChC,SAAS,iBAAAC,gBAAe,mBAAAC,wBAAuB;AAiCpC,gBAAAC,MAmBC,QAAAC,aAnBD;AArBJ,SAAS,eAAe,EAAE,WAAW,MAAM,cAAc,SAAS,GAAU;AACjF,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,KAAK;AACtC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,QAAM,aAAaC,eAAmC,oBAAoB,EAAE,UAAU,CAAC;AACvF,QAAM,gBAAgBC,iBAAgB,gBAAgB;AAEtD,QAAM,SAAS,WAAW,MAAM,UAAU,CAAC;AAE3C,QAAM,eAAe,OAAO,YAAoB;AAC9C,iBAAa,IAAI;AACjB,YAAQ,KAAK;AACb,QAAI;AACF,YAAM,cAAc,EAAE,WAAW,MAAM,cAAc,UAAU,QAAQ,CAAC;AAAA,IAC1E,SAAS,KAAK;AACZ,cAAQ,MAAM,0BAA0B,GAAG;AAAA,IAC7C;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI,WAAW;AACb,WAAO,gBAAAJ,KAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,SAAS,IAAI,GAAG,0BAAY;AAAA,EACtE;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,eAAe,GAC1D;AAAA,oBAAAD,KAAC,YAAO,MAAK,UAAS,OAAO,oBAAoB,SAAS,MAAM,QAAQ,CAAC,IAAI,GAAG,4BAEhF;AAAA,IACC,QACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MAAY,KAAK;AAAA,MAAQ,OAAO;AAAA,MAAG,WAAW;AAAA,MACxD,YAAY;AAAA,MAA8B,QAAQ;AAAA,MAClD,cAAc;AAAA,MAAO,SAAS;AAAA,MAAO,UAAU;AAAA,MAAS,QAAQ;AAAA,MAChE,WAAW;AAAA,IACb,GACG;AAAA,aAAO,WAAW,KACjB,gBAAAD,KAAC,SAAI,OAAO,EAAE,SAAS,OAAO,UAAU,QAAQ,SAAS,IAAI,GAAG,yCAAwB;AAAA,MAEzF,OAAO,IAAI,CAAC,UACX,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAO,EAAE,GAAG,aAAa,OAAO,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,cAAc,MAAM;AAAA,UAC/F,SAAS,MAAM,aAAa,MAAM,EAAE;AAAA,UAEpC;AAAA,4BAAAD,KAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAI,gBAAM,aAAY;AAAA,YACpD,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,SAAS,IAAI,GAAI,gBAAM,MAAK;AAAA;AAAA;AAAA,QANvD,MAAM;AAAA,MAOb,CACD;AAAA,OACH;AAAA,KAEJ;AAEJ;;;ADxCW,SAwBH,UAxBG,OAAAK,MAeH,QAAAC,aAfG;AApBJ,SAAS,gBAAgB,EAAE,QAAQ,GAAyB;AACjE,QAAM,UAAU,QAAQ;AACxB,QAAM,YAAY,QAAQ;AAC1B,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,KAAK;AACxD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AAEpE,QAAM,UAAUC,eAA8C,YAAY;AAAA,IACxE;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAASA,eAA8C,iBAAiB;AAAA,IAC5E;AAAA,IACA,SAAS,EAAE,OAAO,OAAO;AAAA,EAC3B,CAAC;AAED,QAAM,aAAaC,iBAAgB,iBAAiB;AACpD,QAAM,aAAaA,iBAAgB,iBAAiB;AAEpD,MAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,WAAO,gBAAAJ,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,SAAS,IAAI,GAAG,yCAAwB;AAAA,EAClG;AAEA,QAAM,MAAM,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,aAAc;AACnB,UAAM,WAAW,EAAE,MAAM,cAAc,QAAQ,CAAC;AAChD,qBAAiB,KAAK;AACtB,oBAAgB,IAAI;AAAA,EACtB;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,SAAS,OAAO,GACjF;AAAA,QAAI,WAAW,IACd,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,SAAS,GACnD;AAAA,sBAAAD,KAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,SAAS,KAAK,QAAQ,WAAW,GAAG,8CAElE;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,MAAM,iBAAiB,IAAI,GAAG,yBAEjF;AAAA,OACF,IAEA,gBAAAC,MAAA,YACG;AAAA,UAAI,IAAI,CAAC,OAAO;AACf,cAAM,QAAQ,aAAa,GAAG,QAAQ,UAAU,GAAG,KAAK;AACxD,eACE,gBAAAD,KAAC,SAAgB,OAAO,WACtB,0BAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,aAAa,GACvF;AAAA,0BAAAA,MAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,4BAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC9D;AAAA,8BAAAD,KAAC,UAAK,OAAO,WAAW,MAAM,KAAK,GAAI,gBAAM,OAAM;AAAA,cACnD,gBAAAC,MAAC,OAAE,MAAM,GAAG,SAAS,QAAO,UAAS,KAAI,YAAW,OAAO,EAAE,YAAY,KAAK,UAAU,QAAQ,OAAO,WAAW,gBAAgB,OAAO,GAAG;AAAA;AAAA,gBACxI,GAAG;AAAA,gBAAO;AAAA,gBAAE,GAAG;AAAA,iBACnB;AAAA,eACF;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,OAAO,UAAU,QAAQ,SAAS,IAAI,GAC5D;AAAA,iBAAG;AAAA,cAAa;AAAA,cAAI,GAAG;AAAA,cAAO;AAAA,cAAI,GAAG;AAAA,cAAW;AAAA,cAAI,GAAG;AAAA,cAAW;AAAA,cAAI,QAAQ,GAAG,SAAS;AAAA,eAC7F;AAAA,aACF;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAM,GAAG;AAAA,cACT,cAAc,GAAG;AAAA,cACjB,UAAU,GAAG;AAAA;AAAA,UACf;AAAA,WACF,KAnBQ,GAAG,EAoBb;AAAA,MAEJ,CAAC;AAAA,MACD,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,EAAE,GAAG,aAAa,WAAW,cAAc,UAAU,OAAO,GAAG,SAAS,MAAM,iBAAiB,IAAI,GAAG,iCAEnI;AAAA,OACF;AAAA,IAGD,iBACC,gBAAAC,MAAC,SAAI,OAAO,WACV;AAAA,sBAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,YAAY,KAAK,cAAc,MAAM,GAAG,2BAAa;AAAA,MACrF,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,OAAO,QAAQ,SAAS,OAAO,cAAc,OAAO,QAAQ,mCAAmC,YAAY,eAAe,UAAU,QAAQ,cAAc,MAAM;AAAA,UACzK,UAAU,CAAC,MAAM,gBAAgB,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,UACvD,OAAO,gBAAgB;AAAA,UAEvB;AAAA,4BAAAD,KAAC,YAAO,OAAM,IAAG,gCAAkB;AAAA,aACjC,OAAO,MAAM,gBAAgB,CAAC,GAAG,IAAI,CAAC,OACtC,gBAAAC,MAAC,YAAmB,OAAO,GAAG,IAC3B;AAAA,iBAAG;AAAA,cAAa;AAAA,cAAG,GAAG;AAAA,cAAO;AAAA,cAAI,GAAG;AAAA,iBAD1B,GAAG,EAEhB,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA,wBAAAD,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,YAAY,UAAU,CAAC,cAAc,sBAExF;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,MAAM,iBAAiB,KAAK,GAAG,sBAElF;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AE7GA,SAAS,qBAAAK,oBAAmB,iBAAAC,sBAAqB;AAa3C,SACE,OAAAC,MADF,QAAAC,aAAA;AAVC,SAAS,sBAAsB,EAAE,QAAQ,GAAsB;AACpE,QAAM,MAAMC,mBAAkB;AAC9B,QAAM,aAAaC,eAAmF,eAAe;AAAA,IACnH,WAAW,QAAQ;AAAA,EACrB,CAAC;AAED,QAAM,OAAO,WAAW;AAExB,SACE,gBAAAF,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,UAAU,OAAO,GACnF;AAAA,oBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACnF;AAAA,sBAAAD,KAAC,YAAO,OAAO,EAAE,UAAU,OAAO,GAAG,oBAAM;AAAA,MAC3C,gBAAAA,KAAC,UAAK,OAAO;AAAA,QACX,SAAS;AAAA,QAAgB,OAAO;AAAA,QAAO,QAAQ;AAAA,QAAO,cAAc;AAAA,QACpE,YAAY,OAAO,YAAY;AAAA,MACjC,GAAG;AAAA,OACL;AAAA,IACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA,sBAAAA,MAAC,SAAI;AAAA;AAAA,QAAe,MAAM,aAAa;AAAA,SAAE;AAAA,MACzC,gBAAAA,MAAC,SAAI;AAAA;AAAA,QAAc,MAAM,eAAe;AAAA,SAAE;AAAA,MAC1C,gBAAAA,MAAC,SAAI;AAAA;AAAA,QAAc,MAAM,WAAW,QAAQ,KAAK,QAAQ,IAAI;AAAA,SAAQ;AAAA,OACvE;AAAA,IACA,gBAAAD,KAAC,OAAG,GAAG,IAAI,UAAU,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,QAAQ,OAAO,UAAU,GAAG,sCAEhF;AAAA,KACF;AAEJ;;;AC/BA,SAAS,kBAAAI,iBAAgB,mBAAAC,wBAAuB;AAgB5C,gBAAAC,YAAA;AAbG,SAAS,oBAAoB;AAClC,QAAM,UAAUC,gBAAe;AAC/B,QAAM,gBAAgBC,iBAAgB,gBAAgB;AAEtD,QAAM,iBAAiB,MAAM;AAC3B,QAAI,CAAC,QAAQ,UAAW;AACxB,SAAK,cAAc;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,OAAO;AAAA,IACT,CAAC,EAAE,MAAM,QAAQ,KAAK;AAAA,EACxB;AAEA,SACE,gBAAAF,KAAC,YAAO,MAAK,UAAS,OAAO,aAAa,SAAS,gBAAgB,mCAEnE;AAEJ;",
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS } from \"./shared.js\";\n\ntype NavItem = { label: string; path: string };\n\nconst NAV_ITEMS: NavItem[] = [\n { label: \"Configura\u00E7\u00F5es\", path: PATHS.settings },\n { label: \"Reposit\u00F3rios\", path: PATHS.repos },\n { label: \"Pull Requests\", path: PATHS.prs },\n { label: \"Knowledge Graphs\", path: PATHS.graphs },\n];\n\nexport function GitHubSidebarLink() {\n const nav = useHostNavigation();\n const href = nav.resolveHref(PATHS.repos);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n\n return (\n <a\n {...nav.linkProps(PATHS.repos)}\n aria-current={isActive ? \"page\" : undefined}\n className={[\n \"flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium\",\n isActive ? \"bg-accent text-foreground\" : \"text-foreground/80 hover:bg-accent/50\",\n ].join(\" \")}\n >\n <span className=\"relative shrink-0\">\n <svg viewBox=\"0 0 16 16\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z\" />\n </svg>\n </span>\n <span className=\"flex-1 truncate\">GitHub</span>\n </a>\n );\n}\n\nexport function GitHubSidebarPanel() {\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\");\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\", fontSize: \"12px\", padding: \"8px\" }}>\n <strong>GitHub</strong>\n <div>Repos: {syncStatus.data?.repoCount ?? 0}</div>\n <div>PRs abertos: {syncStatus.data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {syncStatus.data?.lastSync ? new Date(syncStatus.data.lastSync).toLocaleString() : \"nunca\"}</div>\n </div>\n );\n}\n\nexport function GitHubRouteSidebar() {\n const nav = useHostNavigation();\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", padding: \"4px\" }}>\n {NAV_ITEMS.map((item) => {\n const href = nav.resolveHref(item.path);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a\n key={item.path}\n {...nav.linkProps(item.path)}\n aria-current={isActive ? \"page\" : undefined}\n style={{\n display: \"block\",\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: isActive ? 600 : 400,\n background: isActive ? \"rgba(128,128,128,0.1)\" : \"transparent\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n {item.label}\n </a>\n );\n })}\n </div>\n );\n}\n", "import type React from \"react\";\n\nexport const ROUTES = {\n settings: \"github-settings\",\n repos: \"github-repos\",\n prs: \"github-prs\",\n graphs: \"github-graphs\",\n} as const;\n\nexport const PATHS = {\n settings: \"/github-settings\",\n repos: \"/github-repos\",\n prs: \"/github-prs\",\n graphs: \"/github-graphs\",\n} as const;\n\nexport const layoutStack: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n padding: \"16px\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(128,128,128,0.2)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n background: \"rgba(128,128,128,0.04)\",\n};\n\nexport const buttonStyle: React.CSSProperties = {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(128,128,128,0.3)\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n};\n\nexport const primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n background: \"rgba(59,130,246,0.1)\",\n borderColor: \"rgba(59,130,246,0.3)\",\n color: \"#3b82f6\",\n};\n\nexport const badgeStyle = (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: `${color}20`,\n color,\n});\n\nexport function prStateBadge(state: string): { label: string; color: string } {\n switch (state) {\n case \"open\": return { label: \"Open\", color: \"#22c55e\" };\n case \"closed\": return { label: \"Closed\", color: \"#ef4444\" };\n case \"merged\": return { label: \"Merged\", color: \"#a855f7\" };\n case \"draft\": return { label: \"Draft\", color: \"#6b7280\" };\n default: return { label: state, color: \"#6b7280\" };\n }\n}\n\nexport function timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\nexport function GitHubSettingsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n\n const [token, setToken] = useState(\"\");\n const [secretRef, setSecretRef] = useState(\"\");\n const [repoInput, setRepoInput] = useState(\"\");\n const [status, setStatus] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const saveToken = usePluginAction(\"save-token\");\n const saveSecretRefAction = usePluginAction(\"save-secret-ref\");\n const testConnection = usePluginAction(\"test-connection\");\n const addRepo = usePluginAction(\"add-repo\");\n const syncAll = usePluginAction(\"sync-all\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleSaveToken = async () => {\n if (!token.trim()) return;\n setLoading(true);\n try {\n await saveToken({ companyId, token: token.trim() });\n setStatus(\"Token salvo com sucesso\");\n setToken(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleSaveSecretRef = async () => {\n if (!secretRef.trim()) return;\n setLoading(true);\n try {\n await saveSecretRefAction({ companyId, secretRef: secretRef.trim() });\n setStatus(\"Secret ref salvo com sucesso\");\n setSecretRef(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleTestConnection = async () => {\n setLoading(true);\n try {\n const result = await testConnection({ companyId }) as { ok: boolean; login?: string; error?: string };\n if (result.ok) {\n setStatus(`Conectado como ${result.login}`);\n } else {\n setStatus(`Falha: ${result.error}`);\n }\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleAddRepo = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n await addRepo({ companyId, fullName: repoInput.trim() });\n setStatus(`Reposit\u00F3rio ${repoInput.trim()} adicionado`);\n setRepoInput(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleFullSync = async () => {\n setLoading(true);\n setStatus(\"Sincronizando...\");\n try {\n await syncAll({ companyId });\n setStatus(\"Sync completo finalizado\");\n } catch (err) {\n setStatus(`Erro no sync: ${err}`);\n }\n setLoading(false);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Configura\u00E7\u00F5es GitHub</h2>\n\n {status && (\n <div style={{ ...cardStyle, fontSize: \"13px\", color: status.startsWith(\"Erro\") ? \"#ef4444\" : \"#22c55e\" }}>\n {status}\n </div>\n )}\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Autentica\u00E7\u00E3o</h3>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n type=\"password\"\n placeholder=\"GitHub Personal Access Token\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveToken} disabled={loading}>\n Salvar PAT\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n placeholder=\"UUID do secret (alternativa)\"\n value={secretRef}\n onChange={(e) => setSecretRef(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveSecretRef} disabled={loading}>\n Salvar Ref\n </button>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleTestConnection} disabled={loading}>\n Testar Conex\u00E3o\n </button>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Adicionar Reposit\u00F3rio</h3>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <input\n placeholder=\"owner/repo (ex: gauderp/gaud-erp-api)\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={primaryButtonStyle} onClick={handleAddRepo} disabled={loading}>\n Adicionar\n </button>\n </div>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Sincroniza\u00E7\u00E3o</h3>\n <p style={{ margin: \"0 0 8px\", fontSize: \"12px\", opacity: 0.7 }}>\n Sync autom\u00E1tico a cada 5 minutos. Use o bot\u00E3o abaixo para for\u00E7ar um sync completo.\n </p>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleFullSync} disabled={loading}>\n {loading ? \"Sincronizando...\" : \"Sync Completo\"}\n </button>\n </div>\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, useHostNavigation, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle, timeAgo, PATHS } from \"./shared.js\";\nimport type { GitHubRepo } from \"../../types.js\";\n\nexport function GitHubReposPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [filter, setFilter] = useState(\"\");\n\n const nav = useHostNavigation();\n const reposData = usePluginData<{ repos: GitHubRepo[]; lastSync: string | null }>(\"repos\", { companyId });\n const syncAction = usePluginAction(\"sync-all\");\n const generateGraph = usePluginAction(\"generate-graph\");\n const [graphLoading, setGraphLoading] = useState<string | null>(null);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const repos = (reposData.data?.repos ?? []).filter((r) =>\n !filter || r.fullName.toLowerCase().includes(filter.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Reposit\u00F3rios ({repos.length})</h2>\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <span style={{ fontSize: \"11px\", opacity: 0.6 }}>\n \u00DAltimo sync: {reposData.data?.lastSync ? timeAgo(reposData.data.lastSync) : \"nunca\"}\n </span>\n <button\n type=\"button\"\n style={buttonStyle}\n onClick={() => syncAction({ companyId }).catch(console.error)}\n >\n Sync\n </button>\n </div>\n </div>\n\n <input\n placeholder=\"Filtrar reposit\u00F3rios...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{ padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n\n {repos.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum reposit\u00F3rio rastreado. Adicione em Configura\u00E7\u00F5es.\n </div>\n )}\n\n {repos.map((repo) => (\n <div key={repo.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div>\n <a href={repo.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n {repo.fullName}\n </a>\n {repo.private && <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>privado</span>}\n {repo.description && <p style={{ margin: \"4px 0 0\", fontSize: \"12px\", opacity: 0.7 }}>{repo.description}</p>}\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={buttonStyle}\n disabled={graphLoading === repo.fullName}\n onClick={async () => {\n setGraphLoading(repo.fullName);\n try {\n await generateGraph({ companyId, repoFullName: repo.fullName, level: \"code\" });\n nav.navigate(`${PATHS.graphs}?repo=${encodeURIComponent(repo.fullName)}`);\n } catch (err) {\n console.error(err);\n } finally {\n setGraphLoading(null);\n }\n }}\n title=\"Gerar Knowledge Graph\"\n >\n {graphLoading === repo.fullName ? \"Gerando...\" : \"Graphify\"}\n </button>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: \"16px\", marginTop: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {repo.language && <span>{repo.language}</span>}\n <span>branch: {repo.defaultBranch}</span>\n <span>sync: {timeAgo(repo.syncedAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubPullRequestsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [stateFilter, setStateFilter] = useState<string>(\"open\");\n const [search, setSearch] = useState(\"\");\n const [reviewingPR, setReviewingPR] = useState<number | null>(null);\n const [reviewStatus, setReviewStatus] = useState<Record<number, string>>({});\n\n const prsData = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: stateFilter ? { state: stateFilter } : undefined,\n });\n\n const agentsData = usePluginData<{ agents: Array<{ id: string; displayName: string }> }>(\"available-agents\", { companyId });\n\n const syncAction = usePluginAction(\"sync-all\");\n const requestReview = usePluginAction(\"request-review\");\n const runQuickCheck = usePluginAction(\"run-quick-check\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const prs = (prsData.data?.pullRequests ?? []).filter((pr) =>\n !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase()),\n );\n\n const agents = agentsData.data?.agents ?? [];\n\n const handleRequestReview = async (pr: PRWithRepo, agentId: string) => {\n setReviewingPR(pr.id);\n setReviewStatus((s) => ({ ...s, [pr.id]: \"Solicitando review...\" }));\n try {\n await requestReview({\n companyId,\n prId: pr.id,\n repoFullName: pr.repoFullName,\n prNumber: pr.number,\n agentId,\n });\n setReviewStatus((s) => ({ ...s, [pr.id]: \"Review solicitada!\" }));\n } catch (err) {\n setReviewStatus((s) => ({ ...s, [pr.id]: `Erro: ${err}` }));\n } finally {\n setReviewingPR(null);\n }\n };\n\n const handleQuickCheck = async (pr: PRWithRepo) => {\n setReviewingPR(pr.id);\n setReviewStatus((s) => ({ ...s, [pr.id]: \"Executando quick check...\" }));\n try {\n const result = await runQuickCheck({\n companyId,\n repoFullName: pr.repoFullName,\n prNumber: pr.number,\n }) as Record<string, unknown>;\n const checks = result.checks as Array<{ name: string; passed: boolean; detail: string }> | undefined;\n if (checks) {\n const summary = checks.map((c) => `${c.passed ? \"OK\" : \"WARN\"}: ${c.name}`).join(\" | \");\n setReviewStatus((s) => ({ ...s, [pr.id]: summary }));\n } else {\n setReviewStatus((s) => ({ ...s, [pr.id]: \"Quick check conclu\u00EDdo\" }));\n }\n } catch (err) {\n setReviewStatus((s) => ({ ...s, [pr.id]: `Erro: ${err}` }));\n } finally {\n setReviewingPR(null);\n }\n };\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Pull Requests ({prs.length})</h2>\n <button type=\"button\" style={buttonStyle} onClick={() => syncAction({ companyId }).catch(console.error)}>\n Sync\n </button>\n </div>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n {[\"open\", \"closed\", \"merged\", \"\"].map((state) => (\n <button\n key={state}\n type=\"button\"\n style={{\n ...buttonStyle,\n background: stateFilter === state ? \"rgba(128,128,128,0.15)\" : \"transparent\",\n fontWeight: stateFilter === state ? 600 : 400,\n }}\n onClick={() => setStateFilter(state)}\n >\n {state || \"Todos\"}\n </button>\n ))}\n <input\n placeholder=\"Buscar por t\u00EDtulo ou repo...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ flex: 1, minWidth: \"200px\", padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n </div>\n\n {prs.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum PR encontrado com os filtros atuais.\n </div>\n )}\n\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n const status = reviewStatus[pr.id];\n const isReviewing = reviewingPR === pr.id;\n\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"12px\", opacity: 0.6 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n <div style={{ display: \"flex\", gap: \"4px\", flexShrink: 0 }}>\n <button\n type=\"button\"\n style={buttonStyle}\n disabled={isReviewing}\n onClick={() => handleQuickCheck(pr)}\n title=\"Checklist r\u00E1pido autom\u00E1tico\"\n >\n Quick Check\n </button>\n {agents.length > 0 ? (\n <select\n style={{\n ...primaryButtonStyle,\n cursor: isReviewing ? \"wait\" : \"pointer\",\n opacity: isReviewing ? 0.6 : 1,\n }}\n disabled={isReviewing}\n value=\"\"\n onChange={(e) => {\n if (e.target.value) handleRequestReview(pr, e.target.value);\n }}\n >\n <option value=\"\" disabled>Agent Review</option>\n {agents.map((agent) => (\n <option key={agent.id} value={agent.id}>{agent.displayName}</option>\n ))}\n </select>\n ) : (\n <button type=\"button\" style={primaryButtonStyle} disabled title=\"Nenhum agente dispon\u00EDvel\">\n Agent Review\n </button>\n )}\n </div>\n </div>\n {status && (\n <div style={{ marginTop: \"6px\", padding: \"4px 8px\", borderRadius: \"4px\", background: \"rgba(128,128,128,0.08)\", fontSize: \"11px\" }}>\n {status}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n", "import React, { useState, useEffect } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\nimport type { GraphData } from \"../../graphify/graph-generator.js\";\n\nfunction toObsidianCanvas(graph: GraphData): string {\n const CARD_W = 250;\n const CARD_H = 60;\n const COL_GAP = 300;\n const ROW_GAP = 100;\n\n const typeOrder: Record<string, number> = { repo: 0, module: 1, file: 2, pr: 3, agent: 4 };\n const grouped: Record<string, typeof graph.nodes> = {};\n for (const n of graph.nodes) {\n const t = n.type;\n if (!grouped[t]) grouped[t] = [];\n grouped[t].push(n);\n }\n\n const canvasNodes: Array<Record<string, unknown>> = [];\n const posMap: Record<string, { x: number; y: number }> = {};\n let col = 0;\n\n for (const type of Object.keys(grouped).sort((a, b) => (typeOrder[a] ?? 9) - (typeOrder[b] ?? 9))) {\n const items = grouped[type];\n let row = 0;\n for (const node of items) {\n const x = col * COL_GAP;\n const y = row * ROW_GAP;\n posMap[node.id] = { x, y };\n const color = type === \"repo\" ? \"1\" : type === \"pr\" ? \"4\" : type === \"module\" ? \"3\" : \"0\";\n canvasNodes.push({\n id: node.id,\n type: \"text\",\n x,\n y,\n width: CARD_W,\n height: CARD_H,\n color,\n text: `**[${node.type}]** ${node.label}`,\n });\n row++;\n }\n col++;\n }\n\n const canvasEdges = graph.edges.map((e, i) => ({\n id: `edge-${i}`,\n fromNode: e.source,\n toNode: e.target,\n fromSide: \"right\",\n toSide: \"left\",\n label: e.label,\n }));\n\n return JSON.stringify({ nodes: canvasNodes, edges: canvasEdges }, null, 2);\n}\n\nfunction downloadFile(filename: string, content: string, mime = \"application/json\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport function GitHubGraphsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [graphData, setGraphData] = useState<GraphData | null>(null);\n const [loading, setLoading] = useState(false);\n const [repoInput, setRepoInput] = useState(\"\");\n const [autoLoaded, setAutoLoaded] = useState(false);\n\n const generateGraph = usePluginAction(\"generate-graph\");\n\n // Auto-load graph from query param (when coming from Repos page Graphify button)\n useEffect(() => {\n if (autoLoaded || !companyId) return;\n const params = new URLSearchParams(window.location.search);\n const repo = params.get(\"repo\");\n if (repo) {\n setRepoInput(repo);\n setAutoLoaded(true);\n setLoading(true);\n generateGraph({ companyId, repoFullName: repo, level: \"code\" })\n .then((result) => setGraphData(result as GraphData))\n .catch(console.error)\n .finally(() => setLoading(false));\n }\n }, [companyId, autoLoaded]);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleGenerateHighLevel = async () => {\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, level: \"high\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleGenerateCode = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, repoFullName: repoInput.trim(), level: \"code\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleExportObsidian = () => {\n if (!graphData) return;\n const canvas = toObsidianCanvas(graphData);\n const name = graphData.repoFullName === \"*\"\n ? \"github-overview\"\n : graphData.repoFullName.replace(\"/\", \"-\");\n downloadFile(`${name}.canvas`, canvas);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Knowledge Graphs</h2>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleGenerateHighLevel} disabled={loading}>\n {loading ? \"Gerando...\" : \"Grafo de Alto N\u00EDvel\"}\n </button>\n <div style={{ display: \"flex\", gap: \"4px\", flex: 1 }}>\n <input\n placeholder=\"owner/repo para drill-down...\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleGenerateCode} disabled={loading || !repoInput.trim()}>\n Grafo de C\u00F3digo\n </button>\n </div>\n </div>\n\n {graphData && (\n <div style={cardStyle}>\n <div style={{ marginBottom: \"8px\", fontSize: \"13px\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div>\n <strong>{graphData.level === \"high\" ? \"Vis\u00E3o Geral\" : graphData.repoFullName}</strong>\n <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {graphData.nodes.length} n\u00F3s \u00B7 {graphData.edges.length} arestas \u00B7 {new Date(graphData.generatedAt).toLocaleString()}\n </span>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleExportObsidian}>\n Abrir no Obsidian\n </button>\n </div>\n <div style={{ maxHeight: \"400px\", overflow: \"auto\", fontSize: \"12px\" }}>\n <div style={{ marginBottom: \"8px\" }}>\n <strong>N\u00F3s:</strong>\n {graphData.nodes.map((node) => (\n <div key={node.id} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n <span style={{ opacity: 0.5 }}>[{node.type}]</span> {node.label}\n </div>\n ))}\n </div>\n <div>\n <strong>Arestas:</strong>\n {graphData.edges.map((edge, i) => (\n <div key={i} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n {edge.source} \u2192 {edge.target} <span style={{ opacity: 0.5 }}>({edge.label})</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {!graphData && !loading && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.5 }}>\n Clique em um dos bot\u00F5es acima para gerar um knowledge graph.\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport type { PluginDetailTabProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport { ReviewDropdown } from \"./ReviewDropdown.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubDetailTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [selectedPrId, setSelectedPrId] = useState<number | null>(null);\n\n const cardPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"card-prs\", {\n companyId,\n issueId,\n });\n\n const allPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: { state: \"open\" },\n });\n\n const linkAction = usePluginAction(\"link-pr-to-card\");\n const quickCheck = usePluginAction(\"run-quick-check\");\n\n if (!companyId || !issueId) {\n return <div style={{ padding: \"12px\", fontSize: \"13px\", opacity: 0.5 }}>Sem contexto dispon\u00EDvel.</div>;\n }\n\n const prs = cardPRs.data?.pullRequests ?? [];\n\n const handleLink = async () => {\n if (!selectedPrId) return;\n await linkAction({ prId: selectedPrId, issueId });\n setShowLinkInput(false);\n setSelectedPrId(null);\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\", padding: \"12px\" }}>\n {prs.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"20px 0\" }}>\n <p style={{ fontSize: \"13px\", opacity: 0.5, margin: \"0 0 12px\" }}>\n Nenhum PR vinculado a este card.\n </p>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(true)}>\n Vincular PR\n </button>\n </div>\n ) : (\n <>\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"13px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"11px\", opacity: 0.5 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n <ReviewDropdown\n companyId={companyId}\n prId={pr.id}\n repoFullName={pr.repoFullName}\n prNumber={pr.number}\n />\n </div>\n </div>\n );\n })}\n <button type=\"button\" style={{ ...buttonStyle, alignSelf: \"flex-start\", fontSize: \"12px\" }} onClick={() => setShowLinkInput(true)}>\n + Vincular outro PR\n </button>\n </>\n )}\n\n {showLinkInput && (\n <div style={cardStyle}>\n <div style={{ fontSize: \"13px\", fontWeight: 500, marginBottom: \"8px\" }}>Selecionar PR</div>\n <select\n style={{ width: \"100%\", padding: \"6px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\", marginBottom: \"8px\" }}\n onChange={(e) => setSelectedPrId(Number(e.target.value))}\n value={selectedPrId ?? \"\"}\n >\n <option value=\"\">Selecione um PR...</option>\n {(allPRs.data?.pullRequests ?? []).map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.repoFullName} #{pr.number} \u2014 {pr.title}\n </option>\n ))}\n </select>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" style={buttonStyle} onClick={handleLink} disabled={!selectedPrId}>\n Vincular\n </button>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(false)}>\n Cancelar\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\ntype Agent = { id: string; displayName: string; role: string };\n\ntype Props = {\n companyId: string;\n prId: number;\n repoFullName: string;\n prNumber: number;\n};\n\nexport function ReviewDropdown({ companyId, prId, repoFullName, prNumber }: Props) {\n const [open, setOpen] = useState(false);\n const [reviewing, setReviewing] = useState(false);\n\n const agentsData = usePluginData<{ agents: Agent[] }>(\"available-agents\", { companyId });\n const requestReview = usePluginAction(\"request-review\");\n\n const agents = agentsData.data?.agents ?? [];\n\n const handleReview = async (agentId: string) => {\n setReviewing(true);\n setOpen(false);\n try {\n await requestReview({ companyId, prId, repoFullName, prNumber, agentId });\n } catch (err) {\n console.error(\"Review request failed:\", err);\n }\n setReviewing(false);\n };\n\n if (reviewing) {\n return <span style={{ fontSize: \"12px\", opacity: 0.6 }}>Revisando...</span>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setOpen(!open)}>\n Revisar \u25BE\n </button>\n {open && (\n <div style={{\n position: \"absolute\", top: \"100%\", right: 0, marginTop: \"4px\",\n background: \"var(--background, #1a1a1a)\", border: \"1px solid rgba(128,128,128,0.3)\",\n borderRadius: \"8px\", padding: \"4px\", minWidth: \"200px\", zIndex: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}>\n {agents.length === 0 && (\n <div style={{ padding: \"8px\", fontSize: \"12px\", opacity: 0.5 }}>Nenhum agente dispon\u00EDvel</div>\n )}\n {agents.map((agent) => (\n <button\n key={agent.id}\n type=\"button\"\n style={{ ...buttonStyle, width: \"100%\", textAlign: \"left\", border: \"none\", borderRadius: \"4px\" }}\n onClick={() => handleReview(agent.id)}\n >\n <div style={{ fontWeight: 500 }}>{agent.displayName}</div>\n <div style={{ fontSize: \"11px\", opacity: 0.5 }}>{agent.role}</div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n", "import React from \"react\";\nimport type { PluginWidgetProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS, timeAgo } from \"./shared.js\";\n\nexport function GitHubDashboardWidget({ context }: PluginWidgetProps) {\n const nav = useHostNavigation();\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\", {\n companyId: context.companyId,\n });\n\n const data = syncStatus.data;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"12px\" }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <strong style={{ fontSize: \"13px\" }}>GitHub</strong>\n <span style={{\n display: \"inline-block\", width: \"8px\", height: \"8px\", borderRadius: \"50%\",\n background: data ? \"#22c55e\" : \"#6b7280\",\n }} />\n </div>\n <div style={{ display: \"grid\", gap: \"2px\" }}>\n <div>Reposit\u00F3rios: {data?.repoCount ?? 0}</div>\n <div>PRs abertos: {data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {data?.lastSync ? timeAgo(data.lastSync) : \"nunca\"}</div>\n </div>\n <a {...nav.linkProps(PATHS.prs)} style={{ fontSize: \"12px\", color: \"#3b82f6\" }}>\n Ver Pull Requests \u2192\n </a>\n </div>\n );\n}\n", "import React from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle } from \"./shared.js\";\n\nexport function GitHubContextMenu() {\n const context = useHostContext();\n const generateGraph = usePluginAction(\"generate-graph\");\n\n const handleGraphify = () => {\n if (!context.companyId) return;\n void generateGraph({\n companyId: context.companyId,\n level: \"high\",\n }).catch(console.error);\n };\n\n return (\n <button type=\"button\" style={buttonStyle} onClick={handleGraphify}>\n Gerar Knowledge Graph\n </button>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["jsx", "jsxs", "useState", "useHostContext", "useHostNavigation", "usePluginData", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "useHostNavigation", "usePluginData", "usePluginAction", "useState", "useHostContext", "usePluginData", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "usePluginData", "usePluginAction", "useState", "useHostContext", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "usePluginAction", "useState", "usePluginData", "usePluginAction", "useState", "usePluginData", "usePluginAction", "jsx", "jsxs", "useState", "usePluginData", "usePluginAction", "jsx", "jsxs", "useState", "usePluginData", "usePluginAction", "useHostNavigation", "usePluginData", "jsx", "jsxs", "useHostNavigation", "usePluginData", "useHostContext", "usePluginAction", "jsx", "useHostContext", "usePluginAction"]
|
|
7
7
|
}
|
package/package.json
CHANGED