@invect/version-control 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +78 -0
  2. package/dist/backend/flow-serializer.d.ts.map +1 -1
  3. package/dist/backend/index.cjs +209 -48
  4. package/dist/backend/index.cjs.map +1 -1
  5. package/dist/backend/index.d.cts +8 -3
  6. package/dist/backend/index.d.cts.map +1 -1
  7. package/dist/backend/index.d.mts +8 -3
  8. package/dist/backend/index.d.mts.map +1 -1
  9. package/dist/backend/index.mjs +208 -47
  10. package/dist/backend/index.mjs.map +1 -1
  11. package/dist/backend/plugin.d.ts +2 -2
  12. package/dist/backend/plugin.d.ts.map +1 -1
  13. package/dist/backend/sync-service.d.ts.map +1 -1
  14. package/dist/backend/types.d.ts +5 -0
  15. package/dist/backend/types.d.ts.map +1 -1
  16. package/dist/backend/validation.d.ts +19 -0
  17. package/dist/backend/validation.d.ts.map +1 -0
  18. package/dist/frontend/components/ConnectFlowForm.d.ts +10 -0
  19. package/dist/frontend/components/ConnectFlowForm.d.ts.map +1 -0
  20. package/dist/frontend/components/VcHeaderButton.d.ts +8 -0
  21. package/dist/frontend/components/VcHeaderButton.d.ts.map +1 -0
  22. package/dist/frontend/components/VcSyncPanel.d.ts +10 -0
  23. package/dist/frontend/components/VcSyncPanel.d.ts.map +1 -0
  24. package/dist/frontend/hooks/useFlowSync.d.ts +37 -0
  25. package/dist/frontend/hooks/useFlowSync.d.ts.map +1 -0
  26. package/dist/frontend/index.cjs +717 -0
  27. package/dist/frontend/index.cjs.map +1 -0
  28. package/dist/frontend/index.d.cts +43 -2
  29. package/dist/frontend/index.d.cts.map +1 -0
  30. package/dist/frontend/index.d.mts +43 -2
  31. package/dist/frontend/index.d.mts.map +1 -0
  32. package/dist/frontend/index.d.ts +9 -0
  33. package/dist/frontend/index.d.ts.map +1 -1
  34. package/dist/frontend/index.mjs +705 -1
  35. package/dist/frontend/index.mjs.map +1 -0
  36. package/dist/providers/github.d.cts +1 -1
  37. package/dist/providers/github.d.mts +1 -1
  38. package/dist/shared/types.cjs +19 -0
  39. package/dist/shared/types.cjs.map +1 -0
  40. package/dist/shared/types.d.cts +2 -2
  41. package/dist/shared/types.d.mts +2 -2
  42. package/dist/shared/types.d.ts +4 -2
  43. package/dist/shared/types.d.ts.map +1 -1
  44. package/dist/shared/types.mjs +17 -1
  45. package/dist/shared/types.mjs.map +1 -0
  46. package/dist/{types-B32wGtx7.d.cts → types-DACJdSjJ.d.mts} +6 -4
  47. package/dist/types-DACJdSjJ.d.mts.map +1 -0
  48. package/dist/{types-B7fFBAOX.d.mts → types-DDMnbS1q.d.cts} +6 -4
  49. package/dist/types-DDMnbS1q.d.cts.map +1 -0
  50. package/package.json +31 -4
  51. package/dist/types-B32wGtx7.d.cts.map +0 -1
  52. package/dist/types-B7fFBAOX.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/frontend/hooks/useFlowSync.ts","../../src/frontend/components/ConnectFlowForm.tsx","../../src/frontend/components/VcSyncPanel.tsx","../../src/frontend/components/VcHeaderButton.tsx","../../src/frontend/index.ts"],"sourcesContent":["/**\n * useFlowSync — React Query hooks for version control sync operations\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useApiClient } from '@invect/ui';\nimport type {\n VcFlowSyncStatus,\n VcSyncHistoryRecord,\n VcSyncResult,\n VcSyncConfig,\n ConfigureSyncInput,\n} from '../../shared/types';\n\nexport const vcQueryKeys = {\n syncStatus: (flowId: string) => ['vc', 'sync-status', flowId] as const,\n syncHistory: (flowId: string) => ['vc', 'sync-history', flowId] as const,\n syncedFlows: () => ['vc', 'synced-flows'] as const,\n};\n\n/** Fetch sync status for a flow */\nexport function useFlowSyncStatus(flowId: string | undefined) {\n const api = useApiClient();\n\n return useQuery<VcFlowSyncStatus>({\n queryKey: vcQueryKeys.syncStatus(flowId ?? ''),\n queryFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/status`,\n { credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch sync status: ${response.status}`);\n }\n return response.json();\n },\n enabled: !!flowId,\n });\n}\n\n/** Fetch sync history for a flow */\nexport function useFlowSyncHistory(flowId: string | undefined) {\n const api = useApiClient();\n\n return useQuery<{ flowId: string; history: VcSyncHistoryRecord[] }>({\n queryKey: vcQueryKeys.syncHistory(flowId ?? ''),\n queryFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/history?limit=20`,\n { credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch sync history: ${response.status}`);\n }\n return response.json();\n },\n enabled: !!flowId,\n });\n}\n\n/** List all synced flows */\nexport function useSyncedFlows() {\n const api = useApiClient();\n\n return useQuery<{ flows: Array<VcSyncConfig & { flowName: string }> }>({\n queryKey: vcQueryKeys.syncedFlows(),\n queryFn: async () => {\n const response = await fetch(`${api.getBaseURL()}/plugins/version-control/vc/flows`, {\n credentials: 'include',\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch synced flows: ${response.status}`);\n }\n return response.json();\n },\n });\n}\n\n/** Push a flow to remote */\nexport function usePushFlow(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncResult>({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/push`,\n { method: 'POST', credentials: 'include' },\n );\n if (!response.ok && response.status !== 409) {\n throw new Error(`Push failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncHistory(flowId) });\n },\n });\n}\n\n/** Pull a flow from remote */\nexport function usePullFlow(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncResult>({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/pull`,\n { method: 'POST', credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Pull failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncHistory(flowId) });\n },\n });\n}\n\n/** Force push (local wins) */\nexport function useForcePushFlow(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncResult>({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/force-push`,\n { method: 'POST', credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Force push failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncHistory(flowId) });\n },\n });\n}\n\n/** Force pull (remote wins) */\nexport function useForcePullFlow(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncResult>({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/force-pull`,\n { method: 'POST', credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Force pull failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncHistory(flowId) });\n },\n });\n}\n\n/** Publish flow (pr-per-publish mode) */\nexport function usePublishFlow(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncResult>({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/publish`,\n { method: 'POST', credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Publish failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncHistory(flowId) });\n },\n });\n}\n\n/** Configure sync for a flow */\nexport function useConfigureSync(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation<VcSyncConfig, Error, ConfigureSyncInput>({\n mutationFn: async (input) => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/configure`,\n {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n },\n );\n if (!response.ok) {\n const err = await response.json().catch(() => ({}));\n throw new Error(err.error || `Configure failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncedFlows() });\n },\n });\n}\n\n/** Disconnect sync for a flow */\nexport function useDisconnectSync(flowId: string) {\n const api = useApiClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async () => {\n const response = await fetch(\n `${api.getBaseURL()}/plugins/version-control/vc/flows/${flowId}/disconnect`,\n { method: 'DELETE', credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`Disconnect failed: ${response.status}`);\n }\n return response.json();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncStatus(flowId) });\n queryClient.invalidateQueries({ queryKey: vcQueryKeys.syncedFlows() });\n },\n });\n}\n","/**\n * ConnectFlowForm — Form to configure version control sync for a flow.\n */\n\nimport { useState } from 'react';\nimport { GitBranch, X } from 'lucide-react';\nimport { useConfigureSync } from '../hooks/useFlowSync';\nimport type { VcSyncMode, VcSyncDirection } from '../../shared/types';\n\ninterface ConnectFlowFormProps {\n flowId: string;\n onCancel: () => void;\n}\n\nexport function ConnectFlowForm({ flowId, onCancel }: ConnectFlowFormProps) {\n const configureMutation = useConfigureSync(flowId);\n const [repo, setRepo] = useState('');\n const [branch, setBranch] = useState('main');\n const [filePath, setFilePath] = useState('');\n const [mode, setMode] = useState<VcSyncMode>('direct-commit');\n const [syncDirection, setSyncDirection] = useState<VcSyncDirection>('push');\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n configureMutation.mutate(\n {\n repo: repo || undefined,\n branch: branch || undefined,\n filePath: filePath || undefined,\n mode,\n syncDirection,\n },\n { onSuccess: onCancel },\n );\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <GitBranch className=\"h-4 w-4 text-imp-muted-foreground\" />\n <h3 className=\"text-sm font-medium\">Connect to Git</h3>\n </div>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-imp-muted-foreground hover:text-imp-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs text-imp-muted-foreground\">\n Repository (optional — uses plugin default)\n </label>\n <input\n type=\"text\"\n value={repo}\n onChange={(e) => setRepo(e.target.value)}\n placeholder=\"owner/repo\"\n className=\"w-full rounded-md border border-imp-border bg-imp-background px-2.5 py-1.5 text-sm placeholder:text-imp-muted-foreground focus:border-imp-primary focus:outline-none\"\n />\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs text-imp-muted-foreground\">Branch</label>\n <input\n type=\"text\"\n value={branch}\n onChange={(e) => setBranch(e.target.value)}\n placeholder=\"main\"\n className=\"w-full rounded-md border border-imp-border bg-imp-background px-2.5 py-1.5 text-sm placeholder:text-imp-muted-foreground focus:border-imp-primary focus:outline-none\"\n />\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs text-imp-muted-foreground\">\n File path (optional — auto-generated from flow name)\n </label>\n <input\n type=\"text\"\n value={filePath}\n onChange={(e) => setFilePath(e.target.value)}\n placeholder=\"workflows/my-flow.flow.ts\"\n className=\"w-full rounded-md border border-imp-border bg-imp-background px-2.5 py-1.5 text-sm font-mono placeholder:text-imp-muted-foreground focus:border-imp-primary focus:outline-none\"\n />\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs text-imp-muted-foreground\">Sync Mode</label>\n <select\n value={mode}\n onChange={(e) => setMode(e.target.value as VcSyncMode)}\n className=\"w-full rounded-md border border-imp-border bg-imp-background px-2.5 py-1.5 text-sm focus:border-imp-primary focus:outline-none\"\n >\n <option value=\"direct-commit\">Direct Commit</option>\n <option value=\"pr-per-save\">PR per Save</option>\n <option value=\"pr-per-publish\">PR per Publish</option>\n </select>\n </div>\n\n <div>\n <label className=\"mb-1 block text-xs text-imp-muted-foreground\">Sync Direction</label>\n <select\n value={syncDirection}\n onChange={(e) => setSyncDirection(e.target.value as VcSyncDirection)}\n className=\"w-full rounded-md border border-imp-border bg-imp-background px-2.5 py-1.5 text-sm focus:border-imp-primary focus:outline-none\"\n >\n <option value=\"push\">Push (Invect → Git)</option>\n <option value=\"pull\">Pull (Git → Invect)</option>\n <option value=\"bidirectional\">Bidirectional</option>\n </select>\n </div>\n\n {configureMutation.error && (\n <div className=\"rounded-md border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-600\">\n {configureMutation.error.message}\n </div>\n )}\n\n <div className=\"flex gap-2 pt-1\">\n <button\n type=\"submit\"\n disabled={configureMutation.isPending}\n className=\"flex-1 rounded-md bg-imp-primary px-3 py-1.5 text-sm font-medium text-imp-primary-foreground hover:bg-imp-primary/90 disabled:opacity-50\"\n >\n {configureMutation.isPending ? 'Connecting...' : 'Connect'}\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-md border border-imp-border px-3 py-1.5 text-sm font-medium hover:bg-imp-muted\"\n >\n Cancel\n </button>\n </div>\n </form>\n );\n}\n","/**\n * VcSyncPanel — Panel tab for the flow editor.\n *\n * Shows sync status, push/pull controls, and recent sync history\n * for the current flow. Registered as a panelTab contribution\n * for the 'flowEditor' context.\n */\n\nimport { useState } from 'react';\nimport {\n GitBranch,\n ArrowUpFromLine,\n ArrowDownToLine,\n Clock,\n CheckCircle2,\n AlertTriangle,\n XCircle,\n ExternalLink,\n Unplug,\n Send,\n} from 'lucide-react';\nimport {\n useFlowSyncStatus,\n useFlowSyncHistory,\n usePushFlow,\n usePullFlow,\n useForcePushFlow,\n useForcePullFlow,\n usePublishFlow,\n useDisconnectSync,\n} from '../hooks/useFlowSync';\nimport { ConnectFlowForm } from './ConnectFlowForm';\nimport type { PanelTabProps } from '@invect/ui';\nimport type { VcSyncStatus } from '../../shared/types';\n\nexport function VcSyncPanel({ flowId }: PanelTabProps) {\n const { data, isLoading, error } = useFlowSyncStatus(flowId);\n const { data: historyData } = useFlowSyncHistory(flowId);\n const pushMutation = usePushFlow(flowId);\n const pullMutation = usePullFlow(flowId);\n const forcePushMutation = useForcePushFlow(flowId);\n const forcePullMutation = useForcePullFlow(flowId);\n const publishMutation = usePublishFlow(flowId);\n const disconnectMutation = useDisconnectSync(flowId);\n const [showConnect, setShowConnect] = useState(false);\n const [showConflictActions, setShowConflictActions] = useState(false);\n\n const isBusy =\n pushMutation.isPending ||\n pullMutation.isPending ||\n forcePushMutation.isPending ||\n forcePullMutation.isPending ||\n publishMutation.isPending ||\n disconnectMutation.isPending;\n\n if (isLoading) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <span className=\"text-sm text-imp-muted-foreground\">Loading sync status...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <span className=\"text-sm text-red-500\">\n {error instanceof Error ? error.message : 'Failed to load sync status'}\n </span>\n </div>\n );\n }\n\n const status = data?.status ?? 'not-connected';\n const config = data?.config;\n const history = historyData?.history ?? [];\n\n // Not connected — show connect form\n if (status === 'not-connected' || !config) {\n if (showConnect) {\n return (\n <div className=\"flex h-full flex-col p-4\">\n <ConnectFlowForm flowId={flowId} onCancel={() => setShowConnect(false)} />\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-4\">\n <GitBranch className=\"h-8 w-8 text-imp-muted-foreground/50\" />\n <p className=\"text-sm text-imp-muted-foreground\">Not connected to version control</p>\n <button\n onClick={() => setShowConnect(true)}\n className=\"rounded-md bg-imp-primary px-3 py-1.5 text-sm font-medium text-imp-primary-foreground hover:bg-imp-primary/90\"\n >\n Connect to Git\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col p-4\">\n {/* Status header */}\n <div className=\"mb-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <GitBranch className=\"h-4 w-4 text-imp-muted-foreground\" />\n <h3 className=\"text-sm font-medium\">Version Control</h3>\n </div>\n <StatusBadge status={status} />\n </div>\n\n {/* Config info */}\n <div className=\"mb-4 space-y-1 rounded-md border border-imp-border bg-imp-muted/30 p-3 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">Repo</span>\n <span className=\"font-mono\">{config.repo}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">Branch</span>\n <span className=\"font-mono\">{config.branch}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">File</span>\n <span className=\"font-mono truncate max-w-[180px]\" title={config.filePath}>\n {config.filePath}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">Mode</span>\n <span>{config.mode}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">Direction</span>\n <span>{config.syncDirection}</span>\n </div>\n {config.activePrUrl && (\n <div className=\"flex justify-between\">\n <span className=\"text-imp-muted-foreground\">Active PR</span>\n <a\n href={config.activePrUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-imp-primary hover:underline\"\n >\n #{config.activePrNumber}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n )}\n </div>\n\n {/* Action buttons */}\n <div className=\"mb-4 flex gap-2\">\n {config.syncDirection !== 'pull' && (\n <button\n onClick={() => pushMutation.mutate()}\n disabled={isBusy}\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md border border-imp-border bg-imp-background px-3 py-1.5 text-xs font-medium hover:bg-imp-muted disabled:opacity-50\"\n >\n <ArrowUpFromLine className=\"h-3.5 w-3.5\" />\n Push\n </button>\n )}\n {config.syncDirection !== 'push' && (\n <button\n onClick={() => pullMutation.mutate()}\n disabled={isBusy}\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md border border-imp-border bg-imp-background px-3 py-1.5 text-xs font-medium hover:bg-imp-muted disabled:opacity-50\"\n >\n <ArrowDownToLine className=\"h-3.5 w-3.5\" />\n Pull\n </button>\n )}\n {config.mode === 'pr-per-publish' && config.syncDirection !== 'pull' && (\n <button\n onClick={() => publishMutation.mutate()}\n disabled={isBusy}\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md bg-imp-primary px-3 py-1.5 text-xs font-medium text-imp-primary-foreground hover:bg-imp-primary/90 disabled:opacity-50\"\n >\n <Send className=\"h-3.5 w-3.5\" />\n Publish\n </button>\n )}\n </div>\n\n {/* Conflict resolution */}\n {status === 'conflict' && (\n <div className=\"mb-4 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3\">\n <p className=\"mb-2 text-xs font-medium text-yellow-600\">\n Conflict detected — remote file has changed.\n </p>\n {!showConflictActions ? (\n <button\n onClick={() => setShowConflictActions(true)}\n className=\"text-xs text-yellow-600 underline hover:text-yellow-700\"\n >\n Resolve conflict...\n </button>\n ) : (\n <div className=\"flex gap-2\">\n <button\n onClick={() => forcePushMutation.mutate()}\n disabled={isBusy}\n className=\"flex-1 rounded-md border border-yellow-500/30 px-2 py-1 text-xs font-medium hover:bg-yellow-500/20 disabled:opacity-50\"\n >\n Force Push (local wins)\n </button>\n <button\n onClick={() => forcePullMutation.mutate()}\n disabled={isBusy}\n className=\"flex-1 rounded-md border border-yellow-500/30 px-2 py-1 text-xs font-medium hover:bg-yellow-500/20 disabled:opacity-50\"\n >\n Force Pull (remote wins)\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Mutation feedback */}\n {(pushMutation.data ||\n pullMutation.data ||\n publishMutation.data ||\n forcePushMutation.data ||\n forcePullMutation.data) && (\n <MutationResult\n result={\n pushMutation.data ??\n pullMutation.data ??\n publishMutation.data ??\n forcePushMutation.data ??\n forcePullMutation.data ??\n null\n }\n />\n )}\n {(pushMutation.error ||\n pullMutation.error ||\n publishMutation.error ||\n forcePushMutation.error ||\n forcePullMutation.error ||\n disconnectMutation.error) && (\n <div className=\"mb-3 rounded-md border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-600\">\n {\n (\n pushMutation.error ??\n pullMutation.error ??\n publishMutation.error ??\n forcePushMutation.error ??\n forcePullMutation.error ??\n disconnectMutation.error\n )?.message\n }\n </div>\n )}\n\n {/* Sync history */}\n <div className=\"flex items-center gap-2 mb-2\">\n <Clock className=\"h-3.5 w-3.5 text-imp-muted-foreground\" />\n <h4 className=\"text-xs font-medium text-imp-muted-foreground\">Recent History</h4>\n </div>\n\n <div className=\"flex-1 overflow-y-auto space-y-1\">\n {history.length === 0 ? (\n <p className=\"text-xs text-imp-muted-foreground\">No sync history yet</p>\n ) : (\n history.slice(0, 10).map((entry) => (\n <div\n key={entry.id}\n className=\"flex items-start gap-2 rounded-md px-2 py-1.5 bg-imp-muted/20 text-xs\"\n >\n <ActionIcon action={entry.action} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate\">{entry.message ?? entry.action}</p>\n <p className=\"text-imp-muted-foreground\">\n {new Date(entry.createdAt).toLocaleString()}\n {entry.commitSha && (\n <span className=\"ml-1 font-mono\">{entry.commitSha.slice(0, 7)}</span>\n )}\n </p>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* Disconnect */}\n <div className=\"mt-3 border-t border-imp-border pt-3\">\n <button\n onClick={() => {\n if (window.confirm('Disconnect this flow from version control?')) {\n disconnectMutation.mutate();\n }\n }}\n disabled={isBusy}\n className=\"flex items-center gap-1.5 text-xs text-imp-muted-foreground hover:text-red-500 disabled:opacity-50\"\n >\n <Unplug className=\"h-3.5 w-3.5\" />\n Disconnect\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction StatusBadge({ status }: { status: VcSyncStatus }) {\n const styles: Record<VcSyncStatus, string> = {\n synced: 'border-green-500/30 bg-green-500/10 text-green-600',\n pending: 'border-yellow-500/30 bg-yellow-500/10 text-yellow-600',\n conflict: 'border-red-500/30 bg-red-500/10 text-red-600',\n 'not-connected': 'border-imp-border bg-imp-muted text-imp-muted-foreground',\n error: 'border-red-500/30 bg-red-500/10 text-red-600',\n };\n\n const icons: Record<VcSyncStatus, React.ReactNode> = {\n synced: <CheckCircle2 className=\"h-3 w-3\" />,\n pending: <Clock className=\"h-3 w-3\" />,\n conflict: <AlertTriangle className=\"h-3 w-3\" />,\n 'not-connected': null,\n error: <XCircle className=\"h-3 w-3\" />,\n };\n\n return (\n <span\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium ${styles[status]}`}\n >\n {icons[status]}\n {status}\n </span>\n );\n}\n\nfunction ActionIcon({ action }: { action: string }) {\n switch (action) {\n case 'push':\n return <ArrowUpFromLine className=\"mt-0.5 h-3 w-3 text-blue-500 shrink-0\" />;\n case 'pull':\n return <ArrowDownToLine className=\"mt-0.5 h-3 w-3 text-green-500 shrink-0\" />;\n case 'pr-created':\n return <GitBranch className=\"mt-0.5 h-3 w-3 text-purple-500 shrink-0\" />;\n case 'pr-merged':\n return <CheckCircle2 className=\"mt-0.5 h-3 w-3 text-green-600 shrink-0\" />;\n case 'conflict':\n return <AlertTriangle className=\"mt-0.5 h-3 w-3 text-yellow-500 shrink-0\" />;\n default:\n return <Clock className=\"mt-0.5 h-3 w-3 text-imp-muted-foreground shrink-0\" />;\n }\n}\n\nfunction MutationResult({\n result,\n}: {\n result: {\n success: boolean;\n error?: string;\n prUrl?: string;\n prNumber?: number;\n commitSha?: string;\n } | null;\n}) {\n if (!result) {\n return null;\n }\n\n if (!result.success) {\n return (\n <div className=\"mb-3 rounded-md border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-600\">\n {result.error ?? 'Operation failed'}\n </div>\n );\n }\n\n return (\n <div className=\"mb-3 rounded-md border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600\">\n Success\n {result.commitSha && <span className=\"ml-1 font-mono\">({result.commitSha.slice(0, 7)})</span>}\n {result.prUrl && (\n <a\n href={result.prUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-1 underline hover:text-green-700\"\n >\n PR #{result.prNumber}\n </a>\n )}\n </div>\n );\n}\n","/**\n * VcHeaderButton — Header action for quick push/pull from the flow editor header.\n *\n * Shows sync status as an icon and provides one-click push/pull.\n */\n\nimport { GitBranch, ArrowUpFromLine, ArrowDownToLine, Loader2 } from 'lucide-react';\nimport { useFlowSyncStatus, usePushFlow, usePullFlow } from '../hooks/useFlowSync';\nimport type { HeaderActionProps } from '@invect/ui';\n\nexport function VcHeaderButton({ flowId }: HeaderActionProps) {\n if (!flowId) {\n return null;\n }\n\n return <VcHeaderButtonInner flowId={flowId} />;\n}\n\nfunction VcHeaderButtonInner({ flowId }: { flowId: string }) {\n const { data, isLoading } = useFlowSyncStatus(flowId);\n const pushMutation = usePushFlow(flowId);\n const pullMutation = usePullFlow(flowId);\n\n const status = data?.status;\n const config = data?.config;\n\n // Don't show if not connected\n if (!config || status === 'not-connected') {\n return null;\n }\n\n const isBusy = isLoading || pushMutation.isPending || pullMutation.isPending;\n const canPush = config.syncDirection !== 'pull';\n const canPull = config.syncDirection !== 'push';\n\n const statusColor =\n status === 'synced'\n ? 'text-green-500'\n : status === 'pending'\n ? 'text-yellow-500'\n : status === 'conflict'\n ? 'text-red-500'\n : 'text-imp-muted-foreground';\n\n return (\n <div className=\"flex items-center gap-1\">\n <span className={`${statusColor}`} title={`Sync: ${status}`}>\n <GitBranch className=\"h-4 w-4\" />\n </span>\n\n {canPush && (\n <button\n onClick={() => pushMutation.mutate()}\n disabled={isBusy}\n title=\"Push to remote\"\n className=\"rounded-md p-1 text-imp-muted-foreground hover:bg-imp-muted hover:text-imp-foreground disabled:opacity-50\"\n >\n {pushMutation.isPending ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <ArrowUpFromLine className=\"h-3.5 w-3.5\" />\n )}\n </button>\n )}\n\n {canPull && (\n <button\n onClick={() => pullMutation.mutate()}\n disabled={isBusy}\n title=\"Pull from remote\"\n className=\"rounded-md p-1 text-imp-muted-foreground hover:bg-imp-muted hover:text-imp-foreground disabled:opacity-50\"\n >\n {pullMutation.isPending ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <ArrowDownToLine className=\"h-3.5 w-3.5\" />\n )}\n </button>\n )}\n </div>\n );\n}\n","/**\n * @invect/version-control/ui — Frontend Plugin Entry Point\n *\n * Browser-safe entry point that exports the Version Control frontend plugin.\n * Import via: `import { vcFrontendPlugin } from '@invect/version-control/ui'`\n */\n\nimport { GitBranch } from 'lucide-react';\nimport { VcSyncPanel } from './components/VcSyncPanel';\nimport { VcHeaderButton } from './components/VcHeaderButton';\nimport type { InvectFrontendPlugin } from '@invect/ui';\n\n// ─────────────────────────────────────────────────────────────────────\n// Version Control Frontend Plugin Definition\n// ─────────────────────────────────────────────────────────────────────\n\nexport const vcFrontendPlugin: InvectFrontendPlugin = {\n id: 'version-control',\n name: 'Version Control',\n\n // ─── Panel Tabs ───\n panelTabs: [\n {\n context: 'flowEditor',\n label: 'Git Sync',\n icon: GitBranch,\n component: VcSyncPanel,\n },\n ],\n\n // ─── Header Actions ───\n headerActions: [\n {\n context: 'flowHeader',\n component: VcHeaderButton,\n },\n ],\n\n // ─── Component Implementations ───\n components: {\n 'vc.SyncPanel': VcSyncPanel as unknown as React.ComponentType<Record<string, unknown>>,\n 'vc.HeaderButton': VcHeaderButton as unknown as React.ComponentType<Record<string, unknown>>,\n },\n};\n\n// ─── Re-export types for frontend consumers ───\nexport type {\n VcSyncConfig,\n VcSyncHistoryRecord,\n VcFlowSyncStatus,\n VcSyncStatus,\n VcSyncMode,\n VcSyncDirection,\n VcSyncResult,\n ConfigureSyncInput,\n} from '../shared/types';\n\n// ─── Re-export hooks ───\nexport {\n useFlowSyncStatus,\n useFlowSyncHistory,\n useSyncedFlows,\n usePushFlow,\n usePullFlow,\n useForcePushFlow,\n useForcePullFlow,\n usePublishFlow,\n useConfigureSync,\n useDisconnectSync,\n vcQueryKeys,\n} from './hooks/useFlowSync';\n"],"mappings":";;;;;;;;;AAcA,MAAa,cAAc;CACzB,aAAa,WAAmB;EAAC;EAAM;EAAe;EAAO;CAC7D,cAAc,WAAmB;EAAC;EAAM;EAAgB;EAAO;CAC/D,mBAAmB,CAAC,MAAM,eAAe;CAC1C;;AAGD,SAAgB,kBAAkB,QAA4B;CAC5D,MAAM,MAAM,cAAc;AAE1B,QAAO,SAA2B;EAChC,UAAU,YAAY,WAAW,UAAU,GAAG;EAC9C,SAAS,YAAY;GACnB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,UAC/D,EAAE,aAAa,WAAW,CAC3B;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,gCAAgC,SAAS,SAAS;AAEpE,UAAO,SAAS,MAAM;;EAExB,SAAS,CAAC,CAAC;EACZ,CAAC;;;AAIJ,SAAgB,mBAAmB,QAA4B;CAC7D,MAAM,MAAM,cAAc;AAE1B,QAAO,SAA6D;EAClE,UAAU,YAAY,YAAY,UAAU,GAAG;EAC/C,SAAS,YAAY;GACnB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,oBAC/D,EAAE,aAAa,WAAW,CAC3B;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,iCAAiC,SAAS,SAAS;AAErE,UAAO,SAAS,MAAM;;EAExB,SAAS,CAAC,CAAC;EACZ,CAAC;;;AAIJ,SAAgB,iBAAiB;CAC/B,MAAM,MAAM,cAAc;AAE1B,QAAO,SAAgE;EACrE,UAAU,YAAY,aAAa;EACnC,SAAS,YAAY;GACnB,MAAM,WAAW,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,oCAAoC,EACnF,aAAa,WACd,CAAC;AACF,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,iCAAiC,SAAS,SAAS;AAErE,UAAO,SAAS,MAAM;;EAEzB,CAAC;;;AAIJ,SAAgB,YAAY,QAAgB;CAC1C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAA0B;EAC/B,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,QAC/D;IAAE,QAAQ;IAAQ,aAAa;IAAW,CAC3C;AACD,OAAI,CAAC,SAAS,MAAM,SAAS,WAAW,IACtC,OAAM,IAAI,MAAM,gBAAgB,SAAS,SAAS;AAEpD,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,YAAY,OAAO,EAAE,CAAC;;EAE/E,CAAC;;;AAIJ,SAAgB,YAAY,QAAgB;CAC1C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAA0B;EAC/B,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,QAC/D;IAAE,QAAQ;IAAQ,aAAa;IAAW,CAC3C;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,gBAAgB,SAAS,SAAS;AAEpD,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,YAAY,OAAO,EAAE,CAAC;;EAE/E,CAAC;;;AAIJ,SAAgB,iBAAiB,QAAgB;CAC/C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAA0B;EAC/B,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,cAC/D;IAAE,QAAQ;IAAQ,aAAa;IAAW,CAC3C;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,sBAAsB,SAAS,SAAS;AAE1D,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,YAAY,OAAO,EAAE,CAAC;;EAE/E,CAAC;;;AAIJ,SAAgB,iBAAiB,QAAgB;CAC/C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAA0B;EAC/B,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,cAC/D;IAAE,QAAQ;IAAQ,aAAa;IAAW,CAC3C;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,sBAAsB,SAAS,SAAS;AAE1D,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,YAAY,OAAO,EAAE,CAAC;;EAE/E,CAAC;;;AAIJ,SAAgB,eAAe,QAAgB;CAC7C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAA0B;EAC/B,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,WAC/D;IAAE,QAAQ;IAAQ,aAAa;IAAW,CAC3C;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,mBAAmB,SAAS,SAAS;AAEvD,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,YAAY,OAAO,EAAE,CAAC;;EAE/E,CAAC;;;AAIJ,SAAgB,iBAAiB,QAAgB;CAC/C,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAAqD;EAC1D,YAAY,OAAO,UAAU;GAC3B,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,aAC/D;IACE,QAAQ;IACR,aAAa;IACb,SAAS,EAAE,gBAAgB,oBAAoB;IAC/C,MAAM,KAAK,UAAU,MAAM;IAC5B,CACF;AACD,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,MAAM,MAAM,SAAS,MAAM,CAAC,aAAa,EAAE,EAAE;AACnD,UAAM,IAAI,MAAM,IAAI,SAAS,qBAAqB,SAAS,SAAS;;AAEtE,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,aAAa,EAAE,CAAC;;EAEzE,CAAC;;;AAIJ,SAAgB,kBAAkB,QAAgB;CAChD,MAAM,MAAM,cAAc;CAC1B,MAAM,cAAc,gBAAgB;AAEpC,QAAO,YAAY;EACjB,YAAY,YAAY;GACtB,MAAM,WAAW,MAAM,MACrB,GAAG,IAAI,YAAY,CAAC,oCAAoC,OAAO,cAC/D;IAAE,QAAQ;IAAU,aAAa;IAAW,CAC7C;AACD,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,sBAAsB,SAAS,SAAS;AAE1D,UAAO,SAAS,MAAM;;EAExB,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,YAAY,WAAW,OAAO,EAAE,CAAC;AAC3E,eAAY,kBAAkB,EAAE,UAAU,YAAY,aAAa,EAAE,CAAC;;EAEzE,CAAC;;;;;;;ACpOJ,SAAgB,gBAAgB,EAAE,QAAQ,YAAkC;CAC1E,MAAM,oBAAoB,iBAAiB,OAAO;CAClD,MAAM,CAAC,MAAM,WAAW,SAAS,GAAG;CACpC,MAAM,CAAC,QAAQ,aAAa,SAAS,OAAO;CAC5C,MAAM,CAAC,UAAU,eAAe,SAAS,GAAG;CAC5C,MAAM,CAAC,MAAM,WAAW,SAAqB,gBAAgB;CAC7D,MAAM,CAAC,eAAe,oBAAoB,SAA0B,OAAO;CAE3E,MAAM,gBAAgB,MAAuB;AAC3C,IAAE,gBAAgB;AAClB,oBAAkB,OAChB;GACE,MAAM,QAAQ,KAAA;GACd,QAAQ,UAAU,KAAA;GAClB,UAAU,YAAY,KAAA;GACtB;GACA;GACD,EACD,EAAE,WAAW,UAAU,CACxB;;AAGH,QACE,qBAAC,QAAD;EAAM,UAAU;EAAc,WAAU;YAAxC;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,WAAD,EAAW,WAAU,qCAAsC,CAAA,EAC3D,oBAAC,MAAD;MAAI,WAAU;gBAAsB;MAAmB,CAAA,CACnD;QACN,oBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;eAEV,oBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;KAClB,CAAA,CACL;;GAEN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;cAA+C;IAExD,CAAA,EACR,oBAAC,SAAD;IACE,MAAK;IACL,OAAO;IACP,WAAW,MAAM,QAAQ,EAAE,OAAO,MAAM;IACxC,aAAY;IACZ,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;cAA+C;IAAc,CAAA,EAC9E,oBAAC,SAAD;IACE,MAAK;IACL,OAAO;IACP,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM;IAC1C,aAAY;IACZ,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;cAA+C;IAExD,CAAA,EACR,oBAAC,SAAD;IACE,MAAK;IACL,OAAO;IACP,WAAW,MAAM,YAAY,EAAE,OAAO,MAAM;IAC5C,aAAY;IACZ,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;cAA+C;IAAiB,CAAA,EACjF,qBAAC,UAAD;IACE,OAAO;IACP,WAAW,MAAM,QAAQ,EAAE,OAAO,MAAoB;IACtD,WAAU;cAHZ;KAKE,oBAAC,UAAD;MAAQ,OAAM;gBAAgB;MAAsB,CAAA;KACpD,oBAAC,UAAD;MAAQ,OAAM;gBAAc;MAAoB,CAAA;KAChD,oBAAC,UAAD;MAAQ,OAAM;gBAAiB;MAAuB,CAAA;KAC/C;MACL,EAAA,CAAA;GAEN,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,SAAD;IAAO,WAAU;cAA+C;IAAsB,CAAA,EACtF,qBAAC,UAAD;IACE,OAAO;IACP,WAAW,MAAM,iBAAiB,EAAE,OAAO,MAAyB;IACpE,WAAU;cAHZ;KAKE,oBAAC,UAAD;MAAQ,OAAM;gBAAO;MAA4B,CAAA;KACjD,oBAAC,UAAD;MAAQ,OAAM;gBAAO;MAA4B,CAAA;KACjD,oBAAC,UAAD;MAAQ,OAAM;gBAAgB;MAAsB,CAAA;KAC7C;MACL,EAAA,CAAA;GAEL,kBAAkB,SACjB,oBAAC,OAAD;IAAK,WAAU;cACZ,kBAAkB,MAAM;IACrB,CAAA;GAGR,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,UAAD;KACE,MAAK;KACL,UAAU,kBAAkB;KAC5B,WAAU;eAET,kBAAkB,YAAY,kBAAkB;KAC1C,CAAA,EACT,oBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;eACX;KAEQ,CAAA,CACL;;GACD;;;;;;;;;;;;ACtGX,SAAgB,YAAY,EAAE,UAAyB;CACrD,MAAM,EAAE,MAAM,WAAW,UAAU,kBAAkB,OAAO;CAC5D,MAAM,EAAE,MAAM,gBAAgB,mBAAmB,OAAO;CACxD,MAAM,eAAe,YAAY,OAAO;CACxC,MAAM,eAAe,YAAY,OAAO;CACxC,MAAM,oBAAoB,iBAAiB,OAAO;CAClD,MAAM,oBAAoB,iBAAiB,OAAO;CAClD,MAAM,kBAAkB,eAAe,OAAO;CAC9C,MAAM,qBAAqB,kBAAkB,OAAO;CACpD,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,MAAM;CAErE,MAAM,SACJ,aAAa,aACb,aAAa,aACb,kBAAkB,aAClB,kBAAkB,aAClB,gBAAgB,aAChB,mBAAmB;AAErB,KAAI,UACF,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD;GAAM,WAAU;aAAoC;GAA6B,CAAA;EAC7E,CAAA;AAIV,KAAI,MACF,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD;GAAM,WAAU;aACb,iBAAiB,QAAQ,MAAM,UAAU;GACrC,CAAA;EACH,CAAA;CAIV,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,aAAa,WAAW,EAAE;AAG1C,KAAI,WAAW,mBAAmB,CAAC,QAAQ;AACzC,MAAI,YACF,QACE,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,iBAAD;IAAyB;IAAQ,gBAAgB,eAAe,MAAM;IAAI,CAAA;GACtE,CAAA;AAIV,SACE,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,WAAD,EAAW,WAAU,wCAAyC,CAAA;IAC9D,oBAAC,KAAD;KAAG,WAAU;eAAoC;KAAoC,CAAA;IACrF,oBAAC,UAAD;KACE,eAAe,eAAe,KAAK;KACnC,WAAU;eACX;KAEQ,CAAA;IACL;;;AAIV,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,WAAD,EAAW,WAAU,qCAAsC,CAAA,EAC3D,oBAAC,MAAD;MAAI,WAAU;gBAAsB;MAAoB,CAAA,CACpD;QACN,oBAAC,aAAD,EAAqB,QAAU,CAAA,CAC3B;;GAGN,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAW,CAAA,EACvD,oBAAC,QAAD;OAAM,WAAU;iBAAa,OAAO;OAAY,CAAA,CAC5C;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAa,CAAA,EACzD,oBAAC,QAAD;OAAM,WAAU;iBAAa,OAAO;OAAc,CAAA,CAC9C;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAW,CAAA,EACvD,oBAAC,QAAD;OAAM,WAAU;OAAmC,OAAO,OAAO;iBAC9D,OAAO;OACH,CAAA,CACH;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAW,CAAA,EACvD,oBAAC,QAAD,EAAA,UAAO,OAAO,MAAY,CAAA,CACtB;;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAgB,CAAA,EAC5D,oBAAC,QAAD,EAAA,UAAO,OAAO,eAAqB,CAAA,CAC/B;;KACL,OAAO,eACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAA4B;OAAgB,CAAA,EAC5D,qBAAC,KAAD;OACE,MAAM,OAAO;OACb,QAAO;OACP,KAAI;OACJ,WAAU;iBAJZ;QAKC;QACG,OAAO;QACT,oBAAC,cAAD,EAAc,WAAU,WAAY,CAAA;QAClC;SACA;;KAEJ;;GAGN,qBAAC,OAAD;IAAK,WAAU;cAAf;KACG,OAAO,kBAAkB,UACxB,qBAAC,UAAD;MACE,eAAe,aAAa,QAAQ;MACpC,UAAU;MACV,WAAU;gBAHZ,CAKE,oBAAC,iBAAD,EAAiB,WAAU,eAAgB,CAAA,EAAA,OAEpC;;KAEV,OAAO,kBAAkB,UACxB,qBAAC,UAAD;MACE,eAAe,aAAa,QAAQ;MACpC,UAAU;MACV,WAAU;gBAHZ,CAKE,oBAAC,iBAAD,EAAiB,WAAU,eAAgB,CAAA,EAAA,OAEpC;;KAEV,OAAO,SAAS,oBAAoB,OAAO,kBAAkB,UAC5D,qBAAC,UAAD;MACE,eAAe,gBAAgB,QAAQ;MACvC,UAAU;MACV,WAAU;gBAHZ,CAKE,oBAAC,MAAD,EAAM,WAAU,eAAgB,CAAA,EAAA,UAEzB;;KAEP;;GAGL,WAAW,cACV,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,KAAD;KAAG,WAAU;eAA2C;KAEpD,CAAA,EACH,CAAC,sBACA,oBAAC,UAAD;KACE,eAAe,uBAAuB,KAAK;KAC3C,WAAU;eACX;KAEQ,CAAA,GAET,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,UAAD;MACE,eAAe,kBAAkB,QAAQ;MACzC,UAAU;MACV,WAAU;gBACX;MAEQ,CAAA,EACT,oBAAC,UAAD;MACE,eAAe,kBAAkB,QAAQ;MACzC,UAAU;MACV,WAAU;gBACX;MAEQ,CAAA,CACL;OAEJ;;IAIN,aAAa,QACb,aAAa,QACb,gBAAgB,QAChB,kBAAkB,QAClB,kBAAkB,SAClB,oBAAC,gBAAD,EACE,QACE,aAAa,QACb,aAAa,QACb,gBAAgB,QAChB,kBAAkB,QAClB,kBAAkB,QAClB,MAEF,CAAA;IAEF,aAAa,SACb,aAAa,SACb,gBAAgB,SAChB,kBAAkB,SAClB,kBAAkB,SAClB,mBAAmB,UACnB,oBAAC,OAAD;IAAK,WAAU;eAGT,aAAa,SACb,aAAa,SACb,gBAAgB,SAChB,kBAAkB,SAClB,kBAAkB,SAClB,mBAAmB,QAClB;IAED,CAAA;GAIR,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD,EAAO,WAAU,yCAA0C,CAAA,EAC3D,oBAAC,MAAD;KAAI,WAAU;eAAgD;KAAmB,CAAA,CAC7E;;GAEN,oBAAC,OAAD;IAAK,WAAU;cACZ,QAAQ,WAAW,IAClB,oBAAC,KAAD;KAAG,WAAU;eAAoC;KAAuB,CAAA,GAExE,QAAQ,MAAM,GAAG,GAAG,CAAC,KAAK,UACxB,qBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,oBAAC,YAAD,EAAY,QAAQ,MAAM,QAAU,CAAA,EACpC,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,KAAD;OAAG,WAAU;iBAAY,MAAM,WAAW,MAAM;OAAW,CAAA,EAC3D,qBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,IAAI,KAAK,MAAM,UAAU,CAAC,gBAAgB,EAC1C,MAAM,aACL,oBAAC,QAAD;QAAM,WAAU;kBAAkB,MAAM,UAAU,MAAM,GAAG,EAAE;QAAQ,CAAA,CAErE;SACA;QACF;OAbC,MAAM,GAaP,CACN;IAEA,CAAA;GAGN,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,UAAD;KACE,eAAe;AACb,UAAI,OAAO,QAAQ,6CAA6C,CAC9D,oBAAmB,QAAQ;;KAG/B,UAAU;KACV,WAAU;eAPZ,CASE,oBAAC,QAAD,EAAQ,WAAU,eAAgB,CAAA,EAAA,aAE3B;;IACL,CAAA;GACF;;;AAQV,SAAS,YAAY,EAAE,UAAoC;CACzD,MAAM,SAAuC;EAC3C,QAAQ;EACR,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,OAAO;EACR;CAED,MAAM,QAA+C;EACnD,QAAQ,oBAAC,cAAD,EAAc,WAAU,WAAY,CAAA;EAC5C,SAAS,oBAAC,OAAD,EAAO,WAAU,WAAY,CAAA;EACtC,UAAU,oBAAC,eAAD,EAAe,WAAU,WAAY,CAAA;EAC/C,iBAAiB;EACjB,OAAO,oBAAC,SAAD,EAAS,WAAU,WAAY,CAAA;EACvC;AAED,QACE,qBAAC,QAAD;EACE,WAAW,sFAAsF,OAAO;YAD1G,CAGG,MAAM,SACN,OACI;;;AAIX,SAAS,WAAW,EAAE,UAA8B;AAClD,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,oBAAC,iBAAD,EAAiB,WAAU,yCAA0C,CAAA;EAC9E,KAAK,OACH,QAAO,oBAAC,iBAAD,EAAiB,WAAU,0CAA2C,CAAA;EAC/E,KAAK,aACH,QAAO,oBAAC,WAAD,EAAW,WAAU,2CAA4C,CAAA;EAC1E,KAAK,YACH,QAAO,oBAAC,cAAD,EAAc,WAAU,0CAA2C,CAAA;EAC5E,KAAK,WACH,QAAO,oBAAC,eAAD,EAAe,WAAU,2CAA4C,CAAA;EAC9E,QACE,QAAO,oBAAC,OAAD,EAAO,WAAU,qDAAsD,CAAA;;;AAIpF,SAAS,eAAe,EACtB,UASC;AACD,KAAI,CAAC,OACH,QAAO;AAGT,KAAI,CAAC,OAAO,QACV,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,OAAO,SAAS;EACb,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GAAuG;GAEpG,OAAO,aAAa,qBAAC,QAAD;IAAM,WAAU;cAAhB;KAAiC;KAAE,OAAO,UAAU,MAAM,GAAG,EAAE;KAAC;KAAQ;;GAC5F,OAAO,SACN,qBAAC,KAAD;IACE,MAAM,OAAO;IACb,QAAO;IACP,KAAI;IACJ,WAAU;cAJZ,CAKC,QACM,OAAO,SACV;;GAEF;;;;;;;;;;AC7XV,SAAgB,eAAe,EAAE,UAA6B;AAC5D,KAAI,CAAC,OACH,QAAO;AAGT,QAAO,oBAAC,qBAAD,EAA6B,QAAU,CAAA;;AAGhD,SAAS,oBAAoB,EAAE,UAA8B;CAC3D,MAAM,EAAE,MAAM,cAAc,kBAAkB,OAAO;CACrD,MAAM,eAAe,YAAY,OAAO;CACxC,MAAM,eAAe,YAAY,OAAO;CAExC,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,MAAM;AAGrB,KAAI,CAAC,UAAU,WAAW,gBACxB,QAAO;CAGT,MAAM,SAAS,aAAa,aAAa,aAAa,aAAa;CACnE,MAAM,UAAU,OAAO,kBAAkB;CACzC,MAAM,UAAU,OAAO,kBAAkB;AAWzC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,QAAD;IAAM,WAAW,GAVnB,WAAW,WACP,mBACA,WAAW,YACT,oBACA,WAAW,aACT,iBACA;IAI6B,OAAO,SAAS;cACjD,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA;IAC5B,CAAA;GAEN,WACC,oBAAC,UAAD;IACE,eAAe,aAAa,QAAQ;IACpC,UAAU;IACV,OAAM;IACN,WAAU;cAET,aAAa,YACZ,oBAAC,SAAD,EAAS,WAAU,4BAA6B,CAAA,GAEhD,oBAAC,iBAAD,EAAiB,WAAU,eAAgB,CAAA;IAEtC,CAAA;GAGV,WACC,oBAAC,UAAD;IACE,eAAe,aAAa,QAAQ;IACpC,UAAU;IACV,OAAM;IACN,WAAU;cAET,aAAa,YACZ,oBAAC,SAAD,EAAS,WAAU,4BAA6B,CAAA,GAEhD,oBAAC,iBAAD,EAAiB,WAAU,eAAgB,CAAA;IAEtC,CAAA;GAEP;;;;;;;;;;;AC/DV,MAAa,mBAAyC;CACpD,IAAI;CACJ,MAAM;CAGN,WAAW,CACT;EACE,SAAS;EACT,OAAO;EACP,MAAM;EACN,WAAW;EACZ,CACF;CAGD,eAAe,CACb;EACE,SAAS;EACT,WAAW;EACZ,CACF;CAGD,YAAY;EACV,gBAAgB;EAChB,mBAAmB;EACpB;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { t as GitProvider } from "../git-provider-CjMtpb86.cjs";
2
- import { n as GitProviderAuth } from "../types-B32wGtx7.cjs";
2
+ import { n as GitProviderAuth } from "../types-DDMnbS1q.cjs";
3
3
 
4
4
  //#region src/backend/github-provider.d.ts
5
5
  interface GitHubProviderOptions {
@@ -1,5 +1,5 @@
1
1
  import { t as GitProvider } from "../git-provider-BD8MMEXB.mjs";
2
- import { n as GitProviderAuth } from "../types-B7fFBAOX.mjs";
2
+ import { n as GitProviderAuth } from "../types-DACJdSjJ.mjs";
3
3
 
4
4
  //#region src/backend/github-provider.d.ts
5
5
  interface GitHubProviderOptions {
@@ -0,0 +1,19 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/shared/types.ts
3
+ /** Supported sync modes */
4
+ const VC_SYNC_MODES = [
5
+ "direct-commit",
6
+ "pr-per-save",
7
+ "pr-per-publish"
8
+ ];
9
+ /** Sync direction */
10
+ const VC_SYNC_DIRECTIONS = [
11
+ "push",
12
+ "pull",
13
+ "bidirectional"
14
+ ];
15
+ //#endregion
16
+ exports.VC_SYNC_DIRECTIONS = VC_SYNC_DIRECTIONS;
17
+ exports.VC_SYNC_MODES = VC_SYNC_MODES;
18
+
19
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","names":[],"sources":["../../src/shared/types.ts"],"sourcesContent":["// =============================================================================\n// Version Control Plugin — Shared Types (browser-safe, no runtime code)\n// =============================================================================\n\n/** Supported sync modes */\nexport const VC_SYNC_MODES = ['direct-commit', 'pr-per-save', 'pr-per-publish'] as const;\nexport type VcSyncMode = (typeof VC_SYNC_MODES)[number];\n\n/** Sync direction */\nexport const VC_SYNC_DIRECTIONS = ['push', 'pull', 'bidirectional'] as const;\nexport type VcSyncDirection = (typeof VC_SYNC_DIRECTIONS)[number];\n\n/** Sync history action types */\nexport type VcSyncAction = 'push' | 'pull' | 'pr-created' | 'pr-merged' | 'conflict';\n\n/** Status of a synced flow */\nexport type VcSyncStatus = 'synced' | 'pending' | 'conflict' | 'not-connected' | 'error';\n\n/** Git provider authentication config */\nexport type GitProviderAuth =\n | { type: 'token'; token: string }\n | { type: 'app'; appId: string; privateKey: string; installationId?: number }\n | { type: 'credential'; credentialId: string };\n\n/** Sync config record (mirrors vc_sync_config table) */\nexport interface VcSyncConfig {\n id: string;\n flowId: string;\n provider: string;\n repo: string;\n branch: string;\n filePath: string;\n mode: VcSyncMode;\n syncDirection: VcSyncDirection;\n lastSyncedAt: string | null;\n lastCommitSha: string | null;\n lastSyncedVersion: number | null;\n draftBranch: string | null;\n activePrNumber: number | null;\n activePrUrl: string | null;\n enabled: boolean;\n}\n\n/** Sync history record (mirrors vc_sync_history table) */\nexport interface VcSyncHistoryRecord {\n id: string;\n flowId: string;\n action: VcSyncAction;\n commitSha: string | null;\n prNumber: number | null;\n version: number | null;\n message: string | null;\n createdAt: string;\n createdBy: string | null;\n}\n\n/** Sync status response for a flow */\nexport interface VcFlowSyncStatus {\n flowId: string;\n status: VcSyncStatus;\n config: VcSyncConfig | null;\n lastSync: VcSyncHistoryRecord | null;\n}\n\n/** Configure sync request body */\nexport interface ConfigureSyncInput {\n repo?: string;\n branch?: string;\n filePath?: string;\n mode?: VcSyncMode;\n syncDirection?: VcSyncDirection;\n enabled?: boolean;\n}\n\n/** Push/pull result */\nexport interface VcSyncResult {\n success: boolean;\n commitSha?: string;\n prNumber?: number;\n prUrl?: string;\n error?: string;\n action: VcSyncAction;\n}\n"],"mappings":";;;AAKA,MAAa,gBAAgB;CAAC;CAAiB;CAAe;CAAiB;;AAI/E,MAAa,qBAAqB;CAAC;CAAQ;CAAQ;CAAgB"}
@@ -1,2 +1,2 @@
1
- import { a as VcSyncConfig, c as VcSyncMode, i as VcSyncAction, l as VcSyncResult, n as GitProviderAuth, o as VcSyncDirection, r as VcFlowSyncStatus, s as VcSyncHistoryRecord, t as ConfigureSyncInput, u as VcSyncStatus } from "../types-B32wGtx7.cjs";
2
- export { ConfigureSyncInput, GitProviderAuth, VcFlowSyncStatus, VcSyncAction, VcSyncConfig, VcSyncDirection, VcSyncHistoryRecord, VcSyncMode, VcSyncResult, VcSyncStatus };
1
+ import { a as VcFlowSyncStatus, c as VcSyncDirection, d as VcSyncResult, f as VcSyncStatus, i as VC_SYNC_MODES, l as VcSyncHistoryRecord, n as GitProviderAuth, o as VcSyncAction, r as VC_SYNC_DIRECTIONS, s as VcSyncConfig, t as ConfigureSyncInput, u as VcSyncMode } from "../types-DDMnbS1q.cjs";
2
+ export { ConfigureSyncInput, GitProviderAuth, VC_SYNC_DIRECTIONS, VC_SYNC_MODES, VcFlowSyncStatus, VcSyncAction, VcSyncConfig, VcSyncDirection, VcSyncHistoryRecord, VcSyncMode, VcSyncResult, VcSyncStatus };
@@ -1,2 +1,2 @@
1
- import { a as VcSyncConfig, c as VcSyncMode, i as VcSyncAction, l as VcSyncResult, n as GitProviderAuth, o as VcSyncDirection, r as VcFlowSyncStatus, s as VcSyncHistoryRecord, t as ConfigureSyncInput, u as VcSyncStatus } from "../types-B7fFBAOX.mjs";
2
- export { ConfigureSyncInput, GitProviderAuth, VcFlowSyncStatus, VcSyncAction, VcSyncConfig, VcSyncDirection, VcSyncHistoryRecord, VcSyncMode, VcSyncResult, VcSyncStatus };
1
+ import { a as VcFlowSyncStatus, c as VcSyncDirection, d as VcSyncResult, f as VcSyncStatus, i as VC_SYNC_MODES, l as VcSyncHistoryRecord, n as GitProviderAuth, o as VcSyncAction, r as VC_SYNC_DIRECTIONS, s as VcSyncConfig, t as ConfigureSyncInput, u as VcSyncMode } from "../types-DACJdSjJ.mjs";
2
+ export { ConfigureSyncInput, GitProviderAuth, VC_SYNC_DIRECTIONS, VC_SYNC_MODES, VcFlowSyncStatus, VcSyncAction, VcSyncConfig, VcSyncDirection, VcSyncHistoryRecord, VcSyncMode, VcSyncResult, VcSyncStatus };
@@ -1,7 +1,9 @@
1
1
  /** Supported sync modes */
2
- export type VcSyncMode = 'direct-commit' | 'pr-per-save' | 'pr-per-publish';
2
+ export declare const VC_SYNC_MODES: readonly ["direct-commit", "pr-per-save", "pr-per-publish"];
3
+ export type VcSyncMode = (typeof VC_SYNC_MODES)[number];
3
4
  /** Sync direction */
4
- export type VcSyncDirection = 'push' | 'pull' | 'bidirectional';
5
+ export declare const VC_SYNC_DIRECTIONS: readonly ["push", "pull", "bidirectional"];
6
+ export type VcSyncDirection = (typeof VC_SYNC_DIRECTIONS)[number];
5
7
  /** Sync history action types */
6
8
  export type VcSyncAction = 'push' | 'pull' | 'pr-created' | 'pr-merged' | 'conflict';
7
9
  /** Status of a synced flow */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1,17 @@
1
- export {};
1
+ //#region src/shared/types.ts
2
+ /** Supported sync modes */
3
+ const VC_SYNC_MODES = [
4
+ "direct-commit",
5
+ "pr-per-save",
6
+ "pr-per-publish"
7
+ ];
8
+ /** Sync direction */
9
+ const VC_SYNC_DIRECTIONS = [
10
+ "push",
11
+ "pull",
12
+ "bidirectional"
13
+ ];
14
+ //#endregion
15
+ export { VC_SYNC_DIRECTIONS, VC_SYNC_MODES };
16
+
17
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../../src/shared/types.ts"],"sourcesContent":["// =============================================================================\n// Version Control Plugin — Shared Types (browser-safe, no runtime code)\n// =============================================================================\n\n/** Supported sync modes */\nexport const VC_SYNC_MODES = ['direct-commit', 'pr-per-save', 'pr-per-publish'] as const;\nexport type VcSyncMode = (typeof VC_SYNC_MODES)[number];\n\n/** Sync direction */\nexport const VC_SYNC_DIRECTIONS = ['push', 'pull', 'bidirectional'] as const;\nexport type VcSyncDirection = (typeof VC_SYNC_DIRECTIONS)[number];\n\n/** Sync history action types */\nexport type VcSyncAction = 'push' | 'pull' | 'pr-created' | 'pr-merged' | 'conflict';\n\n/** Status of a synced flow */\nexport type VcSyncStatus = 'synced' | 'pending' | 'conflict' | 'not-connected' | 'error';\n\n/** Git provider authentication config */\nexport type GitProviderAuth =\n | { type: 'token'; token: string }\n | { type: 'app'; appId: string; privateKey: string; installationId?: number }\n | { type: 'credential'; credentialId: string };\n\n/** Sync config record (mirrors vc_sync_config table) */\nexport interface VcSyncConfig {\n id: string;\n flowId: string;\n provider: string;\n repo: string;\n branch: string;\n filePath: string;\n mode: VcSyncMode;\n syncDirection: VcSyncDirection;\n lastSyncedAt: string | null;\n lastCommitSha: string | null;\n lastSyncedVersion: number | null;\n draftBranch: string | null;\n activePrNumber: number | null;\n activePrUrl: string | null;\n enabled: boolean;\n}\n\n/** Sync history record (mirrors vc_sync_history table) */\nexport interface VcSyncHistoryRecord {\n id: string;\n flowId: string;\n action: VcSyncAction;\n commitSha: string | null;\n prNumber: number | null;\n version: number | null;\n message: string | null;\n createdAt: string;\n createdBy: string | null;\n}\n\n/** Sync status response for a flow */\nexport interface VcFlowSyncStatus {\n flowId: string;\n status: VcSyncStatus;\n config: VcSyncConfig | null;\n lastSync: VcSyncHistoryRecord | null;\n}\n\n/** Configure sync request body */\nexport interface ConfigureSyncInput {\n repo?: string;\n branch?: string;\n filePath?: string;\n mode?: VcSyncMode;\n syncDirection?: VcSyncDirection;\n enabled?: boolean;\n}\n\n/** Push/pull result */\nexport interface VcSyncResult {\n success: boolean;\n commitSha?: string;\n prNumber?: number;\n prUrl?: string;\n error?: string;\n action: VcSyncAction;\n}\n"],"mappings":";;AAKA,MAAa,gBAAgB;CAAC;CAAiB;CAAe;CAAiB;;AAI/E,MAAa,qBAAqB;CAAC;CAAQ;CAAQ;CAAgB"}
@@ -1,8 +1,10 @@
1
1
  //#region src/shared/types.d.ts
2
2
  /** Supported sync modes */
3
- type VcSyncMode = 'direct-commit' | 'pr-per-save' | 'pr-per-publish';
3
+ declare const VC_SYNC_MODES: readonly ["direct-commit", "pr-per-save", "pr-per-publish"];
4
+ type VcSyncMode = (typeof VC_SYNC_MODES)[number];
4
5
  /** Sync direction */
5
- type VcSyncDirection = 'push' | 'pull' | 'bidirectional';
6
+ declare const VC_SYNC_DIRECTIONS: readonly ["push", "pull", "bidirectional"];
7
+ type VcSyncDirection = (typeof VC_SYNC_DIRECTIONS)[number];
6
8
  /** Sync history action types */
7
9
  type VcSyncAction = 'push' | 'pull' | 'pr-created' | 'pr-merged' | 'conflict';
8
10
  /** Status of a synced flow */
@@ -76,5 +78,5 @@ interface VcSyncResult {
76
78
  action: VcSyncAction;
77
79
  }
78
80
  //#endregion
79
- export { VcSyncConfig as a, VcSyncMode as c, VcSyncAction as i, VcSyncResult as l, GitProviderAuth as n, VcSyncDirection as o, VcFlowSyncStatus as r, VcSyncHistoryRecord as s, ConfigureSyncInput as t, VcSyncStatus as u };
80
- //# sourceMappingURL=types-B32wGtx7.d.cts.map
81
+ export { VcFlowSyncStatus as a, VcSyncDirection as c, VcSyncResult as d, VcSyncStatus as f, VC_SYNC_MODES as i, VcSyncHistoryRecord as l, GitProviderAuth as n, VcSyncAction as o, VC_SYNC_DIRECTIONS as r, VcSyncConfig as s, ConfigureSyncInput as t, VcSyncMode as u };
82
+ //# sourceMappingURL=types-DACJdSjJ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DACJdSjJ.d.mts","names":[],"sources":["../src/shared/types.ts"],"mappings":";;cAKa,aAAA;AAAA,KACD,UAAA,WAAqB,aAAA;;cAGpB,kBAAA;AAAA,KACD,eAAA,WAA0B,kBAAA;AAJtC;AAAA,KAOY,YAAA;;KAGA,YAAA;;KAGA,eAAA;EACN,IAAA;EAAe,KAAA;AAAA;EACf,IAAA;EAAa,KAAA;EAAe,UAAA;EAAoB,cAAA;AAAA;EAChD,IAAA;EAAoB,YAAA;AAAA;;UAGT,YAAA;EACf,EAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,EAAM,UAAA;EACN,aAAA,EAAe,eAAA;EACf,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,cAAA;EACA,WAAA;EACA,OAAA;AAAA;;UAIe,mBAAA;EACf,EAAA;EACA,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,SAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;;UAIe,gBAAA;EACf,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,MAAA,EAAQ,YAAA;EACR,QAAA,EAAU,mBAAA;AAAA;;UAIK,kBAAA;EACf,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,eAAA;EAChB,OAAA;AAAA;;UAIe,YAAA;EACf,OAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA,EAAQ,YAAA;AAAA"}
@@ -1,8 +1,10 @@
1
1
  //#region src/shared/types.d.ts
2
2
  /** Supported sync modes */
3
- type VcSyncMode = 'direct-commit' | 'pr-per-save' | 'pr-per-publish';
3
+ declare const VC_SYNC_MODES: readonly ["direct-commit", "pr-per-save", "pr-per-publish"];
4
+ type VcSyncMode = (typeof VC_SYNC_MODES)[number];
4
5
  /** Sync direction */
5
- type VcSyncDirection = 'push' | 'pull' | 'bidirectional';
6
+ declare const VC_SYNC_DIRECTIONS: readonly ["push", "pull", "bidirectional"];
7
+ type VcSyncDirection = (typeof VC_SYNC_DIRECTIONS)[number];
6
8
  /** Sync history action types */
7
9
  type VcSyncAction = 'push' | 'pull' | 'pr-created' | 'pr-merged' | 'conflict';
8
10
  /** Status of a synced flow */
@@ -76,5 +78,5 @@ interface VcSyncResult {
76
78
  action: VcSyncAction;
77
79
  }
78
80
  //#endregion
79
- export { VcSyncConfig as a, VcSyncMode as c, VcSyncAction as i, VcSyncResult as l, GitProviderAuth as n, VcSyncDirection as o, VcFlowSyncStatus as r, VcSyncHistoryRecord as s, ConfigureSyncInput as t, VcSyncStatus as u };
80
- //# sourceMappingURL=types-B7fFBAOX.d.mts.map
81
+ export { VcFlowSyncStatus as a, VcSyncDirection as c, VcSyncResult as d, VcSyncStatus as f, VC_SYNC_MODES as i, VcSyncHistoryRecord as l, GitProviderAuth as n, VcSyncAction as o, VC_SYNC_DIRECTIONS as r, VcSyncConfig as s, ConfigureSyncInput as t, VcSyncMode as u };
82
+ //# sourceMappingURL=types-DDMnbS1q.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DDMnbS1q.d.cts","names":[],"sources":["../src/shared/types.ts"],"mappings":";;cAKa,aAAA;AAAA,KACD,UAAA,WAAqB,aAAA;;cAGpB,kBAAA;AAAA,KACD,eAAA,WAA0B,kBAAA;AAJtC;AAAA,KAOY,YAAA;;KAGA,YAAA;;KAGA,eAAA;EACN,IAAA;EAAe,KAAA;AAAA;EACf,IAAA;EAAa,KAAA;EAAe,UAAA;EAAoB,cAAA;AAAA;EAChD,IAAA;EAAoB,YAAA;AAAA;;UAGT,YAAA;EACf,EAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,EAAM,UAAA;EACN,aAAA,EAAe,eAAA;EACf,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,cAAA;EACA,WAAA;EACA,OAAA;AAAA;;UAIe,mBAAA;EACf,EAAA;EACA,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,SAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;;UAIe,gBAAA;EACf,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,MAAA,EAAQ,YAAA;EACR,QAAA,EAAU,mBAAA;AAAA;;UAIK,kBAAA;EACf,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,eAAA;EAChB,OAAA;AAAA;;UAIe,YAAA;EACf,OAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA,EAAQ,YAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@invect/version-control",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Version control plugin for Invect — sync flows to GitHub/GitLab/Bitbucket as .flow.ts files",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -34,13 +34,40 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "jiti": "^2.4.2",
38
- "@invect/core": "0.0.1"
37
+ "zod": "^3.25.0",
38
+ "@invect/core": "0.0.3"
39
39
  },
40
40
  "devDependencies": {
41
+ "@tanstack/react-query": "^5.0.0",
42
+ "@types/react": "18.3.7",
43
+ "@types/react-dom": "18.3.7",
44
+ "lucide-react": "^0.475.0",
45
+ "react": "^18.3.1",
46
+ "react-dom": "^18.3.1",
41
47
  "tsdown": "^0.21.1",
42
48
  "typescript": "^5.3.3",
43
- "vitest": "^3.2.4"
49
+ "vitest": "^3.2.4",
50
+ "@invect/ui": "0.0.3"
51
+ },
52
+ "peerDependencies": {
53
+ "@invect/ui": ">=0.0.3",
54
+ "@tanstack/react-query": ">=5.0.0",
55
+ "react": ">=18.0.0",
56
+ "react-dom": ">=18.0.0"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "@invect/ui": {
60
+ "optional": true
61
+ },
62
+ "@tanstack/react-query": {
63
+ "optional": true
64
+ },
65
+ "react": {
66
+ "optional": true
67
+ },
68
+ "react-dom": {
69
+ "optional": true
70
+ }
44
71
  },
45
72
  "scripts": {
46
73
  "build": "tsdown && tsc --emitDeclarationOnly --outDir dist",
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-B32wGtx7.d.cts","names":[],"sources":["../src/shared/types.ts"],"mappings":";;KAKY,UAAA;;KAGA,eAAA;;KAGA,YAAA;AAHZ;AAAA,KAMY,YAAA;;KAGA,eAAA;EACN,IAAA;EAAe,KAAA;AAAA;EACf,IAAA;EAAa,KAAA;EAAe,UAAA;EAAoB,cAAA;AAAA;EAChD,IAAA;EAAoB,YAAA;AAAA;AAH1B;AAAA,UAMiB,YAAA;EACf,EAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,EAAM,UAAA;EACN,aAAA,EAAe,eAAA;EACf,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,cAAA;EACA,WAAA;EACA,OAAA;AAAA;;UAIe,mBAAA;EACf,EAAA;EACA,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,SAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;;UAIe,gBAAA;EACf,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,MAAA,EAAQ,YAAA;EACR,QAAA,EAAU,mBAAA;AAAA;AAjBZ;AAAA,UAqBiB,kBAAA;EACf,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,eAAA;EAChB,OAAA;AAAA;;UAIe,YAAA;EACf,OAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA,EAAQ,YAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-B7fFBAOX.d.mts","names":[],"sources":["../src/shared/types.ts"],"mappings":";;KAKY,UAAA;;KAGA,eAAA;;KAGA,YAAA;AAHZ;AAAA,KAMY,YAAA;;KAGA,eAAA;EACN,IAAA;EAAe,KAAA;AAAA;EACf,IAAA;EAAa,KAAA;EAAe,UAAA;EAAoB,cAAA;AAAA;EAChD,IAAA;EAAoB,YAAA;AAAA;AAH1B;AAAA,UAMiB,YAAA;EACf,EAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,EAAM,UAAA;EACN,aAAA,EAAe,eAAA;EACf,YAAA;EACA,aAAA;EACA,iBAAA;EACA,WAAA;EACA,cAAA;EACA,WAAA;EACA,OAAA;AAAA;;UAIe,mBAAA;EACf,EAAA;EACA,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,SAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;;UAIe,gBAAA;EACf,MAAA;EACA,MAAA,EAAQ,YAAA;EACR,MAAA,EAAQ,YAAA;EACR,QAAA,EAAU,mBAAA;AAAA;AAjBZ;AAAA,UAqBiB,kBAAA;EACf,IAAA;EACA,MAAA;EACA,QAAA;EACA,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,eAAA;EAChB,OAAA;AAAA;;UAIe,YAAA;EACf,OAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA,EAAQ,YAAA;AAAA"}