@gaud_erp/paperclip-github-manager 1.7.0 → 1.7.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  // src/manifest.ts
2
2
  var manifest = {
3
3
  id: "cus.github-manager",
4
- version: "1.7.0",
4
+ version: "1.7.1",
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",
@@ -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.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"],
4
+ "sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.7.1\",\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
@@ -140,10 +140,54 @@ function GitHubRouteSidebar() {
140
140
  }) });
141
141
  }
142
142
 
143
+ // src/ui/components/NavBar.tsx
144
+ import { useHostNavigation as useHostNavigation2 } from "@paperclipai/plugin-sdk/ui";
145
+ import { jsx as jsx2 } from "react/jsx-runtime";
146
+ var NAV_ITEMS2 = [
147
+ { label: "Reposit\xF3rios", path: PATHS.repos },
148
+ { label: "Pull Requests", path: PATHS.prs },
149
+ { label: "Knowledge Graphs", path: PATHS.graphs },
150
+ { label: "Configura\xE7\xF5es", path: PATHS.settings }
151
+ ];
152
+ function GitHubNavBar() {
153
+ const nav = useHostNavigation2();
154
+ const currentPath = typeof window !== "undefined" ? window.location.pathname : "";
155
+ return /* @__PURE__ */ jsx2("nav", { style: {
156
+ display: "flex",
157
+ gap: "2px",
158
+ padding: "4px",
159
+ borderRadius: "8px",
160
+ background: "rgba(128,128,128,0.06)",
161
+ marginBottom: "4px"
162
+ }, children: NAV_ITEMS2.map((item) => {
163
+ const href = nav.resolveHref(item.path);
164
+ const isActive = currentPath.endsWith(item.path.replace("/", ""));
165
+ return /* @__PURE__ */ jsx2(
166
+ "a",
167
+ {
168
+ ...nav.linkProps(item.path),
169
+ "aria-current": isActive ? "page" : void 0,
170
+ style: {
171
+ padding: "6px 14px",
172
+ borderRadius: "6px",
173
+ fontSize: "13px",
174
+ fontWeight: isActive ? 600 : 400,
175
+ background: isActive ? "rgba(128,128,128,0.12)" : "transparent",
176
+ textDecoration: "none",
177
+ color: "inherit",
178
+ cursor: "pointer"
179
+ },
180
+ children: item.label
181
+ },
182
+ item.path
183
+ );
184
+ }) });
185
+ }
186
+
143
187
  // src/ui/components/SettingsPage.tsx
144
188
  import { useState } from "react";
145
189
  import { useHostContext, usePluginAction } from "@paperclipai/plugin-sdk/ui";
146
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
190
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
147
191
  function GitHubSettingsPage() {
148
192
  const context = useHostContext();
149
193
  const companyId = context.companyId;
@@ -157,7 +201,7 @@ function GitHubSettingsPage() {
157
201
  const testConnection = usePluginAction("test-connection");
158
202
  const addRepo = usePluginAction("add-repo");
159
203
  const syncAll = usePluginAction("sync-all");
160
- if (!companyId) return /* @__PURE__ */ jsx2("div", { style: layoutStack, children: "Selecione uma empresa." });
204
+ if (!companyId) return /* @__PURE__ */ jsx3("div", { style: layoutStack, children: "Selecione uma empresa." });
161
205
  const handleSaveToken = async () => {
162
206
  if (!token.trim()) return;
163
207
  setLoading(true);
@@ -220,12 +264,13 @@ function GitHubSettingsPage() {
220
264
  setLoading(false);
221
265
  };
222
266
  return /* @__PURE__ */ jsxs2("div", { style: layoutStack, children: [
223
- /* @__PURE__ */ jsx2("h2", { style: { margin: 0, fontSize: "18px" }, children: "Configura\xE7\xF5es GitHub" }),
224
- status && /* @__PURE__ */ jsx2("div", { style: { ...cardStyle, fontSize: "13px", color: status.startsWith("Erro") ? "#ef4444" : "#22c55e" }, children: status }),
267
+ /* @__PURE__ */ jsx3(GitHubNavBar, {}),
268
+ /* @__PURE__ */ jsx3("h2", { style: { margin: 0, fontSize: "18px" }, children: "Configura\xE7\xF5es GitHub" }),
269
+ status && /* @__PURE__ */ jsx3("div", { style: { ...cardStyle, fontSize: "13px", color: status.startsWith("Erro") ? "#ef4444" : "#22c55e" }, children: status }),
225
270
  /* @__PURE__ */ jsxs2("div", { style: cardStyle, children: [
226
- /* @__PURE__ */ jsx2("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Autentica\xE7\xE3o" }),
271
+ /* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Autentica\xE7\xE3o" }),
227
272
  /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: "8px", marginBottom: "8px" }, children: [
228
- /* @__PURE__ */ jsx2(
273
+ /* @__PURE__ */ jsx3(
229
274
  "input",
230
275
  {
231
276
  type: "password",
@@ -235,10 +280,10 @@ function GitHubSettingsPage() {
235
280
  style: { flex: 1, padding: "6px 10px", borderRadius: "6px", border: "1px solid rgba(128,128,128,0.3)", background: "transparent", fontSize: "13px" }
236
281
  }
237
282
  ),
238
- /* @__PURE__ */ jsx2("button", { type: "button", style: buttonStyle, onClick: handleSaveToken, disabled: loading, children: "Salvar PAT" })
283
+ /* @__PURE__ */ jsx3("button", { type: "button", style: buttonStyle, onClick: handleSaveToken, disabled: loading, children: "Salvar PAT" })
239
284
  ] }),
240
285
  /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: "8px", marginBottom: "8px" }, children: [
241
- /* @__PURE__ */ jsx2(
286
+ /* @__PURE__ */ jsx3(
242
287
  "input",
243
288
  {
244
289
  placeholder: "UUID do secret (alternativa)",
@@ -247,14 +292,14 @@ function GitHubSettingsPage() {
247
292
  style: { flex: 1, padding: "6px 10px", borderRadius: "6px", border: "1px solid rgba(128,128,128,0.3)", background: "transparent", fontSize: "13px" }
248
293
  }
249
294
  ),
250
- /* @__PURE__ */ jsx2("button", { type: "button", style: buttonStyle, onClick: handleSaveSecretRef, disabled: loading, children: "Salvar Ref" })
295
+ /* @__PURE__ */ jsx3("button", { type: "button", style: buttonStyle, onClick: handleSaveSecretRef, disabled: loading, children: "Salvar Ref" })
251
296
  ] }),
252
- /* @__PURE__ */ jsx2("button", { type: "button", style: primaryButtonStyle, onClick: handleTestConnection, disabled: loading, children: "Testar Conex\xE3o" })
297
+ /* @__PURE__ */ jsx3("button", { type: "button", style: primaryButtonStyle, onClick: handleTestConnection, disabled: loading, children: "Testar Conex\xE3o" })
253
298
  ] }),
254
299
  /* @__PURE__ */ jsxs2("div", { style: cardStyle, children: [
255
- /* @__PURE__ */ jsx2("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Adicionar Reposit\xF3rio" }),
300
+ /* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Adicionar Reposit\xF3rio" }),
256
301
  /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: "8px" }, children: [
257
- /* @__PURE__ */ jsx2(
302
+ /* @__PURE__ */ jsx3(
258
303
  "input",
259
304
  {
260
305
  placeholder: "owner/repo (ex: gauderp/gaud-erp-api)",
@@ -263,35 +308,36 @@ function GitHubSettingsPage() {
263
308
  style: { flex: 1, padding: "6px 10px", borderRadius: "6px", border: "1px solid rgba(128,128,128,0.3)", background: "transparent", fontSize: "13px" }
264
309
  }
265
310
  ),
266
- /* @__PURE__ */ jsx2("button", { type: "button", style: primaryButtonStyle, onClick: handleAddRepo, disabled: loading, children: "Adicionar" })
311
+ /* @__PURE__ */ jsx3("button", { type: "button", style: primaryButtonStyle, onClick: handleAddRepo, disabled: loading, children: "Adicionar" })
267
312
  ] })
268
313
  ] }),
269
314
  /* @__PURE__ */ jsxs2("div", { style: cardStyle, children: [
270
- /* @__PURE__ */ jsx2("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Sincroniza\xE7\xE3o" }),
271
- /* @__PURE__ */ jsx2("p", { style: { margin: "0 0 8px", fontSize: "12px", opacity: 0.7 }, children: "Sync autom\xE1tico a cada 5 minutos. Use o bot\xE3o abaixo para for\xE7ar um sync completo." }),
272
- /* @__PURE__ */ jsx2("button", { type: "button", style: primaryButtonStyle, onClick: handleFullSync, disabled: loading, children: loading ? "Sincronizando..." : "Sync Completo" })
315
+ /* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 8px", fontSize: "14px" }, children: "Sincroniza\xE7\xE3o" }),
316
+ /* @__PURE__ */ jsx3("p", { style: { margin: "0 0 8px", fontSize: "12px", opacity: 0.7 }, children: "Sync autom\xE1tico a cada 5 minutos. Use o bot\xE3o abaixo para for\xE7ar um sync completo." }),
317
+ /* @__PURE__ */ jsx3("button", { type: "button", style: primaryButtonStyle, onClick: handleFullSync, disabled: loading, children: loading ? "Sincronizando..." : "Sync Completo" })
273
318
  ] })
274
319
  ] });
275
320
  }
276
321
 
277
322
  // src/ui/components/ReposPage.tsx
278
323
  import { useState as useState2 } from "react";
279
- import { useHostContext as useHostContext2, useHostNavigation as useHostNavigation2, usePluginData as usePluginData2, usePluginAction as usePluginAction2 } from "@paperclipai/plugin-sdk/ui";
280
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
324
+ import { useHostContext as useHostContext2, useHostNavigation as useHostNavigation3, usePluginData as usePluginData2, usePluginAction as usePluginAction2 } from "@paperclipai/plugin-sdk/ui";
325
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
281
326
  function GitHubReposPage() {
282
327
  const context = useHostContext2();
283
328
  const companyId = context.companyId;
284
329
  const [filter, setFilter] = useState2("");
285
- const nav = useHostNavigation2();
330
+ const nav = useHostNavigation3();
286
331
  const reposData = usePluginData2("repos", { companyId });
287
332
  const syncAction = usePluginAction2("sync-all");
288
333
  const generateGraph = usePluginAction2("generate-graph");
289
334
  const [graphLoading, setGraphLoading] = useState2(null);
290
- if (!companyId) return /* @__PURE__ */ jsx3("div", { style: layoutStack, children: "Selecione uma empresa." });
335
+ if (!companyId) return /* @__PURE__ */ jsx4("div", { style: layoutStack, children: "Selecione uma empresa." });
291
336
  const repos = (reposData.data?.repos ?? []).filter(
292
337
  (r) => !filter || r.fullName.toLowerCase().includes(filter.toLowerCase())
293
338
  );
294
339
  return /* @__PURE__ */ jsxs3("div", { style: layoutStack, children: [
340
+ /* @__PURE__ */ jsx4(GitHubNavBar, {}),
295
341
  /* @__PURE__ */ jsxs3("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
296
342
  /* @__PURE__ */ jsxs3("h2", { style: { margin: 0, fontSize: "18px" }, children: [
297
343
  "Reposit\xF3rios (",
@@ -303,7 +349,7 @@ function GitHubReposPage() {
303
349
  "\xDAltimo sync: ",
304
350
  reposData.data?.lastSync ? timeAgo(reposData.data.lastSync) : "nunca"
305
351
  ] }),
306
- /* @__PURE__ */ jsx3(
352
+ /* @__PURE__ */ jsx4(
307
353
  "button",
308
354
  {
309
355
  type: "button",
@@ -314,7 +360,7 @@ function GitHubReposPage() {
314
360
  )
315
361
  ] })
316
362
  ] }),
317
- /* @__PURE__ */ jsx3(
363
+ /* @__PURE__ */ jsx4(
318
364
  "input",
319
365
  {
320
366
  placeholder: "Filtrar reposit\xF3rios...",
@@ -323,15 +369,15 @@ function GitHubReposPage() {
323
369
  style: { padding: "6px 10px", borderRadius: "6px", border: "1px solid rgba(128,128,128,0.3)", background: "transparent", fontSize: "13px" }
324
370
  }
325
371
  ),
326
- repos.length === 0 && /* @__PURE__ */ jsx3("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.6 }, children: "Nenhum reposit\xF3rio rastreado. Adicione em Configura\xE7\xF5es." }),
372
+ repos.length === 0 && /* @__PURE__ */ jsx4("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.6 }, children: "Nenhum reposit\xF3rio rastreado. Adicione em Configura\xE7\xF5es." }),
327
373
  repos.map((repo) => /* @__PURE__ */ jsxs3("div", { style: cardStyle, children: [
328
374
  /* @__PURE__ */ jsxs3("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
329
375
  /* @__PURE__ */ jsxs3("div", { children: [
330
- /* @__PURE__ */ jsx3("a", { href: repo.htmlUrl, target: "_blank", rel: "noopener", style: { fontWeight: 600, fontSize: "14px", color: "#3b82f6", textDecoration: "none" }, children: repo.fullName }),
331
- repo.private && /* @__PURE__ */ jsx3("span", { style: { marginLeft: "8px", fontSize: "11px", opacity: 0.5 }, children: "privado" }),
332
- repo.description && /* @__PURE__ */ jsx3("p", { style: { margin: "4px 0 0", fontSize: "12px", opacity: 0.7 }, children: repo.description })
376
+ /* @__PURE__ */ jsx4("a", { href: repo.htmlUrl, target: "_blank", rel: "noopener", style: { fontWeight: 600, fontSize: "14px", color: "#3b82f6", textDecoration: "none" }, children: repo.fullName }),
377
+ repo.private && /* @__PURE__ */ jsx4("span", { style: { marginLeft: "8px", fontSize: "11px", opacity: 0.5 }, children: "privado" }),
378
+ repo.description && /* @__PURE__ */ jsx4("p", { style: { margin: "4px 0 0", fontSize: "12px", opacity: 0.7 }, children: repo.description })
333
379
  ] }),
334
- /* @__PURE__ */ jsx3("div", { style: { display: "flex", gap: "4px" }, children: /* @__PURE__ */ jsx3(
380
+ /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: "4px" }, children: /* @__PURE__ */ jsx4(
335
381
  "button",
336
382
  {
337
383
  type: "button",
@@ -354,7 +400,7 @@ function GitHubReposPage() {
354
400
  ) })
355
401
  ] }),
356
402
  /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "16px", marginTop: "8px", fontSize: "11px", opacity: 0.5 }, children: [
357
- repo.language && /* @__PURE__ */ jsx3("span", { children: repo.language }),
403
+ repo.language && /* @__PURE__ */ jsx4("span", { children: repo.language }),
358
404
  /* @__PURE__ */ jsxs3("span", { children: [
359
405
  "branch: ",
360
406
  repo.defaultBranch
@@ -371,7 +417,7 @@ function GitHubReposPage() {
371
417
  // src/ui/components/PullRequestsPage.tsx
372
418
  import { useState as useState3 } from "react";
373
419
  import { useHostContext as useHostContext3, usePluginData as usePluginData3, usePluginAction as usePluginAction3 } from "@paperclipai/plugin-sdk/ui";
374
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
420
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
375
421
  function GitHubPullRequestsPage() {
376
422
  const context = useHostContext3();
377
423
  const companyId = context.companyId;
@@ -387,7 +433,7 @@ function GitHubPullRequestsPage() {
387
433
  const syncAction = usePluginAction3("sync-all");
388
434
  const requestReview = usePluginAction3("request-review");
389
435
  const runQuickCheck = usePluginAction3("run-quick-check");
390
- if (!companyId) return /* @__PURE__ */ jsx4("div", { style: layoutStack, children: "Selecione uma empresa." });
436
+ if (!companyId) return /* @__PURE__ */ jsx5("div", { style: layoutStack, children: "Selecione uma empresa." });
391
437
  const prs = (prsData.data?.pullRequests ?? []).filter(
392
438
  (pr) => !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase())
393
439
  );
@@ -433,16 +479,17 @@ function GitHubPullRequestsPage() {
433
479
  }
434
480
  };
435
481
  return /* @__PURE__ */ jsxs4("div", { style: layoutStack, children: [
482
+ /* @__PURE__ */ jsx5(GitHubNavBar, {}),
436
483
  /* @__PURE__ */ jsxs4("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
437
484
  /* @__PURE__ */ jsxs4("h2", { style: { margin: 0, fontSize: "18px" }, children: [
438
485
  "Pull Requests (",
439
486
  prs.length,
440
487
  ")"
441
488
  ] }),
442
- /* @__PURE__ */ jsx4("button", { type: "button", style: buttonStyle, onClick: () => syncAction({ companyId }).catch(console.error), children: "Sync" })
489
+ /* @__PURE__ */ jsx5("button", { type: "button", style: buttonStyle, onClick: () => syncAction({ companyId }).catch(console.error), children: "Sync" })
443
490
  ] }),
444
491
  /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: [
445
- ["open", "closed", "merged", ""].map((state) => /* @__PURE__ */ jsx4(
492
+ ["open", "closed", "merged", ""].map((state) => /* @__PURE__ */ jsx5(
446
493
  "button",
447
494
  {
448
495
  type: "button",
@@ -456,7 +503,7 @@ function GitHubPullRequestsPage() {
456
503
  },
457
504
  state
458
505
  )),
459
- /* @__PURE__ */ jsx4(
506
+ /* @__PURE__ */ jsx5(
460
507
  "input",
461
508
  {
462
509
  placeholder: "Buscar por t\xEDtulo ou repo...",
@@ -466,7 +513,7 @@ function GitHubPullRequestsPage() {
466
513
  }
467
514
  )
468
515
  ] }),
469
- prs.length === 0 && /* @__PURE__ */ jsx4("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.6 }, children: "Nenhum PR encontrado com os filtros atuais." }),
516
+ prs.length === 0 && /* @__PURE__ */ jsx5("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.6 }, children: "Nenhum PR encontrado com os filtros atuais." }),
470
517
  prs.map((pr) => {
471
518
  const badge = prStateBadge(pr.draft ? "draft" : pr.state);
472
519
  const status = reviewStatus[pr.id];
@@ -475,7 +522,7 @@ function GitHubPullRequestsPage() {
475
522
  /* @__PURE__ */ jsxs4("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
476
523
  /* @__PURE__ */ jsxs4("div", { style: { flex: 1 }, children: [
477
524
  /* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
478
- /* @__PURE__ */ jsx4("span", { style: badgeStyle(badge.color), children: badge.label }),
525
+ /* @__PURE__ */ jsx5("span", { style: badgeStyle(badge.color), children: badge.label }),
479
526
  /* @__PURE__ */ jsxs4("a", { href: pr.htmlUrl, target: "_blank", rel: "noopener", style: { fontWeight: 600, fontSize: "14px", color: "#3b82f6", textDecoration: "none" }, children: [
480
527
  "#",
481
528
  pr.number,
@@ -496,7 +543,7 @@ function GitHubPullRequestsPage() {
496
543
  ] })
497
544
  ] }),
498
545
  /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "4px", flexShrink: 0 }, children: [
499
- /* @__PURE__ */ jsx4(
546
+ /* @__PURE__ */ jsx5(
500
547
  "button",
501
548
  {
502
549
  type: "button",
@@ -521,14 +568,14 @@ function GitHubPullRequestsPage() {
521
568
  if (e.target.value) handleRequestReview(pr, e.target.value);
522
569
  },
523
570
  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))
571
+ /* @__PURE__ */ jsx5("option", { value: "", disabled: true, children: "Agent Review" }),
572
+ agents.map((agent) => /* @__PURE__ */ jsx5("option", { value: agent.id, children: agent.displayName }, agent.id))
526
573
  ]
527
574
  }
528
- ) : /* @__PURE__ */ jsx4("button", { type: "button", style: primaryButtonStyle, disabled: true, title: "Nenhum agente dispon\xEDvel", children: "Agent Review" })
575
+ ) : /* @__PURE__ */ jsx5("button", { type: "button", style: primaryButtonStyle, disabled: true, title: "Nenhum agente dispon\xEDvel", children: "Agent Review" })
529
576
  ] })
530
577
  ] }),
531
- status && /* @__PURE__ */ jsx4("div", { style: { marginTop: "6px", padding: "4px 8px", borderRadius: "4px", background: "rgba(128,128,128,0.08)", fontSize: "11px" }, children: status })
578
+ status && /* @__PURE__ */ jsx5("div", { style: { marginTop: "6px", padding: "4px 8px", borderRadius: "4px", background: "rgba(128,128,128,0.08)", fontSize: "11px" }, children: status })
532
579
  ] }, pr.id);
533
580
  })
534
581
  ] });
@@ -537,7 +584,7 @@ function GitHubPullRequestsPage() {
537
584
  // src/ui/components/GraphsPage.tsx
538
585
  import { useState as useState4, useEffect } from "react";
539
586
  import { useHostContext as useHostContext4, usePluginAction as usePluginAction4 } from "@paperclipai/plugin-sdk/ui";
540
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
587
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
541
588
  function toObsidianCanvas(graph) {
542
589
  const CARD_W = 250;
543
590
  const CARD_H = 60;
@@ -613,7 +660,7 @@ function GitHubGraphsPage() {
613
660
  generateGraph({ companyId, repoFullName: repo, level: "code" }).then((result) => setGraphData(result)).catch(console.error).finally(() => setLoading(false));
614
661
  }
615
662
  }, [companyId, autoLoaded]);
616
- if (!companyId) return /* @__PURE__ */ jsx5("div", { style: layoutStack, children: "Selecione uma empresa." });
663
+ if (!companyId) return /* @__PURE__ */ jsx6("div", { style: layoutStack, children: "Selecione uma empresa." });
617
664
  const handleGenerateHighLevel = async () => {
618
665
  setLoading(true);
619
666
  try {
@@ -642,11 +689,12 @@ function GitHubGraphsPage() {
642
689
  downloadFile(`${name}.canvas`, canvas);
643
690
  };
644
691
  return /* @__PURE__ */ jsxs5("div", { style: layoutStack, children: [
645
- /* @__PURE__ */ jsx5("h2", { style: { margin: 0, fontSize: "18px" }, children: "Knowledge Graphs" }),
692
+ /* @__PURE__ */ jsx6(GitHubNavBar, {}),
693
+ /* @__PURE__ */ jsx6("h2", { style: { margin: 0, fontSize: "18px" }, children: "Knowledge Graphs" }),
646
694
  /* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: [
647
- /* @__PURE__ */ jsx5("button", { type: "button", style: primaryButtonStyle, onClick: handleGenerateHighLevel, disabled: loading, children: loading ? "Gerando..." : "Grafo de Alto N\xEDvel" }),
695
+ /* @__PURE__ */ jsx6("button", { type: "button", style: primaryButtonStyle, onClick: handleGenerateHighLevel, disabled: loading, children: loading ? "Gerando..." : "Grafo de Alto N\xEDvel" }),
648
696
  /* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: "4px", flex: 1 }, children: [
649
- /* @__PURE__ */ jsx5(
697
+ /* @__PURE__ */ jsx6(
650
698
  "input",
651
699
  {
652
700
  placeholder: "owner/repo para drill-down...",
@@ -655,13 +703,13 @@ function GitHubGraphsPage() {
655
703
  style: { flex: 1, padding: "6px 10px", borderRadius: "6px", border: "1px solid rgba(128,128,128,0.3)", background: "transparent", fontSize: "13px" }
656
704
  }
657
705
  ),
658
- /* @__PURE__ */ jsx5("button", { type: "button", style: buttonStyle, onClick: handleGenerateCode, disabled: loading || !repoInput.trim(), children: "Grafo de C\xF3digo" })
706
+ /* @__PURE__ */ jsx6("button", { type: "button", style: buttonStyle, onClick: handleGenerateCode, disabled: loading || !repoInput.trim(), children: "Grafo de C\xF3digo" })
659
707
  ] })
660
708
  ] }),
661
709
  graphData && /* @__PURE__ */ jsxs5("div", { style: cardStyle, children: [
662
710
  /* @__PURE__ */ jsxs5("div", { style: { marginBottom: "8px", fontSize: "13px", display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
663
711
  /* @__PURE__ */ jsxs5("div", { children: [
664
- /* @__PURE__ */ jsx5("strong", { children: graphData.level === "high" ? "Vis\xE3o Geral" : graphData.repoFullName }),
712
+ /* @__PURE__ */ jsx6("strong", { children: graphData.level === "high" ? "Vis\xE3o Geral" : graphData.repoFullName }),
665
713
  /* @__PURE__ */ jsxs5("span", { style: { marginLeft: "8px", fontSize: "11px", opacity: 0.5 }, children: [
666
714
  graphData.nodes.length,
667
715
  " n\xF3s \xB7 ",
@@ -670,11 +718,11 @@ function GitHubGraphsPage() {
670
718
  new Date(graphData.generatedAt).toLocaleString()
671
719
  ] })
672
720
  ] }),
673
- /* @__PURE__ */ jsx5("button", { type: "button", style: primaryButtonStyle, onClick: handleExportObsidian, children: "Abrir no Obsidian" })
721
+ /* @__PURE__ */ jsx6("button", { type: "button", style: primaryButtonStyle, onClick: handleExportObsidian, children: "Abrir no Obsidian" })
674
722
  ] }),
675
723
  /* @__PURE__ */ jsxs5("div", { style: { maxHeight: "400px", overflow: "auto", fontSize: "12px" }, children: [
676
724
  /* @__PURE__ */ jsxs5("div", { style: { marginBottom: "8px" }, children: [
677
- /* @__PURE__ */ jsx5("strong", { children: "N\xF3s:" }),
725
+ /* @__PURE__ */ jsx6("strong", { children: "N\xF3s:" }),
678
726
  graphData.nodes.map((node) => /* @__PURE__ */ jsxs5("div", { style: { padding: "2px 0", paddingLeft: "12px" }, children: [
679
727
  /* @__PURE__ */ jsxs5("span", { style: { opacity: 0.5 }, children: [
680
728
  "[",
@@ -686,7 +734,7 @@ function GitHubGraphsPage() {
686
734
  ] }, node.id))
687
735
  ] }),
688
736
  /* @__PURE__ */ jsxs5("div", { children: [
689
- /* @__PURE__ */ jsx5("strong", { children: "Arestas:" }),
737
+ /* @__PURE__ */ jsx6("strong", { children: "Arestas:" }),
690
738
  graphData.edges.map((edge, i) => /* @__PURE__ */ jsxs5("div", { style: { padding: "2px 0", paddingLeft: "12px" }, children: [
691
739
  edge.source,
692
740
  " \u2192 ",
@@ -701,7 +749,7 @@ function GitHubGraphsPage() {
701
749
  ] })
702
750
  ] })
703
751
  ] }),
704
- !graphData && !loading && /* @__PURE__ */ jsx5("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.5 }, children: "Clique em um dos bot\xF5es acima para gerar um knowledge graph." })
752
+ !graphData && !loading && /* @__PURE__ */ jsx6("div", { style: { ...cardStyle, textAlign: "center", opacity: 0.5 }, children: "Clique em um dos bot\xF5es acima para gerar um knowledge graph." })
705
753
  ] });
706
754
  }
707
755
 
@@ -712,7 +760,7 @@ import { usePluginData as usePluginData5, usePluginAction as usePluginAction6 }
712
760
  // src/ui/components/ReviewDropdown.tsx
713
761
  import { useState as useState5 } from "react";
714
762
  import { usePluginData as usePluginData4, usePluginAction as usePluginAction5 } from "@paperclipai/plugin-sdk/ui";
715
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
763
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
716
764
  function ReviewDropdown({ companyId, prId, repoFullName, prNumber }) {
717
765
  const [open, setOpen] = useState5(false);
718
766
  const [reviewing, setReviewing] = useState5(false);
@@ -730,10 +778,10 @@ function ReviewDropdown({ companyId, prId, repoFullName, prNumber }) {
730
778
  setReviewing(false);
731
779
  };
732
780
  if (reviewing) {
733
- return /* @__PURE__ */ jsx6("span", { style: { fontSize: "12px", opacity: 0.6 }, children: "Revisando..." });
781
+ return /* @__PURE__ */ jsx7("span", { style: { fontSize: "12px", opacity: 0.6 }, children: "Revisando..." });
734
782
  }
735
783
  return /* @__PURE__ */ jsxs6("div", { style: { position: "relative", display: "inline-block" }, children: [
736
- /* @__PURE__ */ jsx6("button", { type: "button", style: primaryButtonStyle, onClick: () => setOpen(!open), children: "Revisar \u25BE" }),
784
+ /* @__PURE__ */ jsx7("button", { type: "button", style: primaryButtonStyle, onClick: () => setOpen(!open), children: "Revisar \u25BE" }),
737
785
  open && /* @__PURE__ */ jsxs6("div", { style: {
738
786
  position: "absolute",
739
787
  top: "100%",
@@ -747,7 +795,7 @@ function ReviewDropdown({ companyId, prId, repoFullName, prNumber }) {
747
795
  zIndex: 10,
748
796
  boxShadow: "0 4px 12px rgba(0,0,0,0.3)"
749
797
  }, children: [
750
- agents.length === 0 && /* @__PURE__ */ jsx6("div", { style: { padding: "8px", fontSize: "12px", opacity: 0.5 }, children: "Nenhum agente dispon\xEDvel" }),
798
+ agents.length === 0 && /* @__PURE__ */ jsx7("div", { style: { padding: "8px", fontSize: "12px", opacity: 0.5 }, children: "Nenhum agente dispon\xEDvel" }),
751
799
  agents.map((agent) => /* @__PURE__ */ jsxs6(
752
800
  "button",
753
801
  {
@@ -755,8 +803,8 @@ function ReviewDropdown({ companyId, prId, repoFullName, prNumber }) {
755
803
  style: { ...buttonStyle, width: "100%", textAlign: "left", border: "none", borderRadius: "4px" },
756
804
  onClick: () => handleReview(agent.id),
757
805
  children: [
758
- /* @__PURE__ */ jsx6("div", { style: { fontWeight: 500 }, children: agent.displayName }),
759
- /* @__PURE__ */ jsx6("div", { style: { fontSize: "11px", opacity: 0.5 }, children: agent.role })
806
+ /* @__PURE__ */ jsx7("div", { style: { fontWeight: 500 }, children: agent.displayName }),
807
+ /* @__PURE__ */ jsx7("div", { style: { fontSize: "11px", opacity: 0.5 }, children: agent.role })
760
808
  ]
761
809
  },
762
810
  agent.id
@@ -766,7 +814,7 @@ function ReviewDropdown({ companyId, prId, repoFullName, prNumber }) {
766
814
  }
767
815
 
768
816
  // src/ui/components/DetailTab.tsx
769
- import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
817
+ import { Fragment, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
770
818
  function GitHubDetailTab({ context }) {
771
819
  const issueId = context.entityId;
772
820
  const companyId = context.companyId;
@@ -783,7 +831,7 @@ function GitHubDetailTab({ context }) {
783
831
  const linkAction = usePluginAction6("link-pr-to-card");
784
832
  const quickCheck = usePluginAction6("run-quick-check");
785
833
  if (!companyId || !issueId) {
786
- return /* @__PURE__ */ jsx7("div", { style: { padding: "12px", fontSize: "13px", opacity: 0.5 }, children: "Sem contexto dispon\xEDvel." });
834
+ return /* @__PURE__ */ jsx8("div", { style: { padding: "12px", fontSize: "13px", opacity: 0.5 }, children: "Sem contexto dispon\xEDvel." });
787
835
  }
788
836
  const prs = cardPRs.data?.pullRequests ?? [];
789
837
  const handleLink = async () => {
@@ -794,15 +842,15 @@ function GitHubDetailTab({ context }) {
794
842
  };
795
843
  return /* @__PURE__ */ jsxs7("div", { style: { display: "flex", flexDirection: "column", gap: "8px", padding: "12px" }, children: [
796
844
  prs.length === 0 ? /* @__PURE__ */ jsxs7("div", { style: { textAlign: "center", padding: "20px 0" }, children: [
797
- /* @__PURE__ */ jsx7("p", { style: { fontSize: "13px", opacity: 0.5, margin: "0 0 12px" }, children: "Nenhum PR vinculado a este card." }),
798
- /* @__PURE__ */ jsx7("button", { type: "button", style: buttonStyle, onClick: () => setShowLinkInput(true), children: "Vincular PR" })
845
+ /* @__PURE__ */ jsx8("p", { style: { fontSize: "13px", opacity: 0.5, margin: "0 0 12px" }, children: "Nenhum PR vinculado a este card." }),
846
+ /* @__PURE__ */ jsx8("button", { type: "button", style: buttonStyle, onClick: () => setShowLinkInput(true), children: "Vincular PR" })
799
847
  ] }) : /* @__PURE__ */ jsxs7(Fragment, { children: [
800
848
  prs.map((pr) => {
801
849
  const badge = prStateBadge(pr.draft ? "draft" : pr.state);
802
- return /* @__PURE__ */ jsx7("div", { style: cardStyle, children: /* @__PURE__ */ jsxs7("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
850
+ return /* @__PURE__ */ jsx8("div", { style: cardStyle, children: /* @__PURE__ */ jsxs7("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start" }, children: [
803
851
  /* @__PURE__ */ jsxs7("div", { style: { flex: 1 }, children: [
804
852
  /* @__PURE__ */ jsxs7("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
805
- /* @__PURE__ */ jsx7("span", { style: badgeStyle(badge.color), children: badge.label }),
853
+ /* @__PURE__ */ jsx8("span", { style: badgeStyle(badge.color), children: badge.label }),
806
854
  /* @__PURE__ */ jsxs7("a", { href: pr.htmlUrl, target: "_blank", rel: "noopener", style: { fontWeight: 600, fontSize: "13px", color: "#3b82f6", textDecoration: "none" }, children: [
807
855
  "#",
808
856
  pr.number,
@@ -822,7 +870,7 @@ function GitHubDetailTab({ context }) {
822
870
  timeAgo(pr.updatedAt)
823
871
  ] })
824
872
  ] }),
825
- /* @__PURE__ */ jsx7(
873
+ /* @__PURE__ */ jsx8(
826
874
  ReviewDropdown,
827
875
  {
828
876
  companyId,
@@ -833,10 +881,10 @@ function GitHubDetailTab({ context }) {
833
881
  )
834
882
  ] }) }, pr.id);
835
883
  }),
836
- /* @__PURE__ */ jsx7("button", { type: "button", style: { ...buttonStyle, alignSelf: "flex-start", fontSize: "12px" }, onClick: () => setShowLinkInput(true), children: "+ Vincular outro PR" })
884
+ /* @__PURE__ */ jsx8("button", { type: "button", style: { ...buttonStyle, alignSelf: "flex-start", fontSize: "12px" }, onClick: () => setShowLinkInput(true), children: "+ Vincular outro PR" })
837
885
  ] }),
838
886
  showLinkInput && /* @__PURE__ */ jsxs7("div", { style: cardStyle, children: [
839
- /* @__PURE__ */ jsx7("div", { style: { fontSize: "13px", fontWeight: 500, marginBottom: "8px" }, children: "Selecionar PR" }),
887
+ /* @__PURE__ */ jsx8("div", { style: { fontSize: "13px", fontWeight: 500, marginBottom: "8px" }, children: "Selecionar PR" }),
840
888
  /* @__PURE__ */ jsxs7(
841
889
  "select",
842
890
  {
@@ -844,7 +892,7 @@ function GitHubDetailTab({ context }) {
844
892
  onChange: (e) => setSelectedPrId(Number(e.target.value)),
845
893
  value: selectedPrId ?? "",
846
894
  children: [
847
- /* @__PURE__ */ jsx7("option", { value: "", children: "Selecione um PR..." }),
895
+ /* @__PURE__ */ jsx8("option", { value: "", children: "Selecione um PR..." }),
848
896
  (allPRs.data?.pullRequests ?? []).map((pr) => /* @__PURE__ */ jsxs7("option", { value: pr.id, children: [
849
897
  pr.repoFullName,
850
898
  " #",
@@ -856,26 +904,26 @@ function GitHubDetailTab({ context }) {
856
904
  }
857
905
  ),
858
906
  /* @__PURE__ */ jsxs7("div", { style: { display: "flex", gap: "8px" }, children: [
859
- /* @__PURE__ */ jsx7("button", { type: "button", style: buttonStyle, onClick: handleLink, disabled: !selectedPrId, children: "Vincular" }),
860
- /* @__PURE__ */ jsx7("button", { type: "button", style: buttonStyle, onClick: () => setShowLinkInput(false), children: "Cancelar" })
907
+ /* @__PURE__ */ jsx8("button", { type: "button", style: buttonStyle, onClick: handleLink, disabled: !selectedPrId, children: "Vincular" }),
908
+ /* @__PURE__ */ jsx8("button", { type: "button", style: buttonStyle, onClick: () => setShowLinkInput(false), children: "Cancelar" })
861
909
  ] })
862
910
  ] })
863
911
  ] });
864
912
  }
865
913
 
866
914
  // src/ui/components/DashboardWidget.tsx
867
- import { useHostNavigation as useHostNavigation3, usePluginData as usePluginData6 } from "@paperclipai/plugin-sdk/ui";
868
- import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
915
+ import { useHostNavigation as useHostNavigation4, usePluginData as usePluginData6 } from "@paperclipai/plugin-sdk/ui";
916
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
869
917
  function GitHubDashboardWidget({ context }) {
870
- const nav = useHostNavigation3();
918
+ const nav = useHostNavigation4();
871
919
  const syncStatus = usePluginData6("sync-status", {
872
920
  companyId: context.companyId
873
921
  });
874
922
  const data = syncStatus.data;
875
923
  return /* @__PURE__ */ jsxs8("div", { style: { display: "flex", flexDirection: "column", gap: "6px", fontSize: "12px" }, children: [
876
924
  /* @__PURE__ */ jsxs8("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
877
- /* @__PURE__ */ jsx8("strong", { style: { fontSize: "13px" }, children: "GitHub" }),
878
- /* @__PURE__ */ jsx8("span", { style: {
925
+ /* @__PURE__ */ jsx9("strong", { style: { fontSize: "13px" }, children: "GitHub" }),
926
+ /* @__PURE__ */ jsx9("span", { style: {
879
927
  display: "inline-block",
880
928
  width: "8px",
881
929
  height: "8px",
@@ -897,13 +945,13 @@ function GitHubDashboardWidget({ context }) {
897
945
  data?.lastSync ? timeAgo(data.lastSync) : "nunca"
898
946
  ] })
899
947
  ] }),
900
- /* @__PURE__ */ jsx8("a", { ...nav.linkProps(PATHS.prs), style: { fontSize: "12px", color: "#3b82f6" }, children: "Ver Pull Requests \u2192" })
948
+ /* @__PURE__ */ jsx9("a", { ...nav.linkProps(PATHS.prs), style: { fontSize: "12px", color: "#3b82f6" }, children: "Ver Pull Requests \u2192" })
901
949
  ] });
902
950
  }
903
951
 
904
952
  // src/ui/components/ContextMenu.tsx
905
953
  import { useHostContext as useHostContext5, usePluginAction as usePluginAction7 } from "@paperclipai/plugin-sdk/ui";
906
- import { jsx as jsx9 } from "react/jsx-runtime";
954
+ import { jsx as jsx10 } from "react/jsx-runtime";
907
955
  function GitHubContextMenu() {
908
956
  const context = useHostContext5();
909
957
  const generateGraph = usePluginAction7("generate-graph");
@@ -914,13 +962,14 @@ function GitHubContextMenu() {
914
962
  level: "high"
915
963
  }).catch(console.error);
916
964
  };
917
- return /* @__PURE__ */ jsx9("button", { type: "button", style: buttonStyle, onClick: handleGraphify, children: "Gerar Knowledge Graph" });
965
+ return /* @__PURE__ */ jsx10("button", { type: "button", style: buttonStyle, onClick: handleGraphify, children: "Gerar Knowledge Graph" });
918
966
  }
919
967
  export {
920
968
  GitHubContextMenu,
921
969
  GitHubDashboardWidget,
922
970
  GitHubDetailTab,
923
971
  GitHubGraphsPage,
972
+ GitHubNavBar,
924
973
  GitHubPullRequestsPage,
925
974
  GitHubReposPage,
926
975
  GitHubRouteSidebar,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 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, 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
- "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"]
3
+ "sources": ["../../src/ui/components/Sidebar.tsx", "../../src/ui/components/shared.ts", "../../src/ui/components/NavBar.tsx", "../../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 from \"react\";\nimport { useHostNavigation } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS } from \"./shared.js\";\n\nconst NAV_ITEMS = [\n { label: \"Reposit\u00F3rios\", path: PATHS.repos },\n { label: \"Pull Requests\", path: PATHS.prs },\n { label: \"Knowledge Graphs\", path: PATHS.graphs },\n { label: \"Configura\u00E7\u00F5es\", path: PATHS.settings },\n];\n\nexport function GitHubNavBar() {\n const nav = useHostNavigation();\n const currentPath = typeof window !== \"undefined\" ? window.location.pathname : \"\";\n\n return (\n <nav style={{\n display: \"flex\",\n gap: \"2px\",\n padding: \"4px\",\n borderRadius: \"8px\",\n background: \"rgba(128,128,128,0.06)\",\n marginBottom: \"4px\",\n }}>\n {NAV_ITEMS.map((item) => {\n const href = nav.resolveHref(item.path);\n const isActive = currentPath.endsWith(item.path.replace(\"/\", \"\"));\n return (\n <a\n key={item.path}\n {...nav.linkProps(item.path)}\n aria-current={isActive ? \"page\" : undefined}\n style={{\n padding: \"6px 14px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: isActive ? 600 : 400,\n background: isActive ? \"rgba(128,128,128,0.12)\" : \"transparent\",\n textDecoration: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n }}\n >\n {item.label}\n </a>\n );\n })}\n </nav>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\nimport { GitHubNavBar } from \"./NavBar.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 <GitHubNavBar />\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 { GitHubNavBar } from \"./NavBar.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 <GitHubNavBar />\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 { GitHubNavBar } from \"./NavBar.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 <GitHubNavBar />\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 { GitHubNavBar } from \"./NavBar.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 <GitHubNavBar />\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
+ "names": ["useHostNavigation", "jsx", "NAV_ITEMS", "useHostNavigation", "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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gaud_erp/paperclip-github-manager",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "Paperclip plugin for GitHub repository management, PR/issue sync, AI code review, and knowledge graphs",
5
5
  "license": "MIT",
6
6
  "keywords": [