@agent-native/core 0.26.8 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/agent/run-ownership.d.ts +12 -0
  2. package/dist/agent/run-ownership.d.ts.map +1 -0
  3. package/dist/agent/run-ownership.js +39 -0
  4. package/dist/agent/run-ownership.js.map +1 -0
  5. package/dist/cli/index.js +2 -2
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/skills.d.ts.map +1 -1
  8. package/dist/cli/skills.js +108 -3
  9. package/dist/cli/skills.js.map +1 -1
  10. package/dist/client/db-admin/DataGrid.d.ts +42 -0
  11. package/dist/client/db-admin/DataGrid.d.ts.map +1 -0
  12. package/dist/client/db-admin/DataGrid.js +204 -0
  13. package/dist/client/db-admin/DataGrid.js.map +1 -0
  14. package/dist/client/db-admin/DbAdminPage.d.ts +2 -0
  15. package/dist/client/db-admin/DbAdminPage.d.ts.map +1 -0
  16. package/dist/client/db-admin/DbAdminPage.js +72 -0
  17. package/dist/client/db-admin/DbAdminPage.js.map +1 -0
  18. package/dist/client/db-admin/DevDatabaseLink.d.ts +19 -0
  19. package/dist/client/db-admin/DevDatabaseLink.d.ts.map +1 -0
  20. package/dist/client/db-admin/DevDatabaseLink.js +25 -0
  21. package/dist/client/db-admin/DevDatabaseLink.js.map +1 -0
  22. package/dist/client/db-admin/EditableCell.d.ts +26 -0
  23. package/dist/client/db-admin/EditableCell.d.ts.map +1 -0
  24. package/dist/client/db-admin/EditableCell.js +150 -0
  25. package/dist/client/db-admin/EditableCell.js.map +1 -0
  26. package/dist/client/db-admin/FilterBar.d.ts +8 -0
  27. package/dist/client/db-admin/FilterBar.d.ts.map +1 -0
  28. package/dist/client/db-admin/FilterBar.js +68 -0
  29. package/dist/client/db-admin/FilterBar.js.map +1 -0
  30. package/dist/client/db-admin/ResultsGrid.d.ts +6 -0
  31. package/dist/client/db-admin/ResultsGrid.d.ts.map +1 -0
  32. package/dist/client/db-admin/ResultsGrid.js +41 -0
  33. package/dist/client/db-admin/ResultsGrid.js.map +1 -0
  34. package/dist/client/db-admin/RowSidePanel.d.ts +18 -0
  35. package/dist/client/db-admin/RowSidePanel.d.ts.map +1 -0
  36. package/dist/client/db-admin/RowSidePanel.js +104 -0
  37. package/dist/client/db-admin/RowSidePanel.js.map +1 -0
  38. package/dist/client/db-admin/SqlEditor.d.ts +8 -0
  39. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -0
  40. package/dist/client/db-admin/SqlEditor.js +350 -0
  41. package/dist/client/db-admin/SqlEditor.js.map +1 -0
  42. package/dist/client/db-admin/TableBrowser.d.ts +10 -0
  43. package/dist/client/db-admin/TableBrowser.d.ts.map +1 -0
  44. package/dist/client/db-admin/TableBrowser.js +61 -0
  45. package/dist/client/db-admin/TableBrowser.js.map +1 -0
  46. package/dist/client/db-admin/TableEditor.d.ts +9 -0
  47. package/dist/client/db-admin/TableEditor.d.ts.map +1 -0
  48. package/dist/client/db-admin/TableEditor.js +254 -0
  49. package/dist/client/db-admin/TableEditor.js.map +1 -0
  50. package/dist/client/db-admin/cell-format.d.ts +55 -0
  51. package/dist/client/db-admin/cell-format.d.ts.map +1 -0
  52. package/dist/client/db-admin/cell-format.js +223 -0
  53. package/dist/client/db-admin/cell-format.js.map +1 -0
  54. package/dist/client/db-admin/changeset.d.ts +74 -0
  55. package/dist/client/db-admin/changeset.d.ts.map +1 -0
  56. package/dist/client/db-admin/changeset.js +169 -0
  57. package/dist/client/db-admin/changeset.js.map +1 -0
  58. package/dist/client/db-admin/export-utils.d.ts +15 -0
  59. package/dist/client/db-admin/export-utils.d.ts.map +1 -0
  60. package/dist/client/db-admin/export-utils.js +62 -0
  61. package/dist/client/db-admin/export-utils.js.map +1 -0
  62. package/dist/client/db-admin/index.d.ts +7 -0
  63. package/dist/client/db-admin/index.d.ts.map +1 -0
  64. package/dist/client/db-admin/index.js +8 -0
  65. package/dist/client/db-admin/index.js.map +1 -0
  66. package/dist/client/db-admin/sql-storage.d.ts +35 -0
  67. package/dist/client/db-admin/sql-storage.d.ts.map +1 -0
  68. package/dist/client/db-admin/sql-storage.js +117 -0
  69. package/dist/client/db-admin/sql-storage.js.map +1 -0
  70. package/dist/client/db-admin/storage.d.ts +24 -0
  71. package/dist/client/db-admin/storage.d.ts.map +1 -0
  72. package/dist/client/db-admin/storage.js +50 -0
  73. package/dist/client/db-admin/storage.js.map +1 -0
  74. package/dist/client/db-admin/useAgentSync.d.ts +22 -0
  75. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -0
  76. package/dist/client/db-admin/useAgentSync.js +120 -0
  77. package/dist/client/db-admin/useAgentSync.js.map +1 -0
  78. package/dist/client/db-admin/useDbAdmin.d.ts +20 -0
  79. package/dist/client/db-admin/useDbAdmin.d.ts.map +1 -0
  80. package/dist/client/db-admin/useDbAdmin.js +154 -0
  81. package/dist/client/db-admin/useDbAdmin.js.map +1 -0
  82. package/dist/client/index.d.ts +1 -0
  83. package/dist/client/index.d.ts.map +1 -1
  84. package/dist/client/index.js +1 -0
  85. package/dist/client/index.js.map +1 -1
  86. package/dist/credentials/index.d.ts.map +1 -1
  87. package/dist/credentials/index.js +25 -5
  88. package/dist/credentials/index.js.map +1 -1
  89. package/dist/db-admin/agent-tools.d.ts +15 -0
  90. package/dist/db-admin/agent-tools.d.ts.map +1 -0
  91. package/dist/db-admin/agent-tools.js +147 -0
  92. package/dist/db-admin/agent-tools.js.map +1 -0
  93. package/dist/db-admin/operations.d.ts +17 -0
  94. package/dist/db-admin/operations.d.ts.map +1 -0
  95. package/dist/db-admin/operations.js +541 -0
  96. package/dist/db-admin/operations.js.map +1 -0
  97. package/dist/db-admin/routes.d.ts +5 -0
  98. package/dist/db-admin/routes.d.ts.map +1 -0
  99. package/dist/db-admin/routes.js +134 -0
  100. package/dist/db-admin/routes.js.map +1 -0
  101. package/dist/db-admin/types.d.ts +85 -0
  102. package/dist/db-admin/types.d.ts.map +1 -0
  103. package/dist/db-admin/types.js +9 -0
  104. package/dist/db-admin/types.js.map +1 -0
  105. package/dist/extensions/url-safety.d.ts +20 -0
  106. package/dist/extensions/url-safety.d.ts.map +1 -1
  107. package/dist/extensions/url-safety.js +43 -0
  108. package/dist/extensions/url-safety.js.map +1 -1
  109. package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
  110. package/dist/file-upload/actions/upload-image.js +6 -1
  111. package/dist/file-upload/actions/upload-image.js.map +1 -1
  112. package/dist/integrations/adapters/email.d.ts.map +1 -1
  113. package/dist/integrations/adapters/email.js +112 -0
  114. package/dist/integrations/adapters/email.js.map +1 -1
  115. package/dist/integrations/types.d.ts +11 -0
  116. package/dist/integrations/types.d.ts.map +1 -1
  117. package/dist/integrations/types.js.map +1 -1
  118. package/dist/scripts/db/exec.d.ts.map +1 -1
  119. package/dist/scripts/db/exec.js +2 -1
  120. package/dist/scripts/db/exec.js.map +1 -1
  121. package/dist/scripts/db/index.d.ts.map +1 -1
  122. package/dist/scripts/db/index.js +1 -0
  123. package/dist/scripts/db/index.js.map +1 -1
  124. package/dist/scripts/db/migrate-encrypt-credentials.d.ts +28 -0
  125. package/dist/scripts/db/migrate-encrypt-credentials.d.ts.map +1 -0
  126. package/dist/scripts/db/migrate-encrypt-credentials.js +190 -0
  127. package/dist/scripts/db/migrate-encrypt-credentials.js.map +1 -0
  128. package/dist/scripts/db/query.d.ts.map +1 -1
  129. package/dist/scripts/db/query.js +2 -1
  130. package/dist/scripts/db/query.js.map +1 -1
  131. package/dist/scripts/db/safety.d.ts +1 -0
  132. package/dist/scripts/db/safety.d.ts.map +1 -1
  133. package/dist/scripts/db/safety.js +32 -0
  134. package/dist/scripts/db/safety.js.map +1 -1
  135. package/dist/scripts/db/scoping.d.ts.map +1 -1
  136. package/dist/scripts/db/scoping.js +11 -1
  137. package/dist/scripts/db/scoping.js.map +1 -1
  138. package/dist/secrets/crypto.d.ts +28 -0
  139. package/dist/secrets/crypto.d.ts.map +1 -0
  140. package/dist/secrets/crypto.js +81 -0
  141. package/dist/secrets/crypto.js.map +1 -0
  142. package/dist/secrets/storage.d.ts.map +1 -1
  143. package/dist/secrets/storage.js +3 -61
  144. package/dist/secrets/storage.js.map +1 -1
  145. package/dist/server/action-discovery.d.ts.map +1 -1
  146. package/dist/server/action-discovery.js +5 -2
  147. package/dist/server/action-discovery.js.map +1 -1
  148. package/dist/server/action-routes.d.ts.map +1 -1
  149. package/dist/server/action-routes.js +24 -7
  150. package/dist/server/action-routes.js.map +1 -1
  151. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  152. package/dist/server/agent-chat-plugin.js +39 -0
  153. package/dist/server/agent-chat-plugin.js.map +1 -1
  154. package/dist/server/auth.d.ts +1 -1
  155. package/dist/server/auth.d.ts.map +1 -1
  156. package/dist/server/auth.js.map +1 -1
  157. package/dist/server/better-auth-instance.js +3 -3
  158. package/dist/server/better-auth-instance.js.map +1 -1
  159. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  160. package/dist/server/core-routes-plugin.js +5 -0
  161. package/dist/server/core-routes-plugin.js.map +1 -1
  162. package/dist/server/csrf.d.ts.map +1 -1
  163. package/dist/server/csrf.js +9 -1
  164. package/dist/server/csrf.js.map +1 -1
  165. package/dist/server/design-token-utils.d.ts +8 -1
  166. package/dist/server/design-token-utils.d.ts.map +1 -1
  167. package/dist/server/design-token-utils.js +12 -4
  168. package/dist/server/design-token-utils.js.map +1 -1
  169. package/dist/templates/default/AGENTS.md +4 -4
  170. package/dist/templates/default/app/routes/database.tsx +13 -0
  171. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +9 -2
  172. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +7 -1
  173. package/dist/vite/client.d.ts.map +1 -1
  174. package/dist/vite/client.js +4 -0
  175. package/dist/vite/client.js.map +1 -1
  176. package/docs/content/a2a-protocol.md +2 -2
  177. package/docs/content/actions.md +2 -54
  178. package/docs/content/agent-mentions.md +1 -1
  179. package/docs/content/agent-teams.md +1 -1
  180. package/docs/content/authentication.md +2 -2
  181. package/docs/content/cli-adapters.md +33 -17
  182. package/docs/content/client.md +11 -20
  183. package/docs/content/code-agents-ui.md +19 -6
  184. package/docs/content/context-awareness.md +36 -20
  185. package/docs/content/database.md +3 -3
  186. package/docs/content/deployment.md +8 -8
  187. package/docs/content/dispatch.md +1 -1
  188. package/docs/content/external-agents.md +5 -1
  189. package/docs/content/faq.md +1 -0
  190. package/docs/content/frames.md +110 -30
  191. package/docs/content/getting-started.md +15 -14
  192. package/docs/content/mcp-clients.md +1 -1
  193. package/docs/content/mcp-protocol.md +11 -88
  194. package/docs/content/messaging.md +1 -1
  195. package/docs/content/migration-workbench.md +13 -87
  196. package/docs/content/multi-app-workspace.md +2 -38
  197. package/docs/content/multi-tenancy.md +3 -26
  198. package/docs/content/onboarding.md +10 -3
  199. package/docs/content/recurring-jobs.md +2 -2
  200. package/docs/content/security.md +33 -1
  201. package/docs/content/server.md +1 -1
  202. package/docs/content/skills-guide.md +7 -4
  203. package/docs/content/template-assets.md +9 -9
  204. package/docs/content/template-brain.md +114 -388
  205. package/docs/content/template-clips.md +42 -2
  206. package/docs/content/template-content.md +1 -1
  207. package/docs/content/template-design.md +38 -0
  208. package/docs/content/template-dispatch.md +3 -3
  209. package/docs/content/template-forms.md +6 -6
  210. package/docs/content/template-starter.md +2 -2
  211. package/docs/content/using-your-agent.md +56 -0
  212. package/docs/content/workspace-management.md +6 -6
  213. package/docs/content/workspace.md +19 -0
  214. package/package.json +10 -3
  215. package/src/templates/default/AGENTS.md +4 -4
  216. package/src/templates/default/app/routes/database.tsx +13 -0
  217. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +9 -2
  218. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native skills` is the friendly install surface for app-backed skills.\n * The lower-level `app-skill` commands remain the packaging primitives; this\n * command handles the common \"install Assets for my agent\" path in one step.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\n\nimport {\n buildAppSkillPack,\n ensureAppSkill,\n loadAppSkillManifest,\n normalizeAppSkillManifest,\n type AppSkillManifest,\n type LoadedAppSkillManifest,\n} from \"./app-skill.js\";\nimport { resolveClients } from \"./connect.js\";\nimport type { ClientId } from \"./mcp-config-writers.js\";\n\nconst HELP = `agent-native skills\n\nUsage:\n agent-native skills list\n agent-native skills add assets [--client codex|claude-code|claude-code-cli|cowork|all] [--scope user|project] [--yes] [--dry-run] [--json]\n agent-native skills add <manifest-or-app-dir> [--client ...] [--yes]\n\nExamples:\n agent-native skills add assets\n agent-native skills add assets --client claude-code\n agent-native skills add ./dist/assets-skill --client codex\n\nThe add command installs skill instructions with the open skills CLI, then\nregisters the app-backed MCP connector. Use app-skill pack for marketplace\nbundles and custom adapter output.`;\n\nconst ASSETS_SKILL_MD = `---\nname: assets\ndescription: >-\n Use Assets for brand-safe image or video generation, human picker UI,\n search/list/export actions, and cross-app asset selection.\nmetadata:\n visibility: exported\n---\n\n# Assets\n\nUse the Assets app when a workflow needs reusable brand media, a human picker,\nor generated image/video assets that another app can reference by ID and URL.\n\n## Choose The Path\n\n- Use \\`open-asset-picker\\` when a person should browse, search, generate, and\n select an asset in UI. Pass \\`mediaType: \"image\"\\` by default, or\n \\`mediaType: \"video\"\\` for video libraries. When the user asks to create a\n specific image and choose the best option, pass \\`prompt\\`,\n \\`autoGenerate: true\\`, and \\`count: 3\\` so the picker opens with candidates\n to preview and select.\n- Use unattended actions when the agent already knows what to do:\n \\`search-assets\\`, \\`list-assets\\`, \\`generate-image\\`,\n \\`generate-image-batch\\`, \\`generate-video\\`,\n \\`refresh-generation-run\\`, and \\`export-asset\\`.\n- Use browser/deep-link fallback when the host cannot render MCP Apps inline.\n Surface the returned picker link instead of inventing a separate UI.\n\n## Image And Video Workflows\n\n1. Pick or match the library with \\`list-libraries\\` or \\`match-library\\`.\n2. For images, call \\`generate-image\\` or \\`generate-image-batch\\`. Image\n actions are synchronous: one batch call should return the finished image\n candidates, so do not poll or regenerate unless a returned slot failed.\n3. For videos, call \\`generate-video\\` and poll \\`refresh-generation-run\\`\n until the run completes.\n4. Preserve returned \\`assetId\\`, \\`runId\\`, \\`previewUrl\\`, \\`downloadUrl\\`,\n media type, and dimensions so the caller can attach or embed the result.\n\n## Cross-App Use\n\n- Hosted default: connect \\`https://assets.agent-native.com/_agent-native/mcp\\`.\n Do not put shared secrets in skill files.\n- Local customization: use \\`agent-native app-skill launch --local\\` from an\n Assets app-skill manifest, or pass \\`--into <path>\\` for editable source.\n- Do not call image/video providers directly from another app. Assets owns\n generation, picker UI, search/list/export, and asset context.\n`;\n\nconst BUILT_IN_APP_SKILLS = {\n assets: {\n manifest: normalizeAppSkillManifest({\n schemaVersion: 1,\n id: \"assets\",\n displayName: \"Assets\",\n description:\n \"Create, search, select, and export brand image and video assets from the Assets app.\",\n hosted: {\n url: \"https://assets.agent-native.com\",\n mcpUrl: \"https://assets.agent-native.com/_agent-native/mcp\",\n },\n mcp: { serverName: \"agent-native-assets\" },\n auth: {\n mode: \"oauth\",\n setup:\n \"Authenticate with the Assets MCP connector in the host app. No shared secrets are stored in skill files.\",\n },\n surfaces: [\n {\n id: \"asset-picker\",\n action: \"open-asset-picker\",\n path: \"/picker\",\n mediaTypes: [\"image\", \"video\"],\n defaultMediaType: \"image\",\n },\n ],\n skills: [\n {\n path: \"skills/assets\",\n visibility: \"exported\",\n exportAs: \"assets\",\n },\n ],\n hostAdapters: [\n \"codex-plugin\",\n \"claude-marketplace\",\n \"vercel-skills\",\n \"plain-skill\",\n \"claude-skill\",\n \"chatgpt-mcp\",\n \"generic-mcp\",\n ],\n }),\n skillMarkdown: ASSETS_SKILL_MD,\n },\n} satisfies Record<\n string,\n { manifest: AppSkillManifest; skillMarkdown: string }\n>;\n\ntype BuiltInAppSkillId = keyof typeof BUILT_IN_APP_SKILLS;\n\nconst BUILT_IN_APP_SKILL_ALIASES = {\n assets: \"assets\",\n asset: \"assets\",\n \"asset-generation\": \"assets\",\n images: \"assets\",\n image: \"assets\",\n \"image-generation\": \"assets\",\n \"agent-native-assets\": \"assets\",\n \"agent-native-images\": \"assets\",\n} satisfies Record<string, BuiltInAppSkillId>;\n\nconst BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {\n assets: [\"images\", \"image-generation\", \"agent-native-images\"],\n} satisfies Record<BuiltInAppSkillId, string[]>;\n\ntype SkillsCommand = \"list\" | \"add\" | \"help\";\n\nexport interface ParsedSkillsArgs {\n command: SkillsCommand;\n target?: string;\n client: string;\n scope: string;\n yes: boolean;\n dryRun: boolean;\n printJson: boolean;\n instructions: boolean;\n mcp: boolean;\n}\n\nexport interface SkillsAddResult {\n id: string;\n displayName: string;\n instructionSource?: string;\n skillNames: string[];\n skillsAgents: string[];\n mcpUrl: string;\n mcpClients: ClientId[];\n dryRun: boolean;\n commands: string[];\n}\n\ninterface SkillInstallTarget {\n id: string;\n displayName: string;\n loaded: LoadedAppSkillManifest;\n skillNames: string[];\n materializeInstructions(outDir: string): string;\n cleanup?: () => void;\n}\n\ninterface RunSkillsOptions {\n baseDir?: string;\n log?: (message: string) => void;\n runCommand?: (cmd: string, args: string[]) => Promise<number>;\n}\n\nfunction normalizeKnownSkillTarget(\n value: string | undefined,\n): BuiltInAppSkillId | undefined {\n const key = value?.trim().toLowerCase();\n if (!key) return undefined;\n return BUILT_IN_APP_SKILL_ALIASES[key];\n}\n\nfunction isKnownSkill(value: string | undefined): boolean {\n return Boolean(normalizeKnownSkillTarget(value));\n}\n\nexport function parseSkillsArgs(argv: string[]): ParsedSkillsArgs {\n const first = argv[0];\n let command: SkillsCommand = \"list\";\n let args = argv;\n if (first === \"help\" || first === \"--help\" || first === \"-h\") {\n command = \"help\";\n args = argv.slice(1);\n } else if (first === \"list\" || first === \"add\") {\n command = first;\n args = argv.slice(1);\n } else if (first) {\n command = \"add\";\n }\n\n const out: ParsedSkillsArgs = {\n command,\n client: \"codex\",\n scope: \"user\",\n yes: false,\n dryRun: false,\n printJson: false,\n instructions: true,\n mcp: true,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const eat = (flag: string): string | undefined => {\n if (arg === flag) {\n const next = args[++i];\n if (!next || next.startsWith(\"-\")) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return next;\n }\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1);\n if (!value) throw new Error(`Missing value for ${flag}.`);\n return value;\n }\n return undefined;\n };\n let value: string | undefined;\n if ((value = eat(\"--client\")) !== undefined) out.client = value;\n else if ((value = eat(\"--scope\")) !== undefined) out.scope = value;\n else if (arg === \"--yes\" || arg === \"-y\") out.yes = true;\n else if (arg === \"--dry-run\") out.dryRun = true;\n else if (arg === \"--json\") out.printJson = true;\n else if (arg === \"--mcp-only\") out.instructions = false;\n else if (arg === \"--instructions-only\" || arg === \"--no-mcp\")\n out.mcp = false;\n else if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n else if (!out.target) out.target = arg;\n else throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (out.scope !== \"user\" && out.scope !== \"project\") {\n throw new Error(\"--scope must be either user or project.\");\n }\n return out;\n}\n\nfunction loadSkillTarget(target: string): SkillInstallTarget {\n const knownTarget = normalizeKnownSkillTarget(target);\n if (knownTarget) {\n const builtIn = BUILT_IN_APP_SKILLS[knownTarget];\n return {\n id: builtIn.manifest.id,\n displayName: builtIn.manifest.displayName,\n loaded: {\n manifest: builtIn.manifest,\n file: `<built-in:${builtIn.manifest.id}>`,\n dir: process.cwd(),\n },\n skillNames: [\"assets\"],\n materializeInstructions(outDir) {\n const skillDir = path.join(outDir, \"skills\", \"assets\");\n fs.mkdirSync(skillDir, { recursive: true });\n fs.writeFileSync(\n path.join(skillDir, \"SKILL.md\"),\n builtIn.skillMarkdown,\n \"utf-8\",\n );\n return outDir;\n },\n };\n }\n\n const resolved = path.resolve(target);\n const manifestFile = fs.statSync(resolved).isDirectory()\n ? path.join(resolved, \"agent-native.app-skill.json\")\n : resolved;\n const loaded = loadAppSkillManifest(manifestFile);\n return {\n id: loaded.manifest.id,\n displayName: loaded.manifest.displayName,\n loaded,\n skillNames: loaded.manifest.skills\n .filter(\n (skill) =>\n skill.visibility === \"exported\" || skill.visibility === \"both\",\n )\n .map((skill) => skill.exportAs ?? path.basename(skill.path)),\n materializeInstructions(outDir) {\n const packed = buildAppSkillPack(loaded, outDir);\n const vercelAdapter = path.join(\n packed.outDir,\n \"adapters\",\n \"vercel-skills\",\n );\n return fs.existsSync(vercelAdapter) ? vercelAdapter : packed.outDir;\n },\n };\n}\n\nfunction skillsAgentsForClients(clients: ClientId[]): string[] {\n const agents = new Set<string>();\n for (const client of clients) {\n if (client === \"codex\") agents.add(\"codex\");\n if (client === \"claude-code\" || client === \"claude-code-cli\") {\n agents.add(\"claude-code\");\n }\n }\n return [...agents];\n}\n\nfunction commandString(cmd: string, args: string[]): string {\n return [cmd, ...args].join(\" \");\n}\n\nasync function runCommand(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => {\n if (signal) {\n reject(new Error(`${cmd} was interrupted by ${signal}.`));\n return;\n }\n resolve(code ?? 0);\n });\n });\n}\n\nexport async function addAgentNativeSkill(\n parsed: ParsedSkillsArgs,\n options: RunSkillsOptions = {},\n): Promise<SkillsAddResult> {\n const target = parsed.target ?? \"assets\";\n const knownTarget = normalizeKnownSkillTarget(target);\n if (!knownTarget && !fs.existsSync(path.resolve(target))) {\n throw new Error(\n `Unknown skill or manifest path: ${target}. Run \"agent-native skills list\".`,\n );\n }\n const installTarget = loadSkillTarget(target);\n const clients = resolveClients(parsed.client);\n const skillsAgents = skillsAgentsForClients(clients);\n const commands: string[] = [];\n const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"an-skills-add-\"));\n let instructionSource: string | undefined;\n\n try {\n if (parsed.instructions) {\n if (skillsAgents.length === 0) {\n throw new Error(\n \"Skill instructions can only be installed for Codex or Claude Code clients. Use --mcp-only for MCP-only clients.\",\n );\n }\n instructionSource = installTarget.materializeInstructions(tmpRoot);\n const args = [\n \"--yes\",\n \"skills@latest\",\n \"add\",\n instructionSource,\n \"--copy\",\n ...installTarget.skillNames.flatMap((skill) => [\"--skill\", skill]),\n ...skillsAgents.flatMap((agent) => [\"-a\", agent]),\n ...(parsed.yes || knownTarget ? [\"-y\"] : []),\n ];\n commands.push(commandString(\"npx\", args));\n if (!parsed.dryRun) {\n const code = await (options.runCommand ?? runCommand)(\"npx\", args);\n if (code !== 0) throw new Error(`npx skills add exited with ${code}.`);\n }\n }\n\n if (parsed.mcp) {\n commands.push(\n `agent-native app-skill ensure --manifest ${installTarget.loaded.file} --client ${parsed.client} --scope ${parsed.scope} --yes`,\n );\n if (!parsed.dryRun) {\n await ensureAppSkill(installTarget.loaded, {\n clients,\n scope: parsed.scope,\n baseDir: options.baseDir,\n yes: parsed.yes || Boolean(knownTarget),\n confirm: true,\n log: options.log,\n });\n }\n }\n\n return {\n id: installTarget.id,\n displayName: installTarget.displayName,\n instructionSource,\n skillNames: installTarget.skillNames,\n skillsAgents,\n mcpUrl: installTarget.loaded.manifest.hosted.mcpUrl,\n mcpClients: clients,\n dryRun: parsed.dryRun,\n commands,\n };\n } finally {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n installTarget.cleanup?.();\n }\n}\n\nfunction listSkills() {\n return Object.values(BUILT_IN_APP_SKILLS).map((entry) => ({\n id: entry.manifest.id,\n aliases:\n BUILT_IN_APP_SKILL_DISPLAY_ALIASES[\n entry.manifest.id as BuiltInAppSkillId\n ] ?? [],\n name: entry.manifest.displayName,\n description: entry.manifest.description,\n mcpUrl: entry.manifest.hosted.mcpUrl,\n }));\n}\n\nexport async function runSkills(\n argv: string[],\n options: RunSkillsOptions = {},\n): Promise<void> {\n const parsed = parseSkillsArgs(argv);\n const log = (message: string) =>\n (parsed.printJson ? process.stderr : process.stdout).write(`${message}\\n`);\n\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n if (parsed.command === \"list\") {\n const skills = listSkills();\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(skills, null, 2)}\\n`);\n return;\n }\n for (const skill of skills) {\n const description = skill.description.replace(/[.?!]?$/, \".\");\n const aliases = skill.aliases.length\n ? ` Aliases: ${skill.aliases.join(\", \")}.`\n : \"\";\n process.stdout.write(\n `${skill.id.padEnd(12)} ${description}${aliases} (${skill.mcpUrl})\\n`,\n );\n }\n return;\n }\n\n const result = await addAgentNativeSkill(parsed, {\n ...options,\n log,\n });\n\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`${result.commands.join(\"\\n\")}\\n`);\n return;\n }\n\n process.stdout.write(\n `Installed ${result.displayName} skill for ${result.skillsAgents.join(\n \", \",\n )} and registered ${result.mcpUrl} for ${result.mcpClients.join(\", \")}.\\n`,\n );\n}\n"]}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native skills` is the friendly install surface for app-backed skills.\n * The lower-level `app-skill` commands remain the packaging primitives; this\n * command handles the common \"install Assets for my agent\" path in one step.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\n\nimport {\n buildAppSkillPack,\n ensureAppSkill,\n loadAppSkillManifest,\n normalizeAppSkillManifest,\n type AppSkillManifest,\n type LoadedAppSkillManifest,\n} from \"./app-skill.js\";\nimport { resolveClients } from \"./connect.js\";\nimport type { ClientId } from \"./mcp-config-writers.js\";\n\nconst HELP = `agent-native skills\n\nUsage:\n agent-native skills list\n agent-native skills add assets|design-exploration [--client codex|claude-code|claude-code-cli|cowork|all] [--scope user|project] [--yes] [--dry-run] [--json]\n agent-native skills add <manifest-or-app-dir> [--client ...] [--yes]\n\nExamples:\n agent-native skills add assets\n agent-native skills add design-exploration\n agent-native skills add assets --client claude-code\n agent-native skills add ./dist/assets-skill --client codex\n\nThe add command installs skill instructions with the open skills CLI, then\nregisters the app-backed MCP connector. Use app-skill pack for marketplace\nbundles and custom adapter output.`;\n\nconst ASSETS_SKILL_MD = `---\nname: assets\ndescription: >-\n Use Assets for brand-safe image or video generation, human picker UI,\n search/list/export actions, and cross-app asset selection.\nmetadata:\n visibility: exported\n---\n\n# Assets\n\nUse the Assets app when a workflow needs reusable brand media, a human picker,\nor generated image/video assets that another app can reference by ID and URL.\n\n## Choose The Path\n\n- Use \\`open-asset-picker\\` when a person should browse, search, generate, and\n select an asset in UI. Pass \\`mediaType: \"image\"\\` by default, or\n \\`mediaType: \"video\"\\` for video libraries. When the user asks to create a\n specific image and choose the best option, pass \\`prompt\\`,\n \\`autoGenerate: true\\`, and \\`count: 3\\` so the picker opens with candidates\n to preview and select.\n- Use unattended actions when the agent already knows what to do:\n \\`search-assets\\`, \\`list-assets\\`, \\`generate-image\\`,\n \\`generate-image-batch\\`, \\`generate-video\\`,\n \\`refresh-generation-run\\`, and \\`export-asset\\`.\n- Use browser/deep-link fallback when the host cannot render MCP Apps inline.\n Surface the returned picker link instead of inventing a separate UI.\n\n## Image And Video Workflows\n\n1. Pick or match the library with \\`list-libraries\\` or \\`match-library\\`.\n2. For images, call \\`generate-image\\` or \\`generate-image-batch\\`. Image\n actions are synchronous: one batch call should return the finished image\n candidates, so do not poll or regenerate unless a returned slot failed.\n3. For videos, call \\`generate-video\\` and poll \\`refresh-generation-run\\`\n until the run completes.\n4. Preserve returned \\`assetId\\`, \\`runId\\`, \\`previewUrl\\`, \\`downloadUrl\\`,\n media type, and dimensions so the caller can attach or embed the result.\n\n## Cross-App Use\n\n- Hosted default: connect \\`https://assets.agent-native.com/_agent-native/mcp\\`.\n Do not put shared secrets in skill files.\n- Local customization: use \\`agent-native app-skill launch --local\\` from an\n Assets app-skill manifest, or pass \\`--into <path>\\` for editable source.\n- Do not call image/video providers directly from another app. Assets owns\n generation, picker UI, search/list/export, and asset context.\n`;\n\nconst DESIGN_EXPLORATION_SKILL_MD = `---\nname: design-exploration\ndescription: >-\n Use Design for UI/UX exploration, side-by-side design directions,\n interactive prototype previews, user selection, iteration, and design-to-code\n handoff through the hosted Design MCP app.\nmetadata:\n visibility: exported\n---\n\n# Design Exploration\n\nUse the Design app when a workflow needs visual UI exploration, prototype\niteration, or a human-in-the-loop choice among design directions.\n\n## Choose The Path\n\n- Use \\`create-design\\` first to create a project shell. Do not report the\n design as ready until it has renderable HTML.\n- For open-ended UX exploration, generate three distinct, complete HTML\n directions and call \\`present-design-variants\\`. The inline Design MCP app\n shows the options, lets the user pick one, and persists the selected variant.\n- For direct refinements to an already chosen direction, call\n \\`get-design-snapshot\\`, edit from the current tuned HTML, then call\n \\`generate-design\\`.\n- Use \\`export-coding-handoff\\` when the user wants to implement the chosen\n design in a codebase.\n\n## Exploration Defaults\n\n1. Default to three variants unless the user asks for a different count.\n2. Make variants structurally and stylistically distinct, not just color swaps.\n3. Each variant must be a complete standalone HTML document that renders\n without a build step.\n4. For product UI redesigns, prefer cleaner hierarchy, progressive disclosure,\n and realistic controls over decorative mockups.\n5. After \\`present-design-variants\\`, wait for the user's pick before\n generating the next version. If they say \"I like #2 but...\", snapshot the\n chosen design and refine that direction with \\`generate-design\\`.\n\n## Cross-App Use\n\n- Hosted default: connect \\`https://design.agent-native.com/_agent-native/mcp\\`.\n Do not put shared secrets in skill files.\n- Dispatch can expose Design alongside other apps. Use Design for UI/UX design\n tasks, Assets for image/media selection, Slides for decks, and so on.\n- Keep the loop visual: surface the inline MCP App or the returned \"Open\n design\" link instead of pasting large HTML blobs into chat.\n`;\n\nconst BUILT_IN_APP_SKILLS = {\n assets: {\n skillName: \"assets\",\n manifest: normalizeAppSkillManifest({\n schemaVersion: 1,\n id: \"assets\",\n displayName: \"Assets\",\n description:\n \"Create, search, select, and export brand image and video assets from the Assets app.\",\n hosted: {\n url: \"https://assets.agent-native.com\",\n mcpUrl: \"https://assets.agent-native.com/_agent-native/mcp\",\n },\n mcp: { serverName: \"agent-native-assets\" },\n auth: {\n mode: \"oauth\",\n setup:\n \"Authenticate with the Assets MCP connector in the host app. No shared secrets are stored in skill files.\",\n },\n surfaces: [\n {\n id: \"asset-picker\",\n action: \"open-asset-picker\",\n path: \"/picker\",\n mediaTypes: [\"image\", \"video\"],\n defaultMediaType: \"image\",\n },\n ],\n skills: [\n {\n path: \"skills/assets\",\n visibility: \"exported\",\n exportAs: \"assets\",\n },\n ],\n hostAdapters: [\n \"codex-plugin\",\n \"claude-marketplace\",\n \"vercel-skills\",\n \"plain-skill\",\n \"claude-skill\",\n \"chatgpt-mcp\",\n \"generic-mcp\",\n ],\n }),\n skillMarkdown: ASSETS_SKILL_MD,\n },\n design: {\n skillName: \"design-exploration\",\n manifest: normalizeAppSkillManifest({\n schemaVersion: 1,\n id: \"design\",\n displayName: \"Design\",\n description:\n \"Explore, compare, iterate, and export interactive UI design prototypes from the Design app.\",\n hosted: {\n url: \"https://design.agent-native.com\",\n mcpUrl: \"https://design.agent-native.com/_agent-native/mcp\",\n },\n mcp: { serverName: \"agent-native-design\" },\n auth: {\n mode: \"oauth\",\n setup:\n \"Authenticate with the Design MCP connector in the host app. No shared secrets are stored in skill files.\",\n },\n surfaces: [\n {\n id: \"design-exploration\",\n action: \"present-design-variants\",\n path: \"/design\",\n },\n ],\n skills: [\n {\n path: \"skills/design-exploration\",\n visibility: \"exported\",\n exportAs: \"design-exploration\",\n },\n ],\n hostAdapters: [\n \"codex-plugin\",\n \"claude-marketplace\",\n \"vercel-skills\",\n \"plain-skill\",\n \"claude-skill\",\n \"chatgpt-mcp\",\n \"generic-mcp\",\n ],\n }),\n skillMarkdown: DESIGN_EXPLORATION_SKILL_MD,\n },\n} satisfies Record<\n string,\n { manifest: AppSkillManifest; skillMarkdown: string; skillName: string }\n>;\n\ntype BuiltInAppSkillId = keyof typeof BUILT_IN_APP_SKILLS;\n\nconst BUILT_IN_APP_SKILL_ALIASES = {\n assets: \"assets\",\n asset: \"assets\",\n \"asset-generation\": \"assets\",\n images: \"assets\",\n image: \"assets\",\n \"image-generation\": \"assets\",\n \"agent-native-assets\": \"assets\",\n \"agent-native-images\": \"assets\",\n design: \"design\",\n \"ui-design\": \"design\",\n \"ux-design\": \"design\",\n \"design-exploration\": \"design\",\n \"ux-exploration\": \"design\",\n \"agent-native-design\": \"design\",\n \"agent-native-design-exploration\": \"design\",\n} satisfies Record<string, BuiltInAppSkillId>;\n\nconst BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {\n assets: [\"images\", \"image-generation\", \"agent-native-images\"],\n design: [\n \"design-exploration\",\n \"ux-exploration\",\n \"agent-native-design-exploration\",\n ],\n} satisfies Record<BuiltInAppSkillId, string[]>;\n\ntype SkillsCommand = \"list\" | \"add\" | \"help\";\n\nexport interface ParsedSkillsArgs {\n command: SkillsCommand;\n target?: string;\n client: string;\n scope: string;\n yes: boolean;\n dryRun: boolean;\n printJson: boolean;\n instructions: boolean;\n mcp: boolean;\n}\n\nexport interface SkillsAddResult {\n id: string;\n displayName: string;\n instructionSource?: string;\n skillNames: string[];\n skillsAgents: string[];\n mcpUrl: string;\n mcpClients: ClientId[];\n dryRun: boolean;\n commands: string[];\n}\n\ninterface SkillInstallTarget {\n id: string;\n displayName: string;\n loaded: LoadedAppSkillManifest;\n skillNames: string[];\n materializeInstructions(outDir: string): string;\n cleanup?: () => void;\n}\n\ninterface RunSkillsOptions {\n baseDir?: string;\n log?: (message: string) => void;\n runCommand?: (cmd: string, args: string[]) => Promise<number>;\n}\n\nfunction normalizeKnownSkillTarget(\n value: string | undefined,\n): BuiltInAppSkillId | undefined {\n const key = value?.trim().toLowerCase();\n if (!key) return undefined;\n return BUILT_IN_APP_SKILL_ALIASES[key];\n}\n\nfunction isKnownSkill(value: string | undefined): boolean {\n return Boolean(normalizeKnownSkillTarget(value));\n}\n\nexport function parseSkillsArgs(argv: string[]): ParsedSkillsArgs {\n const first = argv[0];\n let command: SkillsCommand = \"list\";\n let args = argv;\n if (first === \"help\" || first === \"--help\" || first === \"-h\") {\n command = \"help\";\n args = argv.slice(1);\n } else if (first === \"list\" || first === \"add\") {\n command = first;\n args = argv.slice(1);\n } else if (first) {\n command = \"add\";\n }\n\n const out: ParsedSkillsArgs = {\n command,\n client: \"codex\",\n scope: \"user\",\n yes: false,\n dryRun: false,\n printJson: false,\n instructions: true,\n mcp: true,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const eat = (flag: string): string | undefined => {\n if (arg === flag) {\n const next = args[++i];\n if (!next || next.startsWith(\"-\")) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return next;\n }\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1);\n if (!value) throw new Error(`Missing value for ${flag}.`);\n return value;\n }\n return undefined;\n };\n let value: string | undefined;\n if ((value = eat(\"--client\")) !== undefined) out.client = value;\n else if ((value = eat(\"--scope\")) !== undefined) out.scope = value;\n else if (arg === \"--yes\" || arg === \"-y\") out.yes = true;\n else if (arg === \"--dry-run\") out.dryRun = true;\n else if (arg === \"--json\") out.printJson = true;\n else if (arg === \"--mcp-only\") out.instructions = false;\n else if (arg === \"--instructions-only\" || arg === \"--no-mcp\")\n out.mcp = false;\n else if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n else if (!out.target) out.target = arg;\n else throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (out.scope !== \"user\" && out.scope !== \"project\") {\n throw new Error(\"--scope must be either user or project.\");\n }\n return out;\n}\n\nfunction loadSkillTarget(target: string): SkillInstallTarget {\n const knownTarget = normalizeKnownSkillTarget(target);\n if (knownTarget) {\n const builtIn = BUILT_IN_APP_SKILLS[knownTarget];\n return {\n id: builtIn.manifest.id,\n displayName: builtIn.manifest.displayName,\n loaded: {\n manifest: builtIn.manifest,\n file: `<built-in:${builtIn.manifest.id}>`,\n dir: process.cwd(),\n },\n skillNames: [builtIn.skillName],\n materializeInstructions(outDir) {\n const skillDir = path.join(outDir, \"skills\", builtIn.skillName);\n fs.mkdirSync(skillDir, { recursive: true });\n fs.writeFileSync(\n path.join(skillDir, \"SKILL.md\"),\n builtIn.skillMarkdown,\n \"utf-8\",\n );\n return outDir;\n },\n };\n }\n\n const resolved = path.resolve(target);\n const manifestFile = fs.statSync(resolved).isDirectory()\n ? path.join(resolved, \"agent-native.app-skill.json\")\n : resolved;\n const loaded = loadAppSkillManifest(manifestFile);\n return {\n id: loaded.manifest.id,\n displayName: loaded.manifest.displayName,\n loaded,\n skillNames: loaded.manifest.skills\n .filter(\n (skill) =>\n skill.visibility === \"exported\" || skill.visibility === \"both\",\n )\n .map((skill) => skill.exportAs ?? path.basename(skill.path)),\n materializeInstructions(outDir) {\n const packed = buildAppSkillPack(loaded, outDir);\n const vercelAdapter = path.join(\n packed.outDir,\n \"adapters\",\n \"vercel-skills\",\n );\n return fs.existsSync(vercelAdapter) ? vercelAdapter : packed.outDir;\n },\n };\n}\n\nfunction skillsAgentsForClients(clients: ClientId[]): string[] {\n const agents = new Set<string>();\n for (const client of clients) {\n if (client === \"codex\") agents.add(\"codex\");\n if (client === \"claude-code\" || client === \"claude-code-cli\") {\n agents.add(\"claude-code\");\n }\n }\n return [...agents];\n}\n\nfunction commandString(cmd: string, args: string[]): string {\n return [cmd, ...args].join(\" \");\n}\n\nasync function runCommand(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => {\n if (signal) {\n reject(new Error(`${cmd} was interrupted by ${signal}.`));\n return;\n }\n resolve(code ?? 0);\n });\n });\n}\n\nexport async function addAgentNativeSkill(\n parsed: ParsedSkillsArgs,\n options: RunSkillsOptions = {},\n): Promise<SkillsAddResult> {\n const target = parsed.target ?? \"assets\";\n const knownTarget = normalizeKnownSkillTarget(target);\n if (!knownTarget && !fs.existsSync(path.resolve(target))) {\n throw new Error(\n `Unknown skill or manifest path: ${target}. Run \"agent-native skills list\".`,\n );\n }\n const installTarget = loadSkillTarget(target);\n const clients = resolveClients(parsed.client);\n const skillsAgents = skillsAgentsForClients(clients);\n const commands: string[] = [];\n const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"an-skills-add-\"));\n let instructionSource: string | undefined;\n\n try {\n if (parsed.instructions) {\n if (skillsAgents.length === 0) {\n throw new Error(\n \"Skill instructions can only be installed for Codex or Claude Code clients. Use --mcp-only for MCP-only clients.\",\n );\n }\n instructionSource = installTarget.materializeInstructions(tmpRoot);\n const args = [\n \"--yes\",\n \"skills@latest\",\n \"add\",\n instructionSource,\n \"--copy\",\n ...installTarget.skillNames.flatMap((skill) => [\"--skill\", skill]),\n ...skillsAgents.flatMap((agent) => [\"-a\", agent]),\n ...(parsed.yes || knownTarget ? [\"-y\"] : []),\n ];\n commands.push(commandString(\"npx\", args));\n if (!parsed.dryRun) {\n const code = await (options.runCommand ?? runCommand)(\"npx\", args);\n if (code !== 0) throw new Error(`npx skills add exited with ${code}.`);\n }\n }\n\n if (parsed.mcp) {\n commands.push(\n `agent-native app-skill ensure --manifest ${installTarget.loaded.file} --client ${parsed.client} --scope ${parsed.scope} --yes`,\n );\n if (!parsed.dryRun) {\n await ensureAppSkill(installTarget.loaded, {\n clients,\n scope: parsed.scope,\n baseDir: options.baseDir,\n yes: parsed.yes || Boolean(knownTarget),\n confirm: true,\n log: options.log,\n });\n }\n }\n\n return {\n id: installTarget.id,\n displayName: installTarget.displayName,\n instructionSource,\n skillNames: installTarget.skillNames,\n skillsAgents,\n mcpUrl: installTarget.loaded.manifest.hosted.mcpUrl,\n mcpClients: clients,\n dryRun: parsed.dryRun,\n commands,\n };\n } finally {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n installTarget.cleanup?.();\n }\n}\n\nfunction listSkills() {\n return Object.values(BUILT_IN_APP_SKILLS).map((entry) => ({\n id: entry.manifest.id,\n aliases:\n BUILT_IN_APP_SKILL_DISPLAY_ALIASES[\n entry.manifest.id as BuiltInAppSkillId\n ] ?? [],\n name: entry.manifest.displayName,\n description: entry.manifest.description,\n mcpUrl: entry.manifest.hosted.mcpUrl,\n }));\n}\n\nexport async function runSkills(\n argv: string[],\n options: RunSkillsOptions = {},\n): Promise<void> {\n const parsed = parseSkillsArgs(argv);\n const log = (message: string) =>\n (parsed.printJson ? process.stderr : process.stdout).write(`${message}\\n`);\n\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n if (parsed.command === \"list\") {\n const skills = listSkills();\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(skills, null, 2)}\\n`);\n return;\n }\n for (const skill of skills) {\n const description = skill.description.replace(/[.?!]?$/, \".\");\n const aliases = skill.aliases.length\n ? ` Aliases: ${skill.aliases.join(\", \")}.`\n : \"\";\n process.stdout.write(\n `${skill.id.padEnd(12)} ${description}${aliases} (${skill.mcpUrl})\\n`,\n );\n }\n return;\n }\n\n const result = await addAgentNativeSkill(parsed, {\n ...options,\n log,\n });\n\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`${result.commands.join(\"\\n\")}\\n`);\n return;\n }\n\n process.stdout.write(\n `Installed ${result.displayName} skill for ${result.skillsAgents.join(\n \", \",\n )} and registered ${result.mcpUrl} for ${result.mcpClients.join(\", \")}.\\n`,\n );\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { DbAdminForeignKey, DbAdminSort, DbAdminTableSchema } from "../../db-admin/types.js";
2
+ /** A grid row pairs the displayed values with its stable pk string. */
3
+ export interface GridRow {
4
+ pk: string;
5
+ /** Values WITH staged edits already applied (for display). */
6
+ values: Record<string, unknown>;
7
+ isNew?: boolean;
8
+ isDeleted?: boolean;
9
+ /** Local id for new rows (so edits route to the right new-row). */
10
+ localId?: string;
11
+ }
12
+ /** Identifies the focused cell for keyboard nav. */
13
+ export interface ActiveCell {
14
+ rowIndex: number;
15
+ colName: string;
16
+ editing: boolean;
17
+ }
18
+ export interface DataGridProps {
19
+ schema: DbAdminTableSchema;
20
+ rows: GridRow[];
21
+ isLoading: boolean;
22
+ pageSize: number;
23
+ sort: DbAdminSort[];
24
+ onSortChange: (sort: DbAdminSort[]) => void;
25
+ selectedPks: Set<string>;
26
+ onSelectionChange: (pks: Set<string>) => void;
27
+ columnWidths: Record<string, number>;
28
+ onColumnWidthsChange: (widths: Record<string, number>) => void;
29
+ active: ActiveCell | null;
30
+ onActiveChange: (active: ActiveCell | null) => void;
31
+ /** Whether editing is permitted (table has a PK). */
32
+ editable: boolean;
33
+ /** Commit a staged cell edit. */
34
+ onCellCommit: (row: GridRow, col: string, value: unknown) => void;
35
+ /** Whether a given cell is dirty. */
36
+ isCellDirty: (row: GridRow, col: string) => boolean;
37
+ /** Toggle deletion staging for a single row. */
38
+ onToggleDelete: (row: GridRow) => void;
39
+ onNavigateToRow: (fk: DbAdminForeignKey, value: unknown) => void;
40
+ }
41
+ export declare function DataGrid(props: DataGridProps): import("react/jsx-runtime").JSX.Element;
42
+ //# sourceMappingURL=DataGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/DataGrid.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAEV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,uEAAuE;AACvE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAE5C,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAE9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAE/D,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAEpD,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAElB,iCAAiC;IACjC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,qCAAqC;IACrC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACpD,gDAAgD;IAChD,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,eAAe,EAAE,CAAC,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClE;AAKD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAyX5C"}
@@ -0,0 +1,204 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useRef } from "react";
3
+ import { flexRender, getCoreRowModel, useReactTable, } from "@tanstack/react-table";
4
+ import { IconKey, IconArrowUp, IconArrowDown, IconExternalLink, IconTrash, IconArrowBackUp, } from "@tabler/icons-react";
5
+ import { cn } from "../utils.js";
6
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../components/ui/tooltip.js";
7
+ import { EditableCell } from "./EditableCell.js";
8
+ import { inferEditorKind } from "./cell-format.js";
9
+ const SELECT_COL = "__select__";
10
+ const ACTIONS_COL = "__actions__";
11
+ export function DataGrid(props) {
12
+ const { schema, rows, isLoading, pageSize, sort, onSortChange, selectedPks, onSelectionChange, columnWidths, onColumnWidthsChange, active, onActiveChange, editable, onCellCommit, isCellDirty, onToggleDelete, onNavigateToRow, } = props;
13
+ const containerRef = useRef(null);
14
+ const fkByColumn = useMemo(() => {
15
+ const map = new Map();
16
+ for (const fk of schema.foreignKeys)
17
+ map.set(fk.column, fk);
18
+ return map;
19
+ }, [schema.foreignKeys]);
20
+ const kindByColumn = useMemo(() => {
21
+ const map = new Map();
22
+ for (const col of schema.columns)
23
+ map.set(col.name, inferEditorKind(col));
24
+ return map;
25
+ }, [schema.columns]);
26
+ const allSelected = rows.length > 0 && rows.every((r) => selectedPks.has(r.pk));
27
+ const someSelected = rows.some((r) => selectedPks.has(r.pk));
28
+ const toggleAll = useCallback(() => {
29
+ if (allSelected)
30
+ onSelectionChange(new Set());
31
+ else
32
+ onSelectionChange(new Set(rows.map((r) => r.pk)));
33
+ }, [allSelected, rows, onSelectionChange]);
34
+ const toggleOne = useCallback((pk) => {
35
+ const next = new Set(selectedPks);
36
+ if (next.has(pk))
37
+ next.delete(pk);
38
+ else
39
+ next.add(pk);
40
+ onSelectionChange(next);
41
+ }, [selectedPks, onSelectionChange]);
42
+ const cycleSort = useCallback((colName) => {
43
+ const current = sort.find((s) => s.column === colName);
44
+ if (!current)
45
+ onSortChange([{ column: colName, dir: "asc" }]);
46
+ else if (current.dir === "asc")
47
+ onSortChange([{ column: colName, dir: "desc" }]);
48
+ else
49
+ onSortChange([]);
50
+ }, [sort, onSortChange]);
51
+ const columns = useMemo(() => {
52
+ const selectCol = {
53
+ id: SELECT_COL,
54
+ size: 40,
55
+ enableResizing: false,
56
+ header: () => (_jsx("input", { type: "checkbox", checked: allSelected, ref: (el) => {
57
+ if (el)
58
+ el.indeterminate = !allSelected && someSelected;
59
+ }, onChange: toggleAll, className: "h-3.5 w-3.5 cursor-pointer accent-primary", "aria-label": "Select all rows" })),
60
+ cell: ({ row }) => (_jsx("input", { type: "checkbox", checked: selectedPks.has(row.original.pk), onChange: () => toggleOne(row.original.pk), className: "h-3.5 w-3.5 cursor-pointer accent-primary", "aria-label": "Select row" })),
61
+ };
62
+ const dataCols = schema.columns.map((col) => ({
63
+ id: col.name,
64
+ accessorFn: (r) => r.values[col.name],
65
+ size: columnWidths[col.name] ?? defaultWidth(col),
66
+ minSize: 60,
67
+ header: () => (_jsx(ColumnHeader, { column: col, fk: fkByColumn.get(col.name), sortDir: sort.find((s) => s.column === col.name)?.dir, onSort: () => cycleSort(col.name) })),
68
+ cell: ({ row, getValue }) => {
69
+ const value = getValue();
70
+ const fk = fkByColumn.get(col.name);
71
+ const isActive = active?.rowIndex === row.index && active.colName === col.name;
72
+ return (_jsxs("div", { className: "group relative flex h-full items-center", children: [_jsx(EditableCell, { column: col, kind: kindByColumn.get(col.name) ?? "text", value: value, editable: editable && !row.original.isDeleted, dirty: isCellDirty(row.original, col.name), active: isActive, editing: isActive ? active.editing : false, onStartEdit: () => onActiveChange({
73
+ rowIndex: row.index,
74
+ colName: col.name,
75
+ editing: true,
76
+ }), onCancelEdit: () => onActiveChange({
77
+ rowIndex: row.index,
78
+ colName: col.name,
79
+ editing: false,
80
+ }), onCommit: (v) => {
81
+ onCellCommit(row.original, col.name, v);
82
+ onActiveChange({
83
+ rowIndex: row.index,
84
+ colName: col.name,
85
+ editing: false,
86
+ });
87
+ }, onNavigate: (dir) => moveActive(dir, row.index, col.name) }), fk && value !== null && value !== undefined && (_jsx("button", { type: "button", title: `Open ${fk.refTable}.${fk.refColumn}`, onClick: (e) => {
88
+ e.stopPropagation();
89
+ onNavigateToRow(fk, value);
90
+ }, className: "absolute right-1 top-1/2 -translate-y-1/2 text-muted-foreground/50 opacity-0 hover:text-primary group-hover:opacity-100", children: _jsx(IconExternalLink, { className: "h-3 w-3" }) }))] }));
91
+ },
92
+ }));
93
+ const actionsCol = {
94
+ id: ACTIONS_COL,
95
+ size: 44,
96
+ enableResizing: false,
97
+ header: () => null,
98
+ cell: ({ row }) => (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx("button", { type: "button", title: row.original.isDeleted ? "Undo delete" : "Delete row", onClick: () => onToggleDelete(row.original), disabled: !editable, className: cn("rounded p-1 text-muted-foreground/50 hover:text-destructive disabled:opacity-30", row.original.isDeleted && "text-destructive"), children: row.original.isDeleted ? (_jsx(IconArrowBackUp, { className: "h-3.5 w-3.5" })) : (_jsx(IconTrash, { className: "h-3.5 w-3.5" })) }) })),
99
+ };
100
+ return [selectCol, ...dataCols, actionsCol];
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ }, [
103
+ schema.columns,
104
+ columnWidths,
105
+ fkByColumn,
106
+ kindByColumn,
107
+ sort,
108
+ active,
109
+ selectedPks,
110
+ allSelected,
111
+ someSelected,
112
+ editable,
113
+ ]);
114
+ const moveActive = useCallback((dir, rowIndex, colName) => {
115
+ const dataColNames = schema.columns.map((c) => c.name);
116
+ const colIdx = dataColNames.indexOf(colName);
117
+ let nextRow = rowIndex;
118
+ let nextCol = colIdx;
119
+ if (dir === "down")
120
+ nextRow = Math.min(rows.length - 1, rowIndex + 1);
121
+ else if (dir === "up")
122
+ nextRow = Math.max(0, rowIndex - 1);
123
+ else if (dir === "right")
124
+ nextCol = Math.min(dataColNames.length - 1, colIdx + 1);
125
+ else if (dir === "left")
126
+ nextCol = Math.max(0, colIdx - 1);
127
+ onActiveChange({
128
+ rowIndex: nextRow,
129
+ colName: dataColNames[nextCol],
130
+ editing: false,
131
+ });
132
+ }, [schema.columns, rows.length, onActiveChange]);
133
+ const sizingState = useMemo(() => {
134
+ const out = {};
135
+ for (const [k, v] of Object.entries(columnWidths))
136
+ out[k] = v;
137
+ return out;
138
+ }, [columnWidths]);
139
+ const table = useReactTable({
140
+ data: rows,
141
+ columns,
142
+ getCoreRowModel: getCoreRowModel(),
143
+ columnResizeMode: "onChange",
144
+ state: { columnSizing: sizingState },
145
+ onColumnSizingChange: (updater) => {
146
+ const next = typeof updater === "function" ? updater(sizingState) : updater;
147
+ onColumnWidthsChange(next);
148
+ },
149
+ getRowId: (r) => r.pk,
150
+ });
151
+ const onGridKeyDown = (e) => {
152
+ if (!active || active.editing)
153
+ return;
154
+ const dataColNames = schema.columns.map((c) => c.name);
155
+ const colIdx = dataColNames.indexOf(active.colName);
156
+ if (e.key === "ArrowDown") {
157
+ e.preventDefault();
158
+ moveActive("down", active.rowIndex, active.colName);
159
+ }
160
+ else if (e.key === "ArrowUp") {
161
+ e.preventDefault();
162
+ moveActive("up", active.rowIndex, active.colName);
163
+ }
164
+ else if (e.key === "ArrowRight" || (e.key === "Tab" && !e.shiftKey)) {
165
+ e.preventDefault();
166
+ moveActive("right", active.rowIndex, active.colName);
167
+ }
168
+ else if (e.key === "ArrowLeft" || (e.key === "Tab" && e.shiftKey)) {
169
+ e.preventDefault();
170
+ moveActive("left", active.rowIndex, active.colName);
171
+ }
172
+ else if (e.key === "Enter" && colIdx >= 0) {
173
+ e.preventDefault();
174
+ onActiveChange({ ...active, editing: true });
175
+ }
176
+ };
177
+ const totalWidth = table.getTotalSize();
178
+ return (_jsx(TooltipProvider, { delayDuration: 300, children: _jsx("div", { ref: containerRef, className: "relative flex-1 overflow-auto", tabIndex: 0, onKeyDown: onGridKeyDown, children: _jsxs("table", { className: "border-separate border-spacing-0 text-xs", style: { width: totalWidth, minWidth: "100%" }, children: [_jsx("thead", { className: "sticky top-0 z-20", children: table.getHeaderGroups().map((hg) => (_jsx("tr", { children: hg.headers.map((header) => (_jsxs("th", { style: { width: header.getSize() }, className: cn("relative h-9 border-b border-r border-border bg-muted/60 px-2 text-left align-middle font-medium text-muted-foreground backdrop-blur", header.column.id === SELECT_COL && "px-0 text-center"), children: [header.isPlaceholder
179
+ ? null
180
+ : flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanResize() && (_jsx("div", { onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler(), className: cn("absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-ring", header.column.getIsResizing() && "bg-ring") }))] }, header.id))) }, hg.id))) }), _jsx("tbody", { children: isLoading && rows.length === 0 ? (_jsx(SkeletonRows, { columnCount: schema.columns.length + 2, rows: Math.min(pageSize, 12) })) : rows.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: schema.columns.length + 2, className: "px-4 py-16 text-center text-muted-foreground", children: "No rows." }) })) : (table.getRowModel().rows.map((row) => (_jsx("tr", { className: cn("group/row hover:bg-muted/30", row.original.isNew && "bg-emerald-500/5", row.original.isDeleted &&
181
+ "bg-destructive/5 line-through opacity-60"), children: row.getVisibleCells().map((cell) => (_jsx("td", { style: { width: cell.column.getSize() }, className: cn("h-8 border-b border-r border-border p-0 align-middle", cell.column.id === SELECT_COL && "text-center"), children: cell.column.id === SELECT_COL ||
182
+ cell.column.id === ACTIONS_COL ? (_jsx("div", { className: "flex h-full items-center justify-center", children: flexRender(cell.column.columnDef.cell, cell.getContext()) })) : (flexRender(cell.column.columnDef.cell, cell.getContext())) }, cell.id))) }, row.id)))) })] }) }) }));
183
+ }
184
+ function defaultWidth(col) {
185
+ const kind = inferEditorKind(col);
186
+ if (kind === "boolean")
187
+ return 90;
188
+ if (kind === "uuid")
189
+ return 280;
190
+ if (kind === "json")
191
+ return 240;
192
+ if (kind === "timestamp")
193
+ return 180;
194
+ if (kind === "number")
195
+ return 110;
196
+ return 180;
197
+ }
198
+ function ColumnHeader({ column, fk, sortDir, onSort, }) {
199
+ return (_jsxs("button", { type: "button", onClick: onSort, className: "flex w-full items-center gap-1 overflow-hidden", children: [column.pk && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(IconKey, { className: "h-3 w-3 shrink-0 text-amber-500" }) }) }), _jsx(TooltipContent, { children: "Primary key" })] })), fk && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(IconExternalLink, { className: "h-3 w-3 shrink-0 text-primary/70" }) }) }), _jsxs(TooltipContent, { children: ["\u2192 ", fk.refTable, ".", fk.refColumn] })] })), _jsx("span", { className: "truncate font-medium text-foreground", children: column.name }), _jsx("span", { className: "rounded bg-background/60 px-1 font-mono text-[9px] font-normal text-muted-foreground", children: column.type }), _jsx("span", { className: "ml-auto shrink-0", children: sortDir === "asc" ? (_jsx(IconArrowUp, { className: "h-3 w-3" })) : sortDir === "desc" ? (_jsx(IconArrowDown, { className: "h-3 w-3" })) : null })] }));
200
+ }
201
+ function SkeletonRows({ columnCount, rows, }) {
202
+ return (_jsx(_Fragment, { children: Array.from({ length: rows }).map((_, r) => (_jsx("tr", { children: Array.from({ length: columnCount }).map((_, c) => (_jsx("td", { className: "h-8 border-b border-r border-border px-2", children: _jsx("div", { className: "h-3 w-3/4 animate-pulse rounded bg-muted" }) }, c))) }, r))) }));
203
+ }
204
+ //# sourceMappingURL=DataGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["../../../src/client/db-admin/DataGrid.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnSizingState,\n} from \"@tanstack/react-table\";\nimport {\n IconKey,\n IconArrowUp,\n IconArrowDown,\n IconExternalLink,\n IconTrash,\n IconArrowBackUp,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { EditableCell } from \"./EditableCell.js\";\nimport { inferEditorKind, type EditorKind } from \"./cell-format.js\";\nimport type {\n DbAdminColumn,\n DbAdminForeignKey,\n DbAdminSort,\n DbAdminTableSchema,\n} from \"../../db-admin/types.js\";\n\n/** A grid row pairs the displayed values with its stable pk string. */\nexport interface GridRow {\n pk: string;\n /** Values WITH staged edits already applied (for display). */\n values: Record<string, unknown>;\n isNew?: boolean;\n isDeleted?: boolean;\n /** Local id for new rows (so edits route to the right new-row). */\n localId?: string;\n}\n\n/** Identifies the focused cell for keyboard nav. */\nexport interface ActiveCell {\n rowIndex: number;\n colName: string;\n editing: boolean;\n}\n\nexport interface DataGridProps {\n schema: DbAdminTableSchema;\n rows: GridRow[];\n isLoading: boolean;\n pageSize: number;\n\n sort: DbAdminSort[];\n onSortChange: (sort: DbAdminSort[]) => void;\n\n selectedPks: Set<string>;\n onSelectionChange: (pks: Set<string>) => void;\n\n columnWidths: Record<string, number>;\n onColumnWidthsChange: (widths: Record<string, number>) => void;\n\n active: ActiveCell | null;\n onActiveChange: (active: ActiveCell | null) => void;\n\n /** Whether editing is permitted (table has a PK). */\n editable: boolean;\n\n /** Commit a staged cell edit. */\n onCellCommit: (row: GridRow, col: string, value: unknown) => void;\n /** Whether a given cell is dirty. */\n isCellDirty: (row: GridRow, col: string) => boolean;\n /** Toggle deletion staging for a single row. */\n onToggleDelete: (row: GridRow) => void;\n\n onNavigateToRow: (fk: DbAdminForeignKey, value: unknown) => void;\n}\n\nconst SELECT_COL = \"__select__\";\nconst ACTIONS_COL = \"__actions__\";\n\nexport function DataGrid(props: DataGridProps) {\n const {\n schema,\n rows,\n isLoading,\n pageSize,\n sort,\n onSortChange,\n selectedPks,\n onSelectionChange,\n columnWidths,\n onColumnWidthsChange,\n active,\n onActiveChange,\n editable,\n onCellCommit,\n isCellDirty,\n onToggleDelete,\n onNavigateToRow,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const fkByColumn = useMemo(() => {\n const map = new Map<string, DbAdminForeignKey>();\n for (const fk of schema.foreignKeys) map.set(fk.column, fk);\n return map;\n }, [schema.foreignKeys]);\n\n const kindByColumn = useMemo(() => {\n const map = new Map<string, EditorKind>();\n for (const col of schema.columns) map.set(col.name, inferEditorKind(col));\n return map;\n }, [schema.columns]);\n\n const allSelected =\n rows.length > 0 && rows.every((r) => selectedPks.has(r.pk));\n const someSelected = rows.some((r) => selectedPks.has(r.pk));\n\n const toggleAll = useCallback(() => {\n if (allSelected) onSelectionChange(new Set());\n else onSelectionChange(new Set(rows.map((r) => r.pk)));\n }, [allSelected, rows, onSelectionChange]);\n\n const toggleOne = useCallback(\n (pk: string) => {\n const next = new Set(selectedPks);\n if (next.has(pk)) next.delete(pk);\n else next.add(pk);\n onSelectionChange(next);\n },\n [selectedPks, onSelectionChange],\n );\n\n const cycleSort = useCallback(\n (colName: string) => {\n const current = sort.find((s) => s.column === colName);\n if (!current) onSortChange([{ column: colName, dir: \"asc\" }]);\n else if (current.dir === \"asc\")\n onSortChange([{ column: colName, dir: \"desc\" }]);\n else onSortChange([]);\n },\n [sort, onSortChange],\n );\n\n const columns = useMemo<ColumnDef<GridRow>[]>(() => {\n const selectCol: ColumnDef<GridRow> = {\n id: SELECT_COL,\n size: 40,\n enableResizing: false,\n header: () => (\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = !allSelected && someSelected;\n }}\n onChange={toggleAll}\n className=\"h-3.5 w-3.5 cursor-pointer accent-primary\"\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={selectedPks.has(row.original.pk)}\n onChange={() => toggleOne(row.original.pk)}\n className=\"h-3.5 w-3.5 cursor-pointer accent-primary\"\n aria-label=\"Select row\"\n />\n ),\n };\n\n const dataCols: ColumnDef<GridRow>[] = schema.columns.map((col) => ({\n id: col.name,\n accessorFn: (r) => r.values[col.name],\n size: columnWidths[col.name] ?? defaultWidth(col),\n minSize: 60,\n header: () => (\n <ColumnHeader\n column={col}\n fk={fkByColumn.get(col.name)}\n sortDir={sort.find((s) => s.column === col.name)?.dir}\n onSort={() => cycleSort(col.name)}\n />\n ),\n cell: ({ row, getValue }) => {\n const value = getValue();\n const fk = fkByColumn.get(col.name);\n const isActive =\n active?.rowIndex === row.index && active.colName === col.name;\n return (\n <div className=\"group relative flex h-full items-center\">\n <EditableCell\n column={col}\n kind={kindByColumn.get(col.name) ?? \"text\"}\n value={value}\n editable={editable && !row.original.isDeleted}\n dirty={isCellDirty(row.original, col.name)}\n active={isActive}\n editing={isActive ? active.editing : false}\n onStartEdit={() =>\n onActiveChange({\n rowIndex: row.index,\n colName: col.name,\n editing: true,\n })\n }\n onCancelEdit={() =>\n onActiveChange({\n rowIndex: row.index,\n colName: col.name,\n editing: false,\n })\n }\n onCommit={(v) => {\n onCellCommit(row.original, col.name, v);\n onActiveChange({\n rowIndex: row.index,\n colName: col.name,\n editing: false,\n });\n }}\n onNavigate={(dir) => moveActive(dir, row.index, col.name)}\n />\n {fk && value !== null && value !== undefined && (\n <button\n type=\"button\"\n title={`Open ${fk.refTable}.${fk.refColumn}`}\n onClick={(e) => {\n e.stopPropagation();\n onNavigateToRow(fk, value);\n }}\n className=\"absolute right-1 top-1/2 -translate-y-1/2 text-muted-foreground/50 opacity-0 hover:text-primary group-hover:opacity-100\"\n >\n <IconExternalLink className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n );\n },\n }));\n\n const actionsCol: ColumnDef<GridRow> = {\n id: ACTIONS_COL,\n size: 44,\n enableResizing: false,\n header: () => null,\n cell: ({ row }) => (\n <div className=\"flex h-full items-center justify-center\">\n <button\n type=\"button\"\n title={row.original.isDeleted ? \"Undo delete\" : \"Delete row\"}\n onClick={() => onToggleDelete(row.original)}\n disabled={!editable}\n className={cn(\n \"rounded p-1 text-muted-foreground/50 hover:text-destructive disabled:opacity-30\",\n row.original.isDeleted && \"text-destructive\",\n )}\n >\n {row.original.isDeleted ? (\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n ) : (\n <IconTrash className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n ),\n };\n\n return [selectCol, ...dataCols, actionsCol];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n schema.columns,\n columnWidths,\n fkByColumn,\n kindByColumn,\n sort,\n active,\n selectedPks,\n allSelected,\n someSelected,\n editable,\n ]);\n\n const moveActive = useCallback(\n (\n dir: \"up\" | \"down\" | \"left\" | \"right\",\n rowIndex: number,\n colName: string,\n ) => {\n const dataColNames = schema.columns.map((c) => c.name);\n const colIdx = dataColNames.indexOf(colName);\n let nextRow = rowIndex;\n let nextCol = colIdx;\n if (dir === \"down\") nextRow = Math.min(rows.length - 1, rowIndex + 1);\n else if (dir === \"up\") nextRow = Math.max(0, rowIndex - 1);\n else if (dir === \"right\")\n nextCol = Math.min(dataColNames.length - 1, colIdx + 1);\n else if (dir === \"left\") nextCol = Math.max(0, colIdx - 1);\n onActiveChange({\n rowIndex: nextRow,\n colName: dataColNames[nextCol],\n editing: false,\n });\n },\n [schema.columns, rows.length, onActiveChange],\n );\n\n const sizingState: ColumnSizingState = useMemo(() => {\n const out: ColumnSizingState = {};\n for (const [k, v] of Object.entries(columnWidths)) out[k] = v;\n return out;\n }, [columnWidths]);\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: \"onChange\",\n state: { columnSizing: sizingState },\n onColumnSizingChange: (updater) => {\n const next =\n typeof updater === \"function\" ? updater(sizingState) : updater;\n onColumnWidthsChange(next as Record<string, number>);\n },\n getRowId: (r) => r.pk,\n });\n\n const onGridKeyDown = (e: React.KeyboardEvent) => {\n if (!active || active.editing) return;\n const dataColNames = schema.columns.map((c) => c.name);\n const colIdx = dataColNames.indexOf(active.colName);\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n moveActive(\"down\", active.rowIndex, active.colName);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n moveActive(\"up\", active.rowIndex, active.colName);\n } else if (e.key === \"ArrowRight\" || (e.key === \"Tab\" && !e.shiftKey)) {\n e.preventDefault();\n moveActive(\"right\", active.rowIndex, active.colName);\n } else if (e.key === \"ArrowLeft\" || (e.key === \"Tab\" && e.shiftKey)) {\n e.preventDefault();\n moveActive(\"left\", active.rowIndex, active.colName);\n } else if (e.key === \"Enter\" && colIdx >= 0) {\n e.preventDefault();\n onActiveChange({ ...active, editing: true });\n }\n };\n\n const totalWidth = table.getTotalSize();\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n ref={containerRef}\n className=\"relative flex-1 overflow-auto\"\n tabIndex={0}\n onKeyDown={onGridKeyDown}\n >\n <table\n className=\"border-separate border-spacing-0 text-xs\"\n style={{ width: totalWidth, minWidth: \"100%\" }}\n >\n <thead className=\"sticky top-0 z-20\">\n {table.getHeaderGroups().map((hg) => (\n <tr key={hg.id}>\n {hg.headers.map((header) => (\n <th\n key={header.id}\n style={{ width: header.getSize() }}\n className={cn(\n \"relative h-9 border-b border-r border-border bg-muted/60 px-2 text-left align-middle font-medium text-muted-foreground backdrop-blur\",\n header.column.id === SELECT_COL && \"px-0 text-center\",\n )}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getCanResize() && (\n <div\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-ring\",\n header.column.getIsResizing() && \"bg-ring\",\n )}\n />\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {isLoading && rows.length === 0 ? (\n <SkeletonRows\n columnCount={schema.columns.length + 2}\n rows={Math.min(pageSize, 12)}\n />\n ) : rows.length === 0 ? (\n <tr>\n <td\n colSpan={schema.columns.length + 2}\n className=\"px-4 py-16 text-center text-muted-foreground\"\n >\n No rows.\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row) => (\n <tr\n key={row.id}\n className={cn(\n \"group/row hover:bg-muted/30\",\n row.original.isNew && \"bg-emerald-500/5\",\n row.original.isDeleted &&\n \"bg-destructive/5 line-through opacity-60\",\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n style={{ width: cell.column.getSize() }}\n className={cn(\n \"h-8 border-b border-r border-border p-0 align-middle\",\n cell.column.id === SELECT_COL && \"text-center\",\n )}\n >\n {cell.column.id === SELECT_COL ||\n cell.column.id === ACTIONS_COL ? (\n <div className=\"flex h-full items-center justify-center\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </div>\n ) : (\n flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </TooltipProvider>\n );\n}\n\nfunction defaultWidth(col: DbAdminColumn): number {\n const kind = inferEditorKind(col);\n if (kind === \"boolean\") return 90;\n if (kind === \"uuid\") return 280;\n if (kind === \"json\") return 240;\n if (kind === \"timestamp\") return 180;\n if (kind === \"number\") return 110;\n return 180;\n}\n\nfunction ColumnHeader({\n column,\n fk,\n sortDir,\n onSort,\n}: {\n column: DbAdminColumn;\n fk?: DbAdminForeignKey;\n sortDir?: \"asc\" | \"desc\";\n onSort: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSort}\n className=\"flex w-full items-center gap-1 overflow-hidden\"\n >\n {column.pk && (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <IconKey className=\"h-3 w-3 shrink-0 text-amber-500\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Primary key</TooltipContent>\n </Tooltip>\n )}\n {fk && (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <IconExternalLink className=\"h-3 w-3 shrink-0 text-primary/70\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n → {fk.refTable}.{fk.refColumn}\n </TooltipContent>\n </Tooltip>\n )}\n <span className=\"truncate font-medium text-foreground\">\n {column.name}\n </span>\n <span className=\"rounded bg-background/60 px-1 font-mono text-[9px] font-normal text-muted-foreground\">\n {column.type}\n </span>\n <span className=\"ml-auto shrink-0\">\n {sortDir === \"asc\" ? (\n <IconArrowUp className=\"h-3 w-3\" />\n ) : sortDir === \"desc\" ? (\n <IconArrowDown className=\"h-3 w-3\" />\n ) : null}\n </span>\n </button>\n );\n}\n\nfunction SkeletonRows({\n columnCount,\n rows,\n}: {\n columnCount: number;\n rows: number;\n}) {\n return (\n <>\n {Array.from({ length: rows }).map((_, r) => (\n <tr key={r}>\n {Array.from({ length: columnCount }).map((_, c) => (\n <td key={c} className=\"h-8 border-b border-r border-border px-2\">\n <div className=\"h-3 w-3/4 animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function DbAdminPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=DbAdminPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbAdminPage.d.ts","sourceRoot":"","sources":["../../../src/client/db-admin/DbAdminPage.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,4CAsH1B"}
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Dev-mode database admin page — the shell that hosts the table browser, the
4
+ * table editor, and the SQL editor.
5
+ *
6
+ * Gated to development mode: when the app is not running in a dev environment
7
+ * (`canToggle` is false) we render a clean notice instead of the tool. The
8
+ * backend also enforces this with a 403, so this is purely a friendlier UX.
9
+ */
10
+ import { useEffect, useMemo, useState } from "react";
11
+ import { IconDatabase, IconLoader2 } from "@tabler/icons-react";
12
+ import { cn } from "../utils.js";
13
+ import { useDevMode } from "../use-dev-mode.js";
14
+ import { useOverview } from "./useDbAdmin.js";
15
+ import { TableBrowser } from "./TableBrowser.js";
16
+ import { useDbAdminAgentSync, useNavigateConsumer } from "./useAgentSync.js";
17
+ import { TableEditor } from "./TableEditor.js";
18
+ import { SqlEditor } from "./SqlEditor.js";
19
+ const DIALECT_LABEL = {
20
+ postgres: "Postgres",
21
+ sqlite: "SQLite",
22
+ d1: "Cloudflare D1",
23
+ };
24
+ export function DbAdminPage() {
25
+ const { canToggle, isLoading: devLoading } = useDevMode();
26
+ const { data: overview, isLoading: overviewLoading } = useOverview();
27
+ const [selectedTable, setSelectedTable] = useState(null);
28
+ const [mode, setMode] = useState("table");
29
+ const [fkFilters, setFkFilters] = useState(undefined);
30
+ const tables = overview?.tables ?? [];
31
+ const dialect = overview?.dialect ?? "sqlite";
32
+ // Default selection to the first table once the overview loads.
33
+ useEffect(() => {
34
+ if (selectedTable === null && tables.length > 0) {
35
+ setSelectedTable(tables[0].name);
36
+ }
37
+ }, [selectedTable, tables]);
38
+ // Keep the agent's <current-screen> in sync, and let it drive navigation.
39
+ useDbAdminAgentSync({ table: selectedTable, mode });
40
+ useNavigateConsumer((table) => {
41
+ setSelectedTable(table);
42
+ setMode("table");
43
+ setFkFilters(undefined);
44
+ });
45
+ const tableNames = useMemo(() => tables.map((t) => t.name), [tables]);
46
+ // SqlEditor degrades gracefully without per-table columns; pass an empty map.
47
+ // (Table-name autocomplete still works; column autocomplete fills in lazily.)
48
+ const columnsByTable = useMemo(() => ({}), []);
49
+ // ─── Dev gate ──────────────────────────────────────────────────────────
50
+ if (!devLoading && !canToggle) {
51
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-background p-6", children: _jsxs("div", { className: "flex max-w-md flex-col items-center rounded-lg border bg-card p-8 text-center shadow-sm", children: [_jsx("div", { className: "mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted", children: _jsx(IconDatabase, { className: "h-6 w-6 text-muted-foreground", stroke: 1.75 }) }), _jsx("h2", { className: "text-base font-semibold text-foreground", children: "Development mode only" }), _jsx("p", { className: "mt-1.5 text-sm text-muted-foreground", children: "Database admin is available in development mode only." })] }) }));
52
+ }
53
+ const showInitialLoading = (devLoading || overviewLoading) && !overview;
54
+ return (_jsxs("div", { className: "flex h-full w-full flex-col bg-background text-foreground", children: [_jsxs("header", { className: "flex h-12 shrink-0 items-center gap-3 border-b px-4", children: [_jsx(IconDatabase, { className: "h-5 w-5 text-muted-foreground", stroke: 1.75 }), _jsx("span", { className: "text-sm font-semibold", children: "Database" }), _jsx("span", { className: "inline-flex items-center rounded-full border bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground", children: DIALECT_LABEL[dialect] ?? dialect }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [tables.length, " ", tables.length === 1 ? "table" : "tables"] })] }), _jsxs("div", { className: "flex min-h-0 flex-1", children: [_jsx("aside", { className: "w-[260px] shrink-0 border-r", children: showInitialLoading ? (_jsx(SidebarSkeleton, {})) : (_jsx(TableBrowser, { tables: tables, selected: selectedTable, onSelect: (t) => {
55
+ setSelectedTable(t);
56
+ setFkFilters(undefined);
57
+ }, mode: mode, onModeChange: setMode })) }), _jsx("main", { className: "min-w-0 flex-1 overflow-hidden", children: showInitialLoading ? (_jsx(MainLoading, {})) : mode === "sql" ? (_jsx(SqlEditor, { dialect: dialect, tableNames: tableNames, columnsByTable: columnsByTable })) : selectedTable ? (_jsx(TableEditor, { table: selectedTable, dialect: dialect, initialFilters: fkFilters, onNavigateToRow: (t, filters) => {
58
+ setSelectedTable(t);
59
+ setMode("table");
60
+ setFkFilters(filters);
61
+ } }, selectedTable)) : (_jsx(NoTableSelected, {})) })] })] }));
62
+ }
63
+ function SidebarSkeleton() {
64
+ return (_jsxs("div", { className: "flex h-full flex-col bg-card p-2", children: [_jsx("div", { className: "mb-2 h-9 animate-pulse rounded-md bg-muted" }), _jsx("div", { className: "mb-3 h-9 animate-pulse rounded-md bg-muted" }), _jsx("div", { className: "space-y-1.5", children: Array.from({ length: 8 }).map((_, i) => (_jsx("div", { className: "h-8 animate-pulse rounded-md bg-muted", style: { opacity: 1 - i * 0.08 } }, i))) })] }));
65
+ }
66
+ function MainLoading() {
67
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(IconLoader2, { className: cn("h-5 w-5 animate-spin text-muted-foreground") }) }));
68
+ }
69
+ function NoTableSelected() {
70
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center p-6 text-center", children: _jsxs("div", { className: "flex flex-col items-center", children: [_jsx(IconDatabase, { className: "mb-3 h-8 w-8 text-muted-foreground/50", stroke: 1.5 }), _jsx("p", { className: "text-sm font-medium text-foreground", children: "No table selected" }), _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: "Pick a table from the sidebar to browse and edit its rows." })] }) }));
71
+ }
72
+ //# sourceMappingURL=DbAdminPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbAdminPage.js","sourceRoot":"","sources":["../../../src/client/db-admin/DbAdminPage.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-mode database admin page — the shell that hosts the table browser, the\n * table editor, and the SQL editor.\n *\n * Gated to development mode: when the app is not running in a dev environment\n * (`canToggle` is false) we render a clean notice instead of the tool. The\n * backend also enforces this with a 403, so this is purely a friendlier UX.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport { IconDatabase, IconLoader2 } from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { useDevMode } from \"../use-dev-mode.js\";\nimport type { DbAdminFilter, DbAdminColumn } from \"../../db-admin/types.js\";\nimport { useOverview } from \"./useDbAdmin.js\";\nimport { TableBrowser } from \"./TableBrowser.js\";\nimport { useDbAdminAgentSync, useNavigateConsumer } from \"./useAgentSync.js\";\nimport { TableEditor } from \"./TableEditor.js\";\nimport { SqlEditor } from \"./SqlEditor.js\";\n\nconst DIALECT_LABEL: Record<string, string> = {\n postgres: \"Postgres\",\n sqlite: \"SQLite\",\n d1: \"Cloudflare D1\",\n};\n\nexport function DbAdminPage() {\n const { canToggle, isLoading: devLoading } = useDevMode();\n const { data: overview, isLoading: overviewLoading } = useOverview();\n\n const [selectedTable, setSelectedTable] = useState<string | null>(null);\n const [mode, setMode] = useState<\"table\" | \"sql\">(\"table\");\n const [fkFilters, setFkFilters] = useState<DbAdminFilter[] | undefined>(\n undefined,\n );\n\n const tables = overview?.tables ?? [];\n const dialect = overview?.dialect ?? \"sqlite\";\n\n // Default selection to the first table once the overview loads.\n useEffect(() => {\n if (selectedTable === null && tables.length > 0) {\n setSelectedTable(tables[0].name);\n }\n }, [selectedTable, tables]);\n\n // Keep the agent's <current-screen> in sync, and let it drive navigation.\n useDbAdminAgentSync({ table: selectedTable, mode });\n useNavigateConsumer((table) => {\n setSelectedTable(table);\n setMode(\"table\");\n setFkFilters(undefined);\n });\n\n const tableNames = useMemo(() => tables.map((t) => t.name), [tables]);\n // SqlEditor degrades gracefully without per-table columns; pass an empty map.\n // (Table-name autocomplete still works; column autocomplete fills in lazily.)\n const columnsByTable = useMemo<Record<string, string[]>>(() => ({}), []);\n\n // ─── Dev gate ──────────────────────────────────────────────────────────\n if (!devLoading && !canToggle) {\n return (\n <div className=\"flex h-full w-full items-center justify-center bg-background p-6\">\n <div className=\"flex max-w-md flex-col items-center rounded-lg border bg-card p-8 text-center shadow-sm\">\n <div className=\"mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <IconDatabase\n className=\"h-6 w-6 text-muted-foreground\"\n stroke={1.75}\n />\n </div>\n <h2 className=\"text-base font-semibold text-foreground\">\n Development mode only\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">\n Database admin is available in development mode only.\n </p>\n </div>\n </div>\n );\n }\n\n const showInitialLoading = (devLoading || overviewLoading) && !overview;\n\n return (\n <div className=\"flex h-full w-full flex-col bg-background text-foreground\">\n {/* Header */}\n <header className=\"flex h-12 shrink-0 items-center gap-3 border-b px-4\">\n <IconDatabase className=\"h-5 w-5 text-muted-foreground\" stroke={1.75} />\n <span className=\"text-sm font-semibold\">Database</span>\n <span className=\"inline-flex items-center rounded-full border bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {DIALECT_LABEL[dialect] ?? dialect}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {tables.length} {tables.length === 1 ? \"table\" : \"tables\"}\n </span>\n </header>\n\n {/* Body: fixed sidebar + flexible main */}\n <div className=\"flex min-h-0 flex-1\">\n <aside className=\"w-[260px] shrink-0 border-r\">\n {showInitialLoading ? (\n <SidebarSkeleton />\n ) : (\n <TableBrowser\n tables={tables}\n selected={selectedTable}\n onSelect={(t) => {\n setSelectedTable(t);\n setFkFilters(undefined);\n }}\n mode={mode}\n onModeChange={setMode}\n />\n )}\n </aside>\n\n <main className=\"min-w-0 flex-1 overflow-hidden\">\n {showInitialLoading ? (\n <MainLoading />\n ) : mode === \"sql\" ? (\n <SqlEditor\n dialect={dialect}\n tableNames={tableNames}\n columnsByTable={columnsByTable}\n />\n ) : selectedTable ? (\n <TableEditor\n key={selectedTable}\n table={selectedTable}\n dialect={dialect}\n initialFilters={fkFilters}\n onNavigateToRow={(t, filters) => {\n setSelectedTable(t);\n setMode(\"table\");\n setFkFilters(filters);\n }}\n />\n ) : (\n <NoTableSelected />\n )}\n </main>\n </div>\n </div>\n );\n}\n\nfunction SidebarSkeleton() {\n return (\n <div className=\"flex h-full flex-col bg-card p-2\">\n <div className=\"mb-2 h-9 animate-pulse rounded-md bg-muted\" />\n <div className=\"mb-3 h-9 animate-pulse rounded-md bg-muted\" />\n <div className=\"space-y-1.5\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div\n key={i}\n className=\"h-8 animate-pulse rounded-md bg-muted\"\n style={{ opacity: 1 - i * 0.08 }}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction MainLoading() {\n return (\n <div className=\"flex h-full w-full items-center justify-center\">\n <IconLoader2\n className={cn(\"h-5 w-5 animate-spin text-muted-foreground\")}\n />\n </div>\n );\n}\n\nfunction NoTableSelected() {\n return (\n <div className=\"flex h-full w-full items-center justify-center p-6 text-center\">\n <div className=\"flex flex-col items-center\">\n <IconDatabase\n className=\"mb-3 h-8 w-8 text-muted-foreground/50\"\n stroke={1.5}\n />\n <p className=\"text-sm font-medium text-foreground\">No table selected</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Pick a table from the sidebar to browse and edit its rows.\n </p>\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,19 @@
1
+ export interface DevDatabaseLinkProps {
2
+ className?: string;
3
+ /** Route path for the DB admin page. Defaults to `/database`. */
4
+ to?: string;
5
+ }
6
+ /**
7
+ * Development-only entry point to the database admin.
8
+ *
9
+ * Renders a compact footer link (designed to sit next to `FeedbackButton` /
10
+ * `OrgSwitcher` in a template's sidebar footer) ONLY when the app is running in
11
+ * a development environment (`useDevMode().canToggle`). In production it renders
12
+ * nothing, so it is safe to drop into every template's chrome unconditionally.
13
+ *
14
+ * The page it links to (`/database`) and its backing routes are independently
15
+ * gated to `NODE_ENV === "development"` on the server, so this is purely a
16
+ * convenience affordance — never a security boundary.
17
+ */
18
+ export declare function DevDatabaseLink({ className, to, }: DevDatabaseLinkProps): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=DevDatabaseLink.d.ts.map